sanity-plugin-recurring-dates 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -71,6 +71,17 @@ export default defineConfig({
71
71
 
72
72
  // Changes the date picker to date only, no time
73
73
  dateOnly: true, // defaults to false
74
+
75
+ // Change the field titles and descriptions
76
+ // field names will remain "startDate" and "endDate"
77
+ fieldTitles: {
78
+ startDate: 'Event starts',
79
+ endDate: 'Event ends',
80
+ },
81
+ fieldDescriptions: {
82
+ startDate: 'This is the date the event starts',
83
+ endDate: 'This is the date the event ends',
84
+ },
74
85
  }),
75
86
  ],
76
87
  })
@@ -114,6 +125,17 @@ defineField({
114
125
  startDate: (Rule) => Rule.required() // defaults to (Rule) => Rule.required()
115
126
  endDate: (Rule) => Rule.min(Rule.valueOfField('startDate')) // defaults to (Rule) => Rule.min(Rule.valueOfField('startDate'))
116
127
  }
128
+
129
+ // Change the field titles and descriptions
130
+ // field names will remain "startDate" and "endDate"
131
+ fieldTitles: {
132
+ startDate: 'Event starts',
133
+ endDate: 'Event ends',
134
+ },
135
+ fieldDescriptions: {
136
+ startDate: 'This is the date the event starts',
137
+ endDate: 'This is the date the event ends',
138
+ },
117
139
  },
118
140
  })
119
141
  ```
package/dist/index.d.ts CHANGED
@@ -13,6 +13,14 @@ export declare interface PluginConfig {
13
13
  startDate?: (Rule: DateRule) => DateRule
14
14
  endDate?: (Rule: DateRule) => DateRule
15
15
  }
16
+ fieldTitles?: {
17
+ startDate?: string
18
+ endDate?: string
19
+ }
20
+ fieldDescriptions?: {
21
+ startDate?: string
22
+ endDate?: string
23
+ }
16
24
  }
17
25
 
18
26
  export declare interface RecurringDate {
package/dist/index.esm.js CHANGED
@@ -5,7 +5,7 @@ import { Card, Text, Box, Grid, TextInput, useForwardedRef, Flex, Select, Button
5
5
  import { range, upperFirst } from 'lodash';
6
6
  import * as React from 'react';
7
7
  import React__default, { useState, useEffect, PureComponent, useCallback, forwardRef, useRef, useMemo } from 'react';
8
- import { rrulestr, Weekday, RRule } from 'rrule';
8
+ import { rrulestr, Weekday, RRule, datetime } from 'rrule';
9
9
  import { Feedback } from 'sanity-plugin-utils';
10
10
  import { toDate as toDate$1, format as format$1 } from 'date-fns-tz';
11
11
  import { format, parse, DEFAULT_DATE_FORMAT as DEFAULT_DATE_FORMAT$1, DEFAULT_TIME_FORMAT } from '@sanity/util/legacyDateFormat';
@@ -4357,6 +4357,7 @@ function CustomRule(_ref8) {
4357
4357
  onChange,
4358
4358
  initialValue,
4359
4359
  startDate,
4360
+ endDate,
4360
4361
  dateTimeOptions
4361
4362
  } = _ref8;
4362
4363
  const initialRule = useMemo(() => {
@@ -4367,6 +4368,7 @@ function CustomRule(_ref8) {
4367
4368
  const [count, setCount] = useState(initialRule.origOptions.count || null);
4368
4369
  const [until, setUntil] = useState(initialRule.origOptions.until || null);
4369
4370
  const [byweekday, setByweekday] = useState(initialRule.origOptions.byweekday || null);
4371
+ const [untilValid, setUntilValid] = useState(true);
4370
4372
  const handleChange = useCallback(event => {
4371
4373
  const {
4372
4374
  name,
@@ -4396,9 +4398,15 @@ function CustomRule(_ref8) {
4396
4398
  }, [frequency, startDate]);
4397
4399
  const handleUntilChange = useCallback(date => {
4398
4400
  if (date) {
4399
- setUntil(toDate$1(`${date}T23:59:59`));
4401
+ const untilDate = toDate$1(`${date}T23:59:59`);
4402
+ if (endDate && untilDate < toDate$1(endDate) || startDate && untilDate < toDate$1(startDate)) {
4403
+ setUntilValid(false);
4404
+ } else {
4405
+ setUntilValid(true);
4406
+ }
4407
+ setUntil(untilDate);
4400
4408
  }
4401
- }, []);
4409
+ }, [endDate, startDate]);
4402
4410
  const handleEndChange = useCallback(event => {
4403
4411
  const {
4404
4412
  value
@@ -4537,6 +4545,12 @@ function CustomRule(_ref8) {
4537
4545
  value: until ? formatUntilValue(new Date(until)) : formatUntilValue(getUntilDate()),
4538
4546
  readOnly: !until
4539
4547
  })
4548
+ }), !untilValid && /* @__PURE__ */jsx(Feedback, {
4549
+ tone: "critical",
4550
+ children: /* @__PURE__ */jsx(Text, {
4551
+ size: 1,
4552
+ children: "Until date must be after event ends"
4553
+ })
4540
4554
  })]
4541
4555
  }), /* @__PURE__ */jsxs(Flex, {
4542
4556
  gap: 2,
@@ -4590,7 +4604,8 @@ function CustomRule(_ref8) {
4590
4604
  }), /* @__PURE__ */jsx(Button, {
4591
4605
  text: "Done",
4592
4606
  tone: "positive",
4593
- onClick: handleConfirm
4607
+ onClick: handleConfirm,
4608
+ disabled: !untilValid
4594
4609
  })]
4595
4610
  })
4596
4611
  })]
@@ -4699,33 +4714,44 @@ function RecurringDates(props) {
4699
4714
  ...startDateMember?.field?.schemaType.options,
4700
4715
  ...dateTimeOptions
4701
4716
  };
4717
+ if (dateOnly === true) {
4718
+ startDateMember.field.schemaType.name = "date";
4719
+ } else {
4720
+ startDateMember.field.schemaType.name = "datetime";
4721
+ }
4722
+ if (validation?.startDate) {
4723
+ startDateMember.field.schemaType.validation = CustomValidation => validation?.startDate?.(CustomValidation);
4724
+ } else {
4725
+ startDateMember.field.schemaType.validation = DefaultRule => DefaultRule.required();
4726
+ }
4727
+ if (options?.fieldTitles?.startDate) {
4728
+ startDateMember.field.schemaType.title = options.fieldTitles.startDate;
4729
+ }
4730
+ if (options?.fieldDescriptions?.startDate) {
4731
+ startDateMember.field.schemaType.description = options.fieldDescriptions.startDate;
4732
+ }
4702
4733
  }
4703
4734
  if (endDateMember?.kind == "field") {
4704
4735
  endDateMember.field.schemaType.options = {
4705
4736
  ...endDateMember?.field?.schemaType.options,
4706
4737
  ...dateTimeOptions
4707
4738
  };
4708
- }
4709
- if (dateOnly === true) {
4710
- if (startDateMember?.kind == "field") {
4711
- startDateMember.field.schemaType.name = "date";
4712
- }
4713
- if (endDateMember?.kind == "field") {
4739
+ if (dateOnly === true) {
4714
4740
  endDateMember.field.schemaType.name = "date";
4741
+ } else {
4742
+ endDateMember.field.schemaType.name = "datetime";
4715
4743
  }
4716
- } else {
4717
- if (startDateMember?.kind == "field") {
4718
- startDateMember.field.schemaType.name = "datetime";
4744
+ if (validation?.endDate) {
4745
+ endDateMember.field.schemaType.validation = CustomValidation => validation?.endDate?.(CustomValidation);
4746
+ } else {
4747
+ endDateMember.field.schemaType.validation = DefaultRule => DefaultRule.min(DefaultRule.valueOfField("startDate"));
4719
4748
  }
4720
- if (endDateMember?.kind == "field") {
4721
- endDateMember.field.schemaType.name = "datetime";
4749
+ if (options?.fieldTitles?.endDate) {
4750
+ endDateMember.field.schemaType.title = options.fieldTitles.endDate;
4751
+ }
4752
+ if (options?.fieldDescriptions?.endDate) {
4753
+ endDateMember.field.schemaType.description = options.fieldDescriptions.endDate;
4722
4754
  }
4723
- }
4724
- if (validation?.startDate && startDateMember?.kind == "field") {
4725
- startDateMember.field.schemaType.validation = CustomValidation => validation?.startDate?.(CustomValidation);
4726
- }
4727
- if (validation?.endDate && endDateMember?.kind == "field") {
4728
- endDateMember.field.schemaType.validation = CustomValidation => validation?.endDate?.(CustomValidation);
4729
4755
  }
4730
4756
  const hasEndDate = currentValue?.endDate;
4731
4757
  return /* @__PURE__ */jsxs(Stack, {
@@ -4778,6 +4804,7 @@ function RecurringDates(props) {
4778
4804
  return null;
4779
4805
  }
4780
4806
  const rule = rrulestr(recurrence);
4807
+ rule.options.until = rule?.options?.until && datetime(rule?.options?.until?.getFullYear(), rule?.options?.until?.getMonth() + 1, rule?.options?.until?.getDate(), rule?.options?.until?.getHours(), rule?.options?.until?.getMinutes(), rule?.options?.until?.getSeconds());
4781
4808
  return /* @__PURE__ */jsx("option", {
4782
4809
  value: recurrence,
4783
4810
  children: upperFirst(rule.toText())
@@ -4795,6 +4822,7 @@ function RecurringDates(props) {
4795
4822
  onChange,
4796
4823
  initialValue: currentValue?.rrule,
4797
4824
  startDate: startDateMember?.kind == "field" ? startDateMember?.field?.value : void 0,
4825
+ endDate: endDateMember?.kind == "field" ? endDateMember?.field?.value : void 0,
4798
4826
  dateTimeOptions
4799
4827
  })]
4800
4828
  });
@@ -4816,6 +4844,9 @@ function RecurringDatesPreview(props) {
4816
4844
  ...options
4817
4845
  };
4818
4846
  const rule = rrule && rrulestr(rrule);
4847
+ if (rule) {
4848
+ rule.options.until = rule?.options?.until && datetime(rule?.options?.until?.getFullYear(), rule?.options?.until?.getMonth() + 1, rule?.options?.until?.getDate(), rule?.options?.until?.getHours(), rule?.options?.until?.getMinutes(), rule?.options?.until?.getSeconds());
4849
+ }
4819
4850
  const dateFormat = dateTimeOptions?.dateFormat || DEFAULT_DATE_FORMAT$1;
4820
4851
  const timeFormat = dateTimeOptions?.timeFormat || DEFAULT_TIME_FORMAT;
4821
4852
  const start = startDate ? new Date(startDate) : void 0;
@@ -4846,7 +4877,9 @@ var recurringDateSchema = config => {
4846
4877
  const {
4847
4878
  dateTimeOptions,
4848
4879
  dateOnly,
4849
- validation
4880
+ validation,
4881
+ fieldTitles,
4882
+ fieldDescriptions
4850
4883
  } = config;
4851
4884
  return defineField({
4852
4885
  name: "recurringDates",
@@ -4854,13 +4887,15 @@ var recurringDateSchema = config => {
4854
4887
  type: "object",
4855
4888
  icon: CalendarIcon,
4856
4889
  fields: [defineField({
4857
- title: "Start Date",
4890
+ title: fieldTitles?.startDate || "Start Date",
4891
+ description: fieldDescriptions?.startDate || "",
4858
4892
  name: "startDate",
4859
4893
  type: dateOnly ? "date" : "datetime",
4860
4894
  options: dateTimeOptions,
4861
4895
  validation: Rule => validation?.startDate ? validation.startDate(Rule) : Rule.required()
4862
4896
  }), defineField({
4863
- title: "End Date",
4897
+ title: fieldTitles?.endDate || "End Date",
4898
+ description: fieldDescriptions?.endDate || "",
4864
4899
  name: "endDate",
4865
4900
  type: dateOnly ? "date" : "datetime",
4866
4901
  options: dateTimeOptions,