Skip to content

Commit

Permalink
Merge pull request #1004 from digitalfabrik/1003-datepicker-shows-wro…
Browse files Browse the repository at this point in the history
…ng-date

1003: Datepicker shows wrong date
  • Loading branch information
f1sh1918 authored Jun 3, 2023
2 parents 4e79de9 + 9fd7534 commit 6051edb
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 74 deletions.
42 changes: 2 additions & 40 deletions administration/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion administration/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
"dependencies": {
"@apollo/client": "^3.7.9",
"@blueprintjs/core": "^4.16.3",
"@blueprintjs/datetime": "^4.3.12",
"@blueprintjs/popover2": "^1.13.3",
"@blueprintjs/select": "^4.9.3",
"@blueprintjs/table": "^4.9.3",
Expand Down
41 changes: 27 additions & 14 deletions administration/src/bp-modules/cards/AddCardForm.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { Button, Card, FormGroup, InputGroup, Intent } from '@blueprintjs/core'
import { DateInput } from '@blueprintjs/datetime'
import '@blueprintjs/datetime/lib/css/blueprint-datetime.css'
import { add } from 'date-fns'
import { TextField } from '@mui/material'
import { add, format, isAfter, isBefore } from 'date-fns'
import React, { ChangeEvent } from 'react'
import styled from 'styled-components'

Expand Down Expand Up @@ -33,6 +32,10 @@ const ExtensionForm = ({ extension, onUpdate }: ExtensionFormProps) => {
})
}

const maxCardValidity = 99
const hasCardExpirationError = (expirationDate: Date): boolean =>
isBefore(expirationDate, Date.now()) || isAfter(expirationDate, add(Date.now(), { years: maxCardValidity }))

const CreateCardForm = ({ cardBlueprint, onRemove, onUpdate }: CreateCardsFormProps) => {
return (
<Card>
Expand All @@ -53,19 +56,29 @@ const CreateCardForm = ({ cardBlueprint, onRemove, onUpdate }: CreateCardsFormPr
/>
</FormGroup>
<FormGroup label='Ablaufdatum'>
<DateInput
placeholder='Ablaufdatum'
<TextField
fullWidth
disabled={cardBlueprint.hasInfiniteLifetime()}
value={cardBlueprint.expirationDate}
parseDate={str => new Date(str)}
onChange={value => {
cardBlueprint.expirationDate = value
onUpdate()
type='date'
required
size='small'
error={cardBlueprint.expirationDate ? hasCardExpirationError(cardBlueprint.expirationDate) : true}
value={cardBlueprint.expirationDate ? format(cardBlueprint.expirationDate, 'yyyy-MM-dd') : null}
sx={{ '& input[value=""]:not(:focus)': { color: 'transparent' }, '& fieldset': { borderRadius: 0 } }}
inputProps={{
style: { fontSize: 14, padding: '6px 10px' },
min: format(new Date(), 'yyyy-MM-dd'),
max: format(add(Date.now(), { years: maxCardValidity }), 'yyyy-MM-dd'),
}}
onChange={e => {
if (e.target.value !== null) {
const millis = Date.parse(e.target.value)
if (!isNaN(millis)) {
cardBlueprint.expirationDate = new Date(millis)
onUpdate()
}
}
}}
formatDate={date => date.toLocaleDateString()}
maxDate={add(Date.now(), { years: 99 })}
minDate={new Date()}
fill={true}
/>
</FormGroup>
{cardBlueprint.extensions.map((ext, i) => (
Expand Down
4 changes: 3 additions & 1 deletion administration/src/cards/CardBlueprint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,9 @@ export class CardBlueprint implements JSONCardBlueprint {
return new CardInfo({
fullName: this.fullName,
expirationDay:
expirationDate !== null && !this.hasInfiniteLifetime() ? dateToDaysSinceEpoch(expirationDate) : undefined,
expirationDate !== null && expirationDate.getTime() > 0 && !this.hasInfiniteLifetime()
? dateToDaysSinceEpoch(expirationDate)
: undefined,
extensions: new CardExtensions(extensionsMessage),
})
}
Expand Down
51 changes: 33 additions & 18 deletions administration/src/cards/extensions/BirthdayExtension.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { FormGroup } from '@blueprintjs/core'
import { DateInput } from '@blueprintjs/datetime'
import { PartialMessage } from '@bufbuild/protobuf'
import { format, isValid, parse, sub } from 'date-fns'
import { TextField } from '@mui/material'
import { format, isAfter, isBefore, isValid, parse } from 'date-fns'

import { CardExtensions } from '../../generated/card_pb'
import { dateToDaysSinceEpoch, daysSinceEpochToDate } from '../validityPeriod'
Expand All @@ -10,34 +10,49 @@ import { Extension } from './extensions'
type BirthdayState = { birthday: number }

const initialBirthdayDate = dateToDaysSinceEpoch(new Date('1980-01-01T00:00+00:00'))

const dateFormat = 'yyyy-MM-dd'
const minBirthday = '1900-01-01'
class BirthdayExtension extends Extension<BirthdayState, null> {
public readonly name = BirthdayExtension.name

setInitialState() {
this.state = { birthday: initialBirthdayDate }
}
hasValidBirthdayDate(birthday?: number): boolean {
if (!birthday) {
return true
}
return (
isBefore(daysSinceEpochToDate(birthday), new Date(minBirthday)) ||
isAfter(daysSinceEpochToDate(birthday), new Date())
)
}

createForm(onUpdate: () => void) {
return (
<FormGroup label='Geburtsdatum'>
<DateInput
placeholder='Geburtsdatum'
value={daysSinceEpochToDate(this.state?.birthday ?? initialBirthdayDate)}
parseDate={value => {
const millis = Date.parse(value)
return isNaN(millis) ? false : new Date(millis)
<TextField
fullWidth
type='date'
required
size='small'
error={!this.isValid()}
value={format(daysSinceEpochToDate(this.state?.birthday ?? initialBirthdayDate), dateFormat)}
sx={{ '& input[value=""]:not(:focus)': { color: 'transparent' }, '& fieldset': { borderRadius: 0 } }}
inputProps={{
max: format(new Date(), dateFormat),
min: minBirthday,
style: { fontSize: 14, padding: '6px 10px' },
}}
onChange={value => {
if (value !== null) {
this.state = { birthday: dateToDaysSinceEpoch(value) }
onUpdate()
onChange={e => {
if (e.target.value !== null) {
const millis = Date.parse(e.target.value)
if (!isNaN(millis)) {
this.state = { birthday: dateToDaysSinceEpoch(new Date(e.target.value)) }
onUpdate()
}
}
}}
formatDate={date => date.toLocaleDateString()}
minDate={sub(Date.now(), { years: 150 })}
maxDate={new Date()}
fill={true}
/>
</FormGroup>
)
Expand All @@ -54,7 +69,7 @@ class BirthdayExtension extends Extension<BirthdayState, null> {
}

isValid() {
return this.state !== null
return this.state !== null && !this.hasValidBirthdayDate(this.state.birthday)
}

fromString(value: string) {
Expand Down

0 comments on commit 6051edb

Please sign in to comment.