chore: Move to Typescript (#2783)

This PR moves the entire project to Typescript. Due to the ~1000 ignores this will lead to a messy codebase for a while, but the churn is worth it – all of those ignore comments are places that were never type-safe previously.

closes #1282
This commit is contained in:
Tom Moor
2021-11-29 06:40:55 -08:00
committed by GitHub
parent 25ccfb5d04
commit 15b1069bcc
1017 changed files with 17410 additions and 54942 deletions

158
app/models/Collection.ts Normal file
View File

@@ -0,0 +1,158 @@
import { pick, trim } from "lodash";
import { action, computed, observable } from "mobx";
import BaseModel from "~/models/BaseModel";
import Document from "~/models/Document";
import { 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;
permission: "read" | "read_write" | void;
sharing: boolean;
index: string;
documents: NavigationNode[];
createdAt: string;
updatedAt: string;
deletedAt: string | null | undefined;
sort: {
field: string;
direction: "asc" | "desc";
};
url: string;
urlId: string;
@computed
get isEmpty(): boolean {
return this.documents.length === 0;
}
@computed
get documentIds(): string[] {
const results: string[] = [];
const travelNodes = (nodes: NavigationNode[]) =>
nodes.forEach((node) => {
results.push(node.id);
travelNodes(node.children);
});
travelNodes(this.documents);
return results;
}
@computed
get hasDescription(): boolean {
return !!trim(this.description, "\\").trim();
}
@action
updateDocument(document: Document) {
const travelNodes = (nodes: NavigationNode[]) =>
nodes.forEach((node) => {
if (node.id === document.id) {
node.title = document.title;
node.url = document.url;
} else {
travelNodes(node.children);
}
});
travelNodes(this.documents);
}
@action
updateIndex(index: string) {
this.index = index;
}
getDocumentChildren(documentId: string) {
let result: NavigationNode[] = [];
const travelNodes = (nodes: NavigationNode[]) => {
nodes.forEach((node) => {
if (node.id === documentId) {
result = node.children;
return;
}
return travelNodes(node.children);
});
};
if (this.documents) {
travelNodes(this.documents);
}
return result;
}
pathToDocument(documentId: string) {
let path: NavigationNode[] | undefined;
const travelNodes = (
nodes: NavigationNode[],
previousPath: NavigationNode[]
) => {
nodes.forEach((node) => {
const newPath = [...previousPath, node];
if (node.id === documentId) {
path = newPath;
return;
}
return travelNodes(node.children, newPath);
});
};
if (this.documents) {
travelNodes(this.documents, []);
}
return path || [];
}
toJS = () => {
return pick(this, [
"id",
"name",
"color",
"description",
"sharing",
"icon",
"permission",
"sort",
"index",
]);
};
export = () => {
return client.get("/collections.export", {
id: this.id,
});
};
}