Skip to content
This repository was archived by the owner on Jun 26, 2020. It is now read-only.

Commit 76a4d47

Browse files
authored
Merge pull request #390 from ckeditor/t/389
Other: Disabling a `ListItemView` should be possible using the `isEnabled` property. Closes #389.
2 parents beb9f96 + f7c4177 commit 76a4d47

File tree

6 files changed

+56
-11
lines changed

6 files changed

+56
-11
lines changed

src/button/buttonview.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ export default class ButtonView extends View {
118118
class: [
119119
'ck',
120120
'ck-button',
121-
bind.to( 'isEnabled', value => value ? 'ck-enabled' : 'ck-disabled' ),
121+
bind.if( 'isEnabled', 'ck-disabled', value => !value ),
122122
bind.if( 'isVisible', 'ck-hidden', value => !value ),
123123
bind.to( 'isOn', value => value ? 'ck-on' : 'ck-off' ),
124124
bind.if( 'withText', 'ck-button_with-text' )

src/dropdown/dropdownview.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ export default class DropdownView extends View {
147147
class: [
148148
'ck',
149149
'ck-dropdown',
150-
bind.to( 'isEnabled', isEnabled => isEnabled ? '' : 'ck-disabled' )
150+
bind.if( 'isEnabled', 'ck-disabled', value => !value )
151151
]
152152
},
153153

src/list/listitemview.js

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ export default class ListItemView extends View {
4949
'ck',
5050
'ck-list__item',
5151
bind.to( 'class' ),
52-
bind.if( 'isActive', 'ck-list__item_active' )
52+
bind.if( 'isActive', 'ck-list__item_active' ),
53+
bind.if( 'isEnabled', 'ck-disabled', value => !value )
5354
],
5455
style: bind.to( 'style' ),
5556
tabindex: bind.to( 'tabindex' )
@@ -62,10 +63,29 @@ export default class ListItemView extends View {
6263
],
6364

6465
on: {
65-
click: bind.to( 'execute' )
66+
click: bind.to( evt => {
67+
// We can't make the button disabled using the disabled attribute, because it won't be focusable.
68+
// Though, shouldn't this condition be moved to the button controller?
69+
if ( this.isEnabled ) {
70+
this.fire( 'execute' );
71+
} else {
72+
// Prevent the default when button is disabled, to block e.g.
73+
// automatic form submitting. See ckeditor/ckeditor5-link#74.
74+
evt.preventDefault();
75+
}
76+
} )
6677
}
6778
} );
6879

80+
/**
81+
* (Optional) Controls whether the list item is enabled, i.e. it can be clicked and execute an action.
82+
*
83+
* @observable
84+
* @default true
85+
* @member {Boolean} #isEnabled
86+
*/
87+
this.set( 'isEnabled', true );
88+
6989
/**
7090
* The label of the list item.
7191
*

tests/button/buttonview.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ describe( 'ButtonView', () => {
4747
describe( '<button> bindings', () => {
4848
describe( 'class', () => {
4949
it( 'is set initially', () => {
50-
expect( view.element.classList ).to.have.length( 4 );
50+
expect( view.element.classList ).to.have.length( 3 );
5151
expect( view.element.classList.contains( 'ck' ) ).to.true;
5252
expect( view.element.classList.contains( 'ck-button' ) ).to.true;
53-
expect( view.element.classList.contains( 'ck-enabled' ) ).to.true;
53+
expect( view.element.classList.contains( 'ck-disabled' ) ).to.false;
5454
expect( view.element.classList.contains( 'ck-off' ) ).to.true;
5555
} );
5656

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
<h2>Empty</h2>
22

3-
<div id="dropdown" class="ck-reset_all"></div>
3+
<div id="dropdown" class="ck ck-reset_all"></div>
44

55
<h2>Dropdown with ListView</h2>
66

7-
<div id="list-dropdown" class="ck-reset_all"></div>
7+
<div id="list-dropdown" class="ck ck-reset_all"></div>
88

99
<h2>Long label (truncated)</h2>
1010

11-
<div id="dropdown-label" class="ck-reset_all"></div>
11+
<div id="dropdown-label" class="ck ck-reset_all"></div>
1212

1313
<h2>Dropdown with ToolbarView</h2>
1414

15-
<div id="dropdown-toolbar" class="ck-reset_all"></div>
15+
<div id="dropdown-toolbar" class="ck ck-reset_all"></div>
1616

1717
<h2>SplitButton Dropdown</h2>
1818

19-
<div id="dropdown-splitbutton" class="ck-reset_all"></div>
19+
<div id="dropdown-splitbutton" class="ck ck-reset_all"></div>

tests/list/listitemview.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,20 @@ describe( 'ListItemView', () => {
8989

9090
expect( view.element.classList.contains( 'ck-list__item_active' ) ).to.be.true;
9191
} );
92+
93+
it( 'reacts on view#isEnabled', () => {
94+
expect( view.element.classList ).to.have.length( 2 );
95+
96+
expect( view.element.classList.contains( 'ck-disabled' ) ).to.be.false;
97+
98+
view.set( 'isEnabled', false );
99+
100+
expect( view.element.classList.contains( 'ck-disabled' ) ).to.be.true;
101+
102+
view.set( 'isEnabled', true );
103+
104+
expect( view.element.classList.contains( 'ck-disabled' ) ).to.be.false;
105+
} );
92106
} );
93107

94108
describe( '"style" attribute', () => {
@@ -132,6 +146,17 @@ describe( 'ListItemView', () => {
132146
view.element.dispatchEvent( new Event( 'click' ) );
133147
expect( spy.calledOnce ).to.be.true;
134148
} );
149+
150+
it( 'does not triggers view#execute event when "click" is fired in DOM and isEnables=false', () => {
151+
const spy = sinon.spy();
152+
153+
view.on( 'execute', spy );
154+
155+
view.isEnabled = false;
156+
157+
view.element.dispatchEvent( new Event( 'click' ) );
158+
sinon.assert.notCalled( spy );
159+
} );
135160
} );
136161
} );
137162

0 commit comments

Comments
 (0)