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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -191,5 +191,5 @@ test('delete player', async () => {
button.trigger('click'); button.trigger('click');
await flushPromises(); 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'); button.trigger('click');
await flushPromises(); await flushPromises();
expect(toastr.success).toBeCalledWith('0'); expect(toastr.success).toBeCalledWith('0');
expect(wrapper.text()).toContain('admin.enablePlugin');
}); });
test('delete plugin', async () => { test('delete plugin', async () => {
@ -134,5 +135,5 @@ test('delete plugin', async () => {
button.trigger('click'); button.trigger('click');
await flushPromises(); 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'); button.trigger('click');
await flushPromises(); 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', () => { test('remove skin item', () => {
Vue.prototype.$http.get.mockResolvedValue({}); Vue.prototype.$http.get.mockResolvedValue({});
const wrapper = mount(Closet); const wrapper = mount(Closet);
wrapper.setData({ skinItems: [{ tid: 1 }, { tid: 2 }] }); wrapper.setData({ skinItems: [{ tid: 1 }] });
wrapper.vm.removeSkinItem(1); wrapper.vm.removeSkinItem(0);
expect(wrapper.findAll(ClosetItem)).toHaveLength(1); expect(wrapper.find('#skin-category').text()).toContain('user.emptyClosetMsg');
}); });
test('remove cape item', () => { test('remove cape item', () => {
Vue.prototype.$http.get.mockResolvedValue({}); Vue.prototype.$http.get.mockResolvedValue({});
const wrapper = mount(Closet); const wrapper = mount(Closet);
wrapper.setData({ capeItems: [{ tid: 1 }, { tid: 2 }], category: 'cape' }); wrapper.setData({ capeItems: [{ tid: 1 }], category: 'cape' });
wrapper.vm.removeCapeItem(1); wrapper.vm.removeCapeItem(0);
expect(wrapper.findAll(ClosetItem)).toHaveLength(1); expect(wrapper.find('#cape-category').text()).toContain('user.emptyClosetMsg');
}); });
test('compute avatar URL', () => { test('compute avatar URL', () => {

View File

@ -86,7 +86,7 @@ test('remove texture', async () => {
button.trigger('click'); button.trigger('click');
await flushPromises(); 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 }); 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'); expect(wrapper.text()).toContain('to-be-deleted');
button.trigger('click'); button.trigger('click');
await flushPromises(); // Finish HTTP request await flushPromises();
await wrapper.vm.$nextTick(); // Update DOM
expect(wrapper.text()).not.toContain('to-be-deleted'); expect(wrapper.text()).not.toContain('to-be-deleted');
}); });