diff --git a/.changelog/2606.txt b/.changelog/2606.txt new file mode 100644 index 00000000000..2896c7786d5 --- /dev/null +++ b/.changelog/2606.txt @@ -0,0 +1,3 @@ +```release-note:feature +ui: reformatted app overview page and header of artifact details page +``` diff --git a/ui/app/components/git-commit.hbs b/ui/app/components/git-commit.hbs index 51bf32aa814..bff5b234935 100644 --- a/ui/app/components/git-commit.hbs +++ b/ui/app/components/git-commit.hbs @@ -1,7 +1,9 @@ {{#if @commit}} + + {{!-- TODO: add git profile picture of user whose commit it was when possible --}} - {{truncate-commit @commit}} + {{truncate-commit @commit}} {{/if}} \ No newline at end of file diff --git a/ui/app/components/panel-header.hbs b/ui/app/components/panel-header.hbs new file mode 100644 index 00000000000..f8b6542cfd4 --- /dev/null +++ b/ui/app/components/panel-header.hbs @@ -0,0 +1,25 @@ +{{#let + (hash + title=(or + (and (eq @artifact "deployment") "page.deployment.title") + (and (eq @artifact "build") "page.build.title") + (and (eq @artifact "release") "page.release.title") + "page.unavailable.title" + ) + ) + as |vars| +}} +
+
+

{{t vars.title}} + {{#if @sequence}} + v{{@sequence}} + {{/if}} +

+ {{yield to="title"}} +
+
+ {{yield to="actions"}} +
+
+{{/let}} diff --git a/ui/app/components/section.hbs b/ui/app/components/section.hbs index 7f17d2ee81c..471892ece17 100644 --- a/ui/app/components/section.hbs +++ b/ui/app/components/section.hbs @@ -6,22 +6,26 @@ >

- + {{#if this.isExpandable}} + + {{/if}} {{yield to="heading"}}

- + {{#if this.isExpandable}} + + {{/if}}
{{#if this.expanded}} diff --git a/ui/app/components/section.ts b/ui/app/components/section.ts index d55558a0df1..eb7b8e4a93e 100644 --- a/ui/app/components/section.ts +++ b/ui/app/components/section.ts @@ -4,11 +4,16 @@ import { action } from '@ember/object'; type Args = { expanded?: boolean; + isExpandable?: boolean; }; export default class extends Component { @tracked expanded = this.args.expanded ?? true; + get isExpandable(): boolean { + return this.args.isExpandable ?? true; + } + @action toggleExpanded(): void { this.expanded = !this.expanded; diff --git a/ui/app/components/status-report-meta-table/index.hbs b/ui/app/components/status-report-meta-table/index.hbs index 2e3067e0ee0..33c0f6f9656 100644 --- a/ui/app/components/status-report-meta-table/index.hbs +++ b/ui/app/components/status-report-meta-table/index.hbs @@ -1,35 +1,60 @@ +{{#let + (hash + shouldRenderHealthAndTag=(and + (or + (eq @artifactType "Deployment") + (eq @artifactType "Release") + ) + @model.statusReport + ) + shouldRenderCommit=@model.preload.jobDataSourceRef.git.commit + ) + as |vars| +}}
- {{#if @model.statusReport}} - - - - + {{#if (or (has-block) vars.shouldRenderCommit vars.shouldRenderHealthAndTag)}} + {{yield}} + {{else}} + {{t "page.artifact.overview.unavailable"}} + {{/if}} + {{#if vars.shouldRenderHealthAndTag}} + + + + + + + + + {{/if}} + {{#if vars.shouldRenderCommit}} - + - {{else}} - {{t "page.deployment.overview.unavailable"}} {{/if}}
{{t "page.deployment.overview.health-check"}} -
-   - - {{t "page.deployment.overview.re-run-health-check"}} - -
-
{{t "page.artifact.overview.health-check"}} +
+   + + {{t "page.artifact.overview.re-run-health-check"}} + +
+
+ {{t "page.artifact.overview.image"}} + + +
- {{t "page.deployment.overview.image"}} - {{t "page.artifact.overview.commit"}} - +
+{{/let}} \ No newline at end of file diff --git a/ui/app/routes/workspace/projects/project/app/index.ts b/ui/app/routes/workspace/projects/project/app/index.ts index b607f2bee07..5b9ba3c7e83 100644 --- a/ui/app/routes/workspace/projects/project/app/index.ts +++ b/ui/app/routes/workspace/projects/project/app/index.ts @@ -3,6 +3,6 @@ import { Model as AppRouteModel } from '../app'; export default class AppIndex extends Route { redirect(model: AppRouteModel): void { - this.transitionTo('workspace.projects.project.app.logs', model.application.application); + this.transitionTo('workspace.projects.project.app.deployments', model.application.application); } } diff --git a/ui/app/styles/_layout.scss b/ui/app/styles/_layout.scss index 96c462dbcd7..6f14863cc12 100644 --- a/ui/app/styles/_layout.scss +++ b/ui/app/styles/_layout.scss @@ -74,13 +74,16 @@ ul.list { border-bottom: none; } +.list-heading { + @include Typography.Heading(3); +} + .status-row { // status information on specific build/deployment/release page display: flex; align-items: center; justify-content: space-between; padding: scale.$base 0; - border-top: 1px solid rgb(var(--border)); color: rgb(var(--text-muted)); @include Typography.Interface(M); @@ -109,7 +112,7 @@ ul.list { // Waypoint styles code { - font-family: ui-monospace, 'Menlo', monospace; + font-family: var(--monospace); white-space: nowrap; color: rgb(var(--text)); background: none; diff --git a/ui/app/styles/_variables.scss b/ui/app/styles/_variables.scss index 97266bb34df..34aefdf3675 100644 --- a/ui/app/styles/_variables.scss +++ b/ui/app/styles/_variables.scss @@ -12,6 +12,7 @@ $button-shadow: 0 3px 2px rgba(var(--shadow), 0.2); } :root { + --monospace: ui-monospace, 'Menlo', monospace; --brand: #{dehex($brand-color)}; --background: #{dehex(color.$white)}; --text: #{dehex(color.$black)}; @@ -22,8 +23,8 @@ $button-shadow: 0 3px 2px rgba(var(--shadow), 0.2); --outline: #{dehex(color.$ui-gray-300)}; --card: #{dehex(color.$white)}; --panel: #{dehex(color.$ui-cool-gray-050)}; - --badge: #{dehex(color.$blue-050)}; - --badge-text: #{dehex(color.$blue-500)}; + --badge: #{dehex(color.$ui-gray-200)}; + --badge-text: #{dehex(color.$ui-gray-800)}; --badge-neutral: #{dehex(color.$ui-cool-gray-100)}; --badge-neutral-text: #{dehex(color.$ui-cool-gray-700)}; --shadow: #{dehex(color.$ui-cool-gray-900)}; diff --git a/ui/app/styles/components/_index.scss b/ui/app/styles/components/_index.scss index 2fb79c95834..f25d9557deb 100644 --- a/ui/app/styles/components/_index.scss +++ b/ui/app/styles/components/_index.scss @@ -1,5 +1,3 @@ -@import 'app-card'; -@import 'app-card-item'; @import 'app-item'; @import 'badge'; @import 'button'; @@ -20,6 +18,7 @@ @import 'navigation/header'; @import 'navigation/footer'; @import 'navigation/page-header'; +@import 'navigation/panel-header'; @import 'notifications'; @import 'operation-status-indicator'; @import 'output-pane'; diff --git a/ui/app/styles/components/badge.scss b/ui/app/styles/components/badge.scss index 12f9c169592..396c45bcd07 100644 --- a/ui/app/styles/components/badge.scss +++ b/ui/app/styles/components/badge.scss @@ -9,6 +9,7 @@ &--version { @include Typography.Interface(M); + font-family: var(--monospace); border-radius: scale.$base; } diff --git a/ui/app/styles/components/git-commit.scss b/ui/app/styles/components/git-commit.scss index 1502a9a6b8b..bfe94ad5505 100644 --- a/ui/app/styles/components/git-commit.scss +++ b/ui/app/styles/components/git-commit.scss @@ -1,13 +1,12 @@ .git-commit { - display: flex; - align-items: center; @include Typography.Interface(S); - background: rgb(var(--badge)); - color: rgb(var(--text-muted)); border-radius: 2px; padding: scale.$sm-4 scale.$sm-4; &__sha { - padding: 0 scale.$sm-4; + color: rgb(var(--text-muted)); + background: rgb(var(--badge)); + padding: scale.$sm-4; + border-radius: scale.$sm-4; } .copy-btn { @include button-reset; diff --git a/ui/app/styles/components/navigation/artifact-overview.scss b/ui/app/styles/components/navigation/artifact-overview.scss index 5179bc0aaf4..fe0290d5747 100644 --- a/ui/app/styles/components/navigation/artifact-overview.scss +++ b/ui/app/styles/components/navigation/artifact-overview.scss @@ -24,6 +24,7 @@ color: rgb(var(--text-muted)); padding-right: scale.$lg--10; text-align: left; + width: 158px; } .status-indicator { diff --git a/ui/app/styles/components/navigation/page-header.scss b/ui/app/styles/components/navigation/page-header.scss index 6c09ef1162a..1a113636201 100644 --- a/ui/app/styles/components/navigation/page-header.scss +++ b/ui/app/styles/components/navigation/page-header.scss @@ -30,13 +30,6 @@ font-weight: 600; margin: scale.$sm-2 0 scale.$sm-4; } - - .badge { - font-size: 1rem; - position: relative; - top: -2px; - margin-right: scale.$sm-4; - } } small { @@ -57,57 +50,4 @@ &.projects-header { margin-top: scale.$lg-4; } - - .actions { - position: relative; - display: flex; - align-items: center; - flex-wrap: wrap; - max-width: 100%; - margin: scale.$sm-4 0; - - .button-group { - display: flex; - max-width: 100%; - - .button:first-child { - flex-shrink: 1; - overflow: hidden; - } - } - - .button { - margin: scale.$sm-3 0; - - span { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - min-width: 0; - } - - & + .button { - margin-left: scale.$base; - } - } - - .first-run-hint { - p { - color: rgb(var(--text-muted)); - @include Typography.Interface(S); - display: inline-block; - margin-right: scale.$sm-2; - } - - .copyable-code { - margin: scale.$sm-2 0; - - code { - display: inline-flex; - font-size: 11px; - flex-shrink: 0; - } - } - } - } } diff --git a/ui/app/styles/components/navigation/panel-header.scss b/ui/app/styles/components/navigation/panel-header.scss new file mode 100644 index 00000000000..4fb386706fd --- /dev/null +++ b/ui/app/styles/components/navigation/panel-header.scss @@ -0,0 +1,79 @@ +.panel-header { + display: flex; + align-items: center; + flex-wrap: wrap; + font-size: 0.9em; + font-weight: 400; + color: rgb(var(--text-muted)); + + h1 { + display: flex; + flex-direction: row; + align-items: center; + display: flex; + flex-direction: row; + align-items: center; + @include Typography.Interface(M); + + .badge { + font-size: 1rem; + position: relative; + top: -2px; + margin-left: scale.$sm-3; + } + } + + .actions { + position: relative; + display: flex; + align-items: center; + flex-wrap: wrap; + max-width: 100%; + margin: scale.$sm-4 0; + margin-left: auto; + + .button-group { + display: flex; + max-width: 100%; + + .button:first-child { + flex-shrink: 1; + overflow: hidden; + } + } + + .button { + margin: scale.$sm-3 0; + + span { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + min-width: 0; + } + + & + .button { + margin-left: scale.$base; + } + } + + .first-run-hint { + p { + color: rgb(var(--text-muted)); + @include Typography.Interface(S); + display: inline-block; + margin-right: scale.$sm-2; + } + + .copyable-code { + margin: scale.$sm-2 0; + + code { + display: inline-flex; + font-size: 11px; + flex-shrink: 0; + } + } + } + } +} \ No newline at end of file diff --git a/ui/app/styles/components/section.scss b/ui/app/styles/components/section.scss index 3acc9395f48..3c73b924f42 100644 --- a/ui/app/styles/components/section.scss +++ b/ui/app/styles/components/section.scss @@ -2,11 +2,13 @@ position: relative; margin-bottom: scale.$base; + padding-bottom: scale.$sm--1; + border-bottom: 1px solid rgb(var(--border)); + &__header { position: relative; - border-bottom: 1px solid rgb(var(--border)); margin-bottom: scale.$sm--1; } diff --git a/ui/app/styles/components/structure/pds-tabnav.scss b/ui/app/styles/components/structure/pds-tabnav.scss index 4bad4d765f1..0f2ea476cda 100644 --- a/ui/app/styles/components/structure/pds-tabnav.scss +++ b/ui/app/styles/components/structure/pds-tabnav.scss @@ -1,5 +1,4 @@ .pds-tabNav { - padding-top: scale.$sm-2; margin-bottom: scale.$lg-4; :any-link:not(.pds-button) { diff --git a/ui/app/templates/workspace/projects/project/app.hbs b/ui/app/templates/workspace/projects/project/app.hbs index c9ab4cce931..4d3a239f629 100644 --- a/ui/app/templates/workspace/projects/project/app.hbs +++ b/ui/app/templates/workspace/projects/project/app.hbs @@ -10,17 +10,6 @@

{{@model.application.application}}

- - {{#if @model.releases.length}} - {{#if (eq @model.releases.[0].status.state 2)}} - Last released {{date-format-distance-to-now @model.releases.[0].status.completeTime.seconds}} - {{else}} - Release in progress... - {{/if}} - {{else}} - Not released yet - {{/if}} -
{{#if (and (project-is-remote-uppable @model.project) (not @model.releases.length))}} @@ -47,38 +36,27 @@
-
-
-
-
-
-
-
-
-
- - - - - {{t "nav.logs"}} + + {{t "nav.deployments"}} {{t "nav.builds"}} - - - {{t "nav.deployments"}} - {{t "nav.releases"}} + + + {{t "nav.logs"}} + diff --git a/ui/app/templates/workspace/projects/project/app/build.hbs b/ui/app/templates/workspace/projects/project/app/build.hbs index 7f80f04e226..ac59258e220 100644 --- a/ui/app/templates/workspace/projects/project/app/build.hbs +++ b/ui/app/templates/workspace/projects/project/app/build.hbs @@ -1,44 +1,44 @@ {{page-title (concat "Build" " v" @model.sequence)}} {{#let (or @model.pushedArtifact @model) as |operation|}} - -
-

- v{{@model.sequence}} -

- - - - - {{t - (concat - "build_status" - ".type-" operation.component.type - ".state-" operation.status.state - ) - }} - {{component-name operation.component.name}} - - - {{#if @model.preload.jobDataSourceRef.git.commit}} - - - - {{/if}} -
-
+ + <:actions> -
-
+ + -
-
- -
-
+
+ <:heading>{{t "page.build.overview.heading"}} + <:body> + + + {{t "page.build.overview.status"}} + + + + {{t + (concat + "build_status" + ".type-" operation.component.type + ".state-" operation.status.state + ) + }} + {{component-name operation.component.name}} + + + + + + +
{{/let}} - +
+ <:heading>{{t "page.deployment.logs.heading"}} + <:body> + + +
diff --git a/ui/app/templates/workspace/projects/project/app/builds.hbs b/ui/app/templates/workspace/projects/project/app/builds.hbs index 1b619eb63cd..9a5fd5267e0 100644 --- a/ui/app/templates/workspace/projects/project/app/builds.hbs +++ b/ui/app/templates/workspace/projects/project/app/builds.hbs @@ -1,6 +1,6 @@ {{page-title (concat @model.application.application "Builds")}} -

{{t "page.builds.title"}}

+

{{t "page.builds.title"}}

    {{#each @model key="id" as |build|}} diff --git a/ui/app/templates/workspace/projects/project/app/deployment.hbs b/ui/app/templates/workspace/projects/project/app/deployment.hbs index 5738570d9f5..8551e6689cd 100644 --- a/ui/app/templates/workspace/projects/project/app/deployment.hbs +++ b/ui/app/templates/workspace/projects/project/app/deployment.hbs @@ -1,22 +1,8 @@ {{page-title (concat "Deployment" " v" @model.sequence)}} {{#if (not-eq this.target.currentRouteName "workspace.projects.project.app.deployment.resource")}} - -
    -

    v{{@model.sequence}}

    - - - Deployed by {{component-name @model.component.name}} - {{date-format-distance-to-now @model.status.startTime.seconds }} - - - {{#if @model.preload.jobDataSourceRef.git.commit}} - - - - {{/if}} -
    -
    + + <:actions>
    -
    -
    + + -
    +
    <:heading>{{t "page.deployment.overview.heading"}} <:body> - + + + {{t "page.deployment.overview.status"}} + + + Deployed by {{component-name @model.component.name}} + {{date-format-distance-to-now @model.status.startTime.seconds }} + + + +
    diff --git a/ui/app/templates/workspace/projects/project/app/deployments.hbs b/ui/app/templates/workspace/projects/project/app/deployments.hbs index 45379885c2f..a5ef49efa3e 100644 --- a/ui/app/templates/workspace/projects/project/app/deployments.hbs +++ b/ui/app/templates/workspace/projects/project/app/deployments.hbs @@ -1,8 +1,6 @@ {{page-title (concat @model.application.application "Deployments")}} -

    - {{t "page.deployments.title"}} -

    +

    {{t "page.deployments.title"}}

      {{#each this.deploymentsByGeneration key="generationID" as |group|}} diff --git a/ui/app/templates/workspace/projects/project/app/release.hbs b/ui/app/templates/workspace/projects/project/app/release.hbs index 2c5a24a2773..e99882afd3a 100644 --- a/ui/app/templates/workspace/projects/project/app/release.hbs +++ b/ui/app/templates/workspace/projects/project/app/release.hbs @@ -1,45 +1,33 @@ {{page-title (concat "Release" " v" @model.sequence)}} {{#if (not-eq this.target.currentRouteName "workspace.projects.project.app.release.resource")}} - -
      - {{! TODO(jgwhite): Make this a real

      }} -

      v{{@model.sequence}}

      - - - Released on {{component-name @model.component.name}} - {{date-format-distance-to-now @model.status.startTime.seconds }} - - {{#if @model.preload.jobDataSourceRef.git.commit}} - - - - {{/if}} -
      -
      + + <:actions> {{#if @isLatest}} - + {{/if}} -
      -
      + + - - {{!-- todo(pearkes): API doesn't return this object but just a string of it, so wait for that to be fixed --}} - {{#if @model.deployment }} -
      - - Released deployment - v{{@model.deployment.sequence}} - {{@model.deployment.id}} - - -
      - {{/if}} -
      +
      + <:heading>{{t "page.release.overview.heading"}} + <:body> + + + {{t "page.release.overview.status"}} + + + Released on {{component-name @model.component.name}} + {{date-format-distance-to-now @model.status.startTime.seconds}} + + + + + +
      {{#if @model.statusReport.resourcesList.length}}
      diff --git a/ui/app/templates/workspace/projects/project/app/releases.hbs b/ui/app/templates/workspace/projects/project/app/releases.hbs index 5dc5e0acd9b..9fb352f0499 100644 --- a/ui/app/templates/workspace/projects/project/app/releases.hbs +++ b/ui/app/templates/workspace/projects/project/app/releases.hbs @@ -1,6 +1,6 @@ {{page-title (concat @model.application.application "Releases")}} -

      {{t "page.releases.title"}}

      +

      {{t "page.releases.title"}}

        {{#each @model key="id" as |release releaseIndex|}} diff --git a/ui/tests/integration/components/panel-header-test.ts b/ui/tests/integration/components/panel-header-test.ts new file mode 100644 index 00000000000..22c63298a4d --- /dev/null +++ b/ui/tests/integration/components/panel-header-test.ts @@ -0,0 +1,35 @@ +import { module, test } from 'qunit'; +import { setupRenderingTest } from 'ember-qunit'; +import { render } from '@ember/test-helpers'; +import hbs from 'htmlbars-inline-precompile'; + +module('Integration | Component | panel-header', function (hooks) { + setupRenderingTest(hooks); + + test('it renders an empty component when params not passed', async function (assert) { + await render(hbs``); + + assert.dom('[data-test-panel-header]').exists(); + assert.equal(this.element?.textContent?.trim(), ''); + }); + + test('it renders an empty component when params passed', async function (assert) { + await render(hbs` + + `); + + assert.dom('[data-test-panel-header]').exists(); + assert.dom('[data-test-panel-header]').containsText('Build'); + assert.dom('[data-test-panel-header]').containsText('v3'); + }); + + test('it does not renders empty badge when sequence param missing', async function (assert) { + await render(hbs` + + `); + + assert.dom('[data-test-panel-header]').exists(); + assert.dom('[data-test-panel-header]').containsText('Build'); + assert.dom('[data-test-panel-header]').doesNotContainText('v'); + }); +}); diff --git a/ui/translations/en-us.yaml b/ui/translations/en-us.yaml index 8427f2c5df8..34271e50540 100644 --- a/ui/translations/en-us.yaml +++ b/ui/translations/en-us.yaml @@ -17,8 +17,20 @@ product: name: 'Waypoint' page: + artifact: + overview: + image: 'Image' + health-check: 'Health' + re-run-health-check: 'Re-run' + unavailable: 'Currently unavailable' + commit: 'Commit' builds: title: 'Builds' + build: + title: 'Build' + overview: + heading: 'Overview' + status: 'Status' deployments: title: 'Deployments' destroyed_label: 'Destroyed' @@ -31,26 +43,30 @@ page: 2: 'Deployed by ' # SUCCESS 3: 'Failed to deploy by ' # ERROR deployment: + title: 'Deployment' resources: heading: Resources deployment-table-caption: Resources created by this deployment release-table-caption-prefix: Resources created by Release overview: - heading: Overview - image: Image - health-check: Health - re-run-health-check: Re-run - unavailable: Currently unavailable + heading: 'Overview' + status: 'Status' logs: heading: Deployment Logs releases: title: 'Releases' release: + title: 'Release' resources: heading: Resources table-caption: Resources created by this release + overview: + heading: 'Overview' + status: 'Status' logs: heading: Release Logs + unavailable: + title: '' form: project_new: