2017-06-28 03:59:53 +00:00
|
|
|
// @flow
|
2020-06-20 20:59:15 +00:00
|
|
|
import { observable, action, computed, runInAction } from "mobx";
|
2019-04-23 14:31:20 +00:00
|
|
|
import {
|
|
|
|
without,
|
|
|
|
map,
|
|
|
|
find,
|
|
|
|
orderBy,
|
|
|
|
filter,
|
|
|
|
compact,
|
|
|
|
omitBy,
|
|
|
|
uniq,
|
2020-06-20 20:59:15 +00:00
|
|
|
} from "lodash";
|
|
|
|
import { client } from "utils/ApiClient";
|
|
|
|
import naturalSort from "shared/utils/naturalSort";
|
|
|
|
import invariant from "invariant";
|
2017-06-28 03:59:53 +00:00
|
|
|
|
2020-06-20 20:59:15 +00:00
|
|
|
import BaseStore from "stores/BaseStore";
|
|
|
|
import RootStore from "stores/RootStore";
|
|
|
|
import Document from "models/Document";
|
|
|
|
import Revision from "models/Revision";
|
|
|
|
import type { FetchOptions, PaginationParams, SearchResult } from "types";
|
2017-07-16 18:47:48 +00:00
|
|
|
|
2018-12-05 06:24:30 +00:00
|
|
|
export default class DocumentsStore extends BaseStore<Document> {
|
2018-08-11 06:03:47 +00:00
|
|
|
@observable recentlyViewedIds: string[] = [];
|
2019-01-10 05:57:17 +00:00
|
|
|
@observable searchCache: Map<string, SearchResult[]> = new Map();
|
2019-04-18 02:11:23 +00:00
|
|
|
@observable starredIds: Map<string, boolean> = new Map();
|
2019-07-08 02:25:45 +00:00
|
|
|
@observable backlinks: Map<string, string[]> = new Map();
|
2017-07-18 05:24:19 +00:00
|
|
|
|
2018-12-05 06:24:30 +00:00
|
|
|
constructor(rootStore: RootStore) {
|
|
|
|
super(rootStore, Document);
|
|
|
|
}
|
2017-06-28 03:59:53 +00:00
|
|
|
|
2017-11-10 22:14:30 +00:00
|
|
|
@computed
|
2019-04-06 23:20:27 +00:00
|
|
|
get all(): Document[] {
|
|
|
|
return filter(this.orderedData, d => !d.archivedAt && !d.deletedAt);
|
|
|
|
}
|
|
|
|
|
|
|
|
@computed
|
|
|
|
get recentlyViewed(): Document[] {
|
2018-11-21 04:18:24 +00:00
|
|
|
return orderBy(
|
2018-12-05 06:24:30 +00:00
|
|
|
compact(this.recentlyViewedIds.map(id => this.data.get(id))),
|
2020-06-20 20:59:15 +00:00
|
|
|
"updatedAt",
|
|
|
|
"desc"
|
2018-11-21 04:18:24 +00:00
|
|
|
);
|
2017-07-09 18:26:17 +00:00
|
|
|
}
|
|
|
|
|
2017-11-10 22:14:30 +00:00
|
|
|
@computed
|
2019-04-06 23:20:27 +00:00
|
|
|
get recentlyUpdated(): Document[] {
|
2020-06-20 20:59:15 +00:00
|
|
|
return orderBy(this.all, "updatedAt", "desc");
|
2017-07-09 18:26:17 +00:00
|
|
|
}
|
|
|
|
|
2019-08-09 06:09:09 +00:00
|
|
|
createdByUser(userId: string): Document[] {
|
2018-08-11 07:46:10 +00:00
|
|
|
return orderBy(
|
2019-04-06 23:20:27 +00:00
|
|
|
filter(this.all, d => d.createdBy.id === userId),
|
2020-06-20 20:59:15 +00:00
|
|
|
"updatedAt",
|
|
|
|
"desc"
|
2018-08-10 06:14:51 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2019-06-27 05:10:24 +00:00
|
|
|
inCollection(collectionId: string): Document[] {
|
|
|
|
return filter(this.all, document => document.collectionId === collectionId);
|
|
|
|
}
|
|
|
|
|
2018-03-01 07:28:36 +00:00
|
|
|
pinnedInCollection(collectionId: string): Document[] {
|
2018-08-11 07:46:10 +00:00
|
|
|
return filter(
|
2018-11-21 04:18:24 +00:00
|
|
|
this.recentlyUpdatedInCollection(collectionId),
|
2018-03-01 07:28:36 +00:00
|
|
|
document => document.pinned
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2019-01-08 07:42:55 +00:00
|
|
|
publishedInCollection(collectionId: string): Document[] {
|
|
|
|
return filter(
|
2019-04-06 23:20:27 +00:00
|
|
|
this.all,
|
2019-01-08 07:42:55 +00:00
|
|
|
document =>
|
|
|
|
document.collectionId === collectionId && !!document.publishedAt
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
leastRecentlyUpdatedInCollection(collectionId: string): Document[] {
|
2020-06-20 20:59:15 +00:00
|
|
|
return orderBy(this.inCollection(collectionId), "updatedAt", "asc");
|
2019-01-08 07:42:55 +00:00
|
|
|
}
|
|
|
|
|
2018-11-21 04:18:24 +00:00
|
|
|
recentlyUpdatedInCollection(collectionId: string): Document[] {
|
2020-06-20 20:59:15 +00:00
|
|
|
return orderBy(this.inCollection(collectionId), "updatedAt", "desc");
|
2017-11-20 05:32:18 +00:00
|
|
|
}
|
|
|
|
|
2019-01-08 07:14:43 +00:00
|
|
|
recentlyPublishedInCollection(collectionId: string): Document[] {
|
|
|
|
return orderBy(
|
2019-01-08 07:42:55 +00:00
|
|
|
this.publishedInCollection(collectionId),
|
2020-06-20 20:59:15 +00:00
|
|
|
"publishedAt",
|
|
|
|
"desc"
|
2019-01-08 07:14:43 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2019-01-08 07:42:55 +00:00
|
|
|
alphabeticalInCollection(collectionId: string): Document[] {
|
2020-06-20 20:59:15 +00:00
|
|
|
return naturalSort(this.inCollection(collectionId), "title");
|
2019-01-08 07:42:55 +00:00
|
|
|
}
|
|
|
|
|
2019-01-10 05:57:17 +00:00
|
|
|
searchResults(query: string): SearchResult[] {
|
|
|
|
return this.searchCache.get(query) || [];
|
|
|
|
}
|
|
|
|
|
2017-11-10 22:14:30 +00:00
|
|
|
@computed
|
2018-02-28 06:41:12 +00:00
|
|
|
get starred(): Document[] {
|
2019-04-18 02:11:23 +00:00
|
|
|
return filter(this.all, d => d.isStarred);
|
2019-04-06 23:20:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@computed
|
|
|
|
get archived(): Document[] {
|
|
|
|
return filter(
|
2020-06-20 20:59:15 +00:00
|
|
|
orderBy(this.orderedData, "archivedAt", "desc"),
|
2019-12-07 20:39:49 +00:00
|
|
|
d => d.archivedAt && !d.deletedAt
|
2019-04-06 23:20:27 +00:00
|
|
|
);
|
2017-07-09 18:26:17 +00:00
|
|
|
}
|
|
|
|
|
2019-11-19 02:51:32 +00:00
|
|
|
@computed
|
|
|
|
get deleted(): Document[] {
|
|
|
|
return filter(
|
2020-06-20 20:59:15 +00:00
|
|
|
orderBy(this.orderedData, "deletedAt", "desc"),
|
2019-11-19 02:51:32 +00:00
|
|
|
d => d.deletedAt
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2018-11-20 07:01:49 +00:00
|
|
|
@computed
|
|
|
|
get starredAlphabetical(): Document[] {
|
2020-06-20 20:59:15 +00:00
|
|
|
return naturalSort(this.starred, "title");
|
2018-11-20 07:01:49 +00:00
|
|
|
}
|
|
|
|
|
2018-02-28 06:41:12 +00:00
|
|
|
@computed
|
|
|
|
get drafts(): Document[] {
|
2018-08-11 07:46:10 +00:00
|
|
|
return filter(
|
2020-06-20 20:59:15 +00:00
|
|
|
orderBy(this.all, "updatedAt", "desc"),
|
2018-02-28 06:41:12 +00:00
|
|
|
doc => !doc.publishedAt
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2017-11-10 22:14:30 +00:00
|
|
|
@computed
|
|
|
|
get active(): ?Document {
|
2018-12-05 06:24:30 +00:00
|
|
|
return this.rootStore.ui.activeDocumentId
|
|
|
|
? this.data.get(this.rootStore.ui.activeDocumentId)
|
2017-08-29 15:37:17 +00:00
|
|
|
: undefined;
|
|
|
|
}
|
|
|
|
|
2017-11-10 22:14:30 +00:00
|
|
|
@action
|
2019-07-08 02:25:45 +00:00
|
|
|
fetchBacklinks = async (documentId: string): Promise<?(Document[])> => {
|
|
|
|
const res = await client.post(`/documents.list`, {
|
|
|
|
backlinkDocumentId: documentId,
|
|
|
|
});
|
2020-06-20 20:59:15 +00:00
|
|
|
invariant(res && res.data, "Document list not available");
|
2019-07-08 02:25:45 +00:00
|
|
|
const { data } = res;
|
2020-06-20 20:59:15 +00:00
|
|
|
runInAction("DocumentsStore#fetchBacklinks", () => {
|
2019-07-08 02:25:45 +00:00
|
|
|
data.forEach(this.add);
|
|
|
|
this.backlinks.set(documentId, data.map(doc => doc.id));
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
getBacklinedDocuments(documentId: string): Document[] {
|
|
|
|
const documentIds = this.backlinks.get(documentId) || [];
|
|
|
|
return orderBy(
|
|
|
|
compact(documentIds.map(id => this.data.get(id))),
|
2020-06-20 20:59:15 +00:00
|
|
|
"updatedAt",
|
|
|
|
"desc"
|
2019-07-08 02:25:45 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2019-12-23 01:06:39 +00:00
|
|
|
@action
|
|
|
|
fetchChildDocuments = async (documentId: string): Promise<?(Document[])> => {
|
|
|
|
const res = await client.post(`/documents.list`, {
|
|
|
|
parentDocumentId: documentId,
|
|
|
|
});
|
2020-06-20 20:59:15 +00:00
|
|
|
invariant(res && res.data, "Document list not available");
|
2019-12-23 01:06:39 +00:00
|
|
|
const { data } = res;
|
2020-06-20 20:59:15 +00:00
|
|
|
runInAction("DocumentsStore#fetchChildDocuments", () => {
|
2019-12-23 01:06:39 +00:00
|
|
|
data.forEach(this.add);
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2019-07-08 02:25:45 +00:00
|
|
|
@action
|
2018-12-05 06:24:30 +00:00
|
|
|
fetchNamedPage = async (
|
2020-06-20 20:59:15 +00:00
|
|
|
request: string = "list",
|
2017-12-04 00:50:50 +00:00
|
|
|
options: ?PaginationParams
|
2018-08-11 21:02:37 +00:00
|
|
|
): Promise<?(Document[])> => {
|
2017-07-18 04:46:32 +00:00
|
|
|
this.isFetching = true;
|
|
|
|
|
2017-06-28 03:59:53 +00:00
|
|
|
try {
|
2017-09-03 21:12:37 +00:00
|
|
|
const res = await client.post(`/documents.${request}`, options);
|
2020-06-20 20:59:15 +00:00
|
|
|
invariant(res && res.data, "Document list not available");
|
|
|
|
runInAction("DocumentsStore#fetchNamedPage", () => {
|
2019-10-06 01:42:03 +00:00
|
|
|
res.data.forEach(this.add);
|
|
|
|
this.addPolicies(res.policies);
|
2017-06-28 03:59:53 +00:00
|
|
|
this.isLoaded = true;
|
|
|
|
});
|
2019-10-06 01:42:03 +00:00
|
|
|
return res.data;
|
2017-07-18 04:46:32 +00:00
|
|
|
} finally {
|
|
|
|
this.isFetching = false;
|
2017-06-28 03:59:53 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-04-06 23:20:27 +00:00
|
|
|
@action
|
|
|
|
fetchArchived = async (options: ?PaginationParams): Promise<*> => {
|
2020-06-20 20:59:15 +00:00
|
|
|
return this.fetchNamedPage("archived", options);
|
2019-04-06 23:20:27 +00:00
|
|
|
};
|
|
|
|
|
2019-11-19 02:51:32 +00:00
|
|
|
@action
|
|
|
|
fetchDeleted = async (options: ?PaginationParams): Promise<*> => {
|
2020-06-20 20:59:15 +00:00
|
|
|
return this.fetchNamedPage("deleted", options);
|
2019-11-19 02:51:32 +00:00
|
|
|
};
|
|
|
|
|
2017-11-10 22:14:30 +00:00
|
|
|
@action
|
2018-11-21 04:18:24 +00:00
|
|
|
fetchRecentlyUpdated = async (options: ?PaginationParams): Promise<*> => {
|
2020-06-20 20:59:15 +00:00
|
|
|
return this.fetchNamedPage("list", options);
|
2017-09-03 21:12:37 +00:00
|
|
|
};
|
|
|
|
|
2019-01-08 07:42:55 +00:00
|
|
|
@action
|
|
|
|
fetchAlphabetical = async (options: ?PaginationParams): Promise<*> => {
|
2020-06-20 20:59:15 +00:00
|
|
|
return this.fetchNamedPage("list", {
|
|
|
|
sort: "title",
|
|
|
|
direction: "ASC",
|
2019-01-08 07:42:55 +00:00
|
|
|
...options,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
@action
|
|
|
|
fetchLeastRecentlyUpdated = async (
|
|
|
|
options: ?PaginationParams
|
|
|
|
): Promise<*> => {
|
2020-06-20 20:59:15 +00:00
|
|
|
return this.fetchNamedPage("list", {
|
|
|
|
sort: "updatedAt",
|
|
|
|
direction: "ASC",
|
2019-01-08 07:42:55 +00:00
|
|
|
...options,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2019-01-08 07:14:43 +00:00
|
|
|
@action
|
|
|
|
fetchRecentlyPublished = async (options: ?PaginationParams): Promise<*> => {
|
2020-06-20 20:59:15 +00:00
|
|
|
return this.fetchNamedPage("list", {
|
|
|
|
sort: "publishedAt",
|
|
|
|
direction: "DESC",
|
2019-01-08 07:14:43 +00:00
|
|
|
...options,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2017-11-10 22:14:30 +00:00
|
|
|
@action
|
2017-12-04 00:50:50 +00:00
|
|
|
fetchRecentlyViewed = async (options: ?PaginationParams): Promise<*> => {
|
2020-06-20 20:59:15 +00:00
|
|
|
const data = await this.fetchNamedPage("viewed", options);
|
2017-06-28 04:52:47 +00:00
|
|
|
|
2020-06-20 20:59:15 +00:00
|
|
|
runInAction("DocumentsStore#fetchRecentlyViewed", () => {
|
2018-08-26 22:27:32 +00:00
|
|
|
// $FlowFixMe
|
2018-08-11 21:02:37 +00:00
|
|
|
this.recentlyViewedIds.replace(
|
2020-06-20 20:59:15 +00:00
|
|
|
uniq(this.recentlyViewedIds.concat(map(data, "id")))
|
2018-08-11 07:46:10 +00:00
|
|
|
);
|
2017-06-28 04:52:47 +00:00
|
|
|
});
|
2017-09-03 21:12:37 +00:00
|
|
|
return data;
|
2017-06-28 04:20:09 +00:00
|
|
|
};
|
|
|
|
|
2017-11-10 22:14:30 +00:00
|
|
|
@action
|
2018-08-11 06:03:47 +00:00
|
|
|
fetchStarred = (options: ?PaginationParams): Promise<*> => {
|
2020-06-20 20:59:15 +00:00
|
|
|
return this.fetchNamedPage("starred", options);
|
2018-02-28 06:41:12 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
@action
|
2018-08-11 06:03:47 +00:00
|
|
|
fetchDrafts = (options: ?PaginationParams): Promise<*> => {
|
2020-06-20 20:59:15 +00:00
|
|
|
return this.fetchNamedPage("drafts", options);
|
2017-06-28 05:15:29 +00:00
|
|
|
};
|
|
|
|
|
2018-03-01 07:28:36 +00:00
|
|
|
@action
|
2018-08-11 06:03:47 +00:00
|
|
|
fetchPinned = (options: ?PaginationParams): Promise<*> => {
|
2020-06-20 20:59:15 +00:00
|
|
|
return this.fetchNamedPage("pinned", options);
|
2018-03-01 07:28:36 +00:00
|
|
|
};
|
|
|
|
|
2018-08-10 06:14:51 +00:00
|
|
|
@action
|
2018-08-11 06:03:47 +00:00
|
|
|
fetchOwned = (options: ?PaginationParams): Promise<*> => {
|
2020-06-20 20:59:15 +00:00
|
|
|
return this.fetchNamedPage("list", options);
|
2018-08-10 06:14:51 +00:00
|
|
|
};
|
|
|
|
|
2017-11-10 22:14:30 +00:00
|
|
|
@action
|
2017-12-04 00:50:50 +00:00
|
|
|
search = async (
|
|
|
|
query: string,
|
2019-01-10 05:57:17 +00:00
|
|
|
options: PaginationParams = {}
|
2018-08-05 01:32:56 +00:00
|
|
|
): Promise<SearchResult[]> => {
|
2019-04-23 14:31:20 +00:00
|
|
|
// $FlowFixMe
|
|
|
|
const compactedOptions = omitBy(options, o => !o);
|
2020-06-20 20:59:15 +00:00
|
|
|
const res = await client.get("/documents.search", {
|
2019-04-23 14:31:20 +00:00
|
|
|
...compactedOptions,
|
2017-12-04 00:50:50 +00:00
|
|
|
query,
|
|
|
|
});
|
2020-06-20 20:59:15 +00:00
|
|
|
invariant(res && res.data, "Search response should be available");
|
2019-01-10 05:57:17 +00:00
|
|
|
|
2019-12-24 01:59:15 +00:00
|
|
|
// add the documents and associated policies to the store
|
|
|
|
res.data.forEach(result => this.add(result.document));
|
|
|
|
this.addPolicies(res.policies);
|
2019-01-10 05:57:17 +00:00
|
|
|
|
|
|
|
// store a reference to the document model in the search cache instead
|
|
|
|
// of the original result from the API.
|
|
|
|
const results: SearchResult[] = compact(
|
2019-12-24 01:59:15 +00:00
|
|
|
res.data.map(result => {
|
2019-01-10 05:57:17 +00:00
|
|
|
const document = this.data.get(result.document.id);
|
|
|
|
if (!document) return null;
|
|
|
|
|
|
|
|
return {
|
|
|
|
ranking: result.ranking,
|
|
|
|
context: result.context,
|
|
|
|
document,
|
|
|
|
};
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
let existing = this.searchCache.get(query) || [];
|
|
|
|
|
|
|
|
// splice modifies any existing results, taking into account pagination
|
|
|
|
existing.splice(options.offset || 0, options.limit || 0, ...results);
|
|
|
|
|
|
|
|
this.searchCache.set(query, existing);
|
2019-12-24 02:08:40 +00:00
|
|
|
return res.data;
|
2017-09-13 06:30:18 +00:00
|
|
|
};
|
|
|
|
|
2017-11-10 22:14:30 +00:00
|
|
|
@action
|
2018-12-05 06:24:30 +00:00
|
|
|
prefetchDocument = (id: string) => {
|
|
|
|
if (!this.data.get(id)) {
|
|
|
|
return this.fetch(id, { prefetch: true });
|
2018-05-13 20:26:06 +00:00
|
|
|
}
|
2017-10-20 07:27:01 +00:00
|
|
|
};
|
|
|
|
|
2017-11-10 22:14:30 +00:00
|
|
|
@action
|
2018-12-05 06:24:30 +00:00
|
|
|
fetch = async (
|
|
|
|
id: string,
|
|
|
|
options?: FetchOptions = {}
|
|
|
|
): Promise<?Document> => {
|
2018-05-13 20:26:06 +00:00
|
|
|
if (!options.prefetch) this.isFetching = true;
|
2017-07-18 04:46:32 +00:00
|
|
|
|
2017-06-28 03:59:53 +00:00
|
|
|
try {
|
2018-12-05 06:24:30 +00:00
|
|
|
const doc: ?Document = this.data.get(id) || this.getByUrl(id);
|
2019-10-06 01:42:03 +00:00
|
|
|
const policy = doc ? this.rootStore.policies.get(doc.id) : undefined;
|
|
|
|
if (doc && policy && !options.force) {
|
|
|
|
return doc;
|
|
|
|
}
|
2018-05-17 06:52:26 +00:00
|
|
|
|
2020-06-20 20:59:15 +00:00
|
|
|
const res = await client.post("/documents.info", {
|
2018-05-13 20:26:06 +00:00
|
|
|
id,
|
|
|
|
shareId: options.shareId,
|
|
|
|
});
|
2020-06-20 20:59:15 +00:00
|
|
|
invariant(res && res.data, "Document not available");
|
2019-08-22 04:41:37 +00:00
|
|
|
|
|
|
|
this.addPolicies(res.policies);
|
2018-12-05 06:24:30 +00:00
|
|
|
this.add(res.data);
|
2017-07-09 05:12:14 +00:00
|
|
|
|
2020-06-20 20:59:15 +00:00
|
|
|
runInAction("DocumentsStore#fetch", () => {
|
2017-06-28 03:59:53 +00:00
|
|
|
this.isLoaded = true;
|
|
|
|
});
|
2017-07-09 05:12:14 +00:00
|
|
|
|
2018-12-05 06:24:30 +00:00
|
|
|
return this.data.get(res.data.id);
|
2017-07-18 04:46:32 +00:00
|
|
|
} finally {
|
|
|
|
this.isFetching = false;
|
2017-06-28 03:59:53 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2018-12-05 06:24:30 +00:00
|
|
|
@action
|
2019-04-09 04:25:13 +00:00
|
|
|
move = async (
|
|
|
|
document: Document,
|
|
|
|
collectionId: string,
|
|
|
|
parentDocumentId: ?string
|
|
|
|
) => {
|
2020-06-20 20:59:15 +00:00
|
|
|
const res = await client.post("/documents.move", {
|
2018-12-05 06:24:30 +00:00
|
|
|
id: document.id,
|
2019-04-09 04:25:13 +00:00
|
|
|
collectionId,
|
|
|
|
parentDocumentId,
|
2018-12-05 06:24:30 +00:00
|
|
|
});
|
2020-06-20 20:59:15 +00:00
|
|
|
invariant(res && res.data, "Data not available");
|
2018-12-05 06:24:30 +00:00
|
|
|
|
2019-04-09 04:25:13 +00:00
|
|
|
res.data.documents.forEach(this.add);
|
|
|
|
res.data.collections.forEach(this.rootStore.collections.add);
|
2018-12-05 06:24:30 +00:00
|
|
|
};
|
|
|
|
|
2018-06-05 13:57:26 +00:00
|
|
|
@action
|
|
|
|
duplicate = async (document: Document): * => {
|
2020-06-20 20:59:15 +00:00
|
|
|
const res = await client.post("/documents.create", {
|
2019-10-06 01:42:03 +00:00
|
|
|
publish: !!document.publishedAt,
|
2019-04-18 02:11:23 +00:00
|
|
|
parentDocumentId: document.parentDocumentId,
|
2019-07-27 17:33:38 +00:00
|
|
|
collectionId: document.collectionId,
|
2018-06-05 13:57:26 +00:00
|
|
|
title: `${document.title} (duplicate)`,
|
|
|
|
text: document.text,
|
|
|
|
});
|
2020-06-20 20:59:15 +00:00
|
|
|
invariant(res && res.data, "Data should be available");
|
2018-06-05 13:57:26 +00:00
|
|
|
|
2018-12-05 06:24:30 +00:00
|
|
|
const collection = this.getCollectionForDocument(document);
|
|
|
|
if (collection) collection.refresh();
|
2018-06-05 13:57:26 +00:00
|
|
|
|
2019-08-22 04:41:37 +00:00
|
|
|
this.addPolicies(res.policies);
|
2018-12-05 06:24:30 +00:00
|
|
|
return this.add(res.data);
|
2017-06-28 03:59:53 +00:00
|
|
|
};
|
|
|
|
|
2019-04-18 02:11:23 +00:00
|
|
|
_add = this.add;
|
|
|
|
|
|
|
|
@action
|
|
|
|
add = (item: Object) => {
|
|
|
|
const document = this._add(item);
|
|
|
|
|
|
|
|
if (item.starred !== undefined) {
|
|
|
|
this.starredIds.set(document.id, item.starred);
|
|
|
|
}
|
|
|
|
|
|
|
|
return document;
|
|
|
|
};
|
|
|
|
|
2019-06-27 05:10:24 +00:00
|
|
|
@action
|
|
|
|
removeCollectionDocuments(collectionId: string) {
|
|
|
|
const documents = this.inCollection(collectionId);
|
|
|
|
const documentIds = documents.map(doc => doc.id);
|
2019-06-27 05:18:18 +00:00
|
|
|
documentIds.forEach(id => this.remove(id));
|
2019-06-27 05:10:24 +00:00
|
|
|
}
|
|
|
|
|
2019-04-18 02:11:23 +00:00
|
|
|
@action
|
2019-08-09 06:09:09 +00:00
|
|
|
async update(params: {
|
|
|
|
id: string,
|
|
|
|
title: string,
|
|
|
|
text: string,
|
|
|
|
lastRevision: number,
|
|
|
|
}) {
|
2018-12-05 06:24:30 +00:00
|
|
|
const document = await super.update(params);
|
|
|
|
|
|
|
|
// Because the collection object contains the url and title
|
|
|
|
// we need to ensure they are updated there as well.
|
|
|
|
const collection = this.getCollectionForDocument(document);
|
|
|
|
if (collection) collection.updateDocument(document);
|
|
|
|
return document;
|
|
|
|
}
|
|
|
|
|
2019-04-18 02:11:23 +00:00
|
|
|
@action
|
2018-12-05 06:24:30 +00:00
|
|
|
async delete(document: Document) {
|
|
|
|
await super.delete(document);
|
|
|
|
|
|
|
|
runInAction(() => {
|
|
|
|
this.recentlyViewedIds = without(this.recentlyViewedIds, document.id);
|
|
|
|
});
|
|
|
|
|
|
|
|
const collection = this.getCollectionForDocument(document);
|
|
|
|
if (collection) collection.refresh();
|
|
|
|
}
|
|
|
|
|
2017-11-10 22:14:30 +00:00
|
|
|
@action
|
2019-04-06 23:20:27 +00:00
|
|
|
archive = async (document: Document) => {
|
2020-06-20 20:59:15 +00:00
|
|
|
const res = await client.post("/documents.archive", {
|
2019-04-06 23:20:27 +00:00
|
|
|
id: document.id,
|
|
|
|
});
|
2020-06-20 20:59:15 +00:00
|
|
|
runInAction("Document#archive", () => {
|
|
|
|
invariant(res && res.data, "Data should be available");
|
2019-04-06 23:20:27 +00:00
|
|
|
document.updateFromJson(res.data);
|
2019-10-06 01:42:03 +00:00
|
|
|
this.addPolicies(res.policies);
|
2019-04-06 23:20:27 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
const collection = this.getCollectionForDocument(document);
|
|
|
|
if (collection) collection.refresh();
|
|
|
|
};
|
|
|
|
|
|
|
|
@action
|
|
|
|
restore = async (document: Document, revision?: Revision) => {
|
2020-06-20 20:59:15 +00:00
|
|
|
const res = await client.post("/documents.restore", {
|
2018-12-05 06:24:30 +00:00
|
|
|
id: document.id,
|
2019-04-06 23:20:27 +00:00
|
|
|
revisionId: revision ? revision.id : undefined,
|
2018-12-05 06:24:30 +00:00
|
|
|
});
|
2020-06-20 20:59:15 +00:00
|
|
|
runInAction("Document#restore", () => {
|
|
|
|
invariant(res && res.data, "Data should be available");
|
2018-12-05 06:24:30 +00:00
|
|
|
document.updateFromJson(res.data);
|
2019-10-06 01:42:03 +00:00
|
|
|
this.addPolicies(res.policies);
|
2018-12-05 06:24:30 +00:00
|
|
|
});
|
2019-04-06 23:20:27 +00:00
|
|
|
|
|
|
|
const collection = this.getCollectionForDocument(document);
|
|
|
|
if (collection) collection.refresh();
|
2017-06-28 03:59:53 +00:00
|
|
|
};
|
|
|
|
|
2018-12-05 06:24:30 +00:00
|
|
|
pin = (document: Document) => {
|
2020-06-20 20:59:15 +00:00
|
|
|
return client.post("/documents.pin", { id: document.id });
|
2017-06-28 03:59:53 +00:00
|
|
|
};
|
|
|
|
|
2018-12-05 06:24:30 +00:00
|
|
|
unpin = (document: Document) => {
|
2020-06-20 20:59:15 +00:00
|
|
|
return client.post("/documents.unpin", { id: document.id });
|
2017-06-29 04:46:00 +00:00
|
|
|
};
|
|
|
|
|
2019-04-18 02:11:23 +00:00
|
|
|
star = async (document: Document) => {
|
|
|
|
this.starredIds.set(document.id, true);
|
|
|
|
|
|
|
|
try {
|
2020-06-20 20:59:15 +00:00
|
|
|
return client.post("/documents.star", { id: document.id });
|
2019-04-18 02:11:23 +00:00
|
|
|
} catch (err) {
|
|
|
|
this.starredIds.set(document.id, false);
|
|
|
|
}
|
2018-12-05 06:24:30 +00:00
|
|
|
};
|
2017-08-03 13:48:07 +00:00
|
|
|
|
2018-12-05 06:24:30 +00:00
|
|
|
unstar = (document: Document) => {
|
2019-04-18 02:11:23 +00:00
|
|
|
this.starredIds.set(document.id, false);
|
|
|
|
|
|
|
|
try {
|
2020-06-20 20:59:15 +00:00
|
|
|
return client.post("/documents.unstar", { id: document.id });
|
2019-04-18 02:11:23 +00:00
|
|
|
} catch (err) {
|
|
|
|
this.starredIds.set(document.id, false);
|
|
|
|
}
|
2018-12-05 06:24:30 +00:00
|
|
|
};
|
2017-07-16 18:47:48 +00:00
|
|
|
|
2020-06-20 20:59:15 +00:00
|
|
|
getByUrl = (url: string = ""): ?Document => {
|
2019-04-06 23:20:27 +00:00
|
|
|
return find(this.orderedData, doc => url.endsWith(doc.urlId));
|
2018-12-05 06:24:30 +00:00
|
|
|
};
|
2017-08-03 13:48:07 +00:00
|
|
|
|
2018-12-05 06:24:30 +00:00
|
|
|
getCollectionForDocument(document: Document) {
|
|
|
|
return this.rootStore.collections.data.get(document.collectionId);
|
2017-06-28 03:59:53 +00:00
|
|
|
}
|
|
|
|
}
|