1- import { computed , defineComponent , PropType } from "vue" ;
2- import { DataTableColumns , NButton , NDataTable , NFlex } from "naive-ui" ;
3- import { addVersionList , genreList , musicList , musicListAll , version } from "@/store/refs" ;
1+ import { computed , defineComponent , PropType , reactive , ref } from "vue" ;
2+ import { DataTableBaseColumn , DataTableColumns , NButton , NDataTable , NFlex , NInput } from "naive-ui" ;
3+ import { addVersionList , genreList , musicList , musicListAll , selectedADir , selectMusicId , version } from "@/store/refs" ;
44import { MusicXmlWithABJacket } from "@/client/apiGen" ;
55import JacketBox from "@/components/JacketBox" ;
66import { GenreOption } from "@/components/GenreInput" ;
77import { LEVEL_COLOR , LEVELS } from "@/consts" ;
88import _ from "lodash" ;
9+ import { watchDebounced } from "@vueuse/core" ;
910
1011export default defineComponent ( {
1112 props : {
1213 selectedMusicIds : Array as PropType < MusicXmlWithABJacket [ ] > ,
13- continue : { type : Function , required : true } ,
14+ continue : { type : Function , required : true } ,
15+ cancel : { type : Function , required : true } ,
1416 } ,
15- setup ( props , { emit} ) {
17+ setup ( props , { emit } ) {
18+ const filter = ref ( '' )
19+ const nameColumn = reactive ( {
20+ title : '标题' , key : 'name' ,
21+ filterOptionValue : null as string | null ,
22+ filter : ( value , row ) => {
23+ if ( ! value ) return true ;
24+ value = value . toString ( ) . toLowerCase ( ) ;
25+ return row . name ! . toLowerCase ( ) . includes ( value ) || row . artist ! . toLowerCase ( ) . includes ( value ) || row . charts ! . some ( chart => chart . designer ?. toLowerCase ( ) . includes ( value ) ) ;
26+ }
27+ } satisfies DataTableBaseColumn < MusicXmlWithABJacket > )
1628 const columns = computed ( ( ) => [
17- { type : 'selection' } ,
18- { title : '资源目录' , key : 'assetDir' , width : '8em' , filter : "default" , filterOptions : _ . uniq ( musicListAll . value . map ( it => it . assetDir ! ) ) . map ( it => ( { label : it , value : it } ) ) } ,
29+ { type : 'selection' } ,
30+ { title : '资源目录' , key : 'assetDir' , width : '8em' , filter : "default" , filterOptions : _ . uniq ( musicListAll . value . map ( it => it . assetDir ! ) ) . map ( it => ( { label : it , value : it } ) ) } ,
1931 {
2032 title : 'ID' ,
2133 key : 'id' ,
2234 width : '7em' ,
2335 sorter : 'default' ,
24- filterOptions : [ '标准' , 'DX' , '宴会场' ] . map ( it => ( { label : it , value : it } ) ) ,
36+ filterOptions : [ '标准' , 'DX' , '宴会场' ] . map ( it => ( { label : it , value : it } ) ) ,
2537 filter : ( value , row ) => {
2638 switch ( value ) {
2739 case '标准' :
@@ -41,13 +53,13 @@ export default defineComponent({
4153 render : ( row ) => < JacketBox info = { row } upload = { false } class = "h-20" /> ,
4254 width : '8rem'
4355 } ,
44- { title : '标题' , key : 'name' } ,
56+ nameColumn ,
4557 {
4658 title : '版本' ,
4759 key : 'version' ,
4860 width : '8em' ,
4961 sorter : 'default' ,
50- filterOptions : [ 'B35' , 'B15' ] . map ( it => ( { label : it , value : it } ) ) ,
62+ filterOptions : [ 'B35' , 'B15' ] . map ( it => ( { label : it , value : it } ) ) ,
5163 filter : ( value , row ) => {
5264 const type = row . version ! < 20000 + version . value ! . gameVersion ! * 100 ? 'B35' : 'B15' ;
5365 return value === type ;
@@ -58,30 +70,50 @@ export default defineComponent({
5870 key : 'addVersionId' ,
5971 render : ( row ) => < GenreOption genre = { addVersionList . value . find ( it => it . id === row . addVersionId ) } /> ,
6072 filter : "default" ,
61- filterOptions : addVersionList . value . map ( it => ( { label : it . genreName ! , value : it . id ! } ) )
73+ filterOptions : addVersionList . value . map ( it => ( { label : it . genreName ! , value : it . id ! } ) )
6274 } ,
6375 {
6476 title : '流派' ,
6577 key : 'genreId' ,
6678 render : ( row ) => < GenreOption genre = { genreList . value . find ( it => it . id === row . genreId ) } /> ,
6779 filter : "default" ,
68- filterOptions : genreList . value . map ( it => ( { label : it . genreName ! , value : it . id ! } ) )
80+ filterOptions : genreList . value . map ( it => ( { label : it . genreName ! , value : it . id ! } ) )
6981 } ,
7082 {
7183 title : '谱面' ,
7284 key : 'charts' ,
7385 render : ( row ) => < NFlex class = "pt-1 text-sm" size = "small" >
7486 {
7587 ( row . charts || [ ] ) . map ( ( chart , index ) =>
76- chart . enable && < div key = { index } class = "c-white rounded-full px-2" style = { { backgroundColor : LEVEL_COLOR [ index ! ] } } > { LEVELS [ chart . levelId ! ] } </ div > )
88+ chart . enable && < div key = { index } class = "c-white rounded-full px-2" style = { { backgroundColor : LEVEL_COLOR [ index ! ] } } > { LEVELS [ chart . levelId ! ] } </ div > )
7789 }
7890 </ NFlex > ,
7991 width : '20em' ,
80- filterOptions : [ '绿' , '黄' , '红' , '紫' , '白' ] . map ( ( label , value ) => ( { label, value} ) ) ,
92+ filterOptions : [ '绿' , '黄' , '红' , '紫' , '白' ] . map ( ( label , value ) => ( { label, value } ) ) ,
8193 filter : ( value , row ) => row . charts ! [ value as number ] . enable !
8294 } ,
95+ {
96+ title : '跳转' ,
97+ key : 'jump' ,
98+ width : '5em' ,
99+ render : ( row ) => < NButton quaternary class = "p-2" onClick = { ( ) => {
100+ selectedADir . value = row . assetDir ! ;
101+ selectMusicId . value = row . id ! ;
102+ props . cancel ( ) ;
103+ } } >
104+ < span class = "i-tabler:external-link c-neutral-5" />
105+ </ NButton > ,
106+ } ,
83107 ] satisfies DataTableColumns < MusicXmlWithABJacket > )
84108
109+ watchDebounced (
110+ filter ,
111+ ( ) => {
112+ nameColumn . filterOptionValue = filter . value
113+ } ,
114+ { debounce : 200 } ,
115+ )
116+
85117 const selectedMusicIds = computed < string [ ] > ( {
86118 get : ( ) => props . selectedMusicIds ! . map ( it => `${ it . assetDir } :${ it . id } ` ) ,
87119 set : ( value ) => emit ( 'update:selectedMusicIds' , value . map ( it => {
@@ -96,6 +128,7 @@ export default defineComponent({
96128 { /* emit('update:selectedMusicIds', musicListAll.value.filter(it => !props.selectedMusicIds!.includes(it)));*/ }
97129 { /* }}>反选</NButton>*/ }
98130 { /*</NFlex>*/ }
131+ < NInput placeholder = "搜索" v-model :value = { filter . value } />
99132 < NDataTable
100133 columns = { columns . value }
101134 data = { musicListAll . value }
0 commit comments