diff --git a/client/src/features/ProjectPageV2/ProjectPageContent/Settings/ProjectDelete.tsx b/client/src/features/ProjectPageV2/ProjectPageContent/Settings/ProjectDelete.tsx
index ba6beb0eca..a8efbfaf5a 100644
--- a/client/src/features/ProjectPageV2/ProjectPageContent/Settings/ProjectDelete.tsx
+++ b/client/src/features/ProjectPageV2/ProjectPageContent/Settings/ProjectDelete.tsx
@@ -55,7 +55,7 @@ export default function ProjectPageDelete({ project }: ProjectDeleteProps) {
useEffect(() => {
if (result.isSuccess) {
- navigate(ABSOLUTE_ROUTES.v2.projects.root);
+ navigate(ABSOLUTE_ROUTES.v2.root);
if (notifications)
notificationProjectDeleted(notifications, project.name);
}
diff --git a/client/src/features/ProjectPageV2/settings/ProjectDeleteConfirmation.tsx b/client/src/features/ProjectPageV2/settings/ProjectDeleteConfirmation.tsx
index 836ab1b5dd..71498bedf7 100644
--- a/client/src/features/ProjectPageV2/settings/ProjectDeleteConfirmation.tsx
+++ b/client/src/features/ProjectPageV2/settings/ProjectDeleteConfirmation.tsx
@@ -64,7 +64,7 @@ export default function ProjectDeleteConfirmation({
useEffect(() => {
if (result.isSuccess) {
- navigate(ABSOLUTE_ROUTES.v2.projects.root);
+ navigate(ABSOLUTE_ROUTES.v2.root);
if (notifications)
notificationProjectDeleted(notifications, project.name);
}
diff --git a/client/src/features/dashboardV2/DashboardV2.tsx b/client/src/features/dashboardV2/DashboardV2.tsx
index e54e550a64..2981c9a457 100644
--- a/client/src/features/dashboardV2/DashboardV2.tsx
+++ b/client/src/features/dashboardV2/DashboardV2.tsx
@@ -18,17 +18,10 @@
import cx from "classnames";
import { Folder, People, PlayCircle, PlusLg } from "react-bootstrap-icons";
import { Link } from "react-router-dom-v5-compat";
-import {
- Card,
- CardBody,
- CardFooter,
- CardHeader,
- Col,
- ListGroup,
- Row,
-} from "reactstrap";
+import { Card, CardBody, CardHeader, Col, ListGroup, Row } from "reactstrap";
import { WarnAlert } from "../../components/Alert";
+import { RtkOrNotebooksError } from "../../components/errors/RtkErrorAlert";
import { ExternalLink } from "../../components/ExternalLinks";
import { Loader } from "../../components/Loader";
import {
@@ -36,33 +29,44 @@ import {
useGetProjectsQuery,
} from "../projectsV2/api/projectV2.enhanced-api";
import BackToV1Button from "../projectsV2/shared/BackToV1Button";
-import { RtkOrNotebooksError } from "../../components/errors/RtkErrorAlert";
-import DashboardV2Sessions from "./DashboardV2Sessions";
import GroupShortHandDisplay from "../projectsV2/show/GroupShortHandDisplay";
import ProjectShortHandDisplay from "../projectsV2/show/ProjectShortHandDisplay";
+import DashboardV2Sessions from "./DashboardV2Sessions";
export default function DashboardV2() {
return (
-
-
-
+
+
+
+
+
+
+
+
+
);
}
function DashboardWelcome() {
return (
-
+
-
Welcome to the Renku 2.0 beta preview!
+
+ Welcome to the Renku 2.0 beta preview!!
+
-
+
Learn more about Renku 2.0 on our{" "}
-
Do not do any important work in the Renku 2.0 beta preview!
-
+
+ Do not do any important work in the Renku 2.0 beta preview!
+
+
The beta is for testing only. We do not guarantee saving and
- persisting work in the beta.
+ persisting work in the beta. You can go{" "}
+ at any time.
);
}
@@ -256,3 +279,27 @@ function SessionsDashboard() {
);
}
+
+function ViewAllLink({
+ type,
+ noItems,
+}: {
+ type: "project" | "group";
+ noItems: boolean;
+}) {
+ return noItems ? (
+
+ View other {type === "project" ? "projects" : "groups"}
+
+ ) : (
+
+ View all my {type === "project" ? "projects" : "groups"}
+
+ );
+}
diff --git a/client/src/features/dashboardV2/DashboardV2Sessions.tsx b/client/src/features/dashboardV2/DashboardV2Sessions.tsx
index ec2da1f281..b95eec252b 100644
--- a/client/src/features/dashboardV2/DashboardV2Sessions.tsx
+++ b/client/src/features/dashboardV2/DashboardV2Sessions.tsx
@@ -90,14 +90,14 @@ function DashboardSession({ session }: DashboardSessionProps) {
? generatePath(ABSOLUTE_ROUTES.v2.projects.showById, {
id: projectId,
})
- : ABSOLUTE_ROUTES.v2.projects.root;
+ : ABSOLUTE_ROUTES.v2.root;
const showSessionUrl = project
? generatePath(ABSOLUTE_ROUTES.v2.projects.show.sessions.show, {
namespace: project.namespace,
slug: project.slug,
session: session.name,
})
- : ABSOLUTE_ROUTES.v2.projects.root;
+ : ABSOLUTE_ROUTES.v2.root;
return (
import("./list/GroupList"));
-
-export default function LazyGroupList() {
- return (
- }>
-
-
- );
-}
diff --git a/client/src/features/projectsV2/LazyProjectV2List.tsx b/client/src/features/projectsV2/LazyProjectV2List.tsx
deleted file mode 100644
index 7324588093..0000000000
--- a/client/src/features/projectsV2/LazyProjectV2List.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-/*!
- * Copyright 2024 - Swiss Data Science Center (SDSC)
- * A partnership between École Polytechnique Fédérale de Lausanne (EPFL) and
- * Eidgenössische Technische Hochschule Zürich (ETHZ).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-import { Suspense, lazy } from "react";
-import PageLoader from "../../components/PageLoader";
-
-const ProjectV2List = lazy(() => import("./list/ProjectV2List"));
-
-export default function LazyProjectV2List() {
- return (
- }>
-
-
- );
-}
diff --git a/client/src/features/projectsV2/api/namespace.api.ts b/client/src/features/projectsV2/api/namespace.api.ts
index bf7fc4e360..b05a579ff8 100644
--- a/client/src/features/projectsV2/api/namespace.api.ts
+++ b/client/src/features/projectsV2/api/namespace.api.ts
@@ -91,6 +91,8 @@ export type GetGroupsApiArg = {
page?: number;
/** The number of results per page */
perPage?: number;
+ /** A flag to filter groups where the user is a direct member */
+ direct_member?: boolean;
};
export type PostGroupsApiResponse =
/** status 201 The group was created */ GroupResponse;
diff --git a/client/src/features/projectsV2/api/projectV2.api.ts b/client/src/features/projectsV2/api/projectV2.api.ts
index d685b66a41..2e12f25e3e 100644
--- a/client/src/features/projectsV2/api/projectV2.api.ts
+++ b/client/src/features/projectsV2/api/projectV2.api.ts
@@ -90,6 +90,8 @@ export type GetProjectsApiArg = {
page?: number;
/** The number of results per page */
perPage?: number;
+ /** A flag to filter projects where the user is a direct member */
+ direct_member?: boolean;
};
export type PostProjectsApiResponse =
/** status 201 The project was created */ Project;
@@ -142,6 +144,7 @@ export type Ulid = string;
export type ProjectName = string;
export type Slug = string;
export type CreationDate = string;
+export type UpdatedAt = string;
export type UserId = string;
export type Repository = string;
export type RepositoriesList = Repository[];
@@ -162,6 +165,7 @@ export type Project = {
description?: Description;
etag?: ETag;
keywords?: KeywordsList;
+ updated_at?: UpdatedAt;
};
export type ProjectsList = Project[];
export type ErrorResponse = {
diff --git a/client/src/features/projectsV2/api/projectV2.enhanced-api.ts b/client/src/features/projectsV2/api/projectV2.enhanced-api.ts
index b47bdc8b3a..ae21df71e4 100644
--- a/client/src/features/projectsV2/api/projectV2.enhanced-api.ts
+++ b/client/src/features/projectsV2/api/projectV2.enhanced-api.ts
@@ -58,7 +58,11 @@ const injectedApi = api.injectEndpoints({
getGroupsPaged: builder.query({
query: (queryArg) => ({
url: "/groups",
- params: { page: queryArg.page, per_page: queryArg.perPage },
+ params: {
+ page: queryArg.page,
+ per_page: queryArg.perPage,
+ direct_member: queryArg.direct_member,
+ },
}),
transformResponse: (response, meta, queryArg) => {
const groups = response as GroupResponseList;
@@ -113,6 +117,7 @@ const injectedApi = api.injectEndpoints({
url: "/projects",
params: {
namespace: queryArg["namespace"],
+ direct_member: queryArg["direct_member"],
page: queryArg.page,
per_page: queryArg.perPage,
},
diff --git a/client/src/features/projectsV2/list/GroupList.tsx b/client/src/features/projectsV2/list/GroupList.tsx
index 8dde39426a..e69de29bb2 100644
--- a/client/src/features/projectsV2/list/GroupList.tsx
+++ b/client/src/features/projectsV2/list/GroupList.tsx
@@ -1,136 +0,0 @@
-/*!
- * Copyright 2023 - Swiss Data Science Center (SDSC)
- * A partnership between École Polytechnique Fédérale de Lausanne (EPFL) and
- * Eidgenössische Technische Hochschule Zürich (ETHZ).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-import cx from "classnames";
-import { useState } from "react";
-import { Card, CardBody, Col, Row } from "reactstrap";
-import { generatePath, Link } from "react-router-dom-v5-compat";
-
-import ContainerWrap from "../../../components/container/ContainerWrap";
-import FormSchema from "../../../components/formschema/FormSchema";
-import { Loader } from "../../../components/Loader";
-import Pagination from "../../../components/Pagination";
-import { TimeCaption } from "../../../components/TimeCaption";
-import { ABSOLUTE_ROUTES } from "../../../routing/routes.constants";
-import type { GroupResponse } from "../api/namespace.api";
-import { useGetGroupsQuery } from "../api/projectV2.enhanced-api";
-import WipBadge from "../shared/WipBadge";
-import { RtkOrNotebooksError } from "../../../components/errors/RtkErrorAlert";
-import ClampedParagraph from "../../../components/clamped/ClampedParagraph";
-
-interface GroupListGroupProps {
- group: GroupResponse;
-}
-function GroupListGroup({ group }: GroupListGroupProps) {
- const groupUrl = generatePath(ABSOLUTE_ROUTES.v2.groups.show.root, {
- slug: group.slug,
- });
- return (
-
- >
- }
- >
-
-
-
- );
-}
diff --git a/client/src/features/projectsV2/list/ProjectV2List.tsx b/client/src/features/projectsV2/list/ProjectV2List.tsx
deleted file mode 100644
index 7259ee620b..0000000000
--- a/client/src/features/projectsV2/list/ProjectV2List.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-/*!
- * Copyright 2024 - Swiss Data Science Center (SDSC)
- * A partnership between École Polytechnique Fédérale de Lausanne (EPFL) and
- * Eidgenössische Technische Hochschule Zürich (ETHZ).
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-import cx from "classnames";
-import { Link } from "react-router-dom-v5-compat";
-
-import FormSchema from "../../../components/formschema/FormSchema";
-import { ABSOLUTE_ROUTES } from "../../../routing/routes.constants";
-import WipBadge from "../shared/WipBadge";
-import ProjectListDisplay from "./ProjectV2ListDisplay";
-
-export default function ProjectV2List() {
- const newProjectUrl = ABSOLUTE_ROUTES.v2.projects.new;
- return (
-
-
- All visible projects
-
-
-
-
- Create New Project
-
-
- >
- }
- >
- There are no visible projects.}
- />
-
- );
-}
diff --git a/client/src/features/projectsV2/new/GroupNew.tsx b/client/src/features/projectsV2/new/GroupNew.tsx
index 94b021d856..d664670acf 100644
--- a/client/src/features/projectsV2/new/GroupNew.tsx
+++ b/client/src/features/projectsV2/new/GroupNew.tsx
@@ -146,7 +146,7 @@ function GroupMetadataForm() {