cms9 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +192 -0
- data/Rakefile +37 -0
- data/app/assets/config/cms9_manifest.js +2 -0
- data/app/assets/images/cms9/cms9_logo.png +0 -0
- data/app/assets/images/cms9/cms9_logo_readme.png +0 -0
- data/app/assets/images/cms9/favicon-128.png +0 -0
- data/app/assets/images/cms9/favicon-16.png +0 -0
- data/app/assets/images/cms9/favicon-32.png +0 -0
- data/app/assets/images/cms9/favicon-64.png +0 -0
- data/app/assets/images/cms9/iCheck/flat/blue.png +0 -0
- data/app/assets/images/cms9/iCheck/flat/blue@2x.png +0 -0
- data/app/assets/javascripts/cms9/admin_lte.js +763 -0
- data/app/assets/javascripts/cms9/application.js +18 -0
- data/app/assets/javascripts/cms9/cable.js +13 -0
- data/app/assets/javascripts/cms9/multiple_values_selection.js +70 -0
- data/app/assets/javascripts/cms9/post_fields.js +5 -0
- data/app/assets/javascripts/cms9/posts.js +37 -0
- data/app/assets/stylesheets/cms9/admin_lte.scss +4932 -0
- data/app/assets/stylesheets/cms9/admin_lte_skins.css +1770 -0
- data/app/assets/stylesheets/cms9/application.scss +7 -0
- data/app/assets/stylesheets/cms9/fields.scss +3 -0
- data/app/assets/stylesheets/cms9/post_definitions.scss +28 -0
- data/app/assets/stylesheets/cms9/posts.scss +3 -0
- data/app/assets/stylesheets/cms9/welcome.scss +20 -0
- data/app/controllers/cms9/application_controller.rb +34 -0
- data/app/controllers/cms9/fields_controller.rb +4 -0
- data/app/controllers/cms9/post_definitions_controller.rb +85 -0
- data/app/controllers/cms9/post_fields_controller.rb +108 -0
- data/app/controllers/cms9/posts_controller.rb +76 -0
- data/app/controllers/cms9/welcome_controller.rb +8 -0
- data/app/helpers/cms9/application_helper.rb +58 -0
- data/app/helpers/cms9/fields_helper.rb +4 -0
- data/app/helpers/cms9/post_definitions_helper.rb +4 -0
- data/app/helpers/cms9/post_fields_helper.rb +4 -0
- data/app/helpers/cms9/posts_helper.rb +4 -0
- data/app/helpers/cms9/welcome_helper.rb +4 -0
- data/app/jobs/cms9/application_job.rb +4 -0
- data/app/mailers/cms9/application_mailer.rb +6 -0
- data/app/models/ckeditor/asset.rb +9 -0
- data/app/models/ckeditor/attachment_file.rb +9 -0
- data/app/models/ckeditor/picture.rb +14 -0
- data/app/models/cms9/application_record.rb +5 -0
- data/app/models/cms9/event.rb +7 -0
- data/app/models/cms9/field.rb +20 -0
- data/app/models/cms9/post.rb +16 -0
- data/app/models/cms9/post_definition.rb +25 -0
- data/app/models/cms9/post_field.rb +23 -0
- data/app/views/cms9/fields/index.html.erb +0 -0
- data/app/views/cms9/post_definitions/edit.html.erb +81 -0
- data/app/views/cms9/post_definitions/index.html.erb +48 -0
- data/app/views/cms9/post_definitions/new.html.erb +41 -0
- data/app/views/cms9/post_fields/_field_form.html.erb +46 -0
- data/app/views/cms9/post_fields/_image_sizer.html.erb +2 -0
- data/app/views/cms9/post_fields/_select.html.erb +24 -0
- data/app/views/cms9/post_fields/_select_blank.html.erb +10 -0
- data/app/views/cms9/post_fields/edit.html.erb +14 -0
- data/app/views/cms9/post_fields/new.html.erb +14 -0
- data/app/views/cms9/posts/_post_form.html.erb +13 -0
- data/app/views/cms9/posts/edit.html.erb +14 -0
- data/app/views/cms9/posts/index.html.erb +42 -0
- data/app/views/cms9/posts/inputs/_date.html.erb +2 -0
- data/app/views/cms9/posts/inputs/_date_time.html.erb +2 -0
- data/app/views/cms9/posts/inputs/_image.html.erb +19 -0
- data/app/views/cms9/posts/inputs/_number.html.erb +2 -0
- data/app/views/cms9/posts/inputs/_select_multiple.html.erb +7 -0
- data/app/views/cms9/posts/inputs/_select_single.html.erb +2 -0
- data/app/views/cms9/posts/inputs/_text.html.erb +2 -0
- data/app/views/cms9/posts/inputs/_text_area.html.erb +2 -0
- data/app/views/cms9/posts/inputs/_time.html.erb +2 -0
- data/app/views/cms9/posts/new.html.erb +14 -0
- data/app/views/cms9/welcome/_post.html.erb +46 -0
- data/app/views/cms9/welcome/_post_definition.html.erb +36 -0
- data/app/views/cms9/welcome/index.html.erb +57 -0
- data/app/views/layouts/cms9/application.html.erb +100 -0
- data/config/initializers/assets.rb +4 -0
- data/config/initializers/ckeditor.rb +59 -0
- data/config/initializers/ckeditor_dragonfly.rb +19 -0
- data/config/initializers/ckeditor_init.rb +3 -0
- data/config/initializers/dragonfly.rb +26 -0
- data/config/routes.rb +11 -0
- data/db/migrate/cms9_create.rb +73 -0
- data/db/schema.rb +49 -0
- data/db/seeds.rb +7 -0
- data/lib/cms9.rb +24 -0
- data/lib/cms9/engine.rb +24 -0
- data/lib/cms9/version.rb +3 -0
- data/lib/events/cms9_events.rb +50 -0
- data/lib/generators/cms9/install/install_generator.rb +81 -0
- data/lib/generators/cms9/install/templates/ckeditor_config.js +14 -0
- data/lib/generators/cms9/install/templates/cms9_configurator.rb +4 -0
- data/lib/sdk/cms9.rb +138 -0
- data/lib/tasks/cms9_tasks.rake +4 -0
- metadata +423 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
module Cms9
|
2
|
+
class Ckeditor::Picture < Ckeditor::Asset
|
3
|
+
validates_property :format, of: :data, in: image_file_types unless image_file_types.empty?
|
4
|
+
validates_property :image?, of: :data, as: true, message: :invalid
|
5
|
+
|
6
|
+
def url_content
|
7
|
+
data.thumb('800x800>').url
|
8
|
+
end
|
9
|
+
|
10
|
+
def url_thumb
|
11
|
+
data.thumb('118x100#').url(url_thumb_options)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Cms9
|
2
|
+
class Field < ApplicationRecord
|
3
|
+
belongs_to :post_field
|
4
|
+
belongs_to :post, optional: true
|
5
|
+
dragonfly_accessor :image
|
6
|
+
|
7
|
+
def to_s
|
8
|
+
case self.post_field.field_type
|
9
|
+
when 'text', 'text_area', 'number', 'select_single', 'date', 'time', 'date_time'
|
10
|
+
return self.value
|
11
|
+
when 'select_multiple'
|
12
|
+
return self.value.split(',')
|
13
|
+
when 'image'
|
14
|
+
return !self.image_uid.blank? ? self.image.url : ''
|
15
|
+
else
|
16
|
+
return ''
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Cms9
|
2
|
+
class Post < ApplicationRecord
|
3
|
+
belongs_to :post_definition
|
4
|
+
has_many :fields, dependent: :destroy
|
5
|
+
|
6
|
+
accepts_nested_attributes_for :fields
|
7
|
+
|
8
|
+
def field(name)
|
9
|
+
@cache_fields ||= self.fields.joins(:post_field).includes(:post_field)
|
10
|
+
.map { |field| [field.post_field.name, field] }
|
11
|
+
.to_h
|
12
|
+
@cache_fields[name]
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Cms9
|
2
|
+
class PostDefinition < ApplicationRecord
|
3
|
+
validates :name, presence: true, uniqueness: { case_sensitive: false },
|
4
|
+
length: { minimum: 3 }
|
5
|
+
|
6
|
+
has_many :post_fields, dependent: :destroy
|
7
|
+
has_many :posts, dependent: :destroy
|
8
|
+
|
9
|
+
|
10
|
+
def fields
|
11
|
+
if @cache_fields.nil?
|
12
|
+
@cache_fields = self.post_fields.map { |field| [field.name, field] }.to_h
|
13
|
+
end
|
14
|
+
|
15
|
+
@cache_fields.values
|
16
|
+
end
|
17
|
+
|
18
|
+
# Get field by name
|
19
|
+
def field(name)
|
20
|
+
fields()
|
21
|
+
@cache_fields[name]
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Cms9
|
2
|
+
class PostField < ApplicationRecord
|
3
|
+
validates :name, presence: true, length: { minimum:3, maximum: 15 }
|
4
|
+
validates :field_type, presence: true
|
5
|
+
|
6
|
+
belongs_to :post_definition
|
7
|
+
attr_accessor :multi_values
|
8
|
+
|
9
|
+
def self.all_types
|
10
|
+
return [
|
11
|
+
{ key: 'text', display_name: 'Text' },
|
12
|
+
{ key: 'text_area', display_name: 'Text Area' },
|
13
|
+
{ key: 'number', display_name: 'Number'},
|
14
|
+
{ key: 'select_single', display_name: 'Select Single' },
|
15
|
+
{ key: 'select_multiple', display_name: 'Select Multiple' },
|
16
|
+
{ key: 'date', display_name: 'Date' },
|
17
|
+
{ key: 'time', display_name: 'Time' },
|
18
|
+
{ key: 'date_time', display_name: 'Date & Time' },
|
19
|
+
{ key: 'image', display_name: 'Image' }
|
20
|
+
]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
File without changes
|
@@ -0,0 +1,81 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div class="col-md-12">
|
3
|
+
<div class="box box-info">
|
4
|
+
<div class="box-header">
|
5
|
+
<h3 class="box-title">
|
6
|
+
Edit Post Type
|
7
|
+
</h3>
|
8
|
+
</div>
|
9
|
+
<div class="box-body">
|
10
|
+
<h3><%= @post.name %></h3>
|
11
|
+
<%= form_for @post do |f| %>
|
12
|
+
<% if @post.errors.any? %>
|
13
|
+
|
14
|
+
<div class="callout callout-danger">
|
15
|
+
<h4>
|
16
|
+
<%= pluralize(@post.errors.count, "error") %> prohibited
|
17
|
+
this from being saved:
|
18
|
+
</h4>
|
19
|
+
|
20
|
+
<div>
|
21
|
+
<% @post.errors.full_messages.each do |msg| %>
|
22
|
+
<p><%= msg %></p>
|
23
|
+
<% end %>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
|
27
|
+
<% end %>
|
28
|
+
|
29
|
+
<%= f.label :name %><br>
|
30
|
+
|
31
|
+
<div class="input-group">
|
32
|
+
<%= f.text_field :name, { class: "form-control", required: true } %>
|
33
|
+
|
34
|
+
<div class="input-group-btn">
|
35
|
+
<%= f.submit class: 'btn btn-primary'%>
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
<% end %>
|
39
|
+
|
40
|
+
<hr/>
|
41
|
+
<!-- ///////////// -->
|
42
|
+
|
43
|
+
<h4>Fields</h4>
|
44
|
+
<%= link_to 'Add Field', new_post_field_path(post_definition_id: @post.id, post: @post.name), { class: 'btn btn-primary', style: 'margin-bottom: 30px; margin-top: 15px'} %>
|
45
|
+
<table class="table">
|
46
|
+
<thead>
|
47
|
+
<th>Name</th>
|
48
|
+
<th>Type</th>
|
49
|
+
<th>Required</th>
|
50
|
+
<th></th>
|
51
|
+
</thead>
|
52
|
+
<tbody>
|
53
|
+
<% @post.post_fields.each do |field| %>
|
54
|
+
<tr>
|
55
|
+
<td><%= field.name %></td>
|
56
|
+
<td><%= Cms9::PostField.all_types.find { |h| h[:key] == field.field_type }[:display_name] %></td>
|
57
|
+
<td class="required-field-icons">
|
58
|
+
<% if field.required %>
|
59
|
+
<i class="fa fa-check" aria-hidden="true"></i>
|
60
|
+
<% else %>
|
61
|
+
<i class="fa fa-times" aria-hidden="true"></i>
|
62
|
+
<% end %>
|
63
|
+
</td>
|
64
|
+
<td style="text-align: right;">
|
65
|
+
<% if field != @post.post_fields.all.first %>
|
66
|
+
<%= link_to "Edit", edit_post_field_path(field, { post: @post.name }),
|
67
|
+
class: 'btn btn-primary btn-sm'%>
|
68
|
+
<%= link_to "Delete", post_field_path(field),
|
69
|
+
method: :delete,
|
70
|
+
data: { confirm: 'Are you sure?' },
|
71
|
+
class: 'btn btn-danger btn-sm'%>
|
72
|
+
<% end %></td>
|
73
|
+
</tr>
|
74
|
+
<% end %>
|
75
|
+
</tbody>
|
76
|
+
</table>
|
77
|
+
|
78
|
+
</div>
|
79
|
+
</div>
|
80
|
+
</div>
|
81
|
+
</div>
|
@@ -0,0 +1,48 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div class="col-md-12">
|
3
|
+
<div class="box box-info">
|
4
|
+
<div class="box-header">
|
5
|
+
<i class="fa fa-folder"></i>
|
6
|
+
<h3 class="box-title">Post Types</h3>
|
7
|
+
|
8
|
+
<div class="pull-right box-tools">
|
9
|
+
<%= link_to 'New Post Type', new_post_definition_path, class: 'btn btn-primary' %>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
<div class="box-body">
|
13
|
+
<table class="table table-striped">
|
14
|
+
<thead>
|
15
|
+
<tr>
|
16
|
+
<th>Name</th>
|
17
|
+
<th style="width:20px;">Count</th>
|
18
|
+
<th style="width:120px;">Created</th>
|
19
|
+
<th style="width:120px;">Last Update</th>
|
20
|
+
<th style="width:140px;">Actions</th>
|
21
|
+
</tr>
|
22
|
+
</thead>
|
23
|
+
|
24
|
+
<tbody>
|
25
|
+
<% @posts.each do |post| %>
|
26
|
+
<tr>
|
27
|
+
<td><%= post.name %></td>
|
28
|
+
<td><%= Cms9::Post.where(post_definition: post).count %></td>
|
29
|
+
<td><%= distance_of_time_in_words_to_now(post.created_at) %></td>
|
30
|
+
<td>User #<%= post.user_id %></td>
|
31
|
+
<td>
|
32
|
+
<%= link_to "Edit", edit_post_definition_path(post),
|
33
|
+
class: 'btn btn-primary btn-sm'%>
|
34
|
+
<%= link_to "Delete", post_definition_path(post),
|
35
|
+
method: :delete,
|
36
|
+
data: { confirm: 'Are you sure?' },
|
37
|
+
class: 'btn btn-danger btn-sm'%>
|
38
|
+
</td>
|
39
|
+
</tr>
|
40
|
+
<% end %>
|
41
|
+
</tbody>
|
42
|
+
<%= paginate @posts %>
|
43
|
+
</table>
|
44
|
+
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
</div>
|
48
|
+
</div>
|
@@ -0,0 +1,41 @@
|
|
1
|
+
<div class="row">
|
2
|
+
<div class="col-md-12">
|
3
|
+
<div class="box box-info">
|
4
|
+
<div class="box-header">
|
5
|
+
<h3 class="box-title">
|
6
|
+
New Post Definition
|
7
|
+
</h3>
|
8
|
+
</div>
|
9
|
+
<div class="box-body">
|
10
|
+
<%= form_for @post do |f| %>
|
11
|
+
|
12
|
+
<% if @post.errors.any? %>
|
13
|
+
|
14
|
+
<div class="callout callout-danger">
|
15
|
+
<h4>
|
16
|
+
<%= pluralize(@post.errors.count, "error") %> prohibited
|
17
|
+
this article from being saved:
|
18
|
+
</h4>
|
19
|
+
|
20
|
+
<div>
|
21
|
+
<% @post.errors.full_messages.each do |msg| %>
|
22
|
+
<p><%= msg %></p>
|
23
|
+
<% end %>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
|
27
|
+
<% end %>
|
28
|
+
|
29
|
+
<div class="form-group">
|
30
|
+
<%= f.label :name %><br>
|
31
|
+
<%= f.text_field :name, { class: "form-control", required: true } %>
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<%= f.submit class: 'btn btn-primary' %>
|
35
|
+
|
36
|
+
<% end %>
|
37
|
+
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
</div>
|
41
|
+
</div>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<%= form_for @field do |f| %>
|
2
|
+
<% if @field.errors.any? %>
|
3
|
+
|
4
|
+
<div class="callout callout-danger">
|
5
|
+
<h4>
|
6
|
+
<%= pluralize(@field.errors.count, "error") %> prohibited
|
7
|
+
this article from being saved:
|
8
|
+
</h4>
|
9
|
+
|
10
|
+
<div>
|
11
|
+
<% @field.errors.full_messages.each do |msg| %>
|
12
|
+
<p><%= msg %></p>
|
13
|
+
<% end %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<% end %>
|
18
|
+
|
19
|
+
<%= f.label :name %><br>
|
20
|
+
<%= f.text_field :name, { class: "form-control", required: true }%>
|
21
|
+
<%= f.label :field_type %><br>
|
22
|
+
<%= f.select :field_type, Cms9::PostField.all_types.map { |a| [a[:display_name], a[:key]] },
|
23
|
+
{ prompt: 'Select Type' }, { class: 'form-control type-selector', disabled: edit, required: true } %>
|
24
|
+
|
25
|
+
<div id="valueSet" style="display: none;">
|
26
|
+
<p style="margin-top: 20px; font-weight: bold;">Multiple choices (naming without special characters)</p>
|
27
|
+
<%= render 'select', { f: f, edit: edit } %>
|
28
|
+
</div>
|
29
|
+
<a href="javascript:;" id="addNewValue" class="btn btn-primary btn-sm" style="visibility: hidden;">Add New Choice</a>
|
30
|
+
|
31
|
+
<div id="selector_" style="display: none;">
|
32
|
+
<%= render 'select_blank', { f: f } %>
|
33
|
+
</div>
|
34
|
+
|
35
|
+
<div id="image_sizer" style="display: none;">
|
36
|
+
<%= render 'image_sizer', { f: f } %>
|
37
|
+
</div>
|
38
|
+
|
39
|
+
<div class="checkbox" style="margin-top: 10px;">
|
40
|
+
<span style="margin-right: 30px;">Required</span>
|
41
|
+
<%= hidden_field_tag :required, false %>
|
42
|
+
<%= f.check_box :required, {}, true %>
|
43
|
+
</div>
|
44
|
+
<%= f.hidden_field :post_definition_id %>
|
45
|
+
<%= f.submit class: 'btn btn-primary', style: 'margin-top: 30px;' %>
|
46
|
+
<% end %>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
<% if edit && ( @field.field_type == 'select_single' || @field.field_type == 'select_multiple' ) %>
|
2
|
+
<% @field.metadata.split(',').each do |input| %>
|
3
|
+
<% if !input.blank? %>
|
4
|
+
<div class="multi-block col-md-12" style="padding: 0;">
|
5
|
+
<div class="col-md-10 input-group" style="padding: 0; margin-bottom: 10px;">
|
6
|
+
<%= text_field_tag 'multi_values[]', input, { class: 'form-control multi-pick', pattern: '^[\w ]+$', required: true } %>
|
7
|
+
<% if !(@field.metadata.split(',').first == input) %>
|
8
|
+
<div class="input-group-btn">
|
9
|
+
<a href="javascript:;" onclick="deleteChoice(this)" class="btn btn-danger btn-delete-choice">
|
10
|
+
<i class="fa fa-trash-o" aria-hidden="true"></i>
|
11
|
+
</a>
|
12
|
+
</div>
|
13
|
+
<% end %>
|
14
|
+
</div>
|
15
|
+
</div>
|
16
|
+
<% end %>
|
17
|
+
<% end %>
|
18
|
+
<% else %>
|
19
|
+
<div class="multi-block col-md-12" style="padding: 0;">
|
20
|
+
<div class="col-md-10" style="padding: 0; margin-bottom: 10px;">
|
21
|
+
<%= text_field_tag 'multi_values[]', nil, { class: 'form-control multi-pick', pattern: '^[\w ]+$', required: false } %>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
<% end %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<div class="multi-block col-md-12" style="padding: 0;">
|
2
|
+
<div class="col-md-10 input-group" style="padding: 0; margin-bottom: 10px;">
|
3
|
+
<%= text_field_tag 'multi_values[]', nil, { class: 'form-control multi-pick', pattern: '^[\w ]+$', required: false } %>
|
4
|
+
<div class="input-group-btn">
|
5
|
+
<a href="javascript:;" onclick="deleteChoice(this)" class="btn btn-danger btn-delete-choice">
|
6
|
+
<i class="fa fa-trash-o" aria-hidden="true"></i>
|
7
|
+
</a>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
</div>
|