@budibase/bbui 2.23.12 → 2.24.1
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/dist/bbui.es.js +2 -2
- package/dist/bbui.es.js.map +1 -1
- package/package.json +5 -5
- package/src/ActionMenu/ActionMenu.svelte +9 -1
- package/src/Actions/click_outside.js +22 -16
- package/src/Actions/position_dropdown.js +155 -31
- package/src/Form/Core/DatePicker/Calendar.svelte +252 -0
- package/src/Form/Core/DatePicker/DateInput.svelte +94 -0
- package/src/Form/Core/DatePicker/DatePicker.svelte +83 -0
- package/src/Form/Core/DatePicker/DatePickerPopoverContents.svelte +102 -0
- package/src/Form/Core/DatePicker/NumberInput.svelte +54 -0
- package/src/Form/Core/DatePicker/TimePicker.svelte +59 -0
- package/src/Form/Core/DatePicker/utils.js +14 -0
- package/src/Form/Core/DateRangePicker.svelte +69 -0
- package/src/Form/Core/Picker.svelte +1 -0
- package/src/Form/Core/index.js +3 -1
- package/src/Form/DatePicker.svelte +3 -12
- package/src/Form/DateRangePicker.svelte +34 -0
- package/src/Layout/Page.svelte +5 -5
- package/src/Popover/Popover.svelte +6 -3
- package/src/helpers.js +108 -0
- package/src/index.js +25 -24
- package/src/Form/Core/DatePicker.svelte +0 -268
package/src/index.js
CHANGED
|
@@ -3,13 +3,34 @@ import "./bbui.css"
|
|
|
3
3
|
// Spectrum icons
|
|
4
4
|
import "@spectrum-css/icon/dist/index-vars.css"
|
|
5
5
|
|
|
6
|
-
//
|
|
6
|
+
// Form components
|
|
7
7
|
export { default as Input } from "./Form/Input.svelte"
|
|
8
8
|
export { default as Stepper } from "./Form/Stepper.svelte"
|
|
9
9
|
export { default as TextArea } from "./Form/TextArea.svelte"
|
|
10
10
|
export { default as Select } from "./Form/Select.svelte"
|
|
11
11
|
export { default as Combobox } from "./Form/Combobox.svelte"
|
|
12
12
|
export { default as Dropzone } from "./Form/Dropzone.svelte"
|
|
13
|
+
export { default as DatePicker } from "./Form/DatePicker.svelte"
|
|
14
|
+
export { default as DateRangePicker } from "./Form/DateRangePicker.svelte"
|
|
15
|
+
export { default as Toggle } from "./Form/Toggle.svelte"
|
|
16
|
+
export { default as RadioGroup } from "./Form/RadioGroup.svelte"
|
|
17
|
+
export { default as Checkbox } from "./Form/Checkbox.svelte"
|
|
18
|
+
export { default as InputDropdown } from "./Form/InputDropdown.svelte"
|
|
19
|
+
export { default as PickerDropdown } from "./Form/PickerDropdown.svelte"
|
|
20
|
+
export { default as EnvDropdown } from "./Form/EnvDropdown.svelte"
|
|
21
|
+
export { default as Multiselect } from "./Form/Multiselect.svelte"
|
|
22
|
+
export { default as Search } from "./Form/Search.svelte"
|
|
23
|
+
export { default as RichTextField } from "./Form/RichTextField.svelte"
|
|
24
|
+
export { default as Slider } from "./Form/Slider.svelte"
|
|
25
|
+
export { default as File } from "./Form/File.svelte"
|
|
26
|
+
|
|
27
|
+
// Core form components to be used elsewhere (standard components)
|
|
28
|
+
export * from "./Form/Core"
|
|
29
|
+
|
|
30
|
+
// Fancy form components
|
|
31
|
+
export * from "./FancyForm"
|
|
32
|
+
|
|
33
|
+
// Components
|
|
13
34
|
export { default as Drawer } from "./Drawer/Drawer.svelte"
|
|
14
35
|
export { default as DrawerContent } from "./Drawer/DrawerContent.svelte"
|
|
15
36
|
export { default as Avatar } from "./Avatar/Avatar.svelte"
|
|
@@ -21,12 +42,6 @@ export { default as ButtonGroup } from "./ButtonGroup/ButtonGroup.svelte"
|
|
|
21
42
|
export { default as ClearButton } from "./ClearButton/ClearButton.svelte"
|
|
22
43
|
export { default as Icon } from "./Icon/Icon.svelte"
|
|
23
44
|
export { default as IconAvatar } from "./Icon/IconAvatar.svelte"
|
|
24
|
-
export { default as Toggle } from "./Form/Toggle.svelte"
|
|
25
|
-
export { default as RadioGroup } from "./Form/RadioGroup.svelte"
|
|
26
|
-
export { default as Checkbox } from "./Form/Checkbox.svelte"
|
|
27
|
-
export { default as InputDropdown } from "./Form/InputDropdown.svelte"
|
|
28
|
-
export { default as PickerDropdown } from "./Form/PickerDropdown.svelte"
|
|
29
|
-
export { default as EnvDropdown } from "./Form/EnvDropdown.svelte"
|
|
30
45
|
export { default as DetailSummary } from "./DetailSummary/DetailSummary.svelte"
|
|
31
46
|
export { default as Popover } from "./Popover/Popover.svelte"
|
|
32
47
|
export { default as ProgressBar } from "./ProgressBar/ProgressBar.svelte"
|
|
@@ -37,11 +52,6 @@ export { default as Page } from "./Layout/Page.svelte"
|
|
|
37
52
|
export { default as Link } from "./Link/Link.svelte"
|
|
38
53
|
export { default as Tooltip } from "./Tooltip/Tooltip.svelte"
|
|
39
54
|
export { default as TempTooltip } from "./Tooltip/TempTooltip.svelte"
|
|
40
|
-
export {
|
|
41
|
-
default as AbsTooltip,
|
|
42
|
-
TooltipPosition,
|
|
43
|
-
TooltipType,
|
|
44
|
-
} from "./Tooltip/AbsTooltip.svelte"
|
|
45
55
|
export { default as TooltipWrapper } from "./Tooltip/TooltipWrapper.svelte"
|
|
46
56
|
export { default as Menu } from "./Menu/Menu.svelte"
|
|
47
57
|
export { default as MenuSection } from "./Menu/Section.svelte"
|
|
@@ -53,8 +63,6 @@ export { default as NotificationDisplay } from "./Notification/NotificationDispl
|
|
|
53
63
|
export { default as Notification } from "./Notification/Notification.svelte"
|
|
54
64
|
export { default as SideNavigation } from "./SideNavigation/Navigation.svelte"
|
|
55
65
|
export { default as SideNavigationItem } from "./SideNavigation/Item.svelte"
|
|
56
|
-
export { default as DatePicker } from "./Form/DatePicker.svelte"
|
|
57
|
-
export { default as Multiselect } from "./Form/Multiselect.svelte"
|
|
58
66
|
export { default as Context } from "./context"
|
|
59
67
|
export { default as Table } from "./Table/Table.svelte"
|
|
60
68
|
export { default as Tabs } from "./Tabs/Tabs.svelte"
|
|
@@ -64,7 +72,6 @@ export { default as Tag } from "./Tags/Tag.svelte"
|
|
|
64
72
|
export { default as TreeView } from "./TreeView/Tree.svelte"
|
|
65
73
|
export { default as TreeItem } from "./TreeView/Item.svelte"
|
|
66
74
|
export { default as Divider } from "./Divider/Divider.svelte"
|
|
67
|
-
export { default as Search } from "./Form/Search.svelte"
|
|
68
75
|
export { default as Pagination } from "./Pagination/Pagination.svelte"
|
|
69
76
|
export { default as Badge } from "./Badge/Badge.svelte"
|
|
70
77
|
export { default as StatusLight } from "./StatusLight/StatusLight.svelte"
|
|
@@ -76,15 +83,15 @@ export { default as CopyInput } from "./Input/CopyInput.svelte"
|
|
|
76
83
|
export { default as BannerDisplay } from "./Banner/BannerDisplay.svelte"
|
|
77
84
|
export { default as MarkdownEditor } from "./Markdown/MarkdownEditor.svelte"
|
|
78
85
|
export { default as MarkdownViewer } from "./Markdown/MarkdownViewer.svelte"
|
|
79
|
-
export { default as RichTextField } from "./Form/RichTextField.svelte"
|
|
80
86
|
export { default as List } from "./List/List.svelte"
|
|
81
87
|
export { default as ListItem } from "./List/ListItem.svelte"
|
|
82
88
|
export { default as IconSideNav } from "./IconSideNav/IconSideNav.svelte"
|
|
83
89
|
export { default as IconSideNavItem } from "./IconSideNav/IconSideNavItem.svelte"
|
|
84
|
-
export { default as Slider } from "./Form/Slider.svelte"
|
|
85
90
|
export { default as Accordion } from "./Accordion/Accordion.svelte"
|
|
86
|
-
export { default as File } from "./Form/File.svelte"
|
|
87
91
|
export { default as OptionSelectDnD } from "./OptionSelectDnD/OptionSelectDnD.svelte"
|
|
92
|
+
export { default as AbsTooltip } from "./Tooltip/AbsTooltip.svelte"
|
|
93
|
+
export { TooltipPosition, TooltipType } from "./Tooltip/AbsTooltip.svelte"
|
|
94
|
+
|
|
88
95
|
// Renderers
|
|
89
96
|
export { default as BoldRenderer } from "./Table/BoldRenderer.svelte"
|
|
90
97
|
export { default as CodeRenderer } from "./Table/CodeRenderer.svelte"
|
|
@@ -96,9 +103,6 @@ export { default as Heading } from "./Typography/Heading.svelte"
|
|
|
96
103
|
export { default as Detail } from "./Typography/Detail.svelte"
|
|
97
104
|
export { default as Code } from "./Typography/Code.svelte"
|
|
98
105
|
|
|
99
|
-
// Core form components to be used elsewhere (standard components)
|
|
100
|
-
export * from "./Form/Core"
|
|
101
|
-
|
|
102
106
|
// Actions
|
|
103
107
|
export { default as autoResizeTextArea } from "./Actions/autoresize_textarea"
|
|
104
108
|
export { default as positionDropdown } from "./Actions/position_dropdown"
|
|
@@ -110,6 +114,3 @@ export { banner, BANNER_TYPES } from "./Stores/banner"
|
|
|
110
114
|
|
|
111
115
|
// Helpers
|
|
112
116
|
export * as Helpers from "./helpers"
|
|
113
|
-
|
|
114
|
-
// Fancy form components
|
|
115
|
-
export * from "./FancyForm"
|
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import Flatpickr from "svelte-flatpickr"
|
|
3
|
-
import "flatpickr/dist/flatpickr.css"
|
|
4
|
-
import "@spectrum-css/inputgroup/dist/index-vars.css"
|
|
5
|
-
import "@spectrum-css/textfield/dist/index-vars.css"
|
|
6
|
-
import "@spectrum-css/picker/dist/index-vars.css"
|
|
7
|
-
import { createEventDispatcher } from "svelte"
|
|
8
|
-
import { uuid } from "../../helpers"
|
|
9
|
-
|
|
10
|
-
export let id = null
|
|
11
|
-
export let disabled = false
|
|
12
|
-
export let readonly = false
|
|
13
|
-
export let enableTime = true
|
|
14
|
-
export let value = null
|
|
15
|
-
export let placeholder = null
|
|
16
|
-
export let appendTo = undefined
|
|
17
|
-
export let timeOnly = false
|
|
18
|
-
export let ignoreTimezones = false
|
|
19
|
-
export let time24hr = false
|
|
20
|
-
export let range = false
|
|
21
|
-
export let flatpickr
|
|
22
|
-
export let useKeyboardShortcuts = true
|
|
23
|
-
|
|
24
|
-
const dispatch = createEventDispatcher()
|
|
25
|
-
const flatpickrId = `${uuid()}-wrapper`
|
|
26
|
-
|
|
27
|
-
let open = false
|
|
28
|
-
let flatpickrOptions
|
|
29
|
-
|
|
30
|
-
// Another classic flatpickr issue. Errors were randomly being thrown due to
|
|
31
|
-
// flatpickr internal code. Making sure that "destroy" is a valid function
|
|
32
|
-
// fixes it. The sooner we remove flatpickr the better.
|
|
33
|
-
$: {
|
|
34
|
-
if (flatpickr && !flatpickr.destroy) {
|
|
35
|
-
flatpickr.destroy = () => {}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const resolveTimeStamp = timestamp => {
|
|
40
|
-
let maskedDate = new Date(`0-${timestamp}`)
|
|
41
|
-
|
|
42
|
-
if (maskedDate instanceof Date && !isNaN(maskedDate.getTime())) {
|
|
43
|
-
return maskedDate
|
|
44
|
-
} else {
|
|
45
|
-
return null
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
$: flatpickrOptions = {
|
|
50
|
-
element: `#${flatpickrId}`,
|
|
51
|
-
enableTime: timeOnly || enableTime || false,
|
|
52
|
-
noCalendar: timeOnly || false,
|
|
53
|
-
altInput: true,
|
|
54
|
-
time_24hr: time24hr || false,
|
|
55
|
-
altFormat: timeOnly ? "H:i" : enableTime ? "F j Y, H:i" : "F j, Y",
|
|
56
|
-
wrap: true,
|
|
57
|
-
mode: range ? "range" : "single",
|
|
58
|
-
appendTo,
|
|
59
|
-
disableMobile: "true",
|
|
60
|
-
onReady: () => {
|
|
61
|
-
let timestamp = resolveTimeStamp(value)
|
|
62
|
-
if (timeOnly && timestamp) {
|
|
63
|
-
dispatch("change", timestamp.toISOString())
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
onOpen: () => dispatch("open"),
|
|
67
|
-
onClose: () => dispatch("close"),
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
$: redrawOptions = {
|
|
71
|
-
timeOnly,
|
|
72
|
-
enableTime,
|
|
73
|
-
time24hr,
|
|
74
|
-
disabled,
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const handleChange = event => {
|
|
78
|
-
const [dates] = event.detail
|
|
79
|
-
const noTimezone = enableTime && !timeOnly && ignoreTimezones
|
|
80
|
-
let newValue = dates[0]
|
|
81
|
-
if (newValue) {
|
|
82
|
-
newValue = newValue.toISOString()
|
|
83
|
-
}
|
|
84
|
-
// If time only set date component to 2000-01-01
|
|
85
|
-
if (timeOnly) {
|
|
86
|
-
newValue = `2000-01-01T${newValue.split("T")[1]}`
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// For date-only fields, construct a manual timestamp string without a time
|
|
90
|
-
// or time zone
|
|
91
|
-
else if (!enableTime) {
|
|
92
|
-
const year = dates[0].getFullYear()
|
|
93
|
-
const month = `${dates[0].getMonth() + 1}`.padStart(2, "0")
|
|
94
|
-
const day = `${dates[0].getDate()}`.padStart(2, "0")
|
|
95
|
-
newValue = `${year}-${month}-${day}T00:00:00.000`
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// For non-timezone-aware fields, create an ISO 8601 timestamp of the exact
|
|
99
|
-
// time picked, without timezone
|
|
100
|
-
else if (noTimezone) {
|
|
101
|
-
const offset = dates[0].getTimezoneOffset() * 60000
|
|
102
|
-
newValue = new Date(dates[0].getTime() - offset)
|
|
103
|
-
.toISOString()
|
|
104
|
-
.slice(0, -1)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (range) {
|
|
108
|
-
dispatch("change", event.detail)
|
|
109
|
-
} else {
|
|
110
|
-
dispatch("change", newValue)
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
const clearDateOnBackspace = event => {
|
|
115
|
-
if (["Backspace", "Clear", "Delete"].includes(event.key)) {
|
|
116
|
-
dispatch("change", "")
|
|
117
|
-
flatpickr.close()
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const onOpen = () => {
|
|
122
|
-
open = true
|
|
123
|
-
if (useKeyboardShortcuts) {
|
|
124
|
-
document.addEventListener("keyup", clearDateOnBackspace)
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const onClose = () => {
|
|
129
|
-
open = false
|
|
130
|
-
if (useKeyboardShortcuts) {
|
|
131
|
-
document.removeEventListener("keyup", clearDateOnBackspace)
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Manually blur all input fields since flatpickr creates a second
|
|
135
|
-
// duplicate input field.
|
|
136
|
-
// We need to blur both because the focus styling does not get properly
|
|
137
|
-
// applied.
|
|
138
|
-
const els = document.querySelectorAll(`#${flatpickrId} input`)
|
|
139
|
-
els.forEach(el => el.blur())
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const parseDate = val => {
|
|
143
|
-
if (!val) {
|
|
144
|
-
return null
|
|
145
|
-
}
|
|
146
|
-
let date
|
|
147
|
-
let time
|
|
148
|
-
|
|
149
|
-
// it is a string like 00:00:00, just time
|
|
150
|
-
let ts = resolveTimeStamp(val)
|
|
151
|
-
|
|
152
|
-
if (timeOnly && ts) {
|
|
153
|
-
date = ts
|
|
154
|
-
} else if (val instanceof Date) {
|
|
155
|
-
// Use real date obj if already parsed
|
|
156
|
-
date = val
|
|
157
|
-
} else if (isNaN(val)) {
|
|
158
|
-
// Treat as date string of some sort
|
|
159
|
-
date = new Date(val)
|
|
160
|
-
} else {
|
|
161
|
-
// Treat as numerical timestamp
|
|
162
|
-
date = new Date(parseInt(val))
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
time = date.getTime()
|
|
166
|
-
if (isNaN(time)) {
|
|
167
|
-
return null
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// By rounding to the nearest second we avoid locking up in an endless
|
|
171
|
-
// loop in the builder, caused by potentially enriching {{ now }} to every
|
|
172
|
-
// millisecond.
|
|
173
|
-
return new Date(Math.floor(time / 1000) * 1000)
|
|
174
|
-
}
|
|
175
|
-
</script>
|
|
176
|
-
|
|
177
|
-
{#key redrawOptions}
|
|
178
|
-
<Flatpickr
|
|
179
|
-
bind:flatpickr
|
|
180
|
-
value={range ? value : parseDate(value)}
|
|
181
|
-
on:open={onOpen}
|
|
182
|
-
on:close={onClose}
|
|
183
|
-
options={flatpickrOptions}
|
|
184
|
-
on:change={handleChange}
|
|
185
|
-
element={`#${flatpickrId}`}
|
|
186
|
-
>
|
|
187
|
-
<div
|
|
188
|
-
id={flatpickrId}
|
|
189
|
-
class:is-disabled={disabled || readonly}
|
|
190
|
-
class="flatpickr spectrum-InputGroup spectrum-Datepicker"
|
|
191
|
-
class:is-focused={open}
|
|
192
|
-
aria-readonly="false"
|
|
193
|
-
aria-required="false"
|
|
194
|
-
aria-haspopup="true"
|
|
195
|
-
>
|
|
196
|
-
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
|
197
|
-
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
|
198
|
-
<div
|
|
199
|
-
on:click={flatpickr?.open}
|
|
200
|
-
class="spectrum-Textfield spectrum-InputGroup-textfield"
|
|
201
|
-
class:is-disabled={disabled}
|
|
202
|
-
>
|
|
203
|
-
<input
|
|
204
|
-
{disabled}
|
|
205
|
-
{readonly}
|
|
206
|
-
data-input
|
|
207
|
-
type="text"
|
|
208
|
-
class="spectrum-Textfield-input spectrum-InputGroup-input"
|
|
209
|
-
class:is-disabled={disabled}
|
|
210
|
-
{placeholder}
|
|
211
|
-
{id}
|
|
212
|
-
{value}
|
|
213
|
-
/>
|
|
214
|
-
</div>
|
|
215
|
-
<button
|
|
216
|
-
type="button"
|
|
217
|
-
class="spectrum-Picker spectrum-Picker--sizeM spectrum-InputGroup-button"
|
|
218
|
-
tabindex="-1"
|
|
219
|
-
class:is-disabled={disabled}
|
|
220
|
-
on:click={flatpickr?.open}
|
|
221
|
-
>
|
|
222
|
-
<svg
|
|
223
|
-
class="spectrum-Icon spectrum-Icon--sizeM"
|
|
224
|
-
focusable="false"
|
|
225
|
-
aria-hidden="true"
|
|
226
|
-
aria-label="Calendar"
|
|
227
|
-
>
|
|
228
|
-
<use xlink:href="#spectrum-icon-18-Calendar" />
|
|
229
|
-
</svg>
|
|
230
|
-
</button>
|
|
231
|
-
</div>
|
|
232
|
-
</Flatpickr>
|
|
233
|
-
{/key}
|
|
234
|
-
{#if open}
|
|
235
|
-
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
|
236
|
-
<div class="overlay" on:mousedown|self={flatpickr?.close} />
|
|
237
|
-
{/if}
|
|
238
|
-
|
|
239
|
-
<style>
|
|
240
|
-
.spectrum-Textfield-input {
|
|
241
|
-
pointer-events: none;
|
|
242
|
-
}
|
|
243
|
-
.spectrum-Textfield:not(.is-disabled):hover {
|
|
244
|
-
cursor: pointer;
|
|
245
|
-
}
|
|
246
|
-
.flatpickr {
|
|
247
|
-
width: 100%;
|
|
248
|
-
overflow: hidden;
|
|
249
|
-
}
|
|
250
|
-
.flatpickr .spectrum-Textfield {
|
|
251
|
-
width: 100%;
|
|
252
|
-
}
|
|
253
|
-
.overlay {
|
|
254
|
-
position: fixed;
|
|
255
|
-
top: 0;
|
|
256
|
-
left: 0;
|
|
257
|
-
width: 100vw;
|
|
258
|
-
height: 100vh;
|
|
259
|
-
z-index: 999;
|
|
260
|
-
max-height: 100%;
|
|
261
|
-
}
|
|
262
|
-
:global(.flatpickr-calendar) {
|
|
263
|
-
font-family: var(--font-sans);
|
|
264
|
-
}
|
|
265
|
-
.is-disabled {
|
|
266
|
-
pointer-events: none !important;
|
|
267
|
-
}
|
|
268
|
-
</style>
|