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 })