Merge branch 'origin/main' into 'next-release/main'

This commit is contained in:
oauth 2025-04-24 18:57:10 +00:00
commit 0790ac8411
41 changed files with 241 additions and 14 deletions

View File

@ -291,6 +291,7 @@
}, },
"admin": { "admin": {
"settings": { "settings": {
"settings": "Admin Settings",
"not_allowed": "You are not allowed to access server settings", "not_allowed": "You are not allowed to access server settings",
"secrets": { "secrets": {
"desc": "Global secrets can be used in the pipelines of all repositories.", "desc": "Global secrets can be used in the pipelines of all repositories.",

View File

@ -192,7 +192,7 @@
"branches": "Atzari", "branches": "Atzari",
"deploy_pipeline": { "deploy_pipeline": {
"enter_target": "Mērķa uzstādīšanas vide", "enter_target": "Mērķa uzstādīšanas vide",
"title": "Iniciēt uzstādīšanas notikumu šim konvejerdarbam #{pipelineId}", "title": "Iniciēt uzstādīšanu šim konvejerdarbam #{pipelineId}",
"trigger": "Uzstādīt", "trigger": "Uzstādīt",
"variables": { "variables": {
"add": "Pievienot mainīgo", "add": "Pievienot mainīgo",
@ -364,10 +364,10 @@
"cancel": "Atcelt iepriekšējos konvejerdarbus", "cancel": "Atcelt iepriekšējos konvejerdarbus",
"desc": "Iespējojot šo pazīmi, tiks atcelti visi iepriekšējie konvejerdarbi, kuriem sakrīt notikums un konteksts." "desc": "Iespējojot šo pazīmi, tiks atcelti visi iepriekšējie konvejerdarbi, kuriem sakrīt notikums un konteksts."
}, },
"general": "Pamata", "general": "Projekts",
"netrc_only_trusted": { "netrc_only_trusted": {
"desc": "Atļaut izmantot Git autorizāciju tikai uzticamiem konteineriem (ieteicams).", "desc": "Atļaut izmantot Git autorizāciju tikai uzticamiem konteineriem (ieteicams).",
"netrc_only_trusted": "Atļaut izmantot Git autorizāciju tikai uzticamiem konteineriem" "netrc_only_trusted": "Papildus uzticamie klonēšanas spraudņiem"
}, },
"pipeline_path": { "pipeline_path": {
"default": "Pēc noklusējuma: .woodpecker/*.{'{yaml,yml}'} -> .woodpecker.yaml -> .woodpecker.yml", "default": "Pēc noklusējuma: .woodpecker/*.{'{yaml,yml}'} -> .woodpecker.yaml -> .woodpecker.yml",
@ -381,7 +381,7 @@
"protected": "Aizsargāts" "protected": "Aizsargāts"
}, },
"save": "Saglabāt iestatījumus", "save": "Saglabāt iestatījumus",
"success": "Repozitorija iestatījumi tika saglabāti", "success": "Projekta iestatījumi tika saglabāti",
"timeout": { "timeout": {
"minutes": "minūtes", "minutes": "minūtes",
"timeout": "Noildze" "timeout": "Noildze"
@ -406,7 +406,7 @@
"visibility": "Projekta redzamība" "visibility": "Projekta redzamība"
}, },
"allow_deploy": { "allow_deploy": {
"desc": "Atļaut publicēšanu no veiksmīgiem konvejerdarbiem. Lietot tikai ja Jūs uzticaties visiem lietotājiem ar push permisijām.", "desc": "Atļaut publicēšanu no veiksmīgiem konvejerdarbiem. Lietojiet tikai, ja uzticaties visiem lietotājiem ar iesūtīšanas tiesībām.",
"allow": "Atļaut publicēšanu" "allow": "Atļaut publicēšanu"
} }
}, },
@ -456,10 +456,35 @@
}, },
"settings": "Iestatījumi" "settings": "Iestatījumi"
}, },
"user_none": "Šai organizācijai/lietotājam pagaidām nav neviena projekta." "user_none": "Šai organizācijai/lietotājam pagaidām nav neviena projekta.",
"visibility": {
"visibility": "Projekta redzamība",
"public": {
"public": "Publisks",
"desc": "Jebkurš var redzēt šo projektu bez autentifikācijas."
},
"private": {
"private": "Privāts",
"desc": "Tikai repozitorija dalībnieki var redzēt šo projektu."
},
"internal": {
"internal": "Iekšējs",
"desc": "Visi autentificētie lietotāji šajā serverī var redzēt šo projektu."
}
}
}, },
"repos": "Repozitorijas", "repos": "Repozitorijas",
"repositories": "Repozitoriji", "repositories": {
"all": {
"desc": "Repozitoriji sakārtoti pēc pēdējā konvejerdarba izveides laika",
"title": "Visi repozitoriji"
},
"title": "Repozitoriji",
"last": {
"title": "Pēdējo reizi aplūkots",
"desc": "Visbiežāk skatītie repozitoriji sakārtoti pēc pēdējā aplūkošanas laika"
}
},
"running_version": "Tiek izmantota Woodpecker {0}", "running_version": "Tiek izmantota Woodpecker {0}",
"search": "Meklēt…", "search": "Meklēt…",
"time": { "time": {
@ -469,7 +494,8 @@
"not_started": "nav uzsākts", "not_started": "nav uzsākts",
"sec_short": "sek.", "sec_short": "sek.",
"template": "YYYY. [gada] D. MMMM, HH:mm z", "template": "YYYY. [gada] D. MMMM, HH:mm z",
"weeks_short": "ned." "weeks_short": "ned.",
"just_now": "tikko"
}, },
"unknown_error": "Notika neparedzēta kļūda", "unknown_error": "Notika neparedzēta kļūda",
"update_woodpecker": "Lūdzu atjauniniet Woodpecker instanci uz {0}", "update_woodpecker": "Lūdzu atjauniniet Woodpecker instanci uz {0}",

View File

@ -0,0 +1,7 @@
import { useTitle } from '@vueuse/core';
import type { Ref } from 'vue';
import { computed } from 'vue';
export function useWPTitle(elements: Ref<string[]>) {
useTitle(computed(() => `${elements.value.join(' · ')} · Woodpecker`));
}

View File

@ -38,7 +38,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { onMounted, ref } from 'vue'; import { computed, onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { useRoute, useRouter } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
@ -47,6 +47,7 @@ import Button from '~/components/atomic/Button.vue';
import Error from '~/components/atomic/Error.vue'; import Error from '~/components/atomic/Error.vue';
import useApiClient from '~/compositions/useApiClient'; import useApiClient from '~/compositions/useApiClient';
import useAuthentication from '~/compositions/useAuthentication'; import useAuthentication from '~/compositions/useAuthentication';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { Forge } from '~/lib/api/types'; import type { Forge } from '~/lib/api/types';
const route = useRoute(); const route = useRoute();
@ -97,4 +98,6 @@ onMounted(async () => {
errorMessage.value = authErrorMessages[error] ?? error; errorMessage.value = authErrorMessages[error] ?? error;
} }
}); });
useWPTitle(computed(() => [i18n.t('login')]));
</script> </script>

View File

@ -32,7 +32,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { onMounted, ref } from 'vue'; import { computed, onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
@ -46,6 +46,7 @@ import { useAsyncAction } from '~/compositions/useAsyncAction';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { useRepoSearch } from '~/compositions/useRepoSearch'; import { useRepoSearch } from '~/compositions/useRepoSearch';
import { useRouteBack } from '~/compositions/useRouteBack'; import { useRouteBack } from '~/compositions/useRouteBack';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { Repo } from '~/lib/api/types'; import type { Repo } from '~/lib/api/types';
const router = useRouter(); const router = useRouter();
@ -74,4 +75,6 @@ const { doSubmit: activateRepo, isLoading: isActivatingRepo } = useAsyncAction(a
}); });
const goBack = useRouteBack({ name: 'repos' }); const goBack = useRouteBack({ name: 'repos' });
useWPTitle(computed(() => [i18n.t('repo.add')]));
</script> </script>

View File

@ -42,12 +42,14 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, onMounted, ref } from 'vue'; import { computed, onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import Button from '~/components/atomic/Button.vue'; import Button from '~/components/atomic/Button.vue';
import Scaffold from '~/components/layout/scaffold/Scaffold.vue'; import Scaffold from '~/components/layout/scaffold/Scaffold.vue';
import RepoItem from '~/components/repo/RepoItem.vue'; import RepoItem from '~/components/repo/RepoItem.vue';
import useRepos from '~/compositions/useRepos'; import useRepos from '~/compositions/useRepos';
import { useRepoSearch } from '~/compositions/useRepoSearch'; import { useRepoSearch } from '~/compositions/useRepoSearch';
import { useWPTitle } from '~/compositions/useWPTitle';
import { useRepoStore } from '~/store/repos'; import { useRepoStore } from '~/store/repos';
const repoStore = useRepoStore(); const repoStore = useRepoStore();
@ -64,6 +66,9 @@ const reposLastActivity = computed(() => sortReposByLastActivity(searchedRepos.v
onMounted(async () => { onMounted(async () => {
await repoStore.loadRepos(); await repoStore.loadRepos();
}); });
const { t } = useI18n();
useWPTitle(computed(() => [t('repositories.title')]));
</script> </script>
<style scoped> <style scoped>

View File

@ -10,8 +10,12 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import AgentManager from '~/components/agent/AgentManager.vue'; import AgentManager from '~/components/agent/AgentManager.vue';
import useApiClient from '~/compositions/useApiClient'; import useApiClient from '~/compositions/useApiClient';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { Agent } from '~/lib/api/types'; import type { Agent } from '~/lib/api/types';
const apiClient = useApiClient(); const apiClient = useApiClient();
@ -20,4 +24,7 @@ const loadAgents = (page: number) => apiClient.getAgents({ page });
const createAgent = (agent: Partial<Agent>) => apiClient.createAgent(agent); const createAgent = (agent: Partial<Agent>) => apiClient.createAgent(agent);
const updateAgent = (agent: Agent) => apiClient.updateAgent(agent); const updateAgent = (agent: Agent) => apiClient.updateAgent(agent);
const deleteAgent = (agent: Agent) => apiClient.deleteAgent(agent); const deleteAgent = (agent: Agent) => apiClient.deleteAgent(agent);
const { t } = useI18n();
useWPTitle(computed(() => [t('admin.settings.agents.agents'), t('admin.settings.settings')]));
</script> </script>

View File

@ -28,10 +28,17 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import WoodpeckerLogo from '~/assets/logo.svg?component'; import WoodpeckerLogo from '~/assets/logo.svg?component';
import Error from '~/components/atomic/Error.vue'; import Error from '~/components/atomic/Error.vue';
import Settings from '~/components/layout/Settings.vue'; import Settings from '~/components/layout/Settings.vue';
import { useVersion } from '~/compositions/useVersion'; import { useVersion } from '~/compositions/useVersion';
import { useWPTitle } from '~/compositions/useWPTitle';
const version = useVersion(); const version = useVersion();
const { t } = useI18n();
useWPTitle(computed(() => [t('info'), t('admin.settings.settings')]));
</script> </script>

View File

@ -34,6 +34,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import IconButton from '~/components/atomic/IconButton.vue'; import IconButton from '~/components/atomic/IconButton.vue';
@ -43,6 +44,7 @@ import useApiClient from '~/compositions/useApiClient';
import { useAsyncAction } from '~/compositions/useAsyncAction'; import { useAsyncAction } from '~/compositions/useAsyncAction';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { Org } from '~/lib/api/types'; import type { Org } from '~/lib/api/types';
const apiClient = useApiClient(); const apiClient = useApiClient();
@ -65,4 +67,6 @@ const { doSubmit: deleteOrg, isLoading: isDeleting } = useAsyncAction(async (_or
notifications.notify({ title: t('admin.settings.orgs.deleted'), type: 'success' }); notifications.notify({ title: t('admin.settings.orgs.deleted'), type: 'success' });
resetPage(); resetPage();
}); });
useWPTitle(computed(() => [t('admin.settings.orgs.orgs'), t('admin.settings.settings')]));
</script> </script>

View File

@ -93,6 +93,7 @@ import ListItem from '~/components/atomic/ListItem.vue';
import Settings from '~/components/layout/Settings.vue'; import Settings from '~/components/layout/Settings.vue';
import useApiClient from '~/compositions/useApiClient'; import useApiClient from '~/compositions/useApiClient';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { QueueInfo } from '~/lib/api/types'; import type { QueueInfo } from '~/lib/api/types';
const apiClient = useApiClient(); const apiClient = useApiClient();
@ -159,4 +160,6 @@ onBeforeUnmount(() => {
window.clearInterval(reloadInterval.value); window.clearInterval(reloadInterval.value);
} }
}); });
useWPTitle(computed(() => [t('admin.settings.queue.queue'), t('admin.settings.settings')]));
</script> </script>

View File

@ -50,6 +50,7 @@ import useApiClient from '~/compositions/useApiClient';
import { useAsyncAction } from '~/compositions/useAsyncAction'; import { useAsyncAction } from '~/compositions/useAsyncAction';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { Registry } from '~/lib/api/types'; import type { Registry } from '~/lib/api/types';
const emptyRegistry: Partial<Registry> = { const emptyRegistry: Partial<Registry> = {
@ -102,4 +103,6 @@ function editRegistry(registry: Registry) {
function showAddRegistry() { function showAddRegistry() {
selectedRegistry.value = cloneDeep(emptyRegistry); selectedRegistry.value = cloneDeep(emptyRegistry);
} }
useWPTitle(computed(() => [i18n.t('registries.registries'), i18n.t('admin.settings.settings')]));
</script> </script>

View File

@ -43,6 +43,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import Badge from '~/components/atomic/Badge.vue'; import Badge from '~/components/atomic/Badge.vue';
@ -54,6 +55,7 @@ import useApiClient from '~/compositions/useApiClient';
import { useAsyncAction } from '~/compositions/useAsyncAction'; import { useAsyncAction } from '~/compositions/useAsyncAction';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { Repo } from '~/lib/api/types'; import type { Repo } from '~/lib/api/types';
const apiClient = useApiClient(); const apiClient = useApiClient();
@ -70,4 +72,6 @@ const { doSubmit: repairRepos, isLoading: isRepairingRepos } = useAsyncAction(as
await apiClient.repairAllRepos(); await apiClient.repairAllRepos();
notifications.notify({ title: i18n.t('admin.settings.repos.repair.success'), type: 'success' }); notifications.notify({ title: i18n.t('admin.settings.repos.repair.success'), type: 'success' });
}); });
useWPTitle(computed(() => [i18n.t('admin.settings.repos.repos'), i18n.t('admin.settings.settings')]));
</script> </script>

View File

@ -45,6 +45,7 @@ import useApiClient from '~/compositions/useApiClient';
import { useAsyncAction } from '~/compositions/useAsyncAction'; import { useAsyncAction } from '~/compositions/useAsyncAction';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { Secret } from '~/lib/api/types'; import type { Secret } from '~/lib/api/types';
import { WebhookEvents } from '~/lib/api/types'; import { WebhookEvents } from '~/lib/api/types';
@ -99,4 +100,6 @@ function editSecret(secret: Secret) {
function showAddSecret() { function showAddSecret() {
selectedSecret.value = cloneDeep(emptySecret); selectedSecret.value = cloneDeep(emptySecret);
} }
useWPTitle(computed(() => [i18n.t('secrets.secrets'), i18n.t('admin.settings.settings')]));
</script> </script>

View File

@ -1,7 +1,7 @@
<template> <template>
<Scaffold enable-tabs> <Scaffold enable-tabs>
<template #title> <template #title>
{{ $t('settings') }} {{ $t('admin.settings.settings') }}
</template> </template>
<Tab icon="info" :to="{ name: 'admin-settings' }" :title="$t('info')" /> <Tab icon="info" :to="{ name: 'admin-settings' }" :title="$t('info')" />
<Tab icon="secret" :to="{ name: 'admin-settings-secrets' }" :title="$t('secrets.secrets')" /> <Tab icon="secret" :to="{ name: 'admin-settings-secrets' }" :title="$t('secrets.secrets')" />

View File

@ -98,6 +98,7 @@ import useApiClient from '~/compositions/useApiClient';
import { useAsyncAction } from '~/compositions/useAsyncAction'; import { useAsyncAction } from '~/compositions/useAsyncAction';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { User } from '~/lib/api/types'; import type { User } from '~/lib/api/types';
const apiClient = useApiClient(); const apiClient = useApiClient();
@ -153,4 +154,6 @@ function editUser(user: User) {
function showAddUser() { function showAddUser() {
selectedUser.value = cloneDeep({ login: '' }); selectedUser.value = cloneDeep({ login: '' });
} }
useWPTitle(computed(() => [t('admin.settings.users.users'), t('admin.settings.settings')]));
</script> </script>

View File

@ -24,6 +24,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, onMounted, ref } from 'vue'; import { computed, onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import IconButton from '~/components/atomic/IconButton.vue'; import IconButton from '~/components/atomic/IconButton.vue';
import Scaffold from '~/components/layout/scaffold/Scaffold.vue'; import Scaffold from '~/components/layout/scaffold/Scaffold.vue';
@ -31,6 +32,7 @@ import RepoItem from '~/components/repo/RepoItem.vue';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import useRepos from '~/compositions/useRepos'; import useRepos from '~/compositions/useRepos';
import { useRepoSearch } from '~/compositions/useRepoSearch'; import { useRepoSearch } from '~/compositions/useRepoSearch';
import { useWPTitle } from '~/compositions/useWPTitle';
import { useRepoStore } from '~/store/repos'; import { useRepoStore } from '~/store/repos';
const repoStore = useRepoStore(); const repoStore = useRepoStore();
@ -51,4 +53,7 @@ const reposLastActivity = computed(() => sortReposByLastActivity(searchedRepos.v
onMounted(async () => { onMounted(async () => {
await repoStore.loadRepos(); // TODO: load only org repos await repoStore.loadRepos(); // TODO: load only org repos
}); });
const { t } = useI18n();
useWPTitle(computed(() => [t('repositories.title'), org.value.name]));
</script> </script>

View File

@ -9,9 +9,13 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import AgentManager from '~/components/agent/AgentManager.vue'; import AgentManager from '~/components/agent/AgentManager.vue';
import useApiClient from '~/compositions/useApiClient'; import useApiClient from '~/compositions/useApiClient';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { Agent } from '~/lib/api/types'; import type { Agent } from '~/lib/api/types';
const apiClient = useApiClient(); const apiClient = useApiClient();
@ -21,4 +25,7 @@ const loadAgents = (page: number) => apiClient.getOrgAgents(org.value.id, { page
const createAgent = (agent: Partial<Agent>) => apiClient.createOrgAgent(org.value.id, agent); const createAgent = (agent: Partial<Agent>) => apiClient.createOrgAgent(org.value.id, agent);
const updateAgent = (agent: Agent) => apiClient.updateOrgAgent(org.value.id, agent.id, agent); const updateAgent = (agent: Agent) => apiClient.updateOrgAgent(org.value.id, agent.id, agent);
const deleteAgent = (agent: Agent) => apiClient.deleteOrgAgent(org.value.id, agent.id); const deleteAgent = (agent: Agent) => apiClient.deleteOrgAgent(org.value.id, agent.id);
const { t } = useI18n();
useWPTitle(computed(() => [t('admin.settings.agents.agents'), org.value.name]));
</script> </script>

View File

@ -46,6 +46,7 @@ import { useAsyncAction } from '~/compositions/useAsyncAction';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { Registry } from '~/lib/api/types'; import type { Registry } from '~/lib/api/types';
const emptyRegistry: Partial<Registry> = { const emptyRegistry: Partial<Registry> = {
@ -99,4 +100,6 @@ function editRegistry(registry: Registry) {
function showAddRegistry() { function showAddRegistry() {
selectedRegistry.value = cloneDeep(emptyRegistry); selectedRegistry.value = cloneDeep(emptyRegistry);
} }
useWPTitle(computed(() => [i18n.t('registries.registries'), org.value.name]));
</script> </script>

View File

@ -37,6 +37,7 @@ import { useAsyncAction } from '~/compositions/useAsyncAction';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
import { WebhookEvents } from '~/lib/api/types'; import { WebhookEvents } from '~/lib/api/types';
import type { Secret } from '~/lib/api/types'; import type { Secret } from '~/lib/api/types';
@ -92,4 +93,6 @@ function editSecret(secret: Secret) {
function showAddSecret() { function showAddSecret() {
selectedSecret.value = cloneDeep(emptySecret); selectedSecret.value = cloneDeep(emptySecret);
} }
useWPTitle(computed(() => [i18n.t('secrets.secrets'), org.value.name]));
</script> </script>

View File

@ -7,9 +7,11 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, toRef } from 'vue'; import { computed, toRef } from 'vue';
import { useI18n } from 'vue-i18n';
import PipelineList from '~/components/repo/pipeline/PipelineList.vue'; import PipelineList from '~/components/repo/pipeline/PipelineList.vue';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import { useWPTitle } from '~/compositions/useWPTitle';
const props = defineProps<{ const props = defineProps<{
branch: string; branch: string;
@ -24,4 +26,7 @@ const pipelines = computed(() =>
(b) => b.branch === branch.value && b.event !== 'pull_request' && b.event !== 'pull_request_closed', (b) => b.branch === branch.value && b.event !== 'pull_request' && b.event !== 'pull_request_closed',
), ),
); );
const { t } = useI18n();
useWPTitle(computed(() => [t('repo.activity'), branch.value, repo.value.full_name]));
</script> </script>

View File

@ -22,6 +22,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, watch } from 'vue'; import { computed, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import Badge from '~/components/atomic/Badge.vue'; import Badge from '~/components/atomic/Badge.vue';
import Icon from '~/components/atomic/Icon.vue'; import Icon from '~/components/atomic/Icon.vue';
@ -30,6 +31,7 @@ import Panel from '~/components/layout/Panel.vue';
import useApiClient from '~/compositions/useApiClient'; import useApiClient from '~/compositions/useApiClient';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
const apiClient = useApiClient(); const apiClient = useApiClient();
@ -56,4 +58,7 @@ const branchesWithDefaultBranchFirst = computed(() =>
); );
watch(repo, resetPage); watch(repo, resetPage);
const { t } = useI18n();
useWPTitle(computed(() => [t('repo.branches'), repo.value.full_name]));
</script> </script>

View File

@ -39,6 +39,7 @@ import Panel from '~/components/layout/Panel.vue';
import useApiClient from '~/compositions/useApiClient'; import useApiClient from '~/compositions/useApiClient';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import { usePaginate } from '~/compositions/usePaginate'; import { usePaginate } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
defineProps<{ defineProps<{
open: boolean; open: boolean;
@ -103,4 +104,6 @@ async function triggerManualPipeline() {
loading.value = false; loading.value = false;
} }
useWPTitle(computed(() => [i18n.t('repo.manual_pipeline.trigger'), repo.value.full_name]));
</script> </script>

View File

@ -3,9 +3,16 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import PipelineList from '~/components/repo/pipeline/PipelineList.vue'; import PipelineList from '~/components/repo/pipeline/PipelineList.vue';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import { useWPTitle } from '~/compositions/useWPTitle';
const repo = requiredInject('repo'); const repo = requiredInject('repo');
const pipelines = requiredInject('pipelines'); const pipelines = requiredInject('pipelines');
const { t } = useI18n();
useWPTitle(computed(() => [t('repo.activity'), repo.value.full_name]));
</script> </script>

View File

@ -7,9 +7,11 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, toRef } from 'vue'; import { computed, toRef } from 'vue';
import { useI18n } from 'vue-i18n';
import PipelineList from '~/components/repo/pipeline/PipelineList.vue'; import PipelineList from '~/components/repo/pipeline/PipelineList.vue';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import { useWPTitle } from '~/compositions/useWPTitle';
const props = defineProps<{ const props = defineProps<{
pullRequest: string; pullRequest: string;
@ -34,4 +36,7 @@ const pipelines = computed(() =>
.replaceAll('/head', '') === pullRequest.value, .replaceAll('/head', '') === pullRequest.value,
), ),
); );
const { t } = useI18n();
useWPTitle(computed(() => [t('repo.activity'), pullRequest.value, repo.value.full_name]));
</script> </script>

View File

@ -26,7 +26,8 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { watch } from 'vue'; import { computed, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import Icon from '~/components/atomic/Icon.vue'; import Icon from '~/components/atomic/Icon.vue';
import ListItem from '~/components/atomic/ListItem.vue'; import ListItem from '~/components/atomic/ListItem.vue';
@ -34,6 +35,7 @@ import Panel from '~/components/layout/Panel.vue';
import useApiClient from '~/compositions/useApiClient'; import useApiClient from '~/compositions/useApiClient';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { PullRequest } from '~/lib/api/types'; import type { PullRequest } from '~/lib/api/types';
const apiClient = useApiClient(); const apiClient = useApiClient();
@ -50,4 +52,7 @@ async function loadPullRequests(page: number): Promise<PullRequest[]> {
const { resetPage, data: pullRequests, loading } = usePagination(loadPullRequests); const { resetPage, data: pullRequests, loading } = usePagination(loadPullRequests);
watch(repo, resetPage); watch(repo, resetPage);
const { t } = useI18n();
useWPTitle(computed(() => [t('repo.pull_requests'), repo.value.full_name]));
</script> </script>

View File

@ -76,6 +76,7 @@ import useApiClient from '~/compositions/useApiClient';
import { useAsyncAction } from '~/compositions/useAsyncAction'; import { useAsyncAction } from '~/compositions/useAsyncAction';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { PipelineStep } from '~/lib/api/types'; import type { PipelineStep } from '~/lib/api/types';
const props = defineProps<{ const props = defineProps<{
@ -144,4 +145,12 @@ const { doSubmit: declinePipeline, isLoading: isDecliningPipeline } = useAsyncAc
await apiClient.declinePipeline(repo.value.id, `${pipeline.value.number}`); await apiClient.declinePipeline(repo.value.id, `${pipeline.value.number}`);
notifications.notify({ title: i18n.t('repo.pipeline.protected.decline_success'), type: 'success' }); notifications.notify({ title: i18n.t('repo.pipeline.protected.decline_success'), type: 'success' });
}); });
useWPTitle(
computed(() => [
i18n.t('repo.pipeline.tasks'),
i18n.t('repo.pipeline.pipeline', { pipelineId: pipeline.value.id }),
repo.value.full_name,
]),
);
</script> </script>

View File

@ -7,8 +7,22 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import Panel from '~/components/layout/Panel.vue'; import Panel from '~/components/layout/Panel.vue';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import { useWPTitle } from '~/compositions/useWPTitle';
const repo = requiredInject('repo');
const pipeline = requiredInject('pipeline'); const pipeline = requiredInject('pipeline');
const { t } = useI18n();
useWPTitle(
computed(() => [
t('repo.pipeline.files'),
t('repo.pipeline.pipeline', { pipelineId: pipeline.value.id }),
repo.value.full_name,
]),
);
</script> </script>

View File

@ -15,11 +15,15 @@
<script lang="ts" setup> <script lang="ts" setup>
import { decode } from 'js-base64'; import { decode } from 'js-base64';
import { computed } from 'vue'; import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import SyntaxHighlight from '~/components/atomic/SyntaxHighlight'; import SyntaxHighlight from '~/components/atomic/SyntaxHighlight';
import Panel from '~/components/layout/Panel.vue'; import Panel from '~/components/layout/Panel.vue';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import { useWPTitle } from '~/compositions/useWPTitle';
const repo = requiredInject('repo');
const pipeline = requiredInject('pipeline');
const pipelineConfigs = requiredInject('pipeline-configs'); const pipelineConfigs = requiredInject('pipeline-configs');
const pipelineConfigsDecoded = computed( const pipelineConfigsDecoded = computed(
@ -29,4 +33,13 @@ const pipelineConfigsDecoded = computed(
data: decode(i.data), data: decode(i.data),
})) ?? [], })) ?? [],
); );
const { t } = useI18n();
useWPTitle(
computed(() => [
t('repo.pipeline.config'),
t('repo.pipeline.pipeline', { pipelineId: pipeline.value.id }),
repo.value.full_name,
]),
);
</script> </script>

View File

@ -27,6 +27,7 @@ import Panel from '~/components/layout/Panel.vue';
import useApiClient from '~/compositions/useApiClient'; import useApiClient from '~/compositions/useApiClient';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { useWPTitle } from '~/compositions/useWPTitle';
const { t } = useI18n(); const { t } = useI18n();
const apiClient = useApiClient(); const apiClient = useApiClient();
@ -74,4 +75,12 @@ async function downloadMetadata() {
isLoading.value = false; isLoading.value = false;
} }
} }
useWPTitle(
computed(() => [
t('repo.pipeline.debug.title'),
t('repo.pipeline.pipeline', { pipelineId: pipeline.value.id }),
repo.value.full_name,
]),
);
</script> </script>

View File

@ -48,13 +48,18 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import DocsLink from '~/components/atomic/DocsLink.vue'; import DocsLink from '~/components/atomic/DocsLink.vue';
import Icon from '~/components/atomic/Icon.vue'; import Icon from '~/components/atomic/Icon.vue';
import RenderMarkdown from '~/components/atomic/RenderMarkdown.vue'; import RenderMarkdown from '~/components/atomic/RenderMarkdown.vue';
import Panel from '~/components/layout/Panel.vue'; import Panel from '~/components/layout/Panel.vue';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { PipelineError } from '~/lib/api/types'; import type { PipelineError } from '~/lib/api/types';
const repo = requiredInject('repo');
const pipeline = requiredInject('pipeline'); const pipeline = requiredInject('pipeline');
function isLinterError(error: PipelineError): error is PipelineError<{ file?: string; field: string }> { function isLinterError(error: PipelineError): error is PipelineError<{ file?: string; field: string }> {
@ -70,4 +75,13 @@ function isDeprecationError(
function isBadHabitError(error: PipelineError): error is PipelineError<{ file?: string; field: string; docs: string }> { function isBadHabitError(error: PipelineError): error is PipelineError<{ file?: string; field: string; docs: string }> {
return error.type === 'bad_habit'; return error.type === 'bad_habit';
} }
const { t } = useI18n();
useWPTitle(
computed(() => [
pipeline.value.errors?.some((e) => !e.is_warning) ? t('repo.pipeline.errors') : t('repo.pipeline.warnings'),
t('repo.pipeline.pipeline', { pipelineId: pipeline.value.id }),
repo.value.full_name,
]),
);
</script> </script>

View File

@ -52,6 +52,7 @@ import useApiClient from '~/compositions/useApiClient';
import { useAsyncAction } from '~/compositions/useAsyncAction'; import { useAsyncAction } from '~/compositions/useAsyncAction';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { useWPTitle } from '~/compositions/useWPTitle';
const apiClient = useApiClient(); const apiClient = useApiClient();
const router = useRouter(); const router = useRouter();
@ -89,4 +90,6 @@ const { doSubmit: deactivateRepo, isLoading: isDeactivatingRepo } = useAsyncActi
}); });
const isActive = computed(() => repo?.value.active); const isActive = computed(() => repo?.value.active);
useWPTitle(computed(() => [i18n.t('repo.settings.actions.actions'), repo.value.full_name]));
</script> </script>

View File

@ -42,6 +42,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useStorage } from '@vueuse/core'; import { useStorage } from '@vueuse/core';
import { computed, onMounted, ref, watch } from 'vue'; import { computed, onMounted, ref, watch } from 'vue';
import { useI18n } from 'vue-i18n';
import type { SelectOption } from '~/components/form/form.types'; import type { SelectOption } from '~/components/form/form.types';
import InputField from '~/components/form/InputField.vue'; import InputField from '~/components/form/InputField.vue';
@ -51,6 +52,7 @@ import useApiClient from '~/compositions/useApiClient';
import useConfig from '~/compositions/useConfig'; import useConfig from '~/compositions/useConfig';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import { usePaginate } from '~/compositions/usePaginate'; import { usePaginate } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
const apiClient = useApiClient(); const apiClient = useApiClient();
const repo = requiredInject('repo'); const repo = requiredInject('repo');
@ -109,4 +111,7 @@ onMounted(() => {
watch(repo, () => { watch(repo, () => {
loadBranches(); loadBranches();
}); });
const { t } = useI18n();
useWPTitle(computed(() => [t('repo.settings.badge.badge'), repo.value.full_name]));
</script> </script>

View File

@ -120,6 +120,7 @@ import { useDate } from '~/compositions/useDate';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { Cron } from '~/lib/api/types'; import type { Cron } from '~/lib/api/types';
import router from '~/router'; import router from '~/router';
@ -171,4 +172,6 @@ const { doSubmit: runCron } = useAsyncAction(async (_cron: Cron) => {
}, },
}); });
}); });
useWPTitle(computed(() => [i18n.t('repo.settings.crons.crons'), repo.value.full_name]));
</script> </script>

View File

@ -171,7 +171,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { onMounted, ref } from 'vue'; import { computed, onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import Button from '~/components/atomic/Button.vue'; import Button from '~/components/atomic/Button.vue';
@ -188,6 +188,7 @@ import { useAsyncAction } from '~/compositions/useAsyncAction';
import useAuthentication from '~/compositions/useAuthentication'; import useAuthentication from '~/compositions/useAuthentication';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { useWPTitle } from '~/compositions/useWPTitle';
import { RepoRequireApproval, RepoVisibility, WebhookEvents } from '~/lib/api/types'; import { RepoRequireApproval, RepoVisibility, WebhookEvents } from '~/lib/api/types';
import type { RepoSettings } from '~/lib/api/types'; import type { RepoSettings } from '~/lib/api/types';
import { useRepoStore } from '~/store/repos'; import { useRepoStore } from '~/store/repos';
@ -294,4 +295,6 @@ function removeUser(user: string) {
repoSettings.value.approval_allowed_users = repoSettings.value.approval_allowed_users.filter((i) => i !== user); repoSettings.value.approval_allowed_users = repoSettings.value.approval_allowed_users.filter((i) => i !== user);
} }
useWPTitle(computed(() => [i18n.t('repo.settings.general.project'), repo.value.full_name]));
</script> </script>

View File

@ -42,6 +42,7 @@ import { useAsyncAction } from '~/compositions/useAsyncAction';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { Registry } from '~/lib/api/types'; import type { Registry } from '~/lib/api/types';
const emptyRegistry: Partial<Registry> = { const emptyRegistry: Partial<Registry> = {
@ -96,4 +97,6 @@ function editRegistry(registry: Registry) {
function showAddRegistry() { function showAddRegistry() {
selectedRegistry.value = cloneDeep(emptyRegistry); selectedRegistry.value = cloneDeep(emptyRegistry);
} }
useWPTitle(computed(() => [i18n.t('registries.registries'), repo.value.full_name]));
</script> </script>

View File

@ -37,6 +37,7 @@ import { useAsyncAction } from '~/compositions/useAsyncAction';
import { requiredInject } from '~/compositions/useInjectProvide'; import { requiredInject } from '~/compositions/useInjectProvide';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
import { WebhookEvents } from '~/lib/api/types'; import { WebhookEvents } from '~/lib/api/types';
import type { Secret } from '~/lib/api/types'; import type { Secret } from '~/lib/api/types';
@ -129,4 +130,6 @@ function editSecret(secret: Secret) {
function showAddSecret() { function showAddSecret() {
selectedSecret.value = cloneDeep(emptySecret); selectedSecret.value = cloneDeep(emptySecret);
} }
useWPTitle(computed(() => [i18n.t('secrets.secrets'), repo.value.full_name]));
</script> </script>

View File

@ -9,9 +9,13 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed } from 'vue';
import { useI18n } from 'vue-i18n';
import AgentManager from '~/components/agent/AgentManager.vue'; import AgentManager from '~/components/agent/AgentManager.vue';
import useApiClient from '~/compositions/useApiClient'; import useApiClient from '~/compositions/useApiClient';
import useAuthentication from '~/compositions/useAuthentication'; import useAuthentication from '~/compositions/useAuthentication';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { Agent } from '~/lib/api/types'; import type { Agent } from '~/lib/api/types';
const apiClient = useApiClient(); const apiClient = useApiClient();
@ -25,4 +29,7 @@ const loadAgents = (page: number) => apiClient.getOrgAgents(user.org_id, { page
const createAgent = (agent: Partial<Agent>) => apiClient.createOrgAgent(user.org_id, agent); const createAgent = (agent: Partial<Agent>) => apiClient.createOrgAgent(user.org_id, agent);
const updateAgent = (agent: Agent) => apiClient.updateOrgAgent(user.org_id, agent.id, agent); const updateAgent = (agent: Agent) => apiClient.updateOrgAgent(user.org_id, agent.id, agent);
const deleteAgent = (agent: Agent) => apiClient.deleteOrgAgent(user.org_id, agent.id); const deleteAgent = (agent: Agent) => apiClient.deleteOrgAgent(user.org_id, agent.id);
const { t } = useI18n();
useWPTitle(computed(() => [t('admin.settings.agents.agents'), t('user.settings.settings')]));
</script> </script>

View File

@ -34,12 +34,14 @@
<script lang="ts" setup> <script lang="ts" setup>
import { computed, onMounted, ref } from 'vue'; import { computed, onMounted, ref } from 'vue';
import { useI18n } from 'vue-i18n';
import Button from '~/components/atomic/Button.vue'; import Button from '~/components/atomic/Button.vue';
import InputField from '~/components/form/InputField.vue'; import InputField from '~/components/form/InputField.vue';
import Settings from '~/components/layout/Settings.vue'; import Settings from '~/components/layout/Settings.vue';
import useApiClient from '~/compositions/useApiClient'; import useApiClient from '~/compositions/useApiClient';
import useConfig from '~/compositions/useConfig'; import useConfig from '~/compositions/useConfig';
import { useWPTitle } from '~/compositions/useWPTitle';
const { rootPath, enableSwagger } = useConfig(); const { rootPath, enableSwagger } = useConfig();
@ -68,4 +70,7 @@ const resetToken = async () => {
token.value = await apiClient.resetToken(); token.value = await apiClient.resetToken();
window.location.href = `${address}/logout`; window.location.href = `${address}/logout`;
}; };
const { t } = useI18n();
useWPTitle(computed(() => [t('user.settings.cli_and_api.cli_and_api'), t('user.settings.settings')]));
</script> </script>

View File

@ -28,8 +28,9 @@ import SelectField from '~/components/form/SelectField.vue';
import Settings from '~/components/layout/Settings.vue'; import Settings from '~/components/layout/Settings.vue';
import { setI18nLanguage } from '~/compositions/useI18n'; import { setI18nLanguage } from '~/compositions/useI18n';
import { useTheme } from '~/compositions/useTheme'; import { useTheme } from '~/compositions/useTheme';
import { useWPTitle } from '~/compositions/useWPTitle';
const { locale } = useI18n(); const { locale, t } = useI18n();
const { storeTheme } = useTheme(); const { storeTheme } = useTheme();
const localeOptions = computed(() => const localeOptions = computed(() =>
@ -49,4 +50,6 @@ const selectedLocale = computed<string>({
return storedLocale.value; return storedLocale.value;
}, },
}); });
useWPTitle(computed(() => [t('user.settings.general.general'), t('user.settings.settings')]));
</script> </script>

View File

@ -46,6 +46,7 @@ import { useAsyncAction } from '~/compositions/useAsyncAction';
import useAuthentication from '~/compositions/useAuthentication'; import useAuthentication from '~/compositions/useAuthentication';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
import type { Registry } from '~/lib/api/types'; import type { Registry } from '~/lib/api/types';
const emptyRegistry: Partial<Registry> = { const emptyRegistry: Partial<Registry> = {
@ -106,4 +107,6 @@ function editRegistry(registry: Registry) {
function showAddRegistry() { function showAddRegistry() {
selectedRegistry.value = cloneDeep(emptyRegistry); selectedRegistry.value = cloneDeep(emptyRegistry);
} }
useWPTitle(computed(() => [i18n.t('registries.registries'), i18n.t('user.settings.settings')]));
</script> </script>

View File

@ -41,6 +41,7 @@ import { useAsyncAction } from '~/compositions/useAsyncAction';
import useAuthentication from '~/compositions/useAuthentication'; import useAuthentication from '~/compositions/useAuthentication';
import useNotifications from '~/compositions/useNotifications'; import useNotifications from '~/compositions/useNotifications';
import { usePagination } from '~/compositions/usePaginate'; import { usePagination } from '~/compositions/usePaginate';
import { useWPTitle } from '~/compositions/useWPTitle';
import { WebhookEvents } from '~/lib/api/types'; import { WebhookEvents } from '~/lib/api/types';
import type { Secret } from '~/lib/api/types'; import type { Secret } from '~/lib/api/types';
@ -103,4 +104,6 @@ function editSecret(secret: Secret) {
function showAddSecret() { function showAddSecret() {
selectedSecret.value = cloneDeep(emptySecret); selectedSecret.value = cloneDeep(emptySecret);
} }
useWPTitle(computed(() => [i18n.t('secrets.secrets'), i18n.t('user.settings.settings')]));
</script> </script>