refactor(client): refactor admin/ads to use Composition API (#8649)
This commit is contained in:
		@@ -7,7 +7,7 @@
 | 
			
		||||
				<template #label>URL</template>
 | 
			
		||||
			</MkInput>
 | 
			
		||||
			<MkInput v-model="ad.imageUrl" class="_formBlock">
 | 
			
		||||
				<template #label>{{ $ts.imageUrl }}</template>
 | 
			
		||||
				<template #label>{{ i18n.ts.imageUrl }}</template>
 | 
			
		||||
			</MkInput>
 | 
			
		||||
			<FormRadios v-model="ad.place" class="_formBlock">
 | 
			
		||||
				<template #label>Form</template>
 | 
			
		||||
@@ -17,34 +17,34 @@
 | 
			
		||||
			</FormRadios>
 | 
			
		||||
			<!--
 | 
			
		||||
			<div style="margin: 32px 0;">
 | 
			
		||||
				{{ $ts.priority }}
 | 
			
		||||
				<MkRadio v-model="ad.priority" value="high">{{ $ts.high }}</MkRadio>
 | 
			
		||||
				<MkRadio v-model="ad.priority" value="middle">{{ $ts.middle }}</MkRadio>
 | 
			
		||||
				<MkRadio v-model="ad.priority" value="low">{{ $ts.low }}</MkRadio>
 | 
			
		||||
				{{ i18n.ts.priority }}
 | 
			
		||||
				<MkRadio v-model="ad.priority" value="high">{{ i18n.ts.high }}</MkRadio>
 | 
			
		||||
				<MkRadio v-model="ad.priority" value="middle">{{ i18n.ts.middle }}</MkRadio>
 | 
			
		||||
				<MkRadio v-model="ad.priority" value="low">{{ i18n.ts.low }}</MkRadio>
 | 
			
		||||
			</div>
 | 
			
		||||
			-->
 | 
			
		||||
			<FormSplit>
 | 
			
		||||
				<MkInput v-model="ad.ratio" type="number">
 | 
			
		||||
					<template #label>{{ $ts.ratio }}</template>
 | 
			
		||||
					<template #label>{{ i18n.ts.ratio }}</template>
 | 
			
		||||
				</MkInput>
 | 
			
		||||
				<MkInput v-model="ad.expiresAt" type="date">
 | 
			
		||||
					<template #label>{{ $ts.expiration }}</template>
 | 
			
		||||
					<template #label>{{ i18n.ts.expiration }}</template>
 | 
			
		||||
				</MkInput>
 | 
			
		||||
			</FormSplit>
 | 
			
		||||
			<MkTextarea v-model="ad.memo" class="_formBlock">
 | 
			
		||||
				<template #label>{{ $ts.memo }}</template>
 | 
			
		||||
				<template #label>{{ i18n.ts.memo }}</template>
 | 
			
		||||
			</MkTextarea>
 | 
			
		||||
			<div class="buttons _formBlock">
 | 
			
		||||
				<MkButton class="button" inline primary style="margin-right: 12px;" @click="save(ad)"><i class="fas fa-save"></i> {{ $ts.save }}</MkButton>
 | 
			
		||||
				<MkButton class="button" inline danger @click="remove(ad)"><i class="fas fa-trash-alt"></i> {{ $ts.remove }}</MkButton>
 | 
			
		||||
				<MkButton class="button" inline primary style="margin-right: 12px;" @click="save(ad)"><i class="fas fa-save"></i> {{ i18n.ts.save }}</MkButton>
 | 
			
		||||
				<MkButton class="button" inline danger @click="remove(ad)"><i class="fas fa-trash-alt"></i> {{ i18n.ts.remove }}</MkButton>
 | 
			
		||||
			</div>
 | 
			
		||||
		</div>
 | 
			
		||||
	</div>
 | 
			
		||||
</MkSpacer>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import { defineComponent } from 'vue';
 | 
			
		||||
<script lang="ts" setup>
 | 
			
		||||
import { } from 'vue';
 | 
			
		||||
import MkButton from '@/components/ui/button.vue';
 | 
			
		||||
import MkInput from '@/components/form/input.vue';
 | 
			
		||||
import MkTextarea from '@/components/form/textarea.vue';
 | 
			
		||||
@@ -52,81 +52,65 @@ import FormRadios from '@/components/form/radios.vue';
 | 
			
		||||
import FormSplit from '@/components/form/split.vue';
 | 
			
		||||
import * as os from '@/os';
 | 
			
		||||
import * as symbols from '@/symbols';
 | 
			
		||||
import { i18n } from '@/i18n';
 | 
			
		||||
 | 
			
		||||
export default defineComponent({
 | 
			
		||||
	components: {
 | 
			
		||||
		MkButton,
 | 
			
		||||
		MkInput,
 | 
			
		||||
		MkTextarea,
 | 
			
		||||
		FormRadios,
 | 
			
		||||
		FormSplit,
 | 
			
		||||
	},
 | 
			
		||||
let ads: any[] = $ref([]);
 | 
			
		||||
 | 
			
		||||
	emits: ['info'],
 | 
			
		||||
os.api('admin/ad/list').then(adsResponse => {
 | 
			
		||||
	ads = adsResponse;
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			[symbols.PAGE_INFO]: {
 | 
			
		||||
				title: this.$ts.ads,
 | 
			
		||||
				icon: 'fas fa-audio-description',
 | 
			
		||||
				bg: 'var(--bg)',
 | 
			
		||||
				actions: [{
 | 
			
		||||
					asFullButton: true,
 | 
			
		||||
					icon: 'fas fa-plus',
 | 
			
		||||
					text: this.$ts.add,
 | 
			
		||||
					handler: this.add,
 | 
			
		||||
				}],
 | 
			
		||||
			},
 | 
			
		||||
			ads: [],
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
function add() {
 | 
			
		||||
	ads.unshift({
 | 
			
		||||
		id: null,
 | 
			
		||||
		memo: '',
 | 
			
		||||
		place: 'square',
 | 
			
		||||
		priority: 'middle',
 | 
			
		||||
		ratio: 1,
 | 
			
		||||
		url: '',
 | 
			
		||||
		imageUrl: null,
 | 
			
		||||
		expiresAt: null,
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	created() {
 | 
			
		||||
		os.api('admin/ad/list').then(ads => {
 | 
			
		||||
			this.ads = ads;
 | 
			
		||||
function remove(ad) {
 | 
			
		||||
	os.confirm({
 | 
			
		||||
		type: 'warning',
 | 
			
		||||
		text: i18n.t('removeAreYouSure', { x: ad.url }),
 | 
			
		||||
	}).then(({ canceled }) => {
 | 
			
		||||
		if (canceled) return;
 | 
			
		||||
		ads = ads.filter(x => x !== ad);
 | 
			
		||||
		os.apiWithDialog('admin/ad/delete', {
 | 
			
		||||
			id: ad.id
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		add() {
 | 
			
		||||
			this.ads.unshift({
 | 
			
		||||
				id: null,
 | 
			
		||||
				memo: '',
 | 
			
		||||
				place: 'square',
 | 
			
		||||
				priority: 'middle',
 | 
			
		||||
				ratio: 1,
 | 
			
		||||
				url: '',
 | 
			
		||||
				imageUrl: null,
 | 
			
		||||
				expiresAt: null,
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
function save(ad) {
 | 
			
		||||
	if (ad.id == null) {
 | 
			
		||||
		os.apiWithDialog('admin/ad/create', {
 | 
			
		||||
			...ad,
 | 
			
		||||
			expiresAt: new Date(ad.expiresAt).getTime()
 | 
			
		||||
		});
 | 
			
		||||
	} else {
 | 
			
		||||
		os.apiWithDialog('admin/ad/update', {
 | 
			
		||||
			...ad,
 | 
			
		||||
			expiresAt: new Date(ad.expiresAt).getTime()
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		remove(ad) {
 | 
			
		||||
			os.confirm({
 | 
			
		||||
				type: 'warning',
 | 
			
		||||
				text: this.$t('removeAreYouSure', { x: ad.url }),
 | 
			
		||||
			}).then(({ canceled }) => {
 | 
			
		||||
				if (canceled) return;
 | 
			
		||||
				this.ads = this.ads.filter(x => x != ad);
 | 
			
		||||
				os.apiWithDialog('admin/ad/delete', {
 | 
			
		||||
					id: ad.id
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		save(ad) {
 | 
			
		||||
			if (ad.id == null) {
 | 
			
		||||
				os.apiWithDialog('admin/ad/create', {
 | 
			
		||||
					...ad,
 | 
			
		||||
					expiresAt: new Date(ad.expiresAt).getTime()
 | 
			
		||||
				});
 | 
			
		||||
			} else {
 | 
			
		||||
				os.apiWithDialog('admin/ad/update', {
 | 
			
		||||
					...ad,
 | 
			
		||||
					expiresAt: new Date(ad.expiresAt).getTime()
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
defineExpose({
 | 
			
		||||
	[symbols.PAGE_INFO]: {
 | 
			
		||||
		title: i18n.ts.ads,
 | 
			
		||||
		icon: 'fas fa-audio-description',
 | 
			
		||||
		bg: 'var(--bg)',
 | 
			
		||||
		actions: [{
 | 
			
		||||
			asFullButton: true,
 | 
			
		||||
			icon: 'fas fa-plus',
 | 
			
		||||
			text: i18n.ts.add,
 | 
			
		||||
			handler: add,
 | 
			
		||||
		}],
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user