diff --git a/apiserver/plane/api/serializers/module.py b/apiserver/plane/api/serializers/module.py index a768cd26c6..c1a0c577db 100644 --- a/apiserver/plane/api/serializers/module.py +++ b/apiserver/plane/api/serializers/module.py @@ -71,6 +71,16 @@ class ModuleSerializer(BaseSerializer): project_id = self.context["project_id"] workspace_id = self.context["workspace_id"] + module_name = validated_data.get("name") + if module_name: + # Lookup for the module name in the module table for that project + if Module.objects.filter( + name=module_name, project_id=project_id + ).exists(): + raise serializers.ValidationError( + {"error": "Module with this name already exists"} + ) + module = Module.objects.create(**validated_data, project_id=project_id) if members is not None: ModuleMember.objects.bulk_create( @@ -93,6 +103,19 @@ class ModuleSerializer(BaseSerializer): def update(self, instance, validated_data): members = validated_data.pop("members", None) + module_name = validated_data.get("name") + if module_name: + # Lookup for the module name in the module table for that project + if ( + Module.objects.filter( + name=module_name, project=instance.project + ) + .exclude(id=instance.id) + .exists() + ): + raise serializers.ValidationError( + {"error": "Module with this name already exists"} + ) if members is not None: ModuleMember.objects.filter(module=instance).delete() diff --git a/apiserver/plane/app/serializers/module.py b/apiserver/plane/app/serializers/module.py index fc228b6b96..48ace60222 100644 --- a/apiserver/plane/app/serializers/module.py +++ b/apiserver/plane/app/serializers/module.py @@ -68,6 +68,16 @@ class ModuleWriteSerializer(BaseSerializer): members = validated_data.pop("member_ids", None) project = self.context["project"] + module_name = validated_data.get("name") + if module_name: + # Lookup for the module name in the module table for that project + if Module.objects.filter( + name=module_name, project=project + ).exists(): + raise serializers.ValidationError( + {"error": "Module with this name already exists"} + ) + module = Module.objects.create(**validated_data, project=project) if members is not None: ModuleMember.objects.bulk_create( @@ -90,6 +100,19 @@ class ModuleWriteSerializer(BaseSerializer): def update(self, instance, validated_data): members = validated_data.pop("member_ids", None) + module_name = validated_data.get("name") + if module_name: + # Lookup for the module name in the module table for that project + if ( + Module.objects.filter( + name=module_name, project=instance.project + ) + .exclude(id=instance.id) + .exists() + ): + raise serializers.ValidationError( + {"error": "Module with this name already exists"} + ) if members is not None: ModuleMember.objects.filter(module=instance).delete() diff --git a/live/src/server.ts b/live/src/server.ts index 494342305d..94b44ccbad 100644 --- a/live/src/server.ts +++ b/live/src/server.ts @@ -41,7 +41,7 @@ router.ws("/collaboration", (ws, req) => { app.use(process.env.LIVE_BASE_PATH || "/live", router); -app.use((_req, res, _next) => { +app.use((_req, res) => { res.status(404).send("Not Found"); }); diff --git a/packages/editor/src/core/components/editors/document/collaborative-editor.tsx b/packages/editor/src/core/components/editors/document/collaborative-editor.tsx index 9d5a42a81d..4d7008f2ec 100644 --- a/packages/editor/src/core/components/editors/document/collaborative-editor.tsx +++ b/packages/editor/src/core/components/editors/document/collaborative-editor.tsx @@ -3,14 +3,14 @@ import React from "react"; import { PageRenderer } from "@/components/editors"; // constants import { DEFAULT_DISPLAY_CONFIG } from "@/constants/config"; +// extensions +import { IssueWidget } from "@/extensions"; // helpers import { getEditorClassNames } from "@/helpers/common"; -// plane editor types -import { TEmbedConfig } from "@/plane-editor/types"; +// hooks +import { useCollaborativeEditor } from "@/hooks/use-collaborative-editor"; // types import { EditorRefApi, ICollaborativeDocumentEditor } from "@/types"; -import { useCollaborativeEditor } from "@/hooks/use-collaborative-editor"; -import { IssueWidget } from "@/extensions"; const CollaborativeDocumentEditor = (props: ICollaborativeDocumentEditor) => { const { diff --git a/web/core/components/icons/locked-component.tsx b/web/core/components/icons/locked-component.tsx index 653d2b8e7b..36230a093c 100644 --- a/web/core/components/icons/locked-component.tsx +++ b/web/core/components/icons/locked-component.tsx @@ -4,7 +4,7 @@ import { Tooltip } from "@plane/ui"; export const LockedComponent = (props: { toolTipContent?: string }) => { const { toolTipContent } = props; const lockedComponent = ( -
+
Locked
diff --git a/web/core/components/modules/modal.tsx b/web/core/components/modules/modal.tsx index 11df178b82..aed1b90196 100644 --- a/web/core/components/modules/modal.tsx +++ b/web/core/components/modules/modal.tsx @@ -71,7 +71,7 @@ export const CreateUpdateModuleModal: React.FC = observer((props) => { setToast({ type: TOAST_TYPE.ERROR, title: "Error!", - message: err?.detail ?? "Module could not be created. Please try again.", + message: err?.detail ?? err?.error ?? "Module could not be created. Please try again.", }); captureModuleEvent({ eventName: MODULE_CREATED, @@ -102,7 +102,7 @@ export const CreateUpdateModuleModal: React.FC = observer((props) => { setToast({ type: TOAST_TYPE.ERROR, title: "Error!", - message: err?.detail ?? "Module could not be updated. Please try again.", + message: err?.detail ?? err?.error ?? "Module could not be updated. Please try again.", }); captureModuleEvent({ eventName: MODULE_UPDATED, diff --git a/web/core/components/pages/editor/header/extra-options.tsx b/web/core/components/pages/editor/header/extra-options.tsx index 096310aeb9..c45d9e99f5 100644 --- a/web/core/components/pages/editor/header/extra-options.tsx +++ b/web/core/components/pages/editor/header/extra-options.tsx @@ -63,7 +63,7 @@ export const PageExtraOptions: React.FC = observer((props) => {
{is_locked && } {archived_at && ( -
+
Archived at {renderFormattedDate(archived_at)}
@@ -73,7 +73,7 @@ export const PageExtraOptions: React.FC = observer((props) => { tooltipHeading="You are offline" tooltipContent="All changes made will be saved locally and will be synced when the internet connection is re-established." > -
+
Offline
@@ -84,14 +84,19 @@ export const PageExtraOptions: React.FC = observer((props) => { tooltipHeading="Connection failed" tooltipContent="All changes made will be saved locally and will be synced when the connection is re-established." > -
+
Server error
)} {canCurrentUserFavoritePage && ( - + )}