eoss 0.1.0-alpha.44 → 0.1.0-alpha.46

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 (79) hide show
  1. package/lib/button-group.js +11 -9
  2. package/lib/button.js +5 -3
  3. package/lib/cascader.js +3 -3
  4. package/lib/color-picker.js +6 -3
  5. package/lib/data-table.js +60 -23
  6. package/lib/date-picker.js +5 -3
  7. package/lib/eoss.common.js +748 -332
  8. package/lib/flow.js +7 -9
  9. package/lib/form-editor.js +2 -3
  10. package/lib/index.js +1 -1
  11. package/lib/input-number.js +6 -2
  12. package/lib/input.js +148 -87
  13. package/lib/select.js +237 -15
  14. package/lib/selector.js +16 -4
  15. package/lib/switch.js +6 -3
  16. package/lib/table-column.js +49 -68
  17. package/lib/table.js +111 -90
  18. package/lib/tag.js +2 -0
  19. package/lib/theme-chalk/base.css +1 -1
  20. package/lib/theme-chalk/cascader.css +1 -1
  21. package/lib/theme-chalk/icons.css +1 -1
  22. package/lib/theme-chalk/index.css +1 -1
  23. package/lib/theme-chalk/main.css +1 -1
  24. package/lib/theme-chalk/pagination.css +1 -1
  25. package/lib/theme-chalk/select.css +1 -1
  26. package/lib/theme-chalk/table-column.css +1 -1
  27. package/lib/theme-chalk/table.css +1 -1
  28. package/lib/theme-chalk/tag.css +1 -1
  29. package/lib/time-picker.js +5 -3
  30. package/lib/time-select.js +5 -3
  31. package/lib/tree.js +17 -7
  32. package/lib/upload.js +85 -8
  33. package/package.json +1 -1
  34. package/packages/button/src/button-group.vue +9 -7
  35. package/packages/button/src/button.vue +7 -5
  36. package/packages/cascader/src/cascader.vue +1 -1
  37. package/packages/color-picker/src/color-picker.vue +4 -1
  38. package/packages/data-table/src/data-table.vue +32 -7
  39. package/packages/date-picker/src/picker.vue +3 -1
  40. package/packages/flow/src/selectUser.vue +12 -18
  41. package/packages/form-editor/src/form-editor.vue +0 -1
  42. package/packages/input/src/input.vue +94 -60
  43. package/packages/input-number/src/input-number.vue +5 -1
  44. package/packages/select/src/select.vue +208 -13
  45. package/packages/selector/src/selector.vue +10 -1
  46. package/packages/switch/src/switch.vue +4 -1
  47. package/packages/table/src/store/index.js +10 -1
  48. package/packages/table/src/table-column.js +7 -1
  49. package/packages/table/src/table-header.js +52 -7
  50. package/packages/table/src/util.js +35 -60
  51. package/packages/tag/src/tag.vue +2 -0
  52. package/packages/theme-chalk/src/base.scss +7 -0
  53. package/packages/theme-chalk/src/icons.scss +13 -1
  54. package/packages/theme-chalk/src/table.scss +18 -2
  55. package/packages/theme-chalk/src/tag.scss +303 -242
  56. package/packages/tree/src/tree.vue +13 -3
  57. package/packages/upload/src/index.vue +43 -8
  58. package/src/index.js +1 -1
  59. package/packages/flowOld/index.js +0 -7
  60. package/packages/flowOld/src/component/Circulate.vue +0 -464
  61. package/packages/flowOld/src/component/CustomPreset.vue +0 -343
  62. package/packages/flowOld/src/component/FileList.vue +0 -117
  63. package/packages/flowOld/src/component/FreeCirculation.vue +0 -278
  64. package/packages/flowOld/src/component/Preset.vue +0 -283
  65. package/packages/flowOld/src/component/SendMsg.vue +0 -309
  66. package/packages/flowOld/src/component/TimeLimit.vue +0 -223
  67. package/packages/flowOld/src/component/opinions-file.vue +0 -126
  68. package/packages/flowOld/src/component/opinions.vue +0 -429
  69. package/packages/flowOld/src/component/taskUnionExamine.vue +0 -832
  70. package/packages/flowOld/src/form.vue +0 -134
  71. package/packages/flowOld/src/freeStartFlow.vue +0 -2945
  72. package/packages/flowOld/src/main.vue +0 -4141
  73. package/packages/flowOld/src/processForm.vue +0 -1431
  74. package/packages/flowOld/src/processReject.vue +0 -338
  75. package/packages/flowOld/src/reset.vue +0 -964
  76. package/packages/flowOld/src/selectUser.vue +0 -520
  77. package/packages/flowOld/src/startTaskRead.vue +0 -737
  78. package/packages/flowOld/src/supervise.vue +0 -197
  79. package/packages/flowOld/src/table.vue +0 -71
@@ -142,7 +142,7 @@ module.exports = require("vue");
142
142
  // ESM COMPAT FLAG
143
143
  __webpack_require__.r(__webpack_exports__);
144
144
 
145
- // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/input-number/src/input-number.vue?vue&type=template&id=1bf5c763&
145
+ // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/input-number/src/input-number.vue?vue&type=template&id=40f587bb&
146
146
  var render = function () {
147
147
  var _vm = this
148
148
  var _h = _vm.$createElement
@@ -312,7 +312,7 @@ var staticRenderFns = []
312
312
  render._withStripped = true
313
313
 
314
314
 
315
- // CONCATENATED MODULE: ./packages/input-number/src/input-number.vue?vue&type=template&id=1bf5c763&
315
+ // CONCATENATED MODULE: ./packages/input-number/src/input-number.vue?vue&type=template&id=40f587bb&
316
316
 
317
317
  // EXTERNAL MODULE: external "eoss/lib/input"
318
318
  var input_ = __webpack_require__(14);
@@ -795,7 +795,10 @@ var repeat_click = __webpack_require__(105);
795
795
  }
796
796
  },
797
797
  mounted: function mounted() {
798
+ // 只读态下内部 es-input 被 v-if 移除,ref 不存在,需与 updated 同样防护
799
+ if (!this.$refs || !this.$refs.input) return;
798
800
  var innerInput = this.$refs.input.$refs.input;
801
+ if (!innerInput) return;
799
802
  innerInput.setAttribute('role', 'spinbutton');
800
803
  innerInput.setAttribute('aria-valuemax', this.max);
801
804
  innerInput.setAttribute('aria-valuemin', this.min);
@@ -805,6 +808,7 @@ var repeat_click = __webpack_require__(105);
805
808
  updated: function updated() {
806
809
  if (!this.$refs || !this.$refs.input) return;
807
810
  var innerInput = this.$refs.input.$refs.input;
811
+ if (!innerInput) return;
808
812
  innerInput.setAttribute('aria-valuenow', this.currentValue);
809
813
  }
810
814
  });
package/lib/input.js CHANGED
@@ -3619,7 +3619,7 @@ module.exports = require("vue");
3619
3619
  // ESM COMPAT FLAG
3620
3620
  __webpack_require__.r(__webpack_exports__);
3621
3621
 
3622
- // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/input/src/input.vue?vue&type=template&id=782c4367&
3622
+ // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/input/src/input.vue?vue&type=template&id=7d4041a6&
3623
3623
  var render = function () {
3624
3624
  var _vm = this
3625
3625
  var _h = _vm.$createElement
@@ -3684,62 +3684,76 @@ var render = function () {
3684
3684
  2
3685
3685
  )
3686
3686
  : _vm._e(),
3687
- _vm.type === "password" ||
3688
- (_vm.showPassword && !_vm.passwordVisible)
3689
- ? _c("input", {
3690
- staticClass: "es-input__hidden",
3691
- staticStyle: {
3692
- position: "absolute",
3693
- top: "-9999px",
3694
- left: "-9999px",
3695
- width: "0",
3696
- height: "0",
3697
- opacity: "0",
3698
- },
3699
- attrs: { type: "password", autocomplete: "off" },
3700
- })
3701
- : _vm._e(),
3702
- _vm.type !== "textarea"
3703
- ? _c(
3704
- "input",
3705
- _vm._b(
3706
- {
3707
- ref: "input",
3708
- staticClass: "es-input__inner",
3709
- class: { "is-round": _vm.round },
3710
- style: _vm.innerStyle,
3711
- attrs: {
3712
- tabindex: _vm.tabindex,
3713
- type: _vm.showPassword
3714
- ? _vm.passwordVisible
3715
- ? "text"
3716
- : "password"
3717
- : _vm.type,
3718
- disabled: _vm.inputDisabled,
3719
- readonly: _vm.inputReadonly,
3720
- autocomplete:
3721
- _vm.type === "password" ||
3722
- (_vm.showPassword && !_vm.passwordVisible)
3723
- ? "new-password"
3724
- : _vm.autoComplete || _vm.autocomplete,
3725
- "aria-label": _vm.label,
3726
- },
3727
- on: {
3728
- compositionstart: _vm.handleCompositionStart,
3729
- compositionupdate: _vm.handleCompositionUpdate,
3730
- compositionend: _vm.handleCompositionEnd,
3731
- input: _vm.handleInput,
3732
- focus: _vm.handleFocus,
3733
- blur: _vm.handleBlur,
3734
- change: _vm.handleChange,
3735
- },
3736
- },
3737
- "input",
3738
- _vm.$attrs,
3739
- false
3740
- )
3741
- )
3742
- : _vm._e(),
3687
+ _vm.inputReadonly
3688
+ ? _c("div", { staticClass: "es-field-readonly" }, [
3689
+ _vm._v(
3690
+ "\n " +
3691
+ _vm._s(
3692
+ _vm.passwordVisible
3693
+ ? _vm.nativeInputValue
3694
+ : _vm.maskedInputValue
3695
+ ) +
3696
+ "\n "
3697
+ ),
3698
+ ])
3699
+ : [
3700
+ _vm.type === "password" ||
3701
+ (_vm.showPassword && !_vm.passwordVisible)
3702
+ ? _c("input", {
3703
+ staticClass: "es-input__hidden",
3704
+ staticStyle: {
3705
+ position: "absolute",
3706
+ top: "-9999px",
3707
+ left: "-9999px",
3708
+ width: "0",
3709
+ height: "0",
3710
+ opacity: "0",
3711
+ },
3712
+ attrs: { type: "password", autocomplete: "off" },
3713
+ })
3714
+ : _vm._e(),
3715
+ _vm.type !== "textarea"
3716
+ ? _c(
3717
+ "input",
3718
+ _vm._b(
3719
+ {
3720
+ ref: "input",
3721
+ staticClass: "es-input__inner",
3722
+ class: { "is-round": _vm.round },
3723
+ style: _vm.innerStyle,
3724
+ attrs: {
3725
+ tabindex: _vm.tabindex,
3726
+ type: _vm.showPassword
3727
+ ? _vm.passwordVisible
3728
+ ? "text"
3729
+ : "password"
3730
+ : _vm.type,
3731
+ disabled: _vm.inputDisabled,
3732
+ readonly: _vm.nativeReadonly,
3733
+ autocomplete:
3734
+ _vm.type === "password" ||
3735
+ (_vm.showPassword && !_vm.passwordVisible)
3736
+ ? "new-password"
3737
+ : _vm.autoComplete || _vm.autocomplete,
3738
+ "aria-label": _vm.label,
3739
+ },
3740
+ on: {
3741
+ compositionstart: _vm.handleCompositionStart,
3742
+ compositionupdate: _vm.handleCompositionUpdate,
3743
+ compositionend: _vm.handleCompositionEnd,
3744
+ input: _vm.handleInput,
3745
+ focus: _vm.handleFocus,
3746
+ blur: _vm.handleBlur,
3747
+ change: _vm.handleChange,
3748
+ },
3749
+ },
3750
+ "input",
3751
+ _vm.$attrs,
3752
+ false
3753
+ )
3754
+ )
3755
+ : _vm._e(),
3756
+ ],
3743
3757
  _vm.$slots.prefix || _vm.prefix || _vm.prefixIcon
3744
3758
  ? _c(
3745
3759
  "span",
@@ -3880,35 +3894,50 @@ var render = function () {
3880
3894
  )
3881
3895
  : _vm._e(),
3882
3896
  ]
3883
- : _c(
3884
- "textarea",
3885
- _vm._b(
3886
- {
3887
- ref: "textarea",
3888
- staticClass: "es-textarea__inner",
3889
- style: _vm.textareaStyle,
3890
- attrs: {
3891
- tabindex: _vm.tabindex,
3892
- disabled: _vm.inputDisabled,
3893
- readonly: _vm.inputReadonly,
3894
- autocomplete: _vm.autoComplete || _vm.autocomplete,
3895
- "aria-label": _vm.label,
3896
- },
3897
- on: {
3898
- compositionstart: _vm.handleCompositionStart,
3899
- compositionupdate: _vm.handleCompositionUpdate,
3900
- compositionend: _vm.handleCompositionEnd,
3901
- input: _vm.handleInput,
3902
- focus: _vm.handleFocus,
3903
- blur: _vm.handleBlur,
3904
- change: _vm.handleChange,
3905
- },
3906
- },
3907
- "textarea",
3908
- _vm.$attrs,
3909
- false
3910
- )
3911
- ),
3897
+ : [
3898
+ _vm.inputReadonly
3899
+ ? _c(
3900
+ "div",
3901
+ {
3902
+ staticClass:
3903
+ "es-field-readonly es-field-readonly--textarea",
3904
+ staticStyle: {
3905
+ "white-space": "pre-wrap",
3906
+ "word-break": "break-all",
3907
+ },
3908
+ },
3909
+ [_vm._v("\n " + _vm._s(_vm.nativeInputValue) + "\n ")]
3910
+ )
3911
+ : _c(
3912
+ "textarea",
3913
+ _vm._b(
3914
+ {
3915
+ ref: "textarea",
3916
+ staticClass: "es-textarea__inner",
3917
+ style: _vm.textareaStyle,
3918
+ attrs: {
3919
+ tabindex: _vm.tabindex,
3920
+ disabled: _vm.inputDisabled,
3921
+ readonly: _vm.nativeReadonly,
3922
+ autocomplete: _vm.autoComplete || _vm.autocomplete,
3923
+ "aria-label": _vm.label,
3924
+ },
3925
+ on: {
3926
+ compositionstart: _vm.handleCompositionStart,
3927
+ compositionupdate: _vm.handleCompositionUpdate,
3928
+ compositionend: _vm.handleCompositionEnd,
3929
+ input: _vm.handleInput,
3930
+ focus: _vm.handleFocus,
3931
+ blur: _vm.handleBlur,
3932
+ change: _vm.handleChange,
3933
+ },
3934
+ },
3935
+ "textarea",
3936
+ _vm.$attrs,
3937
+ false
3938
+ )
3939
+ ),
3940
+ ],
3912
3941
  _vm.isWordLimitVisible && _vm.type === "textarea"
3913
3942
  ? _c("span", { staticClass: "es-input__count" }, [
3914
3943
  _vm._v(_vm._s(_vm.textLength) + "/" + _vm._s(_vm.upperLimit)),
@@ -3923,7 +3952,7 @@ var staticRenderFns = []
3923
3952
  render._withStripped = true
3924
3953
 
3925
3954
 
3926
- // CONCATENATED MODULE: ./packages/input/src/input.vue?vue&type=template&id=782c4367&
3955
+ // CONCATENATED MODULE: ./packages/input/src/input.vue?vue&type=template&id=7d4041a6&
3927
3956
 
3928
3957
  // EXTERNAL MODULE: ./src/mixins/emitter.js
3929
3958
  var emitter = __webpack_require__(15);
@@ -4177,6 +4206,21 @@ var resize_event = __webpack_require__(39);
4177
4206
  //
4178
4207
  //
4179
4208
  //
4209
+ //
4210
+ //
4211
+ //
4212
+ //
4213
+ //
4214
+ //
4215
+ //
4216
+ //
4217
+ //
4218
+ //
4219
+ //
4220
+ //
4221
+ //
4222
+ //
4223
+ //
4180
4224
 
4181
4225
 
4182
4226
 
@@ -4278,6 +4322,14 @@ var resize_event = __webpack_require__(39);
4278
4322
  * @default false
4279
4323
  */
4280
4324
  readonly: Boolean,
4325
+ /**
4326
+ * 仅绑定原生 input 的 readonly 属性(行为标志,供 select/cascader/picker 内部使用)
4327
+ * @type {Boolean}
4328
+ * @default false
4329
+ * @description 这些复合组件给内部 es-input 传的 readonly 是"禁止打字但保留输入框结构"
4330
+ * 的行为标志(普通态也常为 true),若走 readonly 会命中只读 div 分支导致布局破坏
4331
+ */
4332
+ nativeReadonly: Boolean,
4281
4333
  /**
4282
4334
  * 输入框类型
4283
4335
  * @type {String}
@@ -4453,6 +4505,15 @@ var resize_event = __webpack_require__(39);
4453
4505
  nativeInputValue: function nativeInputValue() {
4454
4506
  return this.value === null || this.value === undefined ? '' : String(this.value);
4455
4507
  },
4508
+
4509
+ // 只读 div 用:密码型(含 showPassword 未点眼预览)按原生表现打码,
4510
+ // div 无法应用 type="password",直接以掩码字符回显
4511
+ maskedInputValue: function maskedInputValue() {
4512
+ if (this.type !== 'password' && !(this.showPassword && !this.passwordVisible)) {
4513
+ return this.nativeInputValue;
4514
+ }
4515
+ return '*'.repeat(this.nativeInputValue.length);
4516
+ },
4456
4517
  showClear: function showClear() {
4457
4518
  return this.clearable && !this.inputDisabled && !this.inputReadonly && this.nativeInputValue && (this.focused || this.hovering);
4458
4519
  },
package/lib/select.js CHANGED
@@ -5571,7 +5571,7 @@ var doDecrypt = function doDecrypt(_ref2) {
5571
5571
  // ESM COMPAT FLAG
5572
5572
  __webpack_require__.r(__webpack_exports__);
5573
5573
 
5574
- // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select.vue?vue&type=template&id=4baed3ce&
5574
+ // CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vue-loader/lib??vue-loader-options!./packages/select/src/select.vue?vue&type=template&id=5f1334b0&
5575
5575
  var render = function () {
5576
5576
  var _vm = this
5577
5577
  var _h = _vm.$createElement
@@ -5905,7 +5905,7 @@ var render = function () {
5905
5905
  autocomplete: _vm.autocomplete,
5906
5906
  size: _vm.selectSize,
5907
5907
  disabled: _vm.selectDisabled,
5908
- readonly: _vm.inputReadonly,
5908
+ "native-readonly": _vm.inputReadonly,
5909
5909
  "validate-event": false,
5910
5910
  tabindex: _vm.tabindex,
5911
5911
  prefix: _vm.prefix,
@@ -6083,6 +6083,12 @@ var render = function () {
6083
6083
  "es-scrollbar",
6084
6084
  {
6085
6085
  directives: [
6086
+ {
6087
+ name: "loading",
6088
+ rawName: "v-loading",
6089
+ value: _vm.isLoading,
6090
+ expression: "isLoading",
6091
+ },
6086
6092
  {
6087
6093
  name: "show",
6088
6094
  rawName: "v-show",
@@ -6102,6 +6108,14 @@ var render = function () {
6102
6108
  "wrap-class": "es-select-dropdown__wrap",
6103
6109
  "view-class": "es-select-dropdown__list",
6104
6110
  listener: true,
6111
+ "infinite-scroll": _vm.innerInfiniteScroll,
6112
+ "infinite-scroll-disabled":
6113
+ _vm.innerInfiniteScrollDisabled,
6114
+ "infinite-scroll-distance":
6115
+ _vm.infiniteScrollDistance,
6116
+ "infinite-scroll-delay": _vm.infiniteScrollDelay,
6117
+ "infinite-scroll-immediate":
6118
+ _vm.infiniteScrollImmediate,
6105
6119
  },
6106
6120
  },
6107
6121
  [
@@ -6235,6 +6249,21 @@ var render = function () {
6235
6249
  : _vm._e(),
6236
6250
  ]
6237
6251
  }),
6252
+ _vm.lazyEnabled &&
6253
+ _vm.lazyFinished &&
6254
+ _vm.lazyPageNum > 1
6255
+ ? _c(
6256
+ "div",
6257
+ {
6258
+ staticClass: "es-select-dropdown__finished",
6259
+ },
6260
+ [
6261
+ _vm._v(
6262
+ "\n 没有更多数据了\n "
6263
+ ),
6264
+ ]
6265
+ )
6266
+ : _vm._e(),
6238
6267
  ],
6239
6268
  2
6240
6269
  ),
@@ -6278,7 +6307,7 @@ var staticRenderFns = []
6278
6307
  render._withStripped = true
6279
6308
 
6280
6309
 
6281
- // CONCATENATED MODULE: ./packages/select/src/select.vue?vue&type=template&id=4baed3ce&
6310
+ // CONCATENATED MODULE: ./packages/select/src/select.vue?vue&type=template&id=5f1334b0&
6282
6311
 
6283
6312
  // EXTERNAL MODULE: ./src/mixins/emitter.js
6284
6313
  var emitter = __webpack_require__(15);
@@ -7099,6 +7128,19 @@ var _this = undefined;
7099
7128
  //
7100
7129
  //
7101
7130
  //
7131
+ //
7132
+ //
7133
+ //
7134
+ //
7135
+ //
7136
+ //
7137
+ //
7138
+ //
7139
+ //
7140
+ //
7141
+ //
7142
+ //
7143
+ //
7102
7144
 
7103
7145
 
7104
7146
 
@@ -7541,7 +7583,80 @@ var _this = undefined;
7541
7583
  * 选项值的键名
7542
7584
  * @type {String}
7543
7585
  */
7544
- valueKey: String
7586
+ valueKey: String,
7587
+ /**
7588
+ * 无限滚动回调:下拉列表滚动到底部时触发,用于分页加载更多选项
7589
+ * @type {Function}
7590
+ * @description 选项数据由外部接口分页提供时,在回调中请求下一页并追加到 data;
7591
+ * 没有更多数据时由外部置 infiniteScrollDisabled 为 true 停止触发
7592
+ */
7593
+ infiniteScroll: Function,
7594
+ /**
7595
+ * 是否禁用无限滚动
7596
+ * @type {Boolean}
7597
+ * @default false
7598
+ */
7599
+ infiniteScrollDisabled: Boolean,
7600
+ /**
7601
+ * 距底部多少 px 时触发无限滚动
7602
+ * @type {Number}
7603
+ * @default 0
7604
+ */
7605
+ infiniteScrollDistance: {
7606
+ type: Number,
7607
+ default: 0
7608
+ },
7609
+ /**
7610
+ * 无限滚动回调的节流间隔(ms),透传给内部 es-scrollbar
7611
+ * @type {Number}
7612
+ * @default 200
7613
+ */
7614
+ infiniteScrollDelay: {
7615
+ type: Number,
7616
+ default: 200
7617
+ },
7618
+ /**
7619
+ * 是否挂载后立即触发一次回调
7620
+ * @type {Boolean}
7621
+ * @default false
7622
+ * @description 与 es-scrollbar 默认值(true)不同:下拉的滚动条随 select 一起挂载,
7623
+ * 默认 true 会导致下拉尚未打开就自动请求首页,故这里默认关闭
7624
+ */
7625
+ infiniteScrollImmediate: {
7626
+ type: Boolean,
7627
+ default: false
7628
+ },
7629
+ /**
7630
+ * 是否开启选项懒加载(分页加载)
7631
+ * @type {Boolean}
7632
+ * @default false
7633
+ * @description 对 tree 为 false 的平铺 ul 列表生效,两种数据来源均支持:
7634
+ * 1. url 取数:初始化请求第一页,下拉滚动到底部时自动续拉下一页并追加(内部复用无限滚动),
7635
+ * 请求期间列表显示 loading;某页返回条数小于 pageSize 视为加载完毕停止触发
7636
+ * 2. data 外部传入(未配置 url):本地分页,先渲染前 pageSize 条,
7637
+ * 滚动到底部时同步切片追加下一页;data 变化时重置回第一页
7638
+ */
7639
+ lazy: Boolean,
7640
+ /**
7641
+ * 懒加载每页条数(url 取数时作为请求参数 pageNum/pageSize 随 param 一起 POST 给 url;
7642
+ * data 本地懒加载时作为每页切片条数)
7643
+ * @type {Number}
7644
+ * @default 50
7645
+ */
7646
+ pageSize: {
7647
+ type: Number,
7648
+ default: 20
7649
+ },
7650
+ /**
7651
+ * ajax 配置
7652
+ * @type {Object}
7653
+ */
7654
+ ajaxConfig: {
7655
+ type: Object,
7656
+ default: function _default() {
7657
+ return {};
7658
+ }
7659
+ }
7545
7660
  },
7546
7661
 
7547
7662
  computed: {
@@ -7555,6 +7670,26 @@ var _this = undefined;
7555
7670
  return this.valueKey || (this.sysCode ? 'cciValue' : 'value');
7556
7671
  },
7557
7672
 
7673
+ // 懒加载生效条件:开启 lazy、非树形(平铺 ul 列表)、有数据来源(url 取数或 data 传入)
7674
+ lazyEnabled: function lazyEnabled() {
7675
+ return this.lazy && !this.tree && (!!this.url || this.data.length > 0);
7676
+ },
7677
+
7678
+ // 本地懒加载:未配置 url、由外部 data 传入时的分页切片模式
7679
+ localLazyEnabled: function localLazyEnabled() {
7680
+ return this.lazyEnabled && !this.url;
7681
+ },
7682
+
7683
+ // 无限滚动回调:懒加载模式走内部分页续拉,否则透传外部 infiniteScroll
7684
+ innerInfiniteScroll: function innerInfiniteScroll() {
7685
+ return this.lazyEnabled ? this.loadMoreOptions : this.infiniteScroll;
7686
+ },
7687
+
7688
+ // 无限滚动禁用:外部禁用,或懒加载中/已加载完时避免重复触发
7689
+ innerInfiniteScrollDisabled: function innerInfiniteScrollDisabled() {
7690
+ return this.infiniteScrollDisabled || this.lazyEnabled && (this.isLoading || this.lazyFinished);
7691
+ },
7692
+
7558
7693
  model: {
7559
7694
  get: function get() {
7560
7695
  if (this.multiple) {
@@ -7621,7 +7756,8 @@ var _this = undefined;
7621
7756
  return this.remote ? 300 : 0;
7622
7757
  },
7623
7758
  emptyText: function emptyText() {
7624
- if (this.loading) {
7759
+ // 懒加载首页请求中列表尚为空,展示加载中而非无数据
7760
+ if (this.loading || this.isLoading && this.options.length === 0) {
7625
7761
  return this.loadingText || '加载中';
7626
7762
  }
7627
7763
 
@@ -7682,7 +7818,14 @@ var _this = undefined;
7682
7818
  watch: {
7683
7819
  data: {
7684
7820
  handler: function handler(val) {
7685
- this.results = val;
7821
+ if (this.localLazyEnabled) {
7822
+ // 本地懒加载:数据变化时重置回第一页重新切片
7823
+ this.lazyPageNum = 1;
7824
+ this.lazyFinished = false;
7825
+ this.applyLocalLazySlice();
7826
+ } else {
7827
+ this.results = val;
7828
+ }
7686
7829
  },
7687
7830
 
7688
7831
  deep: true
@@ -7865,7 +8008,14 @@ var _this = undefined;
7865
8008
  isDestroy: false,
7866
8009
  innerStyle: {},
7867
8010
  results: this.data,
7868
- _propsCache: new Map()
8011
+ // 懒加载分页状态:已加载到的页码 / 是否已加载完
8012
+ lazyPageNum: 1,
8013
+ lazyFinished: false,
8014
+ // 懒加载重置时保存的基础参数(this.param + 搜索参数),续拉复用,保证远程搜索词不丢
8015
+ lazyBaseParams: {},
8016
+ _propsCache: new Map(),
8017
+ // 是否请求中(驱动 es-scrollbar 上的 v-loading)
8018
+ isLoading: false
7869
8019
  };
7870
8020
  },
7871
8021
  created: function created() {
@@ -7896,6 +8046,10 @@ var _this = undefined;
7896
8046
 
7897
8047
  this.$on('handleOptionClick', this.handleOptionSelect);
7898
8048
  this.$on('setSelected', this.setSelected);
8049
+ // 本地懒加载:初始只渲染 data 的第一页切片
8050
+ if (this.localLazyEnabled) {
8051
+ this.applyLocalLazySlice();
8052
+ }
7899
8053
  this.debouncedGetData();
7900
8054
  },
7901
8055
  mounted: function mounted() {
@@ -7996,26 +8150,94 @@ var _this = undefined;
7996
8150
  * @param {Object} options - 配置选项
7997
8151
  * @param {String} options.url - 接口地址
7998
8152
  * @param {Object} options.params - 接口参数
8153
+ * @param {Boolean} options.append - 懒加载续拉下一页并追加(仅 lazyEnabled 时生效)
7999
8154
  */
8000
- getData: function getData(_ref) {
8155
+ getData: function getData() {
8001
8156
  var _this10 = this;
8002
8157
 
8003
- var url = _ref.url,
8158
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
8159
+ url = _ref.url,
8004
8160
  _ref$params = _ref.params,
8005
- params = _ref$params === undefined ? {} : _ref$params;
8161
+ params = _ref$params === undefined ? {} : _ref$params,
8162
+ _ref$append = _ref.append,
8163
+ append = _ref$append === undefined ? false : _ref$append;
8006
8164
 
8007
8165
  url = url || this.url;
8008
8166
  params = selectvue_type_script_lang_js_extends({}, this.param, params);
8009
- url && Object(ajax["a" /* ajax */])({
8167
+ if (!url) return;
8168
+ if (this.lazyEnabled) {
8169
+ // 请求中禁用无限滚动,避免首页在途时空列表触底又发续拉请求
8170
+ this.isLoading = true;
8171
+ if (append) {
8172
+ // 续拉下一页:复用重置时保存的基础参数(含远程搜索词),避免续拉丢搜索条件
8173
+ params = selectvue_type_script_lang_js_extends({}, this.lazyBaseParams, {
8174
+ pageNum: this.lazyPageNum + 1,
8175
+ pageSize: this.pageSize
8176
+ });
8177
+ } else {
8178
+ // 初始化/参数变化/远程搜索:重置分页请求第一页
8179
+ this.lazyPageNum = 1;
8180
+ this.lazyFinished = false;
8181
+ this.lazyBaseParams = params;
8182
+ params = selectvue_type_script_lang_js_extends({}, params, { pageNum: 1, pageSize: this.pageSize });
8183
+ }
8184
+ }
8185
+ Object(ajax["a" /* ajax */])(selectvue_type_script_lang_js_extends({
8010
8186
  url: url,
8011
- method: 'POST',
8012
- data: params
8013
- }).then(function (res) {
8187
+ method: 'POST'
8188
+ }, this.ajaxConfig, {
8189
+ data: params,
8190
+ params: params
8191
+ })).then(function (res) {
8014
8192
  if (res.rCode === 0) {
8015
- _this10.results = res.results || [];
8193
+ // 兼容分页包装对象({ records })与直接返回数组两种结构
8194
+ var payload = res.results || [];
8195
+ var rows = Array.isArray(payload) ? payload : payload.records || [];
8196
+ if (_this10.lazyEnabled && append) {
8197
+ _this10.results = _this10.results.concat(rows);
8198
+ _this10.lazyPageNum += 1;
8199
+ } else {
8200
+ _this10.results = rows;
8201
+ }
8202
+ // 返回条数不足一页视为已加载完,停止触发续拉
8203
+ // (没有更多提示需翻过页才显示,见模板 lazyPageNum > 1)
8204
+ if (_this10.lazyEnabled && rows.length < _this10.pageSize) {
8205
+ _this10.lazyFinished = true;
8206
+ }
8016
8207
  }
8208
+ _this10.isLoading = false;
8209
+ }).catch(function () {
8210
+ _this10.isLoading = false;
8017
8211
  });
8018
8212
  },
8213
+
8214
+ /**
8215
+ * 懒加载:滚动到底部时加载下一页(由内部无限滚动触发,带防重入守卫)
8216
+ * 本地懒加载为同步切片追加,url 懒加载为异步续拉请求
8217
+ */
8218
+ loadMoreOptions: function loadMoreOptions() {
8219
+ if (!this.lazyEnabled || this.isLoading || this.lazyFinished || !this.results.length) return;
8220
+ if (this.localLazyEnabled) {
8221
+ this.lazyPageNum += 1;
8222
+ this.applyLocalLazySlice();
8223
+ } else {
8224
+ this.getData({ append: true });
8225
+ }
8226
+ },
8227
+
8228
+ /**
8229
+ * 本地懒加载:按当前 lazyPageNum 对 data 做切片渲染(0 ~ pageNum*pageSize),
8230
+ * 翻过页且切到末尾时置 lazyFinished 停止触发并显示没有更多提示
8231
+ * (首页即覆盖全量属正常小数据量,不置位不提示)
8232
+ */
8233
+ applyLocalLazySlice: function applyLocalLazySlice() {
8234
+ var list = this.data || [];
8235
+ var end = this.lazyPageNum * this.pageSize;
8236
+ this.results = list.slice(0, end);
8237
+ if (this.lazyPageNum > 1 && end >= list.length) {
8238
+ this.lazyFinished = true;
8239
+ }
8240
+ },
8019
8241
  handleComposition: function handleComposition(event) {
8020
8242
  var _this11 = this;
8021
8243