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 +22 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.esm.js +59 -24
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +58 -23
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/CustomRule/CustomRule.tsx +31 -7
- package/src/components/RecurringDate.tsx +59 -24
- package/src/components/RecurringDatesPreview.tsx +14 -1
- package/src/schema/recurringDates.tsx +5 -3
- package/src/types.ts +8 -0
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
|
-
|
|
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
|
-
|
|
4717
|
-
|
|
4718
|
-
|
|
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 (
|
|
4721
|
-
endDateMember.field.schemaType.
|
|
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,
|