日曆 / 日期選擇器

日曆是一個觸控最佳化的元件,提供處理日期的簡易方式。

日曆可用作內嵌元件或疊加層。疊加層日曆在平板電腦(iPad)上會自動轉換為彈出視窗。

日曆應用程式方法

讓我們看看相關的應用程式方法,以使用日曆

app.calendar.create(參數)- 建立日曆執行個體

  • 參數 - 物件。包含日曆參數的物件

方法傳回建立的日曆執行個體

app.calendar.destroy(el)- 銷毀日曆執行個體

  • el - HTMLElement字串(包含 CSS 選擇器)或 物件。要銷毀的日曆元素或日曆執行個體。

app.calendar.get(el)- 透過 HTML 元素取得日曆執行個體

  • el - HTMLElement字串(包含 CSS 選擇器)。日曆元素。

方法傳回日曆執行個體

app.calendar.close(el)- 關閉日曆

  • el - HTMLElement字串(包含 CSS 選擇器)。要關閉的日曆元素。

方法傳回日曆執行個體

例如

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

日曆參數

讓我們看看所有可用的日曆參數清單

參數類型預設值說明
locale字串

日曆語言環境。應為 Intl.DateTimeFormat 所接受的正確語言環境。如果未指定(預設),它將使用瀏覽器語言環境。

例如 en-USruenen-US-u-ca-buddhist 等。

value陣列包含初始選取日期的陣列。每個陣列項目都代表選取的日期
disabled日期範圍其他停用日期。參數接受所謂的日期範圍(詳情請見下方)
事件日期範圍

有事件的日期。將在日曆日期上標記其他「點」。參數接受所謂的日期範圍(詳情請見下方)。

如果您要指出當天有幾個不同的事件,可以使用多個不同顏色的點來指出。在這種情況下,您需要將日期範圍傳遞為陣列,其中每個物件都有 datecolor 屬性,例如

[
  {
    date: new Date(2018, 4, 11),
    color: '#2196f3',
  },
  // same date but different color, one more dot will be added to this day
  {
    date: new Date(2018, 4, 11),
    color: '#4caf50',
  },
]
rangesClasses陣列您要為其新增自訂 CSS 類別的日期範圍以進行其他樣式設定。請見下方以了解可接受的格式
formatValue函數 (values)用於格式化輸入值的函數,應傳回新的/格式化的字串值。values 是陣列,其中每個項目都代表所選日期。可以用來取代 dateFormat 參數以指定自訂格式
monthNames陣列auto包含完整月份名稱的陣列。如果為 auto,則會根據指定的 locale(或瀏覽器 locale)顯示月份名稱
monthNamesShort陣列auto包含簡短月份名稱的陣列。如果為 auto,則會根據指定的 locale(或瀏覽器 locale)顯示月份名稱
dayNames陣列auto包含星期幾名稱的陣列。如果為 auto,則會根據指定的 locale(或瀏覽器 locale)顯示星期幾名稱
dayNamesShort陣列auto包含星期幾簡稱的陣列。如果為 auto,則會根據指定的 locale(或瀏覽器 locale)顯示星期幾名稱
firstDay數字1星期中的第一天。預設為 1 - 星期一
weekendDays陣列[0, 6]包含週末日期索引號碼的陣列,預設為星期六和星期日
dateFormat字串
物件
未定義

如果未定義,它將使用基於 locale(或瀏覽器 locale)的格式。

它可以接受 Intl.DateTimeFormat.options

例如 { month: 'long', day: 'numeric' }

或者您可以傳遞包含特殊代碼的字串,可用的表達式

  • yyyy - 4 位數年份
  • yy - 2 位數年份
  • mm - 2 位數月份數字,從 01 到 12
  • m - 月份數字,從 1 到 12
  • MM - 完整月份名稱
  • M - 簡短月份名稱
  • dd - 2 位數日期數字,從 01 到 31
  • d - 日期數字,從 1 到 31
  • DD - 完整星期名稱
  • D - 簡短星期名稱

timePicker 啟用時,有下列額外時間表達式可用

  • HH - 24 小時制 2 位數小時 (00 - 23)
  • H - 24 小時制小時 (0 - 23)
  • hh - 12 小時制 2 位數小時 (00 - 12)
  • h - 12 小時制小時 (0 - 12)
  • :mm - 2 位數分鐘 (00 - 59)
  • :m - 分鐘 (0 - 59)
  • ss - 2 位數秒數 (00 - 59)
  • s - 秒數 (0 - 59)
  • A - 大寫的午夜過後或上午 (PM 或 AM)
  • a - 小寫的午夜過後或上午 (pm 或 am)
多重布林值false啟用以允許選擇多個日期/值
rangePicker布林值false啟用以啟用範圍選擇器。與 multiple 不相容
rangePickerMinDays數字1rangePicker 啟用時,需要選擇的最少天數
rangePickerMaxDays數字0rangePicker 啟用時,允許選擇的最大天數。0 表示沒有最大值
方向字串'horizontal'月份佈局方向,可以是 'horizontal' 或 'vertical'
minDate日期null允許的最小日期
maxDate日期null允許的最大日期
touchMove布林值true如果啟用,則在觸控移動期間,日曆月份會跟著手指滑動
animate布林值true啟用月份之間的轉場
closeOnSelect布林值false啟用,當使用者選擇日期時,日曆會關閉
weekHeader布林值true啟用星期標頭,顯示星期名稱的簡稱
monthSelector布林值true在工具列中啟用月份選擇器
monthPicker布林值true在工具列中啟用月份選擇器,當使用者按一下月份選擇器時,可以選擇月份
yearSelector布林值true在工具列中啟用年份選擇器
yearPicker布林值true在工具列中啟用年份選擇器,當使用者按一下年份選擇器時,可以選擇年份
yearPickerMin數字年份選擇器的最小可用年份,預設為今日減去 100 年
yearPickerMax數字年份選擇器的最大可用年份,預設為今日加上 100 年
timePicker布林值false啟用時間選擇器。
timePickerFormat物件{hour: 'numeric', minute: 'numeric'}

時間選擇器中顯示的時間格式。它接受 Intl.DateTimeFormat.options

AM/PM 格式取決於所選的指定 locale,或在未指定時取決於瀏覽器 locale

timePickerPlaceholder字串選擇時間在時間選擇器 placeholder 中顯示的文字。
容器/開啟器特定參數
containerEl字串
HTMLElement
字串包含 CSS 選擇器或 HTMLElement,用於放置產生的日曆 HTML。僅用於內嵌日曆
openIn字串auto可以是 autopopover(在彈出視窗中開啟日曆)、sheet(在 sheet 模式中開啟)或 customModal(在自訂日曆模式覆疊中開啟)。如果是 auto,則會在小螢幕上以 sheet 模式開啟,在大螢幕上以彈出視窗開啟。
sheetPush布林值false啟用日曆 sheet 在開啟時推動後面的檢視
sheetSwipeToClose布林值未定義啟用使用滑動關閉日曆 sheet 的功能。未指定時,它會繼承應用程式的 Sheet swipeToClose 參數
inputEl字串或 HTMLElement字串包含 CSS 選擇器或 HTMLElement,其中包含相關的輸入元素
scrollToInput布林值true在日曆開啟時將視窗(頁面內容)捲動到輸入
inputReadOnly布林值true在指定的輸入上設定「readonly」屬性
cssClass字串要在日曆元素上設定的附加 CSS 類別名稱
closeByOutsideClick布林值true如果啟用,則會在點選選擇器或相關輸入元素之外的地方關閉選擇器
toolbar布林值true啟用日曆工具列
toolbarCloseText字串完成完成/關閉工具列按鈕的文字
header布林值false啟用日曆標頭
headerPlaceholder字串選擇日期預設日曆標頭 placeholder 文字
routableModals布林值false會將開啟的日曆加入路由記錄,這能讓使用者透過回到路由記錄並將目前路由設定為日曆模式來關閉日曆
url字串date/會設定為目前路由的日曆模式 URL
view物件在啟用 routableModals 時設定路由的檢視。預設為 inputEl 的父檢視,如果找不到父檢視,則為主要檢視
backdrop布林值啟用日曆背景(背景為深色半透明圖層)。預設只有在日曆以彈出視窗開啟時才會啟用。
closeByBackdropClick布林值true啟用時,點選背景會關閉日曆
渲染函數
renderWeekHeader函數渲染星期標題的函數。必須回傳星期標題的 HTML 字串
renderMonthsfunction(date)渲染月份包裝器的函數。必須回傳月份容器的完整 HTML 字串
renderMonthfunction(date, offset)渲染單一月份的函數。必須回傳單一月份的 HTML 字串
renderMonthSelector函數渲染月份選擇器的函數。必須回傳月份選擇器的 HTML 字串
renderYearSelector函數渲染年份選擇器的函數。必須回傳年份選擇器的 HTML 字串
renderHeader函數渲染日曆標題的函數。必須回傳日曆標題的 HTML 字串
renderToolbar函數渲染工具列的函數。必須回傳工具列的 HTML 字串
render函數渲染整個日曆的函數。必須回傳日曆的完整 HTML 字串
事件
on物件

包含事件處理常式的物件。例如

var calendar = app.calendar.create({
  ...
  on: {
    opened: function () {
      console.log('Calendar opened')
    }
  }
})

請注意,所有下列參數都可以在 calendar 屬性下的全域應用程式參數中使用,以設定所有日曆的預設值。例如

var app = new Framework7({
  calendar: {
    url: 'calendar/',
    dateFormat: 'dd.mm.yyyy',
  }
});

日期範圍

某些日曆參數 (disabledeventsrangesClasses) 接受所謂的日期範圍。這是一種指定並涵蓋所有可能日期組合的簡單方法。

它可以是包含日期的陣列,例如

var calendar = app.calendar.create({
    ...
    // Disabled 10th November 2015 and 11th November 2015:
    disabled: [new Date(2015, 10, 10), new Date(2015, 10, 11)],
    ...
});

它可以是自訂函數,您需要回傳 truefalse

var calendar = app.calendar.create({
    ...
    //Disabled all dates in November 2015
    disabled: function (date) {
        if (date.getFullYear() === 2015 && date.getMonth() === 10) {
            return true;
        }
        else {
            return false;
        }
    },
    ...
});

或包含 fromto 屬性的物件

var calendar = app.calendar.create({
    ...
    //Disable all dates between 1st October 2015 and 31 December 2015
    disabled: {
        from: new Date(2015, 9, 1),
        to: new Date(2015, 11, 31)
    },
    ...
});

或僅包含 fromto 屬性的物件

var calendar = app.calendar.create({
    ...
    //Disable everyting since December 2015
    disabled: {
        from: new Date(2015, 11, 1)
    },
    ...
});

或包含 date 屬性的物件

var calendar = app.calendar.create({
    ...
    // Disabled 1th December 2015
    disabled: {
        date: new Date(2015, 11, 1)
    },
    ...
});

或包含混合日期和物件的陣列

var calendar = app.calendar.create({
    ...
    events: [
        new Date(2015, 9, 1),
        new Date(2015, 9, 5),
        {
            from: new Date(2015, 9, 10),
            to: new Date(2015, 9, 15)
        },
        {
            from: new Date(2015, 9, 20),
            to: new Date(2015, 9, 31)
        },
        {
            date: new Date(2015, 11, 1),
            color: '#ff0000'
        },
        // same date but one more color dot will be added
        {
            date: new Date(2015, 11, 1),
            color: '#00ff00'
        },
    ],
    ...
});

rangesClasses

rangesClasses 參數接受包含日期範圍和此範圍類別名稱的物件陣列

var calendar = app.calendar.create({
    ...
    //Add classes for november and october
    rangesClasses: [
        //Add "day-october' class for all october dates
        {
            // string CSS class name for this range in "cssClass" property
            cssClass: 'day-october', //string CSS class
            // Date Range in "range" property
            range: function (date) {
                return date.getMonth() === 9
            }
        },
        //Add "day-holiday" class for 1-10th January 2016
        {
            cssClass: 'day-holiday',
            range: {
                from: new Date(2016, 0, 1),
                to: new Date(2016, 0, 10)
            }
        }
    ],
    ...
});

日曆方法和屬性

初始化日曆後,我們在變數中擁有其初始化的執行個體 (例如上述範例中的 calendar 變數),其中包含有用的方法和屬性

屬性
calendar.app連結到全域應用程式執行個體
calendar.containerEl日曆包裝容器 HTML 元素 (當使用內嵌日曆時)
calendar.$containerEl包含日曆包裝容器 HTML 元素的 Dom7 執行個體 (當使用內嵌日曆時)
calendar.el日曆 HTML 元素
calendar.$el包含日曆 HTML 元素的 Dom7 執行個體
calendar.inputEl日曆輸入 HTML 元素(傳入 inputEl 參數)
calendar.$inputEl包含日曆輸入 HTML 元素的 Dom7 實例(傳入 inputEl 參數)
calendar.value陣列,其中每個項目代表選取的日期
calendar.currentMonth日曆檢視目前月份。數字,範圍從 011
calendar.currentYear日曆檢視目前年份。數字,例如 2020
calendar.opened如果日曆目前已開啟,則為 true
calendar.inline當使用內嵌日曆時為 true
calendar.cols包含指定日曆欄的陣列。每個欄也有自己的方法和屬性(請參閱下方)
calendar.url日曆 URL(傳入 url 參數)
calendar.view日曆檢視(傳入 view 參數)或找到父檢視
calendar.params包含初始化參數的物件
calendar.allowTouchMove將此旗標設為 false 以防止初始化後觸控移動互動
方法
calendar.setValue(values)設定新的選取日期。values 是陣列,其中每個項目代表選取的日期
calendar.getValue()傳回目前的日曆值
calendar.addValue()將值新增至值陣列。當啟用多重選取(使用 multiple: true 參數)時,這很有用
calendar.update()重新呈現日曆。當您動態新增/變更值且需要更新日曆配置時,這很有用
calendar.nextMonth(duration)日曆轉換至下個月,指定 duration 以毫秒為單位
calendar.prevMonth(duration)日曆轉換至上個月,指定 duration 以毫秒為單位
calendar.nextYear()日曆轉換至下一年
calendar.prevYear()日曆轉換至上一年
calendar.setYearMonth(year, month, duration)日曆轉換至指定的 yearmonth,指定 duration 以毫秒為單位
calendar.open()開啟日曆
calendar.close()關閉日曆
calendar.destroy()銷毀日曆實例並移除所有事件
calendar.on(event, handler)新增事件處理常式
calendar.once(event, handler)新增事件處理常式,在觸發後將會移除
calendar.off(事件, 處理函式)移除事件處理函式
calendar.off(事件)移除指定事件的所有處理函式
calendar.emit(事件, ...args)在實例上觸發事件

日曆事件

日曆會在日曆元素上觸發下列 DOM 事件,以及在 app 和日曆實例上觸發事件

DOM 事件

事件目標說明
calendar:open日曆元素<div class="calendar">當日曆開始開啟動畫時,將觸發事件
calendar:opened日曆元素<div class="calendar">當日曆完成開啟動畫後,將觸發事件
calendar:close日曆元素<div class="calendar">當日曆開始關閉動畫時,將觸發事件
calendar:closed日曆元素<div class="calendar">當日曆完成關閉動畫後,將觸發事件

App 和日曆實例事件

日曆實例會在自身實例和 app 實例上發出事件。App 實例事件具有相同的名稱,但前面加上 calendar

事件目標參數說明
dayClick日曆(日曆、dayEl、年、月、日)在日曆日期元素上按一下後,將觸發事件
calendarDayClickapp
change日曆(日曆、值)當日曆值變更時,將觸發事件
calendarChangeapp
monthAdd日曆(日曆、monthEl)當新增新的月份 HTML 版面時,將觸發事件。如果您需要後處理新增的 html 元素,這會很有用
calendarMonthAddapp
monthYearChangeStart日曆(日曆、年、月)在轉換到下個月份的開始時,將觸發事件
calendarMonthYearChangeStartapp
monthYearChangeEnd日曆(日曆、年、月)在轉換到下個月份後,將觸發事件
calendarMonthYearChangeEndapp
init日曆(日曆)當日曆初始化時,將觸發事件
calendarInitapp
open日曆(日曆)當日曆開始開啟動畫時,將觸發事件。事件處理函式會收到日曆實例作為參數
calendarOpenapp
opened日曆(日曆)當日曆完成開啟動畫後,將觸發事件。事件處理函式會收到日曆實例作為參數
calendarOpenedapp
close日曆(日曆)當日曆開始其關閉動畫時,將觸發事件。作為參數,事件處理程序接收日曆實例
calendarCloseapp
closed日曆(日曆)當日曆完成其關閉動畫後,將觸發事件。作為參數,事件處理程序接收日曆實例
calendarClosedapp
beforeDestroy日曆(日曆)在日曆實例被銷毀之前,將觸發事件。作為參數,事件處理程序接收日曆實例
calendarBeforeDestroyapp

CSS 變數

以下是相關 CSS 變數 (CSS 自訂屬性) 的清單。

請注意,註解的變數並未在預設情況下指定,而它們的值是它們在此情況下的後備值。

:root {
  --f7-calendar-height: 340px;
  --f7-calendar-sheet-landscape-height: 220px;
  --f7-calendar-popover-width: 320px;
  --f7-calendar-popover-height: 320px;
  --f7-calendar-modal-height: 420px;
  --f7-calendar-modal-max-width: 380px;
  /*
  --f7-calendar-header-bg-color: var(--f7-bars-bg-color);
  --f7-calendar-header-link-color: var(--f7-bars-link-color);
  --f7-calendar-header-text-color: var(--f7-bars-text-color);
  --f7-calendar-footer-bg-color: var(--f7-bars-bg-color);
  --f7-calendar-footer-border-color: var(--f7-bars-border-color);
  --f7-calendar-footer-link-color: var(--f7-bars-link-color);
  --f7-calendar-footer-text-color: var(--f7-bars-text-color);
  */
  --f7-calendar-week-header-bg-color: transparent;
  --f7-calendar-footer-padding: 0 8px;
  --f7-calendar-week-header-font-size: 11px;
  /*
  --f7-calendar-selected-bg-color:  var(--f7-theme-color);
  */
  --f7-calendar-disabled-text-color: #d4d4d4;
  --f7-calendar-event-dot-size: 4px;
  /*
  --f7-calendar-event-bg-color: var(--f7-theme-color);
  */
  /*
  --f7-calendar-picker-selected-text-color: var(--f7-theme-color);
  */
  --f7-calendar-time-selector-height: 28px;
  --f7-calendar-picker-pressed-bg-color: rgba(0, 0, 0, 0.1);
  --f7-calendar-picker-hover-bg-color: rgba(0, 0, 0, 0.03);
  --f7-calendar-time-selector-bg-color: rgba(0, 0, 0, 0.05);
}
:root .dark,
:root.dark {
  --f7-calendar-picker-pressed-bg-color: rgba(255, 255, 255, 0.08);
  --f7-calendar-picker-hover-bg-color: rgba(255, 255, 255, 0.03);
  --f7-calendar-time-selector-bg-color: rgba(255, 255, 255, 0.1);
}
.ios {
  --f7-calendar-selected-text-color: #fff;
  --f7-calendar-header-height: 44px;
  --f7-calendar-header-font-size: 17px;
  --f7-calendar-header-font-weight: 600;
  --f7-calendar-header-padding: 0 8px;
  --f7-calendar-footer-height: 44px;
  --f7-calendar-footer-font-size: 17px;
  --f7-calendar-week-header-height: 18px;
  --f7-calendar-day-font-size: 15px;
  --f7-calendar-day-size: 30px;
  --f7-calendar-picker-font-size: 17px;
  --f7-calendar-time-selector-font-size: 17px;
  --f7-calendar-modal-border-radius: 4px;
  --f7-calendar-modal-box-shadow: 0px 11px 15px -7px rgba(0, 0, 0, 0.2),
                                  0px 24px 38px 3px rgba(0, 0, 0, 0.14),
                                  0px 9px 46px 8px rgba(0, 0, 0, 0.12);
  --f7-calendar-prev-next-text-color: #c8c8c8;
  --f7-calendar-sheet-border-color: #929499;
  --f7-calendar-sheet-bg-color: #fff;
  --f7-calendar-week-header-text-color: #5e5e5e;
  --f7-calendar-modal-bg-color: #fff;
  --f7-calendar-day-text-color: #000;
  --f7-calendar-today-text-color: #000;
  --f7-calendar-today-bg-color: #e3e3e3;
}
.ios .dark,
.ios.dark {
  --f7-calendar-prev-next-text-color: #5e5e5e;
  --f7-calendar-sheet-border-color: var(--f7-bars-border-color);
  --f7-calendar-sheet-bg-color: #121212;
  --f7-calendar-week-header-text-color: #aaa;
  --f7-calendar-modal-bg-color: #121212;
  --f7-calendar-day-text-color: #fff;
  --f7-calendar-today-text-color: #fff;
  --f7-calendar-today-bg-color: #333;
}
.md {
  --f7-calendar-sheet-border-color: transparent;
  --f7-calendar-header-height: 64px;
  --f7-calendar-header-font-size: 24px;
  --f7-calendar-header-font-weight: 400;
  --f7-calendar-header-padding: 0 24px;
  --f7-calendar-footer-height: 56px;
  --f7-calendar-footer-font-size: 14px;
  --f7-calendar-week-header-height: 24px;
  --f7-calendar-day-font-size: 14px;
  --f7-calendar-today-bg-color: none;
  --f7-calendar-day-size: 32px;
  --f7-calendar-picker-font-size: 14px;
  --f7-calendar-time-selector-font-size: 14px;
  --f7-calendar-modal-border-radius: 28px;
  --f7-calendar-modal-box-shadow: none;
}
.md,
.md .dark,
.md [class*='color-'] {
  --f7-calendar-sheet-bg-color: var(--f7-md-surface-1);
  --f7-calendar-selected-text-color: var(--f7-md-on-primary);
  --f7-calendar-week-header-text-color: var(--f7-md-on-surface-variant);
  --f7-calendar-day-text-color: var(--f7-md-on-surface);
  --f7-calendar-prev-next-text-color: rgba(var(--f7-md-on-surface-variant-rgb), 0.55);
  --f7-calendar-today-text-color: var(--f7-theme-color);
  --f7-calendar-modal-bg-color: var(--f7-md-surface-1);
}

範例

calendar.html
<template>
  <div class="page">
    <div class="navbar">
      <div class="navbar-bg"></div>
      <div class="navbar-inner sliding">
        <div class="title">Calendar</div>
      </div>
    </div>
    <div class="page-content">
      <div class="block">
        <p>Calendar is a touch optimized component that provides an easy way to handle dates.</p>
        <p>Calendar could be used as inline component or as overlay. Overlay Calendar will be automatically converted to
          Popover on tablets (iPad).</p>
      </div>
      <div class="block-title">Default setup</div>
      <div class="list list-strong-ios list-outline-ios">
        <ul>
          <li>
            <div class="item-content item-input">
              <div class="item-inner">
                <div class="item-input-wrap">
                  <input type="text" placeholder="Your birth date" readonly="readonly" id="demo-calendar-default" />
                </div>
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Custom date format</div>
      <div class="list list-strong-ios list-outline-ios">
        <ul>
          <li>
            <div class="item-content item-input">
              <div class="item-inner">
                <div class="item-input-wrap">
                  <input type="text" placeholder="Select date" readonly="readonly" id="demo-calendar-date-format" />
                </div>
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Date + Time</div>
      <div class="list list-strong-ios list-outline-ios">
        <ul>
          <li>
            <div class="item-content item-input">
              <div class="item-inner">
                <div class="item-input-wrap">
                  <input type="text" placeholder="Select date and time" readonly="readonly"
                    id="demo-calendar-date-time" />
                </div>
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Multiple Values</div>
      <div class="list list-strong-ios list-outline-ios">
        <ul>
          <li>
            <div class="item-content item-input">
              <div class="item-inner">
                <div class="item-input-wrap">
                  <input type="text" placeholder="Select multiple dates" readonly="readonly"
                    id="demo-calendar-multiple" />
                </div>
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Range Picker</div>
      <div class="list list-strong-ios list-outline-ios">
        <ul>
          <li>
            <div class="item-content item-input">
              <div class="item-inner">
                <div class="item-input-wrap">
                  <input type="text" placeholder="Select date range" readonly="readonly" id="demo-calendar-range" />
                </div>
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Open in Modal</div>
      <div class="list list-strong-ios list-outline-ios">
        <ul>
          <li>
            <div class="item-content item-input">
              <div class="item-inner">
                <div class="item-input-wrap">
                  <input type="text" placeholder="Select date" readonly="readonly" id="demo-calendar-modal" />
                </div>
              </div>
            </div>
          </li>
        </ul>
      </div>
      <div class="block-title">Calendar Page</div>
      <div class="list list-strong list-outline-ios">
        <ul>
          <li>
            <a href="/calendar-page/" class="item-content item-link">
              <div class="item-inner">
                <div class="item-title">Open Calendar Page</div>
              </div>
            </a>
          </li>
        </ul>
      </div>
      <div class="block-title">Inline with custom toolbar</div>
      <div class="block block-strong no-padding">
        <div id="demo-calendar-inline-container"></div>
      </div>
    </div>
  </div>
</template>
<script>
  export default (props, { $f7, $, $on }) => {
    let calendarDefault
    let calendarDateFormat;
    let calendarDateTime;
    let calendarMultiple;
    let calendarRange;
    let calendarModal;
    let calendarInline;
    $on('pageInit', () => {
      // Default
      calendarDefault = $f7.calendar.create({
        inputEl: '#demo-calendar-default',
      });

      // With custom date format
      calendarDateFormat = $f7.calendar.create({
        inputEl: '#demo-calendar-date-format',
        dateFormat: { weekday: 'long', month: 'long', day: '2-digit', year: 'numeric' },
      });

      // Date + Time
      calendarDateTime = $f7.calendar.create({
        inputEl: '#demo-calendar-date-time',
        timePicker: true,
        dateFormat: { month: 'numeric', day: 'numeric', year: 'numeric', hour: 'numeric', minute: 'numeric' },
      });

      // With multiple values
      calendarMultiple = $f7.calendar.create({
        inputEl: '#demo-calendar-multiple',
        dateFormat: { month: 'short', day: 'numeric' },
        multiple: true
      });
      // Range Picker
      calendarRange = $f7.calendar.create({
        inputEl: '#demo-calendar-range',
        rangePicker: true
      });
      // Custom modal
      calendarModal = $f7.calendar.create({
        inputEl: '#demo-calendar-modal',
        openIn: 'customModal',
        header: true,
        footer: true,
      });
      // Inline with custom toolbar
      var monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
      calendarInline = $f7.calendar.create({
        containerEl: '#demo-calendar-inline-container',
        value: [new Date()],
        renderToolbar: function () {
          return '<div class="toolbar calendar-custom-toolbar no-shadow">' +
            '<div class="toolbar-inner">' +
            '<div class="left">' +
            '<a  class="link icon-only"><i class="icon icon-back"></i></a>' +
            '</div>' +
            '<div class="center"></div>' +
            '<div class="right">' +
            '<a  class="link icon-only"><i class="icon icon-forward"></i></a>' +
            '</div>' +
            '</div>' +
            '</div>';
        },
        on: {
          init: function (c) {
            $('.calendar-custom-toolbar .center').text(monthNames[c.currentMonth] + ', ' + c.currentYear);
            $('.calendar-custom-toolbar .left .link').on('click', function () {
              calendarInline.prevMonth();
            });
            $('.calendar-custom-toolbar .right .link').on('click', function () {
              calendarInline.nextMonth();
            });
          },
          monthYearChangeStart: function (c) {
            $('.calendar-custom-toolbar .center').text(monthNames[c.currentMonth] + ', ' + c.currentYear);
          }
        }
      });
    });
    $on('pageBeforeRemove', () => {
      calendarDefault.destroy();
      calendarDateFormat.destroy();
      calendarDateTime.destroy();
      calendarMultiple.destroy();
      calendarRange.destroy();
      calendarModal.destroy();
      calendarInline.destroy();
    });

    return $render;
  };
</script>