dtInput is a directive that applies styling to native <input> and <textarea> elements and allows them to work with <dt-form-field>.

<input
  type="text"
  dtInput
  placeholder="Please insert text"
  aria-label="Please insert text"
/>
<textarea
  dtInput
  placeholder="Please insert text"
  aria-label="Please insert text"
></textarea>

Imports

You have to import the DtInputModule when you want to use dtInput.

@NgModule({
  imports: [DtInputModule],
})
class MyModule {}

Initialization

The dtInput directive can be added to <input> and <textarea> elements.

All valid <input> and <textarea> attributes can be used on dtInput including ngModel and formControl. The only exception is the type attribute where not all values are possible.

Invalid input types

Invalid type(s) Description
button, image, reset, submit Use the button component instead.
checkbox Use the checkbox component instead.
file Is not (yet) supported. Maybe there will be an upload component in the future.
hidden Hidden input fields should not be a thing in a client side app. They also do not need styling.
radio Use the radio-button component instead.
range Is not (yet) supported. Maybe there will be a slider/range component in the future.

Inputs

Name Type Default Description
id string - Id of the element.
disabled boolean false Whether the element is disabled.
required boolean false Whether the input is required. Used for validation.
placeholder string - Input placeholder text.
type string text Input type of the element. See valid types above.
value string - Input value of the input.
readonly boolean false Whether the input is readonly.
errorStateMatcher ErrorStateMatcher DefaultErrorStateMatcher A class used to control when error messages are shown.

Properties

Name Type Description
empty boolean Whether the input is empty.

Input and ngModel

The dtInput works with ngModel as shown in the following example.

<input
  dtInput
  required
  placeholder="Enter Text"
  aria-label="Enter text"
  [(ngModel)]="textValue"
  #textControl="ngModel"
/>
<p>
  Output:
  <em>{{ textValue || 'none' }}</em>
</p>
<!-- The lines below are just for the showcase, do not use this in production -->
<p>
  Touched: {{ textControl.touched }}
  <br />
  Dirty: {{ textControl.dirty }}
  <br />
  Status: {{ textControl.control?.status }}
  <br />
</p>

Dark background

Input fields can be placed on dark background.

<section class="dt-example-dark" dtTheme=":dark">
  <p>
    <input
      type="text"
      dtInput
      #input
      placeholder="Please insert text"
      value="Text"
      aria-label="Please insert text"
    />
    <textarea
      dtInput
      #textarea
      placeholder="Please insert text"
      aria-label="Please insert text"
    >
Text</textarea
    >
  </p>
  <button
    dt-button
    (click)="
          input.disabled = !input.disabled;
          textarea.disabled = !textarea.disabled
        "
  >
    Toggle disabled
  </button>
</section>

Accessibility

The dtInput directive works with native <input> and <textarea> to provide an accessible experience. If there's no <dt-form-field> used and the input does not contain a <dt-label>, aria-label or aria-labelledby attribute, it should be added. Any dt-error and dt-hint are automatically added to the input's aria-describedby list, and aria-invalid is automatically updated based on the input's validity state.

Input validation

For input validation, please consider the validation guidelines.

Hints

Input fields can be extended by hints that should help the user preventing errors. Use the form field component to combine input fields and hints.

Input fields in use

Input fields can be disabled or readonly.

<input
  dtInput
  placeholder="Please insert text"
  [disabled]="isDisabled"
  aria-label="Please insert text"
/>
<p>
  <button dt-button (click)="isDisabled = !isDisabled">
    Toggle disabled
  </button>
</p>
<input
  dtInput
  placeholder="Please insert text"
  [readonly]="isReadonly"
  aria-label="Please insert text"
/>
<p>
  <button dt-button (click)="isReadonly = !isReadonly">
    Toggle readonly
  </button>
</p>

Input values

Mandatory vs. optional input fields

In Dynatrace all displayed input fields are mandatory. If an input field is optional this is indicated by a placeholder text optional.

<form>
  <dt-form-field>
    <dt-label>Name</dt-label>
    <input
      type="text"
      dtInput
      placeholder="John Smith"
      aria-label="Please insert your full name"
    />
  </dt-form-field>
  <dt-form-field>
    <dt-label>Email address</dt-label>
    <input
      type="email"
      dtInput
      placeholder="optional, e.g. john@smith.com"
      aria-label="Please insert your email address"
    />
  </dt-form-field>
</form>

It is not possible to overwrite mandatory information with an empty field. In that case an error would appear informing the user that this action is not possible.

Saved data from previous entries

If there is saved data from a previous entry, it should always be displayed. In case of a password or other sensitive data, it should be masked. This helps the user to understand that information has already been entered.

Input fields in a form

When input fields are used in a form together with labels and buttons use the following measures. This ensures that the components have enough space to be clicked or tapped on mobile.

<form>
  <dt-form-field>
    <dt-label>Name</dt-label>
    <input
      type="text"
      dtInput
      placeholder="John Smith"
      aria-label="Please insert your full name"
    />
  </dt-form-field>
  <dt-form-field>
    <dt-label>Email address</dt-label>
    <input
      type="email"
      dtInput
      placeholder="john@smith.com"
      aria-label="Please insert your email address"
    />
  </dt-form-field>
  <button dt-button>Save</button>
</form>