Add profile state sorting

Signed-off-by: Émile Ré <emile@getprobo.com>
This commit is contained in:
Émile Ré
2026-02-19 15:11:27 +04:00
parent 587f59d167
commit a9e4e991b3
8 changed files with 41 additions and 23 deletions

View File

@@ -1,5 +1,5 @@
/** /**
* @generated SignedSource<<a32e2b4330ac1d54762817127289b51d>> * @generated SignedSource<<167a4c7cc44ce2cc44e9b4680b6fc285>>
* @lightSyntaxTransform * @lightSyntaxTransform
* @nogrep * @nogrep
*/ */
@@ -11,7 +11,7 @@
import { ConcreteRequest } from 'relay-runtime'; import { ConcreteRequest } from 'relay-runtime';
import { FragmentRefs } from "relay-runtime"; import { FragmentRefs } from "relay-runtime";
export type OrderDirection = "ASC" | "DESC"; export type OrderDirection = "ASC" | "DESC";
export type ProfileOrderField = "CREATED_AT" | "FULL_NAME" | "KIND" | "ORGANIZATION_NAME"; export type ProfileOrderField = "CREATED_AT" | "FULL_NAME" | "KIND" | "ORGANIZATION_NAME" | "STATE";
export type ProfileOrder = { export type ProfileOrder = {
direction: OrderDirection; direction: OrderDirection;
field: ProfileOrderField; field: ProfileOrderField;

View File

@@ -106,7 +106,7 @@ export function PersonPage(props: { queryRef: PreloadedQuery<PersonPageQuery> })
<div className="text-lg text-txt-secondary">{person.emailAddress}</div> <div className="text-lg text-txt-secondary">{person.emailAddress}</div>
</div> </div>
</div> </div>
{person.canDelete && ( {person.canDelete && person.source !== "SCIM" && (
<ActionDropdown variant="secondary"> <ActionDropdown variant="secondary">
<DropdownItem <DropdownItem
variant="danger" variant="danger"

View File

@@ -83,7 +83,7 @@ export function PeopleList(props: {
<Thead> <Thead>
<Tr> <Tr>
<SortableTh field="FULL_NAME" onOrderChange={handleOrderChange}>{__("Name")}</SortableTh> <SortableTh field="FULL_NAME" onOrderChange={handleOrderChange}>{__("Name")}</SortableTh>
<SortableTh field="STATUS">{__("Status")}</SortableTh> <SortableTh field="STATE">{__("Status")}</SortableTh>
<SortableTh field="EMAIL_ADDRESS" onOrderChange={handleOrderChange}>{__("Email")}</SortableTh> <SortableTh field="EMAIL_ADDRESS" onOrderChange={handleOrderChange}>{__("Email")}</SortableTh>
<SortableTh field="ROLE" onOrderChange={handleOrderChange}>{__("Role")}</SortableTh> <SortableTh field="ROLE" onOrderChange={handleOrderChange}>{__("Role")}</SortableTh>
<SortableTh field="CREATED_AT" onOrderChange={handleOrderChange}>{__("Created on")}</SortableTh> <SortableTh field="CREATED_AT" onOrderChange={handleOrderChange}>{__("Created on")}</SortableTh>

View File

@@ -112,6 +112,9 @@ export function PeopleListItem(props: {
const isInactive = profile.state === "INACTIVE"; const isInactive = profile.state === "INACTIVE";
const canSendActivationMail = isInactive && profile.source !== "SCIM" && profile.canInvite;
const canDelete = profile.canDelete && profile.source !== "SCIM";
const [inviteUser] const [inviteUser]
= useMutationWithToasts<PeopleListItem_inviteMutation>(inviteUserMutation, { = useMutationWithToasts<PeopleListItem_inviteMutation>(inviteUserMutation, {
successMessage: __("Invitation sent successfully"), successMessage: __("Invitation sent successfully"),
@@ -248,25 +251,27 @@ export function PeopleListItem(props: {
{new Date(profile.createdAt).toLocaleDateString()} {new Date(profile.createdAt).toLocaleDateString()}
</Td> </Td>
<Td noLink width={160} className="text-end"> <Td noLink width={160} className="text-end">
<ActionDropdown> {(canSendActivationMail || canDelete) && (
{isInactive && profile.source !== "SCIM" && profile.canInvite && ( <ActionDropdown>
<DropdownItem {canSendActivationMail && (
onClick={handleInvite} <DropdownItem
icon={IconMail} onClick={handleInvite}
> icon={IconMail}
{lastInvitation ? __("Resend activation mail") : __("Send activation mail")} >
</DropdownItem> {lastInvitation ? __("Resend activation mail") : __("Send activation mail")}
)} </DropdownItem>
{profile.canDelete && profile.source !== "SCIM" && ( )}
<DropdownItem {canDelete && (
onClick={handleRemove} <DropdownItem
variant="danger" onClick={handleRemove}
icon={IconTrashCan} variant="danger"
> icon={IconTrashCan}
{__("Remove person")} >
</DropdownItem> {__("Remove person")}
)} </DropdownItem>
</ActionDropdown> )}
</ActionDropdown>
)}
</Td> </Td>
</Tr> </Tr>
); );

View File

@@ -61,6 +61,8 @@ func (p MembershipProfile) CursorKey(orderBy MembershipProfileOrderField) page.C
return page.NewCursorKey(p.ID, p.Kind) return page.NewCursorKey(p.ID, p.Kind)
case MembershipProfileOrderFieldOrganizationName: case MembershipProfileOrderFieldOrganizationName:
return page.NewCursorKey(p.ID, p.OrganizationName) return page.NewCursorKey(p.ID, p.OrganizationName)
case MembershipProfileOrderFieldState:
return page.NewCursorKey(p.ID, p.State)
} }
panic(fmt.Sprintf("unsupported order by: %s", orderBy)) panic(fmt.Sprintf("unsupported order by: %s", orderBy))

View File

@@ -23,6 +23,7 @@ const (
MembershipProfileOrderFieldFullName MembershipProfileOrderField = "FULL_NAME" MembershipProfileOrderFieldFullName MembershipProfileOrderField = "FULL_NAME"
MembershipProfileOrderFieldKind MembershipProfileOrderField = "KIND" MembershipProfileOrderFieldKind MembershipProfileOrderField = "KIND"
MembershipProfileOrderFieldOrganizationName MembershipProfileOrderField = "ORGANIZATION_NAME" MembershipProfileOrderFieldOrganizationName MembershipProfileOrderField = "ORGANIZATION_NAME"
MembershipProfileOrderFieldState MembershipProfileOrderField = "STATE"
) )
func (p MembershipProfileOrderField) Column() string { func (p MembershipProfileOrderField) Column() string {

View File

@@ -511,6 +511,10 @@ enum ProfileOrderField
@goEnum( @goEnum(
value: "go.probo.inc/probo/pkg/coredata.MembershipProfileOrderFieldOrganizationName" value: "go.probo.inc/probo/pkg/coredata.MembershipProfileOrderFieldOrganizationName"
) )
STATE
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.MembershipProfileOrderFieldState"
)
} }
input ProfileFilter { input ProfileFilter {

View File

@@ -2983,6 +2983,10 @@ enum ProfileOrderField
@goEnum( @goEnum(
value: "go.probo.inc/probo/pkg/coredata.MembershipProfileOrderFieldOrganizationName" value: "go.probo.inc/probo/pkg/coredata.MembershipProfileOrderFieldOrganizationName"
) )
STATE
@goEnum(
value: "go.probo.inc/probo/pkg/coredata.MembershipProfileOrderFieldState"
)
} }
input ProfileFilter { input ProfileFilter {
@@ -22105,12 +22109,14 @@ var (
"CREATED_AT": coredata.MembershipProfileOrderFieldCreatedAt, "CREATED_AT": coredata.MembershipProfileOrderFieldCreatedAt,
"KIND": coredata.MembershipProfileOrderFieldKind, "KIND": coredata.MembershipProfileOrderFieldKind,
"ORGANIZATION_NAME": coredata.MembershipProfileOrderFieldOrganizationName, "ORGANIZATION_NAME": coredata.MembershipProfileOrderFieldOrganizationName,
"STATE": coredata.MembershipProfileOrderFieldState,
} }
marshalNProfileOrderField2goᚗproboᚗincᚋproboᚋpkgᚋcoredataᚐMembershipProfileOrderField = map[coredata.MembershipProfileOrderField]string{ marshalNProfileOrderField2goᚗproboᚗincᚋproboᚋpkgᚋcoredataᚐMembershipProfileOrderField = map[coredata.MembershipProfileOrderField]string{
coredata.MembershipProfileOrderFieldFullName: "FULL_NAME", coredata.MembershipProfileOrderFieldFullName: "FULL_NAME",
coredata.MembershipProfileOrderFieldCreatedAt: "CREATED_AT", coredata.MembershipProfileOrderFieldCreatedAt: "CREATED_AT",
coredata.MembershipProfileOrderFieldKind: "KIND", coredata.MembershipProfileOrderFieldKind: "KIND",
coredata.MembershipProfileOrderFieldOrganizationName: "ORGANIZATION_NAME", coredata.MembershipProfileOrderFieldOrganizationName: "ORGANIZATION_NAME",
coredata.MembershipProfileOrderFieldState: "STATE",
} }
) )