From 3d865c2b7413bd3b77cbf630d574e6ce20213598 Mon Sep 17 00:00:00 2001 From: Timothy Koech Date: Tue, 9 Jun 2026 08:18:26 +0300 Subject: [PATCH 01/10] fix: update LanguagesEdit component to use sharedProps.config for languages --- src/frontend/settings/languages/languages-edit.story.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/settings/languages/languages-edit.story.vue b/src/frontend/settings/languages/languages-edit.story.vue index 67a6a9e8..1cf4ffb4 100644 --- a/src/frontend/settings/languages/languages-edit.story.vue +++ b/src/frontend/settings/languages/languages-edit.story.vue @@ -2,10 +2,10 @@ Date: Tue, 9 Jun 2026 08:49:57 +0300 Subject: [PATCH 02/10] refactor: update language handling in settings components to use LanguageTableItem type and improve structure --- .../controllers/settings_controller.stub | 26 +++- .../components/language-table-row.vue | 118 ++++++++++++++++++ .../components/language-table.story.vue | 10 +- .../languages/components/language-table.vue | 108 ++++------------ src/frontend/settings/settings-index.vue | 15 +-- src/frontend/test/mocks.ts | 32 ++++- src/types.ts | 2 +- 7 files changed, 207 insertions(+), 104 deletions(-) create mode 100644 src/frontend/settings/languages/components/language-table-row.vue diff --git a/src/backend/stubs/controllers/settings_controller.stub b/src/backend/stubs/controllers/settings_controller.stub index e223e0a4..e8ef381a 100644 --- a/src/backend/stubs/controllers/settings_controller.stub +++ b/src/backend/stubs/controllers/settings_controller.stub @@ -79,7 +79,7 @@ export default class SettingsController { public async index(ctx: HttpContext) { cms.localeFromPath(ctx); - const sourceLanguage = + const sourceLanguageSpec = cms.config.languages.find( (lang: LanguageSpecification) => lang.locale === cms.sourceLocale, ) ?? cms.config.languages[0]; @@ -90,8 +90,26 @@ export default class SettingsController { (progressItems ?? []).map((item) => [item.locale, item.progress]), ); + const defaultTranslationProgress = [ + { name: 'Interface', done: 0, draft: 0, total: 0 }, + { name: 'Content', done: 0, draft: 0, total: 0 }, + ]; + const users = await User.query().where('name', '!=', 'redacted'); + const sourceLanguage: LanguageTableItem = { + language: sourceLanguageSpec.language, + languageDirection: sourceLanguageSpec.languageDirection, + locale: sourceLanguageSpec.locale, + bibleLabel: sourceLanguageSpec.bibleLabel, + bibleVersion: sourceLanguageSpec.bibleVersion, + translationProgress: + translationProgressByLocale[sourceLanguageSpec.locale] ?? defaultTranslationProgress, + teamMembers: users + .filter((user) => user.language === sourceLanguageSpec.locale) + .map((user) => user.meta), + }; + const languageItems: LanguageTableItem[] = cms.config.languages .filter( (language: LanguageSpecification) => language.locale !== sourceLanguage.locale, @@ -102,10 +120,8 @@ export default class SettingsController { locale: language.locale, bibleLabel: language.bibleLabel, bibleVersion: language.bibleVersion, - translationProgress: translationProgressByLocale[language.locale] ?? [ - { name: 'Interface', done: 0, draft: 0, total: 0 }, - { name: 'Content', done: 0, draft: 0, total: 0 }, - ], + translationProgress: + translationProgressByLocale[language.locale] ?? defaultTranslationProgress, teamMembers: users .filter((user) => user.language === language.locale) .map((user) => user.meta), diff --git a/src/frontend/settings/languages/components/language-table-row.vue b/src/frontend/settings/languages/components/language-table-row.vue new file mode 100644 index 00000000..86f3178b --- /dev/null +++ b/src/frontend/settings/languages/components/language-table-row.vue @@ -0,0 +1,118 @@ + + + diff --git a/src/frontend/settings/languages/components/language-table.story.vue b/src/frontend/settings/languages/components/language-table.story.vue index 83d576c3..577668eb 100644 --- a/src/frontend/settings/languages/components/language-table.story.vue +++ b/src/frontend/settings/languages/components/language-table.story.vue @@ -3,16 +3,18 @@ - + import LangTable from './language-table.vue'; -import { languageTableItems, manyLanguageTableItems } from '../../../test/mocks'; +import { + languageTableItems, + manyLanguageTableItems, + sourceLanguage, +} from '../../../test/mocks'; import type { LanguageTableItem } from '../../../../types'; const onRemove = (item: LanguageTableItem) => { diff --git a/src/frontend/settings/languages/components/language-table.vue b/src/frontend/settings/languages/components/language-table.vue index 939cfdd3..e8bb62d5 100644 --- a/src/frontend/settings/languages/components/language-table.vue +++ b/src/frontend/settings/languages/components/language-table.vue @@ -39,70 +39,16 @@ - - - - - - - - -
- -
-
-

No team members yet

-

- Press the three dots to
- assign team members. -

-
- - - {{ truncate(item.bibleLabel, 30) }} - - - -
- - Assign team members - - - -
- - + @@ -137,20 +83,18 @@ diff --git a/src/frontend/settings/settings-index.vue b/src/frontend/settings/settings-index.vue index b907a161..e156a7f6 100644 --- a/src/frontend/settings/settings-index.vue +++ b/src/frontend/settings/settings-index.vue @@ -30,14 +30,9 @@
- -
-
{ - persistBibleTranslation(sourceLanguage.value.locale, bibleVersion, bibleVersionName); -}; - const handleTableBibleTranslationChange = ( item: LanguageTableItem, bibleVersion: string, diff --git a/src/frontend/test/mocks.ts b/src/frontend/test/mocks.ts index eedce499..788b3b32 100644 --- a/src/frontend/test/mocks.ts +++ b/src/frontend/test/mocks.ts @@ -1059,12 +1059,42 @@ export const languageTableItems: LanguageTableItem[] = [ }, ]; -export const sourceLanguage: LanguageSpecification = { +export const sourceLanguage: LanguageTableItem = { language: 'English | American', locale: 'en', languageDirection: 'ltr', bibleVersion: 'de4e12af7f28f599-01', bibleLabel: '(KJV) King James Version', + translationProgress: [ + { name: 'Interface', done: 100, draft: 0, total: 100 }, + { name: 'Content', done: 250, draft: 25, total: 300 }, + ], + teamMembers: [ + { + id: 1, + name: 'John Doe', + initials: 'JD', + email: 'john@example.com', + isManager: true, + isAdmin: true, + role: 'editor', + language: null, + hasPendingInvite: false, + isAllowed: isAllowedMock(true), + }, + { + id: 2, + name: 'Jane Smith', + initials: 'JS', + email: 'jane.smith@example.com', + isManager: false, + isAdmin: false, + role: 'editor', + language: null, + hasPendingInvite: false, + isAllowed: isAllowedMock(true), + }, + ], }; export const manyLanguageTableItems: LanguageTableItem[] = [ diff --git a/src/types.ts b/src/types.ts index d458f410..0a2294e0 100644 --- a/src/types.ts +++ b/src/types.ts @@ -673,7 +673,7 @@ export interface Providers { /// ---------------------------------------------------- export interface SettingsPageProps { - sourceLanguage: LanguageSpecification; + sourceLanguage: LanguageTableItem; languageItems: LanguageTableItem[]; providers: Providers; requireAppUpdate: boolean; From 690e7d17b9faf357ed87e727a9227a7800b232e0 Mon Sep 17 00:00:00 2001 From: Timothy Koech Date: Tue, 9 Jun 2026 08:55:03 +0300 Subject: [PATCH 03/10] refactor: enhance language handling in settings controller and streamline language table item creation --- .../controllers/settings_controller.stub | 70 +++++++++---------- .../components/language-table-row.vue | 2 +- 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/src/backend/stubs/controllers/settings_controller.stub b/src/backend/stubs/controllers/settings_controller.stub index e8ef381a..487f1441 100644 --- a/src/backend/stubs/controllers/settings_controller.stub +++ b/src/backend/stubs/controllers/settings_controller.stub @@ -53,19 +53,36 @@ const SUPPORT_CODES = { type SupportCode = (typeof SUPPORT_CODES)[keyof typeof SUPPORT_CODES]['code']; -function languageDisplayName(language: string): string { - return language.split('|')[0].trim(); -} +const defaultTranslationProgress = [ + { name: 'Interface', done: 0, draft: 0, total: 0 }, + { name: 'Content', done: 0, draft: 0, total: 0 }, +]; -function parseLanguageForSupport( +function toLanguageTableItem( spec: LanguageSpecification, -): SupportRequestLanguageSpec { + translationProgressByLocale: Record, + users: InstanceType[], +): LanguageTableItem { + return { + language: spec.language, + languageDirection: spec.languageDirection, + locale: spec.locale, + bibleLabel: spec.bibleLabel, + bibleVersion: spec.bibleVersion, + translationProgress: + translationProgressByLocale[spec.locale] ?? defaultTranslationProgress, + teamMembers: users + .filter((user) => user.language === spec.locale) + .map((user) => user.meta), + }; +} + +function parseLanguageForSupport(spec: LanguageSpecification): SupportRequestLanguageSpec { const { language, locale } = spec; - const name = languageDisplayName(language); + const name = language.split('|')[0].trim(); if (language.includes('|')) { - const nativeName = language.split('|')[1].trim(); - return { name, nativeName, locale }; + return { name, nativeName: language.split('|')[1].trim(), locale }; } return { name, nativeName: language, locale }; @@ -90,42 +107,21 @@ export default class SettingsController { (progressItems ?? []).map((item) => [item.locale, item.progress]), ); - const defaultTranslationProgress = [ - { name: 'Interface', done: 0, draft: 0, total: 0 }, - { name: 'Content', done: 0, draft: 0, total: 0 }, - ]; - const users = await User.query().where('name', '!=', 'redacted'); - const sourceLanguage: LanguageTableItem = { - language: sourceLanguageSpec.language, - languageDirection: sourceLanguageSpec.languageDirection, - locale: sourceLanguageSpec.locale, - bibleLabel: sourceLanguageSpec.bibleLabel, - bibleVersion: sourceLanguageSpec.bibleVersion, - translationProgress: - translationProgressByLocale[sourceLanguageSpec.locale] ?? defaultTranslationProgress, - teamMembers: users - .filter((user) => user.language === sourceLanguageSpec.locale) - .map((user) => user.meta), - }; + const sourceLanguage = toLanguageTableItem( + sourceLanguageSpec, + translationProgressByLocale, + users, + ); const languageItems: LanguageTableItem[] = cms.config.languages .filter( (language: LanguageSpecification) => language.locale !== sourceLanguage.locale, ) - .map((language: LanguageSpecification) => ({ - language: language.language, - languageDirection: language.languageDirection, - locale: language.locale, - bibleLabel: language.bibleLabel, - bibleVersion: language.bibleVersion, - translationProgress: - translationProgressByLocale[language.locale] ?? defaultTranslationProgress, - teamMembers: users - .filter((user) => user.language === language.locale) - .map((user) => user.meta), - })); + .map((language: LanguageSpecification) => + toLanguageTableItem(language, translationProgressByLocale, users), + ); const props: SettingsPageProps = { sourceLanguage, diff --git a/src/frontend/settings/languages/components/language-table-row.vue b/src/frontend/settings/languages/components/language-table-row.vue index 86f3178b..66ac87bf 100644 --- a/src/frontend/settings/languages/components/language-table-row.vue +++ b/src/frontend/settings/languages/components/language-table-row.vue @@ -1,5 +1,5 @@