Skip to content
This repository was archived by the owner on Jul 5, 2024. It is now read-only.

Commit f2134ab

Browse files
committed
Show error messages if requests fail
Signed-off-by: Julius Härtl <[email protected]>
1 parent e3e3a93 commit f2134ab

File tree

3 files changed

+69
-25
lines changed

3 files changed

+69
-25
lines changed

src/collectionservice.js

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,6 @@ class CollectionService {
4848
.then(result => {
4949
return result.data.ocs.data
5050
})
51-
.catch(error => {
52-
if (error.response.status === 404) {
53-
return []
54-
}
55-
console.error(error)
56-
return Promise.reject(error)
57-
})
5851
}
5952

6053
createCollection(resourceType, resourceId, name) {
@@ -65,10 +58,6 @@ class CollectionService {
6558
.then((response) => {
6659
return response.data.ocs.data
6760
})
68-
.catch(error => {
69-
console.error(error)
70-
return Promise.reject(error)
71-
})
7261
}
7362

7463
addResource(collectionId, resourceType, resourceId) {

src/components/CollectionList.vue

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@
4444
</template>
4545
</multiselect>
4646
</li>
47+
<transition name="fade">
48+
<li class="error" v-if="error">{{ error }}</li>
49+
</transition>
4750
<collection-list-item v-for="collection in collections" :key="collection.id" :collection="collection" />
4851
</ul>
4952
</template>
@@ -97,6 +100,13 @@
97100
}
98101
}
99102
103+
.fade-enter-active, .fade-leave-active {
104+
transition: opacity .5s;
105+
}
106+
.fade-enter, .fade-leave-to {
107+
opacity: 0;
108+
}
109+
100110
</style>
101111
<style lang="scss">
102112
/** TODO check why this doesn't work when scoped */
@@ -132,7 +142,7 @@ const _debouncedSearch = debounce(
132142
this.$store.dispatch('search', query).then((collections) => {
133143
this.searchCollections = collections
134144
}).catch(e => {
135-
OC.Notification.showTemporary(e)
145+
console.error('Failed to search for collections', e)
136146
})
137147
}
138148
},
@@ -177,15 +187,16 @@ export default {
177187
codes: undefined,
178188
value: null,
179189
model: {},
180-
searchCollections: []
190+
searchCollections: [],
191+
error: null
181192
}
182193
},
183194
computed: {
184195
collections() {
185196
return this.$store.getters.collectionsByResource(this.type, this.id)
186197
},
187198
placeholder() {
188-
return t('files_sharing', 'Add to a collection')
199+
return t('core', 'Add to a collection')
189200
},
190201
options() {
191202
let options = []
@@ -233,6 +244,8 @@ export default {
233244
resourceType: selectedOption.type,
234245
resourceId: id,
235246
name: this.name
247+
}).catch((e) => {
248+
this.setError(t('core', 'Failed to create collection'), e)
236249
})
237250
}).catch((e) => {
238251
console.error('No resource selected', e)
@@ -242,6 +255,8 @@ export default {
242255
if (selectedOption.method === METHOD_ADD_TO_COLLECTION) {
243256
this.$store.dispatch('addResourceToCollection', {
244257
collectionId: selectedOption.collectionId, resourceType: this.type, resourceId: this.id
258+
}).catch((e) => {
259+
this.setError(t('core', 'Failed to add resource to collection collection'), e)
245260
})
246261
}
247262
},
@@ -257,6 +272,13 @@ export default {
257272
},
258273
isVueComponent(object) {
259274
return object._isVue
275+
},
276+
setError(error, e) {
277+
console.error(error, e)
278+
this.error = error
279+
setTimeout(() => {
280+
this.error = null
281+
}, 5000)
260282
}
261283
}
262284
}

src/components/CollectionListItem.vue

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,22 @@
2525
<avatar :display-name="collection.name" :allow-placeholder="true" class="collection-avatar" />
2626
<span v-if="newName === null" class="collection-item-name" title=""
2727
@click="showDetails">{{ collection.name }}</span>
28-
<form v-else @submit.prevent="renameCollection">
28+
<form v-else @submit.prevent="renameCollection" :class="{'shouldshake': error.rename }">
2929
<input v-model="newName" type="text" autocomplete="off"
3030
autocapitalize="off">
3131
<input type="submit" value="" class="icon-confirm">
3232
</form>
33-
<transition name="fade">
34-
<div v-if="!detailsOpen" class="linked-icons">
35-
<a v-for="resource in limitedResources(collection)" :key="resource.type + '|' + resource.id" v-tooltip="resource.name"
36-
:href="resource.link" :class="typeClass(resource)"><img :src="iconUrl(resource)"></a>
37-
</div>
38-
</transition>
33+
<div v-if="!detailsOpen && newName === null" class="linked-icons">
34+
<a v-for="resource in limitedResources(collection)" :key="resource.type + '|' + resource.id" v-tooltip="resource.name"
35+
:href="resource.link" :class="typeClass(resource)"><img :src="iconUrl(resource)"></a>
36+
</div>
3937

40-
<span class="sharingOptionsGroup">
38+
<span class="sharingOptionsGroup" v-if="newName === null">
4139
<action :actions="menu" />
4240
</span>
41+
<transition name="fade">
42+
<div class="error" v-if="error.rename">{{ error.rename }}</div>
43+
</transition>
4344
<transition name="fade">
4445
<ul v-if="detailsOpen" class="resource-list-details">
4546
<li v-for="resource in collection.resources" :key="resource.type + '|' + resource.id" :class="typeClass(resource)">
@@ -52,6 +53,7 @@
5253
</template>
5354

5455
<script>
56+
import Vue from 'vue'
5557
import Action from 'nextcloud-vue/dist/Components/Action'
5658
import Avatar from 'nextcloud-vue/dist/Components/Avatar'
5759
import Tooltip from 'nextcloud-vue/dist/Directives/Tooltip'
@@ -73,7 +75,8 @@ export default {
7375
return {
7476
isOpen: false,
7577
detailsOpen: false,
76-
newName: null
78+
newName: null,
79+
error: {}
7780
}
7881
},
7982
computed: {
@@ -86,12 +89,12 @@ export default {
8689
this.isOpen = false
8790
},
8891
icon: 'icon-info',
89-
text: !this.detailsOpen ? t('files_sharing', 'Show details') : t('files_sharing', 'Hide details')
92+
text: !this.detailsOpen ? t('core', 'Show details') : t('core', 'Hide details')
9093
},
9194
{
9295
action: () => this.openRename(),
9396
icon: 'icon-rename',
94-
text: t('files_sharing', 'Rename collection')
97+
text: t('core', 'Rename collection')
9598
}
9699
]
97100
},
@@ -141,11 +144,21 @@ export default {
141144
this.newName = this.collection.name
142145
},
143146
renameCollection() {
147+
if (this.newName === '') {
148+
this.newName = null
149+
return
150+
}
144151
this.$store.dispatch('renameCollection', {
145152
collectionId: this.collection.id,
146153
name: this.newName
147154
}).then((collection) => {
148155
this.newName = null
156+
}).catch((e) => {
157+
Vue.set(this.error, 'rename', t('core', 'Failed to rename collection'))
158+
console.error(e)
159+
setTimeout(() => {
160+
Vue.set(this.error, 'rename', null)
161+
}, 3000)
149162
})
150163
}
151164
}
@@ -202,6 +215,10 @@ export default {
202215
margin-top: 4px;
203216
flex-grow: 1;
204217
}
218+
.error {
219+
flex-basis: 100%;
220+
width: 100%;
221+
}
205222
.resource-list-details {
206223
flex-basis: 100%;
207224
width: 100%;
@@ -247,4 +264,20 @@ export default {
247264
}
248265
}
249266
}
267+
268+
.shouldshake {
269+
animation: shake 0.6s 1 linear;
270+
}
271+
@keyframes shake {
272+
0% { transform: translate(15px); }
273+
20% { transform: translate(-15px); }
274+
40% { transform: translate(7px); }
275+
60% { transform: translate(-7px); }
276+
80% { transform: translate(3px); }
277+
100% { transform: translate(0px); }
278+
}
279+
</style>
280+
281+
<style>
282+
250283
</style>

0 commit comments

Comments
 (0)