Преглед изворни кода

WIP: render page with react component

Yuki Takei пре 8 година
родитељ
комит
18e6350883

+ 1 - 1
lib/views/crowi-plus/widget/page_list_container.html

@@ -25,7 +25,7 @@
     {% if isEnabledTimeline() %}
     {% if isEnabledTimeline() %}
     <div class="tab-pane" id="view-timeline" data-shown=0>
     <div class="tab-pane" id="view-timeline" data-shown=0>
       {% for page in pages %}
       {% for page in pages %}
-      <div class="timeline-body" id="id-{{ page.id }}">
+      <div class="timeline-body" id="id-{{ page.id }}" data-page-path="{{ page.path }}">
         <h3 class="revision-path"><a href="{{ page.path }}">{{ page.path }}</a></h3>
         <h3 class="revision-path"><a href="{{ page.path }}">{{ page.path }}</a></h3>
         <div class="revision-body wiki"></div>
         <div class="revision-body wiki"></div>
         <script type="text/template">{{ page.revision.body }}</script>
         <script type="text/template">{{ page.revision.body }}</script>

+ 1 - 1
lib/views/page.html

@@ -191,7 +191,7 @@
         <a data-toggle="collapse" data-parent="#revision-toc" href="#revision-toc-content" class="revision-toc-head">{{ t('Table of Contents') }}</a>
         <a data-toggle="collapse" data-parent="#revision-toc" href="#revision-toc-content" class="revision-toc-head">{{ t('Table of Contents') }}</a>
 
 
       </div>
       </div>
-      <div class="wiki" id="revision-body-content"></div>
+      <div id="page"></div>
     </div>
     </div>
 
 
     {# edit form #}
     {# edit form #}

+ 2 - 4
lib/views/page_list.html

@@ -128,9 +128,7 @@
   </div>
   </div>
   {% endif %}
   {% endif %}
     <div class="tab-pane {% if not req.body.pageForm %}active{% endif %}" id="revision-body">
     <div class="tab-pane {% if not req.body.pageForm %}active{% endif %}" id="revision-body">
-      <div class="wiki" id="revision-body-content">
-        <i class="fa fa-spinner fa-pulse fa-fw"></i>
-      </div>
+      <div id="page"></div>
     </div>
     </div>
 
 
     <script type="text/template" id="raw-text-original">{{ page.revision.body }}</script>
     <script type="text/template" id="raw-text-original">{{ page.revision.body }}</script>
@@ -214,7 +212,7 @@
     {% if isEnabledTimeline() %}
     {% if isEnabledTimeline() %}
     <div class="tab-pane" id="view-timeline" data-shown=0>
     <div class="tab-pane" id="view-timeline" data-shown=0>
       {% for page in pages %}
       {% for page in pages %}
-      <div class="timeline-body" id="id-{{ page.id }}">
+      <div class="timeline-body" id="id-{{ page.id }}" data-page-path="{{ page.path }}">
         <h3 class="revision-path"><a href="{{ page.path }}">{{ page.path }}</a></h3>
         <h3 class="revision-path"><a href="{{ page.path }}">{{ page.path }}</a></h3>
         <div class="revision-body wiki"></div>
         <div class="revision-body wiki"></div>
         <script type="text/template">{{ page.revision.body }}</script>
         <script type="text/template">{{ page.revision.body }}</script>

+ 6 - 1
resource/js/app.js

@@ -10,6 +10,7 @@ import SearchPage       from './components/SearchPage';
 import PageEditor       from './components/PageEditor';
 import PageEditor       from './components/PageEditor';
 import OptionsSelector  from './components/PageEditor/OptionsSelector';
 import OptionsSelector  from './components/PageEditor/OptionsSelector';
 import { EditorOptions, PreviewOptions } from './components/PageEditor/OptionsSelector';
 import { EditorOptions, PreviewOptions } from './components/PageEditor/OptionsSelector';
+import Page             from './components/Page';
 import PageListSearch   from './components/PageListSearch';
 import PageListSearch   from './components/PageListSearch';
 import PageHistory      from './components/PageHistory';
 import PageHistory      from './components/PageHistory';
 import PageComments     from './components/PageComments';
 import PageComments     from './components/PageComments';
@@ -38,6 +39,7 @@ let pageRevisionId = null;
 let pageRevisionCreatedAt = null;
 let pageRevisionCreatedAt = null;
 let pagePath;
 let pagePath;
 let pageContent = '';
 let pageContent = '';
+let markdown = '';
 if (mainContent !== null) {
 if (mainContent !== null) {
   pageId = mainContent.getAttribute('data-page-id');
   pageId = mainContent.getAttribute('data-page-id');
   pageRevisionId = mainContent.getAttribute('data-page-revision-id');
   pageRevisionId = mainContent.getAttribute('data-page-revision-id');
@@ -47,6 +49,7 @@ if (mainContent !== null) {
   if (rawText) {
   if (rawText) {
     pageContent = rawText.innerHTML;
     pageContent = rawText.innerHTML;
   }
   }
+  markdown = entities.decodeHTML(pageContent);
 }
 }
 const isLoggedin = document.querySelector('.main-container.nologin') == null;
 const isLoggedin = document.querySelector('.main-container.nologin') == null;
 
 
@@ -84,6 +87,7 @@ const onSaveSuccess = function(page) {
 const componentMappings = {
 const componentMappings = {
   'search-top': <HeaderSearchBox crowi={crowi} />,
   'search-top': <HeaderSearchBox crowi={crowi} />,
   'search-page': <SearchPage crowi={crowi} />,
   'search-page': <SearchPage crowi={crowi} />,
+  'page': <Page crowi={crowi} crowiRenderer={crowiRenderer} markdown={markdown} pagePath={pagePath} />,
   'page-list-search': <PageListSearch crowi={crowi} />,
   'page-list-search': <PageListSearch crowi={crowi} />,
   'page-comments-list': <PageComments pageId={pageId} revisionId={pageRevisionId} revisionCreatedAt= {pageRevisionCreatedAt} crowi={crowi} />,
   'page-comments-list': <PageComments pageId={pageId} revisionId={pageRevisionId} revisionCreatedAt= {pageRevisionCreatedAt} crowi={crowi} />,
   'page-attachment': <PageAttachment pageId={pageId} pageContent={pageContent} crowi={crowi} />,
   'page-attachment': <PageAttachment pageId={pageId} pageContent={pageContent} crowi={crowi} />,
@@ -102,6 +106,7 @@ if (pagePath) {
 }
 }
 
 
 let componentInstances = {};
 let componentInstances = {};
+
 Object.keys(componentMappings).forEach((key) => {
 Object.keys(componentMappings).forEach((key) => {
   const elem = document.getElementById(key);
   const elem = document.getElementById(key);
   if (elem) {
   if (elem) {
@@ -126,7 +131,7 @@ const pageEditorElem = document.getElementById('page-editor');
 if (pageEditorElem) {
 if (pageEditorElem) {
   pageEditor = ReactDOM.render(
   pageEditor = ReactDOM.render(
     <PageEditor crowi={crowi} pageId={pageId} revisionId={pageRevisionId} pagePath={pagePath}
     <PageEditor crowi={crowi} pageId={pageId} revisionId={pageRevisionId} pagePath={pagePath}
-        markdown={entities.decodeHTML(pageContent)}
+        markdown={markdown}
         editorOptions={editorOptions} previewOptions={previewOptions}
         editorOptions={editorOptions} previewOptions={previewOptions}
         onSaveSuccess={onSaveSuccess} />,
         onSaveSuccess={onSaveSuccess} />,
     pageEditorElem
     pageEditorElem

+ 4 - 2
resource/js/components/Page/RevisionBody.js

@@ -37,7 +37,9 @@ export default class RevisionBody extends React.Component {
       <div
       <div
         ref={(elm) => {
         ref={(elm) => {
           this.element = elm;
           this.element = elm;
-          this.props.inputRef(elm);
+          if (this.props.inputRef != null) {
+            this.props.inputRef(elm);
+          }
         }}
         }}
         className="wiki" dangerouslySetInnerHTML={this.generateInnerHtml(this.props.html)}>
         className="wiki" dangerouslySetInnerHTML={this.generateInnerHtml(this.props.html)}>
       </div>
       </div>
@@ -47,7 +49,7 @@ export default class RevisionBody extends React.Component {
 
 
 RevisionBody.propTypes = {
 RevisionBody.propTypes = {
   html: PropTypes.string,
   html: PropTypes.string,
-  inputRef: PropTypes.func.isRequired,  // for getting div element
+  inputRef: PropTypes.func,  // for getting div element
   isMathJaxEnabled: PropTypes.bool,
   isMathJaxEnabled: PropTypes.bool,
   renderMathJaxOnInit: PropTypes.bool,
   renderMathJaxOnInit: PropTypes.bool,
   renderMathJaxInRealtime: PropTypes.bool,
   renderMathJaxInRealtime: PropTypes.bool,

+ 13 - 12
resource/js/legacy/crowi.js

@@ -2,6 +2,11 @@
 /* Author: Sotaro KARASAWA <sotarok@crocos.co.jp>
 /* Author: Sotaro KARASAWA <sotarok@crocos.co.jp>
 */
 */
 
 
+import React from 'react';
+import ReactDOM from 'react-dom';
+
+import Page from '../components/Page';
+
 const io = require('socket.io-client');
 const io = require('socket.io-client');
 const entities = require("entities");
 const entities = require("entities");
 const escapeStringRegexp = require('escape-string-regexp');
 const escapeStringRegexp = require('escape-string-regexp');
@@ -416,21 +421,12 @@ $(function() {
         var id = $(this).attr('id');
         var id = $(this).attr('id');
         var contentId = '#' + id + ' > script';
         var contentId = '#' + id + ' > script';
         var revisionBody = '#' + id + ' .revision-body';
         var revisionBody = '#' + id + ' .revision-body';
-        var $revisionBody = $(revisionBody);
+        var revisionBodyElem = document.querySelector(revisionBody);
         var revisionPath = '#' + id + ' .revision-path';
         var revisionPath = '#' + id + ' .revision-path';
-
+        var pagePath = document.getElementById(id).getAttribute('data-page-path');
         var markdown = entities.decodeHTML($(contentId).html());
         var markdown = entities.decodeHTML($(contentId).html());
-        var parsedHTML = crowiRenderer.render(markdown, $revisionBody.get(0));
-        $revisionBody.html(parsedHTML);
 
 
-        $('.template-create-button', revisionBody).on('click', function() {
-          var path = $(this).data('path');
-          var templateId = $(this).data('template');
-          var template = $('#' + templateId).html();
-
-          crowi.saveDraft(path, template);
-          top.location.href = path;
-        });
+        ReactDOM.render(<Page crowi={crowi} crowiRenderer={crowiRenderer} markdown={markdown} pagePath={pagePath} />, revisionBodyElem);
       });
       });
 
 
       $('#view-timeline').data('shown', 1);
       $('#view-timeline').data('shown', 1);
@@ -462,6 +458,10 @@ $(function() {
 
 
   if (pageId) {
   if (pageId) {
 
 
+    /*
+     * transplanted to React components -- 2018.02.04 Yuki Takei
+     *
+
     // if page exists
     // if page exists
     var $rawTextOriginal = $('#raw-text-original');
     var $rawTextOriginal = $('#raw-text-original');
     if ($rawTextOriginal.length > 0) {
     if ($rawTextOriginal.length > 0) {
@@ -514,6 +514,7 @@ $(function() {
 
 
 
 
     }
     }
+    */
 
 
     // header
     // header
     var $header = $('#page-header');
     var $header = $('#page-header');