+export const ResourceLinkHeadUuid = connect(
+ (state: RootState, props: { uuid: string }) => {
+ const link = getResource<LinkResource>(props.uuid)(state.resources);
+ const headResource = getResource<Resource>(link?.headUuid || '')(state.resources);
+
+ return headResource || { uuid: '' };
+ })(renderUuid);
+
+export const ResourceLinkTailUuid = connect(
+ (state: RootState, props: { uuid: string }) => {
+ const link = getResource<LinkResource>(props.uuid)(state.resources);
+ const tailResource = getResource<Resource>(link?.tailUuid || '')(state.resources);
+
+ return tailResource || { uuid: '' };
+ })(renderUuid);
+
+const renderLinkDelete = (dispatch: Dispatch, item: LinkResource) => {
+ if (item.uuid) {
+ return <Typography noWrap>
+ <IconButton data-cy="resource-delete-button" onClick={() => dispatch<any>(openRemoveGroupMemberDialog(item.uuid))}>
+ <RemoveIcon />
+ </IconButton>
+ </Typography>;
+ } else {
+ return <Typography noWrap></Typography>;
+ }
+}
+
+export const ResourceLinkDelete = connect(
+ (state: RootState, props: { uuid: string }) => {
+ const link = getResource<LinkResource>(props.uuid)(state.resources);
+ return {
+ item: link || { uuid: '', kind: ResourceKind.NONE }
+ };
+ })((props: { item: LinkResource } & DispatchProp<any>) =>
+ renderLinkDelete(props.dispatch, props.item));
+
+export const ResourceLinkTailEmail = connect(
+ (state: RootState, props: { uuid: string }) => {
+ const link = getResource<LinkResource>(props.uuid)(state.resources);
+ const resource = getResource<UserResource>(link?.tailUuid || '')(state.resources);
+
+ return resource || { email: '' };
+ })(renderEmail);
+
+export const ResourceLinkTailUsername = connect(
+ (state: RootState, props: { uuid: string }) => {
+ const link = getResource<LinkResource>(props.uuid)(state.resources);
+ const resource = getResource<UserResource>(link?.tailUuid || '')(state.resources);
+
+ return resource || { username: '' };
+ })(renderUsername);
+
+const renderPermissionLevel = (dispatch: Dispatch, link: LinkResource, resource: Resource) => {
+ return <Typography noWrap>
+ {formatPermissionLevel(link.name as PermissionLevel)}
+ <IconButton onClick={() => dispatch<any>(openEditPermissionLevelDialog(link.uuid, resource.uuid))}>
+ <RenameIcon />
+ </IconButton>
+ </Typography>;
+}
+
+export const ResourceLinkHeadPermissionLevel = connect(
+ (state: RootState, props: { uuid: string }) => {
+ const link = getResource<LinkResource>(props.uuid)(state.resources);
+ const resource = getResource<Resource>(link?.headUuid || '')(state.resources);
+
+ return {
+ link: link || { uuid: '', name: '', kind: ResourceKind.NONE },
+ resource: resource || { uuid: '', kind: ResourceKind.NONE }
+ };
+ })((props: { link: LinkResource, resource: Resource } & DispatchProp<any>) =>
+ renderPermissionLevel(props.dispatch, props.link, props.resource));
+
+export const ResourceLinkTailPermissionLevel = connect(
+ (state: RootState, props: { uuid: string }) => {
+ const link = getResource<LinkResource>(props.uuid)(state.resources);
+ const resource = getResource<Resource>(link?.tailUuid || '')(state.resources);
+
+ return {
+ link: link || { uuid: '', name: '', kind: ResourceKind.NONE },
+ resource: resource || { uuid: '', kind: ResourceKind.NONE }
+ };
+ })((props: { link: LinkResource, resource: Resource } & DispatchProp<any>) =>
+ renderPermissionLevel(props.dispatch, props.link, props.resource));
+
+// Displays resource type and display name without link
+export const ResourceLabel = connect(
+ (state: RootState, props: { uuid: string }) => {
+ const resource = getResource<Resource>(props.uuid)(state.resources);
+ return {
+ item: resource || { uuid: '', kind: ResourceKind.NONE }
+ };
+ })((props: { item: Resource } & DispatchProp<any>) =>
+ renderResource(props.dispatch, props.item));
+