diff --git a/compass/app/auth/login/page.tsx b/compass/app/auth/login/page.tsx
index 5055714..6dc6b81 100644
--- a/compass/app/auth/login/page.tsx
+++ b/compass/app/auth/login/page.tsx
@@ -4,7 +4,6 @@
import Button from '@/components/Button';
import Input from '@/components/Input'
import InlineLink from '@/components/InlineLink';
-import Paper from '@/components/auth/Paper';
import Image from 'next/image';
import { useState } from "react";
import PasswordInput from '@/components/auth/PasswordInput';
@@ -61,7 +60,7 @@ export default function Page() {
{emailError && }
{passwordError && }
diff --git a/compass/utils/classes/CollectionImpl.tsx b/compass/utils/classes/CollectionImpl.tsx
deleted file mode 100644
index 8d8a46a..0000000
--- a/compass/utils/classes/CollectionImpl.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-class CollectionImpl {
- title: string;
- icon: any;
- data: any;
-
- constructor(title: string, icon: any) {
- this.title = title;
- this.icon = icon;
- }
-
- // subject to change
- setData(data: any){
- this.data = data;
- }
-
-}
\ No newline at end of file
diff --git a/compass/utils/classes/Field.ts b/compass/utils/classes/Field.ts
new file mode 100644
index 0000000..716846e
--- /dev/null
+++ b/compass/utils/classes/Field.ts
@@ -0,0 +1,15 @@
+import { Icons } from "../constants";
+
+export class Field {
+ iconKey: keyof typeof Icons;
+ title: string;
+
+ constructor(iconKey: keyof typeof Icons, title: string) {
+ this.iconKey = iconKey;
+ this.title = title;
+}
+
+ validateInput(value: any): boolean {
+ return value !== null;
+ }
+}
diff --git a/compass/utils/classes/InputProps.ts b/compass/utils/classes/InputProps.ts
deleted file mode 100644
index 2354d62..0000000
--- a/compass/utils/classes/InputProps.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { InputHTMLAttributes } from "react";
-import { Icons } from "../constants";
-
-export type InputProps = InputHTMLAttributes & {
- iconKey?: keyof typeof Icons; // Use keyof typeof to ensure the key exists in Icons
- title?: string; // Assuming title is always a string
- type?: string;
- placeholder?: string;
- };
\ No newline at end of file
diff --git a/compass/utils/constants.tsx b/compass/utils/constants.ts
similarity index 79%
rename from compass/utils/constants.tsx
rename to compass/utils/constants.ts
index d715bb7..cf9c228 100644
--- a/compass/utils/constants.tsx
+++ b/compass/utils/constants.ts
@@ -29,7 +29,8 @@ export enum User {
export enum COLLECTION {
RESOURCE,
SERVICE,
- USER
+ USER,
+ TRAINING_MANUAL
}
export enum PROGRAM {
@@ -47,8 +48,4 @@ export enum DATATYPE {
SELECT
}
-// export const COLLECTION_MAP: {[key in COLLECTION]: CollectionImpl} = {
-// [COLLECTION.RESOURCE]: new CollectionImpl('Resources', Icons.ResourceIcon),
-// [COLLECTION.SERVICE]: new CollectionImpl('Services', Icons.ServiceIcon),
-// [COLLECTION.USER]: new CollectionImpl('Users', Icons.UserIcon)
-// }
\ No newline at end of file
+
diff --git a/compass/utils/implementations/CollectionDataImpl.ts b/compass/utils/implementations/CollectionDataImpl.ts
new file mode 100644
index 0000000..6e0ef92
--- /dev/null
+++ b/compass/utils/implementations/CollectionDataImpl.ts
@@ -0,0 +1,39 @@
+import { Field } from "../classes/Field";
+
+export class CollectionDataImpl {
+ headers: Field[];
+ rows: Record[];
+
+ constructor(headers: Field[] = [], rows: Record[] = []) {
+ this.headers = headers;
+ this.rows = rows;
+ }
+
+ addRow(row: Record): void {
+ let isValidRow = true;
+
+ for (const header of this.headers) {
+ const value = row[header.title];
+ if (!header.validateInput(value)) {
+ console.error(`Validation failed for ${header.title} with value ${value}`);
+ isValidRow = false;
+ break;
+ }
+ }
+
+ if (isValidRow) {
+ this.rows.push(row);
+ } else {
+ console.log('Row not added due to validation failure.');
+ }
+ }
+
+ getRows(): Record[] {
+ return this.rows;
+ }
+
+ getHeaders(): Field[] {
+ return this.headers;
+ }
+
+}
\ No newline at end of file
diff --git a/compass/utils/implementations/CollectionImpl.ts b/compass/utils/implementations/CollectionImpl.ts
new file mode 100644
index 0000000..a940ac9
--- /dev/null
+++ b/compass/utils/implementations/CollectionImpl.ts
@@ -0,0 +1,15 @@
+import { CollectionDataImpl } from "./CollectionDataImpl";
+
+export class CollectionImpl {
+ title: string;
+ icon: any;
+ data: CollectionDataImpl;
+
+ constructor(title: string, icon: any, data: CollectionDataImpl) {
+ this.title = title;
+ this.icon = icon;
+ this.data = data;
+ }
+
+
+}
\ No newline at end of file
diff --git a/compass/utils/implementations/FieldImpl/EmailFieldImpl.ts b/compass/utils/implementations/FieldImpl/EmailFieldImpl.ts
new file mode 100644
index 0000000..bb2640a
--- /dev/null
+++ b/compass/utils/implementations/FieldImpl/EmailFieldImpl.ts
@@ -0,0 +1,18 @@
+import { Field } from "@/utils/classes/Field";
+
+
+export class EmailFieldImpl extends Field {
+
+ constructor() {
+ super('EmailTableIcon', "Email");
+ }
+
+ validateInput(value: any) : boolean {
+ if (typeof value !== 'string') {
+ return false;
+ }
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+ return emailRegex.test(value);
+ }
+
+}
\ No newline at end of file
diff --git a/compass/utils/implementations/FieldImpl/IntegerFieldImpl.ts b/compass/utils/implementations/FieldImpl/IntegerFieldImpl.ts
new file mode 100644
index 0000000..f5b7dc1
--- /dev/null
+++ b/compass/utils/implementations/FieldImpl/IntegerFieldImpl.ts
@@ -0,0 +1,15 @@
+import { Icons } from "@/utils/constants";
+import { Field } from "@/utils/classes/Field";
+
+
+export class IntegerFieldImpl extends Field {
+
+ constructor(title: string) {
+ super('NumberTableIcon', title);
+ }
+
+ validateInput(value: any) : boolean {
+ return Number.isInteger(value);
+ }
+
+}
\ No newline at end of file
diff --git a/compass/utils/implementations/FieldImpl/LinkFieldImpl.ts b/compass/utils/implementations/FieldImpl/LinkFieldImpl.ts
new file mode 100644
index 0000000..b091293
--- /dev/null
+++ b/compass/utils/implementations/FieldImpl/LinkFieldImpl.ts
@@ -0,0 +1,18 @@
+import { Field } from "@/utils/classes/Field";
+
+
+export class LinkFieldImpl extends Field {
+
+ constructor() {
+ super('LinkTableIcon', "Link");
+ }
+
+ validateInput(value: any) : boolean {
+ if (typeof value !== 'string') {
+ return false;
+ }
+ const urlRegex = /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/;
+ return urlRegex.test(value);
+ }
+
+}
\ No newline at end of file
diff --git a/compass/utils/implementations/FieldImpl/MultiselectFieldImpl.ts b/compass/utils/implementations/FieldImpl/MultiselectFieldImpl.ts
new file mode 100644
index 0000000..478dcf0
--- /dev/null
+++ b/compass/utils/implementations/FieldImpl/MultiselectFieldImpl.ts
@@ -0,0 +1,39 @@
+import { Field } from "@/utils/classes/Field";
+
+
+export class MultiselectFieldImpl extends Field {
+
+ tags: Set;
+ selectedTags: Set;
+
+ constructor(title: string, tags: Set = new Set()) {
+ super('MultiselectTableIcon', title);
+ this.tags = tags
+ this.selectedTags = new Set();
+ }
+
+ getTags() {
+ return this.tags
+ }
+
+ addTag(tag: any) {
+ this.tags.add(tag);
+ }
+
+ removeTag(tag: any) {
+ if (this.tags.has(tag)){
+ this.tags.delete(tag);
+ }
+ }
+
+ selectTag(tag: any) {
+ this.selectedTags.add(tag);
+ }
+
+ removeSelectedTag(tag: any) {
+ if (this.selectedTags.has(tag)){
+ this.selectedTags.delete(tag);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/compass/utils/implementations/FieldImpl/StringFieldImpl.ts b/compass/utils/implementations/FieldImpl/StringFieldImpl.ts
new file mode 100644
index 0000000..7015b99
--- /dev/null
+++ b/compass/utils/implementations/FieldImpl/StringFieldImpl.ts
@@ -0,0 +1,15 @@
+import { Icons } from "@/utils/constants";
+import { Field } from "@/utils/classes/Field";
+
+
+export class StringFieldImpl extends Field {
+
+ constructor(iconKey: keyof typeof Icons, title: string) {
+ super(iconKey, title);
+ }
+
+ validateInput(value: any) : boolean {
+ return typeof value === 'string';
+ }
+
+}
\ No newline at end of file
diff --git a/compass/utils/models/CollectionData.ts b/compass/utils/models/CollectionData.ts
new file mode 100644
index 0000000..c15e945
--- /dev/null
+++ b/compass/utils/models/CollectionData.ts
@@ -0,0 +1,17 @@
+import { Field } from "../classes/Field";
+import { PROGRAM } from "../constants";
+import { CollectionDataImpl } from "../implementations/CollectionDataImpl";
+import { CollectionImpl } from "../implementations/CollectionImpl";
+import { MultiselectFieldImpl } from "../implementations/FieldImpl/MultiselectFieldImpl";
+import { StringFieldImpl } from "../implementations/FieldImpl/StringFieldImpl";
+
+const programSet: Set = new Set([PROGRAM.COMMUNITY_EDUCATION, PROGRAM.DOMESTIC_VIOLENCE, PROGRAM.ECONOMIC_STABILITY]);
+
+export const ServiceCollectionDataType: Field[] = [new StringFieldImpl("Name"), new MultiselectFieldImpl("Status"), new StringFieldImpl("Summary"), new StringFieldImpl("Requirements"), new MultiselectFieldImpl('Program', programSet)]
+
+export const ServiceCollectionData = new CollectionImpl('Service','ResourceIcon',new CollectionDataImpl(ServiceCollectionDataType))
+
+export const ResourceCollectionDataType: Field[] = [new StringFieldImpl("Name"), new MultiselectFieldImpl("Status"), new StringFieldImpl("Summary"), new StringFieldImpl("Requirements"), new MultiselectFieldImpl('Program', programSet)]
+
+export const ResourceCollectionData = new CollectionImpl('Service','ResourceIcon',new CollectionDataImpl(ServiceCollectionDataType))
+