@hbdlzy/ui-core 0.1.2 → 0.1.4

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 (64) hide show
  1. package/components.manifest.json +40 -1
  2. package/dist/components/BaseCard/BaseCard.types.d.ts +36 -0
  3. package/dist/components/BaseCard/BaseCard.vue.d.ts +122 -0
  4. package/dist/components/BaseCard/index.d.ts +3 -0
  5. package/dist/components/BaseDialog/BaseDialog.types.d.ts +25 -0
  6. package/dist/components/BaseDialog/BaseDialog.vue.d.ts +100 -0
  7. package/dist/components/BaseDialog/index.d.ts +3 -0
  8. package/dist/components/BaseEChart/BaseEChart.types.d.ts +26 -0
  9. package/dist/components/BaseEChart/BaseEChart.vue.d.ts +66 -0
  10. package/dist/components/BaseEChart/index.d.ts +3 -0
  11. package/dist/components/BaseExportButton/BaseExportButton.types.d.ts +21 -0
  12. package/dist/components/BaseExportButton/BaseExportButton.utils.d.ts +4 -0
  13. package/dist/components/BaseExportButton/BaseExportButton.vue.d.ts +128 -0
  14. package/dist/components/BaseExportButton/index.d.ts +5 -0
  15. package/dist/components/BaseSearchForm/BaseSearchForm.types.d.ts +42 -0
  16. package/dist/components/BaseSearchForm/BaseSearchForm.utils.d.ts +5 -0
  17. package/dist/components/BaseSearchForm/BaseSearchForm.vue.d.ts +88 -0
  18. package/dist/components/BaseSearchForm/index.d.ts +4 -0
  19. package/dist/components/BaseTable/BaseTable.types.d.ts +163 -0
  20. package/dist/components/BaseTable/BaseTable.vue.d.ts +157 -0
  21. package/dist/components/BaseTable/index.d.ts +3 -0
  22. package/dist/components/OutlinedCascader/OutlinedCascader.types.d.ts +25 -0
  23. package/dist/components/OutlinedCascader/OutlinedCascader.vue.d.ts +85 -0
  24. package/dist/components/OutlinedCascader/index.d.ts +3 -0
  25. package/dist/components/OutlinedDatePicker/OutlinedDatePicker.types.d.ts +27 -0
  26. package/dist/components/OutlinedDatePicker/OutlinedDatePicker.vue.d.ts +88 -0
  27. package/dist/components/OutlinedDatePicker/index.d.ts +3 -0
  28. package/dist/components/OutlinedDateTimePicker/OutlinedDateTimePicker.types.d.ts +26 -0
  29. package/dist/components/OutlinedDateTimePicker/OutlinedDateTimePicker.vue.d.ts +97 -0
  30. package/dist/components/OutlinedDateTimePicker/index.d.ts +3 -0
  31. package/dist/components/OutlinedInput/OutlinedInput.types.d.ts +29 -0
  32. package/dist/components/OutlinedInput/OutlinedInput.vue.d.ts +97 -0
  33. package/dist/components/OutlinedInput/index.d.ts +3 -0
  34. package/dist/components/OutlinedSelect/OutlinedSelect.types.d.ts +38 -0
  35. package/dist/components/OutlinedSelect/OutlinedSelect.vue.d.ts +116 -0
  36. package/dist/components/OutlinedSelect/index.d.ts +3 -0
  37. package/dist/components/OutlinedTimePicker/OutlinedTimePicker.types.d.ts +28 -0
  38. package/dist/components/OutlinedTimePicker/OutlinedTimePicker.vue.d.ts +94 -0
  39. package/dist/components/OutlinedTimePicker/index.d.ts +3 -0
  40. package/dist/components/OutlinedTreeSelect/OutlinedTreeSelect.types.d.ts +46 -0
  41. package/dist/components/OutlinedTreeSelect/OutlinedTreeSelect.vue.d.ts +137 -0
  42. package/dist/components/OutlinedTreeSelect/index.d.ts +3 -0
  43. package/dist/echarts/index.d.ts +9 -0
  44. package/dist/excel/exportExcel.d.ts +18 -0
  45. package/dist/index.cjs +1 -1
  46. package/dist/index.d.ts +30 -0
  47. package/dist/index.js +832 -169
  48. package/dist/style.css +1 -1
  49. package/package.json +7 -4
  50. package/src/components/BaseDialog/BaseDialog.types.ts +28 -0
  51. package/src/components/BaseDialog/BaseDialog.vue +158 -0
  52. package/src/components/BaseDialog/README.md +69 -0
  53. package/src/components/BaseDialog/index.ts +10 -0
  54. package/src/components/BaseExportButton/BaseExportButton.vue +3 -1
  55. package/src/components/BaseSearchForm/BaseSearchForm.types.ts +46 -0
  56. package/src/components/BaseSearchForm/BaseSearchForm.utils.ts +41 -0
  57. package/src/components/BaseSearchForm/BaseSearchForm.vue +267 -0
  58. package/src/components/BaseSearchForm/README.md +66 -0
  59. package/src/components/BaseSearchForm/index.ts +20 -0
  60. package/src/components/BaseTable/BaseTable.types.ts +13 -1
  61. package/src/components/BaseTable/BaseTable.vue +412 -13
  62. package/src/components/BaseTable/README.md +106 -120
  63. package/src/echarts/index.ts +13 -8
  64. package/src/index.ts +4 -0
@@ -0,0 +1,267 @@
1
+ <template>
2
+ <div class="base-search-form">
3
+ <el-form
4
+ class="base-search-form__form"
5
+ :model="innerModel"
6
+ :label-width="normalizedLabelWidth"
7
+ @submit.prevent="submit"
8
+ >
9
+ <div
10
+ class="base-search-form__grid"
11
+ :style="gridStyle"
12
+ >
13
+ <el-form-item
14
+ v-for="field in visibleFields"
15
+ :key="field.key"
16
+ class="base-search-form__item"
17
+ :label="field.label"
18
+ :style="getFieldStyle(field)"
19
+ >
20
+ <slot
21
+ v-if="field.type === 'slot'"
22
+ :name="field.key"
23
+ :field="field"
24
+ :model="innerModel"
25
+ :value="innerModel[field.key]"
26
+ :set-value="(value: unknown) => setFieldValue(field.key, value)"
27
+ />
28
+
29
+ <el-select
30
+ v-else-if="field.type === 'select'"
31
+ class="base-search-form__control"
32
+ :model-value="innerModel[field.key]"
33
+ :placeholder="field.placeholder || field.label"
34
+ :clearable="field.clearable !== false"
35
+ :disabled="field.disabled"
36
+ v-bind="field.props"
37
+ @update:model-value="(value: unknown) => handleFieldChange(field.key, value)"
38
+ >
39
+ <el-option
40
+ v-for="option in field.options || []"
41
+ :key="String(option.value)"
42
+ :label="option.label"
43
+ :value="option.value"
44
+ :disabled="option.disabled"
45
+ />
46
+ </el-select>
47
+
48
+ <el-date-picker
49
+ v-else-if="field.type === 'date' || field.type === 'dateRange'"
50
+ class="base-search-form__control"
51
+ :model-value="innerModel[field.key]"
52
+ :type="field.type === 'dateRange' ? 'daterange' : 'date'"
53
+ :placeholder="field.placeholder || field.label"
54
+ :start-placeholder="field.props?.startPlaceholder as string || '开始日期'"
55
+ :end-placeholder="field.props?.endPlaceholder as string || '结束日期'"
56
+ :clearable="field.clearable !== false"
57
+ :disabled="field.disabled"
58
+ v-bind="field.props"
59
+ @update:model-value="(value: unknown) => handleFieldChange(field.key, value)"
60
+ />
61
+
62
+ <el-input
63
+ v-else
64
+ class="base-search-form__control"
65
+ :model-value="innerModel[field.key]"
66
+ :placeholder="field.placeholder || field.label"
67
+ :clearable="field.clearable !== false"
68
+ :disabled="field.disabled"
69
+ v-bind="field.props"
70
+ @update:model-value="(value: unknown) => handleFieldChange(field.key, value)"
71
+ @keyup.enter="submit"
72
+ />
73
+ </el-form-item>
74
+
75
+ <div class="base-search-form__actions">
76
+ <slot
77
+ name="actions-before"
78
+ :model="innerModel"
79
+ />
80
+ <el-button
81
+ type="primary"
82
+ @click="submit"
83
+ >
84
+ {{ submitText }}
85
+ </el-button>
86
+ <el-button @click="reset">
87
+ {{ resetText }}
88
+ </el-button>
89
+ <el-button
90
+ v-if="showCollapse && hasCollapsedFields"
91
+ link
92
+ type="primary"
93
+ @click="toggleCollapsed"
94
+ >
95
+ {{ isCollapsed ? expandText : collapseText }}
96
+ </el-button>
97
+ <slot
98
+ name="actions-after"
99
+ :model="innerModel"
100
+ />
101
+ </div>
102
+ </div>
103
+ </el-form>
104
+ </div>
105
+ </template>
106
+
107
+ <script setup lang="ts">
108
+ import { computed, ref, watch } from 'vue'
109
+ import type {
110
+ BaseSearchFormExpose,
111
+ BaseSearchFormField,
112
+ BaseSearchFormModel,
113
+ BaseSearchFormProps
114
+ } from './BaseSearchForm.types'
115
+ import {
116
+ cloneSearchFormModel,
117
+ getVisibleSearchFields,
118
+ resetSearchFormModel,
119
+ toSearchFormCssValue
120
+ } from './BaseSearchForm.utils'
121
+
122
+ defineOptions({
123
+ name: 'BaseSearchForm'
124
+ })
125
+
126
+ const props = withDefaults(defineProps<BaseSearchFormProps>(), {
127
+ modelValue: () => ({}),
128
+ collapsed: true,
129
+ showCollapse: true,
130
+ columns: 4,
131
+ labelWidth: 80,
132
+ fieldWidth: undefined,
133
+ gutter: 16,
134
+ submitText: '查询',
135
+ resetText: '重置',
136
+ expandText: '展开',
137
+ collapseText: '收起'
138
+ })
139
+
140
+ const emit = defineEmits<{
141
+ (event: 'update:modelValue', value: BaseSearchFormModel): void
142
+ (event: 'search', value: BaseSearchFormModel): void
143
+ (event: 'reset', value: BaseSearchFormModel): void
144
+ (event: 'field-change', key: string, value: unknown, model: BaseSearchFormModel): void
145
+ }>()
146
+
147
+ const innerModel = ref<BaseSearchFormModel>(cloneSearchFormModel(props.modelValue))
148
+ const isCollapsed = ref(props.collapsed)
149
+
150
+ watch(
151
+ () => props.modelValue,
152
+ (value) => {
153
+ innerModel.value = cloneSearchFormModel(value)
154
+ },
155
+ { deep: true }
156
+ )
157
+
158
+ watch(
159
+ () => props.collapsed,
160
+ (value) => {
161
+ isCollapsed.value = value
162
+ }
163
+ )
164
+
165
+ const visibleFields = computed(() => getVisibleSearchFields(props.fields, isCollapsed.value))
166
+ const hasCollapsedFields = computed(() => props.fields.some((field) => field.collapsed && !field.hidden))
167
+ const normalizedLabelWidth = computed(() => toSearchFormCssValue(props.labelWidth))
168
+
169
+ const gridStyle = computed(() => ({
170
+ gridTemplateColumns: `repeat(${Math.max(1, props.columns)}, minmax(0, 1fr))`,
171
+ gap: `${props.gutter}px`
172
+ }))
173
+
174
+ function getFieldStyle(field: BaseSearchFormField) {
175
+ return {
176
+ gridColumn: field.span ? `span ${Math.max(1, field.span)}` : undefined,
177
+ '--base-search-form-field-width': toSearchFormCssValue(props.fieldWidth)
178
+ }
179
+ }
180
+
181
+ function emitModelUpdate() {
182
+ emit('update:modelValue', cloneSearchFormModel(innerModel.value))
183
+ }
184
+
185
+ function handleFieldChange(key: string, value: unknown) {
186
+ setFieldValue(key, value)
187
+ emit('field-change', key, value, cloneSearchFormModel(innerModel.value))
188
+ }
189
+
190
+ function setFieldValue(key: string, value: unknown) {
191
+ innerModel.value = {
192
+ ...innerModel.value,
193
+ [key]: value
194
+ }
195
+ emitModelUpdate()
196
+ }
197
+
198
+ function submit() {
199
+ emit('search', cloneSearchFormModel(innerModel.value))
200
+ }
201
+
202
+ function reset() {
203
+ innerModel.value = resetSearchFormModel(props.fields)
204
+ emitModelUpdate()
205
+ emit('reset', cloneSearchFormModel(innerModel.value))
206
+ }
207
+
208
+ function toggleCollapsed() {
209
+ isCollapsed.value = !isCollapsed.value
210
+ }
211
+
212
+ function getModel() {
213
+ return cloneSearchFormModel(innerModel.value)
214
+ }
215
+
216
+ defineExpose<BaseSearchFormExpose>({
217
+ submit,
218
+ reset,
219
+ setFieldValue,
220
+ getModel
221
+ })
222
+ </script>
223
+
224
+ <style scoped>
225
+ .base-search-form {
226
+ width: 100%;
227
+ }
228
+
229
+ .base-search-form__grid {
230
+ display: grid;
231
+ align-items: start;
232
+ }
233
+
234
+ .base-search-form__item {
235
+ min-width: 0;
236
+ margin-bottom: 0;
237
+ }
238
+
239
+ .base-search-form__control {
240
+ width: var(--base-search-form-field-width, 100%);
241
+ }
242
+
243
+ .base-search-form__actions {
244
+ display: flex;
245
+ align-items: center;
246
+ justify-content: flex-end;
247
+ gap: 8px;
248
+ min-width: 0;
249
+ }
250
+
251
+ @media (max-width: 960px) {
252
+ .base-search-form__grid {
253
+ grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
254
+ }
255
+ }
256
+
257
+ @media (max-width: 640px) {
258
+ .base-search-form__grid {
259
+ grid-template-columns: minmax(0, 1fr) !important;
260
+ }
261
+
262
+ .base-search-form__actions {
263
+ justify-content: flex-start;
264
+ flex-wrap: wrap;
265
+ }
266
+ }
267
+ </style>
@@ -0,0 +1,66 @@
1
+ # BaseSearchForm
2
+
3
+ `BaseSearchForm` 用于统一列表页查询区,内置输入框、下拉框、日期和日期范围字段,以及查询、重置、展开/收起操作。
4
+
5
+ ## 基础用法
6
+
7
+ ```vue
8
+ <template>
9
+ <BaseSearchForm
10
+ v-model="query"
11
+ :fields="fields"
12
+ @search="loadList"
13
+ @reset="loadList"
14
+ />
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ import { reactive } from 'vue'
19
+ import { BaseSearchForm, type BaseSearchFormField } from '@hbdlzy/ui-core'
20
+
21
+ const query = reactive({})
22
+ const fields: BaseSearchFormField[] = [
23
+ { key: 'keyword', label: '名称', type: 'input' },
24
+ {
25
+ key: 'status',
26
+ label: '状态',
27
+ type: 'select',
28
+ options: [
29
+ { label: '启用', value: 'enabled' },
30
+ { label: '停用', value: 'disabled' }
31
+ ]
32
+ },
33
+ { key: 'createdAt', label: '创建日期', type: 'dateRange', collapsed: true }
34
+ ]
35
+
36
+ function loadList(value: Record<string, unknown>) {
37
+ console.log(value)
38
+ }
39
+ </script>
40
+ ```
41
+
42
+ ## Props
43
+
44
+ - `modelValue`: 查询模型
45
+ - `fields`: 字段配置
46
+ - `collapsed`: 是否默认收起带 `collapsed` 标记的字段
47
+ - `showCollapse`: 是否显示展开/收起按钮
48
+ - `columns`: 每行列数
49
+ - `labelWidth`: 表单 label 宽度
50
+ - `fieldWidth`: 控件宽度
51
+ - `gutter`: 栅格间距
52
+ - `submitText`: 查询按钮文案
53
+ - `resetText`: 重置按钮文案
54
+
55
+ ## Events
56
+
57
+ - `update:modelValue`: 字段值变更
58
+ - `search`: 点击查询或输入框回车
59
+ - `reset`: 点击重置
60
+ - `field-change`: 单个字段变更
61
+
62
+ ## Slots
63
+
64
+ - `[field.key]`: 字段 `type` 为 `slot` 时的自定义字段内容
65
+ - `actions-before`: 操作按钮前扩展
66
+ - `actions-after`: 操作按钮后扩展
@@ -0,0 +1,20 @@
1
+ import BaseSearchForm from './BaseSearchForm.vue'
2
+
3
+ export default BaseSearchForm
4
+
5
+ export {
6
+ cloneSearchFormModel,
7
+ getVisibleSearchFields,
8
+ resetSearchFormModel,
9
+ toSearchFormCssValue
10
+ } from './BaseSearchForm.utils'
11
+ export type {
12
+ BaseSearchFormCssValue,
13
+ BaseSearchFormExpose,
14
+ BaseSearchFormField,
15
+ BaseSearchFormFieldType,
16
+ BaseSearchFormModel,
17
+ BaseSearchFormOption,
18
+ BaseSearchFormOptionValue,
19
+ BaseSearchFormProps
20
+ } from './BaseSearchForm.types'
@@ -4,6 +4,14 @@ export type BaseTableColumnKind = 'text' | 'link' | 'actions' | 'image' | 'tag'
4
4
  export type BaseTableSortOrder = 'ascending' | 'descending' | null
5
5
  export type BaseTableSortDirection = string | null
6
6
 
7
+ export interface BaseTableHeaderSearchConfig {
8
+ paramKey?: string
9
+ placeholder?: string
10
+ width?: BaseTableCssValue
11
+ searchText?: string
12
+ resetText?: string
13
+ }
14
+
7
15
  export interface BaseTableOption {
8
16
  label: string
9
17
  value: string | number | boolean
@@ -31,6 +39,7 @@ export interface BaseTableColumn<Row = Record<string, any>> {
31
39
  fixed?: boolean | 'left' | 'right'
32
40
  sortable?: boolean | 'custom'
33
41
  sortField?: string
42
+ headerSearch?: boolean | BaseTableHeaderSearchConfig
34
43
  showOverflowTooltip?: boolean
35
44
  className?: string
36
45
  headerClassName?: string
@@ -96,7 +105,7 @@ export interface BaseTableNormalizedResult<Row = Record<string, any>> {
96
105
 
97
106
  export type BaseTableRequestHandler<Row = Record<string, any>> = (
98
107
  params: BaseTableRequestParams
99
- ) => Promise<BaseTableRequestResult<Row> | Row[]>
108
+ ) => Promise<BaseTableRequestResult<Row> | Row[] | unknown>
100
109
 
101
110
  export type BaseTableResultAdapter<Row = Record<string, any>> = (
102
111
  result: unknown,
@@ -167,6 +176,9 @@ export interface BaseTableExpose<Row = Record<string, any>> {
167
176
  refresh: () => Promise<void>
168
177
  setData: (data: Row[]) => void
169
178
  resetPage: () => Promise<void>
179
+ setHeaderSearchValue: (key: string, value: string, shouldReload?: boolean) => Promise<void>
180
+ resetHeaderSearch: (key?: string) => Promise<void>
181
+ getHeaderSearchValues: () => Record<string, string>
170
182
  clearSelection: () => void
171
183
  toggleRowSelection: (row: Row, selected?: boolean) => void
172
184
  getSelectionRows: () => Row[]