Quellcode durchsuchen

wip add rename modal

ryohek vor 5 Jahren
Ursprung
Commit
8d82a92861

+ 2 - 0
src/client/js/bootstrap.jsx

@@ -13,6 +13,7 @@ import AppContainer from './services/AppContainer';
 import WebsocketContainer from './services/WebsocketContainer';
 import PageCreateButton from './components/Navbar/PageCreateButton';
 import PageCreateModal from './components/PageCreateModal';
+import RenameModal from './components/RenameModal';
 
 const logger = loggerFactory('growi:app');
 
@@ -49,6 +50,7 @@ const componentMappings = {
   'create-page-button': <PageCreateButton />,
   'create-page-button-icon': <PageCreateButton isIcon />,
   'page-create-modal': <PageCreateModal />,
+  'rename-modal': <RenameModal />,
 
   'grw-sidebar-wrapper': <Sidebar />,
 

+ 104 - 0
src/client/js/components/RenameModal.jsx

@@ -0,0 +1,104 @@
+import React, { useState } from 'react';
+import PropTypes from 'prop-types';
+
+import {
+  Modal,
+  ModalHeader,
+  ModalBody,
+  ModalFooter,
+} from 'reactstrap';
+
+import { withTranslation } from 'react-i18next';
+import { format } from 'date-fns';
+import urljoin from 'url-join';
+
+import { userPageRoot } from '@commons/util/path-utils';
+import { pathUtils } from 'growi-commons';
+import { createSubscribedElement } from './UnstatedUtils';
+
+import AppContainer from '../services/AppContainer';
+import PageContainer from '../services/PageContainer';
+import PagePathAutoComplete from './PagePathAutoComplete';
+
+const RenameModal = (props) => {
+  const { t, appContainer, pageContainer } = props;
+
+  const config = appContainer.getConfig();
+  const isReachable = config.isSearchServiceReachable;
+  const { path } = pageContainer.state;
+  const userPageRootPath = userPageRoot(appContainer.currentUser);
+  const parentPath = pathUtils.addTrailingSlash(path);
+  const now = format(new Date(), 'yyyy/MM/dd');
+
+  const [todayInput1, setTodayInput1] = useState(t('Memo'));
+  const [todayInput2, setTodayInput2] = useState('');
+  const [pageNameInput, setPageNameInput] = useState(parentPath);
+  const [template, setTemplate] = useState(null);
+
+  // 現在のページ名
+  function currentPageName() {
+    return (
+      <div className="form-group">
+        <label>{ t('modal_rename.label.Current page name') }</label><br />
+        <code>{pageNameInput}</code>
+      </div>
+    );
+  }
+
+  // 移動先のページ名
+  function pageToMoveTo() {
+    return (
+      <div className="form-group">
+        <label htmlFor="newPageName">{ t('modal_rename.label.New page name') }</label><br />
+        <div className="input-group">
+          <div className="input-group-prepend">
+            <span className="input-group-text">{pageNameInput}</span>
+          </div>
+          <div id="rename-page-name-input" className="page-name-input flex-fill"></div>
+          <input type="text" className="form-control" name="new_path" id="newPageName" value={pageNameInput} />
+        </div>
+      </div>
+    );
+  };
+
+  function checkListForMovePage() {
+
+  }
+
+  function footer() {
+
+  }
+
+  return (
+    <Modal size="sm" isOpen={appContainer.state.isRenameModalShown} toggle={appContainer.closeRenameModal}>
+      <ModalHeader tag="h4" toggle={appContainer.closeRenameModal} className="bg-primary text-light">
+        { t('modal_rename.label.Move/Rename page') }
+      </ModalHeader>
+      <ModalBody>
+        {currentPageName}
+        {pageToMoveTo}
+      </ModalBody>
+      <ModalFooter>
+        <div className="d-flex justify-content-end">
+          <button type="submit" className="btn btn-primary">Rename</button>
+        </div>
+      </ModalFooter>
+    </Modal>
+  );
+};
+
+/**
+ * Wrapper component for using unstated
+ */
+const ModalControlWrapper = (props) => {
+  return createSubscribedElement(RenameModal, props, [AppContainer, PageContainer]);
+};
+
+
+RenameModal.propTypes = {
+  t: PropTypes.func.isRequired, //  i18next
+  appContainer: PropTypes.instanceOf(AppContainer).isRequired,
+  pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
+};
+
+export default withTranslation()(ModalControlWrapper);

+ 11 - 0
src/client/js/services/AppContainer.js

@@ -36,6 +36,7 @@ export default class AppContainer extends Container {
       isDrawerOpened: false,
 
       isPageCreateModalShown: false,
+      isRenameModalShown: false,
 
       recentlyUpdatedPages: [],
     };
@@ -98,6 +99,8 @@ export default class AppContainer extends Container {
 
     this.openPageCreateModal = this.openPageCreateModal.bind(this);
     this.closePageCreateModal = this.closePageCreateModal.bind(this);
+    this.openRenameModal = this.openRenameModal.bind(this);
+    this.closeRenameModal = this.closeRenameModal.bind(this);
   }
 
   /**
@@ -478,4 +481,12 @@ export default class AppContainer extends Container {
     this.setState({ isPageCreateModalShown: false });
   }
 
+  openRenameModal() {
+    this.setState({ isRenameModalShown: true });
+  }
+
+  closeRenameModal() {
+    this.setState({ isRenameModalShown: false });
+  }
+
 }

+ 1 - 0
src/server/views/layout/layout.html

@@ -151,6 +151,7 @@
 <div id="staff-credit"></div>
 
 <div id="page-create-modal"></div>
+<div id="rename-modal"></div>
 {% include '../modal/shortcuts.html' %}
 
 {% block body_end %}

+ 2 - 1
src/server/views/widget/page_tabs.html

@@ -92,7 +92,8 @@
         <i class="icon-options-vertical"></i>
       </a>
       <div class="dropdown-menu dropdown-menu-right">
-        <a class="dropdown-item" href="#" data-target="#renamePage" data-toggle="modal"><i class="icon-fw icon-action-redo"></i> {{ t('Move/Rename') }}</a>
+        <!-- <a class="dropdown-item" href="#" data-target="#renamePage" data-toggle="modal"><i class="icon-fw icon-action-redo"></i> {{ t('Move/Rename') }}</a> -->
+        <a class="dropdown-item" href="#" id="rename-modal" class="nav-item d-none d-md-block" data-toggle="modal"><i class="icon-fw icon-action-redo"></i> 名前変更</a>
         <a class="dropdown-item" href="#" data-target="#duplicatePage" data-toggle="modal"><i class="icon-fw icon-docs"></i> {{ t('Duplicate') }}</a>
         <div class="dropdown-divider"></div>
         <a class="dropdown-item" href="#" data-target="#create-template" data-toggle="modal"><i class="icon-fw icon-magic-wand"></i> {{ t('template.option_label.create/edit') }}</a>