Skip to content

Commit

Permalink
Merge pull request #2264 from knadh/edit-campaign
Browse files Browse the repository at this point in the history
Refactor campaign editing and status management.

- Add `Unschedule` button.
- Add `Start` button on paused campaigns.
- Make paused campaigns editable.
- Remove redundant API and query logic.
  • Loading branch information
knadh authored Jan 19, 2025
2 parents e8fd12b + 3d383cd commit 0e49a4b
Show file tree
Hide file tree
Showing 35 changed files with 77 additions and 30 deletions.
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

0 comments on commit 0e49a4b

Please sign in to comment.