Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor campaign editing and status management #2264

Merged
merged 4 commits into from
Jan 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 8 additions & 11 deletions cmd/campaigns.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,6 @@ import (
type campaignReq struct {
models.Campaign

// Indicates if the "send_at" date should be written or set to null.
SendLater bool `json:"send_later"`

// This overrides Campaign.Lists to receive and
// write a list of int IDs during creation and updation.
// Campaign.Lists is JSONText for sending lists children
Expand Down Expand Up @@ -251,7 +248,7 @@ func handleUpdateCampaign(c echo.Context) error {
return err
}

if isCampaignalMutable(cm.Status) {
if !canEditCampaign(cm.Status) {
return echo.NewHTTPError(http.StatusBadRequest, app.i18n.T("campaigns.cantUpdate"))
}

Expand All @@ -269,7 +266,7 @@ func handleUpdateCampaign(c echo.Context) error {
o = c
}

out, err := app.core.UpdateCampaign(id, o.Campaign, o.ListIDs, o.MediaIDs, o.SendLater)
out, err := app.core.UpdateCampaign(id, o.Campaign, o.ListIDs, o.MediaIDs)
if err != nil {
return err
}
Expand Down Expand Up @@ -600,12 +597,12 @@ func validateCampaignFields(c campaignReq, app *App) (campaignReq, error) {
return c, nil
}

// isCampaignalMutable tells if a campaign's in a state where it's
// properties can be mutated.
func isCampaignalMutable(status string) bool {
return status == models.CampaignStatusRunning ||
status == models.CampaignStatusCancelled ||
status == models.CampaignStatusFinished
// canEditCampaign returns true if a campaign is in a status where updating
// its properties is allowed.
func canEditCampaign(status string) bool {
return status == models.CampaignStatusDraft ||
status == models.CampaignStatusPaused ||
status == models.CampaignStatusScheduled
}

// makeOptinCampaignMessage makes a default opt-in campaign message body.
Expand Down
23 changes: 19 additions & 4 deletions frontend/src/views/Campaign.vue
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@
{{ $t('campaigns.schedule') }}
</b-button>
</b-field>
<b-field expanded v-if="canUnSchedule">
<b-button expanded @click="unscheduleCampaign" :loading="loading.campaigns" type="is-primary"
icon-left="clock-start" data-cy="btn-unschedule">
{{ $t('campaigns.unSchedule') }}
</b-button>
</b-field>
</b-field>
</div>
</div>
Expand Down Expand Up @@ -497,7 +503,6 @@ export default Vue.extend({
messenger: this.form.messenger,
type: 'regular',
tags: this.form.tags,
send_later: this.form.sendLater,
send_at: this.form.sendLater ? this.form.sendAtDate : null,
headers: this.form.headers,
template_id: this.form.templateId,
Expand All @@ -521,7 +526,6 @@ export default Vue.extend({
messenger: this.form.messenger,
type: 'regular',
tags: this.form.tags,
send_later: this.form.sendLater,
send_at: this.form.sendLater ? this.form.sendAtDate : null,
headers: this.form.headers,
template_id: this.form.templateId,
Expand Down Expand Up @@ -595,22 +599,33 @@ export default Vue.extend({
},
);
},

unscheduleCampaign() {
this.$api.changeCampaignStatus(this.data.id, 'draft').then((d) => {
this.data = d;
this.form.archiveSlug = d.archiveSlug;
});
},
},

computed: {
...mapState(['serverConfig', 'loading', 'lists', 'templates']),

canEdit() {
return this.isNew
|| this.data.status === 'draft' || this.data.status === 'scheduled';
|| this.data.status === 'draft' || this.data.status === 'scheduled' || this.data.status === 'paused';
},

canSchedule() {
return this.data.status === 'draft' && this.data.sendAt;
},

canUnSchedule() {
return this.data.status === 'scheduled' && this.data.sendAt;
},

canStart() {
return this.data.status === 'draft' && !this.data.sendAt;
return this.data.status === 'draft' || this.data.status === 'paused';
},

canArchive() {
Expand Down
1 change: 1 addition & 0 deletions i18n/ca.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "S'ha enviat el missatge de prova",
"campaigns.timestamps": "Segells de temps",
"campaigns.trackLink": "Enllaç de seguiment",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Visualitzacions",
"dashboard.campaignViews": "Visualitzacions de la campanya",
"dashboard.linkClicks": "Clics a enllaços",
Expand Down
1 change: 1 addition & 0 deletions i18n/cs-cz.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Testovací zpráva odeslána",
"campaigns.timestamps": "Časová razítka",
"campaigns.trackLink": "Sledovací odkaz",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Pohledy",
"dashboard.campaignViews": "Pohledy na kampaň",
"dashboard.linkClicks": "Klepnutí na odkaz",
Expand Down
1 change: 1 addition & 0 deletions i18n/cy.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Wedi anfon neges brawf",
"campaigns.timestamps": "Stamp amser",
"campaigns.trackLink": "Olrhain dolen",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Nifer y bobl sydd wedi'i gweld",
"dashboard.campaignViews": "Nifer y bobl sydd wedi gweld yr ymgyrch",
"dashboard.linkClicks": "Nifer y bobl sydd wedi clicio'r ddolen",
Expand Down
1 change: 1 addition & 0 deletions i18n/da.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Testmeddelelse sendt",
"campaigns.timestamps": "Tidsstempler",
"campaigns.trackLink": "Link til spor",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Udsigt over",
"dashboard.campaignViews": "Kampagnevisninger",
"dashboard.linkClicks": "Klik på link",
Expand Down
1 change: 1 addition & 0 deletions i18n/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Testnachricht gesendet",
"campaigns.timestamps": "Zeitstempel",
"campaigns.trackLink": "Track Link",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Ansichten",
"dashboard.campaignViews": "Kampagnenansichten",
"dashboard.linkClicks": "Linkklicks",
Expand Down
1 change: 1 addition & 0 deletions i18n/el.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Το δοκιμαστικό μήνυμα στάλθηκε",
"campaigns.timestamps": "Χρονοσήματα",
"campaigns.trackLink": "Σύνδεσμος παρακολούθησης",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Προβολές",
"dashboard.campaignViews": "Προβολές εκστρατειών",
"dashboard.linkClicks": "Κλικ συνδέσμων",
Expand Down
1 change: 1 addition & 0 deletions i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Test message sent",
"campaigns.timestamps": "Timestamps",
"campaigns.trackLink": "Track link",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Views",
"dashboard.campaignViews": "Campaign views",
"dashboard.linkClicks": "Link clicks",
Expand Down
1 change: 1 addition & 0 deletions i18n/eo.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "S'ha enviat el missatge de prova",
"campaigns.timestamps": "Segells de temps",
"campaigns.trackLink": "Enllaç de seguiment",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Visualitzacions",
"dashboard.campaignViews": "Visualitzacions de la campanya",
"dashboard.linkClicks": "Clics a enllaços",
Expand Down
1 change: 1 addition & 0 deletions i18n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"campaigns.testSent": "Mensaje de prueba enviado",
"campaigns.timestamps": "Marcas de tiempo",
"campaigns.trackLink": "Enlace de rastreo (Track link)",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Vistas",
"dashboard.campaignViews": "Vista de campaña",
"dashboard.linkClicks": "Enlaces cliqueados",
Expand Down
1 change: 1 addition & 0 deletions i18n/fi.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"campaigns.testSent": "Testiviesti lähetetty",
"campaigns.timestamps": "Aikaleimat",
"campaigns.trackLink": "Seuraa linkkejä",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Katselukerrat",
"dashboard.campaignViews": "Kampanjan katselukerrat",
"dashboard.linkClicks": "Linkkiklikkaukset",
Expand Down
1 change: 1 addition & 0 deletions i18n/fr-CA.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"campaigns.testSent": "Message de test envoyé",
"campaigns.timestamps": "Horodatages",
"campaigns.trackLink": "Lien de suivi",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Vues",
"dashboard.campaignViews": "vues de campagne",
"dashboard.linkClicks": "clics sur liens",
Expand Down
1 change: 1 addition & 0 deletions i18n/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"campaigns.testSent": "Message de test envoyé",
"campaigns.timestamps": "Horodatages",
"campaigns.trackLink": "Lien de suivi",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Vues",
"dashboard.campaignViews": "vues de campagne",
"dashboard.linkClicks": "clics sur liens",
Expand Down
1 change: 1 addition & 0 deletions i18n/he.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "הודעת בדיקה נשלחה",
"campaigns.timestamps": "חותמות זמן",
"campaigns.trackLink": "קישור מעקב",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "צפיות",
"dashboard.campaignViews": "צפיות בקמפיין",
"dashboard.linkClicks": "לחיצות על קישורים",
Expand Down
1 change: 1 addition & 0 deletions i18n/hu.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Tesztüzenet elküldve",
"campaigns.timestamps": "Időbélyegek",
"campaigns.trackLink": "Nyomkövetőhivatkozás",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Megtekintések",
"dashboard.campaignViews": "Megtekintések",
"dashboard.linkClicks": "Kattintások",
Expand Down
1 change: 1 addition & 0 deletions i18n/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Messaggio di prova inviato",
"campaigns.timestamps": "Marcatura temporale ",
"campaigns.trackLink": "Link di tracciamento",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Visualizzazioni",
"dashboard.campaignViews": "Visualizzazioni della campagna",
"dashboard.linkClicks": "Clic sui link",
Expand Down
1 change: 1 addition & 0 deletions i18n/jp.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"campaigns.testSent": "テストメッセージ送信済み",
"campaigns.timestamps": "タイムスタンプ",
"campaigns.trackLink": "リンクの追跡",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "ビュー",
"dashboard.campaignViews": "キャンペーンビュー",
"dashboard.linkClicks": "リンクのクリック",
Expand Down
1 change: 1 addition & 0 deletions i18n/ml.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "പരീക്ഷണ സന്ദേശം അയച്ചു",
"campaigns.timestamps": "ടൈംസ്റ്റാമ്പുകൾ",
"campaigns.trackLink": "ട്രാക്ക് ലിങ്ക്",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "കാഴ്ചകൾ",
"dashboard.campaignViews": "ക്യാമ്പേയ്ൻ കാഴ്ചകൾ",
"dashboard.linkClicks": "ലിങ്ക് ക്ലിക്കുകൾ",
Expand Down
1 change: 1 addition & 0 deletions i18n/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Testbericht verzonden",
"campaigns.timestamps": "Tijdstippen",
"campaigns.trackLink": "Traceerbare link",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Bekeken",
"dashboard.campaignViews": "Campagneviews",
"dashboard.linkClicks": "Linkkliks",
Expand Down
1 change: 1 addition & 0 deletions i18n/pl.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Wiadomość testowa wysłana",
"campaigns.timestamps": "Sygnatury czasowe",
"campaigns.trackLink": "Link śledzący",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Wyświetlenia",
"dashboard.campaignViews": "Wyświetlenia kampanii",
"dashboard.linkClicks": "Kliknięcia linków",
Expand Down
1 change: 1 addition & 0 deletions i18n/pt-BR.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Mensagem de teste enviada",
"campaigns.timestamps": "Data e hora",
"campaigns.trackLink": "Link de rastreamento",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Visualizações",
"dashboard.campaignViews": "Visualizações da campanha",
"dashboard.linkClicks": "Links clicados",
Expand Down
1 change: 1 addition & 0 deletions i18n/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Mensagem de teste enviada",
"campaigns.timestamps": "Carimbo de hora",
"campaigns.trackLink": "Link de rastreamento",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Visualizações",
"dashboard.campaignViews": "Vista de campanhas",
"dashboard.linkClicks": "Cliques nos links",
Expand Down
1 change: 1 addition & 0 deletions i18n/ro.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"campaigns.testSent": "Mesaj de testare trimis",
"campaigns.timestamps": "Marcajele",
"campaigns.trackLink": "Track link-ul",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Vizualizări",
"dashboard.campaignViews": "Vizualizările campaniei",
"dashboard.linkClicks": "Clicuri pe link",
Expand Down
1 change: 1 addition & 0 deletions i18n/ru.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Тестовое сообщение отправлено",
"campaigns.timestamps": "Метки времени",
"campaigns.trackLink": "Ссылка на трек",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Просмотры",
"dashboard.campaignViews": "Просмотров кампаний",
"dashboard.linkClicks": "Кликов по ссылкам",
Expand Down
1 change: 1 addition & 0 deletions i18n/se.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Testmeddelande skickat",
"campaigns.timestamps": "Tidsstämplar",
"campaigns.trackLink": "Spåra länk",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Visningar",
"dashboard.campaignViews": "Visningar av kampanjer",
"dashboard.linkClicks": "Länkklickar",
Expand Down
1 change: 1 addition & 0 deletions i18n/sk.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Testovacia správa odoslaná",
"campaigns.timestamps": "Časové razítka",
"campaigns.trackLink": "Sledovací odkaz",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Zobrazenia",
"dashboard.campaignViews": "Zobrazenia kampane",
"dashboard.linkClicks": "Kliknutia na odkaz",
Expand Down
1 change: 1 addition & 0 deletions i18n/sl.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Poslano testno sporočilo",
"campaigns.timestamps": "Časovni žigi",
"campaigns.trackLink": "Sledenje povezavi",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Ogledi",
"dashboard.campaignViews": "Ogledi oglaševalske akcije",
"dashboard.linkClicks": "Kliki povezav",
Expand Down
1 change: 1 addition & 0 deletions i18n/tr.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"campaigns.testSent": "Test mesajı gönderildi",
"campaigns.timestamps": "Zaman etiketi",
"campaigns.trackLink": "İzleme bağlantısı",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Görüntülenme",
"dashboard.campaignViews": "Kampanya görüntülenme Sayısı",
"dashboard.linkClicks": "Linklerin tıklanması",
Expand Down
1 change: 1 addition & 0 deletions i18n/uk.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "Пробний лист надіслано",
"campaigns.timestamps": "Історія",
"campaigns.trackLink": "Відстежувати посилання",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Перегляди",
"dashboard.campaignViews": "Перегляди кампаній",
"dashboard.linkClicks": "Переходи за посиланнями",
Expand Down
1 change: 1 addition & 0 deletions i18n/vi.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"campaigns.testSent": "Gửi tin nhắn thử",
"campaigns.timestamps": "Dấu thời gian",
"campaigns.trackLink": "Theo dõi liên kết",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "Lượt xem",
"dashboard.campaignViews": "Chế độ xem chiến dịch",
"dashboard.linkClicks": "Liên kết nhấp chuột",
Expand Down
1 change: 1 addition & 0 deletions i18n/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
"campaigns.testSent": "已发送测试消息",
"campaigns.timestamps": "时间戳",
"campaigns.trackLink": "跟踪链接",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "视图",
"dashboard.campaignViews": "广告系列视图",
"dashboard.linkClicks": "链接点击次数",
Expand Down
1 change: 1 addition & 0 deletions i18n/zh-TW.json
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@
"campaigns.testSent": "測試電子郵件已寄送",
"campaigns.timestamps": "時間戳記",
"campaigns.trackLink": "追蹤連結",
"campaigns.unSchedule": "Unschedule",
"campaigns.views": "開信",
"dashboard.campaignViews": "活動開信",
"dashboard.linkClicks": "連結點擊次數",
Expand Down
3 changes: 1 addition & 2 deletions internal/core/campaigns.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ func (c *Core) CreateCampaign(o models.Campaign, listIDs []int, mediaIDs []int)
}

// UpdateCampaign updates a campaign.
func (c *Core) UpdateCampaign(id int, o models.Campaign, listIDs []int, mediaIDs []int, sendLater bool) (models.Campaign, error) {
func (c *Core) UpdateCampaign(id int, o models.Campaign, listIDs []int, mediaIDs []int) (models.Campaign, error) {
_, err := c.q.UpdateCampaign.Exec(id,
o.Name,
o.Subject,
Expand All @@ -217,7 +217,6 @@ func (c *Core) UpdateCampaign(id int, o models.Campaign, listIDs []int, mediaIDs
o.AltBody,
o.ContentType,
o.SendAt,
sendLater,
o.Headers,
pq.StringArray(normalizeTags(o.Tags)),
o.Messenger,
Expand Down
Loading
Loading