aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/views/timeline-common
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-07-01 20:38:28 +0800
committerGitHub <noreply@github.com>2021-07-01 20:38:28 +0800
commiteb306e98fb94fdfbced7b7e91ffb3d85ecb28c2c (patch)
tree5afe2d654a51c8712aa30a419f6edfa19fe1a234 /FrontEnd/src/views/timeline-common
parent825aac426d87180e62530321320fbb012efbd897 (diff)
parentb456334cedad566bf2c4c66481ec928dc59eda7d (diff)
downloadtimeline-eb306e98fb94fdfbced7b7e91ffb3d85ecb28c2c.tar.gz
timeline-eb306e98fb94fdfbced7b7e91ffb3d85ecb28c2c.tar.bz2
timeline-eb306e98fb94fdfbced7b7e91ffb3d85ecb28c2c.zip
Merge pull request #649 from crupest/drop-bootstrap
Drop bootstrap!!!
Diffstat (limited to 'FrontEnd/src/views/timeline-common')
-rw-r--r--FrontEnd/src/views/timeline-common/CollapseButton.tsx2
-rw-r--r--FrontEnd/src/views/timeline-common/MarkdownPostEdit.css21
-rw-r--r--FrontEnd/src/views/timeline-common/MarkdownPostEdit.tsx34
-rw-r--r--FrontEnd/src/views/timeline-common/PostPropertyChangeDialog.tsx4
-rw-r--r--FrontEnd/src/views/timeline-common/TimelineMember.css8
-rw-r--r--FrontEnd/src/views/timeline-common/TimelineMember.tsx62
-rw-r--r--FrontEnd/src/views/timeline-common/TimelinePageCardTemplate.tsx32
-rw-r--r--FrontEnd/src/views/timeline-common/TimelinePageTemplate.tsx5
-rw-r--r--FrontEnd/src/views/timeline-common/TimelinePostDeleteConfirmDialog.tsx37
-rw-r--r--FrontEnd/src/views/timeline-common/TimelinePostEdit.css24
-rw-r--r--FrontEnd/src/views/timeline-common/TimelinePostEdit.tsx29
-rw-r--r--FrontEnd/src/views/timeline-common/TimelinePostView.tsx8
-rw-r--r--FrontEnd/src/views/timeline-common/TimelinePropertyChangeDialog.tsx4
-rw-r--r--FrontEnd/src/views/timeline-common/index.css25
14 files changed, 133 insertions, 162 deletions
diff --git a/FrontEnd/src/views/timeline-common/CollapseButton.tsx b/FrontEnd/src/views/timeline-common/CollapseButton.tsx
index 12a3b710..31976228 100644
--- a/FrontEnd/src/views/timeline-common/CollapseButton.tsx
+++ b/FrontEnd/src/views/timeline-common/CollapseButton.tsx
@@ -12,7 +12,7 @@ const CollapseButton: React.FC<{
onClick={onClick}
className={classnames(
collapse ? "bi-arrows-angle-expand" : "bi-arrows-angle-contract",
- "text-primary icon-button",
+ "cru-color-primary icon-button",
className
)}
style={style}
diff --git a/FrontEnd/src/views/timeline-common/MarkdownPostEdit.css b/FrontEnd/src/views/timeline-common/MarkdownPostEdit.css
new file mode 100644
index 00000000..e36be992
--- /dev/null
+++ b/FrontEnd/src/views/timeline-common/MarkdownPostEdit.css
@@ -0,0 +1,21 @@
+.timeline-markdown-post-edit-page {
+ overflow: auto;
+ max-height: 300px;
+}
+
+.timeline-markdown-post-edit-image-container {
+ position: relative;
+ text-align: center;
+ margin-bottom: 1em;
+}
+
+.timeline-markdown-post-edit-image {
+ max-width: 100%;
+ max-height: 200px;
+}
+
+.timeline-markdown-post-edit-image-delete-button {
+ position: absolute;
+ right: 10px;
+ top: 2px;
+}
diff --git a/FrontEnd/src/views/timeline-common/MarkdownPostEdit.tsx b/FrontEnd/src/views/timeline-common/MarkdownPostEdit.tsx
index 005da933..6d0fbedd 100644
--- a/FrontEnd/src/views/timeline-common/MarkdownPostEdit.tsx
+++ b/FrontEnd/src/views/timeline-common/MarkdownPostEdit.tsx
@@ -1,15 +1,19 @@
+/* eslint-disable react/jsx-no-undef */
import React from "react";
import classnames from "classnames";
-import { Form, Spinner } from "react-bootstrap";
import { useTranslation } from "react-i18next";
import { Prompt } from "react-router";
import { getHttpTimelineClient, HttpTimelinePostInfo } from "@/http/timeline";
-import FlatButton from "../common/button/FlatButton";
-import TabPages from "../common/TabPages";
import TimelinePostBuilder from "@/services/TimelinePostBuilder";
-import ConfirmDialog from "../common/ConfirmDialog";
+
+import FlatButton from "../common/button/FlatButton";
+import TabPages from "../common/tab/TabPages";
+import ConfirmDialog from "../common/dailog/ConfirmDialog";
+import Spinner from "../common/Spinner";
+
+import "./MarkdownPostEdit.css";
export interface MarkdownPostEditProps {
timeline: string;
@@ -100,9 +104,10 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
className={className}
style={style}
pageContainerClassName="py-2"
+ dense
actions={
process ? (
- <Spinner variant="primary" animation="border" size="sm" />
+ <Spinner />
) : (
<>
<FlatButton
@@ -123,13 +128,13 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
}
pages={[
{
- id: "text",
- tabText: "edit",
+ name: "text",
+ text: "edit",
page: (
- <Form.Control
- as="textarea"
+ <textarea
value={text}
disabled={process}
+ className="cru-fill-parent"
onChange={(event) => {
getBuilder().setMarkdownText(event.currentTarget.value);
}}
@@ -137,8 +142,8 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
),
},
{
- id: "images",
- tabText: "image",
+ name: "images",
+ text: "image",
page: (
<div className="timeline-markdown-post-edit-page">
{images.map((image, index) => (
@@ -161,7 +166,7 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
/>
</div>
))}
- <Form.Control
+ <input
type="file"
accept="image/jpeg,image/jpg,image/png,image/gif,image/webp"
onChange={(event: React.ChangeEvent<HTMLInputElement>) => {
@@ -176,8 +181,8 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
),
},
{
- id: "preview",
- tabText: "preview",
+ name: "preview",
+ text: "preview",
page: (
<div
className="markdown-container timeline-markdown-post-edit-page"
@@ -191,6 +196,7 @@ const MarkdownPostEdit: React.FC<MarkdownPostEditProps> = ({
<ConfirmDialog
onClose={() => setShowLeaveConfirmDialog(false)}
onConfirm={onClose}
+ open
title="timeline.dropDraft"
body="timeline.confirmLeave"
/>
diff --git a/FrontEnd/src/views/timeline-common/PostPropertyChangeDialog.tsx b/FrontEnd/src/views/timeline-common/PostPropertyChangeDialog.tsx
index 001e52d7..988124b6 100644
--- a/FrontEnd/src/views/timeline-common/PostPropertyChangeDialog.tsx
+++ b/FrontEnd/src/views/timeline-common/PostPropertyChangeDialog.tsx
@@ -2,7 +2,7 @@ import React from "react";
import { getHttpTimelineClient, HttpTimelinePostInfo } from "@/http/timeline";
-import OperationDialog from "../common/OperationDialog";
+import OperationDialog from "../common/dailog/OperationDialog";
function PostPropertyChangeDialog(props: {
onClose: () => void;
@@ -14,7 +14,7 @@ function PostPropertyChangeDialog(props: {
return (
<OperationDialog
title="timeline.changePostPropertyDialog.title"
- close={onClose}
+ onClose={onClose}
open
inputScheme={[
{
diff --git a/FrontEnd/src/views/timeline-common/TimelineMember.css b/FrontEnd/src/views/timeline-common/TimelineMember.css
new file mode 100644
index 00000000..adb78764
--- /dev/null
+++ b/FrontEnd/src/views/timeline-common/TimelineMember.css
@@ -0,0 +1,8 @@
+.timeline-member-item {
+ border: var(--cru-background-1-color) solid;
+ border-width: 0.5px 1px;
+}
+
+.timeline-member-item > div {
+ padding: 0.5em;
+}
diff --git a/FrontEnd/src/views/timeline-common/TimelineMember.tsx b/FrontEnd/src/views/timeline-common/TimelineMember.tsx
index 299d6a53..0ebecbb9 100644
--- a/FrontEnd/src/views/timeline-common/TimelineMember.tsx
+++ b/FrontEnd/src/views/timeline-common/TimelineMember.tsx
@@ -1,49 +1,47 @@
import React, { useState } from "react";
import { useTranslation } from "react-i18next";
-import { Container, ListGroup, Modal, Row, Col, Button } from "react-bootstrap";
import { convertI18nText, I18nText } from "@/common";
import { HttpUser } from "@/http/user";
import { getHttpSearchClient } from "@/http/search";
+import { getHttpTimelineClient, HttpTimelineInfo } from "@/http/timeline";
import SearchInput from "../common/SearchInput";
import UserAvatar from "../common/user/UserAvatar";
-import { getHttpTimelineClient, HttpTimelineInfo } from "@/http/timeline";
+import Button from "../common/button/Button";
+import Dialog from "../common/dailog/Dialog";
+
+import "./TimelineMember.css";
const TimelineMemberItem: React.FC<{
user: HttpUser;
add?: boolean;
onAction?: (username: string) => void;
}> = ({ user, add, onAction }) => {
- const { t } = useTranslation();
-
return (
- <ListGroup.Item className="container">
- <Row>
- <Col xs="auto">
- <UserAvatar username={user.username} className="avatar small" />
- </Col>
- <Col>
- <Row>{user.nickname}</Row>
- <Row>
- <small>{"@" + user.username}</small>
- </Row>
- </Col>
+ <div className="container timeline-member-item">
+ <div className="row">
+ <div className="col col-auto">
+ <UserAvatar username={user.username} className="cru-avatar small" />
+ </div>
+ <div className="col">
+ <div className="row">{user.nickname}</div>
+ <small className="row">{"@" + user.username}</small>
+ </div>
{onAction ? (
- <Col xs="auto">
+ <div className="col col-auto">
<Button
- variant={add ? "success" : "danger"}
+ text={`timeline.member.${add ? "add" : "remove"}`}
+ color={add ? "success" : "danger"}
onClick={() => {
onAction(user.username);
}}
- >
- {t(`timeline.member.${add ? "add" : "remove"}`)}
- </Button>
- </Col>
+ />
+ </div>
) : null}
- </Row>
- </ListGroup.Item>
+ </div>
+ </div>
);
};
@@ -110,7 +108,7 @@ const TimelineMemberUserSearch: React.FC<{
return <div>{t("timeline.member.noUserAvailableToAdd")}</div>;
} else {
return (
- <ListGroup className="mt-2">
+ <div className="mt-2">
{users.map((user) => (
<TimelineMemberItem
key={user.username}
@@ -127,12 +125,12 @@ const TimelineMemberUserSearch: React.FC<{
}}
/>
))}
- </ListGroup>
+ </div>
);
}
} else if (userSearchState.type === "error") {
return (
- <div className="text-danger">
+ <div className="cru-color-danger">
{convertI18nText(userSearchState.data, t)}
</div>
);
@@ -152,8 +150,8 @@ const TimelineMember: React.FC<TimelineMemberProps> = (props) => {
const members = [timeline.owner, ...timeline.members];
return (
- <Container className="px-4 py-3">
- <ListGroup>
+ <div className="container px-4 py-3">
+ <div>
{members.map((member, index) => (
<TimelineMemberItem
key={member.username}
@@ -169,11 +167,11 @@ const TimelineMember: React.FC<TimelineMemberProps> = (props) => {
}
/>
))}
- </ListGroup>
+ </div>
{timeline.manageable ? (
<TimelineMemberUserSearch timeline={timeline} onChange={onChange} />
) : null}
- </Container>
+ </div>
);
};
@@ -188,8 +186,8 @@ export const TimelineMemberDialog: React.FC<TimelineMemberDialogProps> = (
props
) => {
return (
- <Modal show centered onHide={props.onClose}>
+ <Dialog open onClose={props.onClose}>
<TimelineMember {...props} />
- </Modal>
+ </Dialog>
);
};
diff --git a/FrontEnd/src/views/timeline-common/TimelinePageCardTemplate.tsx b/FrontEnd/src/views/timeline-common/TimelinePageCardTemplate.tsx
index 851dfa55..5c2fb275 100644
--- a/FrontEnd/src/views/timeline-common/TimelinePageCardTemplate.tsx
+++ b/FrontEnd/src/views/timeline-common/TimelinePageCardTemplate.tsx
@@ -17,12 +17,13 @@ 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";
+import { MenuItems } from "../common/menu/Menu";
+import PopupMenu from "../common/menu/PopupMenu";
+import FullPageDialog from "../common/dailog/FullPageDialog";
import Card from "../common/Card";
export interface TimelineCardTemplateProps extends TimelinePageCardProps {
- infoArea: React.ReactElement;
+ infoArea: React.ReactNode;
manageItems?: MenuItems;
dialog: string | "property" | "member" | null;
setDialog: (dialog: "property" | "member" | null) => void;
@@ -53,11 +54,11 @@ const TimelinePageCardTemplate: React.FC<TimelineCardTemplateProps> = ({
<small className="mt-1 d-block">
{t(timelineVisibilityTooltipTranslationMap[timeline.visibility])}
</small>
- <div className="text-end mt-2">
+ <div className="mt-2 cru-text-end">
<i
className={classnames(
timeline.isHighlight ? "bi-star-fill" : "bi-star",
- "icon-button text-yellow me-3"
+ "icon-button cru-color-primary me-3"
)}
onClick={
user?.hasHighlightTimelineAdministrationPermission
@@ -80,7 +81,7 @@ const TimelinePageCardTemplate: React.FC<TimelineCardTemplateProps> = ({
<i
className={classnames(
timeline.isBookmark ? "bi-bookmark-fill" : "bi-bookmark",
- "icon-button text-yellow me-3"
+ "icon-button cru-color-primary me-3"
)}
onClick={() => {
getHttpBookmarkClient()
@@ -97,12 +98,12 @@ const TimelinePageCardTemplate: React.FC<TimelineCardTemplateProps> = ({
/>
) : null}
<i
- className={"icon-button bi-people text-primary me-3"}
+ className={"icon-button bi-people cru-color-primary me-3"}
onClick={() => setDialog("member")}
/>
{manageItems != null ? (
- <PopupMenu items={manageItems}>
- <i className="icon-button bi-three-dots-vertical text-primary" />
+ <PopupMenu items={manageItems} containerClassName="d-inline">
+ <i className="icon-button bi-three-dots-vertical cru-color-primary" />
</PopupMenu>
) : null}
</div>
@@ -111,24 +112,21 @@ const TimelinePageCardTemplate: React.FC<TimelineCardTemplateProps> = ({
return (
<>
- <Card
- className={classnames("p-2 clearfix", className)}
- style={{ zIndex: collapse ? 1029 : 1031 }}
- >
- <div className="float-end d-flex align-items-center">
+ <Card className={classnames("p-2 cru-clearfix", className)}>
+ <div className="cru-float-right ms-3 d-flex align-items-center">
<ConnectionStatusBadge status={connectionStatus} className="me-2" />
<CollapseButton collapse={collapse} onClick={toggleCollapse} />
</div>
{isSmallScreen ? (
- <FullPage
+ <FullPageDialog
onBack={toggleCollapse}
show={!collapse}
contentContainerClassName="p-2"
>
{content}
- </FullPage>
+ </FullPageDialog>
) : (
- <div style={{ display: collapse ? "none" : "block" }}>{content}</div>
+ <div style={{ display: collapse ? "none" : "inline" }}>{content}</div>
)}
</Card>
{(() => {
diff --git a/FrontEnd/src/views/timeline-common/TimelinePageTemplate.tsx b/FrontEnd/src/views/timeline-common/TimelinePageTemplate.tsx
index 6f032eae..ea6e8d40 100644
--- a/FrontEnd/src/views/timeline-common/TimelinePageTemplate.tsx
+++ b/FrontEnd/src/views/timeline-common/TimelinePageTemplate.tsx
@@ -1,5 +1,4 @@
import React from "react";
-import { Container } from "react-bootstrap";
import { HubConnectionState } from "@microsoft/signalr";
import { HttpTimelineInfo } from "@/http/timeline";
@@ -75,7 +74,7 @@ const TimelinePageTemplate: React.FC<TimelinePageTemplateProps> = (props) => {
connectionStatus={connectionStatus}
/>
) : null}
- <Container>
+ <div className="container">
<Timeline
timelineName={timelineName}
reloadKey={reloadKey}
@@ -83,7 +82,7 @@ const TimelinePageTemplate: React.FC<TimelinePageTemplateProps> = (props) => {
onTimelineLoaded={(t) => setTimeline(t)}
onConnectionStateChanged={setConnectionStatus}
/>
- </Container>
+ </div>
</>
);
};
diff --git a/FrontEnd/src/views/timeline-common/TimelinePostDeleteConfirmDialog.tsx b/FrontEnd/src/views/timeline-common/TimelinePostDeleteConfirmDialog.tsx
deleted file mode 100644
index b2c7a470..00000000
--- a/FrontEnd/src/views/timeline-common/TimelinePostDeleteConfirmDialog.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import React from "react";
-import { Modal, Button } from "react-bootstrap";
-import { useTranslation } from "react-i18next";
-
-const TimelinePostDeleteConfirmDialog: React.FC<{
- onClose: () => void;
- onConfirm: () => void;
-}> = ({ onClose, onConfirm }) => {
- const { t } = useTranslation();
-
- return (
- <Modal onHide={onClose} show centered>
- <Modal.Header>
- <Modal.Title className="text-danger">
- {t("timeline.post.deleteDialog.title")}
- </Modal.Title>
- </Modal.Header>
- <Modal.Body>{t("timeline.post.deleteDialog.prompt")}</Modal.Body>
- <Modal.Footer>
- <Button variant="secondary" onClick={onClose}>
- {t("operationDialog.cancel")}
- </Button>
- <Button
- variant="danger"
- onClick={() => {
- onConfirm();
- onClose();
- }}
- >
- {t("operationDialog.confirm")}
- </Button>
- </Modal.Footer>
- </Modal>
- );
-};
-
-export default TimelinePostDeleteConfirmDialog;
diff --git a/FrontEnd/src/views/timeline-common/TimelinePostEdit.css b/FrontEnd/src/views/timeline-common/TimelinePostEdit.css
index 0c7deaa2..4ce98383 100644
--- a/FrontEnd/src/views/timeline-common/TimelinePostEdit.css
+++ b/FrontEnd/src/views/timeline-common/TimelinePostEdit.css
@@ -9,7 +9,7 @@
}
.timeline-post-edit {
- position: sticky;
+ position: sticky !important;
bottom: 0;
z-index: 1;
}
@@ -18,25 +18,3 @@
max-width: 100px;
max-height: 100px;
}
-
-.timeline-markdown-post-edit-page {
- overflow: scroll;
- max-height: 300px;
-}
-
-.timeline-markdown-post-edit-image-container {
- position: relative;
- text-align: center;
- margin-bottom: 1em;
-}
-
-.timeline-markdown-post-edit-image {
- max-width: 100%;
- max-height: 200px;
-}
-
-.timeline-markdown-post-edit-image-delete-button {
- position: absolute;
- right: 10px;
- top: 2px;
-}
diff --git a/FrontEnd/src/views/timeline-common/TimelinePostEdit.tsx b/FrontEnd/src/views/timeline-common/TimelinePostEdit.tsx
index 14cd50d4..9c48c7c8 100644
--- a/FrontEnd/src/views/timeline-common/TimelinePostEdit.tsx
+++ b/FrontEnd/src/views/timeline-common/TimelinePostEdit.tsx
@@ -1,7 +1,6 @@
import React from "react";
import classnames from "classnames";
import { useTranslation } from "react-i18next";
-import { Row, Col, Form } from "react-bootstrap";
import { UiLogicError } from "@/common";
@@ -16,8 +15,8 @@ import { pushAlert } from "@/services/alert";
import { base64 } from "@/http/common";
import BlobImage from "../common/BlobImage";
-import LoadingButton from "../common/LoadingButton";
-import { PopupMenu } from "../common/Menu";
+import LoadingButton from "../common/button/LoadingButton";
+import PopupMenu from "../common/menu/PopupMenu";
import Card from "../common/Card";
import MarkdownPostEdit from "./MarkdownPostEdit";
import TimelineLine from "./TimelineLine";
@@ -36,8 +35,7 @@ const TimelinePostEditText: React.FC<TimelinePostEditTextProps> = (props) => {
const { text, disabled, onChange, className, style } = props;
return (
- <Form.Control
- as="textarea"
+ <textarea
value={text}
disabled={disabled}
onChange={(event) => {
@@ -81,7 +79,7 @@ const TimelinePostEditImage: React.FC<TimelinePostEditImageProps> = (props) => {
return (
<>
- <Form.Control
+ <input
type="file"
onChange={onInputChange}
accept="image/*"
@@ -205,20 +203,20 @@ const TimelinePostEdit: React.FC<TimelinePostEditProps> = (props) => {
<Card className="timeline-item-card">
{showMarkdown ? (
<MarkdownPostEdit
- className="w-100"
+ className="cru-fill-parent"
onClose={() => setShowMarkdown(false)}
timeline={timeline.name}
onPosted={onPosted}
onPostError={onPostError}
/>
) : (
- <Row>
- <Col className="px-1 py-1">
+ <div className="row">
+ <div className="col px-1 py-1">
{(() => {
if (kind === "text") {
return (
<TimelinePostEditText
- className="w-100 h-100 timeline-post-edit"
+ className="cru-fill-parent timeline-post-edit"
text={text}
disabled={process}
onChange={(t) => {
@@ -239,9 +237,9 @@ const TimelinePostEdit: React.FC<TimelinePostEditProps> = (props) => {
);
}
})()}
- </Col>
- <Col xs="auto" className="align-self-end m-1">
- <div className="d-block text-center mt-1 mb-2">
+ </div>
+ <div className="col col-auto align-self-end m-1">
+ <div className="d-block cru-text-center mt-1 mb-2">
<PopupMenu
items={(["text", "image", "markdown"] as const).map(
(kind) => ({
@@ -267,15 +265,14 @@ const TimelinePostEdit: React.FC<TimelinePostEditProps> = (props) => {
</PopupMenu>
</div>
<LoadingButton
- variant="primary"
onClick={onSend}
disabled={!canSend}
loading={process}
>
{t("timeline.send")}
</LoadingButton>
- </Col>
- </Row>
+ </div>
+ </div>
)}
</Card>
</div>
diff --git a/FrontEnd/src/views/timeline-common/TimelinePostView.tsx b/FrontEnd/src/views/timeline-common/TimelinePostView.tsx
index 7b16e898..652ff9c9 100644
--- a/FrontEnd/src/views/timeline-common/TimelinePostView.tsx
+++ b/FrontEnd/src/views/timeline-common/TimelinePostView.tsx
@@ -9,9 +9,9 @@ import { pushAlert } from "@/services/alert";
import UserAvatar from "../common/user/UserAvatar";
import Card from "../common/Card";
import FlatButton from "../common/button/FlatButton";
+import ConfirmDialog from "../common/dailog/ConfirmDialog";
import TimelineLine from "./TimelineLine";
import TimelinePostContentView from "./TimelinePostContentView";
-import TimelinePostDeleteConfirmDialog from "./TimelinePostDeleteConfirmDialog";
import PostPropertyChangeDialog from "./PostPropertyChangeDialog";
export interface TimelinePostViewProps {
@@ -64,7 +64,7 @@ const TimelinePostView: React.FC<TimelinePostViewProps> = (props) => {
>
{post.editable ? (
<i
- className="bi-chevron-down icon-button primary-enhance float-end"
+ className="bi-chevron-down icon-button primary-enhance cru-float-right"
onClick={(e) => {
setOperationMaskVisible(true);
e.stopPropagation();
@@ -116,7 +116,9 @@ const TimelinePostView: React.FC<TimelinePostViewProps> = (props) => {
) : null}
</Card>
{dialog === "delete" ? (
- <TimelinePostDeleteConfirmDialog
+ <ConfirmDialog
+ title="timeline.post.deleteDialog.title"
+ body="timeline.post.deleteDialog.prompt"
onClose={() => {
setDialog(null);
setOperationMaskVisible(false);
diff --git a/FrontEnd/src/views/timeline-common/TimelinePropertyChangeDialog.tsx b/FrontEnd/src/views/timeline-common/TimelinePropertyChangeDialog.tsx
index 70f72025..64daa19b 100644
--- a/FrontEnd/src/views/timeline-common/TimelinePropertyChangeDialog.tsx
+++ b/FrontEnd/src/views/timeline-common/TimelinePropertyChangeDialog.tsx
@@ -8,7 +8,7 @@ import {
TimelineVisibility,
} from "@/http/timeline";
-import OperationDialog from "../common/OperationDialog";
+import OperationDialog from "../common/dailog/OperationDialog";
export interface TimelinePropertyChangeDialogProps {
open: boolean;
@@ -60,7 +60,7 @@ const TimelinePropertyChangeDialog: React.FC<TimelinePropertyChangeDialogProps>
] as const
}
open={props.open}
- close={props.close}
+ onClose={props.close}
onProcess={([newTitle, newVisibility, newDescription, newColor]) => {
const req: HttpTimelinePatchRequest = {};
if (newTitle !== timeline.title) {
diff --git a/FrontEnd/src/views/timeline-common/index.css b/FrontEnd/src/views/timeline-common/index.css
index e38d0ba7..6929f9ae 100644
--- a/FrontEnd/src/views/timeline-common/index.css
+++ b/FrontEnd/src/views/timeline-common/index.css
@@ -13,19 +13,19 @@
@keyframes timeline-line-node-noncurrent {
to {
- box-shadow: 0 0 20px 3px var(--tl-primary-lighter-color);
+ box-shadow: 0 0 20px 3px var(--cru-primary-l1-color);
}
}
@keyframes timeline-line-node-current {
to {
- box-shadow: 0 0 20px 3px var(--tl-primary-enhance-lighter-color);
+ box-shadow: 0 0 20px 3px var(--cru-primary-enhance-l1-color);
}
}
@keyframes timeline-line-node-loading {
to {
- box-shadow: 0 0 20px 3px var(--tl-primary-lighter-color);
+ box-shadow: 0 0 20px 3px var(--cru-primary-l1-color);
}
}
@@ -79,7 +79,7 @@
.timeline-line .segment {
width: 7px;
- background: var(--tl-primary-color);
+ background: var(--cru-primary-color);
}
.timeline-line .segment.start {
height: 1.8em;
@@ -91,7 +91,7 @@
.timeline-line .segment.current-end {
height: 2em;
flex: 0 0 auto;
- background: linear-gradient(var(--tl-primary-enhance-color), white);
+ background: linear-gradient(var(--cru-primary-enhance-color), white);
}
.timeline-line .node-container {
flex: 0 0 auto;
@@ -103,7 +103,7 @@
width: 20px;
height: 20px;
position: absolute;
- background: var(--tl-primary-color);
+ background: var(--cru-primary-color);
left: -1px;
top: -1px;
border-radius: 50%;
@@ -113,7 +113,7 @@
animation-name: timeline-line-node-noncurrent;
}
.timeline-line .node-loading-edge {
- color: var(--tl-primary-color);
+ color: var(--cru-primary-color);
width: 38px;
height: 38px;
position: absolute;
@@ -125,22 +125,22 @@
}
.timeline-line.current .segment.start {
background: linear-gradient(
- var(--tl-primary-color),
- var(--tl-primary-enhance-color)
+ var(--cru-primary-color),
+ var(--cru-primary-enhance-color)
);
}
.timeline-line.current .segment.end {
- background: var(--tl-primary-enhance-color);
+ background: var(--cru-primary-enhance-color);
}
.timeline-line.current .node {
- background: var(--tl-primary-enhance-color);
+ background: var(--cru-primary-enhance-color);
animation-name: timeline-line-node-current;
}
.timeline-line.loading .node {
- background: var(--tl-primary-color);
+ background: var(--cru-primary-color);
animation-name: timeline-line-node-loading;
}
@@ -239,6 +239,7 @@
.timeline-template-card {
position: fixed;
+ z-index: 1029;
top: 56px;
right: 0;
margin: 0.5em;