mirror of
https://github.com/Foundry376/Mailspring.git
synced 2024-11-14 13:44:41 +08:00
647aed5f14
Summary: - Include ES6 files in spec-suite - Fix template store specs - Refactors TemplateStore a little bit to adjust to specs - Convert coffe .cjsx files to ES6 .jsx files - Fix TemplateDraftStoreExtension functions - Update ComposerTemplates example README Test Plan: - Plugin unit tests Reviewers: bengotow, evan Reviewed By: evan Differential Revision: https://phab.nylas.com/D2250
107 lines
2.9 KiB
JavaScript
107 lines
2.9 KiB
JavaScript
import {Actions, React} from 'nylas-exports';
|
|
import {Popover, Menu, RetinaImg} from 'nylas-component-kit';
|
|
import TemplateStore from './template-store';
|
|
|
|
class TemplatePicker extends React.Component {
|
|
static displayName = 'TemplatePicker'
|
|
|
|
static propTypes = {
|
|
draftClientId: React.PropTypes.string,
|
|
}
|
|
|
|
constructor() {
|
|
super();
|
|
TemplateStore.init();
|
|
this.state = {
|
|
searchValue: '',
|
|
templates: TemplateStore.items(),
|
|
};
|
|
}
|
|
|
|
componentDidMount() {
|
|
this.unsubscribe = TemplateStore.listen(this._onStoreChange.bind(this));
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
if (this.unsubscribe) this.unsubscribe();
|
|
}
|
|
|
|
static containerStyles = {order: 2};
|
|
|
|
_filteredTemplates(search = this.state.searchValue) {
|
|
const items = TemplateStore.items();
|
|
|
|
if (!search.length) { return items; }
|
|
|
|
return items.filter((t)=> {
|
|
return t.name.toLowerCase().indexOf(search.toLowerCase()) === 0;
|
|
});
|
|
}
|
|
|
|
_onStoreChange() {
|
|
return this.setState({
|
|
templates: this._filteredTemplates(),
|
|
});
|
|
}
|
|
|
|
_onSearchValueChange() {
|
|
const newSearch = event.target.value;
|
|
return this.setState({
|
|
searchValue: newSearch,
|
|
templates: this._filteredTemplates(newSearch),
|
|
});
|
|
}
|
|
|
|
_onChooseTemplate = (template)=> {
|
|
Actions.insertTemplateId({templateId: template.id, draftClientId: this.props.draftClientId});
|
|
return this.refs.popover.close();
|
|
}
|
|
|
|
_onManageTemplates() {
|
|
return Actions.showTemplates();
|
|
}
|
|
|
|
_onNewTemplate() {
|
|
return Actions.createTemplate({draftClientId: this.props.draftClientId});
|
|
}
|
|
|
|
render() {
|
|
const button = (
|
|
<button className="btn btn-toolbar narrow">
|
|
<RetinaImg url="nylas://N1-Composer-Templates/assets/icon-composer-templates@2x.png" mode={RetinaImg.Mode.ContentIsMask}/>
|
|
|
|
<RetinaImg name="icon-composer-dropdown.png" mode={RetinaImg.Mode.ContentIsMask}/>
|
|
</button>
|
|
);
|
|
|
|
const headerComponents = [
|
|
<input type="text"
|
|
tabIndex="1"
|
|
key="textfield"
|
|
className="search"
|
|
value={this.state.searchValue}
|
|
onChange={this._onSearchValueChange}/>,
|
|
];
|
|
|
|
const footerComponents = [
|
|
<div className="item" key="new" onMouseDown={this._onNewTemplate}>Save Draft as Template...</div>,
|
|
<div className="item" key="manage" onMouseDown={this._onManageTemplates}>Open Templates Folder...</div>,
|
|
];
|
|
|
|
return (
|
|
<Popover ref="popover" className="template-picker pull-right" buttonComponent={button}>
|
|
<Menu ref="menu"
|
|
headerComponents={headerComponents}
|
|
footerComponents={footerComponents}
|
|
items={this.state.templates}
|
|
itemKey={ (item)=> item.id }
|
|
itemContent={ (item)=> item.name }
|
|
onSelect={this._onChooseTemplate.bind(this)}
|
|
/>
|
|
</Popover>
|
|
);
|
|
}
|
|
|
|
}
|
|
|
|
export default TemplatePicker;
|