42BV/jarb-final-form

Crash when setting a Java collection type as validator in JarbCheckboxMultipleSelect

arjanvlek opened this issue · 1 comments

Background

I have a JarbCheckboxMultipleSelect which has the following props:

<JarbCheckboxMultipleSelect
  name="nestedObjects"
  label="Geneste Objecten"
  optionForValue={someValue => someValue.description}
  options={getPossibleValuesBasedOnOtherValues(form.getState().values)}
  jarb={{
    validator: 'TheEntity.nestedObjects',
    label: 'Geneste objecten'
  }}
/>

The Java class for the root-level entity looks as following:

package nl._42.customer.project.the.package.to;

import java.util.List;
import java.util.UUID;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import nl._42.customer.project.the.package.to.TheNestedEntity;

/**
 * A class to demonstrate the issue with Jarb
 */
@Entity
@Getter
@Setter
@EqualsAndHashCode(callSuper = false)
@ToString(callSuper = true)
public class TheEntity extends EntityWithCode {

    private UUID someRelatedId;

    private String description;

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "the_entity_id", updatable = false, nullable = false)
    private List<TheNestedEntity> nestedObjects;
}

This results in the /constraints endpoint giving the following response for the field nestedObjects:

"nestedObjects": {
   "javaType":"nl._42.customer.project.the.package.to.TheEntity",
   "required":false,
   "maximumLength":2147483647,
   "fractionLength":0,
   "radix":10,
   "name":"nestedObjects"
}

Expected behaviour

I expect that it is indicated whether or not it is required to pick at least one of the values using the checkboxes

Actual behaviour

The following error is logged and the application stops working:

utils.js:35 Uncaught TypeError: Cannot read property 'length' of undefined
    at Object.mostSpecificInputTypeFor (utils.js:35)
    at JarbField.getEnhancedValidate (JarbField.js:91)
    at JarbField.render (JarbField.js:184)
    at finishClassComponent (react-dom.development.js:17485)
    at updateClassComponent (react-dom.development.js:17435)
    at beginWork (react-dom.development.js:19073)
    at HTMLUnknownElement.callCallback (react-dom.development.js:3945)
    at Object.invokeGuardedCallbackDev (react-dom.development.js:3994)
    at invokeGuardedCallback (react-dom.development.js:4056)
    at beginWork$1 (react-dom.development.js:23964)
    at performUnitOfWork (react-dom.development.js:22776)
    at workLoopSync (react-dom.development.js:22707)
    at renderRootSync (react-dom.development.js:22670)
    at performSyncWorkOnRoot (react-dom.development.js:22293)
    at react-dom.development.js:11327
    at unstable_runWithPriority (scheduler.development.js:646)
    at runWithPriority$1 (react-dom.development.js:11276)
    at flushSyncCallbackQueueImpl (react-dom.development.js:11322)
    at flushSyncCallbackQueue (react-dom.development.js:11309)
    at discreteUpdates$1 (react-dom.development.js:22420)
    at discreteUpdates (react-dom.development.js:3756)
    at dispatchDiscreteEvent (react-dom.development.js:5889)

Your constraint has required false, if that would be true, you'd get the required message.