Slider
The
Dashboard page continues with a chart of daily revenue that uses a Slider to control both ends of a date range.Here is a simplified version of that mechanism. Try using both slider handles to adjust the date range and corresponding total revenue.
<App>
<SliderDemo />
</App><App>
<SliderDemo />
</App>Here's
SliderDemo.<Component name="SliderDemo">
<variable name="startDate" value="2022-06-01" />
<variable name="endDate" value="2022-06-30" />
<variable name="dailyData" value="{[
{date: '2022-06-01', total: 1200},
{date: '2022-06-02', total: 1850},
...
{date: '2022-06-29', total: 0},
{date: '2022-06-30', total: 2200}
]}" />
<variable name="filteredData" value="{
dailyData.filter(item => item.date >= startDate && item.date <= endDate)
}" />
<VStack>
<H1>Slider Demo</H1>
<Text>Selected records: {filteredData.length}</Text>
<Slider
id="dateSlider"
label="Date range"
minValue="{1}"
maxValue="{30}"
initialValue="{[1, 30]}"
step="{1}"
onDidChange="{
startDate = window.sliderValueToDate(dateSlider.value[0]);
endDate = window.sliderValueToDate(dateSlider.value[1]);
}"
valueFormat="{ (value) => {
const result = window.sliderValueToDate(value);
return result;
}
}"
/>
<Text>
Total Revenue: ${filteredData.reduce((sum, item) => sum + item.total, 0)}
</Text>
</VStack>
</Component>When the handles move, the slider's
onDidChange event updates startDate and endDate using a function, sliderValueToDate, that translates the slider position to a date in the range of dates. In the Invoices app those variables form part of a DataSource URL that fires when there's a change; here they update the filteredData variable to simulate the real DataSource.The slider's
valueFormat property uses the same function to report the new startDate and endDate.A custom Slider
The Invoices app encapsulates this behavior in a custom component called
DateRangeSlider.<Component name="DateRangeSlider">
<variable name="originalStartDate" value="{ $props.minDate }"/>
<variable name="maxEndDate" value="{ $props.maxDate }"/>
<variable name="startDate" value="{ originalStartDate }"/>
<variable name="endDate" value="{ maxEndDate }"/>
<variable
name="totalDays"
value="{ window.daysBetween(originalStartDate, maxEndDate)}"/>
<ChangeListener
listenTo="{slider.value}"
onDidChange="{() => {
// Update the start and end dates based on slider values
updateState({
value: {
startDate: window.sliderValueToDate(slider.value[0], originalStartDate),
endDate: window.sliderValueToDate(slider.value[1], originalStartDate)
}
});
}}"
/>
<Slider
id="slider"
label="dateRange"
minValue="{0}"
maxValue="{ totalDays }"
initialValue="{ [0, totalDays] }"
step="10"
valueFormat="{ (value) => {
const date = window.sliderValueToDate(value, originalStartDate);
return date;
}}"
/>
</Component>The
updateState method, available in all components, is a merge operation that can set multiple variables.