From 1f38924820ba45afe8afb837d15d094ad75c6152 Mon Sep 17 00:00:00 2001 From: sarah olimpia Date: Fri, 15 May 2020 20:50:02 -0700 Subject: [PATCH] feat(ui): streamline transaction formatting (#373) Because we can pull up transaction details at any time, the `Transaction` screen should be able to figure out what it needs to display regardless of its parent. * update `formatSubject` to work for all currently-supported messages * change `registrar` to `domain` * tests Part of #347 *** * transaction component fetches its own subject details * starting to work on payer * registration no longer has to format subject * fix up existing tests; add new ones for org reg * transaction tests in add member & user reg flows * fixes tests * fetch avatar in script tag within transaction --- .../integration/org_member_addition.spec.js | 61 +++--- cypress/integration/org_registration.spec.js | 124 ++++++++----- .../integration/project_registration.spec.js | 28 +-- cypress/integration/user_registration.spec.js | 173 +++++++++++------- ui/App.svelte | 4 +- ui/DesignSystem/Component/Transaction.svelte | 47 +++-- .../Component/Transaction/Accordion.svelte | 3 +- ui/DesignSystem/Primitive/Avatar.svelte | 3 +- ui/Screen/DesignSystemGuide.svelte | 2 +- ui/Screen/Org/MemberRegistration.svelte | 58 ++---- ui/Screen/OrgRegistration.svelte | 60 +++--- ui/Screen/Profile/Projects.svelte | 7 +- ui/Screen/Project.svelte | 4 +- ui/Screen/ProjectRegistration.svelte | 59 +++--- .../RegistrationDetailsStep.svelte | 39 ++-- ui/Screen/TransactionDetails.svelte | 8 +- .../SubmitRegistrationStep.svelte | 3 +- ui/src/avatar.ts | 2 +- ui/src/org.ts | 36 ++-- ui/src/path.ts | 8 +- ui/src/project.ts | 5 + ui/src/transaction.ts | 92 +++++++--- ui/src/user.ts | 1 - 23 files changed, 471 insertions(+), 356 deletions(-) diff --git a/cypress/integration/org_member_addition.spec.js b/cypress/integration/org_member_addition.spec.js index f1693decc8..6cb5760b21 100644 --- a/cypress/integration/org_member_addition.spec.js +++ b/cypress/integration/org_member_addition.spec.js @@ -17,7 +17,7 @@ context("add member to org", () => { context("navigation", () => { it("can be closed by pressing cancel", () => { cy.pick("add-member-modal").contains("Register a member"); - cy.pick("add-member-modal", "cancel-button").click(); + cy.pick("cancel-button").click(); cy.pick("org-screen").should("exist"); }); @@ -29,18 +29,18 @@ context("add member to org", () => { it("can be traversed with navigation buttons", () => { // form -> tx confirmation - cy.pick("add-member-modal", "name-input").type("coolname"); - cy.pick("add-member-modal", "submit-button").click(); - cy.pick("add-member-modal", "summary").should("exist"); + cy.pick("input").type("coolname"); + cy.pick("submit-button").click(); + cy.pick("summary").should("exist"); // tx confirmation -> form - cy.pick("add-member-modal", "cancel-button").click(); - cy.pick("add-member-modal", "name-input").should("exist"); + cy.pick("cancel-button").click(); + cy.pick("input").should("exist"); // form -> tx confirmation -> submit - cy.pick("add-member-modal", "submit-button").click(); - cy.pick("add-member-modal", "summary").should("exist"); - cy.pick("add-member-modal", "submit-button").click(); + cy.pick("submit-button").click(); + cy.pick("summary").should("exist"); + cy.pick("submit-button").click(); cy.pick("org-screen").should("exist"); }); }); @@ -48,26 +48,43 @@ context("add member to org", () => { context("validations", () => { it("prevents the user from adding an invalid user", () => { // no empty input - cy.pick("add-member-modal", "name-input").type("aname"); - cy.pick("add-member-modal", "name-input").clear(); - cy.pick("add-member-modal").contains("Member name is required"); - cy.pick("add-member-modal", "submit-button").should("be.disabled"); + cy.pick("input").type("aname"); + cy.pick("input").clear(); + cy.pick("add-member-modal").contains("Member handle is required"); + cy.pick("submit-button").should("be.disabled"); // no non-existing users - cy.pick("add-member-modal", "name-input").type("aname"); + cy.pick("input").type("aname"); cy.pick("add-member-modal").contains("Cannot find this user"); - cy.pick("add-member-modal", "submit-button").should("be.disabled"); + cy.pick("submit-button").should("be.disabled"); }); }); - context("aesthetics", () => { - it("shows avatar when handle exists and hides otherwise", () => { - cy.pick("add-member-modal", "name-input").clear(); - cy.pick("add-member-modal", "name-input").type("sickhandle"); - cy.pick("add-member-modal", "avatar").should("be.visible"); + context("transaction", () => { + it("shows correct transaction details for confirmation", () => { + cy.pick("input").type("coolname"); + cy.pick("submit-button").click(); - cy.pick("add-member-modal", "name-input").clear(); - cy.pick("add-member-modal", "avatar").should("not.be.visible"); + cy.pick("message").contains("Org member registration"); + cy.pick("subject").contains("coolname"); + }); + + // TODO(sos): add actual transaction details check once we can make this tx + it.skip("submits correct transaction details to proxy", () => { + cy.pick("input").type("coolname"); + cy.pick("submit-button").click(); + cy.pick("submit-button").click(); + + cy.pick("transaction-center").click(); + + // pick most recent transaction + cy.pick("accordion", "cards", "card").last().click(); + cy.pick("summary", "message").contains("Org member registration"); + cy.pick("summary", "subject").contains("coolname"); + cy.pick("summary", "subject-avatar", "emoji").should( + "have.class", + "circle" + ); }); }); }); diff --git a/cypress/integration/org_registration.spec.js b/cypress/integration/org_registration.spec.js index 6eb2ad1ac0..2de2ded3a5 100644 --- a/cypress/integration/org_registration.spec.js +++ b/cypress/integration/org_registration.spec.js @@ -1,9 +1,10 @@ context("org registration", () => { beforeEach(() => { - cy.nukeRegistryState(); - cy.nukeSessionState(); + cy.nukeAllState(); + cy.nukeCache(); cy.createIdentity(); cy.registerUser(); + cy.createProjectWithFixture(); cy.visit("public/index.html"); cy.pick("sidebar", "add-org-button").click(); @@ -12,7 +13,7 @@ context("org registration", () => { context("navigation", () => { it("can be closed by pressing cancel", () => { cy.pick("org-reg-modal").contains("Register an org"); - cy.pick("org-reg-modal", "cancel-button").click(); + cy.pick("cancel-button").click(); cy.pick("profile-screen").should("exist"); }); @@ -24,86 +25,121 @@ context("org registration", () => { it("can be traversed with navigation buttons", () => { // form -> tx confirmation - cy.pick("org-reg-modal", "name-input").type("coolname"); - cy.pick("org-reg-modal", "submit-button").click(); - cy.pick("org-reg-modal", "summary").should("exist"); + cy.pick("input").type("coolname"); + cy.pick("submit-button").click(); + cy.pick("summary").should("exist"); // tx confirmation -> form - cy.pick("org-reg-modal", "cancel-button").click(); - cy.pick("org-reg-modal", "name-input").should("exist"); + cy.pick("cancel-button").click(); + cy.pick("input").should("exist"); // form -> tx confirmation -> submit - cy.pick("org-reg-modal", "submit-button").click(); - cy.pick("org-reg-modal", "summary").should("exist"); - cy.pick("org-reg-modal", "submit-button").click(); + cy.pick("submit-button").click(); + cy.pick("summary").should("exist"); + cy.pick("submit-button").click(); cy.pick("profile-screen").should("exist"); }); }); context("validations", () => { - it("prevents the user from registering an invalid org name", () => { + it("prevents the user from registering an invalid org id", () => { // no empty input - cy.pick("org-reg-modal", "name-input").type("a_name"); - cy.pick("org-reg-modal", "name-input").clear(); - cy.pick("org-reg-modal").contains("Org name is required"); - cy.pick("org-reg-modal", "submit-button").should("be.disabled"); + cy.pick("input").type("a_name"); + cy.pick("input").clear(); + cy.pick("org-reg-modal").contains("Org id is required"); + cy.pick("submit-button").should("be.disabled"); // no spaces - cy.pick("org-reg-modal", "name-input").type("no spaces"); + cy.pick("input").type("no spaces"); cy.pick("org-reg-modal").contains( - "Org name should match [a-z0-9][a-z0-9_-]+" + "Org id should match [a-z0-9][a-z0-9_-]+" ); - cy.pick("org-reg-modal", "submit-button").should("be.disabled"); + cy.pick("submit-button").should("be.disabled"); // no special characters - cy.pick("org-reg-modal", "name-input").clear(); - cy.pick("org-reg-modal", "name-input").type("^^^inVaLiD***"); + cy.pick("input").clear(); + cy.pick("input").type("^^^inVaLiD***"); cy.pick("org-reg-modal").contains( - "Org name should match [a-z0-9][a-z0-9_-]+" + "Org id should match [a-z0-9][a-z0-9_-]+" ); - cy.pick("org-reg-modal", "submit-button").should("be.disabled"); + cy.pick("submit-button").should("be.disabled"); // no starting with an underscore or dash - cy.pick("org-reg-modal", "name-input").clear(); - cy.pick("org-reg-modal", "name-input").type("_nVaLiD"); + cy.pick("input").clear(); + cy.pick("input").type("_nVaLiD"); cy.pick("org-reg-modal").contains( - "Org name should match [a-z0-9][a-z0-9_-]+" + "Org id should match [a-z0-9][a-z0-9_-]+" ); - cy.pick("org-reg-modal", "submit-button").should("be.disabled"); + cy.pick("submit-button").should("be.disabled"); - cy.pick("org-reg-modal", "name-input").clear(); - cy.pick("org-reg-modal", "name-input").type("-alsoInVaLiD"); + cy.pick("input").clear(); + cy.pick("input").type("-alsoInVaLiD"); cy.pick("org-reg-modal").contains( - "Org name should match [a-z0-9][a-z0-9_-]+" + "Org id should match [a-z0-9][a-z0-9_-]+" ); - cy.pick("org-reg-modal", "submit-button").should("be.disabled"); + cy.pick("submit-button").should("be.disabled"); // must meet minimum length - cy.pick("org-reg-modal", "name-input").clear(); - cy.pick("org-reg-modal", "name-input").type("x"); + cy.pick("input").clear(); + cy.pick("input").type("x"); cy.pick("org-reg-modal").contains( - "Org name should match [a-z0-9][a-z0-9_-]+" + "Org id should match [a-z0-9][a-z0-9_-]+" ); - cy.pick("org-reg-modal", "submit-button").should("be.disabled"); + cy.pick("submit-button").should("be.disabled"); }); - it("prevents the user from registering an unavailable org name", () => { + it("prevents the user from registering an unavailable org id", () => { cy.registerOrg("coolname"); - cy.pick("org-reg-modal", "name-input").type("coolname"); - cy.pick("org-reg-modal").contains("Sorry, this name is already taken"); - cy.pick("org-reg-modal", "submit-button").should("be.disabled"); + cy.pick("org-reg-modal", "input").type("coolname"); + cy.pick("org-reg-modal").contains("Sorry, this id is already taken"); + cy.pick("submit-button").should("be.disabled"); }); }); context("aesthetics", () => { it("shows avatar when handle exists and hides otherwise", () => { - cy.pick("org-reg-modal", "name-input").clear(); - cy.pick("org-reg-modal", "name-input").type("sick_org"); - cy.pick("org-reg-modal", "avatar").should("be.visible"); + cy.pick("input").clear(); + cy.pick("input").type("sick_org"); + cy.pick("avatar").should("be.visible"); - cy.pick("org-reg-modal", "name-input").clear(); - cy.pick("org-reg-modal", "avatar").should("not.be.visible"); + cy.pick("input").clear(); + cy.pick("avatar").should("not.be.visible"); + }); + }); + + context("transaction", () => { + // TODO(sos): add tests for tx costs/wallet when it makes sense to do so + it("shows correct transaction details for confirmation", () => { + cy.pick("input").type("mariposa"); + cy.pick("submit-button").click(); + + cy.pick("message").contains("Org registration"); + cy.pick("subject").contains("mariposa"); + cy.pick("subject-avatar", "emoji").should("have.class", "square"); + }); + + it("submits correct transaction details to proxy", () => { + cy.pick("input").type("mariposa"); + cy.pick("submit-button").click(); + cy.pick("submit-button").click(); + + cy.pick("transaction-center").click(); + + // pick most recent transaction + cy.pick("card").first().click(); + cy.pick("summary", "message").contains("Org registration"); + cy.pick("summary", "subject").contains("mariposa"); + cy.pick("summary", "subject-avatar", "emoji").should( + "have.class", + "square" + ); + cy.pick("subject", "emoji").find("img").should("have.attr", "alt", "🗳"); + cy.pick("subject", "emoji").should( + "have.css", + "background-color", + "rgb(186, 38, 114)" + ); }); }); }); diff --git a/cypress/integration/project_registration.spec.js b/cypress/integration/project_registration.spec.js index c71bb2ac9c..87cfca2601 100644 --- a/cypress/integration/project_registration.spec.js +++ b/cypress/integration/project_registration.spec.js @@ -51,8 +51,8 @@ context("project registration", () => { // The project is pre-selected to what we chose on the previous screen cy.pick("project-dropdown").contains(project2.name).should("be.visible"); - // Registrar is pre-selected to our own identity - cy.pick("registrar-dropdown").contains(user).should("be.visible"); + // Domain is pre-selected to our own identity + cy.pick("domain-dropdown").contains(user).should("be.visible"); // The project name is pre-filled in the to-be-registered handle field cy.pick("name-input").should("have.value", project2.name); }); @@ -68,8 +68,8 @@ context("project registration", () => { // The project is pre-selected to what we chose on the previous screen cy.pick("project-dropdown").contains(project2.name).should("be.visible"); - // Registrar is pre-selected to our own identity - cy.pick("registrar-dropdown").contains(user).should("be.visible"); + // Domain is pre-selected to our own identity + cy.pick("domain-dropdown").contains(user).should("be.visible"); // The project name is pre-filled in the to-be-registered handle field cy.pick("name-input").should("have.value", project2.name); }); @@ -83,8 +83,8 @@ context("project registration", () => { cy.pick("project-dropdown") .contains("Select project to register") .should("be.visible"); - // Registrar is pre-selected to the org we chose - cy.pick("registrar-dropdown").contains(org2).should("be.visible"); + // Domain is pre-selected to the org we chose + cy.pick("domain-dropdown").contains(org2).should("be.visible"); cy.pick("name-input").should("have.value", ""); }); @@ -98,8 +98,8 @@ context("project registration", () => { cy.pick("project-dropdown") .contains("Select project to register") .should("be.visible"); - // Registrar is pre-selected to the org we chose - cy.pick("registrar-dropdown").contains(org1).should("be.visible"); + // Domain is pre-selected to the org we chose + cy.pick("domain-dropdown").contains(org1).should("be.visible"); cy.pick("name-input").should("have.value", ""); }); @@ -131,8 +131,9 @@ context("project registration", () => { }); context("summary screen", () => { + // TODO(sos): test this when we can actually register projects under users context("when registering under a user", () => { - it("shows the selected subject and payer information", () => { + it.skip("shows the selected subject and payer information", () => { cy.pick(`project-list-entry-${project1.name}`, "context-menu").click(); cy.pick(`project-list-entry-${project1.name}`).click(); @@ -159,8 +160,8 @@ context("project registration", () => { cy.pick("project-registration-screen").should("exist"); cy.pick("project-dropdown").click().contains(project1.name).click(); - // Registrar is pre-selected to the org we chose - cy.pick("registrar-dropdown").contains(org1).should("be.visible"); + // Domain is pre-selected to the org we chose + cy.pick("domain-dropdown").contains(org1).should("be.visible"); cy.pick("name-input").should("have.value", project1.name); cy.pick("submit-button").click(); @@ -168,8 +169,9 @@ context("project registration", () => { cy.get('[data-cy="subject-avatar"] img[alt="🥂"]').should("exist"); cy.pick("subject-avatar").contains(`${org1} / ${project1.name}`); - cy.get('[data-cy="payer-avatar"] img[alt="🥂"]').should("exist"); - cy.pick("payer-avatar").contains(org1); + // TODO(sos): test this when we can actually change transaction payer + // cy.get('[data-cy="payer-avatar"] img[alt="🥂"]').should("exist"); + // cy.pick("payer-avatar").contains(org1); }); }); }); diff --git a/cypress/integration/user_registration.spec.js b/cypress/integration/user_registration.spec.js index 409c5c689f..65d21d6576 100644 --- a/cypress/integration/user_registration.spec.js +++ b/cypress/integration/user_registration.spec.js @@ -1,96 +1,135 @@ context("user registration", () => { + before(() => { + cy.nukeAllState(); + cy.nukeCache(); + cy.registerUser(); + cy.createProjectWithFixture(); + }); + beforeEach(() => { - cy.nukeRegistryState(); cy.nukeSessionState(); cy.createIdentity(); cy.visit("public/index.html"); - cy.get('[data-cy="profile-context-menu"]').click(); - cy.get('[data-cy="dropdown-menu"] [data-cy="register-handle"]').click(); + cy.pick("profile-context-menu").click(); + cy.pick("dropdown-menu", "register-handle").click(); }); context("modal navigation", () => { it("can be closed by pressing cancel", () => { - cy.get('[data-cy="page"] [data-cy="register-user"]').should("exist"); - cy.get('[data-cy="register-user"] [data-cy="cancel-button"]').click(); - cy.get('[data-cy="profile-screen"]').should("exist"); + cy.pick("page", "register-user").should("exist"); + cy.pick("register-user", "cancel-button").click(); + cy.pick("profile-screen").should("exist"); }); it("can be closed by pressing escape key", () => { - cy.get('[data-cy="page"] [data-cy="register-user"]').should("exist"); + cy.pick("page", "register-user").should("exist"); cy.get("body").type("{esc}"); - cy.get('[data-cy="profile-screen"]').should("exist"); + cy.pick("profile-screen").should("exist"); }); // navigation between pick handle (1) and submit tx (2) steps it("moves through the views by pressing navigation buttons", () => { // 1 -> 2 - cy.get('[data-cy="register-user"] [data-cy="handle"]').should("exist"); - cy.get('[data-cy="page"] [data-cy="handle"]').type("testy"); - cy.get('[data-cy="register-user"] [data-cy="next-button"]').click(); - cy.get('[data-cy="register-user"] [data-cy="summary"]').should("exist"); + cy.pick("handle").should("exist"); + cy.pick("page", "handle").type("testy"); + cy.pick("next-button").click(); + cy.pick("summary").should("exist"); // 2 -> 1 - cy.get('[data-cy="register-user"] [data-cy="back-button"]').click(); - cy.get('[data-cy="register-user"] [data-cy="handle"]').should("exist"); + cy.pick("back-button").click(); + cy.pick("handle").should("exist"); // 1 -> 2 - cy.get('[data-cy="register-user"] [data-cy="next-button"]').click(); - cy.get('[data-cy="register-user"] [data-cy="summary"]').should("exist"); + cy.pick("next-button").click(); + cy.pick("summary").should("exist"); // 2 -> close modal - cy.get('[data-cy="register-user"] [data-cy="submit-button"]').click(); - cy.get('[data-cy="profile-screen"]').should("exist"); + cy.pick("submit-button").click(); + cy.pick("profile-screen").should("exist"); }); }); context("validations", () => { - context("handle", () => { - it("prevents the user from registering an invalid handle", () => { - // shows a validation message when handle is not present - cy.get('[data-cy="page"] [data-cy="handle"]').clear(); - cy.get('[data-cy="page"]').contains("Handle is required"); - - // shows a validation message when handle contains invalid characters - // spaces are not allowed - cy.get('[data-cy="page"] [data-cy="handle"]').type("no spaces"); - cy.get('[data-cy="page"]').contains( - "Handle should match ^[a-z0-9][a-z0-9_-]+$" - ); - - // special characters are disallowed - cy.get('[data-cy="page"] [data-cy="handle"]').clear(); - cy.get('[data-cy="page"] [data-cy="handle"]').type("$bad"); - cy.get('[data-cy="page"]').contains( - "Handle should match ^[a-z0-9][a-z0-9_-]+$" - ); - - // can't start with an underscore - cy.get('[data-cy="page"] [data-cy="handle"]').clear(); - cy.get('[data-cy="page"] [data-cy="handle"]').type("_nein"); - cy.get('[data-cy="page"]').contains( - "Handle should match ^[a-z0-9][a-z0-9_-]+$" - ); - - // can't start with a dash - cy.get('[data-cy="page"] [data-cy="handle"]').clear(); - cy.get('[data-cy="page"] [data-cy="handle"]').type("-nope"); - cy.get('[data-cy="page"]').contains( - "Handle should match ^[a-z0-9][a-z0-9_-]+$" - ); - - // has to be at least two characters long - cy.get('[data-cy="page"] [data-cy="handle"]').clear(); - cy.get('[data-cy="page"] [data-cy="handle"]').type("x"); - cy.get('[data-cy="page"]').contains( - "Handle should match ^[a-z0-9][a-z0-9_-]+$" - ); - }); - - it("prevents the user from registering an unavailable handle", () => { - cy.registerUser("taken"); - - cy.get('[data-cy="page"] [data-cy="handle"]').clear(); - cy.get('[data-cy="page"] [data-cy="handle"]').type("taken"); - cy.get('[data-cy="page"]').contains("Handle already taken"); - }); + it("prevents the user from registering an invalid handle", () => { + // shows a validation message when handle is not present + cy.pick("handle").clear(); + cy.pick("page").contains("Handle is required"); + + // shows a validation message when handle contains invalid characters + // spaces are not allowed + cy.pick("handle").type("no spaces"); + cy.pick("page").contains("Handle should match ^[a-z0-9][a-z0-9_-]+$"); + + // special characters are disallowed + cy.pick("handle").clear(); + cy.pick("handle").type("$bad"); + cy.pick("page").contains("Handle should match ^[a-z0-9][a-z0-9_-]+$"); + + // can't start with an underscore + cy.pick("handle").clear(); + cy.pick("handle").type("_nein"); + cy.pick("page").contains("Handle should match ^[a-z0-9][a-z0-9_-]+$"); + + // can't start with a dash + cy.pick("handle").clear(); + cy.pick("handle").type("-nope"); + cy.pick("page").contains("Handle should match ^[a-z0-9][a-z0-9_-]+$"); + + // has to be at least two characters long + cy.pick("handle").clear(); + cy.pick("handle").type("x"); + cy.pick("page").contains("Handle should match ^[a-z0-9][a-z0-9_-]+$"); + }); + + it("prevents the user from registering an unavailable handle", () => { + cy.pick("handle").clear(); + cy.pick("handle").type("nope"); + cy.pick("page").contains("Handle already taken"); + }); + }); + + context("transaction", () => { + before(() => { + // Clear everything again so transaction center is empty + cy.nukeAllState(); + cy.nukeCache(); + cy.createProjectWithFixture(); + }); + + it("shows the correct transaction details for confirmation", () => { + cy.pick("next-button").click(); + + cy.pick("message").contains("User registration"); + cy.pick("subject").contains("secretariat"); + + cy.pick("subject-avatar", "emoji").should("have.class", "circle"); + cy.pick("subject", "emoji").find("img").should("have.attr", "alt", "🙊"); + cy.pick("subject", "emoji").should( + "have.css", + "background-color", + "rgb(185, 118, 211)" + ); + }); + + it("submits correct transaction details to proxy", () => { + cy.pick("next-button").click(); + cy.pick("submit-button").click(); + + cy.pick("transaction-center").click(); + + // // pick most recent transaction + cy.pick("card").last().click(); + cy.pick("summary", "message").contains("User registration"); + cy.pick("summary", "subject").contains("secretariat"); + + cy.pick("summary", "subject-avatar", "emoji").should( + "have.class", + "circle" + ); + cy.pick("subject", "emoji").find("img").should("have.attr", "alt", "🙊"); + cy.pick("subject", "emoji").should( + "have.css", + "background-color", + "rgb(185, 118, 211)" + ); }); }); }); diff --git a/ui/App.svelte b/ui/App.svelte index 22d7887c6c..4cdfd28e46 100644 --- a/ui/App.svelte +++ b/ui/App.svelte @@ -40,8 +40,8 @@ "/orgs/:id": Org, "/orgs/:id/*": Org, "/projects/new": ProjectCreation, - "/projects/register/:registrarId": ProjectRegistration, - "/projects/:projectId/register/:registrarId": ProjectRegistration, + "/projects/register/:domainId": ProjectRegistration, + "/projects/:projectId/register/:domainId": ProjectRegistration, "/projects/:id/*": Project, "/design-system-guide": DesignSystemGuide, "/help": Help, diff --git a/ui/DesignSystem/Component/Transaction.svelte b/ui/DesignSystem/Component/Transaction.svelte index a5c32b0060..c9205a8316 100644 --- a/ui/DesignSystem/Component/Transaction.svelte +++ b/ui/DesignSystem/Component/Transaction.svelte @@ -2,7 +2,9 @@ import { formatMessage, formatStake, - Variant, + formatSubject, + SubjectType, + PayerType, } from "../../src/transaction.ts"; import { @@ -17,25 +19,46 @@ export let transaction = null; export let payer = null; - export let subject = null; + let avatar; + + const subject = formatSubject(transaction.messages[0]); + const subjectAvatarShape = () => { + switch (subject.type) { + case SubjectType.User: + case SubjectType.Member: + case SubjectType.UserProject: + return "circle"; + default: + return "square"; + } + }; + + const updateAvatar = async () => (avatar = await subject.avatarSource); + + $: updateAvatar(); Your transaction + -
+
{formatMessage(transaction.messages[0])}
-
- +
+ {#if avatar} + + {:else} + {subject.name} + {/if}
@@ -100,7 +123,7 @@ title={payer.name} imageUrl={payer.imageUrl} avatarFallback={payer.avatarFallback} - variant={payer.variant === Variant.User ? 'circle' : 'square'} + variant={payer.type === PayerType.User ? 'circle' : 'square'} style="color: var(--color-foreground)" />
diff --git a/ui/DesignSystem/Component/Transaction/Accordion.svelte b/ui/DesignSystem/Component/Transaction/Accordion.svelte index 53b5504434..0b9128692a 100644 --- a/ui/DesignSystem/Component/Transaction/Accordion.svelte +++ b/ui/DesignSystem/Component/Transaction/Accordion.svelte @@ -136,7 +136,8 @@ class="card" on:click={() => { push(path.transactions(transaction.id)); - }}> + }} + data-cy="card">
+ style="background: {fmt(avatarFallback.background)}" + data-cy="emoji"> {@html twemoji.parse(avatarFallback.emoji, { className: `emoji ${size}`, base: '', diff --git a/ui/Screen/DesignSystemGuide.svelte b/ui/Screen/DesignSystemGuide.svelte index f5e7fa6cb8..3026963073 100644 --- a/ui/Screen/DesignSystemGuide.svelte +++ b/ui/Screen/DesignSystemGuide.svelte @@ -610,7 +610,7 @@ diff --git a/ui/Screen/Org/MemberRegistration.svelte b/ui/Screen/Org/MemberRegistration.svelte index 644d38fb05..d8b1e6b440 100644 --- a/ui/Screen/Org/MemberRegistration.svelte +++ b/ui/Screen/Org/MemberRegistration.svelte @@ -1,58 +1,51 @@ @@ -84,7 +63,7 @@ selectedStep={state + 1} dataCy="add-member-modal">
Register a member
- {#if state === RegistrationFlowState.NameSelection} + {#if state === RegistrationFlowState.Preparation} Registering a member will allow them to sign transactions for your org. Only registered users can be added as members. @@ -95,17 +74,8 @@ style="width: 100%;" showSuccessCheck validation={$validation} - {showAvatar} - dataCy="name-input"> -
- -
- - {:else if state === RegistrationFlowState.TransactionConfirmation} + dataCy="input" /> + {:else if state === RegistrationFlowState.Confirmation}
diff --git a/ui/Screen/OrgRegistration.svelte b/ui/Screen/OrgRegistration.svelte index 466900a5b3..67b456c871 100644 --- a/ui/Screen/OrgRegistration.svelte +++ b/ui/Screen/OrgRegistration.svelte @@ -1,19 +1,15 @@