open-nomad/ui/app/templates/csi/plugins/plugin/index.hbs
Phil Renaud cbd4deedf8
[ui] general keyboard navigation: 1.3.4 release (#14138)
* Initialized keyboard service

Neat but funky: dynamic subnav traversal

👻

generalized traverseSubnav method

Shift as special modifier key

Nice little demo panel

Keyboard shortcuts keycard

Some animation styles on keyboard shortcuts

Handle situations where a link is deeply nested from its parent menu item

Keyboard service cleanup

helper-based initializer and teardown for new contextual commands

Keyboard shortcuts modal component added and demo-ghost removed

Removed j and k from subnav traversal

Register and unregister methods for subnav plus new subnavs for volumes and volume

register main nav method

Generalizing the register nav method

12762 table keynav (#12975)

* Experimental feature: shortcut visual hints

* Long way around to a custom modifier for keyboard shortcuts

* dynamic table and list iterative shortcuts

* Progress with regular old tether

* Delogging

* Table Keynav tether fix, server and client navs, and fix to shiftless on modified arrow keys

Go to Optimize keyboard link and storage key changed to g r

parameterized jobs keyboard nav

Dynamic numeric keynav for multiple tables (#13482)

* Multiple tables init

* URL-bind enumerable keyboard commands and add to more taskRow and allocationRows

* Type safety and lint fixes

* Consolidated push to keyCommands

* Default value when removing keyCommands

* Remove the URL-based removal method and perform a recompute on any add

Get tests passing in Keynav: remove math helpers and a few other defensive moves (#13761)

* Remove ember math helpers

* Test fixes for jobparts/body

* Kill an unneeded integration helper test

* delog

* Trying if disabling percy lets this finish

* Okay so its not percy; try parallelism in circle

* Percyless yet again

* Trying a different angle to not have percy

* Upgrade percy to 1.6.1

[ui] Keyboard nav: "u" key to go up a level (#13754)

* U to go up a level

* Mislabelled my conditional

* Custom lint ignore rule

* Custom lint ignore rule, this time with commas

* Since we're getting rid of ember math helpers elsewhere, do the math ourselves here

Replace ArrowLeft etc. with an ascii arrow (#13776)

* Replace ArrowLeft etc. with an ascii arrow

* non-mutative helper cleanup

Keyboard Nav: let users rebind their shortcuts (#13781)

* click-outside and shortcuts enabled/disabled toggle

* Trap focus when modal open

* Enabled/disabled saved to localStorage

* Autofocus edit button on variable index

* Modal overflow styles

* Functional rebind

* Saving rebinds to localStorage for all majors

* Started on defaultCommandBindings

* Modal header style and cancel rebind on escape

* keyboardable keybindings w buttons instead of spans

* recording and defaultvalues

* Enter short-circuits rebind

* Only some commands are rebindable, and dont show dupes

* No unused get import

* More visually distinct header on modal

* Disallowed keys for rebind, showing buffer as you type, and moving dedupe to modal logic

willDestroy hook to prevent tests from doubling/tripling up addEventListener on kb events

remove unused tests

Keyboard Navigation acceptance tests (#13893)

* Acceptance tests for keyboard modal

* a11y audit fix and localStorage clear

* Bind/rebind/localStorage tests

* Keyboard tests for dynamic nav and tables

* Rebinder and assert expectation

* Second percy snapshot showing hints no longer relevant

Weird issue where linktos with query props specifically from the task-groups page would fail to route / hit undefined.shouldSuperCede errors

Adds the concept of exclusivity to a keycommand, removing peers that also share its label

Lintfix

Changelog and PR feedback

Changelog and PR feedback

Fix to rebinding in firefox by blurring the now-disabled button on rebind (#14053)

* Secure Variables shortcuts removed

* Variable index route autofocus removed

* Updated changelog entry

* Updated changelog entry

* Keynav docs (#14148)

* Section added to the API Docs UI page

* Added a note about disabling

* Prev and Next order

* Remove dev log and unneeded comments
2022-08-17 12:59:33 -04:00

189 lines
7 KiB
Handlebars

{{page-title "CSI Plugin " this.model.plainId}}
<PluginSubnav @plugin={{this.model}} />
<section class="section">
<h1 class="title" data-test-title>{{this.model.plainId}}</h1>
<div class="boxed-section is-small">
<div class="boxed-section-body inline-definitions">
<span class="label">Plugin Details</span>
{{#if this.model.controllerRequired}}
<span class="pair" data-test-plugin-controller-health>
<span class="term">Controller Health</span>
{{format-percentage this.model.controllersHealthy total=this.model.controllersExpected}}
({{this.model.controllersHealthy}}/{{this.model.controllersExpected}})
</span>
{{/if}}
<span class="pair" data-test-plugin-node-health>
<span class="term">Node Health</span>
{{format-percentage this.model.nodesHealthy total=this.model.nodesExpected}}
({{this.model.nodesHealthy}}/{{this.model.nodesExpected}})
</span>
<span class="pair" data-test-plugin-provider>
<span class="term">Provider</span>
{{this.model.provider}}
</span>
</div>
</div>
<div class="columns">
{{#if this.model.controllerRequired}}
<div class="column" data-test-plugin-controller-availability>
<div class="boxed-section">
<div class="boxed-section-head is-hollow">Controller Health</div>
<div class="boxed-section-body">
<div class="columns is-centered is-bottom-aligned">
<div class="column is-half">
<GaugeChart
@label="Availability"
@value={{this.model.controllersHealthy}}
@total={{this.model.controllersExpected}} />
</div>
<div class="column">
<div class="metric">
<h3 class="label">Available</h3>
<p class="value">{{this.model.controllersHealthy}}</p>
</div>
</div>
<div class="column">
<div class="metric">
<h3 class="label">Expected</h3>
<p class="value">{{this.model.controllersExpected}}</p>
</div>
</div>
</div>
</div>
</div>
</div>
{{/if}}
<div class="column">
<div class="boxed-section" data-test-plugin-node-availability>
<div class="boxed-section-head is-hollow">Node Health</div>
<div class="boxed-section-body">
<div class="columns is-centered is-bottom-aligned {{unless this.model.controllerRequired "is-max-half"}}">
<div class="column is-half">
<GaugeChart
@label="Availability"
@value={{this.model.nodesHealthy}}
@total={{this.model.nodesExpected}} />
</div>
<div class="column">
<div class="metric">
<h3 class="label">Available</h3>
<p class="value">{{this.model.nodesHealthy}}</p>
</div>
</div>
<div class="column">
<div class="metric">
<h3 class="label">Expected</h3>
<p class="value">{{this.model.nodesExpected}}</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{{#if this.model.controllerRequired}}
<div class="boxed-section" data-test-controller-allocations>
<div class="boxed-section-head">
Controller Allocations
</div>
<div class="boxed-section-body {{if this.model.controllers "is-full-bleed"}}">
{{#if this.model.controllers}}
<ListTable
@source={{take 10 this.sortedControllers}}
@class="with-foot" as |t|>
<t.head>
<th class="is-narrow"></th>
<td>ID</td>
<th>Created</th>
<th>Modified</th>
<th>Health</th>
<th>Client</th>
<th>Job</th>
<th>Version</th>
<th>Volumes</th>
<th>CPU</th>
<th>Memory</th>
</t.head>
<t.body @key="model.allocID" as |row|>
<PluginAllocationRow
@data-test-controller-allocation={{row.model.allocID}}
@pluginAllocation={{row.model}} />
</t.body>
</ListTable>
{{else}}
<div class="empty-message" data-test-empty-controller-allocations>
<h3 class="empty-message-headline" data-test-empty-controller-allocations-headline>No Controller Plugin Allocations</h3>
<p class="empty-message-body" data-test-empty-controller-allocations-message>No allocations are providing controller plugin service.</p>
</div>
{{/if}}
</div>
{{#if this.model.controllers}}
<div class="boxed-section-foot">
<p class="pull-right">
<LinkTo
@route="csi.plugins.plugin.allocations"
@model={{this.model}}
@query={{hash qpType=(qp-serialize (array "controller"))}}
data-test-go-to-controller-allocations>
View all {{this.model.controllers.length}} Controller {{pluralize "allocation" this.model.controllers.length}}
</LinkTo>
</p>
</div>
{{/if}}
</div>
{{/if}}
<div class="boxed-section">
<div class="boxed-section-head">
Node Allocations
</div>
<div class="boxed-section-body {{if this.model.nodes "is-full-bleed"}}">
{{#if this.model.nodes}}
<ListTable
@source={{take 10 this.sortedNodes}}
@class="with-foot" as |t|>
<t.head>
<th class="is-narrow"></th>
<td>ID</td>
<th>Created</th>
<th>Modified</th>
<th>Health</th>
<th>Client</th>
<th>Job</th>
<th>Version</th>
<th>Volumes</th>
<th>CPU</th>
<th>Memory</th>
</t.head>
<t.body @key="model.allocID" as |row|>
<PluginAllocationRow
@data-test-node-allocation={{row.model.allocID}}
@pluginAllocation={{row.model}} />
</t.body>
</ListTable>
{{else}}
<div class="empty-message" data-test-empty-node-allocations>
<h3 class="empty-message-headline" data-test-empty-node-allocations-headline>No Node Plugin Allocations</h3>
<p class="empty-message-body" data-test-empty-node-allocations-message>No allocations are providing node plugin service.</p>
</div>
{{/if}}
</div>
{{#if this.model.nodes}}
<div class="boxed-section-foot">
<p class="pull-right">
<LinkTo
@route="csi.plugins.plugin.allocations"
@model={{this.model}}
@query={{hash qpType=(qp-serialize (array "node"))}}
data-test-go-to-node-allocations>
View all {{this.model.nodes.length}} Node {{pluralize "allocation" this.model.nodes.length}}
</LinkTo>
</p>
</div>
{{/if}}
</div>
</section>