1- import React from 'react' ;
1+ import React , { useState } from 'react' ;
22import PropTypes from 'prop-types' ;
3- import { Dropdown , MenuItem , Button } from 'patternfly-react' ;
43import { CogIcon } from '@patternfly/react-icons' ;
54import {
5+ Button ,
6+ Checkbox ,
7+ FormGroup ,
68 Icon ,
9+ MenuToggle ,
710 Popover ,
811 PopoverPosition ,
12+ Select ,
13+ SelectList ,
14+ SelectOption ,
915 Tooltip ,
1016 TooltipPosition ,
1117} from '@patternfly/react-core' ;
1218import { translate as __ } from '../../../common/I18n' ;
1319
20+ const SettingsSelect = ( {
21+ id,
22+ label,
23+ disabled,
24+ options,
25+ selected,
26+ onSelect,
27+ } ) => {
28+ const [ isOpen , setIsOpen ] = useState ( false ) ;
29+
30+ return (
31+ < FormGroup label = { label } fieldId = { id } isInline >
32+ < Select
33+ id = { id }
34+ ouiaId = { id }
35+ isOpen = { isOpen }
36+ selected = { selected }
37+ onSelect = { ( _event , selection ) => {
38+ onSelect ( selection ) ;
39+ setIsOpen ( false ) ;
40+ } }
41+ onOpenChange = { setIsOpen }
42+ toggle = { toggleRef => (
43+ < MenuToggle
44+ ref = { toggleRef }
45+ onClick = { ( ) => {
46+ if ( ! disabled ) {
47+ setIsOpen ( ! isOpen ) ;
48+ }
49+ } }
50+ isExpanded = { isOpen }
51+ isDisabled = { disabled }
52+ isFullWidth
53+ >
54+ { selected }
55+ </ MenuToggle >
56+ ) }
57+ >
58+ < SelectList id = "settings-dropdown" >
59+ { options . map ( option => (
60+ < SelectOption key = { option } value = { option } >
61+ { option }
62+ </ SelectOption >
63+ ) ) }
64+ </ SelectList >
65+ </ Select >
66+ </ FormGroup >
67+ ) ;
68+ } ;
69+
70+ SettingsSelect . propTypes = {
71+ id : PropTypes . string . isRequired ,
72+ label : PropTypes . string . isRequired ,
73+ disabled : PropTypes . bool ,
74+ options : PropTypes . arrayOf ( PropTypes . string ) . isRequired ,
75+ selected : PropTypes . string . isRequired ,
76+ onSelect : PropTypes . func . isRequired ,
77+ } ;
78+
79+ SettingsSelect . defaultProps = {
80+ disabled : false ,
81+ } ;
82+
1483const EditorSettings = ( {
1584 selectedView,
1685 changeSetting,
@@ -32,96 +101,58 @@ const EditorSettings = ({
32101 headerContent = { __ ( 'Settings' ) }
33102 bodyContent = {
34103 < div >
35- < div className = "cog-popover-dropdown" >
36- < div className = "cog-popover-dropdown-title" > { __ ( 'Syntax' ) } </ div >
37- < Dropdown disabled = { selectedView === 'preview' } id = "mode-dropdown" >
38- < Dropdown . Toggle > { mode } </ Dropdown . Toggle >
39- < Dropdown . Menu id = "settings-dropdown" >
40- { modes . map ( ( aceMode , i ) => (
41- < MenuItem
42- key = { i }
43- onClick = { ( ) => changeSetting ( { mode : aceMode } ) }
44- >
45- { aceMode }
46- </ MenuItem >
47- ) ) }
48- </ Dropdown . Menu >
49- </ Dropdown >
50- </ div >
51- < div className = "cog-popover-dropdown" >
52- < div className = "cog-popover-dropdown-title" > { __ ( 'Keybind' ) } </ div >
53- < Dropdown
54- disabled = { selectedView === 'preview' }
55- id = "keybindings-dropdown"
56- >
57- < Dropdown . Toggle > { keyBinding } </ Dropdown . Toggle >
58- < Dropdown . Menu id = "settings-dropdown" >
59- { keyBindings . map ( ( keyBind , i ) => (
60- < MenuItem
61- key = { i }
62- onClick = { ( ) => changeSetting ( { keyBinding : keyBind } ) }
63- >
64- { keyBind }
65- </ MenuItem >
66- ) ) }
67- </ Dropdown . Menu >
68- </ Dropdown >
69- </ div >
70- < div className = "cog-popover-dropdown" >
71- < div className = "cog-popover-dropdown-title" > { __ ( 'Theme' ) } </ div >
72- < Dropdown id = "themes-dropdown" >
73- < Dropdown . Toggle > { theme } </ Dropdown . Toggle >
74- < Dropdown . Menu id = "settings-dropdown" >
75- { themes . map ( ( themeKey , i ) => (
76- < MenuItem
77- key = { i }
78- onClick = { ( ) => changeSetting ( { theme : themeKey } ) }
79- >
80- { themeKey }
81- </ MenuItem >
82- ) ) }
83- </ Dropdown . Menu >
84- </ Dropdown >
85- </ div >
86- < div className = "cog-popover-dropdown" >
87- < div className = "cog-popover-dropdown-title" >
88- { __ ( 'Autocompletion' ) }
89- </ div >
90- < div className = "dropdown btn-group" >
91- < input
92- id = "autocompletion-checkbox"
93- name = "autocompletion"
94- type = "checkbox"
95- checked = { autocompletion }
96- onChange = { e =>
97- changeSetting ( { autocompletion : ! autocompletion } )
98- }
99- />
100- </ div >
101- </ div >
102- < div className = "cog-popover-dropdown" >
103- < div className = "cog-popover-dropdown-title" >
104- { __ ( 'Live Autocompletion' ) }
105- </ div >
106- < div className = "dropdown btn-group" >
107- < input
108- id = "live-autocompletion-checkbox"
109- name = "liveAutocompletion"
110- type = "checkbox"
111- checked = { liveAutocompletion }
112- disabled = { ! autocompletion }
113- onChange = { e =>
114- changeSetting ( { liveAutocompletion : ! liveAutocompletion } )
115- }
116- />
117- </ div >
118- </ div >
104+ < SettingsSelect
105+ id = "mode-dropdown"
106+ label = { __ ( 'Syntax' ) }
107+ disabled = { selectedView === 'preview' }
108+ options = { modes }
109+ selected = { mode }
110+ onSelect = { selection => changeSetting ( { mode : selection } ) }
111+ />
112+ < SettingsSelect
113+ id = "keybindings-dropdown"
114+ label = { __ ( 'Keybind' ) }
115+ disabled = { selectedView === 'preview' }
116+ options = { keyBindings }
117+ selected = { keyBinding }
118+ onSelect = { selection => changeSetting ( { keyBinding : selection } ) }
119+ />
120+ < SettingsSelect
121+ id = "themes-dropdown"
122+ label = { __ ( 'Theme' ) }
123+ options = { themes }
124+ selected = { theme }
125+ onSelect = { selection => changeSetting ( { theme : selection } ) }
126+ />
127+ < Checkbox
128+ id = "autocompletion-checkbox"
129+ ouiaId = "autocompletion-checkbox"
130+ label = { __ ( 'Autocompletion' ) }
131+ isChecked = { autocompletion }
132+ onChange = { ( ) => changeSetting ( { autocompletion : ! autocompletion } ) }
133+ />
134+ < Checkbox
135+ id = "live-autocompletion-checkbox"
136+ ouiaId = "live-autocompletion-checkbox"
137+ label = { __ ( 'Live Autocompletion' ) }
138+ isChecked = { liveAutocompletion }
139+ isDisabled = { ! autocompletion }
140+ onChange = { ( ) =>
141+ changeSetting ( { liveAutocompletion : ! liveAutocompletion } )
142+ }
143+ />
119144 </ div >
120145 }
121146 triggerRef = { ( ) => document . getElementById ( 'cog-btn' ) }
122147 />
123148 < Tooltip content = { __ ( 'Settings' ) } position = { TooltipPosition . top } >
124- < Button className = "editor-button" id = "cog-btn" bsStyle = "link" >
149+ < Button
150+ variant = "plain"
151+ className = "editor-button"
152+ id = "cog-btn"
153+ ouiaId = "cog-btn"
154+ aria-label = { __ ( 'Settings' ) }
155+ >
125156 < Icon size = "md" >
126157 < CogIcon />
127158 </ Icon >
0 commit comments