Sotaro KARASAWA 10 лет назад
Родитель
Сommit
ef7447a262
8 измененных файлов с 270 добавлено и 196 удалено
  1. 3 2
      lib/form/revision.js
  2. 3 0
      lib/models/bookmark.js
  3. 185 107
      lib/models/page.js
  4. 14 17
      lib/routes/bookmark.js
  5. 63 67
      lib/routes/page.js
  6. 1 1
      lib/util/apiResponse.js
  7. 0 1
      lib/views/_form.html
  8. 1 1
      resource/js/crowi.js

+ 3 - 2
lib/form/revision.js

@@ -4,6 +4,7 @@ var form = require('express-form')
   , field = form.field;
   , field = form.field;
 
 
 module.exports = form(
 module.exports = form(
-  field('pageForm.body').required()
-  //field('pageForm.hoge').required()
+  field('pageForm.body').required().custom(function(value) { return value.replace(/\r/g, '\n'); }),
+  field('pageForm.currentRevision'),
+  field('pageForm.grant').toInt().required()
 );
 );

+ 3 - 0
lib/models/bookmark.js

@@ -56,6 +56,9 @@ module.exports = function(crowi) {
       newBookmark.save(function(err, bookmark) {
       newBookmark.save(function(err, bookmark) {
         debug('Bookmark.save', err, bookmark);
         debug('Bookmark.save', err, bookmark);
         if (err) {
         if (err) {
+          if (err.code === 11000) { // duplicate key (dummy reesponse of new object)
+            return resolve(newBookmark);
+          }
           return reject(err);
           return reject(err);
         }
         }
 
 

+ 185 - 107
lib/models/page.js

@@ -10,7 +10,7 @@ module.exports = function(crowi) {
     , USER_PUBLIC_FIELDS = '_id fbId image googleId name username email status createdAt' // TODO: どこか別の場所へ...
     , USER_PUBLIC_FIELDS = '_id fbId image googleId name username email status createdAt' // TODO: どこか別の場所へ...
     , pageSchema;
     , pageSchema;
 
 
-  function populatePageData(pageData, revisionId, callback) {
+  function populatePageData(pageData, revisionId) {
     var Page = crowi.model('Page');
     var Page = crowi.model('Page');
 
 
     pageData.latestRevision = pageData.revision;
     pageData.latestRevision = pageData.revision;
@@ -20,13 +20,21 @@ module.exports = function(crowi) {
     pageData.likerCount = pageData.liker.length || 0;
     pageData.likerCount = pageData.liker.length || 0;
     pageData.seenUsersCount = pageData.seenUsers.length || 0;
     pageData.seenUsersCount = pageData.seenUsers.length || 0;
 
 
-    pageData.populate([
-      {path: 'creator', model: 'User', select: USER_PUBLIC_FIELDS},
-      {path: 'revision', model: 'Revision'},
-      {path: 'liker', options: { limit: 11 }},
-      {path: 'seenUsers', options: { limit: 11 }},
-    ], function (err, pageData) {
-      Page.populate(pageData, {path: 'revision.author', model: 'User'}, callback);
+    return new Promise(function(resolve, reject) {
+      pageData.populate([
+        {path: 'creator', model: 'User', select: USER_PUBLIC_FIELDS},
+        {path: 'revision', model: 'Revision'},
+        {path: 'liker', options: { limit: 11 }},
+        {path: 'seenUsers', options: { limit: 11 }},
+      ], function (err, pageData) {
+        Page.populate(pageData, {path: 'revision.author', model: 'User'}, function(err, data) {
+          if (err) {
+            return reject(err);
+          }
+
+          return resolve(data);
+        });
+      });
     });
     });
   }
   }
 
 
@@ -52,6 +60,14 @@ module.exports = function(crowi) {
     return false;
     return false;
   };
   };
 
 
+  pageSchema.methods.isPortal = function() {
+    if (this.path.match(/.+\/$/)) {
+      return true;
+    }
+
+    return false;
+  };
+
   pageSchema.methods.isCreator = function(userData) {
   pageSchema.methods.isCreator = function(userData) {
     if (this.populated('creator') && this.creator._id.toString() === userData._id.toString()) {
     if (this.populated('creator') && this.creator._id.toString() === userData._id.toString()) {
       return true;
       return true;
@@ -181,6 +197,18 @@ module.exports = function(crowi) {
     });
     });
   };
   };
 
 
+  pageSchema.statics.hasPortalPage = function (path, user) {
+    var self = this;
+    return new Promise(function(resolve, reject) {
+      self.findPage(path, user)
+      .then(function(page) {
+        resolve(page);
+      }).catch(function(err) {
+        resolve(null); // check only has portal page, through error
+      });
+    });
+  };
+
   pageSchema.statics.getGrantLabels = function() {
   pageSchema.statics.getGrantLabels = function() {
     var grantLabels = {};
     var grantLabels = {};
     grantLabels[GRANT_PUBLIC]     = '公開';
     grantLabels[GRANT_PUBLIC]     = '公開';
@@ -239,54 +267,72 @@ module.exports = function(crowi) {
       });
       });
   };
   };
 
 
-  pageSchema.statics.findPageById = function(id, cb) {
+  pageSchema.statics.findPageById = function(id) {
     var Page = this;
     var Page = this;
 
 
-    Page.findOne({_id: id}, function(err, pageData) {
-      if (pageData === null) {
-        return cb(new Error('Page Not Found'), null);
-      }
+    return new Promise(function(resolve, reject) {
+      Page.findOne({_id: id}, function(err, pageData) {
+        if (err) {
+          return reject(err);
+        }
 
 
-      return populatePageData(pageData, null, cb);
+        populatePageData(pageData, null).then(resolve).catch(reject);
+      });
     });
     });
   };
   };
 
 
-  pageSchema.statics.findPageByIdAndGrantedUser = function(id, userData, cb) {
+  pageSchema.statics.findPageByIdAndGrantedUser = function(id, userData) {
     var Page = this;
     var Page = this;
 
 
-    Page.findPageById(id, function(err, pageData) {
-      if (pageData === null) {
-        return cb(new Error('Page Not Found'), null);
-      }
-
-      if (userData && !pageData.isGrantedFor(userData)) {
-        return cb(PAGE_GRANT_ERROR, null);
-      }
+    return new Promise(function(resolve, reject) {
+      Page.findPageById(id)
+      .then(function(pageData) {
+        if (userData && !pageData.isGrantedFor(userData)) {
+          return reject(new Error('Page is not granted for the user')); //PAGE_GRANT_ERROR, null);
+        }
 
 
-      return cb(null,pageData);
+        return resolve(pageData);
+      }).catch(function(err) {
+        return reject(err);
+      });
     });
     });
   };
   };
 
 
-  pageSchema.statics.findPage = function(path, userData, revisionId, options, cb) {
-    var Page = this;
+  // find page and check if granted user
+  pageSchema.statics.findPage = function(path, userData, revisionId, ignoreNotFound) {
+    var self = this;
 
 
-    this.findOne({path: path}, function(err, pageData) {
-      if (pageData === null) {
-        return cb(new Error('Page Not Found'), null);
-      }
+    return new Promise(function(resolve, reject) {
+      self.findOne({path: path}, function(err, pageData) {
+        if (err) {
+          return reject(err);
+        }
 
 
-      if (!pageData.isGrantedFor(userData)) {
-        return cb(PAGE_GRANT_ERROR, null);
-      }
+        if (pageData === null) {
+          if (ignoreNotFound) {
+            return resolve(null);
+          }
+
+          var pageNotFoundError = new Error('Page Not Found')
+          pageNotFoundError.name = 'Crowi:Page:NotFound';
+          return reject(pageNotFoundError);
+        }
+
+        if (!pageData.isGrantedFor(userData)) {
+          return reject(new Error('Page is not granted for the user')); //PAGE_GRANT_ERROR, null);
+        }
 
 
-      return populatePageData(pageData, revisionId, cb);
+        populatePageData(pageData, revisionId || null).then(resolve).catch(reject);
+      });
     });
     });
   };
   };
 
 
-  pageSchema.statics.findListByPageIds = function(ids, options, cb) {
+  pageSchema.statics.findListByPageIds = function(ids, options) {
   };
   };
 
 
-  pageSchema.statics.findListByStartWith = function(path, userData, options, cb) {
+  pageSchema.statics.findListByStartWith = function(path, userData, options) {
+    var Page = this;
+
     if (!options) {
     if (!options) {
       options = {sort: 'updatedAt', desc: -1, offset: 0, limit: 50};
       options = {sort: 'updatedAt', desc: -1, offset: 0, limit: 50};
     }
     }
@@ -301,24 +347,30 @@ module.exports = function(crowi) {
     var queryReg = new RegExp('^' + path);
     var queryReg = new RegExp('^' + path);
     var sliceOption = options.revisionSlice || {$slice: 1};
     var sliceOption = options.revisionSlice || {$slice: 1};
 
 
-    var q = this.find({
-        path: queryReg,
-        redirectTo: null,
-        $or: [
-          {grant: null},
-          {grant: GRANT_PUBLIC},
-          {grant: GRANT_RESTRICTED, grantedUsers: userData._id},
-          {grant: GRANT_SPECIFIED, grantedUsers: userData._id},
-          {grant: GRANT_OWNER, grantedUsers: userData._id},
-        ],
-      })
-      .populate('revision')
-      .sort(sortOpt)
-      .skip(opt.offset)
-      .limit(opt.limit);
-
-    q.exec(function(err, data) {
-      cb(err, data);
+    return new Promise(function(resolve, reject) {
+      var q = Page.find({
+          path: queryReg,
+          redirectTo: null,
+          $or: [
+            {grant: null},
+            {grant: GRANT_PUBLIC},
+            {grant: GRANT_RESTRICTED, grantedUsers: userData._id},
+            {grant: GRANT_SPECIFIED, grantedUsers: userData._id},
+            {grant: GRANT_OWNER, grantedUsers: userData._id},
+          ],
+        })
+        .populate('revision')
+        .sort(sortOpt)
+        .skip(opt.offset)
+        .limit(opt.limit);
+
+      q.exec(function(err, data) {
+        if (err) {
+          return reject(err);
+        }
+
+        resolve(data);
+      });
     });
     });
   };
   };
 
 
@@ -329,83 +381,109 @@ module.exports = function(crowi) {
     });
     });
   };
   };
 
 
-  pageSchema.statics.updateGrant = function(page, grant, userData, cb) {
-    this.update({_id: page._id}, {$set: {grant: grant}}, function(err, data) {
-      if (grant == GRANT_PUBLIC) {
-        page.grantedUsers = [];
-      } else {
-        page.grantedUsers = [];
-        page.grantedUsers.push(userData._id);
-      }
-      page.save(function(err, data) {
-        return cb(err, data);
+  pageSchema.statics.updateGrant = function(page, grant, userData) {
+    var self = this;
+
+    return new Promise(function(resolve, reject) {
+      self.update({_id: page._id}, {$set: {grant: grant}}, function(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);
+        });
       });
       });
     });
     });
   };
   };
 
 
   // Instance method でいいのでは
   // Instance method でいいのでは
-  pageSchema.statics.pushToGrantedUsers = function(page, userData, cb) {
-    if (!page.grantedUsers || !Array.isArray(page.grantedUsers)) {
-      page.grantedUsers = [];
-    }
-    page.grantedUsers.push(userData._id);
-    page.save(function(err, data) {
-      return cb(err, data);
+  pageSchema.statics.pushToGrantedUsers = function(page, userData) {
+
+    return new Promise(function(resolve, reject) {
+      if (!page.grantedUsers || !Array.isArray(page.grantedUsers)) {
+        page.grantedUsers = [];
+      }
+      page.grantedUsers.push(userData);
+      page.save(function(err, data) {
+        if (err) {
+          return reject(err);
+        }
+        return resolve(data);
+      });
     });
     });
   };
   };
 
 
-  pageSchema.statics.pushRevision = function(pageData, newRevision, user, cb) {
-    newRevision.save(function(err, newRevision) {
-      if (err) {
-        debug('Error on saving revision', err);
-        return cb(err, null);
-      }
+  pageSchema.statics.pushRevision = function(pageData, newRevision, user) {
 
 
-      debug('Successfully saved new revision', newRevision);
-      pageData.revision = newRevision._id;
-      pageData.updatedAt = Date.now();
-      pageData.save(function(err, data) {
+    return new Promise(function(resolve, reject) {
+      newRevision.save(function(err, newRevision) {
         if (err) {
         if (err) {
-          debug('Error on save page data (after push revision)', err);
-          cb(err, null);
-          return;
+          debug('Error on saving revision', err);
+          return reject(err);
         }
         }
-        cb(err, data);
+
+        debug('Successfully saved new revision', newRevision);
+        pageData.revision = newRevision;
+        pageData.updatedAt = Date.now();
+        pageData.save(function(err, data) {
+          if (err) {
+            // todo: remove new revision?
+            debug('Error on save page data (after push revision)', err);
+            return reject(err);
+          }
+
+          resolve(data);
+        });
       });
       });
     });
     });
   };
   };
 
 
-  pageSchema.statics.create = function(path, body, user, options, cb) {
+  pageSchema.statics.create = function(path, body, user, options) {
     var Page = this
     var Page = this
       , Revision = crowi.model('Revision')
       , Revision = crowi.model('Revision')
       , format = options.format || 'markdown'
       , format = options.format || 'markdown'
       , grant = options.grant || GRANT_PUBLIC
       , grant = options.grant || GRANT_PUBLIC
       , redirectTo = options.redirectTo || null;
       , redirectTo = options.redirectTo || null;
 
 
-    this.findOne({path: path}, function(err, pageData) {
-      if (pageData) {
-        cb(new Error('Cannot create new page to existed path'), null);
-        return;
-      }
+    return new Promise(function(resolve, reject) {
+      Page.findOne({path: path}, function(err, pageData) {
+        if (pageData) {
+          return reject(new Error('Cannot create new page to existed path'));
+        }
 
 
-      var newPage = new Page();
-      newPage.path = path;
-      newPage.creator = user;
-      newPage.createdAt = Date.now();
-      newPage.updatedAt = Date.now();
-      newPage.redirectTo = redirectTo;
-      newPage.grant = grant;
-      newPage.grantedUsers = [];
-      newPage.grantedUsers.push(user);
-      newPage.save(function (err, newPage) {
-
-        var newRevision = Revision.prepareRevision(newPage, body, user, {format: format});
-        Page.pushRevision(newPage, newRevision, user, function(err, data) {
+        var newPage = new Page();
+        newPage.path = path;
+        newPage.creator = user;
+        newPage.createdAt = Date.now();
+        newPage.updatedAt = Date.now();
+        newPage.redirectTo = redirectTo;
+        newPage.grant = grant;
+        newPage.grantedUsers = [];
+        newPage.grantedUsers.push(user);
+
+        newPage.save(function (err, newPage) {
           if (err) {
           if (err) {
-            console.log('Push Revision Error on create page', err);
+            return reject(err);
           }
           }
-          cb(err, data);
-          return;
+
+          var newRevision = Revision.prepareRevision(newPage, body, user, {format: format});
+          Page.pushRevision(newPage, newRevision, user).then(function(data) {
+            resolve(data);
+          }).catch(function(err) {
+            debug('Push Revision Error on create page', err);
+            return reject(err);
+          });
         });
         });
       });
       });
     });
     });

+ 14 - 17
lib/routes/bookmark.js

@@ -46,25 +46,22 @@ module.exports = function(crowi, app) {
   actions.api.add = function(req, res) {
   actions.api.add = function(req, res) {
     var pageId = req.body.page_id;
     var pageId = req.body.page_id;
 
 
-    Page.findPageByIdAndGrantedUser(pageId, req.user, function(err, pageData) {
-      if (err) {
-        return res.json(ApiResponse.error(err));
-      }
+    Page.findPageByIdAndGrantedUser(pageId, req.user)
+    .then(function(pageData) {
       if (pageData) {
       if (pageData) {
-        Bookmark.add(pageData, req.user)
-        .then(function(data) {
-          var result = {};
-          data.depopulate('page');
-          data.depopulate('user');
-
-          result.bookmark = data;
-          return res.json(ApiResponse.success(result));
-        }).catch(function(err) {
-          return res.json(ApiResponse.error(err));
-        });
+        return Bookmark.add(pageData, req.user);
       } else {
       } else {
         return res.json(ApiResponse.success({bookmark: null}));
         return res.json(ApiResponse.success({bookmark: null}));
       }
       }
+    }).then(function(data) {
+      var result = {};
+      data.depopulate('page');
+      data.depopulate('user');
+
+      result.bookmark = data;
+      return res.json(ApiResponse.success(result));
+    }).catch(function(err) {
+      return res.json(ApiResponse.error(err));
     });
     });
   };
   };
 
 
@@ -80,8 +77,8 @@ module.exports = function(crowi, app) {
 
 
     Bookmark.remove(pageId, req.user)
     Bookmark.remove(pageId, req.user)
     .then(function(data) {
     .then(function(data) {
-      debug('Bookmark removed.', data);
-      return res.json(ApiResponse.success({}));
+      debug('Bookmark removed.', data); // if the bookmark is not exists, this 'data' is null
+      return res.json(ApiResponse.success());
     }).catch(function(err) {
     }).catch(function(err) {
       return res.json(ApiResponse.error(err));
       return res.json(ApiResponse.error(err));
     });
     });

+ 63 - 67
lib/routes/page.js

@@ -48,22 +48,30 @@ module.exports = function(crowi, app) {
   // routing
   // routing
   actions.pageListShow = function(req, res) {
   actions.pageListShow = function(req, res) {
     var path = getPathFromRequest(req);
     var path = getPathFromRequest(req);
-    var options = {};
-
     // index page
     // index page
-    options = {
+    var options = {
       offset: req.query.offset || 0,
       offset: req.query.offset || 0,
       limit : req.query.limit  || 50
       limit : req.query.limit  || 50
     };
     };
-    var q = Page.findListByStartWith(path, req.user, options, function(err, doc) {
-      if (err) {
-        // TODO : check
-      }
-      res.render('page_list', {
-        path: path + (path == '/' ? '' : '/'),
-        pages: doc,
-        pager: generatePager(options)
-      });
+
+    var renderVars = {
+      page: null,
+      path: path + (path == '/' ? '' : '/'),
+      pages: [],
+      pager: generatePager(options)
+    };
+
+    Page.hasPortalPage(path, req.user)
+    .then(function(portalPage) {
+      renderVars.page = portalPage;
+
+      return Page.findListByStartWith(path, req.user, options);
+    }).then(function(pageList) {
+
+      renderVars.pages = pageList;
+      renderVars.pager = generatePager(pageList);
+
+      res.render('page_list', renderVars);
     });
     });
   };
   };
 
 
@@ -114,78 +122,72 @@ module.exports = function(crowi, app) {
 
 
     // single page
     // single page
     var parentPath = path.split('/').slice(0, -1).join('/'); // TODO : limitation
     var parentPath = path.split('/').slice(0, -1).join('/'); // TODO : limitation
-    options = {
-    };
 
 
-    Page.findPage(path, req.user, req.query.revision, options, function(err, pageData) {
-      if (req.query.revision && err) {
-        res.redirect(encodeURI(path));
-        return ;
-      }
+    Page.findPage(path, req.user, req.query.revision)
+    .then(function(page) {
+      debug('Page found', page._id, page.path);
 
 
-      if (err == Page.PAGE_GRANT_ERROR) {
-        debug('PAGE_GRANT_ERROR');
-        return res.redirect('/');
+      return renderPage(page, req, res);
+    }).catch(function(err) {
+      if (req.query.revision) {
+        return res.redirect(encodeURI(path));
       }
       }
 
 
-      if (pageData) {
-        debug('Page found', pageData._id, pageData.path);
-        pageData.seen(req.user, function(err, data) {
-          return renderPage(data, req, res);
-        });
-      } else {
-          return renderPage(null, req, res);
-      }
+      debug('Catch pageShow', err);
+      return renderPage(null, req, res);
     });
     });
   };
   };
 
 
   actions.pageEdit = function(req, res) {
   actions.pageEdit = function(req, res) {
-    var io = module.parent.exports.io;
     var path = getPathFromRequest(req);
     var path = getPathFromRequest(req);
 
 
     var pageForm = req.body.pageForm;
     var pageForm = req.body.pageForm;
     var body = pageForm.body;
     var body = pageForm.body;
-    var format = pageForm.format;
     var currentRevision = pageForm.currentRevision;
     var currentRevision = pageForm.currentRevision;
     var grant = pageForm.grant;
     var grant = pageForm.grant;
 
 
+    var redirectPath = encodeURI(path);
+
     if (!Page.isCreatableName(path)) {
     if (!Page.isCreatableName(path)) {
-      res.redirect(encodeURI(path));
+      res.redirect(redirectPath);
       return ;
       return ;
     }
     }
 
 
-    Page.findPage(path, req.user, null, {}, function(err, pageData){
+    var ignoreNotFound = true;
+    Page.findPage(path, req.user, null, ignoreNotFound)
+    .then(function(pageData) {
       if (!req.form.isValid) {
       if (!req.form.isValid) {
         renderPage(pageData, req, res);
         renderPage(pageData, req, res);
         return;
         return;
       }
       }
+
       if (pageData && !pageData.isUpdatable(currentRevision)) {
       if (pageData && !pageData.isUpdatable(currentRevision)) {
         req.form.errors.push('すでに他の人がこのページを編集していたため保存できませんでした。ページを再読み込み後、自分の編集箇所のみ再度編集してください。');
         req.form.errors.push('すでに他の人がこのページを編集していたため保存できませんでした。ページを再読み込み後、自分の編集箇所のみ再度編集してください。');
         renderPage(pageData, req, res);
         renderPage(pageData, req, res);
         return;
         return;
       }
       }
 
 
-      var cb = function(err, data) {
-        if (err) {
-          console.log('Page save error:', err);
-        }
-        crowi.getIo().sockets.emit('page edited', {page: data, user: req.user});
-
-        var redirectPath = encodeURI(path);
-        if (grant != data.grant) {
-          Page.updateGrant(data, grant, req.user, function (err, data) {
-            return res.redirect(redirectPath);
-          });
-        } else {
-          return res.redirect(redirectPath);
-        }
-      };
       if (pageData) {
       if (pageData) {
+        // update existing page
         var newRevision = Revision.prepareRevision(pageData, body, req.user);
         var newRevision = Revision.prepareRevision(pageData, body, req.user);
-        Page.pushRevision(pageData, newRevision, req.user, cb);
+        return Page.pushRevision(pageData, newRevision, req.user);
       } else {
       } else {
-        Page.create(path, body, req.user, {format: format, grant: grant}, cb);
+        // new page
+        return Page.create(path, body, req.user, {grant: grant});
       }
       }
+    }).then(function(data) {
+      crowi.getIo().sockets.emit('page edited', {page: data, user: req.user});
+
+      if (grant != data.grant) {
+        return Page.updateGrant(data, grant, req.user).then(function(data) {
+          return res.redirect(redirectPath);
+        });
+      } else {
+        return res.redirect(redirectPath);
+      }
+    }).catch(function(err) {
+      debug('Create or edit page error', err);
+      return res.redirect(redirectPath);
     });
     });
   };
   };
 
 
@@ -197,24 +199,18 @@ module.exports = function(crowi, app) {
   api.redirector = function(req, res){
   api.redirector = function(req, res){
     var id = req.params.id;
     var id = req.params.id;
 
 
-    var cb = function(err, d) {
-      if (err) {
-        return res.redirect('/');
+    Page.findPageById(id)
+    .then(function(pageData) {
+      if (pageData.grant == Page.GRANT_RESTRICTED && !pageData.isGrantedFor(req.user)) {
+        return Page.pushToGrantedUsers(pageData, req.user);
       }
       }
-      return res.redirect(encodeURI(d.path));
-    };
 
 
-    Page.findPageById(id, function(err, pageData) {
-      if (pageData) {
-        if (pageData.grant == Page.GRANT_RESTRICTED && !pageData.isGrantedFor(req.user)) {
-          return Page.pushToGrantedUsers(pageData, req.user, cb);
-        } else {
-          return cb(null, pageData);
-        }
-      } else {
-        // 共有用URLにrevisionのidを使っていた頃の互換性のため
-        Revision.findRevision(id, cb);
-      }
+      return Promise.resolve(pageData);
+    }).then(function(page) {
+
+      return res.redirect(encodeURI(page.path));
+    }).catch(function(err) {
+      return res.redirect('/');
     });
     });
   };
   };
 
 

+ 1 - 1
lib/util/apiResponse.js

@@ -20,7 +20,7 @@ ApiResponse.error = function (err) {
 };
 };
 
 
 ApiResponse.success = function (data) {
 ApiResponse.success = function (data) {
-  var result = data;
+  var result = data || {};
 
 
   result.ok = true;
   result.ok = true;
   return result;
   return result;

+ 0 - 1
lib/views/_form.html

@@ -12,7 +12,6 @@
   <form action="{{ path }}/edit" id="page-form" method="post" class="col-md-6 {% if isUploadable() %}uploadable{% endif %}">
   <form action="{{ path }}/edit" id="page-form" method="post" class="col-md-6 {% if isUploadable() %}uploadable{% endif %}">
     <textarea name="pageForm[body]" class="form-control form-body-height" id="form-body">{% if pageForm.body %}{{ pageForm.body }}{% elseif not revision.body %}# {{ path|path2name }}{% else %}{{ revision.body }}{% endif %}</textarea>
     <textarea name="pageForm[body]" class="form-control form-body-height" id="form-body">{% if pageForm.body %}{{ pageForm.body }}{% elseif not revision.body %}# {{ path|path2name }}{% else %}{{ revision.body }}{% endif %}</textarea>
 
 
-    <input type="hidden" name="pageForm[format]" value="markdown" id="form-format">
     <input type="hidden" name="pageForm[currentRevision]" value="{{ pageForm.currentRevision|default(revision._id.toString()) }}">
     <input type="hidden" name="pageForm[currentRevision]" value="{{ pageForm.currentRevision|default(revision._id.toString()) }}">
     <div class="form-submit-group form-group form-inline">
     <div class="form-submit-group form-group form-inline">
       {#<button class="btn btn-default">
       {#<button class="btn btn-default">

+ 1 - 1
resource/js/crowi.js

@@ -356,7 +356,7 @@ $(function() {
     $('#page-comment-form').on('submit', function() {
     $('#page-comment-form').on('submit', function() {
       $button = $('#commenf-form-button');
       $button = $('#commenf-form-button');
       $button.attr('disabled', 'disabled');
       $button.attr('disabled', 'disabled');
-      $.post('/_api/comments.post', $(this).serialize(), function(data) {
+      $.post('/_api/comments.add', $(this).serialize(), function(data) {
         $button.removeAttr('disabled');
         $button.removeAttr('disabled');
         if (data.ok) {
         if (data.ok) {
           var comment = data.comment;
           var comment = data.comment;