2023-07-18 19:11:00 +00:00
|
|
|
|
import { Accessor, createMemo, createSignal, For, onCleanup, onMount, Show } from 'solid-js'
|
2023-02-17 09:21:02 +00:00
|
|
|
|
import { useLocalize } from '../../context/localize'
|
2023-03-12 20:16:20 +00:00
|
|
|
|
import { clsx } from 'clsx'
|
2023-03-13 12:26:25 +00:00
|
|
|
|
import { Title } from '@solidjs/meta'
|
2023-04-11 13:57:48 +00:00
|
|
|
|
import type { Shout, Topic } from '../../graphql/types.gen'
|
2023-03-23 17:15:50 +00:00
|
|
|
|
import { apiClient } from '../../utils/apiClient'
|
2023-05-07 15:15:30 +00:00
|
|
|
|
import { useRouter } from '../../stores/router'
|
2023-05-04 19:57:02 +00:00
|
|
|
|
import { useEditorContext } from '../../context/editor'
|
2023-05-09 04:58:00 +00:00
|
|
|
|
import { Editor, Panel, TopicSelect, UploadModalContent } from '../Editor'
|
2023-05-06 15:04:50 +00:00
|
|
|
|
import { Icon } from '../_shared/Icon'
|
2023-05-08 18:23:51 +00:00
|
|
|
|
import { Button } from '../_shared/Button'
|
|
|
|
|
import styles from './Edit.module.scss'
|
|
|
|
|
import { useSession } from '../../context/session'
|
2023-05-09 04:58:00 +00:00
|
|
|
|
import { Modal } from '../Nav/Modal'
|
|
|
|
|
import { hideModal, showModal } from '../../stores/ui'
|
2023-05-10 01:46:39 +00:00
|
|
|
|
import { imageProxy } from '../../utils/imageProxy'
|
2023-05-11 11:33:01 +00:00
|
|
|
|
import { GrowingTextarea } from '../_shared/GrowingTextarea'
|
2023-06-10 14:10:05 +00:00
|
|
|
|
import { VideoUploader } from '../Editor/VideoUploader'
|
2023-07-14 13:06:21 +00:00
|
|
|
|
import { AudioUploader } from '../Editor/AudioUploader'
|
2023-06-10 14:10:05 +00:00
|
|
|
|
import { VideoPlayer } from '../_shared/VideoPlayer'
|
|
|
|
|
import { slugify } from '../../utils/slugify'
|
2023-07-02 05:08:42 +00:00
|
|
|
|
import { SolidSwiper } from '../_shared/SolidSwiper'
|
2023-07-14 13:06:21 +00:00
|
|
|
|
import { DropArea } from '../_shared/DropArea'
|
|
|
|
|
import { LayoutType, MediaItem } from '../../pages/types'
|
2023-03-23 17:15:50 +00:00
|
|
|
|
|
2023-06-10 14:10:05 +00:00
|
|
|
|
type Props = {
|
2023-04-11 13:57:48 +00:00
|
|
|
|
shout: Shout
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-12 13:03:46 +00:00
|
|
|
|
const handleScrollTopButtonClick = (e) => {
|
|
|
|
|
e.preventDefault()
|
2023-05-09 05:05:06 +00:00
|
|
|
|
window.scrollTo({
|
|
|
|
|
top: 0,
|
|
|
|
|
behavior: 'smooth'
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-10 20:20:53 +00:00
|
|
|
|
const EMPTY_TOPIC: Topic = {
|
|
|
|
|
id: -1,
|
|
|
|
|
slug: ''
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-10 14:10:05 +00:00
|
|
|
|
export const EditView = (props: Props) => {
|
2023-02-17 09:21:02 +00:00
|
|
|
|
const { t } = useLocalize()
|
2023-05-08 18:23:51 +00:00
|
|
|
|
const { user } = useSession()
|
2023-05-07 19:33:20 +00:00
|
|
|
|
const [isScrolled, setIsScrolled] = createSignal(false)
|
2023-03-23 17:15:50 +00:00
|
|
|
|
const [topics, setTopics] = createSignal<Topic[]>(null)
|
2023-05-09 04:58:00 +00:00
|
|
|
|
const [coverImage, setCoverImage] = createSignal<string>(null)
|
2023-07-02 05:08:42 +00:00
|
|
|
|
|
2023-03-26 18:31:34 +00:00
|
|
|
|
const { page } = useRouter()
|
2023-05-04 19:57:02 +00:00
|
|
|
|
const {
|
|
|
|
|
form,
|
2023-05-05 20:05:50 +00:00
|
|
|
|
formErrors,
|
|
|
|
|
actions: { setForm, setFormErrors }
|
2023-05-04 19:57:02 +00:00
|
|
|
|
} = useEditorContext()
|
2023-03-23 17:15:50 +00:00
|
|
|
|
|
2023-05-10 20:20:53 +00:00
|
|
|
|
const shoutTopics = props.shout.topics || []
|
|
|
|
|
|
2023-05-04 19:57:02 +00:00
|
|
|
|
setForm({
|
2023-05-07 15:15:30 +00:00
|
|
|
|
shoutId: props.shout.id,
|
2023-04-11 13:57:48 +00:00
|
|
|
|
slug: props.shout.slug,
|
|
|
|
|
title: props.shout.title,
|
|
|
|
|
subtitle: props.shout.subtitle,
|
2023-05-10 20:20:53 +00:00
|
|
|
|
selectedTopics: shoutTopics,
|
|
|
|
|
mainTopic: shoutTopics.find((topic) => topic.slug === props.shout.mainTopic) || EMPTY_TOPIC,
|
2023-04-11 13:57:48 +00:00
|
|
|
|
body: props.shout.body,
|
2023-06-10 14:10:05 +00:00
|
|
|
|
coverImageUrl: props.shout.cover,
|
2023-07-02 05:08:42 +00:00
|
|
|
|
media: props.shout.media,
|
2023-06-10 14:10:05 +00:00
|
|
|
|
layout: props.shout.layout
|
2023-03-23 17:15:50 +00:00
|
|
|
|
})
|
|
|
|
|
|
2023-07-14 13:06:21 +00:00
|
|
|
|
const mediaItems: Accessor<MediaItem[]> = createMemo(() => {
|
2023-07-02 05:08:42 +00:00
|
|
|
|
return JSON.parse(form.media || '[]')
|
|
|
|
|
})
|
|
|
|
|
|
2023-03-23 17:15:50 +00:00
|
|
|
|
onMount(async () => {
|
|
|
|
|
const allTopics = await apiClient.getAllTopics()
|
|
|
|
|
setTopics(allTopics)
|
|
|
|
|
})
|
|
|
|
|
|
2023-05-07 19:33:20 +00:00
|
|
|
|
onMount(() => {
|
|
|
|
|
const handleScroll = () => {
|
|
|
|
|
setIsScrolled(window.scrollY > 0)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
window.addEventListener('scroll', handleScroll, { passive: true })
|
|
|
|
|
onCleanup(() => {
|
|
|
|
|
window.removeEventListener('scroll', handleScroll)
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
2023-05-11 11:33:01 +00:00
|
|
|
|
const handleTitleInputChange = (value) => {
|
|
|
|
|
setForm('title', value)
|
2023-06-10 14:10:05 +00:00
|
|
|
|
setForm('slug', slugify(value))
|
2023-05-11 11:33:01 +00:00
|
|
|
|
if (value) {
|
2023-05-05 20:05:50 +00:00
|
|
|
|
setFormErrors('title', '')
|
2023-03-26 18:31:34 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const handleSlugInputChange = (e) => {
|
|
|
|
|
const slug = e.currentTarget.value
|
|
|
|
|
setForm('slug', slug)
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-09 11:25:40 +00:00
|
|
|
|
const handleUploadModalContentCloseSetCover = (imgUrl: string) => {
|
2023-05-09 04:58:00 +00:00
|
|
|
|
hideModal()
|
2023-05-10 01:46:39 +00:00
|
|
|
|
setCoverImage(imageProxy(imgUrl))
|
2023-05-09 04:58:00 +00:00
|
|
|
|
setForm('coverImageUrl', imgUrl)
|
|
|
|
|
}
|
2023-05-10 14:07:41 +00:00
|
|
|
|
const handleDeleteCoverImage = () => {
|
|
|
|
|
setForm('coverImageUrl', '')
|
|
|
|
|
setCoverImage(null)
|
|
|
|
|
}
|
2023-05-09 04:58:00 +00:00
|
|
|
|
|
2023-05-10 20:20:53 +00:00
|
|
|
|
const handleTopicSelectChange = (newSelectedTopics) => {
|
|
|
|
|
if (newSelectedTopics.length === 0) {
|
|
|
|
|
setForm('mainTopic', EMPTY_TOPIC)
|
|
|
|
|
} else if (
|
|
|
|
|
form.selectedTopics.length === 0 ||
|
|
|
|
|
newSelectedTopics.every((topic) => topic.id !== form.mainTopic.id)
|
|
|
|
|
) {
|
|
|
|
|
setForm('mainTopic', newSelectedTopics[0])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (newSelectedTopics.length > 0) {
|
|
|
|
|
setFormErrors('selectedTopics', '')
|
|
|
|
|
}
|
|
|
|
|
setForm('selectedTopics', newSelectedTopics)
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-14 13:06:21 +00:00
|
|
|
|
const handleAddMedia = (data) => {
|
|
|
|
|
const newMedia = [...mediaItems(), ...data]
|
|
|
|
|
setForm('media', JSON.stringify(newMedia))
|
2023-07-02 05:08:42 +00:00
|
|
|
|
}
|
2023-07-18 19:11:00 +00:00
|
|
|
|
const handleSortedMedia = (data) => {
|
2023-07-02 05:08:42 +00:00
|
|
|
|
setForm('media', JSON.stringify(data))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const handleImageDelete = (index) => {
|
|
|
|
|
const copy = [...mediaItems()]
|
|
|
|
|
copy.splice(index, 1)
|
|
|
|
|
setForm('media', JSON.stringify(copy))
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-14 13:06:21 +00:00
|
|
|
|
const handleMediaChange = (index, value) => {
|
2023-07-02 05:08:42 +00:00
|
|
|
|
const updated = mediaItems().map((item, idx) => (idx === index ? value : item))
|
|
|
|
|
setForm('media', JSON.stringify(updated))
|
2023-06-10 14:10:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
2023-07-15 21:51:38 +00:00
|
|
|
|
const [baseAudioFields, setBaseAudioFields] = createSignal({
|
|
|
|
|
artist: '',
|
|
|
|
|
date: '',
|
|
|
|
|
genre: ''
|
|
|
|
|
})
|
|
|
|
|
|
2023-07-14 13:06:21 +00:00
|
|
|
|
const handleBaseFieldsChange = (key, value) => {
|
2023-07-15 21:51:38 +00:00
|
|
|
|
if (mediaItems().length > 0) {
|
|
|
|
|
const updated = mediaItems().map((media) => ({ ...media, [key]: value }))
|
|
|
|
|
setForm('media', JSON.stringify(updated))
|
|
|
|
|
} else {
|
|
|
|
|
setBaseAudioFields({ ...baseAudioFields(), [key]: value })
|
|
|
|
|
}
|
2023-07-14 13:06:21 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const articleTitle = () => {
|
|
|
|
|
switch (props.shout.layout as LayoutType) {
|
|
|
|
|
case 'audio': {
|
|
|
|
|
return t('Album name')
|
|
|
|
|
}
|
|
|
|
|
case 'image': {
|
|
|
|
|
return t('Gallery name')
|
|
|
|
|
}
|
|
|
|
|
default: {
|
|
|
|
|
return t('Header')
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const pageTitle = () => {
|
|
|
|
|
switch (props.shout.layout as LayoutType) {
|
|
|
|
|
case 'audio': {
|
|
|
|
|
return t('Publish Album')
|
|
|
|
|
}
|
|
|
|
|
case 'image': {
|
|
|
|
|
return t('Create gallery')
|
|
|
|
|
}
|
|
|
|
|
case 'video': {
|
|
|
|
|
return t('Create video')
|
|
|
|
|
}
|
|
|
|
|
case 'literature': {
|
|
|
|
|
return t('New literary work')
|
|
|
|
|
}
|
|
|
|
|
default: {
|
|
|
|
|
return t('Write an article')
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-09-09 11:53:35 +00:00
|
|
|
|
return (
|
2023-04-06 21:40:34 +00:00
|
|
|
|
<>
|
|
|
|
|
<div class={styles.container}>
|
2023-07-14 13:06:21 +00:00
|
|
|
|
<Title>{pageTitle()}</Title>
|
2023-05-05 20:05:50 +00:00
|
|
|
|
<form>
|
2023-04-06 21:40:34 +00:00
|
|
|
|
<div class="wide-container">
|
2023-05-11 11:52:56 +00:00
|
|
|
|
<button
|
|
|
|
|
class={clsx(styles.scrollTopButton, {
|
|
|
|
|
[styles.visible]: isScrolled()
|
|
|
|
|
})}
|
2023-05-12 13:03:46 +00:00
|
|
|
|
onClick={handleScrollTopButtonClick}
|
2023-05-11 11:52:56 +00:00
|
|
|
|
>
|
|
|
|
|
<Icon name="up-button" class={styles.icon} />
|
|
|
|
|
<span class={styles.scrollTopButtonLabel}>{t('Scroll up')}</span>
|
|
|
|
|
</button>
|
|
|
|
|
|
2023-03-29 08:51:27 +00:00
|
|
|
|
<div class="row">
|
2023-04-06 21:40:34 +00:00
|
|
|
|
<div class="col-md-19 col-lg-18 col-xl-16 offset-md-5">
|
2023-03-29 08:51:27 +00:00
|
|
|
|
<div
|
2023-04-11 13:57:48 +00:00
|
|
|
|
class={clsx(styles.edit, {
|
|
|
|
|
[styles.visible]: page().route === 'edit'
|
2023-03-29 08:51:27 +00:00
|
|
|
|
})}
|
|
|
|
|
>
|
2023-07-14 13:06:21 +00:00
|
|
|
|
<div class={clsx({ [styles.audioHeader]: props.shout.layout === 'audio' })}>
|
|
|
|
|
<div class={styles.inputContainer}>
|
|
|
|
|
<GrowingTextarea
|
|
|
|
|
allowEnterKey={true}
|
|
|
|
|
value={(value) => handleTitleInputChange(value)}
|
|
|
|
|
class={styles.titleInput}
|
|
|
|
|
placeholder={articleTitle()}
|
|
|
|
|
initialValue={form.title}
|
|
|
|
|
maxLength={100}
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
<Show when={formErrors.title}>
|
|
|
|
|
<div class={styles.validationError}>{formErrors.title}</div>
|
|
|
|
|
</Show>
|
|
|
|
|
|
|
|
|
|
<Show when={props.shout.layout === 'audio'}>
|
|
|
|
|
<div class={styles.additional}>
|
|
|
|
|
<input
|
|
|
|
|
type="text"
|
|
|
|
|
placeholder={t('Artist...')}
|
|
|
|
|
class={styles.additionalInput}
|
2023-07-15 06:18:20 +00:00
|
|
|
|
value={mediaItems()[0]?.artist || ''}
|
2023-07-14 13:06:21 +00:00
|
|
|
|
onChange={(event) => handleBaseFieldsChange('artist', event.target.value)}
|
|
|
|
|
/>
|
|
|
|
|
<input
|
2023-07-18 19:11:00 +00:00
|
|
|
|
type="number"
|
|
|
|
|
min="1900"
|
|
|
|
|
max={new Date().getFullYear()}
|
|
|
|
|
step="1"
|
2023-07-14 13:06:21 +00:00
|
|
|
|
class={styles.additionalInput}
|
|
|
|
|
placeholder={t('Release date...')}
|
2023-07-15 06:18:20 +00:00
|
|
|
|
value={mediaItems()[0]?.date || ''}
|
2023-07-14 13:06:21 +00:00
|
|
|
|
onChange={(event) => handleBaseFieldsChange('date', event.target.value)}
|
|
|
|
|
/>
|
|
|
|
|
<input
|
|
|
|
|
type="text"
|
|
|
|
|
placeholder={t('Genre...')}
|
|
|
|
|
class={styles.additionalInput}
|
2023-07-15 06:18:20 +00:00
|
|
|
|
value={mediaItems()[0]?.genre || ''}
|
2023-07-14 13:06:21 +00:00
|
|
|
|
onChange={(event) => handleBaseFieldsChange('genre', event.target.value)}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
</Show>
|
|
|
|
|
|
|
|
|
|
<Show when={props.shout.layout !== 'audio'}>
|
|
|
|
|
<GrowingTextarea
|
|
|
|
|
allowEnterKey={false}
|
|
|
|
|
value={(value) => setForm('subtitle', value)}
|
|
|
|
|
class={styles.subtitleInput}
|
|
|
|
|
placeholder={t('Subheader')}
|
|
|
|
|
initialValue={form.subtitle}
|
|
|
|
|
maxLength={100}
|
|
|
|
|
/>
|
|
|
|
|
</Show>
|
|
|
|
|
</div>
|
2023-07-15 21:51:38 +00:00
|
|
|
|
<Show when={props.shout.layout === 'audio'}>
|
|
|
|
|
<Show
|
|
|
|
|
when={form.coverImageUrl}
|
|
|
|
|
fallback={
|
|
|
|
|
<DropArea
|
|
|
|
|
isSquare={true}
|
|
|
|
|
placeholder={t('Add cover')}
|
|
|
|
|
description={
|
|
|
|
|
<>
|
|
|
|
|
{t('min. 1400×1400 pix')}
|
|
|
|
|
<br />
|
|
|
|
|
{t('jpg, .png, max. 10 mb.')}
|
|
|
|
|
</>
|
|
|
|
|
}
|
|
|
|
|
isMultiply={false}
|
|
|
|
|
fileType={'image'}
|
|
|
|
|
onUpload={(val) => setForm('coverImageUrl', val[0].url)}
|
|
|
|
|
/>
|
|
|
|
|
}
|
|
|
|
|
>
|
|
|
|
|
<div
|
|
|
|
|
class={styles.cover}
|
|
|
|
|
style={{ 'background-image': `url(${imageProxy(form.coverImageUrl)})` }}
|
2023-07-14 13:06:21 +00:00
|
|
|
|
/>
|
2023-07-15 21:51:38 +00:00
|
|
|
|
</Show>
|
2023-05-07 15:15:30 +00:00
|
|
|
|
</Show>
|
|
|
|
|
</div>
|
2023-06-10 14:10:05 +00:00
|
|
|
|
|
2023-07-02 05:08:42 +00:00
|
|
|
|
<Show when={props.shout.layout === 'image'}>
|
|
|
|
|
<SolidSwiper
|
|
|
|
|
editorMode={true}
|
|
|
|
|
images={mediaItems()}
|
2023-07-14 13:06:21 +00:00
|
|
|
|
onImageChange={handleMediaChange}
|
2023-07-02 05:08:42 +00:00
|
|
|
|
onImageDelete={(index) => handleImageDelete(index)}
|
2023-07-14 13:06:21 +00:00
|
|
|
|
onImagesAdd={(value) => handleAddMedia(value)}
|
2023-07-18 19:11:00 +00:00
|
|
|
|
onImagesSorted={(value) => handleSortedMedia(value)}
|
2023-07-02 05:08:42 +00:00
|
|
|
|
/>
|
|
|
|
|
</Show>
|
|
|
|
|
|
2023-06-10 14:10:05 +00:00
|
|
|
|
<Show when={props.shout.layout === 'video'}>
|
|
|
|
|
<Show
|
2023-07-02 05:08:42 +00:00
|
|
|
|
when={form.media}
|
2023-06-10 14:10:05 +00:00
|
|
|
|
fallback={
|
|
|
|
|
<VideoUploader
|
|
|
|
|
data={(data) => {
|
2023-07-14 13:06:21 +00:00
|
|
|
|
handleAddMedia(data)
|
2023-06-10 14:10:05 +00:00
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
}
|
|
|
|
|
>
|
2023-07-02 05:08:42 +00:00
|
|
|
|
<For each={mediaItems()}>
|
2023-06-10 14:10:05 +00:00
|
|
|
|
{(mediaItem) => (
|
|
|
|
|
<>
|
|
|
|
|
<VideoPlayer
|
|
|
|
|
videoUrl={mediaItem?.url}
|
|
|
|
|
title={mediaItem?.title}
|
|
|
|
|
description={mediaItem?.body}
|
2023-07-02 05:08:42 +00:00
|
|
|
|
deleteAction={() => setForm('media', null)}
|
2023-06-10 14:10:05 +00:00
|
|
|
|
/>
|
|
|
|
|
</>
|
|
|
|
|
)}
|
|
|
|
|
</For>
|
|
|
|
|
</Show>
|
2023-07-14 13:06:21 +00:00
|
|
|
|
</Show>
|
|
|
|
|
|
|
|
|
|
<Show when={props.shout.layout === 'audio'}>
|
|
|
|
|
<AudioUploader
|
|
|
|
|
audio={mediaItems()}
|
2023-07-15 21:51:38 +00:00
|
|
|
|
baseFields={baseAudioFields()}
|
2023-07-14 13:06:21 +00:00
|
|
|
|
onAudioAdd={(value) => handleAddMedia(value)}
|
|
|
|
|
onAudioChange={handleMediaChange}
|
2023-07-18 19:11:00 +00:00
|
|
|
|
onAudioSorted={(value) => handleSortedMedia(value)}
|
2023-07-14 13:06:21 +00:00
|
|
|
|
/>
|
2023-06-10 14:10:05 +00:00
|
|
|
|
</Show>
|
|
|
|
|
|
2023-04-11 13:57:48 +00:00
|
|
|
|
<Editor
|
2023-05-04 04:43:52 +00:00
|
|
|
|
shoutId={props.shout.id}
|
2023-05-03 16:13:48 +00:00
|
|
|
|
initialContent={props.shout.body}
|
2023-04-11 13:57:48 +00:00
|
|
|
|
onChange={(body) => setForm('body', body)}
|
|
|
|
|
/>
|
2023-03-29 08:51:27 +00:00
|
|
|
|
</div>
|
|
|
|
|
<div
|
2023-04-11 13:57:48 +00:00
|
|
|
|
class={clsx(styles.editSettings, {
|
|
|
|
|
[styles.visible]: page().route === 'editSettings'
|
2023-03-29 08:51:27 +00:00
|
|
|
|
})}
|
|
|
|
|
>
|
2023-05-08 18:23:51 +00:00
|
|
|
|
<h1>{t('Publish Settings')}</h1>
|
2023-03-29 08:51:27 +00:00
|
|
|
|
|
|
|
|
|
<h4>Slug</h4>
|
|
|
|
|
<div class="pretty-form__item">
|
2023-03-23 17:15:50 +00:00
|
|
|
|
<input
|
|
|
|
|
type="text"
|
2023-03-29 08:51:27 +00:00
|
|
|
|
name="slug"
|
|
|
|
|
id="slug"
|
|
|
|
|
value={form.slug}
|
|
|
|
|
onChange={handleSlugInputChange}
|
2023-03-23 17:15:50 +00:00
|
|
|
|
/>
|
2023-03-29 08:51:27 +00:00
|
|
|
|
<label for="slug">Slug</label>
|
2023-03-26 18:31:34 +00:00
|
|
|
|
</div>
|
2023-03-29 08:51:27 +00:00
|
|
|
|
|
|
|
|
|
{/*<h4>Лид</h4>*/}
|
|
|
|
|
{/*<div class="pretty-form__item">*/}
|
|
|
|
|
{/* <textarea name="lead" id="lead" placeholder="Лид"></textarea>*/}
|
|
|
|
|
{/* <label for="lead">Лид</label>*/}
|
|
|
|
|
{/*</div>*/}
|
|
|
|
|
|
|
|
|
|
{/*<h4>Выбор сообщества</h4>*/}
|
|
|
|
|
{/*<p class="description">Сообщества можно перечислить через запятую</p>*/}
|
|
|
|
|
{/*<div class="pretty-form__item">*/}
|
|
|
|
|
{/* <input*/}
|
|
|
|
|
{/* type="text"*/}
|
|
|
|
|
{/* name="community"*/}
|
|
|
|
|
{/* id="community"*/}
|
|
|
|
|
{/* placeholder="Сообщества"*/}
|
|
|
|
|
{/* class="nolabel"*/}
|
|
|
|
|
{/* />*/}
|
|
|
|
|
{/*</div>*/}
|
|
|
|
|
|
2023-07-18 19:11:00 +00:00
|
|
|
|
<h4>{t('Topics')}</h4>
|
2023-03-29 08:51:27 +00:00
|
|
|
|
{/*<p class="description">*/}
|
|
|
|
|
{/* Добавьте несколько тем, чтобы читатель знал, о чем ваш материал, и мог найти*/}
|
|
|
|
|
{/* его на страницах интересных ему тем. Темы можно менять местами, первая тема*/}
|
|
|
|
|
{/* становится заглавной*/}
|
|
|
|
|
{/*</p>*/}
|
2023-05-11 11:06:29 +00:00
|
|
|
|
<div class={styles.inputContainer}>
|
|
|
|
|
<div class={clsx('pretty-form__item', styles.topicSelectContainer)}>
|
|
|
|
|
<Show when={topics()}>
|
|
|
|
|
<TopicSelect
|
|
|
|
|
topics={topics()}
|
|
|
|
|
onChange={handleTopicSelectChange}
|
|
|
|
|
selectedTopics={form.selectedTopics}
|
|
|
|
|
onMainTopicChange={(mainTopic) => setForm('mainTopic', mainTopic)}
|
|
|
|
|
mainTopic={form.mainTopic}
|
|
|
|
|
/>
|
|
|
|
|
</Show>
|
|
|
|
|
</div>
|
|
|
|
|
<Show when={formErrors.selectedTopics}>
|
|
|
|
|
<div class={styles.validationError}>{formErrors.selectedTopics}</div>
|
2023-03-29 08:51:27 +00:00
|
|
|
|
</Show>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
{/*<h4>Соавторы</h4>*/}
|
|
|
|
|
{/*<p class="description">У каждого соавтора можно добавить роль</p>*/}
|
|
|
|
|
{/*<div class="pretty-form__item--with-button">*/}
|
|
|
|
|
{/* <div class="pretty-form__item">*/}
|
|
|
|
|
{/* <input type="text" name="authors" id="authors" placeholder="Введите имя или e-mail" />*/}
|
|
|
|
|
{/* <label for="authors">Введите имя или e-mail</label>*/}
|
|
|
|
|
{/* </div>*/}
|
|
|
|
|
{/* <button class="button button--submit">Добавить</button>*/}
|
|
|
|
|
{/*</div>*/}
|
|
|
|
|
|
|
|
|
|
{/*<div class="row">*/}
|
|
|
|
|
{/* <div class="col-md-6">Михаил Драбкин</div>*/}
|
|
|
|
|
{/* <div class="col-md-6">*/}
|
|
|
|
|
{/* <input type="text" name="coauthor" id="coauthor1" class="nolabel" />*/}
|
|
|
|
|
{/* </div>*/}
|
|
|
|
|
{/*</div>*/}
|
|
|
|
|
|
2023-05-08 18:23:51 +00:00
|
|
|
|
<h4>{t('Material card')}</h4>
|
2023-03-29 08:51:27 +00:00
|
|
|
|
<p class="description">
|
2023-05-08 18:23:51 +00:00
|
|
|
|
{t(
|
|
|
|
|
'Choose a title image for the article. You can immediately see how the publication card will look like.'
|
|
|
|
|
)}
|
2023-03-29 08:51:27 +00:00
|
|
|
|
</p>
|
2023-05-08 18:23:51 +00:00
|
|
|
|
<div class={styles.articlePreview}>
|
2023-05-10 14:07:41 +00:00
|
|
|
|
<div class={styles.actions}>
|
|
|
|
|
<Button
|
|
|
|
|
variant="primary"
|
2023-05-11 11:43:14 +00:00
|
|
|
|
onClick={() => showModal('uploadCoverImage')}
|
2023-05-10 14:07:41 +00:00
|
|
|
|
value={coverImage() || form.coverImageUrl ? t('Add another image') : t('Add image')}
|
|
|
|
|
/>
|
|
|
|
|
<Show when={coverImage() ?? form.coverImageUrl}>
|
|
|
|
|
<Button variant="secondary" onClick={handleDeleteCoverImage} value={t('Delete')} />
|
|
|
|
|
</Show>
|
|
|
|
|
</div>
|
2023-05-09 04:58:00 +00:00
|
|
|
|
<Show when={coverImage() ?? form.coverImageUrl}>
|
|
|
|
|
<div class={styles.shoutCardCoverContainer}>
|
|
|
|
|
<div class={styles.shoutCardCover}>
|
2023-05-10 01:46:39 +00:00
|
|
|
|
<img
|
|
|
|
|
src={coverImage() || imageProxy(form.coverImageUrl)}
|
|
|
|
|
alt={form.title}
|
|
|
|
|
loading="lazy"
|
|
|
|
|
/>
|
2023-05-09 04:58:00 +00:00
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</Show>
|
2023-05-08 18:23:51 +00:00
|
|
|
|
<div class={styles.shoutCardTitle}>{form.title}</div>
|
|
|
|
|
<div class={styles.shoutCardSubtitle}>{form.subtitle}</div>
|
|
|
|
|
<div class={styles.shoutAuthor}>{user().name}</div>
|
|
|
|
|
</div>
|
2023-03-12 20:16:20 +00:00
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2023-04-06 21:40:34 +00:00
|
|
|
|
</form>
|
|
|
|
|
</div>
|
2023-05-11 11:43:14 +00:00
|
|
|
|
<Modal variant="narrow" name="uploadCoverImage">
|
2023-05-09 11:25:40 +00:00
|
|
|
|
<UploadModalContent onClose={(value) => handleUploadModalContentCloseSetCover(value)} />
|
2023-05-09 04:58:00 +00:00
|
|
|
|
</Modal>
|
2023-05-08 17:21:06 +00:00
|
|
|
|
<Panel shoutId={props.shout.id} />
|
2023-04-06 21:40:34 +00:00
|
|
|
|
</>
|
2022-09-09 11:53:35 +00:00
|
|
|
|
)
|
|
|
|
|
}
|
2022-11-01 19:27:43 +00:00
|
|
|
|
|
2023-04-11 13:57:48 +00:00
|
|
|
|
export default EditView
|