Ghost/ghost/admin/app/templates/components/gh-post-settings-menu.hbs

454 lines
28 KiB
Handlebars
Raw Normal View History

<div class="settings-menu-container">
<div id="entry-controls">
<div class="{{if this.isViewingSubview 'settings-menu-pane-out-left' 'settings-menu-pane-in'}} settings-menu settings-menu-pane">
<div class="settings-menu-header">
<h4>{{capitalize this.post.displayName}} settings</h4>
<button class="close settings-menu-header-action" {{action "closeMenus" target=this.ui}} data-test-close-settings-menu>
{{svg-jar "close"}}<span class="hidden">Close</span>
</button>
</div>
<div class="settings-menu-content">
{{gh-image-uploader-with-preview
image=this.post.featureImage
text=(concat "Upload " this.post.displayName " image")
allowUnsplash=true
update=(action "setCoverImage")
remove=(action "clearCoverImage")
}}
<form>
<div class="form-group">
<label for="url">{{capitalize this.post.displayName}} URL</label>
{{!-- new posts don't have a preview link --}}
{{#unless this.post.isNew}}
{{#if this.post.isPublished}}
<a class="post-view-link" target="_blank" href="{{this.post.url}}">
View {{this.post.displayName}} {{svg-jar "external"}}
</a>
{{else}}
<a class="post-view-link" target="_blank" href="{{this.post.previewUrl}}">
Preview {{svg-jar "external"}}
</a>
{{/if}}
{{/unless}}
<div class="gh-input-icon gh-icon-link">
{{svg-jar "link"}}
{{gh-text-input
class="post-setting-slug"
id="url"
name="post-setting-slug"
value=(readonly this.slugValue)
input=(action (mut this.slugValue) value="target.value")
focus-out=(action "updateSlug" this.slugValue)
stopEnterKeyDownPropagation=true}}
</div>
{{gh-url-preview slug=this.slugValue tagName="p" classNames="description"}}
</div>
<div class="form-group">
{{#if (or this.post.isDraft this.post.isPublished this.post.pastScheduledTime)}}
2019-11-08 09:19:19 +03:00
<label>Publish date</label>
{{else}}
2019-11-08 09:19:19 +03:00
<label>Scheduled date</label>
{{/if}}
{{gh-date-time-picker
date=this.post.publishedAtBlogDate
time=this.post.publishedAtBlogTime
setDate=(action "setPublishedAtBlogDate")
setTime=(action "setPublishedAtBlogTime")
errors=this.post.errors
dateErrorProperty="publishedAtBlogDate"
timeErrorProperty="publishedAtBlogTime"
maxDate='now'
disabled=this.post.isScheduled
isActive=(and this.showSettingsMenu (not this.isViewingSubview))
}}
{{#unless (or this.post.isDraft this.post.isPublished this.post.pastScheduledTime)}}
<p>Use the publish menu to re-schedule</p>
{{/unless}}
</div>
{{#unless this.session.user.isContributor}}
<div class="form-group">
<label for="tag-input">Tags</label>
{{gh-psm-tags-input post=this.post triggerId="tag-input"}}
</div>
{{/unless}}
{{#if this.feature.members}}
{{#if this.showVisibilityInput}}
<div class="form-group">
<label for="visibility-input">Post access</label>
{{gh-psm-visibility-input post=this.post triggerId="visibility-input"}}
</div>
{{/if}}
{{/if}}
{{#gh-form-group errors=this.post.errors hasValidated=this.post.hasValidated property="customExcerpt"}}
<label for="custom-excerpt">Excerpt</label>
{{gh-textarea
class="post-setting-custom-excerpt"
id="custom-excerpt"
name="post-setting-custom-excerpt"
value=(readonly this.customExcerptScratch)
input=(action (mut this.customExcerptScratch) value="target.value")
focus-out=(action "setCustomExcerpt" this.customExcerptScratch)
stopEnterKeyDownPropagation="true"
data-test-field="custom-excerpt"}}
<GhErrorMessage @errors={{this.post.errors}} @property="customExcerpt" data-test-error="custom-excerpt" />
{{/gh-form-group}}
{{#unless this.session.user.isAuthorOrContributor}}
{{#gh-form-group class="for-select" errors=this.post.errors hasValidated=this.post.hasValidated property="authors" data-test-input="authors"}}
<label for="author-list">Authors</label>
{{gh-psm-authors-input selectedAuthors=this.post.authors updateAuthors=(action "changeAuthors") triggerId="author-list"}}
<GhErrorMessage @errors={{this.post.errors}} @property="authors" data-test-error="authors" />
{{/gh-form-group}}
{{/unless}}
<ul class="nav-list nav-list-block">
<li class="nav-list-item" {{action "showSubview" "meta-data"}} data-test-button="meta-data">
<button type="button">
2019-11-08 09:19:19 +03:00
<b>Meta data</b>
<span>Extra content for search engines</span>
</button>
{{svg-jar "arrow-right"}}
</li>
<li class="nav-list-item" {{action "showSubview" "twitter-data"}} data-test-button="twitter-data">
<button type="button">
2019-11-08 09:19:19 +03:00
<b>Twitter card</b>
<span>Customise structured data for Twitter</span>
</button>
{{svg-jar "arrow-right"}}
</li>
<li class="nav-list-item" {{action "showSubview" "facebook-data"}} data-test-button="facebook-data">
<button type="button">
2019-11-08 09:19:19 +03:00
<b>Facebook card</b>
<span>Customise Open Graph data</span>
</button>
{{svg-jar "arrow-right"}}
</li>
{{#if (and this.feature.members (eq this.post.displayName "post") this.session.user.isOwnerOrAdmin)}}
<li class="nav-list-item" {{action "showSubview" "email-settings"}} data-test-button="email-settings">
<button type="button">
2019-11-08 09:19:19 +03:00
<b>Email newsletter</b>
<span>Customise email settings</span>
</button>
{{svg-jar "arrow-right"}}
</li>
{{/if}}
<li class="nav-list-item" {{action "showSubview" "codeinjection"}} data-test-button="codeinjection">
<button type="button">
2019-11-08 09:19:19 +03:00
<b>Code injection</b>
<span>Add styles/scripts to the header &amp; footer</span>
</button>
{{svg-jar "arrow-right"}}
</li>
</ul>
{{#unless this.session.user.isAuthorOrContributor}}
<div class="form-group for-checkbox">
<label class="checkbox" for="featured" {{action "toggleFeatured" bubbles="false"}}>
<input
type="checkbox"
checked={{this.post.featured}}
class="gh-input post-settings-featured"
onclick={{action (mut this.post.featured) value="target.checked"}}
data-test-checkbox="featured"
>
<span class="input-toggle-component"></span>
<p>Feature this {{this.post.displayName}}</p>
</label>
</div>
{{/unless}}
{{gh-psm-template-select
post=this.post
onTemplateSelect=(action (mut this.post.customTemplate))}}
{{#unless this.post.isNew}}
<button type="button" class="gh-btn gh-btn-hover-red gh-btn-icon settings-menu-delete-button" {{action "deletePost"}}><span>{{svg-jar "trash"}} Delete {{this.post.displayName}}</span></button>
{{/unless}}
</form>
</div>{{! .settings-menu-content }}
</div>{{! .post-settings-menu }}
<div class="{{if this.isViewingSubview 'settings-menu-pane-in' 'settings-menu-pane-out-right'}} settings-menu settings-menu-pane">
<div class="active">
{{#if this.isViewingSubview}}
{{#if (eq this.subview "meta-data")}}
<div class="settings-menu-header subview">
<button {{action "closeSubview"}} class="back settings-menu-header-action" data-test-button="close-psm-subview">{{svg-jar "arrow-left"}}<span class="hidden">Back</span></button>
2019-11-08 09:19:19 +03:00
<h4>Meta data</h4>
<div style="width:23px;"></div>
</div>
<div class="settings-menu-content">
<form {{action "discardEnter" on="submit"}}>
{{#gh-form-group errors=this.post.errors hasValidated=this.post.hasValidated property="metaTitle"}}
2019-11-08 09:19:19 +03:00
<label for="meta-title">Meta title</label>
{{gh-text-input
class="post-setting-meta-title"
id="meta-title"
name="post-setting-meta-title"
value=(readonly this.metaTitleScratch)
input=(action (mut this.metaTitleScratch) value="target.value")
focus-out=(action "setMetaTitle" this.metaTitleScratch)
stopEnterKeyDownPropagation=true
data-test-field="meta-title"}}
<p>Recommended: <b>70</b> characters. Youve used {{gh-count-down-characters this.metaTitleScratch 70}}</p>
<GhErrorMessage @errors={{this.post.errors}} @property="meta-title" />
{{/gh-form-group}}
{{#gh-form-group errors=this.post.errors hasValidated=this.post.hasValidated property="metaDescription"}}
2019-11-08 09:19:19 +03:00
<label for="meta-description">Meta description</label>
{{gh-textarea
class="post-setting-meta-description"
id="meta-description"
name="post-setting-meta-description"
value=(readonly this.metaDescriptionScratch)
input=(action (mut this.metaDescriptionScratch) value="target.value")
focus-out=(action "setMetaDescription" this.metaDescriptionScratch)
stopEnterKeyDownPropagation="true"
data-test-field="meta-description"}}
<p>Recommended: <b>156</b> characters. Youve used {{gh-count-down-characters this.metaDescriptionScratch 156}}</p>
<GhErrorMessage @errors={{this.post.errors}} @property="meta-description" />
{{/gh-form-group}}
{{#gh-form-group errors=this.post.errors hasValidated=this.post.hasValidated property="canonicalUrl"}}
<label for="canonicalUrl">Canonical URL</label>
{{gh-text-input
class="post-setting-canonicalUrl"
name="post-setting-canonicalUrl"
value=(readonly this.canonicalUrlScratch)
input=(action (mut this.canonicalUrlScratch) value="target.value")
focus-out=(action "setCanonicalUrl" this.canonicalUrlScratch)
stopEnterKeyDownPropagation="true"
data-test-field="canonicalUrl"}}
<GhErrorMessage @errors={{this.post.errors}} @property="canonicalUrl" />
{{/gh-form-group}}
<div class="form-group">
<label>Search Engine Result Preview</label>
<div class="seo-preview">
<div class="seo-preview-title">{{truncate this.seoTitle 70}}</div>
<div class="seo-preview-link">{{truncate this.seoURL 70}}</div>
<div class="seo-preview-description">{{truncate this.seoDescription 300}}</div>
</div>
</div>
</form>
</div>
{{/if}}
{{#if (eq this.subview "twitter-data")}}
<div class="settings-menu-header subview">
<button {{action "closeSubview"}} class="back settings-menu-header-action" data-test-button="close-psm-subview">{{svg-jar "arrow-left"}}<span class="hidden">Back</span></button>
2019-11-08 09:19:19 +03:00
<h4>Twitter card</h4>
<div style="width:23px;"></div>
</div>
<div class="settings-menu-content">
<form {{action "discardEnter" on="submit"}}>
{{gh-image-uploader-with-preview
image=this.post.twitterImage
text="Add Twitter image"
allowUnsplash=true
update=(action "setTwitterImage")
remove=(action "clearTwitterImage")
}}
{{#gh-form-group errors=this.post.errors hasValidated=this.post.hasValidated property="twitterTitle"}}
2019-11-08 09:19:19 +03:00
<label for="twitter-title">Twitter title</label>
{{gh-text-input
class="post-setting-twitter-title"
id="twitter-title"
name="post-setting-twitter-title"
placeholder=(truncate this.twitterTitle 40)
value=(readonly this.twitterTitleScratch)
input=(action (mut this.twitterTitleScratch) value="target.value")
focus-out=(action "setTwitterTitle" this.twitterTitleScratch)
stopEnterKeyDownPropagation=true
data-test-field="twitter-title"}}
<GhErrorMessage @errors={{this.post.errors}} @property="twitterTitle" data-test-error="twitter-title" />
{{/gh-form-group}}
{{#gh-form-group errors=this.post.errors hasValidated=this.post.hasValidated property="twitterDescription"}}
2019-11-08 09:19:19 +03:00
<label for="twitter-description">Twitter description</label>
{{gh-textarea
class="post-setting-twitter-description"
id="twitter-description"
name="post-setting-twitter-description"
placeholder=(truncate this.twitterDescription 155)
stopEnterKeyDownPropagation="true"
value=(readonly this.twitterDescriptionScratch)
input=(action (mut this.twitterDescriptionScratch) value="target.value")
focus-out=(action "setTwitterDescription" this.twitterDescriptionScratch)
data-test-field="twitter-description"}}
<GhErrorMessage @errors={{this.post.errors}} @property="twitterDescription" data-test-error="twitter-description" />
{{/gh-form-group}}
<div class="form-group">
<label>Preview</label>
<div class="gh-twitter-preview">
{{#if this.twitterImage}}
<div class="gh-twitter-preview-image" style={{background-image-style this.twitterImage}}></div>
{{/if}}
<div class="gh-twitter-preview-content">
<div class="gh-twitter-preview-title">{{this.twitterTitle}}</div>
<div class="gh-twitter-preview-description">{{truncate this.twitterDescription 155}}</div>
<div class="gh-twitter-preview-footer">
<div class="gh-twitter-preview-footer-left">
{{this.config.blogDomain}}
</div>
<div class="gh-twitter-preview-footer-right">
</div>
</div>
</div>
</div>
</div>
</form>
</div>
{{/if}}
{{#if (eq this.subview "email-settings")}}
<GhPostSettingsMenu::Email
@post={{this.post}}
@savePostTask={{this.savePost}}
@toggleEmailPreviewModal={{this.toggleEmailPreviewModal}}
@close={{action "closeSubview"}}
/>
{{/if}}
{{#if (eq this.subview "facebook-data")}}
<div class="settings-menu-header subview">
<button {{action "closeSubview"}} class="back settings-menu-header-action" data-test-button="close-psm-subview">{{svg-jar "arrow-left"}}<span class="hidden">Back</span></button>
2019-11-08 09:19:19 +03:00
<h4>Facebook card</h4>
<div style="width:23px;"></div>
</div>
<div class="settings-menu-content">
<form {{action "discardEnter" on="submit"}}>
{{gh-image-uploader-with-preview
image=this.post.ogImage
text="Add Facebook image"
allowUnsplash=true
update=(action "setOgImage")
remove=(action "clearOgImage")
}}
{{#gh-form-group errors=this.post.errors hasValidated=this.post.hasValidated property="ogTitle"}}
2019-11-08 09:19:19 +03:00
<label for="og-title">Facebook title</label>
{{gh-text-input
class="post-setting-og-title"
id="og-title"
name="post-setting-og-title"
placeholder=(truncate this.facebookTitle 40)
value=(readonly this.ogTitleScratch)
input=(action (mut this.ogTitleScratch) value="target.value")
focus-out=(action "setOgTitle" this.ogTitleScratch)
stopEnterKeyDownPropagation=true
data-test-field="og-title"}}
<GhErrorMessage @errors={{this.post.errors}} @property="ogTitle" data-test-error="og-title" />
{{/gh-form-group}}
{{#gh-form-group errors=this.post.errors hasValidated=this.post.hasValidated property="ogDescription"}}
2019-11-08 09:19:19 +03:00
<label for="og-description">Facebook description</label>
{{gh-textarea
class="post-setting-og-description"
id="og-description"
name="post-setting-og-description"
placeholder=(truncate this.facebookDescription 160)
value=(readonly this.ogDescriptionScratch)
input=(action (mut this.ogDescriptionScratch) value="target.value")
focus-out=(action "setOgDescription" this.ogDescriptionScratch)
stopEnterKeyDownPropagation="true"
data-test-field="og-description"}}
<GhErrorMessage @errors={{this.post.errors}} @property="ogDescription" data-test-error="og-description" />
{{/gh-form-group}}
<div class="form-group">
<label>Preview</label>
<div class="gh-og-preview">
{{#if this.facebookImage}}
<div class="gh-og-preview-image" style={{background-image-style this.facebookImage}}></div>
{{/if}}
<div class="gh-og-preview-content">
<div class="gh-og-preview-title">{{truncate this.facebookTitle 88}}</div>
<div class="gh-og-preview-description">{{truncate this.facebookDescription 300}}</div>
<div class="gh-og-preview-footer">
<div class="gh-og-preview-footer-left">
{{this.config.blogDomain}} <span class="gh-og-preview-footer-left-divider">|</span> by <span class="gh-og-preview-footer-author">{{author-names this.post.authors}}</span>
</div>
<div class="gh-og-preview-footer-right">
</div>
</div>
</div>
</div>
</div>
</form>
</div>
{{/if}}
{{#if (eq this.subview "codeinjection")}}
<div class="settings-menu-header subview">
<button {{action "closeSubview"}} class="back settings-menu-header-action" data-test-button="close-psm-subview">{{svg-jar "arrow-left"}}<span class="hidden">Back</span></button>
2019-11-08 09:19:19 +03:00
<h4>Code injection</h4>
<div style="width:23px;"></div>
</div>
<div class="settings-menu-content settings-menu-content-codeinjection">
<form {{action "discardEnter" on="submit"}}>
{{#gh-form-group errors=this.post.errors hasValidated=this.post.hasValidated property="codeinjectionHead"}}
<label for="codeinjection-head">{{capitalize this.post.displayName}} header <code>\{{ghost_head}}</code></label>
{{gh-cm-editor this.codeinjectionHeadScratch
id="post-setting-codeinjection-head"
class="post-setting-codeinjection"
name="post-setting-codeinjection-head"
focusOut=(action "setHeaderInjection" this.codeinjectionHeadScratch)
stopEnterKeyDownPropagation="true"
update=(action (mut this.codeinjectionHeadScratch))
data-test-field="codeinjection-head"}}
<GhErrorMessage @errors={{this.post.errors}} @property="codeinjectionHead" data-test-error="codeinjection-head" />
{{/gh-form-group}}
{{#gh-form-group errors=this.post.errors hasValidated=this.post.hasValidated property="codeinjectionFoot"}}
<label for="codeinjection-foot">{{capitalize this.post.displayName}} footer <code>\{{ghost_foot}}</code></label>
{{gh-cm-editor this.codeinjectionFootScratch
id="post-setting-codeinjection-foot"
class="post-setting-codeinjection"
name="post-setting-codeinjection-foot"
focusOut=(action "setFooterInjection" this.codeinjectionFootScratch)
stopEnterKeyDownPropagation="true"
update=(action (mut this.codeinjectionFootScratch))
data-test-field="codeinjection-foot"}}
<GhErrorMessage @errors={{this.post.errors}} @property="codeinjectionFoot" data-test-error="codeinjection-foot" />
{{/gh-form-group}}
</form>
</div>
{{/if}}
{{/if}}
</div>
</div>
</div>
</div>
{{!--
_showThrobbers is on a timer so that throbbers don't get positioned until
the slide-in animation has finished and it gets toggled when the meta
pane is shown
--}}
{{#if this._showThrobbers}}
{{#unless this.session.user.isAuthorOrContributor}}
{{gh-tour-item "featured-post"
target="label[for='featured'] p"
throbberAttachment="middle middle"
throbberOffset="0px -20px"
popoverTriangleClass="bottom-right"
}}
{{/unless}}
{{/if}}