fix campaning

This commit is contained in:
romantarkin 2025-08-02 17:08:07 +05:00
parent a637020af6
commit 3bd7a22465
3 changed files with 51 additions and 25 deletions

View File

@ -1,7 +1,6 @@
import React from 'react'; import React from 'react';
import Modal from './Modal'; import Modal from './Modal';
import styles from '../styles/CampaignModal.module.css'; import styles from '../styles/CampaignModal.module.css';
import MultiSelect from '../components/MultiSelect';
export default function CreateCampaignModal({ isOpen, onClose, campaign, groups, versions, smtpServers, loading, onChange, onSave, getVersionName }) { export default function CreateCampaignModal({ isOpen, onClose, campaign, groups, versions, smtpServers, loading, onChange, onSave, getVersionName }) {
return ( return (
@ -9,14 +8,16 @@ export default function CreateCampaignModal({ isOpen, onClose, campaign, groups,
<h3 className={styles.title}>Добавить кампанию</h3> <h3 className={styles.title}>Добавить кампанию</h3>
<form onSubmit={onSave} className={styles.form}> <form onSubmit={onSave} className={styles.form}>
<label className={styles.label}>Группа <label className={styles.label}>Группа
<select value={campaign.group_id} onChange={e => onChange({ ...campaign, group_id: Number(e.target.value) })} required className={styles.input}> <select value={campaign.group_id || ''} onChange={e => onChange({ ...campaign, group_id: e.target.value ? Number(e.target.value) : null })} required className={styles.input}>
<option value="">Выберите группу</option>
{groups.map(g => ( {groups.map(g => (
<option key={g.id} value={g.id}>{g.name}</option> <option key={g.id} value={g.id}>{g.name}</option>
))} ))}
</select> </select>
</label> </label>
<label className={styles.label}>Версия шаблона <label className={styles.label}>Версия шаблона
<select value={campaign.template_version_id} onChange={e => onChange({ ...campaign, template_version_id: Number(e.target.value) })} required className={styles.input}> <select value={campaign.template_version_id || ''} onChange={e => onChange({ ...campaign, template_version_id: e.target.value ? Number(e.target.value) : null })} required className={styles.input}>
<option value="">Выберите версию шаблона</option>
{versions.map(v => ( {versions.map(v => (
<option key={v.id} value={v.id}>{getVersionName(v.id)}</option> <option key={v.id} value={v.id}>{getVersionName(v.id)}</option>
))} ))}
@ -25,14 +26,13 @@ export default function CreateCampaignModal({ isOpen, onClose, campaign, groups,
<label className={styles.label}>Тема <label className={styles.label}>Тема
<input type="text" value={campaign.subject_override || ''} onChange={e => onChange({ ...campaign, subject_override: e.target.value })} className={styles.input} /> <input type="text" value={campaign.subject_override || ''} onChange={e => onChange({ ...campaign, subject_override: e.target.value })} className={styles.input} />
</label> </label>
<label className={styles.label}>SMTP-серверы <label className={styles.label}>SMTP-сервер
<MultiSelect <select value={campaign.smtp_server_id || ''} onChange={e => onChange({ ...campaign, smtp_server_id: e.target.value ? Number(e.target.value) : null })} required className={styles.input}>
options={smtpServers.map(s => ({ value: s.id, label: `${s.name} (${s.host})` }))} <option value="">Выберите SMTP-сервер</option>
value={campaign.smtp_server_ids || []} {smtpServers.map(s => (
onChange={ids => onChange({ ...campaign, smtp_server_ids: ids })} <option key={s.id} value={s.id}>{s.name} ({s.host})</option>
placeholder="Выберите SMTP-серверы" ))}
disabled={loading} </select>
/>
</label> </label>
<label className={styles.label}>Статус <label className={styles.label}>Статус
<select value={campaign.status} onChange={e => onChange({ ...campaign, status: e.target.value })} required className={styles.input}> <select value={campaign.status} onChange={e => onChange({ ...campaign, status: e.target.value })} required className={styles.input}>
@ -43,7 +43,7 @@ export default function CreateCampaignModal({ isOpen, onClose, campaign, groups,
</select> </select>
</label> </label>
<label className={styles.label}>Запланировано на <label className={styles.label}>Запланировано на
<input type="datetime-local" value={campaign.scheduled_at} onChange={e => onChange({ ...campaign, scheduled_at: e.target.value })} className={styles.input} /> <input type="datetime-local" value={campaign.scheduled_at || ''} onChange={e => onChange({ ...campaign, scheduled_at: e.target.value })} className={styles.input} />
</label> </label>
<div className={styles.actions}> <div className={styles.actions}>
<button type="submit" disabled={loading} className={styles.saveBtn}>{loading ? 'Создание...' : 'Создать'}</button> <button type="submit" disabled={loading} className={styles.saveBtn}>{loading ? 'Создание...' : 'Создать'}</button>

View File

@ -1,22 +1,41 @@
import React from 'react'; import React from 'react';
import Modal from './Modal'; import Modal from './Modal';
import styles from '../styles/CampaignModal.module.css'; import styles from '../styles/CampaignModal.module.css';
import MultiSelect from '../components/MultiSelect';
export default function EditCampaignModal({ isOpen, onClose, campaign, groups, versions, smtpServers, loading, onChange, onSave, getVersionName }) { export default function EditCampaignModal({ isOpen, onClose, campaign, groups, versions, smtpServers, loading, onChange, onSave, getVersionName }) {
// Получаем ID сервера из различных возможных форматов данных
const getSmtpServerId = () => {
// Проверяем различные возможные форматы
if (campaign.smtp_server_id) {
return campaign.smtp_server_id;
}
if (campaign.smtp_server_ids && campaign.smtp_server_ids.length > 0) {
return campaign.smtp_server_ids[0];
}
if (campaign.CampaignSmtpServer && campaign.CampaignSmtpServer.smtp_server_id) {
return campaign.CampaignSmtpServer.smtp_server_id;
}
if (campaign.SmtpServers && campaign.SmtpServers.length > 0) {
return campaign.SmtpServers[0].id;
}
return '';
};
return ( return (
<Modal isOpen={isOpen} onClose={onClose} disabled={loading}> <Modal isOpen={isOpen} onClose={onClose} disabled={loading}>
<h3 className={styles.title}>Редактировать кампанию</h3> <h3 className={styles.title}>Редактировать кампанию</h3>
<form onSubmit={onSave} className={styles.form}> <form onSubmit={onSave} className={styles.form}>
<label className={styles.label}>Группа <label className={styles.label}>Группа
<select value={campaign.group_id} onChange={e => onChange({ ...campaign, group_id: Number(e.target.value) })} required className={styles.input}> <select value={campaign.group_id || ''} onChange={e => onChange({ ...campaign, group_id: e.target.value ? Number(e.target.value) : null })} required className={styles.input}>
<option value="">Выберите группу</option>
{groups.map(g => ( {groups.map(g => (
<option key={g.id} value={g.id}>{g.name}</option> <option key={g.id} value={g.id}>{g.name}</option>
))} ))}
</select> </select>
</label> </label>
<label className={styles.label}>Версия шаблона <label className={styles.label}>Версия шаблона
<select value={campaign.template_version_id} onChange={e => onChange({ ...campaign, template_version_id: Number(e.target.value) })} required className={styles.input}> <select value={campaign.template_version_id || ''} onChange={e => onChange({ ...campaign, template_version_id: e.target.value ? Number(e.target.value) : null })} required className={styles.input}>
<option value="">Выберите версию шаблона</option>
{versions.map(v => ( {versions.map(v => (
<option key={v.id} value={v.id}>{getVersionName(v.id)}</option> <option key={v.id} value={v.id}>{getVersionName(v.id)}</option>
))} ))}
@ -25,14 +44,13 @@ export default function EditCampaignModal({ isOpen, onClose, campaign, groups, v
<label className={styles.label}>Тема <label className={styles.label}>Тема
<input type="text" value={campaign.subject_override || ''} onChange={e => onChange({ ...campaign, subject_override: e.target.value })} className={styles.input} /> <input type="text" value={campaign.subject_override || ''} onChange={e => onChange({ ...campaign, subject_override: e.target.value })} className={styles.input} />
</label> </label>
<label className={styles.label}>SMTP-серверы <label className={styles.label}>SMTP-сервер
<MultiSelect <select value={getSmtpServerId()} onChange={e => onChange({ ...campaign, smtp_server_id: e.target.value ? Number(e.target.value) : null })} required className={styles.input}>
options={smtpServers.map(s => ({ value: s.id, label: `${s.name} (${s.host})` }))} <option value="">Выберите SMTP-сервер</option>
value={campaign.smtp_server_ids || []} {smtpServers.map(s => (
onChange={ids => onChange({ ...campaign, smtp_server_ids: ids })} <option key={s.id} value={s.id}>{s.name} ({s.host})</option>
placeholder="Выберите SMTP-серверы" ))}
disabled={loading} </select>
/>
</label> </label>
<label className={styles.label}>Статус <label className={styles.label}>Статус
<select value={campaign.status} onChange={e => onChange({ ...campaign, status: e.target.value })} required className={styles.input}> <select value={campaign.status} onChange={e => onChange({ ...campaign, status: e.target.value })} required className={styles.input}>

View File

@ -8,7 +8,7 @@ import styles from '../styles/Common.module.css';
const PAGE_SIZE = 10; const PAGE_SIZE = 10;
function CampaignPage() { function CampaignPage() {
const { token } = useUser(); const { token, user } = useUser();
const [campaigns, setCampaigns] = useState([]); const [campaigns, setCampaigns] = useState([]);
const [total, setTotal] = useState(0); const [total, setTotal] = useState(0);
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
@ -167,7 +167,15 @@ function CampaignPage() {
}; };
const handleCreate = () => { const handleCreate = () => {
setCreateCampaign({ group_id: '', template_version_id: '', subject_override: '', status: 'draft', scheduled_at: '' }); setCreateCampaign({
group_id: null,
template_version_id: null,
subject_override: '',
status: 'draft',
scheduled_at: '',
smtp_server_id: null,
user_id: user?.id // Добавляем user_id
});
}; };
const handleCreateSave = async (e) => { const handleCreateSave = async (e) => {