diff options
Diffstat (limited to 'web/source/settings/views/moderation/accounts')
4 files changed, 75 insertions, 16 deletions
diff --git a/web/source/settings/views/moderation/accounts/detail/actions.tsx b/web/source/settings/views/moderation/accounts/detail/actions.tsx index 4132b778a..ddcb1a5de 100644 --- a/web/source/settings/views/moderation/accounts/detail/actions.tsx +++ b/web/source/settings/views/moderation/accounts/detail/actions.tsx @@ -78,14 +78,21 @@ function ModerateAccount({ account }: { account: AdminAccount }) { > <h3 id="account-moderation-actions">Account Moderation Actions</h3> <div> - Currently only the "suspend" action is implemented.<br/> - Suspending an account will delete it from your server, and remove all of its media, posts, relationships, etc.<br/> - If the suspended account is local, suspending will also send out a "delete" message to other servers, requesting them to remove its data from their instance as well.<br/> + Currently only the "suspend" action is implemented. + <br/> + Suspending an account will delete it from your server, + and remove all of its media, posts, relationships, etc. + <br/> + If the suspended account is local, suspending will also + send out a "delete" message to other servers, requesting + them to remove its data from their instance as well. + <br/> <b>Account suspension cannot be reversed.</b> </div> <TextInput field={form.reason} placeholder="Reason for this action" + autoCapitalize="sentences" /> <div className="action-buttons"> <MutationButton diff --git a/web/source/settings/views/moderation/accounts/index.tsx b/web/source/settings/views/moderation/accounts/index.tsx index 946ed323d..8464c8489 100644 --- a/web/source/settings/views/moderation/accounts/index.tsx +++ b/web/source/settings/views/moderation/accounts/index.tsx @@ -23,12 +23,16 @@ import { AccountSearchForm } from "./search"; export default function AccountsSearch({ }) { return ( <div className="accounts-view"> - <h1>Accounts Search</h1> - <span> - You can perform actions on an account by clicking - its name in a report, or by searching for the account - using the form below and clicking on its name. - </span> + <div className="form-section-docs"> + <h1>Accounts Search</h1> + <p> + You can perform actions on an account by clicking + its name in a report, or by searching for the account + using the form below and clicking on its name. + <br/> + All fields in the below form are optional. + </p> + </div> <AccountSearchForm /> </div> ); diff --git a/web/source/settings/views/moderation/accounts/pending/index.tsx b/web/source/settings/views/moderation/accounts/pending/index.tsx index d47363954..f03c4800c 100644 --- a/web/source/settings/views/moderation/accounts/pending/index.tsx +++ b/web/source/settings/views/moderation/accounts/pending/index.tsx @@ -44,7 +44,23 @@ export default function AccountsPending() { return ( <div className="accounts-view"> - <h1>Pending Accounts</h1> + <div className="form-section-docs"> + <h1>Pending Accounts</h1> + <p> + You can see a list of pending account sign-ups below. + <br/> + To approve or reject a sign-up, click on the account's name in the + list, and use the controls at the bottom of the account detail view. + </p> + <a + href="https://docs.gotosocial.org/en/latest/admin/signups/" + target="_blank" + className="docslink" + rel="noreferrer" + > + Learn more about account sign-ups (opens in a new tab) + </a> + </div> <PageableList isLoading={searchRes.isLoading} isFetching={searchRes.isFetching} diff --git a/web/source/settings/views/moderation/accounts/search/index.tsx b/web/source/settings/views/moderation/accounts/search/index.tsx index f37e22a66..504746adc 100644 --- a/web/source/settings/views/moderation/accounts/search/index.tsx +++ b/web/source/settings/views/moderation/accounts/search/index.tsx @@ -27,6 +27,7 @@ import MutationButton from "../../../../components/form/mutation-button"; import { useLocation, useSearch } from "wouter"; import { AdminAccount } from "../../../../lib/types/account"; import Username from "../../../../components/username"; +import isValidDomain from "is-valid-domain"; export function AccountSearchForm() { const [ location, setLocation ] = useLocation(); @@ -42,7 +43,31 @@ export function AccountSearchForm() { permissions: useTextInput("permissions", { defaultValue: urlQueryParams.get("permissions") ?? ""}), username: useTextInput("username", { defaultValue: urlQueryParams.get("username") ?? ""}), display_name: useTextInput("display_name", { defaultValue: urlQueryParams.get("display_name") ?? ""}), - by_domain: useTextInput("by_domain", { defaultValue: urlQueryParams.get("by_domain") ?? ""}), + by_domain: useTextInput("by_domain", { + defaultValue: urlQueryParams.get("by_domain") ?? "", + validator: (v: string) => { + if (v.length === 0) { + return ""; + } + + if (v[v.length-1] === ".") { + return "invalid domain"; + } + + const valid = isValidDomain(v, { + subdomain: true, + wildcard: false, + allowUnicode: true, + topLevel: false, + }); + + if (valid) { + return ""; + } + + return "invalid domain"; + } + }), email: useTextInput("email", { defaultValue: urlQueryParams.get("email") ?? ""}), ip: useTextInput("ip", { defaultValue: urlQueryParams.get("ip") ?? ""}), limit: useTextInput("limit", { defaultValue: urlQueryParams.get("limit") ?? "50"}) @@ -109,13 +134,17 @@ export function AccountSearchForm() { > <TextInput field={form.username} - label={"(Optional) username (without leading '@' symbol)"} + label={`Username (without "@" prefix) - case sensitive`} placeholder="someone" + autoCapitalize="none" + spellCheck="false" /> <TextInput field={form.by_domain} - label={"(Optional) domain"} + label={`Domain (without "https://" prefix)`} placeholder="example.org" + autoCapitalize="none" + spellCheck="false" /> <Select field={form.origin} @@ -130,15 +159,18 @@ export function AccountSearchForm() { ></Select> <TextInput field={form.email} - label={"(Optional) email address (local accounts only)"} + label={"Email address (local accounts only)"} placeholder={"someone@example.org"} // Get email validation for free. - {...{type: "email"}} + type="email" /> <TextInput field={form.ip} - label={"(Optional) IP address (local accounts only)"} + label={"IP address (local accounts only)"} placeholder={"198.51.100.0"} + autoCapitalize="none" + spellCheck="false" + className="monospace" /> <Select field={form.status} |