form()->eligible_agent_count() <= 1; } /** * Build the step descriptor. * * @param BookingSession $session Session. */ public function descriptor( BookingSession $session ): StepDescriptor { return $this->build_descriptor( $session, [ 'eligible_count' => $session->form()->eligible_agent_count() ], [ [ 'key' => 'agent_id', 'type' => 'integer', 'required' => false, ], [ 'key' => 'any_agent', 'type' => 'boolean', 'required' => false, ], ] ); } /** * Validate submitted input. * * @param BookingSession $session Session. * @param array $input Payload. */ public function validate( BookingSession $session, array $input ): ValidationResult { if ( $this->should_skip( $session ) ) { return ValidationResult::ok(); } $any = isset( $input['any_agent'] ) && true === $input['any_agent']; $id = $this->positive_int( $input, 'agent_id' ); if ( ! $any && null === $id ) { return ValidationResult::invalid( [ 'agent_id' => 'Please choose a staff member or any available.' ] ); } return ValidationResult::ok(); } /** * Apply validated input. * * @param BookingSession $session Session. * @param array $input Payload. */ public function apply( BookingSession $session, array $input ): BookingSession { $any = isset( $input['any_agent'] ) && true === $input['any_agent']; $id = $any ? null : $this->positive_int( $input, 'agent_id' ); return $session->with_draft( $session->draft()->with_agent( $id, $any ) ); } }