mirror of
https://github.com/Foundry376/Mailspring.git
synced 2025-01-16 05:00:45 +08:00
78dd69290d
Summary: This diff moves the preferences interface to a sheet in the main window, with the following benefits: - We can put any sort of React control in it (no ReactRemote) - It's not strange for the interface to scroll - Since it can scroll, it's safe to auto-generate preferences for plugins based on their package config schema. The general tab is now mostly based on the config schema, with the exception of the "Workspace" and "Layout" bits. The other tabs are still manual, and should be polished more. Test Plan: No new tests Reviewers: evan Reviewed By: evan Differential Revision: https://phab.nylas.com/D2278
63 lines
2.1 KiB
CoffeeScript
63 lines
2.1 KiB
CoffeeScript
React = require 'react'
|
|
_ = require 'underscore'
|
|
_str = require 'underscore.string'
|
|
|
|
###
|
|
This component renders input controls for a subtree of the N1 config-schema
|
|
and reads/writes current values using the `config` prop, which is expected to
|
|
be an instance of the config provided by `ConfigPropContainer`.
|
|
|
|
The config schema follows the JSON Schema standard: http://json-schema.org/
|
|
###
|
|
class ConfigSchemaItem extends React.Component
|
|
@displayName: 'ConfigSchemaItem'
|
|
@propTypes:
|
|
config: React.PropTypes.object
|
|
configSchema: React.PropTypes.object
|
|
keyPath: React.PropTypes.string
|
|
|
|
render: ->
|
|
return false unless @_appliesToPlatform()
|
|
if @props.configSchema.type is 'object'
|
|
<section>
|
|
<h2>{_str.humanize(@props.keyName)}</h2>
|
|
{_.pairs(@props.configSchema.properties).map ([key, value]) =>
|
|
<ConfigSchemaItem
|
|
keyName={key}
|
|
keyPath={"#{@props.keyPath}.#{key}"}
|
|
configSchema={value}
|
|
config={@props.config}
|
|
/>
|
|
}
|
|
</section>
|
|
|
|
else if @props.configSchema['enum']?
|
|
<div className="item">
|
|
<label htmlFor={@props.keyPath}>{@props.configSchema.title}:</label>
|
|
<select onChange={@_onChangeValue}>
|
|
{_.zip(@props.configSchema.enum, @props.configSchema.enumLabels).map ([value, label]) =>
|
|
<option value={value}>{label}</option>
|
|
}
|
|
</select>
|
|
</div>
|
|
|
|
else if @props.configSchema.type is 'boolean'
|
|
<div className="item">
|
|
<input id={@props.keyPath} type="checkbox" onChange={@_onChangeChecked} checked={ @props.config.get(@props.keyPath) }/>
|
|
<label htmlFor={@props.keyPath}>{@props.configSchema.title}</label>
|
|
</div>
|
|
else
|
|
<span></span>
|
|
|
|
_appliesToPlatform: =>
|
|
return true if not @props.configSchema.platforms?
|
|
return true if process.platform in @props.configSchema.platforms
|
|
return false
|
|
|
|
_onChangeChecked: =>
|
|
@props.config.toggle(@props.keyPath)
|
|
|
|
_onChangeValue: (event) =>
|
|
@props.config.set(@props.keyPath, event.target.value)
|
|
|
|
module.exports = ConfigSchemaItem
|