trusty-cms 7.0.2 → 7.0.4
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/Gemfile +2 -2
- data/Gemfile.lock +89 -102
- data/INSTALL.md +8 -6
- data/README.md +123 -15
- data/app/assets/javascripts/admin/validations/scheduled_status_validation.js +60 -0
- data/app/assets/stylesheets/admin/main.scss +2 -1
- data/app/assets/stylesheets/admin/partials/_datetime_input.scss +5 -0
- data/app/assets/stylesheets/admin/partials/_forms.scss +13 -0
- data/app/assets/stylesheets/admin/partials/_messages.scss +4 -0
- data/app/controllers/admin/configuration_controller.rb +1 -1
- data/app/controllers/admin/extensions_controller.rb +1 -0
- data/app/controllers/admin/layouts_controller.rb +2 -1
- data/app/controllers/admin/resource_controller.rb +10 -1
- data/app/controllers/admin/sites_controller.rb +1 -0
- data/app/controllers/admin/snippets_controller.rb +2 -1
- data/app/controllers/admin/users_controller.rb +2 -1
- data/app/controllers/page_status_controller.rb +61 -0
- data/app/controllers/site_controller.rb +0 -15
- data/app/helpers/admin/pages_helper.rb +0 -5
- data/app/helpers/admin/users_helper.rb +2 -1
- data/app/helpers/application_helper.rb +2 -1
- data/app/models/admins_site.rb +6 -0
- data/app/models/page.rb +3 -10
- data/app/models/site.rb +2 -0
- data/app/models/status.rb +1 -5
- data/app/models/trusty_cms/config.rb +2 -1
- data/app/models/user.rb +15 -4
- data/app/views/admin/layouts/_choose_site.html.haml +5 -3
- data/app/views/admin/layouts/_site_chooser.html.haml +2 -2
- data/app/views/admin/pages/_fields.html.haml +15 -6
- data/app/views/admin/pages/_node.html.haml +1 -1
- data/app/views/admin/snippets/_choose_site.html.haml +2 -1
- data/app/views/admin/users/_choose_site.html.haml +2 -1
- data/app/views/admin/users/_form.html.haml +3 -1
- data/bin/rails +2 -2
- data/config/application.rb +1 -0
- data/config/initializers/devise.rb +1 -1
- data/config/locales/en.yml +11 -9
- data/config/routes.rb +1 -0
- data/db/migrate/20241108172942_create_site_users.rb +8 -0
- data/lib/login_system.rb +15 -15
- data/lib/trusty_cms/version.rb +1 -1
- data/spec/dummy/config/application.rb +2 -0
- data/spec/dummy/db/schema.rb +8 -1
- data/spec/factories/snippet.rb +10 -0
- data/spec/factories/user.rb +11 -11
- data/spec/models/snippets_spec.rb +29 -0
- data/spec/models/user_spec.rb +46 -0
- data/trusty_cms.gemspec +1 -1
- data/vendor/extensions/multi-site-extension/lib/multi_site/scoped_model.rb +17 -11
- data/vendor/extensions/multi-site-extension/lib/multi_site/site_chooser_helper.rb +10 -10
- metadata +16 -6
- data/app/users/_choose_site.html.haml +0 -4
- /data/app/assets/stylesheets/admin/partials/{_dateinput.scss → _date_input.scss} +0 -0
@@ -0,0 +1,60 @@
|
|
1
|
+
$(document).ready(function() {
|
2
|
+
function isValidDateTime(value) {
|
3
|
+
return !isNaN(new Date(value).getTime());
|
4
|
+
}
|
5
|
+
|
6
|
+
function showError(message) {
|
7
|
+
$('#published-at-error').text(message);
|
8
|
+
$('.error').removeClass('hidden');
|
9
|
+
}
|
10
|
+
|
11
|
+
function hideError() {
|
12
|
+
$('.error').addClass('hidden');
|
13
|
+
}
|
14
|
+
|
15
|
+
function validateScheduledStatus(publishedTime, currentTime) {
|
16
|
+
if (!isValidDateTime(publishedTime)) {
|
17
|
+
showError('Select a valid Date & Time.');
|
18
|
+
return false;
|
19
|
+
}
|
20
|
+
if (publishedTime < currentTime) {
|
21
|
+
showError('Scheduled Date & Time cannot be in the past.');
|
22
|
+
return false;
|
23
|
+
}
|
24
|
+
|
25
|
+
hideError();
|
26
|
+
return true;
|
27
|
+
}
|
28
|
+
|
29
|
+
function validatePublishedStatus(publishedTime, currentTime) {
|
30
|
+
if (publishedTime > currentTime) {
|
31
|
+
showError('Published Date & Time cannot be in the future. Clear the date and time to publish now, or set the status to Scheduled.');
|
32
|
+
return false;
|
33
|
+
}
|
34
|
+
|
35
|
+
hideError();
|
36
|
+
return true;
|
37
|
+
}
|
38
|
+
|
39
|
+
function validateDateTime() {
|
40
|
+
const publishedAt = $('#page_published_at').val();
|
41
|
+
const status = $('#page_status_id').val();
|
42
|
+
const publishedTime = new Date(publishedAt);
|
43
|
+
const currentTime = new Date();
|
44
|
+
|
45
|
+
if (status === '90') {
|
46
|
+
return validateScheduledStatus(publishedTime, currentTime);
|
47
|
+
}
|
48
|
+
|
49
|
+
if (status === '100') {
|
50
|
+
return validatePublishedStatus(publishedTime, currentTime);
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
$('#save-button, #save-and-continue-button').on('click', function(event) {
|
55
|
+
if (!validateDateTime()) {
|
56
|
+
event.preventDefault();
|
57
|
+
event.stopImmediatePropagation();
|
58
|
+
}
|
59
|
+
});
|
60
|
+
});
|
@@ -20,7 +20,8 @@
|
|
20
20
|
@import "partials/footer";
|
21
21
|
@import "partials/popup";
|
22
22
|
@import "partials/tabcontrol";
|
23
|
-
@import "partials/
|
23
|
+
@import "partials/date_input";
|
24
|
+
@import "partials/datetime_input";
|
24
25
|
@import "partials/toolbar";
|
25
26
|
@import "partials/validations";
|
26
27
|
@import "partials/preferences";
|
@@ -60,6 +60,19 @@ select {
|
|
60
60
|
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
|
61
61
|
}
|
62
62
|
|
63
|
+
select[multiple] {
|
64
|
+
height: auto;
|
65
|
+
|
66
|
+
option {
|
67
|
+
padding: 0.5em;
|
68
|
+
|
69
|
+
&:checked {
|
70
|
+
background-color: #e5e6e7;
|
71
|
+
font-weight: 700;
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
|
63
76
|
label {
|
64
77
|
display: block;
|
65
78
|
}
|
@@ -5,7 +5,7 @@ class Admin::ConfigurationController < ApplicationController
|
|
5
5
|
# and the show and edit views determine what set of config values is shown and made editable.
|
6
6
|
|
7
7
|
before_action :initialize_config
|
8
|
-
|
8
|
+
before_action :authorize_role
|
9
9
|
only_allow_access_to :edit, :update,
|
10
10
|
when: [:admin],
|
11
11
|
denied_url: { controller: 'admin/configuration', action: 'show' },
|
@@ -1,7 +1,8 @@
|
|
1
1
|
class Admin::LayoutsController < Admin::ResourceController
|
2
2
|
paginate_models
|
3
|
+
before_action :authorize_role
|
3
4
|
only_allow_access_to :index, :show, :new, :create, :edit, :update, :remove, :destroy,
|
4
5
|
when: %i[designer admin],
|
5
6
|
denied_url: { controller: 'admin/pages', action: 'index' },
|
6
|
-
denied_message: 'You must have
|
7
|
+
denied_message: 'You must have at least editor privileges to perform this action.'
|
7
8
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'trusty_cms/resource_responses'
|
2
|
+
|
2
3
|
class Admin::ResourceController < ApplicationController
|
3
4
|
extend TrustyCms::ResourceResponses
|
4
5
|
|
@@ -95,6 +96,7 @@ class Admin::ResourceController < ApplicationController
|
|
95
96
|
def will_paginate_options
|
96
97
|
self.class.will_paginate_options || {}
|
97
98
|
end
|
99
|
+
|
98
100
|
helper_method :will_paginate_options
|
99
101
|
|
100
102
|
# a convenience method that returns true if paginate_models has been called on this controller class
|
@@ -102,6 +104,7 @@ class Admin::ResourceController < ApplicationController
|
|
102
104
|
def paginated?
|
103
105
|
self.class.paginated == true && params[:pp] != 'all'
|
104
106
|
end
|
107
|
+
|
105
108
|
helper_method :paginated?
|
106
109
|
|
107
110
|
# return a hash of page and per_page that can be used to build a will_paginate collection
|
@@ -145,7 +148,9 @@ class Admin::ResourceController < ApplicationController
|
|
145
148
|
def model
|
146
149
|
instance_variable_get("@#{model_symbol}") || load_model
|
147
150
|
end
|
151
|
+
|
148
152
|
alias :current_object :model
|
153
|
+
|
149
154
|
def model=(object)
|
150
155
|
instance_variable_set("@#{model_symbol}", object)
|
151
156
|
end
|
@@ -155,13 +160,15 @@ class Admin::ResourceController < ApplicationController
|
|
155
160
|
model_class.find(params[:id])
|
156
161
|
else
|
157
162
|
model_class.new
|
158
|
-
|
163
|
+
end
|
159
164
|
end
|
160
165
|
|
161
166
|
def models
|
162
167
|
instance_variable_get("@#{plural_model_symbol}") || load_models
|
163
168
|
end
|
169
|
+
|
164
170
|
alias :current_objects :models
|
171
|
+
|
165
172
|
def models=(objects)
|
166
173
|
instance_variable_set("@#{plural_model_symbol}", objects)
|
167
174
|
end
|
@@ -177,6 +184,7 @@ class Admin::ResourceController < ApplicationController
|
|
177
184
|
def plural_model_name
|
178
185
|
model_name.pluralize
|
179
186
|
end
|
187
|
+
|
180
188
|
alias :models_name :plural_model_name
|
181
189
|
|
182
190
|
def model_symbol
|
@@ -186,6 +194,7 @@ class Admin::ResourceController < ApplicationController
|
|
186
194
|
def plural_model_symbol
|
187
195
|
model_name.pluralize.underscore.intern
|
188
196
|
end
|
197
|
+
|
189
198
|
alias :models_symbol :plural_model_symbol
|
190
199
|
|
191
200
|
def humanized_model_name
|
@@ -1,7 +1,8 @@
|
|
1
1
|
class Admin::SnippetsController < Admin::ResourceController
|
2
2
|
paginate_models
|
3
|
+
before_action :authorize_role
|
3
4
|
only_allow_access_to :index, :show, :new, :create, :edit, :update, :remove, :destroy,
|
4
5
|
when: %i[designer admin],
|
5
6
|
denied_url: { controller: 'admin/pages', action: 'index' },
|
6
|
-
denied_message: 'You must have
|
7
|
+
denied_message: 'You must have at least editor privileges to perform this action.'
|
7
8
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
class Admin::UsersController < Admin::ResourceController
|
2
2
|
paginate_models
|
3
|
+
before_action :authorize_role
|
3
4
|
only_allow_access_to :index, :show, :new, :create, :edit, :update, :remove, :destroy,
|
4
5
|
when: :admin,
|
5
6
|
denied_url: { controller: 'pages', action: 'index' },
|
@@ -48,7 +49,7 @@ class Admin::UsersController < Admin::ResourceController
|
|
48
49
|
|
49
50
|
def user_params
|
50
51
|
params.require(:user).permit(:first_name, :last_name, :admin, :designer,
|
51
|
-
:password, :password_confirmation, :email, :site_id, :notes)
|
52
|
+
:password, :password_confirmation, :email, :site_id, :notes, site_ids: [])
|
52
53
|
end
|
53
54
|
|
54
55
|
def announce_cannot_delete_self
|
@@ -0,0 +1,61 @@
|
|
1
|
+
class PageStatusController < ApplicationController
|
2
|
+
skip_before_action :verify_authenticity_token, only: [:refresh]
|
3
|
+
skip_before_action :authenticate_user!, only: [:refresh]
|
4
|
+
before_action :authenticate_bearer_token
|
5
|
+
|
6
|
+
def refresh
|
7
|
+
pages = Page.where(status_id: Status[:scheduled].id)
|
8
|
+
|
9
|
+
updated_pages, remaining_pages = process_pages(pages)
|
10
|
+
|
11
|
+
render json: refresh_response(updated_pages, remaining_pages), status: :ok
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def authenticate_bearer_token
|
17
|
+
provided_token = request.headers['Authorization']&.split(' ')&.last
|
18
|
+
expected_token = Rails.application.credentials[:trusty_cms][:page_status_bearer_token]
|
19
|
+
|
20
|
+
if provided_token.blank?
|
21
|
+
render json: { error: 'Missing Bearer Token' }, status: :unauthorized and return
|
22
|
+
end
|
23
|
+
|
24
|
+
unless ActiveSupport::SecurityUtils.secure_compare(provided_token, expected_token)
|
25
|
+
render json: { error: 'Invalid Bearer Token' }, status: :unauthorized
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def process_pages(pages)
|
30
|
+
updated_pages = []
|
31
|
+
remaining_pages = []
|
32
|
+
|
33
|
+
pages.each do |page|
|
34
|
+
page_id = page.id
|
35
|
+
if page.published_at <= Time.now
|
36
|
+
page.update(status_id: Status[:published].id)
|
37
|
+
updated_pages << page_id
|
38
|
+
else
|
39
|
+
remaining_pages << page_id
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
[updated_pages, remaining_pages]
|
44
|
+
end
|
45
|
+
|
46
|
+
def refresh_response(updated_pages, remaining_pages)
|
47
|
+
if updated_pages.any?
|
48
|
+
updated_pages_count = updated_pages.count
|
49
|
+
{
|
50
|
+
message: "Successfully updated status of #{updated_pages_count} #{'page'.pluralize(updated_pages_count)}.",
|
51
|
+
updated_page_ids: updated_pages,
|
52
|
+
remaining_scheduled_page_ids: remaining_pages,
|
53
|
+
}
|
54
|
+
else
|
55
|
+
{
|
56
|
+
message: 'No scheduled pages matched the criteria for status refresh.',
|
57
|
+
remaining_scheduled_page_ids: remaining_pages,
|
58
|
+
}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -23,7 +23,6 @@ class SiteController < ApplicationController
|
|
23
23
|
url.to_s
|
24
24
|
end
|
25
25
|
if @page = find_page(url)
|
26
|
-
batch_page_status_refresh if url == '/' || url == ''
|
27
26
|
# This is a bit of a hack to get Vanity URL pages working in another extension
|
28
27
|
# In Rails 2, redirect_to halted execution, so process_page could be aliased and
|
29
28
|
# a redirect could be used. This no longer works. There's a better fix for this,
|
@@ -61,20 +60,6 @@ class SiteController < ApplicationController
|
|
61
60
|
|
62
61
|
private
|
63
62
|
|
64
|
-
def batch_page_status_refresh
|
65
|
-
@changed_pages = []
|
66
|
-
@pages = Page.where({ status_id: Status[:scheduled].id })
|
67
|
-
@pages.each do |page|
|
68
|
-
if page.published_at <= Time.now
|
69
|
-
page.status_id = Status[:published].id
|
70
|
-
page.save
|
71
|
-
@changed_pages << page.id
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
expires_in nil, :private => true, 'no-cache' => true if @changed_pages.length > 0
|
76
|
-
end
|
77
|
-
|
78
63
|
def set_cache_control
|
79
64
|
response_cache_director(@page).set_cache_control
|
80
65
|
end
|
@@ -14,11 +14,6 @@ module Admin::PagesHelper
|
|
14
14
|
!!(@page.errors[:slug] or @page.errors[:breadcrumb])
|
15
15
|
end
|
16
16
|
|
17
|
-
def status_to_display
|
18
|
-
@page.status_id = 100 if @page.status_id == 90
|
19
|
-
@display_status = Status.selectable.map { |s| [I18n.translate(s.name.downcase), s.id] }
|
20
|
-
end
|
21
|
-
|
22
17
|
def clean_page_description(page)
|
23
18
|
page.description.to_s.strip.gsub(/\t/, '').gsub(/\s+/, ' ')
|
24
19
|
end
|
@@ -2,7 +2,8 @@ module Admin::UsersHelper
|
|
2
2
|
def roles(user)
|
3
3
|
roles = []
|
4
4
|
roles << I18n.t('admin') if user.admin?
|
5
|
-
roles << I18n.t('
|
5
|
+
roles << I18n.t('editor') if user.editor?
|
6
|
+
roles << I18n.t('content_editor') if user.content_editor?
|
6
7
|
roles.join(', ')
|
7
8
|
end
|
8
9
|
end
|
@@ -33,11 +33,12 @@ module ApplicationHelper
|
|
33
33
|
t('buttons.save_changes', default: 'Save Changes')
|
34
34
|
options[:class] ||= 'button'
|
35
35
|
options[:accesskey] ||= 'S'
|
36
|
+
options[:id] ||= 'save-button'
|
36
37
|
submit_tag options.delete(:label), options
|
37
38
|
end
|
38
39
|
|
39
40
|
def save_model_and_continue_editing_button(_model)
|
40
|
-
submit_tag t('buttons.save_and_continue'), name: 'continue', class: 'button', accesskey: 's'
|
41
|
+
submit_tag t('buttons.save_and_continue'), name: 'continue', class: 'button', accesskey: 's', id: 'save-and-continue-button'
|
41
42
|
end
|
42
43
|
|
43
44
|
def current_item?(item)
|
data/app/models/page.rb
CHANGED
@@ -8,7 +8,7 @@ class Page < ActiveRecord::Base
|
|
8
8
|
end
|
9
9
|
|
10
10
|
# Callbacks
|
11
|
-
before_save :update_virtual, :
|
11
|
+
before_save :update_virtual, :update_published_datetime, :set_allowed_children_cache
|
12
12
|
|
13
13
|
# Associations
|
14
14
|
acts_as_tree order: 'position ASC'
|
@@ -220,15 +220,8 @@ class Page < ActiveRecord::Base
|
|
220
220
|
slug_child
|
221
221
|
end
|
222
222
|
|
223
|
-
def
|
224
|
-
self.published_at = Time.zone.now if published? && published_at
|
225
|
-
|
226
|
-
if !published_at.nil? && (published? || scheduled?)
|
227
|
-
self[:status_id] = Status[:scheduled].id if published_at > Time.zone.now
|
228
|
-
self[:status_id] = Status[:published].id if published_at <= Time.zone.now
|
229
|
-
end
|
230
|
-
|
231
|
-
true
|
223
|
+
def update_published_datetime
|
224
|
+
self.published_at = Time.zone.now if published? && published_at.blank?
|
232
225
|
end
|
233
226
|
|
234
227
|
def default_child
|
data/app/models/site.rb
CHANGED
@@ -7,6 +7,8 @@ class Site < ActiveRecord::Base
|
|
7
7
|
belongs_to :created_by, class_name: 'User'
|
8
8
|
belongs_to :updated_by, class_name: 'User'
|
9
9
|
belongs_to :production_homepage, class_name: 'ProductionPage'
|
10
|
+
has_many :admins_sites
|
11
|
+
has_many :admins, through: :admins_sites, class_name: 'User'
|
10
12
|
|
11
13
|
default_scope { order('position ASC') }
|
12
14
|
|
data/app/models/status.rb
CHANGED
@@ -81,7 +81,8 @@ module TrustyCms
|
|
81
81
|
TrustyCms::Config.initialize_cache
|
82
82
|
end
|
83
83
|
TrustyCms::Config.initialize_cache if TrustyCms::Config.stale_cache?
|
84
|
-
Rails.cache.read('TrustyCms::Config')
|
84
|
+
config_cache = Rails.cache.read('TrustyCms::Config')
|
85
|
+
config_cache ? config_cache[key] : nil
|
85
86
|
end
|
86
87
|
end
|
87
88
|
end
|
data/app/models/user.rb
CHANGED
@@ -7,7 +7,6 @@ class User < ActiveRecord::Base
|
|
7
7
|
:recoverable, :rememberable, :trackable, :validatable
|
8
8
|
|
9
9
|
alias_attribute :created_by_id, :id
|
10
|
-
|
11
10
|
attr_accessor :skip_password_validation
|
12
11
|
|
13
12
|
validate :password_complexity
|
@@ -18,6 +17,13 @@ class User < ActiveRecord::Base
|
|
18
17
|
# Associations
|
19
18
|
belongs_to :created_by, class_name: 'User'
|
20
19
|
belongs_to :updated_by, class_name: 'User'
|
20
|
+
has_many :admins_sites, foreign_key: 'admin_id', class_name: 'AdminsSite', dependent: :destroy
|
21
|
+
has_many :sites, through: :admins_sites
|
22
|
+
|
23
|
+
# Roles
|
24
|
+
# Admin - all permissions
|
25
|
+
# Editor - all permissions except for users, sites editing
|
26
|
+
# Content Editor - all permissions except for users, sites, publishing and deleting
|
21
27
|
|
22
28
|
def role?(role)
|
23
29
|
case role
|
@@ -40,12 +46,16 @@ class User < ActiveRecord::Base
|
|
40
46
|
designer
|
41
47
|
end
|
42
48
|
|
49
|
+
def editor?
|
50
|
+
designer
|
51
|
+
end
|
52
|
+
|
43
53
|
def content_editor?
|
44
54
|
content_editor
|
45
55
|
end
|
46
56
|
|
47
|
-
def
|
48
|
-
|
57
|
+
def scoped_site?
|
58
|
+
sites.present?
|
49
59
|
end
|
50
60
|
|
51
61
|
def locale
|
@@ -67,4 +77,5 @@ class User < ActiveRecord::Base
|
|
67
77
|
|
68
78
|
errors.add :password, 'Complexity requirement not met. Length should be 12 characters and include: 1 uppercase, 1 lowercase, 1 digit and 1 special character.'
|
69
79
|
end
|
70
|
-
|
80
|
+
|
81
|
+
end
|
@@ -1,7 +1,9 @@
|
|
1
1
|
- unless current_user.site
|
2
2
|
%label{:for=>'layout_site_id', :class => 'admin_only'}
|
3
3
|
Site
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
:ruby
|
5
|
+
user_sites = current_user.admins_sites.pluck(:site_id)
|
6
|
+
sites = Site.where(:id => user_sites).map { |s| [s.name, s.id] }
|
7
|
+
selection = {:include_blank => Layout.is_shareable?}
|
8
|
+
selection[:selected] = current_site.id if @layout.new_record? && ! Layout.is_shareable?
|
7
9
|
= select :layout, :site_id, sites, selection
|
@@ -1,9 +1,9 @@
|
|
1
|
-
- if current_user.
|
1
|
+
- if current_user.scoped_site? && defined?(Site) && defined?(controller) && controller.sited_model? && controller.template_name == 'index' && Site.several?
|
2
2
|
.site_chooser
|
3
3
|
%ul.nav
|
4
4
|
%li
|
5
5
|
= "Current Site: #{current_site.name}"
|
6
6
|
%ul.expansion
|
7
|
-
-
|
7
|
+
- current_user.sites.each do |site|
|
8
8
|
%li
|
9
9
|
= link_to( site.name, "#{request.path}?site_id=#{site.id}", :class => site == current_site ? 'fg site-link' : 'site-link')
|
@@ -1,3 +1,5 @@
|
|
1
|
+
= javascript_include_tag 'admin/validations/scheduled_status_validation'
|
2
|
+
|
1
3
|
= fields.hidden_field :lock_version
|
2
4
|
= fields.hidden_field :parent_id
|
3
5
|
= fields.hidden_field :class_name
|
@@ -41,16 +43,23 @@
|
|
41
43
|
= fields.label :class_name, t('page_type')
|
42
44
|
= fields.select :class_name, [[t('select.normal'), '']] + Page.descendants.map { |p| [p.display_name, p.name] }.sort_by { |p| p.first }
|
43
45
|
- layout.edit_status do
|
44
|
-
.
|
45
|
-
|
46
|
-
|
46
|
+
- if current_user.admin? || current_user.editor?
|
47
|
+
.status
|
48
|
+
= fields.label :status_id, t('status')
|
49
|
+
= fields.select :status_id, Status.selectable.map { |s| [s.name, s.id] }
|
47
50
|
- layout.edit_published_at do
|
48
51
|
.published-date
|
49
|
-
#published_at{:class => (@page.published? ?
|
50
|
-
= fields.label :published_at, t('
|
51
|
-
= fields.text_field :published_at,
|
52
|
+
#published_at{:class => (@page.published? ? '' : 'hidden')}
|
53
|
+
= fields.label :published_at, t('publish_datetime')
|
54
|
+
= fields.text_field :published_at,
|
55
|
+
class: 'datetime',
|
56
|
+
type: 'datetime-local',
|
57
|
+
value: (@page.published_at? ? @page.published_at.strftime('%Y-%m-%dT%H:%M') : nil)
|
52
58
|
= render_region :layout_row, :locals => {:f => fields}
|
53
59
|
|
60
|
+
.error.hidden
|
61
|
+
%span#published-at-error
|
62
|
+
|
54
63
|
- render_region :form_bottom, :locals => {:f => fields} do |form_bottom|
|
55
64
|
- form_bottom.edit_buttons do
|
56
65
|
- @buttons_partials.each do |partial|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
- unless current_user.site
|
2
2
|
%label{:for=>'snippet_site_id', :Class => 'admin_only'}
|
3
3
|
Site
|
4
|
-
-
|
4
|
+
- user_sites = current_user.admins_sites.pluck(:site_id)
|
5
|
+
- sites = Site.where(:id => user_sites).map { |s| [s.name, s.id] }
|
5
6
|
= select :snippet, :site_id, sites, :include_blank => Snippet.is_shareable?, :selected => @snippet.site_id || current_site.id
|
@@ -1,4 +1,5 @@
|
|
1
1
|
- if current_user.admin?
|
2
2
|
%label{:for=>'user_admin'} Can edit site
|
3
|
-
|
3
|
+
.caption (hold ctrl or cmd to select multiple)
|
4
4
|
.caption A user with no site is able to act (to whatever extent their status allows) on any site.
|
5
|
+
= select :user, :site_ids, options_for_select(Site.all.map { |s| [s.name, s.id] }, selected: @user.site_ids), {}, { multiple: true }
|
@@ -25,7 +25,9 @@
|
|
25
25
|
= f.check_box 'admin', :class => 'checkbox'
|
26
26
|
= f.label :admin, t('admin'), :class => 'checkbox'
|
27
27
|
= f.check_box 'designer', :class => 'checkbox'
|
28
|
-
= f.label :designer, t('
|
28
|
+
= f.label :designer, t('editor'), :class => 'checkbox'
|
29
|
+
= f.check_box 'content_editor', :class => 'checkbox'
|
30
|
+
= f.label :content_editor, t('content_editor'), :class => 'checkbox'
|
29
31
|
|
30
32
|
- form.edit_notes do
|
31
33
|
%fieldset
|
data/bin/rails
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
# installed from the root of your application.
|
4
4
|
|
5
5
|
ENGINE_ROOT = File.expand_path('..', __dir__)
|
6
|
-
ENGINE_PATH = File.expand_path('../lib/
|
7
|
-
APP_PATH = File.expand_path('../
|
6
|
+
ENGINE_PATH = File.expand_path('../lib/trusty_cms/engine', __dir__)
|
7
|
+
APP_PATH = File.expand_path('../spec/dummy/config/application', __dir__)
|
8
8
|
|
9
9
|
# Set up gems listed in the Gemfile.
|
10
10
|
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
|
data/config/application.rb
CHANGED
@@ -20,6 +20,7 @@ module TrustyCms
|
|
20
20
|
Rails.autoloaders.log!
|
21
21
|
# Enable the asset pipeline
|
22
22
|
config.assets.enabled = true
|
23
|
+
config.active_record.legacy_connection_handling = false
|
23
24
|
|
24
25
|
# Version of your assets, change this if you want to expire all your assets
|
25
26
|
config.assets.version = '1.0'
|
@@ -187,7 +187,7 @@ Devise.setup do |config|
|
|
187
187
|
# ==> Configuration for :timeoutable
|
188
188
|
# The time you want to timeout the user session without activity. After this
|
189
189
|
# time the user will be asked for credentials again. Default is 30 minutes.
|
190
|
-
|
190
|
+
config.timeout_in = 8.hours
|
191
191
|
|
192
192
|
# ==> Configuration for :lockable
|
193
193
|
# Defines which strategy will be used to lock an account.
|