// @flow import { pick } from "lodash"; import { action, computed, observable } from "mobx"; import BaseModel from "models/BaseModel"; import Document from "models/Document"; import type { NavigationNode } from "types"; import { client } from "utils/ApiClient"; export default class Collection extends BaseModel { @observable isSaving: boolean; @observable isLoadingUsers: boolean; id: string; name: string; description: string; icon: string; color: string; private: boolean; documents: NavigationNode[]; createdAt: ?string; updatedAt: ?string; deletedAt: ?string; url: string; @computed get isPrivate(): boolean { return this.private; } @computed get isEmpty(): boolean { return this.documents.length === 0; } @computed get documentIds(): string[] { const results = []; const travelDocuments = (documentList, path) => documentList.forEach((document) => { results.push(document.id); travelDocuments(document.children); }); travelDocuments(this.documents); return results; } @action updateDocument(document: Document) { const travelDocuments = (documentList, path) => documentList.forEach((d) => { if (d.id === document.id) { d.title = document.title; d.url = document.url; } else { travelDocuments(d.children); } }); travelDocuments(this.documents); } getDocumentChildren(documentId: string): NavigationNode[] { let result = []; const traveler = (nodes) => { nodes.forEach((childNode) => { if (childNode.id === documentId) { result = childNode.children; return; } return traveler(childNode.children); }); }; if (this.documents) { traveler(this.documents); } return result; } pathToDocument(document: Document) { let path; const traveler = (nodes, previousPath) => { nodes.forEach((childNode) => { const newPath = [...previousPath, childNode]; if (childNode.id === document.id) { path = newPath; return; } return traveler(childNode.children, newPath); }); }; if (this.documents) { traveler(this.documents, []); if (path) return path; } return []; } toJS = () => { return pick(this, [ "id", "name", "color", "description", "icon", "private", ]); }; export = () => { return client.get( "/collections.export", { id: this.id }, { download: true } ); }; }