diff --git a/app/components/TemplateListItem.tsx b/app/components/TemplateListItem.tsx new file mode 100644 index 00000000..84251e11 --- /dev/null +++ b/app/components/TemplateListItem.tsx @@ -0,0 +1,39 @@ +interface TemplateListItemProperty { + templateImage: string; + templateName: string; + isPreviewActive: boolean; + onPreview: () => void; +} + +export default function TemplateListItem({ + templateImage, + templateName, + isPreviewActive, + onPreview, +}: TemplateListItemProperty) { + return ( +
+
+ template preview +
+

+ {templateName} +

+
+ +

Edit

+
+
+ ); +} diff --git a/app/components/TemplateListPagination.tsx b/app/components/TemplateListPagination.tsx new file mode 100644 index 00000000..0c86b927 --- /dev/null +++ b/app/components/TemplateListPagination.tsx @@ -0,0 +1,58 @@ +interface TemplateListPaginationProperty { + currentPage: number; + totalPages: number; + handleEachPageClick: (pageNumber: number) => void; + handleNext: () => void; + handlePrev: () => void; +} + +export default function TemplateListPagination({ + currentPage, + totalPages, + handleEachPageClick, + handleNext, + handlePrev, +}: TemplateListPaginationProperty) { + const startPage = Math.max(1, currentPage - 2); + const endPage = Math.min(totalPages, startPage + 4); + + const pageNumbers = []; + for (let index = startPage; index <= endPage; index++) { + pageNumbers.push(index); + } + + return ( +
+

{`Page ${currentPage} of ${totalPages}`}

+
+ {pageNumbers.map((pageNumber) => ( + + ))} +
+
+ + +
+
+ ); +} diff --git a/app/components/TemplateListTable.tsx b/app/components/TemplateListTable.tsx new file mode 100644 index 00000000..aad3746e --- /dev/null +++ b/app/components/TemplateListTable.tsx @@ -0,0 +1,214 @@ +import { useState } from "react"; + +import TemplateListItem from "./TemplateListItem"; +import TemplateListPagination from "./TemplateListPagination"; + +const templates = [ + { + id: 1, + templateImage: "/email-template-1.png", + templateName: "Welcome - No Image", + isPreviewActive: false, + }, + { + id: 2, + templateImage: "/email-template-2.png", + templateName: "Welcome - Image", + isPreviewActive: false, + }, + { + id: 3, + templateImage: "/email-template-3.png", + templateName: "Reset Password - No Image", + isPreviewActive: false, + }, + { + id: 4, + templateImage: "/email-template-4.png", + templateName: "Reset Password - Image", + isPreviewActive: false, + }, + { + id: 5, + templateImage: "/email-template-5.png", + templateName: "Password reset Complete - No Image", + isPreviewActive: false, + }, + { + id: 6, + templateImage: "/email-template-1.png", + templateName: "Welcome - No Image", + isPreviewActive: false, + }, + { + id: 7, + templateImage: "/email-template-2.png", + templateName: "Welcome - Image", + isPreviewActive: false, + }, + { + id: 8, + templateImage: "/email-template-3.png", + templateName: "Reset Password - No Image", + isPreviewActive: false, + }, + { + id: 9, + templateImage: "/email-template-4.png", + templateName: "Reset Password - Image", + isPreviewActive: false, + }, + { + id: 10, + templateImage: "/email-template-5.png", + templateName: "Password reset Complete - No Image", + isPreviewActive: false, + }, + { + id: 11, + templateImage: "/email-template-1.png", + templateName: "Welcome - No Image", + isPreviewActive: false, + }, + { + id: 12, + templateImage: "/email-template-2.png", + templateName: "Welcome - Image", + isPreviewActive: false, + }, + { + id: 13, + templateImage: "/email-template-3.png", + templateName: "Reset Password - No Image", + isPreviewActive: false, + }, + { + id: 14, + templateImage: "/email-template-4.png", + templateName: "Reset Password - Image", + isPreviewActive: false, + }, + { + id: 15, + templateImage: "/email-template-5.png", + templateName: "Password reset Complete - No Image", + isPreviewActive: false, + }, + { + id: 16, + templateImage: "/email-template-5.png", + templateName: "Password reset Complete - No Image", + isPreviewActive: false, + }, + { + id: 17, + templateImage: "/email-template-5.png", + templateName: "Password reset Complete - No Image", + isPreviewActive: false, + }, + { + id: 18, + templateImage: "/email-template-5.png", + templateName: "Password reset Complete - No Image", + isPreviewActive: false, + }, + { + id: 19, + templateImage: "/email-template-5.png", + templateName: "Password reset Complete - No Image", + isPreviewActive: false, + }, + { + id: 20, + templateImage: "/email-template-5.png", + templateName: "Password reset Complete - No Image", + isPreviewActive: false, + }, + + { + id: 21, + templateImage: "/email-template-5.png", + templateName: "Password reset Complete - No Image", + isPreviewActive: false, + }, + { + id: 22, + templateImage: "/email-template-5.png", + templateName: "Password reset Complete - No Image", + isPreviewActive: false, + }, + { + id: 23, + templateImage: "/email-template-5.png", + templateName: "Password reset Complete - No Image", + isPreviewActive: false, + }, + { + id: 24, + templateImage: "/email-template-5.png", + templateName: "Password reset Complete - No Image", + isPreviewActive: false, + }, +]; + +const TEMPLATES_PER_PAGE = 5; + +export default function TemplateListTable() { + const [currentPage, setCurrentPage] = useState(1); + const [templatesData, setTemplatesData] = useState(templates); + + const totalPages = Math.ceil(templates.length / TEMPLATES_PER_PAGE); + + const handleNext = () => { + if (currentPage < totalPages) { + setCurrentPage(currentPage + 1); + } + }; + + const handlePrevious = () => { + if (currentPage > 1) { + setCurrentPage(currentPage - 1); + } + }; + + const handleEachPageClick = (pageNumber: number) => { + setCurrentPage(pageNumber); + }; + + const handlePreview = (id: number) => { + setTemplatesData((previousTemplates) => + previousTemplates.map((template) => + template.id === id + ? { ...template, isPreviewActive: !template.isPreviewActive } + : { ...template, isPreviewActive: false }, + ), + ); + }; + + const startIndex = (currentPage - 1) * TEMPLATES_PER_PAGE; + const endIndex = startIndex + TEMPLATES_PER_PAGE; + const currentTemplates = templatesData.slice(startIndex, endIndex); + + return ( +
+
+ {currentTemplates.map((template) => ( + handlePreview(template.id)} + /> + ))} +
+ +
+ ); +} diff --git a/public/email-template-1.png b/public/email-template-1.png new file mode 100644 index 00000000..69455afc Binary files /dev/null and b/public/email-template-1.png differ diff --git a/public/email-template-2.png b/public/email-template-2.png new file mode 100644 index 00000000..55b6f78b Binary files /dev/null and b/public/email-template-2.png differ diff --git a/public/email-template-3.png b/public/email-template-3.png new file mode 100644 index 00000000..650789bf Binary files /dev/null and b/public/email-template-3.png differ diff --git a/public/email-template-4.png b/public/email-template-4.png new file mode 100644 index 00000000..2eaab38c Binary files /dev/null and b/public/email-template-4.png differ diff --git a/public/email-template-5.png b/public/email-template-5.png new file mode 100644 index 00000000..7e2cc4cb Binary files /dev/null and b/public/email-template-5.png differ diff --git a/public/nextArrow.svg b/public/nextArrow.svg new file mode 100644 index 00000000..7f912d6d --- /dev/null +++ b/public/nextArrow.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/prevArrow.svg b/public/prevArrow.svg new file mode 100644 index 00000000..e14f37cc --- /dev/null +++ b/public/prevArrow.svg @@ -0,0 +1,5 @@ + + + + +