|
|
@@ -1,8 +1,20 @@
|
|
|
import React from 'react';
|
|
|
+import PropTypes from 'prop-types';
|
|
|
|
|
|
-import { Modal, ModalHeader, ModalBody } from 'reactstrap';
|
|
|
+import path from 'path';
|
|
|
|
|
|
-export default class LinkEditModal extends React.PureComponent {
|
|
|
+import {
|
|
|
+ Modal,
|
|
|
+ ModalHeader,
|
|
|
+ ModalBody,
|
|
|
+ ModalFooter,
|
|
|
+} from 'reactstrap';
|
|
|
+
|
|
|
+import PageContainer from '../../services/PageContainer';
|
|
|
+
|
|
|
+import { withUnstatedContainers } from '../UnstatedUtils';
|
|
|
+
|
|
|
+class LinkEditModal extends React.PureComponent {
|
|
|
|
|
|
constructor(props) {
|
|
|
super(props);
|
|
|
@@ -10,17 +22,29 @@ export default class LinkEditModal extends React.PureComponent {
|
|
|
this.state = {
|
|
|
show: false,
|
|
|
isUseRelativePath: false,
|
|
|
- inputValue: '~.cloud.~',
|
|
|
- labelInputValue: 'ここがリンク',
|
|
|
+ isUsePermanentLink: false,
|
|
|
+ linkInputValue: '',
|
|
|
+ labelInputValue: '',
|
|
|
+ linkerType: 'mdLink',
|
|
|
+ output: '[label](link)',
|
|
|
};
|
|
|
|
|
|
+ this.show = this.show.bind(this);
|
|
|
+ this.hide = this.hide.bind(this);
|
|
|
this.cancel = this.cancel.bind(this);
|
|
|
this.toggleIsUseRelativePath = this.toggleIsUseRelativePath.bind(this);
|
|
|
+ this.handleChangeLinkInput = this.handleChangeLinkInput.bind(this);
|
|
|
+ this.handleChangeLabelInput = this.handleChangeLabelInput.bind(this);
|
|
|
+ this.handleSelecteLinkerType = this.handleSelecteLinkerType.bind(this);
|
|
|
this.showLog = this.showLog.bind(this);
|
|
|
+ this.save = this.save.bind(this);
|
|
|
+ this.generateLink = this.generateLink.bind(this);
|
|
|
+ this.toggleIsUsePamanentLink = this.toggleIsUsePamanentLink.bind(this);
|
|
|
}
|
|
|
|
|
|
- show() {
|
|
|
- this.setState({ show: true });
|
|
|
+ show(editor) {
|
|
|
+ const selection = editor.getDoc().getSelection();
|
|
|
+ this.setState({ show: true, labelInputValue: selection });
|
|
|
}
|
|
|
|
|
|
cancel() {
|
|
|
@@ -34,6 +58,9 @@ export default class LinkEditModal extends React.PureComponent {
|
|
|
}
|
|
|
|
|
|
toggleIsUseRelativePath() {
|
|
|
+ if (this.state.linkerType === 'growiLink') {
|
|
|
+ return;
|
|
|
+ }
|
|
|
this.setState({ isUseRelativePath: !this.state.isUseRelativePath });
|
|
|
}
|
|
|
|
|
|
@@ -46,17 +73,36 @@ export default class LinkEditModal extends React.PureComponent {
|
|
|
}
|
|
|
|
|
|
showLog() {
|
|
|
- console.log(this.state.inputValue);
|
|
|
+ console.log(this.state.linkInputValue);
|
|
|
}
|
|
|
|
|
|
- handleInputChange(linkValue) {
|
|
|
- this.setState({ inputValue: linkValue });
|
|
|
+ handleChangeLinkInput(linkValue) {
|
|
|
+ this.setState({ linkInputValue: linkValue });
|
|
|
}
|
|
|
|
|
|
- labelInputChange(labelValue) {
|
|
|
+ handleChangeLabelInput(labelValue) {
|
|
|
this.setState({ labelInputValue: labelValue });
|
|
|
}
|
|
|
|
|
|
+ handleSelecteLinkerType(linkerType) {
|
|
|
+ if (this.state.isUseRelativePath && linkerType === 'growiLink') {
|
|
|
+ this.toggleIsUseRelativePath();
|
|
|
+ }
|
|
|
+ this.setState({ linkerType });
|
|
|
+ }
|
|
|
+
|
|
|
+ save() {
|
|
|
+ if (this.props.onSave != null) {
|
|
|
+ this.props.onSave(this.state.output);
|
|
|
+ }
|
|
|
+
|
|
|
+ this.hide();
|
|
|
+ }
|
|
|
+
|
|
|
+ toggleIsUsePamanentLink() {
|
|
|
+ // GW-2834
|
|
|
+ this.setState({ isUsePermanentLink: !this.state.isUsePermanentLink });
|
|
|
+ }
|
|
|
|
|
|
render() {
|
|
|
return (
|
|
|
@@ -67,132 +113,130 @@ export default class LinkEditModal extends React.PureComponent {
|
|
|
|
|
|
<ModalBody className="container">
|
|
|
<div className="row">
|
|
|
- <div className="col">
|
|
|
- <div className="form-gorup my-3">
|
|
|
- <label htmlFor="linkInput">Link</label>
|
|
|
- <div className="input-group">
|
|
|
- <input
|
|
|
- className="form-control"
|
|
|
- id="linkInput"
|
|
|
- type="text"
|
|
|
- placeholder="/foo/bar/31536000"
|
|
|
- aria-describedby="button-addon"
|
|
|
- value={this.state.inputValue}
|
|
|
- onChange={e => this.handleInputChange(e.target.value)}
|
|
|
- />
|
|
|
- <div className="input-group-append">
|
|
|
- <button type="button" id="button-addon" className="btn btn-secondary" onClick={this.showLog}>
|
|
|
- Preview
|
|
|
- </button>
|
|
|
+ <div className="col-12 col-lg-6">
|
|
|
+ <form className="form-group">
|
|
|
+ <div className="form-gorup my-3">
|
|
|
+ <label htmlFor="linkInput">Link</label>
|
|
|
+ <div className="input-group">
|
|
|
+ <input
|
|
|
+ className="form-control"
|
|
|
+ id="linkInput"
|
|
|
+ type="text"
|
|
|
+ placeholder="URL or page path"
|
|
|
+ aria-describedby="button-addon"
|
|
|
+ value={this.state.linkInputValue}
|
|
|
+ onChange={e => this.handleChangeLinkInput(e.target.value)}
|
|
|
+ />
|
|
|
+ <div className="input-group-append">
|
|
|
+ <button type="button" id="button-addon" className="btn btn-secondary" onClick={this.showLog}>
|
|
|
+ Preview
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ <div className="form-inline">
|
|
|
+ <div className="custom-control custom-checkbox custom-checkbox-info">
|
|
|
+ <input
|
|
|
+ className="custom-control-input"
|
|
|
+ id="permanentLink"
|
|
|
+ type="checkbox"
|
|
|
+ checked={this.state.isUsePamanentLink}
|
|
|
+ />
|
|
|
+ <label className="custom-control-label" htmlFor="permanentLink" onClick={this.toggleIsUsePamanentLink}>
|
|
|
+ convert into permanent link
|
|
|
+ </label>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </form>
|
|
|
|
|
|
<div className="d-block d-lg-none">
|
|
|
{this.renderPreview}
|
|
|
render preview
|
|
|
</div>
|
|
|
|
|
|
- <div className="linkedit-tabs">
|
|
|
- <ul className="nav nav-tabs" role="tabist">
|
|
|
- <li className="nav-item">
|
|
|
- <a className="nav-link active" href="#Pukiwiki" role="tab" data-toggle="tab">
|
|
|
- Pukiwiki
|
|
|
- </a>
|
|
|
- </li>
|
|
|
- <li className="nav-item">
|
|
|
- <a className="nav-link" href="#Crowi" role="tab" data-toggle="tab">
|
|
|
- Crowi
|
|
|
- </a>
|
|
|
- </li>
|
|
|
- <li className="nav-item">
|
|
|
- <a className="nav-link" href="#MD" role="tab" data-toggle="tab">
|
|
|
- MD
|
|
|
- </a>
|
|
|
- </li>
|
|
|
- </ul>
|
|
|
-
|
|
|
- <div className="tab-content pt-3">
|
|
|
- <div id="Pukiwiki" className="tab-pane active" role="tabpanel">
|
|
|
- <form className="form-group">
|
|
|
- <div className="form-group">
|
|
|
- <label htmlFor="pukiwikiLink">Label</label>
|
|
|
+ <div className="card">
|
|
|
+ <div className="card-body">
|
|
|
+ <form className="form-group">
|
|
|
+ <div className="form-group btn-group w-100" role="group" aria-label="type">
|
|
|
+ <button
|
|
|
+ type="button"
|
|
|
+ name="mdLink"
|
|
|
+ className={`btn btn-outline-secondary w-100 ${this.state.linkerType === 'mdLink' && 'active'}`}
|
|
|
+ onClick={e => this.handleSelecteLinkerType(e.target.name)}
|
|
|
+ >
|
|
|
+ Markdown
|
|
|
+ </button>
|
|
|
+ <button
|
|
|
+ type="button"
|
|
|
+ name="growiLink"
|
|
|
+ className={`btn btn-outline-secondary w-100 ${this.state.linkerType === 'growiLink' && 'active'}`}
|
|
|
+ onClick={e => this.handleSelecteLinkerType(e.target.name)}
|
|
|
+ >
|
|
|
+ Growi Original
|
|
|
+ </button>
|
|
|
+ <button
|
|
|
+ type="button"
|
|
|
+ name="pukiwikiLink"
|
|
|
+ className={`btn btn-outline-secondary w-100 ${this.state.linkerType === 'pukiwikiLink' && 'active'}`}
|
|
|
+ onClick={e => this.handleSelecteLinkerType(e.target.name)}
|
|
|
+ >
|
|
|
+ Pukiwiki
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div className="form-group">
|
|
|
+ <label htmlFor="label">Label</label>
|
|
|
+ <input
|
|
|
+ type="text"
|
|
|
+ className="form-control"
|
|
|
+ id="label"
|
|
|
+ value={this.state.labelInputValue}
|
|
|
+ onChange={e => this.handleChangeLabelInput(e.target.value)}
|
|
|
+ disabled={this.state.linkerType === 'growiLink'}
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div className="form-inline">
|
|
|
+ <div className="custom-control custom-checkbox custom-checkbox-info">
|
|
|
<input
|
|
|
- type="text"
|
|
|
- className="form-control"
|
|
|
- id="pukiwikiLink"
|
|
|
- value={this.state.labelInputValue}
|
|
|
- onChange={e => this.labelInputChange(e.target.value)}
|
|
|
+ className="custom-control-input"
|
|
|
+ id="relativePath"
|
|
|
+ type="checkbox"
|
|
|
+ checked={this.state.isUseRelativePath}
|
|
|
+ disabled={this.state.linkerType === 'growiLink'}
|
|
|
/>
|
|
|
+ <label className="custom-control-label" htmlFor="relativePath" onClick={this.toggleIsUseRelativePath}>
|
|
|
+ Use relative path
|
|
|
+ </label>
|
|
|
</div>
|
|
|
- <span className="p-2">[[{this.state.labelInputValue} > {this.state.inputValue}]]</span>
|
|
|
- <div>
|
|
|
- </div>
|
|
|
- <div className="form-inline">
|
|
|
- <div className="custom-control custom-checkbox custom-checkbox-info">
|
|
|
- <input className="custom-control-input" id="relativePath" type="checkbox" checked={this.state.isUseRelativePath} />
|
|
|
- <label className="custom-control-label" htmlFor="relativePath" onClick={this.toggleIsUseRelativePath}>
|
|
|
- Use relative path
|
|
|
- </label>
|
|
|
- </div>
|
|
|
- <button type="button" className="btn btn-primary ml-auto">
|
|
|
- Done
|
|
|
- </button>
|
|
|
- </div>
|
|
|
- </form>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div id="Crowi" className="tab-pane" role="tabpanel">
|
|
|
- <form className="form-group">
|
|
|
- <div className="form-group">
|
|
|
- <label htmlFor="crowiLink">Label</label>
|
|
|
- <input type="text" className="form-control" id="crowiLink"></input>
|
|
|
- </div>
|
|
|
- <div>
|
|
|
- <span>URI</span>
|
|
|
- </div>
|
|
|
- <div className="d-flex">
|
|
|
- <button type="button" className="btn btn-primary ml-auto">
|
|
|
- Done
|
|
|
- </button>
|
|
|
- </div>
|
|
|
- </form>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div id="MD" className="tab-pane" role="tabpanel">
|
|
|
- <form className="form-group">
|
|
|
- <div className="form-group">
|
|
|
- <label htmlFor="MDLink">Label</label>
|
|
|
- <input type="text" className="form-control" id="MDLink"></input>
|
|
|
- </div>
|
|
|
- <div>
|
|
|
- <span>URI</span>
|
|
|
- </div>
|
|
|
- <div className="form-inline">
|
|
|
- <div className="custom-control custom-checkbox custom-checkbox-info">
|
|
|
- <input className="custom-control-input" id="relativePath" type="checkbox" checked={this.state.isUseRelativePath} />
|
|
|
- <label className="custom-control-label" htmlFor="relativePath" onClick={this.toggleIsUseRelativePath}>
|
|
|
- Use relative path
|
|
|
- </label>
|
|
|
- </div>
|
|
|
- <button type="button" className="btn btn-primary ml-auto">
|
|
|
- Done
|
|
|
- </button>
|
|
|
- </div>
|
|
|
- </form>
|
|
|
- </div>
|
|
|
+ </div>
|
|
|
+ </form>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
-
|
|
|
- <div className="col d-none d-lg-block">
|
|
|
- {this.renderPreview}
|
|
|
- render preview
|
|
|
- </div>
|
|
|
</div>
|
|
|
</ModalBody>
|
|
|
+ <ModalFooter>
|
|
|
+ <button type="button" className="btn btn-sm btn-outline-secondary" onClick={this.hide}>
|
|
|
+ Cancel
|
|
|
+ </button>
|
|
|
+ <button type="submit" className="btn btn-sm btn-primary" onClick={this.save}>
|
|
|
+ Done
|
|
|
+ </button>
|
|
|
+ </ModalFooter>
|
|
|
</Modal>
|
|
|
);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+LinkEditModal.propTypes = {
|
|
|
+ pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
|
|
|
+ onSave: PropTypes.func,
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * Wrapper component for using unstated
|
|
|
+ */
|
|
|
+const LinkEditModalWrapper = withUnstatedContainers(LinkEditModal, [PageContainer]);
|
|
|
+
|
|
|
+export default LinkEditModalWrapper;
|