Skip to content

Commit a2df9d7

Browse files
committed
[Orgs] Make slug changeable on Settings page
1 parent a38393c commit a2df9d7

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

components/dashboard/src/service/public-api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export function publicApiTeamToProtocol(team: Team): ProtocolTeam {
3030
return {
3131
id: team.id,
3232
name: team.name,
33+
slug: team.slug,
3334
// We do not use the creationTime in the dashboard anywhere, se we keep it empty.
3435
creationTime: "",
3536
};

components/dashboard/src/teams/TeamSettings.tsx

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export default function TeamSettings() {
2121
const [modal, setModal] = useState(false);
2222
const [teamNameToDelete, setTeamNameToDelete] = useState("");
2323
const [teamName, setTeamName] = useState(org?.name || "");
24+
const [slug, setSlug] = useState(org?.slug || "");
2425
const [errorMessage, setErrorMessage] = useState<string | undefined>(undefined);
2526
const [updated, setUpdated] = useState(false);
2627

@@ -31,14 +32,14 @@ export default function TeamSettings() {
3132
return;
3233
}
3334
try {
34-
await getGitpodService().server.updateTeam(org.id, { name: teamName });
35+
await getGitpodService().server.updateTeam(org.id, { name: teamName, slug });
3536
invalidateOrgs();
3637
setUpdated(true);
3738
setTimeout(() => setUpdated(false), 3000);
3839
} catch (error) {
3940
setErrorMessage(`Failed to update organization information: ${error.message}`);
4041
}
41-
}, [org, errorMessage, teamName, invalidateOrgs]);
42+
}, [org, errorMessage, slug, teamName, invalidateOrgs]);
4243

4344
const onNameChange = useCallback(
4445
async (event: React.ChangeEvent<HTMLInputElement>) => {
@@ -60,6 +61,26 @@ export default function TeamSettings() {
6061
[org],
6162
);
6263

64+
const onSlugChange = useCallback(
65+
async (event: React.ChangeEvent<HTMLInputElement>) => {
66+
if (!org) {
67+
return;
68+
}
69+
const newSlug = event.target.value || "";
70+
setSlug(newSlug);
71+
if (newSlug.trim().length === 0) {
72+
setErrorMessage("Organization slug can not be blank.");
73+
return;
74+
} else if (newSlug.trim().length > 100) {
75+
setErrorMessage("Organization slug must not be longer than 100 characters.");
76+
return;
77+
} else {
78+
setErrorMessage(undefined);
79+
}
80+
},
81+
[org],
82+
);
83+
6384
const deleteTeam = useCallback(async () => {
6485
if (!org || !user) {
6586
return;
@@ -95,10 +116,18 @@ export default function TeamSettings() {
95116
</div>
96117
</div>
97118
</div>
119+
<div className="flex flex-col lg:flex-row">
120+
<div>
121+
<div className="mt-4 mb-3">
122+
<h4>Slug</h4>
123+
<input type="text" value={slug} onChange={onSlugChange} />
124+
</div>
125+
</div>
126+
</div>
98127
<div className="flex flex-row">
99128
<button
100129
className="primary"
101-
disabled={org?.name === teamName || !!errorMessage}
130+
disabled={(org?.name === teamName && org?.slug === slug) || !!errorMessage}
102131
onClick={updateTeamInformation}
103132
>
104133
Update Organization Name

0 commit comments

Comments
 (0)