template-search-form.vue 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <template>
  2. <!-- 搜索框入口 -->
  3. <view @click="visible = true">
  4. <wd-search :placeholder="placeholder" hide-cancel disabled />
  5. </view>
  6. <!-- 搜索弹窗 -->
  7. <wd-popup v-model="visible" position="top" @close="visible = false">
  8. <view class="yd-search-form-container" :style="{ paddingTop: `${getNavbarHeight()}px` }">
  9. <view class="yd-search-form-item">
  10. <view class="yd-search-form-label">
  11. 模板名称
  12. </view>
  13. <wd-input
  14. v-model="formData.name"
  15. placeholder="请输入模板名称"
  16. clearable
  17. />
  18. </view>
  19. <view class="yd-search-form-item">
  20. <view class="yd-search-form-label">
  21. 模板编码
  22. </view>
  23. <wd-input
  24. v-model="formData.code"
  25. placeholder="请输入模板编码"
  26. clearable
  27. />
  28. </view>
  29. <view class="yd-search-form-item">
  30. <view class="yd-search-form-label">
  31. 短信类型
  32. </view>
  33. <wd-radio-group v-model="formData.type" shape="button">
  34. <wd-radio :value="-1">
  35. 全部
  36. </wd-radio>
  37. <wd-radio
  38. v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_SMS_TEMPLATE_TYPE)"
  39. :key="dict.value"
  40. :value="dict.value"
  41. >
  42. {{ dict.label }}
  43. </wd-radio>
  44. </wd-radio-group>
  45. </view>
  46. <view class="yd-search-form-item">
  47. <view class="yd-search-form-label">
  48. 开启状态
  49. </view>
  50. <wd-radio-group v-model="formData.status" shape="button">
  51. <wd-radio :value="-1">
  52. 全部
  53. </wd-radio>
  54. <wd-radio
  55. v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
  56. :key="dict.value"
  57. :value="dict.value"
  58. >
  59. {{ dict.label }}
  60. </wd-radio>
  61. </wd-radio-group>
  62. </view>
  63. <view class="yd-search-form-item">
  64. <view class="yd-search-form-label">
  65. 创建时间
  66. </view>
  67. <view class="yd-search-form-date-range-container">
  68. <view class="flex-1" @click="visibleCreateTime[0] = true">
  69. <view class="yd-search-form-date-range-picker">
  70. {{ formatDate(formData.createTime?.[0]) || '开始日期' }}
  71. </view>
  72. </view>
  73. -
  74. <view class="flex-1" @click="visibleCreateTime[1] = true">
  75. <view class="yd-search-form-date-range-picker">
  76. {{ formatDate(formData.createTime?.[1]) || '结束日期' }}
  77. </view>
  78. </view>
  79. </view>
  80. <wd-datetime-picker-view v-if="visibleCreateTime[0]" v-model="tempCreateTime[0]" type="date" />
  81. <view v-if="visibleCreateTime[0]" class="yd-search-form-date-range-actions">
  82. <wd-button size="small" plain @click="visibleCreateTime[0] = false">
  83. 取消
  84. </wd-button>
  85. <wd-button size="small" type="primary" @click="handleCreateTime0Confirm">
  86. 确定
  87. </wd-button>
  88. </view>
  89. <wd-datetime-picker-view v-if="visibleCreateTime[1]" v-model="tempCreateTime[1]" type="date" />
  90. <view v-if="visibleCreateTime[1]" class="yd-search-form-date-range-actions">
  91. <wd-button size="small" plain @click="visibleCreateTime[1] = false">
  92. 取消
  93. </wd-button>
  94. <wd-button size="small" type="primary" @click="handleCreateTime1Confirm">
  95. 确定
  96. </wd-button>
  97. </view>
  98. </view>
  99. <view class="yd-search-form-actions">
  100. <wd-button class="flex-1" plain @click="handleReset">
  101. 重置
  102. </wd-button>
  103. <wd-button class="flex-1" type="primary" @click="handleSearch">
  104. 搜索
  105. </wd-button>
  106. </view>
  107. </view>
  108. </wd-popup>
  109. </template>
  110. <script lang="ts" setup>
  111. import { computed, reactive, ref } from 'vue'
  112. import { getDictLabel, getIntDictOptions } from '@/hooks/useDict'
  113. import { getNavbarHeight } from '@/utils'
  114. import { DICT_TYPE } from '@/utils/constants'
  115. import { formatDate, formatDateRange } from '@/utils/date'
  116. const emit = defineEmits<{
  117. search: [data: Record<string, any>]
  118. reset: []
  119. }>()
  120. const visible = ref(false)
  121. const formData = reactive({
  122. name: undefined as string | undefined,
  123. code: undefined as string | undefined,
  124. type: -1,
  125. status: -1,
  126. createTime: [undefined, undefined] as [number | undefined, number | undefined],
  127. })
  128. /** 搜索条件 placeholder 拼接 */
  129. const placeholder = computed(() => {
  130. const conditions: string[] = []
  131. if (formData.name) {
  132. conditions.push(`名称:${formData.name}`)
  133. }
  134. if (formData.code) {
  135. conditions.push(`编码:${formData.code}`)
  136. }
  137. if (formData.type !== -1) {
  138. conditions.push(`类型:${getDictLabel(DICT_TYPE.SYSTEM_SMS_TEMPLATE_TYPE, formData.type)}`)
  139. }
  140. if (formData.status !== -1) {
  141. conditions.push(`状态:${getDictLabel(DICT_TYPE.COMMON_STATUS, formData.status)}`)
  142. }
  143. if (formData.createTime?.[0] && formData.createTime?.[1]) {
  144. conditions.push(`时间:${formatDate(formData.createTime[0])}~${formatDate(formData.createTime[1])}`)
  145. }
  146. return conditions.length > 0 ? conditions.join(' | ') : '搜索短信模板'
  147. })
  148. // 时间范围选择器状态
  149. const visibleCreateTime = ref<[boolean, boolean]>([false, false])
  150. const tempCreateTime = ref<[number, number]>([Date.now(), Date.now()])
  151. /** 创建时间[0]确认 */
  152. function handleCreateTime0Confirm() {
  153. formData.createTime = [tempCreateTime.value[0], formData.createTime?.[1]]
  154. visibleCreateTime.value[0] = false
  155. }
  156. /** 创建时间[1]确认 */
  157. function handleCreateTime1Confirm() {
  158. formData.createTime = [formData.createTime?.[0], tempCreateTime.value[1]]
  159. visibleCreateTime.value[1] = false
  160. }
  161. /** 搜索 */
  162. function handleSearch() {
  163. visible.value = false
  164. emit('search', {
  165. name: formData.name || undefined,
  166. code: formData.code || undefined,
  167. type: formData.type === -1 ? undefined : formData.type,
  168. status: formData.status === -1 ? undefined : formData.status,
  169. createTime: formatDateRange(formData.createTime),
  170. })
  171. }
  172. /** 重置 */
  173. function handleReset() {
  174. formData.name = undefined
  175. formData.code = undefined
  176. formData.type = -1
  177. formData.status = -1
  178. formData.createTime = [undefined, undefined]
  179. visible.value = false
  180. emit('reset')
  181. }
  182. </script>