gi-component 0.0.1

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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +36 -0
  3. package/dist/dist/index.es.js +2241 -0
  4. package/dist/dist/index.es.js.map +1 -0
  5. package/dist/dist/index.umd.js +2 -0
  6. package/dist/dist/index.umd.js.map +1 -0
  7. package/dist/gi.css +1 -0
  8. package/dist/index.d.ts +1 -0
  9. package/package.json +56 -0
  10. package/packages/components/button/index.ts +5 -0
  11. package/packages/components/button/src/button.vue +59 -0
  12. package/packages/components/button/src/type.ts +15 -0
  13. package/packages/components/card/index.ts +5 -0
  14. package/packages/components/card/src/card.vue +166 -0
  15. package/packages/components/card/src/type.ts +12 -0
  16. package/packages/components/dialog/index.ts +6 -0
  17. package/packages/components/dialog/src/dialog.ts +87 -0
  18. package/packages/components/dialog/src/dialog.vue +122 -0
  19. package/packages/components/dialog/src/type.ts +16 -0
  20. package/packages/components/edit-table/index.ts +5 -0
  21. package/packages/components/edit-table/src/edit-table.vue +207 -0
  22. package/packages/components/edit-table/src/type.ts +69 -0
  23. package/packages/components/form/index.ts +5 -0
  24. package/packages/components/form/src/form.vue +465 -0
  25. package/packages/components/form/src/type.ts +98 -0
  26. package/packages/components/grid/index.ts +8 -0
  27. package/packages/components/grid/src/context.ts +30 -0
  28. package/packages/components/grid/src/grid-item.vue +143 -0
  29. package/packages/components/grid/src/grid.vue +151 -0
  30. package/packages/components/grid/src/hook/use-index.ts +63 -0
  31. package/packages/components/grid/src/hook/use-responsive-state.ts +66 -0
  32. package/packages/components/grid/src/hook/use-responsive-value.ts +36 -0
  33. package/packages/components/grid/src/interface.ts +74 -0
  34. package/packages/components/grid/src/type.ts +0 -0
  35. package/packages/components/grid/src/utils/global-config.ts +6 -0
  36. package/packages/components/grid/src/utils/index.ts +73 -0
  37. package/packages/components/grid/src/utils/is.ts +9 -0
  38. package/packages/components/grid/src/utils/responsive-observe.ts +135 -0
  39. package/packages/components/input-group/index.ts +5 -0
  40. package/packages/components/input-group/src/input-group.vue +92 -0
  41. package/packages/components/input-group/src/type.ts +1 -0
  42. package/packages/components/input-search/index.ts +5 -0
  43. package/packages/components/input-search/src/input-search.vue +62 -0
  44. package/packages/components/input-search/src/type.ts +6 -0
  45. package/packages/components/page-layout/index.ts +5 -0
  46. package/packages/components/page-layout/src/page-layout.vue +180 -0
  47. package/packages/components/page-layout/src/split-button.vue +106 -0
  48. package/packages/components/page-layout/src/type.ts +12 -0
  49. package/packages/components/table/index.ts +5 -0
  50. package/packages/components/table/src/TableColumn.vue +49 -0
  51. package/packages/components/table/src/table.vue +85 -0
  52. package/packages/components/table/src/type.ts +22 -0
  53. package/packages/components/tabs/index.ts +5 -0
  54. package/packages/components/tabs/src/tabs.vue +148 -0
  55. package/packages/components/tabs/src/type.ts +15 -0
  56. package/packages/components.d.ts +26 -0
  57. package/packages/hooks/index.ts +1 -0
  58. package/packages/hooks/useBemClass.ts +11 -0
  59. package/packages/index.ts +78 -0
  60. package/packages/styles/index.scss +176 -0
  61. package/packages/styles/var.scss +1 -0
  62. package/packages/utils/createSelectDialog.ts +67 -0
  63. package/packages/utils/index.ts +1 -0
@@ -0,0 +1,207 @@
1
+ <template>
2
+ <el-form ref="formRef" :model="form" :class="b('edit-table')">
3
+ <el-table :data="form.tableData" border v-bind="attrs">
4
+ <el-table-column
5
+ v-for="(column, index) in props.columns"
6
+ :key="column.dataIndex + index"
7
+ :width="column.width"
8
+ v-bind="column.columnProps"
9
+ :prop="column.dataIndex"
10
+ :label="column.title"
11
+ :label-class-name="getLabelClassName(column)"
12
+ >
13
+ <template #default="scope">
14
+ <el-form-item
15
+ v-bind="column.formItemProps"
16
+ :label="column.title"
17
+ :prop="`tableData[${scope.$index}].${column.dataIndex}`"
18
+ :rules="getFormItemRules(column)"
19
+ >
20
+ <template v-if="column.slotName">
21
+ <slot :name="column.slotName" v-bind="scope"></slot>
22
+ </template>
23
+ <component
24
+ :is="COMP_MAP[column.type] || column.type"
25
+ v-else
26
+ v-bind="getComponentBindProps(column)"
27
+ v-model="scope.row[column.dataIndex]"
28
+ class="w-full"
29
+ :disabled="isDisabled(scope)"
30
+ >
31
+ </component>
32
+ </el-form-item>
33
+ </template>
34
+ </el-table-column>
35
+ </el-table>
36
+ </el-form>
37
+ </template>
38
+
39
+ <script lang="ts" setup>
40
+ import type { FormInstance } from 'element-plus';
41
+ import type { EditTableColumnItem, EditTableColumnItemType } from './type';
42
+ import type { EditTableProps } from './type.ts';
43
+ import * as El from 'element-plus';
44
+ import { computed, h, reactive, ref, toRaw, useAttrs, watch } from 'vue';
45
+ import { useBemClass } from '../../../hooks';
46
+
47
+ const props = withDefaults(defineProps<EditTableProps>(), {
48
+ rowKey: 'id',
49
+ data: () => [],
50
+ columns: () => []
51
+ });
52
+
53
+ const attrs = useAttrs();
54
+ const { b } = useBemClass();
55
+
56
+ const COMP_MAP: Record<Exclude<EditTableColumnItemType, 'slot'>, any> = {
57
+ input: El.ElInput,
58
+ textarea: El.ElInput,
59
+ 'input-number': El.ElInputNumber,
60
+ 'input-tag': El.ElInputTag,
61
+ select: El.ElSelect,
62
+ 'select-v2': El.ElSelectV2,
63
+ 'tree-select': El.ElTreeSelect,
64
+ cascader: El.ElCascader,
65
+ slider: El.ElSlider,
66
+ switch: El.ElSwitch,
67
+ rate: El.ElRate,
68
+ 'checkbox-group': El.ElCheckboxGroup,
69
+ checkbox: El.ElCheckbox,
70
+ 'radio-group': El.ElRadioGroup,
71
+ radio: El.ElRadio,
72
+ 'date-picker': El.ElDatePicker,
73
+ 'time-picker': El.ElTimePicker,
74
+ 'time-select': El.ElTimeSelect,
75
+ 'color-picker': El.ElColorPicker,
76
+ transfer: El.ElTransfer,
77
+ autocomplete: El.ElAutocomplete,
78
+ upload: El.ElUpload
79
+ };
80
+
81
+ const formRef = ref<FormInstance | null>();
82
+
83
+ /** 表单数据 */
84
+ const form = computed(() => ({ tableData: props.data }));
85
+
86
+ const clearable = false;
87
+ /** 组件静态配置 */
88
+ const STATIC_PROPS = new Map([
89
+ ['input', { clearable, maxlength: 20 }],
90
+ [
91
+ 'textarea',
92
+ {
93
+ clearable,
94
+ type: 'textarea',
95
+ rows: 1,
96
+ maxlength: 200,
97
+ showWordLimit: true
98
+ }
99
+ ],
100
+ ['input-number', {}],
101
+ ['input-tag', { clearable }],
102
+ ['select', { clearable }],
103
+ ['select-v2', { clearable }],
104
+ ['tree-select', { clearable }],
105
+ ['cascader', { clearable }],
106
+ ['slider', {}],
107
+ ['switch', {}],
108
+ ['rate', {}],
109
+ ['checkbox-group', {}],
110
+ ['checkbox', {}],
111
+ ['radio-group', {}],
112
+ ['radio', {}],
113
+ ['date-picker', { clearable }],
114
+ ['time-picker', { clearable }],
115
+ ['time-select', { clearable }],
116
+ ['color-picker', {}],
117
+ ['transfer', {}],
118
+ ['autocomplete', {}],
119
+ ['upload', {}],
120
+ ['title', {}]
121
+ ]);
122
+
123
+ /** 获取占位文本 */
124
+ const getPlaceholder = (item: EditTableColumnItem) => {
125
+ if (!item.type) return undefined;
126
+ if (['input', 'input-number', 'input-tag'].includes(item.type)) {
127
+ return `请输入${item.title}`;
128
+ }
129
+ if (['textarea'].includes(item.type)) {
130
+ return `请填写${item.title}`;
131
+ }
132
+ if (
133
+ ['select', 'select-v2', 'tree-select', 'cascader', 'time-select'].includes(
134
+ item.type
135
+ )
136
+ ) {
137
+ return `请选择${item.title}`;
138
+ }
139
+ if (['date-picker'].includes(item.type)) {
140
+ return `请选择日期`;
141
+ }
142
+ if (['time-picker'].includes(item.type)) {
143
+ return `请选择时间`;
144
+ }
145
+ return undefined;
146
+ };
147
+
148
+ // 组件的默认props配置
149
+ function getComponentBindProps(item: EditTableColumnItem) {
150
+ // 获取默认配置
151
+ const defaultProps: any = STATIC_PROPS.get(item.type || '') || {};
152
+ defaultProps.placeholder = getPlaceholder(item);
153
+ if (item.type === 'date-picker') {
154
+ defaultProps.valueFormat =
155
+ item?.props?.type === 'datetime' ? 'YYYY-MM-DD HH:mm:ss' : 'YYYY-MM-DD';
156
+ }
157
+ // 合并默认配置和自定义配置
158
+ return { ...defaultProps, ...item.props };
159
+ }
160
+
161
+ /** 表单项校验规则 */
162
+ function getFormItemRules(item: EditTableColumnItem) {
163
+ if (item.required) {
164
+ return [
165
+ { required: true, message: `${item.title}为必填项` },
166
+ ...(Array.isArray(item.rules) ? item.rules : [])
167
+ ];
168
+ }
169
+ return item.rules;
170
+ }
171
+
172
+ /** 表头标题样式 */
173
+ function getLabelClassName(item: EditTableColumnItem) {
174
+ if (item.required) return 'column-required';
175
+ return '';
176
+ }
177
+
178
+ /** 判断是否禁用 */
179
+ const isDisabled = (p: any) => {
180
+ if (typeof props?.cellDisabled === 'function') return props.cellDisabled(p);
181
+ return false;
182
+ };
183
+
184
+ defineExpose({ formRef });
185
+ </script>
186
+
187
+ <style lang="scss" scoped>
188
+ :deep(.el-form-item) {
189
+ margin-bottom: 0;
190
+
191
+ .el-form-item__label {
192
+ display: none;
193
+ }
194
+ }
195
+
196
+ :deep(.column-required) {
197
+ .cell {
198
+ position: relative;
199
+
200
+ &::after {
201
+ content: '*';
202
+ color: red;
203
+ margin-left: 2px;
204
+ }
205
+ }
206
+ }
207
+ </style>
@@ -0,0 +1,69 @@
1
+ import type * as El from 'element-plus';
2
+
3
+ export type EditTableColumnItemType =
4
+ | 'input'
5
+ | 'textarea'
6
+ | 'input-number'
7
+ | 'input-tag'
8
+ | 'select'
9
+ | 'select-v2'
10
+ | 'tree-select'
11
+ | 'cascader'
12
+ | 'slider'
13
+ | 'switch'
14
+ | 'rate'
15
+ | 'checkbox-group'
16
+ | 'checkbox'
17
+ | 'radio-group'
18
+ | 'radio'
19
+ | 'date-picker'
20
+ | 'time-picker'
21
+ | 'time-select'
22
+ | 'color-picker'
23
+ | 'transfer'
24
+ | 'autocomplete'
25
+ | 'upload'
26
+ | 'slot'
27
+ | 'cecw-input-search';
28
+
29
+ export interface EditTableColumnItem {
30
+ type?: EditTableColumnItemType;
31
+ title: string;
32
+ dataIndex: string;
33
+ width?: number | string;
34
+ required?: boolean;
35
+ rules?: El.FormItemRule[]; // 表单校验规则
36
+ props?: ColumnItemProps;
37
+ columnProps?: El.TableColumnInstance['$props'];
38
+ formItemProps?: El.FormItemProps;
39
+ slotName?: string;
40
+ }
41
+
42
+ export type ColumnItemProps = El.InputProps &
43
+ El.InputNumberProps &
44
+ El.InputTagProps &
45
+ El.ISelectProps &
46
+ El.ISelectV2Props &
47
+ El.TreeInstance['$props'] &
48
+ El.CascaderProps &
49
+ El.SliderProps &
50
+ El.SwitchProps &
51
+ El.RateProps &
52
+ El.CheckboxGroupProps &
53
+ El.CheckboxProps &
54
+ El.RadioGroupProps &
55
+ El.RadioProps &
56
+ El.DatePickerProps &
57
+ El.TimePickerDefaultProps &
58
+ El.TimeSelectProps &
59
+ El.ColorPickerProps &
60
+ El.TransferProps &
61
+ El.AutocompleteProps &
62
+ El.UploadProps;
63
+
64
+ export interface EditTableProps {
65
+ rowKey?: string;
66
+ data?: any[];
67
+ columns?: EditTableColumnItem[];
68
+ cellDisabled?: any;
69
+ }
@@ -0,0 +1,5 @@
1
+ import Form from './src/form.vue';
2
+
3
+ export type FormInstance = InstanceType<typeof Form>;
4
+ export * from './src/type';
5
+ export default Form;