2
0
Эх сурвалжийг харах

Merge branch 'feature-search' of github.com:crowi/crowi into feature-search

Sotaro KARASAWA 10 жил өмнө
parent
commit
02e0150b0b

+ 45 - 20
lib/models/page.js

@@ -582,7 +582,7 @@ module.exports = function(crowi) {
     });
   };
 
-  pageSchema.statics.updatePage = function(page, updateData) {
+  pageSchema.statics.updatePageProperty = function(page, updateData) {
     var Page = this;
     return new Promise(function(resolve, reject) {
       // TODO foreach して save
@@ -597,27 +597,24 @@ module.exports = function(crowi) {
   };
 
   pageSchema.statics.updateGrant = function(page, grant, userData) {
-    var self = this;
+    var Page = this;
 
     return new Promise(function(resolve, reject) {
-      self.update({_id: page._id}, {$set: {grant: grant}}, function(err, data) {
+      page.grant = grant;
+      if (grant == GRANT_PUBLIC) {
+        page.grantedUsers = [];
+      } else {
+        page.grantedUsers = [];
+        page.grantedUsers.push(userData._id);
+      }
+
+      page.save(function(err, data) {
+        debug('Page.updateGrant, saved grantedUsers.', err, data);
         if (err) {
           return reject(err);
         }
 
-        if (grant == GRANT_PUBLIC) {
-          page.grantedUsers = [];
-        } else {
-          page.grantedUsers = [];
-          page.grantedUsers.push(userData._id);
-        }
-        page.save(function(err, data) {
-          if (err) {
-            return reject(err);
-          }
-
-          return resolve(data);
-        });
+        return resolve(data);
       });
     });
   };
@@ -666,7 +663,6 @@ module.exports = function(crowi) {
           resolve(data);
           if (!isCreate) {
             debug('pushRevision on Update');
-            pageEvent.emit('update', data, user);
           }
         });
       });
@@ -719,6 +715,34 @@ module.exports = function(crowi) {
       });
   };
 
+  pageSchema.statics.updatePage = function(pageData, body, user, options) {
+    var Page = this
+      , Revision = crowi.model('Revision')
+      , grant = options.grant || null
+      ;
+    // update existing page
+    var newRevision = Revision.prepareRevision(pageData, body, user);
+
+    return new Promise(function(resolve, reject) {
+      Page.pushRevision(pageData, newRevision, user)
+      .then(function(revision) {
+        if (grant != pageData.grant) {
+          return Page.updateGrant(pageData, grant, user).then(function(data) {
+            debug('Page grant update:', data);
+            resolve(data);
+            pageEvent.emit('update', data, user);
+          });
+        } else {
+          resolve(pageData);
+          pageEvent.emit('update', pageData, user);
+        }
+      }).catch(function(err) {
+        debug('Error on update', err);
+        debug('Error on update', err.stack);
+      });
+    });
+  };
+
   pageSchema.statics.rename = function(pageData, newPagePath, user, options) {
     var Page = this
       , Revision = crowi.model('Revision')
@@ -728,7 +752,7 @@ module.exports = function(crowi) {
 
     return new Promise(function(resolve, reject) {
       // pageData の path を変更
-      Page.updatePage(pageData, {updatedAt: Date.now(), path: newPagePath})
+      Page.updatePageProperty(pageData, {updatedAt: Date.now(), path: newPagePath})
       .then(function(data) {
         debug('Before ', pageData);
         // reivisions の path を変更
@@ -739,10 +763,11 @@ module.exports = function(crowi) {
 
         if (createRedirectPage) {
           var body = 'redirect ' + newPagePath;
-          return Page.create(path, body, user, {redirectTo: newPagePath}).then(resolve).catch(reject);
+          Page.create(path, body, user, {redirectTo: newPagePath}).then(resolve).catch(reject);
         } else {
-          return resolve(data);
+          resolve(data);
         }
+        pageEvent.emit('update', pageData, user); // update as renamed page
       });
     });
   };

+ 7 - 12
lib/routes/page.js

@@ -93,6 +93,8 @@ module.exports = function(crowi, app) {
       renderVars.pager = generatePager(pagerOptions);
       renderVars.pages = pageList;
       res.render('page_list', renderVars);
+    }).catch(function(err) {
+      debug('Error on rendering pageListShow', err);
     });
   };
 
@@ -262,11 +264,13 @@ module.exports = function(crowi, app) {
       Page.hasPortalPage(path + '/', req.user)
       .then(function(page) {
         if (page) {
-          return res.redirect(path + '/');
+          return res.redirect(encodeURI(path) + '/');
         } else {
           debug('Catch pageShow', err);
           return renderPage(null, req, res);
         }
+      }).catch(function(err) {
+        debug('Error on rendering pageShow (redirect to portal)', err);
       });
     });
   };
@@ -315,10 +319,7 @@ module.exports = function(crowi, app) {
 
       if (data) {
         previousRevision = data.revision;
-        // update existing page
-        var newRevision = Revision.prepareRevision(data, body, req.user);
-        updateOrCreate = 'update';
-        return Page.pushRevision(data, newRevision, req.user);
+        return Page.updatePage(data, body, req.user, {grant: grant});
       } else {
         // new page
         updateOrCreate = 'create';
@@ -345,13 +346,7 @@ module.exports = function(crowi, app) {
         }
       }
 
-      if (grant != data.grant) {
-        return Page.updateGrant(data, grant, req.user).then(function(data) {
-          return res.redirect(redirectPath);
-        });
-      } else {
-        return res.redirect(redirectPath);
-      }
+      return res.redirect(redirectPath);
     }).catch(function(err) {
       debug('Page create or edit error.', err);
       if (pageData && !req.form.isValid) {

+ 6 - 1
lib/routes/search.js

@@ -49,7 +49,12 @@ module.exports = function(crowi, app) {
 
         return Page.populatePageListToAnyObjects(data.data);
       }).then(function(pages) {
-        result.data = pages;
+        result.data = pages.filter(function(page) {
+          if (Object.keys(page).length < 12) { // FIXME: 12 is a number of columns.
+            return false;
+          }
+          return true;
+        });
         return res.json(ApiResponse.success(result));
       })
       .catch(function(err) {

+ 45 - 1
lib/util/search.js

@@ -100,7 +100,8 @@ SearchClient.prototype.prepareBodyForUpdate = function(body, page) {
       bookmark_count: 0, // todo
       like_count: page.liker.length || 0,
       updated_at: page.updatedAt,
-    }
+    },
+    doc_as_upsert: true,
   };
 
   body.push(command);
@@ -135,6 +136,23 @@ SearchClient.prototype.prepareBodyForCreate = function(body, page) {
   body.push(document);
 };
 
+SearchClient.prototype.prepareBodyForDelete = function(body, page) {
+  if (!Array.isArray(body)) {
+    throw new Error('Body must be an array.');
+  }
+
+  var command = {
+    delete: {
+      _index: this.index_name,
+      _type: 'pages',
+      _id: page._id.toString(),
+    }
+  };
+
+  body.push(command);
+};
+
+
 SearchClient.prototype.addPages = function(pages)
 {
   var self = this;
@@ -165,6 +183,21 @@ SearchClient.prototype.updatePages = function(pages)
   });
 };
 
+SearchClient.prototype.deletePages = function(pages)
+{
+  var self = this;
+  var body = [];
+
+  pages.map(function(page) {
+    self.prepareBodyForDelete(body, page);
+  });
+
+  debug('deletePages(): Sending Request to ES', body);
+  return this.client.bulk({
+    body: body,
+  });
+};
+
 SearchClient.prototype.addAllPages = function()
 {
   var self = this;
@@ -357,6 +390,8 @@ SearchClient.prototype.searchKeywordUnderPath = function(keyword, path, option)
 
 SearchClient.prototype.syncPageCreated = function(page, user)
 {
+  debug('SearchClient.syncPageCreated', page);
+
   if (!this.shouldIndexed(page)) {
     return ;
   }
@@ -372,8 +407,17 @@ SearchClient.prototype.syncPageCreated = function(page, user)
 
 SearchClient.prototype.syncPageUpdated = function(page, user)
 {
+  debug('SearchClient.syncPageUpdated', page);
   // TODO delete
   if (!this.shouldIndexed(page)) {
+    this.deletePages([page])
+    .then(function(res) {
+      debug('deletePages: ES Response', res);
+    })
+    .catch(function(err){
+      debug('deletePages:ES Error', err);
+    });
+
     return ;
   }
 

+ 33 - 0
resource/js/crowi-form.js

@@ -383,4 +383,37 @@ $(function() {
       $(this).removeClass('dragover');
     });
   }
+
+  var enableScrollSync = function() {
+    var getMaxScrollTop = function(dom) {
+      var rect = dom.getBoundingClientRect();
+
+      return dom.scrollHeight - rect.height;
+    };
+
+    var getScrollRate = function(dom) {
+      var maxScrollTop = getMaxScrollTop(dom);
+      var rate = dom.scrollTop / maxScrollTop;
+
+      return rate;
+    };
+
+    var getScrollTop = function(dom, rate) {
+      var maxScrollTop = getMaxScrollTop(dom);
+      var top = maxScrollTop * rate;
+
+      return top;
+    };
+
+    var editor = document.querySelector('#form-body');
+    var preview = document.querySelector('#preview-body');
+
+    editor.addEventListener('scroll', function(event) {
+      var rate = getScrollRate(this);
+      var top = getScrollTop(preview, rate);
+
+      preview.scrollTop = top;
+    });
+  };
+  enableScrollSync();
 });

+ 1 - 1
resource/js/crowi.js

@@ -354,7 +354,7 @@ $(function() {
     var $link = $(this);
     var text = $link.text();
     var path = $link.data('path');
-    var shortPath = $link.data('short-path');
+    var shortPath = new String($link.data('short-path'));
 
     var escape = function(s) {
       return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');