@@ -2,25 +2,34 @@ import $ from 'jquery';
2
2
import { updateIssuesMeta } from './repo-issue.js' ;
3
3
4
4
export function initCommonIssue ( ) {
5
- const checkboxOperate = ( ) => {
6
- if ( $ ( '.issue-checkbox input' ) . is ( ':checked' ) ) {
7
- $ ( '#issue-filters' ) . addClass ( 'hide' ) ;
8
- $ ( '#issue-actions' ) . removeClass ( 'hide' ) ;
9
- $ ( '#issue-actions .six' ) . prepend ( $ ( '.issue-checkbox-all' ) ) ;
5
+ const $issueSelectAllWrapper = $ ( '.issue-checkbox-all' ) ;
6
+ const $issueSelectAll = $ ( '.issue-checkbox-all input' ) ;
7
+ const $issueCheckboxes = $ ( '.issue-checkbox input' ) ;
8
+
9
+ const syncIssueSelectionState = ( ) => {
10
+ const $checked = $issueCheckboxes . filter ( ':checked' ) ;
11
+ const anyChecked = $checked . length !== 0 ;
12
+ const allChecked = anyChecked && $checked . length === $issueCheckboxes . length ;
13
+
14
+ if ( allChecked ) {
15
+ $issueSelectAll . prop ( { 'checked' : true , 'indeterminate' : false } ) ;
16
+ } else if ( anyChecked ) {
17
+ $issueSelectAll . prop ( { 'checked' : false , 'indeterminate' : true } ) ;
10
18
} else {
11
- $ ( '#issue-filters' ) . removeClass ( 'hide' ) ;
12
- $ ( '#issue-actions' ) . addClass ( 'hide' ) ;
13
- $ ( '#issue-filters .six' ) . prepend ( $ ( '.issue-checkbox-all' ) ) ;
19
+ $issueSelectAll . prop ( { 'checked' : false , 'indeterminate' : false } ) ;
14
20
}
21
+ // if any issue is selected, show the action panel, otherwise show the filter panel
22
+ $ ( '#issue-filters' ) . toggle ( ! anyChecked ) ;
23
+ $ ( '#issue-actions' ) . toggle ( anyChecked ) ;
24
+ // there are two panels but only one select-all checkbox, so move the checkbox to the visible panel
25
+ $ ( '#issue-filters, #issue-actions' ) . filter ( ':visible' ) . find ( '.column:first' ) . prepend ( $issueSelectAllWrapper ) ;
15
26
} ;
16
27
17
- const checkboxpart = $ ( '.issue-checkbox' ) ;
18
- checkboxpart . on ( 'click' , checkboxOperate ) ;
28
+ $issueCheckboxes . on ( 'change' , syncIssueSelectionState ) ;
19
29
20
- const checkboxall = $ ( '.issue-checkbox-all' ) ;
21
- checkboxall . on ( 'click' , ( e ) => {
22
- checkboxpart . find ( 'input' ) . prop ( 'checked' , checkboxall . find ( 'input' ) . prop ( 'checked' ) ) ;
23
- checkboxOperate ( e ) ;
30
+ $issueSelectAll . on ( 'change' , ( ) => {
31
+ $issueCheckboxes . prop ( 'checked' , $issueSelectAll . is ( ':checked' ) ) ;
32
+ syncIssueSelectionState ( ) ;
24
33
} ) ;
25
34
26
35
$ ( '.issue-action' ) . on ( 'click' , async function ( ) {
@@ -51,7 +60,7 @@ export function initCommonIssue() {
51
60
} ) ;
52
61
53
62
// NOTICE: This event trigger targets Firefox caching behaviour, as the checkboxes stay
54
- // checked after reload trigger ckecked event, if checkboxes are checked on load
63
+ // checked after reload trigger checked event, if checkboxes are checked on load
55
64
$ ( '.issue-checkbox input[type="checkbox"]:checked' ) . first ( ) . each ( ( _ , e ) => {
56
65
e . checked = false ;
57
66
$ ( e ) . trigger ( 'click' ) ;
0 commit comments