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

Merge branch 'master' into imprv/refacter-recursively

itizawa 5 лет назад
Родитель
Сommit
5d7a6dd532

+ 10 - 1
CHANGES.md

@@ -1,9 +1,14 @@
 # CHANGES
 
-## v4.2.5-RC
+## v4.2.6-RC
 
 * 
 
+## v4.2.5-RC
+
+* Improvement: Invoke garbage collection when reindex all pages by elasticsearch
+* Fix: MathJax rendering does not work
+
 ## v4.2.4
 
 * Fix: Fixed an error when creating a new page with `Ctrl-S`
@@ -52,6 +57,10 @@
     * migrate-mongo
     * mongoose
 
+## v4.1.13
+
+* Fix: MathJax rendering does not work
+
 ## v4.1.12
 
 * Fix: Adjust line-height for pre under li

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "growi",
-  "version": "4.2.5-RC",
+  "version": "4.2.6-RC",
   "description": "Team collaboration software using markdown",
   "tags": [
     "wiki",

+ 1 - 1
resource/cdn-manifests.js

@@ -39,7 +39,7 @@ module.exports = {
     },
     {
       name: 'mathjax',
-      url: 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js',
+      url: 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js',
       args: {
         async: true,
         integrity: '',

+ 4 - 0
src/client/js/boot.js

@@ -1,5 +1,9 @@
 import {
   applyColorScheme,
 } from './util/color-scheme';
+import {
+  applyOldIos,
+} from './util/old-ios';
 
 applyColorScheme();
+applyOldIos();

+ 1 - 1
src/client/js/components/Navbar/GrowiSubNavigation.jsx

@@ -44,7 +44,7 @@ const PagePathNav = ({
   }
 
   const copyDropdownId = `copydropdown${isCompactMode ? '-subnav-compact' : ''}-${pageId}`;
-  const copyDropdownToggleClassName = 'd-block text-muted bg-transparent btn-copy border-0';
+  const copyDropdownToggleClassName = 'd-block text-muted bg-transparent btn-copy border-0 py-0';
 
   return (
     <div className="grw-page-path-nav">

+ 2 - 2
src/client/js/components/Page/RevisionBody.jsx

@@ -42,8 +42,8 @@ export default class RevisionBody extends React.PureComponent {
     //   So, before MathJax is initialized, execute renderMathJaxWithDebounce again.
     //   Avoiding initialization of MathJax of draw.io solves the problem.
     //   refs: https://github.com/jgraph/drawio/pull/831
-    if (MathJax != null && MathJax.Hub != null) {
-      MathJax.Hub.Queue(['Typeset', MathJax.Hub, this.element]);
+    if (MathJax != null) {
+      MathJax.typesetPromise([this.element]);
     }
     else {
       this.renderMathJaxWithDebounce();

+ 2 - 2
src/client/js/components/Page/TagEditModal.jsx

@@ -35,12 +35,12 @@ function TagEditModal(props) {
   }
 
   return (
-    <Modal isOpen={props.isOpen} toggle={closeModalHandler} id="edit-tag-modal">
+    <Modal isOpen={props.isOpen} toggle={closeModalHandler} id="edit-tag-modal" autoFocus={false}>
       <ModalHeader tag="h4" toggle={closeModalHandler} className="bg-primary text-light">
         Edit Tags
       </ModalHeader>
       <ModalBody>
-        <TagsInput tags={tags} onTagsUpdated={onTagsUpdatedByTagsInput} />
+        <TagsInput tags={tags} onTagsUpdated={onTagsUpdatedByTagsInput} autoFocus />
       </ModalBody>
       <ModalFooter>
         <button type="button" className="btn btn-primary" onClick={handleSubmit}>

+ 5 - 2
src/client/js/components/Page/TagsInput.jsx

@@ -82,6 +82,7 @@ class TagsInput extends React.Component {
           options={this.state.resultTags} // Search result (Some tag names)
           placeholder="tag name"
           selectHintOnEnter
+          autoFocus={this.props.autoFocus}
         />
       </div>
     );
@@ -95,13 +96,15 @@ class TagsInput extends React.Component {
 const TagsInputWrapper = withUnstatedContainers(TagsInput, [AppContainer]);
 
 TagsInput.propTypes = {
-  appContainer: PropTypes.instanceOf(AppContainer).isRequired,
+  appContainer:  PropTypes.instanceOf(AppContainer).isRequired,
 
-  tags: PropTypes.array.isRequired,
+  tags:          PropTypes.array.isRequired,
   onTagsUpdated: PropTypes.func.isRequired,
+  autoFocus:     PropTypes.bool,
 };
 
 TagsInput.defaultProps = {
+  autoFocus:     false,
 };
 
 export default TagsInputWrapper;

+ 8 - 1
src/client/js/components/PageCreateModal.jsx

@@ -166,6 +166,7 @@ const PageCreateModal = (props) => {
                     addTrailingSlash
                     onSubmit={ppacSubmitHandler}
                     onInputChange={ppacInputChangeHandler}
+                    autoFocus
                   />
                 )
                 : (
@@ -243,7 +244,13 @@ const PageCreateModal = (props) => {
   }
 
   return (
-    <Modal size="lg" isOpen={navigationContainer.state.isPageCreateModalShown} toggle={navigationContainer.closePageCreateModal} className="grw-create-page">
+    <Modal
+      size="lg"
+      isOpen={navigationContainer.state.isPageCreateModalShown}
+      toggle={navigationContainer.closePageCreateModal}
+      className="grw-create-page"
+      autoFocus={false}
+    >
       <ModalHeader tag="h4" toggle={navigationContainer.closePageCreateModal} className="bg-primary text-light">
         { t('New Page') }
       </ModalHeader>

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

@@ -120,7 +120,7 @@ const PageDuplicateModal = (props) => {
   }
 
   return (
-    <Modal size="lg" isOpen={props.isOpen} toggle={props.onClose} className="grw-duplicate-page">
+    <Modal size="lg" isOpen={props.isOpen} toggle={props.onClose} className="grw-duplicate-page" autoFocus={false}>
       <ModalHeader tag="h4" toggle={props.onClose} className="bg-primary text-light">
         { t('modal_duplicate.label.Duplicate page') }
       </ModalHeader>
@@ -141,6 +141,7 @@ const PageDuplicateModal = (props) => {
                   initializedPath={path}
                   onSubmit={ppacSubmitHandler}
                   onInputChange={ppacInputChangeHandler}
+                  autoFocus
                 />
               )
               : (

+ 9 - 10
src/client/js/components/PageEditor/LinkEditModal.jsx

@@ -5,6 +5,7 @@ import {
   Modal,
   ModalHeader,
   ModalBody,
+  ModalFooter,
   Popover,
   PopoverBody,
 } from 'reactstrap';
@@ -445,17 +446,15 @@ class LinkEditModal extends React.PureComponent {
               {this.renderLinkPreview()}
             </div>
           </div>
-          <div className="row">
-            <div className="col-12 text-center">
-              <button type="button" className="btn btn-sm btn-outline-secondary mx-1" onClick={this.hide}>
-                {t('Cancel')}
-              </button>
-              <button type="submit" className="btn btn-sm btn-primary mx-1" onClick={this.save}>
-                {t('Done')}
-              </button>
-            </div>
-          </div>
         </ModalBody>
+        <ModalFooter>
+          <button type="button" className="btn btn-sm btn-outline-secondary mx-1" onClick={this.hide}>
+            {t('Cancel')}
+          </button>
+          <button type="submit" className="btn btn-sm btn-primary mx-1" onClick={this.save}>
+            {t('Done')}
+          </button>
+        </ModalFooter>
       </Modal>
     );
   }

+ 4 - 1
src/client/js/components/PagePathAutoComplete.jsx

@@ -44,6 +44,7 @@ const PagePathAutoComplete = (props) => {
       emptyLabelExceptError={null}
       placeholder="Input page path"
       keywordOnInit={getKeywordOnInit(initializedPath)}
+      autoFocus={props.autoFocus}
     />
   );
 
@@ -55,10 +56,12 @@ PagePathAutoComplete.propTypes = {
 
   onSubmit:         PropTypes.func,
   onInputChange:    PropTypes.func,
+  autoFocus:        PropTypes.bool,
 };
 
 PagePathAutoComplete.defaultProps = {
-  initializedPath: '/',
+  initializedPath:  '/',
+  autoFocus:        false,
 };
 
 export default PagePathAutoComplete;

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

@@ -134,7 +134,7 @@ const PageRenameModal = (props) => {
   }
 
   return (
-    <Modal size="lg" isOpen={props.isOpen} toggle={props.onClose}>
+    <Modal size="lg" isOpen={props.isOpen} toggle={props.onClose} autoFocus={false}>
       <ModalHeader tag="h4" toggle={props.onClose} className="bg-primary text-light">
         { t('modal_rename.label.Move/Rename page') }
       </ModalHeader>
@@ -156,6 +156,7 @@ const PageRenameModal = (props) => {
                 className="form-control"
                 onChange={e => inputChangeHandler(e.target.value)}
                 required
+                autoFocus
               />
             </form>
           </div>

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

@@ -75,7 +75,7 @@ class SearchForm extends React.Component {
     }
 
     if (!isShownHelp) {
-      return null;
+      return <></>;
     }
 
     return (

+ 18 - 0
src/client/js/util/old-ios.js

@@ -0,0 +1,18 @@
+const userAgent = window.navigator.userAgent.toLowerCase();
+// TODO: impl more accurate logic
+// https://youtrack.weseek.co.jp/issue/GW-4826
+const isOldIos = /iphone os 12/.test(userAgent);
+
+/**
+ * Apply 'oldIos' attribute to <html></html>
+ */
+function applyOldIos() {
+  if (isOldIos) {
+    document.documentElement.setAttribute('old-ios', 'true');
+  }
+}
+
+export {
+  // eslint-disable-next-line import/prefer-default-export
+  applyOldIos,
+};

+ 9 - 0
src/client/styles/scss/_old-ios.scss

@@ -0,0 +1,9 @@
+html[old-ios] body:not(.on-edit) {
+  .grw-navbar {
+    position: initial !important;
+    top: 0 !important;
+  }
+  .grw-subnav-fixed-container {
+    top: 0 !important;
+  }
+}

+ 2 - 1
src/client/styles/scss/_on-edit.scss

@@ -139,7 +139,8 @@ body.on-edit {
       .grw-tag-labels.form-inline {
         flex-flow: row nowrap;
         width: 100%;
-        overflow-x: scroll;
+        overflow-x: auto;
+        scrollbar-width: thin;
       }
     }
   }

+ 1 - 0
src/client/styles/scss/style-app.scss

@@ -46,6 +46,7 @@
 @import 'mirror_mode';
 @import 'modal';
 @import 'navbar';
+@import 'old-ios';
 @import 'on-edit';
 @import 'page-duplicate-modal';
 @import 'page_list';