riku
2025-04-22 45be153eaef9e1c1a3fe21515e9cbd785fba8e1f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/**
 * 生成一条表单条目
 * @param {String} _label 标签名称
 * @param {String} _name 字段名称
 * @param {Boolean} _required 是否为必填项
 * @param {String} _type 输入类型 (text: 输入框; switch: 切换按钮; picker: 下拉框选项; cascader: 级联选择)
 * @param {Array} _options 当输入类型为picker或cascader时,提供可选项
 * @param {Array} cascaderTitles 当输入类型为cascader时,提供每层选项的标题
 * @param {Array} referItems 当输入类型为cascader时,提供关联的属性name
 */
function baseInputItem(
  _label,
  _name,
  _required,
  _type = 'text',
  _options = [],
  cascaderTitles,
  referItems,
) {
  return {
    required: _required,
    label: _label,
    placeholder: (_type == 'text' ? '请输入' : '请选择') + _label,
    name: _name,
    value: null,
    status: 'success',
    tips: _label + '不能为空',
    inputType: _type,
    options: _options,
    cascaderTitles: cascaderTitles,
    referItems: referItems,
    visible: false,
  };
}
 
/**
 * 隐藏条目,一般是上传时的必要条目信息,但是不需要展示给用户做修改
 * @param {String} _label
 * @param {String} _name
 */
function hideInputItem(_label, _name) {
  const item = baseInputItem(_label, _name);
  item.hide = true;
  return item;
}
 
/**
 * 填充初始数据
 * @param {Array} items 表单条目数组
 * @param {Object} defaultValue 初始数据
 */
function setDefaultValue(items, defaultValue) {
  if (typeof defaultValue === 'object') {
    items.forEach(e => {
      // 文本和开关类型直接赋值
      if (e.inputType == 'text' || e.inputType == 'switch') {
        if (defaultValue.hasOwnProperty(e.name)) {
          e.value = defaultValue[e.name];
        }
      }
      // 下拉框除了赋值,需要额外赋值属性_value(数组类型,组件t-picker的特性)
      else if (e.inputType == 'picker') {
        if (
          defaultValue.hasOwnProperty(e.name) &&
          defaultValue[e.name] != null &&
          defaultValue[e.name] != undefined
        ) {
          e.value = defaultValue[e.name] + '';
          e._value = [e.value];
          const op = e.options.find(o => {
            return o.value == e.value;
          });
          e._label = op.label;
        }
      }
      // 级联选择器,根据属性referItems找到对应的初始数据
      else if (e.inputType == 'cascader') {
        const selectedOptions = [];
        let value,
          note,
          options = e.options;
        e.referItems.forEach(r => {
          if (
            defaultValue.hasOwnProperty(r) &&
            defaultValue[r] != null &&
            defaultValue[r] != undefined
          ) {
            const o = options.find(v => {
              return v.value == defaultValue[r];
            });
            selectedOptions.push(o);
            options = options[0].children;
          }
        });
        if (selectedOptions.length > 0) {
          value = selectedOptions[selectedOptions.length - 1].value;
          note = cascaderNote(selectedOptions);
          const v = selectedOptions.map(v => {
            return v.value;
          });
          e.value = v;
          e._value = value;
          e.note = note;
        }
      }
    });
  }
}
 
/**
 * 级联选择器选择结果格式化
 * @param {Array} v
 */
function cascaderNote(v) {
  let note = '';
  v.forEach(o => {
    if (note != o.label) {
      if (note != '') {
        note += '/';
      }
      note += o.label;
    }
  });
  return note;
}
 
export { baseInputItem, hideInputItem, setDefaultValue, cascaderNote };