diff --git a/apps/nextjs-app/src/features/app/blocks/base/base-side-bar/BaseNodeTree.tsx b/apps/nextjs-app/src/features/app/blocks/base/base-side-bar/BaseNodeTree.tsx
index 01def5114e..7a3d4d5ace 100644
--- a/apps/nextjs-app/src/features/app/blocks/base/base-side-bar/BaseNodeTree.tsx
+++ b/apps/nextjs-app/src/features/app/blocks/base/base-side-bar/BaseNodeTree.tsx
@@ -5,6 +5,7 @@ import type {
IBaseNodeVo,
IDuplicateBaseNodeRo,
IBaseNodeWorkflowResourceMeta,
+ IBaseNodeAppResourceMeta,
} from '@teable/openapi';
import { BaseNodeResourceType } from '@teable/openapi';
import { LocalStorageKeys, ReactQueryKeys } from '@teable/sdk/config';
@@ -146,6 +147,7 @@ export const BaseNodeTree = (props: IBaseNodeTreeProps) => {
const canCreateWorkflow = !isCommunity && Boolean(permission?.['automation|create']);
const canCreateApp = !isCommunity && Boolean(buildAppEnabled && permission?.['app|create']);
const canCreateFolder = Boolean(permission?.['base|update']);
+ const canUpdateTable = Boolean(permission?.['table|update']);
const canCreateResource =
isEditMode &&
@@ -558,26 +560,40 @@ export const BaseNodeTree = (props: IBaseNodeTreeProps) => {
}
return (
// eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events
-
e.stopPropagation()}>
+
e.stopPropagation()}
+ >
{resourceType === BaseNodeResourceType.Table && (
curdHooks.updateNode(nodeId, { icon })}
+ disabled={!canUpdateTable}
>
- {icon ? (
-
- ) : (
-
- )}
+ {icon ? : }
)}
- {resourceType !== BaseNodeResourceType.Table && (
-
- )}
+ {resourceType !== BaseNodeResourceType.Table && }
);
};
+ const ItemStatus = ({ item }: { item: ItemInstance
}) => {
+ const node = item.getItemData();
+ if (!node) return null;
+ const { resourceType, resourceMeta } = node;
+ const isWorkflowActive =
+ resourceType === BaseNodeResourceType.Workflow &&
+ (resourceMeta as IBaseNodeWorkflowResourceMeta)?.isActive;
+ const isAppPublished =
+ resourceType === BaseNodeResourceType.App &&
+ (resourceMeta as IBaseNodeAppResourceMeta)?.publicUrl;
+ if (isWorkflowActive || isAppPublished) {
+ return ;
+ }
+ return null;
+ };
+
const renderEmpty = () => {
if (isLoading) {
return (
@@ -674,10 +690,8 @@ export const BaseNodeTree = (props: IBaseNodeTreeProps) => {
>
{item.getItemName()}
- {node.resourceType === BaseNodeResourceType.Workflow &&
- (node.resourceMeta as IBaseNodeWorkflowResourceMeta)?.isActive && (
-
- )}
+
+
{
// eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events
diff --git a/apps/nextjs-app/src/features/app/blocks/base/base-side-bar/QuickAction.tsx b/apps/nextjs-app/src/features/app/blocks/base/base-side-bar/QuickAction.tsx
index ec6968b4be..563acd28c2 100644
--- a/apps/nextjs-app/src/features/app/blocks/base/base-side-bar/QuickAction.tsx
+++ b/apps/nextjs-app/src/features/app/blocks/base/base-side-bar/QuickAction.tsx
@@ -111,11 +111,13 @@ export const QuickAction = ({ children }: React.PropsWithChildren) => {
}
}}
>
- {icon ? (
-
- ) : IconComponent ? (
-
- ) : null}
+
+ {icon ? (
+
+ ) : IconComponent ? (
+
+ ) : null}
+
{name}
);
diff --git a/packages/openapi/src/base-node/types.ts b/packages/openapi/src/base-node/types.ts
index 90c3f89a71..6c03fb7549 100644
--- a/packages/openapi/src/base-node/types.ts
+++ b/packages/openapi/src/base-node/types.ts
@@ -23,7 +23,10 @@ export const baseNodeTableResourceMetaSchema = defaultResourceMetaSchema.extend(
export type IBaseNodeTableResourceMeta = z.infer;
-export const baseNodeAppResourceMetaSchema = defaultResourceMetaSchema;
+export const baseNodeAppResourceMetaSchema = defaultResourceMetaSchema.extend({
+ publicUrl: z.string().nullable().optional(),
+ publishedVersion: z.number().nullable().optional(),
+});
export type IBaseNodeAppResourceMeta = z.infer;