From 3d9a63178617455893e8a2b2c96e4f44c72d8800 Mon Sep 17 00:00:00 2001 From: Rokt33r Date: Thu, 20 Aug 2015 01:30:57 +0900 Subject: [PATCH] =?UTF-8?q?Contact=20Modal=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- browser/finder/Components/FinderDetail.jsx | 8 +- browser/finder/Components/FinderList.jsx | 18 +- browser/finder/index.jsx | 104 +++------- browser/main/Components/AboutModal.jsx | 2 +- browser/main/Components/AddMemberModal.jsx | 83 ++++++++ browser/main/Components/ContactModal.jsx | 62 ++++++ browser/main/Components/EditProfileModal.jsx | 5 - .../main/Components/PlanetAddUserModal.jsx | 77 -------- browser/main/Components/TeamSettingsModal.jsx | 183 +++++++++++++++++- browser/main/Containers/MainContainer.jsx | 86 +++++--- browser/main/Containers/PlanetContainer.jsx | 41 +--- browser/main/Containers/UserContainer.jsx | 34 +++- browser/main/Services/Hq.js | 31 +++ browser/main/Stores/UserStore.js | 16 +- browser/main/index.electron.html | 5 +- browser/styles/finder/index.styl | 1 + .../main/containers/DashboardContainer.styl | 15 -- .../styles/main/containers/UserContainer.styl | 1 + browser/styles/main/index.styl | 20 +- browser/styles/shared/modal.styl | 92 ++++++++- config.js | 4 +- main.js | 35 +++- 22 files changed, 645 insertions(+), 278 deletions(-) create mode 100644 browser/main/Components/AddMemberModal.jsx create mode 100644 browser/main/Components/ContactModal.jsx delete mode 100644 browser/main/Components/PlanetAddUserModal.jsx delete mode 100644 browser/styles/main/containers/DashboardContainer.styl diff --git a/browser/finder/Components/FinderDetail.jsx b/browser/finder/Components/FinderDetail.jsx index 7a56f3f0..0f610d6c 100644 --- a/browser/finder/Components/FinderDetail.jsx +++ b/browser/finder/Components/FinderDetail.jsx @@ -13,20 +13,20 @@ module.exports = React.createClass({ var article = this.props.currentArticle if (article != null) { - if (article.type === 'snippet') { + if (article.type === 'code') { return (
-
{article.callSign}
+
{article.description}
) - } else if (article.type === 'blueprint') { + } else if (article.type === 'note') { return (
-
{article.title}
+
{article.title}
diff --git a/browser/finder/Components/FinderList.jsx b/browser/finder/Components/FinderList.jsx index bfada399..5b3898f3 100644 --- a/browser/finder/Components/FinderList.jsx +++ b/browser/finder/Components/FinderList.jsx @@ -6,7 +6,8 @@ module.exports = React.createClass({ currentArticle: React.PropTypes.shape({ id: React.PropTypes.number, type: React.PropTypes.string - }) + }), + selectArticle: React.PropTypes.func }, componentDidUpdate: function () { var index = this.props.articles.indexOf(this.props.currentArticle) @@ -26,6 +27,11 @@ module.exports = React.createClass({ el.scrollTop = li.offsetTop } }, + handleArticleClick: function (article) { + return function () { + this.props.selectArticle(article) + }.bind(this) + }, render: function () { var list = this.props.articles.map(function (article) { if (article == null) { @@ -38,17 +44,17 @@ module.exports = React.createClass({ } var isActive = this.props.currentArticle != null && (article.type === this.props.currentArticle.type && article.id === this.props.currentArticle.id) - if (article.type === 'snippet') { + if (article.type === 'code') { return ( -
  • -
    {article.callSign} / {article.description.substring(0, 10)}
    +
  • +
    {article.description}
  • ) } - if (article.type === 'blueprint') { + if (article.type === 'note') { return ( -
  • +
  • {article.title}
  • diff --git a/browser/finder/index.jsx b/browser/finder/index.jsx index 24a4b9c9..9cde1c0d 100644 --- a/browser/finder/index.jsx +++ b/browser/finder/index.jsx @@ -5,79 +5,12 @@ var clipboard = require('clipboard') var React = require('react/addons') +var ArticleFilter = require('../main/Mixins/ArticleFilter') + var FinderInput = require('./Components/FinderInput') var FinderList = require('./Components/FinderList') var FinderDetail = require('./Components/FinderDetail') -// filter start -function basicFilter (keyword, articles) { - if (keyword === '' || keyword == null) return articles - var firstFiltered = articles.filter(function (article) { - - var first = article.type === 'snippet' ? article.callSign : article.title - if (first.match(new RegExp(keyword, 'i'))) return true - - return false - }) - - var secondFiltered = articles.filter(function (article) { - var second = article.type === 'snippet' ? article.description : article.content - if (second.match(new RegExp(keyword, 'i'))) return true - - return false - }) - - var thirdFiltered = articles.filter(function (article) { - if (article.type === 'snippet') { - if (article.content.match(new RegExp(keyword, 'i'))) return true - } - return false - }) - - return firstFiltered.concat(secondFiltered, thirdFiltered).filter(function (value, index, self) { - return self.indexOf(value) === index - }) -} - -function snippetFilter (articles) { - return articles.filter(function (article) { - return article.type === 'snippet' - }) -} - -function blueprintFilter (articles) { - return articles.filter(function (article) { - return article.type === 'blueprint' - }) -} - -function tagFilter (keyword, articles) { - return articles.filter(function (article) { - return article.Tags.some(function (tag) { - return tag.name.match(new RegExp('^' + keyword, 'i')) - }) - }) -} - -function searchArticle (search, articles) { - var keywords = search.split(' ') - - for (var keyword of keywords) { - if (keyword.match(/^\$s/, 'i')) { - articles = snippetFilter(articles) - continue - } else if (keyword.match(/^\$b/, 'i')) { - articles = blueprintFilter(articles) - continue - } else if (keyword.match(/^#[A-Za-z0-9]+/)) { - articles = tagFilter(keyword.substring(1, keyword.length), articles) - continue - } - articles = basicFilter(keyword, articles) - } - - return articles -} // Filter end function fetchArticles () { @@ -90,14 +23,20 @@ function fetchArticles () { var articles = [] user.Planets.forEach(function (planet) { var _planet = JSON.parse(localStorage.getItem('planet-' + planet.id)) - articles = articles.concat(_planet.Snippets, _planet.Blueprints) + articles = articles.concat(_planet.Codes, _planet.Notes) + }) + user.Teams.forEach(function (team) { + team.Planets.forEach(function (planet) { + var _planet = JSON.parse(localStorage.getItem('planet-' + planet.id)) + articles = articles.concat(_planet.Codes, _planet.Notes) + }) }) - console.log(articles.length + ' articles') return articles } var Finder = React.createClass({ + mixins: [ArticleFilter], getInitialState: function () { var articles = fetchArticles() return { @@ -122,8 +61,14 @@ var Finder = React.createClass({ var articles = fetchArticles() this.setState({ articles: articles, - currentArticle: articles[0], search: '' + }, function () { + var firstArticle = this.refs.finderList.props.articles[0] + if (firstArticle) { + this.setState({ + currentArticle: firstArticle + }) + } }) }, handleKeyDown: function (e) { @@ -139,11 +84,9 @@ var Finder = React.createClass({ if (e.keyCode === 13) { var article = this.state.currentArticle - if (article.type === 'snippet') { - clipboard.writeText(article.content) - hideFinder() - e.preventDefault() - } + clipboard.writeText(article.content) + hideFinder() + e.preventDefault() } if (e.keyCode === 27) { hideFinder() @@ -168,17 +111,20 @@ var Finder = React.createClass({ this.setState({currentArticle: this.refs.finderList.props.articles[index + 1]}) } }, + selectArticle: function (article) { + this.setState({currentArticle: article}) + }, handleChange: function (e) { this.setState({search: e.target.value}, function () { this.setState({currentArticle: this.refs.finderList.props.articles[0]}) }) }, render: function () { - var articles = searchArticle(this.state.search, this.state.articles) + var articles = this.searchArticle(this.state.search, this.state.articles) return (
    - +
    ) diff --git a/browser/main/Components/AboutModal.jsx b/browser/main/Components/AboutModal.jsx index e54c5109..53ffc253 100644 --- a/browser/main/Components/AboutModal.jsx +++ b/browser/main/Components/AboutModal.jsx @@ -15,7 +15,7 @@ module.exports = React.createClass({
    -
    Boost {version == null ? 'DEV version' : 'v' + version}
    +
    Boost {version == null || version.length === 0 ? 'DEV version' : 'v' + version}
    diff --git a/browser/main/Components/AddMemberModal.jsx b/browser/main/Components/AddMemberModal.jsx new file mode 100644 index 00000000..e96f2b47 --- /dev/null +++ b/browser/main/Components/AddMemberModal.jsx @@ -0,0 +1,83 @@ +var React = require('react/addons') +var Select = require('react-select') + +var LinkedState = require('../Mixins/LinkedState') + +var Hq = require('../Services/Hq') + +var UserStore = require('../Stores/UserStore') + +var getOptions = function (input, callback) { + Hq.searchUser(input) + .then(function (res) { + callback(null, { + options: res.body.map(function (user) { + return { + label: user.name, + value: user.name + } + }), + complete: false + }) + }) + .catch(function (err) { + console.error(err) + }) +} + +module.exports = React.createClass({ + mixins: [LinkedState], + propTypes: { + team: React.PropTypes.object, + close: React.PropTypes.func + }, + getInitialState: function () { + return { + userName: '', + role: 'member' + } + }, + handleSubmit: function () { + Hq + .addMember(this.props.team.name, { + userName: this.state.userName, + role: this.state.role + }) + .then(function (res) { + console.log(res.body) + UserStore.Actions.addMember(res.body) + this.props.close() + }.bind(this)) + .catch(function (err) { + console.error(err) + }) + }, + handleChange: function (value) { + this.setState({userName: value}) + }, + render: function () { + return ( +
    + + + + + role +
    + + +
    + ) + } +}) diff --git a/browser/main/Components/ContactModal.jsx b/browser/main/Components/ContactModal.jsx new file mode 100644 index 00000000..5fc7cc84 --- /dev/null +++ b/browser/main/Components/ContactModal.jsx @@ -0,0 +1,62 @@ +var React = require('react') + +var LinkedState = require('../Mixins/LinkedState') + +var Hq = require('../Services/Hq') + +module.exports = React.createClass({ + mixins: [LinkedState], + propTypes: { + close: React.PropTypes.func + }, + getInitialState: function () { + return { + isSent: false, + mail: { + title: '', + content: '' + } + } + }, + sendEmail: function () { + Hq.sendEmail(this.state.mail) + .then(function (res) { + this.setState({isSent: !this.state.isSent}) + }.bind(this)) + .catch(function (err) { + console.error(err) + }) + }, + render: function () { + return ( +
    +

    Contact form

    + + {!this.state.isSent ? ( +
    +
    +
    + +
    +
    +