mirror of
https://github.com/knadh/listmonk.git
synced 2025-10-06 13:26:17 +08:00
Merge pull request #2264 from knadh/edit-campaign
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.
This commit is contained in:
commit
0e49a4bb7d
35 changed files with 77 additions and 30 deletions
|
@ -24,9 +24,6 @@ import (
|
||||||
type campaignReq struct {
|
type campaignReq struct {
|
||||||
models.Campaign
|
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
|
// This overrides Campaign.Lists to receive and
|
||||||
// write a list of int IDs during creation and updation.
|
// write a list of int IDs during creation and updation.
|
||||||
// Campaign.Lists is JSONText for sending lists children
|
// Campaign.Lists is JSONText for sending lists children
|
||||||
|
@ -251,7 +248,7 @@ func handleUpdateCampaign(c echo.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if isCampaignalMutable(cm.Status) {
|
if !canEditCampaign(cm.Status) {
|
||||||
return echo.NewHTTPError(http.StatusBadRequest, app.i18n.T("campaigns.cantUpdate"))
|
return echo.NewHTTPError(http.StatusBadRequest, app.i18n.T("campaigns.cantUpdate"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,7 +266,7 @@ func handleUpdateCampaign(c echo.Context) error {
|
||||||
o = c
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -600,12 +597,12 @@ func validateCampaignFields(c campaignReq, app *App) (campaignReq, error) {
|
||||||
return c, nil
|
return c, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// isCampaignalMutable tells if a campaign's in a state where it's
|
// canEditCampaign returns true if a campaign is in a status where updating
|
||||||
// properties can be mutated.
|
// its properties is allowed.
|
||||||
func isCampaignalMutable(status string) bool {
|
func canEditCampaign(status string) bool {
|
||||||
return status == models.CampaignStatusRunning ||
|
return status == models.CampaignStatusDraft ||
|
||||||
status == models.CampaignStatusCancelled ||
|
status == models.CampaignStatusPaused ||
|
||||||
status == models.CampaignStatusFinished
|
status == models.CampaignStatusScheduled
|
||||||
}
|
}
|
||||||
|
|
||||||
// makeOptinCampaignMessage makes a default opt-in campaign message body.
|
// makeOptinCampaignMessage makes a default opt-in campaign message body.
|
||||||
|
|
|
@ -43,6 +43,12 @@
|
||||||
{{ $t('campaigns.schedule') }}
|
{{ $t('campaigns.schedule') }}
|
||||||
</b-button>
|
</b-button>
|
||||||
</b-field>
|
</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>
|
</b-field>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -497,7 +503,6 @@ export default Vue.extend({
|
||||||
messenger: this.form.messenger,
|
messenger: this.form.messenger,
|
||||||
type: 'regular',
|
type: 'regular',
|
||||||
tags: this.form.tags,
|
tags: this.form.tags,
|
||||||
send_later: this.form.sendLater,
|
|
||||||
send_at: this.form.sendLater ? this.form.sendAtDate : null,
|
send_at: this.form.sendLater ? this.form.sendAtDate : null,
|
||||||
headers: this.form.headers,
|
headers: this.form.headers,
|
||||||
template_id: this.form.templateId,
|
template_id: this.form.templateId,
|
||||||
|
@ -521,7 +526,6 @@ export default Vue.extend({
|
||||||
messenger: this.form.messenger,
|
messenger: this.form.messenger,
|
||||||
type: 'regular',
|
type: 'regular',
|
||||||
tags: this.form.tags,
|
tags: this.form.tags,
|
||||||
send_later: this.form.sendLater,
|
|
||||||
send_at: this.form.sendLater ? this.form.sendAtDate : null,
|
send_at: this.form.sendLater ? this.form.sendAtDate : null,
|
||||||
headers: this.form.headers,
|
headers: this.form.headers,
|
||||||
template_id: this.form.templateId,
|
template_id: this.form.templateId,
|
||||||
|
@ -595,6 +599,13 @@ export default Vue.extend({
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
unscheduleCampaign() {
|
||||||
|
this.$api.changeCampaignStatus(this.data.id, 'draft').then((d) => {
|
||||||
|
this.data = d;
|
||||||
|
this.form.archiveSlug = d.archiveSlug;
|
||||||
|
});
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
|
@ -602,15 +613,19 @@ export default Vue.extend({
|
||||||
|
|
||||||
canEdit() {
|
canEdit() {
|
||||||
return this.isNew
|
return this.isNew
|
||||||
|| this.data.status === 'draft' || this.data.status === 'scheduled';
|
|| this.data.status === 'draft' || this.data.status === 'scheduled' || this.data.status === 'paused';
|
||||||
},
|
},
|
||||||
|
|
||||||
canSchedule() {
|
canSchedule() {
|
||||||
return this.data.status === 'draft' && this.data.sendAt;
|
return this.data.status === 'draft' && this.data.sendAt;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
canUnSchedule() {
|
||||||
|
return this.data.status === 'scheduled' && this.data.sendAt;
|
||||||
|
},
|
||||||
|
|
||||||
canStart() {
|
canStart() {
|
||||||
return this.data.status === 'draft' && !this.data.sendAt;
|
return this.data.status === 'draft' || this.data.status === 'paused';
|
||||||
},
|
},
|
||||||
|
|
||||||
canArchive() {
|
canArchive() {
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "S'ha enviat el missatge de prova",
|
"campaigns.testSent": "S'ha enviat el missatge de prova",
|
||||||
"campaigns.timestamps": "Segells de temps",
|
"campaigns.timestamps": "Segells de temps",
|
||||||
"campaigns.trackLink": "Enllaç de seguiment",
|
"campaigns.trackLink": "Enllaç de seguiment",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Visualitzacions",
|
"campaigns.views": "Visualitzacions",
|
||||||
"dashboard.campaignViews": "Visualitzacions de la campanya",
|
"dashboard.campaignViews": "Visualitzacions de la campanya",
|
||||||
"dashboard.linkClicks": "Clics a enllaços",
|
"dashboard.linkClicks": "Clics a enllaços",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Testovací zpráva odeslána",
|
"campaigns.testSent": "Testovací zpráva odeslána",
|
||||||
"campaigns.timestamps": "Časová razítka",
|
"campaigns.timestamps": "Časová razítka",
|
||||||
"campaigns.trackLink": "Sledovací odkaz",
|
"campaigns.trackLink": "Sledovací odkaz",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Pohledy",
|
"campaigns.views": "Pohledy",
|
||||||
"dashboard.campaignViews": "Pohledy na kampaň",
|
"dashboard.campaignViews": "Pohledy na kampaň",
|
||||||
"dashboard.linkClicks": "Klepnutí na odkaz",
|
"dashboard.linkClicks": "Klepnutí na odkaz",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Wedi anfon neges brawf",
|
"campaigns.testSent": "Wedi anfon neges brawf",
|
||||||
"campaigns.timestamps": "Stamp amser",
|
"campaigns.timestamps": "Stamp amser",
|
||||||
"campaigns.trackLink": "Olrhain dolen",
|
"campaigns.trackLink": "Olrhain dolen",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Nifer y bobl sydd wedi'i gweld",
|
"campaigns.views": "Nifer y bobl sydd wedi'i gweld",
|
||||||
"dashboard.campaignViews": "Nifer y bobl sydd wedi gweld yr ymgyrch",
|
"dashboard.campaignViews": "Nifer y bobl sydd wedi gweld yr ymgyrch",
|
||||||
"dashboard.linkClicks": "Nifer y bobl sydd wedi clicio'r ddolen",
|
"dashboard.linkClicks": "Nifer y bobl sydd wedi clicio'r ddolen",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Testmeddelelse sendt",
|
"campaigns.testSent": "Testmeddelelse sendt",
|
||||||
"campaigns.timestamps": "Tidsstempler",
|
"campaigns.timestamps": "Tidsstempler",
|
||||||
"campaigns.trackLink": "Link til spor",
|
"campaigns.trackLink": "Link til spor",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Udsigt over",
|
"campaigns.views": "Udsigt over",
|
||||||
"dashboard.campaignViews": "Kampagnevisninger",
|
"dashboard.campaignViews": "Kampagnevisninger",
|
||||||
"dashboard.linkClicks": "Klik på link",
|
"dashboard.linkClicks": "Klik på link",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Testnachricht gesendet",
|
"campaigns.testSent": "Testnachricht gesendet",
|
||||||
"campaigns.timestamps": "Zeitstempel",
|
"campaigns.timestamps": "Zeitstempel",
|
||||||
"campaigns.trackLink": "Track Link",
|
"campaigns.trackLink": "Track Link",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Ansichten",
|
"campaigns.views": "Ansichten",
|
||||||
"dashboard.campaignViews": "Kampagnenansichten",
|
"dashboard.campaignViews": "Kampagnenansichten",
|
||||||
"dashboard.linkClicks": "Linkklicks",
|
"dashboard.linkClicks": "Linkklicks",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Το δοκιμαστικό μήνυμα στάλθηκε",
|
"campaigns.testSent": "Το δοκιμαστικό μήνυμα στάλθηκε",
|
||||||
"campaigns.timestamps": "Χρονοσήματα",
|
"campaigns.timestamps": "Χρονοσήματα",
|
||||||
"campaigns.trackLink": "Σύνδεσμος παρακολούθησης",
|
"campaigns.trackLink": "Σύνδεσμος παρακολούθησης",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Προβολές",
|
"campaigns.views": "Προβολές",
|
||||||
"dashboard.campaignViews": "Προβολές εκστρατειών",
|
"dashboard.campaignViews": "Προβολές εκστρατειών",
|
||||||
"dashboard.linkClicks": "Κλικ συνδέσμων",
|
"dashboard.linkClicks": "Κλικ συνδέσμων",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Test message sent",
|
"campaigns.testSent": "Test message sent",
|
||||||
"campaigns.timestamps": "Timestamps",
|
"campaigns.timestamps": "Timestamps",
|
||||||
"campaigns.trackLink": "Track link",
|
"campaigns.trackLink": "Track link",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Views",
|
"campaigns.views": "Views",
|
||||||
"dashboard.campaignViews": "Campaign views",
|
"dashboard.campaignViews": "Campaign views",
|
||||||
"dashboard.linkClicks": "Link clicks",
|
"dashboard.linkClicks": "Link clicks",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "S'ha enviat el missatge de prova",
|
"campaigns.testSent": "S'ha enviat el missatge de prova",
|
||||||
"campaigns.timestamps": "Segells de temps",
|
"campaigns.timestamps": "Segells de temps",
|
||||||
"campaigns.trackLink": "Enllaç de seguiment",
|
"campaigns.trackLink": "Enllaç de seguiment",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Visualitzacions",
|
"campaigns.views": "Visualitzacions",
|
||||||
"dashboard.campaignViews": "Visualitzacions de la campanya",
|
"dashboard.campaignViews": "Visualitzacions de la campanya",
|
||||||
"dashboard.linkClicks": "Clics a enllaços",
|
"dashboard.linkClicks": "Clics a enllaços",
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
"campaigns.testSent": "Mensaje de prueba enviado",
|
"campaigns.testSent": "Mensaje de prueba enviado",
|
||||||
"campaigns.timestamps": "Marcas de tiempo",
|
"campaigns.timestamps": "Marcas de tiempo",
|
||||||
"campaigns.trackLink": "Enlace de rastreo (Track link)",
|
"campaigns.trackLink": "Enlace de rastreo (Track link)",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Vistas",
|
"campaigns.views": "Vistas",
|
||||||
"dashboard.campaignViews": "Vista de campaña",
|
"dashboard.campaignViews": "Vista de campaña",
|
||||||
"dashboard.linkClicks": "Enlaces cliqueados",
|
"dashboard.linkClicks": "Enlaces cliqueados",
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
"campaigns.testSent": "Testiviesti lähetetty",
|
"campaigns.testSent": "Testiviesti lähetetty",
|
||||||
"campaigns.timestamps": "Aikaleimat",
|
"campaigns.timestamps": "Aikaleimat",
|
||||||
"campaigns.trackLink": "Seuraa linkkejä",
|
"campaigns.trackLink": "Seuraa linkkejä",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Katselukerrat",
|
"campaigns.views": "Katselukerrat",
|
||||||
"dashboard.campaignViews": "Kampanjan katselukerrat",
|
"dashboard.campaignViews": "Kampanjan katselukerrat",
|
||||||
"dashboard.linkClicks": "Linkkiklikkaukset",
|
"dashboard.linkClicks": "Linkkiklikkaukset",
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
"campaigns.testSent": "Message de test envoyé",
|
"campaigns.testSent": "Message de test envoyé",
|
||||||
"campaigns.timestamps": "Horodatages",
|
"campaigns.timestamps": "Horodatages",
|
||||||
"campaigns.trackLink": "Lien de suivi",
|
"campaigns.trackLink": "Lien de suivi",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Vues",
|
"campaigns.views": "Vues",
|
||||||
"dashboard.campaignViews": "vues de campagne",
|
"dashboard.campaignViews": "vues de campagne",
|
||||||
"dashboard.linkClicks": "clics sur liens",
|
"dashboard.linkClicks": "clics sur liens",
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
"campaigns.testSent": "Message de test envoyé",
|
"campaigns.testSent": "Message de test envoyé",
|
||||||
"campaigns.timestamps": "Horodatages",
|
"campaigns.timestamps": "Horodatages",
|
||||||
"campaigns.trackLink": "Lien de suivi",
|
"campaigns.trackLink": "Lien de suivi",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Vues",
|
"campaigns.views": "Vues",
|
||||||
"dashboard.campaignViews": "vues de campagne",
|
"dashboard.campaignViews": "vues de campagne",
|
||||||
"dashboard.linkClicks": "clics sur liens",
|
"dashboard.linkClicks": "clics sur liens",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "הודעת בדיקה נשלחה",
|
"campaigns.testSent": "הודעת בדיקה נשלחה",
|
||||||
"campaigns.timestamps": "חותמות זמן",
|
"campaigns.timestamps": "חותמות זמן",
|
||||||
"campaigns.trackLink": "קישור מעקב",
|
"campaigns.trackLink": "קישור מעקב",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "צפיות",
|
"campaigns.views": "צפיות",
|
||||||
"dashboard.campaignViews": "צפיות בקמפיין",
|
"dashboard.campaignViews": "צפיות בקמפיין",
|
||||||
"dashboard.linkClicks": "לחיצות על קישורים",
|
"dashboard.linkClicks": "לחיצות על קישורים",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Tesztüzenet elküldve",
|
"campaigns.testSent": "Tesztüzenet elküldve",
|
||||||
"campaigns.timestamps": "Időbélyegek",
|
"campaigns.timestamps": "Időbélyegek",
|
||||||
"campaigns.trackLink": "Nyomkövetőhivatkozás",
|
"campaigns.trackLink": "Nyomkövetőhivatkozás",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Megtekintések",
|
"campaigns.views": "Megtekintések",
|
||||||
"dashboard.campaignViews": "Megtekintések",
|
"dashboard.campaignViews": "Megtekintések",
|
||||||
"dashboard.linkClicks": "Kattintások",
|
"dashboard.linkClicks": "Kattintások",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Messaggio di prova inviato",
|
"campaigns.testSent": "Messaggio di prova inviato",
|
||||||
"campaigns.timestamps": "Marcatura temporale ",
|
"campaigns.timestamps": "Marcatura temporale ",
|
||||||
"campaigns.trackLink": "Link di tracciamento",
|
"campaigns.trackLink": "Link di tracciamento",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Visualizzazioni",
|
"campaigns.views": "Visualizzazioni",
|
||||||
"dashboard.campaignViews": "Visualizzazioni della campagna",
|
"dashboard.campaignViews": "Visualizzazioni della campagna",
|
||||||
"dashboard.linkClicks": "Clic sui link",
|
"dashboard.linkClicks": "Clic sui link",
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
"campaigns.testSent": "テストメッセージ送信済み",
|
"campaigns.testSent": "テストメッセージ送信済み",
|
||||||
"campaigns.timestamps": "タイムスタンプ",
|
"campaigns.timestamps": "タイムスタンプ",
|
||||||
"campaigns.trackLink": "リンクの追跡",
|
"campaigns.trackLink": "リンクの追跡",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "ビュー",
|
"campaigns.views": "ビュー",
|
||||||
"dashboard.campaignViews": "キャンペーンビュー",
|
"dashboard.campaignViews": "キャンペーンビュー",
|
||||||
"dashboard.linkClicks": "リンクのクリック",
|
"dashboard.linkClicks": "リンクのクリック",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "പരീക്ഷണ സന്ദേശം അയച്ചു",
|
"campaigns.testSent": "പരീക്ഷണ സന്ദേശം അയച്ചു",
|
||||||
"campaigns.timestamps": "ടൈംസ്റ്റാമ്പുകൾ",
|
"campaigns.timestamps": "ടൈംസ്റ്റാമ്പുകൾ",
|
||||||
"campaigns.trackLink": "ട്രാക്ക് ലിങ്ക്",
|
"campaigns.trackLink": "ട്രാക്ക് ലിങ്ക്",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "കാഴ്ചകൾ",
|
"campaigns.views": "കാഴ്ചകൾ",
|
||||||
"dashboard.campaignViews": "ക്യാമ്പേയ്ൻ കാഴ്ചകൾ",
|
"dashboard.campaignViews": "ക്യാമ്പേയ്ൻ കാഴ്ചകൾ",
|
||||||
"dashboard.linkClicks": "ലിങ്ക് ക്ലിക്കുകൾ",
|
"dashboard.linkClicks": "ലിങ്ക് ക്ലിക്കുകൾ",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Testbericht verzonden",
|
"campaigns.testSent": "Testbericht verzonden",
|
||||||
"campaigns.timestamps": "Tijdstippen",
|
"campaigns.timestamps": "Tijdstippen",
|
||||||
"campaigns.trackLink": "Traceerbare link",
|
"campaigns.trackLink": "Traceerbare link",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Bekeken",
|
"campaigns.views": "Bekeken",
|
||||||
"dashboard.campaignViews": "Campagneviews",
|
"dashboard.campaignViews": "Campagneviews",
|
||||||
"dashboard.linkClicks": "Linkkliks",
|
"dashboard.linkClicks": "Linkkliks",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Wiadomość testowa wysłana",
|
"campaigns.testSent": "Wiadomość testowa wysłana",
|
||||||
"campaigns.timestamps": "Sygnatury czasowe",
|
"campaigns.timestamps": "Sygnatury czasowe",
|
||||||
"campaigns.trackLink": "Link śledzący",
|
"campaigns.trackLink": "Link śledzący",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Wyświetlenia",
|
"campaigns.views": "Wyświetlenia",
|
||||||
"dashboard.campaignViews": "Wyświetlenia kampanii",
|
"dashboard.campaignViews": "Wyświetlenia kampanii",
|
||||||
"dashboard.linkClicks": "Kliknięcia linków",
|
"dashboard.linkClicks": "Kliknięcia linków",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Mensagem de teste enviada",
|
"campaigns.testSent": "Mensagem de teste enviada",
|
||||||
"campaigns.timestamps": "Data e hora",
|
"campaigns.timestamps": "Data e hora",
|
||||||
"campaigns.trackLink": "Link de rastreamento",
|
"campaigns.trackLink": "Link de rastreamento",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Visualizações",
|
"campaigns.views": "Visualizações",
|
||||||
"dashboard.campaignViews": "Visualizações da campanha",
|
"dashboard.campaignViews": "Visualizações da campanha",
|
||||||
"dashboard.linkClicks": "Links clicados",
|
"dashboard.linkClicks": "Links clicados",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Mensagem de teste enviada",
|
"campaigns.testSent": "Mensagem de teste enviada",
|
||||||
"campaigns.timestamps": "Carimbo de hora",
|
"campaigns.timestamps": "Carimbo de hora",
|
||||||
"campaigns.trackLink": "Link de rastreamento",
|
"campaigns.trackLink": "Link de rastreamento",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Visualizações",
|
"campaigns.views": "Visualizações",
|
||||||
"dashboard.campaignViews": "Vista de campanhas",
|
"dashboard.campaignViews": "Vista de campanhas",
|
||||||
"dashboard.linkClicks": "Cliques nos links",
|
"dashboard.linkClicks": "Cliques nos links",
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
"campaigns.testSent": "Mesaj de testare trimis",
|
"campaigns.testSent": "Mesaj de testare trimis",
|
||||||
"campaigns.timestamps": "Marcajele",
|
"campaigns.timestamps": "Marcajele",
|
||||||
"campaigns.trackLink": "Track link-ul",
|
"campaigns.trackLink": "Track link-ul",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Vizualizări",
|
"campaigns.views": "Vizualizări",
|
||||||
"dashboard.campaignViews": "Vizualizările campaniei",
|
"dashboard.campaignViews": "Vizualizările campaniei",
|
||||||
"dashboard.linkClicks": "Clicuri pe link",
|
"dashboard.linkClicks": "Clicuri pe link",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Тестовое сообщение отправлено",
|
"campaigns.testSent": "Тестовое сообщение отправлено",
|
||||||
"campaigns.timestamps": "Метки времени",
|
"campaigns.timestamps": "Метки времени",
|
||||||
"campaigns.trackLink": "Ссылка на трек",
|
"campaigns.trackLink": "Ссылка на трек",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Просмотры",
|
"campaigns.views": "Просмотры",
|
||||||
"dashboard.campaignViews": "Просмотров кампаний",
|
"dashboard.campaignViews": "Просмотров кампаний",
|
||||||
"dashboard.linkClicks": "Кликов по ссылкам",
|
"dashboard.linkClicks": "Кликов по ссылкам",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Testmeddelande skickat",
|
"campaigns.testSent": "Testmeddelande skickat",
|
||||||
"campaigns.timestamps": "Tidsstämplar",
|
"campaigns.timestamps": "Tidsstämplar",
|
||||||
"campaigns.trackLink": "Spåra länk",
|
"campaigns.trackLink": "Spåra länk",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Visningar",
|
"campaigns.views": "Visningar",
|
||||||
"dashboard.campaignViews": "Visningar av kampanjer",
|
"dashboard.campaignViews": "Visningar av kampanjer",
|
||||||
"dashboard.linkClicks": "Länkklickar",
|
"dashboard.linkClicks": "Länkklickar",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Testovacia správa odoslaná",
|
"campaigns.testSent": "Testovacia správa odoslaná",
|
||||||
"campaigns.timestamps": "Časové razítka",
|
"campaigns.timestamps": "Časové razítka",
|
||||||
"campaigns.trackLink": "Sledovací odkaz",
|
"campaigns.trackLink": "Sledovací odkaz",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Zobrazenia",
|
"campaigns.views": "Zobrazenia",
|
||||||
"dashboard.campaignViews": "Zobrazenia kampane",
|
"dashboard.campaignViews": "Zobrazenia kampane",
|
||||||
"dashboard.linkClicks": "Kliknutia na odkaz",
|
"dashboard.linkClicks": "Kliknutia na odkaz",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Poslano testno sporočilo",
|
"campaigns.testSent": "Poslano testno sporočilo",
|
||||||
"campaigns.timestamps": "Časovni žigi",
|
"campaigns.timestamps": "Časovni žigi",
|
||||||
"campaigns.trackLink": "Sledenje povezavi",
|
"campaigns.trackLink": "Sledenje povezavi",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Ogledi",
|
"campaigns.views": "Ogledi",
|
||||||
"dashboard.campaignViews": "Ogledi oglaševalske akcije",
|
"dashboard.campaignViews": "Ogledi oglaševalske akcije",
|
||||||
"dashboard.linkClicks": "Kliki povezav",
|
"dashboard.linkClicks": "Kliki povezav",
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
"campaigns.testSent": "Test mesajı gönderildi",
|
"campaigns.testSent": "Test mesajı gönderildi",
|
||||||
"campaigns.timestamps": "Zaman etiketi",
|
"campaigns.timestamps": "Zaman etiketi",
|
||||||
"campaigns.trackLink": "İzleme bağlantısı",
|
"campaigns.trackLink": "İzleme bağlantısı",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Görüntülenme",
|
"campaigns.views": "Görüntülenme",
|
||||||
"dashboard.campaignViews": "Kampanya görüntülenme Sayısı",
|
"dashboard.campaignViews": "Kampanya görüntülenme Sayısı",
|
||||||
"dashboard.linkClicks": "Linklerin tıklanması",
|
"dashboard.linkClicks": "Linklerin tıklanması",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "Пробний лист надіслано",
|
"campaigns.testSent": "Пробний лист надіслано",
|
||||||
"campaigns.timestamps": "Історія",
|
"campaigns.timestamps": "Історія",
|
||||||
"campaigns.trackLink": "Відстежувати посилання",
|
"campaigns.trackLink": "Відстежувати посилання",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Перегляди",
|
"campaigns.views": "Перегляди",
|
||||||
"dashboard.campaignViews": "Перегляди кампаній",
|
"dashboard.campaignViews": "Перегляди кампаній",
|
||||||
"dashboard.linkClicks": "Переходи за посиланнями",
|
"dashboard.linkClicks": "Переходи за посиланнями",
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
"campaigns.testSent": "Gửi tin nhắn thử",
|
"campaigns.testSent": "Gửi tin nhắn thử",
|
||||||
"campaigns.timestamps": "Dấu thời gian",
|
"campaigns.timestamps": "Dấu thời gian",
|
||||||
"campaigns.trackLink": "Theo dõi liên kết",
|
"campaigns.trackLink": "Theo dõi liên kết",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "Lượt xem",
|
"campaigns.views": "Lượt xem",
|
||||||
"dashboard.campaignViews": "Chế độ xem chiến dịch",
|
"dashboard.campaignViews": "Chế độ xem chiến dịch",
|
||||||
"dashboard.linkClicks": "Liên kết nhấp chuột",
|
"dashboard.linkClicks": "Liên kết nhấp chuột",
|
||||||
|
|
|
@ -98,6 +98,7 @@
|
||||||
"campaigns.testSent": "已发送测试消息",
|
"campaigns.testSent": "已发送测试消息",
|
||||||
"campaigns.timestamps": "时间戳",
|
"campaigns.timestamps": "时间戳",
|
||||||
"campaigns.trackLink": "跟踪链接",
|
"campaigns.trackLink": "跟踪链接",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "视图",
|
"campaigns.views": "视图",
|
||||||
"dashboard.campaignViews": "广告系列视图",
|
"dashboard.campaignViews": "广告系列视图",
|
||||||
"dashboard.linkClicks": "链接点击次数",
|
"dashboard.linkClicks": "链接点击次数",
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
"campaigns.testSent": "測試電子郵件已寄送",
|
"campaigns.testSent": "測試電子郵件已寄送",
|
||||||
"campaigns.timestamps": "時間戳記",
|
"campaigns.timestamps": "時間戳記",
|
||||||
"campaigns.trackLink": "追蹤連結",
|
"campaigns.trackLink": "追蹤連結",
|
||||||
|
"campaigns.unSchedule": "Unschedule",
|
||||||
"campaigns.views": "開信",
|
"campaigns.views": "開信",
|
||||||
"dashboard.campaignViews": "活動開信",
|
"dashboard.campaignViews": "活動開信",
|
||||||
"dashboard.linkClicks": "連結點擊次數",
|
"dashboard.linkClicks": "連結點擊次數",
|
||||||
|
|
|
@ -208,7 +208,7 @@ func (c *Core) CreateCampaign(o models.Campaign, listIDs []int, mediaIDs []int)
|
||||||
}
|
}
|
||||||
|
|
||||||
// UpdateCampaign updates a campaign.
|
// 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,
|
_, err := c.q.UpdateCampaign.Exec(id,
|
||||||
o.Name,
|
o.Name,
|
||||||
o.Subject,
|
o.Subject,
|
||||||
|
@ -217,7 +217,6 @@ func (c *Core) UpdateCampaign(id int, o models.Campaign, listIDs []int, mediaIDs
|
||||||
o.AltBody,
|
o.AltBody,
|
||||||
o.ContentType,
|
o.ContentType,
|
||||||
o.SendAt,
|
o.SendAt,
|
||||||
sendLater,
|
|
||||||
o.Headers,
|
o.Headers,
|
||||||
pq.StringArray(normalizeTags(o.Tags)),
|
pq.StringArray(normalizeTags(o.Tags)),
|
||||||
o.Messenger,
|
o.Messenger,
|
||||||
|
|
31
queries.sql
31
queries.sql
|
@ -830,33 +830,38 @@ WITH camp AS (
|
||||||
altbody=(CASE WHEN $6 = '' THEN NULL ELSE $6 END),
|
altbody=(CASE WHEN $6 = '' THEN NULL ELSE $6 END),
|
||||||
content_type=$7::content_type,
|
content_type=$7::content_type,
|
||||||
send_at=$8::TIMESTAMP WITH TIME ZONE,
|
send_at=$8::TIMESTAMP WITH TIME ZONE,
|
||||||
status=(CASE WHEN NOT $9 THEN 'draft' ELSE status END),
|
status=(
|
||||||
headers=$10,
|
CASE
|
||||||
tags=$11::VARCHAR(100)[],
|
WHEN status = 'scheduled' AND $8 IS NULL THEN 'draft'
|
||||||
messenger=$12,
|
ELSE status
|
||||||
template_id=$13,
|
END
|
||||||
archive=$15,
|
),
|
||||||
archive_slug=$16,
|
headers=$9,
|
||||||
archive_template_id=$17,
|
tags=$10::VARCHAR(100)[],
|
||||||
archive_meta=$18,
|
messenger=$11,
|
||||||
|
template_id=$12,
|
||||||
|
archive=$14,
|
||||||
|
archive_slug=$15,
|
||||||
|
archive_template_id=$16,
|
||||||
|
archive_meta=$17,
|
||||||
updated_at=NOW()
|
updated_at=NOW()
|
||||||
WHERE id = $1 RETURNING id
|
WHERE id = $1 RETURNING id
|
||||||
),
|
),
|
||||||
clists AS (
|
clists AS (
|
||||||
-- Reset list relationships
|
-- Reset list relationships
|
||||||
DELETE FROM campaign_lists WHERE campaign_id = $1 AND NOT(list_id = ANY($14))
|
DELETE FROM campaign_lists WHERE campaign_id = $1 AND NOT(list_id = ANY($13))
|
||||||
),
|
),
|
||||||
med AS (
|
med AS (
|
||||||
DELETE FROM campaign_media WHERE campaign_id = $1
|
DELETE FROM campaign_media WHERE campaign_id = $1
|
||||||
AND ( media_id IS NULL or NOT(media_id = ANY($19))) RETURNING media_id
|
AND ( media_id IS NULL or NOT(media_id = ANY($18))) RETURNING media_id
|
||||||
),
|
),
|
||||||
medi AS (
|
medi AS (
|
||||||
INSERT INTO campaign_media (campaign_id, media_id, filename)
|
INSERT INTO campaign_media (campaign_id, media_id, filename)
|
||||||
(SELECT $1 AS campaign_id, id, filename FROM media WHERE id=ANY($19::INT[]))
|
(SELECT $1 AS campaign_id, id, filename FROM media WHERE id=ANY($18::INT[]))
|
||||||
ON CONFLICT (campaign_id, media_id) DO NOTHING
|
ON CONFLICT (campaign_id, media_id) DO NOTHING
|
||||||
)
|
)
|
||||||
INSERT INTO campaign_lists (campaign_id, list_id, list_name)
|
INSERT INTO campaign_lists (campaign_id, list_id, list_name)
|
||||||
(SELECT $1 as campaign_id, id, name FROM lists WHERE id=ANY($14::INT[]))
|
(SELECT $1 as campaign_id, id, name FROM lists WHERE id=ANY($13::INT[]))
|
||||||
ON CONFLICT (campaign_id, list_id) DO UPDATE SET list_name = EXCLUDED.list_name;
|
ON CONFLICT (campaign_id, list_id) DO UPDATE SET list_name = EXCLUDED.list_name;
|
||||||
|
|
||||||
-- name: update-campaign-counts
|
-- name: update-campaign-counts
|
||||||
|
|
Loading…
Add table
Reference in a new issue