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