feat: centralize access explanation subject selection
This commit is contained in:
@@ -1,21 +1,62 @@
|
||||
import ContentGrid, { FormGrid } from "./ContentGrid";
|
||||
import type { ResourceAccessExplanationResponse } from "../api/resourceAccessContracts";
|
||||
import FormField from "./FormField";
|
||||
import type {
|
||||
ResourceAccessExplanationResponse,
|
||||
ResourceAccessExplanationSubjectsResponse
|
||||
} from "../api/resourceAccessContracts";
|
||||
|
||||
export type ResourceAccessExplanationProps = {
|
||||
loading?: boolean;
|
||||
explanation?: ResourceAccessExplanationResponse | null;
|
||||
subjects?: ResourceAccessExplanationSubjectsResponse | null;
|
||||
selectedUserId?: string;
|
||||
onSelectedUserIdChange?: (userId: string) => void;
|
||||
fallbackResourceLabel?: string;
|
||||
};
|
||||
|
||||
export default function ResourceAccessExplanation({
|
||||
loading = false,
|
||||
explanation,
|
||||
subjects,
|
||||
selectedUserId,
|
||||
onSelectedUserIdChange,
|
||||
fallbackResourceLabel = ""
|
||||
}: ResourceAccessExplanationProps) {
|
||||
if (loading) {
|
||||
return <p className="muted small-note">i18n:govoplan-core.loading_access_explanation.04a7c934</p>;
|
||||
}
|
||||
if (!explanation) return null;
|
||||
if (!explanation && !subjects) return null;
|
||||
|
||||
const selectable = Boolean(
|
||||
subjects?.can_select_other_users && onSelectedUserIdChange
|
||||
);
|
||||
const selectedSubjectId = selectedUserId || explanation?.user.id || subjects?.users[0]?.id || "";
|
||||
|
||||
const subjectControl = subjects ? (
|
||||
<div data-resource-access-subject-mode={subjects.mode}>
|
||||
{selectable ? (
|
||||
<FormField
|
||||
label="i18n:govoplan-core.explanation_subject.6ff46d22"
|
||||
helpContextId="access.resource-explanation.subject"
|
||||
helpModuleId="access"
|
||||
>
|
||||
<select
|
||||
value={selectedSubjectId}
|
||||
onChange={(event) => onSelectedUserIdChange?.(event.target.value)}
|
||||
>
|
||||
{subjects.users.map((user) => (
|
||||
<option key={user.id} value={user.id}>
|
||||
{user.display_name || user.email || user.id}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</FormField>
|
||||
) : null}
|
||||
<p className="muted small-note">{subjects.reason}</p>
|
||||
</div>
|
||||
) : null;
|
||||
|
||||
if (!explanation) return subjectControl;
|
||||
|
||||
const userLabel = explanation.user.display_name || explanation.user.email || explanation.user.id;
|
||||
const resourceLabel = explanation.provenance.find((item) => item.kind === "resource")?.label ||
|
||||
@@ -24,6 +65,7 @@ export default function ResourceAccessExplanation({
|
||||
|
||||
return (
|
||||
<>
|
||||
{subjectControl}
|
||||
<FormGrid columns={2} collapseAt="wide" className="">
|
||||
<div><span className="form-label">i18n:govoplan-core.user.9f8a2389</span><p>{userLabel}</p></div>
|
||||
<div><span className="form-label">i18n:govoplan-core.resource.d1c626a9</span><p>{resourceLabel}</p></div>
|
||||
|
||||
Reference in New Issue
Block a user