-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor: Extract PagerRenderer from renderer.
- Loading branch information
1 parent
dad5021
commit 5d6f3d9
Showing
4 changed files
with
98 additions
and
70 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
export type State = { | ||
currentPage: number; | ||
imageInputDir: string; | ||
// Each 'browse to directory' or 'select page' is a new epoch, | ||
// so can igore stale async responses. Alt could be to cancel promises but seems complicated. | ||
epoch: number; | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
import * as jquery from "jquery"; | ||
|
||
import { ImageFinder } from "../../bars/files/ImageFinder"; | ||
import { PagingModel } from "../../bars/model/PagingModel"; | ||
import { JQueryUtils } from "../../utils/JQueryUtils"; | ||
import { IOutputter } from "../../utils/outputter/IOutputter"; | ||
import { State } from "../State"; | ||
import { LoaderRenderer } from "./LoaderRenderer"; | ||
|
||
export namespace PagerRenderer { | ||
export async function renderPagerButtons( | ||
state: State, | ||
outputter: IOutputter, | ||
renderImagesAndPager: () => void | ||
) { | ||
let pageCount = 0; | ||
let imageCountThisPage = 0; | ||
|
||
clearPagerContainer(); | ||
|
||
// Always have a 1st page: | ||
renderPager(pageCount, state, outputter, renderImagesAndPager); | ||
pageCount++; | ||
|
||
const allImages = await ImageFinder.findImagesInDirectory(state.imageInputDir, outputter); | ||
allImages.forEach(() => { | ||
imageCountThisPage++; | ||
|
||
if (imageCountThisPage > PagingModel.IMAGES_PER_PAGE) { | ||
renderPager(pageCount, state, outputter, renderImagesAndPager); | ||
|
||
pageCount++; | ||
imageCountThisPage = 1; | ||
} | ||
}); | ||
} | ||
|
||
function renderPager( | ||
pageId: number, | ||
state: State, | ||
outputter: IOutputter, | ||
renderImagesAndPager: () => void | ||
) { | ||
const isCurrent = pageId === state.currentPage; | ||
const disabled = isCurrent ? " disabled" : ""; | ||
const currentClass = isCurrent ? " image-pager-button-current" : ""; | ||
|
||
const pagerHtml = `<button id='button-pager-${pageId}}'${disabled} class="image-pager-button${currentClass}">${pageId + | ||
1}</button>`; | ||
jquery(".image-pager").append(pagerHtml); | ||
|
||
addPagerClickListener(pageId, state, outputter, renderImagesAndPager); | ||
} | ||
|
||
function clearPagerContainer() { | ||
JQueryUtils.clearHtmlDivByClass("image-pager"); | ||
} | ||
|
||
export function addPagerClickListener( | ||
pageId: number, | ||
state: State, | ||
outputter: IOutputter, | ||
renderImagesAndPager: () => void | ||
) { | ||
const pageDiv = document.getElementById(`button-pager-${pageId}}`); | ||
if (!pageDiv) { | ||
outputter.error(`could not find page button div for '${pageId}'`); | ||
return; | ||
} | ||
|
||
pageDiv.addEventListener("click", () => onClickPager(pageId, state, renderImagesAndPager)); | ||
} | ||
|
||
function onClickPager(pageId: number, state: State, renderImagesAndPager: () => void) { | ||
state.epoch++; | ||
|
||
state.currentPage = pageId; | ||
|
||
LoaderRenderer.showImagesLoading(); | ||
|
||
// use setTimeout to ensure loader appears | ||
setTimeout(() => { | ||
// a new pager button may become disabled - so also need to render the pager buttons. | ||
renderImagesAndPager(); | ||
}, 250); | ||
} | ||
} |