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.