@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/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
- // Components
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>