diff --git a/client/src/account/API.js b/client/src/account/API.js index 724433ec..a712bb7b 100644 --- a/client/src/account/API.js +++ b/client/src/account/API.js @@ -3,17 +3,9 @@ import React, {Component} from 'react'; import {withTranslation} from '../lib/i18n'; import {Trans} from 'react-i18next'; -import { - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page' -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; -import axios - from '../lib/axios'; +import {requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page' +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; +import axios from '../lib/axios'; import {Button} from '../lib/bootstrap-components'; import {getUrl} from "../lib/urls"; import {withComponentMixins} from "../lib/decorator-helpers"; diff --git a/client/src/account/Account.js b/client/src/account/Account.js index 082238cd..38ad8469 100644 --- a/client/src/account/Account.js +++ b/client/src/account/Account.js @@ -3,30 +3,22 @@ import React, {Component} from 'react'; import {withTranslation} from '../lib/i18n'; import {Trans} from 'react-i18next'; -import { - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page' +import {requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page' import { Button, ButtonRow, Fieldset, + filterData, Form, FormSendMethod, InputField, - withForm + withForm, + withFormErrorHandlers } from '../lib/form'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; -import passwordValidator - from '../../../shared/password-validator'; -import interoperableErrors - from '../../../shared/interoperable-errors'; -import mailtrainConfig - from 'mailtrainConfig'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; +import passwordValidator from '../../../shared/password-validator'; +import interoperableErrors from '../../../shared/interoperable-errors'; +import mailtrainConfig from 'mailtrainConfig'; import {withComponentMixins} from "../lib/decorator-helpers"; @withComponentMixins([ @@ -45,6 +37,8 @@ export default class Account extends Component { this.state = {}; this.initForm({ + loadMutator: ::this.getFormValuesMutator, + submitMutator: ::this.submitFormValuesMutator, serverValidation: { url: 'rest/account-validate', changed: ['email', 'currentPassword'] @@ -52,13 +46,19 @@ export default class Account extends Component { }); } + getFormValuesMutator(data) { + data.password = ''; + data.password2 = ''; + data.currentPassword = ''; + } + + submitFormValuesMutator(data) { + return filterData(data, ['name', 'email', 'password', 'currentPassword']); + } + @withAsyncErrorHandler async loadFormValues() { - await this.getFormValuesFromURL('rest/account', data => { - data.password = ''; - data.password2 = ''; - data.currentPassword = ''; - }); + await this.getFormValuesFromURL('rest/account'); } componentDidMount() { @@ -127,6 +127,7 @@ export default class Account extends Component { state.setIn(['password2', 'error'], password !== password2 ? t('passwordsMustMatch') : null); } + @withFormErrorHandlers async submitHandler() { const t = this.props.t; @@ -134,9 +135,7 @@ export default class Account extends Component { this.disableForm(); this.setFormStatusMessage('info', t('updatingUserProfile')); - const submitSuccessful = await this.validateAndSendFormValuesToURL(FormSendMethod.POST, 'rest/account', data => { - delete data.password2; - }); + const submitSuccessful = await this.validateAndSendFormValuesToURL(FormSendMethod.POST, 'rest/account'); if (submitSuccessful) { this.setFlashMessage('success', t('userProfileUpdated')); diff --git a/client/src/account/root.js b/client/src/account/root.js index 90fd09ec..a5c666ff 100644 --- a/client/src/account/root.js +++ b/client/src/account/root.js @@ -1,11 +1,8 @@ 'use strict'; -import React - from 'react'; -import Account - from './Account'; -import API - from './API'; +import React from 'react'; +import Account from './Account'; +import API from './API'; function getMenus(t) { diff --git a/client/src/blacklist/List.js b/client/src/blacklist/List.js index c89e1e57..8f0c7cab 100644 --- a/client/src/blacklist/List.js +++ b/client/src/blacklist/List.js @@ -1,19 +1,14 @@ 'use strict'; import React, {Component} from "react"; -import { withTranslation } from '../lib/i18n'; +import {withTranslation} from '../lib/i18n'; import {requiresAuthenticatedUser, Title, withPageHelpers} from "../lib/page"; -import {withAsyncErrorHandler, withErrorHandling} from "../lib/error-handling"; +import {withErrorHandling} from "../lib/error-handling"; import {Table} from "../lib/table"; -import {ButtonRow, Form, InputField, withForm, FormSendMethod} from "../lib/form"; -import {Button, Icon} from "../lib/bootstrap-components"; -import axios, {HTTPMethod} from "../lib/axios"; -import {getUrl} from "../lib/urls"; -import { - tableAddRestActionButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../lib/modals"; +import {ButtonRow, Form, FormSendMethod, InputField, withForm} from "../lib/form"; +import {Button} from "../lib/bootstrap-components"; +import {HTTPMethod} from "../lib/axios"; +import {tableAddRestActionButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../lib/modals"; import {withComponentMixins} from "../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/campaigns/CUD.js b/client/src/campaigns/CUD.js index 8e87ecbe..8b180ca0 100644 --- a/client/src/campaigns/CUD.js +++ b/client/src/campaigns/CUD.js @@ -1,15 +1,9 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page' +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page' import { AlignedRow, Button, @@ -17,45 +11,27 @@ import { CheckBox, Dropdown, Fieldset, + filterData, Form, FormSendMethod, InputField, StaticField, TableSelect, TextArea, - withForm + withForm, + withFormErrorHandlers } from '../lib/form'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; -import { - NamespaceSelect, - validateNamespace -} from '../lib/namespace'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; +import {NamespaceSelect, validateNamespace} from '../lib/namespace'; import {DeleteModalDialog} from "../lib/modals"; -import mailtrainConfig - from 'mailtrainConfig'; -import { - getTemplateTypes, - getTypeForm, - ResourceType -} from '../templates/helpers'; -import axios - from '../lib/axios'; -import styles - from "../lib/styles.scss"; -import campaignsStyles - from "./styles.scss"; +import mailtrainConfig from 'mailtrainConfig'; +import {getTemplateTypes, getTypeForm, ResourceType} from '../templates/helpers'; +import axios from '../lib/axios'; +import styles from "../lib/styles.scss"; +import campaignsStyles from "./styles.scss"; import {getUrl} from "../lib/urls"; -import { - campaignOverridables, - CampaignSource, - CampaignStatus, - CampaignType -} from "../../../shared/campaigns"; -import moment - from 'moment'; +import {campaignOverridables, CampaignSource, CampaignStatus, CampaignType} from "../../../shared/campaigns"; +import moment from 'moment'; import {getMailerTypes} from "../send-configurations/helpers"; import {getCampaignLabels} from "./helpers"; import {withComponentMixins} from "../lib/decorator-helpers"; @@ -116,6 +92,8 @@ export default class CUD extends Component { this.nextListEntryId = 0; this.initForm({ + loadMutator: ::this.getFormValuesMutator, + submitMutator: ::this.submitFormValuesMutator, onChange: { send_configuration: ::this.onSendConfigurationChanged }, @@ -200,9 +178,76 @@ export default class CUD extends Component { this.fetchSendConfiguration(data.send_configuration); } + submitFormValuesMutator(data) { + const isEdit = !!this.props.entity; + + data.source = Number.parseInt(data.source); + + data.data = {}; + if (data.source === CampaignSource.TEMPLATE || data.source === CampaignSource.CUSTOM_FROM_TEMPLATE) { + data.data.sourceTemplate = data.data_sourceTemplate; + } + + if (data.source === CampaignSource.CUSTOM_FROM_CAMPAIGN) { + data.data.sourceCampaign = data.data_sourceCampaign; + } + + if (!isEdit && data.source === CampaignSource.CUSTOM) { + this.templateTypes[data.data_sourceCustom_type].beforeSave(data); + + data.data.sourceCustom = { + type: data.data_sourceCustom_type, + data: data.data_sourceCustom_data, + html: data.data_sourceCustom_html, + text: data.data_sourceCustom_text + } + } + + if (data.source === CampaignSource.URL) { + data.data.sourceUrl = data.data_sourceUrl; + } + + if (data.type === CampaignType.RSS) { + data.data.feedUrl = data.data_feedUrl; + } + + for (const overridable of campaignOverridables) { + if (!data[overridable + '_overriden']) { + data[overridable + '_override'] = null; + } + delete data[overridable + '_overriden']; + } + + const lsts = []; + for (const lstUid of data.lists) { + const prefix = 'lists_' + lstUid + '_'; + + const useSegmentation = data[prefix + 'useSegmentation'] && (data.type === CampaignType.REGULAR || data.type === CampaignType.RSS); + + lsts.push({ + list: data[prefix + 'list'], + segment: useSegmentation ? data[prefix + 'segment'] : null + }); + } + data.lists = lsts; + + for (const key in data) { + if (key.startsWith('data_') || key.startsWith('lists_')) { + delete data[key]; + } + } + + return filterData(data, [ + 'name', 'description', 'segment', 'namespace', 'send_configuration', + 'from_name_override', 'from_email_override', 'reply_to_override', 'subject_override', + 'data', 'click_tracking_disabled', 'open_tracking_disabled', 'unsubscribe_url', + 'type', 'source', 'parent', 'lists' + ]); + } + componentDidMount() { if (this.props.entity) { - this.getFormValuesFromEntity(this.props.entity, ::this.getFormValuesMutator); + this.getFormValuesFromEntity(this.props.entity); if (this.props.entity.status === CampaignStatus.SENDING) { this.disableForm(); @@ -345,8 +390,8 @@ export default class CUD extends Component { STATUS: 2 } + @withFormErrorHandlers async submitHandler(afterSubmitAction) { - const isEdit = !!this.props.entity; const t = this.props.t; let sendMethod, url; @@ -361,63 +406,7 @@ export default class CUD extends Component { this.disableForm(); this.setFormStatusMessage('info', t('saving')); - const submitResult = await this.validateAndSendFormValuesToURL(sendMethod, url, data => { - data.source = Number.parseInt(data.source); - - data.data = {}; - if (data.source === CampaignSource.TEMPLATE || data.source === CampaignSource.CUSTOM_FROM_TEMPLATE) { - data.data.sourceTemplate = data.data_sourceTemplate; - } - - if (data.source === CampaignSource.CUSTOM_FROM_CAMPAIGN) { - data.data.sourceCampaign = data.data_sourceCampaign; - } - - if (!isEdit && data.source === CampaignSource.CUSTOM) { - this.templateTypes[data.data_sourceCustom_type].beforeSave(data); - - data.data.sourceCustom = { - type: data.data_sourceCustom_type, - data: data.data_sourceCustom_data, - html: data.data_sourceCustom_html, - text: data.data_sourceCustom_text - } - } - - if (data.source === CampaignSource.URL) { - data.data.sourceUrl = data.data_sourceUrl; - } - - if (data.type === CampaignType.RSS) { - data.data.feedUrl = data.data_feedUrl; - } - - for (const overridable of campaignOverridables) { - if (!data[overridable + '_overriden']) { - data[overridable + '_override'] = null; - } - delete data[overridable + '_overriden']; - } - - const lsts = []; - for (const lstUid of data.lists) { - const prefix = 'lists_' + lstUid + '_'; - - const useSegmentation = data[prefix + 'useSegmentation'] && (data.type === CampaignType.REGULAR || data.type === CampaignType.RSS); - - lsts.push({ - list: data[prefix + 'list'], - segment: useSegmentation ? data[prefix + 'segment'] : null - }); - } - data.lists = lsts; - - for (const key in data) { - if (key.startsWith('data_') || key.startsWith('lists_')) { - delete data[key]; - } - } - }); + const submitResult = await this.validateAndSendFormValuesToURL(sendMethod, url); if (submitResult) { if (this.props.entity) { @@ -426,7 +415,7 @@ export default class CUD extends Component { } else if (afterSubmitAction === CUD.AfterSubmitAction.LEAVE) { this.navigateToWithFlashMessage('/campaigns', 'success', t('Campaign updated')); } else { - await this.getFormValuesFromURL(`rest/campaigns-settings/${this.props.entity.id}`, ::this.getFormValuesMutator); + await this.getFormValuesFromURL(`rest/campaigns-settings/${this.props.entity.id}`); this.enableForm(); this.setFormStatusMessage('success', t('Campaign updated')); } diff --git a/client/src/campaigns/Content.js b/client/src/campaigns/Content.js index 60e76c51..5a28ae27 100644 --- a/client/src/campaigns/Content.js +++ b/client/src/campaigns/Content.js @@ -1,35 +1,24 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../lib/i18n'; -import { - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page' +import {requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page' import { Button, ButtonRow, + filterData, Form, FormSendMethod, StaticField, - withForm + withForm, + withFormErrorHandlers } from '../lib/form'; import {withErrorHandling} from '../lib/error-handling'; -import mailtrainConfig - from 'mailtrainConfig'; -import { - getEditForm, - getTemplateTypes, - getTypeForm, - ResourceType -} from '../templates/helpers'; -import axios - from '../lib/axios'; -import styles - from "../lib/styles.scss"; +import mailtrainConfig from 'mailtrainConfig'; +import {getEditForm, getTemplateTypes, getTypeForm, ResourceType} from '../templates/helpers'; +import axios from '../lib/axios'; +import styles from "../lib/styles.scss"; import {getUrl} from "../lib/urls"; import {TestSendModalDialog} from "./TestSendModalDialog"; import {withComponentMixins} from "../lib/decorator-helpers"; @@ -65,7 +54,11 @@ export default class CustomContent extends Component { exportModalTitle: '' }; - this.initForm(); + this.initForm({ + loadMutator: ::this.getFormValuesMutator, + submitMutator: ::this.submitFormValuesMutator, + getPreSubmitUpdater: ::this.getPreSubmitFormValuesUpdater, + }); this.sendModalGetDataHandler = ::this.sendModalGetData; this.exportModalGetContentHandler = ::this.exportModalGetContent; @@ -90,9 +83,32 @@ export default class CustomContent extends Component { this.templateTypes[data.data.sourceCustom.type].afterLoad(data); } + submitFormValuesMutator(data) { + this.templateTypes[data.data_sourceCustom_type].beforeSave(data); + + data.data.sourceCustom = { + type: data.data_sourceCustom_type, + data: data.data_sourceCustom_data, + html: data.data_sourceCustom_html, + text: data.data_sourceCustom_text + }; + + return filterData(data, ['data']); + } + + async getPreSubmitFormValuesUpdater() { + const customTemplateTypeKey = this.getFormValue('data_sourceCustom_type'); + const exportedData = await this.templateTypes[customTemplateTypeKey].exportHTMLEditorData(this); + + return mutStateData => { + for (const key in exportedData) { + mutStateData.setIn([key, 'value'], exportedData[key]); + } + }; + } componentDidMount() { - this.getFormValuesFromEntity(this.props.entity, ::this.getFormValuesMutator); + this.getFormValuesFromEntity(this.props.entity); } localValidateFormValues(state) { @@ -115,35 +131,17 @@ export default class CustomContent extends Component { STATUS: 2 } + @withFormErrorHandlers async submitHandler(afterSubmitAction) { const t = this.props.t; - const customTemplateTypeKey = this.getFormValue('data_sourceCustom_type'); - const exportedData = await this.templateTypes[customTemplateTypeKey].exportHTMLEditorData(this); - const sendMethod = FormSendMethod.PUT; const url = `rest/campaigns-content/${this.props.entity.id}`; this.disableForm(); this.setFormStatusMessage('info', t('saving')); - const submitResult = await this.validateAndSendFormValuesToURL(sendMethod, url, data => { - Object.assign(data, exportedData); - this.templateTypes[data.data_sourceCustom_type].beforeSave(data); - - data.data.sourceCustom = { - type: data.data_sourceCustom_type, - data: data.data_sourceCustom_data, - html: data.data_sourceCustom_html, - text: data.data_sourceCustom_text - }; - - for (const key in data) { - if (key.startsWith('data_')) { - delete data[key]; - } - } - }); + const submitResult = await this.validateAndSendFormValuesToURL(sendMethod, url); if (submitResult) { if (afterSubmitAction === CustomContent.AfterSubmitAction.STATUS) { @@ -151,7 +149,7 @@ export default class CustomContent extends Component { } else if (afterSubmitAction === CustomContent.AfterSubmitAction.LEAVE) { this.navigateToWithFlashMessage('/campaigns', 'success', t('Campaign updated')); } else { - await this.getFormValuesFromURL(`rest/campaigns-content/${this.props.entity.id}`, ::this.getFormValuesMutator); + await this.getFormValuesFromURL(`rest/campaigns-content/${this.props.entity.id}`); this.enableForm(); this.setFormStatusMessage('success', t('Campaign updated')); } diff --git a/client/src/campaigns/StatisticsLinkClicks.js b/client/src/campaigns/StatisticsLinkClicks.js index 89003a8e..6c9e89b6 100644 --- a/client/src/campaigns/StatisticsLinkClicks.js +++ b/client/src/campaigns/StatisticsLinkClicks.js @@ -1,14 +1,9 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../lib/i18n'; -import { - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page'; +import {requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page'; import {withErrorHandling} from '../lib/error-handling'; import {Table} from "../lib/table"; import {withComponentMixins} from "../lib/decorator-helpers"; diff --git a/client/src/campaigns/StatisticsOpened.js b/client/src/campaigns/StatisticsOpened.js index b130512b..a074ab73 100644 --- a/client/src/campaigns/StatisticsOpened.js +++ b/client/src/campaigns/StatisticsOpened.js @@ -1,32 +1,20 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../lib/i18n'; -import { - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; -import axios - from "../lib/axios"; +import {requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; +import axios from "../lib/axios"; import {getUrl} from "../lib/urls"; -import Chart - from 'react-google-charts'; +import Chart from 'react-google-charts'; -import styles - from "./styles.scss"; +import styles from "./styles.scss"; import {Table} from "../lib/table"; import {Link} from "react-router-dom"; -import mailtrainConfig - from "mailtrainConfig"; +import mailtrainConfig from "mailtrainConfig"; import {withComponentMixins} from "../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/campaigns/StatisticsSubsList.js b/client/src/campaigns/StatisticsSubsList.js index 390253d8..7d0f408e 100644 --- a/client/src/campaigns/StatisticsSubsList.js +++ b/client/src/campaigns/StatisticsSubsList.js @@ -1,14 +1,9 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../lib/i18n'; -import { - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page'; +import {requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page'; import {withErrorHandling} from '../lib/error-handling'; import {Table} from "../lib/table"; import {withComponentMixins} from "../lib/decorator-helpers"; diff --git a/client/src/campaigns/Status.js b/client/src/campaigns/Status.js index 4af80eca..5ca90f70 100644 --- a/client/src/campaigns/Status.js +++ b/client/src/campaigns/Status.js @@ -1,52 +1,20 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page'; -import { - AlignedRow, - ButtonRow, - CheckBox, - DatePicker, - Form, - InputField, - TableSelect, - withForm -} from '../lib/form'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page'; +import {AlignedRow, ButtonRow, CheckBox, DatePicker, Form, InputField, TableSelect, withForm} from '../lib/form'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; import {getCampaignLabels} from './helpers'; import {Table} from "../lib/table"; -import { - Button, - Icon, - ModalDialog -} from "../lib/bootstrap-components"; -import axios - from "../lib/axios"; -import { - getPublicUrl, - getUrl -} from "../lib/urls"; -import interoperableErrors - from '../../../shared/interoperable-errors'; -import { - CampaignStatus, - CampaignType -} from "../../../shared/campaigns"; -import moment - from 'moment'; -import campaignsStyles - from "./styles.scss"; +import {Button, Icon, ModalDialog} from "../lib/bootstrap-components"; +import axios from "../lib/axios"; +import {getPublicUrl, getUrl} from "../lib/urls"; +import interoperableErrors from '../../../shared/interoperable-errors'; +import {CampaignStatus, CampaignType} from "../../../shared/campaigns"; +import moment from 'moment'; +import campaignsStyles from "./styles.scss"; import {withComponentMixins} from "../lib/decorator-helpers"; diff --git a/client/src/campaigns/TestSendModalDialog.js b/client/src/campaigns/TestSendModalDialog.js index 7d004813..9117dfa2 100644 --- a/client/src/campaigns/TestSendModalDialog.js +++ b/client/src/campaigns/TestSendModalDialog.js @@ -2,22 +2,13 @@ import React, {Component} from 'react'; import {withTranslation} from '../lib/i18n'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {ModalDialog} from "../lib/bootstrap-components"; -import { - requiresAuthenticatedUser, - withPageHelpers -} from "../lib/page"; -import { - Form, - TableSelect, - withForm -} from "../lib/form"; +import {requiresAuthenticatedUser, withPageHelpers} from "../lib/page"; +import {Form, TableSelect, withForm} from "../lib/form"; import {withErrorHandling} from "../lib/error-handling"; import {getMailerTypes} from "../send-configurations/helpers"; -import axios - from '../lib/axios'; +import axios from '../lib/axios'; import {getUrl} from '../lib/urls'; import {withComponentMixins} from "../lib/decorator-helpers"; diff --git a/client/src/campaigns/helpers.js b/client/src/campaigns/helpers.js index da2bec87..b0ac0be3 100644 --- a/client/src/campaigns/helpers.js +++ b/client/src/campaigns/helpers.js @@ -1,9 +1,6 @@ 'use strict'; -import { - CampaignStatus, - CampaignType -} from "../../../shared/campaigns"; +import {CampaignStatus, CampaignType} from "../../../shared/campaigns"; export function getCampaignLabels(t) { diff --git a/client/src/campaigns/root.js b/client/src/campaigns/root.js index b93f582c..8c075ca9 100644 --- a/client/src/campaigns/root.js +++ b/client/src/campaigns/root.js @@ -1,39 +1,21 @@ 'use strict'; -import React - from 'react'; +import React from 'react'; -import Status - from './Status'; -import Statistics - from './Statistics'; -import CampaignsCUD - from './CUD'; -import Content - from './Content'; -import CampaignsList - from './List'; -import Share - from '../shares/Share'; -import Files - from "../lib/files"; -import { - CampaignSource, - CampaignStatus, - CampaignType -} from "../../../shared/campaigns"; -import TriggersCUD - from './triggers/CUD'; -import TriggersList - from './triggers/List'; -import StatisticsSubsList - from "./StatisticsSubsList"; +import Status from './Status'; +import Statistics from './Statistics'; +import CampaignsCUD from './CUD'; +import Content from './Content'; +import CampaignsList from './List'; +import Share from '../shares/Share'; +import Files from "../lib/files"; +import {CampaignSource, CampaignType} from "../../../shared/campaigns"; +import TriggersCUD from './triggers/CUD'; +import TriggersList from './triggers/List'; +import StatisticsSubsList from "./StatisticsSubsList"; import {SubscriptionStatus} from "../../../shared/lists"; -import StatisticsOpened - from "./StatisticsOpened"; -import StatisticsLinkClicks - from "./StatisticsLinkClicks"; -import TemplatesCUD from "../templates/root"; +import StatisticsOpened from "./StatisticsOpened"; +import StatisticsLinkClicks from "./StatisticsLinkClicks"; import {ellipsizeBreadcrumbLabel} from "../lib/helpers" function getMenus(t) { diff --git a/client/src/campaigns/triggers/CUD.js b/client/src/campaigns/triggers/CUD.js index 19da93e1..b38d951d 100644 --- a/client/src/campaigns/triggers/CUD.js +++ b/client/src/campaigns/triggers/CUD.js @@ -1,15 +1,9 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../../lib/page'; import { AlignedRow, Button, @@ -26,12 +20,8 @@ import { import {withErrorHandling} from '../../lib/error-handling'; import {DeleteModalDialog} from "../../lib/modals"; import {getTriggerTypes} from './helpers'; -import { - Entity, - Event -} from '../../../../shared/triggers'; -import moment - from 'moment'; +import {Entity, Event} from '../../../../shared/triggers'; +import moment from 'moment'; import {getCampaignLabels} from "../helpers"; import {withComponentMixins} from "../../lib/decorator-helpers"; diff --git a/client/src/campaigns/triggers/List.js b/client/src/campaigns/triggers/List.js index ed37e074..a3560163 100644 --- a/client/src/campaigns/triggers/List.js +++ b/client/src/campaigns/triggers/List.js @@ -1,27 +1,15 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../../lib/page'; import {withErrorHandling} from '../../lib/error-handling'; import {Table} from '../../lib/table'; import {getTriggerTypes} from './helpers'; import {Icon} from "../../lib/bootstrap-components"; -import mailtrainConfig - from 'mailtrainConfig'; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../../lib/modals"; +import mailtrainConfig from 'mailtrainConfig'; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../../lib/modals"; import {withComponentMixins} from "../../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lib/bootstrap-components.js b/client/src/lib/bootstrap-components.js index 05a0b515..651c2e9f 100644 --- a/client/src/lib/bootstrap-components.js +++ b/client/src/lib/bootstrap-components.js @@ -2,12 +2,8 @@ import React, {Component} from 'react'; import {withTranslation} from './i18n'; -import PropTypes - from 'prop-types'; -import { - withAsyncErrorHandler, - withErrorHandling -} from './error-handling'; +import PropTypes from 'prop-types'; +import {withAsyncErrorHandler, withErrorHandling} from './error-handling'; import {withComponentMixins} from "./decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lib/error-handling.js b/client/src/lib/error-handling.js index d70b4f34..09553c1a 100644 --- a/client/src/lib/error-handling.js +++ b/client/src/lib/error-handling.js @@ -1,7 +1,6 @@ 'use strict'; import React from "react"; -import PropTypes from 'prop-types'; import {createComponentMixin} from "./decorator-helpers"; function handleError(that, error) { diff --git a/client/src/lib/files.js b/client/src/lib/files.js index 42fe2b0b..318fafa9 100644 --- a/client/src/lib/files.js +++ b/client/src/lib/files.js @@ -1,30 +1,16 @@ 'use strict'; import React, {Component} from "react"; -import PropTypes - from "prop-types"; +import PropTypes from "prop-types"; import {withTranslation} from './i18n'; -import { - requiresAuthenticatedUser, - Title, - withPageHelpers -} from "./page"; +import {requiresAuthenticatedUser, Title, withPageHelpers} from "./page"; import {withErrorHandling} from "./error-handling"; import {Table} from "./table"; -import Dropzone - from "react-dropzone"; -import { - Icon, - ModalDialog -} from "./bootstrap-components"; -import axios - from './axios'; -import styles - from "./styles.scss"; -import { - getPublicUrl, - getUrl -} from "./urls"; +import Dropzone from "react-dropzone"; +import {Icon, ModalDialog} from "./bootstrap-components"; +import axios from './axios'; +import styles from "./styles.scss"; +import {getPublicUrl, getUrl} from "./urls"; import {withComponentMixins} from "./decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lib/i18n.js b/client/src/lib/i18n.js index 315c7a42..87929f2d 100644 --- a/client/src/lib/i18n.js +++ b/client/src/lib/i18n.js @@ -1,13 +1,10 @@ 'use strict'; -import React, {Component} from 'react'; -import i18n - from 'i18next'; +import React from 'react'; +import i18n from 'i18next'; import {withNamespaces} from "react-i18next"; -import LanguageDetector - from 'i18next-browser-languagedetector'; -import mailtrainConfig - from 'mailtrainConfig'; +import LanguageDetector from 'i18next-browser-languagedetector'; +import mailtrainConfig from 'mailtrainConfig'; import {convertToFake, getLang} from '../../../shared/langs'; import {createComponentMixin} from "./decorator-helpers"; diff --git a/client/src/lib/mjml.js b/client/src/lib/mjml.js index ec42c035..a721cab8 100644 --- a/client/src/lib/mjml.js +++ b/client/src/lib/mjml.js @@ -1,8 +1,8 @@ 'use strict'; -import { mergeWith, isArray } from 'lodash'; +import {isArray, mergeWith} from 'lodash'; import kebabCase from 'lodash/kebabCase'; -import mjml2html, {defaultSkeleton, BodyComponent, HeadComponent, components, dependencies} from "mjml4-in-browser"; +import mjml2html, {BodyComponent, components, defaultSkeleton, dependencies, HeadComponent} from "mjml4-in-browser"; export { BodyComponent, HeadComponent }; diff --git a/client/src/lib/sandboxed-ckeditor-root.js b/client/src/lib/sandboxed-ckeditor-root.js index 3cfdfa85..3f319a47 100644 --- a/client/src/lib/sandboxed-ckeditor-root.js +++ b/client/src/lib/sandboxed-ckeditor-root.js @@ -3,30 +3,16 @@ import './public-path'; import React, {Component} from 'react'; -import ReactDOM - from 'react-dom'; +import ReactDOM from 'react-dom'; import {I18nextProvider} from 'react-i18next'; import i18n, {withTranslation} from './i18n'; -import { - parentRPC, - UntrustedContentRoot -} from './untrusted'; -import PropTypes - from "prop-types"; -import styles - from "./sandboxed-ckeditor.scss"; -import { - getPublicUrl, - getSandboxUrl, - getTrustedUrl -} from "./urls"; -import { - base, - unbase -} from "../../../shared/templates"; +import {parentRPC, UntrustedContentRoot} from './untrusted'; +import PropTypes from "prop-types"; +import styles from "./sandboxed-ckeditor.scss"; +import {getPublicUrl, getSandboxUrl, getTrustedUrl} from "./urls"; +import {base, unbase} from "../../../shared/templates"; -import CKEditor - from "react-ckeditor-component"; +import CKEditor from "react-ckeditor-component"; import {initialHeight} from "./sandboxed-ckeditor-shared"; import {withComponentMixins} from "./decorator-helpers"; diff --git a/client/src/lib/sandboxed-ckeditor.js b/client/src/lib/sandboxed-ckeditor.js index 9e1229d9..efff79e8 100644 --- a/client/src/lib/sandboxed-ckeditor.js +++ b/client/src/lib/sandboxed-ckeditor.js @@ -2,10 +2,8 @@ import React, {Component} from 'react'; import {withTranslation} from './i18n'; -import PropTypes - from "prop-types"; -import styles - from "./sandboxed-ckeditor.scss"; +import PropTypes from "prop-types"; +import styles from "./sandboxed-ckeditor.scss"; import {UntrustedContentHost} from './untrusted'; import {Icon} from "./bootstrap-components"; diff --git a/client/src/lib/sandboxed-codeeditor.js b/client/src/lib/sandboxed-codeeditor.js index 4f82144f..85cac3b8 100644 --- a/client/src/lib/sandboxed-codeeditor.js +++ b/client/src/lib/sandboxed-codeeditor.js @@ -2,10 +2,8 @@ import React, {Component} from 'react'; import {withTranslation} from './i18n'; -import PropTypes - from "prop-types"; -import styles - from "./sandboxed-codeeditor.scss"; +import PropTypes from "prop-types"; +import styles from "./sandboxed-codeeditor.scss"; import {UntrustedContentHost} from './untrusted'; import {Icon} from "./bootstrap-components"; diff --git a/client/src/lib/sandboxed-grapesjs.js b/client/src/lib/sandboxed-grapesjs.js index df627e3d..27e0ae31 100644 --- a/client/src/lib/sandboxed-grapesjs.js +++ b/client/src/lib/sandboxed-grapesjs.js @@ -2,10 +2,8 @@ import React, {Component} from 'react'; import {withTranslation} from './i18n'; -import PropTypes - from "prop-types"; -import styles - from "./sandboxed-grapesjs.scss"; +import PropTypes from "prop-types"; +import styles from "./sandboxed-grapesjs.scss"; import {UntrustedContentHost} from './untrusted'; import {Icon} from "./bootstrap-components"; diff --git a/client/src/lib/sandboxed-mosaico.js b/client/src/lib/sandboxed-mosaico.js index 1380ee41..d3f9370d 100644 --- a/client/src/lib/sandboxed-mosaico.js +++ b/client/src/lib/sandboxed-mosaico.js @@ -2,10 +2,8 @@ import React, {Component} from 'react'; import {withTranslation} from './i18n'; -import PropTypes - from "prop-types"; -import styles - from "./sandboxed-mosaico.scss"; +import PropTypes from "prop-types"; +import styles from "./sandboxed-mosaico.scss"; import {UntrustedContentHost} from './untrusted'; import {Icon} from "./bootstrap-components"; diff --git a/client/src/lib/table.js b/client/src/lib/table.js index e51933ae..0e48eb8d 100644 --- a/client/src/lib/table.js +++ b/client/src/lib/table.js @@ -1,29 +1,21 @@ 'use strict'; import React, {Component} from 'react'; -import ReactDOMServer - from 'react-dom/server'; -import PropTypes - from 'prop-types'; +import ReactDOMServer from 'react-dom/server'; +import PropTypes from 'prop-types'; import {withTranslation} from './i18n'; -import jQuery - from 'jquery'; +import jQuery from 'jquery'; import 'datatables.net'; import 'datatables.net-bs4'; import 'datatables.net-bs4/css/dataTables.bootstrap4.css'; -import axios - from './axios'; +import axios from './axios'; import {withPageHelpers} from './page' -import { - withAsyncErrorHandler, - withErrorHandling -} from './error-handling'; -import styles - from "./styles.scss"; +import {withAsyncErrorHandler, withErrorHandling} from './error-handling'; +import styles from "./styles.scss"; import {getUrl} from "./urls"; import {withComponentMixins} from "./decorator-helpers"; diff --git a/client/src/lib/tree.js b/client/src/lib/tree.js index 99e2b738..7f98e77c 100644 --- a/client/src/lib/tree.js +++ b/client/src/lib/tree.js @@ -1,28 +1,20 @@ 'use strict'; import React, {Component} from 'react'; -import ReactDOMServer - from 'react-dom/server'; +import ReactDOMServer from 'react-dom/server'; import {withTranslation} from './i18n'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; -import jQuery - from 'jquery'; +import jQuery from 'jquery'; import '../../static/jquery/jquery-ui-1.12.1.min.js'; import '../../static/fancytree/jquery.fancytree-all.min.js'; import '../../static/fancytree/skin-bootstrap/ui.fancytree.min.css'; import './tree.scss'; -import axios - from './axios'; +import axios from './axios'; import {withPageHelpers} from './page' -import { - withAsyncErrorHandler, - withErrorHandling -} from './error-handling'; -import styles - from "./styles.scss"; +import {withAsyncErrorHandler, withErrorHandling} from './error-handling'; +import styles from "./styles.scss"; import {getUrl} from "./urls"; import {withComponentMixins} from "./decorator-helpers"; diff --git a/client/src/lib/untrusted.js b/client/src/lib/untrusted.js index 2e8ebc5a..6e37276f 100644 --- a/client/src/lib/untrusted.js +++ b/client/src/lib/untrusted.js @@ -1,27 +1,13 @@ 'use strict'; import React, {Component} from "react"; -import PropTypes - from "prop-types"; +import PropTypes from "prop-types"; import {withTranslation} from './i18n'; -import { - requiresAuthenticatedUser, - withPageHelpers -} from "./page"; -import { - withAsyncErrorHandler, - withErrorHandling -} from "./error-handling"; -import axios - from "./axios"; -import styles - from "./styles.scss"; -import { - getSandboxUrl, - getTrustedUrl, - getUrl, - setRestrictedAccessToken -} from "./urls"; +import {requiresAuthenticatedUser, withPageHelpers} from "./page"; +import {withAsyncErrorHandler, withErrorHandling} from "./error-handling"; +import axios from "./axios"; +import styles from "./styles.scss"; +import {getSandboxUrl, getUrl, setRestrictedAccessToken} from "./urls"; import {withComponentMixins} from "./decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lists/CUD.js b/client/src/lists/CUD.js index 8c159d6e..4943f1a5 100644 --- a/client/src/lists/CUD.js +++ b/client/src/lists/CUD.js @@ -1,40 +1,31 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {Trans} from 'react-i18next'; import {withTranslation} from '../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page'; import { Button, ButtonRow, CheckBox, - Dropdown, filterData, + Dropdown, + filterData, Form, FormSendMethod, InputField, StaticField, TableSelect, TextArea, - withForm + withForm, + withFormErrorHandlers } from '../lib/form'; import {withErrorHandling} from '../lib/error-handling'; import {DeleteModalDialog} from '../lib/modals'; -import { - NamespaceSelect, - validateNamespace -} from '../lib/namespace'; -import {UnsubscriptionMode, FieldWizard} from '../../../shared/lists'; -import styles - from "../lib/styles.scss"; -import mailtrainConfig - from 'mailtrainConfig'; +import {NamespaceSelect, validateNamespace} from '../lib/namespace'; +import {FieldWizard, UnsubscriptionMode} from '../../../shared/lists'; +import styles from "../lib/styles.scss"; +import mailtrainConfig from 'mailtrainConfig'; import {getMailerTypes} from "../send-configurations/helpers"; import {withComponentMixins} from "../lib/decorator-helpers"; @@ -128,6 +119,7 @@ export default class CUD extends Component { validateNamespace(t, state); } + @withFormErrorHandlers async submitHandler(submitAndLeave) { const t = this.props.t; diff --git a/client/src/lists/List.js b/client/src/lists/List.js index a1c15daf..b64334a5 100644 --- a/client/src/lists/List.js +++ b/client/src/lists/List.js @@ -2,26 +2,12 @@ import React, {Component} from 'react'; import {withTranslation} from '../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../lib/page'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; +import {LinkButton, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../lib/page'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; import {Table} from '../lib/table'; -import {Link} from "react-router-dom"; import {Icon} from "../lib/bootstrap-components"; import {checkPermissions} from "../lib/permissions"; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../lib/modals"; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../lib/modals"; import {withComponentMixins} from "../lib/decorator-helpers"; import {withForm} from "../lib/form"; diff --git a/client/src/lists/TriggersList.js b/client/src/lists/TriggersList.js index 461258b0..075ba940 100644 --- a/client/src/lists/TriggersList.js +++ b/client/src/lists/TriggersList.js @@ -1,25 +1,15 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../lib/i18n'; -import { - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page'; +import {requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page'; import {withErrorHandling} from '../lib/error-handling'; import {Table} from '../lib/table'; import {getTriggerTypes} from '../campaigns/triggers/helpers'; import {Icon} from "../lib/bootstrap-components"; -import mailtrainConfig - from 'mailtrainConfig'; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../lib/modals"; +import mailtrainConfig from 'mailtrainConfig'; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../lib/modals"; import {withComponentMixins} from "../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lists/fields/CUD.js b/client/src/lists/fields/CUD.js index 9cd0e78b..b08913ef 100644 --- a/client/src/lists/fields/CUD.js +++ b/client/src/lists/fields/CUD.js @@ -1,16 +1,10 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {Trans} from 'react-i18next'; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../../lib/page'; import { ACEEditor, Button, @@ -28,17 +22,10 @@ import { import {withErrorHandling} from '../../lib/error-handling'; import {DeleteModalDialog} from "../../lib/modals"; import {getFieldTypes} from './helpers'; -import validators - from '../../../../shared/validators'; -import slugify - from 'slugify'; -import { - DateFormat, - parseBirthday, - parseDate -} from '../../../../shared/date'; -import styles - from "../../lib/styles.scss"; +import validators from '../../../../shared/validators'; +import slugify from 'slugify'; +import {DateFormat, parseBirthday, parseDate} from '../../../../shared/date'; +import styles from "../../lib/styles.scss"; import 'brace/mode/json'; import 'brace/mode/handlebars'; import {withComponentMixins} from "../../lib/decorator-helpers"; diff --git a/client/src/lists/fields/List.js b/client/src/lists/fields/List.js index 2c2adffc..33461a41 100644 --- a/client/src/lists/fields/List.js +++ b/client/src/lists/fields/List.js @@ -1,25 +1,14 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../../lib/page'; import {withErrorHandling} from '../../lib/error-handling'; import {Table} from '../../lib/table'; import {getFieldTypes} from './helpers'; import {Icon} from "../../lib/bootstrap-components"; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../../lib/modals"; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../../lib/modals"; import {withComponentMixins} from "../../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lists/fields/helpers.js b/client/src/lists/fields/helpers.js index 4d6637eb..07c84ba7 100644 --- a/client/src/lists/fields/helpers.js +++ b/client/src/lists/fields/helpers.js @@ -1,7 +1,6 @@ 'use strict'; import React from 'react'; -import {Fieldset, InputField} from "../../lib/form"; export function getFieldTypes(t) { diff --git a/client/src/lists/forms/CUD.js b/client/src/lists/forms/CUD.js index dc99771b..a12efbcd 100644 --- a/client/src/lists/forms/CUD.js +++ b/client/src/lists/forms/CUD.js @@ -1,16 +1,10 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {Trans} from 'react-i18next'; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../../lib/page'; import { ACEEditor, AlignedRow, @@ -26,27 +20,14 @@ import { withForm } from '../../lib/form'; import {withErrorHandling} from '../../lib/error-handling'; -import { - NamespaceSelect, - validateNamespace -} from '../../lib/namespace'; +import {NamespaceSelect, validateNamespace} from '../../lib/namespace'; import {DeleteModalDialog} from "../../lib/modals"; -import mailtrainConfig - from 'mailtrainConfig'; -import { - getTrustedUrl, - getUrl -} from "../../lib/urls"; -import { - ActionLink, - Icon -} from "../../lib/bootstrap-components"; -import styles - from "../../lib/styles.scss"; -import formsStyles - from "./styles.scss"; -import axios - from "../../lib/axios"; +import mailtrainConfig from 'mailtrainConfig'; +import {getTrustedUrl, getUrl} from "../../lib/urls"; +import {ActionLink, Icon} from "../../lib/bootstrap-components"; +import styles from "../../lib/styles.scss"; +import formsStyles from "./styles.scss"; +import axios from "../../lib/axios"; import {withComponentMixins} from "../../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lists/forms/List.js b/client/src/lists/forms/List.js index ef8b90cf..3f74cbab 100644 --- a/client/src/lists/forms/List.js +++ b/client/src/lists/forms/List.js @@ -2,25 +2,12 @@ import React, {Component} from 'react'; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../../lib/page'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../../lib/error-handling'; +import {LinkButton, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../../lib/page'; +import {withAsyncErrorHandler, withErrorHandling} from '../../lib/error-handling'; import {Table} from '../../lib/table'; import {Icon} from "../../lib/bootstrap-components"; import {checkPermissions} from "../../lib/permissions"; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../../lib/modals"; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../../lib/modals"; import {withComponentMixins} from "../../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lists/imports/CUD.js b/client/src/lists/imports/CUD.js index a2bd43cd..e2db5cf6 100644 --- a/client/src/lists/imports/CUD.js +++ b/client/src/lists/imports/CUD.js @@ -1,15 +1,9 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../../lib/page'; import { AlignedRow, Button, @@ -24,27 +18,15 @@ import { TextArea, withForm } from '../../lib/form'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../../lib/error-handling'; +import {withAsyncErrorHandler, withErrorHandling} from '../../lib/error-handling'; import {DeleteModalDialog} from "../../lib/modals"; import {getImportLabels} from './helpers'; -import { - ImportSource, - inProgress, - MappingType, - prepInProgress -} from '../../../../shared/imports'; -import axios - from "../../lib/axios"; +import {ImportSource, inProgress, MappingType, prepInProgress} from '../../../../shared/imports'; +import axios from "../../lib/axios"; import {getUrl} from "../../lib/urls"; -import listStyles - from "../styles.scss"; -import styles - from "../../lib/styles.scss"; -import interoperableErrors - from "../../../../shared/interoperable-errors"; +import listStyles from "../styles.scss"; +import styles from "../../lib/styles.scss"; +import interoperableErrors from "../../../../shared/interoperable-errors"; import {withComponentMixins} from "../../lib/decorator-helpers"; diff --git a/client/src/lists/imports/List.js b/client/src/lists/imports/List.js index e19069cb..86a82c78 100644 --- a/client/src/lists/imports/List.js +++ b/client/src/lists/imports/List.js @@ -1,30 +1,17 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../../lib/page'; import {withErrorHandling} from '../../lib/error-handling'; import {Table} from '../../lib/table'; import {getImportLabels} from './helpers'; import {Icon} from "../../lib/bootstrap-components"; -import mailtrainConfig - from 'mailtrainConfig'; -import moment - from "moment"; +import mailtrainConfig from 'mailtrainConfig'; +import moment from "moment"; import {inProgress} from '../../../../shared/imports'; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../../lib/modals"; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../../lib/modals"; import {withComponentMixins} from "../../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lists/imports/RunStatus.js b/client/src/lists/imports/RunStatus.js index 3667eb99..60add547 100644 --- a/client/src/lists/imports/RunStatus.js +++ b/client/src/lists/imports/RunStatus.js @@ -1,25 +1,15 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../../lib/i18n'; -import { - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../../lib/page'; +import {requiresAuthenticatedUser, Title, withPageHelpers} from '../../lib/page'; import {AlignedRow} from '../../lib/form'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../../lib/error-handling'; +import {withAsyncErrorHandler, withErrorHandling} from '../../lib/error-handling'; import {getImportLabels} from './helpers'; -import axios - from "../../lib/axios"; +import axios from "../../lib/axios"; import {getUrl} from "../../lib/urls"; -import moment - from "moment"; +import moment from "moment"; import {runStatusInProgress} from "../../../../shared/imports"; import {Table} from "../../lib/table"; import {withComponentMixins} from "../../lib/decorator-helpers"; diff --git a/client/src/lists/imports/Status.js b/client/src/lists/imports/Status.js index 69d039fe..3e1af710 100644 --- a/client/src/lists/imports/Status.js +++ b/client/src/lists/imports/Status.js @@ -1,40 +1,19 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../../lib/i18n'; -import { - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../../lib/page'; -import { - AlignedRow, - ButtonRow -} from '../../lib/form'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../../lib/error-handling'; +import {requiresAuthenticatedUser, Title, withPageHelpers} from '../../lib/page'; +import {AlignedRow, ButtonRow} from '../../lib/form'; +import {withAsyncErrorHandler, withErrorHandling} from '../../lib/error-handling'; import {getImportLabels} from './helpers'; -import { - prepFinishedAndNotInProgress, - runInProgress, - runStatusInProgress -} from '../../../../shared/imports'; +import {prepFinishedAndNotInProgress, runInProgress, runStatusInProgress} from '../../../../shared/imports'; import {Table} from "../../lib/table"; -import { - Button, - Icon -} from "../../lib/bootstrap-components"; -import axios - from "../../lib/axios"; +import {Button, Icon} from "../../lib/bootstrap-components"; +import axios from "../../lib/axios"; import {getUrl} from "../../lib/urls"; -import moment - from "moment"; -import interoperableErrors - from '../../../../shared/interoperable-errors'; +import moment from "moment"; +import interoperableErrors from '../../../../shared/interoperable-errors'; import {withComponentMixins} from "../../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lists/imports/helpers.js b/client/src/lists/imports/helpers.js index 3bb51cd9..b0bc5a1f 100644 --- a/client/src/lists/imports/helpers.js +++ b/client/src/lists/imports/helpers.js @@ -1,7 +1,7 @@ 'use strict'; import React from 'react'; -import {ImportSource, MappingType, ImportStatus, RunStatus} from '../../../../shared/imports'; +import {ImportSource, ImportStatus, MappingType, RunStatus} from '../../../../shared/imports'; export function getImportLabels(t) { diff --git a/client/src/lists/segments/CUD.js b/client/src/lists/segments/CUD.js index ec17ee92..ffe26768 100644 --- a/client/src/lists/segments/CUD.js +++ b/client/src/lists/segments/CUD.js @@ -1,46 +1,22 @@ 'use strict'; import React, {Component} from "react"; -import PropTypes - from "prop-types"; +import PropTypes from "prop-types"; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from "../../lib/page"; -import { - Button as FormButton, - ButtonRow, - Dropdown, - Form, - FormSendMethod, - InputField, - withForm -} from "../../lib/form"; +import {LinkButton, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from "../../lib/page"; +import {ButtonRow, Dropdown, Form, FormSendMethod, InputField, withForm} from "../../lib/form"; import {withErrorHandling} from "../../lib/error-handling"; import {DeleteModalDialog} from "../../lib/modals"; -import styles - from "./CUD.scss"; +import styles from "./CUD.scss"; import {DragDropContext} from "react-dnd"; -import HTML5Backend - from "react-dnd-html5-backend"; -import TouchBackend - from "react-dnd-touch-backend"; -import SortableTree - from "react-sortable-tree"; +import HTML5Backend from "react-dnd-html5-backend"; +import TouchBackend from "react-dnd-touch-backend"; +import SortableTree from "react-sortable-tree"; import 'react-sortable-tree/style.css'; -import { - ActionLink, - Button, - Icon -} from "../../lib/bootstrap-components"; +import {ActionLink, Button, Icon} from "../../lib/bootstrap-components"; import {getRuleHelpers} from "./helpers"; -import RuleSettingsPane - from "./RuleSettingsPane"; +import RuleSettingsPane from "./RuleSettingsPane"; import {withComponentMixins} from "../../lib/decorator-helpers"; // https://stackoverflow.com/a/4819886/1601953 diff --git a/client/src/lists/segments/List.js b/client/src/lists/segments/List.js index f1146821..915aafcd 100644 --- a/client/src/lists/segments/List.js +++ b/client/src/lists/segments/List.js @@ -1,24 +1,13 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../../lib/page'; import {withErrorHandling} from '../../lib/error-handling'; import {Table} from '../../lib/table'; import {Icon} from "../../lib/bootstrap-components"; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../../lib/modals"; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../../lib/modals"; import {withComponentMixins} from "../../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lists/segments/RuleSettingsPane.js b/client/src/lists/segments/RuleSettingsPane.js index ab7d8bc4..9c832e6e 100644 --- a/client/src/lists/segments/RuleSettingsPane.js +++ b/client/src/lists/segments/RuleSettingsPane.js @@ -1,27 +1,15 @@ 'use strict'; import React, {PureComponent} from "react"; -import PropTypes - from "prop-types"; +import PropTypes from "prop-types"; import {withTranslation} from '../../lib/i18n'; -import { - requiresAuthenticatedUser, - withPageHelpers -} from "../../lib/page"; -import { - Button, - ButtonRow, - Dropdown, - Form, - TableSelect, - withForm -} from "../../lib/form"; +import {requiresAuthenticatedUser, withPageHelpers} from "../../lib/page"; +import {Button, ButtonRow, Dropdown, Form, TableSelect, withForm} from "../../lib/form"; import {withErrorHandling} from "../../lib/error-handling"; import {getRuleHelpers} from "./helpers"; import {getFieldTypes} from "../fields/helpers"; -import styles - from "./CUD.scss"; +import styles from "./CUD.scss"; import {withComponentMixins} from "../../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lists/segments/helpers.js b/client/src/lists/segments/helpers.js index bdd4eebd..aeb7587f 100644 --- a/client/src/lists/segments/helpers.js +++ b/client/src/lists/segments/helpers.js @@ -2,8 +2,8 @@ import React from 'react'; import {DatePicker, Dropdown, InputField} from "../../lib/form"; -import { parseDate, parseBirthday, formatDate, formatBirthday, DateFormat, birthdayYear, getDateFormatString, getBirthdayFormatString } from '../../../../shared/date'; -import { tMark } from "../../lib/i18n"; +import {DateFormat, formatBirthday, formatDate, parseBirthday, parseDate} from '../../../../shared/date'; +import {tMark} from "../../lib/i18n"; export function getRuleHelpers(t, fields) { diff --git a/client/src/lists/subscriptions/CUD.js b/client/src/lists/subscriptions/CUD.js index d5b73bd4..2578ca00 100644 --- a/client/src/lists/subscriptions/CUD.js +++ b/client/src/lists/subscriptions/CUD.js @@ -1,16 +1,10 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {HTTPMethod} from '../../lib/axios'; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../../lib/page'; import { AlignedRow, Button, @@ -24,15 +18,10 @@ import { } from '../../lib/form'; import {withErrorHandling} from '../../lib/error-handling'; import {RestActionModalDialog} from "../../lib/modals"; -import interoperableErrors - from '../../../../shared/interoperable-errors'; +import interoperableErrors from '../../../../shared/interoperable-errors'; import {SubscriptionStatus} from '../../../../shared/lists'; -import { - getFieldTypes, - getSubscriptionStatusLabels -} from './helpers'; -import moment - from 'moment-timezone'; +import {getFieldTypes, getSubscriptionStatusLabels} from './helpers'; +import moment from 'moment-timezone'; import {withComponentMixins} from "../../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lists/subscriptions/List.js b/client/src/lists/subscriptions/List.js index df5d23ee..9343aef3 100644 --- a/client/src/lists/subscriptions/List.js +++ b/client/src/lists/subscriptions/List.js @@ -1,47 +1,25 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../../lib/page'; import {withErrorHandling} from '../../lib/error-handling'; import {Table} from '../../lib/table'; import {SubscriptionStatus} from '../../../../shared/lists'; -import moment - from 'moment'; -import { - Dropdown, - Form, - withForm -} from '../../lib/form'; -import { - Button, - Icon -} from "../../lib/bootstrap-components"; +import moment from 'moment'; +import {Dropdown, Form, withForm} from '../../lib/form'; +import {Button, Icon} from "../../lib/bootstrap-components"; import {HTTPMethod} from '../../lib/axios'; -import { - getFieldTypes, - getSubscriptionStatusLabels -} from './helpers'; -import { - getPublicUrl, - getUrl -} from "../../lib/urls"; +import {getFieldTypes, getSubscriptionStatusLabels} from './helpers'; +import {getPublicUrl, getUrl} from "../../lib/urls"; import { tableAddDeleteButton, tableAddRestActionButton, tableRestActionDialogInit, tableRestActionDialogRender } from "../../lib/modals"; -import listStyles - from "../styles.scss"; +import listStyles from "../styles.scss"; import {withComponentMixins} from "../../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/lists/subscriptions/helpers.js b/client/src/lists/subscriptions/helpers.js index 754c4e71..24a2c07a 100644 --- a/client/src/lists/subscriptions/helpers.js +++ b/client/src/lists/subscriptions/helpers.js @@ -1,7 +1,7 @@ 'use strict'; import React from "react"; -import {SubscriptionStatus} from "../../../../shared/lists"; +import {getFieldColumn, SubscriptionStatus} from "../../../../shared/lists"; import { ACEEditor, CheckBox, @@ -13,7 +13,6 @@ import { TextArea } from "../../lib/form"; import {formatBirthday, formatDate, parseBirthday, parseDate} from "../../../../shared/date"; -import {getFieldColumn} from '../../../../shared/lists'; import 'brace/mode/json'; export function getSubscriptionStatusLabels(t) { diff --git a/client/src/login/Forgot.js b/client/src/login/Forgot.js index 0193cf22..95ff2cf2 100644 --- a/client/src/login/Forgot.js +++ b/client/src/login/Forgot.js @@ -1,16 +1,10 @@ 'use strict'; -import React, { Component } from 'react'; -import { withTranslation } from '../lib/i18n'; -import { - withPageHelpers, - Title, - requiresAuthenticatedUser -} from '../lib/page' -import { - withForm, Form, FormSendMethod, InputField, ButtonRow, Button -} from '../lib/form'; -import { withErrorHandling, withAsyncErrorHandler } from '../lib/error-handling'; +import React, {Component} from 'react'; +import {withTranslation} from '../lib/i18n'; +import {Title, withPageHelpers} from '../lib/page' +import {Button, ButtonRow, Form, FormSendMethod, InputField, withForm, withFormErrorHandlers} from '../lib/form'; +import {withErrorHandling} from '../lib/error-handling'; import {withComponentMixins} from "../lib/decorator-helpers"; @withComponentMixins([ @@ -45,6 +39,7 @@ export default class Forget extends Component { } } + @withFormErrorHandlers async submitHandler() { const t = this.props.t; diff --git a/client/src/login/Login.js b/client/src/login/Login.js index c2544663..a81af1f9 100644 --- a/client/src/login/Login.js +++ b/client/src/login/Login.js @@ -2,10 +2,7 @@ import React, {Component} from 'react'; import {withTranslation} from '../lib/i18n'; -import { - Title, - withPageHelpers -} from '../lib/page' +import {Title, withPageHelpers} from '../lib/page' import {Link} from 'react-router-dom' import { Button, @@ -14,15 +11,13 @@ import { Form, FormSendMethod, InputField, - withForm + withForm, + withFormErrorHandlers } from '../lib/form'; import {withErrorHandling} from '../lib/error-handling'; -import qs - from 'querystringify'; -import interoperableErrors - from '../../../shared/interoperable-errors'; -import mailtrainConfig - from 'mailtrainConfig'; +import qs from 'querystringify'; +import interoperableErrors from '../../../shared/interoperable-errors'; +import mailtrainConfig from 'mailtrainConfig'; import {getUrl} from "../lib/urls"; import {withComponentMixins} from "../lib/decorator-helpers"; @@ -67,6 +62,7 @@ export default class Login extends Component { } } + @withFormErrorHandlers async submitHandler() { const t = this.props.t; diff --git a/client/src/login/Reset.js b/client/src/login/Reset.js index 08316b95..e17fd12d 100644 --- a/client/src/login/Reset.js +++ b/client/src/login/Reset.js @@ -2,29 +2,13 @@ import React, {Component} from 'react'; import {withTranslation} from '../lib/i18n'; -import { - Title, - withPageHelpers -} from '../lib/page' +import {Title, withPageHelpers} from '../lib/page' import {Link} from 'react-router-dom' -import { - Button, - ButtonRow, - Form, - FormSendMethod, - InputField, - withForm -} from '../lib/form'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; -import passwordValidator - from '../../../shared/password-validator'; -import axios - from '../lib/axios'; -import interoperableErrors - from '../../../shared/interoperable-errors'; +import {Button, ButtonRow, Form, FormSendMethod, InputField, withForm, withFormErrorHandlers} from '../lib/form'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; +import passwordValidator from '../../../shared/password-validator'; +import axios from '../lib/axios'; +import interoperableErrors from '../../../shared/interoperable-errors'; import {getUrl} from "../lib/urls"; import {withComponentMixins} from "../lib/decorator-helpers"; @@ -102,6 +86,7 @@ export default class Account extends Component { state.setIn(['password2', 'error'], password !== password2 ? t('passwordsMustMatch') : null); } + @withFormErrorHandlers async submitHandler() { const t = this.props.t; diff --git a/client/src/login/root.js b/client/src/login/root.js index 1a2e0f5f..a60da9b8 100644 --- a/client/src/login/root.js +++ b/client/src/login/root.js @@ -1,15 +1,10 @@ 'use strict'; -import React - from 'react'; -import Login - from './Login'; -import Reset - from './Forgot'; -import ResetLink - from './Reset'; -import mailtrainConfig - from 'mailtrainConfig'; +import React from 'react'; +import Login from './Login'; +import Reset from './Forgot'; +import ResetLink from './Reset'; +import mailtrainConfig from 'mailtrainConfig'; function getMenus(t) { diff --git a/client/src/namespaces/CUD.js b/client/src/namespaces/CUD.js index f2ddac83..048d186d 100644 --- a/client/src/namespaces/CUD.js +++ b/client/src/namespaces/CUD.js @@ -1,36 +1,15 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page'; -import { - Button, - ButtonRow, - Form, - FormSendMethod, - InputField, - TextArea, - TreeTableSelect, - withForm -} from '../lib/form'; -import axios - from '../lib/axios'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; -import interoperableErrors - from '../../../shared/interoperable-errors'; +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page'; +import {Button, ButtonRow, Form, FormSendMethod, InputField, TextArea, TreeTableSelect, withForm} from '../lib/form'; +import axios from '../lib/axios'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; +import interoperableErrors from '../../../shared/interoperable-errors'; import {DeleteModalDialog} from "../lib/modals"; -import mailtrainConfig - from 'mailtrainConfig'; +import mailtrainConfig from 'mailtrainConfig'; import {getGlobalNamespaceId} from "../../../shared/namespaces"; import {getUrl} from "../lib/urls"; import {withComponentMixins} from "../lib/decorator-helpers"; diff --git a/client/src/namespaces/List.js b/client/src/namespaces/List.js index 8ce7fbfb..8185cd7f 100644 --- a/client/src/namespaces/List.js +++ b/client/src/namespaces/List.js @@ -2,25 +2,12 @@ import React, {Component} from 'react'; import {withTranslation} from '../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../lib/page'; import {TreeTable} from '../lib/tree'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; import {Icon} from "../lib/bootstrap-components"; import {checkPermissions} from "../lib/permissions"; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../lib/modals"; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../lib/modals"; import {getGlobalNamespaceId} from "../../../shared/namespaces"; import {withComponentMixins} from "../lib/decorator-helpers"; diff --git a/client/src/reports/CUD.js b/client/src/reports/CUD.js index 7966091d..2741d49e 100644 --- a/client/src/reports/CUD.js +++ b/client/src/reports/CUD.js @@ -1,15 +1,9 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page'; import { Button, ButtonRow, @@ -22,21 +16,12 @@ import { TextArea, withForm } from '../lib/form'; -import axios - from '../lib/axios'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; -import moment - from 'moment'; -import { - NamespaceSelect, - validateNamespace -} from '../lib/namespace'; +import axios from '../lib/axios'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; +import moment from 'moment'; +import {NamespaceSelect, validateNamespace} from '../lib/namespace'; import {DeleteModalDialog} from "../lib/modals"; -import mailtrainConfig - from 'mailtrainConfig'; +import mailtrainConfig from 'mailtrainConfig'; import {getUrl} from "../lib/urls"; import {withComponentMixins} from "../lib/decorator-helpers"; diff --git a/client/src/reports/List.js b/client/src/reports/List.js index d5e63b9a..bc168188 100644 --- a/client/src/reports/List.js +++ b/client/src/reports/List.js @@ -2,31 +2,16 @@ import React, {Component} from 'react'; import {withTranslation} from '../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../lib/page'; import {Table} from '../lib/table'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; -import moment - from 'moment'; -import axios - from '../lib/axios'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; +import moment from 'moment'; +import axios from '../lib/axios'; import {ReportState} from '../../../shared/reports'; import {Icon} from "../lib/bootstrap-components"; import {checkPermissions} from "../lib/permissions"; import {getUrl} from "../lib/urls"; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../lib/modals"; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../lib/modals"; import {withComponentMixins} from "../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/reports/ViewAndOutput.js b/client/src/reports/ViewAndOutput.js index 557bb019..85342934 100644 --- a/client/src/reports/ViewAndOutput.js +++ b/client/src/reports/ViewAndOutput.js @@ -2,24 +2,13 @@ import React, {Component} from 'react'; import {withTranslation} from '../lib/i18n'; -import { - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../lib/page' -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; -import axios - from '../lib/axios'; +import {requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../lib/page' +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; +import axios from '../lib/axios'; import {ReportState} from '../../../shared/reports'; import {getUrl} from "../lib/urls"; import {Button} from "../lib/bootstrap-components"; -import {Link} from "react-router-dom"; -import PropTypes - from "prop-types"; +import PropTypes from "prop-types"; import {withComponentMixins} from "../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/reports/templates/CUD.js b/client/src/reports/templates/CUD.js index 29139343..12155eb2 100644 --- a/client/src/reports/templates/CUD.js +++ b/client/src/reports/templates/CUD.js @@ -1,16 +1,10 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {Trans} from 'react-i18next'; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../../lib/page' +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../../lib/page' import { ACEEditor, Button, @@ -23,13 +17,9 @@ import { withForm } from '../../lib/form'; import {withErrorHandling} from '../../lib/error-handling'; -import { - NamespaceSelect, - validateNamespace -} from '../../lib/namespace'; +import {NamespaceSelect, validateNamespace} from '../../lib/namespace'; import {DeleteModalDialog} from "../../lib/modals"; -import mailtrainConfig - from 'mailtrainConfig'; +import mailtrainConfig from 'mailtrainConfig'; import 'brace/mode/javascript'; import 'brace/mode/json'; import 'brace/mode/handlebars'; diff --git a/client/src/reports/templates/List.js b/client/src/reports/templates/List.js index f489acff..e0070391 100644 --- a/client/src/reports/templates/List.js +++ b/client/src/reports/templates/List.js @@ -2,33 +2,14 @@ import React, {Component} from 'react'; import {withTranslation} from '../../lib/i18n'; -import { - ButtonDropdown, - Icon -} from '../../lib/bootstrap-components'; -import { - DropdownLink, - NavDropdown, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../../lib/page'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../../lib/error-handling'; +import {ButtonDropdown, Icon} from '../../lib/bootstrap-components'; +import {DropdownLink, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../../lib/page'; +import {withAsyncErrorHandler, withErrorHandling} from '../../lib/error-handling'; import {Table} from '../../lib/table'; -import moment - from 'moment'; -import mailtrainConfig - from 'mailtrainConfig'; +import moment from 'moment'; +import mailtrainConfig from 'mailtrainConfig'; import {checkPermissions} from "../../lib/permissions"; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../../lib/modals"; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../../lib/modals"; import {withComponentMixins} from "../../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/root.js b/client/src/root.js index 5c855a05..0e0e15ce 100644 --- a/client/src/root.js +++ b/client/src/root.js @@ -3,52 +3,27 @@ import './lib/public-path'; import React, {Component} from 'react'; -import ReactDOM - from 'react-dom'; +import ReactDOM from 'react-dom'; import {I18nextProvider} from 'react-i18next'; import i18n, {withTranslation} from './lib/i18n'; -import account - from './account/root'; -import login - from './login/root'; -import blacklist - from './blacklist/root'; -import lists - from './lists/root'; -import namespaces - from './namespaces/root'; -import reports - from './reports/root'; -import campaigns - from './campaigns/root'; -import templates - from './templates/root'; -import users - from './users/root'; -import sendConfigurations - from './send-configurations/root'; -import settings - from './settings/root'; +import account from './account/root'; +import login from './login/root'; +import blacklist from './blacklist/root'; +import lists from './lists/root'; +import namespaces from './namespaces/root'; +import reports from './reports/root'; +import campaigns from './campaigns/root'; +import templates from './templates/root'; +import users from './users/root'; +import sendConfigurations from './send-configurations/root'; +import settings from './settings/root'; -import { - DropdownLink, - getLanguageChooser, - NavDropdown, - NavLink, - Section -} from "./lib/page"; +import {DropdownLink, getLanguageChooser, NavDropdown, NavLink, Section} from "./lib/page"; -import mailtrainConfig - from 'mailtrainConfig'; -import Home - from "./Home"; -import { - DropdownActionLink, - Icon -} from "./lib/bootstrap-components"; -import {Link} from "react-router-dom"; -import axios - from './lib/axios'; +import mailtrainConfig from 'mailtrainConfig'; +import Home from "./Home"; +import {DropdownActionLink, Icon} from "./lib/bootstrap-components"; +import axios from './lib/axios'; import {getUrl} from "./lib/urls"; import {withComponentMixins} from "./lib/decorator-helpers"; diff --git a/client/src/send-configurations/CUD.js b/client/src/send-configurations/CUD.js index e85187fa..c0d8f605 100644 --- a/client/src/send-configurations/CUD.js +++ b/client/src/send-configurations/CUD.js @@ -1,16 +1,10 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {Trans} from 'react-i18next'; import {withTranslation} from '../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page' +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page' import { Button, ButtonRow, @@ -24,26 +18,18 @@ import { withForm } from '../lib/form'; import {withErrorHandling} from '../lib/error-handling'; -import { - NamespaceSelect, - validateNamespace -} from '../lib/namespace'; +import {NamespaceSelect, validateNamespace} from '../lib/namespace'; import {DeleteModalDialog} from "../lib/modals"; import {getMailerTypes} from "./helpers"; -import { - getSystemSendConfigurationId, - MailerType -} from "../../../shared/send-configurations"; +import {getSystemSendConfigurationId, MailerType} from "../../../shared/send-configurations"; -import styles - from "../lib/styles.scss"; +import styles from "../lib/styles.scss"; import sendConfigurationsStyles from "./styles.scss"; -import mailtrainConfig - from 'mailtrainConfig'; +import mailtrainConfig from 'mailtrainConfig'; import {withComponentMixins} from "../lib/decorator-helpers"; diff --git a/client/src/send-configurations/List.js b/client/src/send-configurations/List.js index 02bfd15f..1392d7e5 100644 --- a/client/src/send-configurations/List.js +++ b/client/src/send-configurations/List.js @@ -3,27 +3,13 @@ import React, {Component} from 'react'; import {withTranslation} from '../lib/i18n'; import {Icon} from '../lib/bootstrap-components'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../lib/page'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; +import {LinkButton, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../lib/page'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; import {Table} from '../lib/table'; -import moment - from 'moment'; +import moment from 'moment'; import {getMailerTypes} from './helpers'; import {checkPermissions} from "../lib/permissions"; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../lib/modals"; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../lib/modals"; import {withComponentMixins} from "../lib/decorator-helpers"; diff --git a/client/src/send-configurations/helpers.js b/client/src/send-configurations/helpers.js index 43f58264..ea9f2235 100644 --- a/client/src/send-configurations/helpers.js +++ b/client/src/send-configurations/helpers.js @@ -3,13 +3,7 @@ import React from "react"; import {MailerType, ZoneMTAType} from "../../../shared/send-configurations"; -import { - CheckBox, - Dropdown, - Fieldset, - InputField, - TextArea -} from "../lib/form"; +import {CheckBox, Dropdown, Fieldset, InputField, TextArea} from "../lib/form"; import {Trans} from "react-i18next"; import styles from "./styles.scss"; import mailtrainConfig from 'mailtrainConfig'; diff --git a/client/src/settings/Update.js b/client/src/settings/Update.js index 95316c25..10bcb8cf 100644 --- a/client/src/settings/Update.js +++ b/client/src/settings/Update.js @@ -1,15 +1,10 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {Trans} from 'react-i18next'; import {withTranslation} from '../lib/i18n'; -import { - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page'; +import {requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page'; import { Button, ButtonRow, @@ -18,7 +13,8 @@ import { FormSendMethod, InputField, TextArea, - withForm + withForm, + withFormErrorHandlers } from '../lib/form'; import {withErrorHandling} from '../lib/error-handling'; import {withComponentMixins} from "../lib/decorator-helpers"; @@ -51,6 +47,7 @@ export default class Update extends Component { const t = this.props.t; } + @withFormErrorHandlers async submitHandler() { const t = this.props.t; diff --git a/client/src/shares/Share.js b/client/src/shares/Share.js index 81b2f0e8..ef711cb9 100644 --- a/client/src/shares/Share.js +++ b/client/src/shares/Share.js @@ -1,31 +1,14 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../lib/i18n'; -import { - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; -import { - Button, - ButtonRow, - Form, - FormSendMethod, - TableSelect, - withForm -} from '../lib/form'; +import {requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; +import {Button, ButtonRow, Form, FormSendMethod, TableSelect, withForm, withFormErrorHandlers} from '../lib/form'; import {Table} from '../lib/table'; -import axios - from '../lib/axios'; -import mailtrainConfig - from 'mailtrainConfig'; +import axios from '../lib/axios'; +import mailtrainConfig from 'mailtrainConfig'; import {getUrl} from "../lib/urls"; import {withComponentMixins} from "../lib/decorator-helpers"; @@ -91,6 +74,7 @@ export default class Share extends Component { } } + @withFormErrorHandlers async submitHandler() { const t = this.props.t; diff --git a/client/src/shares/UserShares.js b/client/src/shares/UserShares.js index 395e6dc1..f86c2d76 100644 --- a/client/src/shares/UserShares.js +++ b/client/src/shares/UserShares.js @@ -1,21 +1,12 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../lib/i18n'; -import { - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; +import {requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; import {Table} from '../lib/table'; -import axios - from '../lib/axios'; +import axios from '../lib/axios'; import {Icon} from "../lib/bootstrap-components"; import {getUrl} from "../lib/urls"; import {withComponentMixins} from "../lib/decorator-helpers"; diff --git a/client/src/templates/CUD.js b/client/src/templates/CUD.js index d01b9975..be51c0e3 100644 --- a/client/src/templates/CUD.js +++ b/client/src/templates/CUD.js @@ -8,14 +8,16 @@ import { Button, ButtonRow, CheckBox, - Dropdown, filterData, + Dropdown, + filterData, Form, FormSendMethod, InputField, StaticField, TableSelect, TextArea, - withForm, withFormErrorHandlers + withForm, + withFormErrorHandlers } from '../lib/form'; import {withErrorHandling} from '../lib/error-handling'; import {NamespaceSelect, validateNamespace} from '../lib/namespace'; @@ -28,7 +30,6 @@ import {getUrl} from "../lib/urls"; import {TestSendModalDialog} from "./TestSendModalDialog"; import {withComponentMixins} from "../lib/decorator-helpers"; import moment from 'moment'; -import {FieldWizard} from "../../../shared/lists"; @withComponentMixins([ diff --git a/client/src/templates/List.js b/client/src/templates/List.js index 10ed1d01..511717f7 100644 --- a/client/src/templates/List.js +++ b/client/src/templates/List.js @@ -3,27 +3,13 @@ import React, {Component} from 'react'; import {withTranslation} from '../lib/i18n'; import {Icon} from '../lib/bootstrap-components'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../lib/page'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../lib/error-handling'; +import {LinkButton, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../lib/page'; +import {withAsyncErrorHandler, withErrorHandling} from '../lib/error-handling'; import {Table} from '../lib/table'; -import moment - from 'moment'; +import moment from 'moment'; import {getTemplateTypes} from './helpers'; import {checkPermissions} from "../lib/permissions"; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../lib/modals"; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../lib/modals"; import {withComponentMixins} from "../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/templates/TestSendModalDialog.js b/client/src/templates/TestSendModalDialog.js index c2e1a821..2548c65d 100644 --- a/client/src/templates/TestSendModalDialog.js +++ b/client/src/templates/TestSendModalDialog.js @@ -2,24 +2,14 @@ import React, {Component} from 'react'; import {withTranslation} from '../lib/i18n'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {ModalDialog} from "../lib/bootstrap-components"; -import { - requiresAuthenticatedUser, - withPageHelpers -} from "../lib/page"; -import { - Form, - TableSelect, - withForm -} from "../lib/form"; +import {requiresAuthenticatedUser, withPageHelpers} from "../lib/page"; +import {Form, TableSelect, withForm} from "../lib/form"; import {withErrorHandling} from "../lib/error-handling"; -import moment - from "moment"; +import moment from "moment"; import {getMailerTypes} from "../send-configurations/helpers"; -import axios - from '../lib/axios'; +import axios from '../lib/axios'; import {getUrl} from "../lib/urls"; import {withComponentMixins} from "../lib/decorator-helpers"; diff --git a/client/src/templates/helpers.js b/client/src/templates/helpers.js index c9530c69..54e53c10 100644 --- a/client/src/templates/helpers.js +++ b/client/src/templates/helpers.js @@ -1,14 +1,7 @@ 'use strict'; -import React - from "react"; -import { - ACEEditor, - AlignedRow, - Dropdown, - StaticField, - TableSelect -} from "../lib/form"; +import React from "react"; +import {ACEEditor, AlignedRow, Dropdown, StaticField, TableSelect} from "../lib/form"; import 'brace/mode/text'; import 'brace/mode/html'; @@ -17,36 +10,17 @@ import {CKEditorHost} from "../lib/sandboxed-ckeditor"; import {GrapesJSHost} from "../lib/sandboxed-grapesjs"; import {CodeEditorHost} from "../lib/sandboxed-codeeditor"; -import { - getGrapesJSSourceTypeOptions, - GrapesJSSourceType -} from "../lib/sandboxed-grapesjs-shared"; +import {getGrapesJSSourceTypeOptions, GrapesJSSourceType} from "../lib/sandboxed-grapesjs-shared"; -import { - CodeEditorSourceType, - getCodeEditorSourceTypeOptions -} from "../lib/sandboxed-codeeditor-shared"; +import {CodeEditorSourceType, getCodeEditorSourceTypeOptions} from "../lib/sandboxed-codeeditor-shared"; import {getTemplateTypes as getMosaicoTemplateTypes} from './mosaico/helpers'; -import { - getPublicUrl, - getSandboxUrl, - getTrustedUrl -} from "../lib/urls"; -import mailtrainConfig - from 'mailtrainConfig'; -import { - ActionLink, - Button -} from "../lib/bootstrap-components"; +import {getSandboxUrl} from "../lib/urls"; +import mailtrainConfig from 'mailtrainConfig'; +import {ActionLink, Button} from "../lib/bootstrap-components"; import {Trans} from "react-i18next"; -import styles - from "../lib/styles.scss"; -import { - base, - unbase -} from "../../../shared/templates"; +import styles from "../lib/styles.scss"; export const ResourceType = { TEMPLATE: 'template', diff --git a/client/src/templates/mosaico/CUD.js b/client/src/templates/mosaico/CUD.js index 141f6fe3..e0425f46 100644 --- a/client/src/templates/mosaico/CUD.js +++ b/client/src/templates/mosaico/CUD.js @@ -1,37 +1,28 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../../lib/page' +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../../lib/page' import { Button, ButtonRow, Dropdown, + filterData, Form, FormSendMethod, - InputField, StaticField, + InputField, + StaticField, TextArea, - withForm + withForm, + withFormErrorHandlers } from '../../lib/form'; import {withErrorHandling} from '../../lib/error-handling'; -import { - NamespaceSelect, - validateNamespace -} from '../../lib/namespace'; +import {NamespaceSelect, validateNamespace} from '../../lib/namespace'; import {DeleteModalDialog} from "../../lib/modals"; -import {getVersafix, getMJMLSample} from "../../../../shared/mosaico-templates"; -import { - getTemplateTypes, - getTemplateTypesOrder -} from "./helpers"; +import {getMJMLSample, getVersafix} from "../../../../shared/mosaico-templates"; +import {getTemplateTypes, getTemplateTypesOrder} from "./helpers"; import {withComponentMixins} from "../../lib/decorator-helpers"; import styles from "../../lib/styles.scss"; @@ -58,7 +49,10 @@ export default class CUD extends Component { this.state = {}; - this.initForm(); + this.initForm({ + loadMutator: ::this.getFormValuesMutator, + submitMutator: ::this.submitFormValuesMutator + }); } static propTypes = { @@ -71,9 +65,14 @@ export default class CUD extends Component { this.templateTypes[data.type].afterLoad(this, data); } + submitFormValuesMutator(data) { + this.templateTypes[data.type].beforeSave(this, data); + return filterData(data, ['name', 'description', 'type', 'data', 'namespace']); + } + componentDidMount() { if (this.props.entity) { - this.getFormValuesFromEntity(this.props.entity, ::this.getFormValuesMutator); + this.getFormValuesFromEntity(this.props.entity); } else { const wizard = this.props.wizard; @@ -126,6 +125,7 @@ export default class CUD extends Component { validateNamespace(t, state); } + @withFormErrorHandlers async submitHandler(submitAndLeave) { const t = this.props.t; @@ -141,16 +141,14 @@ export default class CUD extends Component { this.disableForm(); this.setFormStatusMessage('info', t('saving')); - const submitResult = await this.validateAndSendFormValuesToURL(sendMethod, url, data => { - this.templateTypes[data.type].beforeSave(this, data); - }); + const submitResult = await this.validateAndSendFormValuesToURL(sendMethod, url); if (submitResult) { if (this.props.entity) { if (submitAndLeave) { this.navigateToWithFlashMessage('/templates/mosaico', 'success', t('Mosaico template updated')); } else { - await this.getFormValuesFromURL(`rest/mosaico-templates/${this.props.entity.id}`, ::this.getFormValuesMutator); + await this.getFormValuesFromURL(`rest/mosaico-templates/${this.props.entity.id}`); this.enableForm(); this.setFormStatusMessage('success', t('Mosaico template updated')); } diff --git a/client/src/templates/mosaico/List.js b/client/src/templates/mosaico/List.js index af2aebe9..888c0754 100644 --- a/client/src/templates/mosaico/List.js +++ b/client/src/templates/mosaico/List.js @@ -2,32 +2,14 @@ import React, {Component} from 'react'; import {withTranslation} from '../../lib/i18n'; -import { - ButtonDropdown, - Icon -} from '../../lib/bootstrap-components'; -import { - DropdownLink, - NavDropdown, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from '../../lib/page'; -import { - withAsyncErrorHandler, - withErrorHandling -} from '../../lib/error-handling'; +import {ButtonDropdown, Icon} from '../../lib/bootstrap-components'; +import {DropdownLink, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from '../../lib/page'; +import {withAsyncErrorHandler, withErrorHandling} from '../../lib/error-handling'; import {Table} from '../../lib/table'; -import moment - from 'moment'; +import moment from 'moment'; import {getTemplateTypes} from './helpers'; import {checkPermissions} from "../../lib/permissions"; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../../lib/modals"; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../../lib/modals"; import {withComponentMixins} from "../../lib/decorator-helpers"; diff --git a/client/src/templates/mosaico/mjml-mosaico.js b/client/src/templates/mosaico/mjml-mosaico.js index bfe8c622..a9ebdd85 100644 --- a/client/src/templates/mosaico/mjml-mosaico.js +++ b/client/src/templates/mosaico/mjml-mosaico.js @@ -2,7 +2,7 @@ import htmlparser from 'htmlparser2' import min from 'lodash/min'; -import mjml, {MJML, BodyComponent, HeadComponent} from "../../lib/mjml"; +import {BodyComponent, HeadComponent, MJML} from "../../lib/mjml"; import shortid from "shortid"; function getId() { diff --git a/client/src/users/CUD.js b/client/src/users/CUD.js index 87d442a6..a21c3741 100644 --- a/client/src/users/CUD.js +++ b/client/src/users/CUD.js @@ -1,35 +1,25 @@ 'use strict'; import React, {Component} from 'react'; -import PropTypes - from 'prop-types'; +import PropTypes from 'prop-types'; import {withTranslation} from '../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - withPageHelpers -} from '../lib/page'; +import {LinkButton, requiresAuthenticatedUser, Title, withPageHelpers} from '../lib/page'; import { Button, ButtonRow, + filterData, Form, FormSendMethod, InputField, TableSelect, - withForm + withForm, + withFormErrorHandlers } from '../lib/form'; import {withErrorHandling} from '../lib/error-handling'; -import interoperableErrors - from '../../../shared/interoperable-errors'; -import passwordValidator - from '../../../shared/password-validator'; -import mailtrainConfig - from 'mailtrainConfig'; -import { - NamespaceSelect, - validateNamespace -} from '../lib/namespace'; +import interoperableErrors from '../../../shared/interoperable-errors'; +import passwordValidator from '../../../shared/password-validator'; +import mailtrainConfig from 'mailtrainConfig'; +import {NamespaceSelect, validateNamespace} from '../lib/namespace'; import {DeleteModalDialog} from "../lib/modals"; import {withComponentMixins} from "../lib/decorator-helpers"; @@ -49,6 +39,8 @@ export default class CUD extends Component { this.state = {}; this.initForm({ + loadMutator: ::this.getFormValuesMutator, + submitMutator: ::this.submitFormValuesMutator, serverValidation: { url: 'rest/users-validate', changed: mailtrainConfig.isAuthMethodLocal ? ['username', 'email'] : ['username'], @@ -67,9 +59,13 @@ export default class CUD extends Component { data.password2 = ''; } + submitFormValuesMutator(data) { + return filterData(data, ['username', 'name', 'email', 'password', 'namespace', 'role']); + } + componentDidMount() { if (this.props.entity) { - this.getFormValuesFromEntity(this.props.entity, ::this.getFormValuesMutator); + this.getFormValuesFromEntity(this.props.entity); } else { this.populateFormValues({ username: '', @@ -158,6 +154,7 @@ export default class CUD extends Component { validateNamespace(t, state); } + @withFormErrorHandlers async submitHandler(submitAndLeave) { const t = this.props.t; @@ -174,16 +171,14 @@ export default class CUD extends Component { this.disableForm(); this.setFormStatusMessage('info', t('saving')); - const submitResult = await this.validateAndSendFormValuesToURL(sendMethod, url, data => { - delete data.password2; - }); + const submitResult = await this.validateAndSendFormValuesToURL(sendMethod, url); if (submitResult) { if (this.props.entity) { if (submitAndLeave) { this.navigateToWithFlashMessage('/users', 'success', t('User updated')); } else { - await this.getFormValuesFromURL(`rest/users/${this.props.entity.id}`, ::this.getFormValuesMutator); + await this.getFormValuesFromURL(`rest/users/${this.props.entity.id}`); this.enableForm(); this.setFormStatusMessage('success', t('User updated')); } diff --git a/client/src/users/List.js b/client/src/users/List.js index f0caeef5..1ac5f0eb 100644 --- a/client/src/users/List.js +++ b/client/src/users/List.js @@ -2,22 +2,11 @@ import React, {Component} from "react"; import {withTranslation} from '../lib/i18n'; -import { - LinkButton, - requiresAuthenticatedUser, - Title, - Toolbar, - withPageHelpers -} from "../lib/page"; +import {LinkButton, requiresAuthenticatedUser, Title, Toolbar, withPageHelpers} from "../lib/page"; import {Table} from "../lib/table"; -import mailtrainConfig - from "mailtrainConfig"; +import mailtrainConfig from "mailtrainConfig"; import {Icon} from "../lib/bootstrap-components"; -import { - tableAddDeleteButton, - tableRestActionDialogInit, - tableRestActionDialogRender -} from "../lib/modals"; +import {tableAddDeleteButton, tableRestActionDialogInit, tableRestActionDialogRender} from "../lib/modals"; import {withComponentMixins} from "../lib/decorator-helpers"; @withComponentMixins([ diff --git a/client/src/users/root.js b/client/src/users/root.js index eea2d8cc..db3bf555 100644 --- a/client/src/users/root.js +++ b/client/src/users/root.js @@ -1,13 +1,9 @@ 'use strict'; -import React - from 'react'; -import CUD - from './CUD'; -import List - from './List'; -import UserShares - from '../shares/UserShares'; +import React from 'react'; +import CUD from './CUD'; +import List from './List'; +import UserShares from '../shares/UserShares'; import {ellipsizeBreadcrumbLabel} from "../lib/helpers"; function getMenus(t) {