Refactor emoji-edit-dialog to use Composition API (#8657)
* refactor(client): refactor emoji-edit-dialog to use Composition API * fix(client): fix editing emoji not updating emoji list * Apply review suggestions from @Johann150 Co-authored-by: Johann150 <johann@qwertqwefsday.eu> * fix(client): use cached category info instead of making a request * fix(client): use updateItem in emoji pagination when editing * fix(client): reimplement removeItem in MkPagination * Apply review suggestion from @Johann150 Co-authored-by: Johann150 <johann@qwertqwefsday.eu> Co-authored-by: Johann150 <johann@qwertqwefsday.eu>
This commit is contained in:
		
							parent
							
								
									39bd71e064
								
							
						
					
					
						commit
						d62a55b46f
					
				
					 3 changed files with 63 additions and 71 deletions
				
			
		| 
						 | 
				
			
			@ -244,6 +244,11 @@ const append = (item: Item): void => {
 | 
			
		|||
	items.value.push(item);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const removeItem = (finder: (item: Item) => boolean) => {
 | 
			
		||||
	const i = items.value.findIndex(finder);
 | 
			
		||||
	items.value.splice(i, 1);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const updateItem = (id: Item['id'], replacer: (old: Item) => Item): void => {
 | 
			
		||||
	const i = items.value.findIndex(item => item.id === id);
 | 
			
		||||
	items.value[i] = replacer(items.value[i]);
 | 
			
		||||
| 
						 | 
				
			
			@ -276,6 +281,7 @@ defineExpose({
 | 
			
		|||
	fetchMoreAhead,
 | 
			
		||||
	prepend,
 | 
			
		||||
	append,
 | 
			
		||||
	removeItem,
 | 
			
		||||
	updateItem,
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,85 +27,71 @@
 | 
			
		|||
</XModalWindow>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
import { defineComponent } from 'vue';
 | 
			
		||||
<script lang="ts" setup>
 | 
			
		||||
import { } from 'vue';
 | 
			
		||||
import XModalWindow from '@/components/ui/modal-window.vue';
 | 
			
		||||
import MkButton from '@/components/ui/button.vue';
 | 
			
		||||
import MkInput from '@/components/form/input.vue';
 | 
			
		||||
import * as os from '@/os';
 | 
			
		||||
import { unique } from '@/scripts/array';
 | 
			
		||||
import { i18n } from '@/i18n';
 | 
			
		||||
import { emojiCategories } from '@/instance';
 | 
			
		||||
 | 
			
		||||
export default defineComponent({
 | 
			
		||||
	components: {
 | 
			
		||||
		XModalWindow,
 | 
			
		||||
		MkButton,
 | 
			
		||||
		MkInput,
 | 
			
		||||
	},
 | 
			
		||||
const props = defineProps<{
 | 
			
		||||
	emoji: any,
 | 
			
		||||
}>();
 | 
			
		||||
 | 
			
		||||
	props: {
 | 
			
		||||
		emoji: {
 | 
			
		||||
			required: true,
 | 
			
		||||
let dialog = $ref(null);
 | 
			
		||||
let name: string = $ref(props.emoji.name);
 | 
			
		||||
let category: string = $ref(props.emoji.category);
 | 
			
		||||
let aliases: string = $ref(props.emoji.aliases.join(' '));
 | 
			
		||||
let categories: string[] = $ref(emojiCategories);
 | 
			
		||||
 | 
			
		||||
const emit = defineEmits<{
 | 
			
		||||
	(ev: 'done', v: { deleted?: boolean, updated?: any }): void,
 | 
			
		||||
	(ev: 'closed'): void
 | 
			
		||||
}>();
 | 
			
		||||
 | 
			
		||||
function ok() {
 | 
			
		||||
	update();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function update() {
 | 
			
		||||
	await os.apiWithDialog('admin/emoji/update', {
 | 
			
		||||
		id: props.emoji.id,
 | 
			
		||||
		name,
 | 
			
		||||
		category,
 | 
			
		||||
		aliases: aliases.split(' '),
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	emit('done', {
 | 
			
		||||
		updated: {
 | 
			
		||||
			id: props.emoji.id,
 | 
			
		||||
			name,
 | 
			
		||||
			category,
 | 
			
		||||
			aliases: aliases.split(' '),
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	emits: ['done', 'closed'],
 | 
			
		||||
	dialog.close();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
	data() {
 | 
			
		||||
		return {
 | 
			
		||||
			name: this.emoji.name,
 | 
			
		||||
			category: this.emoji.category,
 | 
			
		||||
			aliases: this.emoji.aliases?.join(' '),
 | 
			
		||||
			categories: [],
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
async function del() {
 | 
			
		||||
	const { canceled } = await os.confirm({
 | 
			
		||||
		type: 'warning',
 | 
			
		||||
		text: i18n.t('removeAreYouSure', { x: name }),
 | 
			
		||||
	});
 | 
			
		||||
	if (canceled) return;
 | 
			
		||||
 | 
			
		||||
	created() {
 | 
			
		||||
		os.api('meta', { detail: false }).then(({ emojis }) => {
 | 
			
		||||
			this.categories = unique(emojis.map((x: any) => x.category || '').filter((x: string) => x !== ''));
 | 
			
		||||
	os.api('admin/emoji/delete', {
 | 
			
		||||
		id: props.emoji.id
 | 
			
		||||
	}).then(() => {
 | 
			
		||||
		emit('done', {
 | 
			
		||||
			deleted: true
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
 | 
			
		||||
	methods: {
 | 
			
		||||
		ok() {
 | 
			
		||||
			this.update();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		async update() {
 | 
			
		||||
			await os.apiWithDialog('admin/emoji/update', {
 | 
			
		||||
				id: this.emoji.id,
 | 
			
		||||
				name: this.name,
 | 
			
		||||
				category: this.category,
 | 
			
		||||
				aliases: this.aliases.split(' '),
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			this.$emit('done', {
 | 
			
		||||
				updated: {
 | 
			
		||||
					name: this.name,
 | 
			
		||||
					category: this.category,
 | 
			
		||||
					aliases: this.aliases.split(' '),
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
			this.$refs.dialog.close();
 | 
			
		||||
		},
 | 
			
		||||
 | 
			
		||||
		async del() {
 | 
			
		||||
			const { canceled } = await os.confirm({
 | 
			
		||||
				type: 'warning',
 | 
			
		||||
				text: this.$t('removeAreYouSure', { x: this.emoji.name }),
 | 
			
		||||
			});
 | 
			
		||||
			if (canceled) return;
 | 
			
		||||
 | 
			
		||||
			os.api('admin/emoji/delete', {
 | 
			
		||||
				id: this.emoji.id
 | 
			
		||||
			}).then(() => {
 | 
			
		||||
				this.$emit('done', {
 | 
			
		||||
					deleted: true
 | 
			
		||||
				});
 | 
			
		||||
				this.$refs.dialog.close();
 | 
			
		||||
			});
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
		dialog.close();
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" scoped>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -135,12 +135,12 @@ const edit = (emoji) => {
 | 
			
		|||
	}, {
 | 
			
		||||
		done: result => {
 | 
			
		||||
			if (result.updated) {
 | 
			
		||||
				emojisPaginationComponent.value.replaceItem(item => item.id === emoji.id, {
 | 
			
		||||
					...emoji,
 | 
			
		||||
				emojisPaginationComponent.value.updateItem(result.updated.id, (oldEmoji: any) => ({
 | 
			
		||||
					...oldEmoji,
 | 
			
		||||
					...result.updated
 | 
			
		||||
				});
 | 
			
		||||
				}));
 | 
			
		||||
			} else if (result.deleted) {
 | 
			
		||||
				emojisPaginationComponent.value.removeItem(item => item.id === emoji.id);
 | 
			
		||||
				emojisPaginationComponent.value.removeItem((item) => item.id === emoji.id);
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
	}, 'closed');
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue