Skip to content

Commit db8f4a9

Browse files
committed
[Orgs] Make slug changeable on Settings page
1 parent d9512a7 commit db8f4a9

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
@@ -58,6 +58,7 @@ export default function TeamSettings() {
5858
const [modal, setModal] = useState(false);
5959
const [teamNameToDelete, setTeamNameToDelete] = useState("");
6060
const [teamName, setTeamName] = useState(org?.name || "");
61+
const [slug, setSlug] = useState(org?.slug || "");
6162
const [errorMessage, setErrorMessage] = useState<string | undefined>(undefined);
6263
const [updated, setUpdated] = useState(false);
6364

@@ -68,14 +69,14 @@ export default function TeamSettings() {
6869
return;
6970
}
7071
try {
71-
await getGitpodService().server.updateTeam(org.id, { name: teamName });
72+
await getGitpodService().server.updateTeam(org.id, { name: teamName, slug });
7273
invalidateOrgs();
7374
setUpdated(true);
7475
setTimeout(() => setUpdated(false), 3000);
7576
} catch (error) {
7677
setErrorMessage(`Failed to update organization information: ${error.message}`);
7778
}
78-
}, [org, errorMessage, teamName, invalidateOrgs]);
79+
}, [org, errorMessage, slug, teamName, invalidateOrgs]);
7980

8081
const onNameChange = useCallback(
8182
async (event: React.ChangeEvent<HTMLInputElement>) => {
@@ -97,6 +98,26 @@ export default function TeamSettings() {
9798
[org],
9899
);
99100

101+
const onSlugChange = useCallback(
102+
async (event: React.ChangeEvent<HTMLInputElement>) => {
103+
if (!org) {
104+
return;
105+
}
106+
const newSlug = event.target.value || "";
107+
setSlug(newSlug);
108+
if (newSlug.trim().length === 0) {
109+
setErrorMessage("Organization slug can not be blank.");
110+
return;
111+
} else if (newSlug.trim().length > 100) {
112+
setErrorMessage("Organization slug must not be longer than 100 characters.");
113+
return;
114+
} else {
115+
setErrorMessage(undefined);
116+
}
117+
},
118+
[org],
119+
);
120+
100121
const deleteTeam = useCallback(async () => {
101122
if (!org || !user) {
102123
return;
@@ -132,10 +153,18 @@ export default function TeamSettings() {
132153
</div>
133154
</div>
134155
</div>
156+
<div className="flex flex-col lg:flex-row">
157+
<div>
158+
<div className="mt-4 mb-3">
159+
<h4>Slug</h4>
160+
<input type="text" value={slug} onChange={onSlugChange} />
161+
</div>
162+
</div>
163+
</div>
135164
<div className="flex flex-row">
136165
<button
137166
className="primary"
138-
disabled={org?.name === teamName || !!errorMessage}
167+
disabled={(org?.name === teamName && org?.slug === slug) || !!errorMessage}
139168
onClick={updateTeamInformation}
140169
>
141170
Update Organization Name

0 commit comments

Comments
 (0)