You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2022/10/21 13:58:32 UTC
[brooklyn-ui] 23/24: improve task filters - subtasks, scheduled, initialization
This is an automated email from the ASF dual-hosted git repository.
heneveld pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-ui.git
commit 3c2649e46bca57d4dc8536c5787c5699fedfbeb8
Author: Alex Heneveld <al...@cloudsoft.io>
AuthorDate: Thu Oct 20 13:33:21 2022 +0100
improve task filters - subtasks, scheduled, initialization
---
.../components/task-list/task-list.directive.js | 70 +++++++++++++++++++---
.../app/components/task-list/task-list.less | 35 ++++++++---
.../components/task-list/task-list.template.html | 8 +--
.../components/workflow/workflow-step.directive.js | 4 ++
.../workflow/workflow-step.template.html | 5 +-
.../app/components/workflow/workflow-steps.less | 5 ++
.../inspect/activities/activities.controller.js | 8 +++
.../app/views/main/inspect/inspect.controller.js | 2 +-
8 files changed, 113 insertions(+), 24 deletions(-)
diff --git a/ui-modules/app-inspector/app/components/task-list/task-list.directive.js b/ui-modules/app-inspector/app/components/task-list/task-list.directive.js
index 5f12c8a4..4e0d754e 100644
--- a/ui-modules/app-inspector/app/components/task-list/task-list.directive.js
+++ b/ui-modules/app-inspector/app/components/task-list/task-list.directive.js
@@ -157,15 +157,25 @@ export function taskListDirective() {
if ($scope.taskType) {
selectFilter($scope.taskType);
} else {
- // defaults
- selectFilter('EFFECTOR');
- selectFilter('WORKFLOW');
+ if (!isActivityChildren) {
+ // defaults (when not in subtask view; in subtask view it is as above)
+ selectFilter('EFFECTOR');
+ selectFilter('WORKFLOW');
+ } else {
+ selectFilter('SUB-TASK');
+ }
}
selectFilter("_workflowReplayedTopLevel");
selectFilter("_workflowNonLastReplayHidden");
+ // pick other filter combos until we get some conetnt
+ if ($scope.tasksFilteredByTag.length==0) {
+ selectFilter('INITIALIZATION');
+ }
+ if ($scope.tasksFilteredByTag.length==0) {
+ selectFilter("_anyTypeTag", true);
+ }
if ($scope.tasksFilteredByTag.length==0) {
- // if nothing found at top level then broaden
selectFilter("_top", false);
}
@@ -215,6 +225,8 @@ export function taskListDirective() {
globalFilters.transient.checked = !globalFilters.transient.include;
setFiltersForTasks(scope, isActivityChildren);
},
+ category: 'status',
+ categoryForEvaluation: 'status-transient',
};
globalFilters.transient.action();
}
@@ -369,9 +381,18 @@ export function taskListDirective() {
...(extra || {}),
}
}
- // put these first
- addTagFilter('EFFECTOR', filtersFullList, 'Effectors', { displaySummary: 'effector', includeIfZero: true });
- addTagFilter('WORKFLOW', filtersFullList, 'Workflow', { includeIfZero: true });
+
+ // put these first if present, to get this order, then remove if false
+ if (!isActivityChildren) {
+ addTagFilter('EFFECTOR', filtersFullList, 'Effectors', {displaySummary: 'effector', includeIfZero: true});
+ addTagFilter('WORKFLOW', filtersFullList, 'Workflow', { includeIfZero: true });
+ } else {
+ filtersFullList['EFFECTOR'] = false;
+ filtersFullList['WORKFLOW'] = false;
+ }
+ filtersFullList['SENSOR'] = false;
+ filtersFullList['INITIALIZATION'] = false;
+ filtersFullList['SUB-TASK'] = false;
// add filters for other tags
tasks.forEach(t =>
@@ -379,6 +400,31 @@ export function taskListDirective() {
addTagFilter(tag, filtersFullList, 'Tag: ' + tag.toLowerCase())
));
+ ['EFFECTOR', 'WORKFLOW', 'SUB-TASK', 'SENSORS', 'INITIALIZATION'].forEach(t => { if (!filtersFullList[t]) delete filtersFullList[t]; });
+ (filtersFullList['SUB-TASK'] || {}).display = 'Sub-tasks';
+ (filtersFullList['SENSOR'] || {}).display = 'Sensors';
+ (filtersFullList['INITIALIZATION'] || {}).display = 'Initialization';
+
+ filtersFullList['_active'] = {
+ display: 'Only show active tasks',
+ displaySummary: 'active',
+ filter: tasks => tasks.filter(t => !t.endTimeUtc || t.endTimeUtc<0),
+ category: 'status',
+ categoryForEvaluation: 'status-active',
+ }
+ filtersFullList['_scheduled_sub'] = {
+ display: 'Only show scheduled tasks',
+ displaySummary: 'scheduled',
+ filter: tasks => tasks.filter(t => {
+ // show scheduled tasks (the parent) and each scheduled run, if sub-tasks are selected
+ if (!t || !t.submittedByTask) return false;
+ if (isScheduled(t)) return true;
+ let submitter = tasksById[t.submittedByTask.metadata.id];
+ return isScheduled(submitter);
+ }),
+ category: 'status',
+ categoryForEvaluation: 'status-scheduled',
+ }
const filterWorkflowsReplayedTopLevel = t => !t.isWorkflowFirstRun && t.isWorkflowLastRun && t.isWorkflowTopLevel;
const countWorkflowsReplayedTopLevel = tasksAll.filter(filterWorkflowsReplayedTopLevel).length;
@@ -525,8 +571,14 @@ function isTopLevelTask(t, tasksById) {
if (t.forceTopLevel) return true;
if (t.tags && t.tags.includes("TOP-LEVEL")) return true;
let submitter = tasksById[t.submittedByTask.metadata.id];
- if (!submitter) return true;
- if (isScheduled(submitter) && (!t.endTimeUtc || t.endTimeUtc<=0)) return true;
+
+ // we could include those which are submitted but the submitter is forgotten
+ // (but they are accesible as CrossEntity or NestedSameEntity so don't include for now)
+ //if (!submitted) return true;
+
+ // active scheduled tasks
+ //if (isScheduled(submitter) && (!t.endTimeUtc || t.endTimeUtc<=0)) return true;
+
return false;
}
function isNonTopLevelTask(t, tasksById) {
diff --git a/ui-modules/app-inspector/app/components/task-list/task-list.less b/ui-modules/app-inspector/app/components/task-list/task-list.less
index a111b031..19a3db97 100644
--- a/ui-modules/app-inspector/app/components/task-list/task-list.less
+++ b/ui-modules/app-inspector/app/components/task-list/task-list.less
@@ -20,17 +20,18 @@ task-list {
display: block;
position: relative;
- i.sub-task-link {
- font-size: 40px;
- color: @brand-primary;
- }
-
brooklyn-status-icon {
margin-right: 15px;
width: 30px;
height: 30px;
display: block;
}
+
+ i.sub-task-link {
+ font-size: 40px;
+ color: @brand-primary;
+ }
+
.custom-status-task-icon {
color: @brand-success;
}
@@ -213,15 +214,33 @@ task-list {
}
- &.status a {
- padding-top: 0;
- padding-bottom: 0;
+ &.status {
+ a {
+ padding-top: 0;
+ padding-bottom: 0;
+
+ display: flex;
+ justify-content: center;
+
+ brooklyn-status-icon {
+ margin: 0;
+ width: 24px;
+ height: 24px;
+ }
+ }
}
+
+ &.no-tasks-found {
+ padding: 24px;
+ font-size: 125%;
+ }
+
}
tr > td > a:hover {
text-decoration: none;
}
+
}
.no-activities {
diff --git a/ui-modules/app-inspector/app/components/task-list/task-list.template.html b/ui-modules/app-inspector/app/components/task-list/task-list.template.html
index 02679002..76cd8c5f 100644
--- a/ui-modules/app-inspector/app/components/task-list/task-list.template.html
+++ b/ui-modules/app-inspector/app/components/task-list/task-list.template.html
@@ -77,7 +77,7 @@
<table class="table table-bordered">
<thead>
<tr>
- <th>
+ <th style="text-align: center;">
Status
</th>
<th>
@@ -125,11 +125,11 @@
</tr>
{{ model.filterResult = filterResult; "comment: update those interested in the result of the filter"; "" }}
<tr ng-if="filterResult.length == 0 ">
- <td colspan="4" class="text-center"><h4>
+ <td colspan="4" class="text-center no-tasks-found">
No tasks found matching
<span ng-if="filterValue">current search <code>{{filterValue}}</code> and</span>
- filter <code>{{filters.selectedDisplayName}}</code>
- </h4></td>
+ filter options
+ </td>
</tr>
</tbody>
</table>
diff --git a/ui-modules/app-inspector/app/components/workflow/workflow-step.directive.js b/ui-modules/app-inspector/app/components/workflow/workflow-step.directive.js
index 1171d247..39bd3a64 100644
--- a/ui-modules/app-inspector/app/components/workflow/workflow-step.directive.js
+++ b/ui-modules/app-inspector/app/components/workflow/workflow-step.directive.js
@@ -90,6 +90,10 @@ export function workflowStepDirective() {
$scope.stepTitle.code = step.shorthandTypeName || step.type || '';
if (step.input) $scope.stepTitle.code += ' ...';
}
+ if ("workflow" === $scope.stepTitle.code) {
+ $scope.stepTitle.code = null;
+ $scope.stepTitle.leftExtra = "nested workflow";
+ }
if (step.name) {
$scope.stepTitle.name = step.name;
diff --git a/ui-modules/app-inspector/app/components/workflow/workflow-step.template.html b/ui-modules/app-inspector/app/components/workflow/workflow-step.template.html
index 97a51d61..4480b0c7 100644
--- a/ui-modules/app-inspector/app/components/workflow/workflow-step.template.html
+++ b/ui-modules/app-inspector/app/components/workflow/workflow-step.template.html
@@ -52,7 +52,8 @@
<div class="step-block-title">
<span class="step-index">{{ stepTitle.index }}</span>
- <span class="step-title-code">{{ stepTitle.code }}</span>
+ <span ng-if="stepTitle.code" class="step-title-code">{{ stepTitle.code }}</span>
+ <span ng-if="stepTitle.leftExtra" class="step-left-extra">{{ stepTitle.leftExtra}}</span>
</div>
<div ng-if="expanded" class="step-details">
@@ -128,7 +129,7 @@
<div class="more-space-above" ng-if="stepContext.taskId">
<div class="data-row">
- <div class="A"><span ng-if="isCurrentAndActive">CURRENT</span><span ng-if="!isCurrent">LAST</span> EXECUTION</div>
+ <div class="A"><span ng-if="isCurrentAndActive">CURRENT</span><span ng-if="!isCurrentAndActive">LAST</span> EXECUTION</div>
<div class="B">
<span ng-if="isFocusTask">
task <span class="monospace">{{ stepContext.taskId }}</span>
diff --git a/ui-modules/app-inspector/app/components/workflow/workflow-steps.less b/ui-modules/app-inspector/app/components/workflow/workflow-steps.less
index 9948ee90..e1fda49f 100644
--- a/ui-modules/app-inspector/app/components/workflow/workflow-steps.less
+++ b/ui-modules/app-inspector/app/components/workflow/workflow-steps.less
@@ -90,6 +90,11 @@
font-weight: 300;
color: @gray-light;
}
+ .step-left-extra {
+ font-size: 90%;
+ //font-weight: 300;
+ color: @gray-light;
+ }
}
.step-details {
diff --git a/ui-modules/app-inspector/app/views/main/inspect/activities/activities.controller.js b/ui-modules/app-inspector/app/views/main/inspect/activities/activities.controller.js
index b005142f..2ec31d57 100644
--- a/ui-modules/app-inspector/app/views/main/inspect/activities/activities.controller.js
+++ b/ui-modules/app-inspector/app/views/main/inspect/activities/activities.controller.js
@@ -195,5 +195,13 @@ export function makeTaskStubFromWorkflowRecord(wf, wft) {
},
],
};
+ if (wft.submittedByTaskId) {
+ result.submittedByTask = {
+ metadata: {
+ id: wft.submittedByTaskId,
+ entityId: result.entityId,
+ }
+ };
+ }
return result;
};
diff --git a/ui-modules/app-inspector/app/views/main/inspect/inspect.controller.js b/ui-modules/app-inspector/app/views/main/inspect/inspect.controller.js
index 04808be3..636825e9 100644
--- a/ui-modules/app-inspector/app/views/main/inspect/inspect.controller.js
+++ b/ui-modules/app-inspector/app/views/main/inspect/inspect.controller.js
@@ -153,7 +153,7 @@ export function runWorkflowController($scope, $http, $uibModalInstance, applicat
function runWorkflow() {
$scope.running = true;
$scope.errorMessage = null;
- $http.post('/v1/applications/' + applicationId + '/entities/' + entityId + '/workflow?start=true&timeout=20ms', $scope.workflowYaml)
+ $http.post('/v1/applications/' + applicationId + '/entities/' + entityId + '/workflows?start=true&timeout=20ms', $scope.workflowYaml)
.then((response)=> {
$scope.running = false;
$uibModalInstance.close(response.data);