Display document views (#849)
* Display who has viewed a document in the header * Add overflow, display of WHEN last viewed Cleanup old document attributes Add firstViewedAt, lastViewedAt to API response * Cleanup * Added: API documentation for views endpoints * Include views for deleted users
This commit is contained in:
@@ -13,7 +13,6 @@ import type { FetchOptions, PaginationParams, SearchResult } from 'types';
|
||||
|
||||
export default class DocumentsStore extends BaseStore<Document> {
|
||||
@observable recentlyViewedIds: string[] = [];
|
||||
@observable recentlyUpdatedIds: string[] = [];
|
||||
|
||||
constructor(rootStore: RootStore) {
|
||||
super(rootStore, Document);
|
||||
@@ -30,11 +29,7 @@ export default class DocumentsStore extends BaseStore<Document> {
|
||||
|
||||
@computed
|
||||
get recentlyUpdated(): * {
|
||||
return orderBy(
|
||||
compact(this.recentlyUpdatedIds.map(id => this.data.get(id))),
|
||||
'updatedAt',
|
||||
'desc'
|
||||
);
|
||||
return orderBy(Array.from(this.data.values()), 'updatedAt', 'desc');
|
||||
}
|
||||
|
||||
createdByUser(userId: string): * {
|
||||
@@ -139,15 +134,7 @@ export default class DocumentsStore extends BaseStore<Document> {
|
||||
|
||||
@action
|
||||
fetchRecentlyUpdated = async (options: ?PaginationParams): Promise<*> => {
|
||||
const data = await this.fetchNamedPage('list', options);
|
||||
|
||||
runInAction('DocumentsStore#fetchRecentlyUpdated', () => {
|
||||
// $FlowFixMe
|
||||
this.recentlyUpdatedIds.replace(
|
||||
uniq(this.recentlyUpdatedIds.concat(map(data, 'id')))
|
||||
);
|
||||
});
|
||||
return data;
|
||||
return this.fetchNamedPage('list', options);
|
||||
};
|
||||
|
||||
@action
|
||||
@@ -308,7 +295,6 @@ export default class DocumentsStore extends BaseStore<Document> {
|
||||
|
||||
runInAction(() => {
|
||||
this.recentlyViewedIds = without(this.recentlyViewedIds, document.id);
|
||||
this.recentlyUpdatedIds = without(this.recentlyUpdatedIds, document.id);
|
||||
});
|
||||
|
||||
const collection = this.getCollectionForDocument(document);
|
||||
|
||||
@@ -9,6 +9,7 @@ import RevisionsStore from './RevisionsStore';
|
||||
import SharesStore from './SharesStore';
|
||||
import UiStore from './UiStore';
|
||||
import UsersStore from './UsersStore';
|
||||
import ViewsStore from './ViewsStore';
|
||||
|
||||
export default class RootStore {
|
||||
apiKeys: ApiKeysStore;
|
||||
@@ -21,6 +22,7 @@ export default class RootStore {
|
||||
shares: SharesStore;
|
||||
ui: UiStore;
|
||||
users: UsersStore;
|
||||
views: ViewsStore;
|
||||
|
||||
constructor() {
|
||||
this.apiKeys = new ApiKeysStore(this);
|
||||
@@ -33,6 +35,7 @@ export default class RootStore {
|
||||
this.shares = new SharesStore(this);
|
||||
this.ui = new UiStore();
|
||||
this.users = new UsersStore(this);
|
||||
this.views = new ViewsStore(this);
|
||||
}
|
||||
|
||||
logout() {
|
||||
@@ -44,5 +47,6 @@ export default class RootStore {
|
||||
this.revisions.clear();
|
||||
this.shares.clear();
|
||||
this.users.clear();
|
||||
this.views.clear();
|
||||
}
|
||||
}
|
||||
|
||||
21
app/stores/ViewsStore.js
Normal file
21
app/stores/ViewsStore.js
Normal file
@@ -0,0 +1,21 @@
|
||||
// @flow
|
||||
import { filter, orderBy } from 'lodash';
|
||||
import BaseStore from './BaseStore';
|
||||
import RootStore from './RootStore';
|
||||
import View from 'models/View';
|
||||
|
||||
export default class ViewsStore extends BaseStore<View> {
|
||||
actions = ['list'];
|
||||
|
||||
constructor(rootStore: RootStore) {
|
||||
super(rootStore, View);
|
||||
}
|
||||
|
||||
inDocument(documentId: string): View[] {
|
||||
return orderBy(
|
||||
filter(this.orderedData, view => view.documentId !== documentId),
|
||||
'lastViewedAt',
|
||||
'desc'
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user