2017-07-29 19:42:07 +00:00
'use strict' ;
import React , { Component } from 'react' ;
import PropTypes from 'prop-types' ;
import { translate , Trans } from 'react-i18next' ;
2017-07-30 13:22:07 +00:00
import { requiresAuthenticatedUser , withPageHelpers , Title , NavButton } from '../lib/page' ;
2017-07-29 19:42:07 +00:00
import {
2017-07-30 13:22:07 +00:00
withForm , Form , FormSendMethod , InputField , TextArea , TableSelect , ButtonRow , Button ,
Dropdown , StaticField , CheckBox
2017-07-29 19:42:07 +00:00
} from '../lib/form' ;
2017-08-11 16:16:44 +00:00
import { withErrorHandling } from '../lib/error-handling' ;
2017-07-30 13:22:07 +00:00
import { DeleteModalDialog } from '../lib/delete' ;
2017-07-29 19:42:07 +00:00
import { validateNamespace , NamespaceSelect } from '../lib/namespace' ;
import { UnsubscriptionMode } from '../../../shared/lists' ;
@ translate ( )
@ withForm
@ withPageHelpers
@ withErrorHandling
@ requiresAuthenticatedUser
export default class CUD extends Component {
constructor ( props ) {
super ( props ) ;
2017-07-30 13:22:07 +00:00
this . state = { } ;
2017-07-29 19:42:07 +00:00
this . initForm ( ) ;
}
static propTypes = {
2017-08-11 16:16:44 +00:00
action : PropTypes . string . isRequired ,
entity : PropTypes . object
2017-07-29 19:42:07 +00:00
}
2017-08-11 16:16:44 +00:00
2017-07-29 19:42:07 +00:00
componentDidMount ( ) {
2017-08-11 16:16:44 +00:00
if ( this . props . entity ) {
this . getFormValuesFromEntity ( this . props . entity , data => {
data . form = data . default _form ? 'custom' : 'default' ;
} ) ;
2017-07-29 19:42:07 +00:00
} else {
this . populateFormValues ( {
name : '' ,
description : '' ,
form : 'default' ,
default _form : null ,
public _subscribe : true ,
unsubscription _mode : UnsubscriptionMode . ONE _STEP ,
namespace : null
} ) ;
}
}
localValidateFormValues ( state ) {
const t = this . props . t ;
if ( ! state . getIn ( [ 'name' , 'value' ] ) ) {
state . setIn ( [ 'name' , 'error' ] , t ( 'Name must not be empty' ) ) ;
} else {
state . setIn ( [ 'name' , 'error' ] , null ) ;
}
if ( state . getIn ( [ 'form' , 'value' ] ) === 'custom' && ! state . getIn ( [ 'default_form' , 'value' ] ) ) {
state . setIn ( [ 'default_form' , 'error' ] , t ( 'Custom form must be selected' ) ) ;
} else {
state . setIn ( [ 'default_form' , 'error' ] , null ) ;
}
validateNamespace ( t , state ) ;
}
async submitHandler ( ) {
const t = this . props . t ;
let sendMethod , url ;
2017-08-11 16:16:44 +00:00
if ( this . props . entity ) {
2017-07-29 19:42:07 +00:00
sendMethod = FormSendMethod . PUT ;
2017-08-11 16:16:44 +00:00
url = ` /rest/lists/ ${ this . props . entity . id } `
2017-07-29 19:42:07 +00:00
} else {
sendMethod = FormSendMethod . POST ;
url = '/rest/lists'
}
this . disableForm ( ) ;
2017-08-14 20:53:29 +00:00
this . setFormStatusMessage ( 'info' , t ( 'Saving ...' ) ) ;
2017-07-29 19:42:07 +00:00
const submitSuccessful = await this . validateAndSendFormValuesToURL ( sendMethod , url , data => {
if ( data . form === 'default' ) {
data . default _form = null ;
}
2017-07-30 13:22:07 +00:00
delete data . form ;
2017-07-29 19:42:07 +00:00
} ) ;
if ( submitSuccessful ) {
this . navigateToWithFlashMessage ( '/lists' , 'success' , t ( 'List saved' ) ) ;
} else {
this . enableForm ( ) ;
this . setFormStatusMessage ( 'warning' , t ( 'There are errors in the form. Please fix them and submit again.' ) ) ;
}
}
render ( ) {
const t = this . props . t ;
2017-08-11 16:16:44 +00:00
const isEdit = ! ! this . props . entity ;
2017-07-29 19:42:07 +00:00
const unsubcriptionModeOptions = [
{
key : UnsubscriptionMode . ONE _STEP ,
label : t ( 'One-step (i.e. no email with confirmation link)' )
} ,
{
key : UnsubscriptionMode . ONE _STEP _WITH _FORM ,
label : t ( 'One-step with unsubscription form (i.e. no email with confirmation link)' )
} ,
{
key : UnsubscriptionMode . TWO _STEP ,
label : t ( 'Two-step (i.e. an email with confirmation link will be sent)' )
} ,
{
key : UnsubscriptionMode . TWO _STEP _WITH _FORM ,
label : t ( 'Two-step with unsubscription form (i.e. an email with confirmation link will be sent)' )
} ,
{
key : UnsubscriptionMode . MANUAL ,
label : t ( 'Manual (i.e. unsubscription has to be performed by the list administrator)' )
}
] ;
const formsOptions = [
{
key : 'default' ,
label : t ( 'Default Mailtrain Forms' )
} ,
{
key : 'custom' ,
label : t ( 'Custom Forms (select form below)' )
}
2017-08-11 16:16:44 +00:00
] ;
2017-07-29 19:42:07 +00:00
const customFormsColumns = [
{ data : 0 , title : "#" } ,
{ data : 1 , title : t ( 'Name' ) } ,
{ data : 2 , title : t ( 'Description' ) } ,
{ data : 3 , title : t ( 'Namespace' ) }
] ;
return (
< div >
2017-08-11 16:16:44 +00:00
{ isEdit &&
2017-07-30 13:22:07 +00:00
< DeleteModalDialog
stateOwner = { this }
2017-08-11 16:16:44 +00:00
visible = { this . props . action === 'delete' }
deleteUrl = { ` /rest/lists/ ${ this . props . entity . id } ` }
cudUrl = { ` /lists/ ${ this . props . entity . id } /edit ` }
2017-07-30 13:22:07 +00:00
listUrl = "/lists"
deletingMsg = { t ( 'Deleting list ...' ) }
deletedMsg = { t ( 'List deleted' ) } / >
2017-07-29 19:42:07 +00:00
}
2017-08-11 16:16:44 +00:00
< Title > { isEdit ? t ( 'Edit List' ) : t ( 'Create List' ) } < / T i t l e >
2017-07-29 19:42:07 +00:00
< Form stateOwner = { this } onSubmitAsync = { : : this . submitHandler } >
< InputField id = "name" label = { t ( 'Name' ) } / >
2017-08-11 16:16:44 +00:00
{ isEdit &&
2017-07-29 19:42:07 +00:00
< StaticField id = "cid" label = "List ID" help = { t ( 'This is the list ID displayed to the subscribers' ) } >
{ this . getFormValue ( 'cid' ) }
< / S t a t i c F i e l d >
}
< TextArea id = "description" label = { t ( 'Description' ) } help = { t ( 'HTML is allowed' ) } / >
< NamespaceSelect / >
< Dropdown id = "form" label = { t ( 'Forms' ) } options = { formsOptions } help = { t ( 'Web and email forms and templates used in subscription management process.' ) } / >
{ this . getFormValue ( 'form' ) === 'custom' &&
2017-08-11 16:16:44 +00:00
< TableSelect id = "default_form" label = { t ( 'Custom Forms' ) } withHeader dropdown dataUrl = '/rest/forms-table' columns = { customFormsColumns } selectionLabelIndex = { 1 } help = { < Trans > The custom form used for this list . You can create a form < a href = { ` /lists/forms/create/ ${ this . props . entity . id } ` } > here < / a > . < / T r a n s > } / >
2017-07-29 19:42:07 +00:00
}
< CheckBox id = "public_subscribe" label = { t ( 'Subscription' ) } text = { t ( 'Allow public users to subscribe themselves' ) } / >
< Dropdown id = "unsubscription_mode" label = { t ( 'Unsubscription' ) } options = { unsubcriptionModeOptions } help = { t ( 'Select how an unsuscription request by subscriber is handled.' ) } / >
< ButtonRow >
< Button type = "submit" className = "btn-primary" icon = "ok" label = { t ( 'Save' ) } / >
2017-08-11 16:16:44 +00:00
{ isEdit && < NavButton className = "btn-danger" icon = "remove" label = { t ( 'Delete' ) } linkTo = { ` /lists/ ${ this . props . entity . id } /delete ` } / > }
2017-07-29 19:42:07 +00:00
< / B u t t o n R o w >
< / F o r m >
< / d i v >
) ;
}
}