field-pane-ccf.vue 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <template>
  2. <view class="field-pane-container">
  3. <view class="title">{{ title }}</view>
  4. <view v-for="item in fields" :key="item.label">
  5. <view
  6. v-if="(item.field === 'id') || (item.field === 'label') || (item.field === 'enterpriseUserId') || (item.field === 'buyerId')"
  7. >
  8. </view>
  9. <view v-else-if="item.field === 'birthday'" class="item">
  10. <template>
  11. <view
  12. class="input-wrapper" :style="{
  13. 'flex-direction': item.type === 'textarea' ? 'column' : '',
  14. 'align-items': item.type === 'textarea' ? 'flex-start' : ''
  15. }"
  16. >
  17. <view class="sub-title">{{ item.label }}</view>
  18. <view v-if="item.type === 'time' && item.field === 'birthday'" class="input">
  19. <input
  20. :value="form[item.field]" :disabled="true" type="text"
  21. :placeholder="item.placeholder"
  22. @click="$refs.dateTimeTradeB[0].show()"
  23. />
  24. <tui-datetime
  25. ref="dateTimeTradeB" :type="2" radius
  26. @confirm="handleInput(item.field, $event)"
  27. ></tui-datetime>
  28. </view>
  29. </view>
  30. </template>
  31. </view>
  32. <view v-else-if="item.field === 'styleId'">
  33. <view class="item">
  34. <view
  35. class="input-wrapper" :style="{
  36. 'flex-direction': item.type === 'textarea' ? 'column' : '',
  37. 'align-items': item.type === 'textarea' ? 'flex-start' : ''
  38. }"
  39. >
  40. <view class="sub-title">{{ item.label }}</view>
  41. <view
  42. v-if="item.type === 'select' && item.field === 'styleId'" style="flex: 1" :style="{
  43. color: form.styleId ? '' : '#999'
  44. }" @click="isShowStyleListSelect = true"
  45. >
  46. {{ styleName || (form.styleId ? `已选样式:${form.styleId}` : "请选择样式") }}
  47. </view>
  48. </view>
  49. </view>
  50. </view>
  51. <view
  52. v-else-if="(item.field === 'enterpriseName') || (item.field === 'enterpriseDuties') || (item.field === 'enterpriseDepartment')"
  53. >
  54. <view v-if="form.isEnterprise === '1'" class="item">
  55. <template>
  56. <view
  57. class="input-wrapper" :style="{
  58. 'flex-direction': item.type === 'textarea' ? 'column' : '',
  59. 'align-items': item.type === 'textarea' ? 'flex-start' : ''
  60. }"
  61. >
  62. <view class="sub-title">{{ item.label }}</view>
  63. <input
  64. v-if="item.type === 'input'" :value="form[item.field]" class="input" :disabled="false"
  65. :type="item.field === 'phone' ? 'number' : 'text'" :placeholder="item.placeholder"
  66. @input="handleInput(item.field, $event)"
  67. />
  68. </view>
  69. </template>
  70. </view>
  71. <view v-else></view>
  72. </view>
  73. <view v-else class="item">
  74. <template>
  75. <view
  76. class="input-wrapper" :style="{
  77. 'flex-direction': item.type === 'textarea' ? 'column' : '',
  78. 'align-items': item.type === 'textarea' ? 'flex-start' : ''
  79. }"
  80. >
  81. <view class="sub-title">{{ item.label }}</view>
  82. <input
  83. v-if="item.type === 'input'" :value="form[item.field]" class="input" :disabled="false"
  84. :type="item.field === 'phone' ? 'number' : 'text'" :placeholder="item.placeholder"
  85. @input="handleInput(item.field, $event)"
  86. />
  87. <textarea
  88. v-if="item.type === 'textarea'" :value="form[item.field]" class="textarea"
  89. :placeholder="item.placeholder" @input="handleInput(item.field, $event)"
  90. ></textarea>
  91. <tui-radio-group
  92. v-if="(item.type === 'radio') && (item.field === 'sex')" v-model="form[item.field]"
  93. @change="handleInput(item.field, $event)"
  94. >
  95. <view style="display: flex;">
  96. <tui-label v-for="(part, index) in [{ name: '男', value: '1' }, { name: '女', value: '2' }]" :key="index">
  97. <tui-list-cell padding="16rpx">
  98. <view>
  99. <tui-radio :checked="false" :value="part.value" color="#07c160" border-color="#999">
  100. </tui-radio>
  101. <text>{{ part.name }}</text>
  102. </view>
  103. </tui-list-cell>
  104. </tui-label>
  105. </view>
  106. </tui-radio-group>
  107. <tui-radio-group
  108. v-else-if="item.type === 'radio'" v-model="form[item.field]" style="display: flex;"
  109. @change="(e) => { }"
  110. >
  111. <view style="display: flex;">
  112. <tui-label v-for="(part, index) in [{ name: '是', value: '1' }, { name: '否', value: '0' }]" :key="index">
  113. <tui-list-cell padding="16rpx">
  114. <view>
  115. <tui-radio :checked="false" :value="part.value" color="#07c160" border-color="#999">
  116. </tui-radio>
  117. <text>{{ part.name }}</text>
  118. </view>
  119. </tui-list-cell>
  120. </tui-label>
  121. </view>
  122. </tui-radio-group>
  123. </view>
  124. </template>
  125. </view>
  126. </view>
  127. <!-- 样式 -->
  128. <tui-select
  129. :list="styleList" reverse :show="isShowStyleListSelect" @confirm="handleSelectStyleList"
  130. @close="isShowStyleListSelect = false"
  131. ></tui-select>
  132. </view>
  133. </template>
  134. <script>
  135. export default {
  136. name: 'FieldPaneCCF',
  137. props: {
  138. fields: {
  139. type: Array,
  140. required: true
  141. },
  142. value: {
  143. type: Object,
  144. required: true
  145. },
  146. title: String
  147. },
  148. data() {
  149. return {
  150. form: {},
  151. styleList: [],
  152. isShowStyleListSelect: false,
  153. styleName: ''
  154. }
  155. },
  156. watch: {
  157. fields: {
  158. handler(value) {
  159. if (value) {
  160. const form = {}
  161. for (const item of value) {
  162. form[item.field] = this.value[item.field]
  163. if (item.type === 'select' && item.field === 'styleId') this.getStyleList()
  164. }
  165. this.form = form
  166. }
  167. },
  168. immediate: true,
  169. deep: true
  170. },
  171. form: {
  172. handler(value) {
  173. this.$emit('input', value)
  174. },
  175. immediate: true,
  176. deep: true
  177. }
  178. },
  179. methods: {
  180. getStyleList() {
  181. // getxxxApi({})
  182. // .then((res) => {
  183. this.styleList = [{ styleId: 1, value: 1, text: '样式一' }, { styleId: 2, value: 2, text: '样式二' }, { styleId: 3, value: 3, text: '样式三' }]
  184. // })
  185. // .catch(() => {
  186. // this.$showToast('样式列表获取失败')
  187. // })
  188. },
  189. handleSelectStyleList(e) {
  190. this.isShowStyleListSelect = false
  191. this.styleName = e.options.text
  192. this.form.styleId = e.options.styleId
  193. },
  194. handleInput(field, e) {
  195. console.log(field, e)
  196. if (field === 'birthday') {
  197. this.form[field] = e.result
  198. } else {
  199. this.form[field] = e.detail.value
  200. }
  201. }
  202. }
  203. }
  204. </script>
  205. <style lang="less" scoped>
  206. .field-pane-container {
  207. margin-top: 30rpx;
  208. .title {
  209. font-size: 28rpx;
  210. color: #fa5151;
  211. font-weight: bold;
  212. }
  213. .item {
  214. padding: 20rpx 0;
  215. border-bottom: 1rpx solid #d8d8d8;
  216. margin-top: 20rpx;
  217. .input-wrapper {
  218. display: flex;
  219. align-items: center;
  220. justify-content: space-between;
  221. font-size: 24rpx;
  222. color: #3d3d3d;
  223. .sub-title {
  224. margin-right: 20rpx;
  225. }
  226. /deep/ .uni-input-placeholder,
  227. /deep/ .uni-textarea-placeholder {
  228. font-size: 24rpx;
  229. color: #999;
  230. }
  231. .input {
  232. flex: 1;
  233. font-size: 24rpx;
  234. }
  235. .textarea {
  236. margin-top: 20rpx;
  237. width: 100%;
  238. height: 100px;
  239. font-size: 24rpx;
  240. }
  241. }
  242. }
  243. }
  244. </style>