Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
8598122
Feature: Add permissions display to Feast UI lineage visualization
devin-ai-integration[bot] May 3, 2025
8d947de
Format code with Prettier
devin-ai-integration[bot] May 4, 2025
fc1ea5c
Fix TypeScript errors in getEntityPermissions function
devin-ai-integration[bot] May 4, 2025
52a6e0c
Add permissions for zipcode_features, zipcode_source, and model_v1
devin-ai-integration[bot] May 4, 2025
15eeab0
Add permissions page and display permissions on feature service page
devin-ai-integration[bot] May 4, 2025
74f5448
Add mock permissions data for development
devin-ai-integration[bot] May 4, 2025
bf21399
Add permissions display to feature view pages
devin-ai-integration[bot] May 4, 2025
d550f4e
Add permissions display to entity pages
devin-ai-integration[bot] May 4, 2025
3211d58
Add permissions display to data source pages
devin-ai-integration[bot] May 4, 2025
5ed769f
Fix permissions implementation with separate apply_permissions.py script
devin-ai-integration[bot] May 4, 2025
f6c9624
Fix: Comment out NPM_TOKEN requirement in .npmrc for easier local dev…
devin-ai-integration[bot] May 4, 2025
f476a69
Fix: Add permissions display to features page and fix icon loading er…
devin-ai-integration[bot] May 4, 2025
2e15860
Update: EUI package to fix icon loading errors
devin-ai-integration[bot] May 4, 2025
ca8292b
Fix: Remove theme import to resolve icon loading errors
devin-ai-integration[bot] May 4, 2025
7f48e99
Fix: Update package dependencies to resolve icon loading errors
devin-ai-integration[bot] May 4, 2025
4fded55
Add Home | Lineage link and update permission utils
devin-ai-integration[bot] May 4, 2025
faed8d8
Add RAG project with feature views and permissions
devin-ai-integration[bot] May 4, 2025
8a38cfd
Update feature_store.yaml for RAG project
devin-ai-integration[bot] May 4, 2025
0c0d27d
Update: Move Home and Lineage links to sidebar navigation
devin-ai-integration[bot] May 4, 2025
6f5fd5e
Update: Remove Home | Lineage links from top of page
devin-ai-integration[bot] May 4, 2025
0b80676
Add: RAG data files for document embeddings and metadata
devin-ai-integration[bot] May 4, 2025
6d0d655
Fix: Update sidebar navigation to show Home | Lineage as a single item
devin-ai-integration[bot] May 4, 2025
2c3b195
Fix: Update Home | Lineage navigation to appear as a single line with…
devin-ai-integration[bot] May 4, 2025
e966f07
Fix: Update sidebar navigation to fix React Hook error
devin-ai-integration[bot] May 4, 2025
ccdf949
Fix: Update Lineage link to use feature service demo tab URL format
devin-ai-integration[bot] May 4, 2025
88c50de
Fix: Update Lineage link to properly redirect to the lineage tab
devin-ai-integration[bot] May 4, 2025
f211d2a
Update: Add data files to .gitignore
devin-ai-integration[bot] May 4, 2025
3c84796
Update: Move Lineage to its own page under Resources in sidebar
devin-ai-integration[bot] May 4, 2025
859b957
Update: Remove Home hyperlink and Lineage tab from home page
devin-ai-integration[bot] May 4, 2025
c7dfb24
Format: Run yarn format to ensure code follows project standards
devin-ai-integration[bot] May 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Format: Run yarn format to ensure code follows project standards
Co-Authored-By: Francisco Javier Arceo <arceofrancisco@gmail.com>
  • Loading branch information
commit c7dfb245d14e1e63286dfb96010446567f2d52f0
4 changes: 2 additions & 2 deletions ui/src/pages/ProjectOverviewPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@ const ProjectOverviewPage = () => {
<EuiText>
<p>
Welcome to your new Feast project. In this UI, you can see
Data Sources, Entities, Features, Feature Views, and
Feature Services registered in Feast.
Data Sources, Entities, Features, Feature Views, and Feature
Services registered in Feast.
</p>
<p>
It looks like this project already has some objects
Expand Down
8 changes: 4 additions & 4 deletions ui/src/pages/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,7 @@ const SideNav = () => {
name: "Lineage",
id: htmlIdGenerator("lineage")(),
icon: <EuiIcon type="graphApp" />,
renderItem: (props) => (
<Link {...props} to={`${baseUrl}/lineage`} />
),
renderItem: (props) => <Link {...props} to={`${baseUrl}/lineage`} />,
isSelected: useMatchSubpath(`${baseUrl}/lineage`),
},
{
Expand Down Expand Up @@ -133,7 +131,9 @@ const SideNav = () => {
name: "Permissions",
id: htmlIdGenerator("permissions")(),
icon: <EuiIcon type="lock" />,
renderItem: (props) => <Link {...props} to={`${baseUrl}/permissions`} />,
renderItem: (props) => (
<Link {...props} to={`${baseUrl}/permissions`} />
),
isSelected: useMatchSubpath(`${baseUrl}/permissions`),
},
],
Expand Down
8 changes: 5 additions & 3 deletions ui/src/pages/data-sources/DataSourceOverviewTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -124,15 +124,17 @@ const DataSourceOverviewTab = () => {
</EuiTitle>
<EuiHorizontalRule margin="xs"></EuiHorizontalRule>
{registryQuery.data?.permissions ? (
<PermissionsDisplay
<PermissionsDisplay
permissions={getEntityPermissions(
registryQuery.data.permissions,
FEAST_FCO_TYPES.dataSource,
dsName
dsName,
)}
/>
) : (
<EuiText>No permissions defined for this data source.</EuiText>
<EuiText>
No permissions defined for this data source.
</EuiText>
)}
</EuiPanel>
</EuiFlexItem>
Expand Down
4 changes: 2 additions & 2 deletions ui/src/pages/entities/EntityOverviewTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -147,11 +147,11 @@ const EntityOverviewTab = () => {
</EuiTitle>
<EuiHorizontalRule margin="xs" />
{registryQuery.data?.permissions ? (
<PermissionsDisplay
<PermissionsDisplay
permissions={getEntityPermissions(
registryQuery.data.permissions,
FEAST_FCO_TYPES.entity,
eName
eName,
)}
/>
) : (
Expand Down
8 changes: 5 additions & 3 deletions ui/src/pages/feature-services/FeatureServiceOverviewTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -175,15 +175,17 @@ const FeatureServiceOverviewTab = () => {
</EuiTitle>
<EuiHorizontalRule margin="xs" />
{data?.permissions ? (
<PermissionsDisplay
<PermissionsDisplay
permissions={getEntityPermissions(
data.permissions,
FEAST_FCO_TYPES.featureService,
fsName
fsName,
)}
/>
) : (
<EuiText>No permissions defined for this feature service.</EuiText>
<EuiText>
No permissions defined for this feature service.
</EuiText>
)}
</EuiPanel>
</EuiFlexItem>
Expand Down
10 changes: 6 additions & 4 deletions ui/src/pages/feature-services/useLoadFeatureService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,12 @@ const useLoadFeatureService = (featureServiceName: string) => {
}
return {
...registryQuery,
data: data ? {
...data,
permissions: registryQuery.data?.permissions
} : undefined,
data: data
? {
...data,
permissions: registryQuery.data?.permissions,
}
: undefined,
entities,
};
};
Expand Down
7 changes: 6 additions & 1 deletion ui/src/pages/feature-views/FeatureViewInstance.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,12 @@ const FeatureViewInstance = () => {
if (data.type === FEAST_FV_TYPES.regular) {
const fv: feast.core.IFeatureView = data.object;

return <RegularFeatureInstance data={fv} permissions={registryQuery.data?.permissions} />;
return (
<RegularFeatureInstance
data={fv}
permissions={registryQuery.data?.permissions}
/>
);
}

if (data.type === FEAST_FV_TYPES.ondemand) {
Expand Down
12 changes: 10 additions & 2 deletions ui/src/pages/feature-views/RegularFeatureViewInstance.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@ interface RegularFeatureInstanceProps {
permissions?: any[];
}

const RegularFeatureInstance = ({ data, permissions }: RegularFeatureInstanceProps) => {
const RegularFeatureInstance = ({
data,
permissions,
}: RegularFeatureInstanceProps) => {
const { enabledFeatureStatistics } = useContext(FeatureFlagsContext);
const navigate = useNavigate();

Expand Down Expand Up @@ -70,7 +73,12 @@ const RegularFeatureInstance = ({ data, permissions }: RegularFeatureInstancePro
<Routes>
<Route
path="/"
element={<RegularFeatureViewOverviewTab data={data} permissions={permissions} />}
element={
<RegularFeatureViewOverviewTab
data={data}
permissions={permissions}
/>
}
/>
<Route
path="/lineage"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,11 +156,11 @@ const RegularFeatureViewOverviewTab = ({
</EuiTitle>
<EuiHorizontalRule margin="xs" />
{permissions ? (
<PermissionsDisplay
<PermissionsDisplay
permissions={getEntityPermissions(
permissions,
FEAST_FCO_TYPES.featureView,
data?.spec?.name
data?.spec?.name,
)}
/>
) : (
Expand Down
50 changes: 33 additions & 17 deletions ui/src/pages/features/FeatureListPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,11 @@ import useLoadRegistry from "../../queries/useLoadRegistry";
import RegistryPathContext from "../../contexts/RegistryPathContext";
import { FeatureIcon } from "../../graphics/FeatureIcon";
import { FEAST_FCO_TYPES } from "../../parsers/types";
import { getEntityPermissions, formatPermissions, filterPermissionsByAction } from "../../utils/permissionUtils";
import {
getEntityPermissions,
formatPermissions,
filterPermissionsByAction,
} from "../../utils/permissionUtils";

interface Feature {
name: string;
Expand All @@ -49,18 +53,23 @@ const FeatureListPage = () => {
const [pageIndex, setPageIndex] = useState(0);
const [pageSize, setPageSize] = useState(100);

const featuresWithPermissions: Feature[] = (data?.allFeatures || []).map(feature => {
return {
...feature,
permissions: getEntityPermissions(
selectedPermissionAction
? filterPermissionsByAction(data?.permissions, selectedPermissionAction)
: data?.permissions,
FEAST_FCO_TYPES.featureView,
feature.featureView
)
};
});
const featuresWithPermissions: Feature[] = (data?.allFeatures || []).map(
(feature) => {
return {
...feature,
permissions: getEntityPermissions(
selectedPermissionAction
? filterPermissionsByAction(
data?.permissions,
selectedPermissionAction,
)
: data?.permissions,
FEAST_FCO_TYPES.featureView,
feature.featureView,
),
};
},
);

const features: Feature[] = featuresWithPermissions;

Expand Down Expand Up @@ -114,17 +123,22 @@ const FeatureListPage = () => {
return hasPermissions ? (
<EuiToolTip
position="top"
content={<pre style={{ margin: 0 }}>{formatPermissions(permissions)}</pre>}
content={
<pre style={{ margin: 0 }}>{formatPermissions(permissions)}</pre>
}
>
<div style={{ display: "flex", alignItems: "center" }}>
<EuiIcon type="lock" color="#5a7be0" />
<EuiText size="xs" style={{ marginLeft: "4px" }}>
{permissions.length} permission{permissions.length !== 1 ? "s" : ""}
{permissions.length} permission
{permissions.length !== 1 ? "s" : ""}
</EuiText>
</div>
</EuiToolTip>
) : (
<EuiText size="xs" color="subdued">None</EuiText>
<EuiText size="xs" color="subdued">
None
</EuiText>
);
},
},
Expand Down Expand Up @@ -193,7 +207,9 @@ const FeatureListPage = () => {
{ value: "WRITE_OFFLINE", text: "WRITE_OFFLINE" },
]}
value={selectedPermissionAction}
onChange={(e) => setSelectedPermissionAction(e.target.value)}
onChange={(e) =>
setSelectedPermissionAction(e.target.value)
}
aria-label="Filter by permission action"
/>
</EuiFormRow>
Expand Down
6 changes: 3 additions & 3 deletions ui/src/pages/lineage/Index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ const LineagePage = () => {
title={<h2>Error Loading Project Configs</h2>}
body={
<p>
There was an error loading the Project Configurations.
Please check that <code>feature_store.yaml</code> file is
available and well-formed.
There was an error loading the Project Configurations. Please
check that <code>feature_store.yaml</code> file is available and
well-formed.
</p>
}
/>
Expand Down
6 changes: 4 additions & 2 deletions ui/src/pages/permissions/Index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ const PermissionsIndex = () => {
{ value: "WRITE_OFFLINE", text: "WRITE_OFFLINE" },
]}
value={selectedPermissionAction}
onChange={(e) => setSelectedPermissionAction(e.target.value)}
onChange={(e) =>
setSelectedPermissionAction(e.target.value)
}
aria-label="Filter by action"
/>
</EuiFormRow>
Expand All @@ -72,7 +74,7 @@ const PermissionsIndex = () => {
selectedPermissionAction
? filterPermissionsByAction(
data.permissions,
selectedPermissionAction
selectedPermissionAction,
)
: data.permissions
}
Expand Down
83 changes: 42 additions & 41 deletions ui/src/queries/useLoadRegistry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,47 +80,48 @@ const useLoadRegistry = (url: string) => {
relationships,
indirectRelationships,
allFeatures,
permissions: objects.permissions && objects.permissions.length > 0
? objects.permissions
: [
{
spec: {
name: "zipcode-features-reader",
types: [2], // FeatureView
name_patterns: ["zipcode_features"],
policy: { roles: ["analyst", "data_scientist"] },
actions: [1, 4, 5] // DESCRIBE, READ_ONLINE, READ_OFFLINE
}
},
{
spec: {
name: "zipcode-source-writer",
types: [7], // FileSource
name_patterns: ["zipcode"],
policy: { roles: ["admin", "data_engineer"] },
actions: [0, 2, 7] // CREATE, UPDATE, WRITE_OFFLINE
}
},
{
spec: {
name: "credit-score-v1-reader",
types: [6], // FeatureService
name_patterns: ["credit_score_v1"],
policy: { roles: ["model_user", "data_scientist"] },
actions: [1, 4] // DESCRIBE, READ_ONLINE
}
},
{
spec: {
name: "risky-features-reader",
types: [2, 6], // FeatureView, FeatureService
name_patterns: [],
required_tags: { "stage": "prod" },
policy: { roles: ["trusted_analyst"] },
actions: [5] // READ_OFFLINE
}
}
],
permissions:
objects.permissions && objects.permissions.length > 0
? objects.permissions
: [
{
spec: {
name: "zipcode-features-reader",
types: [2], // FeatureView
name_patterns: ["zipcode_features"],
policy: { roles: ["analyst", "data_scientist"] },
actions: [1, 4, 5], // DESCRIBE, READ_ONLINE, READ_OFFLINE
},
},
{
spec: {
name: "zipcode-source-writer",
types: [7], // FileSource
name_patterns: ["zipcode"],
policy: { roles: ["admin", "data_engineer"] },
actions: [0, 2, 7], // CREATE, UPDATE, WRITE_OFFLINE
},
},
{
spec: {
name: "credit-score-v1-reader",
types: [6], // FeatureService
name_patterns: ["credit_score_v1"],
policy: { roles: ["model_user", "data_scientist"] },
actions: [1, 4], // DESCRIBE, READ_ONLINE
},
},
{
spec: {
name: "risky-features-reader",
types: [2, 6], // FeatureView, FeatureService
name_patterns: [],
required_tags: { stage: "prod" },
policy: { roles: ["trusted_analyst"] },
actions: [5], // READ_OFFLINE
},
},
],
};
});
},
Expand Down
Loading