Files
nomad/ui/app/components/actions-flyout.js
Phil Renaud fb14c2b556 [ui] Actions service and flyout (#19084)
* Initial pass at a global actions instance queue

* Action card with a bunch of functionality that needs to be pared back a bit

* Happy little actions button

* runAction performs updated to use actions service

* Stop All and Clear Finished buttons

* Keyboard service now passes element, so we can pseudo-click the actions dropdown

* resizable sidebar code blocks

* Contextual actions within task and job levels

* runAction greatly consolidated

* Pluralize action text

* Peer grouping of flyout action intances

* ShortIDs instead of full alloc IDs

* Testfixes that previously depended on notifications

* Stop and stop all for peered action instances

* Job name in action instance card linkable

* Componentized actions global button

* scss consolidation

* Clear and Stop buttons become mutually exclusive in an action card

* Clean up action card title styles a bit

* todo-bashing

* stopAll and stopPeers separated and fixed up

* Socket handling functions moved to the Actions service

* Error handling on socket message

* Smarter import

* Documentation note: need alloc-exec and alloc-raw-exec for raw_exec jobs

* Tests for flyout and dropdown actions

* Docs link when in empty flyout/queue state and percy snapshot test for it
2023-11-26 23:46:44 -05:00

69 lines
1.5 KiB
JavaScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
// @ts-check
import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
import { alias } from '@ember/object/computed';
export default class ActionsFlyoutComponent extends Component {
@service nomadActions;
@service router;
get job() {
if (this.task) {
return this.task.taskGroup.job;
} else {
return (
this.router.currentRouteName.startsWith('jobs.job') &&
this.router.currentRoute.attributes
);
}
}
get task() {
return (
this.router.currentRouteName.startsWith('allocations.allocation.task') &&
this.router.currentRoute.attributes.task
);
}
get allocation() {
return (
this.args.allocation ||
(this.task && this.router.currentRoute.attributes.allocation)
);
}
get contextualParent() {
return this.task || this.job;
}
get contextualActions() {
return this.contextualParent?.actions || [];
}
@alias('nomadActions.flyoutActive') isOpen;
/**
* Group peers together by their peerID
*/
get actionInstances() {
let instances = this.nomadActions.actionsQueue;
// Only keep the first of any found peerID value from the list
let peerIDs = new Set();
let filteredInstances = [];
for (let instance of instances) {
if (!instance.peerID || !peerIDs.has(instance.peerID)) {
filteredInstances.push(instance);
peerIDs.add(instance.peerID);
}
}
return filteredInstances;
}
}