Fix user bio modal. Should work now
[vchess.git] / client / src / components / UserBio.vue
1 <template lang="pug">
2 div(:id="'player_' + uid")
3 input.modal(
4 :id="'modalBio_' + uid"
5 type="checkbox"
6 )
7 div.bio-div(
8 role="dialog"
9 :data-checkbox="'modalBio_' + uid"
10 )
11 .card
12 div(v-if="st.user.id == uid")
13 div
14 button(@click="modeEdit = !modeEdit")
15 | {{ st.tr[modeEdit ? "Cancel" : "Edit"] }}
16 button(
17 v-show="modeEdit"
18 @click="sendBio()"
19 )
20 | {{ st.tr["Send"] }}
21 fieldset(v-if="userBio !== undefined && modeEdit")
22 textarea(
23 @input="adjustHeight($event)"
24 v-model="userBio"
25 )
26 h3 {{ uname }}
27 .bio-content(
28 v-if="userBio !== undefined"
29 v-html="parseHtml(userBio)"
30 @click="modeEdit = !modeEdit"
31 )
32 .dialog.text-center {{ st.tr[infoMsg] }}
33 span(
34 :class="{ clickable: !!uname }"
35 @click="showBio()"
36 )
37 | {{ uname || "@nonymous" }}
38 </template>
39
40 <script>
41 import { store } from "@/store";
42 import { ajax } from "@/utils/ajax";
43 import { processModalClick } from "@/utils/modalClick.js";
44 export default {
45 name: "my-user-bio",
46 props: ["uid", "uname"],
47 data: function() {
48 return {
49 st: store.state,
50 userBio: undefined,
51 infoMsg: "",
52 modeEdit: false
53 };
54 },
55 methods: {
56 parseHtml: function(txt) {
57 return !txt.match(/<[/a-zA-Z]+>/)
58 ? txt.replace(/\n/g, "<br/>") //no HTML tag
59 : txt;
60 },
61 adjustHeight: function(e) {
62 // https://stackoverflow.com/a/48460773
63 let t = e.target;
64 t.style.height = "";
65 t.style.height = t.scrollHeight + "px";
66 },
67 showBio: function() {
68 if (!this.uname)
69 // Anonymous users have no bio:
70 return;
71 this.infoMsg = "";
72 document.querySelector("#modalBio_" + this.uid).checked = true;
73 if (this.userBio === undefined) {
74 ajax(
75 "/userbio",
76 "GET",
77 {
78 data: { id: this.uid },
79 success: (res) => {
80 this.userBio = res.bio;
81 }
82 }
83 );
84 document.querySelector("#player_" + this.uid + " > .bio-div")
85 .addEventListener("click", processModalClick);
86 }
87 },
88 sendBio: function() {
89 ajax(
90 "/userbio",
91 "PUT",
92 {
93 data: { bio: this.userBio },
94 success: () => {
95 this.infoMsg = this.st.tr["Modifications applied!"];
96 }
97 }
98 );
99 }
100 }
101 };
102 </script>
103
104 <style lang="sass">
105 // bio-content HTML elements are added after initial rendering
106 .bio-content
107 text-align: left
108 margin: 0 var(--universal-margin)
109 p, ul, ol
110 margin: var(--universal-margin) 0
111 </style>
112
113 <style lang="sass" scoped>
114 [type="checkbox"].modal+div .card
115 max-width: 500px
116 max-height: 100%
117
118 textarea
119 display: block
120 margin: 0 var(--universal-margin)
121 width: calc(100% - 2 * var(--universal-margin))
122 min-height: 100px
123
124 .dialog
125 padding: 5px
126 color: blue
127 </style>