widget.qw 1.0.24 → 1.0.26

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 (102) hide show
  1. package/.env.development +9 -9
  2. package/.env.production +8 -8
  3. package/README.md +73 -73
  4. package/build/style.css +468 -482
  5. package/build/widget.qw.es.js +1637 -2379
  6. package/build/widget.qw.umd.js +1550 -2292
  7. package/index.html +17 -17
  8. package/package.json +47 -47
  9. package/src/App.vue +26 -26
  10. package/src/api/index.js +149 -141
  11. package/src/components/AuditBar.vue +340 -340
  12. package/src/components/BillCard.vue +155 -155
  13. package/src/components/CascaderPicker.vue +87 -87
  14. package/src/components/CascaderPop.vue +324 -330
  15. package/src/components/CheckGroup.vue +113 -113
  16. package/src/components/DatetimePicker/DatetimePop.vue +342 -342
  17. package/src/components/DatetimePicker/index.vue +112 -112
  18. package/src/components/DayDropdown.vue +56 -56
  19. package/src/components/FilePicker.vue +113 -113
  20. package/src/components/Input.vue +71 -71
  21. package/src/components/MonthDropdown.vue +51 -51
  22. package/src/components/MultiPicker.vue +123 -123
  23. package/src/components/SecretNotify.js +5 -5
  24. package/src/components/Sheet.vue +92 -92
  25. package/src/components/SingleApiPicker.vue +112 -112
  26. package/src/components/SinglePicker.vue +102 -102
  27. package/src/components/SingleUserSelector.vue +425 -425
  28. package/src/components/Switch.vue +64 -64
  29. package/src/components/TreePicker.vue +113 -113
  30. package/src/components/UserPicker.vue +106 -106
  31. package/src/components/UserProfile.vue +129 -131
  32. package/src/components/UsersPicker.vue +118 -118
  33. package/src/components/YearDropdown.vue +59 -59
  34. package/src/components/data_selector.vue +280 -280
  35. package/src/components/image_picker.vue +114 -114
  36. package/src/components/images_picker.vue +139 -139
  37. package/src/components/index.js +157 -157
  38. package/src/components/mult_list_selector.vue +155 -155
  39. package/src/components/subdepartment_selector.vue +481 -481
  40. package/src/components/user_selector.vue +639 -639
  41. package/src/components/widget/DataPop.vue +95 -95
  42. package/src/components/widget/TreePop.vue +88 -88
  43. package/src/components/widget/UserPop.vue +347 -347
  44. package/src/main.js +117 -117
  45. package/src/router/index.ts +168 -168
  46. package/src/util/array_util.js +32 -32
  47. package/src/util/auth_util.js +72 -72
  48. package/src/util/bool_util.js +5 -5
  49. package/src/util/bus.js +1 -1
  50. package/src/util/cache_util.js +18 -18
  51. package/src/util/errer_code.js +6 -6
  52. package/src/util/eval_util.js +19 -19
  53. package/src/util/icon_util.js +36 -36
  54. package/src/util/image_util.js +27 -27
  55. package/src/util/index.js +55 -55
  56. package/src/util/num_util.js +70 -70
  57. package/src/util/obj_util.js +28 -28
  58. package/src/util/request.js +73 -73
  59. package/src/util/request_json.js +71 -71
  60. package/src/util/request_json_mute.js +65 -65
  61. package/src/util/request_upload.js +79 -79
  62. package/src/util/route_util.js +31 -31
  63. package/src/util/str_util.js +143 -143
  64. package/src/util/time_util.js +406 -406
  65. package/src/util/toast_util.js +24 -24
  66. package/src/util/tree_util.js +153 -153
  67. package/src/util/validate.js +182 -182
  68. package/src/util/vue_filter.js +223 -223
  69. package/src/views/auditbar/index.vue +65 -65
  70. package/src/views/billcard/index.vue +45 -45
  71. package/src/views/cascaderpicker/index.vue +0 -0
  72. package/src/views/cascaderpicker/index_user.vue +0 -0
  73. package/src/views/cascaderpop/index.vue +90 -90
  74. package/src/views/checkgroup/index.vue +35 -35
  75. package/src/views/dataSelector/index.vue +48 -48
  76. package/src/views/datetimepicker/index.vue +34 -34
  77. package/src/views/daydropdown/index.vue +31 -31
  78. package/src/views/filepicker/index.vue +31 -31
  79. package/src/views/imagepicker/index.vue +31 -31
  80. package/src/views/imagespicker/index.vue +31 -31
  81. package/src/views/input/index.vue +34 -34
  82. package/src/views/monthdropdown/index.vue +31 -31
  83. package/src/views/multListSelector/index.vue +61 -61
  84. package/src/views/multipicker/index.vue +36 -36
  85. package/src/views/productSelector/index.vue +35 -35
  86. package/src/views/projectdropdown/index.vue +31 -31
  87. package/src/views/projectpicker/index.vue +41 -41
  88. package/src/views/secretnotify/index.vue +27 -27
  89. package/src/views/sheet/index.vue +45 -45
  90. package/src/views/singleapipicker/index.vue +0 -0
  91. package/src/views/singlepicker/index.vue +35 -35
  92. package/src/views/subdepartmentSelector/index.vue +40 -40
  93. package/src/views/switch/index.vue +34 -34
  94. package/src/views/treepicker/index.vue +41 -41
  95. package/src/views/userSelector/index.vue +54 -54
  96. package/src/views/userSelectorNew/index.vue +45 -45
  97. package/src/views/userpicker/index.vue +43 -43
  98. package/src/views/userprofile/index.vue +30 -30
  99. package/src/views/userspicker/index.vue +43 -43
  100. package/src/views/yeardropdown/index.vue +32 -32
  101. package/src/vm/index.js +1 -1
  102. package/vite.config.ts +122 -122
@@ -1,281 +1,281 @@
1
- <template>
2
- <div>
3
- <!-- 显示已选数据 -->
4
- <van-field
5
- v-if="!isGone"
6
- type="textarea"
7
- rows="1"
8
- autosize
9
- :modelValue="selectedItems"
10
- readonly
11
- clearable
12
- :required="isRequired"
13
- :label="label"
14
- :name="name"
15
- v-bind="$attrs"
16
- @click="showPopup"
17
- :right-icon="isReadonly ? '' : 'arrow'"
18
- :rules="props.rules"
19
- :class="{ 'disabled-field': isReadonly }"
20
- />
21
- <!-- 数据选择弹出层 -->
22
- <van-popup v-model:show="popupVisible" position="bottom" class="popup-style">
23
- <div>
24
- <div class="pad10 flex-between showMultipleButton">
25
- <van-button plain size="normal" @click="cancelSelection">取消</van-button>
26
- <div class="bold">{{ label }}</div>
27
- <van-button plain type="primary" size="normal" @click="confirmSelection">确定</van-button>
28
- </div>
29
- <!-- 搜索框 -->
30
- <van-field left-icon="search" v-model.trim="searchKeyword" clearable placeholder="请输入搜索关键字" />
31
- <!-- 全选 -->
32
- <div v-if="mode === 'multiple'" class="select-all-container">
33
- <van-checkbox shape="square" v-model="isAllChecked" @click="toggleAllSelect" label-position="left">全选</van-checkbox>
34
- </div>
35
- <!-- 数据列表 -->
36
- <div class="checkbox-style">
37
- <van-checkbox-group v-model="checkedValue" v-if="mode === 'multiple'">
38
- <van-cell-group>
39
- <van-cell v-for="(item, index) in filteredColumns" :key="index" :title="item.text" clickable
40
- @click="toggle(index)">
41
- <template #right-icon>
42
- <!-- 修改点:添加 shape="square" -->
43
- <van-checkbox
44
- :name="item.value"
45
- :ref="(el) => (checkboxRefs[index] = el)"
46
- shape="square"
47
- @click.stop
48
- />
49
- </template>
50
- </van-cell>
51
- </van-cell-group>
52
- </van-checkbox-group>
53
- <van-radio-group v-model="checkedValue" v-else>
54
- <van-cell-group>
55
- <van-cell v-for="(item, index) in filteredColumns" :key="index" :title="item.text" clickable
56
- @click="radioToggle(item.value)">
57
- <template #right-icon>
58
- <!-- 单选保持圆形(默认样式) -->
59
- <van-radio :name="item.value" />
60
- </template>
61
- </van-cell>
62
- </van-cell-group>
63
- </van-radio-group>
64
- </div>
65
- </div>
66
- </van-popup>
67
- </div>
68
- </template>
69
-
70
- <script setup>
71
- import { onMounted, ref, onBeforeUpdate, computed, nextTick, watch } from "vue"
72
- import util from '../util'
73
-
74
- const props = defineProps({
75
- mode: {
76
- type: String,
77
- default: 'multiple', // 'single' | 'multiple'
78
- validator: (v) => ['single', 'multiple'].includes(v)
79
- },
80
- options: {
81
- type: Array,
82
- required: true,
83
- },
84
- modelValue: {
85
- type: [Array, String, Number],
86
- default: () => [],
87
- },
88
- rules: {
89
- type: Array,
90
- default: () => []
91
- },
92
- required: {
93
- type: Boolean,
94
- default: false,
95
- },
96
- readonly: {
97
- type: Boolean,
98
- default: false,
99
- },
100
- auth:{
101
- type: String,
102
- default:''
103
- },
104
- label: String,
105
- name: String,
106
- });
107
-
108
- const {isRequired, isReadonly, isGone,isDisabled} = util.props2auth(props)
109
- const emit = defineEmits(["update:modelValue","select"]);
110
-
111
- const selectedItems = ref([]);
112
- const popupVisible = ref(false);
113
- const searchKeyword = ref(null);
114
- const checkboxRefs = ref([]);
115
- const checkedValue = ref([]);
116
- const isAllChecked = ref(false);
117
-
118
- const findTextsByValues = (valuesToFind, data) => {
119
- return valuesToFind.map((value) => {
120
- const foundItem = data.find((item) => item.value === value);
121
- return foundItem ? foundItem.text : null;
122
- });
123
- };
124
-
125
- const values2items = (values)=>{
126
- if(!values || values.length<1 || !props.options || props.options.length<1)
127
- return []
128
-
129
- let res = props.options.filter(option=>values.includes(option.value))
130
- return res
131
- }
132
-
133
- const reShow = () => {
134
- if (props.modelValue) {
135
- if (Array.isArray(props.options)) {
136
- if (props.mode === 'multiple') {
137
- selectedItems.value = findTextsByValues(props.modelValue, props.options);
138
- } else {
139
- const foundItem = props.options.find((item) => item.value === props.modelValue);
140
- selectedItems.value = foundItem ? [foundItem.text] : [];
141
- }
142
- }
143
- }
144
- };
145
-
146
- onMounted(() => {
147
- nextTick(() => {
148
- reShow();
149
- });
150
- });
151
-
152
- const toggle = (index) => {
153
- checkboxRefs.value[index].toggle();
154
- };
155
-
156
- onBeforeUpdate(() => {
157
- checkboxRefs.value = [];
158
- });
159
-
160
- const showPopup = () => {
161
- // 若状态为只读,则不弹出窗口
162
- if (isReadonly.value) {
163
- return;
164
- }
165
- if (props.mode === 'multiple') {
166
- checkedValue.value = Array.isArray(props.modelValue) ? props.modelValue : [];
167
- } else {
168
- checkedValue.value = props.modelValue;
169
- }
170
- popupVisible.value = true;
171
- };
172
-
173
- const cancelSelection = () => {
174
- popupVisible.value = false;
175
- };
176
-
177
- const confirmSelection = () => {
178
- if (props.mode === 'multiple') {
179
- selectedItems.value = findTextsByValues(checkedValue.value, props.options);
180
- emit("update:modelValue", checkedValue.value);
181
- emit("select",values2items(checkedValue.value))
182
- } else {
183
- const foundItem = props.options.find((item) => item.value === checkedValue.value);
184
- selectedItems.value = foundItem ? [foundItem.text] : [];
185
- emit("update:modelValue", checkedValue.value);
186
- emit("select", foundItem)
187
- }
188
- popupVisible.value = false;
189
- };
190
-
191
- const toggleAllSelect = () => {
192
- if (isAllChecked.value) {
193
- checkedValue.value = filteredColumns.value.map(item => item.value);
194
- } else {
195
- checkedValue.value = [];
196
- }
197
- };
198
-
199
- const radioToggle = (value) => {
200
- checkedValue.value = value;
201
- };
202
-
203
- const filteredColumns = computed(() => {
204
- return props.options.filter((item) => {
205
- return item.text.includes(searchKeyword.value) || item.value.includes(searchKeyword.value);
206
- });
207
- });
208
-
209
- watch(checkedValue, () => {
210
- if (props.mode === 'multiple') {
211
- if (filteredColumns.value.length === 0) {
212
- isAllChecked.value = false;
213
- } else {
214
- isAllChecked.value = checkedValue.value.length === filteredColumns.value.length;
215
- }
216
- }
217
- }, { deep: true });
218
-
219
- // 在watch部分新增以下代码
220
- watch(() => props.modelValue, (newVal) => {
221
- nextTick(() => {
222
- reShow();
223
- });
224
- }, { deep: true, immediate: true });
225
-
226
- // 在options变化时也需要更新显示
227
- watch(() => props.options, () => {
228
- reShow();
229
- }, { deep: true });
230
- </script>
231
-
232
- <style scoped>
233
- .popup-style {
234
- height: 21.25rem;
235
- }
236
-
237
- .showMultipleButton {
238
- padding-bottom: 0;
239
- }
240
-
241
- .showMultipleButton .van-button {
242
- border: 0;
243
- }
244
-
245
- .flex-between {
246
- padding: 10px;
247
- display: flex;
248
- justify-content: space-between;
249
- align-items: center;
250
- }
251
-
252
- .bold {
253
- font-weight: bold;
254
- color: #444;
255
- }
256
-
257
- .checkbox-style {
258
- /* height: 220px; */
259
- height: calc(220px - 30px);
260
- overflow-y: auto;
261
- }
262
-
263
- .select-all-container {
264
- font-size: 14px;
265
- padding: 0 16px;
266
- margin: 10px 0;
267
- display: flex;
268
- justify-content: flex-end;
269
- align-items: center;
270
- }
271
-
272
- .select-all-container .van-checkbox {
273
- margin-left: auto;
274
- }
275
-
276
- /* 新增:调整方形复选框的边距 */
277
- .van-checkbox--square {
278
- margin-left: 8px;
279
- }
280
-
1
+ <template>
2
+ <div>
3
+ <!-- 显示已选数据 -->
4
+ <van-field
5
+ v-if="!isGone"
6
+ type="textarea"
7
+ rows="1"
8
+ autosize
9
+ :modelValue="selectedItems"
10
+ readonly
11
+ clearable
12
+ :required="isRequired"
13
+ :label="label"
14
+ :name="name"
15
+ v-bind="$attrs"
16
+ @click="showPopup"
17
+ :right-icon="isReadonly ? '' : 'arrow'"
18
+ :rules="props.rules"
19
+ :class="{ 'disabled-field': isReadonly }"
20
+ />
21
+ <!-- 数据选择弹出层 -->
22
+ <van-popup v-model:show="popupVisible" position="bottom" class="popup-style">
23
+ <div>
24
+ <div class="pad10 flex-between showMultipleButton">
25
+ <van-button plain size="normal" @click="cancelSelection">取消</van-button>
26
+ <div class="bold">{{ label }}</div>
27
+ <van-button plain type="primary" size="normal" @click="confirmSelection">确定</van-button>
28
+ </div>
29
+ <!-- 搜索框 -->
30
+ <van-field left-icon="search" v-model.trim="searchKeyword" clearable placeholder="请输入搜索关键字" />
31
+ <!-- 全选 -->
32
+ <div v-if="mode === 'multiple'" class="select-all-container">
33
+ <van-checkbox shape="square" v-model="isAllChecked" @click="toggleAllSelect" label-position="left">全选</van-checkbox>
34
+ </div>
35
+ <!-- 数据列表 -->
36
+ <div class="checkbox-style">
37
+ <van-checkbox-group v-model="checkedValue" v-if="mode === 'multiple'">
38
+ <van-cell-group>
39
+ <van-cell v-for="(item, index) in filteredColumns" :key="index" :title="item.text" clickable
40
+ @click="toggle(index)">
41
+ <template #right-icon>
42
+ <!-- 修改点:添加 shape="square" -->
43
+ <van-checkbox
44
+ :name="item.value"
45
+ :ref="(el) => (checkboxRefs[index] = el)"
46
+ shape="square"
47
+ @click.stop
48
+ />
49
+ </template>
50
+ </van-cell>
51
+ </van-cell-group>
52
+ </van-checkbox-group>
53
+ <van-radio-group v-model="checkedValue" v-else>
54
+ <van-cell-group>
55
+ <van-cell v-for="(item, index) in filteredColumns" :key="index" :title="item.text" clickable
56
+ @click="radioToggle(item.value)">
57
+ <template #right-icon>
58
+ <!-- 单选保持圆形(默认样式) -->
59
+ <van-radio :name="item.value" />
60
+ </template>
61
+ </van-cell>
62
+ </van-cell-group>
63
+ </van-radio-group>
64
+ </div>
65
+ </div>
66
+ </van-popup>
67
+ </div>
68
+ </template>
69
+
70
+ <script setup>
71
+ import { onMounted, ref, onBeforeUpdate, computed, nextTick, watch } from "vue"
72
+ import util from '../util'
73
+
74
+ const props = defineProps({
75
+ mode: {
76
+ type: String,
77
+ default: 'multiple', // 'single' | 'multiple'
78
+ validator: (v) => ['single', 'multiple'].includes(v)
79
+ },
80
+ options: {
81
+ type: Array,
82
+ required: true,
83
+ },
84
+ modelValue: {
85
+ type: [Array, String, Number],
86
+ default: () => [],
87
+ },
88
+ rules: {
89
+ type: Array,
90
+ default: () => []
91
+ },
92
+ required: {
93
+ type: Boolean,
94
+ default: false,
95
+ },
96
+ readonly: {
97
+ type: Boolean,
98
+ default: false,
99
+ },
100
+ auth:{
101
+ type: String,
102
+ default:''
103
+ },
104
+ label: String,
105
+ name: String,
106
+ });
107
+
108
+ const {isRequired, isReadonly, isGone,isDisabled} = util.props2auth(props)
109
+ const emit = defineEmits(["update:modelValue","select"]);
110
+
111
+ const selectedItems = ref([]);
112
+ const popupVisible = ref(false);
113
+ const searchKeyword = ref(null);
114
+ const checkboxRefs = ref([]);
115
+ const checkedValue = ref([]);
116
+ const isAllChecked = ref(false);
117
+
118
+ const findTextsByValues = (valuesToFind, data) => {
119
+ return valuesToFind.map((value) => {
120
+ const foundItem = data.find((item) => item.value === value);
121
+ return foundItem ? foundItem.text : null;
122
+ });
123
+ };
124
+
125
+ const values2items = (values)=>{
126
+ if(!values || values.length<1 || !props.options || props.options.length<1)
127
+ return []
128
+
129
+ let res = props.options.filter(option=>values.includes(option.value))
130
+ return res
131
+ }
132
+
133
+ const reShow = () => {
134
+ if (props.modelValue) {
135
+ if (Array.isArray(props.options)) {
136
+ if (props.mode === 'multiple') {
137
+ selectedItems.value = findTextsByValues(props.modelValue, props.options);
138
+ } else {
139
+ const foundItem = props.options.find((item) => item.value === props.modelValue);
140
+ selectedItems.value = foundItem ? [foundItem.text] : [];
141
+ }
142
+ }
143
+ }
144
+ };
145
+
146
+ onMounted(() => {
147
+ nextTick(() => {
148
+ reShow();
149
+ });
150
+ });
151
+
152
+ const toggle = (index) => {
153
+ checkboxRefs.value[index].toggle();
154
+ };
155
+
156
+ onBeforeUpdate(() => {
157
+ checkboxRefs.value = [];
158
+ });
159
+
160
+ const showPopup = () => {
161
+ // 若状态为只读,则不弹出窗口
162
+ if (isReadonly.value) {
163
+ return;
164
+ }
165
+ if (props.mode === 'multiple') {
166
+ checkedValue.value = Array.isArray(props.modelValue) ? props.modelValue : [];
167
+ } else {
168
+ checkedValue.value = props.modelValue;
169
+ }
170
+ popupVisible.value = true;
171
+ };
172
+
173
+ const cancelSelection = () => {
174
+ popupVisible.value = false;
175
+ };
176
+
177
+ const confirmSelection = () => {
178
+ if (props.mode === 'multiple') {
179
+ selectedItems.value = findTextsByValues(checkedValue.value, props.options);
180
+ emit("update:modelValue", checkedValue.value);
181
+ emit("select",values2items(checkedValue.value))
182
+ } else {
183
+ const foundItem = props.options.find((item) => item.value === checkedValue.value);
184
+ selectedItems.value = foundItem ? [foundItem.text] : [];
185
+ emit("update:modelValue", checkedValue.value);
186
+ emit("select", foundItem)
187
+ }
188
+ popupVisible.value = false;
189
+ };
190
+
191
+ const toggleAllSelect = () => {
192
+ if (isAllChecked.value) {
193
+ checkedValue.value = filteredColumns.value.map(item => item.value);
194
+ } else {
195
+ checkedValue.value = [];
196
+ }
197
+ };
198
+
199
+ const radioToggle = (value) => {
200
+ checkedValue.value = value;
201
+ };
202
+
203
+ const filteredColumns = computed(() => {
204
+ return props.options.filter((item) => {
205
+ return item.text.includes(searchKeyword.value) || item.value.includes(searchKeyword.value);
206
+ });
207
+ });
208
+
209
+ watch(checkedValue, () => {
210
+ if (props.mode === 'multiple') {
211
+ if (filteredColumns.value.length === 0) {
212
+ isAllChecked.value = false;
213
+ } else {
214
+ isAllChecked.value = checkedValue.value.length === filteredColumns.value.length;
215
+ }
216
+ }
217
+ }, { deep: true });
218
+
219
+ // 在watch部分新增以下代码
220
+ watch(() => props.modelValue, (newVal) => {
221
+ nextTick(() => {
222
+ reShow();
223
+ });
224
+ }, { deep: true, immediate: true });
225
+
226
+ // 在options变化时也需要更新显示
227
+ watch(() => props.options, () => {
228
+ reShow();
229
+ }, { deep: true });
230
+ </script>
231
+
232
+ <style scoped>
233
+ .popup-style {
234
+ height: 21.25rem;
235
+ }
236
+
237
+ .showMultipleButton {
238
+ padding-bottom: 0;
239
+ }
240
+
241
+ .showMultipleButton .van-button {
242
+ border: 0;
243
+ }
244
+
245
+ .flex-between {
246
+ padding: 10px;
247
+ display: flex;
248
+ justify-content: space-between;
249
+ align-items: center;
250
+ }
251
+
252
+ .bold {
253
+ font-weight: bold;
254
+ color: #444;
255
+ }
256
+
257
+ .checkbox-style {
258
+ /* height: 220px; */
259
+ height: calc(220px - 30px);
260
+ overflow-y: auto;
261
+ }
262
+
263
+ .select-all-container {
264
+ font-size: 14px;
265
+ padding: 0 16px;
266
+ margin: 10px 0;
267
+ display: flex;
268
+ justify-content: flex-end;
269
+ align-items: center;
270
+ }
271
+
272
+ .select-all-container .van-checkbox {
273
+ margin-left: auto;
274
+ }
275
+
276
+ /* 新增:调整方形复选框的边距 */
277
+ .van-checkbox--square {
278
+ margin-left: 8px;
279
+ }
280
+
281
281
  </style>