From a1a8652f7e6b96b86a53695da60973adee5ef57d Mon Sep 17 00:00:00 2001 From: Tessa Thornton Date: Mon, 3 Feb 2020 13:12:25 -0500 Subject: [PATCH] [CORL 547] org-wide announcements (#2813) * CRUD announcements * only show announcement if not disabled * make announcements dismissable * add announcement mutations * update announcement form logic * style announcements on stream * update snap * localize strings * close form if announcement is removed * move announcement config below sitewide commenting config * move date calculation inside useMemo * move announcementconfig code to announcementconfigcontainer * use coralContext for localStorage * fix type of announcement createdAt * move announcement form to modal * remove payload pruning from configure route * simplify announcement display logic * make validation message full width Co-authored-by: Kim Gardner --- .../sections/General/Announcement.tsx | 66 +++++++++ .../sections/General/AnnouncementConfig.css | 2 + .../General/AnnouncementConfigContainer.tsx | 121 +++++++++++++++ .../General/AnnouncementFormModal.css | 15 ++ .../General/AnnouncementFormModal.tsx | 138 ++++++++++++++++++ .../General/CreateAnnouncementMutation.ts | 43 ++++++ .../General/DeleteAnnouncementMutation.ts | 38 +++++ .../General/GeneralConfigContainer.tsx | 3 + .../__snapshots__/general.spec.tsx.snap | 44 ++++++ src/core/client/framework/constants.ts | 6 + src/core/client/stream/classes.ts | 5 + .../Stream/Announcement/Announcement.css | 11 ++ .../Stream/Announcement/Announcement.tsx | 30 ++++ .../Announcement/AnnouncementContainer.tsx | 67 +++++++++ .../Comments/Stream/Announcement/index.ts | 4 + .../tabs/Comments/Stream/StreamContainer.tsx | 3 + .../v2/DurationField/DurationField.tsx | 5 + .../v2/FormFieldFooter/FormFieldFooter.css | 7 + .../v2/FormFieldFooter/FormFieldFooter.tsx | 32 ++++ .../ui/components/v2/FormFieldFooter/index.ts | 1 + src/core/client/ui/components/v2/index.ts | 1 + src/core/server/graph/mutators/Settings.ts | 7 + src/core/server/graph/resolvers/Mutation.ts | 8 + src/core/server/graph/resolvers/Settings.ts | 7 +- src/core/server/graph/schema/schema.graphql | 79 ++++++++++ src/core/server/models/settings.ts | 1 + src/core/server/models/tenant/tenant.ts | 67 +++++++++ src/core/server/services/tenant/index.ts | 33 +++++ src/locales/en-US/admin.ftl | 12 ++ 29 files changed, 855 insertions(+), 1 deletion(-) create mode 100644 src/core/client/admin/routes/Configure/sections/General/Announcement.tsx create mode 100644 src/core/client/admin/routes/Configure/sections/General/AnnouncementConfig.css create mode 100644 src/core/client/admin/routes/Configure/sections/General/AnnouncementConfigContainer.tsx create mode 100644 src/core/client/admin/routes/Configure/sections/General/AnnouncementFormModal.css create mode 100644 src/core/client/admin/routes/Configure/sections/General/AnnouncementFormModal.tsx create mode 100644 src/core/client/admin/routes/Configure/sections/General/CreateAnnouncementMutation.ts create mode 100644 src/core/client/admin/routes/Configure/sections/General/DeleteAnnouncementMutation.ts create mode 100644 src/core/client/stream/tabs/Comments/Stream/Announcement/Announcement.css create mode 100644 src/core/client/stream/tabs/Comments/Stream/Announcement/Announcement.tsx create mode 100644 src/core/client/stream/tabs/Comments/Stream/Announcement/AnnouncementContainer.tsx create mode 100644 src/core/client/stream/tabs/Comments/Stream/Announcement/index.ts create mode 100644 src/core/client/ui/components/v2/FormFieldFooter/FormFieldFooter.css create mode 100644 src/core/client/ui/components/v2/FormFieldFooter/FormFieldFooter.tsx create mode 100644 src/core/client/ui/components/v2/FormFieldFooter/index.ts diff --git a/src/core/client/admin/routes/Configure/sections/General/Announcement.tsx b/src/core/client/admin/routes/Configure/sections/General/Announcement.tsx new file mode 100644 index 000000000..158372db8 --- /dev/null +++ b/src/core/client/admin/routes/Configure/sections/General/Announcement.tsx @@ -0,0 +1,66 @@ +import { Localized } from "@fluent/react/compat"; +import { DateTime } from "luxon"; +import React, { FunctionComponent, useMemo } from "react"; + +import { useCoralContext } from "coral-framework/lib/bootstrap"; +import { + FormField, + FormFieldFooter, + FormFieldHeader, + Label, + Textarea, +} from "coral-ui/components/v2"; + +interface Props { + content: string; + createdAt: string; + duration: number; +} + +const Announcement: FunctionComponent = ({ + content, + createdAt, + duration, +}) => { + const { locales } = useCoralContext(); + const formattedDate = useMemo(() => { + const disableAt = DateTime.fromISO(createdAt) + .plus({ seconds: duration }) + .toJSDate(); + return new Intl.DateTimeFormat(locales, { + day: "2-digit", + month: "2-digit", + year: "numeric", + hour: "2-digit", + minute: "2-digit", + }).format(new Date(disableAt)); + }, [createdAt, duration]); + return ( + + + + + + +