7

So as seen on the picture, I want to style individual events.

Example of how it should look

With the slotpropgetter it's possible to conditionally render styles.

slotPropGetter = date => {
    const CURRENT_DATE = moment().toDate();
    let backgroundColor;

    if (moment(date).isBefore(CURRENT_DATE, "month")) {
        backgroundColor = "#f7f8f9";
    }

    var style = {
        backgroundColor
    };
    return {
        style: style
    };
};

So the "solution" is the DateCellWrapper, it either doesn't work for me, or I've implemented it in the wrong way

const DateCellWrapper = ({ value, children }) => {
    console.log("DateCellWrapper")
    const style = {
        backgroundColor: "#000",
    };

    return (
        <div style={style}>{children}</div>
    );
}

It doesn't even output my console.log, so.. anyone an idea? :p

Ignacio Ara
  • 2,476
  • 2
  • 26
  • 37
mokimo
  • 73
  • 1
  • 1
  • 3
  • So if its not outputting your console log code, it means; app doesnt even recognize DataCellWrapper and its not rendering it. You should start to solve this render problem first. I think if you can make your app render DataCellWrapper which must be easy, you can solve your problem on your own. – jrSakizci Apr 19 '18 at 13:14

1 Answers1

23

The components prop can be used to individually change how parts of the calendar are rendered:

import React, {Children} from 'react';
import BigCalendar from 'react-big-calendar';
import moment from 'moment';

BigCalendar.momentLocalizer(moment);

const CURRENT_DATE = moment().toDate();

// example implementation of a wrapper
const ColoredDateCellWrapper = ({children, value}) =>
    React.cloneElement(Children.only(children), {
        style: {
            ...children.style,
            backgroundColor: value < CURRENT_DATE ? 'lightgreen' : 'lightblue',
        },
    });

const MyCalendar = props => (
    <div style={{height: '100vh', margin: '10px'}}>
        <BigCalendar
            events={[]}
            startAccessor="startDate"
            endAccessor="endDate"
            components={{
                // you have to pass your custom wrapper here
                // so that it actually gets used
                dateCellWrapper: ColoredDateCellWrapper,
            }}
        />
    </div>
);

Working Example:

Edit jp1931172w

It has the following type definition:

{
  event?: ReactClass<any>,
  eventWrapper?: ReactClass<any>,
  dayWrapper?: ReactClass<any>,
  dateCellWrapper?: ReactClass<any>,
  toolbar?: ReactClass<any>,
  agenda?: {
    date?: ReactClass<any>,
    time?: ReactClass<any>,
    event?: ReactClass<any>
  },
  day?: {
    header?: ReactClass<any>,
    event?: ReactClass<any>
  },
  week?: {
    header?: ReactClass<any>,
    event?: ReactClass<any>
  },
  month?: {
    header?: ReactClass<any>,
    dateHeader?: ReactClass<any>,
    event?: ReactClass<any>
  }
}
trixn
  • 15,761
  • 2
  • 38
  • 55
  • I have implemented a very similar solution to dynamically style date-ranges. However, my child component is not updating on state change.... How can I get the children accessed in ```components={{ dateCellWrapper: ColoredDateCellWrapper, }}``` to update props? – clayton groth Aug 28 '19 at 17:48
  • @claytongroth It's hard to evaluate that without any code. If you can share it in a codesandbox I will have a short look into it. – trixn Aug 28 '19 at 17:51
  • coming up hang on – clayton groth Aug 28 '19 at 17:54
  • I just posted a new question here: https://stackoverflow.com/questions/57697916/react-big-calendar-component-children-not-updating-on-state-update – clayton groth Aug 28 '19 at 18:07