Проработан интерфейс редактора опроса

Этот коммит содержится в:
Глеб Иваницкий 2024-08-19 18:14:00 +03:00
родитель dead15033c
Коммит 8bc44bd59d
2 изменённых файлов: 149 добавлений и 59 удалений

Просмотреть файл

@ -38,3 +38,14 @@
flex-shrink: 0;
margin-left: 1rem;
}
.poll-edit .content .message-settings {
display: flex;
flex-direction: column;
gap: 1rem;
color: var(--md-sys-color-on-surface);
}
.poll-edit .content .message-settings > * {
flex-shrink: 0;
}

Просмотреть файл

@ -21,9 +21,126 @@ const PollContext = React.createContext({
const apiUrl = new URL(window.location)
apiUrl.pathname = '/api/polls'
const MessageType = {
TEXT: 'text',
POLL: 'poll',
MEDIA: 'media',
CONTACT: 'contact',
DICE: 'dice',
}
const getMessageTypeIcon = (messageType) => {
switch (messageType) {
case MessageType.TEXT: return 'title'
case MessageType.POLL: return 'ballot'
case MessageType.MEDIA: return 'attach_file'
case MessageType.CONTACT: return 'contacts'
case MessageType.DICE: return 'casino'
default: return 'chat'
}
}
function renderMessage (messageType) {
switch (messageType) {
case MessageType.TEXT:
return (
<div className="message-settings">
<div className="title md-typescale-title-small">Текст</div>
<md-outlined-text-field
type="textarea"
label="Текст"
value=""
rows="6"
required="required" />
</div>
)
case MessageType.POLL:
return (
<div className="message-settings">
<div className="title md-typescale-title-small">Опрос</div>
<md-outlined-text-field
label="Вопрос"
value=""
required="required">
<md-icon slot="leading-icon">contact_support</md-icon>
</md-outlined-text-field>
<div className="title md-typescale-label-medium">Варианты ответа</div>
<div className="poll-options">
<div className="poll-option">
<md-outlined-text-field
class="option-text"
label="Добавить ответ"
value=""
required="required"/>
<md-icon-button class="option-action">
<md-icon>adjust</md-icon>
</md-icon-button>
</div>
</div>
<div className="title md-typescale-title-small">Настройки</div>
<div>
<label className="md-typescale-body-large">
<md-checkbox touch-target="wrapper"></md-checkbox>
Анонимное голосование
</label>
<label className="md-typescale-body-large">
<md-checkbox touch-target="wrapper"></md-checkbox>
Выбор нескольких ответов
</label>
</div>
</div>
)
case MessageType.MEDIA:
return (
<div className="message-settings">
<div className="title md-typescale-title-small">Медиа</div>
<div className="messege-files"></div>
<md-filled-button>
Прикрепить файл
<md-icon slot="icon">attach_file</md-icon>
</md-filled-button>
</div>
)
case MessageType.CONTACT:
return (
<div className="message-settings">
<div className="title md-typescale-title-small">Контакт</div>
<md-outlined-text-field
label="Номер телефона"
value=""
required="required"/>
<md-outlined-text-field
label="Имя"
value=""
required="required"/>
</div>
)
default:
return ''
}
}
export default function PollsScreen() {
const [polls, setPolls] = useState([])
const [editPoll, setEditPoll] = useState(false)
const [messageType, setMessageType] = useState(null)
const fetchPolls = async () => {
const response = await fetch('/api/polls')
@ -62,10 +179,10 @@ export default function PollsScreen() {
setEditPoll={setEditPoll}>
<md-outlined-text-field
label="Название"
value={editPoll ? editPoll.name : ''}
supporting-text="Отображается в списке опросов"
required="required">
label="Название"
value={editPoll ? editPoll.name : ''}
supporting-text="Отображается в списке опросов"
required="required">
<md-icon slot="leading-icon">title</md-icon>
</md-outlined-text-field>
@ -124,7 +241,7 @@ export default function PollsScreen() {
value=""
supporting-text="Время отправки сообщения"
required="required">
<md-icon slot="leading-icon">title</md-icon>
<md-icon slot="leading-icon">line_start_circle</md-icon>
</md-outlined-text-field>
<md-outlined-text-field
@ -132,7 +249,7 @@ export default function PollsScreen() {
value=""
supporting-text="Время прекращения обработки событий"
required="required">
<md-icon slot="leading-icon">title</md-icon>
<md-icon slot="leading-icon">line_end_circle</md-icon>
</md-outlined-text-field>
<div>
@ -147,75 +264,37 @@ export default function PollsScreen() {
</label>
</div>
<md-outlined-select label="Тип" value="poll" required="required">
<md-outlined-select
label="Тип"
value={messageType}
onInput={(event) => setMessageType(event.target.value)}
required="required">
<md-icon slot="leading-icon">attach_file</md-icon>
<md-icon slot="leading-icon">{getMessageTypeIcon(messageType)}</md-icon>
<md-select-option value="text">
<md-select-option value={MessageType.TEXT}>
<div slot="headline">Текст</div>
</md-select-option>
<md-select-option value="poll">
<md-select-option value={MessageType.POLL}>
<div slot="headline">Опрос</div>
</md-select-option>
<md-select-option value="image">
<div slot="headline">Изображение</div>
<md-select-option value={MessageType.MEDIA}>
<div slot="headline">Медиа</div>
</md-select-option>
<md-select-option value="video">
<div slot="headline">Видео</div>
<md-select-option value={MessageType.CONTACT}>
<div slot="headline">Контакт</div>
</md-select-option>
<md-select-option value="audio">
<div slot="headline">Аудио</div>
</md-select-option>
<md-select-option value="file">
<div slot="headline">Файл</div>
<md-select-option value={MessageType.DICE}>
<div slot="headline">Игральная кость</div>
</md-select-option>
</md-outlined-select>
<div className="title md-typescale-title-small">Опрос</div>
<md-outlined-text-field
label="Вопрос"
value=""
required="required">
<md-icon slot="leading-icon">contact_support</md-icon>
</md-outlined-text-field>
<div className="title md-typescale-label-medium">Варианты ответа</div>
<div className="poll-options">
<div className="poll-option">
<md-outlined-text-field
class="option-text"
label="Добавить ответ"
value=""
required="required"/>
<md-icon-button class="option-action">
<md-icon>adjust</md-icon>
</md-icon-button>
</div>
</div>
<div className="title md-typescale-title-small">Настройки</div>
<div>
<label className="md-typescale-body-large">
<md-checkbox touch-target="wrapper"></md-checkbox>
Анонимное голосование
</label>
<label className="md-typescale-body-large">
<md-checkbox touch-target="wrapper"></md-checkbox>
Выбор нескольких ответов
</label>
</div>
{renderMessage(messageType)}
</Card>