diff --git a/components/CollectionSelection.tsx b/components/CollectionListing.tsx
similarity index 100%
rename from components/CollectionSelection.tsx
rename to components/CollectionListing.tsx
diff --git a/components/InputSelect/CollectionSelection.tsx b/components/InputSelect/CollectionSelection.tsx
index 5e36ff8..99b999e 100644
--- a/components/InputSelect/CollectionSelection.tsx
+++ b/components/InputSelect/CollectionSelection.tsx
@@ -10,11 +10,11 @@ type Props = {
onChange: any;
showDefaultValue?: boolean;
defaultValue?:
- | {
- label: string;
- value?: number;
- }
- | undefined;
+ | {
+ label: string;
+ value?: number;
+ }
+ | undefined;
creatable?: boolean;
};
@@ -44,7 +44,13 @@ export default function CollectionSelection({
useEffect(() => {
const formatedCollections = collections.map((e) => {
- return { value: e.id, label: e.name, ownerId: e.ownerId, count: e._count, parentId: e.parentId };
+ return {
+ value: e.id,
+ label: e.name,
+ ownerId: e.ownerId,
+ count: e._count,
+ parentId: e.parentId,
+ };
});
setOptions(formatedCollections);
@@ -63,26 +69,22 @@ export default function CollectionSelection({
// Have the top level parent at beginning
return parentNames.reverse();
- }
+ };
const customOption = ({ data, innerProps }: any) => {
return (
-
- {data.label}
-
-
- {data.count?.links}
-
+ {data.label}
+ {data.count?.links}
{getParentNames(data?.parentId).length > 0 ? (
<>
- {getParentNames(data.parentId).join(' > ')} {'>'} {data.label}
+ {getParentNames(data.parentId).join(" > ")} {">"} {data.label}
>
) : (
data.label
@@ -105,7 +107,7 @@ export default function CollectionSelection({
components={{
Option: customOption,
}}
- // menuPosition="fixed"
+ // menuPosition="fixed"
/>
);
} else {
@@ -118,7 +120,10 @@ export default function CollectionSelection({
options={options}
styles={styles}
defaultValue={showDefaultValue ? defaultValue : null}
- // menuPosition="fixed"
+ components={{
+ Option: customOption,
+ }}
+ // menuPosition="fixed"
/>
);
}
diff --git a/components/Sidebar.tsx b/components/Sidebar.tsx
index 66a8d23..3f3e97f 100644
--- a/components/Sidebar.tsx
+++ b/components/Sidebar.tsx
@@ -5,7 +5,7 @@ import { useRouter } from "next/router";
import { useEffect, useState } from "react";
import { Disclosure, Transition } from "@headlessui/react";
import SidebarHighlightLink from "@/components/SidebarHighlightLink";
-import CollectionSelection from "@/components/CollectionSelection";
+import CollectionListing from "@/components/CollectionListing";
export default function Sidebar({ className }: { className?: string }) {
const [tagDisclosure, setTagDisclosure] = useState(() => {
@@ -99,7 +99,7 @@ export default function Sidebar({ className }: { className?: string }) {
leaveTo="transform opacity-0 -translate-y-3"
>
-
+
diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts
index de2d80c..eb82949 100644
--- a/lib/api/controllers/links/postLink.ts
+++ b/lib/api/controllers/links/postLink.ts
@@ -22,8 +22,69 @@ export default async function postLink(
};
}
- if (!link.collection.name) {
+ if (!link.collection.id && link.collection.name) {
+ link.collection.name = link.collection.name.trim();
+
+ // find the collection with the name and the user's id
+ const findCollection = await prisma.collection.findFirst({
+ where: {
+ name: link.collection.name,
+ ownerId: userId,
+ parentId: link.collection.parentId,
+ },
+ });
+
+ if (findCollection) {
+ const collectionIsAccessible = await getPermission({
+ userId,
+ collectionId: findCollection.id,
+ });
+
+ const memberHasAccess = collectionIsAccessible?.members.some(
+ (e: UsersAndCollections) => e.userId === userId && e.canCreate
+ );
+
+ if (!(collectionIsAccessible?.ownerId === userId || memberHasAccess))
+ return { response: "Collection is not accessible.", status: 401 };
+
+ link.collection.id = findCollection.id;
+ } else {
+ const collection = await prisma.collection.create({
+ data: {
+ name: link.collection.name,
+ ownerId: userId,
+ },
+ });
+
+ link.collection.id = collection.id;
+ }
+ } else if (link.collection.id) {
+ const collectionIsAccessible = await getPermission({
+ userId,
+ collectionId: link.collection.id,
+ });
+
+ const memberHasAccess = collectionIsAccessible?.members.some(
+ (e: UsersAndCollections) => e.userId === userId && e.canCreate
+ );
+
+ if (!(collectionIsAccessible?.ownerId === userId || memberHasAccess))
+ return { response: "Collection is not accessible.", status: 401 };
+ } else if (!link.collection.id) {
link.collection.name = "Unorganized";
+ link.collection.parentId = null;
+
+ // find the collection with the name "Unorganized" and the user's id
+ const unorganizedCollection = await prisma.collection.findFirst({
+ where: {
+ name: "Unorganized",
+ ownerId: userId,
+ },
+ });
+
+ link.collection.id = unorganizedCollection?.id;
+ } else {
+ return { response: "Uncaught error.", status: 500 };
}
const numberOfLinksTheUserHas = await prisma.link.count({
@@ -42,22 +103,6 @@ export default async function postLink(
link.collection.name = link.collection.name.trim();
- if (link.collection.id) {
- const collectionIsAccessible = await getPermission({
- userId,
- collectionId: link.collection.id,
- });
-
- const memberHasAccess = collectionIsAccessible?.members.some(
- (e: UsersAndCollections) => e.userId === userId && e.canCreate
- );
-
- if (!(collectionIsAccessible?.ownerId === userId || memberHasAccess))
- return { response: "Collection is not accessible.", status: 401 };
- } else {
- link.collection.ownerId = userId;
- }
-
const description =
link.description && link.description !== ""
? link.description
@@ -86,14 +131,8 @@ export default async function postLink(
description,
type: linkType,
collection: {
- connectOrCreate: {
- where: {
- id: link.collection.id ?? 0,
- },
- create: {
- name: link.collection.name.trim(),
- ownerId: userId
- },
+ connect: {
+ id: link.collection.id,
},
},
tags: {
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index f081fc5..4d9ccec 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -163,4 +163,3 @@ model AccessToken {
createdAt DateTime @default(now())
updatedAt DateTime @default(now()) @updatedAt
}
-