v1.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?php
  2. /**
  3. * The dateRangePicker widget class file of zin module of ZenTaoPMS.
  4. *
  5. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
  6. * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  7. * @author sunhao<sunhao@easycorp.ltd>
  8. * @package zin
  9. * @link http://www.zentao.net
  10. */
  11. namespace zin;
  12. require_once dirname(__DIR__) . DS . 'datepicker' . DS . 'v1.php';
  13. /**
  14. * 日期范围选择器(dateRangePicker)部件类
  15. * The date range picker widget class
  16. */
  17. class dateRangePicker extends wg
  18. {
  19. /**
  20. * Define widget properties.
  21. *
  22. * @var array
  23. * @access protected
  24. */
  25. protected static $defineProps = array
  26. (
  27. 'beginName?: string', // 开始日期表单项名称。
  28. 'endName?: string', // 结束日期表单项名称。
  29. 'beginValue?: string', // 开始日期默认值。
  30. 'endValue?: string', // 结束日期默认值。
  31. 'beginPlaceholder?: string', // 开始日期占位文本。
  32. 'endPlaceholder?: string', // 结束日期占位文本。
  33. 'beginDisabled?: bool', // 开始日期禁用。
  34. 'endDisabled?: bool', // 结束日期禁用。
  35. 'addon?: string="-"', // 开始和结束日期之间的分隔符。
  36. 'format?: string', // 日期格式。
  37. 'required?: bool', // 是否必填。
  38. 'begin?: array', // 开始日期选择器配置。
  39. 'end?: array', // 结束日期选择器配置。
  40. 'endMenu?: array|bool|jsCallback', // 结束日期快捷设置菜单。
  41. 'endList?: array|jsCallback' // 结束日期快捷设置选项。
  42. );
  43. protected function buildBeginProps()
  44. {
  45. list($beginName, $beginValue, $beginPlaceholder, $format, $required, $begin, $beginDisabled) = $this->prop(array('beginName', 'beginValue', 'beginPlaceholder', 'format', 'required', 'begin', 'beginDisabled'));
  46. $props = array();
  47. $props['icon'] = '';
  48. $props['name'] = $beginName;
  49. $props['value'] = $beginValue;
  50. $props['placeholder'] = $beginPlaceholder;
  51. $props['format'] = $format;
  52. $props['required'] = $required;
  53. $props['disabled'] = $beginDisabled;
  54. return is_array($begin) ? array_merge($props, $begin) : $props;
  55. }
  56. protected function buildEndProps()
  57. {
  58. list($endName, $endValue, $endPlaceholder, $format, $required, $end, $endMenu, $endList, $endDisabled) = $this->prop(array('endName', 'endValue', 'endPlaceholder', 'format', 'required', 'end', 'endMenu', 'endList', 'endDisabled'));
  59. $id = "{$this->gid}_end";
  60. if($endMenu === true || (empty($endMenu) && !empty($endList))) $endMenu = array();
  61. if(is_array($endMenu) && !empty($endList))
  62. {
  63. if(is_array($endList))
  64. {
  65. $endMenu['items'] = jsCallback()
  66. ->const('endList', $endList)
  67. ->const('$ele', jsRaw("$('#$id').closest('.date-range-picker')"))
  68. ->const('beginDate', jsRaw('zui.createDate($ele.find(".date-picker>input.pick-value").first().val())'))
  69. ->do(<<<'JS'
  70. return Object.keys(endList).map((key) =>
  71. {
  72. const date = zui.addDate(beginDate, key - 1);
  73. return {text: endList[key], 'data-set-date': zui.formatDate(date, "yyyy-MM-dd")};
  74. });
  75. JS
  76. );
  77. }
  78. else
  79. {
  80. $endMenu['items'] = $endList;
  81. }
  82. }
  83. $props = array();
  84. $props['icon'] = '';
  85. $props['id'] = $id;
  86. $props['name'] = $endName;
  87. $props['value'] = $endValue;
  88. $props['placeholder'] = $endPlaceholder;
  89. $props['format'] = $format;
  90. $props['required'] = $required;
  91. $props['disabled'] = $endDisabled;
  92. $props['menu'] = $endMenu;
  93. $props['minDate'] = jsRaw(<<<JS
  94. () => zui.formatDate(\$('#{$id}').closest('.date-range-picker').find('.date-picker>input.pick-value').first().val(), 'yyyy-MM-dd')
  95. JS
  96. );
  97. return is_array($end) ? array_merge($props, $end) : $props;
  98. }
  99. /**
  100. * Build the widget.
  101. *
  102. * @access protected
  103. * @return mixed
  104. */
  105. protected function build()
  106. {
  107. $begin = new datePicker(set($this->buildBeginProps()));
  108. $end = new datePicker(set($this->buildEndProps()));
  109. return div
  110. (
  111. setClass('date-range-picker center-row'),
  112. set($this->getRestProps()),
  113. $begin,
  114. div(setClass('addon px-2'), $this->prop('addon')),
  115. $end,
  116. $this->children()
  117. );
  118. }
  119. }