From a14a3667845863202f7c8f710026341f7a1a594c Mon Sep 17 00:00:00 2001 From: Meliora Ho Date: Fri, 22 Mar 2024 19:25:43 +0000 Subject: [PATCH] the heck am i doing --- compass/app/auth/login/page.tsx | 3 +- compass/utils/classes/CollectionImpl.tsx | 16 -------- compass/utils/classes/Field.ts | 15 +++++++ compass/utils/classes/InputProps.ts | 9 ----- compass/utils/{constants.tsx => constants.ts} | 9 ++--- .../implementations/CollectionDataImpl.ts | 39 +++++++++++++++++++ .../utils/implementations/CollectionImpl.ts | 15 +++++++ .../FieldImpl/EmailFieldImpl.ts | 18 +++++++++ .../FieldImpl/IntegerFieldImpl.ts | 15 +++++++ .../FieldImpl/LinkFieldImpl.ts | 18 +++++++++ .../FieldImpl/MultiselectFieldImpl.ts | 39 +++++++++++++++++++ .../FieldImpl/StringFieldImpl.ts | 15 +++++++ compass/utils/models/CollectionData.ts | 17 ++++++++ 13 files changed, 195 insertions(+), 33 deletions(-) delete mode 100644 compass/utils/classes/CollectionImpl.tsx create mode 100644 compass/utils/classes/Field.ts delete mode 100644 compass/utils/classes/InputProps.ts rename compass/utils/{constants.tsx => constants.ts} (79%) create mode 100644 compass/utils/implementations/CollectionDataImpl.ts create mode 100644 compass/utils/implementations/CollectionImpl.ts create mode 100644 compass/utils/implementations/FieldImpl/EmailFieldImpl.ts create mode 100644 compass/utils/implementations/FieldImpl/IntegerFieldImpl.ts create mode 100644 compass/utils/implementations/FieldImpl/LinkFieldImpl.ts create mode 100644 compass/utils/implementations/FieldImpl/MultiselectFieldImpl.ts create mode 100644 compass/utils/implementations/FieldImpl/StringFieldImpl.ts create mode 100644 compass/utils/models/CollectionData.ts 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)) +