billy_cms 0.0.2

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 (63) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +4 -0
  4. data/CODE_OF_CONDUCT.md +49 -0
  5. data/Gemfile +8 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +41 -0
  8. data/Rakefile +10 -0
  9. data/app/assets/images/billy_cms/32px.png +0 -0
  10. data/app/assets/images/billy_cms/40px.png +0 -0
  11. data/app/assets/images/billy_cms/fileicon.png +0 -0
  12. data/app/assets/images/billy_cms/throbber.gif +0 -0
  13. data/app/assets/javascripts/billy_cms/backend/app.js.erb +217 -0
  14. data/app/assets/javascripts/billy_cms/backend/attributes.js +33 -0
  15. data/app/assets/javascripts/billy_cms/backend/billy_object.js +41 -0
  16. data/app/assets/javascripts/billy_cms/backend/directives/ng-jstree.js +200 -0
  17. data/app/assets/javascripts/billy_cms/backend/jstree.js +7781 -0
  18. data/app/assets/javascripts/billy_cms/backend/ngfileupload.js +2506 -0
  19. data/app/assets/javascripts/billy_cms/backend/page_type.js +11 -0
  20. data/app/assets/javascripts/billy_cms/backend/ui-router.js +4370 -0
  21. data/app/assets/javascripts/billy_cms/backend.js +15 -0
  22. data/app/assets/javascripts/billy_cms/frontend/api_connector.js +5 -0
  23. data/app/assets/javascripts/billy_cms/frontend/editing.es6 +120 -0
  24. data/app/assets/javascripts/billy_cms/frontend/google_maps.js +13 -0
  25. data/app/assets/javascripts/billy_cms/frontend/navbar.js +0 -0
  26. data/app/assets/javascripts/billy_cms/frontend/slick.es6 +8 -0
  27. data/app/assets/javascripts/billy_cms.js +16 -0
  28. data/app/assets/stylesheets/billy_cms/backend/index.scss +17 -0
  29. data/app/assets/stylesheets/billy_cms/editmode.scss +78 -0
  30. data/app/assets/stylesheets/billy_cms/index.scss +5 -0
  31. data/app/assets/stylesheets/billy_cms/jstree.scss +1061 -0
  32. data/app/assets/stylesheets/billy_cms.css +15 -0
  33. data/app/controllers/billy_cms/api/api_controller.rb +25 -0
  34. data/app/controllers/billy_cms/api/attributes_controller.rb +65 -0
  35. data/app/controllers/billy_cms/api/page_types_controller.rb +13 -0
  36. data/app/controllers/billy_cms/api/pages_controller.rb +63 -0
  37. data/app/controllers/billy_cms/backend_controller.rb +10 -0
  38. data/app/controllers/billy_cms/base_controller.rb +23 -0
  39. data/app/helpers/billy_cms/cms_path_helper.rb +8 -0
  40. data/app/helpers/billy_cms/content_helper.rb +17 -0
  41. data/app/helpers/billy_cms/permission_helper.rb +24 -0
  42. data/app/models/billy_cms/additional_attribute.rb +6 -0
  43. data/app/models/billy_cms/additional_attributes_page_types.rb +6 -0
  44. data/app/models/billy_cms/page.rb +61 -0
  45. data/app/models/billy_cms/page_type.rb +7 -0
  46. data/app/models/billy_router.rb +20 -0
  47. data/app/serializers/billy_cms/additional_attribute_serializer.rb +6 -0
  48. data/app/serializers/billy_cms/page_serializer.rb +15 -0
  49. data/app/serializers/billy_cms/page_type_serializer.rb +5 -0
  50. data/app/views/billy_cms/_edit_page_button.html.erb +1 -0
  51. data/app/views/billy_cms/_page_settings_form.html.erb +25 -0
  52. data/app/views/billy_cms/_page_settings_modal.html.erb +19 -0
  53. data/app/views/billy_cms/_settings_page_button.html.erb +4 -0
  54. data/app/views/billy_cms/backend/_attributes.html.erb +12 -0
  55. data/app/views/billy_cms/backend/_header.html.erb +84 -0
  56. data/app/views/billy_cms/backend/_tree.html.erb +58 -0
  57. data/app/views/billy_cms/backend/index.html.erb +19 -0
  58. data/billy_cms.gemspec +32 -0
  59. data/bin/console +14 -0
  60. data/bin/setup +8 -0
  61. data/lib/billy_cms/version.rb +3 -0
  62. data/lib/billy_cms.rb +5 -0
  63. metadata +147 -0
@@ -0,0 +1,15 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,25 @@
1
+ module BillyCms
2
+ module Api
3
+ class ApiController < ActionController::Base
4
+ protect_from_forgery with: :null_session
5
+ skip_before_filter :verify_authenticity_token
6
+
7
+ before_filter :ensure_user_is_admin
8
+
9
+ def current_user
10
+ @current_user ||= begin
11
+ users = User.where(id: session[:user_id]).presence
12
+ session[:user_id] && users ? users.first : false
13
+ end
14
+ end
15
+
16
+ protected
17
+
18
+ def ensure_user_is_admin
19
+ unless current_user && current_user.admin?
20
+ render text: 'Forbidden', status: 403
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,65 @@
1
+ module BillyCms
2
+ module Api
3
+ class AttributesController < ApiController
4
+ def index
5
+ render json: AdditionalAttribute.all
6
+ end
7
+
8
+ def show
9
+ render json: AdditionalAttribute.find(params[:id])
10
+ end
11
+
12
+ def update
13
+ render nothing: true, status: 400 unless params[:attribute]
14
+ attribute = AdditionalAttribute.find params[:id]
15
+ if attribute.update_attributes attribute_params
16
+ render json: {
17
+ success: true,
18
+ attribute: attribute
19
+ }
20
+ else
21
+ render json: {
22
+ success: false,
23
+ error: attribute.error_messages,
24
+ }, status: 500
25
+ end
26
+ end
27
+
28
+ def create
29
+ render nothing: true, status: 400 unless params[:attribute]
30
+ attribute = AdditionalAttribute.new attribute_params
31
+ if attribute.save
32
+ render json: {
33
+ success: true,
34
+ attribute: attribute
35
+ }
36
+ else
37
+ render json: {
38
+ success: false,
39
+ error: attribute.error_messages,
40
+ }, status: 500
41
+ end
42
+ end
43
+
44
+ def destroy
45
+ render :nothing, status: 400 unless params[:id]
46
+ if AdditionalAttribute.delete(params[:id])
47
+ render json: {
48
+ success: true
49
+ }
50
+ else
51
+ render json: {
52
+ success: false,
53
+ error: attribute.error_messages,
54
+ }, status: 500
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def attributes_params
61
+ params.require(:attribute).permit(:title, :attribute, :attribute_type) if current_user.admin?
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,13 @@
1
+ module BillyCms
2
+ module Api
3
+ class PageTypesController < ApiController
4
+ def index
5
+ render json: PageType.all
6
+ end
7
+
8
+ def show
9
+ render json: PageType.find(params[:id])
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,63 @@
1
+ module BillyCms
2
+ module Api
3
+ class PagesController < ApiController
4
+ def index
5
+ render json: Page.all
6
+ end
7
+
8
+ def update
9
+ render nothing: true, status: 400 unless params[:page]
10
+ page = Page.find params[:id]
11
+ if page.update_attributes page_params
12
+ render json: {
13
+ success: true,
14
+ page: page
15
+ }
16
+ else
17
+ render json: {
18
+ success: false,
19
+ error: page.error_messages,
20
+ }, status: 500
21
+ end
22
+ end
23
+
24
+ def create
25
+ render nothing: true, status: 400 unless params[:page]
26
+ page = Page.new page_params
27
+ if page.save
28
+ render json: {
29
+ success: true,
30
+ page: page
31
+ }
32
+ else
33
+ render json: {
34
+ success: false,
35
+ error: page.error_messages,
36
+ }, status: 500
37
+ end
38
+ end
39
+
40
+ def destroy
41
+ render :nothing, status: 400 unless params[:id]
42
+ if Page.delete(params[:id])
43
+ render json: {
44
+ success: true
45
+ }
46
+ else
47
+ render json: {
48
+ success: false,
49
+ error: page.error_messages,
50
+ }, status: 500
51
+ end
52
+ end
53
+
54
+ private
55
+
56
+ def page_params
57
+ page = Page.find(params[:id]) if params[:id].present?
58
+ allowed_types = page ? page.additional_attributes.map(&:name).map(&:to_sym) : []
59
+ 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
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,10 @@
1
+ module BillyCms
2
+ class BackendController < ActionController::Base
3
+ layout 'billy_cms/backend'
4
+
5
+ def index
6
+
7
+ end
8
+
9
+ end
10
+ end
@@ -0,0 +1,23 @@
1
+ module BillyCms
2
+ class BaseController < ActionController::Base
3
+ layout 'application'
4
+ before_filter :set_page_object
5
+ # Prevent CSRF attacks by raising an exception.
6
+ # For APIs, you may want to use :null_session instead.
7
+ protect_from_forgery with: :exception
8
+
9
+ def show
10
+ end
11
+
12
+ def set_page_object
13
+ path = params[:path]
14
+ if request.path == root_path
15
+ @page = Page.friendly.find('startseite')
16
+ elsif path
17
+ slug = path.split('/').last
18
+ @page = Page.friendly.find(slug)
19
+ end
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,8 @@
1
+ module BillyCms
2
+ module CmsPathHelper
3
+ def cms_path(page)
4
+ return root_path if page.slug == 'startseite'
5
+ page.cms_path
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ module BillyCms
2
+ module ContentHelper
3
+
4
+ def page_field(page, field, options = {})
5
+ tag_name = options[:tag] || :div
6
+ content_tag tag_name, page.send(field).to_s.html_safe, class: "page-#{field.to_s}", 'billycms-attribute' => field.to_s, 'billycms-page' => page[:id], contenteditable: false
7
+ end
8
+
9
+ def cms_image(obj, options = {})
10
+ content_tag :div, class: "page-content page-content-binary", 'billycms-attribute' => 'content', 'billycms-page' => obj[:id] do
11
+ image_tag(obj.content.to_s) +
12
+ file_field_tag(:obj_input_file)
13
+ end
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,24 @@
1
+ module BillyCms
2
+ module PermissionHelper
3
+ def can_edit?(page)
4
+ return false unless page
5
+ return false unless current_user && current_user.admin?
6
+ true
7
+ end
8
+
9
+ def billy_edit_button(page = nil)
10
+ return unless can_edit?(page ||= @page) and !page.nil?
11
+ render partial: 'billy_cms/edit_page_button', locals: { page: page }
12
+ end
13
+
14
+ def billy_settings_button(page = nil)
15
+ return unless can_edit?(page ||= @page) and !page.nil?
16
+ return unless can_edit?(page) and !page.nil?
17
+ render partial: 'billy_cms/settings_page_button', locals: { page: page }
18
+ end
19
+
20
+ def billy_buttons(page = nil)
21
+ billy_edit_button(page) + billy_settings_button(page)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,6 @@
1
+ module BillyCms
2
+ class AdditionalAttribute < ActiveRecord::Base
3
+ has_many :additional_attributes_page_types, class_name: 'BillyCms::AdditionalAttributesPageTypes'
4
+ has_many :page_types, through: :additional_attributes_page_types
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ module BillyCms
2
+ class AdditionalAttributesPageTypes < ActiveRecord::Base
3
+ belongs_to :page_type
4
+ belongs_to :additional_attribute
5
+ end
6
+ end
@@ -0,0 +1,61 @@
1
+ module BillyCms
2
+ class Page < ActiveRecord::Base
3
+ extend FriendlyId
4
+ friendly_id :title, use: :slugged
5
+
6
+ has_many :pages, class_name: 'Page', foreign_key: :parent_page_id
7
+ belongs_to :parent_page, class_name: 'Page', foreign_key: :parent_page_id
8
+
9
+ def cms_path
10
+ get_cms_path_component_for_parent '', self
11
+ end
12
+
13
+ def children
14
+ pages.sort_by(&:order_key)
15
+ end
16
+
17
+ def navigation
18
+ self.children.reject { |page| page.hide_from_navigation? || page.page_type == 'Binary' || page.page_type == 'Box' }
19
+ end
20
+
21
+ def boxes
22
+ pages.where(page_type: 'box').sort_by(&:order_key)
23
+ end
24
+
25
+ def binaries
26
+ pages.where(page_type: 'Binary').sort_by(&:order_key)
27
+ end
28
+
29
+ def is_in_path?(path)
30
+ if path == '/'
31
+ return slug == 'startseite' ? true : false
32
+ end
33
+ # byebug if id == 6
34
+ reg = Regexp.new("^(#{cms_path})", 'i')
35
+ path.match(reg) != nil
36
+ end
37
+
38
+ def sibblings
39
+ self.class.where(parent_page_id: parent_page_id).where.not(id: id).order(:order_key)
40
+ end
41
+
42
+ def binary?
43
+ self.page_type == 'Binary'
44
+ end
45
+
46
+ def additional_attributes
47
+ type = PageType.find_by_name(self.page_type)
48
+ return [] unless type.present?
49
+ type.additional_attributes
50
+ end
51
+
52
+ def additional_attribute(attribute_name)
53
+ self.additional_attributes_values[attribute_name.to_s] if self.additional_attributes_values.present?
54
+ end
55
+
56
+ private
57
+ def get_cms_path_component_for_parent(current_path, current_page)
58
+ current_path += "#{get_cms_path_component_for_parent(current_path, current_page.parent_page) if current_page.parent_page}#{"/#{current_page.slug}" if current_page}"
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,7 @@
1
+ module BillyCms
2
+ class PageType < ActiveRecord::Base
3
+ has_many :additional_attributes_page_types, class_name: 'BillyCms::AdditionalAttributesPageTypes'
4
+ has_many :additional_attributes, through: :additional_attributes_page_types
5
+ belongs_to :page
6
+ end
7
+ end
@@ -0,0 +1,20 @@
1
+ class BillyRouter
2
+ def call(env)
3
+ # Matched from routes, you can access all matched parameters
4
+ path = env['action_dispatch.request.path_parameters'][:path]
5
+ slug = path.split('/').last
6
+
7
+ page = BillyCms::Page.friendly.find(slug)
8
+ controller_class_name = page.page_type.to_s.camelcase + 'Controller'
9
+
10
+ begin
11
+ controller_name = controller_class_name.constantize
12
+ rescue NameError
13
+ controller_name = CmsController
14
+ end
15
+
16
+ action_name = 'show'
17
+
18
+ controller_name.action(action_name.to_sym).call(env)
19
+ end
20
+ end
@@ -0,0 +1,6 @@
1
+ class BillyCms::AdditionalAttributeSerializer < ActiveModel::Serializer
2
+ attributes :id,
3
+ :title,
4
+ :name,
5
+ :attribute_type
6
+ end
@@ -0,0 +1,15 @@
1
+ class BillyCms::PageSerializer < ActiveModel::Serializer
2
+ attributes :id,
3
+ :page_type,
4
+ :title,
5
+ :content,
6
+ :slug,
7
+ :cms_path,
8
+ :updated_at,
9
+ :created_at,
10
+ :last_modified_by,
11
+ :parent_page_id,
12
+ :parent_page,
13
+ :hide_from_navigation,
14
+ :order_key
15
+ end
@@ -0,0 +1,5 @@
1
+ class BillyCms::PageTypeSerializer < ActiveModel::Serializer
2
+ attributes :id,
3
+ :title,
4
+ :name
5
+ end
@@ -0,0 +1 @@
1
+ <button class="billycms_edit_button" billycms-page-id="<%= page.id %>"></button>
@@ -0,0 +1,25 @@
1
+ <%= form_tag '/', method: :post, class: 'form-horizontal', id: 'page-settings-form', 'billycms-id' => page.id do %>
2
+ <%= content_tag :div, class: 'form-group' do %>
3
+ <%= label_tag :id, 'ID:' %>
4
+ <%= number_field_tag :id, page.id, disabled: true, readonly: true %>
5
+ <% end %>
6
+ <%= content_tag :div, class: 'form-group' do %>
7
+ <%= label_tag :path, 'Pfad:' %>
8
+ <%= text_field_tag :path, page.cms_path, disabled: true, readonly: true %>
9
+ <% end %>
10
+ <%= content_tag :div, class: 'form-group' do %>
11
+ <%= label_tag :hide_from_navigation, 'In der Navigation verstecken:' %>
12
+ <%= check_box_tag :hide_from_navigation, true, page.hide_from_navigation, onchange: 'this.value = this.checked' %>
13
+ <% end %>
14
+ <%= content_tag :div, class: 'form-group' do %>
15
+ <%= label_tag :order_key, 'Sortierschlüssel:' %>
16
+ <%= number_field_tag :order_key, page.order_key %>
17
+ <% end %>
18
+
19
+ <% page.additional_attributes.each do |attribute| %>
20
+ <%= content_tag :div, class: 'form-group' do %>
21
+ <%= label_tag "additional_attributes_values_#{attribute.name}", attribute.title %>
22
+ <%= text_field_tag "additional_attributes_values[#{attribute.name}]", page.additional_attribute(attribute.name) %>
23
+ <% end %>
24
+ <% end %>
25
+ <% end %>
@@ -0,0 +1,19 @@
1
+ <% if page.present? %>
2
+ <div class="modal fade page-settings-modal" id="<%= id %>" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
3
+ <div class="modal-dialog" role="document">
4
+ <div class="modal-content">
5
+ <div class="modal-header">
6
+ <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
7
+ <h4 class="modal-title" id="myModalLabel">Einstellungen: <%= page.title %></h4>
8
+ </div>
9
+ <div class="modal-body">
10
+ <%= render partial: 'billy_cms/page_settings_form', locals: { page: page } %>
11
+ </div>
12
+ <div class="modal-footer">
13
+ <button type="button" class="btn btn-default" data-dismiss="modal">Schließen</button>
14
+ <button type="button" class="btn btn-primary">Speichern</button>
15
+ </div>
16
+ </div>
17
+ </div>
18
+ </div>
19
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <button class="billycms_settings_button" billycms-page-id="<%= page.id %>"></button>
2
+ <%= content_tag :button, '', class: 'billycms_settings_button', data: { toggle: 'modal', target: "#page-settings-modal-#{page.id}" }%>
3
+
4
+ <%= render 'billy_cms/page_settings_modal', id: "page-settings-modal-#{page.id}", page: page %>
@@ -0,0 +1,12 @@
1
+ <md-content>
2
+ <h2>Attribute</h2>
3
+
4
+ <md-list>
5
+ <md-list-item class="md-2-line" ng-repeat="attribute in attrs.possibleAttributes">
6
+ <div class="md-list-item-text" layout="column">
7
+ <h3>{{ attribute.title }}</h3>
8
+ <p>{{ attribute.name }} &bull; {{attribute.attribute_type}}</p>
9
+ </div>
10
+ </md-list-item>
11
+ </md-list>
12
+ </md-content>
@@ -0,0 +1,84 @@
1
+ <div>
2
+ <md-toolbar class="md-menu-toolbar">
3
+ <div layout="row">
4
+ <md-toolbar-filler layout layout-align="center center">
5
+ <md-icon md-svg-icon="call:chat"></md-icon>
6
+ </md-toolbar-filler>
7
+ <div>
8
+ <h2 class="md-toolbar-tools">Seite</h2>
9
+ <md-menu-bar>
10
+ <md-menu>
11
+ <button ng-click="$mdOpenMenu()">
12
+ Datei
13
+ </button>
14
+ <md-menu-content>
15
+ <md-menu-item>
16
+ <md-button ng-click="app.openInPreview(app.selectedNode)">
17
+ Vorschau
18
+ </md-button>
19
+ </md-menu-item>
20
+ <md-menu-divider></md-menu-divider>
21
+ <md-menu-item>
22
+ <md-menu>
23
+ <md-button ng-click="$mdOpenMenu()">Neu</md-button>
24
+ <md-menu-content>
25
+ <md-menu-item><md-button ng-click="app.createNewPageForNode(app.selectedNode)">Seite</md-button></md-menu-item>
26
+ <md-menu-item><md-button ng-click="app.createNewFileForNode(app.selectedNode)">Datei (Bild, PDF, ...)</md-button></md-menu-item>
27
+ <md-menu-item></md-menu-item>
28
+ </md-menu-content>
29
+ </md-menu>
30
+ </md-menu-item>
31
+ <md-menu-item>
32
+ <md-button ng-click="app.deleteNode(app.selectedNode)">
33
+ löschen
34
+ <span class="md-alt-text"> {{ 'M-D'}}</span>
35
+ </md-button>
36
+ </md-menu-item>
37
+ <md-menu-item>
38
+ <md-button disabled="disabled" ng-click="ctrl.sampleAction('Rename', $event)">
39
+ Rename
40
+ </md-button>
41
+ </md-menu-item>
42
+ <md-menu-divider></md-menu-divider>
43
+ <md-menu-item>
44
+ <md-button ng-click="ctrl.sampleAction('Print', $event)">
45
+ Print
46
+ <span class="md-alt-text">{{ 'M-P'}}</span>
47
+ </md-button>
48
+ </md-menu-item>
49
+ </md-menu-content>
50
+ </md-menu>
51
+ <md-menu>
52
+ <button ng-click="$mdOpenMenu()">
53
+ System
54
+ </button>
55
+ <md-menu-content>
56
+ <md-menu-item>
57
+ <md-button ui-sref="tree">
58
+ Baumansicht
59
+ </md-button>
60
+ </md-menu-item>
61
+ <md-menu-item>
62
+ <md-button ui-sref="page_types">
63
+ Seitentypen
64
+ </md-button>
65
+ </md-menu-item>
66
+ <md-menu-item>
67
+ <md-button ui-sref="additional_attributes">
68
+ Zusätzliche Attribute
69
+ </md-button>
70
+ </md-menu-item>
71
+ <md-menu-divider></md-menu-divider>
72
+ <md-menu-item>
73
+ <md-menu>
74
+ <md-button ng-click="$mdOpenMenu()">Systemeinstellungen</md-button>
75
+ <md-menu-content>bla</md-menu-content>
76
+ </md-menu>
77
+ </md-menu-item>
78
+ </md-menu-content>
79
+ </md-menu>
80
+ </md-menu-bar>
81
+ </div>
82
+ </div>
83
+ </md-toolbar>
84
+ </div>
@@ -0,0 +1,58 @@
1
+ <div layout="row" layout-wrap>
2
+ <aside flex="30">
3
+ <div js-tree="app.treeConfig" ng-model="app.tree" tree="app.treeInstance" tree-events="ready:app.onTreeReady"></div>
4
+ </aside>
5
+ <form flex="70" ng-show="app.selectedNode" ng-submit="app.saveNode(app.selectedNode)">
6
+ <md-input-container class="md-block">
7
+ <label>ID: {{app.selectedNode.id}}</label>
8
+ </md-input-container>
9
+ <md-input-container class="md-block">
10
+ <label>Titel</label>
11
+ <input type="text" ng-model="app.selectedNode.title" />
12
+ </md-input-container>
13
+ <md-input-container class="md-block">
14
+ <label>Seitentyp</label>
15
+ <md-select ng-model="app.selectedNode.page_type">
16
+ <md-option ng-repeat="type in app.allPageTypes" value="{{type.name}}">
17
+ {{type.title}}
18
+ </md-option>
19
+ </md-select>
20
+ </md-input-container>
21
+ <md-input-container class="md-block">
22
+ <label>Slug</label>
23
+ <input type="text" ng-model="app.selectedNode.slug" />
24
+ </md-input-container>
25
+ <md-input-container class="md-block">
26
+ <label>Sortierschlüssel</label>
27
+ <input type="number" ng-model="app.selectedNode.order_key" step="1" />
28
+ </md-input-container>
29
+ <md-input-container class="md-block">
30
+ <md-checkbox ng-model="app.selectedNode.hide_from_navigation">In der Navigation verstecken?</md-checkbox>
31
+ </md-input-container>
32
+ <md-input-container class="md-block">
33
+ <label>Pfad: {{app.selectedNode.cms_path}}</label>
34
+ <input type="text" ng-value="app.selectedNode.cms_path" readonly />
35
+ </md-input-container>
36
+
37
+ <div layout="row">
38
+ <div flex="10">Inhalt</div>
39
+ <div flex="80" ng-if="app.selectedNode.page_type !== 'Binary'">
40
+ <textarea ui-tinymce="app.tinymceOptions" ng-model="app.selectedNode.content"></textarea>
41
+ </div>
42
+ <div flex="80" ng-if="app.selectedNode.page_type === 'Binary'">
43
+ <div style="border: 1px solid gray; min-height: 100px;" flex="100" layout="row">
44
+ <img ng-src="{{app.selectedNode.content}}" ng-if="app.selectedNode.isDataType('image')" style="max-width: 100%; height: auto;" />
45
+ {{app.selectedNode.content}}
46
+ </div>
47
+ <div class="md-button md-raised file-wrapper">
48
+ <input type="file" ngf-select="app.setBinaryContent($file, app.selectedNode)" />
49
+ Datei ändern
50
+ </div>
51
+ </div>
52
+ </div>
53
+
54
+ <div layout="row">
55
+ <input type="submit" value="speichern" class="md-button md-primary md-raised" />
56
+ </div>
57
+ </form>
58
+ </div>
@@ -0,0 +1,19 @@
1
+ <div ng-controller="ApplicationCtrl as app" ng-cloak>
2
+ <script type="text/ng-template" id="header/header.html">
3
+ <%= render partial: 'header' %>
4
+ </script>
5
+ <script type="text/ng-template" id="tree/tree.html">
6
+ <%= render partial: 'tree' %>
7
+ </script>
8
+ <script type="text/ng-template" id="page_types/page_types.html">
9
+ SEITENTYPEN
10
+ </script>
11
+ <script type="text/ng-template" id="attributes/attributes.html">
12
+ <%= render partial: 'attributes' %>
13
+ </script>
14
+
15
+ <billy-header-toolbar></billy-header-toolbar>
16
+
17
+ <div ui-view></div>
18
+
19
+ </div>