request = $request; } /** * Creates Form * * @param string|null $name Form name. * * @return Form */ public function create( ?string $name = null ): Form { $form = new Form( $name ); $form->httpRequest = $this->request; $form->allowCrossOrigin(); return $form; } public function addDimension( Container $container, string $name, string $label, string $unit ): TextInput { $numberInputType = $this->getNumType( $unit ); switch ( $numberInputType ) { case Form::INTEGER: $numberInput = $container->addInteger( $name, sprintf( '%s (%s)', $label, $unit ) ); break; case Form::FLOAT: $numberInput = $container->addText( $name, sprintf( '%s (%s)', $label, $unit ) )->addRule( Form::FLOAT ); break; default: throw new \InvalidArgumentException( 'Unsupported number input type: ' . $numberInputType ); } $numberInput ->setHtmlType( 'number' ) ->setHtmlAttribute( 'step', 'any' ) ->addRule( Form::MIN, null, $this->setMinValue( $unit ) ); return $numberInput; } private function getNumType( string $unit ): string { if ( $unit === OptionsProvider::DIMENSIONS_UNIT_CM ) { return Form::FLOAT; } return Form::INTEGER; } private function setMinValue( string $unit ): float { if ( $unit === OptionsProvider::DIMENSIONS_UNIT_CM ) { return 0.1; } return 1; } }