mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-22 10:21:36 +03:00
2cf55cb307
refs https://github.com/TryGhost/Team/issues/928 - it's possible to set a button with no content in the CTA card but the auto-removal when exiting edit mode was only checking for presence of content - updated to only remove the card when no content, button text, or button url has been set
227 lines
7.5 KiB
JavaScript
227 lines
7.5 KiB
JavaScript
import createComponentCard from '../utils/create-component-card';
|
|
|
|
// map card names to component names
|
|
export const CARD_COMPONENT_MAP = {
|
|
hr: 'koenig-card-hr',
|
|
image: 'koenig-card-image',
|
|
markdown: 'koenig-card-markdown',
|
|
'card-markdown': 'koenig-card-markdown', // backwards-compat with markdown editor
|
|
html: 'koenig-card-html',
|
|
code: 'koenig-card-code',
|
|
embed: 'koenig-card-embed',
|
|
bookmark: 'koenig-card-bookmark',
|
|
gallery: 'koenig-card-gallery',
|
|
email: 'koenig-card-email',
|
|
'email-cta': 'koenig-card-email-cta',
|
|
paywall: 'koenig-card-paywall'
|
|
};
|
|
|
|
// map card names to generic icons (used for ghost elements when dragging)
|
|
export const CARD_ICON_MAP = {
|
|
hr: 'koenig/kg-card-type-divider',
|
|
image: 'koenig/kg-card-type-image',
|
|
markdown: 'koenig/kg-card-type-markdown',
|
|
'card-markdown': 'koenig/kg-card-type-markdown',
|
|
html: 'koenig/kg-card-type-html',
|
|
code: 'koenig/kg-card-type-gen-embed',
|
|
embed: 'koenig/kg-card-type-gen-embed',
|
|
bookmark: 'koenig/kg-card-type-bookmark',
|
|
gallery: 'koenig/kg-card-type-gallery',
|
|
email: 'koenig/kg-card-type-gen-embed',
|
|
'email-cta': 'koenig/kg-card-type-gen-embed',
|
|
paywall: 'koenig/kg-card-type-divider'
|
|
};
|
|
|
|
// TODO: move koenigOptions directly into cards now that card components register
|
|
// themselves so that they are available on card.component
|
|
export default [
|
|
createComponentCard('card-markdown'), // backwards-compat with markdown editor
|
|
createComponentCard('code', {deleteIfEmpty: 'payload.code'}),
|
|
createComponentCard('embed', {hasEditMode: false, deleteIfEmpty: 'payload.html'}),
|
|
createComponentCard('bookmark', {hasEditMode: false, deleteIfEmpty: 'payload.metadata'}),
|
|
createComponentCard('hr', {hasEditMode: false, selectAfterInsert: false}),
|
|
createComponentCard('html', {deleteIfEmpty: 'payload.html'}),
|
|
createComponentCard('image', {hasEditMode: false, deleteIfEmpty(card) {
|
|
return card.payload.imageSelector && !card.payload.src;
|
|
}}),
|
|
createComponentCard('markdown', {deleteIfEmpty: 'payload.markdown'}),
|
|
createComponentCard('gallery', {hasEditMode: false}),
|
|
createComponentCard('email', {deleteIfEmpty: 'payload.html'}),
|
|
createComponentCard('email-cta', {deleteIfEmpty(card) {
|
|
return !card.payload.html && !card.payload.buttonText && !card.payload.buttonUrl;
|
|
}}),
|
|
createComponentCard('paywall', {hasEditMode: false, selectAfterInsert: false})
|
|
];
|
|
|
|
export const CARD_MENU = [
|
|
{
|
|
title: 'Primary',
|
|
rowLength: 1,
|
|
items: [{
|
|
label: 'Image',
|
|
icon: 'koenig/kg-card-type-image',
|
|
desc: 'Upload, or embed with /image [url]',
|
|
iconClass: 'kg-card-type-native',
|
|
matches: ['image', 'img'],
|
|
type: 'card',
|
|
replaceArg: 'image',
|
|
params: ['src'],
|
|
payload: {
|
|
triggerBrowse: true
|
|
}
|
|
},
|
|
{
|
|
label: 'Markdown',
|
|
icon: 'koenig/kg-card-type-markdown',
|
|
desc: 'Insert a Markdown editor card',
|
|
iconClass: 'kg-card-type-native',
|
|
matches: ['markdown', 'md'],
|
|
type: 'card',
|
|
replaceArg: 'markdown'
|
|
},
|
|
{
|
|
label: 'HTML',
|
|
icon: 'koenig/kg-card-type-html',
|
|
desc: 'Insert a raw HTML card',
|
|
iconClass: 'kg-card-type-native',
|
|
matches: ['html'],
|
|
type: 'card',
|
|
replaceArg: 'html'
|
|
},
|
|
{
|
|
label: 'Gallery',
|
|
icon: 'koenig/kg-card-type-gallery',
|
|
desc: 'Create an image gallery',
|
|
iconClass: 'kg-card-type-native',
|
|
matches: ['gallery'],
|
|
type: 'card',
|
|
replaceArg: 'gallery'
|
|
},
|
|
{
|
|
label: 'Divider',
|
|
icon: 'koenig/kg-card-type-divider',
|
|
desc: 'Insert a dividing line',
|
|
iconClass: 'kg-card-type-native',
|
|
matches: ['divider', 'horizontal-rule', 'hr'],
|
|
type: 'card',
|
|
replaceArg: 'hr'
|
|
},
|
|
{
|
|
label: 'Bookmark',
|
|
icon: 'koenig/kg-card-type-bookmark',
|
|
desc: 'Embed a link as a visual bookmark',
|
|
matches: ['bookmark'],
|
|
type: 'card',
|
|
replaceArg: 'bookmark',
|
|
params: ['url']
|
|
},
|
|
{
|
|
label: 'Email content',
|
|
icon: 'koenig/kg-card-type-email',
|
|
desc: 'Only visible when delivered by email',
|
|
matches: ['email'],
|
|
type: 'card',
|
|
replaceArg: 'email'
|
|
},
|
|
{
|
|
label: 'Email call to action',
|
|
icon: 'koenig/kg-card-type-email-cta',
|
|
desc: 'Target free or paid members with a CTA',
|
|
matches: ['email', 'cta'],
|
|
type: 'card',
|
|
replaceArg: 'email-cta',
|
|
feature: 'emailCardSegments'
|
|
},
|
|
{
|
|
label: 'Public preview',
|
|
icon: 'koenig/kg-card-type-paywall',
|
|
desc: 'Attract signups with a public intro',
|
|
matches: ['public preview', 'preview', 'paywall'],
|
|
type: 'card',
|
|
replaceArg: 'paywall'
|
|
}]
|
|
},
|
|
{
|
|
title: 'Embed',
|
|
rowLength: 1,
|
|
items: [{
|
|
label: 'YouTube',
|
|
icon: 'koenig/kg-card-type-youtube',
|
|
desc: '/youtube [video url]',
|
|
matches: ['youtube'],
|
|
type: 'card',
|
|
replaceArg: 'embed',
|
|
params: ['url']
|
|
},
|
|
{
|
|
label: 'Twitter',
|
|
icon: 'koenig/kg-card-type-twitter',
|
|
desc: '/twitter [tweet url]',
|
|
matches: ['twitter'],
|
|
type: 'card',
|
|
replaceArg: 'embed',
|
|
params: ['url']
|
|
},
|
|
{
|
|
label: 'Unsplash',
|
|
icon: 'koenig/kg-card-type-unsplash',
|
|
desc: '/unsplash [search-term or url]',
|
|
iconClass: 'kg-card-type-unsplash',
|
|
matches: ['unsplash'],
|
|
type: 'card',
|
|
replaceArg: 'image',
|
|
params: ['searchTerm'],
|
|
payload: {
|
|
imageSelector: 'unsplash'
|
|
}
|
|
},
|
|
{
|
|
label: 'Vimeo',
|
|
icon: 'koenig/kg-card-type-vimeo',
|
|
desc: '/vimeo [video url]',
|
|
matches: ['vimeo'],
|
|
type: 'card',
|
|
replaceArg: 'embed',
|
|
params: ['url']
|
|
},
|
|
{
|
|
label: 'CodePen',
|
|
icon: 'koenig/kg-card-type-codepen',
|
|
desc: '/codepen [video url]',
|
|
iconClass: 'kg-card-type-codepen',
|
|
matches: ['codepen'],
|
|
type: 'card',
|
|
replaceArg: 'embed',
|
|
params: ['url']
|
|
},
|
|
{
|
|
label: 'Spotify',
|
|
icon: 'koenig/kg-card-type-spotify',
|
|
desc: '/spotify [track or playlist url]',
|
|
matches: ['spotify'],
|
|
type: 'card',
|
|
replaceArg: 'embed',
|
|
params: ['url']
|
|
},
|
|
{
|
|
label: 'SoundCloud',
|
|
icon: 'koenig/kg-card-type-soundcloud',
|
|
desc: '/soundcloud [track or playlist url]',
|
|
matches: ['soundcloud'],
|
|
type: 'card',
|
|
replaceArg: 'embed',
|
|
params: ['url']
|
|
},
|
|
{
|
|
label: 'Other...',
|
|
icon: 'koenig/kg-card-type-other',
|
|
desc: '/embed [url]',
|
|
iconClass: 'kg-card-type-native',
|
|
matches: ['embed'],
|
|
type: 'card',
|
|
replaceArg: 'embed',
|
|
params: ['url']
|
|
}]
|
|
}
|
|
];
|