trusty-cms 7.0.3 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f70f54fbf4a9bdd1942aa09ab0ce72e3d0d2936e4f3df17aa6e127bc94ef6344
4
- data.tar.gz: d432e6f6aafa924bca508f829a4fdb3048526e6f081f1244002050e97d6d0d3a
3
+ metadata.gz: '05933f41895532d7fe76ff1dfef0d58a2ca32616cc65d1371de837b8205fb038'
4
+ data.tar.gz: b0fb2ed52eba017ff08af74846e4e299fd21307f740954004002097a9279dbfd
5
5
  SHA512:
6
- metadata.gz: e321cca958b7654771284d611961db5b1ada2dd89abd0bae3b78dd33a4ef05313f1390f93a4ff355bb0e2534bab923caf73d2fba8ae44eb3a7b9aed83cd66d86
7
- data.tar.gz: 8e0e2fc24697b390b9176aa8e0f8b03a7c4cafdae22a4625da787bbea24cd8a892b6a88f20f409a7a4a4bf196c7016c2802e76c5448d4afd0d879970d7ae1ba8
6
+ metadata.gz: 863fe6620bddab68ac18164ba50a1b60e785f00efdfd8a16f907045d2f5fe5fa372b30352c3a7ea4e13bf89200823f3fc181ee4937a49e7f9d3d70bcf9338740
7
+ data.tar.gz: 16f1007d43c8ab0f8c52f36d1d90dae8d9652caaa0ad1f7e55b7a6d6699b1cdff6ab1e6f5ec059270e434bdb9d119449351f608dbd3a115c49b0c3d786a1f7f1
data/.gitignore CHANGED
@@ -18,6 +18,7 @@ rerun.txt
18
18
  *.swp
19
19
  .rvmrc
20
20
  .bundle
21
+ vendor/bundle/
21
22
  .ruby-gemset
22
23
  *.rails2
23
24
  vendor/plugins/rails_upgrade
data/Gemfile.lock CHANGED
@@ -39,69 +39,69 @@ GEM
39
39
  remote: https://rubygems.org/
40
40
  specs:
41
41
  RedCloth (4.3.3)
42
- actioncable (7.0.8.6)
43
- actionpack (= 7.0.8.6)
44
- activesupport (= 7.0.8.6)
42
+ actioncable (7.0.8.7)
43
+ actionpack (= 7.0.8.7)
44
+ activesupport (= 7.0.8.7)
45
45
  nio4r (~> 2.0)
46
46
  websocket-driver (>= 0.6.1)
47
- actionmailbox (7.0.8.6)
48
- actionpack (= 7.0.8.6)
49
- activejob (= 7.0.8.6)
50
- activerecord (= 7.0.8.6)
51
- activestorage (= 7.0.8.6)
52
- activesupport (= 7.0.8.6)
47
+ actionmailbox (7.0.8.7)
48
+ actionpack (= 7.0.8.7)
49
+ activejob (= 7.0.8.7)
50
+ activerecord (= 7.0.8.7)
51
+ activestorage (= 7.0.8.7)
52
+ activesupport (= 7.0.8.7)
53
53
  mail (>= 2.7.1)
54
54
  net-imap
55
55
  net-pop
56
56
  net-smtp
57
- actionmailer (7.0.8.6)
58
- actionpack (= 7.0.8.6)
59
- actionview (= 7.0.8.6)
60
- activejob (= 7.0.8.6)
61
- activesupport (= 7.0.8.6)
57
+ actionmailer (7.0.8.7)
58
+ actionpack (= 7.0.8.7)
59
+ actionview (= 7.0.8.7)
60
+ activejob (= 7.0.8.7)
61
+ activesupport (= 7.0.8.7)
62
62
  mail (~> 2.5, >= 2.5.4)
63
63
  net-imap
64
64
  net-pop
65
65
  net-smtp
66
66
  rails-dom-testing (~> 2.0)
67
- actionpack (7.0.8.6)
68
- actionview (= 7.0.8.6)
69
- activesupport (= 7.0.8.6)
67
+ actionpack (7.0.8.7)
68
+ actionview (= 7.0.8.7)
69
+ activesupport (= 7.0.8.7)
70
70
  rack (~> 2.0, >= 2.2.4)
71
71
  rack-test (>= 0.6.3)
72
72
  rails-dom-testing (~> 2.0)
73
73
  rails-html-sanitizer (~> 1.0, >= 1.2.0)
74
- actiontext (7.0.8.6)
75
- actionpack (= 7.0.8.6)
76
- activerecord (= 7.0.8.6)
77
- activestorage (= 7.0.8.6)
78
- activesupport (= 7.0.8.6)
74
+ actiontext (7.0.8.7)
75
+ actionpack (= 7.0.8.7)
76
+ activerecord (= 7.0.8.7)
77
+ activestorage (= 7.0.8.7)
78
+ activesupport (= 7.0.8.7)
79
79
  globalid (>= 0.6.0)
80
80
  nokogiri (>= 1.8.5)
81
- actionview (7.0.8.6)
82
- activesupport (= 7.0.8.6)
81
+ actionview (7.0.8.7)
82
+ activesupport (= 7.0.8.7)
83
83
  builder (~> 3.1)
84
84
  erubi (~> 1.4)
85
85
  rails-dom-testing (~> 2.0)
86
86
  rails-html-sanitizer (~> 1.1, >= 1.2.0)
87
- activejob (7.0.8.6)
88
- activesupport (= 7.0.8.6)
87
+ activejob (7.0.8.7)
88
+ activesupport (= 7.0.8.7)
89
89
  globalid (>= 0.3.6)
90
- activemodel (7.0.8.6)
91
- activesupport (= 7.0.8.6)
92
- activerecord (7.0.8.6)
93
- activemodel (= 7.0.8.6)
94
- activesupport (= 7.0.8.6)
95
- activestorage (7.0.8.6)
96
- actionpack (= 7.0.8.6)
97
- activejob (= 7.0.8.6)
98
- activerecord (= 7.0.8.6)
99
- activesupport (= 7.0.8.6)
90
+ activemodel (7.0.8.7)
91
+ activesupport (= 7.0.8.7)
92
+ activerecord (7.0.8.7)
93
+ activemodel (= 7.0.8.7)
94
+ activesupport (= 7.0.8.7)
95
+ activestorage (7.0.8.7)
96
+ actionpack (= 7.0.8.7)
97
+ activejob (= 7.0.8.7)
98
+ activerecord (= 7.0.8.7)
99
+ activesupport (= 7.0.8.7)
100
100
  marcel (~> 1.0)
101
101
  mini_mime (>= 1.1.0)
102
102
  activestorage-validator (0.4.0)
103
103
  rails (>= 6.1.0)
104
- activesupport (7.0.8.6)
104
+ activesupport (7.0.8.7)
105
105
  concurrent-ruby (~> 1.0, >= 1.0.2)
106
106
  i18n (>= 1.6, < 2)
107
107
  minitest (>= 5.1)
@@ -227,7 +227,7 @@ GEM
227
227
  mini_mime (1.1.5)
228
228
  mini_racer (0.16.0)
229
229
  libv8-node (~> 18.19.0.0)
230
- minitest (5.25.2)
230
+ minitest (5.25.4)
231
231
  multi_xml (0.7.1)
232
232
  bigdecimal (~> 3.1)
233
233
  multipart-post (2.4.1)
@@ -243,17 +243,17 @@ GEM
243
243
  net-smtp (0.5.0)
244
244
  net-protocol
245
245
  nio4r (2.7.3)
246
- nokogiri (1.16.8-aarch64-linux)
246
+ nokogiri (1.17.2-aarch64-linux)
247
247
  racc (~> 1.4)
248
- nokogiri (1.16.8-arm-linux)
248
+ nokogiri (1.17.2-arm-linux)
249
249
  racc (~> 1.4)
250
- nokogiri (1.16.8-arm64-darwin)
250
+ nokogiri (1.17.2-arm64-darwin)
251
251
  racc (~> 1.4)
252
- nokogiri (1.16.8-x86-linux)
252
+ nokogiri (1.17.2-x86-linux)
253
253
  racc (~> 1.4)
254
- nokogiri (1.16.8-x86_64-darwin)
254
+ nokogiri (1.17.2-x86_64-darwin)
255
255
  racc (~> 1.4)
256
- nokogiri (1.16.8-x86_64-linux)
256
+ nokogiri (1.17.2-x86_64-linux)
257
257
  racc (~> 1.4)
258
258
  orm_adapter (0.5.0)
259
259
  poltergeist (1.18.1)
@@ -276,32 +276,32 @@ GEM
276
276
  rack-test (2.1.0)
277
277
  rack (>= 1.3)
278
278
  radius (0.7.5)
279
- rails (7.0.8.6)
280
- actioncable (= 7.0.8.6)
281
- actionmailbox (= 7.0.8.6)
282
- actionmailer (= 7.0.8.6)
283
- actionpack (= 7.0.8.6)
284
- actiontext (= 7.0.8.6)
285
- actionview (= 7.0.8.6)
286
- activejob (= 7.0.8.6)
287
- activemodel (= 7.0.8.6)
288
- activerecord (= 7.0.8.6)
289
- activestorage (= 7.0.8.6)
290
- activesupport (= 7.0.8.6)
279
+ rails (7.0.8.7)
280
+ actioncable (= 7.0.8.7)
281
+ actionmailbox (= 7.0.8.7)
282
+ actionmailer (= 7.0.8.7)
283
+ actionpack (= 7.0.8.7)
284
+ actiontext (= 7.0.8.7)
285
+ actionview (= 7.0.8.7)
286
+ activejob (= 7.0.8.7)
287
+ activemodel (= 7.0.8.7)
288
+ activerecord (= 7.0.8.7)
289
+ activestorage (= 7.0.8.7)
290
+ activesupport (= 7.0.8.7)
291
291
  bundler (>= 1.15.0)
292
- railties (= 7.0.8.6)
292
+ railties (= 7.0.8.7)
293
293
  rails-dom-testing (2.2.0)
294
294
  activesupport (>= 5.0.0)
295
295
  minitest
296
296
  nokogiri (>= 1.6)
297
- rails-html-sanitizer (1.6.1)
297
+ rails-html-sanitizer (1.6.2)
298
298
  loofah (~> 2.21)
299
299
  nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
300
300
  rails-observers (0.1.5)
301
301
  activemodel (>= 4.0)
302
- railties (7.0.8.6)
303
- actionpack (= 7.0.8.6)
304
- activesupport (= 7.0.8.6)
302
+ railties (7.0.8.7)
303
+ actionpack (= 7.0.8.7)
304
+ activesupport (= 7.0.8.7)
305
305
  method_source
306
306
  rake (>= 12.2)
307
307
  thor (~> 1.0)
data/README.md CHANGED
@@ -40,16 +40,14 @@ codebase are copyright (c) John W. Long and Sean Cribbs; anything after the
40
40
  fork is copyright (c) Pittsburgh Cultural Trust. A copy of the MIT license can
41
41
  be found in the LICENSE file.
42
42
 
43
- ## Installation and Setup for Use
43
+ ## Installation and Setup
44
44
 
45
45
  TrustyCMS is a traditional Ruby on Rails engine, meaning that you can
46
46
  configure and run it the way you would a normal gem, like [Devise](https://github.com/plataformatec/devise).
47
47
 
48
48
  See the INSTALL.md file for more instructions.
49
49
 
50
- ### Installation and Setup for Contributing to TrustyCMS
51
-
52
- #### Setup
50
+ ### Installation
53
51
 
54
52
  Prerequisites:
55
53
 
@@ -79,6 +77,111 @@ Steps:
79
77
 
80
78
  rspec
81
79
 
80
+
81
+ ### Page Status Refresh Setup
82
+
83
+ To ensure **Scheduled Pages** automatically update their status to **Published** after their designated **Publish Date & Time**, follow these steps to set up an automated refresh using **AWS Lambda** and **EventBridge**.
84
+
85
+ **1. Generate a Bearer Token**
86
+ Open a Rails console and run the following command:
87
+ ```bash
88
+ rails c
89
+ ```
90
+ Then generate a token:
91
+ ```ruby
92
+ SecureRandom.base58(24)
93
+ ```
94
+
95
+ **2. Store the Token in Rails Credentials**
96
+ Run the following command to edit your credentials:
97
+ ```bash
98
+ bin/rails encrypted:edit config/credentials.yml.enc
99
+ ```
100
+ Add the token to your credentials:
101
+ ```yaml
102
+ trusty_cms:
103
+ page_status_bearer_token: '<your bearer token>'
104
+ ```
105
+
106
+ **3. Create a Ruby Lambda Function in AWS**
107
+ - Log into **AWS Lambda** and create a **new Ruby Lambda function**.
108
+ - Note the **Ruby version** used, as you'll need it locally.
109
+ - Use [rbenv](https://github.com/rbenv/rbenv) to manage the Ruby version locally:
110
+ ```bash
111
+ rbenv install 3.3.0
112
+ rbenv local 3.3.0
113
+ ```
114
+
115
+ **4. Write the Lambda Function Code**
116
+ In your local development environment:
117
+ - Create a new folder and open it in your IDE.
118
+ - Save the following code in a file named `lambda_handler.rb`:
119
+
120
+ ```ruby
121
+ require 'httparty'
122
+
123
+ def lambda_handler(event:, context:)
124
+ uri = ENV['API_ENDPOINT']
125
+ token = ENV['BEARER_TOKEN']
126
+
127
+ response = HTTParty.post(
128
+ uri,
129
+ headers: {
130
+ 'Content-Type': 'application/json',
131
+ 'Authorization': "Bearer #{token}"
132
+ }
133
+ )
134
+
135
+ if response.success?
136
+ puts "Success: #{response.body}"
137
+ else
138
+ puts "Error: #{response.code} - #{response.message}"
139
+ end
140
+ end
141
+ ```
142
+
143
+ **5. Install Dependencies**
144
+ Run the following commands in your terminal:
145
+ ```bash
146
+ gem install bundler
147
+ bundle init
148
+ ```
149
+ Add the dependency to your `Gemfile`:
150
+ ```ruby
151
+ gem 'httparty'
152
+ ```
153
+ Install dependencies locally:
154
+ ```bash
155
+ bundle config set --local path 'vendor/bundle'
156
+ bundle install
157
+ ```
158
+
159
+ **6. Package the Lambda Function**
160
+ Archive your function and dependencies:
161
+ ```bash
162
+ zip -r lambda_package.zip .
163
+ ```
164
+
165
+ **7. Upload to AWS Lambda**
166
+ - In **AWS Lambda**, open your function.
167
+ - Select **Upload From > .zip file**.
168
+ - Upload the `lambda_package.zip` file.
169
+
170
+ **8. Configure Environment Variables**
171
+ In the AWS Lambda Configuration:
172
+ - Go to **Environment Variables** > **Edit**.
173
+ - Add the following:
174
+ - `API_ENDPOINT`: `<your-url>/page-status/refresh`
175
+ - `BEARER_TOKEN`: `<your bearer token>`
176
+
177
+ **9. Set Up EventBridge Trigger**
178
+ - In **Configuration Settings > Triggers**, create a **new EventBridge Trigger**.
179
+ - Set the **Schedule** to match your desired **page status refresh frequency**.
180
+
181
+ Your setup is now complete, and **Scheduled Pages** will automatically update their status via the AWS Lambda and EventBridge integration.
182
+
183
+ ### Contributing to TrustyCMS
184
+
82
185
  When you're ready to make a change:
83
186
 
84
187
  1. Add the pgharts fork as a git remote called "upstream":
@@ -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/dateinput";
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";
@@ -0,0 +1,5 @@
1
+ .datetime {
2
+ border: 1px solid #919191;
3
+ margin: 0.5em;
4
+ padding: 0.5em 1em;
5
+ }
@@ -10,6 +10,10 @@
10
10
  .error {
11
11
  background-color: #f3c2c2;
12
12
  color: $alt-link-color;
13
+
14
+ &.hidden {
15
+ display: none;
16
+ }
13
17
  }
14
18
 
15
19
  .warning {
@@ -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
@@ -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, :update_status, :set_allowed_children_cache
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 update_status
224
- self.published_at = Time.zone.now if published? && published_at == nil
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/status.rb CHANGED
@@ -19,12 +19,8 @@ class Status
19
19
  @@statuses.find { |status| status.id.to_s == id.to_s }
20
20
  end
21
21
 
22
- def self.find_all
23
- @@statuses.dup
24
- end
25
-
26
22
  def self.selectable
27
- find_all - [self['Scheduled']]
23
+ @@statuses
28
24
  end
29
25
 
30
26
  def self.selectable_values
@@ -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
@@ -44,14 +46,20 @@
44
46
  - if current_user.admin? || current_user.editor?
45
47
  .status
46
48
  = fields.label :status_id, t('status')
47
- = fields.select :status_id, status_to_display
49
+ = fields.select :status_id, Status.selectable.map { |s| [s.name, s.id] }
48
50
  - layout.edit_published_at do
49
51
  .published-date
50
- #published_at{:class => (@page.published? ? nil : 'hidden')}
51
- = fields.label :published_at, t('published_on')
52
- = fields.text_field :published_at, :class=> 'date', :type=>'date', :value => (@page.published_at? ? I18n.localize(@page.published_at.to_date, :format =>:default) : nil)
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)
53
58
  = render_region :layout_row, :locals => {:f => fields}
54
59
 
60
+ .error.hidden
61
+ %span#published-at-error
62
+
55
63
  - render_region :form_bottom, :locals => {:f => fields} do |form_bottom|
56
64
  - form_bottom.edit_buttons do
57
65
  - @buttons_partials.each do |partial|
@@ -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
- # config.timeout_in = 30.minutes
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.
@@ -243,7 +243,7 @@ en:
243
243
  preview: 'Preview'
244
244
  published: 'Published'
245
245
  published_at: 'Published at'
246
- published_on: 'Published On'
246
+ publish_datetime: 'Publish Date & Time'
247
247
  reference: 'Reference'
248
248
  remember_me: 'Remember me'
249
249
  remember_me_in_this_browser: 'Remember me in this browser'
data/config/routes.rb CHANGED
@@ -4,6 +4,7 @@ TrustyCms::Application.routes.draw do
4
4
  as :user do
5
5
  post 'authenticate', to: 'devise/sessions#create', as: :authenticate
6
6
  end
7
+ post '/page-status/refresh' => 'page_status#refresh'
7
8
  get '/rad_social/mail' => 'social_mailer#social_mail_form', as: :rad_social_mail_form
8
9
  post '/rad_social/mail' => 'social_mailer#create_social_mail', as: :rad_create_social_mail
9
10
  TrustyCms::Application.config.enabled_extensions.each do |ext|
@@ -1,4 +1,4 @@
1
1
  module TrustyCms
2
- VERSION = '7.0.3'.freeze
2
+ VERSION = '7.0.4'.freeze
3
3
  end
4
4
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trusty-cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.0.3
4
+ version: 7.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - TrustyCms CMS dev team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-13 00:00:00.000000000 Z
11
+ date: 2025-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activestorage-validator
@@ -653,6 +653,7 @@ files:
653
653
  - app/assets/javascripts/admin/treetable.js
654
654
  - app/assets/javascripts/admin/utilities.js
655
655
  - app/assets/javascripts/admin/validation.js
656
+ - app/assets/javascripts/admin/validations/scheduled_status_validation.js
656
657
  - app/assets/javascripts/admin/validations/user_validations.js
657
658
  - app/assets/javascripts/ckeditor/config.js
658
659
  - app/assets/javascripts/ckeditor/contents.css
@@ -673,7 +674,8 @@ files:
673
674
  - app/assets/stylesheets/admin/modules/_links.scss
674
675
  - app/assets/stylesheets/admin/partials/_actions.scss
675
676
  - app/assets/stylesheets/admin/partials/_content.scss
676
- - app/assets/stylesheets/admin/partials/_dateinput.scss
677
+ - app/assets/stylesheets/admin/partials/_date_input.scss
678
+ - app/assets/stylesheets/admin/partials/_datetime_input.scss
677
679
  - app/assets/stylesheets/admin/partials/_drawer.scss
678
680
  - app/assets/stylesheets/admin/partials/_dropdown.scss
679
681
  - app/assets/stylesheets/admin/partials/_footer.scss
@@ -707,6 +709,7 @@ files:
707
709
  - app/controllers/admin/snippets_controller.rb
708
710
  - app/controllers/admin/users_controller.rb
709
711
  - app/controllers/application_controller.rb
712
+ - app/controllers/page_status_controller.rb
710
713
  - app/controllers/site_controller.rb
711
714
  - app/controllers/social_mailer_controller.rb
712
715
  - app/helpers/admin/configuration_helper.rb