diff --git a/src/components/ui/datetime/index.vue b/src/components/ui/datetime/index.vue index b1cc0e2..abebf87 100644 --- a/src/components/ui/datetime/index.vue +++ b/src/components/ui/datetime/index.vue @@ -2,16 +2,23 @@ import type { FieldBindingObject } from "vee-validate"; interface Props extends FieldBindingObject { + datetime: string; label?: string; formatterValue?: (value: string) => string; format?: (value: string) => string; + min?: string; + max?: string; } const props = defineProps(); +const emit = defineEmits<{ + (e: "update:value", value: string): void; +}>(); function handleChange(value: string) { const formattedValue = props.formatterValue ? props.formatterValue(value) : new Date(value).toISOString(); props.onChange(formattedValue); + emit("update:value", formattedValue); } function formatDisplay(value: string) { @@ -24,18 +31,20 @@ function formatDisplay(value: string) { {{ props.label }} - +
{{ formatDisplay(props.value) }}
diff --git a/src/locales/en-US.json b/src/locales/en-US.json index 2af03c5..40f0ccd 100644 --- a/src/locales/en-US.json +++ b/src/locales/en-US.json @@ -176,9 +176,11 @@ "categoryRequired": "Type is required", "editionNameRequired": "Edition name is required", "launchDateRequired": "Launch date is required", + "launchDateNotPast": "Launch date cannot be earlier than current date", "perUserLimitRequired": "Per user limit is required", "totalSupplyRequired": "Total supply is required", "subscriptionDeadlineRequired": "Subscription deadline is required", + "deadlineAfterLaunch": "Subscription deadline cannot be earlier than launch date", "unitPriceRequired": "Unit price is required", "dividendRateRequired": "Dividend rate is required" }, diff --git a/src/locales/zh-CN.json b/src/locales/zh-CN.json index 5f1f72e..46b884f 100644 --- a/src/locales/zh-CN.json +++ b/src/locales/zh-CN.json @@ -176,9 +176,11 @@ "categoryRequired": "产品类型是必填项", "editionNameRequired": "发行期名称是必填项", "launchDateRequired": "发行日期是必填项", + "launchDateNotPast": "发行日期不能小于当前日期", "perUserLimitRequired": "个人申购上限是必填项", "totalSupplyRequired": "发行总量是必填项", "subscriptionDeadlineRequired": "申购截止日期是必填项", + "deadlineAfterLaunch": "申购截止日期不能小于发行日期", "unitPriceRequired": "单价是必填项", "dividendRateRequired": "分红率是必填项" }, diff --git a/src/views/issue/issuing-apply/issue-period.vue b/src/views/issue/issuing-apply/issue-period.vue index 9e5292b..ffd0145 100644 --- a/src/views/issue/issuing-apply/issue-period.vue +++ b/src/views/issue/issuing-apply/issue-period.vue @@ -34,10 +34,23 @@ const schema = toTypedSchema(yup.object({ editions: yup.array().of( yup.object({ editionName: yup.string().required(t("asset.issue.apply.validation.editionNameRequired")), - launchDate: yup.string().required(t("asset.issue.apply.validation.launchDateRequired")), + launchDate: yup.string() + .required(t("asset.issue.apply.validation.launchDateRequired")) + .test("not-past", t("asset.issue.apply.validation.launchDateNotPast"), (value) => { + if (!value) + return true; + return new Date(value) >= new Date(now.value.toDateString()); + }), perUserLimit: yup.string().required(t("asset.issue.apply.validation.perUserLimitRequired")), totalSupply: yup.string().required(t("asset.issue.apply.validation.totalSupplyRequired")), - subscriptionDeadline: yup.string().required(t("asset.issue.apply.validation.subscriptionDeadlineRequired")), + subscriptionDeadline: yup.string() + .required(t("asset.issue.apply.validation.subscriptionDeadlineRequired")) + .test("after-launch", t("asset.issue.apply.validation.deadlineAfterLaunch"), function (value) { + const { launchDate } = this.parent; + if (!value || !launchDate) + return true; + return new Date(value) >= new Date(launchDate); + }), unitPrice: yup.string().required(t("asset.issue.apply.validation.unitPriceRequired")), dividendRate: yup.string().required(t("asset.issue.apply.validation.dividendRateRequired")), }), @@ -47,11 +60,6 @@ const schema = toTypedSchema(yup.object({ function handleSubmit(values: GenericObject) { emit("submit", values.editions); } -function handleChange(event: Event) { - debugger; - const input = event.target as HTMLInputElement; - return new Date(input.value); -}