formInput.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. <!--
  2. A1 手工填写-单个-数字-无单位
  3. A2 手工填写-单个-数字-有单位
  4. A3 手工填写-多个-数字-无单位
  5. A4 手工填写-多个-数字-有单位
  6. A5 手工填写-单个-数字范围-无单位
  7. A6 手工填写-单个-数字范围-有单位
  8. A7 手工填写-多个-数字范围-无单位
  9. A8 手工填写-多个-数字范围-有单位
  10. B1 手工填写-单个-文本
  11. B2 手工填写-多个-文本
  12. C1 手工填写-单个-日期时间值
  13. C2 手工填写-单个-日期时间段
  14. C3 手工填写-多个-日期时间值
  15. C4 手工填写-多个-日期时间段
  16. C5 手工填写-单个-日期值
  17. C6 手工填写-单个-日期段
  18. C7 手工填写-多个-日期值
  19. C8 手工填写-多个-日期段
  20. C9 手工填写-单个-时间值
  21. C10 手工填写-单个-时间段
  22. C11 手工填写-多个-时间值
  23. C12 手工填写-多个-时间段
  24. D1 字典选择-单个-单选
  25. D2 字典选择-单个-多选
  26. D3 字典选择-多个-单选
  27. D4 字典选择-多个-多选
  28. E1 字典布尔选择-单个
  29. E2 字典布尔选择-多个
  30. F1 上传-单个文件 -->
  31. <template>
  32. <el-form
  33. :label-position="'right'"
  34. :labelWidth="width + 'px'"
  35. :model="formLabelAlign"
  36. ref="form"
  37. @submit.native.prevent
  38. >
  39. <el-form-item :label="label" :rules="isRule ? { required: true, message: '不能为空'} : {}">
  40. <!-- 普通输入类型 -->
  41. <el-input
  42. size="small"
  43. v-if="!isShow && (type == 'default' || type == 'B1')"
  44. v-model="formLabelAlign.name"
  45. style="width: 9rem;"
  46. @change="onSubmit"
  47. @keyup.enter.native="onSubmit"
  48. >
  49. <template slot="append" v-if="unit">{{unit}}</template>
  50. </el-input>
  51. <el-input
  52. type="number"
  53. v-if="!isShow && (type == 'A1' || type == 'A2')"
  54. v-model="formLabelAlign.name"
  55. style="width: 9rem;"
  56. @change="onSubmit"
  57. @keyup.enter.native="onSubmit"
  58. >
  59. <template slot="append" v-if="unit">{{unit}}</template>
  60. </el-input>
  61. <!-- date类型 -->
  62. <el-date-picker
  63. v-if="!isShow && (type == 'year' || type == 'C5')"
  64. v-model="formLabelAlign.name"
  65. type="date"
  66. value-format="yyyy-MM-dd"
  67. @change="onSubmit"
  68. :clearable="false"
  69. placeholder="选择日期"
  70. ></el-date-picker>
  71. <!-- 级联选择 -->
  72. <el-cascader
  73. v-if="!isShow && (type == 'cascader' || type == 'D1')"
  74. :options="typeArr"
  75. v-model="formLabelAlign.name"
  76. @change="onSubmit"
  77. :props="props"
  78. ></el-cascader>
  79. <!-- 日期到分 -->
  80. <el-date-picker
  81. v-if="!isShow && type == 'C1'"
  82. v-model="formLabelAlign.name"
  83. type="datetime"
  84. value-format="yyyy-MM-dd HH:MM"
  85. @change="onSubmit"
  86. :clearable="false"
  87. placeholder="选择日期"
  88. ></el-date-picker>
  89. <!-- 输入文本框 -->
  90. <el-input
  91. v-if="!isShow && type == 'B2'"
  92. type="textarea"
  93. :rows="2"
  94. @change="onSubmit"
  95. @keyup.enter.native="onSubmit"
  96. placeholder="请输入内容"
  97. v-model="formLabelAlign.name"
  98. ></el-input>
  99. <!-- 日期 -->
  100. <el-date-picker
  101. v-if="!isShow && type == 'C6'"
  102. v-model="formLabelAlign.name"
  103. type="datetimerange"
  104. range-separator="至"
  105. start-placeholder="开始日期"
  106. end-placeholder="结束日期"
  107. value-format="yyyy-MM-dd HH:MM"
  108. @change="onSubmit"
  109. :clearable="false"
  110. placeholder="选择日期"
  111. ></el-date-picker>
  112. <!-- 点击确定 -->
  113. <i
  114. v-if="!isShow && (type == 'default' || type == 'B1')"
  115. class="el-input__icon el-icon-check hover"
  116. @click="onSubmit"
  117. ></i>
  118. <!-- 显示基本内容 -->
  119. <span v-if="isShow" @click="changeItem" class="hover">
  120. {{ filterArr(formLabelAlign.name) }} {{unit}}
  121. <i class="el-icon-edit" v-if="type != 'X'"></i>
  122. </span>
  123. <slot name="mess"></slot>
  124. </el-form-item>
  125. </el-form>
  126. </template>
  127. <script>
  128. export default {
  129. name: "ownerInput",
  130. props: {
  131. type: {
  132. type: String,
  133. default: "default"
  134. }, //类型
  135. value: [String, Number, Array], //value值
  136. label: String, //label值,从父级传入
  137. isRule: Boolean, //是否需要规则
  138. keys: [String, Number], //
  139. typeArr: [Array, String], //当其为级联或者下拉时传入
  140. unit: {
  141. //单位
  142. type: String,
  143. default: ""
  144. },
  145. width: {
  146. type: Number,
  147. default: 100
  148. }
  149. },
  150. data() {
  151. return {
  152. formLabelAlign: {
  153. name: ""
  154. },
  155. key: "",
  156. isShow: true,
  157. props: {
  158. label: "name",
  159. value: "code",
  160. children: "content"
  161. } //修改默认数据格式
  162. };
  163. },
  164. methods: {
  165. //点击确定或者url
  166. onSubmit() {
  167. if (this.formLabelAlign.name == "" || this.formLabelAlign.name == []) {
  168. this.$message.error("请确定值不为空");
  169. } else {
  170. this.isShow = true;
  171. if (this.type == 'cascader' || this.type == 'D1') {
  172. let data = this.formLabelAlign.name
  173. this.$emit("change", data[data.length - 1], this.keys);
  174. } else {
  175. this.$emit("change", this.formLabelAlign.name, this.keys);
  176. }
  177. }
  178. },
  179. //点击文案出现输入
  180. changeItem() {
  181. if (this.type == "X") {
  182. this.$message('该信息点不支持编辑')
  183. return;
  184. } else {
  185. this.isShow = false;
  186. }
  187. },
  188. //对数组中的空数组去除
  189. toMyNeed(arr) {
  190. return arr.map(res => {
  191. let param = {};
  192. if (res.content && res.content.length != 0) {
  193. param.content = this.toMyNeed(res.content);
  194. }
  195. param.name = res.name;
  196. param.code = res.code;
  197. return param;
  198. });
  199. },
  200. //获取级联选中的值
  201. getCascaderObj(val, opt) {
  202. let data = this.getMyVal(val, opt, 'name')
  203. data.length > 1 ? data = data.join('/') : data = data.join('')
  204. return data
  205. },
  206. getMyVal(val, content, code) {
  207. let data = []
  208. if (content && content.length) {
  209. for (let i = 0; i < content.length; i++) {
  210. if (content[i].code == val) {
  211. data.push(content[i][code])
  212. break
  213. } else {
  214. if (content[i].content && content.length) {
  215. for (let j = 0; j < content[i].content.length; j++) {
  216. if (content[i].content[j].code == val) {
  217. data.push(content[i][code])
  218. data.push(content[i].content[j][code])
  219. break
  220. } else {
  221. if (content[i].content[j].content && content[i].content[j].content.length) {
  222. for (let k = 0; k < content[i].content[j].content.length; k++) {
  223. if (content[i].content[j].content[k].code == val) {
  224. data.push(content[i][code])
  225. data.push(content[i].content[j][code])
  226. data.push(content[i].content[j].content[k][code])
  227. break
  228. } else {
  229. }
  230. }
  231. }
  232. }
  233. }
  234. }
  235. }
  236. }
  237. }
  238. if (!data.length) {
  239. data = null
  240. }
  241. return data
  242. },
  243. getMap(val, opt) {
  244. return opt.map(function (value, index, array) {
  245. for (var itm of opt) {
  246. if (itm.code == value.code) {
  247. opt = itm.content;
  248. return itm;
  249. }
  250. }
  251. return null;
  252. });
  253. },
  254. //数组过滤
  255. filterArr(val) {
  256. let value = ""; //最后输出的文案
  257. let isNeedType = this.type == 'cascader' || this.type == 'D1'
  258. if (this.type == 'C6') {
  259. value = value != "" ? val[0] + '至' + val[1] : "--"
  260. } else if (this.type == 'cascader' || this.type == 'D1') {
  261. if (val && val.length) {
  262. value = this.getCascaderObj(val[val.length - 1], this.typeArr, 'name') || "--";
  263. }
  264. } else {
  265. value = val || "--";
  266. }
  267. return value;
  268. }
  269. },
  270. created() {
  271. if (typeof (this.typeArr) == Object) {
  272. this.typeArr = this.toMyNeed(this.typeArr)
  273. }
  274. if (this.type == 'cascader' || this.type == 'D1') {
  275. if (this.value == '' || this.value == undefined) {
  276. this.formLabelAlign.name = []
  277. } else {
  278. this.formLabelAlign.name = this.getMyVal(this.value, this.typeArr, 'code');
  279. }
  280. } else {
  281. this.formLabelAlign.name = this.value;
  282. }
  283. this.key = this.label;
  284. },
  285. watch: {
  286. label() { }
  287. }
  288. };
  289. </script>
  290. <style lang="less">
  291. .hover:hover {
  292. cursor: pointer;
  293. color: #409eff;
  294. }
  295. input::-webkit-outer-spin-button,
  296. input::-webkit-inner-spin-button {
  297. -webkit-appearance: none;
  298. }
  299. input[type="number"] {
  300. -moz-appearance: textfield;
  301. }
  302. </style>