aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Utils.ts2
-rw-r--r--src/client/util/Import & Export/DirectoryImportBox.tsx6
-rw-r--r--src/client/views/collections/collectionFreeForm/CollectionFreeFormLinkView.scss2
-rw-r--r--src/client/views/collections/collectionFreeForm/CollectionFreeFormLinkView.tsx2
-rw-r--r--src/new_fields/RichTextUtils.ts121
-rw-r--r--src/server/apis/google/GooglePhotosUploadUtils.ts2
-rw-r--r--src/server/credentials/google_docs_token.json2
-rw-r--r--src/server/index.ts2
8 files changed, 101 insertions, 38 deletions
diff --git a/src/Utils.ts b/src/Utils.ts
index ec2bee9bf..60f18eac2 100644
--- a/src/Utils.ts
+++ b/src/Utils.ts
@@ -39,7 +39,7 @@ export class Utils {
}
public static fileUrl(filename: string): string {
- return this.prepend(`/file/${filename}`);
+ return this.prepend(`/files/${filename}`);
}
public static CorsProxy(url: string): string {
diff --git a/src/client/util/Import & Export/DirectoryImportBox.tsx b/src/client/util/Import & Export/DirectoryImportBox.tsx
index 87c187162..44075ecdd 100644
--- a/src/client/util/Import & Export/DirectoryImportBox.tsx
+++ b/src/client/util/Import & Export/DirectoryImportBox.tsx
@@ -156,7 +156,11 @@ export default class DirectoryImportBox extends React.Component<FieldViewProps>
if (docs.length < 50) {
importContainer = Docs.Create.MasonryDocument(docs, options);
} else {
- const headers = ["title", "size"].map(key => new SchemaHeaderField(key));
+ const headers = [
+ new SchemaHeaderField("title", "yellow"),
+ new SchemaHeaderField("size", "blue"),
+ new SchemaHeaderField("googlePhotosTags", "green")
+ ];
importContainer = Docs.Create.SchemaDocument(headers, docs, options);
}
runInAction(() => this.phase = 'External: uploading files to Google Photos...');
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormLinkView.scss b/src/client/views/collections/collectionFreeForm/CollectionFreeFormLinkView.scss
index fc5212edd..2a64a7afb 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormLinkView.scss
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormLinkView.scss
@@ -1,7 +1,7 @@
.collectionfreeformlinkview-linkLine {
stroke: black;
transform: translate(10000px,10000px);
- opacity: 0.5;
+ // opacity: 0.5;
pointer-events: all;
}
.collectionfreeformlinkview-linkCircle {
diff --git a/src/client/views/collections/collectionFreeForm/CollectionFreeFormLinkView.tsx b/src/client/views/collections/collectionFreeForm/CollectionFreeFormLinkView.tsx
index 790c6694b..f19243bd6 100644
--- a/src/client/views/collections/collectionFreeForm/CollectionFreeFormLinkView.tsx
+++ b/src/client/views/collections/collectionFreeForm/CollectionFreeFormLinkView.tsx
@@ -50,7 +50,7 @@ export class CollectionFreeFormLinkView extends React.Component<CollectionFreeFo
return (
<>
<line key="linkLine" className="collectionfreeformlinkview-linkLine"
- style={{ strokeWidth: `${2 * 1 / 2}` }}
+ style={{ strokeWidth: `${5}` }}
x1={`${x1}`} y1={`${y1}`}
x2={`${x2}`} y2={`${y2}`} />
{/* <circle key="linkCircle" className="collectionfreeformlinkview-linkCircle"
diff --git a/src/new_fields/RichTextUtils.ts b/src/new_fields/RichTextUtils.ts
index 178cce839..84744db2f 100644
--- a/src/new_fields/RichTextUtils.ts
+++ b/src/new_fields/RichTextUtils.ts
@@ -1,11 +1,11 @@
import { EditorState, Transaction, TextSelection } from "prosemirror-state";
-import { Node, Fragment, Mark } from "prosemirror-model";
+import { Node, Fragment, Mark, MarkType } from "prosemirror-model";
import { RichTextField } from "./RichTextField";
import { docs_v1 } from "googleapis";
import { GoogleApiClientUtils } from "../client/apis/google_docs/GoogleApiClientUtils";
import { FormattedTextBox } from "../client/views/nodes/FormattedTextBox";
import { Opt } from "./Doc";
-import Color from "color";
+import Color = require('color');
import { sinkListItem } from "prosemirror-schema-list";
import { Utils, PostToServer } from "../Utils";
import { RouteStore } from "../server/RouteStore";
@@ -220,13 +220,33 @@ export namespace RichTextUtils {
return text.length ? schema.text(text, styleToMarks(schema, run.textStyle)) : undefined;
};
- const MarkMapping = new Map<keyof docs_v1.Schema$TextStyle, string>([
+ const StyleToMark = new Map<keyof docs_v1.Schema$TextStyle, keyof typeof schema.marks>([
["bold", "strong"],
["italic", "em"],
["foregroundColor", "pFontColor"]
]);
- const styleToMarks = (schema: any, textStyle?: docs_v1.Schema$TextStyle) => {
+ const MarkToStyle = new Map<keyof typeof schema.marks, keyof docs_v1.Schema$TextStyle>([
+ ["strong", "bold"],
+ ["em", "italic"],
+ ["pFontColor", "foregroundColor"],
+ ["timesNewRoman", "weightedFontFamily"],
+ ["georgia", "weightedFontFamily"],
+ ["comicSans", "weightedFontFamily"],
+ ["tahoma", "weightedFontFamily"],
+ ["impact", "weightedFontFamily"]
+ ]);
+
+ const FontFamilyMapping = new Map<string, string>([
+ ["timesNewRoman", "Times New Roman"],
+ ["arial", "Arial"],
+ ["georgia", "Georgia"],
+ ["comicSans", "Comic Sans MS"],
+ ["tahoma", "Tahoma"],
+ ["impact", "Impact"]
+ ]);
+
+ const styleToMarks = (schema: any, textStyle?: docs_v1.Schema$TextStyle): Opt<Mark[]> => {
if (!textStyle) {
return undefined;
}
@@ -236,12 +256,12 @@ export namespace RichTextUtils {
let targeted = key as keyof docs_v1.Schema$TextStyle;
if (value = textStyle[targeted]) {
let attributes: any = {};
- let converted = MarkMapping.get(targeted) || targeted;
+ let converted = StyleToMark.get(targeted) || targeted;
value.url && (attributes.href = value.url);
if (value.color) {
- let object: { [key: string]: number } = value.color.rgbColor;
- attributes.color = Color.rgb(Object.values(object).map(value => value * 255)).hex();
+ let object = value.color.rgbColor;
+ attributes.color = Color.rgb(["red", "green", "blue"].map(color => object[color] * 255 || 0)).hex();
}
let mark = schema.mark(schema.marks[converted], attributes);
@@ -251,45 +271,69 @@ export namespace RichTextUtils {
return marks;
};
- const marksToStyle = async (nodes: Node<any>[]) => {
+ const ignored = ["user_mark"];
+
+ const marksToStyle = async (nodes: Node<any>[]): Promise<docs_v1.Schema$Request[]> => {
let requests: docs_v1.Schema$Request[] = [];
let position = 1;
for (let node of nodes) {
- const length = node.nodeSize;
- const marks = node.marks;
- const attrs = node.attrs;
+ const { marks, attrs, nodeSize } = node;
const textStyle: docs_v1.Schema$TextStyle = {};
const information: LinkInformation = {
startIndex: position,
- endIndex: position + length,
+ endIndex: position + nodeSize,
textStyle
};
if (marks.length) {
-
- const link = marks.find(mark => mark.type.name === "link");
- if (link) {
- textStyle.link = { url: link.attrs.href };
- textStyle.foregroundColor = fromRgb(0, 0, 1);
- textStyle.bold = true;
+ let mark: Mark<any>;
+ const markMap = BuildMarkMap(marks);
+ Object.keys(schema.marks).map(markName => {
+ if (!ignored.includes(markName) && (mark = markMap[markName])) {
+ const converted = MarkToStyle.get(markName) || markName as keyof docs_v1.Schema$TextStyle;
+ let value: any = true;
+ if (converted) {
+ const { attrs } = mark;
+ switch (converted) {
+ case "link":
+ value = { url: attrs.href };
+ textStyle.foregroundColor = fromRgb.blue;
+ textStyle.bold = true;
+ break;
+ case "fontSize":
+ value = attrs.fontSize;
+ break;
+ case "foregroundColor":
+ value = fromHex(attrs.color);
+ break;
+ case "weightedFontFamily":
+ value = { fontFamily: FontFamilyMapping.get(markName) };
+ }
+ textStyle[converted] = value;
+ }
+ }
+ });
+ if (Object.keys(textStyle).length) {
+ requests.push(EncodeStyleUpdate(information));
}
- const bold = marks.find(mark => mark.type.name === "strong");
- bold && (textStyle.bold = true);
- const foregroundColor = marks.find(mark => mark.type.name === "pFontColor");
- foregroundColor && (textStyle.foregroundColor = fromHex(foregroundColor.attrs.color));
}
- requests.push(EncodeStyleUpdate(information));
if (node.type.name === "image") {
requests.push(await EncodeImage({
- startIndex: position + length,
+ startIndex: position + nodeSize,
uri: attrs.src,
width: attrs.width
}));
}
- position += length;
+ position += nodeSize;
}
return requests;
};
+ const BuildMarkMap = (marks: Mark<any>[]) => {
+ const markMap: { [type: string]: Mark<any> } = {};
+ marks.forEach(mark => markMap[mark.type.name] = mark);
+ return markMap;
+ };
+
interface LinkInformation {
startIndex: number;
endIndex: number;
@@ -302,14 +346,29 @@ export namespace RichTextUtils {
uri: string;
}
- const fromRgb = (red: number, green: number, blue: number): docs_v1.Schema$OptionalColor => {
- return { color: { rgbColor: { red, green, blue } } };
- };
+ namespace fromRgb {
+
+ export const convert = (red: number, green: number, blue: number): docs_v1.Schema$OptionalColor => {
+ return {
+ color: {
+ rgbColor: {
+ red: red / 255,
+ green: green / 255,
+ blue: blue / 255
+ }
+ }
+ };
+ };
+
+ export const red = convert(255, 0, 0);
+ export const green = convert(0, 255, 0);
+ export const blue = convert(0, 0, 255);
+
+ }
const fromHex = (color: string): docs_v1.Schema$OptionalColor => {
- const converted = new Color().hex(color).rgb();
- const { red, blue, green } = converted;
- return fromRgb(red(), blue(), green());
+ const c = Color(color);
+ return fromRgb.convert(c.red(), c.green(), c.blue());
};
const EncodeStyleUpdate = (information: LinkInformation): docs_v1.Schema$Request => {
diff --git a/src/server/apis/google/GooglePhotosUploadUtils.ts b/src/server/apis/google/GooglePhotosUploadUtils.ts
index e1478a097..f582cebd2 100644
--- a/src/server/apis/google/GooglePhotosUploadUtils.ts
+++ b/src/server/apis/google/GooglePhotosUploadUtils.ts
@@ -80,7 +80,7 @@ export namespace GooglePhotosUploadUtils {
});
})).newMediaItemResults;
};
- const newMediaItemResults = await newMediaItems.convertInBatchesAtInterval(50, createFromUploadTokens, 1);
+ const newMediaItemResults = await newMediaItems.convertInBatchesAtInterval(50, createFromUploadTokens, 0.1);
return { newMediaItemResults };
};
diff --git a/src/server/credentials/google_docs_token.json b/src/server/credentials/google_docs_token.json
index c8fd3bbf5..330d27141 100644
--- a/src/server/credentials/google_docs_token.json
+++ b/src/server/credentials/google_docs_token.json
@@ -1 +1 @@
-{"access_token":"ya29.GlyDBwCmpO9R1fAOMIzpdZiCWhEeaDHiJOPy7sNRAo-vAIqzIk7zy1DLdOhSFWaBQrbmewSOJZPvbBUAxqdDELc_aW_BsjwXFbxiTd4Us_N8IWkPDCtUeBmLAZjodA","refresh_token":"1/HTv_xFHszu2Nf3iiFrUTaeKzC_Vp2-6bpIB06xW_WHI","scope":"https://www.googleapis.com/auth/presentations.readonly https://www.googleapis.com/auth/documents.readonly https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/documents https://www.googleapis.com/auth/photoslibrary https://www.googleapis.com/auth/photoslibrary.appendonly https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/presentations https://www.googleapis.com/auth/photoslibrary.sharing","token_type":"Bearer","expiry_date":1568484185591} \ No newline at end of file
+{"access_token":"ya29.GlyEBxgqsCRjX9SAJGGss3EtfrPgwSjeMsfsuwJqTk7o4GRrBpwU0eQXXBNgPdAPRSrJzuVgAqWxap9kKrtkpf2tuHxk7Ml9Jblj48tU0BN2X0lMh66S2EIRhLnQnw","refresh_token":"1/HTv_xFHszu2Nf3iiFrUTaeKzC_Vp2-6bpIB06xW_WHI","scope":"https://www.googleapis.com/auth/presentations.readonly https://www.googleapis.com/auth/documents.readonly https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/documents https://www.googleapis.com/auth/photoslibrary https://www.googleapis.com/auth/photoslibrary.appendonly https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/presentations https://www.googleapis.com/auth/photoslibrary.sharing","token_type":"Bearer","expiry_date":1568501067486} \ No newline at end of file
diff --git a/src/server/index.ts b/src/server/index.ts
index b18059053..2e60d9be7 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -863,7 +863,7 @@ app.post(RouteStore.googlePhotosMediaUpload, async (req, res) => {
return newMediaItems;
};
- const newMediaItems = await mediaInput.convertInBatchesAtInterval(25, dispatchUpload, 1);
+ const newMediaItems = await mediaInput.convertInBatchesAtInterval(25, dispatchUpload, 0.1);
if (failed) {
return _error(res, tokenError);