From abd81043c746886d1dac2f498146e92c9d26f24f Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 11:15:56 +0200 Subject: [PATCH 01/19] Rename rowsOnSite to itemsPerPage --- app/config/public.js | 4 ++-- app/lib/database/DatabaseService.js | 4 ++-- app/lib/database/utilities/PGQueryBuilder.js | 2 +- app/public/components/table/obsoletePager.js | 2 +- .../components/table/pagination/PaginationModel.js | 4 ++-- app/public/model/UserPreferences.js | 6 +++--- app/public/model/data/FetchedData.js | 4 ++-- app/public/model/data/FetchedDataManager.js | 6 +++--- app/public/model/navigation/Navigation.js | 4 ++-- app/public/views/runs/Runs.js | 4 ++-- .../runsPerDataPass/overview/qcTypeSelection.js | 2 +- .../userView/data/pageSettings/pageSettings.js | 10 +++++----- .../views/userView/data/pagesCellsSpecials.js | 14 +++++++------- .../userView/data/table/obsoleteItemsCounter.js | 6 +++--- test/database/utilities/PGQueryBuilder.test.js | 8 ++++---- test/public/utils/url/urlUtils.test.js | 4 ++-- 16 files changed, 42 insertions(+), 42 deletions(-) diff --git a/app/config/public.js b/app/config/public.js index 871078a50..ce8a98a7a 100644 --- a/app/config/public.js +++ b/app/config/public.js @@ -44,12 +44,12 @@ module.exports = { // Properties that will be provided to frontend in the public dataReqParams: { countRecords: 'count-records', site: 'site', - rowsOnSite: 'rows-on-site', + itemsPerPage: 'items-per-page', }, defaultDataReqParams: { site: 1, - rowsOnSite: 50, + itemsPerPage: 50, }, dataResponseFields: { diff --git a/app/lib/database/DatabaseService.js b/app/lib/database/DatabaseService.js index f9bbe1304..6bee9dea6 100644 --- a/app/lib/database/DatabaseService.js +++ b/app/lib/database/DatabaseService.js @@ -127,8 +127,8 @@ class DatabaseService { if (req.query[DRP.countRecords] === 'true') { data[DRF.totalRowsCount] = rows.length; - const offset = params[DRP.rowsOnSite] * (params[DRP.site] - 1); - const limit = params[DRP.rowsOnSite]; + const offset = params[DRP.itemsPerPage] * (params[DRP.site] - 1); + const limit = params[DRP.itemsPerPage]; rows = rows.slice(offset, offset + limit); } diff --git a/app/lib/database/utilities/PGQueryBuilder.js b/app/lib/database/utilities/PGQueryBuilder.js index 986d6d979..2c578b293 100644 --- a/app/lib/database/utilities/PGQueryBuilder.js +++ b/app/lib/database/utilities/PGQueryBuilder.js @@ -113,7 +113,7 @@ class PGQueryBuilder { static buildSelect(params) { const dataSubsetQueryPart = (params) => params[DRP.countRecords] === 'true' ? '' : - `LIMIT ${params[DRP.rowsOnSite]} OFFSET ${params[DRP.rowsOnSite] * (params[DRP.site] - 1)}`; + `LIMIT ${params[DRP.itemsPerPage]} OFFSET ${params[DRP.itemsPerPage] * (params[DRP.site] - 1)}`; const orderingPart = (params) => { if (!params['sorting']) { diff --git a/app/public/components/table/obsoletePager.js b/app/public/components/table/obsoletePager.js index 34f94815a..187ddfa1a 100644 --- a/app/public/components/table/obsoletePager.js +++ b/app/public/components/table/obsoletePager.js @@ -28,7 +28,7 @@ const { site } = RCT.dataReqParams; * @returns {obsoletePager} row with pager and table display properties controllers */ export default function obsoletePager(model, data, pagerOnly = true) { - const sitesNumber = Math.ceil(data.totalRecordsNumber / data.rowsOnSite); + const sitesNumber = Math.ceil(data.totalRecordsNumber / data.itemsPerPage); const currentSite = Number(Object.fromEntries(data.url.searchParams.entries())[site]); const columnOptionsSelectId = 'columns-option-select-id'; diff --git a/app/public/components/table/pagination/PaginationModel.js b/app/public/components/table/pagination/PaginationModel.js index 77704b29e..05747aff4 100644 --- a/app/public/components/table/pagination/PaginationModel.js +++ b/app/public/components/table/pagination/PaginationModel.js @@ -27,13 +27,13 @@ export class PaginationModel extends Observable { super(); this._userPreferences = userPreferences; - this._itemsPerPage = userPreferences.rowsOnSite; + this._itemsPerPage = userPreferences.itemsPerPage; this._currentPage = DEFAULT_CURRENT_PAGE; this._currentPageItemsCount = DEFAULT_ITEMS_COUNT; this._itemsCount = DEFAULT_ITEMS_COUNT; this._userPreferences.observe(() => { - this._itemsPerPage = this._userPreferences.rowsOnSite; + this._itemsPerPage = this._userPreferences.itemsPerPage; this.notify(); }); } diff --git a/app/public/model/UserPreferences.js b/app/public/model/UserPreferences.js index 5b35462ad..53205b204 100644 --- a/app/public/model/UserPreferences.js +++ b/app/public/model/UserPreferences.js @@ -33,17 +33,17 @@ export default class UserPreferences extends Observable { constructor(parent) { super(); this.parent = parent; - this.rowsOnSite = defaultRowsOnSite; + this.itemsPerPage = defaultRowsOnSite; this.uiTheme = RCT.themes.rct; this.sidebarPreference = sidebarPreferences.collapsible; this.detectorList = RCT.detectors.reduce((acc, detector) => ({ ...acc, [detector]: true }), {}); } setItemsPerPage(itemsPerPage) { - this.rowsOnSite = itemsPerPage; + this.itemsPerPage = itemsPerPage; this.notify(); const url = this.parent.router.getUrl(); - const newUrl = replaceUrlParams(url, { [dataReqParams.rowsOnSite]: this.rowsOnSite }); + const newUrl = replaceUrlParams(url, { [dataReqParams.itemsPerPage]: this.itemsPerPage }); this.parent.router.go(newUrl); } diff --git a/app/public/model/data/FetchedData.js b/app/public/model/data/FetchedData.js index a5ff36821..5450ebe5b 100644 --- a/app/public/model/data/FetchedData.js +++ b/app/public/model/data/FetchedData.js @@ -29,7 +29,7 @@ const DRF = RCT.dataResponseFields; export default class FetchedData { constructor(url, content, userPreferences, totalRecordsNumber = null) { this.url = url; - this.rowsOnSite = userPreferences.rowsOnSite; + this.itemsPerPage = userPreferences.itemsPerPage; this.detectorList = userPreferences.detectorList; this.sorting = { @@ -51,7 +51,7 @@ export default class FetchedData { useUrlParams(url) { const params = Object.fromEntries(url.searchParams.entries()); const DRP = RCT.dataReqParams; - this.rowsOnSite = params['rows-on-site'] ?? this.rowsOnSite; + this.itemsPerPage = params['items-per-page'] ?? this.itemsPerPage; this.site = params[DRP.site] ? params[DRP.site] : defaultSite; if (params['sorting']) { const { sorting } = params; diff --git a/app/public/model/data/FetchedDataManager.js b/app/public/model/data/FetchedDataManager.js index c0a78fb4c..10ff3c80f 100644 --- a/app/public/model/data/FetchedDataManager.js +++ b/app/public/model/data/FetchedDataManager.js @@ -54,8 +54,8 @@ export default class FetchedDataManager { async reqForData(force = false, url = null) { if (url === null) { url = this.router.getUrl(); - if (!url.searchParams.has(dataReqParams.rowsOnSite)) { - url = new URL(`${url.href}&${dataReqParams.rowsOnSite}=${this.model.parent.userPreferences.rowsOnSite}`); + if (!url.searchParams.has(dataReqParams.itemsPerPage)) { + url = new URL(`${url.href}&${dataReqParams.itemsPerPage}=${this.model.parent.userPreferences.itemsPerPage}`); } if (!url.searchParams.has(dataReqParams.site)) { url = new URL(`${url.href}&${dataReqParams.site}=1`); @@ -144,7 +144,7 @@ export default class FetchedDataManager { changeRowsOnSite() { const url = this.router.getUrl(); - const newUrl = replaceUrlParams(url, { [dataReqParams.rowsOnSite]: this.model.parent.userPreferences.rowsOnSite }); + const newUrl = replaceUrlParams(url, { [dataReqParams.itemsPerPage]: this.model.parent.userPreferences.itemsPerPage }); this.router.go(newUrl); } diff --git a/app/public/model/navigation/Navigation.js b/app/public/model/navigation/Navigation.js index 61d505ee8..4e4f1b613 100644 --- a/app/public/model/navigation/Navigation.js +++ b/app/public/model/navigation/Navigation.js @@ -97,12 +97,12 @@ export default class Navigation extends Observable { } siteReqParamsPhrase() { - return `&${dataReqParams.rowsOnSite}=${this.model.userPreferences.rowsOnSite}&${dataReqParams.site}=${this.site}`; + return `&${dataReqParams.itemsPerPage}=${this.model.userPreferences.itemsPerPage}&${dataReqParams.site}=${this.site}`; } siteReqParams() { return { - [dataReqParams.rowsOnSite]: this.model.userPreferences.rowsOnSite, + [dataReqParams.itemsPerPage]: this.model.userPreferences.itemsPerPage, [dataReqParams.site]: this.site, }; } diff --git a/app/public/views/runs/Runs.js b/app/public/views/runs/Runs.js index 56c182c92..cc3182e94 100644 --- a/app/public/views/runs/Runs.js +++ b/app/public/views/runs/Runs.js @@ -34,7 +34,7 @@ export default class Runs extends Observable { async fetchFlagsSummary(dataPass, runNumbers) { const url = this.model.router.getUrl(); - const search = `?page=${PN.flags}&data_pass_name=${dataPass}&run_numbers=${runNumbers}&${DRP.rowsOnSite}=50&${DRP.site}=1`; + const search = `?page=${PN.flags}&data_pass_name=${dataPass}&run_numbers=${runNumbers}&${DRP.itemsPerPage}=50&${DRP.site}=1`; const flagsUrl = new URL(url.origin + url.pathname + search); await this.model.dataAccess.fetchedData.reqForData(true, flagsUrl); } @@ -43,7 +43,7 @@ export default class Runs extends Observable { const page = this.model.dataAccess.fetchedData[PN.dataPasses]; const [pIndex] = Object.keys(page); const { url } = page[pIndex].payload; - const dpSearchParams = `?page=${PN.runsPerDataPass}&index=${dataPass}&${DRP.rowsOnSite}=50&${DRP.site}=1`; + const dpSearchParams = `?page=${PN.runsPerDataPass}&index=${dataPass}&${DRP.itemsPerPage}=50&${DRP.site}=1`; await this.model.dataAccess.fetchedData.reqForData(true, new URL(url.origin + url.pathname + dpSearchParams)); const runNumbers = this.model.dataAccess.fetchedData[PN.runsPerDataPass][dataPass].payload.rows.map((row) => row.run_number); diff --git a/app/public/views/runs/runsPerDataPass/overview/qcTypeSelection.js b/app/public/views/runs/runsPerDataPass/overview/qcTypeSelection.js index a8f301f59..ae9217446 100644 --- a/app/public/views/runs/runsPerDataPass/overview/qcTypeSelection.js +++ b/app/public/views/runs/runsPerDataPass/overview/qcTypeSelection.js @@ -17,7 +17,7 @@ import { RCT } from '../../../../config.js'; const { runBasedQuality } = RCT.quality; export default function qcTypeSelection(navigation, close, item, index, detectorName, runDetectorId, timeBased) { - const flagsUrl = `/?page=flags&data_pass_name=${index}&run_numbers=${item.run_number}&detector=${detectorName}&rows-on-site=50&site=1`; + const flagsUrl = `/?page=flags&data_pass_name=${index}&run_numbers=${item.run_number}&detector=${detectorName}&items-per-page=50&site=1`; const runQualitySelectId = 'run-quality-select'; function handleRunQualityChange() { diff --git a/app/public/views/userView/data/pageSettings/pageSettings.js b/app/public/views/userView/data/pageSettings/pageSettings.js index da46236db..3ab209b37 100644 --- a/app/public/views/userView/data/pageSettings/pageSettings.js +++ b/app/public/views/userView/data/pageSettings/pageSettings.js @@ -17,7 +17,7 @@ import quantityInput from '../../../../components/common/quantityInput.js'; import { RCT } from '../../../../config.js'; export default function pageSettings(userPreferences, close) { - const rowsOnSiteInputId = 'rows-per-page-input-id-modal'; + const itemsPerPageInputId = 'rows-per-page-input-id-modal'; const themeSelectId = 'theme-selection'; const sidebarPreferenceSelectId = 'sidebar-selection'; const sidebarPreferences = { @@ -27,11 +27,11 @@ export default function pageSettings(userPreferences, close) { const title = h('h3.text-primary', 'Page settings'); const onclickApply = (userPreferences) => { - const input = document.getElementById(rowsOnSiteInputId); + const input = document.getElementById(itemsPerPageInputId); const inputValue = input.value === '' ? input.placeholder : input.value; if (inputValue < 1 || inputValue > 200) { alert('incorrect number of rows on page: must be in range of [1, 200]'); - input.value = userPreferences.rowsOnSite; + input.value = userPreferences.itemsPerPage; } else { userPreferences.setItemsPerPage(inputValue); } @@ -98,8 +98,8 @@ export default function pageSettings(userPreferences, close) { h('.flex-wrap.justify-between.items-center', h('.text-dark-blue', 'Rows on site'), - quantityInput(rowsOnSiteInputId, - userPreferences.rowsOnSite)), + quantityInput(itemsPerPageInputId, + userPreferences.itemsPerPage)), h('.flex-wrap.justify-between.items-center', h('.text-dark-blue', 'UI theme'), diff --git a/app/public/views/userView/data/pagesCellsSpecials.js b/app/public/views/userView/data/pagesCellsSpecials.js index 0f95f3964..05ffd7cc9 100644 --- a/app/public/views/userView/data/pagesCellsSpecials.js +++ b/app/public/views/userView/data/pagesCellsSpecials.js @@ -34,7 +34,7 @@ const acceptableEnergyMargin = RCT.mapping.energy.acceptableMargin; * return viewButton(model, item.period, (e) => * handleClick(model, e), '', * TODO : this pattern is deprecated - * `/?page=runsPerPeriod&index=${item.period}&period=${item.period}&rowsOnSite=50&site=1`); + * `/?page=runsPerPeriod&index=${item.period}&period=${item.period}&itemsPerPage=50&site=1`); * }, * }, * // ..., @@ -54,19 +54,19 @@ pagesCellsSpecials[PN.periods] = { model.navigation, 'runs', // eslint-disable-next-line max-len - `/?page=${PN.runsPerPeriod}&index=${item.name}&${DRP.rowsOnSite}=${model.parent.userPreferences.rowsOnSite}&${DRP.site}=1&sorting=-run_number`, + `/?page=${PN.runsPerPeriod}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.site}=1&sorting=-run_number`, ), linkChip( model.navigation, 'data passes', - `/?page=${PN.dataPasses}&index=${item.name}&${DRP.rowsOnSite}=${model.parent.userPreferences.rowsOnSite}&${DRP.site}=1`, + `/?page=${PN.dataPasses}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.site}=1`, ), linkChip( model.navigation, 'MC', - `/?page=${PN.mc}&index=${item.name}&${DRP.rowsOnSite}=${model.parent.userPreferences.rowsOnSite}&${DRP.site}=1`, + `/?page=${PN.mc}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.site}=1`, )), ], @@ -86,14 +86,14 @@ pagesCellsSpecials[PN.dataPasses] = { onclick: async () => { await runs.fetchRunsPerDataPass(item.name); // eslint-disable-next-line max-len - model.router.go(`/?page=${PN.runsPerDataPass}&index=${item.name}&${DRP.rowsOnSite}=${model.parent.userPreferences.rowsOnSite}&${DRP.site}=1&sorting=-run_number`); + model.router.go(`/?page=${PN.runsPerDataPass}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.site}=1&sorting=-run_number`); }, }, 'runs'), linkChip( model.navigation, 'anchorage', // eslint-disable-next-line max-len - `/?page=${PN.anchoragePerDatapass}&index=${item.name}&${DRP.rowsOnSite}=${model.parent.userPreferences.rowsOnSite}&${DRP.site}=1&sorting=-name`, + `/?page=${PN.anchoragePerDatapass}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.site}=1&sorting=-name`, )), ], size: (model, runs, item) => getReadableFileSizeString(Number(item.size)), @@ -106,7 +106,7 @@ pagesCellsSpecials[PN.mc] = { model.navigation, 'anchored', // eslint-disable-next-line max-len - `/?page=${PN.anchoredPerMC}&index=${item.name}&${DRP.rowsOnSite}=${model.parent.userPreferences.rowsOnSite}&${DRP.site}=1&sorting=-name`, + `/?page=${PN.anchoredPerMC}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.site}=1&sorting=-name`, )), ], }; diff --git a/app/public/views/userView/data/table/obsoleteItemsCounter.js b/app/public/views/userView/data/table/obsoleteItemsCounter.js index 6da6609a6..80614b464 100644 --- a/app/public/views/userView/data/table/obsoleteItemsCounter.js +++ b/app/public/views/userView/data/table/obsoleteItemsCounter.js @@ -25,10 +25,10 @@ const siteParamName = RCT.dataReqParams.site; export default function obsoleteItemsCounter(data) { const currentSite = Number(Object.fromEntries(data.url.searchParams.entries())[siteParamName]); - const firstRowIdx = (currentSite - 1) * data.rowsOnSite + 1; - const lastRowIdx = currentSite * data.rowsOnSite > data.totalRecordsNumber + const firstRowIdx = (currentSite - 1) * data.itemsPerPage + 1; + const lastRowIdx = currentSite * data.itemsPerPage > data.totalRecordsNumber ? data.totalRecordsNumber - : currentSite * data.rowsOnSite; + : currentSite * data.itemsPerPage; return `${firstRowIdx}-${lastRowIdx} of ${data.totalRecordsNumber}`; } diff --git a/test/database/utilities/PGQueryBuilder.test.js b/test/database/utilities/PGQueryBuilder.test.js index 04fc1a5a4..a34ec114f 100644 --- a/test/database/utilities/PGQueryBuilder.test.js +++ b/test/database/utilities/PGQueryBuilder.test.js @@ -41,7 +41,7 @@ module.exports = () => { const filteringParams = { page: 'periods', - 'rows-on-site': '50', + 'items-per-page': '50', site: '1', sorting: '-name', 'name-match': ['%c%,%a', '%C%C'], @@ -59,7 +59,7 @@ module.exports = () => { const filteringParams = { page: 'periods', - 'rows-on-site': '2', + 'items-per-page': '2', site: '2', sorting: '-name', 'name-match': '%c%', @@ -79,7 +79,7 @@ module.exports = () => { const filteringParams = { page: 'periods', - 'rows-on-site': '2', + 'items-per-page': '2', site: '2', sorting: '-name', 'name-match': '%c%', @@ -100,7 +100,7 @@ module.exports = () => { const filteringParams = { page: 'periods', - 'rows-on-site': '2', + 'items-per-page': '2', site: '2', sorting: '-name', 'year-between': [',,2022,'], diff --git a/test/public/utils/url/urlUtils.test.js b/test/public/utils/url/urlUtils.test.js index 468ba4e68..35050e9a3 100644 --- a/test/public/utils/url/urlUtils.test.js +++ b/test/public/utils/url/urlUtils.test.js @@ -17,8 +17,8 @@ const assert = require('assert'); const { replaceUrlParams } = req('../../../../app/public/utils/url/urlUtils'); module.exports = () => { - const url = new URL('http://localhost:8081/?page=periods&index=_0&rows-on-site=50&site=1'); - const targetUrl = new URL('http://localhost:8081/?page=periods&index=_0&rows-on-site=50&site=2'); + const url = new URL('http://localhost:8081/?page=periods&index=_0&items-per-page=50&site=1'); + const targetUrl = new URL('http://localhost:8081/?page=periods&index=_0&items-per-page=50&site=2'); describe('Replace URL params', () => { it('should return correct value', () => { assert(replaceUrlParams(url, { site: 2 }).href === targetUrl.href); From ae9c14e29f13368a87c58fb03733d0cf9ee0649f Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 11:57:35 +0200 Subject: [PATCH 02/19] Rename site related variables to use the page keyword --- app/public/components/table/obsoletePager.js | 38 ++++++++++--------- .../data/table/obsoleteItemsCounter.js | 8 ++-- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/app/public/components/table/obsoletePager.js b/app/public/components/table/obsoletePager.js index 187ddfa1a..8111ba24b 100644 --- a/app/public/components/table/obsoletePager.js +++ b/app/public/components/table/obsoletePager.js @@ -28,11 +28,11 @@ const { site } = RCT.dataReqParams; * @returns {obsoletePager} row with pager and table display properties controllers */ export default function obsoletePager(model, data, pagerOnly = true) { - const sitesNumber = Math.ceil(data.totalRecordsNumber / data.itemsPerPage); - const currentSite = Number(Object.fromEntries(data.url.searchParams.entries())[site]); + const pagesCount = Math.ceil(data.totalRecordsNumber / data.itemsPerPage); + const currentPageNumber = Number(Object.fromEntries(data.url.searchParams.entries())[site]); const columnOptionsSelectId = 'columns-option-select-id'; - const pageButton = (targetSite) => h(`button.btn${targetSite === currentSite ? '.btn-primary' : '.btn-secondary'}.no-text-decoration`, { + const pageButton = (targetSite) => h(`button.btn${targetSite === currentPageNumber ? '.btn-primary' : '.btn-secondary'}.no-text-decoration`, { onclick: () => model.fetchedData.changePage(targetSite), }, targetSite); @@ -40,8 +40,10 @@ export default function obsoletePager(model, data, pagerOnly = true) { onclick: () => model.fetchedData.changePage(targetSite), }, content); - const moreSitesLeft = currentSite > 2; - const moreSitesRight = currentSite < sitesNumber - 1; + const morePagesLeft = currentPageNumber > 2; + const morePagesRight = currentPageNumber < pagesCount - 1; + const isFirstPage = currentPageNumber === 1; + const isLastPage = currentPageNumber === pagesCount; function handleOptionChange() { const columnsOptionsSelect = document.getElementById(columnOptionsSelectId); @@ -96,42 +98,42 @@ export default function obsoletePager(model, data, pagerOnly = true) { h('.flex.m-right-0-3-rem', // Move to the first site - currentSite > 1 ? siteChangingController(1, h('.double-left-15-primary')) : ' ', + !isFirstPage ? siteChangingController(1, h('.double-left-15-primary')) : ' ', // Move one site back - currentSite > 1 ? siteChangingController(currentSite - 1, h('.back-15-primary')) : ' ', + !isFirstPage ? siteChangingController(currentPageNumber - 1, h('.back-15-primary')) : ' ', // Move to the middle of sites range [first, current] - moreSitesLeft + morePagesLeft ? siteChangingController( - Math.floor(currentSite / 2), + Math.floor(currentPageNumber / 2), h('.more-15-primary'), ) : '', - currentSite > 1 ? pageButton(currentSite - 1) : '', - pageButton(currentSite), - currentSite < sitesNumber ? pageButton(currentSite + 1) : '', + !isFirstPage ? pageButton(currentPageNumber - 1) : '', + pageButton(currentPageNumber), + !isLastPage ? pageButton(currentPageNumber + 1) : '', // Move to the middle of sites range [current, last] - moreSitesRight + morePagesRight ? siteChangingController( - currentSite + Math.floor((sitesNumber - currentSite) / 2), + currentPageNumber + Math.floor((pagesCount - currentPageNumber) / 2), h('.more-15-primary'), ) : '', // Move one site forward - currentSite < sitesNumber + !isLastPage ? siteChangingController( - currentSite + 1, + currentPageNumber + 1, h('.forward-15-primary'), ) : '', // Move to the last site - currentSite < sitesNumber + !isLastPage ? siteChangingController( - sitesNumber, + pagesCount, h('.double-right-15-primary'), ) : ''), diff --git a/app/public/views/userView/data/table/obsoleteItemsCounter.js b/app/public/views/userView/data/table/obsoleteItemsCounter.js index 80614b464..7e3ae932e 100644 --- a/app/public/views/userView/data/table/obsoleteItemsCounter.js +++ b/app/public/views/userView/data/table/obsoleteItemsCounter.js @@ -23,12 +23,12 @@ const siteParamName = RCT.dataReqParams.site; * @returns {string} range of items diplayed on the given page and the total number of fetched records */ export default function obsoleteItemsCounter(data) { - const currentSite = Number(Object.fromEntries(data.url.searchParams.entries())[siteParamName]); + const currentPageNumber = Number(Object.fromEntries(data.url.searchParams.entries())[siteParamName]); - const firstRowIdx = (currentSite - 1) * data.itemsPerPage + 1; - const lastRowIdx = currentSite * data.itemsPerPage > data.totalRecordsNumber + const firstRowIdx = (currentPageNumber - 1) * data.itemsPerPage + 1; + const lastRowIdx = currentPageNumber * data.itemsPerPage > data.totalRecordsNumber ? data.totalRecordsNumber - : currentSite * data.itemsPerPage; + : currentPageNumber * data.itemsPerPage; return `${firstRowIdx}-${lastRowIdx} of ${data.totalRecordsNumber}`; } From db24f3e7e51ba7879edce516c1542647c16e610b Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 12:03:28 +0200 Subject: [PATCH 03/19] Apply eslint rules --- app/public/components/table/obsoletePager.js | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/public/components/table/obsoletePager.js b/app/public/components/table/obsoletePager.js index 8111ba24b..eaa2f45e7 100644 --- a/app/public/components/table/obsoletePager.js +++ b/app/public/components/table/obsoletePager.js @@ -31,8 +31,16 @@ export default function obsoletePager(model, data, pagerOnly = true) { const pagesCount = Math.ceil(data.totalRecordsNumber / data.itemsPerPage); const currentPageNumber = Number(Object.fromEntries(data.url.searchParams.entries())[site]); const columnOptionsSelectId = 'columns-option-select-id'; + const morePagesLeft = currentPageNumber > 2; + const morePagesRight = currentPageNumber < pagesCount - 1; + const isFirstPage = currentPageNumber === 1; + const isLastPage = currentPageNumber === pagesCount; + + const pageButtonDisplayStyle = (targetSite) => targetSite === currentPageNumber + ? '.btn-primary' + : '.btn-secondary'; - const pageButton = (targetSite) => h(`button.btn${targetSite === currentPageNumber ? '.btn-primary' : '.btn-secondary'}.no-text-decoration`, { + const pageButton = (targetSite) => h(`button.btn${pageButtonDisplayStyle(targetSite)}.no-text-decoration`, { onclick: () => model.fetchedData.changePage(targetSite), }, targetSite); @@ -40,11 +48,6 @@ export default function obsoletePager(model, data, pagerOnly = true) { onclick: () => model.fetchedData.changePage(targetSite), }, content); - const morePagesLeft = currentPageNumber > 2; - const morePagesRight = currentPageNumber < pagesCount - 1; - const isFirstPage = currentPageNumber === 1; - const isLastPage = currentPageNumber === pagesCount; - function handleOptionChange() { const columnsOptionsSelect = document.getElementById(columnOptionsSelectId); const selectedValue = columnsOptionsSelect.options[columnsOptionsSelect.selectedIndex].value; From ad6515e9bfdf431370454691d305b073f1c48c08 Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 12:04:51 +0200 Subject: [PATCH 04/19] Rename pageChangingController --- app/public/components/table/obsoletePager.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/public/components/table/obsoletePager.js b/app/public/components/table/obsoletePager.js index eaa2f45e7..08ff8ea67 100644 --- a/app/public/components/table/obsoletePager.js +++ b/app/public/components/table/obsoletePager.js @@ -44,7 +44,7 @@ export default function obsoletePager(model, data, pagerOnly = true) { onclick: () => model.fetchedData.changePage(targetSite), }, targetSite); - const siteChangingController = (targetSite, content) => h('button.btn.btn-secondary.site-changing-controller', { + const pageChangingController = (targetSite, content) => h('button.btn.btn-secondary.site-changing-controller', { onclick: () => model.fetchedData.changePage(targetSite), }, content); @@ -101,13 +101,13 @@ export default function obsoletePager(model, data, pagerOnly = true) { h('.flex.m-right-0-3-rem', // Move to the first site - !isFirstPage ? siteChangingController(1, h('.double-left-15-primary')) : ' ', + !isFirstPage ? pageChangingController(1, h('.double-left-15-primary')) : ' ', // Move one site back - !isFirstPage ? siteChangingController(currentPageNumber - 1, h('.back-15-primary')) : ' ', + !isFirstPage ? pageChangingController(currentPageNumber - 1, h('.back-15-primary')) : ' ', // Move to the middle of sites range [first, current] morePagesLeft - ? siteChangingController( + ? pageChangingController( Math.floor(currentPageNumber / 2), h('.more-15-primary'), ) @@ -119,7 +119,7 @@ export default function obsoletePager(model, data, pagerOnly = true) { // Move to the middle of sites range [current, last] morePagesRight - ? siteChangingController( + ? pageChangingController( currentPageNumber + Math.floor((pagesCount - currentPageNumber) / 2), h('.more-15-primary'), ) @@ -127,7 +127,7 @@ export default function obsoletePager(model, data, pagerOnly = true) { // Move one site forward !isLastPage - ? siteChangingController( + ? pageChangingController( currentPageNumber + 1, h('.forward-15-primary'), ) @@ -135,7 +135,7 @@ export default function obsoletePager(model, data, pagerOnly = true) { // Move to the last site !isLastPage - ? siteChangingController( + ? pageChangingController( pagesCount, h('.double-right-15-primary'), ) From 63fc0bf7fd1546eed5c3da2ac7d2c92055796bbf Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 12:05:28 +0200 Subject: [PATCH 05/19] Rename targetPage --- app/public/components/table/obsoletePager.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/public/components/table/obsoletePager.js b/app/public/components/table/obsoletePager.js index 08ff8ea67..600599652 100644 --- a/app/public/components/table/obsoletePager.js +++ b/app/public/components/table/obsoletePager.js @@ -36,16 +36,16 @@ export default function obsoletePager(model, data, pagerOnly = true) { const isFirstPage = currentPageNumber === 1; const isLastPage = currentPageNumber === pagesCount; - const pageButtonDisplayStyle = (targetSite) => targetSite === currentPageNumber + const pageButtonDisplayStyle = (targetPage) => targetPage === currentPageNumber ? '.btn-primary' : '.btn-secondary'; - const pageButton = (targetSite) => h(`button.btn${pageButtonDisplayStyle(targetSite)}.no-text-decoration`, { - onclick: () => model.fetchedData.changePage(targetSite), - }, targetSite); + const pageButton = (targetPage) => h(`button.btn${pageButtonDisplayStyle(targetPage)}.no-text-decoration`, { + onclick: () => model.fetchedData.changePage(targetPage), + }, targetPage); - const pageChangingController = (targetSite, content) => h('button.btn.btn-secondary.site-changing-controller', { - onclick: () => model.fetchedData.changePage(targetSite), + const pageChangingController = (targetPage, content) => h('button.btn.btn-secondary.site-changing-controller', { + onclick: () => model.fetchedData.changePage(targetPage), }, content); function handleOptionChange() { From 8b19483c78f18e2057c459745c838235d5df89e5 Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 12:06:53 +0200 Subject: [PATCH 06/19] Rename default page number --- app/public/model/data/FetchedData.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/public/model/data/FetchedData.js b/app/public/model/data/FetchedData.js index 5450ebe5b..3238e6b0e 100644 --- a/app/public/model/data/FetchedData.js +++ b/app/public/model/data/FetchedData.js @@ -12,7 +12,7 @@ * or submit itself to any jurisdiction. */ -const defaultSite = 1; +const defaultPageNumber = 1; import { RCT } from '../../../config.js'; import { shouldDisplayDetectorField } from '../../utils/dataProcessing/dataProcessingUtils.js'; @@ -52,7 +52,7 @@ export default class FetchedData { const params = Object.fromEntries(url.searchParams.entries()); const DRP = RCT.dataReqParams; this.itemsPerPage = params['items-per-page'] ?? this.itemsPerPage; - this.site = params[DRP.site] ? params[DRP.site] : defaultSite; + this.site = params[DRP.site] ? params[DRP.site] : defaultPageNumber; if (params['sorting']) { const { sorting } = params; if (sorting.startsWith('-')) { From 6840ea949d91e3fe3040590d3b42fbbaa79fdcf9 Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 12:07:35 +0200 Subject: [PATCH 07/19] Rename default items per page --- app/public/model/UserPreferences.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/public/model/UserPreferences.js b/app/public/model/UserPreferences.js index 53205b204..3dd8ea165 100644 --- a/app/public/model/UserPreferences.js +++ b/app/public/model/UserPreferences.js @@ -17,7 +17,7 @@ import { replaceUrlParams } from '../utils/url/urlUtils.js'; import { RCT } from '../config.js'; const { dataReqParams } = RCT; -const defaultRowsOnSite = 50; +const defaultItemsPerPage = 50; export const sidebarPreferences = { visible: 'visible', @@ -33,7 +33,7 @@ export default class UserPreferences extends Observable { constructor(parent) { super(); this.parent = parent; - this.itemsPerPage = defaultRowsOnSite; + this.itemsPerPage = defaultItemsPerPage; this.uiTheme = RCT.themes.rct; this.sidebarPreference = sidebarPreferences.collapsible; this.detectorList = RCT.detectors.reduce((acc, detector) => ({ ...acc, [detector]: true }), {}); From 4481f4bd43d57a478358e695ece2659c1a72f8e6 Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 13:35:47 +0200 Subject: [PATCH 08/19] Rename page changing controller --- app/public/components/table/obsoletePager.js | 2 +- app/public/components/table/pageSelector.js | 2 +- app/public/styles/rct/custom/components/pager.css | 2 +- app/public/views/userView/data/table/obsoleteItemsCounter.js | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/public/components/table/obsoletePager.js b/app/public/components/table/obsoletePager.js index 600599652..b70724d3e 100644 --- a/app/public/components/table/obsoletePager.js +++ b/app/public/components/table/obsoletePager.js @@ -44,7 +44,7 @@ export default function obsoletePager(model, data, pagerOnly = true) { onclick: () => model.fetchedData.changePage(targetPage), }, targetPage); - const pageChangingController = (targetPage, content) => h('button.btn.btn-secondary.site-changing-controller', { + const pageChangingController = (targetPage, content) => h('button.btn.btn-secondary.page-changing-controller', { onclick: () => model.fetchedData.changePage(targetPage), }, content); diff --git a/app/public/components/table/pageSelector.js b/app/public/components/table/pageSelector.js index 061a03788..1ef8cd86c 100644 --- a/app/public/components/table/pageSelector.js +++ b/app/public/components/table/pageSelector.js @@ -23,7 +23,7 @@ export default function pageSelector(currentPage, pagesCount, onPageChange) { onclick: () => onPageChange(targetPage), }, targetPage); - const pageIconButton = (targetPage, content) => h('button.btn.btn-secondary.site-changing-controller', { + const pageIconButton = (targetPage, content) => h('button.btn.btn-secondary.page-changing-controller', { onclick: () => onPageChange(targetPage), }, content); diff --git a/app/public/styles/rct/custom/components/pager.css b/app/public/styles/rct/custom/components/pager.css index e29cc11fc..1e7cc7705 100644 --- a/app/public/styles/rct/custom/components/pager.css +++ b/app/public/styles/rct/custom/components/pager.css @@ -36,7 +36,7 @@ border: none !important; } -.rct .site-changing-controller { +.rct .page-changing-controller { padding: 5px; margin: 3px; cursor: pointer; diff --git a/app/public/views/userView/data/table/obsoleteItemsCounter.js b/app/public/views/userView/data/table/obsoleteItemsCounter.js index 7e3ae932e..23d4647e9 100644 --- a/app/public/views/userView/data/table/obsoleteItemsCounter.js +++ b/app/public/views/userView/data/table/obsoleteItemsCounter.js @@ -14,7 +14,7 @@ import { RCT } from '../../../../config.js'; -const siteParamName = RCT.dataReqParams.site; +const pageNumber = RCT.dataReqParams.site; /** * Please use the new items counter instead that uses the paginationModel @@ -23,7 +23,7 @@ const siteParamName = RCT.dataReqParams.site; * @returns {string} range of items diplayed on the given page and the total number of fetched records */ export default function obsoleteItemsCounter(data) { - const currentPageNumber = Number(Object.fromEntries(data.url.searchParams.entries())[siteParamName]); + const currentPageNumber = Number(Object.fromEntries(data.url.searchParams.entries())[pageNumber]); const firstRowIdx = (currentPageNumber - 1) * data.itemsPerPage + 1; const lastRowIdx = currentPageNumber * data.itemsPerPage > data.totalRecordsNumber From 505acdf7d9da55764c9ab6416d0a6c401822b9ed Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 13:41:08 +0200 Subject: [PATCH 09/19] Rename items per page --- app/public/model/data/FetchedDataManager.js | 6 ------ app/public/views/userView/data/pageSettings/pageSettings.js | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/app/public/model/data/FetchedDataManager.js b/app/public/model/data/FetchedDataManager.js index 10ff3c80f..4614d5f14 100644 --- a/app/public/model/data/FetchedDataManager.js +++ b/app/public/model/data/FetchedDataManager.js @@ -142,12 +142,6 @@ export default class FetchedDataManager { this.router.go(newUrl); } - changeRowsOnSite() { - const url = this.router.getUrl(); - const newUrl = replaceUrlParams(url, { [dataReqParams.itemsPerPage]: this.model.parent.userPreferences.itemsPerPage }); - this.router.go(newUrl); - } - changeItemStatus(item) { item.marked = arguments[1] !== undefined ? arguments[1] diff --git a/app/public/views/userView/data/pageSettings/pageSettings.js b/app/public/views/userView/data/pageSettings/pageSettings.js index 3ab209b37..71254e3da 100644 --- a/app/public/views/userView/data/pageSettings/pageSettings.js +++ b/app/public/views/userView/data/pageSettings/pageSettings.js @@ -97,7 +97,7 @@ export default function pageSettings(userPreferences, close) { h('.p-left-1rem', title)), h('.flex-wrap.justify-between.items-center', - h('.text-dark-blue', 'Rows on site'), + h('.text-dark-blue', 'Items per page'), quantityInput(itemsPerPageInputId, userPreferences.itemsPerPage)), From c32fecbf8766a0a37eb9f6d696a6bd6d2cf96476 Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 14:27:35 +0200 Subject: [PATCH 10/19] Rename site to pageNumber --- app/config/public.js | 4 ++-- app/lib/database/DatabaseService.js | 2 +- app/lib/database/utilities/PGQueryBuilder.js | 2 +- app/public/components/table/obsoletePager.js | 16 +++++++-------- app/public/model/UserPreferences.js | 2 +- app/public/model/data/FetchedData.js | 2 +- app/public/model/data/FetchedDataManager.js | 20 +++++++++---------- app/public/model/navigation/Navigation.js | 20 +++++++++---------- app/public/views/runs/Runs.js | 4 ++-- .../overview/qcTypeSelection.js | 2 +- .../views/userView/data/pagesCellsSpecials.js | 14 ++++++------- .../data/table/obsoleteItemsCounter.js | 2 +- .../database/utilities/PGQueryBuilder.test.js | 8 ++++---- test/public/utils/url/urlUtils.test.js | 6 +++--- 14 files changed, 52 insertions(+), 52 deletions(-) diff --git a/app/config/public.js b/app/config/public.js index ce8a98a7a..3aa00d24f 100644 --- a/app/config/public.js +++ b/app/config/public.js @@ -43,12 +43,12 @@ module.exports = { // Properties that will be provided to frontend in the public dataReqParams: { countRecords: 'count-records', - site: 'site', + pageNumber: 'page-number', itemsPerPage: 'items-per-page', }, defaultDataReqParams: { - site: 1, + pageNumber: 1, itemsPerPage: 50, }, diff --git a/app/lib/database/DatabaseService.js b/app/lib/database/DatabaseService.js index 6bee9dea6..66063ec4e 100644 --- a/app/lib/database/DatabaseService.js +++ b/app/lib/database/DatabaseService.js @@ -127,7 +127,7 @@ class DatabaseService { if (req.query[DRP.countRecords] === 'true') { data[DRF.totalRowsCount] = rows.length; - const offset = params[DRP.itemsPerPage] * (params[DRP.site] - 1); + const offset = params[DRP.itemsPerPage] * (params[DRP.pageNumber] - 1); const limit = params[DRP.itemsPerPage]; rows = rows.slice(offset, offset + limit); } diff --git a/app/lib/database/utilities/PGQueryBuilder.js b/app/lib/database/utilities/PGQueryBuilder.js index 2c578b293..a6f0ee0d0 100644 --- a/app/lib/database/utilities/PGQueryBuilder.js +++ b/app/lib/database/utilities/PGQueryBuilder.js @@ -113,7 +113,7 @@ class PGQueryBuilder { static buildSelect(params) { const dataSubsetQueryPart = (params) => params[DRP.countRecords] === 'true' ? '' : - `LIMIT ${params[DRP.itemsPerPage]} OFFSET ${params[DRP.itemsPerPage] * (params[DRP.site] - 1)}`; + `LIMIT ${params[DRP.itemsPerPage]} OFFSET ${params[DRP.itemsPerPage] * (params[DRP.pageNumber] - 1)}`; const orderingPart = (params) => { if (!params['sorting']) { diff --git a/app/public/components/table/obsoletePager.js b/app/public/components/table/obsoletePager.js index b70724d3e..0d0b16ad2 100644 --- a/app/public/components/table/obsoletePager.js +++ b/app/public/components/table/obsoletePager.js @@ -16,7 +16,7 @@ import { h, iconChevronBottom } from '/js/src/index.js'; import obsoleteItemsCounter from '../../views/userView/data/table/obsoleteItemsCounter.js'; import { RCT } from '../../config.js'; -const { site } = RCT.dataReqParams; +const { pageNumber } = RCT.dataReqParams; /** * Uses obsolete model. @@ -29,7 +29,7 @@ const { site } = RCT.dataReqParams; */ export default function obsoletePager(model, data, pagerOnly = true) { const pagesCount = Math.ceil(data.totalRecordsNumber / data.itemsPerPage); - const currentPageNumber = Number(Object.fromEntries(data.url.searchParams.entries())[site]); + const currentPageNumber = Number(Object.fromEntries(data.url.searchParams.entries())[pageNumber]); const columnOptionsSelectId = 'columns-option-select-id'; const morePagesLeft = currentPageNumber > 2; const morePagesRight = currentPageNumber < pagesCount - 1; @@ -100,12 +100,12 @@ export default function obsoletePager(model, data, pagerOnly = true) { ], h('.flex.m-right-0-3-rem', - // Move to the first site + // Move to the first page !isFirstPage ? pageChangingController(1, h('.double-left-15-primary')) : ' ', - // Move one site back + // Move one page back !isFirstPage ? pageChangingController(currentPageNumber - 1, h('.back-15-primary')) : ' ', - // Move to the middle of sites range [first, current] + // Move to the middle of pages range [first, current] morePagesLeft ? pageChangingController( Math.floor(currentPageNumber / 2), @@ -117,7 +117,7 @@ export default function obsoletePager(model, data, pagerOnly = true) { pageButton(currentPageNumber), !isLastPage ? pageButton(currentPageNumber + 1) : '', - // Move to the middle of sites range [current, last] + // Move to the middle of pages range [current, last] morePagesRight ? pageChangingController( currentPageNumber + Math.floor((pagesCount - currentPageNumber) / 2), @@ -125,7 +125,7 @@ export default function obsoletePager(model, data, pagerOnly = true) { ) : '', - // Move one site forward + // Move one page forward !isLastPage ? pageChangingController( currentPageNumber + 1, @@ -133,7 +133,7 @@ export default function obsoletePager(model, data, pagerOnly = true) { ) : '', - // Move to the last site + // Move to the last page !isLastPage ? pageChangingController( pagesCount, diff --git a/app/public/model/UserPreferences.js b/app/public/model/UserPreferences.js index 3dd8ea165..aa7d9bfaa 100644 --- a/app/public/model/UserPreferences.js +++ b/app/public/model/UserPreferences.js @@ -26,7 +26,7 @@ export const sidebarPreferences = { /** * Observable responsible for handling and providing user preferences: - * number of rows on site, UI theme, sidebar preferenes, detector list and predefined filters + * number of items per page, UI theme, sidebar preferenes, detector list and predefined filters */ export default class UserPreferences extends Observable { diff --git a/app/public/model/data/FetchedData.js b/app/public/model/data/FetchedData.js index 3238e6b0e..659a01ec9 100644 --- a/app/public/model/data/FetchedData.js +++ b/app/public/model/data/FetchedData.js @@ -52,7 +52,7 @@ export default class FetchedData { const params = Object.fromEntries(url.searchParams.entries()); const DRP = RCT.dataReqParams; this.itemsPerPage = params['items-per-page'] ?? this.itemsPerPage; - this.site = params[DRP.site] ? params[DRP.site] : defaultPageNumber; + this.pageNumber = params[DRP.pageNumber] ? params[DRP.pageNumber] : defaultPageNumber; if (params['sorting']) { const { sorting } = params; if (sorting.startsWith('-')) { diff --git a/app/public/model/data/FetchedDataManager.js b/app/public/model/data/FetchedDataManager.js index 4614d5f14..68ce8d96b 100644 --- a/app/public/model/data/FetchedDataManager.js +++ b/app/public/model/data/FetchedDataManager.js @@ -48,7 +48,7 @@ export default class FetchedDataManager { * when first after creating object request is performed, * to url is added additional param 'count-records', * which inform backend to calculate the total number of rows in target view - * this information is used to create site navigation + * this information is used to create page navigation */ async reqForData(force = false, url = null) { @@ -57,8 +57,8 @@ export default class FetchedDataManager { if (!url.searchParams.has(dataReqParams.itemsPerPage)) { url = new URL(`${url.href}&${dataReqParams.itemsPerPage}=${this.model.parent.userPreferences.itemsPerPage}`); } - if (!url.searchParams.has(dataReqParams.site)) { - url = new URL(`${url.href}&${dataReqParams.site}=1`); + if (!url.searchParams.has(dataReqParams.pageNumber)) { + url = new URL(`${url.href}&${dataReqParams.pageNumber}=1`); } } const { page, index } = this.model.getDataPointerFromUrl(url); @@ -66,7 +66,7 @@ export default class FetchedDataManager { if (!data || force) { await this.req(true, url); } else if (data.payload.url.href !== url.href) { - if (this.diffOnlyBySiteAndSorting(url, data.payload.url)) { + if (this.diffOnlyByPageNumberAndSorting(url, data.payload.url)) { await this.req(false, url); } else { await this.req(true, url); @@ -74,13 +74,13 @@ export default class FetchedDataManager { } } - diffOnlyBySiteAndSorting(url1, url2) { + diffOnlyByPageNumberAndSorting(url1, url2) { const p1 = Object.fromEntries(new URLSearchParams(url1.search)); const p2 = Object.fromEntries(new URLSearchParams(url2.search)); - p1['site'] = undefined; - p1['sorting'] = undefined; - p2['site'] = undefined; - p2['sorting'] = undefined; + p1[dataReqParams.pageNumber] = undefined; + p1[dataReqParams.sorting] = undefined; + p2[dataReqParams.pageNumber] = undefined; + p2[dataReqParams.sorting] = undefined; return JSON.stringify(p1) == JSON.stringify(p2); } @@ -131,7 +131,7 @@ export default class FetchedDataManager { changePage(pageNumber) { const url = this.router.getUrl(); - const newUrl = replaceUrlParams(url, { [dataReqParams.site]: pageNumber }); + const newUrl = replaceUrlParams(url, { [dataReqParams.pageNumber]: pageNumber }); this.router.go(newUrl); } diff --git a/app/public/model/navigation/Navigation.js b/app/public/model/navigation/Navigation.js index 4e4f1b613..f816d0f5c 100644 --- a/app/public/model/navigation/Navigation.js +++ b/app/public/model/navigation/Navigation.js @@ -37,7 +37,7 @@ export default class Navigation extends Observable { this.router.observe(this.routerCallback); this.router.bubbleTo(this); - this.site = defaultDataReqParams.site; + this.pageNumber = defaultDataReqParams.pageNumber; this.handleLocationChange(); } @@ -48,7 +48,7 @@ export default class Navigation extends Observable { switch (url.pathname) { case '/': { if (! page) { - this.router.go(`/?page=${pageNames.periods}${this.siteReqParamsPhrase()}&sorting=-name`); + this.router.go(`/?page=${pageNames.periods}${this.pageNumberReqParamsPhrase()}&sorting=-name`); } else { await this.pageNavigation(url, page); this.parent.fetchedData.reqForData() @@ -70,7 +70,7 @@ export default class Navigation extends Observable { await this.model.runs.fetchRunsPerDataPass(dataPassName).then(() => {}).catch(() => {}); const dpSearchParams = `?page=${pageNames.runsPerDataPass}&index=${dataPassName}`; - const dpUrl = new URL(url.origin + url.pathname + dpSearchParams + this.siteReqParamsPhrase()); + const dpUrl = new URL(url.origin + url.pathname + dpSearchParams + this.pageNumberReqParamsPhrase()); this.parent.fetchedData.reqForData(true, dpUrl).then(() => { const runNumbers = this.model.runs.getRunsPerDataPass(dataPassName).map((row) => row.run_number); this.model.runs.fetchFlagsSummary(dataPassName, runNumbers).then(() => { @@ -91,19 +91,19 @@ export default class Navigation extends Observable { goToDefaultPageUrl(page) { const url = page === pageNames.flags - ? `/?page=${page}&run_numbers=${noRunNumbers}${this.siteReqParamsPhrase()}` - : `/?page=${page}${this.siteReqParamsPhrase()}`; + ? `/?page=${page}&run_numbers=${noRunNumbers}${this.pageNumberReqParamsPhrase()}` + : `/?page=${page}${this.pageNumberReqParamsPhrase()}`; this.router.go(url); } - siteReqParamsPhrase() { - return `&${dataReqParams.itemsPerPage}=${this.model.userPreferences.itemsPerPage}&${dataReqParams.site}=${this.site}`; + pageNumberReqParamsPhrase() { + return `&${dataReqParams.itemsPerPage}=${this.model.userPreferences.itemsPerPage}&${dataReqParams.pageNumber}=${this.pageNumber}`; } - siteReqParams() { + pageNumberReqParams() { return { [dataReqParams.itemsPerPage]: this.model.userPreferences.itemsPerPage, - [dataReqParams.site]: this.site, + [dataReqParams.pageNumber]: this.pageNumber, }; } @@ -119,6 +119,6 @@ export default class Navigation extends Observable { * @returns {void} */ go(targetPage, targetIndex) { - this.router.go(`/?page=${targetPage}&index=${targetIndex}${this.siteReqParamsPhrase()}`); + this.router.go(`/?page=${targetPage}&index=${targetIndex}${this.pageNumberReqParamsPhrase()}`); } } diff --git a/app/public/views/runs/Runs.js b/app/public/views/runs/Runs.js index cc3182e94..dc96f82f6 100644 --- a/app/public/views/runs/Runs.js +++ b/app/public/views/runs/Runs.js @@ -34,7 +34,7 @@ export default class Runs extends Observable { async fetchFlagsSummary(dataPass, runNumbers) { const url = this.model.router.getUrl(); - const search = `?page=${PN.flags}&data_pass_name=${dataPass}&run_numbers=${runNumbers}&${DRP.itemsPerPage}=50&${DRP.site}=1`; + const search = `?page=${PN.flags}&data_pass_name=${dataPass}&run_numbers=${runNumbers}&${DRP.itemsPerPage}=50&${DRP.pageNumber}=1`; const flagsUrl = new URL(url.origin + url.pathname + search); await this.model.dataAccess.fetchedData.reqForData(true, flagsUrl); } @@ -43,7 +43,7 @@ export default class Runs extends Observable { const page = this.model.dataAccess.fetchedData[PN.dataPasses]; const [pIndex] = Object.keys(page); const { url } = page[pIndex].payload; - const dpSearchParams = `?page=${PN.runsPerDataPass}&index=${dataPass}&${DRP.itemsPerPage}=50&${DRP.site}=1`; + const dpSearchParams = `?page=${PN.runsPerDataPass}&index=${dataPass}&${DRP.itemsPerPage}=50&${DRP.pageNumber}=1`; await this.model.dataAccess.fetchedData.reqForData(true, new URL(url.origin + url.pathname + dpSearchParams)); const runNumbers = this.model.dataAccess.fetchedData[PN.runsPerDataPass][dataPass].payload.rows.map((row) => row.run_number); diff --git a/app/public/views/runs/runsPerDataPass/overview/qcTypeSelection.js b/app/public/views/runs/runsPerDataPass/overview/qcTypeSelection.js index ae9217446..206d2f02f 100644 --- a/app/public/views/runs/runsPerDataPass/overview/qcTypeSelection.js +++ b/app/public/views/runs/runsPerDataPass/overview/qcTypeSelection.js @@ -17,7 +17,7 @@ import { RCT } from '../../../../config.js'; const { runBasedQuality } = RCT.quality; export default function qcTypeSelection(navigation, close, item, index, detectorName, runDetectorId, timeBased) { - const flagsUrl = `/?page=flags&data_pass_name=${index}&run_numbers=${item.run_number}&detector=${detectorName}&items-per-page=50&site=1`; + const flagsUrl = `/?page=flags&data_pass_name=${index}&run_numbers=${item.run_number}&detector=${detectorName}&items-per-page=50&page-number=1`; const runQualitySelectId = 'run-quality-select'; function handleRunQualityChange() { diff --git a/app/public/views/userView/data/pagesCellsSpecials.js b/app/public/views/userView/data/pagesCellsSpecials.js index 05ffd7cc9..6e79e85e0 100644 --- a/app/public/views/userView/data/pagesCellsSpecials.js +++ b/app/public/views/userView/data/pagesCellsSpecials.js @@ -34,7 +34,7 @@ const acceptableEnergyMargin = RCT.mapping.energy.acceptableMargin; * return viewButton(model, item.period, (e) => * handleClick(model, e), '', * TODO : this pattern is deprecated - * `/?page=runsPerPeriod&index=${item.period}&period=${item.period}&itemsPerPage=50&site=1`); + * `/?page=runsPerPeriod&index=${item.period}&period=${item.period}&itemsPerPage=50&page-number=1`); * }, * }, * // ..., @@ -54,19 +54,19 @@ pagesCellsSpecials[PN.periods] = { model.navigation, 'runs', // eslint-disable-next-line max-len - `/?page=${PN.runsPerPeriod}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.site}=1&sorting=-run_number`, + `/?page=${PN.runsPerPeriod}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.pageNumber}=1&sorting=-run_number`, ), linkChip( model.navigation, 'data passes', - `/?page=${PN.dataPasses}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.site}=1`, + `/?page=${PN.dataPasses}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.pageNumber}=1`, ), linkChip( model.navigation, 'MC', - `/?page=${PN.mc}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.site}=1`, + `/?page=${PN.mc}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.pageNumber}=1`, )), ], @@ -86,14 +86,14 @@ pagesCellsSpecials[PN.dataPasses] = { onclick: async () => { await runs.fetchRunsPerDataPass(item.name); // eslint-disable-next-line max-len - model.router.go(`/?page=${PN.runsPerDataPass}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.site}=1&sorting=-run_number`); + model.router.go(`/?page=${PN.runsPerDataPass}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.pageNumber}=1&sorting=-run_number`); }, }, 'runs'), linkChip( model.navigation, 'anchorage', // eslint-disable-next-line max-len - `/?page=${PN.anchoragePerDatapass}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.site}=1&sorting=-name`, + `/?page=${PN.anchoragePerDatapass}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.pageNumber}=1&sorting=-name`, )), ], size: (model, runs, item) => getReadableFileSizeString(Number(item.size)), @@ -106,7 +106,7 @@ pagesCellsSpecials[PN.mc] = { model.navigation, 'anchored', // eslint-disable-next-line max-len - `/?page=${PN.anchoredPerMC}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.site}=1&sorting=-name`, + `/?page=${PN.anchoredPerMC}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.pageNumber}=1&sorting=-name`, )), ], }; diff --git a/app/public/views/userView/data/table/obsoleteItemsCounter.js b/app/public/views/userView/data/table/obsoleteItemsCounter.js index 23d4647e9..78ecaf57b 100644 --- a/app/public/views/userView/data/table/obsoleteItemsCounter.js +++ b/app/public/views/userView/data/table/obsoleteItemsCounter.js @@ -14,7 +14,7 @@ import { RCT } from '../../../../config.js'; -const pageNumber = RCT.dataReqParams.site; +const { pageNumber } = RCT.dataReqParams; /** * Please use the new items counter instead that uses the paginationModel diff --git a/test/database/utilities/PGQueryBuilder.test.js b/test/database/utilities/PGQueryBuilder.test.js index a34ec114f..1be6bc216 100644 --- a/test/database/utilities/PGQueryBuilder.test.js +++ b/test/database/utilities/PGQueryBuilder.test.js @@ -42,7 +42,7 @@ module.exports = () => { const filteringParams = { page: 'periods', 'items-per-page': '50', - site: '1', + 'page-number': '1', sorting: '-name', 'name-match': ['%c%,%a', '%C%C'], 'beam-match': 'p-p', @@ -60,7 +60,7 @@ module.exports = () => { const filteringParams = { page: 'periods', 'items-per-page': '2', - site: '2', + 'page-number': '2', sorting: '-name', 'name-match': '%c%', 'beam-match': 'p-p,Pb-Pb', @@ -80,7 +80,7 @@ module.exports = () => { const filteringParams = { page: 'periods', 'items-per-page': '2', - site: '2', + 'page-number': '2', sorting: '-name', 'name-match': '%c%', 'name-exclude': ['%cccASDF%,', '%asdf,,,%asdf'], @@ -101,7 +101,7 @@ module.exports = () => { const filteringParams = { page: 'periods', 'items-per-page': '2', - site: '2', + 'page-number': '2', sorting: '-name', 'year-between': [',,2022,'], }; diff --git a/test/public/utils/url/urlUtils.test.js b/test/public/utils/url/urlUtils.test.js index 35050e9a3..edb77242b 100644 --- a/test/public/utils/url/urlUtils.test.js +++ b/test/public/utils/url/urlUtils.test.js @@ -17,11 +17,11 @@ const assert = require('assert'); const { replaceUrlParams } = req('../../../../app/public/utils/url/urlUtils'); module.exports = () => { - const url = new URL('http://localhost:8081/?page=periods&index=_0&items-per-page=50&site=1'); - const targetUrl = new URL('http://localhost:8081/?page=periods&index=_0&items-per-page=50&site=2'); + const url = new URL('http://localhost:8081/?page=periods&index=_0&items-per-page=50&page-number=1'); + const targetUrl = new URL('http://localhost:8081/?page=periods&index=_0&items-per-page=50&page-number=2'); describe('Replace URL params', () => { it('should return correct value', () => { - assert(replaceUrlParams(url, { site: 2 }).href === targetUrl.href); + assert(replaceUrlParams(url, {pageNumber: 2}).href === targetUrl.href); }); }); }; From b1ef6a3c9121e60c1860a3d803967c9507de33d4 Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 14:31:09 +0200 Subject: [PATCH 11/19] Apply eslint rules --- .../views/runs/runsPerDataPass/overview/qcTypeSelection.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/public/views/runs/runsPerDataPass/overview/qcTypeSelection.js b/app/public/views/runs/runsPerDataPass/overview/qcTypeSelection.js index 206d2f02f..3af4ae160 100644 --- a/app/public/views/runs/runsPerDataPass/overview/qcTypeSelection.js +++ b/app/public/views/runs/runsPerDataPass/overview/qcTypeSelection.js @@ -17,7 +17,8 @@ import { RCT } from '../../../../config.js'; const { runBasedQuality } = RCT.quality; export default function qcTypeSelection(navigation, close, item, index, detectorName, runDetectorId, timeBased) { - const flagsUrl = `/?page=flags&data_pass_name=${index}&run_numbers=${item.run_number}&detector=${detectorName}&items-per-page=50&page-number=1`; + const baseUrl = `/?page=flags&data_pass_name=${index}&run_numbers=${item.run_number}&detector=${detectorName}`; + const flagsUrl = `${baseUrl}${navigation.pageNumberReqParamsPhrase()}`; const runQualitySelectId = 'run-quality-select'; function handleRunQualityChange() { From 7da2d82fccb881f853a7da83c8d1458831fbecea Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 14:32:15 +0200 Subject: [PATCH 12/19] Eslint rules --- app/public/views/userView/data/pagesCellsSpecials.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/public/views/userView/data/pagesCellsSpecials.js b/app/public/views/userView/data/pagesCellsSpecials.js index 6e79e85e0..f574f70a9 100644 --- a/app/public/views/userView/data/pagesCellsSpecials.js +++ b/app/public/views/userView/data/pagesCellsSpecials.js @@ -60,6 +60,7 @@ pagesCellsSpecials[PN.periods] = { linkChip( model.navigation, 'data passes', + // eslint-disable-next-line max-len `/?page=${PN.dataPasses}&index=${item.name}&${DRP.itemsPerPage}=${model.parent.userPreferences.itemsPerPage}&${DRP.pageNumber}=1`, ), From 2ecc842fdc8b2d0db58e177db72738d31028b5fb Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 14:36:02 +0200 Subject: [PATCH 13/19] Fix a failing test --- test/public/utils/url/urlUtils.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/public/utils/url/urlUtils.test.js b/test/public/utils/url/urlUtils.test.js index edb77242b..cbe776ecc 100644 --- a/test/public/utils/url/urlUtils.test.js +++ b/test/public/utils/url/urlUtils.test.js @@ -21,7 +21,7 @@ module.exports = () => { const targetUrl = new URL('http://localhost:8081/?page=periods&index=_0&items-per-page=50&page-number=2'); describe('Replace URL params', () => { it('should return correct value', () => { - assert(replaceUrlParams(url, {pageNumber: 2}).href === targetUrl.href); + assert(replaceUrlParams(url, { 'page-number': 2 }).href === targetUrl.href); }); }); }; From 6a6afb2d8dcd7ae6db4322754df2f5126b87e6a2 Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 14:53:08 +0200 Subject: [PATCH 14/19] Add buttonStyle test --- app/public/components/table/obsoletePager.js | 7 ++--- app/public/components/table/pageSelector.js | 7 ++--- app/public/components/table/styleUtils.js | 22 +++++++++++++++ test/public/components/index.js | 2 ++ test/public/components/styleUtils.test.js | 29 ++++++++++++++++++++ 5 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 app/public/components/table/styleUtils.js create mode 100644 test/public/components/styleUtils.test.js diff --git a/app/public/components/table/obsoletePager.js b/app/public/components/table/obsoletePager.js index 0d0b16ad2..12d38a12a 100644 --- a/app/public/components/table/obsoletePager.js +++ b/app/public/components/table/obsoletePager.js @@ -15,6 +15,7 @@ import { h, iconChevronBottom } from '/js/src/index.js'; import obsoleteItemsCounter from '../../views/userView/data/table/obsoleteItemsCounter.js'; import { RCT } from '../../config.js'; +import { pageButtonStyle } from './styleUtils.js'; const { pageNumber } = RCT.dataReqParams; @@ -36,11 +37,7 @@ export default function obsoletePager(model, data, pagerOnly = true) { const isFirstPage = currentPageNumber === 1; const isLastPage = currentPageNumber === pagesCount; - const pageButtonDisplayStyle = (targetPage) => targetPage === currentPageNumber - ? '.btn-primary' - : '.btn-secondary'; - - const pageButton = (targetPage) => h(`button.btn${pageButtonDisplayStyle(targetPage)}.no-text-decoration`, { + const pageButton = (targetPage) => h(`button.btn${pageButtonStyle(targetPage, currentPageNumber)}.no-text-decoration`, { onclick: () => model.fetchedData.changePage(targetPage), }, targetPage); diff --git a/app/public/components/table/pageSelector.js b/app/public/components/table/pageSelector.js index 1ef8cd86c..e9e4eec6d 100644 --- a/app/public/components/table/pageSelector.js +++ b/app/public/components/table/pageSelector.js @@ -12,14 +12,11 @@ * or submit itself to any jurisdiction. */ +import { pageButtonStyle } from './styleUtils.js'; import { h } from '/js/src/index.js'; export default function pageSelector(currentPage, pagesCount, onPageChange) { - const pageButtonStyle = (targetPage) => targetPage === currentPage - ? '.btn-primary' - : '.btn-secondary'; - - const pageNumberButton = (targetPage) => h(`button.btn${pageButtonStyle(targetPage)}.no-text-decoration`, { + const pageNumberButton = (targetPage) => h(`button.btn${pageButtonStyle(targetPage, currentPage)}.no-text-decoration`, { onclick: () => onPageChange(targetPage), }, targetPage); diff --git a/app/public/components/table/styleUtils.js b/app/public/components/table/styleUtils.js new file mode 100644 index 000000000..08eb58189 --- /dev/null +++ b/app/public/components/table/styleUtils.js @@ -0,0 +1,22 @@ +/** + * @license + * Copyright 2019-2020 CERN and copyright holders of ALICE O2. + * See http://alice-o2.web.cern.ch/copyright for details of the copyright holders. + * All rights not expressly granted are reserved. + * + * This software is distributed under the terms of the GNU General Public + * License v3 (GPL Version 3), copied verbatim in the file "COPYING". + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +export const buttonClasses = { + primary: '.btn-primary', + secondary: '.btn-secondary' +} + +export const pageButtonStyle = (targetPage, currentPage) => targetPage === currentPage + ? buttonClasses.primary + : buttonClasses.secondary; diff --git a/test/public/components/index.js b/test/public/components/index.js index 617065b51..18ca48e32 100644 --- a/test/public/components/index.js +++ b/test/public/components/index.js @@ -13,8 +13,10 @@ const itemsCounterSuite = require('./itemsCounter.test'); const pageTitleSuite = require('./pageTitle.test'); +const styleSuite = require('./styleUtils.test'); module.exports = () => { describe('Items counter', itemsCounterSuite); describe('Page title', pageTitleSuite); + describe('Style utils', styleSuite); }; diff --git a/test/public/components/styleUtils.test.js b/test/public/components/styleUtils.test.js new file mode 100644 index 000000000..5f109dad6 --- /dev/null +++ b/test/public/components/styleUtils.test.js @@ -0,0 +1,29 @@ +/** + * @license + * Copyright CERN and copyright holders of ALICE O2. This software is + * distributed under the terms of the GNU General Public License v3 (GPL + * Version 3), copied verbatim in the file "COPYING". + * + * See http://alice-o2.web.cern.ch/license for full licensing information. + * + * In applying this license CERN does not waive the privileges and immunities + * granted to it by virtue of its status as an Intergovernmental Organization + * or submit itself to any jurisdiction. + */ + +const req = require('esm')(module); + +const { buttonClasses, pageButtonStyle } = req('../../../app/public/components/table/styleUtils'); +const assert = require('assert'); + +module.exports = () => { + describe('Page button style', () => { + it('should return primary style when the target page is the current page', () => { + assert.equal(pageButtonStyle(6, 6), buttonClasses.primary); + }); + + it('should return secondary style when the target page is the current page', () => { + assert.equal(pageButtonStyle(3, 35), buttonClasses.secondary); + }); + }); +}; From d8ff4cbd79a2de74f5eaadcaa565a4878aab6acd Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 15:25:21 +0200 Subject: [PATCH 15/19] Apply eslint rules --- app/public/components/table/styleUtils.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/public/components/table/styleUtils.js b/app/public/components/table/styleUtils.js index 08eb58189..5230b091f 100644 --- a/app/public/components/table/styleUtils.js +++ b/app/public/components/table/styleUtils.js @@ -14,8 +14,8 @@ export const buttonClasses = { primary: '.btn-primary', - secondary: '.btn-secondary' -} + secondary: '.btn-secondary', +}; export const pageButtonStyle = (targetPage, currentPage) => targetPage === currentPage ? buttonClasses.primary From 7c9297bd50fa62e3868efd076783078716000a4a Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 16:34:05 +0200 Subject: [PATCH 16/19] Move button conditions to a separate file --- app/public/components/table/obsoletePager.js | 31 +++++++------------- app/public/components/table/pageSelector.js | 30 +++++++------------ app/public/components/table/styleUtils.js | 9 ++++++ test/public/components/styleUtils.test.js | 17 ++++++++++- 4 files changed, 46 insertions(+), 41 deletions(-) diff --git a/app/public/components/table/obsoletePager.js b/app/public/components/table/obsoletePager.js index 12d38a12a..ff4333150 100644 --- a/app/public/components/table/obsoletePager.js +++ b/app/public/components/table/obsoletePager.js @@ -15,7 +15,7 @@ import { h, iconChevronBottom } from '/js/src/index.js'; import obsoleteItemsCounter from '../../views/userView/data/table/obsoleteItemsCounter.js'; import { RCT } from '../../config.js'; -import { pageButtonStyle } from './styleUtils.js'; +import { pageButtonStyle, pagerButtonConditions } from './styleUtils.js'; const { pageNumber } = RCT.dataReqParams; @@ -32,10 +32,8 @@ export default function obsoletePager(model, data, pagerOnly = true) { const pagesCount = Math.ceil(data.totalRecordsNumber / data.itemsPerPage); const currentPageNumber = Number(Object.fromEntries(data.url.searchParams.entries())[pageNumber]); const columnOptionsSelectId = 'columns-option-select-id'; - const morePagesLeft = currentPageNumber > 2; - const morePagesRight = currentPageNumber < pagesCount - 1; - const isFirstPage = currentPageNumber === 1; - const isLastPage = currentPageNumber === pagesCount; + + const buttonConditions = pagerButtonConditions(currentPageNumber, pagesCount); const pageButton = (targetPage) => h(`button.btn${pageButtonStyle(targetPage, currentPageNumber)}.no-text-decoration`, { onclick: () => model.fetchedData.changePage(targetPage), @@ -97,41 +95,34 @@ export default function obsoletePager(model, data, pagerOnly = true) { ], h('.flex.m-right-0-3-rem', - // Move to the first page - !isFirstPage ? pageChangingController(1, h('.double-left-15-primary')) : ' ', - // Move one page back - !isFirstPage ? pageChangingController(currentPageNumber - 1, h('.back-15-primary')) : ' ', - - // Move to the middle of pages range [first, current] - morePagesLeft + buttonConditions.goToFirstPage ? pageChangingController(1, h('.double-left-15-primary')) : '', + buttonConditions.goOnePageBack ? pageChangingController(currentPageNumber - 1, h('.back-15-primary')) : '', + buttonConditions.goMiddleBack ? pageChangingController( Math.floor(currentPageNumber / 2), h('.more-15-primary'), ) : '', - !isFirstPage ? pageButton(currentPageNumber - 1) : '', + buttonConditions.goOnePageBack ? pageButton(currentPageNumber - 1) : '', pageButton(currentPageNumber), - !isLastPage ? pageButton(currentPageNumber + 1) : '', + buttonConditions.goOnePageForward ? pageButton(currentPageNumber + 1) : '', - // Move to the middle of pages range [current, last] - morePagesRight + buttonConditions.goMiddleForward ? pageChangingController( currentPageNumber + Math.floor((pagesCount - currentPageNumber) / 2), h('.more-15-primary'), ) : '', - // Move one page forward - !isLastPage + buttonConditions.goOnePageForward ? pageChangingController( currentPageNumber + 1, h('.forward-15-primary'), ) : '', - // Move to the last page - !isLastPage + buttonConditions.goToLastPage ? pageChangingController( pagesCount, h('.double-right-15-primary'), diff --git a/app/public/components/table/pageSelector.js b/app/public/components/table/pageSelector.js index e9e4eec6d..8080f4081 100644 --- a/app/public/components/table/pageSelector.js +++ b/app/public/components/table/pageSelector.js @@ -12,10 +12,11 @@ * or submit itself to any jurisdiction. */ -import { pageButtonStyle } from './styleUtils.js'; +import { pageButtonStyle, pagerButtonConditions } from './styleUtils.js'; import { h } from '/js/src/index.js'; export default function pageSelector(currentPage, pagesCount, onPageChange) { + const buttonConditions = pagerButtonConditions(currentPage, pagesCount); const pageNumberButton = (targetPage) => h(`button.btn${pageButtonStyle(targetPage, currentPage)}.no-text-decoration`, { onclick: () => onPageChange(targetPage), }, targetPage); @@ -24,47 +25,36 @@ export default function pageSelector(currentPage, pagesCount, onPageChange) { onclick: () => onPageChange(targetPage), }, content); - const morePagesLeft = currentPage > 2; - const morePagesRight = currentPage < pagesCount - 1; - const isFirstPage = currentPage > 1; - const isLastPage = currentPage < pagesCount; - return h('.flex.m-right-0-3-rem', - // Move to the first page - isFirstPage ? pageIconButton(1, h('.double-left-15-primary')) : '', - // Move one page back - isFirstPage ? pageIconButton(currentPage - 1, h('.back-15-primary')) : '', + buttonConditions.goToFirstPage ? pageIconButton(1, h('.double-left-15-primary')) : '', + buttonConditions.goOnePageBack ? pageIconButton(currentPage - 1, h('.back-15-primary')) : '', - // Move to the middle of pages range [first, current] - morePagesLeft + buttonConditions.goMiddleBack ? pageIconButton( Math.floor(currentPage / 2), h('.more-15-primary'), ) : '', - isFirstPage ? pageNumberButton(currentPage - 1) : '', + buttonConditions.goOnePageBack ? pageNumberButton(currentPage - 1) : '', pageNumberButton(currentPage), - isLastPage ? pageNumberButton(currentPage + 1) : '', + buttonConditions.goOnePageForward ? pageNumberButton(currentPage + 1) : '', - // Move to the middle of pages range [current, last] - morePagesRight + buttonConditions.goMiddleForward ? pageIconButton( currentPage + Math.floor((pagesCount - currentPage) / 2), h('.more-15-primary'), ) : '', - // Move one page forward - isLastPage + buttonConditions.goOnePageForward ? pageIconButton( currentPage + 1, h('.forward-15-primary'), ) : '', - // Move to the last page - isLastPage + buttonConditions.goToLastPage ? pageIconButton( pagesCount, h('.double-right-15-primary'), diff --git a/app/public/components/table/styleUtils.js b/app/public/components/table/styleUtils.js index 5230b091f..49d0e0ead 100644 --- a/app/public/components/table/styleUtils.js +++ b/app/public/components/table/styleUtils.js @@ -20,3 +20,12 @@ export const buttonClasses = { export const pageButtonStyle = (targetPage, currentPage) => targetPage === currentPage ? buttonClasses.primary : buttonClasses.secondary; + +export const pagerButtonConditions = (currentPage, pagesCount) => ({ + goToFirstPage: currentPage > 1, + goOnePageBack: currentPage > 1, + goMiddleBack: currentPage > 2, + goMiddleForward: currentPage < pagesCount - 1, + goOnePageForward: currentPage !== pagesCount, + goToLastPage: currentPage !== pagesCount, +}); diff --git a/test/public/components/styleUtils.test.js b/test/public/components/styleUtils.test.js index 5f109dad6..0ea388178 100644 --- a/test/public/components/styleUtils.test.js +++ b/test/public/components/styleUtils.test.js @@ -13,7 +13,7 @@ const req = require('esm')(module); -const { buttonClasses, pageButtonStyle } = req('../../../app/public/components/table/styleUtils'); +const { buttonClasses, pageButtonStyle, pagerButtonConditions } = req('../../../app/public/components/table/styleUtils'); const assert = require('assert'); module.exports = () => { @@ -26,4 +26,19 @@ module.exports = () => { assert.equal(pageButtonStyle(3, 35), buttonClasses.secondary); }); }); + + describe('Page buttons', () => { + it('should not display go back buttons when the user is on the first page', () => { + assert(!pagerButtonConditions(1, 6).goToFirstPage && !pagerButtonConditions(1, 4).goMiddleBack && !pagerButtonConditions(1, 3).goOnePageBack); + }); + + it('should not display any pagination buttons when there is only one page', () => { + const buttons = pagerButtonConditions(1, 1); + assert(!Object.keys(buttons).reduce((acc, curr) => acc || buttons[curr], false)); + }); + + it('should not display go forward buttons when the user is on the last page', () => { + assert(!pagerButtonConditions(6, 6).goToLastPage && !pagerButtonConditions(4, 4).goMiddleForward && !pagerButtonConditions(3, 3).goOnePageForward); + }); + }); }; From 73f7449e6549af17cede946d5f9af503bf5645bf Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 16:37:19 +0200 Subject: [PATCH 17/19] Pager utils --- app/public/components/table/obsoletePager.js | 2 +- app/public/components/table/pageSelector.js | 2 +- app/public/components/table/{styleUtils.js => pagerUtils.js} | 0 test/public/components/index.js | 4 ++-- .../components/{styleUtils.test.js => pagerUtils.test.js} | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename app/public/components/table/{styleUtils.js => pagerUtils.js} (100%) rename test/public/components/{styleUtils.test.js => pagerUtils.test.js} (97%) diff --git a/app/public/components/table/obsoletePager.js b/app/public/components/table/obsoletePager.js index ff4333150..0c14dc657 100644 --- a/app/public/components/table/obsoletePager.js +++ b/app/public/components/table/obsoletePager.js @@ -15,7 +15,7 @@ import { h, iconChevronBottom } from '/js/src/index.js'; import obsoleteItemsCounter from '../../views/userView/data/table/obsoleteItemsCounter.js'; import { RCT } from '../../config.js'; -import { pageButtonStyle, pagerButtonConditions } from './styleUtils.js'; +import { pageButtonStyle, pagerButtonConditions } from './pagerUtils.js'; const { pageNumber } = RCT.dataReqParams; diff --git a/app/public/components/table/pageSelector.js b/app/public/components/table/pageSelector.js index 8080f4081..5aa73a9e5 100644 --- a/app/public/components/table/pageSelector.js +++ b/app/public/components/table/pageSelector.js @@ -12,7 +12,7 @@ * or submit itself to any jurisdiction. */ -import { pageButtonStyle, pagerButtonConditions } from './styleUtils.js'; +import { pageButtonStyle, pagerButtonConditions } from './pagerUtils.js'; import { h } from '/js/src/index.js'; export default function pageSelector(currentPage, pagesCount, onPageChange) { diff --git a/app/public/components/table/styleUtils.js b/app/public/components/table/pagerUtils.js similarity index 100% rename from app/public/components/table/styleUtils.js rename to app/public/components/table/pagerUtils.js diff --git a/test/public/components/index.js b/test/public/components/index.js index 18ca48e32..8e343e10a 100644 --- a/test/public/components/index.js +++ b/test/public/components/index.js @@ -13,10 +13,10 @@ const itemsCounterSuite = require('./itemsCounter.test'); const pageTitleSuite = require('./pageTitle.test'); -const styleSuite = require('./styleUtils.test'); +const pagerUtils = require('./pagerUtils.test'); module.exports = () => { describe('Items counter', itemsCounterSuite); describe('Page title', pageTitleSuite); - describe('Style utils', styleSuite); + describe('Pager utils', pagerUtils); }; diff --git a/test/public/components/styleUtils.test.js b/test/public/components/pagerUtils.test.js similarity index 97% rename from test/public/components/styleUtils.test.js rename to test/public/components/pagerUtils.test.js index 0ea388178..0bd9e6046 100644 --- a/test/public/components/styleUtils.test.js +++ b/test/public/components/pagerUtils.test.js @@ -13,7 +13,7 @@ const req = require('esm')(module); -const { buttonClasses, pageButtonStyle, pagerButtonConditions } = req('../../../app/public/components/table/styleUtils'); +const { buttonClasses, pageButtonStyle, pagerButtonConditions } = req('../../../app/public/components/table/pagerUtils'); const assert = require('assert'); module.exports = () => { From 310998a8dc9756fdb766b2139bc5d6d83a40a309 Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 16:44:12 +0200 Subject: [PATCH 18/19] Eslint cleanup :broom: --- test/public/components/pagerUtils.test.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/public/components/pagerUtils.test.js b/test/public/components/pagerUtils.test.js index 0bd9e6046..54c0c31f2 100644 --- a/test/public/components/pagerUtils.test.js +++ b/test/public/components/pagerUtils.test.js @@ -29,7 +29,9 @@ module.exports = () => { describe('Page buttons', () => { it('should not display go back buttons when the user is on the first page', () => { - assert(!pagerButtonConditions(1, 6).goToFirstPage && !pagerButtonConditions(1, 4).goMiddleBack && !pagerButtonConditions(1, 3).goOnePageBack); + assert(!pagerButtonConditions(1, 6).goToFirstPage && + !pagerButtonConditions(1, 4).goMiddleBack && + !pagerButtonConditions(1, 3).goOnePageBack); }); it('should not display any pagination buttons when there is only one page', () => { @@ -38,7 +40,9 @@ module.exports = () => { }); it('should not display go forward buttons when the user is on the last page', () => { - assert(!pagerButtonConditions(6, 6).goToLastPage && !pagerButtonConditions(4, 4).goMiddleForward && !pagerButtonConditions(3, 3).goOnePageForward); + assert(!pagerButtonConditions(6, 6).goToLastPage && + !pagerButtonConditions(4, 4).goMiddleForward && + !pagerButtonConditions(3, 3).goOnePageForward); }); }); }; From 87555fd49e60fb195b14882fe0e130f573b57ade Mon Sep 17 00:00:00 2001 From: Ehevi Date: Wed, 30 Aug 2023 16:49:46 +0200 Subject: [PATCH 19/19] Cleanup --- test/public/components/pagerUtils.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/public/components/pagerUtils.test.js b/test/public/components/pagerUtils.test.js index 54c0c31f2..b140d4c69 100644 --- a/test/public/components/pagerUtils.test.js +++ b/test/public/components/pagerUtils.test.js @@ -35,8 +35,8 @@ module.exports = () => { }); it('should not display any pagination buttons when there is only one page', () => { - const buttons = pagerButtonConditions(1, 1); - assert(!Object.keys(buttons).reduce((acc, curr) => acc || buttons[curr], false)); + const buttonConditions = pagerButtonConditions(1, 1); + assert(!Object.keys(buttonConditions).reduce((acc, curr) => acc || buttonConditions[curr], false)); }); it('should not display go forward buttons when the user is on the last page', () => {