use super::{ConditionalFormat, ConditionalFormatTypes};
use crate::Format;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum ConditionalFormatTimePeriodCriteria {
Yesterday,
Today,
Tomorrow,
Last7Days,
LastWeek,
ThisWeek,
NextWeek,
LastMonth,
ThisMonth,
NextMonth,
}
impl ConditionalFormatTimePeriodCriteria {
pub(crate) fn to_internal_value(
self,
conditional_format: &mut libxlsxwriter_sys::lxw_conditional_format,
) {
conditional_format.type_ =
libxlsxwriter_sys::lxw_conditional_format_types_LXW_CONDITIONAL_TYPE_TIME_PERIOD as u8;
match self {
ConditionalFormatTimePeriodCriteria::Yesterday => {
conditional_format.criteria = libxlsxwriter_sys::lxw_conditional_criteria_LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_YESTERDAY as u8;
}
ConditionalFormatTimePeriodCriteria::Today => {
conditional_format.criteria = libxlsxwriter_sys::lxw_conditional_criteria_LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_TODAY as u8;
}
ConditionalFormatTimePeriodCriteria::Tomorrow => {
conditional_format.criteria = libxlsxwriter_sys::lxw_conditional_criteria_LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_TOMORROW as u8;
}
ConditionalFormatTimePeriodCriteria::Last7Days => {
conditional_format.criteria = libxlsxwriter_sys::lxw_conditional_criteria_LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_LAST_7_DAYS as u8;
}
ConditionalFormatTimePeriodCriteria::LastWeek => {
conditional_format.criteria = libxlsxwriter_sys::lxw_conditional_criteria_LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_LAST_WEEK as u8;
}
ConditionalFormatTimePeriodCriteria::ThisWeek => {
conditional_format.criteria = libxlsxwriter_sys::lxw_conditional_criteria_LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_THIS_WEEK as u8;
}
ConditionalFormatTimePeriodCriteria::NextWeek => {
conditional_format.criteria = libxlsxwriter_sys::lxw_conditional_criteria_LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_NEXT_WEEK as u8;
}
ConditionalFormatTimePeriodCriteria::LastMonth => {
conditional_format.criteria = libxlsxwriter_sys::lxw_conditional_criteria_LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_LAST_MONTH as u8;
}
ConditionalFormatTimePeriodCriteria::ThisMonth => {
conditional_format.criteria = libxlsxwriter_sys::lxw_conditional_criteria_LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_THIS_MONTH as u8;
}
ConditionalFormatTimePeriodCriteria::NextMonth => {
conditional_format.criteria = libxlsxwriter_sys::lxw_conditional_criteria_LXW_CONDITIONAL_CRITERIA_TIME_PERIOD_NEXT_MONTH as u8;
}
}
}
}
impl ConditionalFormat {
#[must_use]
pub fn time_period(
time_period: ConditionalFormatTimePeriodCriteria,
format: &Format,
) -> ConditionalFormat {
ConditionalFormat::ConditionType {
criteria: ConditionalFormatTypes::TimePeriod(time_period),
format: format.clone(),
}
}
}
#[cfg(test)]
mod test {
use chrono::Months;
use crate::*;
#[cfg(feature = "chrono")]
#[test]
fn test_worksheet_conditional_format2() -> Result<(), XlsxError> {
use crate::{conditional_format::*, DateTime};
use chrono::Days;
use std::convert::TryInto;
let workbook = Workbook::new("test-worksheet_conditional-format2.xlsx")?;
let mut worksheet = workbook.add_worksheet(Some("Conditional format"))?;
let today = chrono::Local::now().naive_local().date();
let two_month_ago = today.checked_sub_months(Months::new(2)).unwrap();
let last_month = today.checked_sub_months(Months::new(1)).unwrap();
let mut date_format = Format::new();
date_format.set_num_format("yyyy/m/d (ddd)");
let mut yellow_background = Format::new();
yellow_background.set_bg_color(FormatColor::Yellow);
worksheet.write_string(1, 0, "Two month ago", None)?;
for i in 1..11 {
worksheet.write_datetime(1, i, &two_month_ago.into(), Some(&date_format))?;
}
worksheet.write_string(2, 0, "Last month", None)?;
for i in 1..11 {
worksheet.write_datetime(2, i, &last_month.into(), Some(&date_format))?;
}
for d in 0..=30 {
let day: DateTime = if d <= 15 {
worksheet.write_string(d + 3, 0, &format!("Today - {}", 15 - d), None)?;
today
.checked_sub_days(Days::new((15 - d).try_into().unwrap()))
.unwrap()
} else {
worksheet.write_string(d + 3, 0, &format!("Today + {}", d - 15), None)?;
today.checked_add_days(Days::new((d - 15).into())).unwrap()
}
.into();
for i in 1..11 {
worksheet.write_datetime(d + 3, i, &day, Some(&date_format))?;
}
}
let next_month = today.checked_add_months(Months::new(1)).unwrap();
let two_month_after = today.checked_add_months(Months::new(2)).unwrap();
worksheet.write_string(34, 0, "Next month", None)?;
for i in 1..11 {
worksheet.write_datetime(34, i, &next_month.into(), Some(&date_format))?;
}
worksheet.write_string(35, 0, "Two month after", None)?;
for i in 1..11 {
worksheet.write_datetime(35, i, &two_month_after.into(), Some(&date_format))?;
}
worksheet.set_column(0, 10, 20.0, None)?;
worksheet.write_string(0, 1, "Today", None)?;
worksheet.conditional_format_range(
1,
1,
35,
1,
&ConditionalFormat::time_period(
ConditionalFormatTimePeriodCriteria::Today,
&yellow_background,
),
)?;
worksheet.write_string(0, 2, "Yesterday", None)?;
worksheet.conditional_format_range(
1,
2,
35,
2,
&ConditionalFormat::time_period(
ConditionalFormatTimePeriodCriteria::Yesterday,
&yellow_background,
),
)?;
worksheet.write_string(0, 3, "Tomorrow", None)?;
worksheet.conditional_format_range(
1,
3,
35,
3,
&ConditionalFormat::time_period(
ConditionalFormatTimePeriodCriteria::Tomorrow,
&yellow_background,
),
)?;
worksheet.write_string(0, 4, "Last 7 days", None)?;
worksheet.conditional_format_range(
1,
4,
35,
4,
&ConditionalFormat::time_period(
ConditionalFormatTimePeriodCriteria::Last7Days,
&yellow_background,
),
)?;
worksheet.write_string(0, 5, "Last week", None)?;
worksheet.conditional_format_range(
1,
5,
35,
5,
&ConditionalFormat::time_period(
ConditionalFormatTimePeriodCriteria::LastWeek,
&yellow_background,
),
)?;
worksheet.write_string(0, 6, "This week", None)?;
worksheet.conditional_format_range(
1,
6,
35,
6,
&ConditionalFormat::time_period(
ConditionalFormatTimePeriodCriteria::ThisWeek,
&yellow_background,
),
)?;
worksheet.write_string(0, 7, "Next week", None)?;
worksheet.conditional_format_range(
1,
7,
35,
7,
&ConditionalFormat::time_period(
ConditionalFormatTimePeriodCriteria::NextWeek,
&yellow_background,
),
)?;
worksheet.write_string(0, 8, "Last month", None)?;
worksheet.conditional_format_range(
1,
8,
35,
8,
&ConditionalFormat::time_period(
ConditionalFormatTimePeriodCriteria::LastMonth,
&yellow_background,
),
)?;
worksheet.write_string(0, 9, "This month", None)?;
worksheet.conditional_format_range(
1,
9,
35,
9,
&ConditionalFormat::time_period(
ConditionalFormatTimePeriodCriteria::ThisMonth,
&yellow_background,
),
)?;
worksheet.write_string(0, 10, "Next month", None)?;
worksheet.conditional_format_range(
1,
10,
35,
10,
&ConditionalFormat::time_period(
ConditionalFormatTimePeriodCriteria::NextMonth,
&yellow_background,
),
)?;
Ok(())
}
}