Skip to content

Commit

Permalink
fix #6588 Allow analysis queue to be reordered
Browse files Browse the repository at this point in the history
also fix #6587 show queue order on pending list and allow sorting on queue order
Scan items may be moved to the front or back of the list
  • Loading branch information
moellep committed Feb 28, 2024
1 parent 1c1e3db commit c283f2e
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 9 deletions.
82 changes: 73 additions & 9 deletions sirepo/package_data/static/js/raydata.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,6 @@ SIREPO.app.factory('columnsService', function(appState, requestSender, $rootScop
self.allColumnsWithHeading = null;
self.selectSearchFieldText = 'Select Search Field';

// POSIT: status + sirepo.template.raydata._DEFAULT_COLUMNS
self.DEFAULT_COLUMNS = ['status', 'start', 'stop', 'suid'];

function loadColumns() {
requestSender.sendStatelessCompute(
appState,
Expand All @@ -100,6 +97,14 @@ SIREPO.app.factory('columnsService', function(appState, requestSender, $rootScop
);
}

self.defaultColumns = (analysisStatus) => {
const res = ['status', 'start', 'stop', 'suid'];
if (analysisStatus == 'queued') {
res.splice(1, 0, 'queue order');
}
return res;
};

self.updateColumns = columns => {
if (! columns || ! columns.length) {
return;
Expand Down Expand Up @@ -461,7 +466,6 @@ SIREPO.app.directive('replayPanel', function() {
panelState: panelState,
}
);

};
},
};
Expand Down Expand Up @@ -500,7 +504,10 @@ SIREPO.app.directive('scansTable', function() {
<tr ng-repeat="s in scans track by $index">
<td style="width: 1%" data-ng-show="showPdfColumn"><input type="checkbox" data-ng-show="showCheckbox(s)" data-ng-checked="pdfSelectedScans[s.rduid]" data-ng-click="togglePdfSelectScan(s.rduid)"/></td>
<td width="1%"><span data-header-tooltip="s.status"></span></td>
<td data-ng-repeat="c in columnHeaders.slice(1)"><div data-scan-cell-value="s[c]", data-column-name="c"></div></td>
<td data-ng-if="analysisStatus == 'queued'">
<div data-queue-order="" scan="s" number-of-scans="{{ scans.length }}" data-refresh-scans="refreshScans()"></div>
</td>
<td data-ng-repeat="c in columnHeaders.slice(analysisStatus == 'queued' ? 2 : 1)"><div data-scan-cell-value="s[c]", data-column-name="c"></div></td>
<td style="white-space: nowrap" width="1%">
<button data-ng-if="analysisStatus === 'allStatuses'" class="btn btn-info btn-xs" data-ng-click="runAnalysis(s.rduid)" data-ng-disabled="disableRunAnalysis(s)">Run Analysis</button>
<button class="btn btn-info btn-xs" data-ng-disabled="! raydataService.canViewOutput(s)" data-ng-click="setAnalysisScan(s)">View Output</button>
Expand Down Expand Up @@ -542,8 +549,8 @@ SIREPO.app.directive('scansTable', function() {
let scanArgs = {
pageCount: 0,
pageNumber: 0,
sortColumn: 'start',
sortOrder: false,
sortColumn: $scope.analysisStatus == 'queued' ? 'queue order' : 'start',
sortOrder: $scope.analysisStatus == 'queued',
};

const errorOptions = {
Expand Down Expand Up @@ -674,7 +681,7 @@ SIREPO.app.directive('scansTable', function() {

function setColumnHeaders() {
$scope.columnHeaders = [
...columnsService.DEFAULT_COLUMNS,
...columnsService.defaultColumns($scope.analysisStatus),
...appState.models.metadataColumns.selected
];
}
Expand Down Expand Up @@ -774,6 +781,10 @@ SIREPO.app.directive('scansTable', function() {
}
};

$scope.refreshScans = () => {
sendScanRequest(true, true);
};

$scope.runAnalysis = (scanId, forceRun) => {
if (! forceRun) {
const scan = findScan(scanId);
Expand Down Expand Up @@ -824,7 +835,7 @@ SIREPO.app.directive('scansTable', function() {
};

$scope.showDeleteButton = index => {
return index > columnsService.DEFAULT_COLUMNS.length - 1;
return index > columnsService.defaultColumns($scope.analysisStatus).length - 1;
};

$scope.showPdfButton = () => {
Expand Down Expand Up @@ -1230,3 +1241,56 @@ SIREPO.app.directive('searchTermText', function() {
},
};
});


SIREPO.app.directive('queueOrder', function() {
return {
restrict: 'A',
scope: {
scan: '=',
numberOfScans: '@',
refreshScans: '&',
},
template: `
{{ scan['queue order'] }} &nbsp;
<span data-ng-show="scan['queue order'] > 0">
<button data-ng-repeat="b in buttons track by $index" type="button"
class="btn btn-info btn-xs" title="{{ b.title }}" data-ng-click="b.click()"
data-ng-style="{ visibility: b.visible() ? 'visible' : 'hidden', transform: b.rotate }"><span
class="glyphicon glyphicon-step-forward"></span>
</button>
</span>
`,
controller: function(appState, requestSender, $scope) {
$scope.buttons = [
{
title: 'Move to end of queue',
rotate: 'rotate(90deg)',
visible: () => $scope.scan['queue order'] < $scope.numberOfScans - 1,
click: () => reorderScan('last'),
},
{
title: 'Move to beginning of queue',
rotate: 'rotate(270deg)',
visible: () => $scope.scan['queue order'] > 1,
click: () => reorderScan('first'),
},
];

function reorderScan(action) {
requestSender.sendStatelessCompute(
appState,
() => $scope.refreshScans(),
{
method: 'reorder_scan',
args: {
catalogName: appState.models.catalog.catalogName,
rduid: $scope.scan.rduid,
action: action,
}
},
);
}
},
};
});
26 changes: 26 additions & 0 deletions sirepo/raydata/scan_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -427,6 +427,22 @@ def _request_get_scans(self, req_data):
)
return _scan_info_result(l, s, req_data)

def _request_reorder_scan(self, req_data):
i = _scan_index(req_data.rduid, req_data)
if i >= 0:
s = _SCANS_AWAITING_ANALYSIS.pop(i)
if s.rduid != req_data.rduid:
raise AssertionError(
f"Failed to pop() correct scan: {req_data.rduid} != {s.rduid}"
)
if req_data.action == "first":
_SCANS_AWAITING_ANALYSIS.insert(0, s)
elif req_data.action == "last":
_SCANS_AWAITING_ANALYSIS.append(s)
else:
raise AssertionError(f"Unknown reorder action {req_data.action}")
return PKDict(data="ok")

def _request_run_analysis(self, req_data):
_queue_for_analysis(
sirepo.raydata.databroker.get_metadata(req_data.rduid, req_data.catalogName)
Expand Down Expand Up @@ -567,6 +583,14 @@ def _queue_for_analysis(scan_metadata):
_Analysis.set_scan_status(s, _AnalysisStatus.PENDING)


def _scan_index(rduid, req_data):
s = PKDict(
rduid=rduid,
catalog_name=req_data.catalogName,
)
return _SCANS_AWAITING_ANALYSIS.index(s) if s in _SCANS_AWAITING_ANALYSIS else -1


def _scan_info(rduid, status, req_data, all_columns):
m = sirepo.raydata.databroker.get_metadata(rduid, req_data.catalogName)
d = PKDict(
Expand All @@ -584,6 +608,8 @@ def _scan_info(rduid, status, req_data, all_columns):

for c in m.get_start_fields():
all_columns.add(c)

d["queue order"] = _scan_index(rduid, req_data) + 1
return d


Expand Down
4 changes: 4 additions & 0 deletions sirepo/template/raydata.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@ def stateless_compute_download_analysis_pdfs(data, data_file_uri=None, **kwargs)
return _request_scan_monitor(PKDict(method="download_analysis_pdfs", data=data))


def stateless_compute_reorder_scan(data, **kwargs):
return _request_scan_monitor(PKDict(method="reorder_scan", data=data))


def stateless_compute_run_analysis(data, **kwargs):
return _request_scan_monitor(PKDict(method="run_analysis", data=data))

Expand Down

0 comments on commit c283f2e

Please sign in to comment.