diff options
author | bobzel <zzzman@gmail.com> | 2021-03-20 22:26:54 -0400 |
---|---|---|
committer | bobzel <zzzman@gmail.com> | 2021-03-20 22:26:54 -0400 |
commit | 31c5bb8dc9cc7d92b01de9e17c4cd4eb21b1a320 (patch) | |
tree | fa36228a46565c53b93227d0a8abb236857375e8 | |
parent | f4306392332a7895a82ea62267242ceafa228ae8 (diff) |
fixed up audio dictation to its former glory.
-rw-r--r-- | src/client/documents/Documents.ts | 8 | ||||
-rw-r--r-- | src/client/views/nodes/formattedText/FormattedTextBox.tsx | 45 |
2 files changed, 28 insertions, 25 deletions
diff --git a/src/client/documents/Documents.ts b/src/client/documents/Documents.ts index e7252c015..3ed1aa76e 100644 --- a/src/client/documents/Documents.ts +++ b/src/client/documents/Documents.ts @@ -667,7 +667,7 @@ export namespace Docs { viewProps["acl-Override"] = "None"; viewProps["acl-Public"] = Doc.UserDoc()?.defaultAclPrivate ? SharingPermissions.None : SharingPermissions.Add; const viewDoc = Doc.assign(Doc.MakeDelegate(dataDoc, delegId), viewProps, true, true); - viewProps.type !== DocumentType.LINK && viewDoc.type !== DocumentType.LABEL && DocUtils.MakeLinkToActiveAudio(viewDoc); + ![DocumentType.LINK, DocumentType.TEXTANCHOR, DocumentType.LABEL].includes(viewDoc.type as any) && DocUtils.MakeLinkToActiveAudio(viewDoc); !Doc.IsSystem(dataDoc) && ![DocumentType.HTMLANCHOR, DocumentType.KVP, DocumentType.LINK, DocumentType.LINKANCHOR, DocumentType.TEXTANCHOR].includes(proto.type as any) && !dataDoc.isFolder && !dataProps.annotationOn && Doc.AddDocToList(Cast(Doc.UserDoc().myFileOrphans, Doc, null), "data", dataDoc); @@ -1046,7 +1046,11 @@ export namespace DocUtils { export let ActiveRecordings: AudioBox[] = []; export function MakeLinkToActiveAudio(doc: Doc) { - DocUtils.ActiveRecordings.map(d => DocUtils.MakeLink({ doc: doc }, { doc: d.getAnchor() || d.props.Document }, "audio link", "audio timeline")); + let lastLink: Doc | undefined; + DocUtils.ActiveRecordings.map(audio => { + lastLink = DocUtils.MakeLink({ doc: doc }, { doc: audio.getAnchor() || audio.props.Document }, "audio link", "audio timeline"); + }); + return lastLink; } export function MakeLink(source: { doc: Doc }, target: { doc: Doc }, linkRelationship: string = "", description: string = "", id?: string, allowParCollectionLink?: boolean, showPopup?: number[]) { diff --git a/src/client/views/nodes/formattedText/FormattedTextBox.tsx b/src/client/views/nodes/formattedText/FormattedTextBox.tsx index b51b4b3c3..ada409081 100644 --- a/src/client/views/nodes/formattedText/FormattedTextBox.tsx +++ b/src/client/views/nodes/formattedText/FormattedTextBox.tsx @@ -113,7 +113,7 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<(FieldViewProp private _downEvent: any; private _downX = 0; private _downY = 0; - private _break = false; + private _break = true; public ProseRef?: HTMLDivElement; public get EditorView() { return this._editorView; } public get SidebarKey() { return this.fieldKey + "-sidebar"; } @@ -126,7 +126,9 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<(FieldViewProp @computed get sidebarHeight() { return NumCast(this.rootDoc[this.SidebarKey + "-height"]); } @computed get titleHeight() { return this.props.styleProvider?.(this.layoutDoc, this.props, StyleProp.HeaderMargin) || 0; } @computed get _recording() { return this.dataDoc?.audioState === "recording"; } - set _recording(value) { this.dataDoc.audioState = value ? "recording" : undefined; } + set _recording(value) { + !this.dataDoc.recordingSource && (this.dataDoc.audioState = value ? "recording" : undefined); + } @computed get config() { this._keymap = buildKeymap(schema, this.props); this._rules = new RichTextRules(this.props.Document, this); @@ -649,26 +651,23 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<(FieldViewProp setDictationContent = (value: string) => { if (this._editorView) { const state = this._editorView.state; - const now = Date.now(); - let mark = schema.marks.user_mark.create({ userid: Doc.CurrentUserEmail, modified: Math.floor(now / 1000) }); - if (!this._break && state.selection.to !== state.selection.from) { - for (let i = state.selection.from; i <= state.selection.to; i++) { - const pos = state.doc.resolve(i); - const um = Array.from(pos.marks()).find(m => m.type === schema.marks.user_mark); - if (um) { - mark = um; - break; - } + if (this._recordingStart) { + let from = this._editorView.state.selection.from; + if (this._break) { + const l = DocUtils.MakeLinkToActiveAudio(this.rootDoc); + if (!l) return; + const anchor = (l.anchor1 as Doc).annotationOn ? l.anchor1 as Doc : (l.anchor2 as Doc).annotationOn ? (l.anchor2 as Doc) : undefined; + if (!anchor) return; + const timeCode = NumCast(anchor._timecodeToShow /* audioStart */); + const audiotag = this._editorView.state.schema.nodes.audiotag.create({ timeCode, audioId: anchor[Id] }); + this._editorView.dispatch(this._editorView.state.tr.insert(state.selection.from, audiotag)); + from = this._editorView.state.doc.content.size; + this._editorView.dispatch(this._editorView.state.tr.setSelection(TextSelection.create(this._editorView.state.tr.doc, from))); } + this._break = false; + const tr = this._editorView.state.tr.insertText(value); + this._editorView.dispatch(tr.setSelection(TextSelection.create(tr.doc, from, tr.doc.content.size)).scrollIntoView()); } - const from = state.selection.from; - this._break = false; - if (this.props.Document.recordingStart) { - const recordingStart = DateCast(this.props.Document.recordingStart)?.date.getTime(); - value = "" + (mark.attrs.modified * 1000 - recordingStart) / 1000 + value; - } - const tr = state.tr.insertText(value).addMark(from, from + value.length + 1, mark); - this._editorView.dispatch(tr.setSelection(TextSelection.create(tr.doc, from, from + value.length + 1))); } } @@ -1045,11 +1044,11 @@ export class FormattedTextBox extends ViewBoxAnnotatableComponent<(FieldViewProp this._editorView = new EditorView(this.ProseRef, { state: rtfField?.Data ? EditorState.fromJSON(config, JSON.parse(rtfField.Data)) : EditorState.create(config), handleScrollToSelection: (editorView) => { - const docPos = editorView.coordsAtPos(editorView.state.selection.from); + const docPos = editorView.coordsAtPos(editorView.state.selection.to); const viewRect = self._ref.current!.getBoundingClientRect(); const scrollRef = self._scrollRef.current; - if ((docPos.top < viewRect.top || docPos.top > viewRect.bottom) && scrollRef) { - const scrollPos = scrollRef.scrollTop + (docPos.top - viewRect.top) * self.props.ScreenToLocalTransform().Scale; + if ((docPos.bottom < viewRect.top || docPos.bottom > viewRect.bottom) && scrollRef) { + const scrollPos = scrollRef.scrollTop + (docPos.bottom - viewRect.top) * self.props.ScreenToLocalTransform().Scale; if (this._focusSpeed !== undefined) { scrollPos && smoothScroll(this._focusSpeed, scrollRef, scrollPos); } else { |