From 08813f541d293f1411685ea30ce1e07f1dede20b Mon Sep 17 00:00:00 2001
From: Vincent Petry <vincent@nextcloud.com>
Date: Fri, 9 Oct 2020 11:50:54 +0200
Subject: [PATCH] UX improvements change status dialog

Focus on the custom message field after picking an emoji.
Hitting the enter key while in the custom message field now triggers
saving.
Disable save buttons while saving is in progress.

Signed-off-by: Vincent Petry <vincent@nextcloud.com>
---
 apps/user_status/js/user-status-menu.js       | Bin 581074 -> 581074 bytes
 apps/user_status/js/user-status-menu.js.map   | Bin 2080123 -> 2080123 bytes
 apps/user_status/js/user-status-modal.js      | Bin 15112 -> 15695 bytes
 apps/user_status/js/user-status-modal.js.map  | Bin 61697 -> 63129 bytes
 .../src/components/CustomMessageInput.vue     |  19 +++++++++++++++++-
 .../src/components/SetStatusModal.vue         |  16 ++++++++++++---
 6 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/apps/user_status/js/user-status-menu.js b/apps/user_status/js/user-status-menu.js
index 01098bfdfc4b6692fc63403b335a5f1c5e716dcb..bd9211e63b5a4c3e9a24d61fec6c4e6ac744edd0 100644
GIT binary patch
delta 88
zcmcb#Tlvy%<qhwcL{bcr(hN-!%`A=0&6120jVzK)Oq!XP+nJadftU%1L2MQvW(8t4
iAZFjr#LThhmPndWYHF%sim7p$fu*5QvU##$nlS)g8W$7*

delta 88
zcmcb#Tlvy%<qhwcM3R!t(~?q5&CM(l%?%Ax5)Ca)jGLL5+nJadftU%1L2MQvW(8t4
iAZFjr#LThhmWY|LMOsR-rKM47lA)nlijiefS{eXquoqhZ

diff --git a/apps/user_status/js/user-status-menu.js.map b/apps/user_status/js/user-status-menu.js.map
index 04c901225ba0cf75a5b1bbd56b6834b3f8c0b7a3..9209374d916a956e79546ea4dbb2a89fff27708a 100644
GIT binary patch
delta 169
zcmWN=$qj-)7zWU|ppN@8?pq7YB1jvYxB@d%2J!GGo~gsD2{((d3`>BE-%DOo7foF}
zs6}n+P?tRFQJ)5H_KCTZ)>>h1%K4Fyd6)~Qs&C9*9yfmGgieD<g+ZoLdC#?emI=cl
kj&O_<oZ<}UxWFZ@kmDLRxWygr@qkA>;TbPgnOuM74=i^*rvLx|

delta 169
zcmWN=Ne+TA7zWTdpw<z!D$ZvpXiKlbiY=w~7=*>2xaJ&gP1tz|kKqwu<M)!+HbvVM
zC3UDvJ?fK30~*rk%{~d2QS5B4b@(tsNE>S7T>VYh%i|_j&e*$>ai)Z@nb5cBS)~le
kIKe5-aE=S~afvHjBgYMHafbo!@qkA>;TbP=m0o}L4@j;(?f?J)

diff --git a/apps/user_status/js/user-status-modal.js b/apps/user_status/js/user-status-modal.js
index 09f1acc03094b830a8af0da96de04883da247b22..e08db72a7419c4488b1dc325aaa22a1b4b75aa39 100644
GIT binary patch
delta 1069
zcma)*y>HV%7{=wcv_XiLstrx4ln+zDt`65{H;H{Af-=#eQbkb(l!7kKId+>mk$nj*
zk%fu`f~iRN2Y^^vDtSV%z{J)WF~G=%!~{zr-yvdQyWjb_=RH5~drzx}4-UR^p(NDR
z1v#$=-?$fCNXBMTPU~8*KM03Hszzj8!#evoGT(*Z_eg3ul+2~DuHY2Qj`}_LFuL4>
zsj)&2o{W`ya5VO|2k%c^?m`e6-yEK(W<5bslVZlKI0m&#PTUF}PpKSdu{ROMS;6x3
zBF9yO{WE)mw?N+ZaIQ%5s780o1YIqaiUd0#PfT1XQj~zc54H)lN_h{}%#u;@P{&sg
zYt*tmY1SpCC)rN9LZzlc5PiUAqUjOfRdU-lWr^tYaC><r8s@gxTJ$1YIWMt;=*?A6
z;G1W8P^%lE4q!^%dP#m8?-YqspcapKP38gLxiOEZ)L8?*T*L;kO2s^JdBj%WBwLAT
z?3^|oF)Zv92;jHKZl%nlbt<)X*t2kk-3up{ns*e4=x@|*ut!P5xux-aaYOV)u)YBj
z5IB`$5%8V1@=X>cvQsX()Dyub`y9K(Z3dC}r{nd1{2@Lcx4l(dwVlE$#k8JW0tS0?
z?*>m)u^T7ZMtB*Pm12vam7_y;=ndQ05`@1ZChdId$<xyIGVwfIAWMB=i(+s`ddP_h
zD)ko>YeZ_8W|d6NC3wqs39YzJoE@r>lM1p;fk<VSRI>{EqJ-Jc`I#xbU)esNW^?jw
zF^$>?VM~=Uut(xLYTI_dve)um1YuX+Hf_nF+S50SLlqE-%2^^Am>QO#uyr-b?!&bK
z9kG}7P9CX~0}5on;DsRtKsA_Ez8{-z&dR@`@PJKd$<u&u&0C|D9<GvB1A=Q>j62(z
stj_Q>H2t~x%+!Pb(nZjt?(<`>(Dli@oHOA9PU&hol~b{z84C-403z9F*#H0l

delta 573
zcmYk(&ubGw6bEp|#B@byl(zJjG|3{gvD;*)lgVT^2~rSx>cxXd58`BZ(#?-<mdzxD
zmQZ@Ah?ffQ5Aa_o&Pj>~J?X`s1rLfBJ$Vtm6n_<x_4M9{_k{=Vo$WpDpL|4GvCgUG
zGOoU$XGkL^XB3-69mjB7E3yK!++qpdOytK<zbA?b%_OwOd4WQ8av0(D<W_{)<W7V~
z$soe7<Y|Og*KUuYwCl~plvnMptP`3o*L%Jr8y!F0S4Xo1p+3Br1JqYr^BV|x>UiNW
zc6Dg%3h8y+uDuV9B^DnJjV63pT7&JIYrs<XsaVk)e$bP;vCpLp|K{{vK4=SnM|!%g
zmrUKzgEn`B*J-;V)NScCx{x7L@FP`<{p)k-xr=(1UR)TRL^u3iyPeI6LC^_hH*2&Y
zo~fXg+Q_`Wf|{_n`c%DKJ&nP6em>D~I(}8E&-nwSiChqhe$|8%Y$67q@C>5x6K^k5
zTjYE(kX5T(3k7eL9o`jbW`{!dLO(qk!ruCWTh=Ix+5cgTqx8iVjNt~o1DoXDC1yiF
zrr{l(K^D9v%W>1dSbZnoF2lJ+)ux?7@TB}49##&=?|`qByVEs?)oU(g#S&*2yBu2u
F@(1}{x;p>>

diff --git a/apps/user_status/js/user-status-modal.js.map b/apps/user_status/js/user-status-modal.js.map
index 7e2045b3305f75e91a32271e2298311e3ef96a1d..83e87f35e228f21c1c67b47161cf8b6da8a38e5a 100644
GIT binary patch
delta 2932
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
G?ED+lhMqkD

delta 1933
zcmZuxZERCj7|x}g>jXwYEE~jqbRFyHDZBmdFs8is?5^3CZXKl~=)l~5?2~P5?bb3t
zVhAP*>f|*TGEq=}7=M_VON<5+KjJS*P+~-hMnzHhp%Ehxe;D+fd)IbL{BwGr=Y7xn
zKIb{_>FM7MPyS?>yJHkvMK=lt7w*4*Ej}!qH28gPJZEyf@Vps6JW{4wR=5R&+pjP#
zTo&>KJb^;CdevYP4Cz!7Cs#=<G~gM~zmoo-f|rFxRV_PYFuFWRvAAWr;*JpyR#xMg
z%2PNsY{9-Y=5@(^X=N&wRkG6=E3syjnY4On&HQR%6ssO;sC7sX1`>k^kRIq>{0ajF
zGEHfVgzq$LG7L+d_+EVo?^K)7P$M^lNdzE5C;%n90d|uvfG&~*n2mJvZ+CYNpRRGZ
zT6fG!9E-7GiM4=O9|;45^^FYA?2Pj8L|l~EZaUP5M{Bd?lvnS`;=Nj{X}SRHbwSfa
z0Sqk#Z!QHlmjKmX?-PU^?zL74dCXbcn!OS`BlM6sKz^rBla`75CDIGfONJ!?CX***
z)$7(XLT!hpSy#)p#9b1R0XiJ|S!VF8%~CO_J1|7C*RcVw*eoWuq`5PKw{7v&OFG8$
z*w-jA*H1UvDktQ2(m}`D#R!qx#_(d}qYW`RFZb%rDA1^fa%&<?0_~nG9K3t8XexrI
zHj51fK*<D?FY`M{lTit1Uh-0Yu9y$6ZgyG!H&0oXMw)7b1K8EHv3#6e{w|oneNCO+
z+9a^rj8dS7^HUNZl1a8Mi4976uvH5N3qhUENswjxV~|0!-FjrCjh7i_Yo-%q;L6!L
zCP62VK?+?!L}mbsYF$}03dBz#&KQm7#{)KZY+=C!+a$A#1Co;$DLpXGD7OUD>_^w1
zhCKWBo7;fv+YK$O>n?D}c*!oWn2q3r&2#<(l0KoDk7;J+$ReT5I-ipr+6;_QW(O$R
zb+JeC@g@uY*}P}{vhA!h>pqK7haI2U(zcq7Z*lr(@Y^i`ewF<B1o$Ma$xy-@66P#(
zcLYO@?DBfdM#wGJ`@`X?WN(8{rKVw=;tx&>mTj!Ueo|%5Ey`n7!KjqihjX5+6vFr}
zaii!k-N&WO>VZ0E{YsH?v%oF6bS~-KUg4&Eo{}EUG~t&{yG<^gKzlU08En#co+iXc
zF|^fIz08OMtS}>Z4tJvpe{q`2N13CeRK|;2!*$EDb=ykMk>)4S-4a@#NCpNHDPMs7
z`vqLCl;Udjdembr`^!!KfH%;Z@(1x2tyVt>Js_C;1B$OT6;M=HaHQNMdVC2*@%l<}
zkEjHEF42Ro;6`lt&57GXMs*<~2zYCb|1VeKzn-;tlh&(bNBc5Ty-5=l#g6L2-p2(z
z{!;x(uenIFHaBoZbe;LJl#*4PGtQ#Ezj|7VS?ZSP6O~12tk4Oeh_nh0rK&`9DThno
z3nfwljfue$crmfR1Xd+4l)&f7P!Xt>)EOgQ8hXTd_;B+cyf<J`L&J>%o*22T9viiY
zxG-OhH|CGxg_l3Y+}l>Hd*u`S^*Jx5U%gw@kJpaa@%Y(~N(6Hsw}19?iHP0};KKU@
zc>A@?CMBDl%4|E>Zyi(e`_kis*`a>xwtj0+?6=}uuRp8){l+N~&wu4tS6!(QF#Pp7
wwd|XJ3~KFn-y3klwOTdvquYSS8$NZz^$v6KB$|l1+viI}K}7M+qjx+00}mx!tN;K2

diff --git a/apps/user_status/src/components/CustomMessageInput.vue b/apps/user_status/src/components/CustomMessageInput.vue
index 2fc637d974d..f84714adddc 100644
--- a/apps/user_status/src/components/CustomMessageInput.vue
+++ b/apps/user_status/src/components/CustomMessageInput.vue
@@ -23,11 +23,16 @@
 		class="custom-input__form"
 		@submit.prevent>
 		<input
+			ref="input"
 			maxlength="80"
+			:disabled="disabled"
 			:placeholder="$t('user_status', 'What\'s your status?')"
 			type="text"
 			:value="message"
-			@change="change">
+			@change="change"
+			@keyup="change"
+			@paste="change"
+			@keyup.enter="submit">
 	</form>
 </template>
 
@@ -40,8 +45,16 @@ export default {
 			required: true,
 			default: () => '',
 		},
+		disabled: {
+			type: Boolean,
+			default: false,
+		},
 	},
 	methods: {
+		focus() {
+			this.$refs.input.focus()
+		},
+
 		/**
 		 * Notifies the parent component about a changed input
 		 *
@@ -50,6 +63,10 @@ export default {
 		change(event) {
 			this.$emit('change', event.target.value)
 		},
+
+		submit(event) {
+			this.$emit('submit', event.target.value)
+		},
 	},
 }
 </script>
diff --git a/apps/user_status/src/components/SetStatusModal.vue b/apps/user_status/src/components/SetStatusModal.vue
index 3ba15ec129d..0613a2be38c 100644
--- a/apps/user_status/src/components/SetStatusModal.vue
+++ b/apps/user_status/src/components/SetStatusModal.vue
@@ -49,8 +49,10 @@
 					</button>
 				</EmojiPicker>
 				<CustomMessageInput
+					ref="customMessageInput"
 					:message="message"
-					@change="setMessage" />
+					@change="setMessage"
+					@submit="saveStatus" />
 			</div>
 			<PredefinedStatusesList
 				@selectStatus="selectPredefinedMessage" />
@@ -58,10 +60,10 @@
 				:clear-at="clearAt"
 				@selectClearAt="setClearAt" />
 			<div class="status-buttons">
-				<button class="status-buttons__select" @click="clearStatus">
+				<button class="status-buttons__select" :disabled="isSavingStatus" @click="clearStatus">
 					{{ $t('user_status', 'Clear status message') }}
 				</button>
-				<button class="status-buttons__primary primary" @click="saveStatus">
+				<button class="status-buttons__primary primary" :disabled="isSavingStatus" @click="saveStatus">
 					{{ $t('user_status', 'Set status message') }}
 				</button>
 			</div>
@@ -99,6 +101,7 @@ export default {
 			clearAt: null,
 			icon: null,
 			message: '',
+			isSavingStatus: false,
 			statuses: getAllStatusOptions(),
 		}
 	},
@@ -143,6 +146,9 @@ export default {
 		setIcon(icon) {
 			this.messageId = null
 			this.icon = icon
+			this.$nextTick(() => {
+				this.$refs.customMessageInput.focus()
+			})
 		},
 		/**
 		 * Sets a new message
@@ -178,6 +184,10 @@ export default {
 		 * @returns {Promise<void>}
 		 */
 		async saveStatus() {
+			if (this.isSavingStatus) {
+				return
+			}
+
 			try {
 				this.isSavingStatus = true
 
-- 
GitLab