Fix type + assets permissions display logic
Signed-off-by: Émile Ré <nemile.re@gmail.com>
This commit is contained in:
@@ -22,7 +22,6 @@ type Props = {
|
|||||||
AssetsPageFragment$data
|
AssetsPageFragment$data
|
||||||
>;
|
>;
|
||||||
assets: AssetsPageFragment$data["assets"]["edges"][0]["node"][];
|
assets: AssetsPageFragment$data["assets"]["edges"][0]["node"][];
|
||||||
hasAnyAction: boolean;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const schema = z.object({
|
const schema = z.object({
|
||||||
@@ -46,7 +45,7 @@ const defaultValue = {
|
|||||||
} satisfies z.infer<typeof schema>;
|
} satisfies z.infer<typeof schema>;
|
||||||
|
|
||||||
export function AssetsTable(props: Props) {
|
export function AssetsTable(props: Props) {
|
||||||
const { connectionId, pagination, assets, hasAnyAction } = props;
|
const { connectionId, pagination, assets } = props;
|
||||||
|
|
||||||
const organizationId = useOrganizationId();
|
const organizationId = useOrganizationId();
|
||||||
const { __ } = useTranslate();
|
const { __ } = useTranslate();
|
||||||
@@ -74,23 +73,21 @@ export function AssetsTable(props: Props) {
|
|||||||
organizationId,
|
organizationId,
|
||||||
}}
|
}}
|
||||||
action={({ item }) =>
|
action={({ item }) =>
|
||||||
hasAnyAction ? (
|
<ActionDropdown>
|
||||||
<ActionDropdown>
|
<DropdownItem asChild>
|
||||||
<DropdownItem asChild>
|
<Link to={`/organizations/${organizationId}/assets/${item.id}`}>
|
||||||
<Link to={`/organizations/${organizationId}/assets/${item.id}`}>
|
<IconPencil size={16} />
|
||||||
<IconPencil size={16} />
|
{__("Edit")}
|
||||||
{__("Edit")}
|
</Link>
|
||||||
</Link>
|
</DropdownItem>
|
||||||
</DropdownItem>
|
<DropdownItem
|
||||||
<DropdownItem
|
onClick={() => deleteAsset(item)}
|
||||||
onClick={() => deleteAsset(item)}
|
variant="danger"
|
||||||
variant="danger"
|
icon={IconTrashCan}
|
||||||
icon={IconTrashCan}
|
>
|
||||||
>
|
{__("Delete")}
|
||||||
{__("Delete")}
|
</DropdownItem>
|
||||||
</DropdownItem>
|
</ActionDropdown>
|
||||||
</ActionDropdown>
|
|
||||||
) : null
|
|
||||||
}
|
}
|
||||||
row={({ item }) => (
|
row={({ item }) => (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ type Props = {
|
|||||||
assets: AssetEntry[];
|
assets: AssetEntry[];
|
||||||
};
|
};
|
||||||
|
|
||||||
export function SnapshotAssetsTable(props: Props) {
|
export function ReadOnlyAssetsTable(props: Props) {
|
||||||
const { pagination, assets } = props;
|
const { pagination, assets } = props;
|
||||||
const { __ } = useTranslate();
|
const { __ } = useTranslate();
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ export function useStateWithSchema<T extends ZodTypeAny>(
|
|||||||
value,
|
value,
|
||||||
errors,
|
errors,
|
||||||
update: useCallback(
|
update: useCallback(
|
||||||
(key: keyof z.infer<T>, value: z.infer<T>[typeof key]) => {
|
<TKey extends keyof z.infer<T>>(key: TKey, value: z.infer<T>[TKey]) => {
|
||||||
setState((prevState) => ({ ...prevState, [key]: value }));
|
setState((prevState) => ({ ...prevState, [key]: value }));
|
||||||
},
|
},
|
||||||
[],
|
[],
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ import { SnapshotBanner } from "/components/SnapshotBanner";
|
|||||||
import { CreateAssetDialog } from "./dialogs/CreateAssetDialog";
|
import { CreateAssetDialog } from "./dialogs/CreateAssetDialog";
|
||||||
import { Authorized, isAuthorized } from "/permissions";
|
import { Authorized, isAuthorized } from "/permissions";
|
||||||
import { AssetsTable } from "../../../components/assets/AssetsTable";
|
import { AssetsTable } from "../../../components/assets/AssetsTable";
|
||||||
import { SnapshotAssetsTable } from "/components/assets/SnapshotAssetsTable";
|
import { ReadOnlyAssetsTable } from "../../../components/assets/ReadOnlyAssetsTable";
|
||||||
|
|
||||||
const paginatedAssetsFragment = graphql`
|
const paginatedAssetsFragment = graphql`
|
||||||
fragment AssetsPageFragment on Organization
|
fragment AssetsPageFragment on Organization
|
||||||
@@ -90,10 +90,10 @@ export default function AssetsPage(props: Props) {
|
|||||||
const assets = pagination.data.assets?.edges.map((edge) => edge.node);
|
const assets = pagination.data.assets?.edges.map((edge) => edge.node);
|
||||||
const connectionId = pagination.data.assets.__id;
|
const connectionId = pagination.data.assets.__id;
|
||||||
|
|
||||||
const hasAnyAction =
|
const canWrite = (
|
||||||
!isSnapshotMode &&
|
isAuthorized(organizationId, "Asset", "updateAsset") ||
|
||||||
(isAuthorized(organizationId, "Asset", "updateAsset") ||
|
isAuthorized(organizationId, "Asset", "deleteAsset")
|
||||||
isAuthorized(organizationId, "Asset", "deleteAsset"));
|
);
|
||||||
usePageTitle(__("Assets"));
|
usePageTitle(__("Assets"));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -116,14 +116,13 @@ export default function AssetsPage(props: Props) {
|
|||||||
</Authorized>
|
</Authorized>
|
||||||
)}
|
)}
|
||||||
</PageHeader>
|
</PageHeader>
|
||||||
{isSnapshotMode ?
|
{isSnapshotMode || !canWrite ?
|
||||||
<SnapshotAssetsTable pagination={pagination} assets={assets} />
|
<ReadOnlyAssetsTable pagination={pagination} assets={assets} />
|
||||||
:
|
:
|
||||||
<AssetsTable
|
<AssetsTable
|
||||||
connectionId={connectionId}
|
connectionId={connectionId}
|
||||||
pagination={pagination}
|
pagination={pagination}
|
||||||
assets={assets}
|
assets={assets}
|
||||||
hasAnyAction={hasAnyAction}
|
|
||||||
/>
|
/>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user