DateRange.php 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <?php
  2. namespace Dcat\Admin\Form\Field;
  3. use Dcat\Admin\Admin;
  4. use Dcat\Admin\Form\Field;
  5. use Psy\Util\Str;
  6. class DateRange extends Field
  7. {
  8. protected $format = 'YYYY-MM-DD';
  9. /**
  10. * Column name.
  11. *
  12. * @var string
  13. */
  14. protected $column = [];
  15. public function __construct($column, $arguments)
  16. {
  17. $this->column['start'] = $column;
  18. $this->column['end'] = $arguments[0];
  19. array_shift($arguments);
  20. $this->label = $this->formatLabel($arguments);
  21. $this->id = $this->formatId($this->column);
  22. $this->options(['format' => $this->format]);
  23. }
  24. public function prepare($value)
  25. {
  26. if ($value === '') {
  27. $value = null;
  28. }
  29. return $value;
  30. }
  31. public function render()
  32. {
  33. $this->options['locale'] = config('app.locale');
  34. $startOptions = json_encode($this->options);
  35. $endOptions = json_encode($this->options + ['useCurrent' => false]);
  36. $class = $this->getElementClassSelector();
  37. $this->script = <<<JS
  38. $('{$class['start']}').datetimepicker($startOptions);
  39. $('{$class['end']}').datetimepicker($endOptions);
  40. $("{$class['start']}").on("dp.change", function (e) {
  41. $('{$class['end']}').data("DateTimePicker").minDate(e.date);
  42. });
  43. $("{$class['end']}").on("dp.change", function (e) {
  44. $('{$class['start']}').data("DateTimePicker").maxDate(e.date);
  45. });
  46. JS;
  47. return parent::render();
  48. }
  49. /**
  50. * Get validation messages for the field.
  51. *
  52. * @return array|mixed
  53. */
  54. public function getValidationMessages()
  55. {
  56. // Default validation message.
  57. $messages = parent::getValidationMessages();
  58. $result = [];
  59. foreach ($messages as $key => $message) {
  60. $column = explode('.', $key);
  61. $rule = array_pop($column);
  62. $column = join('.', $column);
  63. if ($this->column['start'] == $column) {
  64. $result[$column.'start.'.$rule] = $message;
  65. } else {
  66. $result[$key] = $message;
  67. }
  68. }
  69. return $result;
  70. }
  71. public static function collectAssets()
  72. {
  73. Admin::collectComponentAssets('moment');
  74. Admin::collectComponentAssets('bootstrap-datetimepicker');
  75. }
  76. }