Skip to content

Commit 9883ace

Browse files
authored
feat: adds a new event id accessor (jquense#2693)
if id is found, used as a react 'key', falls back to default
1 parent 321423a commit 9883ace

File tree

5 files changed

+61
-1
lines changed

5 files changed

+61
-1
lines changed

src/Calendar.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,17 @@ class Calendar extends React.Component {
225225
*/
226226
endAccessor: accessor,
227227

228+
/**
229+
* The id of the event. Must resolve to a string or number. Used as the key for the event in the DOM. If not provided, the event will be given a key of 'evt\_{index}'.
230+
*
231+
* ```js
232+
* string | number | (event: Object) => string | number
233+
* ```
234+
*
235+
* @type {(func|string)}
236+
*/
237+
eventIdAccessor: accessor,
238+
228239
/**
229240
* Returns the id of the `resource` that the event is a member of. This
230241
* id should match at least one resource in the `resources` array.
@@ -898,6 +909,8 @@ class Calendar extends React.Component {
898909
resourceIdAccessor: 'id',
899910
resourceTitleAccessor: 'title',
900911

912+
eventIdAccessor: 'id',
913+
901914
longPressThreshold: 250,
902915
getNow: () => new Date(),
903916
dayLayoutAlgorithm: 'overlap',
@@ -923,6 +936,7 @@ class Calendar extends React.Component {
923936
resourceAccessor,
924937
resourceIdAccessor,
925938
resourceTitleAccessor,
939+
eventIdAccessor,
926940
eventPropGetter,
927941
backgroundEventPropGetter,
928942
slotPropGetter,
@@ -971,6 +985,7 @@ class Calendar extends React.Component {
971985
resource: wrapAccessor(resourceAccessor),
972986
resourceId: wrapAccessor(resourceIdAccessor),
973987
resourceTitle: wrapAccessor(resourceTitleAccessor),
988+
eventId: wrapAccessor(eventIdAccessor),
974989
},
975990
}
976991
}

src/DayColumn.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ class DayColumn extends React.Component {
210210
return styledEvents.map(({ event, style }, idx) => {
211211
let end = accessors.end(event)
212212
let start = accessors.start(event)
213+
let key = accessors.eventId(event) ?? 'evt_' + idx
213214
let format = 'eventTimeRangeFormat'
214215
let label
215216

@@ -230,7 +231,7 @@ class DayColumn extends React.Component {
230231
style={style}
231232
event={event}
232233
label={label}
233-
key={'evt_' + idx}
234+
key={key}
234235
getters={getters}
235236
rtl={rtl}
236237
components={components}

stories/props/eventIdAccessor.mdx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Canvas, Story } from '@storybook/addon-docs'
2+
3+
# eventIdAccessor
4+
5+
- type: `string | number | function (event: Object) => string | number`
6+
- default: 'id'
7+
8+
The id of the event. Must resolve to a string or number. Used as the key for the event in the DOM. If not provided, the event will be given a key of 'evt\_{index}'.
9+
10+
<Story id="props--event-id-accessor" />
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import React from 'react'
2+
import { Calendar } from '../../src'
3+
import { accessorStoryArgs } from './storyDefaults'
4+
import mdx from './eventIdAccessor.mdx'
5+
6+
export default {
7+
title: 'props',
8+
component: Calendar,
9+
argTypes: {
10+
localizer: { control: { type: null } },
11+
events: { control: { type: null } },
12+
defaultDate: {
13+
control: {
14+
type: null,
15+
},
16+
},
17+
},
18+
parameters: {
19+
docs: {
20+
page: mdx,
21+
},
22+
},
23+
}
24+
25+
const Template = (args) => (
26+
<div className="height600">
27+
<Calendar {...args} />
28+
</div>
29+
)
30+
31+
export const EventIdAccessor = Template.bind({})
32+
EventIdAccessor.storyName = 'eventIdAccessor'
33+
EventIdAccessor.args = accessorStoryArgs

stories/props/storyDefaults.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export const accessorStoryArgs = {
2828
titleAccessor: 'label',
2929
tooltipAccessor: 'label',
3030
startAccessor: 'startDate',
31+
idAccessor: 'id',
3132
}
3233
/** END Specific to event key accessors */
3334

0 commit comments

Comments
 (0)