Optimize deleting element from array

This commit is contained in:
Pig Fang 2018-08-20 22:19:05 +08:00
parent da8ac77ace
commit dd2f2030da
12 changed files with 33 additions and 33 deletions

View File

@ -239,7 +239,7 @@ export default {
toastr.warning(msg);
}
},
async deletePlayer(player) {
async deletePlayer({ pid, originalIndex }) {
const { dismiss } = await swal({
text: this.$t('admin.deletePlayerNotice'),
type: 'warning',
@ -251,10 +251,10 @@ export default {
const { errno, msg } = await this.$http.post(
'/admin/players?action=delete',
{ pid: player.pid }
{ pid }
);
if (errno === 0) {
this.players = this.players.filter(({ pid }) => pid !== player.pid);
this.$delete(this.players, originalIndex);
toastr.success(msg);
} else {
toastr.warning(msg);

View File

@ -182,7 +182,7 @@ export default {
swal({ type: 'warning', text: msg });
}
},
async deletePlugin({ name }) {
async deletePlugin({ name, originalIndex }) {
const { dismiss } = await swal({
text: this.$t('admin.confirmDeletion'),
type: 'warning',
@ -197,8 +197,8 @@ export default {
{ action: 'delete', name }
);
if (errno === 0) {
this.$delete(this.plugins, originalIndex);
toastr.success(msg);
this.plugins = this.plugins.filter(plugin => plugin.name !== name);
} else {
swal({ type: 'warning', text: msg });
}

View File

@ -288,7 +288,7 @@ export default {
toastr.warning(msg);
}
},
async deleteUser(user) {
async deleteUser({ uid, originalIndex }) {
const { dismiss } = await swal({
text: this.$t('admin.deleteUserNotice'),
type: 'warning',
@ -300,10 +300,10 @@ export default {
const { errno, msg } = await this.$http.post(
'/admin/users?action=delete',
{ uid: user.uid }
{ uid }
);
if (errno === 0) {
this.users = this.users.filter(({ uid }) => uid !== user.uid);
this.$delete(this.users, originalIndex);
toastr.success(msg);
} else {
toastr.warning(msg);

View File

@ -55,14 +55,14 @@
</div>
<div v-else>
<closet-item
v-for="item in skinItems"
v-for="(item, index) in skinItems"
:key="item.tid"
:tid="item.tid"
:name="item.name"
:type="item.type"
:selected="selectedSkin === item.tid"
@select="selectTexture(item.tid)"
@item-removed="removeSkinItem"
@item-removed="removeSkinItem(index)"
></closet-item>
</div>
</div>
@ -78,14 +78,14 @@
</div>
<div v-else>
<closet-item
v-for="item in capeItems"
v-for="(item, index) in capeItems"
:key="item.tid"
:tid="item.tid"
:name="item.name"
:type="item.type"
:selected="selectedCape === item.tid"
@select="selectTexture(item.tid)"
@item-removed="removeCapeItem"
@item-removed="removeCapeItem(index)"
></closet-item>
</div>
</div>
@ -251,11 +251,11 @@ export default {
this[`${category}TotalPages`] = total_pages;
this[`${category}Items`] = items;
},
removeSkinItem(tid) {
this.skinItems = this.skinItems.filter(item => item.tid !== tid);
removeSkinItem(index) {
this.$delete(this.skinItems, index);
},
removeCapeItem(tid) {
this.capeItems = this.capeItems.filter(item => item.tid !== tid);
removeCapeItem(index) {
this.$delete(this.capeItems, index);
},
switchCategory() {
this.category = this.category === 'skin' ? 'cape' : 'skin';

View File

@ -107,7 +107,7 @@ export default {
);
if (errno === 0) {
this.$emit('item-removed', this.tid);
this.$emit('item-removed');
swal({ type: 'success', text: msg });
} else {
toastr.warning(msg);

View File

@ -25,7 +25,7 @@
<tbody>
<tr
v-for="player in players"
v-for="(player, index) in players"
:key="player.pid"
class="player"
:class="{ 'player-selected': player.pid === selected }"
@ -56,7 +56,7 @@
></a>
<a
class="btn btn-danger btn-sm"
@click="deletePlayer(player)"
@click="deletePlayer(player, index)"
v-t="'user.player.delete-player'"
></a>
</td>
@ -389,7 +389,7 @@ export default {
swal({ type: 'warning', text: msg });
}
},
async deletePlayer(player) {
async deletePlayer(player, index) {
const { dismiss } = await swal({
title: this.$t('user.deletePlayer'),
text: this.$t('user.deletePlayerNotice'),
@ -407,8 +407,8 @@ export default {
{ pid: player.pid }
);
if (errno === 0) {
this.$delete(this.players, index);
swal({ type: 'success', text: msg });
this.players = this.players.filter(({ pid }) => pid !== player.pid);
} else {
swal({ type: 'warning', text: msg });
}

View File

@ -191,5 +191,5 @@ test('delete player', async () => {
button.trigger('click');
await flushPromises();
expect(wrapper.vm.players).toHaveLength(0);
expect(wrapper.text()).toContain('No data');
});

View File

@ -99,6 +99,7 @@ test('disable plugin', async () => {
button.trigger('click');
await flushPromises();
expect(toastr.success).toBeCalledWith('0');
expect(wrapper.text()).toContain('admin.enablePlugin');
});
test('delete plugin', async () => {
@ -134,5 +135,5 @@ test('delete plugin', async () => {
button.trigger('click');
await flushPromises();
expect(toastr.success).toBeCalledWith('0');
expect(wrapper.text()).toContain('No data');
});

View File

@ -529,5 +529,5 @@ test('delete user', async () => {
button.trigger('click');
await flushPromises();
expect(wrapper.vm.users).toHaveLength(0);
expect(wrapper.text()).toContain('No data');
});

View File

@ -135,17 +135,17 @@ test('reload closet when page changed', () => {
test('remove skin item', () => {
Vue.prototype.$http.get.mockResolvedValue({});
const wrapper = mount(Closet);
wrapper.setData({ skinItems: [{ tid: 1 }, { tid: 2 }] });
wrapper.vm.removeSkinItem(1);
expect(wrapper.findAll(ClosetItem)).toHaveLength(1);
wrapper.setData({ skinItems: [{ tid: 1 }] });
wrapper.vm.removeSkinItem(0);
expect(wrapper.find('#skin-category').text()).toContain('user.emptyClosetMsg');
});
test('remove cape item', () => {
Vue.prototype.$http.get.mockResolvedValue({});
const wrapper = mount(Closet);
wrapper.setData({ capeItems: [{ tid: 1 }, { tid: 2 }], category: 'cape' });
wrapper.vm.removeCapeItem(1);
expect(wrapper.findAll(ClosetItem)).toHaveLength(1);
wrapper.setData({ capeItems: [{ tid: 1 }], category: 'cape' });
wrapper.vm.removeCapeItem(0);
expect(wrapper.find('#cape-category').text()).toContain('user.emptyClosetMsg');
});
test('compute avatar URL', () => {

View File

@ -86,7 +86,7 @@ test('remove texture', async () => {
button.trigger('click');
await flushPromises();
expect(wrapper.emitted()['item-removed'][0][0]).toBe(1);
expect(wrapper.emitted()['item-removed']).toBeTruthy();
expect(Vue.prototype.$http.post).toBeCalledWith('/user/closet/remove', { tid: 1 });
});

View File

@ -159,8 +159,7 @@ test('delete player', async () => {
expect(wrapper.text()).toContain('to-be-deleted');
button.trigger('click');
await flushPromises(); // Finish HTTP request
await wrapper.vm.$nextTick(); // Update DOM
await flushPromises();
expect(wrapper.text()).not.toContain('to-be-deleted');
});