Calendar / Datepicker

优质
小牛编辑
132浏览
2023-12-01

Calendar is a touch optimized component that provides an easy way to handle dates.

Calendar could be used as inline component or as overlay. Overlay Calendar will be automatically converted to Popover on tablets (iPad).

Create Calendar Instance

Calendar can be created and initialized only using JavaScript. We need to use related App's method:

myApp.calendar(parameters) - initialize Calendar with parameters

  • parameters - object - object with Calendar parameters. Required.
  • Method returns initialized Calendar instance

For example:

var myCalendar = app.calendar({
    input: '#calendar-input'
});   

Calendar Parameters

Let's look on list of all available parameters:

ParameterTypeDefaultDescription
Common Picker Modal Component Parameters
containerstring or HTMLElementString with CSS selector or HTMLElement where to place generated Calendar HTML. Use only for inline pickers
inputstring or HTMLElementString with CSS selector or HTMLElement with related input element
scrollToInputbooleantrueScroll viewport (page-content) to input when calendar opened
inputReadOnlybooleantrueSets "readonly" attribute on specified input
convertToPopoverbooleantrueConverts calendar modal to Popover on large screens (on iPad)
onlyOnPopoverbooleanfalseEnable it and Calendar will be always opened in Popover
cssClassstringAdditional CSS class name to be set on calendar modal
toolbarbooleantrueEnables calendar modal toolbar
toolbarCloseTextstring'Done'Text for Done/Close toolbar button
toolbarTemplatestringToolbar HTML Template. By default it is HTML string with following template:
<div class="toolbar">
  <div class="toolbar-inner">
    {{monthPicker}}
    {{yearPicker}}
  </div>
</div> 
Specific Picker Parameters
valuearrayArray with initial selected dates. Each array item represents selected date
formatValuefunction (p, values)Function to format input value, should return new/formatted string value. values is array where each item represents selected date
monthNamesarray['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August' , 'September' , 'October', 'November', 'December']Array with full month names
monthNamesShortarray['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']Array with short month names
dayNamesarray['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']Array with week day names
dayNamesShortarray['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']Array with week day short names
updateValuesOnTouchmovebooleantrueUpdates picker and input values during touch move
firstDaynumber1First day of the week. By default 1 - Monday
weekendDaysarray[0, 6]Array with index numeber of weekend days, by default it is Saturday and Sunday
dateFormatstring'yyyy-mm-dd'Default date format, available expressions:
  • 'yyyy' - 4 digits year
  • 'yy' - 2 digits year
  • 'mm' - 2 digits month number, from 01 to 12
  • 'm' - month number, from 1 to 12
  • 'MM' - full month name
  • 'M' - short month name
  • 'dd' - 2 digits day number, from 01 to 31
  • 'd' - day number, from 1 to 31
  • 'DD' - full week day name
  • 'D' - short week day name
multiplebooleanfalseEnable to allows select multiple dates/values
directionstring'horizontal'Months layout direction, could be 'horizontal' or 'vertical'
minDateDatenullMinimum allowed date
maxDateDatenullMaximum allowed date
touchmovebooleantrueIf enabled then calendar months slides follow finger during touch move
animatebooleantrueEnables transition between months
closeOnSelectbooleanfalseEnable and calendar will be closed when user pick a date
weekHeaderbooleantrueEnable week header with short name week days
monthPickerbooleantrueEnable month picker in toolbar
monthPickerTemplatestringMonth picker HTML template. By default it is:
<div class="picker-calendar-month-picker">
    <a href="#" class="link icon-only picker-calendar-prev-month">
        <i class="icon icon-prev"></i>
    </a>
    <span class="current-month-value"></span>
    <a href="#" class="link icon-only picker-calendar-next-month">
        <i class="icon icon-next"></i>
    </a>
</div>    
yearPickerbooleantrueEnable year picker in toolbar
yearPickerTemplatestringYear picker HTML template. By default it is:
<div class="picker-calendar-year-picker">
    <a href="#" class="link icon-only picker-calendar-prev-year">
        <i class="icon icon-prev"></i>
    </a>
    <span class="current-year-value"></span>
    <a href="#" class="link icon-only picker-calendar-next-year">
        <i class="icon icon-next"></i>
    </a>
</div>
Callbacks
onChangefunction (p, values, displayValues)Callback function that will be executed when picker value changed. values and displayValues are arrays where each item represents value/display value of related column
onMonthAddfunction (p, monthContainer)Callback function that will be executed when newly generated month HTML element will be added to calendar.
onDayClickfunction (p, dayContainer, year, month, day)Callback function that will be executed when user clicks/select any date
onMonthYearChangeStartfunction (p, year, month)Callback function that will be executed in the beginning of transition to another month/year
onMonthYearChangeEndfunction (p, year, month)Callback function that will be executed in the end of transition to another month/year
onOpenfunction (p)Callback function that will be executed when picker is opened
onClosefunction (p)Callback function that will be executed when picker is closed

Calendar Methods & Properties

After we initialize Calendar we have its initialized instance in variable (like myCalendar variable in example above) with helpful methods and properties:

Properties
myCalendar.paramsObject with passed initialization parameters
myCalendar.valueArray where each item represents selected date
myCalendar.openedtrue if Calendar is currently opened
myCalendar.inlinetrue if Calendar is inline Calendar
myCalendar.colsArray with specified Calendar columns. Each column also has its own methods and properties (look below)
myCalendar.containerDom7 instance with Calendar HTML container
Methods
myCalendar.setValue(values)Set new selected dates. values is array where each item represents selected date
myCalendar.nextMonth(duration)Calendar transition to next month for specified duration in ms
myCalendar.prevMonth(duration)Calendar transition to previous month for specified duration in ms
myCalendar.nextYear()Calendar transition to next year
myCalendar.prevYear()Calendar transition to previous year
myCalendar.setYearMonth(year, month, duration)Calendar transition to specified year, month for specified duration in ms
myCalendar.open()Open Calendar
myCalendar.close()Close Calendar
myCalendar.destroy()Destroy Calendar instance and remove all events

Access to Calendar's Instance

If you initialize Calendar as inline Calendar it is possible to access to Calendar's instance from its HTML container

var myCalendar = $$('.calenadr-inline')[0].f7Calendar;

Examples

Default Setup

<div class="content-block-title">Default setup</div>
<div class="list-block">
  <ul>
    <li>
      <div class="item-content">
        <div class="item-inner">
<div class="item-input">
  <input type="text" placeholder="Your birth date" readonly id="calendar-default">
</div>
        </div>
      </div>
    </li>
  </ul>
</div>          
var calendarDefault = myApp.calendar({
    input: '#calendar-default',
});          

Custom Date Format

<div class="content-block-title">Custom date format</div>
<div class="list-block">
  <ul>
    <li>
      <div class="item-content">
        <div class="item-inner">
<div class="item-input">
  <input type="text" placeholder="Select date" readonly id="calendar-date-format">
</div>
        </div>
      </div>
    </li>
  </ul>
</div>          
var calendarDateFormat = myApp.calendar({
    input: '#calendar-date-format',
    dateFormat: 'DD, MM dd, yyyy'
});          

Multiple Values

<div class="content-block-title">Multiple Values</div>
<div class="list-block">
  <ul>
    <li>
      <div class="item-content">
        <div class="item-inner">
<div class="item-input">
  <input type="text" placeholder="Select multiple dates" readonly id="calendar-multiple">
</div>
        </div>
      </div>
    </li>
  </ul>
</div>          
var calendarMultiple = myApp.calendar({
    input: '#calendar-multiple',
    dateFormat: 'M dd yyyy',
    multiple: true
});

Inline With Custom Toolbar

<div class="content-block-title">Inline with custom toolbar</div>
<div class="content-block">
  <div style="padding:0; margin-right:-15px; width:auto" class="content-block-inner">
    <div id="calendar-inline-container"></div>
  </div>
</div>          
var $$ = Dom7;
var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August' , 'September' , 'October', 'November', 'December'];
 
var calendarInline = myApp.calendar({
    container: '#calendar-inline-container',
    value: [new Date()],
    weekHeader: false,
    toolbarTemplate: 
        '<div class="toolbar calendar-custom-toolbar">' +
  '<div class="toolbar-inner">' +
      '<div class="left">' +
          '<a href="#" class="link icon-only"><i class="icon icon-back"></i></a>' +
      '</div>' +
      '<div class="center"></div>' +
      '<div class="right">' +
          '<a href="#" class="link icon-only"><i class="icon icon-forward"></i></a>' +
      '</div>' +
  '</div>' +
        '</div>',
    onOpen: function (p) {
        $$('.calendar-custom-toolbar .center').text(monthNames[p.currentMonth] +', ' + p.currentYear);
        $$('.calendar-custom-toolbar .left .link').on('click', function () {
  calendarInline.prevMonth();
        });
        $$('.calendar-custom-toolbar .right .link').on('click', function () {
  calendarInline.nextMonth();
        });
    },
    onMonthYearChangeStart: function (p) {
        $$('.calendar-custom-toolbar .center').text(monthNames[p.currentMonth] +', ' + p.currentYear);
    }
});