@primer/components 0.0.0-20219293614 → 0.0.0-2021931194230
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/CHANGELOG.md +1 -7
- package/dist/browser.esm.js +439 -436
- package/dist/browser.esm.js.map +1 -1
- package/dist/browser.umd.js +443 -440
- package/dist/browser.umd.js.map +1 -1
- package/lib/ActionList/Item.d.ts +0 -6
- package/lib/ActionList/Item.js +1 -5
- package/lib/ActionMenu.js +2 -2
- package/lib/AnchoredOverlay/AnchoredOverlay.d.ts +4 -2
- package/lib/Autocomplete/Autocomplete.d.ts +13 -11
- package/lib/Autocomplete/AutocompleteInput.d.ts +13 -11
- package/lib/Button/Button.d.ts +11 -11
- package/lib/Button/ButtonBase.d.ts +1 -1
- package/lib/Button/ButtonClose.d.ts +29 -29
- package/lib/Button/ButtonDanger.d.ts +11 -11
- package/lib/Button/ButtonInvisible.d.ts +11 -11
- package/lib/Button/ButtonOutline.d.ts +11 -11
- package/lib/Button/ButtonPrimary.d.ts +11 -11
- package/lib/Button/ButtonStyles.js +1 -1
- package/lib/CircleBadge.d.ts +2 -2
- package/lib/CircleOcticon.d.ts +33 -33
- package/lib/DatePicker/DatePicker.d.ts +48 -0
- package/lib/DatePicker/DatePicker.js +106 -0
- package/lib/DatePicker/DatePickerAnchor.d.ts +5 -0
- package/lib/DatePicker/DatePickerAnchor.js +223 -0
- package/lib/DatePicker/DatePickerOverlay.d.ts +3 -0
- package/lib/DatePicker/DatePickerOverlay.js +48 -0
- package/lib/DatePicker/DatePickerPanel.d.ts +2 -0
- package/lib/DatePicker/DatePickerPanel.js +143 -0
- package/lib/DatePicker/Day.d.ts +14 -0
- package/lib/DatePicker/Day.js +192 -0
- package/lib/DatePicker/Month.d.ts +9 -0
- package/lib/DatePicker/Month.js +122 -0
- package/lib/DatePicker/dateParser.d.ts +11 -0
- package/lib/DatePicker/dateParser.js +192 -0
- package/lib/DatePicker/index.d.ts +2 -0
- package/lib/DatePicker/index.js +13 -0
- package/lib/DatePicker/useDatePicker.d.ts +89 -0
- package/lib/DatePicker/useDatePicker.js +439 -0
- package/lib/Dialog/Dialog.d.ts +4 -4
- package/lib/Dialog/Dialog.js +22 -12
- package/lib/Dialog.d.ts +35 -35
- package/lib/Dropdown.d.ts +165 -85
- package/lib/Dropdown.js +5 -6
- package/lib/DropdownMenu/DropdownButton.d.ts +30 -30
- package/lib/FilterList.d.ts +26 -26
- package/lib/Label.d.ts +1 -1
- package/lib/Position.d.ts +4 -4
- package/lib/ProgressBar.d.ts +1 -1
- package/lib/SelectMenu/SelectMenu.d.ts +153 -151
- package/lib/SelectMenu/SelectMenuItem.d.ts +1 -1
- package/lib/SelectMenu/SelectMenuModal.d.ts +1 -1
- package/lib/TextInputWithTokens.d.ts +13 -11
- package/lib/Timeline.d.ts +33 -33
- package/lib/Token/AvatarToken.d.ts +1 -1
- package/lib/Token/IssueLabelToken.d.ts +1 -1
- package/lib/Token/Token.d.ts +1 -1
- package/lib/_TextInputWrapper.d.ts +1 -1
- package/lib/constants.js +1 -3
- package/lib/hooks/useDebounce.d.ts +2 -0
- package/lib/hooks/useDebounce.js +24 -0
- package/lib/hooks/useResizeObserver.d.ts +1 -1
- package/lib/hooks/useResizeObserver.js +1 -1
- package/lib/index.d.ts +0 -2
- package/lib/index.js +0 -8
- package/lib/theme-preval.js +2 -2
- package/lib/utils/testing.d.ts +1 -1
- package/lib-esm/ActionList/Item.d.ts +0 -6
- package/lib-esm/ActionList/Item.js +1 -5
- package/lib-esm/ActionMenu.js +2 -2
- package/lib-esm/AnchoredOverlay/AnchoredOverlay.d.ts +4 -2
- package/lib-esm/Autocomplete/Autocomplete.d.ts +13 -11
- package/lib-esm/Autocomplete/AutocompleteInput.d.ts +13 -11
- package/lib-esm/Button/Button.d.ts +11 -11
- package/lib-esm/Button/ButtonBase.d.ts +1 -1
- package/lib-esm/Button/ButtonClose.d.ts +29 -29
- package/lib-esm/Button/ButtonDanger.d.ts +11 -11
- package/lib-esm/Button/ButtonInvisible.d.ts +11 -11
- package/lib-esm/Button/ButtonOutline.d.ts +11 -11
- package/lib-esm/Button/ButtonPrimary.d.ts +11 -11
- package/lib-esm/Button/ButtonStyles.js +1 -1
- package/lib-esm/CircleBadge.d.ts +2 -2
- package/lib-esm/CircleOcticon.d.ts +33 -33
- package/lib-esm/DatePicker/DatePicker.d.ts +48 -0
- package/lib-esm/DatePicker/DatePicker.js +89 -0
- package/lib-esm/DatePicker/DatePickerAnchor.d.ts +5 -0
- package/lib-esm/DatePicker/DatePickerAnchor.js +196 -0
- package/lib-esm/DatePicker/DatePickerOverlay.d.ts +3 -0
- package/lib-esm/DatePicker/DatePickerOverlay.js +29 -0
- package/lib-esm/DatePicker/DatePickerPanel.d.ts +2 -0
- package/lib-esm/DatePicker/DatePickerPanel.js +116 -0
- package/lib-esm/DatePicker/Day.d.ts +14 -0
- package/lib-esm/DatePicker/Day.js +169 -0
- package/lib-esm/DatePicker/Month.d.ts +9 -0
- package/lib-esm/DatePicker/Month.js +98 -0
- package/lib-esm/DatePicker/dateParser.d.ts +11 -0
- package/lib-esm/DatePicker/dateParser.js +178 -0
- package/lib-esm/DatePicker/index.d.ts +2 -0
- package/lib-esm/DatePicker/index.js +1 -0
- package/lib-esm/DatePicker/useDatePicker.d.ts +89 -0
- package/lib-esm/DatePicker/useDatePicker.js +408 -0
- package/lib-esm/Dialog/Dialog.d.ts +4 -4
- package/lib-esm/Dialog/Dialog.js +21 -12
- package/lib-esm/Dialog.d.ts +35 -35
- package/lib-esm/Dropdown.d.ts +165 -85
- package/lib-esm/Dropdown.js +3 -4
- package/lib-esm/DropdownMenu/DropdownButton.d.ts +30 -30
- package/lib-esm/FilterList.d.ts +26 -26
- package/lib-esm/Label.d.ts +1 -1
- package/lib-esm/Position.d.ts +4 -4
- package/lib-esm/ProgressBar.d.ts +1 -1
- package/lib-esm/SelectMenu/SelectMenu.d.ts +153 -151
- package/lib-esm/SelectMenu/SelectMenuItem.d.ts +1 -1
- package/lib-esm/SelectMenu/SelectMenuModal.d.ts +1 -1
- package/lib-esm/TextInputWithTokens.d.ts +13 -11
- package/lib-esm/Timeline.d.ts +33 -33
- package/lib-esm/Token/AvatarToken.d.ts +1 -1
- package/lib-esm/Token/IssueLabelToken.d.ts +1 -1
- package/lib-esm/Token/Token.d.ts +1 -1
- package/lib-esm/_TextInputWrapper.d.ts +1 -1
- package/lib-esm/constants.js +1 -3
- package/lib-esm/hooks/useDebounce.d.ts +2 -0
- package/lib-esm/hooks/useDebounce.js +16 -0
- package/lib-esm/hooks/useResizeObserver.d.ts +1 -1
- package/lib-esm/hooks/useResizeObserver.js +1 -1
- package/lib-esm/index.d.ts +0 -2
- package/lib-esm/index.js +0 -1
- package/lib-esm/theme-preval.js +2 -2
- package/lib-esm/utils/testing.d.ts +1 -1
- package/package.json +14 -13
- package/lib/NewButton/button.d.ts +0 -579
- package/lib/NewButton/button.js +0 -298
- package/lib/NewButton/counter.d.ts +0 -6
- package/lib/NewButton/counter.js +0 -33
- package/lib/NewButton/index.d.ts +0 -4
- package/lib/NewButton/index.js +0 -21
- package/lib-esm/NewButton/button.d.ts +0 -579
- package/lib-esm/NewButton/button.js +0 -274
- package/lib-esm/NewButton/counter.d.ts +0 -6
- package/lib-esm/NewButton/counter.js +0 -21
- package/lib-esm/NewButton/index.d.ts +0 -4
- package/lib-esm/NewButton/index.js +0 -3
@@ -0,0 +1,439 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.isSingleSelection = isSingleSelection;
|
7
|
+
exports.isMultiSelection = isMultiSelection;
|
8
|
+
exports.isRangeSelection = isRangeSelection;
|
9
|
+
exports.isStringRangeSelection = isStringRangeSelection;
|
10
|
+
exports.DatePickerProvider = exports.default = void 0;
|
11
|
+
|
12
|
+
var _octiconsReact = require("@primer/octicons-react");
|
13
|
+
|
14
|
+
var _dateFns = require("date-fns");
|
15
|
+
|
16
|
+
var _deepmerge = _interopRequireDefault(require("deepmerge"));
|
17
|
+
|
18
|
+
var _react = _interopRequireWildcard(require("react"));
|
19
|
+
|
20
|
+
var _ = require("..");
|
21
|
+
|
22
|
+
var _dateParser = require("./dateParser");
|
23
|
+
|
24
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
25
|
+
|
26
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
27
|
+
|
28
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
29
|
+
|
30
|
+
const DatePickerContext = /*#__PURE__*/(0, _react.createContext)(null);
|
31
|
+
|
32
|
+
const useDatePicker = date => {
|
33
|
+
const value = (0, _react.useContext)(DatePickerContext);
|
34
|
+
const [selected, setSelected] = (0, _react.useState)(false);
|
35
|
+
const today = date ? (0, _dateFns.isToday)(date) : false;
|
36
|
+
|
37
|
+
if (!value) {
|
38
|
+
throw new Error('useDatePicker must be used inside a DatePickerProvider');
|
39
|
+
}
|
40
|
+
|
41
|
+
(0, _react.useEffect)(() => {
|
42
|
+
if (date) {
|
43
|
+
if (value.hoverRange) {
|
44
|
+
if (isRangeSelection(value.hoverRange)) {
|
45
|
+
if ((0, _dateFns.isEqual)(date, value.hoverRange.from)) {
|
46
|
+
setSelected('start');
|
47
|
+
} else if (value.hoverRange.to && (0, _dateFns.isEqual)(date, value.hoverRange.to)) {
|
48
|
+
setSelected('end');
|
49
|
+
} else if ((0, _dateFns.isAfter)(date, value.hoverRange.from) && value.hoverRange.to && (0, _dateFns.isBefore)(date, value.hoverRange.to)) {
|
50
|
+
setSelected('middle');
|
51
|
+
} else {
|
52
|
+
setSelected(false);
|
53
|
+
}
|
54
|
+
}
|
55
|
+
} else if (value.selection) {
|
56
|
+
if (isMultiSelection(value.selection)) {
|
57
|
+
setSelected(!!value.selection.find(d => (0, _dateFns.isEqual)(d, date)));
|
58
|
+
} else if (isRangeSelection(value.selection)) {
|
59
|
+
if ((0, _dateFns.isEqual)(date, value.selection.from)) {
|
60
|
+
setSelected('start');
|
61
|
+
} else if (value.selection.to && (0, _dateFns.isEqual)(date, value.selection.to)) {
|
62
|
+
setSelected('end');
|
63
|
+
} else if ((0, _dateFns.isAfter)(date, value.selection.from) && value.selection.to && (0, _dateFns.isBefore)(date, value.selection.to)) {
|
64
|
+
setSelected('middle');
|
65
|
+
} else {
|
66
|
+
setSelected(false);
|
67
|
+
}
|
68
|
+
} else {
|
69
|
+
setSelected((0, _dateFns.isEqual)(date, value.selection));
|
70
|
+
}
|
71
|
+
}
|
72
|
+
}
|
73
|
+
}, [date, value.hoverRange, value.selection, today]);
|
74
|
+
let blocked,
|
75
|
+
disabled = false;
|
76
|
+
|
77
|
+
if (date) {
|
78
|
+
// Determine if date is blocked out
|
79
|
+
if (value.configuration.blockedDates) {
|
80
|
+
blocked = !!value.configuration.blockedDates.find(d => (0, _dateFns.isEqual)(d, date));
|
81
|
+
} // Determine if date is disabled
|
82
|
+
|
83
|
+
|
84
|
+
if (value.configuration.minDate || value.configuration.maxDate || value.configuration.disableWeekends) {
|
85
|
+
disabled = (value.configuration.minDate ? (0, _dateFns.isBefore)(date, value.configuration.minDate) : false) || (value.configuration.maxDate ? (0, _dateFns.isAfter)(date, value.configuration.maxDate) : false) || (value.configuration.disableWeekends ? (0, _dateFns.isWeekend)(date) : false);
|
86
|
+
}
|
87
|
+
}
|
88
|
+
|
89
|
+
return { ...value,
|
90
|
+
blocked,
|
91
|
+
disabled,
|
92
|
+
selected,
|
93
|
+
today
|
94
|
+
};
|
95
|
+
};
|
96
|
+
|
97
|
+
var _default = useDatePicker;
|
98
|
+
exports.default = _default;
|
99
|
+
|
100
|
+
function isSingleSelection(selection) {
|
101
|
+
return selection instanceof Date;
|
102
|
+
}
|
103
|
+
|
104
|
+
function isMultiSelection(selection) {
|
105
|
+
return Array.isArray(selection);
|
106
|
+
}
|
107
|
+
|
108
|
+
function isRangeSelection(selection) {
|
109
|
+
return !!selection.from;
|
110
|
+
}
|
111
|
+
|
112
|
+
function isStringRangeSelection(selection) {
|
113
|
+
return !!selection.from;
|
114
|
+
}
|
115
|
+
|
116
|
+
function parseSelection(selection, variant) {
|
117
|
+
if (!selection) return;
|
118
|
+
|
119
|
+
if (variant === 'multi') {
|
120
|
+
if (isMultiSelection(selection)) {
|
121
|
+
const parsedSelection = [];
|
122
|
+
|
123
|
+
for (const d of selection) {
|
124
|
+
parsedSelection.push(new Date(new Date(d).toDateString()));
|
125
|
+
}
|
126
|
+
|
127
|
+
return parsedSelection.sort((a, b) => a.getTime() - b.getTime());
|
128
|
+
} else if (selection instanceof Date) {
|
129
|
+
return [new Date(new Date(selection).toDateString())];
|
130
|
+
} else if (isRangeSelection(selection)) {
|
131
|
+
const parsedSelection = [];
|
132
|
+
parsedSelection.push(new Date(new Date(selection.from).toDateString()));
|
133
|
+
|
134
|
+
if (selection.to) {
|
135
|
+
parsedSelection.push(new Date(new Date(selection.to).toDateString()));
|
136
|
+
}
|
137
|
+
|
138
|
+
return parsedSelection.sort((a, b) => a.getTime() - b.getTime());
|
139
|
+
}
|
140
|
+
} else if (variant === 'range') {
|
141
|
+
if (isRangeSelection(selection)) {
|
142
|
+
return {
|
143
|
+
from: new Date(new Date(selection.from).toDateString()),
|
144
|
+
to: selection.to ? new Date(new Date(selection.to).toDateString()) : null
|
145
|
+
};
|
146
|
+
} else if (isMultiSelection(selection)) {
|
147
|
+
return {
|
148
|
+
from: new Date(new Date(selection[0]).toDateString()),
|
149
|
+
to: selection[1] ? new Date(new Date(selection[1]).toDateString()) : null
|
150
|
+
};
|
151
|
+
} else if (selection instanceof Date) {
|
152
|
+
return {
|
153
|
+
from: new Date(new Date(selection).toDateString()),
|
154
|
+
to: null
|
155
|
+
};
|
156
|
+
}
|
157
|
+
} else {
|
158
|
+
if (selection instanceof Date) {
|
159
|
+
return new Date(new Date(selection).toDateString());
|
160
|
+
} else if (isMultiSelection(selection)) {
|
161
|
+
return new Date(new Date(selection[0]).toDateString());
|
162
|
+
} else if (isRangeSelection(selection)) {
|
163
|
+
return new Date(new Date(selection.from).toDateString());
|
164
|
+
} else {
|
165
|
+
return;
|
166
|
+
}
|
167
|
+
}
|
168
|
+
}
|
169
|
+
|
170
|
+
const defaultConfiguration = {
|
171
|
+
anchorVariant: 'button',
|
172
|
+
confirmation: false,
|
173
|
+
confirmUnsavedClose: false,
|
174
|
+
disableWeekends: false,
|
175
|
+
iconPlacement: 'start',
|
176
|
+
placeholder: 'Select a Date...',
|
177
|
+
showInputPrompt: false,
|
178
|
+
variant: 'single',
|
179
|
+
view: '2-month',
|
180
|
+
weekStartsOn: 'Sunday'
|
181
|
+
};
|
182
|
+
|
183
|
+
const DatePickerProvider = ({
|
184
|
+
configuration: externalConfig = {},
|
185
|
+
children,
|
186
|
+
closePicker,
|
187
|
+
value
|
188
|
+
}) => {
|
189
|
+
const [configuration, setConfiguration] = (0, _react.useState)((0, _deepmerge.default)(defaultConfiguration, externalConfig));
|
190
|
+
const [previousSelection, setPreviousSelection] = (0, _react.useState)(parseSelection(value, configuration.variant));
|
191
|
+
const [isDirty, setIsDirty] = (0, _react.useState)(false);
|
192
|
+
const [selection, setSelection] = (0, _react.useState)(parseSelection(value, configuration.variant));
|
193
|
+
const [hoverRange, setHoverRange] = (0, _react.useState)(null);
|
194
|
+
const [currentViewingDate, setCurrentViewingDate] = (0, _react.useState)(new Date());
|
195
|
+
const confirm = (0, _.useConfirm)();
|
196
|
+
(0, _react.useEffect)(() => {
|
197
|
+
setConfiguration((0, _deepmerge.default)(defaultConfiguration, externalConfig));
|
198
|
+
setSelection(parseSelection(selection, configuration.variant)); // Don't want this to run every time selection gets updated
|
199
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
200
|
+
}, [configuration.variant, externalConfig]);
|
201
|
+
const goToMonth = (0, _react.useCallback)(date => {
|
202
|
+
setCurrentViewingDate(new Date(new Date(date).toDateString()));
|
203
|
+
}, []);
|
204
|
+
const nextMonth = (0, _react.useCallback)(() => {
|
205
|
+
setCurrentViewingDate((0, _dateFns.addMonths)(currentViewingDate, 1));
|
206
|
+
}, [currentViewingDate]);
|
207
|
+
const previousMonth = (0, _react.useCallback)(() => {
|
208
|
+
setCurrentViewingDate((0, _dateFns.subMonths)(currentViewingDate, 1));
|
209
|
+
}, [currentViewingDate]);
|
210
|
+
const getFormattedDate = (0, _react.useMemo)(() => {
|
211
|
+
const {
|
212
|
+
anchorVariant,
|
213
|
+
dateFormat,
|
214
|
+
placeholder,
|
215
|
+
variant
|
216
|
+
} = configuration;
|
217
|
+
return (0, _dateParser.formatDate)({
|
218
|
+
selection,
|
219
|
+
anchorVariant,
|
220
|
+
dateFormat,
|
221
|
+
placeholder,
|
222
|
+
variant
|
223
|
+
});
|
224
|
+
}, [configuration, selection]);
|
225
|
+
const saveValue = (0, _react.useCallback)(updatedSelection => {
|
226
|
+
setPreviousSelection(updatedSelection !== null && updatedSelection !== void 0 ? updatedSelection : selection);
|
227
|
+
setIsDirty(false);
|
228
|
+
closePicker === null || closePicker === void 0 ? void 0 : closePicker();
|
229
|
+
}, [closePicker, selection]);
|
230
|
+
const revertValue = (0, _react.useCallback)(() => {
|
231
|
+
setSelection(previousSelection);
|
232
|
+
setIsDirty(false);
|
233
|
+
}, [previousSelection]);
|
234
|
+
const handleClose = (0, _react.useCallback)(async () => {
|
235
|
+
if (configuration.confirmUnsavedClose) {
|
236
|
+
if (isDirty) {
|
237
|
+
const result = await confirm({
|
238
|
+
title: 'Save Changes?',
|
239
|
+
content: 'You have unsaved changes, would you like to save them?',
|
240
|
+
confirmButtonContent: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_octiconsReact.CheckIcon, null), /*#__PURE__*/_react.default.createElement(_.Text, {
|
241
|
+
sx: {
|
242
|
+
ml: 1
|
243
|
+
}
|
244
|
+
}, "Save")),
|
245
|
+
cancelButtonContent: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_octiconsReact.TrashIcon, null), /*#__PURE__*/_react.default.createElement(_.Text, {
|
246
|
+
sx: {
|
247
|
+
ml: 1
|
248
|
+
}
|
249
|
+
}, "Discard"))
|
250
|
+
});
|
251
|
+
|
252
|
+
if (result) {
|
253
|
+
saveValue();
|
254
|
+
} else {
|
255
|
+
revertValue();
|
256
|
+
}
|
257
|
+
}
|
258
|
+
} else if (isDirty) revertValue();
|
259
|
+
}, [configuration.confirmUnsavedClose, confirm, isDirty, revertValue, saveValue]);
|
260
|
+
const inputHandler = (0, _react.useCallback)(updatedSelection => {
|
261
|
+
if (!updatedSelection) return;
|
262
|
+
const {
|
263
|
+
maxDate,
|
264
|
+
minDate,
|
265
|
+
variant,
|
266
|
+
maxSelections,
|
267
|
+
maxRangeSize
|
268
|
+
} = configuration;
|
269
|
+
|
270
|
+
switch (variant) {
|
271
|
+
case 'single':
|
272
|
+
{
|
273
|
+
if (updatedSelection instanceof Date) {
|
274
|
+
if (maxDate && (0, _dateFns.isAfter)(updatedSelection, maxDate)) {
|
275
|
+
setSelection(maxDate);
|
276
|
+
} else if (minDate && (0, _dateFns.isBefore)(minDate, updatedSelection)) {
|
277
|
+
setSelection(minDate);
|
278
|
+
} else {
|
279
|
+
setSelection(updatedSelection);
|
280
|
+
}
|
281
|
+
}
|
282
|
+
|
283
|
+
break;
|
284
|
+
}
|
285
|
+
|
286
|
+
case 'multi':
|
287
|
+
{
|
288
|
+
if (Array.isArray(updatedSelection)) {
|
289
|
+
let validSelections = updatedSelection.filter(d => (maxDate ? (0, _dateFns.isBefore)(d, maxDate) : true) && (minDate ? (0, _dateFns.isAfter)(d, minDate) : true));
|
290
|
+
|
291
|
+
if (maxSelections) {
|
292
|
+
validSelections = validSelections.slice(0, maxSelections);
|
293
|
+
}
|
294
|
+
|
295
|
+
setSelection(validSelections);
|
296
|
+
}
|
297
|
+
|
298
|
+
break;
|
299
|
+
}
|
300
|
+
|
301
|
+
case 'range':
|
302
|
+
{
|
303
|
+
if (isRangeSelection(updatedSelection)) {
|
304
|
+
const validRange = updatedSelection;
|
305
|
+
|
306
|
+
if (minDate) {
|
307
|
+
validRange.from = (0, _dateFns.isAfter)(updatedSelection.from, minDate) ? updatedSelection.from : minDate;
|
308
|
+
|
309
|
+
if (updatedSelection.to) {
|
310
|
+
validRange.to = (0, _dateFns.isAfter)(updatedSelection.to, minDate) ? updatedSelection.to : minDate;
|
311
|
+
}
|
312
|
+
}
|
313
|
+
|
314
|
+
if (maxDate) {
|
315
|
+
validRange.from = (0, _dateFns.isBefore)(updatedSelection.from, maxDate) ? updatedSelection.from : maxDate;
|
316
|
+
|
317
|
+
if (updatedSelection.to) {
|
318
|
+
validRange.to = (0, _dateFns.isBefore)(updatedSelection.to, maxDate) ? updatedSelection.to : maxDate;
|
319
|
+
}
|
320
|
+
}
|
321
|
+
|
322
|
+
if (maxRangeSize && validRange.to && Math.abs((0, _dateFns.differenceInDays)(validRange.from, validRange.to)) >= maxRangeSize) {
|
323
|
+
validRange.to = (0, _dateFns.addDays)(validRange.from, maxRangeSize - 1);
|
324
|
+
}
|
325
|
+
|
326
|
+
setSelection(updatedSelection);
|
327
|
+
}
|
328
|
+
|
329
|
+
break;
|
330
|
+
}
|
331
|
+
}
|
332
|
+
}, [configuration]);
|
333
|
+
const selectionHandler = (0, _react.useCallback)(date => {
|
334
|
+
setIsDirty(true);
|
335
|
+
|
336
|
+
if (configuration.variant === 'multi') {
|
337
|
+
const selections = [...selection];
|
338
|
+
const existingIndex = selections.findIndex(s => (0, _dateFns.isEqual)(s, date));
|
339
|
+
|
340
|
+
if (existingIndex > -1) {
|
341
|
+
selections.splice(existingIndex, 1);
|
342
|
+
setSelection(selections.sort((a, b) => a.getTime() - b.getTime()));
|
343
|
+
} else {
|
344
|
+
if (configuration.maxSelections && selections.length + 1 > configuration.maxSelections) return;
|
345
|
+
setSelection([...selections, date].sort((a, b) => a.getTime() - b.getTime()));
|
346
|
+
}
|
347
|
+
} else if (configuration.variant === 'range') {
|
348
|
+
if (selection && isRangeSelection(selection) && !selection.to) {
|
349
|
+
let toDate = date;
|
350
|
+
|
351
|
+
if (configuration.maxRangeSize && Math.abs((0, _dateFns.differenceInDays)(selection.from, date)) >= configuration.maxRangeSize) {
|
352
|
+
toDate = (0, _dateFns.isBefore)(date, selection.from) ? (0, _dateFns.subDays)(selection.from, configuration.maxRangeSize - 1) : (0, _dateFns.addDays)(selection.from, configuration.maxRangeSize - 1);
|
353
|
+
}
|
354
|
+
|
355
|
+
const updatedSelection = (0, _dateFns.isBefore)(toDate, selection.from) ? {
|
356
|
+
from: toDate,
|
357
|
+
to: selection.from
|
358
|
+
} : {
|
359
|
+
from: selection.from,
|
360
|
+
to: toDate
|
361
|
+
};
|
362
|
+
setSelection(updatedSelection);
|
363
|
+
setHoverRange(null);
|
364
|
+
|
365
|
+
if (!configuration.confirmation) {
|
366
|
+
saveValue(updatedSelection);
|
367
|
+
}
|
368
|
+
} else {
|
369
|
+
setHoverRange({
|
370
|
+
from: date,
|
371
|
+
to: date
|
372
|
+
});
|
373
|
+
setSelection({
|
374
|
+
from: date,
|
375
|
+
to: null
|
376
|
+
});
|
377
|
+
}
|
378
|
+
} else {
|
379
|
+
setSelection(date);
|
380
|
+
|
381
|
+
if (!configuration.confirmation) {
|
382
|
+
saveValue(date);
|
383
|
+
}
|
384
|
+
}
|
385
|
+
}, [configuration.confirmation, configuration.maxRangeSize, configuration.maxSelections, configuration.variant, saveValue, selection]);
|
386
|
+
const focusHnadler = (0, _react.useCallback)(date => {
|
387
|
+
if (!selection) return;
|
388
|
+
const {
|
389
|
+
minDate,
|
390
|
+
maxDate,
|
391
|
+
maxRangeSize,
|
392
|
+
variant
|
393
|
+
} = configuration;
|
394
|
+
|
395
|
+
if (variant === 'range' && isRangeSelection(selection) && hoverRange) {
|
396
|
+
let hoverDate = date;
|
397
|
+
if (minDate) hoverDate = (0, _dateFns.isBefore)(date, minDate) ? minDate : hoverDate;
|
398
|
+
if (maxDate) hoverDate = (0, _dateFns.isAfter)(date, maxDate) ? maxDate : hoverDate;
|
399
|
+
|
400
|
+
if (maxRangeSize && Math.abs((0, _dateFns.differenceInDays)(selection.from, hoverDate)) >= maxRangeSize) {
|
401
|
+
hoverDate = (0, _dateFns.isBefore)(hoverDate, selection.from) ? (0, _dateFns.subDays)(selection.from, configuration.maxRangeSize - 1) : (0, _dateFns.addDays)(selection.from, configuration.maxRangeSize - 1);
|
402
|
+
}
|
403
|
+
|
404
|
+
setHoverRange((0, _dateFns.isBefore)(hoverDate, selection.from) ? {
|
405
|
+
from: hoverDate,
|
406
|
+
to: selection.from
|
407
|
+
} : {
|
408
|
+
from: selection.from,
|
409
|
+
to: hoverDate
|
410
|
+
});
|
411
|
+
}
|
412
|
+
}, [configuration, hoverRange, selection]);
|
413
|
+
const datePickerCtx = (0, _react.useMemo)(() => {
|
414
|
+
return {
|
415
|
+
configuration,
|
416
|
+
currentViewingDate,
|
417
|
+
disabled: false,
|
418
|
+
formattedDate: getFormattedDate,
|
419
|
+
goToMonth,
|
420
|
+
hoverRange,
|
421
|
+
nextMonth,
|
422
|
+
onClose: handleClose,
|
423
|
+
onDateInput: inputHandler,
|
424
|
+
onDayFocus: focusHnadler,
|
425
|
+
onSelection: selectionHandler,
|
426
|
+
previousMonth,
|
427
|
+
revertValue,
|
428
|
+
saveValue,
|
429
|
+
selectionActive: false,
|
430
|
+
selection
|
431
|
+
};
|
432
|
+
}, [configuration, currentViewingDate, focusHnadler, getFormattedDate, goToMonth, handleClose, hoverRange, inputHandler, nextMonth, previousMonth, revertValue, saveValue, selection, selectionHandler]);
|
433
|
+
return /*#__PURE__*/_react.default.createElement(DatePickerContext.Provider, {
|
434
|
+
value: datePickerCtx
|
435
|
+
}, children);
|
436
|
+
};
|
437
|
+
|
438
|
+
exports.DatePickerProvider = DatePickerProvider;
|
439
|
+
DatePickerProvider.displayName = "DatePickerProvider";
|
package/lib/Dialog/Dialog.d.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import React from 'react';
|
2
|
-
import { ButtonProps } from '../
|
2
|
+
import { ButtonProps } from '../Button';
|
3
3
|
import { SxProp } from '../sx';
|
4
4
|
/**
|
5
5
|
* Props that characterize a button to be rendered into the footer of
|
@@ -9,7 +9,7 @@ export declare type DialogButtonProps = ButtonProps & {
|
|
9
9
|
/**
|
10
10
|
* The type of Button element to use
|
11
11
|
*/
|
12
|
-
buttonType?: '
|
12
|
+
buttonType?: 'normal' | 'primary' | 'danger';
|
13
13
|
/**
|
14
14
|
* The Button's inner text
|
15
15
|
*/
|
@@ -160,8 +160,8 @@ export declare const Dialog: React.ForwardRefExoticComponent<DialogProps & {
|
|
160
160
|
Buttons: React.FC<{
|
161
161
|
buttons: DialogButtonProps[];
|
162
162
|
}>;
|
163
|
-
CloseButton:
|
163
|
+
CloseButton: React.FC<{
|
164
164
|
onClose: () => void;
|
165
|
-
}
|
165
|
+
}>;
|
166
166
|
};
|
167
167
|
export {};
|
package/lib/Dialog/Dialog.js
CHANGED
@@ -9,7 +9,7 @@ var _react = _interopRequireWildcard(require("react"));
|
|
9
9
|
|
10
10
|
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
11
11
|
|
12
|
-
var
|
12
|
+
var _Button = _interopRequireWildcard(require("../Button"));
|
13
13
|
|
14
14
|
var _Box = _interopRequireDefault(require("../Box"));
|
15
15
|
|
@@ -21,6 +21,8 @@ var _useFocusTrap = require("../hooks/useFocusTrap");
|
|
21
21
|
|
22
22
|
var _sx = _interopRequireDefault(require("../sx"));
|
23
23
|
|
24
|
+
var _StyledOcticon = _interopRequireDefault(require("../StyledOcticon"));
|
25
|
+
|
24
26
|
var _octiconsReact = require("@primer/octicons-react");
|
25
27
|
|
26
28
|
var _useFocusZone = require("../hooks/useFocusZone");
|
@@ -211,6 +213,11 @@ const Footer = (0, _styledComponents.default)(_Box.default).attrs({
|
|
211
213
|
displayName: "Dialog__Footer",
|
212
214
|
componentId: "sc-11pkgky-6"
|
213
215
|
})(["box-shadow:0 -1px 0 ", ";padding:", ";display:flex;flex-flow:wrap;justify-content:flex-end;z-index:1;flex-shrink:0;button{margin-left:", ";&:first-child{margin-left:0;}}"], (0, _constants.get)('colors.border.default'), (0, _constants.get)('space.3'), (0, _constants.get)('space.1'));
|
216
|
+
const buttonTypes = {
|
217
|
+
normal: _Button.default,
|
218
|
+
primary: _Button.ButtonPrimary,
|
219
|
+
danger: _Button.ButtonDanger
|
220
|
+
};
|
214
221
|
|
215
222
|
const Buttons = ({
|
216
223
|
buttons
|
@@ -233,30 +240,33 @@ const Buttons = ({
|
|
233
240
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, buttons.map((dialogButtonProps, index) => {
|
234
241
|
const {
|
235
242
|
content,
|
236
|
-
buttonType = '
|
243
|
+
buttonType = 'normal',
|
237
244
|
autoFocus = false,
|
238
245
|
...buttonProps
|
239
246
|
} = dialogButtonProps;
|
240
|
-
|
247
|
+
const ButtonElement = buttonTypes[buttonType];
|
248
|
+
return /*#__PURE__*/_react.default.createElement(ButtonElement, _extends({
|
241
249
|
key: index
|
242
250
|
}, buttonProps, {
|
243
|
-
variant: buttonType,
|
244
251
|
ref: autoFocus && autoFocusCount === 0 ? (autoFocusCount++, autoFocusRef) : null
|
245
252
|
}), content);
|
246
253
|
}));
|
247
254
|
};
|
248
255
|
|
256
|
+
const DialogCloseButton = (0, _styledComponents.default)(_Button.default).withConfig({
|
257
|
+
displayName: "Dialog__DialogCloseButton",
|
258
|
+
componentId: "sc-11pkgky-7"
|
259
|
+
})(["border-radius:4px;background:transparent;border:0;vertical-align:middle;color:", ";padding:", ";align-self:flex-start;line-height:normal;box-shadow:none;"], (0, _constants.get)('colors.fg.muted'), (0, _constants.get)('space.2'));
|
260
|
+
|
249
261
|
const CloseButton = ({
|
250
262
|
onClose
|
251
263
|
}) => {
|
252
|
-
return /*#__PURE__*/_react.default.createElement(
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
icon: () => /*#__PURE__*/_react.default.createElement(_octiconsReact.XIcon, null)
|
259
|
-
});
|
264
|
+
return /*#__PURE__*/_react.default.createElement(DialogCloseButton, {
|
265
|
+
"aria-label": "Close",
|
266
|
+
onClick: onClose
|
267
|
+
}, /*#__PURE__*/_react.default.createElement(_StyledOcticon.default, {
|
268
|
+
icon: _octiconsReact.XIcon
|
269
|
+
}));
|
260
270
|
};
|
261
271
|
|
262
272
|
CloseButton.displayName = "CloseButton";
|