Skip to content

Commit f8a7fa0

Browse files
authored
IBX-10258: Input Text - clear action (#6)
1 parent 237d301 commit f8a7fa0

File tree

8 files changed

+186
-70
lines changed

8 files changed

+186
-70
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import Base from '../../shared/Base';
2+
3+
export default class InpuText extends Base {
4+
private _inputElement: HTMLInputElement;
5+
private _actionsElement: HTMLDivElement;
6+
private _clearBtnElement: HTMLButtonElement;
7+
8+
constructor(container: HTMLDivElement) {
9+
super(container);
10+
11+
this._actionsElement = container.querySelector('.ids-input-text__actions') as HTMLDivElement;
12+
this._inputElement = container.querySelector('.ids-input-text__source .ids-input') as HTMLInputElement;
13+
this._clearBtnElement = this._actionsElement.querySelector('.ids-clear-btn') as HTMLButtonElement;
14+
}
15+
16+
private _updateInputPadding() {
17+
const actionsWidth = this._actionsElement.offsetWidth;
18+
19+
this._inputElement.style.paddingRight = `${actionsWidth.toString()}px`;
20+
}
21+
22+
changeValue(value: string) {
23+
const isNewValue = this._inputElement.value !== value;
24+
25+
if (isNewValue) {
26+
this._inputElement.value = value;
27+
28+
this._inputElement.dispatchEvent(new Event('input', { bubbles: true }));
29+
}
30+
}
31+
32+
updateClearBtnVisibility() {
33+
const isEmpty = this._inputElement.value === '';
34+
35+
this._clearBtnElement.parentElement?.classList.toggle('ids-input-text__action--hidden', isEmpty);
36+
}
37+
38+
initInputListeners() {
39+
this._inputElement.addEventListener('input', () => {
40+
this.updateClearBtnVisibility();
41+
this._updateInputPadding();
42+
});
43+
}
44+
45+
initClearBtn() {
46+
this._clearBtnElement.addEventListener('click', (event: MouseEvent) => {
47+
event.preventDefault();
48+
event.stopPropagation();
49+
50+
this.changeValue('');
51+
});
52+
}
53+
54+
init() {
55+
super.init();
56+
57+
this.initInputListeners();
58+
this.initClearBtn();
59+
this._updateInputPadding();
60+
}
61+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import InputText from './components/ui/InputText';
2+
3+
const inputTextContainers = document.querySelectorAll<HTMLElement>('.ids-input-text:not([custom-init])');
4+
5+
inputTextContainers.forEach((inputTextContainer: HTMLElement) => {
6+
const inputTextInstance = new InputText(inputTextContainer);
7+
8+
inputTextInstance.init();
9+
});

src/bundle/Resources/views/themes/standard/design-system/partials/base_input.html.twig

Whitespace-only changes.

src/bundle/Resources/views/themes/standard/design_system/components/button.html.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
{% if has_label %}
7878
<div class="ids-btn__label">
7979
{% block label %}
80-
{{ label|raw }}
80+
{{ label|default(null)|raw }}
8181
{% endblock %}
8282
</div>
8383
{% endif %}

src/bundle/Resources/views/themes/standard/design_system/components/input_text.html.twig

Lines changed: 0 additions & 68 deletions
This file was deleted.
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
{% import ids_get('macros/html') as html %}
2+
3+
{% set actions = actions|default([]) %}
4+
{% set disabled = disabled|default(false) %}
5+
{% set error = error|default(false) %}
6+
{% set placeholder = placeholder|default('') %}
7+
{% set readonly = readonly|default(false) %}
8+
{% set required = required|default(false) %}
9+
{% set size = size|default('medium') %}
10+
{% set title = title|default('') %}
11+
{% set type = type|default('text') %}
12+
{% set value = value|default('') %}
13+
{% set input_attr = input_attr|default({}) %}
14+
{% set input_default_classes = input_attr.class|default('') %}
15+
16+
{% set input_classes =
17+
html_cva(
18+
base: html_classes(
19+
'ids-input',
20+
{
21+
'ids-input--disabled': disabled,
22+
'ids-input--error': error,
23+
'ids-input--required': required
24+
}
25+
),
26+
variants: {
27+
type: {
28+
text: 'ids-input--text',
29+
password: 'ids-input--password',
30+
email: 'ids-input--email',
31+
number: 'ids-input--number',
32+
tel: 'ids-input--tel',
33+
search: 'ids-input--search',
34+
url: 'ids-input--url'
35+
},
36+
size: {
37+
medium: 'ids-input--medium',
38+
small: 'ids-input--small'
39+
}
40+
}
41+
)
42+
%}
43+
44+
{% set input_attr =
45+
input_attr|merge({
46+
class: input_classes.apply(
47+
{
48+
type,
49+
size
50+
},
51+
input_default_classes
52+
),
53+
disabled,
54+
placeholder,
55+
readonly,
56+
title,
57+
type,
58+
value
59+
})
60+
%}
61+
62+
{% set clear_action %}
63+
{% include ids_get('ui/clear_btn') with {
64+
disabled
65+
} %}
66+
{% endset %}
67+
68+
{% set actions =
69+
actions|merge(
70+
[
71+
{
72+
id: 'clear',
73+
component: clear_action
74+
}
75+
]
76+
)
77+
%}
78+
79+
<div class="ids-input-text">
80+
<div class="ids-input-text__source">
81+
<input {{ html.attributes(input_attr) }} />
82+
</div>
83+
<div class="ids-input-text__actions">
84+
{%- for action in actions -%}
85+
{% set action_classes =
86+
html_classes(
87+
'ids-input-text__action',
88+
{
89+
'ids-input-text__action--hidden': action.id == 'clear' and value is empty
90+
}
91+
)
92+
%}
93+
94+
<div class="{{ action_classes }}">
95+
{{- action.component|raw -}}
96+
</div>
97+
{%- endfor -%}
98+
</div>
99+
</div>

src/bundle/Resources/views/themes/standard/design_system/components/label.html.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
attr|merge({
2020
class: classes,
2121
for,
22-
title,
22+
title
2323
})
2424
%}
2525

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{% set disabled = disabled|default(false) %}
2+
3+
{% set clear_msg = 'ibexa.clear-btn.label'|trans|desc('Clear') %}
4+
5+
{% include ids_get('button') with {
6+
type: 'tertiary-alt',
7+
size: 'small',
8+
icon: 'discard',
9+
disabled,
10+
title: clear_msg,
11+
attr: {
12+
class: 'ids-clear-btn',
13+
'aria-label': clear_msg
14+
}
15+
} %}

0 commit comments

Comments
 (0)