From 32ec60ef3be32bdcc0c105c7a4749d0b92cfaa74 Mon Sep 17 00:00:00 2001
From: Jure Triglav <juretriglav@gmail.com>
Date: Thu, 29 Oct 2015 12:47:46 +0100
Subject: [PATCH] Integrated Trix editor

---
 app/components/TrixEditor.jsx | 79 +++++++++++++++++++++++++++++++++++
 app/routes.jsx                |  2 +-
 package.json                  |  2 +
 webpack/webpack.dev.config.js |  5 +--
 4 files changed, 84 insertions(+), 4 deletions(-)
 create mode 100644 app/components/TrixEditor.jsx

diff --git a/app/components/TrixEditor.jsx b/app/components/TrixEditor.jsx
new file mode 100644
index 000000000..4bd38e60e
--- /dev/null
+++ b/app/components/TrixEditor.jsx
@@ -0,0 +1,79 @@
+// WIP EXPERIMENTAL
+
+import { bindActionCreators } from 'redux'
+import { connect } from 'react-redux'
+import * as Actions from '../actions'
+import _ from 'lodash'
+import React from 'react'
+import 'trix/dist/trix.css'
+require('script!../../node_modules/trix/dist/trix.js')
+
+// import '../scss/components/_trixEditor'
+
+class TrixEditor extends React.Component {
+  constructor (props) {
+    super(props)
+    this._onChange = this._onChange.bind(this)
+  }
+
+  componentDidMount () {
+    document.querySelector('trix-editor').addEventListener('trix-change', this._onChange)
+  }
+
+  componentWillUnmount () {
+    document.querySelector('trix-editor').removeEventListener('trix-change', this._onChange)
+  }
+
+  _onChange (event) {
+    let element = document.querySelector('trix-editor')
+    let fragment = Object.assign(this.props.fragment, {
+      source: JSON.stringify(element.editor),
+      presentation: element.innerHTML
+    })
+    this.props.actions.updateFragment(fragment)
+  }
+
+  render () {
+    let editor
+
+    if (this.props.fragment) {
+      editor = <div>
+        <input id='content' value={this.props.fragment.presentation} type='hidden' name='content'/>
+        <trix-editor id='trix-editor' input='content'></trix-editor>
+      </div>
+    } else {
+      editor = <trix-editor></trix-editor>
+    }
+
+    return (
+      <div>
+        {editor}
+      </div>
+    )
+  }
+}
+
+TrixEditor.propTypes = {
+  fragment: React.PropTypes.object,
+  actions: React.PropTypes.object
+}
+
+function mapStateToProps (state) {
+  console.log(state)
+  return {
+    fragment: _.find(state.fragments, function (f) {
+      return f._id === state.router.params.id
+    })
+  }
+}
+
+function mapDispatchToProps (dispatch) {
+  return {
+    actions: bindActionCreators(Actions, dispatch)
+  }
+}
+
+export default connect(
+  mapStateToProps,
+  mapDispatchToProps
+)(TrixEditor)
diff --git a/app/routes.jsx b/app/routes.jsx
index 7bd755503..658b5db6c 100644
--- a/app/routes.jsx
+++ b/app/routes.jsx
@@ -6,7 +6,7 @@ import App from './containers/App'
 // Admin
 import About from './components/About'
 import BlogManager from './containers/BlogManager'
-import Editor from './components/SubstanceEditor'
+import Editor from './components/TrixEditor'
 
 // Public
 import Share from './components/Share'
diff --git a/package.json b/package.json
index 1ec85b149..27f866753 100644
--- a/package.json
+++ b/package.json
@@ -48,7 +48,9 @@
     "sass-loader": "^3.0.0",
     "serve-favicon": "~2.3.0",
     "style-loader": "^0.12.3",
+    "script-loader": "^0.6.1",
     "lens-writer": "substance/lens#master",
+    "trix": "^0.9.0",
     "webpack": "^1.12.2",
     "pouchdb": "^5.0.0",
     "leveldown": "^1.4.1",
diff --git a/webpack/webpack.dev.config.js b/webpack/webpack.dev.config.js
index e30ef031b..f15236518 100644
--- a/webpack/webpack.dev.config.js
+++ b/webpack/webpack.dev.config.js
@@ -55,9 +55,8 @@ module.exports = [
         loaders: ['eslint-loader']
       }],
       loaders: commonLoaders.concat([
-          { test: /\.scss$/,
-            loader: 'style!css!sass?includePaths[]=' +
-              path.resolve(__dirname, '../node_modules/lens-writer/app/assets/fonts/')
+          { test: /\.scss$|\.css$/,
+            loader: 'style!css!sass'
           }
       ])
     },
-- 
GitLab