feat: debug timeout option, translation support for many things and improve sliders

This commit is contained in:
David Ralph
2021-04-02 13:24:18 +01:00
parent 436dd884f0
commit 5947aa25fd
17 changed files with 108 additions and 53 deletions

View File

@@ -29,9 +29,9 @@ export default class Radio extends React.PureComponent {
<FormControl component='fieldset'> <FormControl component='fieldset'>
<FormLabel className='radio-title' component='legend'>{this.props.title}</FormLabel> <FormLabel className='radio-title' component='legend'>{this.props.title}</FormLabel>
<RadioGroup aria-label={this.props.name} name={this.props.name} onChange={this.handleChange} value={this.state.value}> <RadioGroup aria-label={this.props.name} name={this.props.name} onChange={this.handleChange} value={this.state.value}>
{this.props.options.map(option => {this.props.options.map(option => (
<FormControlLabel value={option.value} control={<RadioUI/>} label={option.name} key={option.name} /> <FormControlLabel value={option.value} control={<RadioUI/>} label={option.name} key={option.name} />
)} ))}
</RadioGroup> </RadioGroup>
</FormControl> </FormControl>
); );

View File

@@ -33,7 +33,7 @@ export default class Slider extends React.PureComponent {
return ( return (
<> <>
<p>{this.props.title} ({this.state.value}{this.props.display}) <span className='modalLink' onClick={this.resetItem}>{this.language.buttons.reset}</span></p> <p>{this.props.title} ({this.state.value}{this.props.display}) <span className='modalLink' onClick={this.resetItem}>{this.language.buttons.reset}</span></p>
<input className='range' type='range' min={this.props.min} max={this.props.max} value={this.state.value} onChange={this.handleChange} /> <input className='range' type='range' min={this.props.min} max={this.props.max} step={this.props.step || 1} value={this.state.value} onChange={this.handleChange} />
</> </>
); );
} }

View File

@@ -74,24 +74,24 @@ export default class About extends React.PureComponent {
<p>Undraw ({this.language.resources_used.welcome_img})</p> <p>Undraw ({this.language.resources_used.welcome_img})</p>
<h3>{this.language.contributors}</h3> <h3>{this.language.contributors}</h3>
{this.state.loading} {this.state.loading}
{this.state.contributors.map((item) => {this.state.contributors.map((item) => (
<Tooltip title={item.login} placement='top' key={item.login}> <Tooltip title={item.login} placement='top' key={item.login}>
<a href={'https://github.com/' + item.login} target='_blank' rel='noopener noreferrer'><img draggable='false' className='abouticon' src={item.avatar_url + '&size=128'} alt={item.login}></img></a> <a href={'https://github.com/' + item.login} target='_blank' rel='noopener noreferrer'><img draggable='false' className='abouticon' src={item.avatar_url + '&size=128'} alt={item.login}></img></a>
</Tooltip> </Tooltip>
)} ))}
{ // for those who contributed without opening a pull request { // for those who contributed without opening a pull request
this.state.other_contributors.map((item) => this.state.other_contributors.map((item) => (
<Tooltip title={item.login} placement='top' key={item.login}> <Tooltip title={item.login} placement='top' key={item.login}>
<a href={'https://github.com/' + item.login} target='_blank' rel='noopener noreferrer'><img draggable='false' className='abouticon' src={item.avatar_url + '&size=128'} alt={item.login}></img></a> <a href={'https://github.com/' + item.login} target='_blank' rel='noopener noreferrer'><img draggable='false' className='abouticon' src={item.avatar_url + '&size=128'} alt={item.login}></img></a>
</Tooltip> </Tooltip>
)} ))}
<h3>{this.language.supporters}</h3> <h3>{this.language.supporters}</h3>
{this.state.loading} {this.state.loading}
{this.state.sponsors.map((item) => {this.state.sponsors.map((item) => (
<Tooltip title={item.handle} placement='top' key={item.handle}> <Tooltip title={item.handle} placement='top' key={item.handle}>
<a href={item.profile} target='_blank' rel='noopener noreferrer'><img draggable='false' className='abouticon' src={item.avatar + '&size=128'} alt={item.handle}></img></a> <a href={item.profile} target='_blank' rel='noopener noreferrer'><img draggable='false' className='abouticon' src={item.avatar + '&size=128'} alt={item.handle}></img></a>
</Tooltip> </Tooltip>
)} ))}
<h3>{this.language.photographers}</h3> <h3>{this.language.photographers}</h3>
{this.state.loading} {this.state.loading}
<p>{this.state.photographers}</p> <p>{this.state.photographers}</p>

View File

@@ -41,16 +41,16 @@ export default class AdvancedSettings extends React.PureComponent {
<button className='reset' onClick={() => this.setState({ resetModal: true })}>{this.language.buttons.reset}</button> <button className='reset' onClick={() => this.setState({ resetModal: true })}>{this.language.buttons.reset}</button>
<button className='export' onClick={() => SettingsFunctions.exportSettings()}>{this.language.buttons.export}</button> <button className='export' onClick={() => SettingsFunctions.exportSettings()}>{this.language.buttons.export}</button>
<button className='import' onClick={() => document.getElementById('file-input').click()}>{this.language.buttons.import}</button> <button className='import' onClick={() => document.getElementById('file-input').click()}>{this.language.buttons.import}</button>
<FileUpload id='file-input' accept='application/json' type='settings' loadFunction={(e) => this.settingsImport(e)} /> <FileUpload id='file-input' accept='application/json' type='settings' loadFunction={(e) => this.settingsImport(e)}/>
<h3>{advanced.customisation}</h3> <h3>{advanced.customisation}</h3>
<Text title={advanced.custom_js} name='customjs' textarea={true}/> <Text title={advanced.custom_js} name='customjs' textarea={true}/>
<Text title={advanced.custom_css} name='customcss' textarea={true}/> <Text title={advanced.custom_css} name='customcss' textarea={true}/>
<Text title='Tab Name' name='tabName'/> <Text title={advanced.tab_name} name='tabName'/>
<h3>{this.language.sections.experimental.title}</h3> <h3>{this.language.sections.experimental.title}</h3>
<p>{advanced.experimental_warning}</p> <p>{advanced.experimental_warning}</p>
<Checkbox name='experimental' text={this.language.enabled} /> <Checkbox name='experimental' text={this.language.enabled}/>
<Modal onRequestClose={() => this.setState({ resetModal: false })} isOpen={this.state.resetModal} className={'Modal resetmodal'} overlayClassName={'Overlay resetoverlay'} ariaHideApp={false}> <Modal onRequestClose={() => this.setState({ resetModal: false })} isOpen={this.state.resetModal} className={'Modal resetmodal'} overlayClassName={'Overlay resetoverlay'} ariaHideApp={false}>
<ResetModal modalClose={() => this.setState({ resetModal: false })} /> <ResetModal modalClose={() => this.setState({ resetModal: false })} />

View File

@@ -13,15 +13,15 @@ export default function AppearanceSettings() {
const themeOptions = [ const themeOptions = [
{ {
'name': 'Auto', 'name': appearance.theme.auto,
'value': 'auto' 'value': 'auto'
}, },
{ {
'name': 'Light', 'name': appearance.theme.light,
'value': 'light' 'value': 'light'
}, },
{ {
'name': 'Dark', 'name': appearance.theme.dark,
'value': 'dark' 'value': 'dark'
} }
]; ];
@@ -29,7 +29,7 @@ export default function AppearanceSettings() {
return ( return (
<> <>
<h2>{appearance.title}</h2> <h2>{appearance.title}</h2>
<Radio name='theme' title='Theme' options={themeOptions} /> <Radio name='theme' title={appearance.theme.title} options={themeOptions} />
<h3>{appearance.navbar.title}</h3> <h3>{appearance.navbar.title}</h3>
<Checkbox name='notesEnabled' text={appearance.navbar.notes} /> <Checkbox name='notesEnabled' text={appearance.navbar.notes} />
@@ -39,29 +39,29 @@ export default function AppearanceSettings() {
<Text title={appearance.font.custom} name='font' upperCaseFirst={true} /> <Text title={appearance.font.custom} name='font' upperCaseFirst={true} />
<br/> <br/>
<Checkbox name='fontGoogle' text={appearance.font.google} /> <Checkbox name='fontGoogle' text={appearance.font.google} />
<Dropdown label='Font Weight' name='fontweight'> <Dropdown label={appearance.font.weight.title} name='fontweight'>
{/* names are taken from https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight */} {/* names are taken from https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight */}
<option value='100'>Thin</option> <option value='100'>{appearance.font.weight.thin}</option>
<option value='200'>Extra-Light</option> <option value='200'>{appearance.font.weight.extra_light}</option>
<option value='300'>Light</option> <option value='300'>{appearance.font.weight.light}</option>
<option value='400'>Normal</option> <option value='400'>{appearance.font.weight.normal}</option>
<option value='500'>Medium</option> <option value='500'>{appearance.font.weight.medium}</option>
<option value='600'>Semi-Bold</option> <option value='600'>{appearance.font.weight.semi_bold}</option>
<option value='700'>Bold</option> <option value='700'>{appearance.font.weight.bold}</option>
<option value='800'>Extra-Bold</option> <option value='800'>{appearance.font.weight.extra_bold}</option>
</Dropdown> </Dropdown>
<br/><br/> <br/><br/>
<Dropdown label='Font Style' name='fontstyle'> <Dropdown label={appearance.font.style.title} name='fontstyle'>
<option value='normal'>Normal</option> <option value='normal'>{appearance.font.style.normal}</option>
<option value='italic'>Italic</option> <option value='italic'>{appearance.font.style.italic}</option>
<option value='oblique'>Oblique</option> <option value='oblique'>{appearance.font.style.oblique}</option>
</Dropdown> </Dropdown>
<h3>{appearance.accessibility.title}</h3> <h3>{appearance.accessibility.title}</h3>
{(engineName === 'Blink') ? {(engineName === 'Blink') ?
<Slider title={appearance.accessibility.widget_zoom} name='widgetzoom' default='100' min='50' max='200' display='%'/> <Slider title={appearance.accessibility.widget_zoom} name='widgetzoom' default='100' min='50' max='200' display='%'/>
: null} : null}
<Slider title={appearance.accessibility.toast_duration} name='toastDisplayTime' default='2500' min='500' max='5000' display={' ' + appearance.accessibility.milliseconds} /> <Slider title={appearance.accessibility.toast_duration} name='toastDisplayTime' default='2500' step='100' min='500' max='5000' display={' ' + appearance.accessibility.milliseconds} />
</> </>
); );
} }

View File

@@ -1,6 +1,7 @@
import React from 'react'; import React from 'react';
import Checkbox from '../Checkbox'; import Checkbox from '../Checkbox';
import Slider from '../Slider';
//import Text from '../Text'; //import Text from '../Text';
export default function ExperimentalSettings() { export default function ExperimentalSettings() {
@@ -13,6 +14,7 @@ export default function ExperimentalSettings() {
<Checkbox name='animations' text={window.language.modals.main.settings.sections.appearance.animations}/> <Checkbox name='animations' text={window.language.modals.main.settings.sections.appearance.animations}/>
<h3>{experimental.developer}</h3> <h3>{experimental.developer}</h3>
<Checkbox name='debug' text='Debug hotkey (Ctrl + #)'/> <Checkbox name='debug' text='Debug hotkey (Ctrl + #)'/>
<Slider title='Debug timeout' name='debugtimeout' min='0' max='5000' default='0' step='100' display=' miliseconds' />
{/* <Checkbox name='beta' text='Beta Mode Override'/> {/* <Checkbox name='beta' text='Beta Mode Override'/>
<Text name='api_override' title='Version Override (format example: 5.0)'/> <Text name='api_override' title='Version Override (format example: 5.0)'/>
<Text name='api_override' title='API URL Override'/> <Text name='api_override' title='API URL Override'/>
@@ -22,6 +24,7 @@ export default function ExperimentalSettings() {
<Text name='github_override' title='GitHub URL Override'/> <Text name='github_override' title='GitHub URL Override'/>
<br/><br/> <br/><br/>
*/} */}
<br/><br/>
<button className='reset' style={{'marginLeft': '0px'}} onClick={() => localStorage.clear()}>Clear LocalStorage</button> <button className='reset' style={{'marginLeft': '0px'}} onClick={() => localStorage.clear()}>Clear LocalStorage</button>
</> </>
); );

View File

@@ -37,7 +37,7 @@ export default class GreetingSettings extends React.PureComponent {
<h3>{greeting.birthday}</h3> <h3>{greeting.birthday}</h3>
<Switch name='birthdayenabled' text={this.language.enabled}/> <Switch name='birthdayenabled' text={this.language.enabled}/>
<Checkbox name='birthdayage' text='Birthday Age'/> <Checkbox name='birthdayage' text={greeting.birthday_age}/>
<p>{greeting.birthday_date}</p> <p>{greeting.birthday_date}</p>
<DayPickerInput onDayChange={this.changeDate} value={this.state.birthday}/> <DayPickerInput onDayChange={this.changeDate} value={this.state.birthday}/>
</> </>

View File

@@ -49,8 +49,8 @@ export default class OrderSettings extends React.PureComponent {
render() { render() {
return ( return (
<> <>
<h2>Order</h2> <h2>{this.language.sections.order.title}</h2>
<span className='modalLink' onClick={this.reset}>Reset</span> <span className='modalLink' onClick={this.reset}>{this.language.buttons.reset}</span>
<SortableContainer onSortEnd={this.onSortEnd} lockAxis='y' lockToContainerEdges disableAutoscroll> <SortableContainer onSortEnd={this.onSortEnd} lockAxis='y' lockToContainerEdges disableAutoscroll>
{this.state.items.map((value, index) => ( {this.state.items.map((value, index) => (
<SortableItem key={`item-${value}`} index={index} value={value} /> <SortableItem key={`item-${value}`} index={index} value={value} />

View File

@@ -64,9 +64,9 @@ export default class SearchSettings extends React.PureComponent {
<Switch name='searchBar' text={language.enabled} /> <Switch name='searchBar' text={language.enabled} />
{isChrome ? <Checkbox name='voiceSearch' text={search.voice_search} /> : null} {isChrome ? <Checkbox name='voiceSearch' text={search.voice_search} /> : null}
<Dropdown label={search.search_engine} name='searchEngine' onChange={(value) => this.setSearchEngine(value)}> <Dropdown label={search.search_engine} name='searchEngine' onChange={(value) => this.setSearchEngine(value)}>
{searchEngines.map((engine) => {searchEngines.map((engine) => (
<option key={engine.name} value={engine.settingsName}>{engine.name}</option> <option key={engine.name} value={engine.settingsName}>{engine.name}</option>
)} ))}
<option value='custom'>{search.custom.split(' ')[0]}</option> <option value='custom'>{search.custom.split(' ')[0]}</option>
</Dropdown> </Dropdown>
<ul id='searchEngineInput' style={{ display: 'none' }}> <ul id='searchEngineInput' style={{ display: 'none' }}>

View File

@@ -22,11 +22,11 @@ export default class TimeSettings extends React.PureComponent {
const digitalOptions = [ const digitalOptions = [
{ {
'name': '24 hour', 'name': time.digital.twentyfourhour,
'value': 'twentyfourhour' 'value': 'twentyfourhour'
}, },
{ {
'name': '12 hour', 'name': time.digital.twelvehour,
'value': 'twelvehour' 'value': 'twelvehour'
} }
]; ];
@@ -104,8 +104,8 @@ export default class TimeSettings extends React.PureComponent {
<h3>{time.date.title}</h3> <h3>{time.date.title}</h3>
<Switch name='date' text={this.language.enabled} /> <Switch name='date' text={this.language.enabled} />
<Dropdown label='Type' name='dateType' onChange={(value) => this.setState({ dateType: value })}> <Dropdown label='Type' name='dateType' onChange={(value) => this.setState({ dateType: value })}>
<option value='long'>Long</option> <option value='long'>{time.date.type.long}</option>
<option value='short'>Short</option> <option value='short'>{time.date.type.short}</option>
</Dropdown> </Dropdown>
<br/> <br/>
{dateSettings} {dateSettings}

View File

@@ -60,7 +60,6 @@ export default class BackgroundSettings extends React.PureComponent {
const customSettings = ( const customSettings = (
<> <>
<h3>{background.source.title}</h3>
<ul> <ul>
<p>{background.source.custom_url} <span className='modalLink' onClick={() => this.resetItem('customBackground')}>{this.language.buttons.reset}</span></p> <p>{background.source.custom_url} <span className='modalLink' onClick={() => this.resetItem('customBackground')}>{this.language.buttons.reset}</span></p>
<input type='text' value={this.state.customBackground} onChange={(e) => this.setState({ customBackground: e.target.value })}></input> <input type='text' value={this.state.customBackground} onChange={(e) => this.setState({ customBackground: e.target.value })}></input>
@@ -98,9 +97,9 @@ export default class BackgroundSettings extends React.PureComponent {
<br/><br/> <br/><br/>
<Dropdown label='Type' name='backgroundType' onChange={(value) => this.setState({ backgroundType: value })}> <Dropdown label='Type' name='backgroundType' onChange={(value) => this.setState({ backgroundType: value })}>
<option value='api'>API</option> <option value='api'>{background.type.api}</option>
<option value='custom'>Custom Image</option> <option value='custom'>{background.type.custom_image}</option>
<option value='colour'>Custom Colour/Gradient</option> <option value='colour'>{background.type.custom_colour}</option>
</Dropdown> </Dropdown>
<br/> <br/>

View File

@@ -26,7 +26,7 @@ export default function Settings() {
<div label={language.background.title}><Background/></div> <div label={language.background.title}><Background/></div>
<div label={language.search.title}><Search/></div> <div label={language.search.title}><Search/></div>
<div label={language.appearance.title}><Appearance/></div> <div label={language.appearance.title}><Appearance/></div>
<div label={language.order}><Order/></div> <div label={language.order.title}><Order/></div>
<div label={language.language.title}><Language/></div> <div label={language.language.title}><Language/></div>
<div label={language.advanced.title}><Advanced/></div> <div label={language.advanced.title}><Advanced/></div>
<div label={language.experimental.title}><Experimental/></div> <div label={language.experimental.title}><Experimental/></div>

View File

@@ -51,7 +51,7 @@ export default function Tab(props) {
case language.background.title: icon = <Background/>; break; case language.background.title: icon = <Background/>; break;
case language.search.title: icon = <Search/>; break; case language.search.title: icon = <Search/>; break;
case language.appearance.title: icon = <Appearance/>; break; case language.appearance.title: icon = <Appearance/>; break;
case language.order: icon = <Order/>; break; case language.order.title: icon = <Order/>; break;
case language.language.title: icon = <Language/>; divider = true; break; case language.language.title: icon = <Language/>; divider = true; break;
case language.advanced.title: icon = <Settings/>; break; case language.advanced.title: icon = <Settings/>; break;
case language.experimental.title: icon = <Experimental/>; divider = true; break; case language.experimental.title: icon = <Experimental/>; divider = true; break;

View File

@@ -142,5 +142,9 @@
{ {
"name": "experimental", "name": "experimental",
"value": false "value": false
},
{
"name": "debugtimeout",
"value": 0
} }
] ]

View File

@@ -10,7 +10,15 @@ export default function ExperimentalInit() {
switch (code) { switch (code) {
case 222: case 222:
const timeout = localStorage.getItem('debugtimeout');
if (timeout !== '0') {
setTimeout(() => {
debugger; debugger;
}, timeout);
} else {
debugger;
}
break; break;
} }
}; };

View File

@@ -44,6 +44,7 @@
"title": "Digital", "title": "Digital",
"seconds": "Seconds", "seconds": "Seconds",
"twentyfourhour": "24 Hour", "twentyfourhour": "24 Hour",
"twelvehour": "12 hour",
"ampm": "AM/PM (12 hour)", "ampm": "AM/PM (12 hour)",
"zero": "Zero-padded" "zero": "Zero-padded"
}, },
@@ -60,6 +61,10 @@
"title": "Date", "title": "Date",
"day_of_week": "Day of week", "day_of_week": "Day of week",
"datenth": "Date nth", "datenth": "Date nth",
"type": {
"short": "Short",
"long": "Long"
},
"short_date": "Short Date", "short_date": "Short Date",
"short_format": "Short Format", "short_format": "Short Format",
"short_separator": { "short_separator": {
@@ -89,6 +94,7 @@
"default": "Default Greeting Message", "default": "Default Greeting Message",
"name": "Name for greeting", "name": "Name for greeting",
"birthday": "Birthday", "birthday": "Birthday",
"birthday_age": "Birthday Age",
"birthday_date": "Birthday Date" "birthday_date": "Birthday Date"
}, },
"background": { "background": {
@@ -104,8 +110,12 @@
"blur": "Adjust Blur", "blur": "Adjust Blur",
"brightness": "Adjust Brightness" "brightness": "Adjust Brightness"
}, },
"type": {
"api": "API",
"custom_image": "Custom Image",
"custom_colour": "Custom Colour/Gradient"
},
"source": { "source": {
"title": "Source",
"api": "Background API", "api": "Background API",
"custom_url": "Custom Background URL", "custom_url": "Custom Background URL",
"custom_background": "Custom Background", "custom_background": "Custom Background",
@@ -123,7 +133,12 @@
}, },
"appearance": { "appearance": {
"title": "Appearance", "title": "Appearance",
"dark_theme": "Dark Theme", "theme": {
"title": "Theme",
"auto": "Auto",
"light": "Light",
"dark": "Dark"
},
"night_mode": "Night Mode", "night_mode": "Night Mode",
"animations": "Animations", "animations": "Animations",
"navbar": { "navbar": {
@@ -134,7 +149,24 @@
"font": { "font": {
"title": "Font", "title": "Font",
"custom": "Custom Font", "custom": "Custom Font",
"google": "Import from Google Fonts" "google": "Import from Google Fonts",
"weight": {
"title": "Font Weight",
"thin": "Thin",
"extra_light": "Extra Light",
"light": "Light",
"normal": "Normal",
"medium": "Medium",
"semi_bold": "Semi-Bold",
"bold": "Bold",
"extra_bold": "Extra-Bold"
},
"style": {
"title": "Font Style",
"normal": "Normal",
"italic": "Italic",
"oblique": "Oblique"
}
}, },
"accessibility": { "accessibility": {
"title": "Accessibility", "title": "Accessibility",
@@ -143,7 +175,9 @@
"milliseconds": "milliseconds" "milliseconds": "milliseconds"
} }
}, },
"order": "Widget Order", "order": {
"title": "Widget Order"
},
"advanced": { "advanced": {
"title": "Advanced", "title": "Advanced",
"offline_mode": "Offline Mode", "offline_mode": "Offline Mode",
@@ -151,6 +185,7 @@
"customisation": "Customisation", "customisation": "Customisation",
"custom_css": "Custom CSS", "custom_css": "Custom CSS",
"custom_js": "Custom JS", "custom_js": "Custom JS",
"tab_name": "Tab Name",
"experimental_warning": "Please note that the Mue team cannot provide support if you have experimental mode on. Please disable it first and see if the issue continues to occur before contacting support." "experimental_warning": "Please note that the Mue team cannot provide support if you have experimental mode on. Please disable it first and see if the issue continues to occur before contacting support."
}, },
"experimental": { "experimental": {

View File

@@ -9,10 +9,16 @@
"custom_author": "Custom Author" "custom_author": "Custom Author"
}, },
"background": { "background": {
"custom_colour": "Custom Background Color", "buttons": {
"add_colour": "Add color",
"favourite": "Favorite" "favourite": "Favorite"
}, },
"type": {
"custom_colour": "Custom Color/Gradient"
},
"source": {
"add_colour": "Add color"
}
},
"time": { "time": {
"analogue": { "analogue": {
"title": "Analog" "title": "Analog"