Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions apps/platform/src/journey/JourneyController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -211,15 +211,15 @@ router.get('/:journeyId/steps/:stepId/users', async ctx => {
ctx.body = await pagedUsersByStep(step.id, params)
})

router.delete('/:journeyId/users/:userId', async ctx => {
router.delete('/:journeyId/users/:userId/step/:stepId', async ctx => {
const user = await getUserFromContext(ctx)
if (!user) return ctx.throw(404)
const results = await JourneyUserStep.update(
q => q.where('user_id', user.id)
.whereNull('entrance_id')
q => q.where('id', parseInt(ctx.params.stepId))
.where('user_id', user.id)
.whereNull('ended_at')
.where('journey_id', ctx.state.journey!.id),
{ ended_at: new Date() },
{ ended_at: new Date(), delay_until: null, type: 'completed' },
)
ctx.body = { exits: results }
})
Expand Down
4 changes: 2 additions & 2 deletions apps/platform/src/journey/JourneyRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ export const pagedUsersByStep = async (stepId: number, params: PageParams) => {

export const getEntranceLog = async (entranceId: number) => {
const userSteps = await JourneyUserStep.all(q => q
.where(function() {
.where(function () {
return this.where('id', entranceId).orWhere('entrance_id', entranceId)
})
.orderBy('id', 'asc'),
Expand Down Expand Up @@ -364,7 +364,7 @@ export const exitUserFromJourney = async (userId: number, entranceId: number, jo
.where('id', entranceId)
.whereNull('ended_at')
.where('journey_id', journeyId),
{ ended_at: new Date() },
{ ended_at: new Date(), delay_until: null, type: 'completed' },
)
}

Expand Down
2 changes: 1 addition & 1 deletion apps/platform/src/journey/JourneyUserStep.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export default class JourneyUserStep extends Model {
type!: string
journey_id!: number
step_id!: number
delay_until?: Date
delay_until?: Date | null
entrance_id?: number
ended_at?: Date
data?: Record<string, unknown> | null
Expand Down
1 change: 1 addition & 0 deletions apps/ui/public/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,7 @@
"setup_integration_no_providers": "There are no providers configured for this channel. Please add a provider to continue.",
"sign_out": "Sign Out",
"skip_delay": "Skip Delay",
"remove_from_journey": "Remove from journey",
"sms_opt_out_message": "SMS Opt Out Message",
"sms_opt_out_message_subtitle": "Instructions on how to opt out of SMS that will be appended to every text.",
"sms_help_message": "SMS Help Message",
Expand Down
3 changes: 3 additions & 0 deletions apps/ui/src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,9 @@ const api = {
skipDelay: async (projectId: number | string, journeyId: number | string, userId: number | string, stepId: number | string) => await client
.post<JourneyEntranceDetail>(`${projectUrl(projectId)}/journeys/${journeyId}/users/${userId}/steps/${stepId}/resume`)
.then(r => r.data),
removeFromJourney: async (projectId: number | string, journeyId: number | string, userId: number | string, stepId: number | string) => await client
.delete<number>(`${projectUrl(projectId)}/journeys/${journeyId}/users/${userId}/step/${stepId}`)
.then(r => r.data),
},
},

Expand Down
19 changes: 16 additions & 3 deletions apps/ui/src/views/journey/JourneyStepUsers.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { UserLookup } from '../users/UserLookup'
import { typeVariants } from './EntranceDetails'
import { ModalProps } from '../../ui/Modal'
import { JourneyUserStep, User } from '../../types'
import { EditIcon } from '../../ui/icons'
import { EditIcon, TrashIcon } from '../../ui/icons'
import { DataTableCol } from '../../ui/DataTable'

interface StepUsersProps extends Omit<ModalProps, 'title'> {
Expand All @@ -28,13 +28,21 @@ export function JourneyStepUsers({ open, onClose, stepType, stepId }: StepUsersP
? [{
key: 'options',
title: t('options'),
cell: ({ item: { id, user } }) => {
if (user) {
cell: ({ item: { id, user, type } }) => {
if (user && type !== 'completed') {
return (
<Menu size="small">
<MenuItem onClick={async () => await handleSkipDelay(id, user)}>
<EditIcon />{t('skip_delay')}
</MenuItem>
<MenuItem>
<Button icon={<TrashIcon />}
variant="destructive"
onClick={async () => await handleRemoveFromJourney(id, user)}
size="small">
{t('remove_from_journey')}
</Button>
</MenuItem>
</Menu>
)
}
Expand All @@ -59,6 +67,11 @@ export function JourneyStepUsers({ open, onClose, stepType, stepId }: StepUsersP
await state.reload()
}

const handleRemoveFromJourney = async (stepId: number, user: User) => {
await api.journeys.users.removeFromJourney(projectId, journeyId, user.id, stepId)
await state.reload()
}

return <>
<Modal
open={open}
Expand Down