Skip to content

Commit e3b02fc

Browse files
committed
Add language footer to sign in and sign up page.
1 parent afb0dc4 commit e3b02fc

File tree

4 files changed

+105
-15
lines changed

4 files changed

+105
-15
lines changed

kolibri/core/assets/src/core-app/apiSpec.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import kNavbar from '../views/k-navbar';
4040
import kNavbarButton from '../views/k-navbar/button';
4141
import kNavbarLink from '../views/k-navbar/link';
4242
import logo from '../views/logo';
43+
import languageSwitcher from '../views/language-switcher';
4344
import immersiveFullScreen from '../views/immersive-full-screen';
4445
import elapsedTime from '../views/elapsed-time';
4546
import pointsIcon from '../views/points-icon';
@@ -104,6 +105,7 @@ export default {
104105
kBreadcrumbs,
105106
kCheckbox,
106107
kRadioButton,
108+
languageSwitcher,
107109
},
108110
router,
109111
mixins: {

kolibri/core/assets/src/views/app-bar/index.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
@select="optionSelected"
3535
/>
3636
</ui-button>
37-
<language-switcher v-if="showLanguageModal" @close="showLanguageModal=false"/>
37+
<language-switcher :modalOpen="showLanguageModal" @close="showLanguageModal=false"/>
3838
</div>
3939
</ui-toolbar>
4040

kolibri/core/assets/src/views/language-switcher/index.vue

Lines changed: 93 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,29 @@
11
<template>
22

3-
<core-modal :title="$tr('changeLanguageModalHeader')" @cancel="$emit('close')">
4-
<p>{{ $tr('changeLanguageSubHeader') }}</p>
5-
<p v-for="language in languageOptions" :class="selectedLanguage.code===language.code ? 'selected' : 'choice'" @click="selectedLanguage=language">
6-
{{ language.name }}
7-
</p>
8-
<div class="footer">
9-
<k-button :text="$tr('cancelButtonText')" :raised="false" :disabled="disabled" @click="$emit('close')"/>
10-
<k-button :text="$tr('confirmButtonText')" :primary="true" :disabled="disabled" @click="switchLanguage"/>
3+
<div>
4+
<div class="page-footer">
5+
<div class="lang-container">
6+
<p class="prompt" v-if="!isMobile">{{ $tr('changeLanguagePrompt') }}</p>
7+
<p v-for="language in footerLanguageOptions" :class="selectedLanguage.code===language.code ? 'selected' : 'choice'" @click="setAndSwitchLanguage(language)">
8+
{{ language.name }}
9+
</p>
10+
</div>
11+
<k-button style="margin-top: 0" :text="$tr('moreLanguageButtonText')" :raised="false" @click="setModalOpen"/>
1112
</div>
12-
</core-modal>
13+
<core-modal
14+
v-if="showModal"
15+
:title="$tr('changeLanguageModalHeader')"
16+
@cancel="closeModal">
17+
<p>{{ $tr('changeLanguageSubHeader') }}</p>
18+
<p v-for="language in languageOptions" :class="selectedLanguage.code===language.code ? 'selected' : 'choice'" @click="selectedLanguage=language">
19+
{{ language.name }}
20+
</p>
21+
<div class="footer">
22+
<k-button :text="$tr('cancelButtonText')" :raised="false" :disabled="disabled" @click="closeModal"/>
23+
<k-button :text="$tr('confirmButtonText')" :primary="true" :disabled="disabled" @click="switchLanguage"/>
24+
</div>
25+
</core-modal>
26+
</div>
1327

1428
</template>
1529

@@ -20,36 +34,70 @@
2034
import kButton from 'kolibri.coreVue.components.kButton';
2135
import { httpClient } from 'kolibri.client';
2236
import { availableLanguages, currentLanguage } from 'kolibri.utils.i18n';
37+
import responsiveWindow from 'kolibri.coreVue.mixins.responsiveWindow';
2338
export default {
2439
name: 'languageSwitcherModalDialog',
40+
mixins: [responsiveWindow],
2541
components: { coreModal, kButton },
2642
$trs: {
2743
changeLanguageModalHeader: 'Change language',
2844
changeLanguageSubHeader: 'Select the language you want to view Kolibri in',
45+
changeLanguagePrompt: 'Select language:',
46+
moreLanguageButtonText: 'More languages',
2947
cancelButtonText: 'Cancel',
3048
confirmButtonText: 'Confirm',
3149
},
3250
computed: {
3351
languageOptions() {
3452
return Object.keys(availableLanguages)
3553
.sort((a, b) => {
36-
if (a === currentLanguage || a[0] > b[0]) {
54+
if (a === currentLanguage) {
3755
return -1;
3856
}
39-
if (b === currentLanguage || b[0] > a[0]) {
57+
if (b === currentLanguage) {
58+
return 1;
59+
}
60+
if (a[0] < b[0]) {
61+
return -1;
62+
}
63+
if (b[0] < a[0]) {
4064
return 1;
4165
}
4266
return 0;
4367
})
4468
.map(key => availableLanguages[key]);
4569
},
70+
footerLanguageOptions() {
71+
if (this.isMobile) {
72+
return this.languageOptions.filter(lang => lang.code !== currentLanguage).slice(0, 3);
73+
}
74+
return this.languageOptions.slice(0, 6);
75+
},
4676
currentLanguageName() {
4777
return availableLanguages[currentLanguage].name;
4878
},
79+
showModal() {
80+
console.log(this.internalModalOpen);
81+
return this.modalOpen || this.internalModalOpen;
82+
},
83+
isMobile() {
84+
return this.windowSize.breakpoint <= 1;
85+
},
86+
},
87+
props: {
88+
footer: {
89+
type: Boolean,
90+
default: false,
91+
},
92+
modalOpen: {
93+
type: Boolean,
94+
default: false,
95+
},
4996
},
5097
data: () => ({
5198
disabled: false,
5299
selectedLanguage: availableLanguages[currentLanguage],
100+
internalModalOpen: false,
53101
}),
54102
methods: {
55103
switchLanguage() {
@@ -65,6 +113,18 @@
65113
global.location.reload(true);
66114
});
67115
},
116+
setAndSwitchLanguage(language) {
117+
this.selectedLanguage = language;
118+
this.switchLanguage();
119+
},
120+
closeModal() {
121+
this.internalModalOpen = false;
122+
this.$emit('close');
123+
},
124+
setModalOpen() {
125+
console.log('setting open');
126+
this.internalModalOpen = true;
127+
},
68128
},
69129
};
70130
@@ -78,6 +138,9 @@
78138
h1, p
79139
color: black
80140
141+
.more-button
142+
float: left
143+
81144
.selected
82145
font-weight: bold
83146
@@ -86,4 +149,23 @@
86149
text-decoration: underline $core-action-normal
87150
cursor: pointer
88151
152+
153+
.page-footer
154+
padding-left: 32px
155+
padding-top: 16px
156+
padding-bottom: 16px
157+
.lang-container
158+
display: inline-block
159+
width: 40%
160+
p
161+
float: left
162+
padding-left: 10px
163+
margin: 0
164+
button
165+
float: right
166+
position: absolute
167+
168+
.prompt
169+
padding-right: 16px
170+
89171
</style>

kolibri/plugins/user/assets/src/views/index.vue

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
<template>
22

3-
<core-base :navBarNeeded="navBarNeeded" :topLevelPageName="topLevelPageName" :appBarTitle="appBarTitle">
4-
<component :is="currentPage"/>
5-
</core-base>
3+
<div>
4+
<core-base :navBarNeeded="navBarNeeded" :topLevelPageName="topLevelPageName" :appBarTitle="appBarTitle">
5+
<component v-if="navBarNeeded" :is="currentPage"/>
6+
</core-base>
7+
<component v-if="!navBarNeeded" :is="currentPage"/>
8+
<language-switcher v-if="!navBarNeeded" :footer="true"/>
9+
</div>
610

711
</template>
812

@@ -16,6 +20,7 @@
1620
import signInPage from './sign-in-page';
1721
import signUpPage from './sign-up-page';
1822
import profilePage from './profile-page';
23+
import languageSwitcher from 'kolibri.coreVue.components.languageSwitcher';
1924
export default {
2025
$trs: { userProfileTitle: 'Profile' },
2126
name: 'userPlugin',
@@ -24,6 +29,7 @@
2429
signInPage,
2530
signUpPage,
2631
profilePage,
32+
languageSwitcher,
2733
},
2834
computed: {
2935
appBarTitle() {

0 commit comments

Comments
 (0)