chain-saasui 1.0.10-alpha.21 → 1.0.10-alpha.23

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.
package/COMPONENTS.md ADDED
@@ -0,0 +1,319 @@
1
+ # saasui 组件清单
2
+
3
+ 基础组件必须优先使用 `common/saasui` 中的封装,禁止直接使用原生 `el-*` 组件。未在此列出的组件才允许回落到 Element UI。
4
+
5
+ ## 使用前提
6
+
7
+ `saasui` 已在主应用中全局 `Vue.use(saasui)` 注册,模板内直接使用 kebab-case 标签即可:
8
+
9
+ ```vue
10
+ <s-button type="primary">保存</s-button>
11
+ ```
12
+
13
+ 所有组件通过 `v-bind="$attrs"` / `v-on="$listeners"` 透传到底层 Element UI,因此 element 原有 props/事件仍可使用。
14
+
15
+ ---
16
+
17
+ ## 一、按钮类
18
+
19
+ ### `<s-button>`
20
+
21
+ 主按钮,替代 `el-button`。封装了路由跳转、`icon` 类型、边框模式。
22
+
23
+ | 参数 | 类型 | 默认值 | 说明 |
24
+ | ------ | ------ | -------- | ----------------------------------------- |
25
+ | type | String | default | `primary` / `default` / `danger` / `icon` |
26
+ | border | String | - | 边框样式,自定义 class 后缀 |
27
+ | mode | String | button | `button` / `link` / `external` |
28
+ | path | String | - | `mode=link` 时的路由 path |
29
+ | query | Object | - | 路由 query |
30
+ | target | String | - | `_blank` 在新窗口打开 |
31
+
32
+ ```vue
33
+ <s-button type="primary" @click="handleSave">保存</s-button>
34
+ <s-button mode="link" path="/detail" :query="{ id }">查看</s-button>
35
+ ```
36
+
37
+ ### `<s-button-text>`
38
+
39
+ 文字按钮,用于表格行内次要操作,替代 `el-button type="text"`。
40
+
41
+ | 参数 | 类型 | 默认值 | 说明 |
42
+ | ------ | ------ | ---- | --------------------- |
43
+ | type | String | text | `text` / `link` |
44
+ | path | String | - | `type=link` 时的路由 path |
45
+ | query | Object | - | 路由 query |
46
+ | target | String | - | `_blank` 在新窗口打开 |
47
+
48
+ ### `<s-table-buttons>`
49
+
50
+ 行内操作按钮组,**表格操作列强制使用**。超出 `maxLength` 自动收起到下拉更多。
51
+
52
+ | 参数 | 类型 | 默认值 | 说明 |
53
+ | --------- | ------ | ---- | ------------- |
54
+ | list | Array | [] | 按钮配置数组,见下方字段 |
55
+ | row | Object | - | 当前行,透传到 onClick |
56
+ | maxLength | Number | 2 | 最多显示几个,其余进入更多 |
57
+ | moreType | String | text | `text` / `more`(更多按钮样式) |
58
+
59
+ `list` 项:`{ label, onClick, show?, tip?, attrs? }`,`show` 支持布尔或函数。
60
+
61
+ ```vue
62
+ <s-table-buttons :list="actionList" :row="row" @action="handleAction" />
63
+ ```
64
+
65
+ ---
66
+
67
+ ## 二、分页 / 布局 / 容器
68
+
69
+ ### `<s-pagetable>`
70
+
71
+ **列表页外层容器,必须使用**。自带 `header` / `form` / `footer` 插槽。
72
+
73
+ | 参数 | 类型 | 默认值 | 说明 |
74
+ | ----------------- | ------- | ----- | ------------------------ |
75
+ | title | String | 路由标题 | 页头标题,默认取路由 meta |
76
+ | mode | String | page | `page` / `form` |
77
+ | showHeader | Boolean | false | 是否显示头部 |
78
+ | showClose | Boolean | false | 显示返回箭头 |
79
+ | showFooter | Boolean | true | 是否渲染 footer 插槽 |
80
+ | showFooterButton | Boolean | false | 底部是否展示「取消 / 确认」按钮 |
81
+ | loadingBtn | Boolean | false | 确认按钮 loading |
82
+ | confirmText | String | 确定 | |
83
+ | cancelText | String | 取消 | |
84
+
85
+ 插槽:`default`(内容)、`header`、`header-append`、`title`、`form`(搜索区)、`footer`(分页)。
86
+
87
+ ```vue
88
+ <s-pagetable>
89
+ <template #form>...筛选条件...</template>
90
+ <s-table :data="list" :columns="columns" />
91
+ <template #footer>
92
+ <el-pagination ... />
93
+ </template>
94
+ </s-pagetable>
95
+ ```
96
+
97
+ ### `<s-page-tabs>` (项目中的 Tabs 基础组件)
98
+
99
+ 基于数组驱动的标签页,**替代 `el-tabs`**(项目中不存在 `s-tabs`,对应组件就是这个)。支持滚动、拖拽、显隐控制。
100
+
101
+ | 参数 | 类型 | 默认值 | 说明 |
102
+ | ------------ | ----------------- | ------------------------------ | ----------------------- |
103
+ | value | String / Number | '' | `v-model`,当前激活的 value |
104
+ | tabs | Array | [] | `{ label, value, disabled?, show? }` |
105
+ | fieldNames | Object | `{ label, value }` | 字段映射 |
106
+ | gap | String / Number | 32 | tab 间距 |
107
+ | showBorder | Boolean | true | 是否显示下边框 |
108
+ | beforeLeave | Function | - | 切换前钩子,返回 `false`/Promise reject 阻止切换 |
109
+ | draggable | Boolean | false | 是否开启拖拽排序 |
110
+
111
+ 事件:`input`、`tab-click(tab, index)`、`tabs-sort(newTabs, { from, to, tab })`。
112
+
113
+ 插槽:`extra`(右侧)、`tab-suffix`(每个 tab 尾部)。
114
+
115
+ ```vue
116
+ <s-page-tabs v-model="active" :tabs="tabs" />
117
+ ```
118
+
119
+ > 纯样式的简单切换也可以使用原生 `el-tabs`,但项目规范下**优先用 `s-page-tabs`**。
120
+
121
+ ### `<s-page-button>`
122
+
123
+ 页面级按钮区容器,用于 `s-pagetable` 顶部操作栏排布。
124
+
125
+ ### `<s-card>`
126
+
127
+ 内容卡片,带标题和可折叠能力。
128
+
129
+ | 参数 | 类型 | 默认值 | 说明 |
130
+ | ---------- | ------- | ----- | -------- |
131
+ | title | String | '' | 卡片标题 |
132
+ | titleSub | String | '' | 副标题 |
133
+ | isCollapse | Boolean | false | 是否开启折叠箭头 |
134
+
135
+ 插槽:`title`、`action`(右上角)、`default`。
136
+
137
+ ### `<s-container>`
138
+
139
+ 外层容器,不常用,用于非 PageTable 页面的基础容器。
140
+
141
+ ### `<s-group>`
142
+
143
+ 分组数据块,常用于首页卡片类分组展示。
144
+
145
+ | 参数 | 类型 | 默认值 | 说明 |
146
+ | --------------- | -------- | ----- | ---------------------- |
147
+ | list | Array | [] | 分组数据,`{ label, children }` |
148
+ | data | Object | {} | 绑定数据 |
149
+ | isActive | Function | - | 判断 item 是否激活 |
150
+ | showGroupTitle | Boolean | false | 是否显示分组标题 |
151
+
152
+ ---
153
+
154
+ ## 三、表格
155
+
156
+ ### `<s-table>`
157
+
158
+ **列表页表格强制使用**。继承 `el-table` 全部 props + 事件,新增 `columns` 配置化、内置多选列。
159
+
160
+ | 参数 | 类型 | 默认值 | 说明 |
161
+ | ---------------- | -------- | ------- | --------------------------------- |
162
+ | data | Array | - | 同 `el-table` |
163
+ | border | Boolean | true | 默认有边框 |
164
+ | columns | Array | [] | 列配置,见下方 |
165
+ | minWidth | Number/String | 160 | 列默认最小宽度 |
166
+ | selectable | Boolean | false | 是否展示多选列 |
167
+ | selectableType | String | default | `default` / `all`(跨页全选) |
168
+ | reserveSelection | Boolean | false | 翻页保留选中 |
169
+ | checkSelectable | Function | () => true | 行是否可选 |
170
+ | selected | Array | [] | 跨页全选时的选中 id 集合,需 `:selected.sync` |
171
+
172
+ `columns` 项字段:
173
+
174
+ | 字段 | 说明 |
175
+ | -------- | ---------------------------------------- |
176
+ | label | 表头文字 |
177
+ | value | 对应 `prop`,也是插槽名 |
178
+ | type | `text` / `select` / `unit` / `operate` / `index` / `UserModel` |
179
+ | tip | 表头 tooltip |
180
+ | width / minWidth / fixed | 列宽、冻结 |
181
+ | actionList | `type=operate` 时的按钮数组 |
182
+ | options | `type=select` / `unit` 时的字典 |
183
+
184
+ 事件:`action(name, row, column)`(操作列)、`selection-change`、`select-all`、透传 `el-table` 所有事件。
185
+
186
+ 暴露方法:`doLayout()`、`clearSelection()`、`toggleRowSelection()`、`getSelection()`。
187
+
188
+ ```vue
189
+ <s-table
190
+ :data="list"
191
+ :columns="[
192
+ { label: '姓名', value: 'name' },
193
+ { label: '状态', value: 'status', type: 'unit', options: statusOptions },
194
+ { label: '操作', value: 'action', type: 'operate', actionList },
195
+ ]"
196
+ @action="onAction" />
197
+ ```
198
+
199
+ ### `<s-table-column>`
200
+
201
+ 内置于 `s-table` 的列渲染器,一般不直接使用,通过 `columns` 配置。
202
+
203
+ ---
204
+
205
+ ## 四、弹窗 / 抽屉
206
+
207
+ ### `<s-dialog>`
208
+
209
+ **新增 / 编辑弹窗必须使用**。继承 `el-dialog` 全部 props,内置 footer、loading。
210
+
211
+ | 参数 | 类型 | 默认值 | 说明 |
212
+ | ------------------ | ------------- | ----- | ------------------- |
213
+ | visible | Boolean | false | 使用 `visible.sync` |
214
+ | width | String/Number | 720px | |
215
+ | showFooter | Boolean | true | 是否显示底部按钮 |
216
+ | showCancelButton | Boolean | true | |
217
+ | showConfirmButton | Boolean | true | |
218
+ | loadingBtn | Boolean | false | 确认按钮 loading |
219
+ | confirmText | String | 确定 | |
220
+ | cancelText | String | 取消 | |
221
+ | closeOnClickModal | Boolean | false | 强制 false,点击遮罩不关闭 |
222
+
223
+ 事件:`confirm`、`close`、`update:visible`。
224
+
225
+ ```vue
226
+ <s-dialog :visible.sync="visible" title="新增" :loading-btn="saving" @confirm="onSave">
227
+ ...表单...
228
+ </s-dialog>
229
+ ```
230
+
231
+ ### `<s-drawer>`
232
+
233
+ 侧边抽屉,参数同 `s-dialog`,`width` 改为 `size`(默认 720px)。
234
+
235
+ ### `SMessagebox` / `SInputDialog`
236
+
237
+ 以 JS 方式调起的命令式弹窗,直接从 saasui 导入调用。
238
+
239
+ ```js
240
+ import saasui from 'saasui';
241
+ saasui.SMessagebox({ title: '提示', content: '...' });
242
+ ```
243
+
244
+ ---
245
+
246
+ ## 五、表单控件(替代 `el-*`)
247
+
248
+ > 所有控件支持 `from="text"` 进入纯展示模式,用于详情页与表单共用一套配置。
249
+
250
+ | 组件 | 替代 | 关键 props |
251
+ | ------------------- | ----------- | ------------------------------------------------ |
252
+ | `<s-input>` | el-input | `type`、`from`、默认 `clearable`、`maxlength` |
253
+ | `<s-input-number>` | el-input-number | |
254
+ | `<s-select>` | el-select | `options=[{ label, value }]`、默认 `filterable`、支持分组 |
255
+ | `<s-cascader>` | el-cascader | `options`、`props` |
256
+ | `<s-date-picker>` | el-date-picker | `type` 默认 `date`、`valueFormat` 默认 `yyyy-MM-dd` |
257
+ | `<s-radio-group>` | el-radio-group | `options`、`direction`(horizontal / vertical) |
258
+ | `<s-switch>` | el-switch | |
259
+ | `<s-mask-input>` | - | 脱敏输入 |
260
+ | `<s-currency>` | - | 货币金额输入 |
261
+ | `<s-currency-select>`| - | 货币种类选择 |
262
+ | `<s-field-group>` | - | 多字段组合,`fields=[{ field, type, ... }]` |
263
+
264
+ ---
265
+
266
+ ## 六、展示 / 反馈
267
+
268
+ | 组件 | 用途 |
269
+ | ----------------- | ---------------------------------------- |
270
+ | `<s-unit value type options>` | 状态点 / tag 样式展示,配合字典 |
271
+ | `<s-tag>` | 标签,替代 `el-tag` |
272
+ | `<s-tip>` | 提示性文字 / 弱提示 |
273
+ | `<s-alert>` | 警告/通知条,替代 `el-alert` |
274
+ | `<s-tooltip-wrap>`| 自适应文字省略 + tooltip,替代常见 `text-overflow` 包装 |
275
+ | `<s-item-list>` | 展示键值对列表 |
276
+ | `<s-steps>` | 步骤条,替代 `el-steps` |
277
+ | `<s-segmented>` | 分段控件 |
278
+ | `<s-icon>` | 图标统一入口 |
279
+ | `<s-empty>` | 空状态 |
280
+
281
+ ### `<s-tooltip-wrap>`
282
+
283
+ | 参数 | 类型 | 默认值 | 说明 |
284
+ | --------- | ------- | --------- | --------------- |
285
+ | text | String | '' | 展示文本,超出才显示 tooltip |
286
+ | placement | String | top-start | |
287
+ | lineClamp | String | '1' | 多行省略行数 |
288
+ | inherit | Boolean | false | 继承父级文字样式 |
289
+
290
+ ### `<s-unit>`
291
+
292
+ | 参数 | 类型 | 默认值 | 说明 |
293
+ | ------- | -------------- | --- | ------------------- |
294
+ | value | String/Number | - | 值 |
295
+ | type | String | '' | 预设类型 |
296
+ | options | Array | [] | 字典数组 |
297
+ | props | Object | - | 字段映射 `{ value, label, style }` |
298
+ | color | String | '' | 强制指定颜色 |
299
+ | isLink | Boolean | - | 是否当链接展示 |
300
+
301
+ ---
302
+
303
+ ## 七、布局
304
+
305
+ ### `<s-space>` / `<s-space-item>`
306
+
307
+ 元素间距容器,替代手写 `margin`。
308
+
309
+ ---
310
+
311
+ ## 使用规则速记
312
+
313
+ 1. **新建列表页** → `s-pagetable` + `s-table` + `s-table-buttons` + `s-dialog`
314
+ 2. **Tabs 切换** → `s-page-tabs`,不要再写 `el-tabs`
315
+ 3. **表单字段** → `s-input` / `s-select` / `s-date-picker` / `s-radio-group`,详情页传 `from="text"` 即可
316
+ 4. **弹窗** → 新增编辑用 `s-dialog`、侧边配置用 `s-drawer`、命令式用 `SMessagebox`
317
+ 5. **行内操作** → 一律用 `s-table-buttons`,不要手写 `el-button` 列表
318
+ 6. **文字省略** → `s-tooltip-wrap`,不要手写 `text-overflow`
319
+ 7. **状态展示** → `s-unit` + 字典,不要自己拼颜色
@@ -1,5 +1,5 @@
1
1
  .el-button.saas-button-text {
2
- color: #0e1822;
2
+ color: #0e1822;
3
3
  padding-left: 8px;
4
4
  padding-right: 8px;
5
5
  display: inline-flex;
@@ -1,6 +1,5 @@
1
1
  .saas-stabs {
2
2
  width: 100%;
3
- background: #fff;
4
3
  position: relative;
5
4
  }
6
5
 
@@ -0,0 +1,3 @@
1
+ .saas-utable {
2
+
3
+ }
@@ -5,10 +5,11 @@
5
5
  overflow: hidden;
6
6
  white-space: nowrap;
7
7
  text-overflow: ellipsis;
8
- word-break: break-all;
8
+ word-break: break-word;
9
+ overflow-wrap: break-word;
9
10
  }
10
11
  .saas-tooltip-wrap__content-more {
11
- word-break: break-all;
12
+ word-break: break-word;
12
13
  text-overflow: ellipsis;
13
14
  display: -webkit-box;
14
15
  -webkit-box-orient: vertical;
@@ -1,10 +1,12 @@
1
1
  <template>
2
2
  <div class="saas-table-actions">
3
3
  <el-dropdown v-if="buttonList.length" @command="handleCommand">
4
- <s-button type="text">
5
- {{ $t('TableData.action') }}
6
- <span class="smart-caret-down"></span>
7
- </s-button>
4
+ <slot name="trigger">
5
+ <s-button type="text">
6
+ {{ $t('TableData.action') }}
7
+ <span class="smart-caret-down"></span>
8
+ </s-button>
9
+ </slot>
8
10
  <el-dropdown-menu slot="dropdown">
9
11
  <el-tooltip
10
12
  v-for="(drop, index) in buttonList"
@@ -1,7 +1,9 @@
1
1
  <template>
2
2
  <div class="saas-select" :class="{ 'saas-text-mode': from === 'text' }">
3
- <span v-if="from === 'text'" class="saas-input-text">{{ textValue }}</span>
4
- <el-cascader v-else class="saas-cascader" ref="refCascader" v-on="onEvents" v-model="_value" v-bind="attrs">
3
+ <span v-if="from === 'text'" class="saas-input-text">
4
+ <STooltipWrap :text="getTextValue" />
5
+ </span>
6
+ <el-cascader v-else class="saas-cascader" ref="refCascader" v-on="onEvents" v-model="_value" :options="optionsList" v-bind="attrs">
5
7
  <template v-for="(_, slotName) in $scopedSlots" #[slotName]="scope">
6
8
  <slot :name="slotName" v-bind="scope" />
7
9
  </template>
@@ -12,7 +14,7 @@
12
14
  <script>
13
15
  import { Cascader } from 'element-ui';
14
16
  import attrsMixin from '../mixins/attrsMixin';
15
- import { omit, isEmpty } from 'chain-lodash';
17
+ import { omit, isEmpty, formatIfJson } from 'chain-lodash';
16
18
  export default {
17
19
  name: 'SCascader',
18
20
  mixins: [attrsMixin],
@@ -48,6 +50,10 @@ export default {
48
50
  type: Boolean,
49
51
  default: false,
50
52
  },
53
+ options: {
54
+ type: Array,
55
+ default: () => [],
56
+ },
51
57
  },
52
58
  data() {
53
59
  return {
@@ -69,6 +75,12 @@ export default {
69
75
  'expand-change': this.cascaderVisable,
70
76
  };
71
77
  },
78
+ optionsList() {
79
+ return (this.options || []).map(this.formatOptions);
80
+ },
81
+ getTextValue() {
82
+ return this.getSelectValue() || '-';
83
+ },
72
84
  },
73
85
 
74
86
  methods: {
@@ -80,6 +92,51 @@ export default {
80
92
  });
81
93
  this.$emit('expand-change', ...args);
82
94
  },
95
+ formatOptions(item) {
96
+ const valueKey = (this.props && this.props.value) || 'value';
97
+ const labelKey = (this.props && this.props.label) || 'label';
98
+ const childrenKey = (this.props && this.props.children) || 'children';
99
+ const value = item[valueKey];
100
+ const label = item[labelKey];
101
+ const children = item[childrenKey];
102
+ return {
103
+ ...item,
104
+ [valueKey]: !isEmpty(value) ? String(value) : '', // 格式化成字符串避免匹配有问题
105
+ [labelKey]: formatIfJson(label),
106
+ [childrenKey]: Array.isArray(children) ? children.map(this.formatOptions) : children,
107
+ };
108
+ },
109
+ getSelectValue() {
110
+ const props = this.props || {};
111
+ const valueKey = props.value || 'value';
112
+ const labelKey = props.label || 'label';
113
+ const childrenKey = props.children || 'children';
114
+ const mul = !!props.multiple;
115
+ const separator = props.separator || ' / ';
116
+ const findPath = (tree, val) => {
117
+ for (const node of tree || []) {
118
+ if (String(node[valueKey]) == String(val)) {
119
+ return [node[labelKey]];
120
+ }
121
+ const children = node[childrenKey];
122
+ if (Array.isArray(children) && children.length) {
123
+ const childPath = findPath(children, val);
124
+ if (childPath) {
125
+ return [node[labelKey], ...childPath];
126
+ }
127
+ }
128
+ }
129
+ return null;
130
+ };
131
+ const values = mul ? this.value || [] : isEmpty(this.value) ? [] : [this.value];
132
+ const nameArr = values
133
+ .map(v => {
134
+ const path = findPath(this.optionsList, v);
135
+ return path ? (this.showAllLevels ? path.join(separator) : path[path.length - 1]) : '';
136
+ })
137
+ .filter(Boolean);
138
+ return nameArr.length ? (nameArr.length > 1 ? `${nameArr[0]} +${nameArr.length - 1}` : nameArr[0]) : '';
139
+ },
83
140
  },
84
141
  };
85
142
  </script>
@@ -16,9 +16,8 @@
16
16
  </template>
17
17
 
18
18
  <script>
19
- import { isEmpty } from 'chain-lodash';
19
+ import { isEmpty, currency } from 'chain-lodash';
20
20
  import attrsMixin from '../mixins/attrsMixin';
21
- import currency from './currency';
22
21
 
23
22
  export default {
24
23
  name: 'SCurrency',
@@ -6,16 +6,16 @@
6
6
  <el-select v-else class="saas-select-input" v-model="newValue" v-on="onEvents" v-bind="attrs" filterable :clearable="clearable">
7
7
  <template v-for="item in optionsList">
8
8
  <!-- 如果item有options属性,说明是分组 -->
9
- <el-option-group v-if="item.options" :key="item.value" :label="item.label">
9
+ <el-option-group v-if="item.options" :key="`group-${item.value}`" :label="item.label">
10
10
  <el-option
11
11
  v-for="option in item.options"
12
- :disabled="option.disabled"
12
+ :disabled="isOptionDisabled(option)"
13
13
  :key="option.value"
14
14
  :label="option.label"
15
15
  :value="option.value"></el-option>
16
16
  </el-option-group>
17
17
  <!-- 否则是普通选项 -->
18
- <el-option v-else :disabled="item.disabled" :key="item.value" :label="item.label" :value="item.value"></el-option>
18
+ <el-option v-else :disabled="isOptionDisabled(item)" :key="`opt-${item.value}`" :label="item.label" :value="item.value"></el-option>
19
19
  </template>
20
20
  </el-select>
21
21
  </div>
@@ -68,6 +68,10 @@ export default {
68
68
  type: [String, Function],
69
69
  default: '',
70
70
  },
71
+ optionDisabled: {
72
+ type: [Function, String],
73
+ default: '',
74
+ },
71
75
  },
72
76
  data() {
73
77
  return {};
@@ -157,6 +161,26 @@ export default {
157
161
  },
158
162
  },
159
163
  methods: {
164
+ isOptionDisabled(option) {
165
+ if (!option) return false;
166
+
167
+ // 1) 优先使用外部传入的禁用判定函数
168
+ if (typeof this.optionDisabled === 'function') {
169
+ return !!this.optionDisabled(option, {
170
+ options: this.optionsList,
171
+ value: this.newValue,
172
+ multiple: !!this.multiple,
173
+ });
174
+ }
175
+
176
+ // 2) 也支持传字段名映射,例如 optionDisabled="isDisabled"
177
+ if (typeof this.optionDisabled === 'string' && this.optionDisabled) {
178
+ return !!option[this.optionDisabled];
179
+ }
180
+
181
+ // 3) 默认兼容原有 disabled 字段
182
+ return !!option.disabled;
183
+ },
160
184
  flattenOptions(options) {
161
185
  const result = [];
162
186
  options.forEach(item => {
@@ -87,7 +87,7 @@ export default {
87
87
  methods: {
88
88
  selectValue(row) {
89
89
  let str = '';
90
- let { options = [], type = 'txt', component = null } = this.column;
90
+ let { type = 'txt', component = null } = this.column;
91
91
  const value = row[this.column.value];
92
92
  if (this.column.formatValue) {
93
93
  return this.column.formatValue(row, this.column);
@@ -97,7 +97,7 @@ export default {
97
97
  } else {
98
98
  switch (type) {
99
99
  case 'select':
100
- let obj = options.find(f => f.value == value) || {};
100
+ let obj = this.column.options.find(f => f.value == value) || {};
101
101
  str = formatIfJson(obj.label);
102
102
  break;
103
103
  case 'time':