diff --git a/src/components/ContentMapping/ContentMapping.ts b/src/components/ContentMapping/ContentMapping.ts index d5b6db9..c52cca2 100644 --- a/src/components/ContentMapping/ContentMapping.ts +++ b/src/components/ContentMapping/ContentMapping.ts @@ -5,6 +5,10 @@ import { Stub, StubEditor } from '../ContentWidgets/_Stub/Stub'; import { ContentSingularData } from '../_data/ContentSingularData'; import { ExampleImage } from '../ContentWidgets/ExampleImage/ExampleImage'; import { ExampleImageEditor } from '../ContentWidgets/ExampleImage/ExampleImageEditor'; +import { ToDoList } from '../ContentWidgets/ToDoList/ToDoList'; +import { ToDoListEditor } from '../ContentWidgets/ToDoList/ToDoListEditor'; +import { Homepage } from '../ContentWidgets/Homepage/Homepage'; +import { HomepageEditor } from '../ContentWidgets/Homepage/HomepageEditor'; export type WidgetEditorProps = { originalContent: ContentSingularData, @@ -22,7 +26,9 @@ type ContentMappingType = { export enum WidgetTypes { PLAIN_TEXT = "PLAIN_TEXT", STUB = "STUB", - EXAMPLE_IMAGE = "EXAMPLE_IMAGE" + EXAMPLE_IMAGE = "EXAMPLE_IMAGE", + TO_DO_LIST = "TO_DO_LIST", + HOMEPAGE = "HOMEPAGE" } export const ContentMapping: ContentMappingType = { @@ -37,5 +43,13 @@ export const ContentMapping: ContentMappingType = { EXAMPLE_IMAGE: { widget: ExampleImage, editor: ExampleImageEditor + }, + TO_DO_LIST: { + widget: ToDoList, + editor: ToDoListEditor + }, + HOMEPAGE: { + widget: Homepage, + editor: HomepageEditor } } \ No newline at end of file diff --git a/src/components/ContentWidgets/Homepage/Homepage.css b/src/components/ContentWidgets/Homepage/Homepage.css new file mode 100644 index 0000000..1811e9e --- /dev/null +++ b/src/components/ContentWidgets/Homepage/Homepage.css @@ -0,0 +1,14 @@ +* { + box-sizing: border-box; +} + +body, html { + height: 100%; + margin: 0; + padding: 0; + font-family: Arial, Helvetica, sans-serif; +} + +h1, h2 { + color: white +} diff --git a/src/components/ContentWidgets/Homepage/Homepage.tsx b/src/components/ContentWidgets/Homepage/Homepage.tsx new file mode 100644 index 0000000..47a0268 --- /dev/null +++ b/src/components/ContentWidgets/Homepage/Homepage.tsx @@ -0,0 +1,45 @@ +import React from 'react'; +import { ContentSingularData } from "../../_data/ContentSingularData"; + +export type HomepageItem = { + title: string, + subtitle: string, + backgroundImage: string, + blur: string, + bgLightness: string, + bgOpacity: string +} + +/** + * A widget for the Home page + * + * Last Modified + * Allison Lee + * July 19, 2019 +**/ +export const Homepage: React.FC = ({ + homepage_content +}) => { + if (!homepage_content) { + return <> + } + + return ( + <> +
+
+
+

{homepage_content.title}

+

{homepage_content.subtitle}

+
+ + ) +} \ No newline at end of file diff --git a/src/components/ContentWidgets/Homepage/HomepageEditor.tsx b/src/components/ContentWidgets/Homepage/HomepageEditor.tsx new file mode 100644 index 0000000..a75ef1f --- /dev/null +++ b/src/components/ContentWidgets/Homepage/HomepageEditor.tsx @@ -0,0 +1,73 @@ +import React, { FormEvent, ChangeEvent } from 'react'; +import { WidgetEditorProps } from '../../ContentMapping/ContentMapping'; +import './Homepage.css'; + +export const HomepageEditor: React.FC = ({ + originalContent, + editedContent, + setEditedContentOnChange +}) => { + let homepage_content = editedContent.homepage_content || + {title: "Title not set", subtitle: "Subtitle not set", backgroundImage: "", blur: "", bgLightness: "", bgOpacity: ""}; + + const updateTitle = (e: React.ChangeEvent) => { + homepage_content.title = e.target.value; + setEditedContentOnChange("homepage_content", homepage_content); + } + + const updateSubtitle = (e: React.ChangeEvent) => { + homepage_content.subtitle = e.target.value; + setEditedContentOnChange("homepage_content", homepage_content); + } + + const updateBackgroundImage = (e: React.ChangeEvent) => { + homepage_content.backgroundImage = e.target.value; + setEditedContentOnChange("homepage_content", homepage_content); + } + + const updateBlur = (e: React.ChangeEvent) => { + homepage_content.blur = e.target.value; + setEditedContentOnChange("homepage_content", homepage_content); + } + + const updateBgLightness = (e: React.ChangeEvent) => { + homepage_content.bgLightness = e.target.value; + setEditedContentOnChange("homepage_content", homepage_content); + } + + const updateBgOpacity = (e: React.ChangeEvent) => { + homepage_content.bgOpacity = e.target.value; + setEditedContentOnChange("homepage_content", homepage_content); + } + + return <> +
+
+
+

{homepage_content.title}

+

{homepage_content.subtitle}

+
+
+

Title

+ updateTitle(e)} /> +

Subtitle

+ updateSubtitle(e)} /> +

Background Image

+ updateBackgroundImage(e)} /> +

Blur

+ updateBlur(e)} /> +

Background Lightness

+ updateBgLightness(e)} /> +

Background Opacity

+ updateBgOpacity(e)} /> +
+ +} \ No newline at end of file diff --git a/src/components/ContentWidgets/ToDoList/ToDoList.css b/src/components/ContentWidgets/ToDoList/ToDoList.css new file mode 100644 index 0000000..5593e1a --- /dev/null +++ b/src/components/ContentWidgets/ToDoList/ToDoList.css @@ -0,0 +1,3 @@ +ul { + list-style-type: none; +} \ No newline at end of file diff --git a/src/components/ContentWidgets/ToDoList/ToDoList.tsx b/src/components/ContentWidgets/ToDoList/ToDoList.tsx new file mode 100644 index 0000000..fa50dc5 --- /dev/null +++ b/src/components/ContentWidgets/ToDoList/ToDoList.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { ContentSingularData } from "../../_data/ContentSingularData"; + +export type ToDoListItem = { + toDoListItem_hash: string + toDoListItem_task: string +} + +/** + * A to-do list widget + * + * Last Modified + * Allison Lee + * July 11, 2019 +**/ +export const ToDoList: React.FC = ({ + toDoList_content +}) => { + if (!toDoList_content) { + return <> + } + + return ( +
    + {toDoList_content.map((item) => { + return ( +
  • + {item.toDoListItem_task} +
  • + ) + })} +
+ ) +} \ No newline at end of file diff --git a/src/components/ContentWidgets/ToDoList/ToDoListEditor.tsx b/src/components/ContentWidgets/ToDoList/ToDoListEditor.tsx new file mode 100644 index 0000000..592e912 --- /dev/null +++ b/src/components/ContentWidgets/ToDoList/ToDoListEditor.tsx @@ -0,0 +1,66 @@ +import React, { FormEvent, ChangeEvent } from 'react'; +import { WidgetEditorProps } from '../../ContentMapping/ContentMapping'; +import './ToDoList.css'; +import { ToDoListItem } from './ToDoList'; + +export const ToDoListEditor: React.FC = ({ + originalContent, + editedContent, + setEditedContentOnChange +}) => { + let toDoList_content = editedContent.toDoList_content || []; + let taskText = ""; + + const generateHash: () => string = () => { + const lengthOfGeneratedHash = 24; + + let randomInt8s = new Uint8Array(lengthOfGeneratedHash / 2); + window.crypto.getRandomValues(randomInt8s); + return randomInt8s.reduce((accumulator, randomInt) => { + return accumulator + ('0' + randomInt.toString(16)).substr(2) + }, "") + } + + const handleChange = (e: React.ChangeEvent) => { + taskText = e.target.value; + } + + const addToDo = (e: FormEvent) => { + e.preventDefault(); + let listCopy = [...toDoList_content]; + let newKey = generateHash(); + listCopy.push({toDoListItem_hash: newKey, toDoListItem_task: taskText}); + setEditedContentOnChange("toDoList_content", listCopy); + } + + const removeToDo = (hashToRemove: string) => { + let listCopy = [...toDoList_content]; + let newList: ToDoListItem[] = []; + + listCopy.forEach(item => { + if (item.toDoListItem_hash !== hashToRemove) { + newList.push(item) + } + }); + setEditedContentOnChange("toDoList_content", newList); + } + + return <> +
    + { + toDoList_content.map((item) => { + return ( +
  • {item.toDoListItem_task} + +
  • + ); + }) + } +
+

Add New To-Do Item

+
addToDo(e)}> + handleChange(e)}/> + +
+ +} \ No newline at end of file diff --git a/src/components/_data/ContentSingularData.ts b/src/components/_data/ContentSingularData.ts index 0f957b0..7eec6d2 100644 --- a/src/components/_data/ContentSingularData.ts +++ b/src/components/_data/ContentSingularData.ts @@ -1,6 +1,11 @@ +import { ToDoListItem } from '../ContentWidgets/ToDoList/ToDoList'; +import { HomepageItem } from '../ContentWidgets/Homepage/Homepage'; + export type ContentSingularData = { plainText_content?: string exampleImage_imageLink?: string exampleImage_percentageSize?: number + toDoList_content?: ToDoListItem[] + homepage_content?: HomepageItem [idx: string]: any } \ No newline at end of file