import React = require("react"); import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { action, computed, observable } from "mobx"; import { observer } from "mobx-react"; import { Doc, DocListCast, DocCastAsync } from "../../../fields/Doc"; import { InkTool } from "../../../fields/InkField"; import { BoolCast, Cast, NumCast, StrCast } from "../../../fields/Types"; import { returnFalse, returnOne } from "../../../Utils"; import { documentSchema } from "../../../fields/documentSchemas"; import { DocumentManager } from "../../util/DocumentManager"; import { undoBatch } from "../../util/UndoManager"; import { CollectionDockingView, DockedFrameRenderer } from "../collections/CollectionDockingView"; import { CollectionView, CollectionViewType } from "../collections/CollectionView"; import { FieldView, FieldViewProps } from './FieldView'; import "./PresBox.scss"; import { ViewBoxBaseComponent } from "../DocComponent"; import { makeInterface, listSpec } from "../../../fields/Schema"; import { Docs } from "../../documents/Documents"; import { PrefetchProxy } from "../../../fields/Proxy"; import { ScriptField } from "../../../fields/ScriptField"; import { Scripting } from "../../util/Scripting"; import { InkingStroke } from "../InkingStroke"; import { HighlightSpanKind } from "typescript"; import { SearchUtil } from "../../util/SearchUtil"; import { CollectionFreeFormDocumentView } from "./CollectionFreeFormDocumentView"; import { child } from "serializr"; type PresBoxSchema = makeInterface<[typeof documentSchema]>; const PresBoxDocument = makeInterface(documentSchema); @observer export class PresBox extends ViewBoxBaseComponent(PresBoxDocument) { public static LayoutString(fieldKey: string) { return FieldView.LayoutString(PresBox, fieldKey); } static Instance: PresBox; @observable _isChildActive = false; @computed get childDocs() { return DocListCast(this.dataDoc[this.fieldKey]); } @computed get itemIndex() { return NumCast(this.rootDoc._itemIndex); } @computed get presElement() { return Cast(Doc.UserDoc().presElement, Doc, null); } constructor(props: any) { super(props); PresBox.Instance = this; if (!this.presElement) { // create exactly one presElmentBox template to use by any and all presentations. Doc.UserDoc().presElement = new PrefetchProxy(Docs.Create.PresElementBoxDocument({ title: "pres element template", backgroundColor: "transparent", _xMargin: 0, isTemplateDoc: true, isTemplateForField: "data" })); // this script will be called by each presElement to get rendering-specific info that the PresBox knows about but which isn't written to the PresElement // this is a design choice -- we could write this data to the presElements which would require a reaction to keep it up to date, and it would prevent // the preselement docs from being part of multiple presentations since they would all have the same field, or we'd have to keep per-presentation data // stored on each pres element. (this.presElement as Doc).lookupField = ScriptField.MakeFunction("lookupPresBoxField(container, field, data)", { field: "string", data: Doc.name, container: Doc.name }); } this.props.Document.presentationFieldKey = this.fieldKey; // provide info to the presElement script so that it can look up rendering information about the presBox } componentDidMount() { this.rootDoc.presBox = this.rootDoc; this.rootDoc._forceRenderEngine = "timeline"; this.rootDoc._replacedChrome = "replaced"; this.layoutDoc.presStatus = "edit"; document.addEventListener("keydown", this.keyEvents, false); } componentWillUnmount() { document.removeEventListener("keydown", this.keyEvents, false); } updateCurrentPresentation = () => Doc.UserDoc().activePresentation = this.rootDoc; @undoBatch @action next = () => { this.updateCurrentPresentation(); const presTargetDoc = Cast(this.childDocs[this.itemIndex].presentationTargetDoc, Doc, null); const lastFrame = Cast(presTargetDoc.lastFrame, "number", null); const curFrame = NumCast(presTargetDoc.currentFrame); if (lastFrame !== undefined && curFrame < lastFrame) { presTargetDoc._viewTransition = "all 1s"; setTimeout(() => presTargetDoc._viewTransition = undefined, 1010); presTargetDoc.currentFrame = curFrame + 1; } else if (this.childDocs[this.itemIndex + 1] !== undefined) { let nextSelected = this.itemIndex + 1; this.gotoDocument(nextSelected, this.itemIndex); for (nextSelected = nextSelected + 1; nextSelected < this.childDocs.length; nextSelected++) { if (!this.childDocs[nextSelected].groupButton) { break; } else { this.gotoDocument(nextSelected, this.itemIndex); } } } } @undoBatch @action back = () => { this.updateCurrentPresentation(); const docAtCurrent = this.childDocs[this.itemIndex]; if (docAtCurrent) { //check if any of the group members had used zooming in including the current document //If so making sure to zoom out, which goes back to state before zooming action let prevSelected = this.itemIndex; let didZoom = docAtCurrent.zoomButton; for (; !didZoom && prevSelected > 0 && this.childDocs[prevSelected].groupButton; prevSelected--) { didZoom = this.childDocs[prevSelected].zoomButton; } prevSelected = Math.max(0, prevSelected - 1); this.gotoDocument(prevSelected, this.itemIndex); } } /** * This is the method that checks for the actions that need to be performed * after the document has been presented, which involves 3 button options: * Hide Until Presented, Hide After Presented, Fade After Presented */ showAfterPresented = (index: number) => { this.updateCurrentPresentation(); this.childDocs.forEach((doc, ind) => { const presTargetDoc = doc.presentationTargetDoc as Doc; //the order of cases is aligned based on priority if (doc.presHideTillShownButton && ind <= index) { presTargetDoc.opacity = 1; } if (doc.presHideAfterButton && ind < index) { presTargetDoc.opacity = 0; } if (doc.presFadeButton && ind < index) { presTargetDoc.opacity = 0.5; } }); } /** * This is the method that checks for the actions that need to be performed * before the document has been presented, which involves 3 button options: * Hide Until Presented, Hide After Presented, Fade After Presented */ hideIfNotPresented = (index: number) => { this.updateCurrentPresentation(); this.childDocs.forEach((key, ind) => { //the order of cases is aligned based on priority const presTargetDoc = key.presentationTargetDoc as Doc; if (key.hideAfterButton && ind >= index) { presTargetDoc.opacity = 1; } if (key.fadeButton && ind >= index) { presTargetDoc.opacity = 1; } if (key.hideTillShownButton && ind > index) { presTargetDoc.opacity = 0; } }); } /** * This method makes sure that cursor navigates to the element that * has the option open and last in the group. If not in the group, and it has * the option open, navigates to that element. */ navigateToElement = async (curDoc: Doc, fromDocIndex: number) => { this.updateCurrentPresentation(); let docToJump = curDoc; let willZoom = false; const presDocs = DocListCast(this.dataDoc[this.props.fieldKey]); let nextSelected = presDocs.indexOf(curDoc); const currentDocGroups: Doc[] = []; for (; nextSelected < presDocs.length - 1; nextSelected++) { if (!presDocs[nextSelected + 1].groupButton) { break; } currentDocGroups.push(presDocs[nextSelected]); } currentDocGroups.forEach((doc: Doc, index: number) => { if (doc.presNavButton) { docToJump = doc; willZoom = false; } if (doc.presZoomButton) { docToJump = doc; willZoom = true; } }); //docToJump stayed same meaning, it was not in the group or was the last element in the group const aliasOf = await DocCastAsync(docToJump.aliasOf); const srcContext = aliasOf && await DocCastAsync(aliasOf.context); if (docToJump === curDoc) { //checking if curDoc has navigation open const target = (await DocCastAsync(curDoc.presentationTargetDoc)) || curDoc; if (curDoc.presNavButton && target) { DocumentManager.Instance.jumpToDocument(target, false, undefined, srcContext); } else if (curDoc.presZoomButton && target) { //awaiting jump so that new scale can be found, since jumping is async await DocumentManager.Instance.jumpToDocument(target, true, undefined, srcContext); } } else { //awaiting jump so that new scale can be found, since jumping is async const presTargetDoc = await DocCastAsync(docToJump.presentationTargetDoc); presTargetDoc && await DocumentManager.Instance.jumpToDocument(presTargetDoc, willZoom, undefined, srcContext); } } //The function that is called when a document is clicked or reached through next or back. //it'll also execute the necessary actions if presentation is playing. public gotoDocument = action((index: number, fromDoc: number) => { this.updateCurrentPresentation(); Doc.UnBrushAllDocs(); if (index >= 0 && index < this.childDocs.length) { this.rootDoc._itemIndex = index; const presTargetDoc = Cast(this.childDocs[this.itemIndex].presentationTargetDoc, Doc, null); if (presTargetDoc?.lastFrame !== undefined) { presTargetDoc.currentFrame = 0; } // if (this.layoutDoc.presStatus === "edit") { // this.layoutDoc.presStatus = true; // this.startPresentation(index); // } this.navigateToElement(this.childDocs[index], fromDoc); this.hideIfNotPresented(index); this.showAfterPresented(index); } }); @observable _presTimer!: NodeJS.Timeout; //The function that starts or resets presentaton functionally, depending on status flag. @action startOrResetPres = () => { this.updateCurrentPresentation(); const activeItem = Cast(this.childDocs[this.itemIndex], Doc, null); if (this._presTimer && this.layoutDoc.presStatus === "auto") { clearInterval(this._presTimer); this.layoutDoc.presStatus = "manual"; } else { this.layoutDoc.presStatus = "auto"; // this.startPresentation(0); // this.gotoDocument(0, this.itemIndex); this._presTimer = setInterval(() => { if (this.itemIndex + 1 < this.childDocs.length) this.next(); else { clearInterval(this._presTimer); this.layoutDoc.presStatus = "manual"; } }, activeItem.presDuration ? NumCast(activeItem.presDuration) : 2000); // for (let i = this.itemIndex + 1; i <= this.childDocs.length; i++) { // if (this.itemIndex + 1 === this.childDocs.length) { // clearTimeout(this._presTimer); // this.layoutDoc.presStatus = "manual"; // } else timer = setTimeout(() => { console.log(i); this.next(); }, i * 2000); // } } // if (this.layoutDoc.presStatus) { // this.resetPresentation(); // } else { // this.layoutDoc.presStatus = true; // this.startPresentation(0); // this.gotoDocument(0, this.itemIndex); // } } //The function that resets the presentation by removing every action done by it. It also //stops the presentaton. resetPresentation = () => { this.updateCurrentPresentation(); this.childDocs.forEach(doc => (doc.presentationTargetDoc as Doc).opacity = 1); this.rootDoc._itemIndex = 0; // this.layoutDoc.presStatus = false; } //The function that starts the presentation, also checking if actions should be applied //directly at start. startPresentation = (startIndex: number) => { this.updateCurrentPresentation(); this.childDocs.map(doc => { const presTargetDoc = doc.presentationTargetDoc as Doc; if (doc.presHideTillShownButton && this.childDocs.indexOf(doc) > startIndex) { presTargetDoc.opacity = 0; } if (doc.presHideAfterButton && this.childDocs.indexOf(doc) < startIndex) { presTargetDoc.opacity = 0; } if (doc.presFadeButton && this.childDocs.indexOf(doc) < startIndex) { presTargetDoc.opacity = 0.5; } }); } updateMinimize = action((e: React.ChangeEvent, mode: CollectionViewType) => { if (BoolCast(this.layoutDoc.inOverlay) !== (mode === CollectionViewType.Invalid)) { if (this.layoutDoc.inOverlay) { Doc.RemoveDocFromList((Doc.UserDoc().myOverlayDocuments as Doc), undefined, this.rootDoc); CollectionDockingView.AddRightSplit(this.rootDoc); this.layoutDoc.inOverlay = false; } else { const pt = this.props.ScreenToLocalTransform().inverse().transformPoint(0, 0); this.rootDoc.x = pt[0];// 500;//e.clientX + 25; this.rootDoc.y = pt[1];////e.clientY - 25; this.props.addDocTab?.(this.rootDoc, "close"); Doc.AddDocToList((Doc.UserDoc().myOverlayDocuments as Doc), undefined, this.rootDoc); } } }); @undoBatch viewChanged = action((e: React.ChangeEvent) => { //@ts-ignore const viewType = e.target.selectedOptions[0].value as CollectionViewType; viewType === CollectionViewType.Stacking && (this.rootDoc._pivotField = undefined); // pivot field may be set by the user in timeline view (or some other way) -- need to reset it here this.updateMinimize(e, this.rootDoc._viewType = viewType); }); @undoBatch movementChanged = action((movement: string) => { const activeItem = Cast(this.childDocs[this.itemIndex], Doc, null); if (movement === 'zoom') { activeItem.presZoomButton = !activeItem.presZoomButton; activeItem.presNavButton = false; } else if (movement === 'nav') { activeItem.presZoomButton = false; activeItem.presNavButton = !activeItem.presNavButton; } else { activeItem.presZoomButton = false; activeItem.presNavButton = false; } }); @undoBatch visibilityChanged = action((visibility: string) => { const activeItem = Cast(this.childDocs[this.itemIndex], Doc, null); if (visibility === 'fade') { activeItem.presFadeButton = !activeItem.presFadeButton; } else if (visibility === 'hideBefore') { activeItem.presHideTillShownButton = !activeItem.presHideTillShownButton; activeItem.presHideAfterButton = false; } else if (visibility === 'hideAfter') { activeItem.presHideAfterButton = !activeItem.presHideAfterButton; activeItem.presHideAfterButton = false; } else { activeItem.presHideAfterButton = false; activeItem.presHideTillShownButton = false; activeItem.presFadeButton = false; } }); whenActiveChanged = action((isActive: boolean) => this.props.whenActiveChanged(this._isChildActive = isActive)); addDocumentFilter = (doc: Doc | Doc[]) => { const docs = doc instanceof Doc ? [doc] : doc; docs.forEach(doc => { doc.aliasOf instanceof Doc && (doc.presentationTargetDoc = doc.aliasOf); !this.childDocs.includes(doc) && (doc.presZoomButton = true); }); return true; } childLayoutTemplate = () => this.rootDoc._viewType !== CollectionViewType.Stacking ? undefined : this.presElement; removeDocument = (doc: Doc) => Doc.RemoveDocFromList(this.dataDoc, this.fieldKey, doc); getTransform = () => this.props.ScreenToLocalTransform().translate(-5, -65);// listBox padding-left and pres-box-cont minHeight panelHeight = () => this.props.PanelHeight() - 20; active = (outsideReaction?: boolean) => ((Doc.GetSelectedTool() === InkTool.None && !this.layoutDoc.isBackground) && (this.layoutDoc.forceActive || this.props.isSelected(outsideReaction) || this._isChildActive || this.props.renderDepth === 0) ? true : false) // KEYS @observable _selectedArray: Doc[] = []; @computed get listOfSelected() { const list = this._selectedArray.map((doc: Doc, index: any) => { return (
{index + 1}. {doc.title}
); }); return list; } //Regular click @action selectElement = (doc: Doc) => { this._selectedArray = []; this.gotoDocument(this.childDocs.indexOf(doc), NumCast(this.itemIndex)); this._selectedArray.push(this.childDocs[this.childDocs.indexOf(doc)]); console.log(this._selectedArray); } //Command click @action multiSelect = (doc: Doc) => { this._selectedArray.push(this.childDocs[this.childDocs.indexOf(doc)]); console.log(this._selectedArray); } //Shift click @action shiftSelect = (doc: Doc) => { this._selectedArray = []; const activeItem = Cast(this.childDocs[this.itemIndex], Doc, null); if (activeItem) { for (let i = Math.min(this.itemIndex, this.childDocs.indexOf(doc)); i <= Math.max(this.itemIndex, this.childDocs.indexOf(doc)); i++) { this._selectedArray.push(this.childDocs[i]); } } console.log(this._selectedArray); } //Esc click @action keyEvents = (e: KeyboardEvent) => { e.stopPropagation; // Escape key if (e.keyCode === 27) { if (this.layoutDoc.presStatus === "edit") this._selectedArray = []; else this.layoutDoc.presStatus = "edit"; // Ctrl-A to select all } else if ((e.metaKey || e.altKey) && e.keyCode === 65) { this._selectedArray = this.childDocs; } } @observable private transitionTools: boolean = false; @observable private newDocumentTools: boolean = false; @observable private progressivizeTools: boolean = false; @observable private moreInfoTools: boolean = false; @observable private playTools: boolean = false; // For toggling transition toolbar @action toggleTransitionTools = () => { this.transitionTools = !this.transitionTools; this.newDocumentTools = false; this.progressivizeTools = false; this.moreInfoTools = false; this.playTools = false; } // For toggling the add new document dropdown @action toggleNewDocument = () => { this.newDocumentTools = !this.newDocumentTools; this.transitionTools = false; this.progressivizeTools = false; this.moreInfoTools = false; this.playTools = false; } // For toggling the tools for progressivize @action toggleProgressivize = () => { this.progressivizeTools = !this.progressivizeTools; this.transitionTools = false; this.newDocumentTools = false; this.moreInfoTools = false; this.playTools = false; } // For toggling the tools for more info @action toggleMoreInfo = () => { this.moreInfoTools = !this.moreInfoTools; this.transitionTools = false; this.newDocumentTools = false; this.progressivizeTools = false; this.playTools = false; } // For toggling the options when the user wants to select play @action togglePlay = () => { this.playTools = !this.playTools; this.transitionTools = false; this.newDocumentTools = false; this.progressivizeTools = false; this.moreInfoTools = false; } @action toggleAllDropdowns() { this.transitionTools = false; this.newDocumentTools = false; this.progressivizeTools = false; this.moreInfoTools = false; this.playTools = false; } @undoBatch @action toolbarTest = () => { const presTargetDoc = Cast(this.childDocs[this.itemIndex].presentationTargetDoc, Doc, null); console.log("title: " + presTargetDoc.title); console.log("index: " + this.itemIndex); } @undoBatch @action viewLinks = async () => { let docToJump = this.childDocs[0]; // console.log(SearchUtil.GetContextsOfDocument(presTargetDoc)); // console.log(DocListCast(presTargetDoc.context)); // console.log(DocumentManager.Instance.getAllDocumentViews(presTargetDoc)); const aliasOf = await DocCastAsync(docToJump.aliasOf); const srcContext = aliasOf && await DocCastAsync(aliasOf.context); console.log(srcContext?.title); const viewType = srcContext?._viewType; const fit = srcContext?._fitToBox; if (srcContext) { srcContext._fitToBox = true; srcContext._viewType = "freeform"; } // if (!DocumentManager.Instance.getDocumentView(curPres)) { // CollectionDockingView.AddRightSplit(curPres); // } } /** * The function that is called on click to turn fading document after presented option on/off. * It also makes sure that the option swithches from hide-after to this one, since both * can't coexist. */ @action onFadeDocumentAfterPresentedClick = (e: React.MouseEvent) => { e.stopPropagation(); const activeItem = Cast(this.childDocs[this.itemIndex], Doc, null); const targetDoc = Cast(activeItem.presentationTargetDoc, Doc, null); activeItem.presFadeButton = !activeItem.presFadeButton; if (!activeItem.presFadeButton) { if (targetDoc) { targetDoc.opacity = 1; } } else { activeItem.presHideAfterButton = false; if (this.rootDoc.presStatus !== "edit" && targetDoc) { targetDoc.opacity = 0.5; } } } @action dropdownToggle = (menu: string) => { console.log('presBox' + menu + 'Dropdown'); const dropMenu = document.getElementById('presBox' + menu + 'Dropdown'); console.log(dropMenu); console.log(dropMenu?.style.display); if (dropMenu) dropMenu.style.display === 'none' ? dropMenu.style.display = 'block' : dropMenu.style.display = 'none'; } setTransitionTime = (number: String) => { const timeInMS = Number(number) * 1000; const activeItem = Cast(this.childDocs[this.itemIndex], Doc, null); const targetDoc = Cast(activeItem.presentationTargetDoc, Doc, null); if (targetDoc) targetDoc.presTransition = timeInMS; } @computed get transitionDropdown() { const activeItem = Cast(this.childDocs[this.itemIndex], Doc, null); if (activeItem) { const targetDoc = Cast(activeItem.presentationTargetDoc, Doc, null); const transitionSpeed = targetDoc ? String(Number(targetDoc.presTransition) / 1000) : 0.5; const visibilityTime = targetDoc ? String(Number(targetDoc.presTransition) / 1000) : 0.5; const thumbLocation = String(-9.48 * Number(transitionSpeed) + 93); const movement = activeItem.presZoomButton ? 'Zoom' : activeItem.presNavbutton ? 'Navigate' : 'None'; const visibility = activeItem.presFadeButton ? 'Fade' : activeItem.presHideTillShownButton ? 'Hide till shown' : activeItem.presHideAfter ? 'Hide on exit' : 'None'; return (
e.stopPropagation()} onPointerUp={e => e.stopPropagation()} onPointerDown={e => e.stopPropagation()}>
Movement
e.stopPropagation()} // onClick={() => this.dropdownToggle('Movement')} > {movement}
e.stopPropagation()}>
e.stopPropagation()} onClick={() => this.movementChanged('none')}>None
e.stopPropagation()} onClick={() => this.movementChanged('zoom')}>Zoom
e.stopPropagation()} onClick={() => this.movementChanged('nav')}>Navigate
{transitionSpeed}s
) => { e.stopPropagation(); this.setTransitionTime(e.target.value); }} />
Slow
Medium
Fast
Visibility
e.stopPropagation()} // onClick={() => this.dropdownToggle('Movement')} > {visibility}
e.stopPropagation()}>
e.stopPropagation()} onClick={() => this.visibilityChanged('none')}>None
e.stopPropagation()} onClick={() => this.visibilityChanged('fade')}>Fade on exit
e.stopPropagation()} onClick={() => this.visibilityChanged('hideAfter')}>Hide on exit
e.stopPropagation()} onClick={() => this.visibilityChanged('hideBefore')}>Hidden til presented
{transitionSpeed}s
) => { e.stopPropagation(); this.setTransitionTime(e.target.value); }} />
Slow
Medium
Fast
{/*
Fade After
*/} {/*
console.log("hide before")}>Hide Before
*/} {/*
console.log("hide after")}>Hide After
*/}
Effects
e.stopPropagation()} // onClick={() => this.dropdownToggle('Movement')} > None
e.stopPropagation()}>
e.stopPropagation()}>None
{this._selectedArray.length} selected
{this.listOfSelected}
Apply to selected
Apply to all
); } } public inputRef = React.createRef(); createNewSlide = (title: string, type: string) => { let doc = null; if (type === "text") { doc = Docs.Create.TextDocument("", { _nativeWidth: 400, _width: 400, title: title }); const data = Cast(this.rootDoc.data, listSpec(Doc)); if (data) data.push(doc); } else { doc = Docs.Create.FreeformDocument([], { _nativeWidth: 400, _width: 400, title: title }); const data = Cast(this.rootDoc.data, listSpec(Doc)); if (data) data.push(doc); } } @computed get newDocumentDropdown() { let type = ""; let title = ""; return (
e.stopPropagation()} onPointerUp={e => e.stopPropagation()} onPointerDown={e => e.stopPropagation()}>
Slide Title:

{/*
*/} { e.stopPropagation(); title = e.target.value; }}> {/*
*/}
Choose type:
{ type = "text"; }}>Text
{ type = "freeform"; }}>Freeform
this.createNewSlide(title, type)}> Create New Slide
); } @computed get playDropdown() { return (
e.stopPropagation()} onPointerUp={e => e.stopPropagation()} onPointerDown={e => e.stopPropagation()}>
); } @computed get progressivizeDropdown() { const activeItem = Cast(this.childDocs[this.itemIndex], Doc, null); if (activeItem) { return (
e.stopPropagation()} onPointerUp={e => e.stopPropagation()} onPointerDown={e => e.stopPropagation()}>
Progressivize Child Documents
Other progressivize features:
Progressivize Text Bullet Points
Internal Navigation
); } } @action progressivize = (e: React.MouseEvent) => { e.stopPropagation(); const activeItem = Cast(this.childDocs[this.itemIndex], Doc, null); activeItem.presProgressivize = !activeItem.presProgressivize; const rootTarget = Cast(activeItem.presentationTargetDoc, Doc, null); const docs = DocListCast(rootTarget[Doc.LayoutFieldKey(rootTarget)]); if (this.rootDoc.presProgressivize) { rootTarget.currentFrame = 0; CollectionFreeFormDocumentView.setupKeyframes(docs, docs.length, true); rootTarget.lastFrame = docs.length - 1; } } @computed get moreInfoDropdown() { return (
); } @computed get toolbar() { const activeItem = Cast(this.childDocs[this.itemIndex], Doc, null); if (activeItem) { return ( <>
  Transitions
  Progressivize
); } else { return ( <>
); } } render() { this.childDocs.slice(); // needed to insure that the childDocs are loaded for looking up fields const mode = StrCast(this.rootDoc._viewType) as CollectionViewType; return
 
{ e.stopPropagation; this.togglePlay(); }} className="dropdown" icon={"angle-down"} /> {this.playDropdown}
this.layoutDoc.presStatus = "manual"}> Present
this.layoutDoc.presStatus = "edit"}>
{this.toolbar}
{this.newDocumentDropdown} {this.moreInfoDropdown} {this.transitionDropdown} {this.progressivizeDropdown}
{mode !== CollectionViewType.Invalid ? : (null) }
; } } Scripting.addGlobal(function lookupPresBoxField(container: Doc, field: string, data: Doc) { if (field === 'indexInPres') return DocListCast(container[StrCast(container.presentationFieldKey)]).indexOf(data); if (field === 'presCollapsedHeight') return container._viewType === CollectionViewType.Stacking ? 50 : 46; if (field === 'presStatus') return container.presStatus; if (field === '_itemIndex') return container._itemIndex; if (field === 'presBox') return container; return undefined; }); // console.log("render = " + this.layoutDoc.title + " " + this.layoutDoc.presStatus); // const presOrderedDocs = DocListCast(activeItem.presOrderedDocs); // if (presOrderedDocs.length != this.childDocs.length || presOrderedDocs.some((pd, i) => pd !== this.childDocs[i])) { // this.rootDoc.presOrderedDocs = new List(this.childDocs.slice()); // }