1111 class =" mt-5 pt-5 border-t border-zinc-700 prose prose-invert prose-blue"
1212 ></div >
1313 </div >
14- <div >
14+ <div class = " space-y-8 " >
1515 <div class =" px-4 py-3 bg-gray-950 rounded" >
1616 <div class =" border-b border-zinc-800 pb-3" >
1717 <div
18- class =" -ml-4 -mt-2 flex flex-wrap items-center justify-between sm:flex-nowrap"
18+ class =" flex flex-wrap items-center justify-between sm:flex-nowrap"
1919 >
20- <div class =" ml-4 mt-2" >
21- <h3
22- class =" text-base font-semibold font-display leading-6 text-zinc-100"
23- >
24- Images
25- </h3 >
26- </div >
27- <div class =" ml-4 mt-2 flex-shrink-0" >
20+ <h3
21+ class =" text-base font-semibold font-display leading-6 text-zinc-100"
22+ >
23+ Images
24+ </h3 >
25+ <div class =" flex-shrink-0" >
2826 <button
2927 @click =" () => (showUploadModal = true)"
3028 type =" button"
9088 </div >
9189 </div >
9290 </div >
91+ <div class =" py-5 px-6 bg-gray-950 rounded" >
92+ <h1 class =" text-2xl font-semibold font-display text-zinc-100" >
93+ Manage version order
94+ </h1 >
95+ <div class =" text-center w-full text-sm text-zinc-600" >lowest</div >
96+ <draggable
97+ @update =" () => updateVersionOrder()"
98+ :list =" game.versions"
99+ handle =" .handle"
100+ class =" mt-2 space-y-4"
101+ >
102+ <template #item =" { element: item }: { element: GameVersion } " >
103+ <div
104+ class =" w-full inline-flex items-center px-4 py-2 bg-zinc-900 rounded justify-between"
105+ >
106+ <div class =" text-zinc-100 font-semibold" >
107+ {{ item.versionName }}
108+ </div >
109+ <div class =" text-zinc-400" >
110+ {{ item.delta ? "Upgrade mode" : "" }}
111+ </div >
112+ <div class =" inline-flex gap-x-2" >
113+ <Bars3Icon class =" cursor-move w-6 h-6 text-zinc-400 handle" />
114+ <button @click =" () => deleteVersion(item.versionName)" >
115+ <TrashIcon class =" w-5 h-5 text-red-600" />
116+ </button >
117+ </div >
118+ </div >
119+ </template >
120+ </draggable >
121+ <div class =" mt-2 text-center w-full text-sm text-zinc-600" >highest</div >
122+ <span class =" text-zinc-100" >{{ game.versions }}</span >
123+ </div >
93124 </div >
94125 </div >
95126 <UploadFileDialog
102133</template >
103134
104135<script setup lang="ts">
105- import type { Game } from " @prisma/client" ;
136+ import { Bars3Icon , TrashIcon } from " @heroicons/vue/16/solid" ;
137+ import type { Game , GameVersion } from " @prisma/client" ;
106138import markdownit from " markdown-it" ;
107139import UploadFileDialog from " ~/components/UploadFileDialog.vue" ;
108140
@@ -116,9 +148,12 @@ const route = useRoute();
116148const gameId = route .params .id .toString ();
117149const headers = useRequestHeaders ([" cookie" ]);
118150const game = ref (
119- await $fetch <Game >(` /api/v1/admin/game?id=${encodeURIComponent (gameId )} ` , {
120- headers ,
121- })
151+ await $fetch (
152+ ` /api/v1/admin/game?id=${encodeURIComponent (gameId )} ` ,
153+ {
154+ headers ,
155+ }
156+ )
122157);
123158
124159const md = markdownit ();
@@ -167,4 +202,29 @@ async function uploadAfterImageUpload(result: Game) {
167202 if (! game .value ) return ;
168203 game .value .mImageLibrary = result .mImageLibrary ;
169204}
205+
206+ async function deleteVersion(versionName : string ) {
207+ await $fetch (" /api/v1/admin/game/version" , {
208+ method: " DELETE" ,
209+ body: {
210+ id: gameId ,
211+ versionName: versionName ,
212+ },
213+ });
214+ game .value .versions .splice (
215+ game .value .versions .findIndex ((e ) => e .versionName === versionName ),
216+ 1
217+ );
218+ }
219+
220+ async function updateVersionOrder() {
221+ const newVersions = await $fetch (" /api/v1/admin/game/version" , {
222+ method: " POST" ,
223+ body: {
224+ id: gameId ,
225+ versions: game .value .versions .map ((e ) => e .versionName ),
226+ },
227+ });
228+ game .value .versions = newVersions ;
229+ }
170230 </script >
0 commit comments