Skip to content

Commit 38792c8

Browse files
Merge pull request #56544 from nextcloud/chore/user_status--vue3
refactor(user_status): migrate to Vue 3
2 parents f4753cc + ea205dd commit 38792c8

File tree

127 files changed

+505
-1865
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

127 files changed

+505
-1865
lines changed

apps/user_status/css/user-status-menu.css

Lines changed: 0 additions & 4 deletions
This file was deleted.

apps/user_status/css/user-status-menu.css.map

Lines changed: 0 additions & 1 deletion
This file was deleted.

apps/user_status/css/user-status-menu.css.map.license

Lines changed: 0 additions & 2 deletions
This file was deleted.

apps/user_status/lib/Listener/BeforeTemplateRenderedListener.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,6 @@ public function handle(Event $event): void {
7070
});
7171

7272
Util::addScript('user_status', 'menu');
73-
Util::addStyle('user_status', 'user-status-menu');
73+
Util::addStyle('user_status', 'menu');
7474
}
7575
}

apps/user_status/src/UserStatus.vue

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,46 +4,44 @@
44
-->
55

66
<template>
7-
<Fragment>
8-
<NcListItem
9-
v-if="!inline"
10-
class="user-status-menu-item"
11-
compact
12-
:name="visibleMessage"
13-
@click.stop="openModal">
7+
<NcListItem
8+
v-if="!inline"
9+
:class="$style.userStatusMenuItem"
10+
compact
11+
:name="visibleMessage"
12+
@click.stop="openModal">
13+
<template #icon>
14+
<NcUserStatusIcon
15+
:class="$style.userStatusIcon"
16+
:status="statusType"
17+
aria-hidden="true" />
18+
</template>
19+
</NcListItem>
20+
21+
<div v-else>
22+
<!-- Dashboard Status -->
23+
<NcButton @click.stop="openModal">
1424
<template #icon>
1525
<NcUserStatusIcon
16-
class="user-status-icon"
26+
:class="$style.userStatusIcon"
1727
:status="statusType"
1828
aria-hidden="true" />
1929
</template>
20-
</NcListItem>
21-
22-
<div v-else>
23-
<!-- Dashboard Status -->
24-
<NcButton @click.stop="openModal">
25-
<template #icon>
26-
<NcUserStatusIcon
27-
class="user-status-icon"
28-
:status="statusType"
29-
aria-hidden="true" />
30-
</template>
31-
{{ visibleMessage }}
32-
</NcButton>
33-
</div>
34-
<!-- Status management modal -->
35-
<SetStatusModal
36-
v-if="isModalOpen"
37-
:inline="inline"
38-
@close="closeModal" />
39-
</Fragment>
30+
{{ visibleMessage }}
31+
</NcButton>
32+
</div>
33+
<!-- Status management modal -->
34+
<SetStatusModal
35+
v-if="isModalOpen"
36+
:inline="inline"
37+
@close="closeModal" />
4038
</template>
4139

4240
<script>
4341
import { getCurrentUser } from '@nextcloud/auth'
4442
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
4543
import debounce from 'debounce'
46-
import { Fragment } from 'vue-frag'
44+
import { defineAsyncComponent } from 'vue'
4745
import NcButton from '@nextcloud/vue/components/NcButton'
4846
import NcListItem from '@nextcloud/vue/components/NcListItem'
4947
import NcUserStatusIcon from '@nextcloud/vue/components/NcUserStatusIcon'
@@ -55,11 +53,10 @@ export default {
5553
name: 'UserStatus',
5654
5755
components: {
58-
Fragment,
5956
NcButton,
6057
NcListItem,
6158
NcUserStatusIcon,
62-
SetStatusModal: () => import(/* webpackChunkName: 'user-status-modal' */'./components/SetStatusModal.vue'),
59+
SetStatusModal: defineAsyncComponent(() => import('./components/SetStatusModal.vue')),
6360
},
6461
6562
mixins: [OnlineStatusMixin],
@@ -126,7 +123,7 @@ export default {
126123
/**
127124
* Some housekeeping before destroying the component
128125
*/
129-
beforeDestroy() {
126+
beforeUnmount() {
130127
window.removeEventListener('mouseMove', this.mouseMoveListener)
131128
clearInterval(this.heartbeatInterval)
132129
unsubscribe('user_status:status.updated', this.handleUserStatusUpdated)
@@ -179,8 +176,15 @@ export default {
179176
}
180177
</script>
181178
182-
<style lang="scss" scoped>
183-
.user-status-icon {
179+
<style lang="scss" module>
180+
// Note: As for v9.3.0 NcListItem does not support <style scoped>
181+
.userStatusMenuItem,
182+
.userStatusMenuItem * {
183+
// TODO: Vue 3 migration - add box-sizing to core menu component
184+
box-sizing: border-box;
185+
}
186+
187+
.userStatusIcon {
184188
width: 20px;
185189
height: 20px;
186190
margin: calc((var(--default-clickable-area) - 20px) / 2); // 20px icon size

apps/user_status/src/components/ClearAtSelect.vue

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
<template>
77
<div class="clear-at-select">
88
<label class="clear-at-select__label" for="clearStatus">
9-
{{ $t('user_status', 'Clear status after') }}
9+
{{ t('user_status', 'Clear status after') }}
1010
</label>
1111
<NcSelect
1212
input-id="clearStatus"
@@ -21,9 +21,10 @@
2121
</template>
2222

2323
<script>
24+
import { t } from '@nextcloud/l10n'
2425
import NcSelect from '@nextcloud/vue/components/NcSelect'
25-
import { clearAtFilter } from '../filters/clearAtFilter.js'
2626
import { getAllClearAtOptions } from '../services/clearAtOptionsService.js'
27+
import { clearAtFormat } from '../services/clearAtService.js'
2728
2829
export default {
2930
name: 'ClearAtSelect',
@@ -38,6 +39,8 @@ export default {
3839
},
3940
},
4041
42+
emits: ['selectClearAt'],
43+
4144
data() {
4245
return {
4346
options: getAllClearAtOptions(),
@@ -53,12 +56,14 @@ export default {
5356
option() {
5457
return {
5558
clearAt: this.clearAt,
56-
label: clearAtFilter(this.clearAt),
59+
label: clearAtFormat(this.clearAt),
5760
}
5861
},
5962
},
6063
6164
methods: {
65+
t,
66+
6267
/**
6368
* Triggered when the user selects a new option.
6469
*
@@ -69,7 +74,7 @@ export default {
6974
return
7075
}
7176
72-
this.$emit('select-clear-at', option.clearAt)
77+
this.$emit('selectClearAt', option.clearAt)
7378
},
7479
},
7580
}

apps/user_status/src/components/CustomMessageInput.vue

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,13 @@
2222
:model-value="message"
2323
type="text"
2424
:label="t('user_status', 'What is your status?')"
25-
@input="onChange" />
25+
@update:model-value="onChange" />
2626
</div>
2727
</div>
2828
</template>
2929

3030
<script>
31+
import { t } from '@nextcloud/l10n'
3132
import NcButton from '@nextcloud/vue/components/NcButton'
3233
import NcEmojiPicker from '@nextcloud/vue/components/NcEmojiPicker'
3334
import NcTextField from '@nextcloud/vue/components/NcTextField'
@@ -60,7 +61,7 @@ export default {
6061
6162
emits: [
6263
'change',
63-
'select-icon',
64+
'selectIcon',
6465
],
6566
6667
computed: {
@@ -75,21 +76,23 @@ export default {
7576
},
7677
7778
methods: {
79+
t,
80+
7881
focus() {
7982
this.$refs.input.focus()
8083
},
8184
8285
/**
8386
* Notifies the parent component about a changed input
8487
*
85-
* @param {Event} event The Change Event
88+
* @param {string} value The new input value
8689
*/
87-
onChange(event) {
88-
this.$emit('change', event.target.value)
90+
onChange(value) {
91+
this.$emit('change', value)
8992
},
9093
9194
setIcon(icon) {
92-
this.$emit('select-icon', icon)
95+
this.$emit('selectIcon', icon)
9396
},
9497
},
9598
}

apps/user_status/src/components/OnlineStatusSelect.vue

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@
1212
name="user-status-online"
1313
@change="onChange">
1414
<label :for="id" class="user-status-online-select__label">
15-
<NcUserStatusIcon
16-
:status="type"
17-
class="user-status-online-select__icon"
18-
aria-hidden="true" />
15+
<span class="user-status-online-select__icon-wrapper">
16+
<NcUserStatusIcon
17+
:status="type"
18+
class="user-status-online-select__icon"
19+
aria-hidden="true" />
20+
</span>
1921
{{ label }}
2022
<em class="user-status-online-select__subline">{{ subline }}</em>
2123
</label>
@@ -54,6 +56,8 @@ export default {
5456
},
5557
},
5658
59+
emits: ['select'],
60+
5761
computed: {
5862
id() {
5963
return `user-status-online-status-${this.type}`
@@ -90,10 +94,17 @@ export default {
9094
}
9195
}
9296
97+
&__icon-wrapper {
98+
height: var(--default-clickable-area);
99+
width: var(--default-clickable-area);
100+
display: flex;
101+
align-items: center;
102+
justify-content: center;
103+
}
104+
93105
&__icon {
94106
height: 20px;
95107
width: 20px;
96-
padding: calc((var(--default-clickable-area) - 20px) / 2);
97108
}
98109
99110
&__input:checked + &__label {

apps/user_status/src/components/PredefinedStatus.vue

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,17 @@
1919
{{ message }}
2020
</span>
2121
<span class="predefined-status__label--clear-at">
22-
{{ clearAt | clearAtFilter }}
22+
{{ formattedClearAt }}
2323
</span>
2424
</label>
2525
</li>
2626
</template>
2727

2828
<script>
29-
import { clearAtFilter } from '../filters/clearAtFilter.js'
29+
import { clearAtFormat } from '../services/clearAtService.js'
3030
3131
export default {
3232
name: 'PredefinedStatus',
33-
filters: {
34-
clearAtFilter,
35-
},
3633
3734
props: {
3835
messageId: {
@@ -63,10 +60,16 @@ export default {
6360
},
6461
},
6562
63+
emits: ['select'],
64+
6665
computed: {
6766
id() {
6867
return `user-status-predefined-status-${this.messageId}`
6968
},
69+
70+
formattedClearAt() {
71+
return clearAtFormat(this.clearAt)
72+
},
7073
},
7174
7275
methods: {

apps/user_status/src/components/PredefinedStatusesList.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
</template>
2727

2828
<script>
29+
import { t } from '@nextcloud/l10n'
2930
import { mapGetters, mapState } from 'vuex'
3031
import PredefinedStatus from './PredefinedStatus.vue'
3132
@@ -35,6 +36,8 @@ export default {
3536
PredefinedStatus,
3637
},
3738
39+
emits: ['selectStatus'],
40+
3841
data() {
3942
return {
4043
lastSelected: null,
@@ -68,14 +71,16 @@ export default {
6871
},
6972
7073
methods: {
74+
t,
75+
7176
/**
7277
* Emits an event when the user selects a status
7378
*
7479
* @param {object} status The selected status
7580
*/
7681
selectStatus(status) {
7782
this.lastSelected = status.id
78-
this.$emit('select-status', status)
83+
this.$emit('selectStatus', status)
7984
},
8085
},
8186
}

0 commit comments

Comments
 (0)