SelectDateDialog.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <template>
  2. <Dialog ref="dialog" v-model="dialogVisible">
  3. <template #header>
  4. <div class="row items-center">
  5. <div style="font-size: 130%">
  6. Выбрать даты
  7. </div>
  8. </div>
  9. </template>
  10. <div ref="box" class="column q-mt-xs overflow-auto no-wrap" style="width: 240px; padding: 0px 10px 10px 10px;">
  11. <div class="row items-center">
  12. <span class="q-mr-sm">От:</span>
  13. <q-btn icon="la la-calendar" color="secondary" :label="labelFrom" dense no-caps style="width: 150px;">
  14. <q-popup-proxy cover transition-show="scale" transition-hide="scale">
  15. <q-date v-model="from" mask="YYYY-MM-DD">
  16. <div class="row items-center justify-end q-gutter-sm">
  17. <q-btn v-close-popup label="Отмена" color="primary" flat />
  18. <q-btn v-close-popup label="OK" color="primary" flat @click="save" />
  19. </div>
  20. </q-date>
  21. </q-popup-proxy>
  22. </q-btn>
  23. <q-icon name="la la-times-circle" class="q-ml-sm text-grey-6 clickable2" size="28px" @click="from = ''; save();" />
  24. </div>
  25. <div class="q-my-sm" />
  26. <div class="row items-center">
  27. <span class="q-mr-sm">До:</span>
  28. <q-btn icon="la la-calendar" color="secondary" :label="labelTo" dense no-caps style="width: 150px;">
  29. <q-popup-proxy cover transition-show="scale" transition-hide="scale">
  30. <q-date v-model="to" mask="YYYY-MM-DD">
  31. <div class="row items-center justify-end q-gutter-sm">
  32. <q-btn v-close-popup label="Отмена" color="primary" flat />
  33. <q-btn v-close-popup label="OK" color="primary" flat @click="save" />
  34. </div>
  35. </q-date>
  36. </q-popup-proxy>
  37. </q-btn>
  38. <q-icon name="la la-times-circle" class="q-ml-sm text-grey-6 clickable2" size="28px" @click="to = ''; save();" />
  39. </div>
  40. </div>
  41. <template #footer>
  42. <q-btn class="q-px-md q-ml-sm" color="primary" dense no-caps @click="okClick">
  43. OK
  44. </q-btn>
  45. </template>
  46. </Dialog>
  47. </template>
  48. <script>
  49. //-----------------------------------------------------------------------------
  50. import vueComponent from '../../vueComponent.js';
  51. import Dialog from '../../share/Dialog.vue';
  52. import * as utils from '../../../share/utils';
  53. const componentOptions = {
  54. components: {
  55. Dialog
  56. },
  57. watch: {
  58. modelValue(newValue) {
  59. this.dialogVisible = newValue;
  60. },
  61. dialogVisible(newValue) {
  62. this.$emit('update:modelValue', newValue);
  63. },
  64. date() {
  65. this.updateFromTo();
  66. },
  67. }
  68. };
  69. class SelectDateDialog {
  70. _options = componentOptions;
  71. _props = {
  72. modelValue: Boolean,
  73. date: String,
  74. };
  75. dialogVisible = false;
  76. from = '';
  77. to = '';
  78. created() {
  79. }
  80. mounted() {
  81. this.updateFromTo();
  82. }
  83. updateFromTo() {
  84. this.from = this.splitDate.from;
  85. this.to = this.splitDate.to;
  86. }
  87. isManualDate(date) {
  88. return date && utils.isDigit(date[0]) && utils.isDigit(date[1]);
  89. }
  90. get splitDate() {
  91. if (!this.isManualDate(this.date))
  92. return {from: '', to: ''};
  93. const [from = '', to = ''] = (this.date || '').split(',');
  94. return {from, to};
  95. }
  96. get labelFrom() {
  97. return (this.splitDate.from ? utils.sqlDateFormat(this.splitDate.from) : 'Не указано');
  98. }
  99. get labelTo() {
  100. return (this.splitDate.to ? utils.sqlDateFormat(this.splitDate.to) : 'Не указано');
  101. }
  102. save() {
  103. let d = this.from;
  104. if (this.to)
  105. d += `,${this.to}`;
  106. this.$emit('update:date', d);
  107. }
  108. okClick() {
  109. this.dialogVisible = false;
  110. }
  111. }
  112. export default vueComponent(SelectDateDialog);
  113. //-----------------------------------------------------------------------------
  114. </script>
  115. <style scoped>
  116. .clickable2 {
  117. cursor: pointer;
  118. }
  119. </style>