Skip to content
Snippets Groups Projects

Fix: Organization field in user profile

Merged Petar Hristov requested to merge Hotfix/1963-fixOrganizationField into dev
Files
3
@@ -62,7 +62,9 @@
<b-form-input
id="givenname"
v-model="$v.form.givenname.$model"
:state="$v.form.givenname.$dirty ? !$v.form.givenname.$error : null"
:state="
$v.form.givenname.$dirty ? !$v.form.givenname.$invalid : null
"
:placeholder="
$t('page.userprofile.form.personalInformation.givenName')
"
@@ -81,7 +83,7 @@
<b-form-input
id="surname"
v-model="$v.form.surname.$model"
:state="$v.form.surname.$dirty ? !$v.form.surname.$error : null"
:state="$v.form.surname.$dirty ? !$v.form.surname.$invalid : null"
:placeholder="
$t('page.userprofile.form.personalInformation.surname')
"
@@ -101,7 +103,9 @@
id="Email"
v-model="$v.form.emailAddress.$model"
:state="
$v.form.emailAddress.$dirty ? !$v.form.emailAddress.$error : null
$v.form.emailAddress.$dirty || !form.emailAddress
? !$v.form.emailAddress.$invalid
: null
"
:placeholder="$t('page.userprofile.form.personalInformation.email')"
/>
@@ -126,8 +130,6 @@
:options="ror"
:multiple="false"
:loading="loadingOrganizations"
label="displayName"
track-by="displayName"
:show-labels="false"
:placeholder="
$t(
@@ -136,12 +138,6 @@
"
@search-change="triggerFetchOptions"
>
<template slot="singleLabel" slot-scope="props">
{{ props.option.displayName }}
</template>
<template slot="option" slot-scope="props">
{{ props.option.displayName }}
</template>
<template slot="noOptions">
{{
$t(
@@ -251,6 +247,7 @@
<CoscineHeadline
:headline="$t('page.userprofile.form.userPreferences.header')"
/>
<!-- Language -->
<coscine-form-group
:mandatory="true"
label-for="language"
@@ -263,7 +260,10 @@
<b-form-radio-group
id="language"
class="bv-no-focus-ring"
:checked="form.language !== undefined ? form.language.id : false"
:checked="
form.language && form.language.id ? form.language.id : false
"
:state="form.language && form.language.id ? null : false"
:options="languages"
name="radios-stacked"
text-field="displayName"
@@ -330,38 +330,8 @@
:disabled="$v.form.$invalid || savingProfile || !$v.form.$anyDirty"
@click.prevent="clickSave"
>
<b-iconstack
v-if="savingProfile"
animation="spin"
aria-hidden="true"
>
<b-icon
stacked
icon="dot"
aria-hidden="true"
shift-v="4"
></b-icon>
<b-icon
stacked
icon="dot"
aria-hidden="true"
shift-v="-4"
></b-icon>
<b-icon
stacked
icon="dot"
aria-hidden="true"
shift-h="4"
></b-icon>
<b-icon
stacked
icon="dot"
aria-hidden="true"
shift-h="-4"
></b-icon>
</b-iconstack>
{{ $t("buttons.save") }}</b-button
>
{{ $t("buttons.save") }}
</b-button>
</coscine-form-group>
</b-form>
</div>
@@ -422,9 +392,15 @@ export default defineComponent({
email,
required,
},
organization: {},
institute: {},
disciplines: {},
organization: {
required,
},
institute: {
required,
},
disciplines: {
required,
},
language: {
id: {},
},
@@ -469,11 +445,12 @@ export default defineComponent({
this.institutes.length > 0
);
},
institutes(): OrganizationObject[] {
institutes(): string[] {
if (this.memberOrganizations) {
return this.memberOrganizations.filter(
(organization) => organization.url?.indexOf("#") !== -1
);
return this.memberOrganizations
.filter((organization) => organization.url?.indexOf("#") !== -1) // If does contain "#" it's a sub level organization, otherwise top level
.map((org) => (org.displayName ? org.displayName : "")) // Extract organization display name, could contain empty strings
.filter((n) => n); // Filter out empty strings, if any;;
}
return [];
},
@@ -493,16 +470,22 @@ export default defineComponent({
}
return false;
},
organizations(): OrganizationObject[] {
organizations(): string[] {
if (this.memberOrganizations) {
this.memberOrganizations.filter(
(organization) => !(organization.url?.indexOf("#") !== -1)
);
return this.memberOrganizations
.filter((organization) => !(organization.url?.indexOf("#") !== -1)) // If does contain "#" it's a sub level organization, otherwise top level
.map((org) => (org.displayName ? org.displayName : "")) // Extract organization display name, could contain empty strings
.filter((n) => n); // Filter out empty strings, if any;
}
return [];
},
ror(): null | OrganizationObject[] {
return this.userStore.userProfile.organizations;
ror(): null | string[] {
const organizations = this.userStore.userProfile.organizations;
if (organizations) {
return organizations
.map((org) => (org.displayName ? org.displayName : "")) // Extract organization display name, could contain empty strings
.filter((n) => n); // Filter out empty strings, if any
} else return null;
},
shibbolethConnected(): boolean {
if (this.user.externalAuthenticators) {
@@ -552,6 +535,9 @@ export default defineComponent({
this.$v.form.$anyDirty
) {
this.savingProfile = true;
// SECTION FOR SAVING ANY EMAIL CHANGES
// SIDE EFFECT: NO OTHER FIELD CHANGE CAN BE SAVED TOGETHER WITH A CHANGE OF THE EMAIL ADDRESS
// TODO
if (
this.form.emailAddress &&
this.form.emailAddress !== this.user.emailAddress
@@ -570,22 +556,28 @@ export default defineComponent({
).toString(),
});
}
try {
await this.userStore.updateUser(this.form);
this.$v.form.$reset();
// SECTION FOR SAVING THE REST OF THE FIELDS
const updatedUser = await this.userStore.updateUser(this.form);
if (updatedUser) {
// On Success
this.$v.form.$reset()
this.notificationStore.postNotification({
title: this.$t("toast.onSave.success.title").toString(),
body: this.$t("toast.onSave.success.message").toString(),
});
} catch {
} else {
this.savingProfile = false;
// On Failure
this.notificationStore.postNotification({
title: this.$t("toast.onSave.failure.title").toString(),
body: this.$t("toast.onSave.failure.message").toString(),
variant: "danger",
});
} finally {
this.savingProfile = false;
}
await Promise.all([
this.userStore.retrieveContactChange(),
this.userStore.retrieveUser(),
]);
}
},
triggerFetchOptions(search: string) {
Loading