@kyfe/fms-vue2-components 0.0.3 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/dist/assets/css/fms-ks-clamp-text.css +1 -0
  2. package/dist/assets/css/fms-ks-components.css +1 -0
  3. package/dist/assets/css/fms-ks-popover.css +1 -0
  4. package/dist/assets/css/fms-ks-search-tips-new.css +1 -0
  5. package/dist/assets/css/fms-ks-search-tips.css +1 -0
  6. package/dist/assets/css/fms-ks-select-box.css +1 -0
  7. package/dist/assets/css/fms-ks-select.css +1 -0
  8. package/dist/date-picker-bottom.17e75dc0.js +45 -0
  9. package/dist/date-picker-dropdown.1d8e9f00.js +34 -0
  10. package/dist/date-picker-right.b939e886.js +23 -0
  11. package/dist/date-picker-top.c38046f7.js +23 -0
  12. package/dist/date-range-select.647edaf6.js +69 -0
  13. package/dist/date-select.96eb3a9d.js +60 -0
  14. package/dist/date-week-month.169b98bc.js +57 -0
  15. package/dist/datetime-popup/index.js +411 -0
  16. package/dist/filter.c93f4ddb.js +45 -0
  17. package/dist/fms-copy-box/index.js +1 -1
  18. package/dist/fms-ks-block-title/index.js +38 -0
  19. package/dist/fms-ks-block-title/style.css +1 -0
  20. package/dist/fms-ks-clamp-text/index.js +9 -0
  21. package/dist/fms-ks-clamp-text.24eb5e8d.js +53 -0
  22. package/dist/fms-ks-components/index.js +9 -0
  23. package/dist/fms-ks-components.a5d9329b.js +4392 -0
  24. package/dist/fms-ks-decrypt/index.js +2 -2
  25. package/dist/fms-ks-decrypt.2f88e659.js +312 -0
  26. package/dist/fms-ks-file-upload/index.js +32 -31
  27. package/dist/fms-ks-file-upload/style.css +1 -1
  28. package/dist/fms-ks-form-grid/index.js +101 -0
  29. package/dist/fms-ks-form-grid/style.css +1 -0
  30. package/dist/fms-ks-more-lines/index.js +31 -0
  31. package/dist/fms-ks-more-lines/style.css +1 -0
  32. package/dist/fms-ks-page-popup/index.js +68 -0
  33. package/dist/fms-ks-page-popup/style.css +1 -0
  34. package/dist/fms-ks-picker/index.js +9 -0
  35. package/dist/fms-ks-picker.766b55f9.js +61 -0
  36. package/dist/fms-ks-popover/index.js +9 -0
  37. package/dist/fms-ks-popover.55ab4b82.js +95 -0
  38. package/dist/fms-ks-search-tips/index.js +9 -0
  39. package/dist/fms-ks-search-tips-new/index.js +9 -0
  40. package/dist/fms-ks-search-tips-new.7d08f710.js +125 -0
  41. package/dist/fms-ks-search-tips.d36859c3.js +142 -0
  42. package/dist/fms-ks-select/index.js +9 -0
  43. package/dist/fms-ks-select-box/index.js +9 -0
  44. package/dist/fms-ks-select-box.a00f0f08.js +43 -0
  45. package/dist/fms-ks-select.59416fd8.js +157 -0
  46. package/dist/fms-ks-warn-drawer/index.js +37 -0
  47. package/dist/fms-ks-warn-drawer/style.css +1 -0
  48. package/dist/fms-scroll-list/index.js +3 -1
  49. package/dist/index.js +30 -30
  50. package/dist/mixin.f4bc60f0.js +59 -0
  51. package/dist/month-range-select.374653da.js +97 -0
  52. package/dist/month-select.30ae7335.js +71 -0
  53. package/dist/oa-datetime-picker-new/style.css +1 -0
  54. package/dist/quarter-select.b6256880.js +73 -0
  55. package/dist/utils.159fba19.js +64 -0
  56. package/dist/week-select.27efca5c.js +70 -0
  57. package/package.json +31 -31
  58. package/src/assets/images/attachment/icon_default.svg +23 -0
  59. package/src/assets/images/attachment/icon_default_new.png +0 -0
  60. package/src/assets/images/attachment/icon_excel.svg +20 -0
  61. package/src/assets/images/attachment/icon_excel_new.png +0 -0
  62. package/src/assets/images/attachment/icon_file.png +0 -0
  63. package/src/assets/images/attachment/icon_pdf_new.png +0 -0
  64. package/src/assets/images/attachment/icon_ppt.svg +20 -0
  65. package/src/assets/images/attachment/icon_ppt_new.png +0 -0
  66. package/src/assets/images/attachment/icon_preview_file.png +0 -0
  67. package/src/assets/images/attachment/icon_txt.png +0 -0
  68. package/src/assets/images/attachment/icon_word.svg +19 -0
  69. package/src/assets/images/attachment/icon_word_new.png +0 -0
  70. package/src/assets/images/attachment/icon_xmind.png +0 -0
  71. package/src/assets/images/icon-arrow.png +0 -0
  72. package/src/assets/images/icon-forewarning.svg +1 -0
  73. package/src/components/date-picker/index.vue +205 -0
  74. package/src/components/datetime-picker-general/index.vue +161 -0
  75. package/src/components/datetime-popup/date-picker.js +217 -0
  76. package/src/components/datetime-popup/index.js +37 -0
  77. package/src/components/datetime-popup/index.vue +111 -0
  78. package/src/components/datetime-popup/mixin.js +125 -0
  79. package/src/components/datetime-popup/time-picker.js +102 -0
  80. package/src/components/datetime-popup/utils.js +124 -0
  81. package/src/components/datetime-popup//347/244/272/344/276/213/345/233/276.png +0 -0
  82. package/src/components/decrypt/README.md +0 -0
  83. package/src/components/decrypt/index.vue +73 -0
  84. package/src/components/fms-ks-block-title/fms-ks-block-title.vue +75 -0
  85. package/src/components/fms-ks-block-title/index.js +7 -0
  86. package/src/components/fms-ks-block-title//346/240/207/351/242/230.md +0 -0
  87. package/src/components/fms-ks-clamp-text/fms-ks-clamp-text.vue +66 -0
  88. package/src/components/fms-ks-clamp-text/images/icon-clamp.png +0 -0
  89. package/src/components/fms-ks-clamp-text/index.js +7 -0
  90. package/src/components/fms-ks-clamp-text//346/226/207/346/234/254/346/224/266/350/265/267/345/261/225/345/274/200.md +0 -0
  91. package/src/components/fms-ks-components/fms-ks-components.vue +699 -0
  92. package/src/components/fms-ks-components/index.js +7 -0
  93. package/src/components/fms-ks-components/money-directive.js +73 -0
  94. package/src/components/fms-ks-components//350/241/250/345/215/225/351/205/215/347/275/256/347/273/204/344/273/266/350/257/264/346/230/216.md +10 -0
  95. package/src/components/fms-ks-file-upload/fms-ks-file-upload.vue +8 -1
  96. package/src/components/fms-ks-form-grid/fields-conversion.js +107 -0
  97. package/src/components/fms-ks-form-grid/fms-ks-form-grid.vue +127 -0
  98. package/src/components/fms-ks-form-grid/index.js +7 -0
  99. package/src/components/fms-ks-more-lines/fms-ks-more-lines.vue +108 -0
  100. package/src/components/fms-ks-more-lines/index.js +7 -0
  101. package/src/components/fms-ks-more-lines//346/233/264/345/244/232.md +0 -0
  102. package/src/components/fms-ks-page-popup/fms-ks-page-popup.vue +153 -0
  103. package/src/components/fms-ks-page-popup/index.js +7 -0
  104. package/src/components/fms-ks-page-popup//345/274/271/345/207/272/345/261/202.md +0 -0
  105. package/src/components/fms-ks-picker/fms-ks-picker.vue +67 -0
  106. package/src/components/fms-ks-picker/index.js +7 -0
  107. package/src/components/fms-ks-picker//351/200/211/346/213/251/345/274/271/345/207/272/345/261/202.md +0 -0
  108. package/src/components/fms-ks-popover/click-outside.js +68 -0
  109. package/src/components/fms-ks-popover/fms-ks-popover.vue +89 -0
  110. package/src/components/fms-ks-popover/index.js +7 -0
  111. package/src/components/fms-ks-popover//345/274/271/345/207/272/345/261/202.md +0 -0
  112. package/src/components/fms-ks-search-tips/fms-ks-search-tips.vue +296 -0
  113. package/src/components/fms-ks-search-tips/index.js +7 -0
  114. package/src/components/fms-ks-search-tips//350/277/234/347/250/213/346/220/234/347/264/242.md +118 -0
  115. package/src/components/fms-ks-search-tips-new/fms-ks-search-tips-new.vue +242 -0
  116. package/src/components/fms-ks-search-tips-new/index.js +7 -0
  117. package/src/components/fms-ks-search-tips-new/style.less +137 -0
  118. package/src/components/fms-ks-search-tips-new//350/277/234/347/250/213/346/220/234/347/264/242-/346/226/260.md +118 -0
  119. package/src/components/fms-ks-select/fms-ks-select.vue +421 -0
  120. package/src/components/fms-ks-select/index.js +7 -0
  121. package/src/components/fms-ks-select//351/200/211/346/213/251/346/241/206.md +0 -0
  122. package/src/components/fms-ks-select-box/fms-ks-select-box.vue +84 -0
  123. package/src/components/fms-ks-select-box/index.js +7 -0
  124. package/src/components/fms-ks-select-box//344/270/215/351/234/200/350/246/201popup/347/232/204select.md +0 -0
  125. package/src/components/fms-ks-warn-drawer/fms-ks-warn-drawer.vue +111 -0
  126. package/src/components/fms-ks-warn-drawer/index.js +7 -0
  127. package/src/components/fms-ks-warn-drawer//351/242/204/350/255/246/346/217/220/347/244/272.md +0 -0
  128. package/src/components/ks-decrypt/README.md +140 -0
  129. package/src/components/ks-decrypt/index.vue +155 -0
  130. package/src/components/ks-popover/index.vue +483 -0
  131. package/src/components/ks-popover/mixin.js +28 -0
  132. package/src/components/ks-popover/utils.js +60 -0
  133. package/src/components/oa-datetime-picker/index.vue +169 -0
  134. package/src/components/oa-datetime-picker-new/components/date-picker/README.md +21 -0
  135. package/src/components/oa-datetime-picker-new/components/date-picker/date-picker-bottom.vue +121 -0
  136. package/src/components/oa-datetime-picker-new/components/date-picker/date-picker-dropdown.vue +78 -0
  137. package/src/components/oa-datetime-picker-new/components/date-picker/date-picker-right.vue +86 -0
  138. package/src/components/oa-datetime-picker-new/components/date-picker/date-picker-top.vue +82 -0
  139. package/src/components/oa-datetime-picker-new/components/date-picker/date-picker.js +12 -0
  140. package/src/components/oa-datetime-picker-new/components/date-picker/date-range-select.vue +106 -0
  141. package/src/components/oa-datetime-picker-new/components/date-picker/date-select.vue +66 -0
  142. package/src/components/oa-datetime-picker-new/components/date-picker/date-week-month.vue +131 -0
  143. package/src/components/oa-datetime-picker-new/components/date-picker/index.js +39 -0
  144. package/src/components/oa-datetime-picker-new/components/date-picker/mixin.js +85 -0
  145. package/src/components/oa-datetime-picker-new/components/date-picker/month-range-select.vue +127 -0
  146. package/src/components/oa-datetime-picker-new/components/date-picker/month-select.vue +87 -0
  147. package/src/components/oa-datetime-picker-new/components/date-picker/quarter-select.vue +95 -0
  148. package/src/components/oa-datetime-picker-new/components/date-picker/style.less +117 -0
  149. package/src/components/oa-datetime-picker-new/components/date-picker/utils.js +109 -0
  150. package/src/components/oa-datetime-picker-new/components/date-picker/week-select.vue +100 -0
  151. package/src/components/oa-datetime-picker-new/index.vue +212 -0
  152. package/src/index.js +8 -2
  153. package/vite.config.js +12 -1
  154. package/dist/fms-ks-decrypt.bcc12f44.js +0 -335
@@ -0,0 +1,67 @@
1
+ <template>
2
+ <div class="pick-box">
3
+ <div class="pick-field-box"
4
+ @click="showPickerFn">
5
+ <ks-field readonly
6
+ clickable
7
+ input-align="right"
8
+ error-message-align="right"
9
+ :required="required"
10
+ name="picker"
11
+ :value="value"
12
+ :label="label"
13
+ right-icon="arrow"
14
+ :rules="[{ required: required, message: `请选择${label}` }]"
15
+ :placeholder="placeholder" />
16
+ </div>
17
+ <ks-popup v-model="showPicker"
18
+ position="bottom">
19
+ <ks-picker show-toolbar
20
+ :columns="columns"
21
+ @confirm="onConfirm"
22
+ @cancel="showPicker = false" />
23
+ </ks-popup>
24
+ </div>
25
+ </template>
26
+ <script>
27
+ export default {
28
+ name: 'FmsKsPicker',
29
+ props: {
30
+ value: {
31
+ type: String,
32
+ default: ""
33
+ },
34
+ label: {
35
+ type: String,
36
+ default: ""
37
+ },
38
+ placeholder: {
39
+ type: String,
40
+ default: ""
41
+ },
42
+ columns: {
43
+ type: Array,
44
+ default: () => []
45
+ },
46
+ required: {
47
+ type: Boolean,
48
+ default: false
49
+ }
50
+ },
51
+ data () {
52
+ return {
53
+ showPicker: false
54
+ }
55
+ },
56
+ methods: {
57
+ showPickerFn () {
58
+ this.showPicker = true
59
+ },
60
+ onConfirm (value) {
61
+ const { code = '' } = value
62
+ this.$emit('input', code, value)
63
+ this.showPicker = false
64
+ }
65
+ }
66
+ }
67
+ </script>
@@ -0,0 +1,7 @@
1
+ import FmsKsPicker from './fms-ks-picker.vue'
2
+
3
+ FmsKsPicker.install = function(Vue) {
4
+ Vue.component(FmsKsPicker.name, FmsKsPicker)
5
+ }
6
+
7
+ export default FmsKsPicker
@@ -0,0 +1,68 @@
1
+ function validate(binding) {
2
+ if (typeof binding.value !== 'function') {
3
+ return false
4
+ }
5
+
6
+ return true
7
+ }
8
+
9
+ function isPopup(popupItem, elements) {
10
+ if (!popupItem || !elements)
11
+ return false
12
+
13
+ for (var i = 0, len = elements.length; i < len; i++) {
14
+ try {
15
+ if (popupItem.contains(elements[i])) {
16
+ return true
17
+ }
18
+ if (elements[i].contains(popupItem)) {
19
+ return false
20
+ }
21
+ } catch(e) {
22
+ return false
23
+ }
24
+ }
25
+
26
+ return false
27
+ }
28
+
29
+ function isServer(vNode) {
30
+ return typeof vNode.componentInstance !== 'undefined' && vNode.componentInstance.$isServer
31
+ }
32
+
33
+ export default {
34
+ bind: function (el, binding, vNode) {
35
+ if (!validate(binding)) return
36
+
37
+ // Define Handler and cache it on the element
38
+ function handler(e) {
39
+ if (!vNode.context) return
40
+
41
+ // some components may have related popup item, on which we shall prevent the click outside event handler.
42
+ var elements = e.path || (e.composedPath && e.composedPath())
43
+ elements && elements.length > 0 && elements.unshift(e.target)
44
+ if (el.contains(e.target) || isPopup(vNode.context.popupItem, elements)) return
45
+
46
+ el.__vueClickOutside__.callback(e)
47
+ }
48
+
49
+ // add Event Listeners
50
+ el.__vueClickOutside__ = {
51
+ handler: handler,
52
+ callback: binding.value
53
+ }
54
+ const clickHandler = 'ontouchstart' in document.documentElement ? 'touchstart' : 'click';
55
+ !isServer(vNode) && document.addEventListener(clickHandler, handler)
56
+ },
57
+
58
+ update: function (el, binding) {
59
+ if (validate(binding)) el.__vueClickOutside__.callback = binding.value
60
+ },
61
+
62
+ unbind: function (el, binding, vNode) {
63
+ // Remove Event Listeners
64
+ const clickHandler = 'ontouchstart' in document.documentElement ? 'touchstart' : 'click';
65
+ !isServer(vNode) && el.__vueClickOutside__ && document.removeEventListener(clickHandler, el.__vueClickOutside__.handler)
66
+ delete el.__vueClickOutside__
67
+ }
68
+ }
@@ -0,0 +1,89 @@
1
+ <template>
2
+ <div class="flow-fms-popover"
3
+ v-clickoutside="close">
4
+ <div v-if="show"
5
+ class="flow-fms-popover-content"
6
+ :style="popoverStyle"
7
+ @click="close">
8
+ <div v-if="showHtml"
9
+ v-html="content"></div>
10
+ <div v-else>{{content}}</div>
11
+ </div>
12
+ <div v-if="show"
13
+ class="flow-fms-popover-arrow"
14
+ :style="arrowStyle"
15
+ @click="close"></div>
16
+ <slot></slot>
17
+ </div>
18
+ </template>
19
+ <script>
20
+ import clickoutside from './click-outside'
21
+ export default {
22
+ name: 'FmsKsPopover',
23
+ directives: {
24
+ clickoutside
25
+ },
26
+ props: {
27
+ content: String,
28
+ showHtml: {
29
+ type: Boolean,
30
+ default: false
31
+ },
32
+ show: {
33
+ type: Boolean,
34
+ default: false
35
+ },
36
+ popoverStyle: {
37
+ type: Object,
38
+ default: () => { }
39
+ },
40
+ arrowStyle: {
41
+ type: Object,
42
+ default: () => { }
43
+ },
44
+ },
45
+ methods: {
46
+ close (e) {
47
+ console.log('122--')
48
+ e.stopPropagation()
49
+ this.$emit('update:show', false)
50
+ this.$emit('close', false)
51
+ }
52
+ }
53
+ }
54
+ </script>
55
+
56
+ <style lang="less" scoped>
57
+ .flow-fms-popover {
58
+ display: inline-block;
59
+ position: relative;
60
+ }
61
+ .flow-fms-popover-arrow {
62
+ width: 0;
63
+ height: 0;
64
+ border: 8px solid transparent;
65
+ border-top-color: #4a4a4a;
66
+ position: absolute;
67
+ }
68
+ .flow-fms-popover-content {
69
+ position: absolute;
70
+ // left: -9999;
71
+ bottom: -9999;
72
+ font-size: 12px;
73
+ font-weight: 500;
74
+ z-index: 9999999;
75
+ background: #4a4a4a;
76
+ padding: 5px;
77
+ border-width: 1px;
78
+ border-radius: 4px;
79
+ border-style: solid;
80
+ border-color: #4a4a4a;
81
+ box-shadow: rgba(0, 0, 0, 0.2) 1px 2px 10px;
82
+ line-height: 1.5;
83
+ overflow: hidden;
84
+ color: #fff;
85
+ width: 300px;
86
+ left: -60px;
87
+ top: -48px;
88
+ }
89
+ </style>
@@ -0,0 +1,7 @@
1
+ import FmsKsPopover from './fms-ks-popover.vue'
2
+
3
+ FmsKsPopover.install = function(Vue) {
4
+ Vue.component(FmsKsPopover.name, FmsKsPopover)
5
+ }
6
+
7
+ export default FmsKsPopover
@@ -0,0 +1,296 @@
1
+ <template>
2
+ <div class="fms-search-tips-wrapper">
3
+ <van-field :value="fieldValue"
4
+ :input-align="inputAlign"
5
+ error-message-align="right"
6
+ :required="required"
7
+ :rules="rules"
8
+ :placeholder="placeholder"
9
+ v-bind="$attrs"
10
+ @focus="focus"
11
+ @input="inputChange"
12
+ @blur="blur">
13
+ <template slot="label">
14
+ {{ label }}
15
+ </template>
16
+ <!-- @blur="blur" -->
17
+ <template #right-icon>
18
+ <slot></slot>
19
+ </template>
20
+ </van-field>
21
+ <transition name="van-fade">
22
+ <div class="tips-list"
23
+ v-show="showTips">
24
+ <div class="arrow"></div>
25
+ <div class="content">
26
+ <slot name="content"
27
+ v-if="tipsList.length < 1"></slot>
28
+ <div class="holder"
29
+ v-if="tipsList.length < 1">
30
+ <van-loading v-if="loading"
31
+ size="24px" />
32
+ <span v-if="!loading">暂无数据</span>
33
+ </div>
34
+ <div class="items"
35
+ v-for="e in tipsList"
36
+ :key="e"
37
+ @click="pick(e)">
38
+ <span v-for="item in valueKey"
39
+ :key="item">{{e[item]}}</span>
40
+ </div>
41
+ </div>
42
+ </div>
43
+ </transition>
44
+ </div>
45
+ </template>
46
+ <script>
47
+ const Toast = window.vant && window.vant.Toast
48
+ export default {
49
+ name: 'FmsKsSearchTips',
50
+ props: {
51
+ value: String,
52
+ employeeName: String,
53
+ label: String,
54
+ labelKey: String,
55
+ placeholder: String,
56
+ required: Boolean,
57
+ url: String,
58
+ appkey: String,
59
+ formatData: Function,
60
+ formatResult: Function,
61
+ valueKey: Array,
62
+ timeout: { //在审批页面时候修改,避免自动触发
63
+ type: Boolean,
64
+ default: () => {
65
+ return false
66
+ }
67
+ },
68
+ blurClear: { // 是否搜不出来,失去焦点就清空,默认为true
69
+ type: Boolean,
70
+ default: () => {
71
+ return true
72
+ }
73
+ },
74
+ searchNullClear: { // 是否搜不出来,就立即清空输入,默认为true
75
+ type: Boolean,
76
+ default: () => {
77
+ return true
78
+ }
79
+ },
80
+ inputLength: {
81
+ type: Number,
82
+ default: 2
83
+ },
84
+ isWatch: { // 是否value改变就触发,默认为true,false代表只手动输入才触发查询
85
+ type: Boolean,
86
+ default: () => {
87
+ return true
88
+ }
89
+ },
90
+ triggerOnFocus: { // 是否获取焦点就触发
91
+ type: Boolean,
92
+ default: false
93
+ },
94
+ message: String,
95
+ },
96
+ data () {
97
+ return {
98
+ fieldValue: '',
99
+ tipsList: [],
100
+ loading: false,
101
+ showTips: false,
102
+ hasSelected: false // 记录是否选中过
103
+ }
104
+ },
105
+ watch: {
106
+ value (val) {
107
+ this.fieldValue = val
108
+ if (this.isWatch) {
109
+ console.log(val, 'watch触发')
110
+ this.inputChange(val)
111
+ }
112
+
113
+ }
114
+ },
115
+ computed: {
116
+ rules () {
117
+ const required = { required: this.required, message: `请选择${this.label}` }
118
+ return [
119
+ required,
120
+ ...this.$attrs.rules || []
121
+ ]
122
+ },
123
+ inputAlign () {
124
+ return this.$attrs['input-align'] || 'right'
125
+ }
126
+ },
127
+ mounted () {
128
+ console.log(this.value, 'mounted触发')
129
+ this.fieldValue = this.value
130
+ },
131
+ methods: {
132
+ filterKeyLight (e) {
133
+ let text = e.name
134
+ if (!this.fieldValue) return text;
135
+ let result = text.replace(new RegExp(this.fieldValue, 'g'), `<span class="primary_title" style="color:#7a77fb;font-weight:400;">${this.fieldValue}</span>`);
136
+ result = `${result}`
137
+ return result
138
+ },
139
+ inputChange (e) {
140
+ if (this.hasSelected || this.timeout) {
141
+ return
142
+ }
143
+ let val = e
144
+ this.$emit('input', e) // 为了内部的输入,让外部的值也跟着改变
145
+ this.fieldValue = val
146
+ // console.log('fieldValue', val)
147
+ if (val && val.length >= this.inputLength) {
148
+ this.tipsList = []
149
+ this.filterFunc(val)
150
+ } else {
151
+ this.tipsList = []
152
+ this.showTips = false
153
+ this.$emit('search', null)
154
+ }
155
+ },
156
+ async filterFunc () {
157
+ console.log(9999)
158
+ this.showTips = true
159
+ this.loading = true
160
+ try {
161
+ // const comList = await this.getCompanyList()
162
+ this.tipsList = await this.getCompanyList()
163
+ if (this.tipsList.length <= 0 && this.searchNullClear) {
164
+ Toast(this.message || `${this.label}搜索为空,请重新输入!`)
165
+ this.showTips = false
166
+ this.fieldValue = ''
167
+ this.$emit('input', '') // 为了内部的输入,让外部的值也跟着改变
168
+ }
169
+ if (this.tipsList.length <= 0 && !this.searchNullClear) {
170
+ this.showTips = false
171
+ }
172
+ this.$emit('search', this.tipsList, this.searchNullClear)
173
+ } catch (error) {
174
+ console.log('error', error)
175
+ this.showTips = false
176
+ } finally {
177
+ this.loading = false
178
+ }
179
+ },
180
+ async getCompanyList () {
181
+ let res = await this.$http(this.url, this.appkey, this.formatData(this.fieldValue))
182
+ return typeof this.formatResult === 'function' ? this.formatResult(res) : (Array.isArray(res) ? res : res.rows)
183
+ },
184
+ blur () {
185
+ if (!this.showTips) {
186
+ if (this.blurClear) { // 搜不出来,且失去焦点需要清空,才需要clear;searchNullClear为true的就不需要清空
187
+ this.clear()
188
+ }
189
+ this.$emit('blur')
190
+ return
191
+ }
192
+ // 这里 真正的失去焦点 跟 pick都会触发,并且是在pick事件之前触发
193
+ // 必须是失去焦点和搜索为空都需要清空时,才清空
194
+ if (this.blurClear && this.searchNullClear) {
195
+ this.clear()
196
+ }
197
+ setTimeout(() => {
198
+ this.showTips = false
199
+ this.$emit('blur')
200
+ // TODO: 如何处理更舒服:更健壮:这里 真正的失去焦点 跟 pick都会触发,并且是在pick事件之前触发
201
+ // if (this.blurClear && !this.hasSelected) {
202
+ // this.clear()
203
+ // }
204
+ })
205
+ },
206
+ focus () {
207
+ if (this.triggerOnFocus) {
208
+ this.tipsList = []
209
+ this.filterFunc()
210
+ }
211
+ this.hasSelected = false
212
+ },
213
+ clear () {
214
+ this.loading = false
215
+ this.fieldValue = ''
216
+ this.$emit('selectItem', {})
217
+ },
218
+ // 点击某个下拉选项触发
219
+ pick (val) {
220
+ // this.showTips = false
221
+ this.fieldValue = val[this.labelKey]
222
+ this.hasSelected = true
223
+ this.$emit('selectItem', val)
224
+ }
225
+ }
226
+ }
227
+ </script>
228
+ <style lang="less" scoped>
229
+ .fms-search-tips-wrapper {
230
+ position: relative;
231
+ .van-cell {
232
+ /deep/ .van-field__value {
233
+ height: 24px;
234
+ }
235
+ &::after {
236
+ position: absolute;
237
+ content: " ";
238
+ pointer-events: none;
239
+ right: 0;
240
+ bottom: 0;
241
+ left: 16px;
242
+ right: 16px;
243
+ border-bottom: 1px solid #d9d9d9;
244
+ -webkit-transform: scaleY(0.5);
245
+ transform: scaleY(0.5);
246
+ }
247
+ }
248
+ .tips-list {
249
+ position: absolute;
250
+ top: 54px;
251
+ right: 10px;
252
+ border: 1px solid #ededed;
253
+ width: 60%;
254
+ color: #999;
255
+ background-color: #fff;
256
+ font-weight: 300;
257
+ box-shadow: 1px 1px 8px #dfdede;
258
+ // filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
259
+ z-index: 999;
260
+ .arrow {
261
+ width: 0;
262
+ height: 0;
263
+ border: 10px solid transparent;
264
+ border-bottom: 10px solid #fff;
265
+ position: absolute;
266
+ right: 35px;
267
+ top: -18px;
268
+ }
269
+ .content {
270
+ overflow: scroll;
271
+ max-height: 120px;
272
+ .items {
273
+ padding-right: 15px;
274
+ box-sizing: border-box;
275
+ width: 100%;
276
+ height: 40px;
277
+ border-bottom: 0.5px solid #ededed;
278
+ font-size: 15px;
279
+ line-height: 40px;
280
+ text-align: left;
281
+ overflow: hidden;
282
+ span {
283
+ display: inline-block;
284
+ padding-left: 16px;
285
+ }
286
+ }
287
+ .holder {
288
+ width: 100%;
289
+ height: 40px;
290
+ line-height: 40px;
291
+ text-align: center;
292
+ }
293
+ }
294
+ }
295
+ }
296
+ </style>
@@ -0,0 +1,7 @@
1
+ import FmsKsSearchTips from './fms-ks-search-tips.vue'
2
+
3
+ FmsKsSearchTips.install = function(Vue) {
4
+ Vue.component(FmsKsSearchTips.name, FmsKsSearchTips)
5
+ }
6
+
7
+ export default FmsKsSearchTips
@@ -0,0 +1,118 @@
1
+ # 模糊搜索组件
2
+ 这是一个 Vue 组件,用于实现搜索提示功能。
3
+ 选择搜索结果后,会派发select及selectItem方法;
4
+ 再次打开时,会展示当前选中的值,并可以做清空操作.
5
+ 可以通过getDefault设置打开时默认展示的搜索选项.
6
+
7
+ ## 属性props
8
+ 类似与pc端的kye-search-tips的入参
9
+ | 参数 | 类型 | 默认值 | 说明 |
10
+ | ------------ | -------- | ------ | ---------------------------------- |
11
+ | label | String | - | 输入框的标签名称 |
12
+ | disabled | Boolean | | 是否禁用输入框 |
13
+ | formatData | Function | | 模糊搜索入参格式化方法 |
14
+ | formatResult | Function | | 搜索结果格式化方法 |
15
+ | inputLength | Number | 2 | 触发查询的最小长度 |
16
+ | keys | Array | | 搜索结果显示的字段集合 |
17
+ | message | String | | 搜索结果为空时的提示信息 |
18
+ | placeholder | String | | 输入框的占位符 |
19
+ | url | String | | 搜索请求的 URL |
20
+ | value | String | | 当前字段的值 |
21
+ | valueKey | String | | 显示在输入框的字段 key |
22
+ | appkey | String | | 接口请求的appkey |
23
+ | required | Boolean | | 是否必填 |
24
+ | inputAlign | String | | 输入框内容对齐方式 |
25
+ | getDefault | Function | | 打开搜索框的默认数据方法,异步方法 |
26
+ | popupHeight | String | 60% | 当前弹出层内容的高度,默认为 '60%' |
27
+ | popupStyle | Object | {} | 当前弹出层内容的样式,默认为 {} |
28
+ | rules | Object | | 校验规则 |
29
+ | isLink | Boolean | true | 是否为链接类型 |
30
+ | isFullPopup | Boolean | false | 是否为全屏显示popup,全屏显示关闭按钮在左侧,显示为箭头 |
31
+
32
+
33
+ ## 示例代码:
34
+ ```
35
+ <template>
36
+ <fms-search-tips-new label="车牌号"
37
+ ref="carNumber"
38
+ v-model="model"
39
+ input-align="right"
40
+ url="vms.vehicle.listByPlateNumber"
41
+ appkey="10184"
42
+ class="search-tips-carNumber search-tips-carNumber-none"
43
+ required
44
+ :formatData="(data)=>{return {'plateNumber':data}}"
45
+ :keys="['plateNumber']"
46
+ :isLink="false"
47
+ valueKey="plateNumber"
48
+ placeholder="请扫描车牌号或查询历史车牌号"
49
+ error-message-align="right"
50
+ :getDefault="() => searchHistory(i)"
51
+ @selectItem="(e) => carNumberSelect(e, i)">
52
+ <van-icon name="scan"
53
+ class="icon-color"
54
+ slot="rightIcon"
55
+ style="display: inline-block;"
56
+ @click="e => scanClick(formModel.expenseDetailCommonList[i], 'carNumber', i, e)" />
57
+ </fms-search-tips-new>
58
+ </template>
59
+
60
+ <script>
61
+ import { Toast } from 'vant';
62
+
63
+ export default {
64
+ // ...属性和方法定义...
65
+ };
66
+ </script>
67
+
68
+ ```
69
+
70
+ ## fms-form-grid中添加了支持,配置示例如下
71
+ ```
72
+ {
73
+ label: '原报销编码',
74
+ key: 'oldExpenseNumber',
75
+ component: 'search-tips-new',
76
+ show: () => vm.oldExpenseNumberShow,
77
+ componentProps: {
78
+ url: 'ers.customerExpense.overdueExemptionQuery',
79
+ inputLength: 16,
80
+ // 显示在输入框中的字段
81
+ valueKey: 'expenseNumber',
82
+ // keys 显示在下拉框中的字段
83
+ keys: ['expenseNumber', 'expenseRecordName', 'expenseAmount'],
84
+ message: '报销单据录入有误,请核实',
85
+ // 根据输入的值设置请求参数
86
+ formatData: val => {
87
+ let { guestDate } = vm.model || {}
88
+ return {
89
+ type: 3,
90
+ guestDate,
91
+ expenseNumber: val
92
+ }
93
+ },
94
+ appkey: '10214',
95
+ placeholder: '请选择原报销编码',
96
+ getDefault: async () => {
97
+ let { guestDate, consumptionAmount, customerNumber } = vm.model || {}
98
+ let params = {
99
+ type: 2,
100
+ guestDate,
101
+ consumptionAmount,
102
+ customerNumber,
103
+ }
104
+ const list = await vm.$http('ers.customerExpense.overdueExemptionQuery', 10214, params)
105
+ return list
106
+ },
107
+ },
108
+ componentListeners: {
109
+ select: (row) => {
110
+ let { expenseNumber, detailId } = row || {}
111
+ vm.model.oldId = detailId
112
+ vm.model.oldExpenseNumber = expenseNumber
113
+ vm.model.overdueExemptionType = expenseNumber ? '2' : ''
114
+ },
115
+ },
116
+ required: true,
117
+ }
118
+ ```