Add multiple style improvements to new date picker and add actions
This commit is contained in:
parent
819df964bc
commit
989f54783c
|
@ -2,6 +2,7 @@
|
||||||
import { cleanInput } from "./utils"
|
import { cleanInput } from "./utils"
|
||||||
import Select from "../../Select.svelte"
|
import Select from "../../Select.svelte"
|
||||||
import dayjs from "dayjs"
|
import dayjs from "dayjs"
|
||||||
|
import NumberInput from "./NumberInput.svelte"
|
||||||
|
|
||||||
export let value
|
export let value
|
||||||
export let onChange
|
export let onChange
|
||||||
|
@ -80,13 +81,10 @@
|
||||||
on:change={e => (calendarDate = calendarDate.month(e.detail))}
|
on:change={e => (calendarDate = calendarDate.month(e.detail))}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<input
|
<NumberInput
|
||||||
class="custom-num-input"
|
|
||||||
type="number"
|
|
||||||
value={calendarDate.year()}
|
value={calendarDate.year()}
|
||||||
min="0"
|
min={0}
|
||||||
max="9999"
|
max={9999}
|
||||||
onclick="this.select()"
|
|
||||||
on:change={handleCalendarYearChange}
|
on:change={handleCalendarYearChange}
|
||||||
on:input={cleanYear}
|
on:input={cleanYear}
|
||||||
/>
|
/>
|
||||||
|
@ -173,7 +171,6 @@
|
||||||
<style>
|
<style>
|
||||||
/* Calendar overrides */
|
/* Calendar overrides */
|
||||||
.spectrum-Calendar {
|
.spectrum-Calendar {
|
||||||
padding: 8px;
|
|
||||||
width: auto;
|
width: auto;
|
||||||
}
|
}
|
||||||
.spectrum-Calendar-title {
|
.spectrum-Calendar-title {
|
||||||
|
@ -209,7 +206,7 @@
|
||||||
.spectrum-Calendar-nextMonth,
|
.spectrum-Calendar-nextMonth,
|
||||||
.spectrum-Calendar-prevMonth {
|
.spectrum-Calendar-prevMonth {
|
||||||
order: 1;
|
order: 1;
|
||||||
padding: 4px 6px;
|
padding: 4px;
|
||||||
}
|
}
|
||||||
.spectrum-Calendar-date {
|
.spectrum-Calendar-date {
|
||||||
color: var(--spectrum-alias-text-color);
|
color: var(--spectrum-alias-text-color);
|
||||||
|
@ -217,4 +214,19 @@
|
||||||
.spectrum-Calendar-date.is-selected {
|
.spectrum-Calendar-date.is-selected {
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Style select */
|
||||||
|
.month-selector :global(.spectrum-Picker) {
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
padding: 4px 6px;
|
||||||
|
}
|
||||||
|
.month-selector :global(.spectrum-Picker:hover),
|
||||||
|
.month-selector :global(.spectrum-Picker.is-open) {
|
||||||
|
background: var(--spectrum-global-color-gray-200);
|
||||||
|
}
|
||||||
|
.month-selector :global(.spectrum-Picker-label) {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
import TimePicker from "./TimePicker.svelte"
|
import TimePicker from "./TimePicker.svelte"
|
||||||
import Calendar from "./Calendar.svelte"
|
import Calendar from "./Calendar.svelte"
|
||||||
import DateTimeInput from "./DateTimeField.svelte"
|
import DateTimeInput from "./DateTimeField.svelte"
|
||||||
|
import ActionButton from "../../../ActionButton/ActionButton.svelte"
|
||||||
|
|
||||||
export let id = null
|
export let id = null
|
||||||
export let disabled = false
|
export let disabled = false
|
||||||
|
@ -125,47 +126,46 @@
|
||||||
{#if showCalendar}
|
{#if showCalendar}
|
||||||
<Calendar value={parsedValue} onChange={handleChange} />
|
<Calendar value={parsedValue} onChange={handleChange} />
|
||||||
{/if}
|
{/if}
|
||||||
{#if showCalendar && showTime}
|
<div class="footer" class:spaced={showCalendar}>
|
||||||
<hr />
|
{#if showTime}
|
||||||
{/if}
|
<TimePicker value={parsedValue} onChange={handleChange} />
|
||||||
{#if showTime}
|
{/if}
|
||||||
<TimePicker value={parsedValue} onChange={handleChange} />
|
<div class="actions">
|
||||||
{/if}
|
<ActionButton
|
||||||
|
disabled={!value}
|
||||||
|
size="S"
|
||||||
|
on:click={() => handleChange(null)}
|
||||||
|
>
|
||||||
|
Clear
|
||||||
|
</ActionButton>
|
||||||
|
<ActionButton size="S" on:click={() => handleChange(dayjs())}>
|
||||||
|
{showTime ? "Now" : "Today"}
|
||||||
|
</ActionButton>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</Popover>
|
</Popover>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
hr {
|
.date-time-popover {
|
||||||
margin: 4px 0 0 0;
|
padding: 8px;
|
||||||
height: 0;
|
|
||||||
border: none;
|
|
||||||
border-top: 1px solid var(--spectrum-global-color-gray-200);
|
|
||||||
}
|
}
|
||||||
|
.footer {
|
||||||
/* Style inputs */
|
display: flex;
|
||||||
.date-time-popover :global(.spectrum-Picker),
|
justify-content: space-between;
|
||||||
.date-time-popover :global(input[type="number"]) {
|
align-items: center;
|
||||||
background: none;
|
gap: 32px;
|
||||||
border: none;
|
|
||||||
outline: none;
|
|
||||||
color: var(--spectrum-alias-text-color);
|
|
||||||
padding: 4px 6px;
|
|
||||||
border-radius: 4px;
|
|
||||||
transition: background 130ms ease-out;
|
|
||||||
font-size: 18px;
|
|
||||||
font-weight: bold;
|
|
||||||
font-family: var(--font-sans);
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
}
|
}
|
||||||
.date-time-popover :global(.spectrum-Picker:hover),
|
.footer.spaced {
|
||||||
.date-time-popover :global(.spectrum-Picker.is-open),
|
padding-top: 14px;
|
||||||
.date-time-popover :global(input[type="number"]:hover) {
|
|
||||||
background: var(--spectrum-global-color-gray-200);
|
|
||||||
}
|
}
|
||||||
.date-time-popover :global(.spectrum-Picker-label) {
|
.actions {
|
||||||
font-size: var(--spectrum-calendar-title-text-size);
|
padding: 4px 0;
|
||||||
font-weight: bold;
|
flex: 1 1 auto;
|
||||||
color: var(--spectrum-alias-text-color);
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
gap: 6px;
|
||||||
|
margin-right: 4px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
<script>
|
||||||
|
export let value
|
||||||
|
export let min
|
||||||
|
export let max
|
||||||
|
export let onChange
|
||||||
|
export let hideArrows = false
|
||||||
|
export let width
|
||||||
|
|
||||||
|
$: style = width ? `width:${width}px;` : ""
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<input
|
||||||
|
class:hide-arrows={hideArrows}
|
||||||
|
type="number"
|
||||||
|
{style}
|
||||||
|
{value}
|
||||||
|
{min}
|
||||||
|
{max}
|
||||||
|
onclick="this.select()"
|
||||||
|
on:change
|
||||||
|
on:input
|
||||||
|
/>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
input {
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
color: var(--spectrum-alias-text-color);
|
||||||
|
padding: 4px 6px 5px 6px;
|
||||||
|
border-radius: 4px;
|
||||||
|
transition: background 130ms ease-out;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: bold;
|
||||||
|
font-family: var(--font-sans);
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
}
|
||||||
|
input:focus,
|
||||||
|
input:hover {
|
||||||
|
--space: 30px;
|
||||||
|
background: var(--spectrum-global-color-gray-200);
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hide built-in arrows */
|
||||||
|
input.hide-arrows::-webkit-outer-spin-button,
|
||||||
|
input.hide-arrows::-webkit-inner-spin-button {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
input.hide-arrows {
|
||||||
|
-moz-appearance: textfield;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,6 +1,7 @@
|
||||||
<script>
|
<script>
|
||||||
import { cleanInput } from "./utils"
|
import { cleanInput } from "./utils"
|
||||||
import dayjs from "dayjs"
|
import dayjs from "dayjs"
|
||||||
|
import NumberInput from "./NumberInput.svelte"
|
||||||
|
|
||||||
export let value
|
export let value
|
||||||
export let onChange
|
export let onChange
|
||||||
|
@ -22,22 +23,22 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="time-picker">
|
<div class="time-picker">
|
||||||
<input
|
<NumberInput
|
||||||
type="number"
|
hideArrows
|
||||||
value={displayValue.hour().toString().padStart(2, "0")}
|
value={displayValue.hour().toString().padStart(2, "0")}
|
||||||
min="0"
|
min={0}
|
||||||
max="23"
|
max={23}
|
||||||
onclick="this.select()"
|
width={20}
|
||||||
on:input={cleanHour}
|
on:input={cleanHour}
|
||||||
on:change={handleHourChange}
|
on:change={handleHourChange}
|
||||||
/>
|
/>
|
||||||
<span>:</span>
|
<span>:</span>
|
||||||
<input
|
<NumberInput
|
||||||
type="number"
|
hideArrows
|
||||||
value={displayValue.minute().toString().padStart(2, "0")}
|
value={displayValue.minute().toString().padStart(2, "0")}
|
||||||
min="0"
|
min={0}
|
||||||
max="59"
|
max={59}
|
||||||
onclick="this.select()"
|
width={20}
|
||||||
on:input={cleanMinute}
|
on:input={cleanMinute}
|
||||||
on:change={handleMinuteChange}
|
on:change={handleMinuteChange}
|
||||||
/>
|
/>
|
||||||
|
@ -45,7 +46,6 @@
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.time-picker {
|
.time-picker {
|
||||||
padding: 12px;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
@ -54,12 +54,6 @@
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
z-index: -1;
|
z-index: -1;
|
||||||
color: var(--spectrum-global-color-gray-700);
|
margin-bottom: 1px;
|
||||||
}
|
|
||||||
.time-picker input:first-child {
|
|
||||||
margin-right: -16px;
|
|
||||||
}
|
|
||||||
.time-picker input:last-child {
|
|
||||||
margin-left: 8px;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
<script>
|
||||||
|
import { CoreDatePicker } from "@budibase/bbui"
|
||||||
|
import Field from "./Field.svelte"
|
||||||
|
|
||||||
|
export let field
|
||||||
|
export let label
|
||||||
|
export let placeholder
|
||||||
|
export let disabled = false
|
||||||
|
export let enableTime = true
|
||||||
|
export let timeOnly = false
|
||||||
|
export let time24hr = false
|
||||||
|
export let ignoreTimezones = false
|
||||||
|
export let validation
|
||||||
|
export let defaultValue
|
||||||
|
export let onChange
|
||||||
|
|
||||||
|
let fieldState
|
||||||
|
let fieldApi
|
||||||
|
|
||||||
|
const handleChange = e => {
|
||||||
|
const changed = fieldApi.setValue(e.detail)
|
||||||
|
if (onChange && changed) {
|
||||||
|
onChange({ value: e.detail })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Field
|
||||||
|
{label}
|
||||||
|
{field}
|
||||||
|
{disabled}
|
||||||
|
{validation}
|
||||||
|
{defaultValue}
|
||||||
|
type="datetime"
|
||||||
|
bind:fieldState
|
||||||
|
bind:fieldApi
|
||||||
|
>
|
||||||
|
{#if fieldState}
|
||||||
|
<CoreDatePicker
|
||||||
|
value={fieldState.value}
|
||||||
|
on:change={handleChange}
|
||||||
|
disabled={fieldState.disabled}
|
||||||
|
error={fieldState.error}
|
||||||
|
id={fieldState.fieldId}
|
||||||
|
appendTo={document.getElementById("flatpickr-root")}
|
||||||
|
{enableTime}
|
||||||
|
{timeOnly}
|
||||||
|
{time24hr}
|
||||||
|
{ignoreTimezones}
|
||||||
|
{placeholder}
|
||||||
|
/>
|
||||||
|
{/if}
|
||||||
|
</Field>
|
Loading…
Reference in New Issue