From be7abb4e3758e0708a36175d517dfa4c100a9638 Mon Sep 17 00:00:00 2001 From: Splines Date: Tue, 12 Sep 2023 19:59:05 +0200 Subject: [PATCH 01/14] Init news popup models --- app/models/has_seen_news_popup.rb | 4 ++++ app/models/news_popup.rb | 2 ++ .../20230912172133_create_news_popups.rb | 10 ++++++++++ ...230912172632_create_has_seen_news_popups.rb | 10 ++++++++++ db/schema.rb | 18 +++++++++++++++++- 5 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 app/models/has_seen_news_popup.rb create mode 100644 app/models/news_popup.rb create mode 100644 db/migrate/20230912172133_create_news_popups.rb create mode 100644 db/migrate/20230912172632_create_has_seen_news_popups.rb diff --git a/app/models/has_seen_news_popup.rb b/app/models/has_seen_news_popup.rb new file mode 100644 index 000000000..47220da4d --- /dev/null +++ b/app/models/has_seen_news_popup.rb @@ -0,0 +1,4 @@ +class HasSeenNewsPopup < ApplicationRecord + belongs_to :user_id + belongs_to :news_popup_id +end diff --git a/app/models/news_popup.rb b/app/models/news_popup.rb new file mode 100644 index 000000000..def8ab57a --- /dev/null +++ b/app/models/news_popup.rb @@ -0,0 +1,2 @@ +class NewsPopup < ApplicationRecord +end diff --git a/db/migrate/20230912172133_create_news_popups.rb b/db/migrate/20230912172133_create_news_popups.rb new file mode 100644 index 000000000..270fbd4ef --- /dev/null +++ b/db/migrate/20230912172133_create_news_popups.rb @@ -0,0 +1,10 @@ +class CreateNewsPopups < ActiveRecord::Migration[7.0] + def change + create_table :news_popups do |t| + t.text :name + t.boolean :active + + t.timestamps + end + end +end diff --git a/db/migrate/20230912172632_create_has_seen_news_popups.rb b/db/migrate/20230912172632_create_has_seen_news_popups.rb new file mode 100644 index 000000000..7bd2049a7 --- /dev/null +++ b/db/migrate/20230912172632_create_has_seen_news_popups.rb @@ -0,0 +1,10 @@ +class CreateHasSeenNewsPopups < ActiveRecord::Migration[7.0] + def change + create_table :has_seen_news_popups do |t| + t.references :user, null: false, foreign_key: true + t.references :news_popup, null: false, foreign_key: true + end + + add_index :has_seen_news_popups, [:user, :news_popup], unique: true + end +end diff --git a/db/schema.rb b/db/schema.rb index d9abf5def..ef19e7e47 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_04_27_124337) do +ActiveRecord::Schema[7.0].define(version: 2023_09_12_172632) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" @@ -201,6 +201,13 @@ t.index ["sluggable_type"], name: "index_friendly_id_slugs_on_sluggable_type" end + create_table "has_seen_news_popups", force: :cascade do |t| + t.bigint "user_id", null: false + t.bigint "news_popup_id", null: false + t.index ["news_popup_id"], name: "index_has_seen_news_popups_on_news_popup_id" + t.index ["user_id"], name: "index_has_seen_news_popups_on_user_id" + end + create_table "imports", force: :cascade do |t| t.bigint "medium_id", null: false t.string "teachable_type", null: false @@ -364,6 +371,13 @@ t.index ["tag_id"], name: "index_medium_tag_joins_on_tag_id" end + create_table "news_popups", force: :cascade do |t| + t.text "name" + t.boolean "active" + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + end + create_table "notifications", force: :cascade do |t| t.integer "recipient_id" t.integer "notifiable_id" @@ -906,6 +920,8 @@ add_foreign_key "commontator_subscriptions", "commontator_threads", column: "thread_id", on_update: :cascade, on_delete: :cascade add_foreign_key "course_self_joins", "courses" add_foreign_key "divisions", "programs" + add_foreign_key "has_seen_news_popups", "news_popups" + add_foreign_key "has_seen_news_popups", "users" add_foreign_key "imports", "media" add_foreign_key "items", "media" add_foreign_key "items", "sections" From 87b366fff0e56f2d5ff3ef8935d007d6d8ec586d Mon Sep 17 00:00:00 2001 From: Splines Date: Tue, 12 Sep 2023 21:19:53 +0200 Subject: [PATCH 02/14] Init controller & JSON route for unseen popups --- app/controllers/news_popups_controller.rb | 17 +++++++++++++++++ app/models/has_seen_news_popup.rb | 4 ++-- config/routes.rb | 2 ++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 app/controllers/news_popups_controller.rb diff --git a/app/controllers/news_popups_controller.rb b/app/controllers/news_popups_controller.rb new file mode 100644 index 000000000..b8ab2e5a7 --- /dev/null +++ b/app/controllers/news_popups_controller.rb @@ -0,0 +1,17 @@ +class NewsPopupsController < ApplicationController + def index + respond_to do |format| + format.json { render json: unseen_news_popups } + end + end + + private + + def unseen_news_popups + HasSeenNewsPopup + .where(user: current_user) + .left_outer_joins(:news_popup) + .select('news_popups.active', 'news_popups.name') + .where(news_popups: { active: true }) + end +end diff --git a/app/models/has_seen_news_popup.rb b/app/models/has_seen_news_popup.rb index 47220da4d..a40287358 100644 --- a/app/models/has_seen_news_popup.rb +++ b/app/models/has_seen_news_popup.rb @@ -1,4 +1,4 @@ class HasSeenNewsPopup < ApplicationRecord - belongs_to :user_id - belongs_to :news_popup_id + belongs_to :user + belongs_to :news_popup end diff --git a/config/routes.rb b/config/routes.rb index 46bc8c68d..f8eed0710 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -844,6 +844,8 @@ to: 'erdbeere#fill_realizations_select', as: 'fill_realizations_select' + # News popups routes + resources :news_popups, only: [:index] # main routes From fd5a9308be2d09529eff65cc944907c5ec29f991 Mon Sep 17 00:00:00 2001 From: Splines Date: Tue, 12 Sep 2023 21:42:17 +0200 Subject: [PATCH 03/14] Fix creating index in migration --- db/migrate/20230912172632_create_has_seen_news_popups.rb | 4 ++-- .../20230912193144_add_index_to_has_seen_news_popups.rb | 5 +++++ db/schema.rb | 5 ++++- 3 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20230912193144_add_index_to_has_seen_news_popups.rb diff --git a/db/migrate/20230912172632_create_has_seen_news_popups.rb b/db/migrate/20230912172632_create_has_seen_news_popups.rb index 7bd2049a7..fd5700adf 100644 --- a/db/migrate/20230912172632_create_has_seen_news_popups.rb +++ b/db/migrate/20230912172632_create_has_seen_news_popups.rb @@ -3,8 +3,8 @@ def change create_table :has_seen_news_popups do |t| t.references :user, null: false, foreign_key: true t.references :news_popup, null: false, foreign_key: true + + t.timestamps end - - add_index :has_seen_news_popups, [:user, :news_popup], unique: true end end diff --git a/db/migrate/20230912193144_add_index_to_has_seen_news_popups.rb b/db/migrate/20230912193144_add_index_to_has_seen_news_popups.rb new file mode 100644 index 000000000..aba977b72 --- /dev/null +++ b/db/migrate/20230912193144_add_index_to_has_seen_news_popups.rb @@ -0,0 +1,5 @@ +class AddIndexToHasSeenNewsPopups < ActiveRecord::Migration[7.0] + def change + add_index :has_seen_news_popups, [:user_id, :news_popup_id], unique: true + end +end diff --git a/db/schema.rb b/db/schema.rb index ef19e7e47..9b9562c17 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_09_12_172632) do +ActiveRecord::Schema[7.0].define(version: 2023_09_12_193144) do # These are extensions that must be enabled in order to support this database enable_extension "pgcrypto" enable_extension "plpgsql" @@ -204,7 +204,10 @@ create_table "has_seen_news_popups", force: :cascade do |t| t.bigint "user_id", null: false t.bigint "news_popup_id", null: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false t.index ["news_popup_id"], name: "index_has_seen_news_popups_on_news_popup_id" + t.index ["user_id", "news_popup_id"], name: "index_has_seen_news_popups_on_user_id_and_news_popup_id", unique: true t.index ["user_id"], name: "index_has_seen_news_popups_on_user_id" end From e5e7d337034ffcd01b620e54995daeaacff6c6ce Mon Sep 17 00:00:00 2001 From: Splines Date: Tue, 12 Sep 2023 21:43:40 +0200 Subject: [PATCH 04/14] Check if route works via first JS code --- app/javascript/packs/application.js | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 5c9da133f..d02b6922d 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -52,4 +52,22 @@ document.addEventListener("turbolinks:load", function () { $('.masonry-grid').masonry({ percentPosition: true }); -}) \ No newline at end of file + + checkForNewsPopups(); +}) + +function checkForNewsPopups() { + $.ajax({ + url: Routes.news_popups_path(), + type: 'GET', + dataType: 'json', + success: (data) => { + console.log(data); + }, + error: (xhr, status) => { + console.log('ERROR fetching news popups'); + console.log(xhr); + console.log(status); + } + }) +} \ No newline at end of file From 4b696891800b14e05acb7d5edc9889efa48b5b33 Mon Sep 17 00:00:00 2001 From: Splines Date: Tue, 12 Sep 2023 21:59:04 +0200 Subject: [PATCH 05/14] Get rid of null id field in JSON output Also reordered the fields to be prettier. --- app/controllers/news_popups_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/news_popups_controller.rb b/app/controllers/news_popups_controller.rb index b8ab2e5a7..b24f1903b 100644 --- a/app/controllers/news_popups_controller.rb +++ b/app/controllers/news_popups_controller.rb @@ -1,7 +1,7 @@ class NewsPopupsController < ApplicationController def index respond_to do |format| - format.json { render json: unseen_news_popups } + format.json { render json: unseen_news_popups.to_json(except: :id) } end end @@ -11,7 +11,7 @@ def unseen_news_popups HasSeenNewsPopup .where(user: current_user) .left_outer_joins(:news_popup) - .select('news_popups.active', 'news_popups.name') + .select('news_popups.name', 'news_popups.active') .where(news_popups: { active: true }) end end From d88d3c5e89dfc30ed9d8a1320ee3528ff2cb78da Mon Sep 17 00:00:00 2001 From: Splines Date: Tue, 12 Sep 2023 22:03:43 +0200 Subject: [PATCH 06/14] Change object to JSON array --- app/controllers/news_popups_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/news_popups_controller.rb b/app/controllers/news_popups_controller.rb index b24f1903b..b00ffcb62 100644 --- a/app/controllers/news_popups_controller.rb +++ b/app/controllers/news_popups_controller.rb @@ -1,7 +1,7 @@ class NewsPopupsController < ApplicationController def index respond_to do |format| - format.json { render json: unseen_news_popups.to_json(except: :id) } + format.json { render json: unseen_news_popups.pluck(:name) } end end From 802cd3d12505ad4baab23f747f799fef6c09feaf Mon Sep 17 00:00:00 2001 From: Splines Date: Tue, 12 Sep 2023 22:51:06 +0200 Subject: [PATCH 07/14] Read popup HTML content based on popup name --- app/javascript/packs/application.js | 32 ++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index d02b6922d..0936e2964 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -54,20 +54,42 @@ document.addEventListener("turbolinks:load", function () { }); checkForNewsPopups(); -}) +}); + +const NEWS_POPUPS_BASE_PATH = '/news_popups/'; function checkForNewsPopups() { - $.ajax({ + $.get({ url: Routes.news_popups_path(), type: 'GET', dataType: 'json', - success: (data) => { - console.log(data); + success: (popupNames) => { + console.log(`Found unread news popups: ${popupNames}`); + openNewsPopups(popupNames); }, error: (xhr, status) => { console.log('ERROR fetching news popups'); console.log(xhr); console.log(status); } - }) + }); +} + +function openNewsPopups(popupNames) { + for (const popupName of popupNames) { + console.log(`Opening news popup: ${popupName}`) + $.ajax({ + url: NEWS_POPUPS_BASE_PATH + popupName + '.html', + type: 'GET', + dataType: 'html', + success: (html, textStatus, xhr) => { + console.log(`News popup (${popupName}): ${html}`); + }, + error: (xhr, status) => { + console.log(`ERROR getting HTML for news popup: ${popupName}`); + console.log(xhr); + console.log(status); + } + }) + } } \ No newline at end of file From b17f29e307ef00f3eb05c858e0f81045e8f47c8b Mon Sep 17 00:00:00 2001 From: Splines Date: Wed, 13 Sep 2023 00:10:18 +0200 Subject: [PATCH 08/14] Fetch and embed popup HTML as modal --- app/javascript/packs/application.js | 81 +++++++++++++++++++++++++---- public/news_popups/_container.html | 24 +++++++++ 2 files changed, 94 insertions(+), 11 deletions(-) create mode 100644 public/news_popups/_container.html diff --git a/app/javascript/packs/application.js b/app/javascript/packs/application.js index 0936e2964..62b9139a0 100644 --- a/app/javascript/packs/application.js +++ b/app/javascript/packs/application.js @@ -53,12 +53,14 @@ document.addEventListener("turbolinks:load", function () { percentPosition: true }); - checkForNewsPopups(); + // TODO (Splines): outsource news popups logic to separate file + handleNewsPopups(); }); const NEWS_POPUPS_BASE_PATH = '/news_popups/'; +const NEWS_POPUPS_CONTAINER_PATH = '/news_popups/_container.html'; -function checkForNewsPopups() { +function handleNewsPopups() { $.get({ url: Routes.news_popups_path(), type: 'GET', @@ -75,21 +77,78 @@ function checkForNewsPopups() { }); } -function openNewsPopups(popupNames) { - for (const popupName of popupNames) { - console.log(`Opening news popup: ${popupName}`) +async function openNewsPopups(popupNames) { + // Are there any unread news popups? + if (popupNames.length === 0) { + console.log('No unread news popups found. Aborting.'); + return; + } + + // Container + let containerHtml = ""; + try { + containerHtml = await fetchNewsPopupsContainerHtml(); + } catch (error) { + console.log('Container for news popups could not be fetched. Aborting.'); + console.log(error); + return; + } + + // Contents + const contentsHtml = await fetchNewsPopupsContentHtml(popupNames); + if (contentsHtml.length === 0) { + console.log('No news popups content could be fetched. Aborting.'); + return; + } + + showNewsPopupsInDom(containerHtml, contentsHtml); +} + +async function fetchNewsPopupsContainerHtml() { + return new Promise((resolve, reject) => { $.ajax({ - url: NEWS_POPUPS_BASE_PATH + popupName + '.html', + url: NEWS_POPUPS_CONTAINER_PATH, type: 'GET', dataType: 'html', success: (html, textStatus, xhr) => { - console.log(`News popup (${popupName}): ${html}`); + resolve(html); }, error: (xhr, status) => { - console.log(`ERROR getting HTML for news popup: ${popupName}`); console.log(xhr); console.log(status); + reject('ERROR getting HTML for news popups container'); } - }) - } -} \ No newline at end of file + }); + }); +} + +async function fetchNewsPopupsContentHtml(popupNames) { + return await Promise.all(popupNames.map(async (popupName) => { + return new Promise((resolve, reject) => { + $.ajax({ + url: NEWS_POPUPS_BASE_PATH + popupName + '.html', + type: 'GET', + dataType: 'html', + success: (html, textStatus, xhr) => { + resolve(html); + }, + error: (xhr, status) => { + // Note that this this not occur if the file does not exist. + // In that case, the success callback is called since MaMpf + // is redirecting and we get back the HTML of the redirect. + // This is why admins must check if the file exists before + // activating the news popup. + const errorReason = `ERROR getting HTML for news popup: ${popupName} `; + reject(errorReason); + } + }); + }); + })); +} + +function showNewsPopupsInDom(containerHtml, contentsHtml) { + const container = $(containerHtml); + $('#news-popup-body', container).append(contentsHtml); + $('body').append(container); + $('#news-popup-modal').modal('show'); +} diff --git a/public/news_popups/_container.html b/public/news_popups/_container.html new file mode 100644 index 000000000..eb92f3160 --- /dev/null +++ b/public/news_popups/_container.html @@ -0,0 +1,24 @@ + \ No newline at end of file From 5bba776d8804c3509cd07ffc647486a01e568fd9 Mon Sep 17 00:00:00 2001 From: Splines Date: Wed, 13 Sep 2023 02:00:42 +0200 Subject: [PATCH 09/14] Add basic view of news popups to admin --- app/assets/stylesheets/admin.scss | 5 + app/controllers/announcements_controller.rb | 1 + app/views/announcements/index.html.erb | 144 +++++++++++++------- 3 files changed, 101 insertions(+), 49 deletions(-) diff --git a/app/assets/stylesheets/admin.scss b/app/assets/stylesheets/admin.scss index f0089aab4..39dc953af 100644 --- a/app/assets/stylesheets/admin.scss +++ b/app/assets/stylesheets/admin.scss @@ -1,4 +1,9 @@ .admin-background { background-size: 20px 20px; background-image: radial-gradient(circle, #bebebe 1px, #ffffff00 1px); +} + + +#admin-news { + max-width: 1400px; } \ No newline at end of file diff --git a/app/controllers/announcements_controller.rb b/app/controllers/announcements_controller.rb index ba3492fff..c3544ccbc 100644 --- a/app/controllers/announcements_controller.rb +++ b/app/controllers/announcements_controller.rb @@ -14,6 +14,7 @@ def index .order(:created_at) .reverse) .page(params[:page]).per(10) + @news_popups = NewsPopup.all end def new diff --git a/app/views/announcements/index.html.erb b/app/views/announcements/index.html.erb index 4d8a772d7..2ae74677b 100644 --- a/app/views/announcements/index.html.erb +++ b/app/views/announcements/index.html.erb @@ -1,55 +1,101 @@ -
-
-

- <%= t('basics.news') %> -

+
+ + <%# News popups %> +
+
+

+ News Popups +

+
-
- <%= paginate @announcements, window: 2 %> + +
+
+ + + + + + + + + + + <% @news_popups.each do |popup| %> + + + + + + + <% end %> + +
Created atUpdated atNameActive
<%= popup.created_at %><%= popup.updated_at %><%= link_to popup.name, + '/news_popups/' + popup.name + '.html', + target: :_blank %> + +
+ <% is_checked = popup.active ? 'checked' : '' %> + > +
+
+
-
- <%= link_to t('buttons.create_announcement'), - new_announcement_path, - class: 'btn btn-sm btn-secondary', - remote: true %> + + <%# News %> +
+
+

+ <%= t('basics.news') %> +

+
+
+ <%= paginate @announcements, window: 2 %> +
+
+ <%= link_to t('buttons.create_announcement'), + new_announcement_path, + class: 'btn btn-sm btn-secondary', + remote: true %> +
-
-
-
- - <%= t('basics.date') %> - -
-
- - <%= t('basics.author') %> - -
-
- - <%= t('basics.text') %> - +
+
+ + <%= t('basics.date') %> + +
+
+ + <%= t('basics.author') %> + +
+
+ + <%= t('basics.text') %> + +
+
+ + <%= t('admin.announcement.main_page') %> + +
+
+ + <%= t('basics.action') %> + +
-
- - <%= t('admin.announcement.main_page') %> - + -
- - <%= t('basics.action') %> - -
-
- -<% @announcements.each do |a| %> -
- <%= render partial: 'announcements/row', - locals: { announcement: a }%> -
-<% end %> -<%= render partial: 'announcements/modal' %> \ No newline at end of file From 69f4159eabe8e1eb58a5157382cd261c596c7081 Mon Sep 17 00:00:00 2001 From: Splines Date: Wed, 13 Sep 2023 02:16:30 +0200 Subject: [PATCH 10/14] Improve admin table --- app/views/announcements/index.html.erb | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/app/views/announcements/index.html.erb b/app/views/announcements/index.html.erb index 2ae74677b..f2a9948b3 100644 --- a/app/views/announcements/index.html.erb +++ b/app/views/announcements/index.html.erb @@ -11,12 +11,14 @@
- +
+ @@ -25,14 +27,21 @@ - + From d510971ee805cc3b366f0f56919c570f0f0db193 Mon Sep 17 00:00:00 2001 From: Splines Date: Wed, 13 Sep 2023 02:35:20 +0200 Subject: [PATCH 11/14] Fix query for unseen news popups --- app/controllers/news_popups_controller.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/controllers/news_popups_controller.rb b/app/controllers/news_popups_controller.rb index b00ffcb62..c09508fd2 100644 --- a/app/controllers/news_popups_controller.rb +++ b/app/controllers/news_popups_controller.rb @@ -8,10 +8,10 @@ def index private def unseen_news_popups - HasSeenNewsPopup - .where(user: current_user) - .left_outer_joins(:news_popup) - .select('news_popups.name', 'news_popups.active') - .where(news_popups: { active: true }) + NewsPopup + .where(active: true) + .where.not(id: HasSeenNewsPopup + .where(user: current_user) + .pluck(:news_popup_id)) end end From dc55ceaaa14bba4495324fbd8c44a09219f6810f Mon Sep 17 00:00:00 2001 From: Splines Date: Wed, 20 Sep 2023 12:01:37 +0200 Subject: [PATCH 12/14] Add logs to admin table --- app/assets/javascripts/news_popups.js | 29 +++++++++++++++++++++++++ app/assets/stylesheets/news_popups.scss | 3 +++ app/views/announcements/index.html.erb | 14 +++++++----- 3 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 app/assets/javascripts/news_popups.js create mode 100644 app/assets/stylesheets/news_popups.scss diff --git a/app/assets/javascripts/news_popups.js b/app/assets/javascripts/news_popups.js new file mode 100644 index 000000000..8adb207c7 --- /dev/null +++ b/app/assets/javascripts/news_popups.js @@ -0,0 +1,29 @@ +console.log('loaded'); + +// + + +$(document).on('turbolinks:load', () => { + registerNewsPopupsAdminTableHandlers(); +}); + +function registerNewsPopupsAdminTableHandlers() { + $('.news-popups-name').on('click', (e) => { + // If has input, do nothing + if ($(e.target).find('input').length > 0) { + return; + } + + const rowId = $(e.target).parent().attr('id').split('-').pop(); + console.log('rowId: ' + rowId); + + const text = $(e.target).text().trim(); + const inputHtml = ``; + $(e.target).html(inputHtml); + + $('.news-popups-name-current').focus(); + }); + + + console.log('admin table registered'); +} \ No newline at end of file diff --git a/app/assets/stylesheets/news_popups.scss b/app/assets/stylesheets/news_popups.scss new file mode 100644 index 000000000..da32d9c21 --- /dev/null +++ b/app/assets/stylesheets/news_popups.scss @@ -0,0 +1,3 @@ +#news-popups-table { + #news-popups-table-name {} +} \ No newline at end of file diff --git a/app/views/announcements/index.html.erb b/app/views/announcements/index.html.erb index f2a9948b3..f239613fc 100644 --- a/app/views/announcements/index.html.erb +++ b/app/views/announcements/index.html.erb @@ -1,3 +1,6 @@ +<%= javascript_include_tag :news_popups %> +<%= stylesheet_link_tag :news_popups %> +
<%# News popups %> @@ -11,7 +14,8 @@
-
Created at Updated at Name Active
<%= popup.created_at %> <%= popup.updated_at %><%= link_to popup.name, - '/news_popups/' + popup.name + '.html', - target: :_blank %> + + + <%= link_to 'Test', + '/news_popups/' + popup.name + '.html', + target: :_blank, + role: 'button', + class: 'btn btn-primary' %> +
<% is_checked = popup.active ? 'checked' : '' %> - > + >
@@ -22,13 +26,13 @@ - + <% @news_popups.each do |popup| %> - + -
Active
<%= popup.created_at %> <%= popup.updated_at %> - + + <%= popup.name %> <%= link_to 'Test', From bcb4273b2ff4c915bbdb2bbcbe3a1623993e85ff Mon Sep 17 00:00:00 2001 From: Splines Date: Wed, 20 Sep 2023 14:41:33 +0200 Subject: [PATCH 13/14] Add editing capabilities to news popups admin table --- app/assets/stylesheets/news_popups.scss | 8 ++- app/controllers/news_popups_controller.rb | 18 ++++++ app/views/announcements/index.html.erb | 73 ++++++++--------------- app/views/news_popups/_form.html.erb | 40 +++++++++++++ app/views/news_popups/_row.html.erb | 36 +++++++++++ app/views/news_popups/cancel_edit.js.erb | 3 + app/views/news_popups/edit.js.erb | 3 + app/views/news_popups/update.js.erb | 3 + config/locales/de.yml | 3 + config/locales/en.yml | 3 + config/routes.rb | 2 +- 11 files changed, 142 insertions(+), 50 deletions(-) create mode 100644 app/views/news_popups/_form.html.erb create mode 100644 app/views/news_popups/_row.html.erb create mode 100644 app/views/news_popups/cancel_edit.js.erb create mode 100644 app/views/news_popups/edit.js.erb create mode 100644 app/views/news_popups/update.js.erb diff --git a/app/assets/stylesheets/news_popups.scss b/app/assets/stylesheets/news_popups.scss index da32d9c21..5a88138bf 100644 --- a/app/assets/stylesheets/news_popups.scss +++ b/app/assets/stylesheets/news_popups.scss @@ -1,3 +1,7 @@ -#news-popups-table { - #news-popups-table-name {} +#news-popups-list-header { + font-weight: bold; +} + +#news-popups-list-header { + word-wrap: break-word; } \ No newline at end of file diff --git a/app/controllers/news_popups_controller.rb b/app/controllers/news_popups_controller.rb index c09508fd2..a2907c4d7 100644 --- a/app/controllers/news_popups_controller.rb +++ b/app/controllers/news_popups_controller.rb @@ -1,10 +1,20 @@ class NewsPopupsController < ApplicationController + before_action :set_news_popup, only: [:edit, :cancel_edit, :update] + def index respond_to do |format| format.json { render json: unseen_news_popups.pluck(:name) } end end + def edit; end + + def cancel_edit; end + + def update + @news_popup.update(news_popup_params) + end + private def unseen_news_popups @@ -14,4 +24,12 @@ def unseen_news_popups .where(user: current_user) .pluck(:news_popup_id)) end + + def set_news_popup + @news_popup = NewsPopup.find_by(id: params[:id]) + end + + def news_popup_params + params.require(:news_popup).permit(:name, :active) + end end diff --git a/app/views/announcements/index.html.erb b/app/views/announcements/index.html.erb index f239613fc..f69f0e7e4 100644 --- a/app/views/announcements/index.html.erb +++ b/app/views/announcements/index.html.erb @@ -4,54 +4,33 @@
<%# News popups %> -
-
-

- News Popups -

-
-
+
+

News Popups

-
-
- - - - - - - - - - - - <% @news_popups.each do |popup| %> - - - - - - - - <% end %> - -
Created atUpdated atNameActive
<%= popup.created_at %><%= popup.updated_at %> - <%= popup.name %> - - <%= link_to 'Test', - '/news_popups/' + popup.name + '.html', - target: :_blank, - role: 'button', - class: 'btn btn-primary' %> - -
- <% is_checked = popup.active ? 'checked' : '' %> - > -
-
+
+
+
+
+ <%= t('basics.created_at') %> +
+
+ <%= t('basics.updated_at') %> +
+
+ <%= t('basics.name') %> +
+
+ <%= t('basics.active') %> +
+
+ <%= t('basics.action') %> +
+
+
+ <% @news_popups.each do |news_popup| %> + <%= render partial: 'news_popups/row', + locals: { popup: news_popup} %> + <% end %>
diff --git a/app/views/news_popups/_form.html.erb b/app/views/news_popups/_form.html.erb new file mode 100644 index 000000000..f9c9dcc49 --- /dev/null +++ b/app/views/news_popups/_form.html.erb @@ -0,0 +1,40 @@ +
+ <%= form_with model: popup do |f| %> +
+
+ <%= popup.created_at %> +
+
+ <%= popup.updated_at %> +
+
+ <%= f.text_field :name, class: 'form-control' %> +
+
+ <%= link_to 'Test', + '/news_popups/' + popup.name + '.html', + target: :_blank, + role: 'button', + class: 'btn btn-primary' %> +
+
+ <%= f.check_box :active, checked: popup.active, + class: "form-check-input" %> +
+ + <%# Actions %> +
+ <%= f.button nil, class: "btn btn-success p-1" do %> + + <% end %> + <%= link_to cancel_editing_news_popups_path(popup), + class: 'btn btn-secondary p-1', + role: 'button', + title: t('buttons.edit'), + remote: true do %> + + <% end %> +
+
+ <% end %> +
diff --git a/app/views/news_popups/_row.html.erb b/app/views/news_popups/_row.html.erb new file mode 100644 index 000000000..306a813c0 --- /dev/null +++ b/app/views/news_popups/_row.html.erb @@ -0,0 +1,36 @@ +
+
+
+ <%= popup.created_at %> +
+
+ <%= popup.updated_at %> +
+
+ <%= popup.name %> +
+
+ <%= link_to 'Test', + '/news_popups/' + popup.name + '.html', + target: :_blank, + role: 'button', + class: 'btn btn-primary' %> +
+
+ <% is_checked = popup.active ? 'checked' : '' %> + disabled> +
+ + <%# Actions %> +
+ <%= link_to edit_news_popup_path(popup), + class: 'btn text-dark', + role: 'button', + title: t('buttons.edit'), + remote: true do %> + + <% end %> +
+
+
diff --git a/app/views/news_popups/cancel_edit.js.erb b/app/views/news_popups/cancel_edit.js.erb new file mode 100644 index 000000000..1a44237c3 --- /dev/null +++ b/app/views/news_popups/cancel_edit.js.erb @@ -0,0 +1,3 @@ +$('.news-popup-row[data-id="<%= @news_popup.id %>"') + .replaceWith(`<%= j render partial: "news_popups/row", + locals: { popup: @news_popup } %>`); diff --git a/app/views/news_popups/edit.js.erb b/app/views/news_popups/edit.js.erb new file mode 100644 index 000000000..acf9bbbd5 --- /dev/null +++ b/app/views/news_popups/edit.js.erb @@ -0,0 +1,3 @@ +$('.news-popup-row[data-id="<%= @news_popup.id %>"') + .replaceWith(`<%= j render partial: "news_popups/form", + locals: { popup: @news_popup } %>`); diff --git a/app/views/news_popups/update.js.erb b/app/views/news_popups/update.js.erb new file mode 100644 index 000000000..1a44237c3 --- /dev/null +++ b/app/views/news_popups/update.js.erb @@ -0,0 +1,3 @@ +$('.news-popup-row[data-id="<%= @news_popup.id %>"') + .replaceWith(`<%= j render partial: "news_popups/row", + locals: { popup: @news_popup } %>`); diff --git a/config/locales/de.yml b/config/locales/de.yml index 5e3425d65..189b6fa0b 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -3180,6 +3180,9 @@ de: basics: 'Basisdaten' action: 'Aktion' actions: 'Aktionen' + active: 'Aktiv' + created_at: 'Erstellt am' + updated_at: 'Zuletzt geƤndert am' search: 'Suche' post_processing: 'Stelle fertig...' mampf_package: 'MaMpf-Paket' diff --git a/config/locales/en.yml b/config/locales/en.yml index 836f25839..85a4150ce 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -2998,6 +2998,9 @@ en: basics: 'Basics' action: 'Action' actions: 'Actions' + active: 'Active' + created_at: 'Created at' + updated_at: 'Updated at' post_processing: 'Post process...' search: 'Search' mampf_package: 'MaMpf package' diff --git a/config/routes.rb b/config/routes.rb index f8eed0710..9fdee1e7e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -845,7 +845,7 @@ as: 'fill_realizations_select' # News popups routes - resources :news_popups, only: [:index] + only: [:index, :new, :edit, :create, :update, :destroy] # main routes From a2728f6692d626bf23aef5f833a37b357b086544 Mon Sep 17 00:00:00 2001 From: Splines Date: Wed, 20 Sep 2023 16:28:21 +0200 Subject: [PATCH 14/14] Fix missing routes --- config/routes.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index 9fdee1e7e..bf0978742 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -845,7 +845,11 @@ as: 'fill_realizations_select' # News popups routes - only: [:index, :new, :edit, :create, :update, :destroy] + resources :news_popups, only: [:index, :edit, :update] + + get 'news_popups/:id/cancel_edit', + to: 'news_popups#cancel_edit', + as: 'cancel_editing_news_popups' # main routes