Skip to content
16 changes: 16 additions & 0 deletions .changeset/27521-invitation-screens.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
'@objectstack/platform-objects': patch
'@object-ui/app-shell': patch
'@object-ui/plugin-form': patch
'@object-ui/i18n': patch
'@object-ui/console': patch
---

Clause-②: yes (widening: `@object-ui/app-shell` exports `InvitationLinkHint` and `@object-ui/plugin-form` exports `useInitialFieldFocus`; no accept set moves)
Metadata-protocol: none (platform object metadata only, no authorable key: `sys_invitation.status` options gain display labels, with `rejected` read as "Declined"; the role param of the four `invite_user` actions, `sys_member.add_member` and `sys_member.update_member_role` gains one shared `helpText`; `sys_invitation.resend_invitation` gains a `description` and carries its email and role over from the row; `sys_member.update_member_role` gains a `description` naming the member; the `expired` invitations list projects `role`)

The Invitations screens read more clearly and behave more predictably. Invitation statuses show as labels (Pending, Accepted, Declined, Expired, Canceled) instead of raw values. Every role picker that grants an organization role explains each role on its own line, and Change Role names the member it changes. Resend is a confirmation that names the invitee and keeps the invitation's email and role, instead of an editable form. The workspace's cancel dialog dismisses with "Keep invitation".

The console's action dialogs check an email or URL param before anything runs and mark a malformed value on its field. They open on their first editable field instead of Cancel, and closing one returns focus to the control that opened it: an action button that was disabled while its action ran, a row menu's trigger, or the first opener when a param dialog hands over to a result dialog. This applies to every action that uses the param, confirm and result dialogs.

The sign-in page tells a visitor to open their invitation link where sign-up is by invitation only. After accepting an invitation, the page says the user joined the organization and as which role, and Continue enters it.
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
},
params: {
role: {
helpText: "Owner: full control of the organization, including deleting it.\nAdmin: manages members, invitations, teams and organization settings.\nDelegated Admin: invites people and places them only where an administrator has delegated that.\nMember: works in the organization's apps with the access their permission sets give.\nExternal: someone from outside the organization, such as a supplier or customer, who sees only what is shared with them.",
options: {
owner: "Owner",
admin: "Admin",
Expand Down Expand Up @@ -585,6 +586,7 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
},
params: {
role: {
helpText: "Owner: full control of the organization, including deleting it.\nAdmin: manages members, invitations, teams and organization settings.\nDelegated Admin: invites people and places them only where an administrator has delegated that.\nMember: works in the organization's apps with the access their permission sets give.\nExternal: someone from outside the organization, such as a supplier or customer, who sees only what is shared with them.",
options: {
owner: "Owner",
admin: "Admin",
Expand Down Expand Up @@ -676,6 +678,7 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
},
params: {
role: {
helpText: "Owner: full control of the organization, including deleting it.\nAdmin: manages members, invitations, teams and organization settings.\nDelegated Admin: invites people and places them only where an administrator has delegated that.\nMember: works in the organization's apps with the access their permission sets give.\nExternal: someone from outside the organization, such as a supplier or customer, who sees only what is shared with them.",
options: {
owner: "Owner",
admin: "Admin",
Expand All @@ -688,13 +691,24 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
},
add_member: {
label: "Add Member",
successMessage: "Member added"
successMessage: "Member added",
params: {
role: {
helpText: "Owner: full control of the organization, including deleting it.\nAdmin: manages members, invitations, teams and organization settings.\nDelegated Admin: invites people and places them only where an administrator has delegated that.\nMember: works in the organization's apps with the access their permission sets give.\nExternal: someone from outside the organization, such as a supplier or customer, who sees only what is shared with them."
}
}
},
update_member_role: {
label: "Change Role",
description: "Choose the new organization role for ${record.user_id?.name ?? 'this member'}.",
successMessage: "Member role updated",
outcomeMessages: {
permission_set_granted: "Member role updated. The new role also granted the permission set ${result.grantedPermissionSet.label}."
},
params: {
role: {
helpText: "Owner: full control of the organization, including deleting it.\nAdmin: manages members, invitations, teams and organization settings.\nDelegated Admin: invites people and places them only where an administrator has delegated that.\nMember: works in the organization's apps with the access their permission sets give.\nExternal: someone from outside the organization, such as a supplier or customer, who sees only what is shared with them."
}
}
},
remove_member: {
Expand Down Expand Up @@ -748,11 +762,11 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
status: {
label: "Status",
options: {
pending: "pending",
accepted: "accepted",
rejected: "rejected",
expired: "expired",
canceled: "canceled"
pending: "Pending",
accepted: "Accepted",
rejected: "Declined",
expired: "Expired",
canceled: "Canceled"
}
},
inviter_id: {
Expand Down Expand Up @@ -816,6 +830,7 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
},
params: {
role: {
helpText: "Owner: full control of the organization, including deleting it.\nAdmin: manages members, invitations, teams and organization settings.\nDelegated Admin: invites people and places them only where an administrator has delegated that.\nMember: works in the organization's apps with the access their permission sets give.\nExternal: someone from outside the organization, such as a supplier or customer, who sees only what is shared with them.",
options: {
owner: "Owner",
admin: "Admin",
Expand All @@ -833,6 +848,7 @@ export const enObjects: NonNullable<TranslationData['objects']> = {
},
resend_invitation: {
label: "Resend Invitation",
description: "Resend the invitation to ${record.email}? Its expiry date starts over.",
successMessage: "Invitation resent",
outcomeMessages: {
sent: "Invitation resent to ${result.email}",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
},
params: {
role: {
helpText: "Propietario: control total de la organización, incluida su eliminación.\nAdministrador: gestiona los miembros, las invitaciones, los equipos y la configuración de la organización.\nAdministrador delegado: invita a personas y solo las ubica donde un administrador se lo ha delegado.\nMiembro: trabaja en las aplicaciones de la organización con el acceso que le dan sus conjuntos de permisos.\nExterno: alguien ajeno a la organización, como un proveedor o un cliente, que solo ve lo que se comparte con él.",
options: {
owner: "Propietario",
admin: "Administrador",
Expand Down Expand Up @@ -585,6 +586,7 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
},
params: {
role: {
helpText: "Propietario: control total de la organización, incluida su eliminación.\nAdministrador: gestiona los miembros, las invitaciones, los equipos y la configuración de la organización.\nAdministrador delegado: invita a personas y solo las ubica donde un administrador se lo ha delegado.\nMiembro: trabaja en las aplicaciones de la organización con el acceso que le dan sus conjuntos de permisos.\nExterno: alguien ajeno a la organización, como un proveedor o un cliente, que solo ve lo que se comparte con él.",
options: {
owner: "Propietario",
admin: "Administrador",
Expand Down Expand Up @@ -676,6 +678,7 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
},
params: {
role: {
helpText: "Propietario: control total de la organización, incluida su eliminación.\nAdministrador: gestiona los miembros, las invitaciones, los equipos y la configuración de la organización.\nAdministrador delegado: invita a personas y solo las ubica donde un administrador se lo ha delegado.\nMiembro: trabaja en las aplicaciones de la organización con el acceso que le dan sus conjuntos de permisos.\nExterno: alguien ajeno a la organización, como un proveedor o un cliente, que solo ve lo que se comparte con él.",
options: {
owner: "Propietario",
admin: "Administrador",
Expand All @@ -688,13 +691,24 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
},
add_member: {
label: "Añadir miembro",
successMessage: "Miembro añadido"
successMessage: "Miembro añadido",
params: {
role: {
helpText: "Propietario: control total de la organización, incluida su eliminación.\nAdministrador: gestiona los miembros, las invitaciones, los equipos y la configuración de la organización.\nAdministrador delegado: invita a personas y solo las ubica donde un administrador se lo ha delegado.\nMiembro: trabaja en las aplicaciones de la organización con el acceso que le dan sus conjuntos de permisos.\nExterno: alguien ajeno a la organización, como un proveedor o un cliente, que solo ve lo que se comparte con él."
}
}
},
update_member_role: {
label: "Cambiar rol",
description: "Elija el nuevo rol en la organización para ${record.user_id?.name ?? 'este miembro'}.",
successMessage: "Rol del miembro actualizado",
outcomeMessages: {
permission_set_granted: "Rol del miembro actualizado. El nuevo rol también concedió el conjunto de permisos ${result.grantedPermissionSet.label}."
},
params: {
role: {
helpText: "Propietario: control total de la organización, incluida su eliminación.\nAdministrador: gestiona los miembros, las invitaciones, los equipos y la configuración de la organización.\nAdministrador delegado: invita a personas y solo las ubica donde un administrador se lo ha delegado.\nMiembro: trabaja en las aplicaciones de la organización con el acceso que le dan sus conjuntos de permisos.\nExterno: alguien ajeno a la organización, como un proveedor o un cliente, que solo ve lo que se comparte con él."
}
}
},
remove_member: {
Expand Down Expand Up @@ -816,6 +830,7 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
},
params: {
role: {
helpText: "Propietario: control total de la organización, incluida su eliminación.\nAdministrador: gestiona los miembros, las invitaciones, los equipos y la configuración de la organización.\nAdministrador delegado: invita a personas y solo las ubica donde un administrador se lo ha delegado.\nMiembro: trabaja en las aplicaciones de la organización con el acceso que le dan sus conjuntos de permisos.\nExterno: alguien ajeno a la organización, como un proveedor o un cliente, que solo ve lo que se comparte con él.",
options: {
owner: "Propietario",
admin: "Administrador",
Expand All @@ -833,6 +848,7 @@ export const esESObjects: NonNullable<TranslationData['objects']> = {
},
resend_invitation: {
label: "Reenviar invitación",
description: "¿Reenviar la invitación a ${record.email}? Su plazo de vencimiento vuelve a empezar.",
successMessage: "Invitación reenviada",
outcomeMessages: {
sent: "Invitación reenviada a ${result.email}",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ export const jaJPObjects: NonNullable<TranslationData['objects']> = {
},
params: {
role: {
helpText: "所有者:組織を完全に管理でき、組織の削除もできます。\n管理者:メンバー、招待、チーム、組織の設定を管理します。\n委任管理者:ユーザーを招待し、管理者から委任された範囲にのみ配置できます。\nメンバー:権限セットで付与されたアクセス権で組織のアプリを利用します。\n外部メンバー:仕入先や顧客など組織外のユーザーで、共有されたものだけを閲覧できます。",
options: {
owner: "所有者",
admin: "管理者",
Expand Down Expand Up @@ -585,6 +586,7 @@ export const jaJPObjects: NonNullable<TranslationData['objects']> = {
},
params: {
role: {
helpText: "所有者:組織を完全に管理でき、組織の削除もできます。\n管理者:メンバー、招待、チーム、組織の設定を管理します。\n委任管理者:ユーザーを招待し、管理者から委任された範囲にのみ配置できます。\nメンバー:権限セットで付与されたアクセス権で組織のアプリを利用します。\n外部メンバー:仕入先や顧客など組織外のユーザーで、共有されたものだけを閲覧できます。",
options: {
owner: "所有者",
admin: "管理者",
Expand Down Expand Up @@ -676,6 +678,7 @@ export const jaJPObjects: NonNullable<TranslationData['objects']> = {
},
params: {
role: {
helpText: "所有者:組織を完全に管理でき、組織の削除もできます。\n管理者:メンバー、招待、チーム、組織の設定を管理します。\n委任管理者:ユーザーを招待し、管理者から委任された範囲にのみ配置できます。\nメンバー:権限セットで付与されたアクセス権で組織のアプリを利用します。\n外部メンバー:仕入先や顧客など組織外のユーザーで、共有されたものだけを閲覧できます。",
options: {
owner: "所有者",
admin: "管理者",
Expand All @@ -688,13 +691,24 @@ export const jaJPObjects: NonNullable<TranslationData['objects']> = {
},
add_member: {
label: "メンバーを追加",
successMessage: "メンバーを追加しました"
successMessage: "メンバーを追加しました",
params: {
role: {
helpText: "所有者:組織を完全に管理でき、組織の削除もできます。\n管理者:メンバー、招待、チーム、組織の設定を管理します。\n委任管理者:ユーザーを招待し、管理者から委任された範囲にのみ配置できます。\nメンバー:権限セットで付与されたアクセス権で組織のアプリを利用します。\n外部メンバー:仕入先や顧客など組織外のユーザーで、共有されたものだけを閲覧できます。"
}
}
},
update_member_role: {
label: "ロールを変更",
description: "${record.user_id?.name ?? 'このメンバー'} の新しい組織ロールを選択してください。",
successMessage: "メンバーロールを更新しました",
outcomeMessages: {
permission_set_granted: "メンバーのロールを更新しました。新しいロールにより権限セット ${result.grantedPermissionSet.label} も付与されました。"
},
params: {
role: {
helpText: "所有者:組織を完全に管理でき、組織の削除もできます。\n管理者:メンバー、招待、チーム、組織の設定を管理します。\n委任管理者:ユーザーを招待し、管理者から委任された範囲にのみ配置できます。\nメンバー:権限セットで付与されたアクセス権で組織のアプリを利用します。\n外部メンバー:仕入先や顧客など組織外のユーザーで、共有されたものだけを閲覧できます。"
}
}
},
remove_member: {
Expand Down Expand Up @@ -816,6 +830,7 @@ export const jaJPObjects: NonNullable<TranslationData['objects']> = {
},
params: {
role: {
helpText: "所有者:組織を完全に管理でき、組織の削除もできます。\n管理者:メンバー、招待、チーム、組織の設定を管理します。\n委任管理者:ユーザーを招待し、管理者から委任された範囲にのみ配置できます。\nメンバー:権限セットで付与されたアクセス権で組織のアプリを利用します。\n外部メンバー:仕入先や顧客など組織外のユーザーで、共有されたものだけを閲覧できます。",
options: {
owner: "所有者",
admin: "管理者",
Expand All @@ -833,6 +848,7 @@ export const jaJPObjects: NonNullable<TranslationData['objects']> = {
},
resend_invitation: {
label: "招待を再送",
description: "${record.email} に招待を再送しますか?有効期限は改めて始まります。",
successMessage: "招待を再送しました",
outcomeMessages: {
sent: "${result.email} に招待を再送しました",
Expand Down
Loading
Loading