mirror of https://github.com/halo-dev/halo
fix: the issue that post publishTime cannot be set and displayed back (halo-dev/console#718)
#### What type of PR is this? /kind bug /milestone 2.0 #### What this PR does / why we need it: 修复文章和自定义页面的发布时间无法设置和回显的问题。 #### Which issue(s) this PR fixes: Fixes https://github.com/halo-dev/halo/issues/2770 #### Special notes for your reviewer: 测试方式: 1. 创建一篇文章和自定义页面。 2. 在高级设置中设置发布时间。 3. 检查发布后列表中显示的时间是否和设置的一致。 4. 再次打开文章设置,检查发布时间输入框的时间是否正确。 #### Does this PR introduce a user-facing change? ```release-note 修复 Console 端文章和自定义页面的发布时间无法设置和回显的问题。 ```pull/3445/head
parent
540a488d5b
commit
43d7765347
|
@ -7,6 +7,7 @@ import { apiClient } from "@/utils/api-client";
|
||||||
import { useThemeCustomTemplates } from "@/modules/interface/themes/composables/use-theme";
|
import { useThemeCustomTemplates } from "@/modules/interface/themes/composables/use-theme";
|
||||||
import { singlePageLabels } from "@/constants/labels";
|
import { singlePageLabels } from "@/constants/labels";
|
||||||
import { randomUUID } from "@/utils/id";
|
import { randomUUID } from "@/utils/id";
|
||||||
|
import { toDatetimeLocal, toISOString } from "@/utils/date";
|
||||||
|
|
||||||
const initialFormState: SinglePage = {
|
const initialFormState: SinglePage = {
|
||||||
spec: {
|
spec: {
|
||||||
|
@ -69,6 +70,9 @@ const isUpdateMode = computed(() => {
|
||||||
const onVisibleChange = (visible: boolean) => {
|
const onVisibleChange = (visible: boolean) => {
|
||||||
emit("update:visible", visible);
|
emit("update:visible", visible);
|
||||||
if (!visible) {
|
if (!visible) {
|
||||||
|
setTimeout(() => {
|
||||||
|
activeTab.value = "general";
|
||||||
|
}, 200);
|
||||||
emit("close");
|
emit("close");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -162,6 +166,19 @@ watchEffect(() => {
|
||||||
|
|
||||||
// custom templates
|
// custom templates
|
||||||
const { templates } = useThemeCustomTemplates("page");
|
const { templates } = useThemeCustomTemplates("page");
|
||||||
|
|
||||||
|
// publishTime
|
||||||
|
const publishTime = computed(() => {
|
||||||
|
const { publishTime } = formState.value.spec;
|
||||||
|
if (publishTime) {
|
||||||
|
return toDatetimeLocal(publishTime);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
});
|
||||||
|
|
||||||
|
const onPublishTimeChange = (value: string) => {
|
||||||
|
formState.value.spec.publishTime = toISOString(value);
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
|
@ -261,10 +278,11 @@ const { templates } = useThemeCustomTemplates("page");
|
||||||
type="select"
|
type="select"
|
||||||
></FormKit>
|
></FormKit>
|
||||||
<FormKit
|
<FormKit
|
||||||
v-model="formState.spec.publishTime"
|
:value="publishTime"
|
||||||
label="发表时间"
|
label="发表时间"
|
||||||
type="datetime-local"
|
type="datetime-local"
|
||||||
name="publishTime"
|
name="publishTime"
|
||||||
|
@input="onPublishTimeChange"
|
||||||
></FormKit>
|
></FormKit>
|
||||||
<FormKit
|
<FormKit
|
||||||
v-model="formState.spec.template"
|
v-model="formState.spec.template"
|
||||||
|
|
|
@ -7,6 +7,7 @@ import { apiClient } from "@/utils/api-client";
|
||||||
import { useThemeCustomTemplates } from "@/modules/interface/themes/composables/use-theme";
|
import { useThemeCustomTemplates } from "@/modules/interface/themes/composables/use-theme";
|
||||||
import { postLabels } from "@/constants/labels";
|
import { postLabels } from "@/constants/labels";
|
||||||
import { randomUUID } from "@/utils/id";
|
import { randomUUID } from "@/utils/id";
|
||||||
|
import { toDatetimeLocal, toISOString } from "@/utils/date";
|
||||||
|
|
||||||
const initialFormState: Post = {
|
const initialFormState: Post = {
|
||||||
spec: {
|
spec: {
|
||||||
|
@ -71,6 +72,9 @@ const isUpdateMode = computed(() => {
|
||||||
const handleVisibleChange = (visible: boolean) => {
|
const handleVisibleChange = (visible: boolean) => {
|
||||||
emit("update:visible", visible);
|
emit("update:visible", visible);
|
||||||
if (!visible) {
|
if (!visible) {
|
||||||
|
setTimeout(() => {
|
||||||
|
activeTab.value = "general";
|
||||||
|
}, 200);
|
||||||
emit("close");
|
emit("close");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -153,6 +157,20 @@ watchEffect(() => {
|
||||||
|
|
||||||
// custom templates
|
// custom templates
|
||||||
const { templates } = useThemeCustomTemplates("post");
|
const { templates } = useThemeCustomTemplates("post");
|
||||||
|
|
||||||
|
// publishTime convert
|
||||||
|
const publishTime = computed(() => {
|
||||||
|
const { publishTime } = formState.value.spec;
|
||||||
|
if (publishTime) {
|
||||||
|
console.log(toDatetimeLocal(publishTime));
|
||||||
|
return toDatetimeLocal(publishTime);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
});
|
||||||
|
|
||||||
|
const onPublishTimeChange = (value: string) => {
|
||||||
|
formState.value.spec.publishTime = toISOString(value);
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<VModal
|
<VModal
|
||||||
|
@ -262,9 +280,10 @@ const { templates } = useThemeCustomTemplates("post");
|
||||||
type="select"
|
type="select"
|
||||||
></FormKit>
|
></FormKit>
|
||||||
<FormKit
|
<FormKit
|
||||||
v-model="formState.spec.publishTime"
|
:value="publishTime"
|
||||||
label="发表时间"
|
label="发表时间"
|
||||||
type="datetime-local"
|
type="datetime-local"
|
||||||
|
@input="onPublishTimeChange"
|
||||||
></FormKit>
|
></FormKit>
|
||||||
<FormKit
|
<FormKit
|
||||||
v-model="formState.spec.template"
|
v-model="formState.spec.template"
|
||||||
|
|
|
@ -1,10 +1,34 @@
|
||||||
import { describe, expect, it } from "vitest";
|
import { describe, expect, it } from "vitest";
|
||||||
import { formatDatetime } from "../date";
|
import { formatDatetime, toDatetimeLocal, toISOString } from "../date";
|
||||||
|
|
||||||
describe.skip("date#formatDatetime", () => {
|
describe("date#formatDatetime", () => {
|
||||||
it("should return formatted datetime", () => {
|
it("should return formatted datetime", () => {
|
||||||
const formattedDatetime = formatDatetime("2022-08-17T06:01:16.511575Z");
|
const formattedDatetime = formatDatetime(
|
||||||
|
"2022-08-17T06:01:16.511575Z",
|
||||||
|
"Asia/Shanghai"
|
||||||
|
);
|
||||||
|
|
||||||
expect(formattedDatetime).toEqual("2022-08-17 14:01");
|
expect(formattedDatetime).toEqual("2022-08-17 14:01");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("date#toISOString", () => {
|
||||||
|
it("should return ISO string", () => {
|
||||||
|
const currentDate = new Date();
|
||||||
|
|
||||||
|
const isoString = toISOString(currentDate);
|
||||||
|
|
||||||
|
expect(isoString).toEqual(currentDate.toISOString());
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("date#toDatetimeLocal", () => {
|
||||||
|
it("should return datetime local", () => {
|
||||||
|
const datetimeLocal = toDatetimeLocal(
|
||||||
|
"2022-08-17T06:01:00.000Z",
|
||||||
|
"Asia/Shanghai"
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(datetimeLocal).toEqual("2022-08-17T14:01");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
|
@ -1,14 +1,37 @@
|
||||||
import dayjs from "dayjs";
|
import dayjs from "dayjs";
|
||||||
import "dayjs/locale/zh-cn";
|
import "dayjs/locale/zh-cn";
|
||||||
import timezone from "dayjs/plugin/timezone";
|
import timezone from "dayjs/plugin/timezone";
|
||||||
|
import utc from "dayjs/plugin/utc";
|
||||||
|
|
||||||
dayjs.extend(timezone);
|
dayjs.extend(timezone);
|
||||||
|
dayjs.extend(utc);
|
||||||
|
|
||||||
dayjs.locale("zh-cn");
|
dayjs.locale("zh-cn");
|
||||||
|
|
||||||
export function formatDatetime(date: string | Date | undefined | null): string {
|
export function formatDatetime(
|
||||||
|
date: string | Date | undefined | null,
|
||||||
|
tz?: string
|
||||||
|
): string {
|
||||||
if (!date) {
|
if (!date) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
return dayjs(date).format("YYYY-MM-DD HH:mm");
|
return dayjs(date).tz(tz).format("YYYY-MM-DD HH:mm");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function toISOString(date: string | Date | undefined | null): string {
|
||||||
|
if (!date) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return dayjs(date).utc(false).toISOString();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function toDatetimeLocal(
|
||||||
|
date: string | Date | undefined | null,
|
||||||
|
tz?: string
|
||||||
|
): string {
|
||||||
|
if (!date) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
// see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/datetime-local#the_y10k_problem_often_client-side
|
||||||
|
return dayjs(date).tz(tz).format("YYYY-MM-DDTHH:mm");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue