Просмотр исходного кода

Merge branch 'master' of https://github.com/weseek/growi into imprv/nav-2nd-ed

Yuki Takei 5 лет назад
Родитель
Сommit
5633059ba7

+ 1 - 1
resource/locales/en_US/admin/admin.json

@@ -223,7 +223,7 @@
     "invite_users": "Invite new users",
     "click_twice_same_checkbox": "You should check at least one checkbox.",
     "invite_modal": {
-      "emails": "Emails",
+      "emails": "Emails (Possible to invite multiple people with new lines)",
       "invite_thru_email": "Send invitation email",
       "valid_email": "Valid email address is required",
       "temporary_password": "The created user has a temporary password",

+ 1 - 1
src/client/js/components/Admin/Users/UserInviteModal.jsx

@@ -49,7 +49,7 @@ class UserInviteModal extends React.Component {
         <label> {t('admin:user_management.invite_modal.emails')}</label>
         <textarea
           className="form-control"
-          placeholder="e.g. user@growi.org"
+          placeholder="e.g.&#13;&#10;user1@growi.org&#13;&#10;user2@growi.org"
           style={{ height: '200px' }}
           value={this.state.emailInputValue}
           onChange={this.handleInput}

+ 1 - 1
src/client/js/components/PageDeleteModal.jsx

@@ -124,7 +124,7 @@ const PageDeleteModal = (props) => {
         {!isDeleteCompletelyModal && renderDeleteCompletelyForm()}
       </ModalBody>
       <ModalFooter>
-        <ApiErrorMessage errorCode={errorCode} errorMessage={errorMessage} linkPath={path} />
+        <ApiErrorMessage errorCode={errorCode} errorMessage={errorMessage} />
         <button type="button" className={`btn btn-${deleteIconAndKey[deleteMode].color}`} onClick={deleteButtonHandler}>
           <i className={`icon-${deleteIconAndKey[deleteMode].icon}`} aria-hidden="true"></i>
           { t(`modal_delete.delete_${deleteIconAndKey[deleteMode].translationKey}`) }

+ 1 - 1
src/client/js/components/PageDuplicateModal.jsx

@@ -100,7 +100,7 @@ const PageDuplicateModal = (props) => {
         </div>
       </ModalBody>
       <ModalFooter>
-        <ApiErrorMessage errorCode={errorCode} errorMessage={errorMessage} linkPath={path} />
+        <ApiErrorMessage errorCode={errorCode} errorMessage={errorMessage} targetPath={pageNameInput} />
         <button type="button" className="btn btn-primary" onClick={duplicate}>Duplicate page</button>
       </ModalFooter>
     </Modal>

+ 3 - 3
src/client/js/components/PageManagement/ApiErrorMessage.jsx

@@ -5,7 +5,7 @@ import { withTranslation } from 'react-i18next';
 
 const ApiErrorMessage = (props) => {
   const {
-    t, errorCode, errorMessage, linkPath,
+    t, errorCode, errorMessage, targetPath,
   } = props;
 
   function reload() {
@@ -18,7 +18,7 @@ const ApiErrorMessage = (props) => {
         return (
           <>
             <strong><i className="icon-fw icon-ban"></i>{ t('page_api_error.already_exists') }</strong>
-            <small><a href={linkPath}>{linkPath} <i className="icon-login"></i></a></small>
+            <small><a href={targetPath}>{targetPath} <i className="icon-login"></i></a></small>
           </>
         );
       case 'notfound_or_forbidden':
@@ -77,7 +77,7 @@ ApiErrorMessage.propTypes = {
 
   errorCode:    PropTypes.string,
   errorMessage: PropTypes.string,
-  linkPath:     PropTypes.string,
+  targetPath:   PropTypes.string,
 };
 
 export default withTranslation()(ApiErrorMessage);

+ 1 - 1
src/client/js/components/PageRenameModal.jsx

@@ -150,7 +150,7 @@ const PageRenameModal = (props) => {
         </div>
       </ModalBody>
       <ModalFooter>
-        <ApiErrorMessage errorCode={errorCode} errorMessage={errorMessage} linkPath={path} />
+        <ApiErrorMessage errorCode={errorCode} errorMessage={errorMessage} targetPath={pageNameInput} />
         <button type="button" className="btn btn-primary" onClick={rename}>Rename</button>
       </ModalFooter>
     </Modal>

+ 1 - 1
src/client/js/components/PutbackPageModal.jsx

@@ -73,7 +73,7 @@ const PutBackPageModal = (props) => {
         </div>
       </ModalBody>
       <ModalFooter>
-        <ApiErrorMessage errorCode={errorCode} errorMessage={errorMessage} linkPath={path} />
+        <ApiErrorMessage errorCode={errorCode} errorMessage={errorMessage} />
         <button type="button" className="btn btn-info" onClick={putbackPageButtonHandler}>
           <i className="icon-action-undo mr-2" aria-hidden="true"></i> { t('Put Back') }
         </button>

+ 3 - 4
src/server/models/page.js

@@ -1185,18 +1185,17 @@ module.exports = function(crowi) {
   /**
    * Delete Bookmarks, Attachments, Revisions, Pages and emit delete
    */
-  pageSchema.statics.completelyDeletePageRecursively = async function(pageData, user, options = {}) {
-    const path = pageData.path;
+  pageSchema.statics.completelyDeletePageRecursively = async function(pagePath, user, options = {}) {
 
     const findOpts = { includeRedirect: true, includeTrashed: true };
-    const result = await this.findListWithDescendants(path, user, findOpts);
+    const result = await this.findListWithDescendants(pagePath, user, findOpts);
     const pages = result.pages;
 
     await Promise.all(pages.map((page) => {
       return this.completelyDeletePage(page, user, options);
     }));
 
-    return pageData;
+    return pagePath;
   };
 
   pageSchema.statics.removeByPath = function(path) {

+ 1 - 3
src/server/routes/apiv3/pages.js

@@ -72,9 +72,7 @@ module.exports = (crowi) => {
   */
   router.delete('/empty-trash', loginRequired, adminRequired, csrf, async(req, res) => {
     try {
-      const pages = await Page.deleteMany({
-        path: { $in: /^\/trash/ },
-      });
+      const pages = await Page.completelyDeletePageRecursively('/trash', req.user);
       return res.apiv3({ pages });
     }
     catch (err) {

+ 1 - 1
src/server/routes/page.js

@@ -1245,7 +1245,7 @@ module.exports = function(crowi, app) {
           return res.json(ApiResponse.error('You can not delete completely', 'user_not_admin'));
         }
         if (isRecursively) {
-          page = await Page.completelyDeletePageRecursively(page, req.user, options);
+          await Page.completelyDeletePageRecursively(page.path, req.user, options);
         }
         else {
           page = await Page.completelyDeletePage(page, req.user, options);