diff --git a/.gitpod.yml b/.gitpod.yml index 307695d657c99d..f78873258617a0 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -56,3 +56,5 @@ vscode: - timonwong.shellcheck - vscjava.vscode-java-pack - fwcd.kotlin + - dbaeumer.vscode-eslint + - esbenp.prettier-vscode diff --git a/components/dashboard/src/index.css b/components/dashboard/src/index.css index 7e5035bb1b0689..08069dd2c720f8 100644 --- a/components/dashboard/src/index.css +++ b/components/dashboard/src/index.css @@ -9,7 +9,8 @@ @tailwind utilities; @layer base { - html, body { + html, + body { @apply h-full; } body { @@ -61,30 +62,42 @@ @apply cursor-default opacity-50 pointer-events-none; } - a.gp-link { + button.gp-link { + @apply bg-transparent hover:bg-transparent p-0 rounded-none; + } + + a.gp-link, + button.gp-link { @apply text-blue-500 hover:text-blue-600 dark:text-blue-400 dark:hover:text-blue-500; } - input[type=text], input[type=search], input[type=password], select { + input[type="text"], + input[type="search"], + input[type="password"], + select { @apply block w-56 text-gray-600 dark:text-gray-400 bg-white dark:bg-gray-800 rounded-md border border-gray-300 dark:border-gray-500 focus:border-gray-400 dark:focus:border-gray-400 focus:ring-0; } - input[type=text]::placeholder, input[type=search]::placeholder, input[type=password]::placeholder { + input[type="text"]::placeholder, + input[type="search"]::placeholder, + input[type="password"]::placeholder { @apply text-gray-400 dark:text-gray-500; } - input[type=text].error, input[type=password].error, select.error { + input[type="text"].error, + input[type="password"].error, + select.error { @apply border-gitpod-red dark:border-gitpod-red focus:border-gitpod-red dark:focus:border-gitpod-red; } input[disabled] { @apply bg-gray-100 dark:bg-gray-700 border border-gray-200 dark:border-gray-600 text-gray-400 dark:text-gray-500; } - input[type=radio] { + input[type="radio"] { @apply border border-gray-300 focus:border-gray-400 focus:bg-white focus:ring-0; } - input[type=search] { + input[type="search"] { @apply border-0 dark:bg-transparent; } - input[type=checkbox] { - @apply disabled:opacity-50 + input[type="checkbox"] { + @apply disabled:opacity-50; } progress { @@ -99,4 +112,4 @@ progress::-moz-progress-bar { @apply rounded-md bg-green-500; } -} \ No newline at end of file +} diff --git a/components/dashboard/src/projects/NewProject.tsx b/components/dashboard/src/projects/NewProject.tsx index fbf1d9fc0c6894..48a3c6545245a6 100644 --- a/components/dashboard/src/projects/NewProject.tsx +++ b/components/dashboard/src/projects/NewProject.tsx @@ -4,7 +4,7 @@ * See License-AGPL.txt in the project root for license information. */ -import { useContext, useEffect, useState } from "react"; +import { useCallback, useContext, useEffect, useState } from "react"; import { getGitpodService, gitpodHostUrl } from "../service/service"; import { iconForAuthProvider, openAuthorizeWindow, simplifyProviderName } from "../provider-utils"; import { AuthProviderInfo, Project, ProviderRepository, Team, TeamMemberInfo, User } from "@gitpod/gitpod-protocol"; @@ -42,6 +42,29 @@ export default function NewProject() { const [authProviders, setAuthProviders] = useState([]); + const updateReposInAccounts = useCallback( + async (installationId?: string) => { + setLoaded(false); + setReposInAccounts([]); + if (!selectedProviderHost) { + return []; + } + try { + const repos = await getGitpodService().server.getProviderRepositoriesForUser({ + provider: selectedProviderHost, + hints: { installationId }, + }); + setReposInAccounts(repos); + setLoaded(true); + return repos; + } catch (error) { + console.log(error); + } + return []; + }, + [selectedProviderHost], + ); + useEffect(() => { if (user && selectedProviderHost === undefined) { if (user.identities.find((i) => i.authProviderId === "Public-GitLab")) { @@ -55,7 +78,7 @@ export default function NewProject() { setAuthProviders(await getGitpodService().server.getAuthProviders()); })(); } - }, [user]); + }, [selectedProviderHost, user]); useEffect(() => { const params = new URLSearchParams(location.search); @@ -69,7 +92,7 @@ export default function NewProject() { window.history.replaceState({}, "", window.location.pathname); setSelectedTeamOrUser(user); } - }, []); + }, [location.search, teams, user]); const [teamMembers, setTeamMembers] = useState>({}); useEffect(() => { @@ -123,10 +146,34 @@ export default function NewProject() { }, [selectedRepo]); useEffect(() => { + const createProject = async (teamOrUser: Team | User, repo: ProviderRepository) => { + if (!selectedProviderHost) { + return; + } + const repoSlug = repo.path || repo.name; + + try { + const project = await getGitpodService().server.createProject({ + name: repo.name, + slug: repoSlug, + cloneUrl: repo.cloneUrl, + account: repo.account, + provider: selectedProviderHost, + ...(User.is(teamOrUser) ? { userId: teamOrUser.id } : { teamId: teamOrUser.id }), + appInstallationId: String(repo.installationId), + }); + + setProject(project); + } catch (error) { + const message = (error && error?.message) || "Failed to create new project."; + window.alert(message); + } + }; + if (selectedTeamOrUser && selectedRepo) { createProject(selectedTeamOrUser, selectedRepo); } - }, [selectedTeamOrUser, selectedRepo]); + }, [selectedTeamOrUser, selectedRepo, selectedProviderHost]); useEffect(() => { if (reposInAccounts.length === 0) { @@ -155,7 +202,7 @@ export default function NewProject() { (async () => { await updateReposInAccounts(); })(); - }, [selectedProviderHost]); + }, [selectedProviderHost, updateReposInAccounts]); useEffect(() => { if (project && sourceOfConfig) { @@ -166,30 +213,10 @@ export default function NewProject() { await getGitpodService().server.triggerPrebuild(project.id, null); })(); } - }, [project, sourceOfConfig]); + }, [guessedConfigString, project, sourceOfConfig]); const isGitHub = () => selectedProviderHost === "github.com"; - const updateReposInAccounts = async (installationId?: string) => { - setLoaded(false); - setReposInAccounts([]); - if (!selectedProviderHost) { - return []; - } - try { - const repos = await getGitpodService().server.getProviderRepositoriesForUser({ - provider: selectedProviderHost, - hints: { installationId }, - }); - setReposInAccounts(repos); - setLoaded(true); - return repos; - } catch (error) { - console.log(error); - } - return []; - }; - const reconfigure = () => { openReconfigureWindow({ account: selectedAccount, @@ -203,30 +230,6 @@ export default function NewProject() { }); }; - const createProject = async (teamOrUser: Team | User, repo: ProviderRepository) => { - if (!selectedProviderHost) { - return; - } - const repoSlug = repo.path || repo.name; - - try { - const project = await getGitpodService().server.createProject({ - name: repo.name, - slug: repoSlug, - cloneUrl: repo.cloneUrl, - account: repo.account, - provider: selectedProviderHost, - ...(User.is(teamOrUser) ? { userId: teamOrUser.id } : { teamId: teamOrUser.id }), - appInstallationId: String(repo.installationId), - }); - - setProject(project); - } catch (error) { - const message = (error && error?.message) || "Failed to create new project."; - window.alert(message); - } - }; - const toSimpleName = (fullName: string) => { const splitted = fullName.split("/"); if (splitted.length < 2) { @@ -243,7 +246,7 @@ export default function NewProject() { const getDropDownEntries = (accounts: Map) => { const renderItemContent = (label: string, icon: string, addClasses?: string) => (
- + {label}
); @@ -311,9 +314,9 @@ export default function NewProject() {

{loaded && noReposAvailable ? "Select account on " : "Select a Git repository on "} {selectedProviderHost} ( - setShowGitProviders(true)}> + )

@@ -325,6 +328,7 @@ export default function NewProject() {
{showSearchInput && (
- + Search
Repository not found?{" "} - reconfigure()} - className="text-gray-400 underline underline-thickness-thin underline-offset-small hover:text-gray-600" + className="gp-link text-gray-400 underline underline-thickness-thin underline-offset-small hover:text-gray-600" > Reconfigure - +
)} @@ -682,7 +692,7 @@ function GitProviders(props: { {errorMessage && (
- + Heads up!

{errorMessage}

diff --git a/gitpod-ws.code-workspace b/gitpod-ws.code-workspace index 691f67db077e80..e4a15b7dd5baa7 100644 --- a/gitpod-ws.code-workspace +++ b/gitpod-ws.code-workspace @@ -1,60 +1,69 @@ { - "folders": [ - { "path": "." }, - { "path": "components/blobserve" }, - { "path": "components/common-go" }, - { "path": "components/content-service" }, - { "path": "components/docker-up" }, - { "path": "components/ee/agent-smith" }, - { "path": "components/gitpod-cli" }, - { "path": "components/gitpod-protocol" }, - { "path": "components/image-builder-bob" }, - { "path": "components/image-builder-mk3" }, - { "path": "components/licensor" }, - { "path": "components/local-app" }, - { "path": "components/registry-facade" }, - { "path": "components/service-waiter" }, - { "path": "components/supervisor" }, - { "path": "components/workspacekit" }, - { "path": "components/ws-daemon" }, - { "path": "components/ws-manager" }, - { "path": "components/ws-proxy" }, - { "path": "test" }, - { "path": "dev/blowtorch" }, - { "path": "dev/changelog" }, - { "path": "dev/gpctl" }, - { "path": "dev/loadgen" }, - { "path": "dev/poolkeeper" }, - { "path": "dev/sweeper" }, - { "path": "install/installer" } - ], - "settings": { - "typescript.tsdk": "gitpod/node_modules/typescript/lib", - "[json]": { - "editor.insertSpaces": true, - "editor.tabSize": 2 - }, - "[yaml]": { - "editor.insertSpaces": true, - "editor.tabSize": 2 - }, - "[go]": { - "editor.formatOnSave": true - }, - "[tf]": { - "editor.insertSpaces": true, - "editor.tabSize": 2 - }, - "go.formatTool": "goimports", - "go.useLanguageServer": true, - "workspace.supportMultiRootWorkspace": true, - "launch": {}, - "files.exclude": { - "**/.git": true - }, - "go.lintTool": "golangci-lint", - "gopls": { - "allowModfileModifications": true - } - } + "folders": [ + { "path": "." }, + { "path": "components/blobserve" }, + { "path": "components/common-go" }, + { "path": "components/content-service" }, + { "path": "components/docker-up" }, + { "path": "components/ee/agent-smith" }, + { "path": "components/gitpod-cli" }, + { "path": "components/gitpod-protocol" }, + { "path": "components/image-builder-bob" }, + { "path": "components/image-builder-mk3" }, + { "path": "components/licensor" }, + { "path": "components/local-app" }, + { "path": "components/registry-facade" }, + { "path": "components/service-waiter" }, + { "path": "components/supervisor" }, + { "path": "components/workspacekit" }, + { "path": "components/ws-daemon" }, + { "path": "components/ws-manager" }, + { "path": "components/ws-proxy" }, + { "path": "test" }, + { "path": "dev/blowtorch" }, + { "path": "dev/changelog" }, + { "path": "dev/gpctl" }, + { "path": "dev/loadgen" }, + { "path": "dev/poolkeeper" }, + { "path": "dev/sweeper" }, + { "path": "install/installer" } + ], + "settings": { + "typescript.tsdk": "gitpod/node_modules/typescript/lib", + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, + "[json]": { + "editor.insertSpaces": true, + "editor.tabSize": 2 + }, + "[yaml]": { + "editor.insertSpaces": true, + "editor.tabSize": 2 + }, + "[go]": { + "editor.formatOnSave": true + }, + "[tf]": { + "editor.insertSpaces": true, + "editor.tabSize": 2 + }, + "go.formatTool": "goimports", + "go.useLanguageServer": true, + "workspace.supportMultiRootWorkspace": true, + "launch": {}, + "files.exclude": { + "**/.git": true + }, + "go.lintTool": "golangci-lint", + "gopls": { + "allowModfileModifications": true + }, + "prettier.configPath": ".prettierrc.json" + } }