Instance languages are working again

Also handle network errors.

Solves #1917
This commit is contained in:
Massedil
2026-01-08 17:16:32 +01:00
parent 0f9f08b142
commit 11a247d1e4

View File

@@ -178,11 +178,12 @@
</small> </small>
<o-taginput <o-taginput
v-model="instanceLanguages" v-model="instanceLanguages"
:data="filteredLanguages" :options="filteredLanguages"
allow-autocomplete allow-autocomplete
:open-on-focus="true" :open-on-focus="true"
field="name" field="name"
icon="label" icon="label"
:disabled="languageLoading"
:placeholder="t('Select languages')" :placeholder="t('Select languages')"
@input="getFilteredLanguages" @input="getFilteredLanguages"
id="instance-languages" id="instance-languages"
@@ -521,9 +522,12 @@
</div> </div>
</div> </div>
</section> </section>
<o-button type="submit" variant="primary">{{ <o-button
t("Save instance settings") type="submit"
}}</o-button> variant="primary"
:loading="onAdminSettingsLoading"
>{{ t("Save instance settings") }}</o-button
>
</form> </form>
</div> </div>
</div> </div>
@@ -556,6 +560,7 @@ import {
} from "@/utils/image"; } from "@/utils/image";
import { useDefaultMaxSize } from "@/composition/config"; import { useDefaultMaxSize } from "@/composition/config";
import { CONFIG } from "@/graphql/config"; import { CONFIG } from "@/graphql/config";
import { OptionsProp } from "@oruga-ui/oruga-next";
const defaultAdminSettings: IAdminSettings = { const defaultAdminSettings: IAdminSettings = {
instanceName: "", instanceName: "",
@@ -581,10 +586,19 @@ const defaultAdminSettings: IAdminSettings = {
externalLinks: [], externalLinks: [],
}; };
const { onResult: onAdminSettingsResult } = useQuery<{ const {
onResult: onAdminSettingsResult,
onError: onAdminSettingsError,
loading: onAdminSettingsLoading,
} = useQuery<{
adminSettings: IAdminSettings; adminSettings: IAdminSettings;
}>(ADMIN_SETTINGS); }>(ADMIN_SETTINGS);
onAdminSettingsError((error) => {
console.error(error);
alert(`Error when loading ADMIN_SETTINGS: ${error.message}`);
});
const { refetch: refetchConfig } = useQuery(CONFIG); const { refetch: refetchConfig } = useQuery(CONFIG);
const adminSettings = ref<IAdminSettings>(); const adminSettings = ref<IAdminSettings>();
@@ -607,9 +621,17 @@ const { file: instanceFaviconFile } = instanceFavicon;
const defaultPicture = initWrappedMedia(); const defaultPicture = initWrappedMedia();
const { file: defaultPictureFile } = defaultPicture; const { file: defaultPictureFile } = defaultPicture;
const { result: languageResult } = useQuery<{ languages: ILanguage[] }>( const {
LANGUAGES result: languageResult,
); onError: onLanguageError,
loading: languageLoading,
} = useQuery<{ languages: ILanguage[] }>(LANGUAGES);
onLanguageError((error) => {
console.error(error);
alert(`Error when loading LANGUAGES: ${error.message}`);
});
const languages = computed(() => languageResult.value?.languages); const languages = computed(() => languageResult.value?.languages);
const { t } = useI18n({ useScope: "global" }); const { t } = useI18n({ useScope: "global" });
@@ -618,6 +640,7 @@ useHead({
}); });
const settingsToWrite = ref<IAdminSettings>(defaultAdminSettings); const settingsToWrite = ref<IAdminSettings>(defaultAdminSettings);
const instanceLanguages = ref<string[]>([]);
watch(adminSettings, () => { watch(adminSettings, () => {
// We need to use structuredClone to clone deep properties of adminSettings (like externalLinks) // We need to use structuredClone to clone deep properties of adminSettings (like externalLinks)
@@ -627,6 +650,27 @@ watch(adminSettings, () => {
} }
}); });
watch([adminSettings, languages], ([newAdminSettings, newLanguages]) => {
// We need both ADMIN_SETTINGS and LANGUAGES queries to be finished
if (!newAdminSettings || !newLanguages) return;
// Initialize instanceLanguages with adminSettings received values
const languageCodes = [...(adminSettings.value?.instanceLanguages ?? [])];
instanceLanguages.value = languageCodes
.map((code) => languageForCode(code))
.filter((language) => language) as string[];
});
watch(instanceLanguages, async (newInstanceLanguages) => {
const newFilteredInstanceLanguages = newInstanceLanguages
.map((language) => {
return codeForLanguage(language);
})
.filter((code) => code !== undefined) as string[];
settingsToWrite.value.instanceLanguages = newFilteredInstanceLanguages;
});
const addLink = () => { const addLink = () => {
settingsToWrite.value.externalLinks.push({ settingsToWrite.value.externalLinks.push({
url: "", url: "",
@@ -639,7 +683,7 @@ const deleteLink = (index: number) => {
settingsToWrite.value.externalLinks.splice(index, 1); settingsToWrite.value.externalLinks.splice(index, 1);
}; };
const filteredLanguages = ref<string[]>([]); const filteredLanguages = ref<OptionsProp<string>>([]);
const registrationsMode = computed({ const registrationsMode = computed({
get() { get() {
@@ -667,26 +711,6 @@ const registrationsMode = computed({
}, },
}); });
const instanceLanguages = computed({
get() {
const languageCodes = [...(adminSettings.value?.instanceLanguages ?? [])];
return languageCodes
.map((code) => languageForCode(code))
.filter((language) => language) as string[];
},
set(newInstanceLanguages: string[]) {
const newFilteredInstanceLanguages = newInstanceLanguages
.map((language) => {
return codeForLanguage(language);
})
.filter((code) => code !== undefined) as string[];
settingsToWrite.value = {
...settingsToWrite.value,
instanceLanguages: newFilteredInstanceLanguages,
};
},
});
const notifier = inject<Notifier>("notifier"); const notifier = inject<Notifier>("notifier");
const { const {