FEATURE: optionally show "Powered by Discourse" link to discourse.org (#26162)

This commit is contained in:
Kris 2024-03-14 10:30:12 -04:00 committed by GitHub
parent 83495f656d
commit 9376a2e755
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 137 additions and 0 deletions

View File

@ -0,0 +1,15 @@
import icon from "discourse-common/helpers/d-icon";
import i18n from "discourse-common/helpers/i18n";
const PoweredByDiscourse = <template>
<a class="powered-by-discourse" href="https://discourse.org">
<span class="powered-by-discourse__content">
<span class="powered-by-discourse__logo">
{{icon "fab-discourse"}}
</span>
<span>{{i18n "powered_by_discourse"}}</span>
</span>
</a>
</template>;
export default PoweredByDiscourse;

View File

@ -59,6 +59,11 @@ export default Controller.extend({
return this.capabilities.isAppWebview || this.capabilities.isiOSPWA; return this.capabilities.isAppWebview || this.capabilities.isiOSPWA;
}, },
@discourseComputed
showPoweredBy() {
return this.showFooter && this.siteSettings.enable_powered_by_discourse;
},
_mainOutletAnimate() { _mainOutletAnimate() {
document.body.classList.remove("sidebar-animate"); document.body.classList.remove("sidebar-animate");
}, },

View File

@ -87,6 +87,10 @@
</div> </div>
<PluginOutlet @name="after-main-outlet" /> <PluginOutlet @name="after-main-outlet" />
{{#if this.showPoweredBy}}
<PoweredByDiscourse />
{{/if}}
</div> </div>
<PluginOutlet <PluginOutlet

View File

@ -28,6 +28,7 @@
@import "navs"; @import "navs";
@import "offline-indicator"; @import "offline-indicator";
@import "pick-files-button"; @import "pick-files-button";
@import "powered-by-discourse";
@import "relative-time-picker"; @import "relative-time-picker";
@import "add-pm-participants"; @import "add-pm-participants";
@import "download-calendar"; @import "download-calendar";

View File

@ -0,0 +1,73 @@
.powered-by-discourse {
.admin-area &,
.has-full-page-chat &,
.static-login &,
.invite-page & {
display: none !important;
}
grid-area: below-content;
justify-self: start;
font-size: var(--font-down-1);
letter-spacing: 0.2px; // extra spacing makes small text easier to read
padding: 2px; // animated hover "border" width
background: var(--secondary);
border-radius: 0.75em;
transition: all 0.25s ease-in-out;
margin-bottom: 0.45em;
color: var(--primary-medium);
&:visited {
color: var(--primary-medium);
}
&__content {
display: inline-flex;
align-items: center;
gap: 0.5em;
color: currentColor;
background: var(--secondary);
border-radius: 0.62em;
padding: 0.25em 0.65em 0.25em 0.5em;
}
.d-icon {
position: relative;
top: 0.05em; // vertical alignment
}
.discourse-no-touch & {
&:hover {
color: var(--primary-high);
@media (prefers-reduced-motion: no-preference) {
// secondary repeat is an intentional buffer
background: linear-gradient(
45deg,
var(--secondary),
var(--secondary),
var(--secondary),
var(--secondary),
var(--secondary),
#d0232b,
#f15d22,
#fff9ae,
#00a94f,
#00aeef
);
background-size: 300%;
animation: d-rainbow-shimmer 0.5s;
animation-fill-mode: forwards;
animation-timing-function: ease-in-out;
animation-delay: 0.15s; // avoid animating on passing hover
}
}
@keyframes d-rainbow-shimmer {
0% {
background-position: 0% 50%;
}
100% {
background-position: 100% 50%;
}
}
}
}

View File

@ -4802,6 +4802,7 @@ en:
copy: "Copy..." copy: "Copy..."
paste: "Paste..." paste: "Paste..."
save: "Save as..." save: "Save as..."
powered_by_discourse: "Powered by Discourse"
# This section is exported to the javascript for i18n in the admin section # This section is exported to the javascript for i18n in the admin section
admin_js: admin_js:

View File

@ -2332,6 +2332,8 @@ en:
share_anonymized_statistics: "Enable sharing of anonymized usage statistics with CDCK, Inc. (“Discourse”). When this setting is enabled, data concerning the usage of the site is collected and shared in anonymized form, ensuring no personal information is disclosed." share_anonymized_statistics: "Enable sharing of anonymized usage statistics with CDCK, Inc. (“Discourse”). When this setting is enabled, data concerning the usage of the site is collected and shared in anonymized form, ensuring no personal information is disclosed."
enable_powered_by_discourse: "Show “Powered by Discourse” link to discourse.org at the bottom of most pages."
auto_handle_queued_age: "Automatically handle records that are waiting to be reviewed after this many days. Flags will be ignored. Queued posts and users will be rejected. Set to 0 to disable this feature." auto_handle_queued_age: "Automatically handle records that are waiting to be reviewed after this many days. Flags will be ignored. Queued posts and users will be rejected. Set to 0 to disable this feature."
penalty_step_hours: "Default penalties for silencing or suspending users in hours. First offense defaults to the first value, second offense defaults to the second value, etc." penalty_step_hours: "Default penalties for silencing or suspending users in hours. First offense defaults to the first value, second offense defaults to the second value, etc."
penalty_include_post_message: "Automatically include offending post message in email message template when silencing or suspending a user" penalty_include_post_message: "Automatically include offending post message in email message template when silencing or suspending a user"

View File

@ -2818,6 +2818,10 @@ uncategorized:
share_anonymized_statistics: true share_anonymized_statistics: true
enable_powered_by_discourse:
default: false
client: true
auto_handle_queued_age: auto_handle_queued_age:
default: 60 default: 60
min: 0 min: 0

View File

@ -0,0 +1,32 @@
# frozen_string_literal: true
describe "Powered by Discourse", type: :system do
it "appears when enabled" do
SiteSetting.enable_powered_by_discourse = true
visit "/"
expect(page).to have_css(".powered-by-discourse")
end
it "does not appear on admin routes when enabled" do
SiteSetting.enable_powered_by_discourse = true
visit "/admin"
expect(page).not_to have_css(".powered-by-discourse")
end
it "does not appear on login required route when enabled" do
SiteSetting.enable_powered_by_discourse = true
SiteSetting.login_required = true
visit "/"
expect(page).not_to have_css(".powered-by-discourse")
end
it "does not appear when disabled" do
SiteSetting.enable_powered_by_discourse = false
visit "/"
expect(page).not_to have_css(".powered-by-discourse")
end
end