diff --git a/src/components/CampaignTextingHoursForm.jsx b/src/components/CampaignTextingHoursForm.jsx index d69218f14..4bc3a44f9 100644 --- a/src/components/CampaignTextingHoursForm.jsx +++ b/src/components/CampaignTextingHoursForm.jsx @@ -24,7 +24,7 @@ export default class CampaignTextingHoursForm extends React.Component { textingHoursEnforced: yup.boolean(), textingHoursStart: yup.number().integer(), textingHoursEnd: yup.number().integer(), - timezone: yup.string() + timezone: yup.string().required() }) fireOnChangeIfTheFormValuesChanged(fieldName, newValue) { @@ -159,20 +159,22 @@ export default class CampaignTextingHoursForm extends React.Component { > - {this.addToggleFormField( + {/* Removed because it will always be true */} + {/*this.addToggleFormField( 'overrideOrganizationTextingHours', 'Override organization texting hours?' - )} + )*/} {this.props.formValues.overrideOrganizationTextingHours ? (
- {this.addToggleFormField( + {/* Removed because it will always be true */} + {/*this.addToggleFormField( 'textingHoursEnforced', 'Texting hours enforced?' - )} + )*/} {this.props.formValues.textingHoursEnforced ? (
diff --git a/src/containers/AdminCampaignEdit.jsx b/src/containers/AdminCampaignEdit.jsx index 19a3c3d72..c04dd43ed 100644 --- a/src/containers/AdminCampaignEdit.jsx +++ b/src/containers/AdminCampaignEdit.jsx @@ -67,13 +67,18 @@ const campaignInfoFragment = ` editors ` +const valueOverrides = { + overrideOrganizationTextingHours: true, + textingHoursEnforced: true +} + class AdminCampaignEdit extends React.Component { constructor(props) { super(props) const isNew = props.location.query.new this.state = { expandedSection: isNew ? 0 : null, - campaignFormValues: props.campaignData.campaign, + campaignFormValues: Object.assign(props.campaignData.campaign, valueOverrides), startingCampaign: false } } @@ -126,7 +131,7 @@ class AdminCampaignEdit extends React.Component { } this.setState({ - campaignFormValues: pushToFormValues + campaignFormValues: Object.assign({}, pushToFormValues, valueOverrides) }) } diff --git a/src/server/api/schema.js b/src/server/api/schema.js index d44c7bfc9..da26a0bc0 100644 --- a/src/server/api/schema.js +++ b/src/server/api/schema.js @@ -929,6 +929,10 @@ const rootMutations = { return [] }, + // We've modified campaign creation on the client so that overrideOrganizationHours is always true + // and enforce_texting_hours is always true + // as a result, we're forcing admins to think about the time zone of each campaign + // and saving a join on this query. sendMessage: async (_, { message, campaignContactId }, { user, loaders }) => { const record = (await r.knex('campaign_contact') .join('campaign', 'campaign_contact.campaign_id', 'campaign.id') @@ -936,9 +940,8 @@ const rootMutations = { .where({ 'campaign.is_archived': false }) .where({ 'campaign_contact.assignment_id': parseInt(message.assignmentId) }) .join('assignment', 'campaign_contact.assignment_id', 'assignment.id') - .join('organization', 'organization.id', 'campaign.organization_id') .leftJoin('opt_out', { - 'opt_out.organization_id': 'organization.id', + // 'opt_out.organization_id': 'campaign.organization.id', 'opt_out.cell': 'campaign_contact.cell' }) .select( @@ -952,16 +955,18 @@ const rootMutations = { 'campaign.texting_hours_end as c_texting_hours_end', 'campaign.texting_hours_enforced as c_texting_hours_enforced', 'assignment.user_id as a_assignment_user_id', - 'organization.texting_hours_enforced as o_texting_hours_enforced', - 'organization.texting_hours_end as o_texting_hours_end', 'opt_out.id as is_opted_out', 'campaign_contact.timezone_offset as contact_timezone_offset' ))[0] - + if (!record) { throw new GraphQLError('Your assignment has changed') } + // setting defaults based on new forced conditions + record.o_texting_hours_enforced = true; + record.o_texting_hours_end = 21; + // This block will only need to be evaluated if message is sent from admin Message Review if (record.a_assignment_user_id !== user.id) { const currentRoles = await r @@ -1072,7 +1077,8 @@ const rootMutations = { return contact })() - const [messageInstance, contactUpdateResult] = await Promise.all([messageSavePromise, contactSavePromise]) + const [messageInsertResult, contactUpdateResult] = await Promise.all([messageSavePromise, contactSavePromise]) + const messageInstance = Array.isArray(messageInsertResult) ? messageInsertResult[0] : messageInsertResult; // Send message after we are sure messageInstance has been persisted const service = serviceMap[messageInstance.service || process.env.DEFAULT_SERVICE] diff --git a/src/server/models/campaign.js b/src/server/models/campaign.js index dd2314bf3..ffab9e0f0 100644 --- a/src/server/models/campaign.js +++ b/src/server/models/campaign.js @@ -48,9 +48,6 @@ const Campaign = thinky.createModel('campaign', type.object().schema({ .default(21), timezone: type .string() - .required() - .default('US/Eastern') - }).allowExtra(false), { noAutoCreation: true })