widget.qw 1.0.83 → 1.0.85

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 (108) hide show
  1. package/.env.development +10 -10
  2. package/.env.production +8 -8
  3. package/README.md +75 -75
  4. package/build/style.css +521 -471
  5. package/build/widget.qw.es.js +253 -84
  6. package/build/widget.qw.umd.js +252 -83
  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 +173 -165
  11. package/src/components/AuditBar.vue +396 -396
  12. package/src/components/BillCard.vue +164 -164
  13. package/src/components/CascaderPicker.vue +132 -132
  14. package/src/components/CascaderPop.vue +375 -371
  15. package/src/components/CheckGroup.vue +113 -113
  16. package/src/components/DatetimeDropdown.vue +62 -0
  17. package/src/components/{DatetimePicker/index.vue → DatetimePicker.vue} +124 -124
  18. package/src/components/DayDropdown.vue +56 -56
  19. package/src/components/FilePicker.vue +169 -169
  20. package/src/components/HeadBar.vue +130 -0
  21. package/src/components/Input.vue +80 -80
  22. package/src/components/MonthDropdown.vue +51 -51
  23. package/src/components/MultiPicker.vue +123 -123
  24. package/src/components/ObjsEditor.vue +334 -334
  25. package/src/components/SecretNotify.js +5 -5
  26. package/src/components/Sheet.vue +92 -92
  27. package/src/components/SingleApiPicker.vue +108 -108
  28. package/src/components/SinglePicker.vue +102 -102
  29. package/src/components/SingleUserSelector.vue +425 -425
  30. package/src/components/Switch.vue +64 -64
  31. package/src/components/TreePicker.vue +113 -113
  32. package/src/components/UserPicker.vue +106 -106
  33. package/src/components/UserProfile.vue +129 -129
  34. package/src/components/UsersPicker.vue +118 -118
  35. package/src/components/YearDropdown.vue +59 -59
  36. package/src/components/data_selector.vue +303 -303
  37. package/src/components/image_picker.vue +123 -123
  38. package/src/components/images_picker.vue +195 -195
  39. package/src/components/index.js +172 -162
  40. package/src/components/mult_list_selector.vue +155 -155
  41. package/src/components/subdepartment_selector.vue +481 -481
  42. package/src/components/user_selector.vue +639 -639
  43. package/src/components/widget/DataPop.vue +95 -95
  44. package/src/components/{DatetimePicker → widget}/DatetimePop.vue +342 -342
  45. package/src/components/widget/TreePop.vue +88 -88
  46. package/src/components/widget/UserPop.vue +347 -347
  47. package/src/main.js +117 -117
  48. package/src/router/index.ts +183 -173
  49. package/src/util/array_util.js +32 -32
  50. package/src/util/auth_util.js +72 -72
  51. package/src/util/bool_util.js +5 -5
  52. package/src/util/bus.js +1 -1
  53. package/src/util/cache_util.js +18 -18
  54. package/src/util/errer_code.js +6 -6
  55. package/src/util/eval_util.js +19 -19
  56. package/src/util/icon_util.js +36 -36
  57. package/src/util/image_util.js +27 -27
  58. package/src/util/index.js +57 -57
  59. package/src/util/num_util.js +70 -70
  60. package/src/util/obj_util.js +28 -28
  61. package/src/util/request.js +73 -73
  62. package/src/util/request_json.js +71 -71
  63. package/src/util/request_json_mute.js +65 -65
  64. package/src/util/request_upload.js +79 -79
  65. package/src/util/route_util.js +31 -31
  66. package/src/util/str_util.js +143 -143
  67. package/src/util/time_util.js +406 -406
  68. package/src/util/toast_util.js +24 -24
  69. package/src/util/tree_util.js +153 -153
  70. package/src/util/uuid_util.js +9 -9
  71. package/src/util/validate.js +182 -182
  72. package/src/util/vue_filter.js +223 -223
  73. package/src/views/auditbar/index.vue +78 -78
  74. package/src/views/billcard/index.vue +48 -48
  75. package/src/views/cascaderpicker/index.vue +0 -0
  76. package/src/views/cascaderpicker/userpicker.vue +183 -0
  77. package/src/views/cascaderpop/index.vue +90 -90
  78. package/src/views/checkgroup/index.vue +35 -35
  79. package/src/views/dataSelector/index.vue +48 -48
  80. package/src/views/datetimedropdown/index.vue +34 -0
  81. package/src/views/datetimepicker/index.vue +34 -34
  82. package/src/views/daydropdown/index.vue +31 -31
  83. package/src/views/filepicker/index.vue +32 -32
  84. package/src/views/headbar/index.vue +28 -0
  85. package/src/views/home/index.vue +0 -0
  86. package/src/views/imagepicker/index.vue +31 -31
  87. package/src/views/imagespicker/index.vue +37 -37
  88. package/src/views/input/index.vue +35 -35
  89. package/src/views/monthdropdown/index.vue +31 -31
  90. package/src/views/multListSelector/index.vue +61 -61
  91. package/src/views/multipicker/index.vue +36 -36
  92. package/src/views/objseditor/index.vue +277 -277
  93. package/src/views/productSelector/index.vue +35 -35
  94. package/src/views/projectpicker/index.vue +41 -41
  95. package/src/views/secretnotify/index.vue +27 -27
  96. package/src/views/sheet/index.vue +45 -45
  97. package/src/views/singlepicker/index.vue +35 -35
  98. package/src/views/subdepartmentSelector/index.vue +40 -40
  99. package/src/views/switch/index.vue +34 -34
  100. package/src/views/treepicker/index.vue +41 -41
  101. package/src/views/userSelector/index.vue +54 -54
  102. package/src/views/userSelectorNew/index.vue +45 -45
  103. package/src/views/userpicker/index.vue +43 -43
  104. package/src/views/userprofile/index.vue +30 -30
  105. package/src/views/userspicker/index.vue +43 -43
  106. package/src/views/yeardropdown/index.vue +32 -32
  107. package/src/vm/index.js +1 -1
  108. package/vite.config.ts +122 -122
@@ -1,170 +1,170 @@
1
- <template>
2
- <van-field v-if="!isGone" name="image" :label="props.label" :required="isRequired" :rules="props.rules"
3
- label-class="label" :placeholder="props.placeholder">
4
- <template #input>
5
- <div class="file-box">
6
- <van-uploader v-model="files" :multiple="props.multiple" :max-count="maxCount" :afterRead="onAfterRead"
7
- :disabled="isDisabled" :accept="props.accept" upload-icon="plus" :deletable="!isDisabled"
8
- :before-delete="onBeforeDelete" @click-preview="onClickPreview" />
9
- </div>
10
- </template>
11
- </van-field>
12
- </template>
13
-
14
- <script setup>
15
- import { ref, computed, onMounted, defineProps, defineEmits, watch } from "vue"
16
- import util from '../util'
17
- import { useVModel } from "@vueuse/core"
18
-
19
- const props = defineProps({
20
- modelValue: {
21
- type: [String, Array],
22
- default: null
23
- },
24
- label: {
25
- type: String,
26
- default: ''
27
- },
28
- multiple: {
29
- type: Boolean,
30
- default: false
31
- },
32
- maxCount: {
33
- type: Number,
34
- default: 1000
35
- },
36
- required: {
37
- type: Boolean,
38
- default: false
39
- },
40
- readonly: {
41
- type: Boolean,
42
- default: false
43
- },
44
- placeholder: {
45
- type: String,
46
- default: ''
47
- },
48
- rules: {
49
- type: Array,
50
- default: () => []
51
- },
52
- accept: {
53
- type: String,
54
- default: ""
55
- },
56
- auth: {
57
- type: String,
58
- default: ''
59
- }
60
- })
61
-
62
- const emit = defineEmits(['update:modelValue'])
63
- const modelValue = useVModel(props, 'modelValue', emit)
64
- const { isRequired, isReadonly, isGone, isDisabled } = util.props2auth(props)
65
-
66
- const files = ref([])
67
- const maxCount = computed(() => {
68
- if (props.multiple)
69
- return props.maxCount
70
- else
71
- return 1
72
- })
73
-
74
- onMounted(() => {
75
-
76
- })
77
-
78
- const onClickPreview = (e) => {
79
- let url = (e.url || '')
80
- if (url.includes('.jpg') || url.includes('.png') || url.includes('.jpeg'))
81
- return
82
-
83
- window.location.href = e.url
84
- }
85
-
86
- const onAfterRead = async (e) => {
87
- console.log('onAfterRead', e)
88
-
89
-
90
- let files = []
91
- if (e && Array.isArray(e) && e.length > 0) {
92
- files = e
93
- }else{
94
- files = [e]
95
- }
96
-
97
- for (var i = 0; i < files.length; i++) {
98
- let params = {
99
- file: files[i].file
100
- }
101
-
102
- let res = await util.file_upload(params)
103
- if (res.code == 200) {
104
- if(props.multiple)
105
- modelValue.value = [...(modelValue.value || []), res.data]
106
- else
107
- modelValue.value = res.data
108
- }
109
- }
110
-
111
- return Promise.resolve(e)
112
- }
113
-
114
- const onBeforeDelete = (e) => {
115
- console.log('onBeforeDelete', e)
116
-
117
- if (props.multiple) {
118
- let newUrls = props.modelValue.filter(item => {
119
- return item != e.url
120
- })
121
- emit('update:modelValue', newUrls)
122
- } else {
123
- modelValue.value = ''
124
- }
125
-
126
- return Promise.resolve(e)
127
- }
128
-
129
- watch(() => props.modelValue,
130
- (newVal, oldVal) => {
131
- if (props.multiple) {
132
- if (!props.modelValue || props.modelValue.length < 1) {
133
- files.value = []
134
- return
135
- }
136
-
137
- files.value = props.modelValue.map(item => {
138
- return {
139
- url: item
140
- }
141
- })
142
- } else {
143
- if (!props.modelValue) {
144
- files.value = []
145
- return
146
- }
147
-
148
- files.value = [{
149
- url: props.modelValue
150
- }]
151
- }
152
- },
153
- {
154
- immediate: true
155
- }
156
- )
157
- </script>
158
-
159
- <style lang="scss" scoped>
160
- :deep(.label) {
161
- color: #000 !important;
162
- }
163
-
164
- :deep(.van-field__control:disabled) {
165
- color: #000 !important;
166
- cursor: not-allowed;
167
- opacity: 1;
168
- -webkit-text-fill-color: #000;
169
- }
1
+ <template>
2
+ <van-field v-if="!isGone" name="image" :label="props.label" :required="isRequired" :rules="props.rules"
3
+ label-class="label" :placeholder="props.placeholder">
4
+ <template #input>
5
+ <div class="file-box">
6
+ <van-uploader v-model="files" :multiple="props.multiple" :max-count="maxCount" :afterRead="onAfterRead"
7
+ :disabled="isDisabled" :accept="props.accept" upload-icon="plus" :deletable="!isDisabled"
8
+ :before-delete="onBeforeDelete" @click-preview="onClickPreview" />
9
+ </div>
10
+ </template>
11
+ </van-field>
12
+ </template>
13
+
14
+ <script setup>
15
+ import { ref, computed, onMounted, defineProps, defineEmits, watch } from "vue"
16
+ import util from '../util'
17
+ import { useVModel } from "@vueuse/core"
18
+
19
+ const props = defineProps({
20
+ modelValue: {
21
+ type: [String, Array],
22
+ default: null
23
+ },
24
+ label: {
25
+ type: String,
26
+ default: ''
27
+ },
28
+ multiple: {
29
+ type: Boolean,
30
+ default: false
31
+ },
32
+ maxCount: {
33
+ type: Number,
34
+ default: 1000
35
+ },
36
+ required: {
37
+ type: Boolean,
38
+ default: false
39
+ },
40
+ readonly: {
41
+ type: Boolean,
42
+ default: false
43
+ },
44
+ placeholder: {
45
+ type: String,
46
+ default: ''
47
+ },
48
+ rules: {
49
+ type: Array,
50
+ default: () => []
51
+ },
52
+ accept: {
53
+ type: String,
54
+ default: ""
55
+ },
56
+ auth: {
57
+ type: String,
58
+ default: ''
59
+ }
60
+ })
61
+
62
+ const emit = defineEmits(['update:modelValue'])
63
+ const modelValue = useVModel(props, 'modelValue', emit)
64
+ const { isRequired, isReadonly, isGone, isDisabled } = util.props2auth(props)
65
+
66
+ const files = ref([])
67
+ const maxCount = computed(() => {
68
+ if (props.multiple)
69
+ return props.maxCount
70
+ else
71
+ return 1
72
+ })
73
+
74
+ onMounted(() => {
75
+
76
+ })
77
+
78
+ const onClickPreview = (e) => {
79
+ let url = (e.url || '')
80
+ if (url.includes('.jpg') || url.includes('.png') || url.includes('.jpeg'))
81
+ return
82
+
83
+ window.location.href = e.url
84
+ }
85
+
86
+ const onAfterRead = async (e) => {
87
+ console.log('onAfterRead', e)
88
+
89
+
90
+ let files = []
91
+ if (e && Array.isArray(e) && e.length > 0) {
92
+ files = e
93
+ }else{
94
+ files = [e]
95
+ }
96
+
97
+ for (var i = 0; i < files.length; i++) {
98
+ let params = {
99
+ file: files[i].file
100
+ }
101
+
102
+ let res = await util.file_upload(params)
103
+ if (res.code == 200) {
104
+ if(props.multiple)
105
+ modelValue.value = [...(modelValue.value || []), res.data]
106
+ else
107
+ modelValue.value = res.data
108
+ }
109
+ }
110
+
111
+ return Promise.resolve(e)
112
+ }
113
+
114
+ const onBeforeDelete = (e) => {
115
+ console.log('onBeforeDelete', e)
116
+
117
+ if (props.multiple) {
118
+ let newUrls = props.modelValue.filter(item => {
119
+ return item != e.url
120
+ })
121
+ emit('update:modelValue', newUrls)
122
+ } else {
123
+ modelValue.value = ''
124
+ }
125
+
126
+ return Promise.resolve(e)
127
+ }
128
+
129
+ watch(() => props.modelValue,
130
+ (newVal, oldVal) => {
131
+ if (props.multiple) {
132
+ if (!props.modelValue || props.modelValue.length < 1) {
133
+ files.value = []
134
+ return
135
+ }
136
+
137
+ files.value = props.modelValue.map(item => {
138
+ return {
139
+ url: item
140
+ }
141
+ })
142
+ } else {
143
+ if (!props.modelValue) {
144
+ files.value = []
145
+ return
146
+ }
147
+
148
+ files.value = [{
149
+ url: props.modelValue
150
+ }]
151
+ }
152
+ },
153
+ {
154
+ immediate: true
155
+ }
156
+ )
157
+ </script>
158
+
159
+ <style lang="scss" scoped>
160
+ :deep(.label) {
161
+ color: #000 !important;
162
+ }
163
+
164
+ :deep(.van-field__control:disabled) {
165
+ color: #000 !important;
166
+ cursor: not-allowed;
167
+ opacity: 1;
168
+ -webkit-text-fill-color: #000;
169
+ }
170
170
  </style>
@@ -0,0 +1,130 @@
1
+ <template>
2
+ <div class="enterprise-header">
3
+ <!-- 返回按钮 -->
4
+ <button
5
+ class="header-btn back-btn"
6
+ @click="handleBack"
7
+ >
8
+ <van-icon name="arrow-left" />
9
+ </button>
10
+
11
+ <!-- 标题区域 -->
12
+ <div class="header-title">
13
+ {{ title }}
14
+ </div>
15
+
16
+ <!-- 首页按钮 -->
17
+ <button
18
+ class="header-btn home-btn"
19
+ @click="handleHome"
20
+ >
21
+ <van-icon name="wap-home-o" />
22
+ </button>
23
+ </div>
24
+ </template>
25
+
26
+ <script setup>
27
+ import { useRouter, useRoute } from 'vue-router'
28
+ import { defineProps, computed } from 'vue'
29
+
30
+ // 定义组件属性
31
+ const props = defineProps({
32
+ // 页面标题
33
+ title: {
34
+ type: String,
35
+ required: true,
36
+ default: '页面标题'
37
+ },
38
+ // 首页路由路径,默认为根路径
39
+ homePath: {
40
+ type: String,
41
+ default: '/'
42
+ }
43
+ })
44
+
45
+ // 路由相关
46
+ const router = useRouter()
47
+ const route = useRoute()
48
+
49
+ // 判断是否可以返回
50
+ const canGoBack = computed(() => {
51
+ // 可以根据实际路由历史判断,这里简单处理
52
+ return window.history.length>1
53
+ })
54
+
55
+ // 处理返回逻辑
56
+ const handleBack = () => {
57
+ console.log('back',router,route)
58
+ if (canGoBack.value) {
59
+ router.back()
60
+ } else {
61
+ // 如果不能返回,则跳转到首页
62
+ router.push(props.homePath)
63
+ }
64
+ }
65
+
66
+ // 处理返回首页逻辑
67
+ const handleHome = () => {
68
+ // 如果已经在首页,则不执行跳转
69
+ if (route.path !== props.homePath) {
70
+ router.push(props.homePath)
71
+ }
72
+ }
73
+ </script>
74
+
75
+ <style scoped>
76
+ .enterprise-header {
77
+ display: flex;
78
+ align-items: center;
79
+ justify-content: center;
80
+ height: 48px;
81
+ background-color: #2d8cf0; /* 企业微信风格蓝色 */
82
+ background-color: #fff;
83
+ color: white;
84
+ color: #000;
85
+ position: relative;
86
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
87
+ margin-bottom: 4px;
88
+ }
89
+
90
+ .header-title {
91
+ font-size: 14px;
92
+ font-weight: 500;
93
+ white-space: nowrap;
94
+ overflow: hidden;
95
+ text-overflow: ellipsis;
96
+ max-width: 70%;
97
+ }
98
+
99
+ .header-btn {
100
+ position: absolute;
101
+ width: 48px;
102
+ height: 48px;
103
+ display: flex;
104
+ align-items: center;
105
+ justify-content: center;
106
+ background: transparent;
107
+ border: none;
108
+ color: white;
109
+ color: #000;
110
+ font-size: 20px;
111
+ cursor: pointer;
112
+ padding: 0;
113
+ }
114
+
115
+ .header-btn:disabled {
116
+ opacity: 0.5;
117
+ cursor: not-allowed;
118
+ }
119
+
120
+ .back-btn {
121
+ left: 0;
122
+ }
123
+
124
+ .home-btn {
125
+ right: 0;
126
+ }
127
+
128
+
129
+ </style>
130
+
@@ -1,81 +1,81 @@
1
- <template>
2
- <van-field :label="props.label" v-model.number="modelValue" v-if="!isGone && props.type === 'number'"
3
- :disabled="isDisabled" :required="isRequired" :placeholder="props.placeholder" :type="props.type"
4
- :rows="props.rows" :autosize="props.autosize" :rules="props.rules" />
5
- <van-field :label="props.label" v-model="modelValue" v-if="!isGone && props.type != 'number'" :disabled="isDisabled"
6
- :required="isRequired" :placeholder="props.placeholder" :type="props.type" :rows="props.rows"
7
- :autosize="props.autosize" :rules="props.rules" />
8
- </template>
9
-
10
- <script setup>
11
- import { ref, computed, onMounted, defineProps, defineEmits, watch } from "vue"
12
- import { useVModel } from '@vueuse/core'
13
- import util from '../util'
14
-
15
- const props = defineProps({
16
- modelValue: {
17
- type: [String, Number],
18
- default: null
19
- },
20
- // 支持v-model.number写法
21
- modelModifiers: {
22
- type: Object,
23
- default: () => ({})
24
- },
25
- label: {
26
- type: String,
27
- default: ''
28
- },
29
- type: {
30
- type: String,
31
- default: 'text'
32
- },
33
- rows: {
34
- type: Number,
35
- default: 1
36
- },
37
- autosize: {
38
- type: Boolean,
39
- default: false
40
- },
41
- placeholder: {
42
- type: String,
43
- default: ''
44
- },
45
- readonly: {
46
- type: Boolean,
47
- default: true
48
- },
49
- required: {
50
- type: Boolean,
51
- default: false
52
- },
53
- auth: {
54
- type: String,
55
- default: ''
56
- },
57
- rules: {
58
- type: Array,
59
- default: null
60
- }
61
- })
62
- const emit = defineEmits(['update:modelValue'])
63
- const modelValue = useVModel(props, 'modelValue', emit)
64
- const { isRequired, isReadonly, isGone, isDisabled } = util.props2auth(props)
65
-
66
- onMounted(() => {
67
- })
68
- </script>
69
-
70
- <style lang="scss" scoped>
71
- :deep(.label) {
72
- color: #000 !important;
73
- }
74
-
75
- :deep(.van-field__control:disabled) {
76
- color: #000 !important;
77
- cursor: not-allowed;
78
- opacity: 1;
79
- -webkit-text-fill-color: #000;
80
- }
1
+ <template>
2
+ <van-field :label="props.label" v-model.number="modelValue" v-if="!isGone && props.type === 'number'"
3
+ :disabled="isDisabled" :required="isRequired" :placeholder="props.placeholder" :type="props.type"
4
+ :rows="props.rows" :autosize="props.autosize" :rules="props.rules" />
5
+ <van-field :label="props.label" v-model="modelValue" v-if="!isGone && props.type != 'number'" :disabled="isDisabled"
6
+ :required="isRequired" :placeholder="props.placeholder" :type="props.type" :rows="props.rows"
7
+ :autosize="props.autosize" :rules="props.rules" />
8
+ </template>
9
+
10
+ <script setup>
11
+ import { ref, computed, onMounted, defineProps, defineEmits, watch } from "vue"
12
+ import { useVModel } from '@vueuse/core'
13
+ import util from '../util'
14
+
15
+ const props = defineProps({
16
+ modelValue: {
17
+ type: [String, Number],
18
+ default: null
19
+ },
20
+ // 支持v-model.number写法
21
+ modelModifiers: {
22
+ type: Object,
23
+ default: () => ({})
24
+ },
25
+ label: {
26
+ type: String,
27
+ default: ''
28
+ },
29
+ type: {
30
+ type: String,
31
+ default: 'text'
32
+ },
33
+ rows: {
34
+ type: Number,
35
+ default: 1
36
+ },
37
+ autosize: {
38
+ type: Boolean,
39
+ default: false
40
+ },
41
+ placeholder: {
42
+ type: String,
43
+ default: ''
44
+ },
45
+ readonly: {
46
+ type: Boolean,
47
+ default: true
48
+ },
49
+ required: {
50
+ type: Boolean,
51
+ default: false
52
+ },
53
+ auth: {
54
+ type: String,
55
+ default: ''
56
+ },
57
+ rules: {
58
+ type: Array,
59
+ default: null
60
+ }
61
+ })
62
+ const emit = defineEmits(['update:modelValue'])
63
+ const modelValue = useVModel(props, 'modelValue', emit)
64
+ const { isRequired, isReadonly, isGone, isDisabled } = util.props2auth(props)
65
+
66
+ onMounted(() => {
67
+ })
68
+ </script>
69
+
70
+ <style lang="scss" scoped>
71
+ :deep(.label) {
72
+ color: #000 !important;
73
+ }
74
+
75
+ :deep(.van-field__control:disabled) {
76
+ color: #000 !important;
77
+ cursor: not-allowed;
78
+ opacity: 1;
79
+ -webkit-text-fill-color: #000;
80
+ }
81
81
  </style>