From 47587812b809fee2a95c76266d9d0e42fc4ac1ca Mon Sep 17 00:00:00 2001
From: crupest <crupest@outlook.com>
Date: Tue, 15 Jun 2021 14:14:28 +0800
Subject: ...

---
 .../timeline-common/TimelinePageCardTemplate.tsx   | 158 +++++++++++++++++++++
 1 file changed, 158 insertions(+)
 create mode 100644 FrontEnd/src/views/timeline-common/TimelinePageCardTemplate.tsx

(limited to 'FrontEnd/src/views/timeline-common/TimelinePageCardTemplate.tsx')

diff --git a/FrontEnd/src/views/timeline-common/TimelinePageCardTemplate.tsx b/FrontEnd/src/views/timeline-common/TimelinePageCardTemplate.tsx
new file mode 100644
index 00000000..038ea3ab
--- /dev/null
+++ b/FrontEnd/src/views/timeline-common/TimelinePageCardTemplate.tsx
@@ -0,0 +1,158 @@
+import React from "react";
+import classnames from "classnames";
+import { useTranslation } from "react-i18next";
+
+import { getHttpHighlightClient } from "http/highlight";
+import { getHttpBookmarkClient } from "http/bookmark";
+
+import { useUser } from "@/services/user";
+import { pushAlert } from "@/services/alert";
+import { timelineVisibilityTooltipTranslationMap } from "@/services/timeline";
+
+import { useIsSmallScreen } from "@/utilities/mediaQuery";
+
+import { TimelinePageCardProps } from "./TimelinePageTemplate";
+
+import CollapseButton from "./CollapseButton";
+import { TimelineMemberDialog } from "./TimelineMember";
+import TimelinePropertyChangeDialog from "./TimelinePropertyChangeDialog";
+import ConnectionStatusBadge from "./ConnectionStatusBadge";
+import { MenuItems, PopupMenu } from "../common/Menu";
+import FullPage from "../common/FullPage";
+
+export interface TimelineCardTemplateProps extends TimelinePageCardProps {
+  infoArea: React.ReactElement;
+  manageItems?: MenuItems;
+  dialog: string | "property" | "member" | null;
+  setDialog: (dialog: "property" | "member" | null) => void;
+}
+
+const TimelinePageCardTemplate: React.FC<TimelineCardTemplateProps> = ({
+  timeline,
+  collapse,
+  toggleCollapse,
+  infoArea,
+  manageItems,
+  connectionStatus,
+  onReload,
+  className,
+  dialog,
+  setDialog,
+}) => {
+  const { t } = useTranslation();
+
+  const isSmallScreen = useIsSmallScreen();
+
+  const user = useUser();
+
+  const content = (
+    <>
+      {infoArea}
+      <p className="mb-0">{timeline.description}</p>
+      <small className="mt-1 d-block">
+        {t(timelineVisibilityTooltipTranslationMap[timeline.visibility])}
+      </small>
+      <div className="text-end mt-2">
+        <i
+          className={classnames(
+            timeline.isHighlight ? "bi-star-fill" : "bi-star",
+            "icon-button text-yellow me-3"
+          )}
+          onClick={
+            user?.hasHighlightTimelineAdministrationPermission
+              ? () => {
+                  getHttpHighlightClient()
+                    [timeline.isHighlight ? "delete" : "put"](timeline.name)
+                    .then(onReload, () => {
+                      pushAlert({
+                        message: timeline.isHighlight
+                          ? "timeline.removeHighlightFail"
+                          : "timeline.addHighlightFail",
+                        type: "danger",
+                      });
+                    });
+                }
+              : undefined
+          }
+        />
+        {user != null ? (
+          <i
+            className={classnames(
+              timeline.isBookmark ? "bi-bookmark-fill" : "bi-bookmark",
+              "icon-button text-yellow me-3"
+            )}
+            onClick={() => {
+              getHttpBookmarkClient()
+                [timeline.isBookmark ? "delete" : "put"](timeline.name)
+                .then(onReload, () => {
+                  pushAlert({
+                    message: timeline.isBookmark
+                      ? "timeline.removeBookmarkFail"
+                      : "timeline.addBookmarkFail",
+                    type: "danger",
+                  });
+                });
+            }}
+          />
+        ) : null}
+        <i
+          className={"icon-button bi-people text-primary me-3"}
+          onClick={() => setDialog("member")}
+        />
+        {manageItems != null ? (
+          <PopupMenu items={manageItems}>
+            <i className="icon-button bi-three-dots-vertical text-primary" />
+          </PopupMenu>
+        ) : null}
+      </div>
+    </>
+  );
+
+  return (
+    <>
+      <div
+        className={classnames("cru-card p-2 clearfix", className)}
+        style={{ zIndex: collapse ? 1029 : 1031 }}
+      >
+        <div className="float-end d-flex align-items-center">
+          <ConnectionStatusBadge status={connectionStatus} className="me-2" />
+          <CollapseButton collapse={collapse} onClick={toggleCollapse} />
+        </div>
+        {isSmallScreen ? (
+          <FullPage
+            onBack={toggleCollapse}
+            show={!collapse}
+            contentContainerClassName="p-2"
+          >
+            {content}
+          </FullPage>
+        ) : (
+          <div style={{ display: collapse ? "none" : "block" }}>{content}</div>
+        )}
+      </div>
+      {(() => {
+        if (dialog === "member") {
+          return (
+            <TimelineMemberDialog
+              timeline={timeline}
+              onClose={() => setDialog(null)}
+              open
+              onChange={onReload}
+            />
+          );
+        } else if (dialog === "property") {
+          return (
+            <TimelinePropertyChangeDialog
+              timeline={timeline}
+              close={() => setDialog(null)}
+              open
+              onChange={onReload}
+            />
+          );
+        }
+      })()}
+    </>
+  );
+};
+
+export default TimelinePageCardTemplate;
-- 
cgit v1.2.3

