Skip to content

Commit 341b6e4

Browse files
authored
Merge pull request #329 from hidde/add-character-counter
Add character counter (DP-1037)
2 parents a1e322d + 50ed7a9 commit 341b6e4

3 files changed

Lines changed: 117 additions & 8 deletions

File tree

src/components/profile/edit/EditPersonalInfo.vue

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,12 @@
141141
your profile and control its visibility level.</Tooltip
142142
>
143143
</div>
144-
<input type="text" id="field-alt-name" v-model="alternativeName.value" />
144+
<TextInput
145+
type="text"
146+
id="field-alt-name="
147+
:maxlength="90"
148+
v-model="alternativeName.value"
149+
/>
145150
<PrivacySetting
146151
label="Alternate Name privacy levels"
147152
id="field-alt-name-privacy"
@@ -189,7 +194,12 @@
189194
through this field.</Tooltip
190195
>
191196
</div>
192-
<input type="text" id="field-fun-job-title" v-model="funTitle.value" />
197+
<TextInput
198+
type="text"
199+
id="field-fun-job-title"
200+
v-model="funTitle.value"
201+
:maxlength="90"
202+
/>
193203
<PrivacySetting
194204
label="Tagline privacy levels"
195205
id="field-fun-title-privacy"
@@ -360,12 +370,13 @@
360370
>.</Tooltip
361371
>
362372
</div>
363-
<textarea
373+
<TextArea
364374
id="field-bio"
375+
:value="description.value"
365376
v-model="description.value"
366-
maxlength="5000"
367-
rows="10"
368-
></textarea>
377+
:maxlength="5000"
378+
:rows="10"
379+
></TextArea>
369380
<PrivacySetting
370381
label="Bio privacy levels"
371382
id="field-bio-privacy"
@@ -384,6 +395,8 @@ import Meta from '@/components/ui/Meta.vue';
384395
import MetaList from '@/components/ui/MetaList.vue';
385396
import PrivacySetting from '@/components/profile/PrivacySetting.vue';
386397
import Select from '@/components/ui/Select.vue';
398+
import TextInput from '@/components/ui/TextInput.vue';
399+
import TextArea from '@/components/ui/TextArea.vue';
387400
import Tooltip from '@/components/ui/Tooltip.vue';
388401
import UserPicture from '@/components/ui/UserPicture.vue';
389402
import { DISPLAY_LEVELS } from '@/assets/js/display-levels';
@@ -407,6 +420,8 @@ export default {
407420
MetaList,
408421
PrivacySetting,
409422
Select,
423+
TextInput,
424+
TextArea,
410425
Tooltip,
411426
UserPicture,
412427
},
@@ -484,6 +499,7 @@ export default {
484499
.edit-personal-info > input,
485500
.edit-personal-info > div > input,
486501
.edit-personal-info > textarea,
502+
.edit-personal-info > div > textarea,
487503
.edit-personal-info > select {
488504
border: 0;
489505
background-color: var(--gray-20);
@@ -493,7 +509,8 @@ export default {
493509
padding: 0.5em 0.9em;
494510
width: 100%;
495511
}
496-
.edit-personal-info > textarea {
512+
.edit-personal-info > textarea,
513+
.edit-personal-info > div > textarea {
497514
resize: none;
498515
}
499516
.edit-personal-info > input[disabled] {
@@ -571,13 +588,15 @@ export default {
571588
.edit-personal-info > input,
572589
.edit-personal-info > div > input,
573590
.edit-personal-info > textarea,
591+
.edit-personal-info > div > textarea,
574592
.edit-personal-info > select {
575593
margin: 0.5em 0;
576594
}
577595
.edit-personal-info > input {
578596
grid-column: 3 / 4;
579597
}
580-
.edit-personal-info > textarea {
598+
.edit-personal-info > textarea,
599+
.edit-personal-info > .textarea {
581600
grid-column: 2 / 4;
582601
}
583602
.edit-personal-info__picture {

src/components/ui/TextArea.vue

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<template>
2+
<div class="textarea">
3+
<textarea
4+
:id="id"
5+
:maxlength="maxlength"
6+
:rows="rows"
7+
:cols="cols"
8+
:placeholder="placeholder"
9+
:value="value"
10+
@input="$emit('input', $event.target.value)"
11+
></textarea>
12+
<span v-if="maxlength">{{ value.length }}/{{ maxlength }}</span>
13+
</div>
14+
</template>
15+
16+
<script>
17+
export default {
18+
name: 'TextArea',
19+
props: {
20+
id: String,
21+
placeholder: String,
22+
maxlength: Number,
23+
input: String,
24+
value: String,
25+
cols: Number,
26+
rows: Number,
27+
},
28+
};
29+
</script>
30+
31+
<style>
32+
.textarea {
33+
position: relative;
34+
}
35+
.textarea textarea[maxlength] {
36+
padding-bottom: 5em;
37+
}
38+
.textarea textarea[maxlength] + span {
39+
position: absolute;
40+
bottom: 1rem;
41+
right: 0.5rem;
42+
font-size: 0.85em;
43+
color: var(--gray-50);
44+
letter-spacing: 0.1em;
45+
}
46+
</style>

src/components/ui/TextInput.vue

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<template>
2+
<div class="input">
3+
<input
4+
:type="type ? type : 'text'"
5+
:id="id"
6+
:placeholder="placeholder"
7+
:maxlength="maxlength"
8+
:value="value ? value : ''"
9+
@input="$emit('input', $event.target.value)"
10+
/>
11+
<span v-if="maxlength">{{ value.length }}/{{ maxlength }}</span>
12+
</div>
13+
</template>
14+
15+
<script>
16+
export default {
17+
name: 'TextInput',
18+
props: {
19+
type: String,
20+
placeholder: String,
21+
id: String,
22+
maxlength: Number,
23+
input: String,
24+
value: String,
25+
},
26+
};
27+
</script>
28+
29+
<style>
30+
.input {
31+
position: relative;
32+
}
33+
.input input[maxlength] {
34+
padding-right: 5em;
35+
}
36+
.input input[maxlength] + span {
37+
position: absolute;
38+
bottom: 1rem;
39+
right: 0.5rem;
40+
font-size: 0.85em;
41+
color: var(--gray-50);
42+
letter-spacing: 0.1em;
43+
}
44+
</style>

0 commit comments

Comments
 (0)