forked from github/plane
Merge branch 'develop' of github.com:makeplane/plane into stage/merge-fixes
This commit is contained in:
commit
fde978861c
@ -88,6 +88,7 @@ class ProjectLiteSerializer(BaseSerializer):
|
|||||||
"cover_image",
|
"cover_image",
|
||||||
"icon_prop",
|
"icon_prop",
|
||||||
"emoji",
|
"emoji",
|
||||||
|
"description",
|
||||||
]
|
]
|
||||||
read_only_fields = fields
|
read_only_fields = fields
|
||||||
|
|
||||||
|
@ -53,7 +53,9 @@ export const NotificationCard: React.FC<NotificationCardProps> = (props) => {
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
markNotificationReadStatus(notification.id);
|
markNotificationReadStatus(notification.id);
|
||||||
router.push(
|
router.push(
|
||||||
`/${workspaceSlug}/projects/${notification.project}/issues/${notification.data.issue.id}`
|
`/${workspaceSlug}/projects/${notification.project}/${
|
||||||
|
notification.data.issue_activity.field === "archived_at" ? "archived-issues" : "issues"
|
||||||
|
}/${notification.data.issue.id}`
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
className={`group w-full flex items-center gap-4 p-3 pl-6 relative cursor-pointer ${
|
className={`group w-full flex items-center gap-4 p-3 pl-6 relative cursor-pointer ${
|
||||||
|
@ -1,11 +1,34 @@
|
|||||||
"use client";
|
|
||||||
|
|
||||||
// next imports
|
// next imports
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
import Image from "next/image";
|
import Image from "next/image";
|
||||||
|
import { Metadata, ResolvingMetadata } from "next";
|
||||||
// components
|
// components
|
||||||
import IssueNavbar from "components/issues/navbar";
|
import IssueNavbar from "components/issues/navbar";
|
||||||
import IssueFilter from "components/issues/filters-render";
|
import IssueFilter from "components/issues/filters-render";
|
||||||
|
// service
|
||||||
|
import ProjectService from "services/project.service";
|
||||||
|
|
||||||
|
type LayoutProps = {
|
||||||
|
params: { workspace_slug: string; project_slug: string };
|
||||||
|
};
|
||||||
|
|
||||||
|
export async function generateMetadata({ params }: LayoutProps): Promise<Metadata> {
|
||||||
|
// read route params
|
||||||
|
const { workspace_slug, project_slug } = params;
|
||||||
|
const projectServiceInstance = new ProjectService();
|
||||||
|
|
||||||
|
const project = await projectServiceInstance?.getProjectSettingsAsync(workspace_slug, project_slug);
|
||||||
|
|
||||||
|
return {
|
||||||
|
title: `${project?.project_details?.name} | ${workspace_slug}`,
|
||||||
|
description: `${project?.project_details?.description || `${project?.project_details?.name} | ${workspace_slug}`}`,
|
||||||
|
icons: `data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>${
|
||||||
|
typeof project?.project_details?.emoji != "object"
|
||||||
|
? String.fromCodePoint(parseInt(project?.project_details?.emoji))
|
||||||
|
: "✈️"
|
||||||
|
}</text></svg>`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
const RootLayout = ({ children }: { children: React.ReactNode }) => (
|
const RootLayout = ({ children }: { children: React.ReactNode }) => (
|
||||||
<div className="relative w-screen min-h-[500px] h-screen overflow-hidden flex flex-col">
|
<div className="relative w-screen min-h-[500px] h-screen overflow-hidden flex flex-col">
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
||||||
const HomePage = () => (
|
const HomePage = () => (
|
||||||
<div className="relative w-screen h-screen flex justify-center items-center text-5xl">Plane Space</div>
|
<div className="relative w-screen h-screen flex justify-center items-center text-5xl">Plane Deploy</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
export default HomePage;
|
export default HomePage;
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
|
// next imports
|
||||||
|
import Image from "next/image";
|
||||||
// components
|
// components
|
||||||
import { NavbarSearch } from "./search";
|
import { NavbarSearch } from "./search";
|
||||||
import { NavbarIssueBoardView } from "./issue-board-view";
|
import { NavbarIssueBoardView } from "./issue-board-view";
|
||||||
@ -12,6 +14,18 @@ import { observer } from "mobx-react-lite";
|
|||||||
import { useMobxStore } from "lib/mobx/store-provider";
|
import { useMobxStore } from "lib/mobx/store-provider";
|
||||||
import { RootStore } from "store/root";
|
import { RootStore } from "store/root";
|
||||||
|
|
||||||
|
const renderEmoji = (emoji: string | { name: string; color: string }) => {
|
||||||
|
if (!emoji) return;
|
||||||
|
|
||||||
|
if (typeof emoji === "object")
|
||||||
|
return (
|
||||||
|
<span style={{ color: emoji.color }} className="material-symbols-rounded text-lg">
|
||||||
|
{emoji.name}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
else return isNaN(parseInt(emoji)) ? emoji : String.fromCodePoint(parseInt(emoji));
|
||||||
|
};
|
||||||
|
|
||||||
const IssueNavbar = observer(() => {
|
const IssueNavbar = observer(() => {
|
||||||
const store: RootStore = useMobxStore();
|
const store: RootStore = useMobxStore();
|
||||||
|
|
||||||
@ -20,7 +34,11 @@ const IssueNavbar = observer(() => {
|
|||||||
{/* project detail */}
|
{/* project detail */}
|
||||||
<div className="flex-shrink-0 flex items-center gap-2">
|
<div className="flex-shrink-0 flex items-center gap-2">
|
||||||
<div className="w-[32px] h-[32px] rounded-sm flex justify-center items-center bg-gray-100 text-[24px]">
|
<div className="w-[32px] h-[32px] rounded-sm flex justify-center items-center bg-gray-100 text-[24px]">
|
||||||
{store?.project?.project && store?.project?.project?.icon ? store?.project?.project?.icon : "😊"}
|
{store?.project?.project && store?.project?.project?.emoji ? (
|
||||||
|
renderEmoji(store?.project?.project?.emoji)
|
||||||
|
) : (
|
||||||
|
<Image src="/plane-logo.webp" alt="plane logo" className="w-[24px] h-[24px]" height="24" width="24" />
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="font-medium text-lg max-w-[300px] line-clamp-1 overflow-hidden">
|
<div className="font-medium text-lg max-w-[300px] line-clamp-1 overflow-hidden">
|
||||||
{store?.project?.project?.name || `...`}
|
{store?.project?.project?.name || `...`}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"name": "plane-space",
|
"name": "plane-deploy",
|
||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -8,6 +8,7 @@ export interface IProject {
|
|||||||
id: string;
|
id: string;
|
||||||
identifier: string;
|
identifier: string;
|
||||||
name: string;
|
name: string;
|
||||||
|
description: string;
|
||||||
icon: string;
|
icon: string;
|
||||||
cover_image: string | null;
|
cover_image: string | null;
|
||||||
icon_prop: string | null;
|
icon_prop: string | null;
|
||||||
|
Loading…
Reference in New Issue
Block a user