2017-02-17 08:50:07 +03:00
<section class="gh-canvas">
2019-06-18 13:47:21 +03:00
<GhCanvasHeader class="gh-canvas-header">
<h2 class="gh-canvas-title" data-test-screen-title>
2021-01-21 18:45:59 +03:00
<LinkTo @route="settings">Settings</LinkTo>
<span> {{ svg-jar "arrow-right" }} </span>
2019-06-18 13:47:21 +03:00
Labs
</h2>
</GhCanvasHeader>
2014-12-14 20:56:04 +03:00
2017-02-17 08:50:07 +03:00
<section class="view-container settings-debug">
2020-09-16 16:37:33 +03:00
<p class="gh-box gh-box-tip"> {{ svg-jar "idea" }} This is a testing ground for new or experimental features. They may change, break or inexplicably disappear at any time.</p>
2017-02-17 17:10:02 +03:00
2021-02-10 15:00:07 +03:00
<div class="gh-main-section">
<h4 class="gh-main-section-header small bn">Migration options</h4>
<div class="gh-expandable">
<div class="gh-expandable-block">
<div class="gh-expandable-header">
<div>
<h4 class="gh-expandable-title">Import content</h4>
<p class="gh-expandable-description">Import posts from another Ghost installation</p>
</div>
<form id="settings-import" enctype="multipart/form-data">
<GhFileUpload
@id="importfile"
@classNames="flex"
@uploadButtonText= {{ this .uploadButtonText }}
@onUpload= {{ action "onUpload" }}
@acceptEncoding= {{ this .importMimeType }}
data-test-file-input="import"
/>
</form>
2017-05-24 16:36:59 +03:00
</div>
2021-02-10 15:00:07 +03:00
{{ # if this .importErrors }}
<div class="gh-import-errors {{ if this .importSuccessful "gh-import-errors-alert" }} " data-test-import-errors>
<div class="gh-import-errors-title">
{{ # if this .importSuccessful }}
Import successful with warnings
{{ else }}
Import failed
{{ / if }}
</div>
2017-05-24 16:36:59 +03:00
2021-02-10 15:00:07 +03:00
{{ # each this .importErrors as | error | }}
<div class="gh-import-error" data-test-import-error>
<p class="gh-import-error-message" data-test-import-error-message>
{{ # if error .help }} {{ error .help }} : {{ / if }} {{ error .message }}
</p>
2019-06-18 13:47:21 +03:00
2021-02-10 15:00:07 +03:00
{{ # if error .context }}
<div class="gh-import-error-entry" data-test-import-error-context>
<pre> {{ error .context }} </pre>
</div>
{{ / if }}
2019-06-18 13:47:21 +03:00
</div>
2021-02-10 15:00:07 +03:00
{{ / each }}
2019-06-18 13:47:21 +03:00
</div>
2021-02-10 15:00:07 +03:00
{{ / if }}
2019-06-18 13:47:21 +03:00
</div>
2021-02-10 15:00:07 +03:00
<div class="gh-expandable-block">
<div class="gh-expandable-header">
<div>
<h4 class="gh-expandable-title">Export your content</h4>
<p class="gh-expandable-description">Download all of your posts and settings in a single, glorious JSON file</p>
</div>
<button type="button" class="gh-btn" {{ action "downloadFile" "db" }} ><span>Export</span></button>
</div>
2019-06-18 13:47:21 +03:00
</div>
2021-02-10 15:00:07 +03:00
<div class="gh-expandable-block">
<div class="gh-expandable-header">
<div>
<h4 class="gh-expandable-title">Delete all content</h4>
<p class="gh-expandable-description">Permanently delete all posts and tags from the database, a hard reset</p>
</div>
<button type="button" class="gh-btn gh-btn-red js-delete" {{ action "toggleDeleteAllModal" }} ><span>Delete</span></button>
</div>
2019-06-18 13:47:21 +03:00
</div>
2017-02-17 17:10:02 +03:00
</div>
</div>
2021-02-10 15:00:07 +03:00
<div class="gh-main-section">
<h4 class="gh-main-section-header small bn">Beta features</h4>
<div class="gh-expandable">
<div class="gh-expandable-block">
<GhUploader
2021-02-22 03:27:00 +03:00
@extensions= {{ this .redirectsFileExtensions }}
@uploadUrl="/redirects/upload/"
2021-02-10 15:00:07 +03:00
@paramName="redirects"
@onUploadSuccess= {{ perform this .redirectUploadResult true }}
@onUploadFailure= {{ perform this .redirectUploadResult false }}
as |uploader|
>
<div class="gh-expandable-header">
<div>
<h4 class="gh-expandable-title">Redirects</h4>
<p class="gh-expandable-description">Configure redirects for old or moved content, more info in <a href="https://ghost.org/docs/tutorials/implementing-redirects/">the docs</a></p>
</div>
<div class="gh-setting-action flex flex-column items-end">
{{ # if uploader .isUploading }}
{{ uploader .progressBar }}
{{ else }}
<button
type="button"
class="gh-btn gh-btn-icon {{ if this .redirectSuccess "gh-btn-green" }} {{ if this .redirectFailure "gh-btn-red" }} "
onclick= {{ action "triggerFileDialog" }}
data-test-button="upload-redirects"
>
<span>
{{ # if this .redirectSuccess }}
{{ svg-jar "check-circle" }} Uploaded
{{ else if this .redirectFailure }}
{{ svg-jar "retry" }} Upload Failed
{{ else }}
2021-02-22 03:27:00 +03:00
Upload redirects YAML/JSON
2021-02-10 15:00:07 +03:00
{{ / if }}
</span>
</button>
2021-02-22 03:27:00 +03:00
<div><a href="#" {{ action "downloadFile" "redirects/download" }} data-test-link="download-redirects">Download current redirects</a></div>
2021-02-10 15:00:07 +03:00
{{ / if }}
{{ # each uploader .errors as | error | }}
<div class="gh-setting-error" data-test-error="redirects"> {{ or error .context error .message }} </div>
{{ / each }}
2017-09-21 18:01:40 +03:00
2021-02-10 15:00:07 +03:00
<div style="display:none">
2021-02-22 03:27:00 +03:00
<GhFileInput @multiple= {{ false }} @action= {{ uploader .setFiles }} @accept= {{ this .redirectsFileMimeTypes }} data-test-file-input="redirects" />
2021-02-10 15:00:07 +03:00
</div>
</div>
2019-06-18 13:47:21 +03:00
</div>
2021-02-10 15:00:07 +03:00
</GhUploader>
2017-09-21 18:01:40 +03:00
</div>
2017-02-17 17:10:02 +03:00
2021-02-10 15:00:07 +03:00
<div class="gh-expandable-block">
<GhUploader
@extensions= {{ this .yamlExtension }}
@uploadUrl="/settings/routes/yaml/"
@paramName="routes"
@onUploadSuccess= {{ perform this .routesUploadResult true }}
@onUploadFailure= {{ perform this .routesUploadResult false }}
as |uploader|
>
<div class="gh-expandable-header">
<div>
<h4 class="gh-expandable-title">Routes</h4>
<p class="gh-expandable-description">Configure dynamic routing by modifying the routes.yaml file</p>
</div>
<div class="gh-setting-action flex flex-column items-end">
{{ # if uploader .isUploading }}
{{ uploader .progressBar }}
{{ else }}
<button
type="button"
class="gh-btn gh-btn-icon {{ if this .routesSuccess "gh-btn-green" }} {{ if this .routesFailure "gh-btn-red" }} "
onclick= {{ action "triggerFileDialog" }}
data-test-button="upload-routes"
>
<span>
{{ # if this .routesSuccess }}
{{ svg-jar "check-circle" }} Uploaded
{{ else if this .routesFailure }}
{{ svg-jar "retry" }} Upload Failed
{{ else }}
Upload routes YAML
{{ / if }}
</span>
</button>
<div><a href="#" {{ action "downloadFile" "settings/routes/yaml" }} data-test-link="download-routes">Download current routes.yaml</a></div>
{{ / if }}
{{ # each uploader .errors as | error | }}
<div class="gh-setting-error" data-test-error="routes"> {{ or error .context error .message }} </div>
{{ / each }}
<div style="display:none">
<GhFileInput @multiple= {{ false }} @action= {{ uploader .setFiles }} @accept= {{ this .yamlAccept }} data-test-file-input="routes" />
</div>
</div>
2019-06-18 13:47:21 +03:00
</div>
2021-02-10 15:00:07 +03:00
</GhUploader>
2018-07-24 14:20:53 +03:00
</div>
2021-06-07 21:51:23 +03:00
</div>
</div>
2021-04-22 20:41:41 +03:00
2021-04-26 23:15:22 +03:00
2021-06-07 21:51:23 +03:00
{{ # if ( enable-developer-experiments ) }}
<div class="gh-main-section">
<h4 class="gh-main-section-header small bn">Alpha Features</h4>
<div class="gh-expandable">
<div class="gh-expandable-block">
<div class="gh-expandable-header">
<div>
<h4 class="gh-expandable-title">Google OAuth for staff users</h4>
<p class="gh-expandable-description">
Allow people to sign into Ghost Admin using Google SSO,
{{!-- TODO: create an help desk article and update the url here --}}
<a href="#" target="_blank" rel="noopener">docs here</a>
</p>
</div>
<div class="for-switch">
<label class="switch" for="settings-oauth">
<input
type="checkbox"
checked= {{ this .isOAuthEnabled }}
id="settings-oauth"
onclick= {{ action "toggleIsOAuthEnabled" value = "target.checked" }}
data-test-private-checkbox
>
<span class="input-toggle-component"></span>
</label>
2021-04-26 23:15:22 +03:00
</div>
</div>
2021-06-07 21:51:23 +03:00
<div class="gh-expandable-content">
{{ # if this .isOAuthEnabled }}
<div class="gh-setting-content-extended pt2 pb4">
<a href="https://console.developers.google.com/" target="_blank" rel="noopener" class="gh-btn gh-btn-white mb4"><span> {{ svg-jar "google-favicon" }} Configure Google OAuth</span></a>
<GhFormGroup @class="no-margin pt2" @errors= {{ this .settings .errors }} @hasValidated= {{ this .settings .hasValidated }} @property="password">
<div class="form-group">
<label for="aouth-client-id">Google OAuth Client ID</label>
<GhTextInput
id="oauth-client-id"
@value= {{ readonly this .settings .oauthClientId }}
@name="oauth-client-id"
@focus-out= {{ action "saveOAuthSettings" }}
@input= {{ action ( mut this .settings .oauthClientId ) value = "target.value" }}
/>
</div>
<div class="form-group">
<label for="oauth-client-secret">Google OAuth Client Secret</label>
<GhTextInput
id="oauth-client-secret"
@value= {{ readonly this .settings .oauthClientSecret }}
@name="oauth-client-secret"
@focus-out= {{ action "saveOAuthSettings" }}
@input= {{ action ( mut this .settings .oauthClientSecret ) value = "target.value" }}
/>
</div>
</GhFormGroup>
</div>
{{ / if }}
</div>
</div>
2021-06-07 22:07:45 +03:00
<div class="gh-expandable-block">
<div class="gh-expandable-header">
<div>
<h4 class="gh-expandable-title">Match helper</h4>
<p class="gh-expandable-description">
Experimental <code>\ {{ match }} </code> helper for themes.
</p>
</div>
<div class="for-switch">
<GhFeatureFlag @flag="matchHelper" />
</div>
</div>
</div>
2021-06-09 13:15:37 +03:00
<div class="gh-expandable-block">
<div class="gh-expandable-header">
<div>
2021-06-23 12:58:59 +03:00
<h4 class="gh-expandable-title">Multiple products</h4>
2021-06-09 13:15:37 +03:00
<p class="gh-expandable-description">
Allow multiple products on site.
</p>
</div>
<div class="for-switch">
<GhFeatureFlag @flag="multipleProducts" />
</div>
</div>
</div>
2021-06-17 16:10:32 +03:00
<div class="gh-expandable-block">
<div class="gh-expandable-header">
<div>
<h4 class="gh-expandable-title">Post settings menu behaviour change</h4>
<p class="gh-expandable-description">
Switches post settings menu behaviour from a popover to a collapsible sidebar.
</p>
</div>
<div class="for-switch">
<GhFeatureFlag @flag="psmRedesign" />
</div>
</div>
</div>
2018-07-24 14:20:53 +03:00
</div>
</div>
2021-06-07 21:51:23 +03:00
{{ / if }}
2015-06-13 17:34:09 +03:00
</section>
2014-12-01 14:39:11 +03:00
</section>
2015-11-18 13:50:48 +03:00
2019-12-13 17:20:29 +03:00
{{ # if this .showDeleteAllModal }}
2020-01-16 18:14:03 +03:00
<GhFullscreenModal @modal="delete-all"
@close= {{ action "toggleDeleteAllModal" }}
@modifier="action wide" />
2017-03-02 11:49:10 +03:00
{{ / if }}