qtsk-vue3 0.0.13 → 0.0.15
Sign up to get free protection for your applications and to get access to all the features.
- package/package/component.js +9 -2
- package/package/components/Container/index.vue +1 -1
- package/package/components/Dialog/index.vue +2 -1
- package/package/components/Empty/index.vue +1 -1
- package/package/components/Input/index.vue +3 -2
- package/package/components/Menu/index.vue +1 -1
- package/package/components/SelectRemote/index.vue +76 -0
- package/package/components/TabPane/index.vue +21 -0
- package/package/components/Table/index.vue +54 -7
- package/package/components/Tabs/index.vue +18 -0
- package/package/components/Timeline/index.vue +59 -0
- package/package/index.backup.js +23 -22
- package/package/index.js +22 -22
- package/package.json +1 -1
package/package/component.js
CHANGED
@@ -13,7 +13,10 @@ import Dialog from './components/Dialog/index.vue'
|
|
13
13
|
import Form from './components/Form/index.vue'
|
14
14
|
import FormItem from './components/FormItem/index.vue'
|
15
15
|
import Empty from './components/Empty/index.vue'
|
16
|
-
|
16
|
+
import Tabs from './components/Tabs/index.vue'
|
17
|
+
import TabPane from './components/TabPane/index.vue'
|
18
|
+
import SelectRemote from './components/SelectRemote/index.vue'
|
19
|
+
import Timeline from './components/Timeline/index.vue'
|
17
20
|
const components =
|
18
21
|
[
|
19
22
|
CommonButton,
|
@@ -30,6 +33,10 @@ const components =
|
|
30
33
|
Dialog,
|
31
34
|
Form,
|
32
35
|
FormItem,
|
33
|
-
Empty
|
36
|
+
Empty,
|
37
|
+
Tabs,
|
38
|
+
TabPane,
|
39
|
+
SelectRemote,
|
40
|
+
Timeline
|
34
41
|
]
|
35
42
|
export default components
|
@@ -38,10 +38,11 @@ defineProps({
|
|
38
38
|
})
|
39
39
|
|
40
40
|
let modelValue = defineModel('modelValue', {type: Boolean})
|
41
|
-
let emits = defineEmits(['confirm'])
|
41
|
+
let emits = defineEmits(['confirm', 'cancel'])
|
42
42
|
// 点击取消
|
43
43
|
const handleCancel = () => {
|
44
44
|
modelValue.value = false
|
45
|
+
emits('cancel')
|
45
46
|
}
|
46
47
|
// 点击确认
|
47
48
|
const handleConfirm = () => {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
<template>
|
2
|
-
<ElInput :type="type" :placeholder="placeholder" v-model="inputValue" v-bind="$attrs" clearable>
|
2
|
+
<ElInput :type="type" :placeholder="placeholder" v-model="inputValue" v-bind="$attrs" clearable :disabled="disabled">
|
3
3
|
<template #prepend v-if="$slots.prepend">
|
4
4
|
<!-- 前缀 -->
|
5
5
|
<slot name="prepend" />
|
@@ -31,7 +31,8 @@ const props = defineProps({
|
|
31
31
|
modelValue: {
|
32
32
|
type: [String, Number],
|
33
33
|
default: ''
|
34
|
-
}
|
34
|
+
},
|
35
|
+
disabled: Boolean
|
35
36
|
})
|
36
37
|
const emits = defineEmits(['update:modelValue'])
|
37
38
|
const inputValue = computed({
|
@@ -2,7 +2,7 @@
|
|
2
2
|
<div class="menu">
|
3
3
|
<el-menu class="el-menu-vertical-demo" router :collapse="isCollapse" :default-active="activeMenu"
|
4
4
|
@open="handleOpen" @close="handleClose">
|
5
|
-
<el-menu-item :index="menu.url" v-for="(menu, index) in menus" :key="index">
|
5
|
+
<el-menu-item :index="menu.url" v-for="(menu, index) in menus.filter(item => item)" :key="index">
|
6
6
|
<Icons :type="menu.icon"></Icons>
|
7
7
|
<template #title>
|
8
8
|
<span>{{ menu.menuName }}</span>
|
@@ -0,0 +1,76 @@
|
|
1
|
+
<template>
|
2
|
+
<el-select
|
3
|
+
v-model="selectValue"
|
4
|
+
:placeholder="placeholder"
|
5
|
+
v-bind="$attrs"
|
6
|
+
:teleported="false"
|
7
|
+
:loading="loading"
|
8
|
+
clearable
|
9
|
+
filterable
|
10
|
+
remote
|
11
|
+
:remote-method="remoteMethod"
|
12
|
+
:no-data-text="'暂无数据项'"
|
13
|
+
:loading-text="'加载中'"
|
14
|
+
:no-match-text="'暂无匹配数据'"
|
15
|
+
>
|
16
|
+
<el-option v-for="item in list" :key="item[valueName]" :label="item[keyName]" :value="item[valueName]">
|
17
|
+
<div v-if="item.icon" style="display: flex;align-items: center;justify-content: space-between;">
|
18
|
+
<Icons :type="item.icon"/>
|
19
|
+
<span>{{ item.icon }}</span>
|
20
|
+
</div>
|
21
|
+
</el-option>
|
22
|
+
</el-select>
|
23
|
+
</template>
|
24
|
+
|
25
|
+
<script setup>
|
26
|
+
import { ref } from 'vue'
|
27
|
+
import { ElSelect, ElOption } from 'element-plus'
|
28
|
+
import '../../style/root.css'
|
29
|
+
|
30
|
+
const loading = ref(false)
|
31
|
+
|
32
|
+
defineOptions({
|
33
|
+
name: 'SelectRemote'
|
34
|
+
})
|
35
|
+
const props = defineProps({
|
36
|
+
placeholder: {
|
37
|
+
type: String,
|
38
|
+
default: '请选择'
|
39
|
+
},
|
40
|
+
keyName: {
|
41
|
+
type: String,
|
42
|
+
default: 'label'
|
43
|
+
},
|
44
|
+
valueName: {
|
45
|
+
type: String,
|
46
|
+
default: 'value'
|
47
|
+
},
|
48
|
+
remoteMethod: {
|
49
|
+
type: Function
|
50
|
+
},
|
51
|
+
list: {
|
52
|
+
type: Array,
|
53
|
+
default: () => ([])
|
54
|
+
}
|
55
|
+
})
|
56
|
+
const selectValue = defineModel('modelValue', { default: '', type: [Number, String, Array] })
|
57
|
+
const options = ref([])
|
58
|
+
const remoteMethod = (query) => {
|
59
|
+
if (query) {
|
60
|
+
props.remoteMethod(query)
|
61
|
+
selectValue.value = query
|
62
|
+
} else {
|
63
|
+
options.value = []
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
</script>
|
68
|
+
|
69
|
+
<style lang="less" scoped>
|
70
|
+
:deep(.el-select__wrapper.is-focused){
|
71
|
+
box-shadow: 0 0 0 1px var(--main-color) inset;
|
72
|
+
}
|
73
|
+
:deep(.el-select-dropdown__item.is-selected){
|
74
|
+
color: var(--main-color);
|
75
|
+
}
|
76
|
+
</style>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<template>
|
2
|
+
<el-tab-pane :label="label" :name="name">
|
3
|
+
<slot/>
|
4
|
+
</el-tab-pane>
|
5
|
+
</template>
|
6
|
+
|
7
|
+
<script setup>
|
8
|
+
import { ElTabPane } from 'element-plus'
|
9
|
+
|
10
|
+
defineOptions({
|
11
|
+
name: 'TabPane'
|
12
|
+
})
|
13
|
+
|
14
|
+
defineProps({
|
15
|
+
label: String,
|
16
|
+
name: String
|
17
|
+
})
|
18
|
+
</script>
|
19
|
+
|
20
|
+
<style lang="less" scoped>
|
21
|
+
</style>
|
@@ -1,6 +1,15 @@
|
|
1
1
|
<template>
|
2
2
|
<div>
|
3
|
-
<el-table
|
3
|
+
<el-table
|
4
|
+
ref="tableRef"
|
5
|
+
border
|
6
|
+
:data="data"
|
7
|
+
style="width: 100%"
|
8
|
+
:height="height"
|
9
|
+
:header-cell-style="{background:'#f2f4f7', color:'#606266',height: '60px'}"
|
10
|
+
@selection-change="handleSelectionChange"
|
11
|
+
>
|
12
|
+
<el-table-column v-if="checkbox" type="selection" width="55" :selectable="selectable"/>
|
4
13
|
<el-table-column
|
5
14
|
v-for="(column, index) in columns"
|
6
15
|
:label="column.label"
|
@@ -11,27 +20,33 @@
|
|
11
20
|
>
|
12
21
|
<template #default="scope">
|
13
22
|
<template v-if="column.key!=='operations'">
|
14
|
-
|
23
|
+
<template v-if="column?.click==true">
|
24
|
+
<slot name="click" :data="scope.row" :index="scope.$index"/>
|
25
|
+
</template>
|
26
|
+
<template v-else>
|
27
|
+
{{ (column?.text && column.text(scope.row[column.key])) || scope.row[column.key] }}
|
28
|
+
</template>
|
15
29
|
</template>
|
16
30
|
<template v-else>
|
17
31
|
<slot name="operations" :data="scope.row" :index="scope.$index"/>
|
18
32
|
</template>
|
19
33
|
</template>
|
20
34
|
</el-table-column>
|
21
|
-
<template #empty>
|
22
|
-
<el-empty description="暂无数据" />
|
23
|
-
</template>
|
24
35
|
</el-table>
|
36
|
+
<Empty v-if="emptyStatus" description="暂无数据" />
|
25
37
|
<slot v-if="data.length" name="pagination" />
|
26
38
|
</div>
|
27
39
|
</template>
|
28
40
|
|
29
41
|
<script setup>
|
30
|
-
import {
|
42
|
+
import { ref, watch } from 'vue'
|
43
|
+
import { ElTable, ElTableColumn } from 'element-plus'
|
44
|
+
|
31
45
|
defineOptions({
|
32
46
|
name: 'Table',
|
33
47
|
})
|
34
|
-
|
48
|
+
const emits = defineEmits('getSelection')
|
49
|
+
const props = defineProps({
|
35
50
|
data: {
|
36
51
|
type: Object,
|
37
52
|
default: () => ([])
|
@@ -43,9 +58,41 @@ defineProps({
|
|
43
58
|
columns: {
|
44
59
|
type: Array,
|
45
60
|
default: () => ([])
|
61
|
+
},
|
62
|
+
checkbox: {
|
63
|
+
type: Boolean,
|
64
|
+
default: false
|
65
|
+
},
|
66
|
+
selectable: {
|
67
|
+
type: Function
|
68
|
+
}
|
69
|
+
})
|
70
|
+
const tableRef = ref(null)
|
71
|
+
const emptyStatus = ref(false)
|
72
|
+
const multipleSelection = ref([])
|
73
|
+
watch(() => props.data, (nv) => {
|
74
|
+
if (!nv.length) {
|
75
|
+
emptyStatus.value = true
|
76
|
+
} else {
|
77
|
+
emptyStatus.value = false
|
78
|
+
}
|
79
|
+
})
|
80
|
+
const handleSelectionChange = (list) => {
|
81
|
+
multipleSelection.value = [];
|
82
|
+
if (list.length > 1) {
|
83
|
+
tableRef.value.clearSelection();
|
84
|
+
tableRef.value.toggleRowSelection(list[list.length - 1]);
|
46
85
|
}
|
86
|
+
multipleSelection.value = [list[list.length - 1]];
|
87
|
+
}
|
88
|
+
defineExpose({
|
89
|
+
selection: multipleSelection,
|
90
|
+
clearSelection: () => { tableRef.value.clearSelection() }
|
47
91
|
})
|
48
92
|
</script>
|
49
93
|
|
50
94
|
<style lang="less" scoped>
|
95
|
+
:deep(.el-table__row){
|
96
|
+
height: 57px;
|
97
|
+
}
|
51
98
|
</style>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<template>
|
2
|
+
<el-tabs v-model="activeName" type="border-card" class="demo-tabs">
|
3
|
+
<slot/>
|
4
|
+
</el-tabs>
|
5
|
+
</template>
|
6
|
+
|
7
|
+
<script setup>
|
8
|
+
import { ElTabs } from 'element-plus'
|
9
|
+
import '../../style/root.css'
|
10
|
+
|
11
|
+
defineOptions({
|
12
|
+
name: 'Tabs'
|
13
|
+
})
|
14
|
+
const activeName = defineModel('activeName', {type: String})
|
15
|
+
</script>
|
16
|
+
|
17
|
+
<style lang="less" scoped>
|
18
|
+
</style>
|
@@ -0,0 +1,59 @@
|
|
1
|
+
<template>
|
2
|
+
<div class="normalClass">
|
3
|
+
<el-timeline style="max-width: 600px">
|
4
|
+
<el-timeline-item
|
5
|
+
v-for="(activity, index) in activities"
|
6
|
+
:key="index"
|
7
|
+
:timestamp="activity[timeKey]"
|
8
|
+
:color="activity.color"
|
9
|
+
>
|
10
|
+
<div class="content">{{ activity[contentKey] }}</div>
|
11
|
+
<div class="address">{{ activity[addressKey] }}</div>
|
12
|
+
</el-timeline-item>
|
13
|
+
</el-timeline>
|
14
|
+
</div>
|
15
|
+
</template>
|
16
|
+
|
17
|
+
<script setup>
|
18
|
+
import { ElTimeline, ElTimelineItem} from 'element-plus'
|
19
|
+
|
20
|
+
defineOptions({
|
21
|
+
name: 'Timeline'
|
22
|
+
})
|
23
|
+
|
24
|
+
defineProps({
|
25
|
+
activities: {
|
26
|
+
type: Array,
|
27
|
+
default: () => ([])
|
28
|
+
},
|
29
|
+
timeKey: {
|
30
|
+
type: String,
|
31
|
+
default: 'timestamp'
|
32
|
+
},
|
33
|
+
contentKey: {
|
34
|
+
type: String,
|
35
|
+
default: 'content'
|
36
|
+
},
|
37
|
+
addressKey: {
|
38
|
+
type: String,
|
39
|
+
default: 'address'
|
40
|
+
}
|
41
|
+
})
|
42
|
+
</script>
|
43
|
+
|
44
|
+
<style lang="less" scoped>
|
45
|
+
.normalClass {
|
46
|
+
margin: 0 10px;
|
47
|
+
.content {
|
48
|
+
font-size: 14px;
|
49
|
+
font-weight: bolder;
|
50
|
+
}
|
51
|
+
.address {
|
52
|
+
color: #909399;
|
53
|
+
margin-top: 5px;
|
54
|
+
}
|
55
|
+
}
|
56
|
+
:deep(.el-timeline-item__timestamp) {
|
57
|
+
font-size: 12px;
|
58
|
+
}
|
59
|
+
</style>
|
package/package/index.backup.js
CHANGED
@@ -1,22 +1,23 @@
|
|
1
|
-
import Components from './component'
|
2
|
-
import { Message, MessageBox } from './components/Message'
|
3
|
-
|
4
|
-
const makeInstaller = (components = [], directives = []) => {
|
5
|
-
const apps = []
|
6
|
-
const install = (app, opts) => {
|
7
|
-
const option = opts
|
8
|
-
if (apps.includes(app)) return
|
9
|
-
apps.push(app)
|
10
|
-
components.forEach((c) => {
|
11
|
-
app.component(c.name, c)
|
12
|
-
})
|
13
|
-
app.config.globalProperties.$ELEMENT = option
|
14
|
-
}
|
15
|
-
return install
|
16
|
-
}
|
17
|
-
|
18
|
-
const install = makeInstaller(Components)
|
19
|
-
|
20
|
-
export { Message, MessageBox, install, install as default }
|
21
|
-
|
22
|
-
console.info('%c====== Editing in local package ======', 'font-size:16px;color:pink;')
|
1
|
+
import Components from './component'
|
2
|
+
import { Message, MessageBox } from './components/Message'
|
3
|
+
|
4
|
+
const makeInstaller = (components = [], directives = []) => {
|
5
|
+
const apps = []
|
6
|
+
const install = (app, opts) => {
|
7
|
+
const option = opts
|
8
|
+
if (apps.includes(app)) return
|
9
|
+
apps.push(app)
|
10
|
+
components.forEach((c) => {
|
11
|
+
app.component(c.name, c)
|
12
|
+
})
|
13
|
+
app.config.globalProperties.$ELEMENT = option
|
14
|
+
}
|
15
|
+
return install
|
16
|
+
}
|
17
|
+
|
18
|
+
const install = makeInstaller(Components)
|
19
|
+
|
20
|
+
export { Message, MessageBox, install, install as default }
|
21
|
+
|
22
|
+
console.info('%c====== Editing in local package ======', 'font-size:16px;color:pink;')
|
23
|
+
|
package/package/index.js
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
import Components from './component'
|
2
|
-
import { Message, MessageBox } from './components/Message'
|
3
|
-
|
4
|
-
const makeInstaller = (components = [], directives = []) => {
|
5
|
-
const apps = []
|
6
|
-
const install = (app, opts) => {
|
7
|
-
const option = opts
|
8
|
-
if (apps.includes(app)) return
|
9
|
-
apps.push(app)
|
10
|
-
components.forEach((c) => {
|
11
|
-
app.component(c.name, c)
|
12
|
-
})
|
13
|
-
app.config.globalProperties.$ELEMENT = option
|
14
|
-
}
|
15
|
-
return install
|
16
|
-
}
|
17
|
-
|
18
|
-
const install = makeInstaller(Components)
|
19
|
-
|
20
|
-
export { Message, MessageBox, install, install as default }
|
21
|
-
|
22
|
-
console.info('%c====== Editing in local package ======', 'font-size:16px;color:pink;')
|
1
|
+
import Components from './component'
|
2
|
+
import { Message, MessageBox } from './components/Message'
|
3
|
+
|
4
|
+
const makeInstaller = (components = [], directives = []) => {
|
5
|
+
const apps = []
|
6
|
+
const install = (app, opts) => {
|
7
|
+
const option = opts
|
8
|
+
if (apps.includes(app)) return
|
9
|
+
apps.push(app)
|
10
|
+
components.forEach((c) => {
|
11
|
+
app.component(c.name, c)
|
12
|
+
})
|
13
|
+
app.config.globalProperties.$ELEMENT = option
|
14
|
+
}
|
15
|
+
return install
|
16
|
+
}
|
17
|
+
|
18
|
+
const install = makeInstaller(Components)
|
19
|
+
|
20
|
+
export { Message, MessageBox, install, install as default }
|
21
|
+
|
22
|
+
console.info('%c====== Editing in local package ======', 'font-size:16px;color:pink;')
|