From b622510dc420e40db6b212e7f0b85de806181bfa Mon Sep 17 00:00:00 2001 From: Matthias Nannt Date: Wed, 15 Jun 2022 22:14:20 +0900 Subject: [PATCH] add new view for empty form list, improve onboarding screen, add basic nocode editor as basis for further development, update prisma schema and api for nocode editor --- components/FormList.tsx | 205 +++++++++++------- components/builder/Builder.tsx | 49 +++++ components/builder/Editor.tsx | 38 ++++ components/builder/Page.tsx | 12 + components/form/FormOnboardingModal.tsx | 10 +- components/layout/LayoutBasic.tsx | 11 +- components/layout/LayoutFormBuilder.tsx | 63 ++++++ lib/noCodeForm.ts | 32 +++ package.json | 4 +- pages/api/forms/[id]/nocodeform/index.ts | 54 +++++ pages/auth/signin.tsx | 24 +- pages/forms/[id]/form.tsx | 35 ++- pages/forms/[id]/welcome.tsx | 43 ++++ .../migration.sql | 17 ++ prisma/schema.prisma | 10 + public/img/mascot-face-small.png | Bin 0 -> 41426 bytes .../snoopforms-logo.svg} | 0 yarn.lock | 58 ++++- 18 files changed, 546 insertions(+), 119 deletions(-) create mode 100644 components/builder/Builder.tsx create mode 100644 components/builder/Editor.tsx create mode 100644 components/builder/Page.tsx create mode 100644 components/layout/LayoutFormBuilder.tsx create mode 100644 lib/noCodeForm.ts create mode 100644 pages/api/forms/[id]/nocodeform/index.ts create mode 100644 pages/forms/[id]/welcome.tsx rename prisma/migrations/{20220614082103_init => 20220615062843_init}/migration.sql (85%) create mode 100644 public/img/mascot-face-small.png rename public/{snoopForms_Logo_v4.svg => img/snoopforms-logo.svg} (100%) diff --git a/components/FormList.tsx b/components/FormList.tsx index f9b7c9f8f5..78fa153112 100644 --- a/components/FormList.tsx +++ b/components/FormList.tsx @@ -2,17 +2,23 @@ import Link from "next/link"; import Router from "next/router"; import { Fragment } from "react"; import { Menu, Transition } from "@headlessui/react"; +import { BsFilesAlt } from "react-icons/bs"; -import { DotsHorizontalIcon, TrashIcon } from "@heroicons/react/solid"; +import { + DotsHorizontalIcon, + PlusIcon, + TrashIcon, +} from "@heroicons/react/solid"; import { classNames } from "../lib/utils"; import { createForm, useForms } from "../lib/forms"; +import Image from "next/image"; export default function FormList() { const { forms, mutateForms } = useForms(); const newForm = async () => { const form = await createForm(); - await Router.push(`/forms/${form.id}/form`); + await Router.push(`/forms/${form.id}/welcome`); }; const deleteForm = async (form, formIdx) => { @@ -30,85 +36,128 @@ export default function FormList() { }; return (
- {forms && ( -
- - - {forms - .sort((a, b) => b.updatedAt - a.updatedAt) - .map((form, formIdx) => ( -
  • -
    - - -
    {form.name}
    -
    - -
    - - {({ open }) => ( - <> -
    - - Open options - -
    - - - -
    - - {({ active }) => ( - - )} - -
    -
    -
    - - )} -
    -
    +
    + + ) : ( + - )} + + {forms + .sort((a, b) => b.updatedAt - a.updatedAt) + .map((form, formIdx) => ( +
  • +
    + + +
    {form.name}
    +
    + +
    + + {({ open }) => ( + <> +
    + + Open options + +
    + + + +
    + + {({ active }) => ( + + )} + +
    +
    +
    + + )} +
    +
    +
    +
  • + ))} + + ))} ); } diff --git a/components/builder/Builder.tsx b/components/builder/Builder.tsx new file mode 100644 index 0000000000..452ac2036f --- /dev/null +++ b/components/builder/Builder.tsx @@ -0,0 +1,49 @@ +import { useCallback, useEffect } from "react"; +import { v4 as uuidv4 } from "uuid"; +import { useNoCodeForm } from "../../lib/noCodeForm"; +import Loading from "../Loading"; +import Page from "./Page"; + +export default function Builder({ formId }) { + const { noCodeForm, mutateNoCodeForm, isLoadingNoCodeForm } = + useNoCodeForm(formId); + + const addPage = useCallback(() => { + if (noCodeForm) { + const updatedNCF = JSON.parse(JSON.stringify(noCodeForm)); + updatedNCF.pages.push({ + id: uuidv4(), + elements: [], + }); + mutateNoCodeForm(updatedNCF, false); + } + }, [mutateNoCodeForm, noCodeForm]); + + useEffect(() => { + if (noCodeForm && noCodeForm.pages.length === 0) addPage(); + }, [noCodeForm]); + + if (isLoadingNoCodeForm) { + return ; + } + + return ( +
    +
    +
    +
    + {noCodeForm.pages.map((page) => ( + + ))} +
    + +
    +
    +
    + ); +} diff --git a/components/builder/Editor.tsx b/components/builder/Editor.tsx new file mode 100644 index 0000000000..3f5b408b13 --- /dev/null +++ b/components/builder/Editor.tsx @@ -0,0 +1,38 @@ +import { useCallback, useRef } from "react"; +import { createReactEditorJS } from "react-editor-js"; + +const ReactEditorJS = createReactEditorJS(); + +const Editor = ({}) => { + const editorCore = useRef(null); + + const handleInitialize = useCallback((instance) => { + editorCore.current = instance; + }, []); + + /* const handleSave = useCallback(async () => { + const savedData = await editorCore.current.save(); + console.log(savedData); + }, []); + + setTimeout(() => { + // save every ten seconds + handleSave(); + }, 10000); */ + + const EDITOR_JS_TOOLS = {}; + + // Editor.js This will show block editor in component + // pass EDITOR_JS_TOOLS in tools props to configure tools with editor.js + return ( + + ); +}; + +// Return the CustomEditor to use by other components. + +export default Editor; diff --git a/components/builder/Page.tsx b/components/builder/Page.tsx new file mode 100644 index 0000000000..45dcdbbc1f --- /dev/null +++ b/components/builder/Page.tsx @@ -0,0 +1,12 @@ +import dynamic from "next/dynamic"; +let Editor = dynamic(() => import("./Editor"), { + ssr: false, +}); + +export default function Page({}) { + return ( +
    + {Editor && } +
    + ); +} diff --git a/components/form/FormOnboardingModal.tsx b/components/form/FormOnboardingModal.tsx index ccea7a0012..041c0678e6 100644 --- a/components/form/FormOnboardingModal.tsx +++ b/components/form/FormOnboardingModal.tsx @@ -1,8 +1,10 @@ /* This example requires Tailwind CSS v2.0+ */ import { Dialog, RadioGroup, Transition } from "@headlessui/react"; import { CheckCircleIcon, LightBulbIcon } from "@heroicons/react/solid"; +import { useRouter } from "next/router"; import { Fragment, useState } from "react"; import { persistForm, useForm } from "../../lib/forms"; +import { createNoCodeForm } from "../../lib/noCodeForm"; import { classNames } from "../../lib/utils"; import Loading from "../Loading"; @@ -23,15 +25,14 @@ const formTypes = [ type FormOnboardingModalProps = { open: boolean; - setOpen: (o: boolean) => void; formId: string; }; export default function FormOnboardingModal({ open, - setOpen, formId, }: FormOnboardingModalProps) { + const router = useRouter(); const { form, mutateForm, isLoadingForm } = useForm(formId); const [name, setName] = useState(form.name); const [formType, setFormType] = useState(formTypes[0]); @@ -46,7 +47,10 @@ export default function FormOnboardingModal({ }; await persistForm(updatedForm); mutateForm(updatedForm); - setOpen(false); + if (updatedForm.formType === "NOCODE") { + await createNoCodeForm(formId); + } + router.push(`/forms/${formId}/form`); }; if (isLoadingForm) { diff --git a/components/layout/LayoutBasic.tsx b/components/layout/LayoutBasic.tsx index 73f8f5f05c..b7530b2b08 100644 --- a/components/layout/LayoutBasic.tsx +++ b/components/layout/LayoutBasic.tsx @@ -30,8 +30,13 @@ export default function Layout({ children }) {
    -
    - snoopForms logo +
    + snoopForms logo
    @@ -86,7 +91,7 @@ export default function Layout({ children }) {
    {/* Mobile menu button */} - + Open main menu {open ? (
    )} -
    +
    - snoopForms logo + snoopForms logo
    @@ -65,7 +71,7 @@ export default function SignIn({ csrfToken }: props) { type="email" autoComplete="email" required - className="block w-full px-3 py-2 placeholder-lightgray-400 border border-lightgray-300 rounded-md shadow-sm appearance-none focus:outline-none focus:ring-snoopred-500 focus:border-snoopred-500 sm:text-sm" + className="block w-full px-3 py-2 border rounded-md shadow-sm appearance-none placeholder-lightgray-400 border-lightgray-300 focus:outline-none focus:ring-snoopred-500 focus:border-snoopred-500 sm:text-sm" />
    @@ -83,7 +89,7 @@ export default function SignIn({ csrfToken }: props) { type="password" autoComplete="current-password" required - className="block w-full px-3 py-2 placeholder-lightgray-400 border border-lightgray-300 rounded-md shadow-sm appearance-none focus:outline-none focus:ring-snoopred-500 focus:border-snoopred-500 sm:text-sm" + className="block w-full px-3 py-2 border rounded-md shadow-sm appearance-none placeholder-lightgray-400 border-lightgray-300 focus:outline-none focus:ring-snoopred-500 focus:border-snoopred-500 sm:text-sm" />
    @@ -91,12 +97,18 @@ export default function SignIn({ csrfToken }: props) {
    diff --git a/pages/forms/[id]/form.tsx b/pages/forms/[id]/form.tsx index 64b9afba57..b966ed9071 100644 --- a/pages/forms/[id]/form.tsx +++ b/pages/forms/[id]/form.tsx @@ -1,10 +1,10 @@ import { GetServerSideProps } from "next"; import { getSession } from "next-auth/react"; import { useRouter } from "next/router"; -import { useEffect, useState } from "react"; +import Builder from "../../../components/builder/Builder"; import FormCode from "../../../components/form/FormCode"; -import FormOnboardingModal from "../../../components/form/FormOnboardingModal"; import LayoutFormBasics from "../../../components/layout/LayoutFormBasic"; +import LayoutFormBuilder from "../../../components/layout/LayoutFormBuilder"; import Loading from "../../../components/Loading"; import { useForm } from "../../../lib/forms"; @@ -12,28 +12,26 @@ export default function FormPage() { const router = useRouter(); const formId = router.query.id.toString(); const { form, isLoadingForm } = useForm(router.query.id); - const [openOnboardingModal, setOpenOnboardingModal] = useState(false); - - useEffect(() => { - if (form && !form.finishedOnboarding) { - setOpenOnboardingModal(true); - } - }, [isLoadingForm]); if (isLoadingForm) { return ; } + if (!form.finishedOnboarding) { + router.push(`/forms/${formId}/welcome`); + return
    ; + } + if (form.formType === "NOCODE") { return ( <> - - - + + + ); } else { @@ -41,11 +39,6 @@ export default function FormPage() { <> - ); diff --git a/pages/forms/[id]/welcome.tsx b/pages/forms/[id]/welcome.tsx new file mode 100644 index 0000000000..1ec31b658b --- /dev/null +++ b/pages/forms/[id]/welcome.tsx @@ -0,0 +1,43 @@ +import { GetServerSideProps } from "next"; +import { getSession } from "next-auth/react"; +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import FormOnboardingModal from "../../../components/form/FormOnboardingModal"; +import LayoutFormBasics from "../../../components/layout/LayoutFormBasic"; +import Loading from "../../../components/Loading"; +import { useForm } from "../../../lib/forms"; + +export default function WelcomePage() { + const router = useRouter(); + const formId = router.query.id.toString(); + const { form, isLoadingForm } = useForm(router.query.id); + const [openOnboardingModal, setOpenOnboardingModal] = useState(false); + + useEffect(() => { + if (form && !form.finishedOnboarding) { + setOpenOnboardingModal(true); + } + }, [isLoadingForm]); + + if (isLoadingForm) { + return ; + } + + if (!form.finishedOnboarding) { + return ( + + + + ); + } else { + router.push(`/forms/${formId}`); + } +} + +export const getServerSideProps: GetServerSideProps = async ({ req, res }) => { + const session = await getSession({ req }); + if (!session) { + res.statusCode = 403; + } + return { props: {} }; +}; diff --git a/prisma/migrations/20220614082103_init/migration.sql b/prisma/migrations/20220615062843_init/migration.sql similarity index 85% rename from prisma/migrations/20220614082103_init/migration.sql rename to prisma/migrations/20220615062843_init/migration.sql index 4881278485..ebe1fadfab 100644 --- a/prisma/migrations/20220614082103_init/migration.sql +++ b/prisma/migrations/20220615062843_init/migration.sql @@ -19,6 +19,17 @@ CREATE TABLE "Form" ( CONSTRAINT "Form_pkey" PRIMARY KEY ("id") ); +-- CreateTable +CREATE TABLE "NoCodeForm" ( + "id" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "formId" TEXT NOT NULL, + "pages" JSONB NOT NULL DEFAULT '[]', + + CONSTRAINT "NoCodeForm_pkey" PRIMARY KEY ("id") +); + -- CreateTable CREATE TABLE "Pipeline" ( "id" TEXT NOT NULL, @@ -79,6 +90,9 @@ CREATE TABLE "verification_requests" ( CONSTRAINT "verification_requests_pkey" PRIMARY KEY ("id") ); +-- CreateIndex +CREATE UNIQUE INDEX "NoCodeForm_formId_key" ON "NoCodeForm"("formId"); + -- CreateIndex CREATE UNIQUE INDEX "users_email_key" ON "users"("email"); @@ -88,6 +102,9 @@ CREATE UNIQUE INDEX "verification_requests_token_key" ON "verification_requests" -- AddForeignKey ALTER TABLE "Form" ADD CONSTRAINT "Form_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "NoCodeForm" ADD CONSTRAINT "NoCodeForm_formId_fkey" FOREIGN KEY ("formId") REFERENCES "Form"("id") ON DELETE CASCADE ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "Pipeline" ADD CONSTRAINT "Pipeline_formId_fkey" FOREIGN KEY ("formId") REFERENCES "Form"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index ccb23c17c4..bfaedb1cb8 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -29,6 +29,16 @@ model Form { schema Json submissionSessions SubmissionSession[] pipelines Pipeline[] + noCodeForm NoCodeForm? +} + +model NoCodeForm { + id String @id @default(uuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + form Form @relation(fields: [formId], references: [id], onDelete: Cascade) + formId String @unique + pages Json @default("[]") } model Pipeline { diff --git a/public/img/mascot-face-small.png b/public/img/mascot-face-small.png new file mode 100644 index 0000000000000000000000000000000000000000..650acb06a572239111bdb0eee02cf0a08161e532 GIT binary patch literal 41426 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 NML|Qp3S|-ge*mLjkj?-A literal 0 HcmV?d00001 diff --git a/public/snoopForms_Logo_v4.svg b/public/img/snoopforms-logo.svg similarity index 100% rename from public/snoopForms_Logo_v4.svg rename to public/img/snoopforms-logo.svg diff --git a/yarn.lock b/yarn.lock index 94139d6898..e795e6f70f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -44,6 +44,20 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@editorjs/editorjs@^2.24.3": + version "2.24.3" + resolved "https://registry.yarnpkg.com/@editorjs/editorjs/-/editorjs-2.24.3.tgz#60ee6dd37d57b870ef29754355d77f9c61f30e79" + integrity sha512-VzrWaQ7mggNUAPTDGcqXJNIlBZH3S2IqsIUGA43UM2Q9VFaeS5KuVFVOTrFJvAzF7G+vZTO52ocm+hrDhTwvyw== + dependencies: + codex-notifier "^1.1.2" + codex-tooltip "^1.0.5" + nanoid "^3.1.22" + +"@editorjs/paragraph@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@editorjs/paragraph/-/paragraph-2.8.0.tgz#11cc381fcafaf8b9160517ce65d59eee93fc4af9" + integrity sha512-z6w5ZR0ru3p/IjxJW/tb7OcSnVttkZukQMIsnBMX1FIKc1BNdr7NwM1YoCyTl4OnC90YfL0xgES6/20/W267pw== + "@eslint/eslintrc@^1.2.3": version "1.3.0" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f" @@ -216,6 +230,25 @@ resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-3.15.1-1.461d6a05159055555eb7dfb337c9fb271cbd4d7e.tgz#f691893df506b93e3cb1ccc15ec6e5ac64e8e570" integrity sha512-NHlojO1DFTsSi3FtEleL9QWXeSF/UjhCW0fgpi7bumnNZ4wj/eQ+BJJ5n2pgoOliTOGv9nX2qXvmHap7rJMNmg== +"@react-editor-js/client@2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@react-editor-js/client/-/client-2.0.6.tgz#be9a2704b58322bc37dc6d2acb014f0ff28fe43c" + integrity sha512-LMMJLAXAwk1kVMy7fxTRFK6OdouvoseqJbmVUygJb2EcfuT84nC9OAtvGEL4vsVLUcnzEV400+F9t5OKa77FGQ== + dependencies: + "@react-editor-js/core" "2.0.6" + +"@react-editor-js/core@2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@react-editor-js/core/-/core-2.0.6.tgz#3f20c0668d1f8502489ed7e354ff26461b270dce" + integrity sha512-mvHM2I+gT3AnvFpFhTZI0EFLKD9pRpgXDf286uwv6n6tngwLfnCCmtCbgiGI9ICph2GJvRZfaQubE+MHQ6YV8g== + +"@react-editor-js/server@2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@react-editor-js/server/-/server-2.0.6.tgz#237f11002b4db9fe754fd9a89ff76f131f8a21fb" + integrity sha512-soW/bV5auciYr8gEYISWK4fuIblAcc4bcwPuCKnDBj9W9r/nAxMmNgCG+z9rs9Gnroa0Ko3Hzwzs9d5MdOShzg== + dependencies: + "@react-editor-js/core" "2.0.6" + "@rushstack/eslint-patch@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.1.3.tgz#6801033be7ff87a6b7cadaf5b337c9f366a3c4b0" @@ -581,6 +614,16 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +codex-notifier@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/codex-notifier/-/codex-notifier-1.1.2.tgz#a733079185f4c927fa296f1d71eb8753fe080895" + integrity sha512-DCp6xe/LGueJ1N5sXEwcBc3r3PyVkEEDNWCVigfvywAkeXcZMk9K41a31tkEFBW0Ptlwji6/JlAb49E3Yrxbtg== + +codex-tooltip@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/codex-tooltip/-/codex-tooltip-1.0.5.tgz#ba25fd5b3a58ba2f73fd667c2b46987ffd1edef2" + integrity sha512-IuA8LeyLU5p1B+HyhOsqR6oxyFQ11k3i9e9aXw40CrHFTRO2Y1npNBVU3W1SvhKAbUU7R/YikUBdcYFP0RcJag== + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -1567,7 +1610,7 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@^3.1.30, nanoid@^3.3.4: +nanoid@^3.1.22, nanoid@^3.1.30, nanoid@^3.3.4: version "3.3.4" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab" integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== @@ -1908,7 +1951,7 @@ prisma@^3.15.1: dependencies: "@prisma/engines" "3.15.1-1.461d6a05159055555eb7dfb337c9fb271cbd4d7e" -prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -1940,12 +1983,13 @@ react-dom@18.1.0: loose-envify "^1.1.0" scheduler "^0.22.0" -react-feather@^2.0.9: - version "2.0.10" - resolved "https://registry.yarnpkg.com/react-feather/-/react-feather-2.0.10.tgz#0e9abf05a66754f7b7bb71757ac4da7fb6be3b68" - integrity sha512-BLhukwJ+Z92Nmdcs+EMw6dy1Z/VLiJTzEQACDUEnWMClhYnFykJCGWQx+NmwP/qQHGX/5CzQ+TGi8ofg2+HzVQ== +react-editor-js@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/react-editor-js/-/react-editor-js-2.0.6.tgz#34771596986d79513e12e5f4990da46b9e0f2430" + integrity sha512-8u47IbhExiFB2kGNdJYlsX5iVlSzac38A3oJ7bmnTz3Lp7Slys1xreoYdG71+KiOcfX0dEgOIavV4e6TJeB5eg== dependencies: - prop-types "^15.7.2" + "@react-editor-js/client" "2.0.6" + "@react-editor-js/server" "2.0.6" react-icons@^4.4.0: version "4.4.0"