diff --git a/web/src/assets/locales/en.json b/web/src/assets/locales/en.json index cc983c5c6..3dc524a52 100644 --- a/web/src/assets/locales/en.json +++ b/web/src/assets/locales/en.json @@ -526,5 +526,49 @@ "desc": "Pipelines created by the listed users never require approval." } }, - "no_search_results": "No results found" + "no_search_results": "No results found", + "forges": "Forges", + "forges_desc": "Configure forges hosting repositories Woopecker should run for.", + "add_forge": "Add forge", + "show_forges": "Show forges", + "github": "GitHub", + "gitlab": "GitLab", + "bitbucket": "Bitbucket", + "bitbucket_dc": "Bitbucket Data Center", + "gitea": "Gitea", + "forgejo": "Forgejo", + "addon": "Addon", + "forge_type": "Forge type", + "oauth_client_id": "OAuth Client ID", + "oauth_client_secret": "OAuth Client Secret", + "oauth_host": "OAuth host", + "merge_ref": "Merge ref", + "merge_ref_desc": "Ref to use for merge base. This is used to determine the diff for pull requests.", + "public_only": "Public only", + "public_only_desc": "Only show public repositories.", + "git_username": "Git username", + "git_username_desc": "Username for the Git user.", + "git_password": "Git password", + "git_password_desc": "Password or personal access token for the Git user.", + "executable": "Executable", + "executable_desc": "Path to the addon executable.", + "save": "Save", + "add": "Add", + "skip_verify": "Skip SSL verification", + "skip_verify_desc": "Skip SSL verification for the API connection. This is not recommended for production use.", + "url": "URL", + "forge_managed_by_env": "The primary forge is managed by environment variables. Any changes to this forge will be reverted on a restart.", + "oauth_redirect_uri": "OAuth redirect URI", + "forge_created": "Forge created", + "advanced_options": "Advanced options", + "leave_empty_to_keep_current_value": "Leave empty to keep current value", + "forge_deleted": "Forge deleted", + "forge_delete_confirm": "Do you really want to delete this forge? This will also delete all repositories, users and pipelines related to this forge.", + "edit_forge": "Edit forge", + "delete_forge": "Delete forge", + "no_forges": "There are no forges yet.", + "use_this_redirect_uri_to_create": "Use this redirect URI to create or update the OAuth application. Go to {0} and setup the OAuth application.", + "developer_settings": "Developer settings", + "public_url_for_oauth_if": "Public URL for OAuth if different from URL ({0})", + "forge_saved": "Forge saved" } diff --git a/web/src/components/admin/settings/forges/AdminForgeForm.vue b/web/src/components/admin/settings/forges/AdminForgeForm.vue new file mode 100644 index 000000000..77abf9a8b --- /dev/null +++ b/web/src/components/admin/settings/forges/AdminForgeForm.vue @@ -0,0 +1,271 @@ + + + diff --git a/web/src/components/atomic/Icon.vue b/web/src/components/atomic/Icon.vue index e5caf2a54..371bdcd97 100644 --- a/web/src/components/atomic/Icon.vue +++ b/web/src/components/atomic/Icon.vue @@ -63,6 +63,7 @@ + @@ -112,6 +113,7 @@ import { mdiClockTimeEightOutline, mdiClose, mdiCloseCircle, + mdiCodeBraces, mdiCog, mdiCogOutline, mdiConsole, @@ -227,7 +229,8 @@ export type IconNames = | 'user' | 'org' | 'cron' - | 'toolbox'; + | 'toolbox' + | 'forge'; const props = defineProps<{ name: IconNames; diff --git a/web/src/components/layout/RouteWrapper.vue b/web/src/components/layout/RouteWrapper.vue new file mode 100644 index 000000000..98240aef8 --- /dev/null +++ b/web/src/components/layout/RouteWrapper.vue @@ -0,0 +1,3 @@ + diff --git a/web/src/lib/api/types/forge.ts b/web/src/lib/api/types/forge.ts index cd1092773..327924252 100644 --- a/web/src/lib/api/types/forge.ts +++ b/web/src/lib/api/types/forge.ts @@ -1,4 +1,4 @@ -export type ForgeType = 'github' | 'gitlab' | 'gitea' | 'bitbucket' | 'bitbucket-dc' | 'addon'; +export type ForgeType = 'github' | 'gitlab' | 'gitea' | 'bitbucket' | 'bitbucket-dc' | 'addon' | 'forgejo'; export interface Forge { id: number; diff --git a/web/src/router.ts b/web/src/router.ts index 6e485eb1b..0c509db1d 100644 --- a/web/src/router.ts +++ b/web/src/router.ts @@ -219,56 +219,70 @@ const routes: RouteRecordRaw[] = [ { path: `${rootPath}/admin`, component: (): Component => import('~/views/admin/AdminSettingsWrapper.vue'), - props: true, meta: { authentication: 'required' }, children: [ { path: '', name: 'admin-settings', component: (): Component => import('~/views/admin/AdminInfo.vue'), - props: true, }, { path: 'secrets', name: 'admin-settings-secrets', component: (): Component => import('~/views/admin/AdminSecrets.vue'), - props: true, }, { path: 'registries', name: 'admin-settings-registries', component: (): Component => import('~/views/admin/AdminRegistries.vue'), - props: true, }, { path: 'repos', name: 'admin-settings-repos', component: (): Component => import('~/views/admin/AdminRepos.vue'), - props: true, }, { path: 'users', name: 'admin-settings-users', component: (): Component => import('~/views/admin/AdminUsers.vue'), - props: true, }, { path: 'orgs', name: 'admin-settings-orgs', component: (): Component => import('~/views/admin/AdminOrgs.vue'), - props: true, }, { path: 'agents', name: 'admin-settings-agents', component: (): Component => import('~/views/admin/AdminAgents.vue'), - props: true, }, { path: 'queue', name: 'admin-settings-queue', component: (): Component => import('~/views/admin/AdminQueue.vue'), + }, + { + path: 'forges', + component: (): Component => import('~/components/layout/RouteWrapper.vue'), props: true, + children: [ + { + path: '', + name: 'admin-settings-forges', + component: (): Component => import('~/views/admin/forges/AdminForges.vue'), + }, + { + path: ':forgeId', + name: 'admin-settings-forge', + component: (): Component => import('~/views/admin/forges/AdminForge.vue'), + props: true, + }, + { + path: 'create', + name: 'admin-settings-forge-create', + component: (): Component => import('~/views/admin/forges/AdminForgeCreate.vue'), + }, + ], }, ], }, diff --git a/web/src/views/admin/AdminSettingsWrapper.vue b/web/src/views/admin/AdminSettingsWrapper.vue index 9cd390d6f..9289b49b6 100644 --- a/web/src/views/admin/AdminSettingsWrapper.vue +++ b/web/src/views/admin/AdminSettingsWrapper.vue @@ -11,6 +11,7 @@ + diff --git a/web/src/views/admin/forges/AdminForge.vue b/web/src/views/admin/forges/AdminForge.vue new file mode 100644 index 000000000..9e8a889bf --- /dev/null +++ b/web/src/views/admin/forges/AdminForge.vue @@ -0,0 +1,59 @@ + + + diff --git a/web/src/views/admin/forges/AdminForgeCreate.vue b/web/src/views/admin/forges/AdminForgeCreate.vue new file mode 100644 index 000000000..943447cb4 --- /dev/null +++ b/web/src/views/admin/forges/AdminForgeCreate.vue @@ -0,0 +1,44 @@ + + + diff --git a/web/src/views/admin/forges/AdminForges.vue b/web/src/views/admin/forges/AdminForges.vue new file mode 100644 index 000000000..03b1c578f --- /dev/null +++ b/web/src/views/admin/forges/AdminForges.vue @@ -0,0 +1,73 @@ + + +