diff --git a/apps/cyberstorm-remix/app/commonComponents/RequiredIndicator/RequiredIndicator.tsx b/apps/cyberstorm-remix/app/commonComponents/RequiredIndicator/RequiredIndicator.tsx
new file mode 100644
index 000000000..af9500194
--- /dev/null
+++ b/apps/cyberstorm-remix/app/commonComponents/RequiredIndicator/RequiredIndicator.tsx
@@ -0,0 +1,20 @@
+import { memo } from "react";
+
+export interface RequiredIndicatorProps {
+ title?: string;
+ className?: string;
+}
+
+export const RequiredIndicator = memo(function RequiredIndicator(
+ props: RequiredIndicatorProps
+) {
+ const { title = "Required", className } = props;
+
+ return (
+
+ *
+
+ );
+});
+
+RequiredIndicator.displayName = "RequiredIndicator";
diff --git a/apps/cyberstorm-remix/app/settings/teams/Teams.tsx b/apps/cyberstorm-remix/app/settings/teams/Teams.tsx
index 274446080..ea06fa46d 100644
--- a/apps/cyberstorm-remix/app/settings/teams/Teams.tsx
+++ b/apps/cyberstorm-remix/app/settings/teams/Teams.tsx
@@ -15,6 +15,7 @@ import { faPlus } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { useReducer, useState } from "react";
import { PageHeader } from "~/commonComponents/PageHeader/PageHeader";
+import { RequiredIndicator } from "~/commonComponents/RequiredIndicator/RequiredIndicator";
import {
type RequestConfig,
teamCreate,
@@ -183,6 +184,8 @@ function CreateTeamForm(props: { config: () => RequestConfig }) {
},
});
+ const teamNameFieldProps = strongForm.getFieldComponentProps("name");
+
const [open, setOpen] = useState(false);
return (
@@ -208,9 +211,10 @@ function CreateTeamForm(props: { config: () => RequestConfig }) {
updateFormFieldState({
field: "name",
@@ -219,6 +223,8 @@ function CreateTeamForm(props: { config: () => RequestConfig }) {
}
placeholder={"MyCoolTeam"}
id="teamName"
+ required
+ {...teamNameFieldProps}
/>
diff --git a/apps/cyberstorm-remix/app/settings/teams/team/tabs/Members/MemberAddForm.tsx b/apps/cyberstorm-remix/app/settings/teams/team/tabs/Members/MemberAddForm.tsx
index 0d056d337..22a97e1ba 100644
--- a/apps/cyberstorm-remix/app/settings/teams/team/tabs/Members/MemberAddForm.tsx
+++ b/apps/cyberstorm-remix/app/settings/teams/team/tabs/Members/MemberAddForm.tsx
@@ -18,6 +18,7 @@ import {
} from "@thunderstore/thunderstore-api";
import { useStrongForm } from "cyberstorm/utils/StrongForm/useStrongForm";
+import { RequiredIndicator } from "~/commonComponents/RequiredIndicator/RequiredIndicator";
const roleOptions: SelectOption<"owner" | "member">[] = [
{ value: "member", label: "Member" },
@@ -95,6 +96,8 @@ export function MemberAddForm(props: {
},
});
+ const usernameFieldProps = strongForm.getFieldComponentProps("username");
+
return (
{error &&
{error}
}
diff --git a/apps/cyberstorm-remix/app/settings/teams/team/tabs/Profile/Profile.tsx b/apps/cyberstorm-remix/app/settings/teams/team/tabs/Profile/Profile.tsx
index ee9ed4cc0..11b321de1 100644
--- a/apps/cyberstorm-remix/app/settings/teams/team/tabs/Profile/Profile.tsx
+++ b/apps/cyberstorm-remix/app/settings/teams/team/tabs/Profile/Profile.tsx
@@ -15,6 +15,7 @@ import {
import { type OutletContextShape } from "app/root";
import { makeTeamSettingsTabLoader } from "cyberstorm/utils/dapperClientLoaders";
+import { isTeamOwner } from "cyberstorm/utils/permissions";
import { useStrongForm } from "cyberstorm/utils/StrongForm/useStrongForm";
import "./Profile.css";
@@ -49,6 +50,8 @@ function ProfileForm(props: { team: TeamDetails }) {
const revalidator = useRevalidator();
const toast = useToast();
+ const formDisabled = !isTeamOwner(team.name, outletContext.currentUser);
+
function formFieldUpdateAction(
state: TeamDetailsEditRequestData,
action: {
@@ -131,10 +134,15 @@ function ProfileForm(props: { team: TeamDetails }) {
})
}
rootClasses="team-profile__input"
+ disabled={formDisabled}
/>
-
+
Save changes
diff --git a/apps/cyberstorm-remix/app/settings/teams/team/tabs/ServiceAccounts/ServiceAccounts.tsx b/apps/cyberstorm-remix/app/settings/teams/team/tabs/ServiceAccounts/ServiceAccounts.tsx
index ab4fc1454..996f568f3 100644
--- a/apps/cyberstorm-remix/app/settings/teams/team/tabs/ServiceAccounts/ServiceAccounts.tsx
+++ b/apps/cyberstorm-remix/app/settings/teams/team/tabs/ServiceAccounts/ServiceAccounts.tsx
@@ -25,6 +25,7 @@ import { type OutletContextShape } from "app/root";
import { makeTeamSettingsTabLoader } from "cyberstorm/utils/dapperClientLoaders";
import { isTeamOwner } from "cyberstorm/utils/permissions";
import { useStrongForm } from "cyberstorm/utils/StrongForm/useStrongForm";
+import { RequiredIndicator } from "~/commonComponents/RequiredIndicator/RequiredIndicator";
import { ServiceAccountsTable } from "./ServiceAccountsTable";
import "./ServiceAccounts.css";
@@ -154,6 +155,8 @@ function AddServiceAccountForm(props: {
},
});
+ const nicknameFieldProps = strongForm.getFieldComponentProps("nickname");
+
const handleOpenChange = (nextOpen: boolean) => {
setOpen(nextOpen);
if (!nextOpen) {
@@ -197,46 +200,47 @@ function AddServiceAccountForm(props: {
) : (
-
-