|
|
@@ -60,12 +60,15 @@ export default class PageContainer extends Container {
|
|
|
sumOfBookmarks: 0,
|
|
|
createdAt: mainContent.getAttribute('data-page-created-at'),
|
|
|
updatedAt: mainContent.getAttribute('data-page-updated-at'),
|
|
|
+
|
|
|
+ isUserPage: JSON.parse(mainContent.getAttribute('data-page-user')) != null,
|
|
|
isTrashPage: isTrashPage(path),
|
|
|
- isForbidden: JSON.parse(mainContent.getAttribute('data-page-is-forbidden')),
|
|
|
isDeleted: JSON.parse(mainContent.getAttribute('data-page-is-deleted')),
|
|
|
isDeletable: JSON.parse(mainContent.getAttribute('data-page-is-deletable')),
|
|
|
isNotCreatable: JSON.parse(mainContent.getAttribute('data-page-is-not-creatable')),
|
|
|
isAbleToDeleteCompletely: JSON.parse(mainContent.getAttribute('data-page-is-able-to-delete-completely')),
|
|
|
+ isPageExist: mainContent.getAttribute('data-page-id') != null,
|
|
|
+
|
|
|
pageUser: JSON.parse(mainContent.getAttribute('data-page-user')),
|
|
|
tags: null,
|
|
|
hasChildren: JSON.parse(mainContent.getAttribute('data-page-has-children')),
|
|
|
@@ -101,9 +104,19 @@ export default class PageContainer extends Container {
|
|
|
interceptorManager.addInterceptor(new DrawioInterceptor(appContainer), 20);
|
|
|
interceptorManager.addInterceptor(new RestoreCodeBlockInterceptor(appContainer), 900); // process as late as possible
|
|
|
|
|
|
- this.retrieveSeenUsers();
|
|
|
this.initStateMarkdown();
|
|
|
- this.initStateOthers();
|
|
|
+ this.checkAndUpdateImageUrlCached(this.state.likerUsers);
|
|
|
+
|
|
|
+ const { isSharedUser } = this.appContainer;
|
|
|
+
|
|
|
+ // see https://dev.growi.org/5fabddf8bbeb1a0048bcb9e9
|
|
|
+ const isAbleToGetAttachedInformationAboutPages = this.state.isPageExist && !isSharedUser;
|
|
|
+
|
|
|
+ if (isAbleToGetAttachedInformationAboutPages) {
|
|
|
+ this.retrieveSeenUsers();
|
|
|
+ this.retrieveLikeInfo();
|
|
|
+ this.retrieveBookmarkInfo();
|
|
|
+ }
|
|
|
|
|
|
this.setTocHtml = this.setTocHtml.bind(this);
|
|
|
this.save = this.save.bind(this);
|
|
|
@@ -133,6 +146,101 @@ export default class PageContainer extends Container {
|
|
|
return 'PageContainer';
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ get isAbleToOpenPageEditor() {
|
|
|
+ const { isNotCreatable, isTrashPage } = this.state;
|
|
|
+ const { isGuestUser } = this.appContainer;
|
|
|
+
|
|
|
+ return (!isNotCreatable && !isTrashPage && !isGuestUser);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * whether to display reaction buttons
|
|
|
+ * ex.) like, bookmark
|
|
|
+ */
|
|
|
+ get isAbleToShowPageReactionButtons() {
|
|
|
+ const { isTrashPage, isPageExist } = this.state;
|
|
|
+ const { isSharedUser } = this.appContainer;
|
|
|
+
|
|
|
+ return (!isTrashPage && isPageExist && !isSharedUser);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * whether to display tag labels
|
|
|
+ */
|
|
|
+ get isAbleToShowTagLabel() {
|
|
|
+ const { isUserPage } = this.state;
|
|
|
+ const { isSharedUser } = this.appContainer;
|
|
|
+
|
|
|
+ return (!isUserPage && !isSharedUser);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * whether to display page management
|
|
|
+ * ex.) duplicate, rename
|
|
|
+ */
|
|
|
+ get isAbleToShowPageManagement() {
|
|
|
+ const { isPageExist, isTrashPage } = this.state;
|
|
|
+ const { isSharedUser } = this.appContainer;
|
|
|
+
|
|
|
+ return (isPageExist && !isTrashPage && !isSharedUser);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * whether to display pageEditorModeManager
|
|
|
+ * ex.) view, edit, hackmd
|
|
|
+ */
|
|
|
+ get isAbleToShowPageEditorModeManager() {
|
|
|
+ const { isNotCreatable, isTrashPage } = this.state;
|
|
|
+ const { isSharedUser } = this.appContainer;
|
|
|
+
|
|
|
+ return (!isNotCreatable && !isTrashPage && !isSharedUser);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * whether to display pageAuthors
|
|
|
+ * ex.) creator, lastUpdateUser
|
|
|
+ */
|
|
|
+ get isAbleToShowPageAuthors() {
|
|
|
+ const { isPageExist, isUserPage } = this.state;
|
|
|
+
|
|
|
+ return (isPageExist && !isUserPage);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * whether to like button
|
|
|
+ * not displayed on user page
|
|
|
+ */
|
|
|
+ get isAbleToShowLikeButton() {
|
|
|
+ const { isUserPage } = this.state;
|
|
|
+ const { isSharedUser } = this.appContainer;
|
|
|
+
|
|
|
+ return (!isUserPage && !isSharedUser);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * whether to Empty Trash Page
|
|
|
+ * not displayed when guest user and not on trash page
|
|
|
+ */
|
|
|
+ get isAbleToShowEmptyTrashButton() {
|
|
|
+ const { currentUser } = this.appContainer;
|
|
|
+ const { path, hasChildren } = this.state;
|
|
|
+
|
|
|
+ return (currentUser != null && currentUser.admin && path === '/trash' && hasChildren);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * whether to display trash management buttons
|
|
|
+ * ex.) undo, delete completly
|
|
|
+ * not displayed when guest user
|
|
|
+ */
|
|
|
+ get isAbleToShowTrashPageManagementButtons() {
|
|
|
+ const { currentUser } = this.appContainer;
|
|
|
+ const { isDeleted } = this.state;
|
|
|
+
|
|
|
+ return (isDeleted && currentUser != null);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* initialize state for markdown data
|
|
|
*/
|
|
|
@@ -155,19 +263,13 @@ export default class PageContainer extends Container {
|
|
|
this.checkAndUpdateImageUrlCached(users);
|
|
|
}
|
|
|
|
|
|
- async initStateOthers() {
|
|
|
-
|
|
|
- this.retrieveLikeInfo();
|
|
|
- this.retrieveBookmarkInfo();
|
|
|
- this.checkAndUpdateImageUrlCached(this.state.likerUsers);
|
|
|
- }
|
|
|
-
|
|
|
async retrieveLikeInfo() {
|
|
|
- const like = await this.appContainer.apiv3Get('/page/like-info', { _id: this.state.pageId });
|
|
|
+ const res = await this.appContainer.apiv3Get('/page/like-info', { _id: this.state.pageId });
|
|
|
+ const { sumOfLikers, isLiked } = res.data;
|
|
|
+
|
|
|
this.setState({
|
|
|
- sumOfLikers: like.data.sumOfLikers,
|
|
|
- likerUsers: like.data.users.liker,
|
|
|
- isLiked: like.data.isLiked,
|
|
|
+ sumOfLikers,
|
|
|
+ isLiked,
|
|
|
});
|
|
|
}
|
|
|
|
|
|
@@ -180,14 +282,11 @@ export default class PageContainer extends Container {
|
|
|
}
|
|
|
|
|
|
async retrieveBookmarkInfo() {
|
|
|
- const response = await this.appContainer.apiv3Get('/bookmarks', { pageId: this.state.pageId });
|
|
|
- if (response.data.bookmarks != null) {
|
|
|
- this.setState({ isBookmarked: true });
|
|
|
- }
|
|
|
- else {
|
|
|
- this.setState({ isBookmarked: false });
|
|
|
- }
|
|
|
- this.setState({ sumOfBookmarks: response.data.sumOfBookmarks });
|
|
|
+ const response = await this.appContainer.apiv3Get('/bookmarks/info', { pageId: this.state.pageId });
|
|
|
+ this.setState({
|
|
|
+ sumOfBookmarks: response.data.sumOfBookmarks,
|
|
|
+ isBookmarked: response.data.isBookmarked,
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
async toggleBookmark() {
|
|
|
@@ -216,12 +315,18 @@ export default class PageContainer extends Container {
|
|
|
return this.appContainer.getContainer('NavigationContainer');
|
|
|
}
|
|
|
|
|
|
- setLatestRemotePageData(page, user) {
|
|
|
- this.setState({
|
|
|
- remoteRevisionId: page.revision._id,
|
|
|
- revisionIdHackmdSynced: page.revisionHackmdSynced,
|
|
|
- lastUpdateUsername: user.name,
|
|
|
- });
|
|
|
+ setLatestRemotePageData(s2cMessagePageUpdated) {
|
|
|
+ const newState = {
|
|
|
+ remoteRevisionId: s2cMessagePageUpdated.revisionId,
|
|
|
+ revisionIdHackmdSynced: s2cMessagePageUpdated.revisionIdHackmdSynced,
|
|
|
+ lastUpdateUsername: s2cMessagePageUpdated.lastUpdateUsername,
|
|
|
+ };
|
|
|
+
|
|
|
+ if (s2cMessagePageUpdated.hasDraftOnHackmd != null) {
|
|
|
+ newState.hasDraftOnHackmd = s2cMessagePageUpdated.hasDraftOnHackmd;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.setState(newState);
|
|
|
}
|
|
|
|
|
|
setTocHtml(tocHtml) {
|
|
|
@@ -247,6 +352,8 @@ export default class PageContainer extends Container {
|
|
|
revisionIdHackmdSynced: page.revisionHackmdSynced,
|
|
|
hasDraftOnHackmd: page.hasDraftOnHackmd,
|
|
|
markdown: page.revision.body,
|
|
|
+ createdAt: page.createdAt,
|
|
|
+ updatedAt: page.updatedAt,
|
|
|
};
|
|
|
if (tags != null) {
|
|
|
newState.tags = tags;
|
|
|
@@ -256,7 +363,7 @@ export default class PageContainer extends Container {
|
|
|
// PageEditor component
|
|
|
const pageEditor = this.appContainer.getComponentInstance('PageEditor');
|
|
|
if (pageEditor != null) {
|
|
|
- if (editorMode !== 'builtin') {
|
|
|
+ if (editorMode !== 'edit') {
|
|
|
pageEditor.updateEditorValue(newState.markdown);
|
|
|
}
|
|
|
}
|
|
|
@@ -468,9 +575,10 @@ export default class PageContainer extends Container {
|
|
|
|
|
|
logger.debug({ obj: data }, `websocket on 'page:create'`); // eslint-disable-line quotes
|
|
|
|
|
|
- // update PageStatusAlert
|
|
|
- if (data.page.path === pageContainer.state.path) {
|
|
|
- this.setLatestRemotePageData(data.page, data.user);
|
|
|
+ // update remote page data
|
|
|
+ const { s2cMessagePageUpdated } = data;
|
|
|
+ if (s2cMessagePageUpdated.pageId === pageContainer.state.pageId) {
|
|
|
+ pageContainer.setLatestRemotePageData(s2cMessagePageUpdated);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
@@ -482,16 +590,10 @@ export default class PageContainer extends Container {
|
|
|
|
|
|
logger.debug({ obj: data }, `websocket on 'page:update'`); // eslint-disable-line quotes
|
|
|
|
|
|
- if (data.page.path === pageContainer.state.path) {
|
|
|
- // update PageStatusAlert
|
|
|
- pageContainer.setLatestRemotePageData(data.page, data.user);
|
|
|
- // update remote data
|
|
|
- const page = data.page;
|
|
|
- pageContainer.setState({
|
|
|
- remoteRevisionId: page.revision._id,
|
|
|
- revisionIdHackmdSynced: page.revisionHackmdSynced,
|
|
|
- hasDraftOnHackmd: page.hasDraftOnHackmd,
|
|
|
- });
|
|
|
+ // update remote page data
|
|
|
+ const { s2cMessagePageUpdated } = data;
|
|
|
+ if (s2cMessagePageUpdated.pageId === pageContainer.state.pageId) {
|
|
|
+ pageContainer.setLatestRemotePageData(s2cMessagePageUpdated);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
@@ -503,9 +605,10 @@ export default class PageContainer extends Container {
|
|
|
|
|
|
logger.debug({ obj: data }, `websocket on 'page:delete'`); // eslint-disable-line quotes
|
|
|
|
|
|
- // update PageStatusAlert
|
|
|
- if (data.page.path === pageContainer.state.path) {
|
|
|
- pageContainer.setLatestRemotePageData(data.page, data.user);
|
|
|
+ // update remote page data
|
|
|
+ const { s2cMessagePageUpdated } = data;
|
|
|
+ if (s2cMessagePageUpdated.pageId === pageContainer.state.pageId) {
|
|
|
+ pageContainer.setLatestRemotePageData(s2cMessagePageUpdated);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
@@ -517,7 +620,9 @@ export default class PageContainer extends Container {
|
|
|
|
|
|
logger.debug({ obj: data }, `websocket on 'page:editingWithHackmd'`); // eslint-disable-line quotes
|
|
|
|
|
|
- if (data.page.path === pageContainer.state.path) {
|
|
|
+ // update isHackmdDraftUpdatingInRealtime
|
|
|
+ const { s2cMessagePageUpdated } = data;
|
|
|
+ if (s2cMessagePageUpdated.pageId === pageContainer.state.pageId) {
|
|
|
pageContainer.setState({ isHackmdDraftUpdatingInRealtime: true });
|
|
|
}
|
|
|
});
|