Refactor opt-in confirmation behaviour in subscriber update API.

- Updating a subscriber no longer triggers an opt-in confirmation mail
  as `POST /api/subscribers/:id/optin` allows that.
- A "Send opt-in confirmation" option is added to the subscriber
  update UI.

Closes #656.
This commit is contained in:
Kailash Nadh 2022-01-15 15:50:13 +05:30
parent c95427e299
commit 04ea18c87d
19 changed files with 63 additions and 8 deletions

View file

@ -367,10 +367,6 @@ func handleUpdateSubscriber(c echo.Context) error {
return err return err
} }
if !req.PreconfirmSubs && app.constants.SendOptinConfirmation {
_, _ = sendOptinConfirmation(sub, []int64(req.Lists), app)
}
return c.JSON(http.StatusOK, okResp{sub}) return c.JSON(http.StatusOK, okResp{sub})
} }

View file

@ -158,6 +158,9 @@ export const createSubscriber = (data) => http.post('/api/subscribers', data,
export const updateSubscriber = (data) => http.put(`/api/subscribers/${data.id}`, data, export const updateSubscriber = (data) => http.put(`/api/subscribers/${data.id}`, data,
{ loading: models.subscribers }); { loading: models.subscribers });
export const sendSubscriberOptin = (id) => http.post(`/api/subscribers/${id}/optin`, {},
{ loading: models.subscribers });
export const deleteSubscriber = (id) => http.delete(`/api/subscribers/${id}`, export const deleteSubscriber = (id) => http.delete(`/api/subscribers/${id}`,
{ loading: models.subscribers }); { loading: models.subscribers });

View file

@ -104,6 +104,10 @@ section {
} }
} }
.is-disabled {
opacity: 0.30;
}
.box { .box {
background: $white; background: $white;
box-shadow: 2px 2px 0 #f3f3f3; box-shadow: 2px 2px 0 #f3f3f3;

View file

@ -48,10 +48,22 @@
:all="lists.results" :all="lists.results"
></list-selector> ></list-selector>
<b-field :message="$t('subscribers.preconfirmHelp')"> <div class="columns mb-5">
<b-checkbox v-model="form.preconfirm" <div class="column is-7">
:native-value="true">{{ $t('subscribers.preconfirm') }}</b-checkbox> <b-field :message="$t('subscribers.preconfirmHelp')">
</b-field> <b-checkbox v-model="form.preconfirm"
:native-value="true" :disabled="!hasOptinList">
{{ $t('subscribers.preconfirm') }}
</b-checkbox>
</b-field>
</div>
<div class="column is-5 has-text-right" v-if="isEditing">
<a href="" @click.prevent="sendOptinConfirmation"
:class="{'is-disabled': !hasOptinList}">
<b-icon icon="email-outline" size="is-small" />
{{ $t('subscribers.sendOptinConfirm') }}</a>
</div>
</div>
<b-field :label="$t('subscribers.attribs')" label-position="on-border" <b-field :label="$t('subscribers.attribs')" label-position="on-border"
:message="$t('subscribers.attribsHelp') + ' ' + egAttribs"> :message="$t('subscribers.attribsHelp') + ' ' + egAttribs">
@ -250,6 +262,12 @@ export default Vue.extend({
}); });
}, },
sendOptinConfirmation() {
this.$api.sendSubscriberOptin(this.form.id).then(() => {
this.$utils.toast(this.$t('subscribers.sentOptinConfirm'));
});
},
validateAttribs(str) { validateAttribs(str) {
// Parse and validate attributes JSON. // Parse and validate attributes JSON.
let attribs = {}; let attribs = {};
@ -271,6 +289,10 @@ export default Vue.extend({
computed: { computed: {
...mapState(['lists', 'loading']), ...mapState(['lists', 'loading']),
hasOptinList() {
return this.form.lists.some((l) => l.optin === 'double');
},
}, },
mounted() { mounted() {

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail nebo jméno", "subscribers.queryPlaceholder": "E-mail nebo jméno",
"subscribers.reset": "Reset", "subscribers.reset": "Reset",
"subscribers.selectAll": "Vybrat vše {num}", "subscribers.selectAll": "Vybrat vše {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Uvedeno na seznamu blokovaných", "subscribers.status.blocklisted": "Uvedeno na seznamu blokovaných",
"subscribers.status.confirmed": "Potvrzeno", "subscribers.status.confirmed": "Potvrzeno",
"subscribers.status.enabled": "Povoleno", "subscribers.status.enabled": "Povoleno",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-Mail oder Name", "subscribers.queryPlaceholder": "E-Mail oder Name",
"subscribers.reset": "Zurücksetzen", "subscribers.reset": "Zurücksetzen",
"subscribers.selectAll": "Wähle alle {num}", "subscribers.selectAll": "Wähle alle {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Blockiert", "subscribers.status.blocklisted": "Blockiert",
"subscribers.status.confirmed": "Bestätigt", "subscribers.status.confirmed": "Bestätigt",
"subscribers.status.enabled": "Aktiviert", "subscribers.status.enabled": "Aktiviert",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail or name", "subscribers.queryPlaceholder": "E-mail or name",
"subscribers.reset": "Reset", "subscribers.reset": "Reset",
"subscribers.selectAll": "Select all {num}", "subscribers.selectAll": "Select all {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Blocklisted", "subscribers.status.blocklisted": "Blocklisted",
"subscribers.status.confirmed": "Confirmed", "subscribers.status.confirmed": "Confirmed",
"subscribers.status.enabled": "Enabled", "subscribers.status.enabled": "Enabled",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "Correo electrónico o nombre", "subscribers.queryPlaceholder": "Correo electrónico o nombre",
"subscribers.reset": "Restablecer", "subscribers.reset": "Restablecer",
"subscribers.selectAll": "Seleccionar todos {num}", "subscribers.selectAll": "Seleccionar todos {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Bloqueado", "subscribers.status.blocklisted": "Bloqueado",
"subscribers.status.confirmed": "Confirmado", "subscribers.status.confirmed": "Confirmado",
"subscribers.status.enabled": "Habilitado", "subscribers.status.enabled": "Habilitado",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "Email ou nom", "subscribers.queryPlaceholder": "Email ou nom",
"subscribers.reset": "Réinitialiser", "subscribers.reset": "Réinitialiser",
"subscribers.selectAll": "Sélectionner tout {num}", "subscribers.selectAll": "Sélectionner tout {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Bloqué·e", "subscribers.status.blocklisted": "Bloqué·e",
"subscribers.status.confirmed": "Confirmé·e", "subscribers.status.confirmed": "Confirmé·e",
"subscribers.status.enabled": "Activé·e", "subscribers.status.enabled": "Activé·e",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail vagy név", "subscribers.queryPlaceholder": "E-mail vagy név",
"subscribers.reset": "Visszaállítás", "subscribers.reset": "Visszaállítás",
"subscribers.selectAll": "Összes kijelölése {num}", "subscribers.selectAll": "Összes kijelölése {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Feketelistás", "subscribers.status.blocklisted": "Feketelistás",
"subscribers.status.confirmed": "Megerősített", "subscribers.status.confirmed": "Megerősített",
"subscribers.status.enabled": "Engedélyezve", "subscribers.status.enabled": "Engedélyezve",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "Email o nome", "subscribers.queryPlaceholder": "Email o nome",
"subscribers.reset": "Ripristina", "subscribers.reset": "Ripristina",
"subscribers.selectAll": "Seleziona tutto {num}", "subscribers.selectAll": "Seleziona tutto {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Lista bloccata", "subscribers.status.blocklisted": "Lista bloccata",
"subscribers.status.confirmed": "Confermato", "subscribers.status.confirmed": "Confermato",
"subscribers.status.enabled": "Attivata", "subscribers.status.enabled": "Attivata",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "പേരോ ഇ-മെയിൽ വിലാസമോ", "subscribers.queryPlaceholder": "പേരോ ഇ-മെയിൽ വിലാസമോ",
"subscribers.reset": "പുനഃസജ്ജമാക്കുക", "subscribers.reset": "പുനഃസജ്ജമാക്കുക",
"subscribers.selectAll": "{num} എല്ലാം തിരഞ്ഞടുക്കുക", "subscribers.selectAll": "{num} എല്ലാം തിരഞ്ഞടുക്കുക",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "തടയുന്ന പട്ടികയിൽ ചേർത്തു", "subscribers.status.blocklisted": "തടയുന്ന പട്ടികയിൽ ചേർത്തു",
"subscribers.status.confirmed": "Confirmed", "subscribers.status.confirmed": "Confirmed",
"subscribers.status.enabled": "പ്രവർത്തനക്ഷമാക്കി", "subscribers.status.enabled": "പ്രവർത്തനക്ഷമാക്കി",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail of naam", "subscribers.queryPlaceholder": "E-mail of naam",
"subscribers.reset": "Resetten", "subscribers.reset": "Resetten",
"subscribers.selectAll": "Selecteer alle {num}", "subscribers.selectAll": "Selecteer alle {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Geblokkeerd", "subscribers.status.blocklisted": "Geblokkeerd",
"subscribers.status.confirmed": "Bevestigd", "subscribers.status.confirmed": "Bevestigd",
"subscribers.status.enabled": "Geactiveerd", "subscribers.status.enabled": "Geactiveerd",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail lub nazwa", "subscribers.queryPlaceholder": "E-mail lub nazwa",
"subscribers.reset": "Resetuj", "subscribers.reset": "Resetuj",
"subscribers.selectAll": "Wybierz wszystkich {num}", "subscribers.selectAll": "Wybierz wszystkich {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Zablokowany", "subscribers.status.blocklisted": "Zablokowany",
"subscribers.status.confirmed": "Potwierdzony", "subscribers.status.confirmed": "Potwierdzony",
"subscribers.status.enabled": "Aktywny", "subscribers.status.enabled": "Aktywny",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail ou nome", "subscribers.queryPlaceholder": "E-mail ou nome",
"subscribers.reset": "Redefinir", "subscribers.reset": "Redefinir",
"subscribers.selectAll": "Selecionar todos {num}", "subscribers.selectAll": "Selecionar todos {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Lista de bloqueados", "subscribers.status.blocklisted": "Lista de bloqueados",
"subscribers.status.confirmed": "Confirmado", "subscribers.status.confirmed": "Confirmado",
"subscribers.status.enabled": "Habilitado", "subscribers.status.enabled": "Habilitado",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail ou nome", "subscribers.queryPlaceholder": "E-mail ou nome",
"subscribers.reset": "Repor", "subscribers.reset": "Repor",
"subscribers.selectAll": "Selecionar todos os {num}", "subscribers.selectAll": "Selecionar todos os {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Bloqueados", "subscribers.status.blocklisted": "Bloqueados",
"subscribers.status.confirmed": "Confirmado", "subscribers.status.confirmed": "Confirmado",
"subscribers.status.enabled": "Ativo", "subscribers.status.enabled": "Ativo",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "Email sau nume", "subscribers.queryPlaceholder": "Email sau nume",
"subscribers.reset": "Reset", "subscribers.reset": "Reset",
"subscribers.selectAll": "Selectează tot {număr}", "subscribers.selectAll": "Selectează tot {număr}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "În lista neagră", "subscribers.status.blocklisted": "În lista neagră",
"subscribers.status.confirmed": "Confirmat", "subscribers.status.confirmed": "Confirmat",
"subscribers.status.enabled": "Activfat", "subscribers.status.enabled": "Activfat",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-mail или имя", "subscribers.queryPlaceholder": "E-mail или имя",
"subscribers.reset": "Сброс", "subscribers.reset": "Сброс",
"subscribers.selectAll": "Выбрать все {num}", "subscribers.selectAll": "Выбрать все {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Заблокирован", "subscribers.status.blocklisted": "Заблокирован",
"subscribers.status.confirmed": "Подтверждён", "subscribers.status.confirmed": "Подтверждён",
"subscribers.status.enabled": "Включён", "subscribers.status.enabled": "Включён",

View file

@ -479,6 +479,8 @@
"subscribers.queryPlaceholder": "E-posta veya isim", "subscribers.queryPlaceholder": "E-posta veya isim",
"subscribers.reset": "Sıfırla", "subscribers.reset": "Sıfırla",
"subscribers.selectAll": "Select all {num}", "subscribers.selectAll": "Select all {num}",
"subscribers.sendOptinConfirm": "Send opt-in confirmation",
"subscribers.sentOptinConfirm": "Opt-in confirmation sent",
"subscribers.status.blocklisted": "Engellenmiş", "subscribers.status.blocklisted": "Engellenmiş",
"subscribers.status.confirmed": "Doğrulanmış", "subscribers.status.confirmed": "Doğrulanmış",
"subscribers.status.enabled": "Etkinleştirildi", "subscribers.status.enabled": "Etkinleştirildi",