0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-02-03 23:00:14 -05:00

Wired announcement settings admin UI to API (#16692)

refs TryGhost/Team#3094
This commit is contained in:
Elena Baidakova 2023-04-21 12:49:29 +04:00 committed by GitHub
parent a13ac255f3
commit 8e897ffdd4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 99 additions and 140 deletions

View file

@ -7,22 +7,16 @@
<div class="kg-settings-panel-control-input"> <div class="kg-settings-panel-control-input">
<div class="gh-btn-group kg-settings-headerstyle-btn-group"> <div class="gh-btn-group kg-settings-headerstyle-btn-group">
<button class="gh-btn kg-headerstyle-btn-dark gh-btn-group-selected" type="button"></button> {{#each this.options as |settingOption|}}
<button class="gh-btn kg-headerstyle-btn-light" type="button"></button> <button
<button class="gh-btn kg-headerstyle-btn-accent" type="button"></button> class="gh-btn {{settingOption.className}} {{if (eq this.background settingOption.value) "gh-btn-group-selected"}}"
type="button"
title={{settingOption.label}}
{{on "click" (fn this.setBackground settingOption.value)}}
></button>
{{/each}}
</div> </div>
</div> </div>
{{!-- <span class="gh-select">
<select class="ember-select" name="announcement-background" id="announcement-background" {{on "change" this.setBackground}}>
{{#each this.options as |settingOption|}}
<option value={{settingOption.value}} selected={{eq settingOption.value this.background}}>
{{settingOption.label}}
</option>
{{/each}}
</select>
{{svg-jar "arrow-down-small"}}
</span> --}}
</div> </div>
</div> </div>
</div> </div>

View file

@ -11,15 +11,15 @@ export default class AnnouncementSettingsBackgroundComponent extends Component {
get options() { get options() {
return [ return [
{value: 'accent', label: 'Accent'}, {value: 'dark', label: 'Dark', className: 'kg-headerstyle-btn-dark'},
{value: 'dark', label: 'Dark'}, {value: 'light', label: 'Light', className: 'kg-headerstyle-btn-light'},
{value: 'light', label: 'Light'} {value: 'accent', label: 'Accent', className: 'kg-headerstyle-btn-accent'}
]; ];
} }
@action @action
setBackground(event) { setBackground(value) {
this.settings.announcementBackground = event.target.value; this.settings.announcementBackground = value;
this.settings.save(); this.settings.save();
this.args.onChange?.(); this.args.onChange?.();
} }

View file

@ -1,6 +1,6 @@
<div class="gh-stack-item {{if (eq @index 0) "gh-setting-first" "gh-setting"}}"> <div class="gh-stack-item {{if (eq @index 0) "gh-setting-first" "gh-setting"}}">
<div class="flex-grow-1"> <div class="flex-grow-1">
<label class="gh-setting-title gh-theme-setting-title" for="announcement-visibility"> <label class="gh-setting-title gh-theme-setting-title" for="logged-out">
Visibility Visibility
</label> </label>
@ -11,41 +11,55 @@
id="logged-out" id="logged-out"
name="logged-out" name="logged-out"
class="gh-input" class="gh-input"
value={{this.visibilityOptions.visitors}}
checked={{this.isVisitorsChecked}}
{{on "click" this.updateVisibility}}
> >
<span class="input-toggle-component"></span> <span class="input-toggle-component"></span>
<p>Logged out visitors</p> <span>Logged out visitors</span>
</label> </label>
<label class="checkbox" for="free">
<input
type="checkbox"
id="free"
name="free"
class="gh-input"
>
<span class="input-toggle-component"></span>
<p>Free members</p>
</label>
<label class="checkbox" for="paid">
<input
type="checkbox"
id="paid"
name="paid"
class="gh-input"
>
<span class="input-toggle-component"></span>
<p>Paid members</p>
</label>
</div>
{{!-- <span class="gh-select"> {{#if this.isPaidAvailable}}
<select class="ember-select" name="announcement-visibility" id="announcement-visibility" {{on "change" this.setVisibility}}> <label class="checkbox" for="free">
{{#each this.options as |settingOption|}} <input
<option value={{settingOption.value}} selected={{eq settingOption.value this.background}}> type="checkbox"
{{settingOption.label}} id="free"
</option> name="free"
{{/each}} class="gh-input"
</select> value={{this.visibilityOptions.freeMembers}}
{{svg-jar "arrow-down-small"}} checked={{this.isFreeMembersChecked}}
</span> --}} {{on "click" this.updateVisibility}}
>
<span class="input-toggle-component"></span>
<span>Free members</span>
</label>
<label class="checkbox" for="paid">
<input
type="checkbox"
id="paid"
name="paid"
class="gh-input"
value={{this.visibilityOptions.paidMembers}}
checked={{this.isPaidMembersChecked}}
{{on "click" this.updateVisibility}}
>
<span class="input-toggle-component"></span>
<span>Paid members</span>
</label>
{{else}}
<label class="checkbox">
<input
type="checkbox"
name="members"
class="gh-input"
value={{this.visibilityOptions.freeMembers}}
checked={{this.isFreeMembersChecked}}
{{on "click" this.updateVisibility}}
>
<span class="input-toggle-component"></span>
<span>Members</span>
</label>
{{/if}}
</div>
</div> </div>
</div> </div>

View file

@ -4,24 +4,46 @@ import {inject as service} from '@ember/service';
export default class AnnouncementSettingsVisibilityComponent extends Component { export default class AnnouncementSettingsVisibilityComponent extends Component {
@service settings; @service settings;
@service membersUtils;
get visibility() { visibilityOptions = {
freeMembers: 'free_members',
paidMembers: 'paid_members',
visitors: 'visitors'
};
get visibilitySettings() {
return this.settings.announcementVisibility; return this.settings.announcementVisibility;
} }
get options() { get isPaidAvailable() {
return [ return this.membersUtils.isStripeEnabled;
{value: 'public', label: 'Public'}, }
{value: 'visitors', label: 'Visitors'},
{value: 'members', label: 'Members'}, get isFreeMembersChecked() {
{value: 'paid', label: 'Paid'} return this.visibilitySettings.includes(this.visibilityOptions.freeMembers);
]; }
get isPaidMembersChecked() {
return this.visibilitySettings.includes(this.visibilityOptions.paidMembers);
}
get isVisitorsChecked() {
return this.visibilitySettings.includes(this.visibilityOptions.visitors);
} }
@action @action
setVisibility(event) { updateVisibility(event) {
this.settings.announcementVisibility = event.target.value; let updatedVisibilityOptions = [...this.visibilitySettings];
const value = event.target.value;
if (event.target.checked) {
updatedVisibilityOptions.push(value);
} else {
updatedVisibilityOptions = updatedVisibilityOptions.filter(item => item !== value);
}
this.settings.announcementVisibility = updatedVisibilityOptions;
this.settings.save(); this.settings.save();
this.args.onChange?.();
} }
} }

View file

@ -8,9 +8,9 @@
<div class="gh-nav-list gh-nav-main"> <div class="gh-nav-list gh-nav-main">
<div class="gh-nav-design-settings"> <div class="gh-nav-design-settings">
<form> <form>
<AnnouncementSettings::Content @onChange={{@updatePreview}} /> <AnnouncementSettings::Content @onChange={{this.updatePreview}} />
<AnnouncementSettings::Background @onChange={{@updatePreview}} /> <AnnouncementSettings::Background @onChange={{this.updatePreview}} />
<AnnouncementSettings::Visibility @onChange={{@updatePreview}} /> <AnnouncementSettings::Visibility @onChange={{this.updatePreview}} />
</form> </form>
</div> </div>
</div> </div>

View file

@ -1,86 +1,15 @@
import Component from '@glimmer/component'; import Component from '@glimmer/component';
import {action} from '@ember/object'; import {action} from '@ember/object';
import {bind} from '@ember/runloop';
import {inject} from 'ghost-admin/decorators/inject'; import {inject} from 'ghost-admin/decorators/inject';
import {isEmpty} from '@ember/utils';
import {inject as service} from '@ember/service'; import {inject as service} from '@ember/service';
import {tracked} from '@glimmer/tracking';
export default class AnnouncementBarMenuComponent extends Component { export default class AnnouncementBarMenuComponent extends Component {
@service customThemeSettings;
@service router;
@service settings;
@service store;
@service themeManagement; @service themeManagement;
@inject config; @inject config;
@tracked openSection = null;
themes = this.store.peekAll('theme');
constructor() {
super(...arguments);
// fetch all themes in the background so we can show the active theme
this.store.findAll('theme');
if (this.router.currentRouteName === 'settings.announcement-bar.index') {
this.openDefaultSection();
}
this.routeDidChangeHandler = bind(this, this.handleRouteDidChange);
this.router.on('routeDidChange', this.routeDidChangeHandler);
}
willDestroy() {
super.willDestroy(...arguments);
this.router.off('routeDidChange', this.routeDidChangeHandler);
}
get activeTheme() {
return this.themes.findBy('active', true);
}
@action @action
toggleSection(section) { updatePreview() {
if (this.openSection === section) { this.themeManagement.updatePreviewHtmlTask.perform();
this.openSection = null;
} else {
this.openSection = section;
const group = this.customThemeSettings.KNOWN_GROUPS.findBy('key', section);
if (group && group.previewType) {
this.themeManagement.setPreviewType(group.previewType);
} else {
this.themeManagement.setPreviewType('homepage');
}
}
}
@action
transitionBackToIndex() {
if (this.router.currentRouteName !== 'settings.announcement-bar.index') {
this.router.transitionTo('settings.announcement-bar.index');
}
}
@action
closeAllSections() {
this.openSection = null;
}
openDefaultSection() {
const noCustomSettings = isEmpty(this.customThemeSettings.settings);
if (noCustomSettings) {
this.openSection = 'brand';
}
}
handleRouteDidChange(transition) {
if (!transition.isAborted && transition.to?.name === 'settings.announcement-bar.index') {
this.openDefaultSection();
}
} }
} }

View file

@ -52,7 +52,7 @@ export default Model.extend(ValidationEngine, {
sharedViews: attr('string'), sharedViews: attr('string'),
announcementContent: attr('string'), announcementContent: attr('string'),
announcementBackground: attr('string'), announcementBackground: attr('string'),
announcementVisibility: attr('string'), announcementVisibility: attr('json-string'),
/** /**
* Analytics settings * Analytics settings
*/ */