@ckeditor/ckeditor5-ui
Version:
The UI framework and standard UI library of CKEditor 5.
177 lines (176 loc) • 7.98 kB
JavaScript
/**
* @license Copyright (c) 2003-2025, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-licensing-options
*/
/**
* @module ui/labeledfield/utils
*/
import InputTextView from '../inputtext/inputtextview.js';
import InputNumberView from '../inputnumber/inputnumberview.js';
import TextareaView from '../textarea/textareaview.js';
import { createDropdown } from '../dropdown/utils.js';
/**
* A helper for creating labeled inputs.
*
* It creates an instance of a {@link module:ui/inputtext/inputtextview~InputTextView input text} that is
* logically related to a {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView labeled view} in DOM.
*
* The helper does the following:
*
* * It sets input's `id` and `ariaDescribedById` attributes.
* * It binds input's `isReadOnly` to the labeled view.
* * It binds input's `hasError` to the labeled view.
* * It enables a logic that cleans up the error when user starts typing in the input.
*
* Usage:
*
* ```ts
* const labeledInputView = new LabeledFieldView( locale, createLabeledInputText );
* console.log( labeledInputView.fieldView ); // A text input instance.
* ```
*
* @param labeledFieldView The instance of the labeled field view.
* @param viewUid A UID string that allows DOM logical connection between the
* {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#labelView labeled view's label} and the input.
* @param statusUid A UID string that allows DOM logical connection between the
* {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#statusView labeled view's status} and the input.
* @returns The input text view instance.
*/
const createLabeledInputText = (labeledFieldView, viewUid, statusUid) => {
const inputView = new InputTextView(labeledFieldView.locale);
inputView.set({
id: viewUid,
ariaDescribedById: statusUid
});
inputView.bind('isReadOnly').to(labeledFieldView, 'isEnabled', value => !value);
inputView.bind('hasError').to(labeledFieldView, 'errorText', value => !!value);
inputView.on('input', () => {
// UX: Make the error text disappear and disable the error indicator as the user
// starts fixing the errors.
labeledFieldView.errorText = null;
});
labeledFieldView.bind('isEmpty', 'isFocused', 'placeholder').to(inputView);
return inputView;
};
/**
* A helper for creating labeled number inputs.
*
* It creates an instance of a {@link module:ui/inputnumber/inputnumberview~InputNumberView input number} that is
* logically related to a {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView labeled view} in DOM.
*
* The helper does the following:
*
* * It sets input's `id` and `ariaDescribedById` attributes.
* * It binds input's `isReadOnly` to the labeled view.
* * It binds input's `hasError` to the labeled view.
* * It enables a logic that cleans up the error when user starts typing in the input.
*
* Usage:
*
* ```ts
* const labeledInputView = new LabeledFieldView( locale, createLabeledInputNumber );
* console.log( labeledInputView.fieldView ); // A number input instance.
* ```
*
* @param labeledFieldView The instance of the labeled field view.
* @param viewUid A UID string that allows DOM logical connection between the
* {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#labelView labeled view's label} and the input.
* @param statusUid A UID string that allows DOM logical connection between the
* {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#statusView labeled view's status} and the input.
* @returns The input number view instance.
*/
const createLabeledInputNumber = (labeledFieldView, viewUid, statusUid) => {
const inputView = new InputNumberView(labeledFieldView.locale);
inputView.set({
id: viewUid,
ariaDescribedById: statusUid,
inputMode: 'numeric'
});
inputView.bind('isReadOnly').to(labeledFieldView, 'isEnabled', value => !value);
inputView.bind('hasError').to(labeledFieldView, 'errorText', value => !!value);
inputView.on('input', () => {
// UX: Make the error text disappear and disable the error indicator as the user
// starts fixing the errors.
labeledFieldView.errorText = null;
});
labeledFieldView.bind('isEmpty', 'isFocused', 'placeholder').to(inputView);
return inputView;
};
/**
* A helper for creating labeled textarea.
*
* It creates an instance of a {@link module:ui/textarea/textareaview~TextareaView textarea} that is
* logically related to a {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView labeled view} in DOM.
*
* The helper does the following:
*
* * It sets textarea's `id` and `ariaDescribedById` attributes.
* * It binds textarea's `isReadOnly` to the labeled view.
* * It binds textarea's `hasError` to the labeled view.
* * It enables a logic that cleans up the error when user starts typing in the textarea.
*
* Usage:
*
* ```ts
* const labeledTextarea = new LabeledFieldView( locale, createLabeledTextarea );
* console.log( labeledTextarea.fieldView ); // A textarea instance.
* ```
*
* @param labeledFieldView The instance of the labeled field view.
* @param viewUid A UID string that allows DOM logical connection between the
* {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#labelView labeled view's label} and the textarea.
* @param statusUid A UID string that allows DOM logical connection between the
* {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#statusView labeled view's status} and the textarea.
* @returns The textarea view instance.
*/
const createLabeledTextarea = (labeledFieldView, viewUid, statusUid) => {
const textareaView = new TextareaView(labeledFieldView.locale);
textareaView.set({
id: viewUid,
ariaDescribedById: statusUid
});
textareaView.bind('isReadOnly').to(labeledFieldView, 'isEnabled', value => !value);
textareaView.bind('hasError').to(labeledFieldView, 'errorText', value => !!value);
textareaView.on('input', () => {
// UX: Make the error text disappear and disable the error indicator as the user
// starts fixing the errors.
labeledFieldView.errorText = null;
});
labeledFieldView.bind('isEmpty', 'isFocused', 'placeholder').to(textareaView);
return textareaView;
};
/**
* A helper for creating labeled dropdowns.
*
* It creates an instance of a {@link module:ui/dropdown/dropdownview~DropdownView dropdown} that is
* logically related to a {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView labeled field view}.
*
* The helper does the following:
*
* * It sets dropdown's `id` and `ariaDescribedById` attributes.
* * It binds input's `isEnabled` to the labeled view.
*
* Usage:
*
* ```ts
* const labeledInputView = new LabeledFieldView( locale, createLabeledDropdown );
* console.log( labeledInputView.fieldView ); // A dropdown instance.
* ```
*
* @param labeledFieldView The instance of the labeled field view.
* @param viewUid A UID string that allows DOM logical connection between the
* {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#labelView labeled view label} and the dropdown.
* @param statusUid A UID string that allows DOM logical connection between the
* {@link module:ui/labeledfield/labeledfieldview~LabeledFieldView#statusView labeled view status} and the dropdown.
* @returns The dropdown view instance.
*/
const createLabeledDropdown = (labeledFieldView, viewUid, statusUid) => {
const dropdownView = createDropdown(labeledFieldView.locale);
dropdownView.set({
id: viewUid,
ariaDescribedById: statusUid
});
dropdownView.bind('isEnabled').to(labeledFieldView);
return dropdownView;
};
export { createLabeledInputNumber, createLabeledInputText, createLabeledTextarea, createLabeledDropdown };