import React from 'react';
import ReactDOM from 'react-dom';
import Crowi from './util/Crowi';
// import CrowiRenderer from './util/CrowiRenderer';
import GrowiRenderer from './util/GrowiRenderer';
import HeaderSearchBox from './components/HeaderSearchBox';
import SearchPage from './components/SearchPage';
import PageEditor from './components/PageEditor';
import OptionsSelector from './components/PageEditor/OptionsSelector';
import { EditorOptions, PreviewOptions } from './components/PageEditor/OptionsSelector';
import GrantSelector, { UserGroup, PageGrant } from './components/PageEditor/GrantSelector';
import Page from './components/Page';
import PageListSearch from './components/PageListSearch';
import PageHistory from './components/PageHistory';
import PageComments from './components/PageComments';
import PageCommentFormBehavior from './components/PageCommentFormBehavior';
import PageAttachment from './components/PageAttachment';
import SeenUserList from './components/SeenUserList';
import RevisionPath from './components/Page/RevisionPath';
import RevisionUrl from './components/Page/RevisionUrl';
import BookmarkButton from './components/BookmarkButton';
import NewPageNameInputter from './components/NewPageNameInputter';
import CustomCssEditor from './components/Admin/CustomCssEditor';
import CustomScriptEditor from './components/Admin/CustomScriptEditor';
import CustomHeaderEditor from './components/Admin/CustomHeaderEditor';
import * as entities from 'entities';
if (!window) {
window = {};
}
const mainContent = document.querySelector('#content-main');
let pageId = null;
let pageRevisionId = null;
let pageRevisionCreatedAt = null;
let pagePath;
let pageContent = '';
let markdown = '';
let pageGrant = null;
if (mainContent !== null) {
pageId = mainContent.getAttribute('data-page-id');
pageRevisionId = mainContent.getAttribute('data-page-revision-id');
pageRevisionCreatedAt = +mainContent.getAttribute('data-page-revision-created');
pagePath = mainContent.attributes['data-path'].value;
const rawText = document.getElementById('raw-text-original');
if (rawText) {
pageContent = rawText.innerHTML;
}
markdown = entities.decodeHTML(pageContent);
}
const isLoggedin = document.querySelector('.main-container.nologin') == null;
// FIXME
const crowi = new Crowi({
me: $('body').data('current-username'),
csrfToken: $('body').data('csrftoken'),
}, window);
window.crowi = crowi;
crowi.setConfig(JSON.parse(document.getElementById('crowi-context-hydrate').textContent || '{}'));
if (isLoggedin) {
crowi.fetchUsers();
}
const crowiRenderer = new GrowiRenderer(crowi, null, {
mode: 'page',
isAutoSetup: false, // manually setup because plugins may configure it
renderToc: crowi.getCrowiForJquery().renderTocContent, // function for rendering Table Of Contents
});
window.crowiRenderer = crowiRenderer;
// FIXME
var isEnabledPlugins = $('body').data('plugin-enabled');
if (isEnabledPlugins) {
var crowiPlugin = window.crowiPlugin;
crowiPlugin.installAll(crowi, crowiRenderer);
}
// configure renderer
crowiRenderer.setup(crowi.config);
// restore draft when the first time to edit
const draft = crowi.findDraft(pagePath);
if (!pageRevisionId && draft != null) {
markdown = draft;
}
/**
* define components
* key: id of element
* value: React Element
*/
const componentMappings = {
'search-top': ,
'search-sidebar': ,
'search-page': ,
'page-list-search': ,
//'revision-history': ,
'seen-user-list': ,
'bookmark-button': ,
'bookmark-button-lg': ,
'page-name-inputter': ,
};
// additional definitions if data exists
if (pageId) {
componentMappings['page-comments-list'] = ;
componentMappings['page-attachment'] = ;
}
if (pagePath) {
componentMappings['page'] = ;
componentMappings['revision-path'] = ;
componentMappings['revision-url'] = ;
}
let componentInstances = {};
Object.keys(componentMappings).forEach((key) => {
const elem = document.getElementById(key);
if (elem) {
componentInstances[key] = ReactDOM.render(componentMappings[key], elem);
}
});
// render components with refs to another component
const elem = document.getElementById('page-comment-form-behavior');
if (elem) {
ReactDOM.render(, elem);
}
/*
* PageEditor
*/
let pageEditor = null;
const editorOptions = new EditorOptions(crowi.editorOptions);
const previewOptions = new PreviewOptions(crowi.previewOptions);
// render PageEditor
const pageEditorElem = document.getElementById('page-editor');
if (pageEditorElem) {
// create onSave event handler
const onSaveSuccess = function(page) {
// modify the revision id value to pass checking id when updating
crowi.getCrowiForJquery().updateCurrentRevision(page.revision._id);
// re-render Page component if exists
if (componentInstances.page != null) {
componentInstances.page.setMarkdown(page.revision.body);
}
};
pageEditor = ReactDOM.render(
,
pageEditorElem
);
// set refs for pageEditor
crowi.setPageEditor(pageEditor);
}
// render OptionsSelector
const pageEditorOptionsSelectorElem = document.getElementById('page-editor-options-selector');
if (pageEditorOptionsSelectorElem) {
ReactDOM.render(
{ // set onChange event handler
// set options
pageEditor.setEditorOptions(newEditorOptions);
pageEditor.setPreviewOptions(newPreviewOptions);
// save
crowi.saveEditorOptions(newEditorOptions);
crowi.savePreviewOptions(newPreviewOptions);
}} />,
pageEditorOptionsSelectorElem
);
}
// render GrantSelector
const userRelatedGroupsElem = document.getElementById('user-related-group-data');
const pageEditorGrantSelectorElem = document.getElementById('page-grant-selector');
const pageGrantElem = document.getElementById('page-grant');
const pageGrantGroupElem = document.getElementById('grant-group');
function updatePageGrantElems(newPageGrant) {
pageGrantElem.value = newPageGrant.grant;
pageGrantGroupElem.value = newPageGrant.grantGroup.userGroupId || '';
}
if (pageEditorGrantSelectorElem) {
let userRelatedGroups;
if (userRelatedGroupsElem != null) {
let userRelatedGroupsJSONString = userRelatedGroupsElem.textContent;
if (userRelatedGroupsJSONString != null && userRelatedGroupsJSONString.length > 0) {
userRelatedGroups = JSON.parse(userRelatedGroupsJSONString || '{}', (value) => {
return new UserGroup(value);
});
}
}
pageGrant = new PageGrant();
pageGrant.grant = document.getElementById('page-grant').value;
const grantGroupData = JSON.parse(document.getElementById('grant-group').textContent || '{}');
if (grantGroupData != null) {
const grantGroup = new UserGroup();
grantGroup.userGroupId = grantGroupData.id;
grantGroup.userGroup = grantGroupData;
pageGrant.grantGroup = grantGroup;
}
ReactDOM.render(
,
pageEditorGrantSelectorElem
);
}
// render for admin
const customCssEditorElem = document.getElementById('custom-css-editor');
if (customCssEditorElem != null) {
// get input[type=hidden] element
const customCssInputElem = document.getElementById('inputCustomCss');
ReactDOM.render(
,
customCssEditorElem
);
}
const customScriptEditorElem = document.getElementById('custom-script-editor');
if (customScriptEditorElem != null) {
// get input[type=hidden] element
const customScriptInputElem = document.getElementById('inputCustomScript');
ReactDOM.render(
,
customScriptEditorElem
);
}
const customHeaderEditorElem = document.getElementById('custom-header-editor');
if (customHeaderEditorElem != null) {
// get input[type=hidden] element
const customHeaderInputElem = document.getElementById('inputCustomHeader');
ReactDOM.render(
,
customHeaderEditorElem
);
}
// うわーもうー (commented by Crowi team -- 2018.03.23 Yuki Takei)
$('a[data-toggle="tab"][href="#revision-history"]').on('show.bs.tab', function() {
ReactDOM.render(, document.getElementById('revision-history'));
});