@@ -4,6 +4,30 @@ import { AlertCircle, FileText, RefreshCw, X } from 'lucide-react'
44import { sanitizeSlug , isValidSlug } from '../../utils/slug'
55import { sanitizeInteger } from './formUtils'
66
7+ const formatDateTimeLocal = ( value ) => {
8+ if ( ! value ) return ''
9+ const date = new Date ( value )
10+ if ( Number . isNaN ( date . getTime ( ) ) ) {
11+ return ''
12+ }
13+ const pad = ( unit ) => String ( unit ) . padStart ( 2 , '0' )
14+ const year = date . getFullYear ( )
15+ const month = pad ( date . getMonth ( ) + 1 )
16+ const day = pad ( date . getDate ( ) )
17+ const hours = pad ( date . getHours ( ) )
18+ const minutes = pad ( date . getMinutes ( ) )
19+ return `${ year } -${ month } -${ day } T${ hours } :${ minutes } `
20+ }
21+
22+ const parseDateTimeLocal = ( value ) => {
23+ if ( ! value ) return ''
24+ const date = new Date ( value )
25+ if ( Number . isNaN ( date . getTime ( ) ) ) {
26+ return ''
27+ }
28+ return date . toISOString ( )
29+ }
30+
731const PostForm = ( { mode, initialData, onSubmit, onCancel, submitting } ) => {
832 const [ title , setTitle ] = useState ( initialData ?. title ?? '' )
933 const [ slug , setSlug ] = useState ( initialData ?. slug ?? '' )
@@ -13,6 +37,7 @@ const PostForm = ({ mode, initialData, onSubmit, onCancel, submitting }) => {
1337 const [ isPublished , setIsPublished ] = useState ( Boolean ( initialData ?. is_published ) )
1438 const [ publishedAt , setPublishedAt ] = useState ( initialData ?. published_at ?? '' )
1539 const [ error , setError ] = useState ( null )
40+ const publishedAtInputValue = useMemo ( ( ) => formatDateTimeLocal ( publishedAt ) , [ publishedAt ] )
1641 const sanitizedPostSlug = useMemo ( ( ) => sanitizeSlug ( slug ) , [ slug ] )
1742 const postSlugHasInput = slug . trim ( ) . length > 0
1843 const postSlugInvalid = postSlugHasInput && ! sanitizedPostSlug
@@ -38,17 +63,17 @@ const PostForm = ({ mode, initialData, onSubmit, onCancel, submitting }) => {
3863 if ( ! isValidSlug ( sanitizedSlug ) ) {
3964 throw new Error ( 'Slug ist ungültig.' )
4065 }
66+ setSlug ( sanitizedSlug )
4167 const payload = {
4268 title : title . trim ( ) ,
4369 slug : sanitizedSlug ,
4470 excerpt : excerpt . trim ( ) || null ,
4571 content_markdown : content ,
4672 order_index : sanitizeInteger ( orderIndex ) ,
4773 is_published : isPublished ,
48- published_at : publishedAt . trim ( ) ? publishedAt : null ,
74+ published_at : isPublished && publishedAt ? publishedAt : null ,
4975 }
5076 await onSubmit ( payload )
51- setSlug ( sanitizedSlug )
5277 } catch ( err ) {
5378 setError ( err )
5479 }
@@ -131,8 +156,8 @@ const PostForm = ({ mode, initialData, onSubmit, onCancel, submitting }) => {
131156 < input
132157 type = "datetime-local"
133158 className = "mt-1 w-full rounded-lg border border-gray-200 px-3 py-2 text-sm focus:border-primary-500 focus:outline-none focus:ring-2 focus:ring-primary-100 dark:border-slate-700 dark:bg-slate-900 dark:text-slate-100"
134- value = { publishedAt || '' }
135- onChange = { ( event ) => setPublishedAt ( event . target . value ) }
159+ value = { publishedAtInputValue }
160+ onChange = { ( event ) => setPublishedAt ( parseDateTimeLocal ( event . target . value ) ) }
136161 disabled = { ! isPublished }
137162 />
138163 </ label >
@@ -162,7 +187,13 @@ const PostForm = ({ mode, initialData, onSubmit, onCancel, submitting }) => {
162187 type = "checkbox"
163188 className = "h-4 w-4 rounded border-gray-300 text-primary-600 focus:ring-primary-500 dark:border-slate-600 dark:bg-slate-900"
164189 checked = { isPublished }
165- onChange = { ( event ) => setIsPublished ( event . target . checked ) }
190+ onChange = { ( event ) => {
191+ const nextValue = event . target . checked
192+ setIsPublished ( nextValue )
193+ if ( ! nextValue ) {
194+ setPublishedAt ( '' )
195+ }
196+ } }
166197 />
167198 Veröffentlicht
168199 </ label >
0 commit comments