-
- {{if .Secrets}}
-
- {{range .Secrets}}
-
-
-
-
-
- {{svg "octicon-key" 32}}
-
-
-
{{.Name}}
-
- {{Shadow .Data}}
-
-
- {{$.locale.Tr "settings.add_on"}} {{.CreatedUnix.FormatShort}}
- {{if .PullRequest}} — {{svg "octicon-info"}} - {{$.locale.Tr "repo.settings.pull_request_read_hint"}} {{end}}
-
-
-
- {{end}}
+
+
+
+
+
+ {{if .Secrets}}
+
+ {{range .Secrets}}
+
+
+
+
+
+ {{svg "octicon-key" 32}}
+
+
+
{{.Name}}
+
******
+
+
+ {{$.locale.Tr "settings.add_on"}}
+ {{.CreatedUnix.FormatShort}}
+
+
+
+
+ {{end}}
+
+ {{else}}
+ {{.locale.Tr "secrets.none"}}
+ {{end}}
+
+
+
+
+
+
+
{{.locale.Tr "secrets.deletion.description"}}
+
+
+
+
+ {{.locale.Tr "modal.no"}}
+
+
+
+ {{.locale.Tr "modal.yes"}}
+
diff --git a/tests/integration/api_team_test.go b/tests/integration/api_team_test.go
index 46207203bc..f54c286fc9 100644
--- a/tests/integration/api_team_test.go
+++ b/tests/integration/api_team_test.go
@@ -24,7 +24,7 @@ import (
func TestAPITeam(t *testing.T) {
defer tests.PrepareTestEnv(t)()
- teamUser := unittest.AssertExistsAndLoadBean(t, &organization.TeamUser{})
+ teamUser := unittest.AssertExistsAndLoadBean(t, &organization.TeamUser{ID: 1})
team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: teamUser.TeamID})
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: teamUser.UID})
diff --git a/tests/integration/integration_test.go b/tests/integration/integration_test.go
index d5fbb393b5..3537409aeb 100644
--- a/tests/integration/integration_test.go
+++ b/tests/integration/integration_test.go
@@ -264,18 +264,45 @@ var tokenCounter int64
func getTokenForLoggedInUser(t testing.TB, session *TestSession) string {
t.Helper()
+ var token string
req := NewRequest(t, "GET", "/user/settings/applications")
resp := session.MakeRequest(t, req, http.StatusOK)
- doc := NewHTMLParser(t, resp.Body)
+ var csrf string
+ for _, cookie := range resp.Result().Cookies() {
+ if cookie.Name != "_csrf" {
+ continue
+ }
+ csrf = cookie.Value
+ break
+ }
+ if csrf == "" {
+ doc := NewHTMLParser(t, resp.Body)
+ csrf = doc.GetCSRF()
+ }
+ assert.NotEmpty(t, csrf)
req = NewRequestWithValues(t, "POST", "/user/settings/applications", map[string]string{
- "_csrf": doc.GetCSRF(),
+ "_csrf": csrf,
"name": fmt.Sprintf("api-testing-token-%d", atomic.AddInt64(&tokenCounter, 1)),
})
- session.MakeRequest(t, req, http.StatusSeeOther)
+ resp = session.MakeRequest(t, req, http.StatusSeeOther)
+
+ // Log the flash values on failure
+ if !assert.Equal(t, resp.Result().Header["Location"], []string{"/user/settings/applications"}) {
+ for _, cookie := range resp.Result().Cookies() {
+ if cookie.Name != "macaron_flash" {
+ continue
+ }
+ flash, _ := url.ParseQuery(cookie.Value)
+ for key, value := range flash {
+ t.Logf("Flash %q: %q", key, value)
+ }
+ }
+ }
+
req = NewRequest(t, "GET", "/user/settings/applications")
resp = session.MakeRequest(t, req, http.StatusOK)
htmlDoc := NewHTMLParser(t, resp.Body)
- token := htmlDoc.doc.Find(".ui.info p").Text()
+ token = htmlDoc.doc.Find(".ui.info p").Text()
assert.NotEmpty(t, token)
return token
}
diff --git a/vitest.config.js b/vitest.config.js
index 838360970f..37ebfa5722 100644
--- a/vitest.config.js
+++ b/vitest.config.js
@@ -1,7 +1,7 @@
import {defineConfig} from 'vitest/dist/config.js';
-import {readFile} from 'fs/promises';
+import {readFile} from 'node:fs/promises';
import {dataToEsm} from '@rollup/pluginutils';
-import {extname} from 'path';
+import {extname} from 'node:path';
function stringPlugin() {
return {
diff --git a/web_src/js/components/ActivityHeatmap.vue b/web_src/js/components/ActivityHeatmap.vue
index df7e0beb00..6cd72a8bf7 100644
--- a/web_src/js/components/ActivityHeatmap.vue
+++ b/web_src/js/components/ActivityHeatmap.vue
@@ -32,6 +32,7 @@ export default {
},
data: () => ({
colorRange: [
+ 'var(--color-secondary-alpha-70)',
'var(--color-secondary-alpha-70)',
'var(--color-primary-light-4)',
'var(--color-primary-light-2)',
@@ -50,6 +51,12 @@ export default {
return s;
}
},
+ mounted() {
+ // work around issue with first legend color being rendered twice and legend cut off
+ const legend = document.querySelector('.vch__external-legend-wrapper');
+ legend.setAttribute('viewBox', '12 0 80 10');
+ legend.style.marginRight = '-12px';
+ },
methods: {
handleDayClick(e) {
// Reset filter if same date is clicked
diff --git a/web_src/js/features/repo-projects.js b/web_src/js/features/repo-projects.js
index 9777e6c8ec..b5a720c9d7 100644
--- a/web_src/js/features/repo-projects.js
+++ b/web_src/js/features/repo-projects.js
@@ -49,6 +49,8 @@ async function initRepoProjectSortable() {
filter: '[data-id="0"]',
animation: 150,
ghostClass: 'card-ghost',
+ delayOnTouchOnly: true,
+ delay: 500,
onSort: () => {
boardColumns = mainBoard.getElementsByClassName('board-column');
for (let i = 0; i < boardColumns.length; i++) {
@@ -76,6 +78,8 @@ async function initRepoProjectSortable() {
ghostClass: 'card-ghost',
onAdd: moveIssue,
onUpdate: moveIssue,
+ delayOnTouchOnly: true,
+ delay: 500,
});
}
}
@@ -200,7 +204,7 @@ function getRelativeColor(color) {
}
function rgbToHex(rgb) {
- rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
+ rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+).*\)$/);
return `#${hex(rgb[1])}${hex(rgb[2])}${hex(rgb[3])}`;
}
diff --git a/webpack.config.js b/webpack.config.js
index cdd8071d27..e5e592052e 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -6,10 +6,10 @@ import MiniCssExtractPlugin from 'mini-css-extract-plugin';
import MonacoWebpackPlugin from 'monaco-editor-webpack-plugin';
import {VueLoaderPlugin} from 'vue-loader';
import EsBuildLoader from 'esbuild-loader';
-import {parse, dirname} from 'path';
+import {parse, dirname} from 'node:path';
import webpack from 'webpack';
-import {fileURLToPath} from 'url';
-import {readFileSync} from 'fs';
+import {fileURLToPath} from 'node:url';
+import {readFileSync} from 'node:fs';
const {ESBuildMinifyPlugin} = EsBuildLoader;
const {SourceMapDevToolPlugin} = webpack;