discourse/plugins/discourse-local-dates/plugin.rb
Kris 2d111e2a9a
UX: show all preinstalled plugins and label them as such (#33681)
Instead of listing the redundant commit hash, this now shows
"preinstalled" for the relevant components and links to
https://meta.discourse.org/t/bundling-more-popular-plugins-with-discourse-core/373574.
This is accomplished by checking the URL of the plugin for
`"/discourse/discourse/tree/main/plugins/"` which indicates it's part of
the core Discourse repo.

I've also removed the `hide_plugin` flag from existing preinstalled
plugins. Now Discourse admins will have more clarity into what's
included.

I also made some minor layout adjustments: 
* Larger click area for "how to install a plugin" banner
* Moved "Learn more" into a separate line for consistent positioning

Before:
<img width="2182" height="1192" alt="image"
src="https://github.com/user-attachments/assets/b2943a7f-5212-4abd-8b80-d0d071378f06"
/>


After:
<img width="2226" height="1184" alt="image"
src="https://github.com/user-attachments/assets/0846a2c9-fc1b-435c-b51f-b966af5ade09"
/>
2025-07-17 15:11:52 -04:00

70 lines
2.1 KiB
Ruby

# frozen_string_literal: true
# name: discourse-local-dates
# about: Display a date in your local timezone
# version: 0.1
# author: Joffrey Jaffeux
register_asset "stylesheets/common/discourse-local-dates.scss"
register_asset "moment.js", :vendored_core_pretty_text
register_asset "moment-timezone.js", :vendored_core_pretty_text
enabled_site_setting :discourse_local_dates_enabled
after_initialize do
module ::DiscourseLocalDates
PLUGIN_NAME = "discourse-local-dates".freeze
POST_CUSTOM_FIELD = "local_dates".freeze
end
require_relative "lib/discourse_local_dates/engine"
register_post_custom_field_type(DiscourseLocalDates::POST_CUSTOM_FIELD, :json)
on(:before_post_process_cooked) do |doc, post|
dates = []
doc
.css("span.discourse-local-date")
.map do |cooked_date|
next if cooked_date.ancestors("aside").length > 0
date = {}
cooked_date.attributes.values.each do |attribute|
data_name = attribute.name&.gsub("data-", "")
if data_name && %w[date time timezone recurring].include?(data_name)
unless attribute.value == "undefined"
date[data_name] = CGI.escapeHTML(attribute.value || "")
end
end
end
dates << date
end
if dates.present?
post.custom_fields[DiscourseLocalDates::POST_CUSTOM_FIELD] = dates
post.save_custom_fields
elsif !post.custom_fields[DiscourseLocalDates::POST_CUSTOM_FIELD].nil?
post.custom_fields.delete(DiscourseLocalDates::POST_CUSTOM_FIELD)
post.save_custom_fields
end
end
add_to_class(:post, :local_dates) { custom_fields[DiscourseLocalDates::POST_CUSTOM_FIELD] || [] }
on(:reduce_excerpt) do |fragment, post|
fragment
.css(".discourse-local-date")
.each { |container| container.content = "#{container.content} (UTC)" }
end
on(:reduce_cooked) do |fragment|
fragment
.css(".discourse-local-date")
.each do |container|
if container.attributes["data-email-preview"]
preview = container.attributes["data-email-preview"].value
container.content = preview
end
end
end
end