@scenetechnology/cj_element_table 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 (61) hide show
  1. package/.browserslistrc +4 -0
  2. package/.env.base +11 -0
  3. package/.env.dev +23 -0
  4. package/.env.gitee +23 -0
  5. package/.env.pro +24 -0
  6. package/.env.test +23 -0
  7. package/.eslintrc.js +18 -0
  8. package/README.md +24 -0
  9. package/babel.config.js +6 -0
  10. package/dist/cj_element_table.common.js +66535 -0
  11. package/dist/cj_element_table.common.js.map +1 -0
  12. package/dist/cj_element_table.css +1 -0
  13. package/dist/cj_element_table.umd.js +66554 -0
  14. package/dist/cj_element_table.umd.js.map +1 -0
  15. package/dist/cj_element_table.umd.min.js +61 -0
  16. package/dist/cj_element_table.umd.min.js.map +1 -0
  17. package/dist/demo.html +1 -0
  18. package/package.json +42 -0
  19. package/packages/components/SaveViewDialog.vue +109 -0
  20. package/packages/components/exportExcel.js +305 -0
  21. package/packages/components/exportTable.vue +361 -0
  22. package/packages/components/historyDialog.vue +100 -0
  23. package/packages/components/index.vue +1235 -0
  24. package/packages/components/tablesetting.vue +344 -0
  25. package/packages/components/tuo-drag.vue +197 -0
  26. package/packages/components/viewEdit.vue +239 -0
  27. package/packages/index.js +13 -0
  28. package/public/favicon.ico +0 -0
  29. package/public/index.html +17 -0
  30. package/src/App.vue +59 -0
  31. package/src/api/All.ts +104 -0
  32. package/src/assets/images/TablehederTool.png +0 -0
  33. package/src/assets/images/addIcon.png +0 -0
  34. package/src/assets/images/blue_lock.png +0 -0
  35. package/src/assets/images/changeIcon.png +0 -0
  36. package/src/assets/images/downImg.png +0 -0
  37. package/src/assets/images/kong_icon.png +0 -0
  38. package/src/assets/images/lbIcon.png +0 -0
  39. package/src/assets/images/lookImg.png +0 -0
  40. package/src/assets/images/model_title_icon.png +0 -0
  41. package/src/assets/images/pgIcon.png +0 -0
  42. package/src/assets/images/pzIcon.png +0 -0
  43. package/src/assets/images/tuozhui_icon.png +0 -0
  44. package/src/assets/images/view_save_icon.png +0 -0
  45. package/src/assets/images/view_setting_icon.png +0 -0
  46. package/src/assets/images/yaIcon.png +0 -0
  47. package/src/assets/logo.png +0 -0
  48. package/src/components/Dialog/index.ts +3 -0
  49. package/src/components/Dialog/src/Dialog.vue +72 -0
  50. package/src/components/HelloWorld.vue +60 -0
  51. package/src/components/Upload/index.vue +287 -0
  52. package/src/config/axios/config.ts +122 -0
  53. package/src/config/axios/index.ts +48 -0
  54. package/src/config/axios/service.ts +118 -0
  55. package/src/main.ts +13 -0
  56. package/src/router/index.ts +16 -0
  57. package/src/shims-vue.d.ts +6 -0
  58. package/tsconfig.json +41 -0
  59. package/types/global.d.ts +39 -0
  60. package/types/vite-env.d.ts +0 -0
  61. package/vue.config.js +24 -0
@@ -0,0 +1,344 @@
1
+ <template>
2
+ <el-dialog v-model="modelValue" title="列表设置" :width="800">
3
+ <div class="content">
4
+ <div style="flex: 3;">
5
+ <div class="classTitle">
6
+ 选择列表显示字段
7
+ <ElCheckbox style="margin-left:5px;font-weight: 400;font-size: 14px;color: #666666;" :indeterminate="indeterminate" v-model="checkAll" @click.prevent.native="handleCheckAll">全选</ElCheckbox>
8
+ </div>
9
+ <ElCheckboxGroup v-model="checkAllGroup" >
10
+ <el-checkbox :disabled="item.require" @change="change_check(item, $event)" v-for="(item, index) in columnsList" :key="index" :label="item.label">
11
+ {{ item.label }} {{ item.checked }}
12
+ <span v-if="item.require">(必选字段)</span>
13
+ </el-checkbox>
14
+ </ElCheckboxGroup>
15
+ </div>
16
+ <div style="flex:2;">
17
+ <div style="display: flex;align-items: center;justify-content: space-between;">
18
+ <span style="font-weight: 400;font-size: 15px;color: #333333;">已选择字段</span>
19
+ <div style="margin-left: 10px;">
20
+ <span style="font-weight: 400;font-size: 14px;color: #333333;">冻结列数:</span>
21
+ <ElSelect v-model="freeze" style="width: 100px;" filterable clearable>
22
+ <ElOption v-for="(item,index) in columnsOptionList" :value="item.value" :key="index">{{item.label}}</ElOption>
23
+ </ElSelect>
24
+ </div>
25
+ </div>
26
+ <tuo-drag v-if="modelValue" :freeze="freeze" @updatesortColumns="updatesortColumns" ref="tuoDrags" :initialSortColumns="sortColumns"></tuo-drag>
27
+ </div>
28
+ </div>
29
+ <template #footer>
30
+ <ElButton @click="handleReset">取消</ElButton>
31
+ <ElButton type="primary" @click="handleSubmit()" :loading="exportBtnLoading" style="margin-left: 8px">确定</ElButton>
32
+ </template>
33
+ </el-dialog>
34
+ </template>
35
+
36
+ <script setup lang="ts">
37
+ import { ref, watch, computed, onMounted,nextTick} from 'vue'
38
+ import {
39
+ ElCheckbox,
40
+ ElCheckboxGroup,
41
+ ElPagination,
42
+ ElButton,
43
+ ElDropdown,
44
+ ElDropdownMenu,
45
+ ElDropdownItem,
46
+ ElInput,
47
+ ElDialog,
48
+ ElSelect,
49
+ ElOption
50
+ } from 'element-plus'
51
+ import { useRoute } from 'vue-router'
52
+ import model_title_icon from '@/assets/images/model_title_icon.png'
53
+ import { UserQuery_update, UserQuery_save, UserQuery_index } from '@/api/All.ts'
54
+ // import { getToken } from '@/libs/util'
55
+ import tuoDrag from './tuo-drag.vue'
56
+
57
+ const props = defineProps({
58
+ modelValue: {
59
+ type: Boolean,
60
+ required: true
61
+ },
62
+ columnsList: {
63
+ type: Array,
64
+ default: () => []
65
+ },
66
+ columnSetting: {
67
+ type: Object,
68
+ default: () => ({})
69
+ },
70
+ title: {
71
+ type: String,
72
+ default: ''
73
+ },
74
+ width: {
75
+ type: [String, Number],
76
+ default: '800px'
77
+ }
78
+ })
79
+
80
+ const emit = defineEmits(['update:modelValue',"updateTable"])
81
+
82
+ const modelValue = computed({
83
+ get: () => props.modelValue,
84
+ set: (val) => emit('update:modelValue', val)
85
+ })
86
+ const exportBtnAllLoading = ref(false)
87
+ const exportBtnLoading = ref(false)
88
+ const sortColumns = ref([])
89
+ const columnsOptionList = ref([])
90
+ const modalLoading = ref(false)
91
+ const indeterminate = ref(false)
92
+ const checkAll = ref(false)
93
+ const checkAllGroup = ref([])
94
+ const tempCheckAllGroup=ref([])
95
+ const checkRequireGroup=ref([])
96
+ const dropSortColumns = ref([])
97
+ const freeze = ref('')
98
+ const tuoDrags = ref(null)
99
+ let route_path = ''
100
+ const route = useRoute()
101
+ if(route&&route.name)
102
+ {
103
+ route_path = route.name
104
+ }
105
+ const project = ref(JSON.parse(localStorage.getItem('selectedProject')))
106
+ const initColumns = (val: any[]) => {
107
+ checkAllGroup.value = []
108
+ sortColumns.value = []
109
+ checkRequireGroup.value=[]
110
+ tempCheckAllGroup.value=[]
111
+ const tempColumnsOptionList = []
112
+ val.forEach((item, index) => {
113
+ tempCheckAllGroup.value.push(item.label)
114
+ if (item.require) {
115
+ checkAllGroup.value.push(item.label)
116
+ checkRequireGroup.value.push(item.label)
117
+ }
118
+ tempColumnsOptionList.push({
119
+ label: '至第' + (index + 1) + '列',
120
+ value: index + 1
121
+ })
122
+ })
123
+ tempColumnsOptionList.push({
124
+ label: '不冻结',
125
+ value: '不冻结'
126
+ })
127
+ if (props.columnSetting.id) {
128
+ // console.log(props.columnSettingObj)
129
+ checkAllGroup.value = [...props.columnSetting.content.checkColumnData]
130
+ freeze.value = props.columnSetting.content.freeze
131
+ }else{ //没有列表设置数据默认全部显示
132
+ nextTick(()=>{
133
+ handleCheckAll('nodata')
134
+ });
135
+ }
136
+ columnsOptionList.value = tempColumnsOptionList
137
+ sortColumns.value = [...checkAllGroup.value]
138
+
139
+ if (checkAllGroup.value.length === val.length) {
140
+ checkAll.value = true
141
+ checkAllGroup.value = tempCheckAllGroup.value
142
+ indeterminate.value = false
143
+ } else if (checkAllGroup.value.length > 1) {
144
+ checkAll.value = false
145
+ indeterminate.value = true
146
+ } else {
147
+ checkAll.value = false
148
+ indeterminate.value = false
149
+ }
150
+ }
151
+
152
+ watch(
153
+ () => props.columnsList,
154
+ (val) => {
155
+ console.log('props.columnsList-watch',props.columnsList)
156
+ initColumns(val)
157
+ }
158
+ )
159
+
160
+ watch(
161
+ () => props.columnSetting,
162
+ (newVal) => {
163
+ if (newVal !== undefined) {
164
+ initColumns(props.columnsList)
165
+ }
166
+ },
167
+ { immediate: true }
168
+ )
169
+
170
+ onMounted(() => {
171
+ initColumns(props.columnsList)
172
+ console.log('props.columnsList',props.columnsList)
173
+ })
174
+
175
+ const handleCheckAll = (init) => {
176
+ if(checkAllGroup.value.length!=tempCheckAllGroup.value.length||init=='nodata'){ //全选
177
+ tempCheckAllGroup.value.map(item=>{
178
+ let status=sortColumns.value.some(sort=>{
179
+ return item==sort
180
+ })
181
+ if(!status){
182
+ sortColumns.value.push(item)
183
+ }
184
+ })
185
+ sortColumns.value=sortColumns.value.concat([])
186
+ checkAllGroup.value=tempCheckAllGroup.value
187
+ checkAllGroup.value=checkAllGroup.value.concat([])
188
+ checkAll.value=true
189
+ indeterminate.value=false
190
+ }else{ //取消全选
191
+ checkAllGroup.value=checkRequireGroup.value
192
+ checkAllGroup.value=checkAllGroup.value.concat([])
193
+ let sort=[]
194
+ sortColumns.value.map(item=>{
195
+ checkRequireGroup.value.map(require=>{
196
+ if(require==item){
197
+ sort.push(item)
198
+ }
199
+ })
200
+ })
201
+ sortColumns.value=sort
202
+ sortColumns.value= sortColumns.value.concat([])
203
+ if(checkRequireGroup.value.length==0){
204
+ indeterminate.value=false
205
+ checkAll.value=false
206
+ }else{
207
+ indeterminate.value=true
208
+ checkAll.value=false
209
+ }
210
+
211
+ }
212
+ }
213
+ const change_check = (item: any,event) => {
214
+ if(event){
215
+ sortColumns.value.push(item.label)
216
+ }else{
217
+ sortColumns.value.map((col,index)=>{
218
+ if(col==item.label){
219
+ sortColumns.value.splice(index,1)
220
+ }
221
+ })
222
+ }
223
+ sortColumns.value=sortColumns.value.concat([])
224
+ console.log(sortColumns.value,event,2222)
225
+ if (checkAllGroup.value.length === tempCheckAllGroup.value.length) { //判断全选按钮状态
226
+ indeterminate.value = false
227
+ checkAll.value = true
228
+ } else if (checkAllGroup.value.length > 0) {
229
+ indeterminate.value = true
230
+ checkAll.value = false
231
+ } else {
232
+ indeterminate.value = false
233
+ checkAll.value = false
234
+ }
235
+ }
236
+ // const checkAllGroupChange = (data: string[]) => {
237
+ // sortColumns.value= data
238
+ // console.log(sortColumns.value,1111)
239
+ // if (data.length === tempCheckAllGroup.value.length) {
240
+ // indeterminate.value = false
241
+ // checkAll.value = true
242
+ // } else if (data.length > 0) {
243
+ // indeterminate.value = true
244
+ // checkAll.value = false
245
+ // } else {
246
+ // indeterminate.value = false
247
+ // checkAll.value = false
248
+ // }
249
+ // }
250
+
251
+ const handleReset = () => {
252
+ modelValue.value = false
253
+ }
254
+
255
+ const updatesortColumns = (val: string[]) => {
256
+ dropSortColumns.value = val
257
+ console.log(dropSortColumns.value,'dropSortColumns.value')
258
+ }
259
+
260
+ const handleSubmit = async () => {
261
+
262
+ if (dropSortColumns.value .length === 0) {
263
+ message.warning('请选择')
264
+ return
265
+ }
266
+
267
+ exportBtnLoading.value = true
268
+ const obj = {
269
+ tag: route_path + '-table',
270
+ name: route_path,
271
+ content: JSON.stringify({checkColumnData: dropSortColumns.value,freeze: freeze.value}),
272
+ }
273
+
274
+ try {
275
+ if (props.columnSetting.id) {
276
+ const res = await UserQuery_update({ ...obj, id: props.columnSetting.id })
277
+ if (res.code === 200) {
278
+ modelValue.value = false
279
+ emit("updateTable")
280
+ // 需要实现父组件的handleGetUserQuery方法
281
+ } else {
282
+ message.error(res.msg)
283
+ }
284
+ } else {
285
+ const res = await UserQuery_save(obj)
286
+ if (res.code === 200) {
287
+ modelValue.value = false
288
+ emit("updateTable")
289
+ // 需要实现父组件的handleGetUserQuery方法
290
+ } else {
291
+ message.error(res.msg)
292
+ }
293
+ }
294
+ } finally {
295
+ exportBtnLoading.value = false
296
+ }
297
+ }
298
+ </script>
299
+
300
+ <style scoped>
301
+ .dialog-content {
302
+ padding: 20px;
303
+ }
304
+
305
+ .dialog-footer {
306
+ display: flex;
307
+ justify-content: flex-end;
308
+ gap: 10px;
309
+ }
310
+
311
+ /* :deep(.el-checkbox-group) {
312
+ display: flex;
313
+ flex-direction: column;
314
+ gap: 10px;
315
+ } */
316
+ .classTitle::before{
317
+ content: "*";
318
+ display: inline-block;
319
+ margin-right: 4px;
320
+ line-height: 1;
321
+ font-family: SimSun;
322
+ font-size: 12px;
323
+ color: #ed4014;
324
+ }
325
+ .classTitle{
326
+ display: flex;
327
+ justify-content: flex-start;
328
+ align-items: center;
329
+ font-family: PingFang SC;
330
+ font-weight: 400;
331
+ font-size: 15px;
332
+ color: #333;
333
+ }
334
+ .content {
335
+ display: flex;
336
+ justify-content: space-between;
337
+ padding: 20px;
338
+ }
339
+ .headerTitle{
340
+ font-weight: 500;
341
+ font-size: 16px;
342
+ color: #1D2027;
343
+ }
344
+ </style>
@@ -0,0 +1,197 @@
1
+ <template>
2
+ <div style="max-height: 300px;overflow-y: auto;">
3
+ <ul :id="random_id">
4
+ <li class="ele" style="width: 100%;" v-for="(item,index) in sortColumns" :draggable="true" :data-key="item">
5
+ <div class="ele_content" style="max-width: 150px;">
6
+ <img @dragstart.stop.prevent style="width: 8px;height: 15px;vertical-align: middle;margin-right: 5px;pointer-events: none" :src="tuozhui_icon"/>
7
+ <span title="拖动可调整顺序" :style="{verticalAlign:'middle',color:activeColumns.includes(item)?'#0072D6':'#333'}" style="vertical-align: middle;">{{item||'--'}}</span>
8
+ </div>
9
+ <img v-if="activeColumns.includes(item)" :src="bluckLock" style="width: 12px;height: 16px;"/>
10
+ </li>
11
+ </ul>
12
+ </div>
13
+ </template>
14
+
15
+ <script setup>
16
+ import { ref, computed, watch, onMounted } from 'vue'
17
+ import tuozhui_icon from '@/assets/images/tuozhui_icon.png'
18
+ import bluckLock from '@/assets/images/blue_lock.png'
19
+
20
+ const props = defineProps(['initialSortColumns', 'freeze'])
21
+ const emit = defineEmits(['updatesortColumns', 'updateCheckAllGroup',"stopDrag"])
22
+ const random_id=ref('drag_comp_'+(Math.random()+'').split(".")[1])
23
+ let node = ref(null)
24
+ let draging = ref(null)
25
+
26
+ const activeColumns = ref([])
27
+ const sortColumns = ref([...props.initialSortColumns])
28
+
29
+ const sortedColumns = computed(() => {
30
+ return sortColumns.value.map((item, index) => ({
31
+ key: item,
32
+ freezeStatus: props.freeze >= index + 1,
33
+ }))
34
+ })
35
+
36
+ watch(() => props.initialSortColumns, (newVal) => {
37
+ // console.log('newVal---', newVal)
38
+ sortColumns.value = [...newVal]
39
+ setTimeout(() => {
40
+ updateAction()
41
+ }, 1);
42
+ })
43
+
44
+ watch(() => props.freeze, () => {
45
+ updateAction()
46
+ })
47
+ const updateAction = () => {
48
+ // console.log('updateAction-----',getOrder())
49
+ emit('updatesortColumns', getOrder())
50
+ const tempActiveColumns = []
51
+ for(let i = 0; i < props.freeze; i++) {
52
+ tempActiveColumns.push(getOrder()[i])
53
+ }
54
+ activeColumns.value = tempActiveColumns
55
+ }
56
+
57
+ const handleDragEnd = () => {
58
+ console.log('执行----结束拖动')
59
+ emit("stopDrag",getOrder())
60
+ updateAction()
61
+ }
62
+
63
+ const getOrder = () => {
64
+ const items = document.querySelectorAll(`#${random_id.value} .ele`)
65
+ const order = Array.from(items).map(item => item.dataset.key)
66
+ // console.log("当前顺序: " + order)
67
+ return order
68
+ }
69
+
70
+ const _index = (el) => {
71
+ let index = 0
72
+ if (!el || !el.parentNode) return -1
73
+ while (el && (el = el.previousElementSibling)) {
74
+ index++
75
+ }
76
+ return index
77
+ }
78
+
79
+ const _css = (el, prop, val) => {
80
+ const style = el && el.style
81
+ if (style) {
82
+ if (val === void 0) {
83
+ if (document.defaultView && document.defaultView.getComputedStyle) {
84
+ val = document.defaultView.getComputedStyle(el, '')
85
+ } else if (el.currentStyle) {
86
+ val = el.currentStyle
87
+ }
88
+ return prop === void 0 ? val : val[prop]
89
+ } else {
90
+ if (!(prop in style)) {
91
+ prop = '-webkit-' + prop
92
+ }
93
+ style[prop] = val + (typeof val === 'string' ? '' : 'px')
94
+ }
95
+ }
96
+ }
97
+
98
+ const _animate = (prevRect, target) => {
99
+ const ms = 300
100
+ if (ms) {
101
+ const currentRect = target.getBoundingClientRect()
102
+ if (prevRect.nodeType === 1) {
103
+ prevRect = prevRect.getBoundingClientRect()
104
+ }
105
+ _css(target, 'transition', 'none')
106
+ _css(target, 'transform', 'translate3d(' +
107
+ (prevRect.left - currentRect.left) + 'px,' +
108
+ (prevRect.top - currentRect.top) + 'px,0)'
109
+ )
110
+ target.offsetWidth
111
+ _css(target, 'transition', 'all ' + ms + 'ms')
112
+ _css(target, 'transform', 'translate3d(0,0,0)')
113
+ clearTimeout(target.animated)
114
+ target.animated = setTimeout(() => {
115
+ _css(target, 'transition', '')
116
+ _css(target, 'transform', '')
117
+ target.animated = false
118
+ }, ms)
119
+ }
120
+ }
121
+
122
+ const updateFatherCheckAllGroupObj = () => {
123
+ // const orderList = getOrder()
124
+ console.log('updateFatherCheckAllGroupObj------')
125
+ emit('updateCheckAllGroup', getOrder())
126
+ }
127
+
128
+ onMounted(() => {
129
+ node.value = document.querySelector(`#${random_id.value}`)
130
+ node.value.ondragend = handleDragEnd
131
+
132
+ node.value.ondragstart = (event) => {
133
+ console.log("start")
134
+ event.dataTransfer.setData("te", event.target.innerText)
135
+ draging.value = event.target
136
+ }
137
+
138
+ node.value.ondragover = (event) => {
139
+ event.preventDefault()
140
+ let target = event.target
141
+ if (target.nodeName === "DIV") {
142
+ target = target.parentNode
143
+ }
144
+ if (target.nodeName === "LI" && target !== draging.value) {
145
+ const targetRect = target.getBoundingClientRect()
146
+ const dragingRect = draging.value.getBoundingClientRect()
147
+ if (target && target.animated) return
148
+
149
+ if (_index(draging.value) < _index(target)) {
150
+ target.parentNode.insertBefore(draging.value, target.nextSibling)
151
+ } else {
152
+ target.parentNode.insertBefore(draging.value, target)
153
+ }
154
+ _animate(dragingRect, draging.value)
155
+ _animate(targetRect, target)
156
+ }
157
+ }
158
+
159
+ node.value.ondrop = (event) => {
160
+ event.preventDefault()
161
+ event.stopPropagation()
162
+ console.log("drop",getOrder())
163
+
164
+ }
165
+
166
+ updateAction()
167
+ })
168
+ </script>
169
+
170
+ <style lang="less" scoped>
171
+ ::-webkit-scrollbar {
172
+ display: none;
173
+ }
174
+ .ele_content {
175
+ white-space: nowrap;
176
+ overflow: hidden;
177
+ text-overflow: ellipsis;
178
+ display: flex;
179
+ justify-content: flex-start;
180
+ align-items: center;
181
+ }
182
+ .ele{
183
+ cursor: pointer;
184
+ height: 30px;
185
+ line-height: 30px;
186
+ display: flex;
187
+ align-items: center;
188
+ justify-content: space-between;
189
+ }
190
+ .ele:hover{
191
+ background-color: #F7F8FB;
192
+ }
193
+ * {
194
+ list-style: none;
195
+ }
196
+
197
+ </style>