Skip to content

Commit df8e605

Browse files
authored
fix: base node status T1328 (#2297)
* feat: enhance BaseNodeTree with ItemStatus component for app and workflow visibility * refactor: update BaseNodeTree and QuickAction components for improved styling and layout consistency * feat: add table update permission handling to BaseNodeTree component
1 parent fa16152 commit df8e605

3 files changed

Lines changed: 39 additions & 20 deletions

File tree

apps/nextjs-app/src/features/app/blocks/base/base-side-bar/BaseNodeTree.tsx

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {
55
IBaseNodeVo,
66
IDuplicateBaseNodeRo,
77
IBaseNodeWorkflowResourceMeta,
8+
IBaseNodeAppResourceMeta,
89
} from '@teable/openapi';
910
import { BaseNodeResourceType } from '@teable/openapi';
1011
import { LocalStorageKeys, ReactQueryKeys } from '@teable/sdk/config';
@@ -146,6 +147,7 @@ export const BaseNodeTree = (props: IBaseNodeTreeProps) => {
146147
const canCreateWorkflow = !isCommunity && Boolean(permission?.['automation|create']);
147148
const canCreateApp = !isCommunity && Boolean(buildAppEnabled && permission?.['app|create']);
148149
const canCreateFolder = Boolean(permission?.['base|update']);
150+
const canUpdateTable = Boolean(permission?.['table|update']);
149151

150152
const canCreateResource =
151153
isEditMode &&
@@ -558,26 +560,40 @@ export const BaseNodeTree = (props: IBaseNodeTreeProps) => {
558560
}
559561
return (
560562
// eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events
561-
<div className="cursor-pointer" onClick={(e) => e.stopPropagation()}>
563+
<div
564+
className="flex size-4 shrink-0 cursor-pointer items-center justify-center"
565+
onClick={(e) => e.stopPropagation()}
566+
>
562567
{resourceType === BaseNodeResourceType.Table && (
563568
<EmojiPicker
564-
className="flex size-4 items-center justify-center hover:bg-muted-foreground/60"
569+
className="flex size-full items-center justify-center hover:bg-muted-foreground/60"
565570
onChange={(icon: string) => curdHooks.updateNode(nodeId, { icon })}
571+
disabled={!canUpdateTable}
566572
>
567-
{icon ? (
568-
<Emoji emoji={icon} size={'1rem'} />
569-
) : (
570-
<IconComponent className="size-4 shrink-0" />
571-
)}
573+
{icon ? <Emoji emoji={icon} size="1rem" /> : <IconComponent className="size-full" />}
572574
</EmojiPicker>
573575
)}
574-
{resourceType !== BaseNodeResourceType.Table && (
575-
<IconComponent className="size-4 shrink-0" />
576-
)}
576+
{resourceType !== BaseNodeResourceType.Table && <IconComponent className="size-full" />}
577577
</div>
578578
);
579579
};
580580

581+
const ItemStatus = ({ item }: { item: ItemInstance<TreeItemData> }) => {
582+
const node = item.getItemData();
583+
if (!node) return null;
584+
const { resourceType, resourceMeta } = node;
585+
const isWorkflowActive =
586+
resourceType === BaseNodeResourceType.Workflow &&
587+
(resourceMeta as IBaseNodeWorkflowResourceMeta)?.isActive;
588+
const isAppPublished =
589+
resourceType === BaseNodeResourceType.App &&
590+
(resourceMeta as IBaseNodeAppResourceMeta)?.publicUrl;
591+
if (isWorkflowActive || isAppPublished) {
592+
return <span className="size-1.5 shrink-0 rounded-full bg-emerald-500" />;
593+
}
594+
return null;
595+
};
596+
581597
const renderEmpty = () => {
582598
if (isLoading) {
583599
return (
@@ -674,10 +690,8 @@ export const BaseNodeTree = (props: IBaseNodeTreeProps) => {
674690
>
675691
{item.getItemName()}
676692
</span>
677-
{node.resourceType === BaseNodeResourceType.Workflow &&
678-
(node.resourceMeta as IBaseNodeWorkflowResourceMeta)?.isActive && (
679-
<span className="size-1.5 shrink-0 rounded-full bg-emerald-500" />
680-
)}
693+
694+
<ItemStatus item={item} />
681695
</div>
682696
{
683697
// eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events

apps/nextjs-app/src/features/app/blocks/base/base-side-bar/QuickAction.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,13 @@ export const QuickAction = ({ children }: React.PropsWithChildren) => {
111111
}
112112
}}
113113
>
114-
{icon ? (
115-
<Emoji emoji={icon} size="1rem" className="size-4 shrink-0" />
116-
) : IconComponent ? (
117-
<IconComponent className="size-4 shrink-0" />
118-
) : null}
114+
<div className="flex size-4 shrink-0 items-center justify-center">
115+
{icon ? (
116+
<Emoji emoji={icon} size="1em" />
117+
) : IconComponent ? (
118+
<IconComponent className="size-full" />
119+
) : null}
120+
</div>
119121
<span>{name}</span>
120122
</CommandItem>
121123
);

packages/openapi/src/base-node/types.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ export const baseNodeTableResourceMetaSchema = defaultResourceMetaSchema.extend(
2323

2424
export type IBaseNodeTableResourceMeta = z.infer<typeof baseNodeTableResourceMetaSchema>;
2525

26-
export const baseNodeAppResourceMetaSchema = defaultResourceMetaSchema;
26+
export const baseNodeAppResourceMetaSchema = defaultResourceMetaSchema.extend({
27+
publicUrl: z.string().nullable().optional(),
28+
publishedVersion: z.number().nullable().optional(),
29+
});
2730

2831
export type IBaseNodeAppResourceMeta = z.infer<typeof baseNodeAppResourceMetaSchema>;
2932

0 commit comments

Comments
 (0)