mirror of
https://github.com/go-gitea/gitea.git
synced 2026-08-05 21:23:55 +02:00
Merge branch 'main' into feat-32257-add-comments-unchanged-lines-and-show
This commit is contained in:
@@ -66,7 +66,10 @@
|
||||
@import "./repo/wiki.css";
|
||||
@import "./repo/header.css";
|
||||
@import "./repo/home.css";
|
||||
@import "./repo/home-file-list.css";
|
||||
@import "./repo/reactions.css";
|
||||
@import "./repo/clone.css";
|
||||
@import "./repo/commit-sign.css";
|
||||
|
||||
@import "./editor/fileeditor.css";
|
||||
@import "./editor/combomarkdowneditor.css";
|
||||
|
||||
+4
-494
@@ -101,42 +101,6 @@
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.repository .clone-panel {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.repository.wiki .clone-panel {
|
||||
flex: 0;
|
||||
}
|
||||
|
||||
.repository.wiki .clone-panel input {
|
||||
width: 20ch;
|
||||
}
|
||||
|
||||
.repository .clone-panel #repo-clone-url {
|
||||
border-radius: 0;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.repository .ui.action.input.clone-panel > button + button,
|
||||
.repository .ui.action.input.clone-panel > button + input {
|
||||
margin-left: -1px; /* make the borders overlap to avoid double borders */
|
||||
}
|
||||
|
||||
.repository .clone-panel > button:first-of-type {
|
||||
border-radius: var(--border-radius) 0 0 var(--border-radius) !important;
|
||||
}
|
||||
|
||||
.repository .clone-panel > button:last-of-type {
|
||||
border-radius: 0 var(--border-radius) var(--border-radius) 0 !important;
|
||||
}
|
||||
|
||||
.repository .clone-panel .dropdown .menu {
|
||||
right: 0 !important;
|
||||
left: auto !important;
|
||||
}
|
||||
|
||||
.repository .repo-description {
|
||||
font-size: 16px;
|
||||
margin-bottom: 5px;
|
||||
@@ -177,138 +141,6 @@ td .commit-summary {
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
/* this is what limits the commit table width to a value that works on all viewport sizes */
|
||||
#repo-files-table th:first-of-type {
|
||||
max-width: calc(calc(min(100vw, 1280px)) - 145px - calc(2 * var(--page-margin-x)));
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table thead th {
|
||||
font-weight: var(--font-weight-normal);
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table tbody .svg {
|
||||
margin-left: 3px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table tbody .svg.octicon-reply {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table tbody .svg.octicon-file-directory-fill,
|
||||
.repository.file.list #repo-files-table tbody .svg.octicon-file-submodule {
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table tbody .svg.octicon-file,
|
||||
.repository.file.list #repo-files-table tbody .svg.octicon-file-symlink-file,
|
||||
.repository.file.list #repo-files-table tbody .svg.octicon-file-directory-symlink {
|
||||
color: var(--color-secondary-dark-7);
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table td {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
overflow: initial;
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table td.name {
|
||||
width: 33%;
|
||||
max-width: calc(100vw - 140px);
|
||||
}
|
||||
|
||||
@media (min-width: 1201px) {
|
||||
.repository.file.list #repo-files-table td.name {
|
||||
max-width: 150px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 992px) and (max-width: 1200px) {
|
||||
.repository.file.list #repo-files-table td.name {
|
||||
max-width: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) and (max-width: 991.98px) {
|
||||
.repository.file.list #repo-files-table td.name {
|
||||
max-width: 300px;
|
||||
}
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table td.message {
|
||||
color: var(--color-text-light-1);
|
||||
width: 66%;
|
||||
}
|
||||
|
||||
@media (min-width: 1201px) {
|
||||
.repository.file.list #repo-files-table td.message {
|
||||
max-width: 400px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 992px) and (max-width: 1200px) {
|
||||
.repository.file.list #repo-files-table td.message {
|
||||
max-width: 350px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) and (max-width: 991.98px) {
|
||||
.repository.file.list #repo-files-table td.message {
|
||||
max-width: 250px;
|
||||
}
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table td.age {
|
||||
color: var(--color-text-light-1);
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table td .truncate {
|
||||
display: inline-block;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
width: 100%;
|
||||
padding-top: 8px;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table td a {
|
||||
padding-top: 8px;
|
||||
padding-bottom: 8px;
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table td .at {
|
||||
margin-left: 3px;
|
||||
margin-right: 3px;
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table td > * {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table td.message .isSigned {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table tr:last-of-type td:first-child {
|
||||
border-bottom-left-radius: var(--border-radius);
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table tr:last-of-type td:last-child {
|
||||
border-bottom-right-radius: var(--border-radius);
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table tr:hover {
|
||||
background-color: var(--color-hover);
|
||||
}
|
||||
|
||||
.repository.file.list #repo-files-table tr.has-parent a {
|
||||
display: inline-block;
|
||||
padding-top: 8px;
|
||||
padding-bottom: 8px;
|
||||
width: calc(100% - 1.25rem);
|
||||
}
|
||||
|
||||
.repository.file.list .non-diff-file-content .header .icon {
|
||||
font-size: 1em;
|
||||
}
|
||||
@@ -787,47 +619,6 @@ td .commit-summary {
|
||||
height: 30px !important;
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label {
|
||||
margin: 0;
|
||||
border: 1px solid var(--color-light-border);
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isWarning {
|
||||
border: 1px solid var(--color-red-badge);
|
||||
background: var(--color-red-badge-bg);
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isWarning:hover {
|
||||
background: var(--color-red-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isVerified {
|
||||
border: 1px solid var(--color-green-badge);
|
||||
background: var(--color-green-badge-bg);
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isVerified:hover {
|
||||
background: var(--color-green-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isVerifiedUntrusted {
|
||||
border: 1px solid var(--color-yellow-badge);
|
||||
background: var(--color-yellow-badge-bg);
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isVerifiedUntrusted:hover {
|
||||
background: var(--color-yellow-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isVerifiedUnmatched {
|
||||
border: 1px solid var(--color-orange-badge);
|
||||
background: var(--color-orange-badge-bg);
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isVerifiedUnmatched:hover {
|
||||
background: var(--color-orange-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.repository.view.issue .comment-list .timeline-item.event > .commit-status-link {
|
||||
float: right;
|
||||
margin-right: 8px;
|
||||
@@ -1162,151 +953,6 @@ td .commit-summary {
|
||||
background-color: var(--color-light) !important;
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label,
|
||||
.repository #repo-files-table .sha.label,
|
||||
.repository #repo-file-commit-box .sha.label,
|
||||
.repository #rev-list .sha.label,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label {
|
||||
border: 1px solid var(--color-light-border);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label .detail.icon,
|
||||
.repository #repo-files-table .sha.label .detail.icon,
|
||||
.repository #repo-file-commit-box .sha.label .detail.icon,
|
||||
.repository #rev-list .sha.label .detail.icon,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label .detail.icon {
|
||||
background: var(--color-light);
|
||||
margin: -6px -10px -4px 0;
|
||||
padding: 5px 4px 5px 6px;
|
||||
border-left: 1px solid var(--color-light-border);
|
||||
border-top: 0;
|
||||
border-right: 0;
|
||||
border-bottom: 0;
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label .detail.icon .svg,
|
||||
.repository #repo-files-table .sha.label .detail.icon .svg,
|
||||
.repository #repo-file-commit-box .sha.label .detail.icon .svg,
|
||||
.repository #rev-list .sha.label .detail.icon .svg,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label .detail.icon .svg {
|
||||
margin: 0 0.25em 0 0;
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label .detail.icon > div,
|
||||
.repository #repo-files-table .sha.label .detail.icon > div,
|
||||
.repository #repo-file-commit-box .sha.label .detail.icon > div,
|
||||
.repository #rev-list .sha.label .detail.icon > div,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label .detail.icon > div {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isWarning,
|
||||
.repository #repo-files-table .sha.label.isSigned.isWarning,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isWarning,
|
||||
.repository #rev-list .sha.label.isSigned.isWarning,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isWarning {
|
||||
border: 1px solid var(--color-red-badge);
|
||||
background: var(--color-red-badge-bg);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isWarning .detail.icon,
|
||||
.repository #repo-files-table .sha.label.isSigned.isWarning .detail.icon,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isWarning .detail.icon,
|
||||
.repository #rev-list .sha.label.isSigned.isWarning .detail.icon,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isWarning .detail.icon {
|
||||
border-left: 1px solid var(--color-red-badge);
|
||||
color: var(--color-red-badge);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isWarning:hover,
|
||||
.repository #repo-files-table .sha.label.isSigned.isWarning:hover,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isWarning:hover,
|
||||
.repository #rev-list .sha.label.isSigned.isWarning:hover,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isWarning:hover {
|
||||
background: var(--color-red-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerified,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerified,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerified,
|
||||
.repository #rev-list .sha.label.isSigned.isVerified,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerified {
|
||||
border: 1px solid var(--color-green-badge);
|
||||
background: var(--color-green-badge-bg);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerified .detail.icon,
|
||||
.repository #rev-list .sha.label.isSigned.isVerified .detail.icon,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerified .detail.icon {
|
||||
border-left: 1px solid var(--color-green-badge);
|
||||
color: var(--color-green-badge);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerified:hover,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerified:hover,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerified:hover,
|
||||
.repository #rev-list .sha.label.isSigned.isVerified:hover,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerified:hover {
|
||||
background: var(--color-green-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerifiedUntrusted,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerifiedUntrusted,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerifiedUntrusted,
|
||||
.repository #rev-list .sha.label.isSigned.isVerifiedUntrusted,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerifiedUntrusted {
|
||||
border: 1px solid var(--color-yellow-badge);
|
||||
background: var(--color-yellow-badge-bg);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerifiedUntrusted .detail.icon,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerifiedUntrusted .detail.icon,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerifiedUntrusted .detail.icon,
|
||||
.repository #rev-list .sha.label.isSigned.isVerifiedUntrusted .detail.icon,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerifiedUntrusted .detail.icon {
|
||||
border-left: 1px solid var(--color-yellow-badge);
|
||||
color: var(--color-yellow-badge);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerifiedUntrusted:hover,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerifiedUntrusted:hover,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerifiedUntrusted:hover,
|
||||
.repository #rev-list .sha.label.isSigned.isVerifiedUntrusted:hover,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerifiedUntrusted:hover {
|
||||
background: var(--color-yellow-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerifiedUnmatched,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerifiedUnmatched,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerifiedUnmatched,
|
||||
.repository #rev-list .sha.label.isSigned.isVerifiedUnmatched,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerifiedUnmatched {
|
||||
border: 1px solid var(--color-orange-badge);
|
||||
background: var(--color-orange-badge-bg);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerifiedUnmatched .detail.icon,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerifiedUnmatched .detail.icon,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerifiedUnmatched .detail.icon,
|
||||
.repository #rev-list .sha.label.isSigned.isVerifiedUnmatched .detail.icon,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerifiedUnmatched .detail.icon {
|
||||
border-left: 1px solid var(--color-orange-badge);
|
||||
color: var(--color-orange-badge);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerifiedUnmatched:hover,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerifiedUnmatched:hover,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerifiedUnmatched:hover,
|
||||
.repository #rev-list .sha.label.isSigned.isVerifiedUnmatched:hover,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerifiedUnmatched:hover {
|
||||
background: var(--color-orange-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.repository .data-table {
|
||||
width: 100%;
|
||||
}
|
||||
@@ -1615,14 +1261,6 @@ td .commit-summary {
|
||||
font-weight: var(--font-weight-normal);
|
||||
}
|
||||
|
||||
.repository.quickstart .guide #repo-clone-url {
|
||||
border-radius: 0;
|
||||
padding: 5px 10px;
|
||||
font-size: 1.2em;
|
||||
line-height: 1.4;
|
||||
flex: 1
|
||||
}
|
||||
|
||||
.empty-placeholder {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -1678,92 +1316,6 @@ td .commit-summary {
|
||||
padding-top: 0;
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isWarning {
|
||||
border-left: 1px solid var(--color-error-border);
|
||||
border-right: 1px solid var(--color-error-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isWarning.top,
|
||||
.repository .ui.attached.isSigned.isWarning.message {
|
||||
border-top: 1px solid var(--color-error-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isWarning.message {
|
||||
box-shadow: none;
|
||||
background-color: var(--color-error-bg);
|
||||
color: var(--color-error-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isWarning.message .ui.text {
|
||||
color: var(--color-error-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isWarning:last-child,
|
||||
.repository .ui.attached.isSigned.isWarning.bottom {
|
||||
border-bottom: 1px solid var(--color-error-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerified {
|
||||
border-left: 1px solid var(--color-success-border);
|
||||
border-right: 1px solid var(--color-success-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerified.top,
|
||||
.repository .ui.attached.isSigned.isVerified.message {
|
||||
border-top: 1px solid var(--color-success-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerified.message {
|
||||
box-shadow: none;
|
||||
background-color: var(--color-success-bg);
|
||||
color: var(--color-success-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerified.message .pull-right {
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerified.message .ui.text {
|
||||
color: var(--color-success-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerified:last-child,
|
||||
.repository .ui.attached.isSigned.isVerified.bottom {
|
||||
border-bottom: 1px solid var(--color-success-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched {
|
||||
border-left: 1px solid var(--color-warning-border);
|
||||
border-right: 1px solid var(--color-warning-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted.top,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched.top,
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted.message,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched.message {
|
||||
border-top: 1px solid var(--color-warning-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted.message,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched.message {
|
||||
box-shadow: none;
|
||||
background-color: var(--color-warning-bg);
|
||||
color: var(--color-warning-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted.message .ui.text,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched.message .ui.text {
|
||||
color: var(--color-warning-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted:last-child,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched:last-child,
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted.bottom,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched.bottom {
|
||||
border-bottom: 1px solid var(--color-warning-border);
|
||||
}
|
||||
|
||||
.repository .ui.fluid.action.input .ui.search.action.input {
|
||||
flex: auto;
|
||||
}
|
||||
@@ -1782,7 +1334,7 @@ td .commit-summary {
|
||||
|
||||
.repository .repository-summary .sub-menu .item {
|
||||
flex: 1;
|
||||
height: 30px;
|
||||
height: 33px; /* match search bar height, need to be improved in the future to use some consistent methods */
|
||||
line-height: var(--line-height-default);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -2110,26 +1662,18 @@ td .commit-summary {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.repo-button-row-left,
|
||||
.repo-button-row-right {
|
||||
display: flex;
|
||||
flex: 1;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.repo-button-row-right {
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
@media (max-width: 1200px) {
|
||||
.repository:not(.wiki) .repo-button-row {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
}
|
||||
.repo-button-row-left {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.repo-button-row .button {
|
||||
@@ -2143,16 +1687,6 @@ td .commit-summary {
|
||||
padding-right: 22px !important; /* normal buttons have !important paddings, so we need to override it for dropdown (Add File) icons */
|
||||
}
|
||||
|
||||
.repo-button-row input {
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.repo-button-row-left {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
}
|
||||
|
||||
tbody.commit-list {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
@@ -2178,11 +1712,6 @@ tbody.commit-list {
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
/* but in the repo-files-table we cannot */
|
||||
#repo-files-table .commit-list .message-wrapper {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
@media (max-width: 767.98px) {
|
||||
tr.commit-list {
|
||||
width: 100%;
|
||||
@@ -2578,25 +2107,6 @@ tbody.commit-list {
|
||||
}
|
||||
|
||||
@media (max-width: 767.98px) {
|
||||
.repository.file.list #repo-files-table .entry,
|
||||
.repository.file.list #repo-files-table .commit-list {
|
||||
align-items: center;
|
||||
display: flex !important;
|
||||
padding-top: 4px;
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
.repository.file.list #repo-files-table .entry td.age,
|
||||
.repository.file.list #repo-files-table .commit-list td.age,
|
||||
.repository.file.list #repo-files-table .entry th.age,
|
||||
.repository.file.list #repo-files-table .commit-list th.age {
|
||||
margin-left: auto;
|
||||
}
|
||||
.repository.file.list #repo-files-table .entry td.message,
|
||||
.repository.file.list #repo-files-table .commit-list td.message,
|
||||
.repository.file.list #repo-files-table .entry span.commit-summary,
|
||||
.repository.file.list #repo-files-table .commit-list tr span.commit-summary {
|
||||
display: none !important;
|
||||
}
|
||||
.repository.view.issue .comment-list .timeline,
|
||||
.repository.view.issue .comment-list .timeline-item {
|
||||
margin-left: 0;
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
/* only used by "repo/empty.tmpl" */
|
||||
.clone-buttons-combo {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.clone-buttons-combo input {
|
||||
border-left: none !important;
|
||||
border-radius: 0 !important;
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
/* used by the clone-panel popup */
|
||||
.clone-panel-field,
|
||||
.clone-panel-list {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.clone-panel-tab .item {
|
||||
padding: 5px 10px;
|
||||
background: none;
|
||||
}
|
||||
|
||||
.clone-panel-tab .item.active {
|
||||
border-bottom: 3px solid var(--color-secondary);
|
||||
}
|
||||
|
||||
.clone-panel-tab + .divider {
|
||||
margin: -1px 0 0;
|
||||
}
|
||||
|
||||
.clone-panel-list .item {
|
||||
margin: 5px 0;
|
||||
}
|
||||
@@ -0,0 +1,272 @@
|
||||
|
||||
.repository .ui.attached.isSigned.isWarning {
|
||||
border-left: 1px solid var(--color-error-border);
|
||||
border-right: 1px solid var(--color-error-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isWarning.top,
|
||||
.repository .ui.attached.isSigned.isWarning.message {
|
||||
border-top: 1px solid var(--color-error-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isWarning.message {
|
||||
box-shadow: none;
|
||||
background-color: var(--color-error-bg);
|
||||
color: var(--color-error-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isWarning.message .ui.text {
|
||||
color: var(--color-error-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isWarning:last-child,
|
||||
.repository .ui.attached.isSigned.isWarning.bottom {
|
||||
border-bottom: 1px solid var(--color-error-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerified {
|
||||
border-left: 1px solid var(--color-success-border);
|
||||
border-right: 1px solid var(--color-success-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerified.top,
|
||||
.repository .ui.attached.isSigned.isVerified.message {
|
||||
border-top: 1px solid var(--color-success-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerified.message {
|
||||
box-shadow: none;
|
||||
background-color: var(--color-success-bg);
|
||||
color: var(--color-success-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerified.message .pull-right {
|
||||
color: var(--color-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerified.message .ui.text {
|
||||
color: var(--color-success-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerified:last-child,
|
||||
.repository .ui.attached.isSigned.isVerified.bottom {
|
||||
border-bottom: 1px solid var(--color-success-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched {
|
||||
border-left: 1px solid var(--color-warning-border);
|
||||
border-right: 1px solid var(--color-warning-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted.top,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched.top,
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted.message,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched.message {
|
||||
border-top: 1px solid var(--color-warning-border);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted.message,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched.message {
|
||||
box-shadow: none;
|
||||
background-color: var(--color-warning-bg);
|
||||
color: var(--color-warning-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted.message .ui.text,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched.message .ui.text {
|
||||
color: var(--color-warning-text);
|
||||
}
|
||||
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted:last-child,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched:last-child,
|
||||
.repository .ui.attached.isSigned.isVerifiedUntrusted.bottom,
|
||||
.repository .ui.attached.isSigned.isVerifiedUnmatched.bottom {
|
||||
border-bottom: 1px solid var(--color-warning-border);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label,
|
||||
.repository #repo-files-table .sha.label,
|
||||
.repository #repo-file-commit-box .sha.label,
|
||||
.repository #rev-list .sha.label,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label {
|
||||
border: 1px solid var(--color-light-border);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label .detail.icon,
|
||||
.repository #repo-files-table .sha.label .detail.icon,
|
||||
.repository #repo-file-commit-box .sha.label .detail.icon,
|
||||
.repository #rev-list .sha.label .detail.icon,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label .detail.icon {
|
||||
background: var(--color-light);
|
||||
margin: -6px -10px -4px 0;
|
||||
padding: 5px 4px 5px 6px;
|
||||
border-left: 1px solid var(--color-light-border);
|
||||
border-top: 0;
|
||||
border-right: 0;
|
||||
border-bottom: 0;
|
||||
border-top-left-radius: 0;
|
||||
border-bottom-left-radius: 0;
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label .detail.icon .svg,
|
||||
.repository #repo-files-table .sha.label .detail.icon .svg,
|
||||
.repository #repo-file-commit-box .sha.label .detail.icon .svg,
|
||||
.repository #rev-list .sha.label .detail.icon .svg,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label .detail.icon .svg {
|
||||
margin: 0 0.25em 0 0;
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label .detail.icon > div,
|
||||
.repository #repo-files-table .sha.label .detail.icon > div,
|
||||
.repository #repo-file-commit-box .sha.label .detail.icon > div,
|
||||
.repository #rev-list .sha.label .detail.icon > div,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label .detail.icon > div {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isWarning,
|
||||
.repository #repo-files-table .sha.label.isSigned.isWarning,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isWarning,
|
||||
.repository #rev-list .sha.label.isSigned.isWarning,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isWarning {
|
||||
border: 1px solid var(--color-red-badge);
|
||||
background: var(--color-red-badge-bg);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isWarning .detail.icon,
|
||||
.repository #repo-files-table .sha.label.isSigned.isWarning .detail.icon,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isWarning .detail.icon,
|
||||
.repository #rev-list .sha.label.isSigned.isWarning .detail.icon,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isWarning .detail.icon {
|
||||
border-left: 1px solid var(--color-red-badge);
|
||||
color: var(--color-red-badge);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isWarning:hover,
|
||||
.repository #repo-files-table .sha.label.isSigned.isWarning:hover,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isWarning:hover,
|
||||
.repository #rev-list .sha.label.isSigned.isWarning:hover,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isWarning:hover {
|
||||
background: var(--color-red-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerified,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerified,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerified,
|
||||
.repository #rev-list .sha.label.isSigned.isVerified,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerified {
|
||||
border: 1px solid var(--color-green-badge);
|
||||
background: var(--color-green-badge-bg);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerified .detail.icon,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerified .detail.icon,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerified .detail.icon,
|
||||
.repository #rev-list .sha.label.isSigned.isVerified .detail.icon,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerified .detail.icon {
|
||||
border-left: 1px solid var(--color-green-badge);
|
||||
color: var(--color-green-badge);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerified:hover,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerified:hover,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerified:hover,
|
||||
.repository #rev-list .sha.label.isSigned.isVerified:hover,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerified:hover {
|
||||
background: var(--color-green-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerifiedUntrusted,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerifiedUntrusted,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerifiedUntrusted,
|
||||
.repository #rev-list .sha.label.isSigned.isVerifiedUntrusted,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerifiedUntrusted {
|
||||
border: 1px solid var(--color-yellow-badge);
|
||||
background: var(--color-yellow-badge-bg);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerifiedUntrusted .detail.icon,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerifiedUntrusted .detail.icon,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerifiedUntrusted .detail.icon,
|
||||
.repository #rev-list .sha.label.isSigned.isVerifiedUntrusted .detail.icon,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerifiedUntrusted .detail.icon {
|
||||
border-left: 1px solid var(--color-yellow-badge);
|
||||
color: var(--color-yellow-badge);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerifiedUntrusted:hover,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerifiedUntrusted:hover,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerifiedUntrusted:hover,
|
||||
.repository #rev-list .sha.label.isSigned.isVerifiedUntrusted:hover,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerifiedUntrusted:hover {
|
||||
background: var(--color-yellow-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerifiedUnmatched,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerifiedUnmatched,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerifiedUnmatched,
|
||||
.repository #rev-list .sha.label.isSigned.isVerifiedUnmatched,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerifiedUnmatched {
|
||||
border: 1px solid var(--color-orange-badge);
|
||||
background: var(--color-orange-badge-bg);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerifiedUnmatched .detail.icon,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerifiedUnmatched .detail.icon,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerifiedUnmatched .detail.icon,
|
||||
.repository #rev-list .sha.label.isSigned.isVerifiedUnmatched .detail.icon,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerifiedUnmatched .detail.icon {
|
||||
border-left: 1px solid var(--color-orange-badge);
|
||||
color: var(--color-orange-badge);
|
||||
}
|
||||
|
||||
.repository #commits-table td.sha .sha.label.isSigned.isVerifiedUnmatched:hover,
|
||||
.repository #repo-files-table .sha.label.isSigned.isVerifiedUnmatched:hover,
|
||||
.repository #repo-file-commit-box .sha.label.isSigned.isVerifiedUnmatched:hover,
|
||||
.repository #rev-list .sha.label.isSigned.isVerifiedUnmatched:hover,
|
||||
.repository .timeline-item.commits-list .singular-commit .sha.label.isSigned.isVerifiedUnmatched:hover {
|
||||
background: var(--color-orange-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label {
|
||||
margin: 0;
|
||||
border: 1px solid var(--color-light-border);
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isWarning {
|
||||
border: 1px solid var(--color-red-badge);
|
||||
background: var(--color-red-badge-bg);
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isWarning:hover {
|
||||
background: var(--color-red-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isVerified {
|
||||
border: 1px solid var(--color-green-badge);
|
||||
background: var(--color-green-badge-bg);
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isVerified:hover {
|
||||
background: var(--color-green-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isVerifiedUntrusted {
|
||||
border: 1px solid var(--color-yellow-badge);
|
||||
background: var(--color-yellow-badge-bg);
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isVerifiedUntrusted:hover {
|
||||
background: var(--color-yellow-badge-hover-bg) !important;
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isVerifiedUnmatched {
|
||||
border: 1px solid var(--color-orange-badge);
|
||||
background: var(--color-orange-badge-bg);
|
||||
}
|
||||
|
||||
.singular-commit .shabox .sha.label.isSigned.isVerifiedUnmatched:hover {
|
||||
background: var(--color-orange-badge-hover-bg) !important;
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
#repo-files-table {
|
||||
width: 100%;
|
||||
display: grid;
|
||||
grid-template-columns: auto 1fr auto;
|
||||
border: 1px solid var(--color-light-border);
|
||||
border-radius: var(--border-radius);
|
||||
margin: 10px 0; /* match the "clone-panel-popup" margin to avoid "visual double-border" */
|
||||
}
|
||||
|
||||
#repo-files-table .svg.octicon-file-directory-fill,
|
||||
#repo-files-table .svg.octicon-file-submodule {
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
#repo-files-table .svg.octicon-file,
|
||||
#repo-files-table .svg.octicon-file-symlink-file,
|
||||
#repo-files-table .svg.octicon-file-directory-symlink {
|
||||
color: var(--color-secondary-dark-7);
|
||||
}
|
||||
|
||||
#repo-files-table .repo-file-item {
|
||||
display: contents;
|
||||
}
|
||||
|
||||
#repo-files-table .repo-file-item:hover > .repo-file-cell {
|
||||
background: var(--color-hover);
|
||||
}
|
||||
|
||||
#repo-files-table .repo-file-line,
|
||||
#repo-files-table .repo-file-cell {
|
||||
border-top: 1px solid var(--color-light-border);
|
||||
padding: 6px 10px;
|
||||
}
|
||||
|
||||
#repo-files-table .repo-file-line:first-child {
|
||||
border-top: none;
|
||||
}
|
||||
|
||||
#repo-files-table .repo-file-line {
|
||||
grid-column: 1 / span 3;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5em;
|
||||
padding: 6px 10px;
|
||||
}
|
||||
|
||||
#repo-files-table .repo-file-last-commit {
|
||||
background: var(--color-box-header);
|
||||
}
|
||||
|
||||
#repo-files-table .repo-file-cell.name {
|
||||
max-width: 300px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
#repo-files-table .repo-file-cell.message {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
color: var(--color-text-light-1);
|
||||
}
|
||||
|
||||
#repo-files-table .repo-file-cell.age {
|
||||
text-align: right;
|
||||
white-space: nowrap;
|
||||
color: var(--color-text-light-1);
|
||||
}
|
||||
|
||||
@media (max-width: 767.98px) {
|
||||
#repo-files-table .repo-file-cell.name {
|
||||
max-width: 150px;
|
||||
}
|
||||
}
|
||||
@@ -59,9 +59,6 @@
|
||||
}
|
||||
|
||||
@media (max-width: 767.98px) {
|
||||
.repository.wiki .clone-panel #repo-clone-url {
|
||||
width: 160px;
|
||||
}
|
||||
.repository.wiki .wiki-content-main.with-sidebar,
|
||||
.repository.wiki .wiki-content-sidebar {
|
||||
float: none;
|
||||
|
||||
@@ -429,7 +429,8 @@ export function initRepositoryActionView() {
|
||||
<a class="muted" :href="run.commit.pusher.link">{{ run.commit.pusher.displayName }}</a>
|
||||
</template>
|
||||
<span class="ui label tw-max-w-full" v-if="run.commit.shortSHA">
|
||||
<a class="gt-ellipsis" :href="run.commit.branch.link">{{ run.commit.branch.name }}</a>
|
||||
<span v-if="run.commit.branch.isDeleted" class="gt-ellipsis tw-line-through" :data-tooltip-content="run.commit.branch.name">{{ run.commit.branch.name }}</span>
|
||||
<a v-else class="gt-ellipsis" :href="run.commit.branch.link" :data-tooltip-content="run.commit.branch.name">{{ run.commit.branch.name }}</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<script lang="ts">
|
||||
import {SvgIcon} from '../svg.ts';
|
||||
import dayjs from 'dayjs';
|
||||
import {
|
||||
Chart,
|
||||
Title,
|
||||
@@ -26,6 +27,7 @@ import {sleep} from '../utils.ts';
|
||||
import 'chartjs-adapter-dayjs-4/dist/chartjs-adapter-dayjs-4.esm';
|
||||
import {fomanticQuery} from '../modules/fomantic/base.ts';
|
||||
import type {Entries} from 'type-fest';
|
||||
import {pathEscapeSegments} from '../utils/url.ts';
|
||||
|
||||
const customEventListener: Plugin = {
|
||||
id: 'customEventListener',
|
||||
@@ -65,6 +67,10 @@ export default {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
repoDefaultBranchName: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
data: () => ({
|
||||
isLoading: false,
|
||||
@@ -100,6 +106,15 @@ export default {
|
||||
.slice(0, 100);
|
||||
},
|
||||
|
||||
getContributorSearchQuery(contributorEmail: string) {
|
||||
const min = dayjs(this.xAxisMin).format('YYYY-MM-DD');
|
||||
const max = dayjs(this.xAxisMax).format('YYYY-MM-DD');
|
||||
const params = new URLSearchParams({
|
||||
'q': `after:${min}, before:${max}, author:${contributorEmail}`,
|
||||
});
|
||||
return `${this.repoLink}/commits/branch/${pathEscapeSegments(this.repoDefaultBranchName)}/search?${params.toString()}`;
|
||||
},
|
||||
|
||||
async fetchGraphData() {
|
||||
this.isLoading = true;
|
||||
try {
|
||||
@@ -167,7 +182,7 @@ export default {
|
||||
// for details.
|
||||
user.max_contribution_type += 1;
|
||||
|
||||
filteredData[key] = {...user, weeks: filteredWeeks};
|
||||
filteredData[key] = {...user, weeks: filteredWeeks, email: key};
|
||||
}
|
||||
|
||||
return filteredData;
|
||||
@@ -215,7 +230,7 @@ export default {
|
||||
};
|
||||
},
|
||||
|
||||
updateOtherCharts({chart}: {chart: Chart}, reset?: boolean = false) {
|
||||
updateOtherCharts({chart}: {chart: Chart}, reset: boolean = false) {
|
||||
const minVal = chart.options.scales.x.min;
|
||||
const maxVal = chart.options.scales.x.max;
|
||||
if (reset) {
|
||||
@@ -381,7 +396,7 @@ export default {
|
||||
<div class="ui top attached header tw-flex tw-flex-1">
|
||||
<b class="ui right">#{{ index + 1 }}</b>
|
||||
<a :href="contributor.home_link">
|
||||
<img class="ui avatar tw-align-middle" height="40" width="40" :src="contributor.avatar_link">
|
||||
<img class="ui avatar tw-align-middle" height="40" width="40" :src="contributor.avatar_link" alt="">
|
||||
</a>
|
||||
<div class="tw-ml-2">
|
||||
<a v-if="contributor.home_link !== ''" :href="contributor.home_link"><h4>{{ contributor.name }}</h4></a>
|
||||
@@ -389,7 +404,11 @@ export default {
|
||||
{{ contributor.name }}
|
||||
</h4>
|
||||
<p class="tw-text-12 tw-flex tw-gap-1">
|
||||
<strong v-if="contributor.total_commits">{{ contributor.total_commits.toLocaleString() }} {{ locale.contributionType.commits }}</strong>
|
||||
<strong v-if="contributor.total_commits">
|
||||
<a class="silenced" :href="getContributorSearchQuery(contributor.email)">
|
||||
{{ contributor.total_commits.toLocaleString() }} {{ locale.contributionType.commits }}
|
||||
</a>
|
||||
</strong>
|
||||
<strong v-if="contributor.total_additions" class="text green">{{ contributor.total_additions.toLocaleString() }}++ </strong>
|
||||
<strong v-if="contributor.total_deletions" class="text red">
|
||||
{{ contributor.total_deletions.toLocaleString() }}--</strong>
|
||||
|
||||
@@ -178,6 +178,7 @@ export function initTextareaEvents(textarea, dropzoneEl) {
|
||||
});
|
||||
textarea.addEventListener('drop', (e) => {
|
||||
if (!e.dataTransfer.files.length) return;
|
||||
if (!dropzoneEl) return;
|
||||
handleUploadFiles(new TextareaEditor(textarea), dropzoneEl, e.dataTransfer.files, e);
|
||||
});
|
||||
dropzoneEl?.dropzone.on(DropzoneCustomEventRemovedFile, ({fileUuid}) => {
|
||||
|
||||
@@ -8,6 +8,7 @@ export async function initRepoContributors() {
|
||||
try {
|
||||
const View = createApp(RepoContributors, {
|
||||
repoLink: el.getAttribute('data-repo-link'),
|
||||
repoDefaultBranchName: el.getAttribute('data-repo-default-branch-name'),
|
||||
locale: {
|
||||
filterLabel: el.getAttribute('data-locale-filter-label'),
|
||||
contributionType: {
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import $ from 'jquery';
|
||||
import {hideElem, queryElems, showElem} from '../utils/dom.ts';
|
||||
import {queryElems} from '../utils/dom.ts';
|
||||
import {POST} from '../modules/fetch.ts';
|
||||
import {showErrorToast} from '../modules/toast.ts';
|
||||
import {sleep} from '../utils.ts';
|
||||
import RepoActivityTopAuthors from '../components/RepoActivityTopAuthors.vue';
|
||||
import {createApp} from 'vue';
|
||||
import {toOriginUrl} from '../utils/url.ts';
|
||||
import {createTippy} from '../modules/tippy.ts';
|
||||
|
||||
async function onDownloadArchive(e) {
|
||||
e.preventDefault();
|
||||
@@ -41,54 +42,69 @@ export function initRepoActivityTopAuthorsChart() {
|
||||
}
|
||||
}
|
||||
|
||||
export function initRepoCloneLink() {
|
||||
const $repoCloneSsh = $('#repo-clone-ssh');
|
||||
const $repoCloneHttps = $('#repo-clone-https');
|
||||
const $inputLink = $('#repo-clone-url');
|
||||
function initCloneSchemeUrlSelection(parent: Element) {
|
||||
const elCloneUrlInput = parent.querySelector<HTMLInputElement>('.repo-clone-url');
|
||||
|
||||
if ((!$repoCloneSsh.length && !$repoCloneHttps.length) || !$inputLink.length) {
|
||||
return;
|
||||
}
|
||||
const tabSsh = parent.querySelector('.repo-clone-ssh');
|
||||
const tabHttps = parent.querySelector('.repo-clone-https');
|
||||
const updateClonePanelUi = function() {
|
||||
const scheme = localStorage.getItem('repo-clone-protocol') || 'https';
|
||||
const isSSH = scheme === 'ssh' && Boolean(tabSsh) || scheme !== 'ssh' && !tabHttps;
|
||||
if (tabHttps) {
|
||||
tabHttps.textContent = window.origin.split(':')[0].toUpperCase(); // show "HTTP" or "HTTPS"
|
||||
tabHttps.classList.toggle('active', !isSSH);
|
||||
}
|
||||
if (tabSsh) {
|
||||
tabSsh.classList.toggle('active', isSSH);
|
||||
}
|
||||
|
||||
$repoCloneSsh.on('click', () => {
|
||||
localStorage.setItem('repo-clone-protocol', 'ssh');
|
||||
window.updateCloneStates();
|
||||
});
|
||||
$repoCloneHttps.on('click', () => {
|
||||
localStorage.setItem('repo-clone-protocol', 'https');
|
||||
window.updateCloneStates();
|
||||
});
|
||||
const tab = isSSH ? tabSsh : tabHttps;
|
||||
if (!tab) return;
|
||||
const link = toOriginUrl(tab.getAttribute('data-link'));
|
||||
|
||||
$inputLink.on('focus', () => {
|
||||
$inputLink.trigger('select');
|
||||
});
|
||||
}
|
||||
|
||||
export function initRepoCommonBranchOrTagDropdown(selector: string) {
|
||||
$(selector).each(function () {
|
||||
const $dropdown = $(this);
|
||||
$dropdown.find('.reference.column').on('click', function () {
|
||||
hideElem($dropdown.find('.scrolling.reference-list-menu'));
|
||||
showElem($($(this).data('target')));
|
||||
return false;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export function initRepoCommonFilterSearchDropdown(selector: string) {
|
||||
const $dropdown = $(selector);
|
||||
if (!$dropdown.length) return;
|
||||
|
||||
$dropdown.dropdown({
|
||||
fullTextSearch: 'exact',
|
||||
selectOnKeydown: false,
|
||||
onChange(_text, _value, $choice) {
|
||||
if ($choice[0].getAttribute('data-url')) {
|
||||
window.location.href = $choice[0].getAttribute('data-url');
|
||||
for (const el of document.querySelectorAll('.js-clone-url')) {
|
||||
if (el.nodeName === 'INPUT') {
|
||||
(el as HTMLInputElement).value = link;
|
||||
} else {
|
||||
el.textContent = link;
|
||||
}
|
||||
},
|
||||
message: {noResults: $dropdown[0].getAttribute('data-no-results')},
|
||||
}
|
||||
for (const el of parent.querySelectorAll<HTMLAnchorElement>('.js-clone-url-editor')) {
|
||||
el.href = el.getAttribute('data-href-template').replace('{url}', encodeURIComponent(link));
|
||||
}
|
||||
};
|
||||
|
||||
updateClonePanelUi();
|
||||
// tabSsh or tabHttps might not both exist, eg: guest view, or one is disabled by the server
|
||||
tabSsh?.addEventListener('click', () => {
|
||||
localStorage.setItem('repo-clone-protocol', 'ssh');
|
||||
updateClonePanelUi();
|
||||
});
|
||||
tabHttps?.addEventListener('click', () => {
|
||||
localStorage.setItem('repo-clone-protocol', 'https');
|
||||
updateClonePanelUi();
|
||||
});
|
||||
elCloneUrlInput.addEventListener('focus', () => {
|
||||
elCloneUrlInput.select();
|
||||
});
|
||||
}
|
||||
|
||||
function initClonePanelButton(btn: HTMLButtonElement) {
|
||||
const elPanel = btn.nextElementSibling;
|
||||
// "init" must be before the "createTippy" otherwise the "tippy-target" will be removed from the document
|
||||
initCloneSchemeUrlSelection(elPanel);
|
||||
createTippy(btn, {
|
||||
content: elPanel,
|
||||
trigger: 'click',
|
||||
placement: 'bottom-end',
|
||||
interactive: true,
|
||||
hideOnClick: true,
|
||||
});
|
||||
}
|
||||
|
||||
export function initRepoCloneButtons() {
|
||||
queryElems(document, '.js-btn-clone-panel', initClonePanelButton);
|
||||
queryElems(document, '.clone-buttons-combo', initCloneSchemeUrlSelection);
|
||||
}
|
||||
|
||||
export async function updateIssuesMeta(url, action, issue_ids, id) {
|
||||
|
||||
@@ -4,6 +4,7 @@ import {queryElems, toggleElem} from '../utils/dom.ts';
|
||||
import {initIssueSidebarComboList} from './repo-issue-sidebar-combolist.ts';
|
||||
|
||||
function initBranchSelector() {
|
||||
// TODO: RemoveIssueRef: see "repo/issue/branch_selector_field.tmpl"
|
||||
const elSelectBranch = document.querySelector('.ui.dropdown.select-branch');
|
||||
if (!elSelectBranch) return;
|
||||
|
||||
|
||||
@@ -8,9 +8,7 @@ import {
|
||||
} from './repo-issue.ts';
|
||||
import {initUnicodeEscapeButton} from './repo-unicode-escape.ts';
|
||||
import {initRepoBranchTagSelector} from '../components/RepoBranchTagSelector.vue';
|
||||
import {
|
||||
initRepoCloneLink, initRepoCommonBranchOrTagDropdown, initRepoCommonFilterSearchDropdown,
|
||||
} from './repo-common.ts';
|
||||
import {initRepoCloneButtons} from './repo-common.ts';
|
||||
import {initCitationFileCopyContent} from './citation.ts';
|
||||
import {initCompLabelEdit} from './comp/LabelEdit.ts';
|
||||
import {initRepoDiffConversationNav} from './repo-diff.ts';
|
||||
@@ -36,6 +34,33 @@ export function initBranchSelectorTabs() {
|
||||
});
|
||||
}
|
||||
|
||||
function initRepoCommonBranchOrTagDropdown(selector: string) {
|
||||
$(selector).each(function () {
|
||||
const $dropdown = $(this);
|
||||
$dropdown.find('.reference.column').on('click', function () {
|
||||
hideElem($dropdown.find('.scrolling.reference-list-menu'));
|
||||
showElem($($(this).data('target')));
|
||||
return false;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function initRepoCommonFilterSearchDropdown(selector: string) {
|
||||
const $dropdown = $(selector);
|
||||
if (!$dropdown.length) return;
|
||||
|
||||
$dropdown.dropdown({
|
||||
fullTextSearch: 'exact',
|
||||
selectOnKeydown: false,
|
||||
onChange(_text, _value, $choice) {
|
||||
if ($choice[0].getAttribute('data-url')) {
|
||||
window.location.href = $choice[0].getAttribute('data-url');
|
||||
}
|
||||
},
|
||||
message: {noResults: $dropdown[0].getAttribute('data-no-results')},
|
||||
});
|
||||
}
|
||||
|
||||
export function initRepository() {
|
||||
if (!$('.page-content.repository').length) return;
|
||||
|
||||
@@ -54,7 +79,7 @@ export function initRepository() {
|
||||
initRepoCommonFilterSearchDropdown('.choose.branch .dropdown');
|
||||
}
|
||||
|
||||
initRepoCloneLink();
|
||||
initRepoCloneButtons();
|
||||
initCitationFileCopyContent();
|
||||
initRepoSettings();
|
||||
|
||||
|
||||
@@ -1,27 +1,28 @@
|
||||
import {addDelegatedEventListener, hideElem, queryElemSiblings, showElem, toggleElem} from '../utils/dom.ts';
|
||||
|
||||
export function initUnicodeEscapeButton() {
|
||||
// buttons might appear on these pages: file view (code, rendered markdown), diff (commit, pr conversation, pr diff), blame, wiki
|
||||
addDelegatedEventListener(document, 'click', '.escape-button, .unescape-button, .toggle-escape-button', (btn, e) => {
|
||||
e.preventDefault();
|
||||
|
||||
const fileContentElemId = btn.getAttribute('data-file-content-elem-id');
|
||||
const fileContent = fileContentElemId ?
|
||||
document.querySelector(`#${fileContentElemId}`) :
|
||||
const unicodeContentSelector = btn.getAttribute('data-unicode-content-selector');
|
||||
const container = unicodeContentSelector ?
|
||||
document.querySelector(unicodeContentSelector) :
|
||||
btn.closest('.file-content, .non-diff-file-content');
|
||||
const fileView = fileContent?.querySelectorAll('.file-code, .file-view');
|
||||
const fileView = container.querySelector('.file-code, .file-view') ?? container;
|
||||
if (btn.matches('.escape-button')) {
|
||||
for (const el of fileView) el.classList.add('unicode-escaped');
|
||||
fileView.classList.add('unicode-escaped');
|
||||
hideElem(btn);
|
||||
showElem(queryElemSiblings(btn, '.unescape-button'));
|
||||
} else if (btn.matches('.unescape-button')) {
|
||||
for (const el of fileView) el.classList.remove('unicode-escaped');
|
||||
fileView.classList.remove('unicode-escaped');
|
||||
hideElem(btn);
|
||||
showElem(queryElemSiblings(btn, '.escape-button'));
|
||||
} else if (btn.matches('.toggle-escape-button')) {
|
||||
const isEscaped = fileView[0]?.classList.contains('unicode-escaped');
|
||||
for (const el of fileView) el.classList.toggle('unicode-escaped', !isEscaped);
|
||||
toggleElem(fileContent.querySelectorAll('.unescape-button'), !isEscaped);
|
||||
toggleElem(fileContent.querySelectorAll('.escape-button'), isEscaped);
|
||||
const isEscaped = fileView.classList.contains('unicode-escaped');
|
||||
fileView.classList.toggle('unicode-escaped', !isEscaped);
|
||||
toggleElem(container.querySelectorAll('.unescape-button'), !isEscaped);
|
||||
toggleElem(container.querySelectorAll('.escape-button'), isEscaped);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import {displayError} from './common.ts';
|
||||
|
||||
function targetElement(el: Element) {
|
||||
// The target element is either the current element if it has the
|
||||
// `is-loading` class or the pre that contains it
|
||||
return el.classList.contains('is-loading') ? el : el.closest('pre');
|
||||
// The target element is either the parent "code block with loading indicator", or itself
|
||||
return el.closest('.code-block.is-loading') ?? el;
|
||||
}
|
||||
|
||||
export async function renderMath(): Promise<void> {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import {pathEscapeSegments, isUrl} from './url.ts';
|
||||
import {pathEscapeSegments, isUrl, toOriginUrl} from './url.ts';
|
||||
|
||||
test('pathEscapeSegments', () => {
|
||||
expect(pathEscapeSegments('a/b/c')).toEqual('a/b/c');
|
||||
@@ -11,3 +11,19 @@ test('isUrl', () => {
|
||||
expect(isUrl('https://example.com/index.html')).toEqual(true);
|
||||
expect(isUrl('/index.html')).toEqual(false);
|
||||
});
|
||||
|
||||
test('toOriginUrl', () => {
|
||||
const oldLocation = String(window.location);
|
||||
for (const origin of ['https://example.com', 'https://example.com:3000']) {
|
||||
window.location.assign(`${origin}/`);
|
||||
expect(toOriginUrl('/')).toEqual(`${origin}/`);
|
||||
expect(toOriginUrl('/org/repo.git')).toEqual(`${origin}/org/repo.git`);
|
||||
expect(toOriginUrl('https://another.com')).toEqual(`${origin}/`);
|
||||
expect(toOriginUrl('https://another.com/')).toEqual(`${origin}/`);
|
||||
expect(toOriginUrl('https://another.com/org/repo.git')).toEqual(`${origin}/org/repo.git`);
|
||||
expect(toOriginUrl('https://another.com:4000')).toEqual(`${origin}/`);
|
||||
expect(toOriginUrl('https://another.com:4000/')).toEqual(`${origin}/`);
|
||||
expect(toOriginUrl('https://another.com:4000/org/repo.git')).toEqual(`${origin}/org/repo.git`);
|
||||
}
|
||||
window.location.assign(oldLocation);
|
||||
});
|
||||
|
||||
@@ -13,3 +13,19 @@ export function isUrl(url: string): boolean {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Convert an absolute or relative URL to an absolute URL with the current origin. It only
|
||||
// processes absolute HTTP/HTTPS URLs or relative URLs like '/xxx' or '//host/xxx'.
|
||||
export function toOriginUrl(urlStr: string) {
|
||||
try {
|
||||
if (urlStr.startsWith('http://') || urlStr.startsWith('https://') || urlStr.startsWith('/')) {
|
||||
const {origin, protocol, hostname, port} = window.location;
|
||||
const url = new URL(urlStr, origin);
|
||||
url.protocol = protocol;
|
||||
url.hostname = hostname;
|
||||
url.port = port || (protocol === 'https:' ? '443' : '80');
|
||||
return url.toString();
|
||||
}
|
||||
} catch {}
|
||||
return urlStr;
|
||||
}
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
import {toOriginUrl} from './origin-url.ts';
|
||||
|
||||
test('toOriginUrl', () => {
|
||||
const oldLocation = String(window.location);
|
||||
for (const origin of ['https://example.com', 'https://example.com:3000']) {
|
||||
window.location.assign(`${origin}/`);
|
||||
expect(toOriginUrl('/')).toEqual(`${origin}/`);
|
||||
expect(toOriginUrl('/org/repo.git')).toEqual(`${origin}/org/repo.git`);
|
||||
expect(toOriginUrl('https://another.com')).toEqual(`${origin}/`);
|
||||
expect(toOriginUrl('https://another.com/')).toEqual(`${origin}/`);
|
||||
expect(toOriginUrl('https://another.com/org/repo.git')).toEqual(`${origin}/org/repo.git`);
|
||||
expect(toOriginUrl('https://another.com:4000')).toEqual(`${origin}/`);
|
||||
expect(toOriginUrl('https://another.com:4000/')).toEqual(`${origin}/`);
|
||||
expect(toOriginUrl('https://another.com:4000/org/repo.git')).toEqual(`${origin}/org/repo.git`);
|
||||
}
|
||||
window.location.assign(oldLocation);
|
||||
});
|
||||
@@ -1,19 +1,4 @@
|
||||
// Convert an absolute or relative URL to an absolute URL with the current origin. It only
|
||||
// processes absolute HTTP/HTTPS URLs or relative URLs like '/xxx' or '//host/xxx'.
|
||||
// NOTE: Keep this function in sync with clone_script.tmpl
|
||||
export function toOriginUrl(urlStr: string) {
|
||||
try {
|
||||
if (urlStr.startsWith('http://') || urlStr.startsWith('https://') || urlStr.startsWith('/')) {
|
||||
const {origin, protocol, hostname, port} = window.location;
|
||||
const url = new URL(urlStr, origin);
|
||||
url.protocol = protocol;
|
||||
url.hostname = hostname;
|
||||
url.port = port || (protocol === 'https:' ? '443' : '80');
|
||||
return url.toString();
|
||||
}
|
||||
} catch {}
|
||||
return urlStr;
|
||||
}
|
||||
import {toOriginUrl} from '../utils/url.ts';
|
||||
|
||||
window.customElements.define('origin-url', class extends HTMLElement {
|
||||
connectedCallback() {
|
||||
|
||||
Reference in New Issue
Block a user