@ecolovo/uniapp-components 1.0.9 → 2.0.0

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 (117) hide show
  1. package/README.md +83 -51
  2. package/components/aspect/aspect.vue +24 -15
  3. package/components/badge/badge.scss +20 -0
  4. package/components/badge/badge.vue +49 -40
  5. package/components/button/button.scss +15 -0
  6. package/components/button/button.vue +125 -181
  7. package/components/checkbox/checkbox.scss +10 -0
  8. package/components/checkbox/checkbox.vue +118 -146
  9. package/components/checkbox-group/checkbox-group.vue +79 -81
  10. package/components/checkbox-group2/checkbox-group2.vue +111 -107
  11. package/components/checkbox-group2/checkbox2.vue +104 -0
  12. package/components/data-list/data-list.scss +9 -0
  13. package/components/data-list/data-list.vue +70 -79
  14. package/components/date-picker/date-picker-view.vue +125 -124
  15. package/components/date-picker/date-picker.vue +145 -146
  16. package/components/dialog/dialog-content.vue +39 -47
  17. package/components/dialog/dialog.scss +11 -0
  18. package/components/dialog/dialog.vue +125 -138
  19. package/components/dropdown/dropdown.scss +11 -0
  20. package/components/dropdown/dropdown.vue +55 -97
  21. package/components/empty/empty.scss +14 -0
  22. package/components/empty/empty.vue +42 -41
  23. package/components/flex/flex.vue +45 -54
  24. package/components/form/form.vue +29 -24
  25. package/components/form-item/form-item.scss +11 -0
  26. package/components/form-item/form-item.vue +43 -40
  27. package/components/icon/icon.vue +70 -85
  28. package/components/image/image.vue +35 -38
  29. package/components/input/input.vue +65 -79
  30. package/components/input/password-input.vue +34 -42
  31. package/components/list-page/list-page.vue +73 -99
  32. package/components/load-more/load-more.scss +12 -0
  33. package/components/load-more/load-more.vue +29 -29
  34. package/components/loading/animations/loading-animation1.vue +8 -8
  35. package/components/loading/animations/loading-animation2.vue +8 -9
  36. package/components/loading/animations/loading-animation3.vue +11 -11
  37. package/components/loading/animations/loading-animation4.vue +8 -8
  38. package/components/loading/loading.vue +19 -20
  39. package/components/message-box/message-box.vue +59 -41
  40. package/components/number-dialog/number-dialog.scss +9 -0
  41. package/components/number-dialog/number-dialog.vue +209 -204
  42. package/components/number-input/number-input.scss +9 -0
  43. package/components/number-input/number-input.vue +233 -232
  44. package/components/numpad/numpad.scss +9 -0
  45. package/components/numpad/numpad.vue +133 -150
  46. package/components/page/page-body.scss +15 -0
  47. package/components/page/page-body.vue +137 -119
  48. package/components/page/page-footer.scss +13 -0
  49. package/components/page/page-footer.vue +31 -33
  50. package/components/page/page-header.scss +17 -0
  51. package/components/page/page-header.vue +89 -94
  52. package/components/page/page.scss +9 -0
  53. package/components/page/page.vue +105 -81
  54. package/components/picker/picker-popup.vue +218 -209
  55. package/components/picker/picker.vue +99 -104
  56. package/components/popover/popover-content.vue +54 -63
  57. package/components/popover/popover-mask.vue +63 -63
  58. package/components/popover/popover.scss +28 -0
  59. package/components/popover/popover.vue +49 -47
  60. package/components/popup/popup-content.vue +49 -53
  61. package/components/popup/popup.scss +11 -0
  62. package/components/popup/popup.vue +117 -132
  63. package/components/price/price.scss +20 -0
  64. package/components/price/price.vue +31 -42
  65. package/components/search/search.scss +12 -0
  66. package/components/search/search.vue +93 -117
  67. package/components/searching/searching.vue +33 -40
  68. package/components/selector/selector.vue +43 -48
  69. package/components/switch/switch.scss +12 -0
  70. package/components/switch/switch.vue +99 -96
  71. package/components/tab/tab.scss +19 -0
  72. package/components/tab/tab.vue +151 -145
  73. package/components/textarea/textarea.vue +104 -101
  74. package/composable/component-name.ts +10 -0
  75. package/configs/index.ts +82 -0
  76. package/{easyCom.js → easyCom.ts} +1 -1
  77. package/index.ts +1 -0
  78. package/init.ts +34 -0
  79. package/package.json +12 -4
  80. package/styles/utils/css-var.scss +12 -15
  81. package/styles/utils/ellipsis.scss +0 -7
  82. package/styles/utils/z-index.scss +1 -1
  83. package/styles/var/component.scss +21 -245
  84. package/utils/{date.js → date.ts} +44 -42
  85. package/utils/freezeDeep.ts +9 -0
  86. package/utils/price.ts +57 -0
  87. package/utils/round.ts +11 -0
  88. package/utils/{windowInfo.js → windowInfo.ts} +12 -35
  89. package/components/checkbox-group2/checkbox.vue +0 -109
  90. package/components/datetime-picker/datetime-picker-view.vue +0 -209
  91. package/components/datetime-picker/datetime-picker.vue +0 -235
  92. package/components/form/mixin.js +0 -13
  93. package/components/list-page/list-page.js +0 -10
  94. package/components/table/table.vue +0 -112
  95. package/components/time-picker/time-picker-view.vue +0 -127
  96. package/components/time-picker/time-picker.vue +0 -140
  97. package/components/uploader/download.js +0 -81
  98. package/components/uploader/file-uploader.vue +0 -52
  99. package/components/uploader/files.js +0 -225
  100. package/components/uploader/media-uploader.vue +0 -179
  101. package/components/uploader/mixin.js +0 -171
  102. package/components/uploader/uni.js +0 -38
  103. package/components/uploader/upload-button.vue +0 -29
  104. package/components/uploader/uploader copy.vue +0 -547
  105. package/components/uploader/uploader.vue +0 -117
  106. package/configs/index.d.ts +0 -22
  107. package/configs/index.js +0 -68
  108. package/init.d.ts +0 -19
  109. package/init.js +0 -20
  110. package/mixins/componentName.js +0 -32
  111. package/mixins/listPage.js +0 -1
  112. package/mixins/windowInfo.js +0 -1
  113. package/utils/fileSize.js +0 -39
  114. package/utils/floor.js +0 -20
  115. package/utils/freezeDeep.js +0 -19
  116. package/utils/price.js +0 -32
  117. package/utils/round.js +0 -22
@@ -1,7 +1,7 @@
1
1
  <template>
2
- <view :class="componentClassNames">
2
+ <view :class="[...classNames, $style['DatePicker']]">
3
3
  <selector-cpn
4
- :value="showText"
4
+ :model-value="showText"
5
5
  :readonly="isReadonly"
6
6
  :disabled="disabled"
7
7
  :placeholder="placeholder"
@@ -13,11 +13,11 @@
13
13
  <!-- 选择器弹框 -->
14
14
  <popup-cpn
15
15
  v-if="isShowPopup"
16
- ref="popup"
16
+ ref="popupRef"
17
17
  v-model="isShowPopup"
18
18
  :cancel="false"
19
19
  title="选择日期"
20
- @click.native.stop.prevent="doNothing"
20
+ @click.stop.prevent="doNothing"
21
21
  @confirm="onConfirm"
22
22
  >
23
23
  <view v-if="range" :class="$style['DatePicker--date-selector']">
@@ -52,161 +52,160 @@
52
52
  </view>
53
53
  </template>
54
54
 
55
- <script>
56
- import componentName from '../../mixins/componentName';
57
- import { isFormReadonly } from '../form/mixin';
55
+ <script lang="ts" setup>
56
+ import { computed, inject, ref } from 'vue';
57
+ import useClassNames from '../../composable/component-name';
58
58
  import { formatDate, toDate } from '../../utils/date';
59
59
  import PopupCpn from '../popup/popup.vue';
60
60
  import SelectorCpn from '../selector/selector.vue';
61
61
  import DatePickerViewCpn from './date-picker-view.vue';
62
62
 
63
- export default {
64
- name: 'DatePicker',
63
+ defineOptions({
65
64
  options: {
66
65
  virtualHost: true,
67
66
  styleIsolation: 'shared',
68
67
  },
69
- components: { PopupCpn, SelectorCpn, DatePickerViewCpn },
70
- mixins: [componentName, isFormReadonly],
71
- props: {
72
- /** 绑定值 */
73
- value: {
74
- type: [String, null, Array],
75
- default: null,
76
- },
77
- /** 是否禁用 */
78
- disabled: {
79
- type: Boolean,
80
- default: false,
81
- },
82
- /** 是否只读 */
83
- readonly: {
84
- type: Boolean,
85
- default: false,
86
- },
87
- /** 占位文本 */
88
- placeholder: {
89
- type: String,
90
- default: '请选择',
91
- },
92
- /** 是选择日期范围 */
93
- range: {
94
- type: Boolean,
95
- default: false,
96
- },
97
- /** 是否在选择开始日期时,同步修改结束日期,且保持时间差 */
98
- keepDiff: {
99
- type: Boolean,
100
- default: false,
101
- },
102
- /** 结束日期是否可以与开始日期相同 */
103
- canSame: {
104
- type: Boolean,
105
- default: true,
106
- },
107
- /** 在选择的日期后面拼接时间字符串,如果传入的是数组,会分别对应添加到范围日期值后 */
108
- timeAppend: {
109
- type: [String, Array],
110
- default: '',
111
- },
112
- /** 最小日期 */
113
- min: {
114
- type: String,
115
- default: '',
116
- },
117
- /** 最大日期 */
118
- max: {
119
- type: String,
120
- default: '',
121
- },
122
- },
123
- data() {
124
- return {
125
- /** 选择框是否可见 */
126
- isShowPopup: false,
127
- /** 开始日期 */
128
- startStr: '',
129
- /** 结束日期 */
130
- endStr: '',
131
- /** 当前选中的日期类型 */
132
- checkedDateType: 'start',
133
- };
134
- },
135
- computed: {
136
- isReadonly() {
137
- return this.readonly || this.isFormReadonly;
138
- },
139
- startDate() {
140
- return formatDate(toDate(this.range && Array.isArray(this.value) ? this.value[0] : this.value));
141
- },
142
- endDate() {
143
- return formatDate(toDate(this.range && Array.isArray(this.value) ? this.value[1] : ''));
144
- },
145
- showText() {
146
- return this.range && this.startDate && this.endDate
147
- ? `${this.startDate} 至 ${this.endDate}`
148
- : this.startDate;
149
- },
150
- },
151
- methods: {
152
- doNothing() {},
153
- /** 显示选择器弹出框 */
154
- showPicker() {
155
- if (this.disabled || this.isReadonly) {
156
- return;
157
- }
158
-
159
- this.checkedDateType = 'start';
160
-
161
- let [start, end] = [this.startDate, this.endDate];
162
- this.startStr = start || formatDate(new Date());
163
- this.endStr = end || formatDate(new Date(Date.now() + (this.canSame ? 0 : 8.64e7)));
164
-
165
- this.isShowPopup = true;
166
- this.$emit('show');
167
- },
168
- /** 选中日期类型 */
169
- selectDateType(type) {
170
- if (this.checkedDateType !== type) this.checkedDateType = type;
171
- },
172
- onChangeStart(dateStr) {
173
- if (!this.range) return;
174
-
175
- const timeDiff = toDate(this.endStr).getTime() - toDate(dateStr).getTime();
176
- if (this.endStr <= dateStr || this.keepDiff) {
177
- if (this.keepDiff) {
178
- this.endStr = formatDate(new Date(toDate(dateStr).getTime() + timeDiff));
179
- } else if (!this.canSame) {
180
- this.endStr = formatDate(new Date(toDate(dateStr).getTime() + 8.64e7));
181
- } else {
182
- this.endStr = dateStr;
183
- }
184
- }
185
- },
186
- onChangeEnd(dateStr) {
187
- if (dateStr <= this.startStr) {
188
- if (this.canSame) {
189
- this.endStr = this.startStr;
190
- } else {
191
- this.endStr = formatDate(new Date(toDate(this.startStr).getTime() + 8.64e7));
192
- }
193
- }
194
- },
195
- onConfirm() {
196
- this.$refs.popup.close();
197
- const startAppend = Array.isArray(this.timeAppend) ? this.timeAppend[0] : this.timeAppend;
198
- const endAppend = Array.isArray(this.timeAppend) ? this.timeAppend[1] : this.timeAppend;
199
- const start = startAppend ? `${this.startStr} ${startAppend}` : this.startStr;
200
- const end = endAppend ? `${this.endStr} ${endAppend}` : this.endStr;
201
- this.$emit('input', this.range ? [start, end] : start);
202
- this.$emit('change', this.range ? [start, end] : start);
203
- },
204
- },
68
+ });
69
+
70
+ const classNames = useClassNames('date-picker');
71
+
72
+ type _Props = {
73
+ /** 绑定值 */
74
+ modelValue?: string | null | [string, string];
75
+ /** 是否禁用 */
76
+ disabled?: boolean;
77
+ /** 是否只读 */
78
+ readonly?: boolean;
79
+ /** 占位文本 */
80
+ placeholder?: string;
81
+ /** 是选择日期范围 */
82
+ range?: boolean;
83
+ /** 是否在选择开始日期时,同步修改结束日期,且保持时间差 */
84
+ keepDiff?: boolean;
85
+ /** 结束日期是否可以与开始日期相同 */
86
+ canSame?: boolean;
87
+ /** 在选择的日期后面拼接时间字符串,如果传入的是数组,会分别对应添加到范围日期值后 */
88
+ timeAppend?: string | string[];
89
+ /** 最小日期 */
90
+ min?: string;
91
+ /** 最大日期 */
92
+ max?: string;
93
+ };
94
+
95
+ const props = withDefaults(defineProps<_Props>(), {
96
+ modelValue: null,
97
+ disabled: false,
98
+ readonly: false,
99
+ placeholder: '请选择',
100
+ range: false,
101
+ keepDiff: false,
102
+ canSame: true,
103
+ timeAppend: '',
104
+ min: '',
105
+ max: '',
106
+ });
107
+
108
+ const emit = defineEmits<{
109
+ (e: 'update:modelValue', val: string | null | [string, string]): void;
110
+ (e: 'change', val: string | null | [string, string]): void;
111
+ (e: 'show'): void;
112
+ }>();
113
+
114
+ /** 表单是否只读 */
115
+ const isFormReadonly = inject(
116
+ 'ecolovo/form/readonly',
117
+ computed(() => false)
118
+ );
119
+
120
+ /** 选择框是否可见 */
121
+ const isShowPopup = ref(false);
122
+ /** 开始日期 */
123
+ const startStr = ref('');
124
+ /** 结束日期 */
125
+ const endStr = ref('');
126
+ /** 当前选中的日期类型 */
127
+ const checkedDateType = ref<'start' | 'end'>('start');
128
+
129
+ const popupRef = ref<InstanceType<typeof PopupCpn>>();
130
+
131
+ const isReadonly = computed(() => props.readonly || isFormReadonly.value);
132
+
133
+ const startDate = computed(() => {
134
+ return formatDate(
135
+ toDate(props.range && Array.isArray(props.modelValue) ? props.modelValue[0] : (props.modelValue as string))
136
+ );
137
+ });
138
+
139
+ const endDate = computed(() => {
140
+ return formatDate(toDate(props.range && Array.isArray(props.modelValue) ? props.modelValue[1] : ''));
141
+ });
142
+
143
+ const showText = computed(() => {
144
+ return props.range && startDate.value && endDate.value ? `${startDate.value} 至 ${endDate.value}` : startDate.value;
145
+ });
146
+
147
+ const doNothing = () => {};
148
+
149
+ /** 显示选择器弹出框 */
150
+ const showPicker = () => {
151
+ if (props.disabled || isReadonly.value) {
152
+ return;
153
+ }
154
+
155
+ checkedDateType.value = 'start';
156
+
157
+ const [start, end] = [startDate.value, endDate.value];
158
+ startStr.value = start || formatDate(new Date());
159
+ endStr.value = end || formatDate(new Date(Date.now() + (props.canSame ? 0 : 8.64e7)));
160
+
161
+ isShowPopup.value = true;
162
+ emit('show');
163
+ };
164
+
165
+ /** 选中日期类型 */
166
+ const selectDateType = (type: 'start' | 'end') => {
167
+ if (checkedDateType.value !== type) checkedDateType.value = type;
168
+ };
169
+
170
+ const onChangeStart = (dateStr: string) => {
171
+ if (!props.range) return;
172
+
173
+ const timeDiff = toDate(endStr.value)!.getTime() - toDate(dateStr)!.getTime();
174
+ if (endStr.value <= dateStr || props.keepDiff) {
175
+ if (props.keepDiff) {
176
+ endStr.value = formatDate(new Date(toDate(dateStr)!.getTime() + timeDiff));
177
+ } else if (!props.canSame) {
178
+ endStr.value = formatDate(new Date(toDate(dateStr)!.getTime() + 8.64e7));
179
+ } else {
180
+ endStr.value = dateStr;
181
+ }
182
+ }
183
+ };
184
+
185
+ const onChangeEnd = (dateStr: string) => {
186
+ if (dateStr <= startStr.value) {
187
+ if (props.canSame) {
188
+ endStr.value = startStr.value;
189
+ } else {
190
+ endStr.value = formatDate(new Date(toDate(startStr.value)!.getTime() + 8.64e7));
191
+ }
192
+ }
193
+ };
194
+
195
+ const onConfirm = () => {
196
+ popupRef.value?.close();
197
+ const startAppend = Array.isArray(props.timeAppend) ? props.timeAppend[0] : props.timeAppend;
198
+ const endAppend = Array.isArray(props.timeAppend) ? props.timeAppend[1] : props.timeAppend;
199
+ const start = startAppend ? `${startStr.value} ${startAppend}` : startStr.value;
200
+ const end = endAppend ? `${endStr.value} ${endAppend}` : endStr.value;
201
+ const result = props.range ? ([start, end] as [string, string]) : start;
202
+ emit('update:modelValue', result);
203
+ emit('change', result);
205
204
  };
206
205
  </script>
207
206
 
208
207
  <style lang="scss" module>
209
- @use '../../styles/index' as *;
208
+ @use '../../styles/utils' as *;
210
209
 
211
210
  .DatePicker {
212
211
  width: 100%;
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <view :class="componentClassNames">
2
+ <view :class="[...classNames, $style['DialogContent']]">
3
3
  <popover-content-cpn position="center" :loading="loading">
4
4
  <!-- 内容上方标题 -->
5
5
  <template #header>
@@ -48,67 +48,59 @@
48
48
  </view>
49
49
  </template>
50
50
 
51
- <script>
52
- import componentName from '../../mixins/componentName';
51
+ <script lang="ts" setup>
52
+ import useClassNames from '../../composable/component-name';
53
53
  import ButtonCpn from '../button/button.vue';
54
54
  import IconCpn from '../icon/icon.vue';
55
55
  import PopoverContentCpn from '../popover/popover-content.vue';
56
56
 
57
- export default {
58
- name: 'DialogContent',
57
+ defineOptions({
59
58
  options: {
60
59
  virtualHost: true,
61
60
  styleIsolation: 'shared',
62
61
  },
63
- components: { ButtonCpn, IconCpn, PopoverContentCpn },
64
- mixins: [componentName],
65
- props: {
66
- /** 是否显示 loading 动画 */
67
- loading: {
68
- type: Boolean,
69
- default: false,
70
- },
71
- /** 标题 */
72
- title: {
73
- type: String,
74
- default: '',
75
- },
76
- /** 是否居中标题 */
77
- centerTitle: {
78
- type: Boolean,
79
- default: false,
80
- },
81
- /** 是否显示关闭按钮 */
82
- showClose: {
83
- type: Boolean,
84
- default: false,
85
- },
86
- /** 取消按钮文本,为 falsy 时( false 或 '' )不显示 */
87
- cancel: {
88
- type: [String, Boolean],
89
- default: '取消',
90
- },
91
- /** 确认按钮文本,为 falsy 时( false 或 '' )不显示 */
92
- confirm: {
93
- type: [String, Boolean],
94
- default: '确认',
95
- },
96
- },
62
+ });
63
+
64
+ const classNames = useClassNames('dialog-content');
65
+
66
+ type _Props = {
67
+ /** 是否显示 loading 动画 */
68
+ loading?: boolean;
69
+ /** 标题 */
70
+ title?: string;
71
+ /** 是否居中标题 */
72
+ centerTitle?: boolean;
73
+ /** 是否显示关闭按钮 */
74
+ showClose?: boolean;
75
+ /** 取消按钮文本,为 falsy 时( false 或 '' )不显示 */
76
+ cancel?: string | boolean;
77
+ /** 确认按钮文本,为 falsy 时( false 或 '' )不显示 */
78
+ confirm?: string | boolean;
97
79
  };
80
+
81
+ withDefaults(defineProps<_Props>(), {
82
+ loading: false,
83
+ title: '',
84
+ centerTitle: false,
85
+ showClose: false,
86
+ cancel: '取消',
87
+ confirm: '确认',
88
+ });
89
+
90
+ defineEmits<{
91
+ (e: 'close'): void;
92
+ (e: 'cancel'): void;
93
+ (e: 'confirm'): void;
94
+ }>();
98
95
  </script>
99
96
 
100
97
  <style lang="scss" module>
101
- @use '../../styles/index' as *;
98
+ @use '../../styles/utils' as *;
99
+ @use './dialog' as *;
102
100
 
103
101
  // 定义外部变量
104
- $component-name: 'dialog';
105
- $component-vars: $dialog;
106
102
  %external-vars {
107
- @include UTILS__DEFINE_COMPONENT_VARS();
108
- }
109
-
110
- :host {
111
- display: block;
103
+ @include UTILS__DEFINE_COMPONENT_VARS($dialog, 'dialog');
112
104
  }
113
105
 
114
106
  .DialogContent {
@@ -0,0 +1,11 @@
1
+ @use 'sass:map';
2
+
3
+ // 可配置的变量
4
+ $dialog: () !default;
5
+ $dialog-default: (
6
+ // 标题栏高度
7
+ header-height: 100rpx,
8
+ // 操作栏高度
9
+ footer-height: 134rpx
10
+ );
11
+ $dialog: map.merge($dialog-default, $dialog);