From 1ed97780ba748742917cad8dfbb5d34debe6661a Mon Sep 17 00:00:00 2001 From: rorour Date: Mon, 1 Jul 2024 12:05:30 -0600 Subject: [PATCH 01/17] ckp --- sirepo/package_data/static/js/raydata.js | 33 +++++++++++++------- sirepo/raydata/scan_monitor.py | 38 +++++++++++++----------- 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index d5f070df40..c1d1378c4d 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -502,8 +502,7 @@ SIREPO.app.directive('scansTable', function() { let scanArgs = { pageCount: 0, pageNumber: 0, - sortColumn: $scope.analysisStatus == 'queued' ? 'queue order' : 'start', - sortOrder: $scope.analysisStatus == 'queued', + sortColumns: defaultSortColumns(), }; const errorOptions = { @@ -540,6 +539,17 @@ SIREPO.app.directive('scansTable', function() { } } + function defaultSortColumns() { + return new Map( + [ + [ + $scope.analysisStatus == 'queued' ? 'queue order' : 'start', + $scope.analysisStatus == 'queued' + ] + ] + ); + } + function findScan(scanId) { return $scope.scans[ $scope.scans.findIndex(s => s.rduid === scanId) @@ -547,6 +557,7 @@ SIREPO.app.directive('scansTable', function() { } function init() { + srdbg("init", scanArgs.sortColumns); setColumnHeaders(); if (scanService.cachedScans($scope.analysisStatus)) { loadScans(scanService.cachedScans($scope.analysisStatus)); @@ -578,12 +589,12 @@ SIREPO.app.directive('scansTable', function() { } scanArgs.pageCount = scanInfo.pageCount || 0; scanArgs.pageNumber = scanInfo.pageNumber; - scanArgs.sortColumn = scanInfo.sortColumn; - scanArgs.sortOrder = scanInfo.sortOrder; + scanArgs.sortColumns = scanInfo.sortColumns; updatePageLocation(); } function sendScanRequest(clearScans, resetPager) { + srdbg("sendScanRequest", scanArgs.sortColumns); if (clearScans) { scanOutputIndex++; $scope.isRefreshingScans = false; @@ -608,6 +619,7 @@ SIREPO.app.directive('scansTable', function() { $scope.isRefreshingScans = true; $scope.noScansReturned = false; const expectedOutputIndex = scanOutputIndex; + srdbg("sendScanRequest2", scanArgs.sortColumns); requestSender.sendStatelessCompute( appState, json => { @@ -628,8 +640,7 @@ SIREPO.app.directive('scansTable', function() { pageNumber: scanArgs.pageNumber, searchText: m.searchText, searchTerms: buildSearchTerms(m.searchTerms), - sortColumn: scanArgs.sortColumn, - sortOrder: scanArgs.sortOrder, + sortColumns: JSON.stringify(scanArgs.sortColumns) } }, errorOptions @@ -677,12 +688,12 @@ SIREPO.app.directive('scansTable', function() { } $scope.arrowClass = column => { - if (scanArgs.sortColumn !== column) { + if (! scanArgs.sortColumns.has(column)) { return {}; } return { glyphicon: true, - [`glyphicon-arrow-${scanArgs.sortOrder ? 'up' : 'down'}`]: true, + [`glyphicon-arrow-${scanArgs.sortColumns.get(column) ? 'up' : 'down'}`]: true, }; }; @@ -815,9 +826,11 @@ SIREPO.app.directive('scansTable', function() { $scope.sortCol = column => { if (! $scope.columnIsSortable(column)) { return; + } else if (scanArgs.sortColumns.has(column)) { + scanArgs.sortColumns.set(column, ! scanArgs.sortColumns.get(column)); + } else { + scanArgs.sortColumns.set(column, true); } - scanArgs.sortColumn = column; - scanArgs.sortOrder = ! scanArgs.sortOrder; sendScanRequest(true, true); }; diff --git a/sirepo/raydata/scan_monitor.py b/sirepo/raydata/scan_monitor.py index 98e2d4fd5b..f4b3b92d92 100644 --- a/sirepo/raydata/scan_monitor.py +++ b/sirepo/raydata/scan_monitor.py @@ -251,6 +251,7 @@ def set_default_headers(self): class _RequestHandler(_JsonPostRequestHandler): async def _incoming(self, body): + pkdp(f"body={body}") return getattr(self, "_request_" + body.method)(body.data.get("args")) async def post(self): @@ -343,22 +344,23 @@ def _search_params(req_data): return q def _sort_params(req_data): - c = _default_columns(req_data.catalogName).get( - req_data.sortColumn, req_data.sortColumn - ) + pkdp(f"req_data.sortColumns={req_data.sortColumns}") + # c = _default_columns(req_data.catalogName).get( + # req_data.sortColumn, req_data.sortColumn + # ) s = [ ( - c, - pymongo.ASCENDING if req_data.sortOrder else pymongo.DESCENDING, - ), - ] - if c != "time": - s.append( - ( - "time", - pymongo.DESCENDING, - ) + "time", + pymongo.DESCENDING, ) + ] + # if c != "time": + # s.append( + # ( + # "time", + # pymongo.DESCENDING, + # ) + # ) return s c = sirepo.raydata.databroker.catalog(req_data.catalogName) @@ -695,8 +697,9 @@ def _get_start_field(metadata, column): def _scan_info_result(scans, page_count, req_data): def _compare_values(v1, v2): # very careful compare - needs to account for missing values or mismatched types - v1 = v1.get(req_data.sortColumn) - v2 = v2.get(req_data.sortColumn) + # TODO change to just use priority or some other default + v1 = v1.get("time") + v2 = v2.get("time") if v1 is None and v2 is None: return 0 if v1 is None: @@ -729,7 +732,7 @@ def _compare_values(v1, v2): s = sorted( s, key=functools.cmp_to_key(_compare_values), - reverse=not req_data.sortOrder, + reverse=1, ) return PKDict( data=PKDict( @@ -737,8 +740,7 @@ def _compare_values(v1, v2): cols=_display_columns(all_columns), pageCount=page_count, pageNumber=req_data.pageNumber, - sortColumn=req_data.sortColumn, - sortOrder=req_data.sortOrder, + sortColumns=req_data.sortColumns, ) ) From f8da1186a3165ee7b6097f3ba1804ae4c66422dd Mon Sep 17 00:00:00 2001 From: rorour Date: Fri, 5 Jul 2024 15:27:02 -0600 Subject: [PATCH 02/17] front end --- sirepo/package_data/static/js/raydata.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index c1d1378c4d..a28240ce93 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -557,7 +557,6 @@ SIREPO.app.directive('scansTable', function() { } function init() { - srdbg("init", scanArgs.sortColumns); setColumnHeaders(); if (scanService.cachedScans($scope.analysisStatus)) { loadScans(scanService.cachedScans($scope.analysisStatus)); @@ -594,7 +593,6 @@ SIREPO.app.directive('scansTable', function() { } function sendScanRequest(clearScans, resetPager) { - srdbg("sendScanRequest", scanArgs.sortColumns); if (clearScans) { scanOutputIndex++; $scope.isRefreshingScans = false; @@ -619,7 +617,6 @@ SIREPO.app.directive('scansTable', function() { $scope.isRefreshingScans = true; $scope.noScansReturned = false; const expectedOutputIndex = scanOutputIndex; - srdbg("sendScanRequest2", scanArgs.sortColumns); requestSender.sendStatelessCompute( appState, json => { @@ -640,7 +637,7 @@ SIREPO.app.directive('scansTable', function() { pageNumber: scanArgs.pageNumber, searchText: m.searchText, searchTerms: buildSearchTerms(m.searchTerms), - sortColumns: JSON.stringify(scanArgs.sortColumns) + sortColumns: [...scanArgs.sortColumns.entries()].join(';') } }, errorOptions From 5e01100a286561e2263f81044f0ac3c1e50010d6 Mon Sep 17 00:00:00 2001 From: rorour Date: Mon, 8 Jul 2024 12:04:14 -0600 Subject: [PATCH 03/17] decode columns --- sirepo/package_data/static/js/raydata.js | 19 +++++++++++- sirepo/raydata/scan_monitor.py | 37 ++++++++++++------------ 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index a28240ce93..0ce721baa3 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -539,6 +539,23 @@ SIREPO.app.directive('scansTable', function() { } } + function decodeSortColumns(encoded) { + let columns = new Map() + let d = encoded.split(';'); + d.forEach((e) => { + let z = e.split(','); + if (z[1] === 'true') { + columns.set(z[0], true); + } else if (z[1] === 'false') { + columns.set(z[0], false); + } else { + srdbg('unknown value', z); + } + }); + srdbg('returning', columns); + return columns; + } + function defaultSortColumns() { return new Map( [ @@ -588,7 +605,7 @@ SIREPO.app.directive('scansTable', function() { } scanArgs.pageCount = scanInfo.pageCount || 0; scanArgs.pageNumber = scanInfo.pageNumber; - scanArgs.sortColumns = scanInfo.sortColumns; + scanArgs.sortColumns = decodeSortColumns(scanInfo.sortColumns); updatePageLocation(); } diff --git a/sirepo/raydata/scan_monitor.py b/sirepo/raydata/scan_monitor.py index f4b3b92d92..5a93ce3a03 100644 --- a/sirepo/raydata/scan_monitor.py +++ b/sirepo/raydata/scan_monitor.py @@ -344,24 +344,25 @@ def _search_params(req_data): return q def _sort_params(req_data): - pkdp(f"req_data.sortColumns={req_data.sortColumns}") - # c = _default_columns(req_data.catalogName).get( - # req_data.sortColumn, req_data.sortColumn - # ) - s = [ - ( - "time", - pymongo.DESCENDING, - ) - ] - # if c != "time": - # s.append( - # ( - # "time", - # pymongo.DESCENDING, - # ) - # ) - return s + r = req_data.sortColumns.split(";") + z = [] + hastime = False + for x in r: + x = x.split(",") + if x[1] == "true": + x[1] = pymongo.ASCENDING + elif x[1] == "false": + x[1] = pymongo.DESCENDING + else: + assert 0, x[1] + x = (_default_columns(req_data.catalogName).get(x[0], x[0]), x[1]) + z.append(x) + if x[0] == "time": + hastime = True + if not hastime: + z.append(("time", pymongo.DESCENDING)) + pkdp(f"z={z}") + return z c = sirepo.raydata.databroker.catalog(req_data.catalogName) pc = math.ceil( From aa8792570ef5a0759cdcc971c6c2fb635386cc35 Mon Sep 17 00:00:00 2001 From: rorour Date: Mon, 8 Jul 2024 14:46:41 -0600 Subject: [PATCH 04/17] working on Run Analysis tab --- sirepo/package_data/static/js/raydata.js | 5 ++++ sirepo/raydata/scan_monitor.py | 29 +++++++++++++----------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index 0ce721baa3..edb91fb19e 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -440,6 +440,7 @@ SIREPO.app.directive('scansTable', function() {
+ @@ -719,6 +720,10 @@ SIREPO.app.directive('scansTable', function() { return ! $scope.isLoadingNewScans && (scanArgs.pageNumber > 0); }; + $scope.clearSort = () => { + scanArgs.sortColumns = new Map(); + }; + $scope.deleteCol = colName => { appState.models.metadataColumns.selected.splice( appState.models.metadataColumns.selected.indexOf(colName), diff --git a/sirepo/raydata/scan_monitor.py b/sirepo/raydata/scan_monitor.py index 5a93ce3a03..bad4ac425e 100644 --- a/sirepo/raydata/scan_monitor.py +++ b/sirepo/raydata/scan_monitor.py @@ -344,21 +344,24 @@ def _search_params(req_data): return q def _sort_params(req_data): - r = req_data.sortColumns.split(";") + pkdp(f"rrrrrrr={req_data.sortColumns}") + z = [] hastime = False - for x in r: - x = x.split(",") - if x[1] == "true": - x[1] = pymongo.ASCENDING - elif x[1] == "false": - x[1] = pymongo.DESCENDING - else: - assert 0, x[1] - x = (_default_columns(req_data.catalogName).get(x[0], x[0]), x[1]) - z.append(x) - if x[0] == "time": - hastime = True + if req_data.sortColumns != "": + r = req_data.sortColumns.split(";") + for x in r: + x = x.split(",") + if x[1] == "true": + x[1] = pymongo.ASCENDING + elif x[1] == "false": + x[1] = pymongo.DESCENDING + else: + assert 0, x[1] + x = (_default_columns(req_data.catalogName).get(x[0], x[0]), x[1]) + z.append(x) + if x[0] == "time": + hastime = True if not hastime: z.append(("time", pymongo.DESCENDING)) pkdp(f"z={z}") From 8ed787c7ed507da96d2fed6d2fc70800783c150b Mon Sep 17 00:00:00 2001 From: rorour Date: Mon, 8 Jul 2024 15:16:01 -0600 Subject: [PATCH 05/17] works --- sirepo/package_data/static/js/raydata.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index edb91fb19e..b7a06674c5 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -440,7 +440,7 @@ SIREPO.app.directive('scansTable', function() {
- +
@@ -847,6 +847,8 @@ SIREPO.app.directive('scansTable', function() { return; } else if (scanArgs.sortColumns.has(column)) { scanArgs.sortColumns.set(column, ! scanArgs.sortColumns.get(column)); + } else if ($scope.analysisStatus !== 'allStatuses') { + scanArgs.sortColumns = new Map([[column, true]]) } else { scanArgs.sortColumns.set(column, true); } From db8240e34cd607f50de1616d0b584b97489d9d87 Mon Sep 17 00:00:00 2001 From: rorour Date: Mon, 8 Jul 2024 15:32:18 -0600 Subject: [PATCH 06/17] fix compare function --- sirepo/raydata/scan_monitor.py | 57 +++++++++++++++++----------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/sirepo/raydata/scan_monitor.py b/sirepo/raydata/scan_monitor.py index bad4ac425e..b6f1baa173 100644 --- a/sirepo/raydata/scan_monitor.py +++ b/sirepo/raydata/scan_monitor.py @@ -343,30 +343,6 @@ def _search_params(req_data): } return q - def _sort_params(req_data): - pkdp(f"rrrrrrr={req_data.sortColumns}") - - z = [] - hastime = False - if req_data.sortColumns != "": - r = req_data.sortColumns.split(";") - for x in r: - x = x.split(",") - if x[1] == "true": - x[1] = pymongo.ASCENDING - elif x[1] == "false": - x[1] = pymongo.DESCENDING - else: - assert 0, x[1] - x = (_default_columns(req_data.catalogName).get(x[0], x[0]), x[1]) - z.append(x) - if x[0] == "time": - hastime = True - if not hastime: - z.append(("time", pymongo.DESCENDING)) - pkdp(f"z={z}") - return z - c = sirepo.raydata.databroker.catalog(req_data.catalogName) pc = math.ceil( len( @@ -504,6 +480,31 @@ def _request_scan_fields(self, req_data): ) +def _sort_params(req_data): + pkdp(f"rrrrrrr={req_data.sortColumns}") + + z = [] + hastime = False + if req_data.sortColumns != "": + r = req_data.sortColumns.split(";") + for x in r: + x = x.split(",") + if x[1] == "true": + x[1] = pymongo.ASCENDING + elif x[1] == "false": + x[1] = pymongo.DESCENDING + else: + assert 0, x[1] + x = (_default_columns(req_data.catalogName).get(x[0], x[0]), x[1]) + z.append(x) + if x[0] == "time": + hastime = True + if not hastime: + z.append(("time", pymongo.DESCENDING)) + pkdp(f"z={z}") + return z + + async def _init_analysis_processors(): global _ANALYSIS_PROCESSOR_TASKS @@ -700,10 +701,10 @@ def _get_start_field(metadata, column): def _scan_info_result(scans, page_count, req_data): def _compare_values(v1, v2): + sort_column = _sort_params(req_data)[0][0] # very careful compare - needs to account for missing values or mismatched types - # TODO change to just use priority or some other default - v1 = v1.get("time") - v2 = v2.get("time") + v1 = v1.get(sort_column) + v2 = v2.get(sort_column) if v1 is None and v2 is None: return 0 if v1 is None: @@ -736,7 +737,7 @@ def _compare_values(v1, v2): s = sorted( s, key=functools.cmp_to_key(_compare_values), - reverse=1, + reverse=not _sort_params(req_data)[0][1], ) return PKDict( data=PKDict( From 5a6a8da3b7822baf6d743e293332fededeafe7e8 Mon Sep 17 00:00:00 2001 From: rorour Date: Mon, 8 Jul 2024 15:41:14 -0600 Subject: [PATCH 07/17] cleanup --- sirepo/package_data/static/js/raydata.js | 10 +++------ sirepo/raydata/scan_monitor.py | 28 ++++++++++-------------- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index b7a06674c5..0ad7a31c3b 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -541,19 +541,15 @@ SIREPO.app.directive('scansTable', function() { } function decodeSortColumns(encoded) { - let columns = new Map() - let d = encoded.split(';'); - d.forEach((e) => { + let columns = new Map(); + encoded.split(';').forEach((e) => { let z = e.split(','); if (z[1] === 'true') { columns.set(z[0], true); - } else if (z[1] === 'false') { - columns.set(z[0], false); } else { - srdbg('unknown value', z); + columns.set(z[0], false); } }); - srdbg('returning', columns); return columns; } diff --git a/sirepo/raydata/scan_monitor.py b/sirepo/raydata/scan_monitor.py index b6f1baa173..bb96e39c18 100644 --- a/sirepo/raydata/scan_monitor.py +++ b/sirepo/raydata/scan_monitor.py @@ -251,7 +251,6 @@ def set_default_headers(self): class _RequestHandler(_JsonPostRequestHandler): async def _incoming(self, body): - pkdp(f"body={body}") return getattr(self, "_request_" + body.method)(body.data.get("args")) async def post(self): @@ -481,28 +480,23 @@ def _request_scan_fields(self, req_data): def _sort_params(req_data): - pkdp(f"rrrrrrr={req_data.sortColumns}") - - z = [] - hastime = False + r = [] + has_time = False if req_data.sortColumns != "": - r = req_data.sortColumns.split(";") - for x in r: + for x in req_data.sortColumns.split(";"): x = x.split(",") if x[1] == "true": x[1] = pymongo.ASCENDING - elif x[1] == "false": - x[1] = pymongo.DESCENDING else: - assert 0, x[1] - x = (_default_columns(req_data.catalogName).get(x[0], x[0]), x[1]) - z.append(x) + assert x[1] == "false", f"unrecognized sort order {x}" + x[1] = pymongo.DESCENDING + x[0] = _default_columns(req_data.catalogName).get(x[0], x[0]) if x[0] == "time": - hastime = True - if not hastime: - z.append(("time", pymongo.DESCENDING)) - pkdp(f"z={z}") - return z + has_time = True + r.append(x) + if not has_time: + r.append(("time", pymongo.DESCENDING)) + return r async def _init_analysis_processors(): From b95963cbbf5e1086ddd2d2d46bb53053cc1e8ce2 Mon Sep 17 00:00:00 2001 From: rorour Date: Mon, 8 Jul 2024 15:49:38 -0600 Subject: [PATCH 08/17] semicolon --- sirepo/package_data/static/js/raydata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index 0ad7a31c3b..bf647128a9 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -844,7 +844,7 @@ SIREPO.app.directive('scansTable', function() { } else if (scanArgs.sortColumns.has(column)) { scanArgs.sortColumns.set(column, ! scanArgs.sortColumns.get(column)); } else if ($scope.analysisStatus !== 'allStatuses') { - scanArgs.sortColumns = new Map([[column, true]]) + scanArgs.sortColumns = new Map([[column, true]]); } else { scanArgs.sortColumns.set(column, true); } From 5ebd69f9935066b24f2707fb571bd41087243cec Mon Sep 17 00:00:00 2001 From: rorour Date: Wed, 10 Jul 2024 16:05:39 -0600 Subject: [PATCH 09/17] fix FieldPath error --- sirepo/package_data/static/js/raydata.js | 18 ++++++++++-------- sirepo/raydata/scan_monitor.py | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index bf647128a9..274d0eb35d 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -542,14 +542,16 @@ SIREPO.app.directive('scansTable', function() { function decodeSortColumns(encoded) { let columns = new Map(); - encoded.split(';').forEach((e) => { - let z = e.split(','); - if (z[1] === 'true') { - columns.set(z[0], true); - } else { - columns.set(z[0], false); - } - }); + if (encoded !== '') { + encoded.split(';').forEach((e) => { + let z = e.split(','); + if (z[1] === 'true') { + columns.set(z[0], true); + } else { + columns.set(z[0], false); + } + }); + } return columns; } diff --git a/sirepo/raydata/scan_monitor.py b/sirepo/raydata/scan_monitor.py index bb96e39c18..7d84ce4b88 100644 --- a/sirepo/raydata/scan_monitor.py +++ b/sirepo/raydata/scan_monitor.py @@ -495,7 +495,7 @@ def _sort_params(req_data): has_time = True r.append(x) if not has_time: - r.append(("time", pymongo.DESCENDING)) + r.append(["time", pymongo.DESCENDING]) return r From 70a652765f3209f07a52a483b45fdd030444e355 Mon Sep 17 00:00:00 2001 From: rorour Date: Wed, 24 Jul 2024 17:18:56 -0600 Subject: [PATCH 10/17] columns with array values not sortable --- sirepo/package_data/static/js/raydata.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index 274d0eb35d..1ab917fc1c 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -837,7 +837,13 @@ SIREPO.app.directive('scansTable', function() { }; $scope.columnIsSortable = (column) => { - return column !== 'stop'; + if (['stop'].includes(column)) { + return false; + } else if ($scope.scans.length > 0 && typeof $scope.scans[0][column] === 'object') { + return false; + } else { + return true; + } }; $scope.sortCol = column => { From 67876a7d10d9571592709a233f75c5251990382d Mon Sep 17 00:00:00 2001 From: rorour Date: Thu, 25 Jul 2024 13:10:41 -0600 Subject: [PATCH 11/17] comments --- sirepo/package_data/static/js/raydata.js | 75 ++++++++++++------------ sirepo/raydata/scan_monitor.py | 22 ++++--- 2 files changed, 46 insertions(+), 51 deletions(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index 1ab917fc1c..badeeabb33 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -540,30 +540,12 @@ SIREPO.app.directive('scansTable', function() { } } - function decodeSortColumns(encoded) { - let columns = new Map(); - if (encoded !== '') { - encoded.split(';').forEach((e) => { - let z = e.split(','); - if (z[1] === 'true') { - columns.set(z[0], true); - } else { - columns.set(z[0], false); - } - }); - } - return columns; - } - function defaultSortColumns() { - return new Map( - [ - [ - $scope.analysisStatus == 'queued' ? 'queue order' : 'start', - $scope.analysisStatus == 'queued' - ] - ] - ); + if ($scope.analysisStatus == 'queued') { + return [['queue order', true]]; + } else { + return [['start', false]]; + } } function findScan(scanId) { @@ -604,7 +586,7 @@ SIREPO.app.directive('scansTable', function() { } scanArgs.pageCount = scanInfo.pageCount || 0; scanArgs.pageNumber = scanInfo.pageNumber; - scanArgs.sortColumns = decodeSortColumns(scanInfo.sortColumns); + scanArgs.sortColumns = scanInfo.sortColumns; updatePageLocation(); } @@ -653,7 +635,7 @@ SIREPO.app.directive('scansTable', function() { pageNumber: scanArgs.pageNumber, searchText: m.searchText, searchTerms: buildSearchTerms(m.searchTerms), - sortColumns: [...scanArgs.sortColumns.entries()].join(';') + sortColumns: scanArgs.sortColumns } }, errorOptions @@ -701,13 +683,16 @@ SIREPO.app.directive('scansTable', function() { } $scope.arrowClass = column => { - if (! scanArgs.sortColumns.has(column)) { - return {}; - } - return { - glyphicon: true, - [`glyphicon-arrow-${scanArgs.sortColumns.get(column) ? 'up' : 'down'}`]: true, - }; + let r = {}; + scanArgs.sortColumns.forEach((arr) => { + if (arr[0] === column) { + r= { + glyphicon: true, + [`glyphicon-arrow-${arr[1] ? 'up' : 'down'}`]: true, + }; + } + }); + return r; }; $scope.canNextPage = () => { @@ -719,7 +704,7 @@ SIREPO.app.directive('scansTable', function() { }; $scope.clearSort = () => { - scanArgs.sortColumns = new Map(); + scanArgs.sortColumns = []; }; $scope.deleteCol = colName => { @@ -846,15 +831,27 @@ SIREPO.app.directive('scansTable', function() { } }; + $scope.sortCol = column => { if (! $scope.columnIsSortable(column)) { return; - } else if (scanArgs.sortColumns.has(column)) { - scanArgs.sortColumns.set(column, ! scanArgs.sortColumns.get(column)); - } else if ($scope.analysisStatus !== 'allStatuses') { - scanArgs.sortColumns = new Map([[column, true]]); - } else { - scanArgs.sortColumns.set(column, true); + } + let inList = false; + scanArgs.sortColumns.forEach((arr) => { + if (arr[0] === column) { + inList = true; + arr[1] = ! arr[1]; + } + }); + if (! inList) { + if ($scope.analysisStatus !== 'allStatuses') { + scanArgs.sortColumns = [[column, true]]; + } else { + scanArgs.sortColumns.unshift([column, true]); + if (scanArgs.sortColumns.length > 3) { + scanArgs.sortColumns.pop(); + } + } } sendScanRequest(true, true); }; diff --git a/sirepo/raydata/scan_monitor.py b/sirepo/raydata/scan_monitor.py index 7d84ce4b88..a4af1cd266 100644 --- a/sirepo/raydata/scan_monitor.py +++ b/sirepo/raydata/scan_monitor.py @@ -482,18 +482,16 @@ def _request_scan_fields(self, req_data): def _sort_params(req_data): r = [] has_time = False - if req_data.sortColumns != "": - for x in req_data.sortColumns.split(";"): - x = x.split(",") - if x[1] == "true": - x[1] = pymongo.ASCENDING - else: - assert x[1] == "false", f"unrecognized sort order {x}" - x[1] = pymongo.DESCENDING - x[0] = _default_columns(req_data.catalogName).get(x[0], x[0]) - if x[0] == "time": - has_time = True - r.append(x) + for x in req_data.sortColumns: + n = _default_columns(req_data.catalogName).get(x[0], x[0]) + if n == "time": + has_time = True + r.append( + [ + n, + pymongo.ASCENDING if x[1] else pymongo.DESCENDING, + ] + ) if not has_time: r.append(["time", pymongo.DESCENDING]) return r From 2fa0212b71d72f9a330348d85f78c46eab6c6085 Mon Sep 17 00:00:00 2001 From: rorour Date: Thu, 25 Jul 2024 13:13:39 -0600 Subject: [PATCH 12/17] remove clear sort button --- sirepo/package_data/static/js/raydata.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index badeeabb33..ffe7920619 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -440,7 +440,6 @@ SIREPO.app.directive('scansTable', function() {
-
@@ -703,10 +702,6 @@ SIREPO.app.directive('scansTable', function() { return ! $scope.isLoadingNewScans && (scanArgs.pageNumber > 0); }; - $scope.clearSort = () => { - scanArgs.sortColumns = []; - }; - $scope.deleteCol = colName => { appState.models.metadataColumns.selected.splice( appState.models.metadataColumns.selected.indexOf(colName), From b98f2e99939da3aafba92716dbfd92e31ed4d63a Mon Sep 17 00:00:00 2001 From: rorour Date: Thu, 25 Jul 2024 15:12:37 -0600 Subject: [PATCH 13/17] handle null values --- sirepo/package_data/static/js/raydata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index ffe7920619..4107e6020d 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -819,7 +819,7 @@ SIREPO.app.directive('scansTable', function() { $scope.columnIsSortable = (column) => { if (['stop'].includes(column)) { return false; - } else if ($scope.scans.length > 0 && typeof $scope.scans[0][column] === 'object') { + } else if ($scope.scans.length > 0 && $scope.scans[0][column] !== null && typeof $scope.scans[0][column] === 'object') { return false; } else { return true; From 6ba3a960c9e422fc462e4525063d538befb52875 Mon Sep 17 00:00:00 2001 From: rorour Date: Fri, 2 Aug 2024 17:16:10 -0600 Subject: [PATCH 14/17] move column to top of list when reversing sort --- sirepo/package_data/static/js/raydata.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index 4107e6020d..bfcea8a828 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -832,10 +832,12 @@ SIREPO.app.directive('scansTable', function() { return; } let inList = false; - scanArgs.sortColumns.forEach((arr) => { - if (arr[0] === column) { + scanArgs.sortColumns.forEach((field, i) => { + if (field[0] === column) { inList = true; - arr[1] = ! arr[1]; + field[1] = ! field[1]; + scanArgs.sortColumns.splice(i, 1); + scanArgs.sortColumns.unshift(field); } }); if (! inList) { From ed7c3a41dfe45b578f4e0fd0cb97b924d10d2561 Mon Sep 17 00:00:00 2001 From: rorour Date: Fri, 2 Aug 2024 18:26:18 -0600 Subject: [PATCH 15/17] color gradient arrows --- sirepo/package_data/static/js/raydata.js | 27 +++++++++++++++++------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index bfcea8a828..c2097c3822 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -446,7 +446,7 @@ SIREPO.app.directive('scansTable', function() { @@ -683,17 +683,28 @@ SIREPO.app.directive('scansTable', function() { $scope.arrowClass = column => { let r = {}; - scanArgs.sortColumns.forEach((arr) => { - if (arr[0] === column) { + scanArgs.sortColumns.forEach((sortField) => { + if (sortField[0] === column) { r= { glyphicon: true, - [`glyphicon-arrow-${arr[1] ? 'up' : 'down'}`]: true, + [`glyphicon-arrow-${sortField[1] ? 'up' : 'down'}`]: true, }; } }); return r; }; + $scope.arrowStyle = column => { + let r = ''; + scanArgs.sortColumns.forEach((sortField, i) => { + if (sortField[0] === column) { + let a = i === 0 ? 1 : (-0.3 * i) + 0.8; + r = `color: rgba(0, 0, 0, ${a})`; + return; + }}); + return r; + }; + $scope.canNextPage = () => { return ! $scope.isLoadingNewScans && (scanArgs.pageNumber + 1 < scanArgs.pageCount); }; @@ -832,12 +843,12 @@ SIREPO.app.directive('scansTable', function() { return; } let inList = false; - scanArgs.sortColumns.forEach((field, i) => { - if (field[0] === column) { + scanArgs.sortColumns.forEach((sortField, i) => { + if (sortField[0] === column) { inList = true; - field[1] = ! field[1]; + sortField[1] = ! sortField[1]; scanArgs.sortColumns.splice(i, 1); - scanArgs.sortColumns.unshift(field); + scanArgs.sortColumns.unshift(sortField); } }); if (! inList) { From 2c03022b350068802aa6fff7b9fcad508a9db109 Mon Sep 17 00:00:00 2001 From: rorour Date: Mon, 5 Aug 2024 16:05:46 -0600 Subject: [PATCH 16/17] fix indent --- sirepo/package_data/static/js/raydata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index c2097c3822..729abe2638 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -702,7 +702,7 @@ SIREPO.app.directive('scansTable', function() { r = `color: rgba(0, 0, 0, ${a})`; return; }}); - return r; + return r; }; $scope.canNextPage = () => { From 7322d198d8db767467b2dfee55a74b6b9b0cba27 Mon Sep 17 00:00:00 2001 From: rorour Date: Tue, 6 Aug 2024 02:01:30 -0600 Subject: [PATCH 17/17] comments --- sirepo/package_data/static/js/raydata.js | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/sirepo/package_data/static/js/raydata.js b/sirepo/package_data/static/js/raydata.js index 729abe2638..736ee6c7e4 100644 --- a/sirepo/package_data/static/js/raydata.js +++ b/sirepo/package_data/static/js/raydata.js @@ -505,6 +505,8 @@ SIREPO.app.directive('scansTable', function() { sortColumns: defaultSortColumns(), }; + const MAX_NUM_SORT_COLUMNS = 3; + const errorOptions = { modelName: $scope.modelName, onError: data => { @@ -696,12 +698,14 @@ SIREPO.app.directive('scansTable', function() { $scope.arrowStyle = column => { let r = ''; - scanArgs.sortColumns.forEach((sortField, i) => { + for (const [i, sortField] of scanArgs.sortColumns.entries()) { if (sortField[0] === column) { + // logic for alpha value assumes that sortColumns are in descending priority and MAX_NUM_SORT_COLUMNS is 3 let a = i === 0 ? 1 : (-0.3 * i) + 0.8; r = `color: rgba(0, 0, 0, ${a})`; - return; - }}); + break; + } + } return r; }; @@ -828,13 +832,7 @@ SIREPO.app.directive('scansTable', function() { }; $scope.columnIsSortable = (column) => { - if (['stop'].includes(column)) { - return false; - } else if ($scope.scans.length > 0 && $scope.scans[0][column] !== null && typeof $scope.scans[0][column] === 'object') { - return false; - } else { - return true; - } + return ! (column === 'stop' || $scope.scans.length > 0 && $scope.scans[0][column] !== null && typeof $scope.scans[0][column] === 'object'); }; @@ -856,7 +854,7 @@ SIREPO.app.directive('scansTable', function() { scanArgs.sortColumns = [[column, true]]; } else { scanArgs.sortColumns.unshift([column, true]); - if (scanArgs.sortColumns.length > 3) { + if (scanArgs.sortColumns.length > MAX_NUM_SORT_COLUMNS) { scanArgs.sortColumns.pop(); } }
PDF - + {{ column }}