From 541933a03ac751f5e39a1cc357c6595073881e36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Mon, 23 Nov 2020 15:40:30 +0100 Subject: [PATCH] Show last commit of branch in ui --- scm-ui/ui-types/src/Branches.ts | 1 + scm-ui/ui-webapp/public/locales/de/repos.json | 3 +- scm-ui/ui-webapp/public/locales/en/repos.json | 3 +- .../branches/components/BranchDetail.tsx | 30 +++++++++++++++++-- .../repos/branches/components/BranchRow.tsx | 11 ++++++- .../sonia/scm/api/v2/resources/BranchDto.java | 10 +++++-- .../v2/resources/BranchToBranchDtoMapper.java | 9 +++++- 7 files changed, 58 insertions(+), 9 deletions(-) diff --git a/scm-ui/ui-types/src/Branches.ts b/scm-ui/ui-types/src/Branches.ts index 87eb5af3dc..de19f5fd16 100644 --- a/scm-ui/ui-types/src/Branches.ts +++ b/scm-ui/ui-types/src/Branches.ts @@ -28,6 +28,7 @@ export type Branch = { name: string; revision: string; defaultBranch?: boolean; + lastCommitDate?: string; _links: Links; }; diff --git a/scm-ui/ui-webapp/public/locales/de/repos.json b/scm-ui/ui-webapp/public/locales/de/repos.json index 6f658daeda..1315d6e1bd 100644 --- a/scm-ui/ui-webapp/public/locales/de/repos.json +++ b/scm-ui/ui-webapp/public/locales/de/repos.json @@ -64,7 +64,8 @@ "createButton": "Branch erstellen" }, "table": { - "branches": "Branches" + "branches": "Branches", + "lastCommit": "Letzter Commit" }, "create": { "title": "Branch erstellen", diff --git a/scm-ui/ui-webapp/public/locales/en/repos.json b/scm-ui/ui-webapp/public/locales/en/repos.json index c126c3c7a1..cb384e0dd3 100644 --- a/scm-ui/ui-webapp/public/locales/en/repos.json +++ b/scm-ui/ui-webapp/public/locales/en/repos.json @@ -64,7 +64,8 @@ "createButton": "Create Branch" }, "table": { - "branches": "Branches" + "branches": "Branches", + "lastCommit": "Last commit" }, "create": { "title": "Create Branch", diff --git a/scm-ui/ui-webapp/src/repos/branches/components/BranchDetail.tsx b/scm-ui/ui-webapp/src/repos/branches/components/BranchDetail.tsx index 42bfd781b1..224187401f 100644 --- a/scm-ui/ui-webapp/src/repos/branches/components/BranchDetail.tsx +++ b/scm-ui/ui-webapp/src/repos/branches/components/BranchDetail.tsx @@ -26,21 +26,45 @@ import { Branch, Repository } from "@scm-manager/ui-types"; import { WithTranslation, withTranslation } from "react-i18next"; import BranchButtonGroup from "./BranchButtonGroup"; import DefaultBranchTag from "./DefaultBranchTag"; +import { DateFromNow } from "@scm-manager/ui-components"; +import styled from "styled-components"; type Props = WithTranslation & { repository: Repository; branch: Branch; }; +const FlexRow = styled.div` + display: flex; + align-items: center; + flex-wrap: wrap; +`; + +const Created = styled.div` + margin-left: 0.5rem; + font-size: 0.8rem; +`; + +const Label = styled.strong` + margin-right: 0.3rem; +`; + +const Date = styled(DateFromNow)` + font-size: 0.8rem; +`; + class BranchDetail extends React.Component { render() { const { repository, branch, t } = this.props; return (
-
- {t("branch.name")} {branch.name} -
+ + {branch.name} + + {t("tags.overview.created")} + +
diff --git a/scm-ui/ui-webapp/src/repos/branches/components/BranchRow.tsx b/scm-ui/ui-webapp/src/repos/branches/components/BranchRow.tsx index 1acaa78159..b6dcd2e51e 100644 --- a/scm-ui/ui-webapp/src/repos/branches/components/BranchRow.tsx +++ b/scm-ui/ui-webapp/src/repos/branches/components/BranchRow.tsx @@ -25,8 +25,9 @@ import React, { FC } from "react"; import { Link as ReactLink } from "react-router-dom"; import { Branch, Link } from "@scm-manager/ui-types"; import DefaultBranchTag from "./DefaultBranchTag"; -import { Icon } from "@scm-manager/ui-components"; +import { DateFromNow, Icon } from "@scm-manager/ui-components"; import { useTranslation } from "react-i18next"; +import styled from "styled-components"; type Props = { baseUrl: string; @@ -34,6 +35,11 @@ type Props = { onDelete: (branch: Branch) => void; }; +const Created = styled.span` + margin-left: 1rem; + font-size: 0.8rem; +`; + const BranchRow: FC = ({ baseUrl, branch, onDelete }) => { const to = `${baseUrl}/${encodeURIComponent(branch.name)}/info`; const [t] = useTranslation("repos"); @@ -56,6 +62,9 @@ const BranchRow: FC = ({ baseUrl, branch, onDelete }) => { {branch.name} + + {t("branches.table.lastCommit")} + {deleteButton} diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchDto.java index 4825291c1b..5f75fa5cd2 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchDto.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchDto.java @@ -24,6 +24,7 @@ package sonia.scm.api.v2.resources; +import com.fasterxml.jackson.annotation.JsonInclude; import de.otto.edison.hal.Embedded; import de.otto.edison.hal.HalRepresentation; import de.otto.edison.hal.Links; @@ -31,11 +32,14 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import org.hibernate.validator.constraints.Length; +import sonia.scm.repository.Branch; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.Pattern; -import static sonia.scm.repository.Branch.VALID_BRANCH_NAMES; +import java.time.Instant; + +import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL; @Getter @Setter @@ -45,10 +49,12 @@ public class BranchDto extends HalRepresentation { @NotEmpty @Length(min = 1, max = 100) - @Pattern(regexp = VALID_BRANCH_NAMES) + @Pattern(regexp = Branch.VALID_BRANCH_NAMES) private String name; private String revision; private boolean defaultBranch; + @JsonInclude(NON_NULL) + private Instant lastCommitDate; BranchDto(Links links, Embedded embedded) { super(links, embedded); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchToBranchDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchToBranchDtoMapper.java index f82c434b3d..f3860f5708 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchToBranchDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchToBranchDtoMapper.java @@ -38,11 +38,14 @@ import sonia.scm.web.EdisonHalAppender; import javax.inject.Inject; +import java.time.Instant; +import java.util.Optional; + import static de.otto.edison.hal.Link.linkBuilder; import static de.otto.edison.hal.Links.linkingTo; @Mapper -public abstract class BranchToBranchDtoMapper extends HalAppenderMapper { +public abstract class BranchToBranchDtoMapper extends HalAppenderMapper implements InstantAttributeMapper { @Inject private ResourceLinks resourceLinks; @@ -68,4 +71,8 @@ public abstract class BranchToBranchDtoMapper extends HalAppenderMapper { return new BranchDto(linksBuilder.build(), embeddedBuilder.build()); } + + Instant mapOptionalTime(Optional date) { + return date.map(this::mapTime).orElse(null); + } }