Update prayer coverage threshold and status display (#15)

* Update daily prayer coverage threshold

* Show segmented prayer coverage status

* update prayer progress map legend wording

relabel map legend tiers to "No One Praying", "1+ People Praying", and "100+ People Praying" across all 11 locale legend files
update LABELS constant and tier comments in prayer-progress strategy
rebuild doxa-simple-map and doxa-research-map bundles

---------

Co-authored-by: corsacca <corsacca@gmail.com>
This commit is contained in:
ahillbilly 2026-06-17 11:04:19 +01:00 committed by GitHub
parent 3ab77a7af9
commit b65c764d86
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
26 changed files with 272 additions and 116 deletions

View file

@ -600,7 +600,7 @@ const showMore = computed(() => hasMore())
</div>
<div class="repel">
<p class="font-size-sm color-brand-lighter">{{ t.prayer_coverage }}:</p>
<p class="font-size-xl font-button">{{ uupg.people_committed ?? 0 }}/144</p>
<p class="font-size-xl font-button">{{ uupg.people_committed ?? 0 }}/100</p>
</div>
<div class="switcher | text-center" data-width="md">
<a class="highlighted-uupg__prayer-coverage-button button compact" :href="`${selectUrl}${uupg.slug}?source=doxalife`">{{ t.select }}</a>

View file

@ -16,7 +16,6 @@ const translations = computed(() => buildUupgListTranslations(t))
const {
stats,
prayerCoveragePercent,
totalPeopleGroups,
totalPeopleGroupsFormatted,
reload,
@ -43,6 +42,31 @@ const prayFeedbackConfig = JSON.stringify({
projectId: '809ee16b-46e2-4bcd-a93d-b7ea0879d93d'
})
const DEMO_PRAYER_COVERAGE = {
enabled: false,
complete: 100,
partial: 1300
}
const noPrayerCount = computed(() => {
if (DEMO_PRAYER_COVERAGE.enabled) {
return Math.max(0, totalPeopleGroups.value - DEMO_PRAYER_COVERAGE.partial - DEMO_PRAYER_COVERAGE.complete)
}
return Math.max(0, totalPeopleGroups.value - stats.value.total_with_prayer)
})
const partialPrayerCount = computed(() =>
DEMO_PRAYER_COVERAGE.enabled
? DEMO_PRAYER_COVERAGE.partial
: Math.max(0, stats.value.total_with_prayer - stats.value.total_with_full_prayer)
)
const fullPrayerCount = computed(() =>
DEMO_PRAYER_COVERAGE.enabled ? DEMO_PRAYER_COVERAGE.complete : stats.value.total_with_full_prayer
)
function getCoveragePercent(count: number) {
return `${Math.min(100, (count / totalPeopleGroups.value) * 100)}%`
}
useTextHighlight()
</script>
@ -60,22 +84,35 @@ useTextHighlight()
<div class="card-two-tone | text-center grow-1">
<div class="stack stack--lg">
<h2 class="h3">{{ t('Prayer Goal') }}</h2>
<p class="subtext font-size-md">{{ t('24-Hour Prayer Coverage') }}</p>
<p class="subtext font-size-md">{{ t('Mobilize 144+ people praying 10 minutes a day for all {0} people groups', [totalPeopleGroupsFormatted]) }}</p>
<p class="subtext font-size-md">{{ t('Mobilize 100+ people praying daily for each DOXA people group') }}</p>
</div>
<div>
<div class="stack stack--lg">
<h2 class="h3">{{ t('Current Status') }}</h2>
<span class="font-size-4xl font-weight-bold font-button">
<span id="prayer-current-status">{{ stats.total_with_full_prayer }}</span> / {{ totalPeopleGroups }}
</span>
<div class="stack stack--3xs">
<p class="subtext font-size-md">{{ t('People groups with committed 24-hour prayer coverage') }}</p>
<div class="progress-bar" data-size="md">
<p class="subtext font-size-md">{{ t('Out of {0} DOXA people groups:', [totalPeopleGroupsFormatted]) }}</p>
<div
class="progress-bar prayer-coverage-segments"
data-size="md"
:aria-label="t('Prayer coverage progress')"
>
<div
id="prayer-current-status-percentage"
class="progress-bar__slider"
:style="{ width: `${prayerCoveragePercent}%` }"
class="prayer-coverage-segment prayer-coverage-segment--full"
:style="{ width: getCoveragePercent(fullPrayerCount) }"
/>
<div
class="prayer-coverage-segment prayer-coverage-segment--partial"
:style="{ width: getCoveragePercent(partialPrayerCount) }"
/>
<div
class="prayer-coverage-segment prayer-coverage-segment--none"
:style="{ width: getCoveragePercent(noPrayerCount) }"
/>
</div>
<div class="prayer-coverage-legend">
<span><i class="prayer-coverage-key prayer-coverage-key--full" />{{ t('100+ People Praying') }}: {{ fullPrayerCount }}</span>
<span><i class="prayer-coverage-key prayer-coverage-key--partial" />{{ t('1+ People Praying') }}: {{ partialPrayerCount }}</span>
<span><i class="prayer-coverage-key prayer-coverage-key--none" />{{ t('No One Praying') }}: {{ noPrayerCount }}</span>
</div>
</div>
</div>
@ -318,4 +355,64 @@ useTextHighlight()
.research-map-link:hover {
color: var(--color-brand-primary-darker, #1f2328);
}
.prayer-coverage-segments {
display: flex;
height: clamp(15px, 6vw, 25px);
padding-top: 0 !important;
}
.prayer-coverage-segment {
height: 100%;
transition: width 1s ease-out;
}
.prayer-coverage-segment--none {
background: var(--color-brand-light);
}
.prayer-coverage-segment--partial {
background: #f0c64a;
}
.prayer-coverage-segment--full {
background: var(--color-brand-primary);
}
.prayer-coverage-legend {
display: grid;
justify-content: center;
gap: 0.55rem;
margin-top: 0.85rem;
font-size: clamp(1.2rem, 1.6vw, 1.45rem);
font-weight: 600;
text-align: center;
}
.prayer-coverage-legend span {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.4rem;
}
.prayer-coverage-key {
display: inline-block;
flex: 0 0 auto;
width: 0.75rem;
height: 0.75rem;
border-radius: 100px;
}
.prayer-coverage-key--none {
background: var(--color-brand-light);
}
.prayer-coverage-key--partial {
background: #f0c64a;
}
.prayer-coverage-key--full {
background: var(--color-brand-primary);
}
</style>

View file

@ -74,7 +74,7 @@ const adoptUrl = computed(() => {
})
const infoOpen = ref(false)
const FULL_PRAYER_COVERAGE_COUNT = 144
const FULL_PRAYER_COVERAGE_COUNT = 100
type StatusIcon = 'done' | 'partial' | 'not-done'
type StatusItem = {
@ -257,7 +257,7 @@ const mapSrc = computed(() => {
<div class="progress-bar" data-size="md">
<div class="progress-bar__slider" :style="{ width: `${prayerCoveragePercent}%` }" />
</div>
<p class="font-size-lg font-weight-medium">{{ t('24-Hour Prayer Coverage') }}</p>
<p class="font-size-lg font-weight-medium">{{ t('Daily Prayer Coverage') }}</p>
</div>
<a
class="button fit-content mx-auto stack-spacing-4xl clamp-padding"

View file

@ -2,9 +2,9 @@
* Prayer Progress Color Strategy
*
* Three-tier coloring based on prayer coverage:
* RED = Needs Prayer (peoplePraying === 0 or null)
* ORANGE = Has Prayer (0 < peoplePraying < FULL_PRAYER_THRESHOLD)
* GREEN = Full Prayer Coverage (peoplePraying >= FULL_PRAYER_THRESHOLD)
* RED = No One Praying (peoplePraying === 0 or null)
* ORANGE = 1+ People Praying (0 < peoplePraying < FULL_PRAYER_THRESHOLD)
* GREEN = 100+ People Praying (peoplePraying >= FULL_PRAYER_THRESHOLD)
*
* QA Session Round 2 A1: `people_praying` null = 0 = "not prayed for".
* When someone prays, people_praying updates to a positive integer → orange.
@ -17,23 +17,23 @@ export const PROPERTY_KEY = 'peoplePraying'
/**
* Number of people praying required for "Full Prayer Coverage".
* Set to match the platform's prayer goal (144 people per people group).
* Set to match the platform's prayer goal (100 people per people group).
* Adjust this constant to change the green threshold.
*/
export const FULL_PRAYER_THRESHOLD = 144
export const FULL_PRAYER_THRESHOLD = 100
export const PALETTE = {
noPrayer: '#e74c3c', // Red — Needs Prayer (default)
hasPrayer: '#f39c12', // Orange — Has Prayer (partial)
fullPrayer: '#22c55e' // Green — Full Prayer Coverage
noPrayer: '#e74c3c', // Red — No One Praying (default)
hasPrayer: '#f39c12', // Orange — 1+ People Praying (partial)
fullPrayer: '#22c55e' // Green — 100+ People Praying
}
export const PRAYER_COLORS = PALETTE
export const LABELS = {
noPrayer: 'Needs Prayer',
hasPrayer: 'Has Prayer',
fullPrayer: 'Has Full Prayer Coverage'
noPrayer: 'No One Praying',
hasPrayer: '1+ People Praying',
fullPrayer: '100+ People Praying'
}
export const PRAYER_LABELS = LABELS

View file

@ -13,9 +13,9 @@
"peopleGroupFallback": "مجموعة الشعب"
},
"prayer": {
"needsPrayer": "يحتاج إلى صلاة",
"hasPrayer": "لديه صلاة",
"fullPrayerCoverage": "تغطية صلاة كاملة"
"needsPrayer": "لا أحد يصلّي",
"hasPrayer": "شخص واحد أو أكثر يصلّي",
"fullPrayerCoverage": "أكثر من 100 شخص يصلّون"
},
"engagement": {
"needsEngagement": "يحتاج إلى انخراط",

View file

@ -13,9 +13,9 @@
"peopleGroupFallback": "Volksgruppe"
},
"prayer": {
"needsPrayer": "Braucht Gebet",
"hasPrayer": "Hat Gebet",
"fullPrayerCoverage": "Vollständige Gebetsabdeckung"
"needsPrayer": "Niemand betet",
"hasPrayer": "1+ Menschen beten",
"fullPrayerCoverage": "100+ Menschen beten"
},
"engagement": {
"needsEngagement": "Braucht Engagement",

View file

@ -14,9 +14,9 @@
"peopleGroupFallback": "People Group"
},
"prayer": {
"needsPrayer": "Needs Prayer",
"hasPrayer": "Has Prayer",
"fullPrayerCoverage": "Full Prayer Coverage"
"needsPrayer": "No One Praying",
"hasPrayer": "1+ People Praying",
"fullPrayerCoverage": "100+ People Praying"
},
"engagement": {
"needsEngagement": "Unengaged",

View file

@ -13,9 +13,9 @@
"peopleGroupFallback": "Grupo de personas"
},
"prayer": {
"needsPrayer": "Necesita oración",
"hasPrayer": "Tiene oración",
"fullPrayerCoverage": "Cobertura de oración completa"
"needsPrayer": "Nadie orando",
"hasPrayer": "1+ personas orando",
"fullPrayerCoverage": "100+ personas orando"
},
"engagement": {
"needsEngagement": "Necesita implicación",

View file

@ -13,9 +13,9 @@
"peopleGroupFallback": "Peuple"
},
"prayer": {
"needsPrayer": "Besoin de prière",
"hasPrayer": "Prière en cours",
"fullPrayerCoverage": "Couverture de prière complète"
"needsPrayer": "Personne ne prie",
"hasPrayer": "1+ personnes en prière",
"fullPrayerCoverage": "100+ personnes en prière"
},
"engagement": {
"needsEngagement": "Besoin d'engagement",

View file

@ -13,9 +13,9 @@
"peopleGroupFallback": "जनजाति समूह"
},
"prayer": {
"needsPrayer": "प्रार्थना चाहिए",
"hasPrayer": "प्रार्थना है",
"fullPrayerCoverage": "पूर्ण प्रार्थना कवरेज"
"needsPrayer": "कोई प्रार्थना नहीं कर रहा",
"hasPrayer": "1+ लोग प्रार्थना कर रहे हैं",
"fullPrayerCoverage": "100+ लोग प्रार्थना कर रहे हैं"
},
"engagement": {
"needsEngagement": "सहभागिता चाहिए",

View file

@ -13,9 +13,9 @@
"peopleGroupFallback": "Gruppo di persone"
},
"prayer": {
"needsPrayer": "Necessita preghiera",
"hasPrayer": "Ha preghiera",
"fullPrayerCoverage": "Copertura di preghiera completa"
"needsPrayer": "Nessuno prega",
"hasPrayer": "1+ persone in preghiera",
"fullPrayerCoverage": "100+ persone in preghiera"
},
"engagement": {
"needsEngagement": "Necessita impegno",

View file

@ -13,9 +13,9 @@
"peopleGroupFallback": "Grupo de pessoas"
},
"prayer": {
"needsPrayer": "Precisa de oração",
"hasPrayer": "Tem oração",
"fullPrayerCoverage": "Cobertura de oração completa"
"needsPrayer": "Ninguém orando",
"hasPrayer": "1+ pessoas orando",
"fullPrayerCoverage": "100+ pessoas orando"
},
"engagement": {
"needsEngagement": "Precisa de envolvimento",

View file

@ -13,9 +13,9 @@
"peopleGroupFallback": "Grup de popoare"
},
"prayer": {
"needsPrayer": "Necesită rugăciune",
"hasPrayer": "Are rugăciune",
"fullPrayerCoverage": "Acoperire completă de rugăciune"
"needsPrayer": "Nimeni nu se roagă",
"hasPrayer": "1+ persoane se roagă",
"fullPrayerCoverage": "100+ persoane se roagă"
},
"engagement": {
"needsEngagement": "Necesită implicare",

View file

@ -13,9 +13,9 @@
"peopleGroupFallback": "Народная группа"
},
"prayer": {
"needsPrayer": "Нуждается в молитве",
"hasPrayer": "Есть молитва",
"fullPrayerCoverage": "Полное молитвенное покрытие"
"needsPrayer": "Никто не молится",
"hasPrayer": "1+ человек молится",
"fullPrayerCoverage": "100+ человек молятся"
},
"engagement": {
"needsEngagement": "Нуждается в вовлечённости",

View file

@ -13,9 +13,9 @@
"peopleGroupFallback": "民族群体"
},
"prayer": {
"needsPrayer": "需要祷告",
"hasPrayer": "已有祷告",
"fullPrayerCoverage": "全面祷告覆盖"
"needsPrayer": "无人祷告",
"hasPrayer": "1+ 人祷告",
"fullPrayerCoverage": "100+ 人祷告"
},
"engagement": {
"needsEngagement": "需要参与",

View file

@ -1,4 +1,5 @@
{
"Daily Prayer Coverage": "تغطية صلاة يومية",
"All Countries": "جميع الدول",
"Countries": "الدول",
"Country Not Found": "الدولة غير موجودة",
@ -6,7 +7,6 @@
"Other": "أخرى",
"People Groups": "مجموعات بشرية",
"There are %count% people groups in %country%. Check the map for the people groups on the border of this country as well.": "توجد %count% مجموعات بشرية في %country%. تحقق من الخريطة لمعرفة المجموعات البشرية الواقعة على حدود هذه الدولة أيضًا.",
"24-Hour Prayer Coverage": "سلسلة صلاة مستمرة على مدار 24 ساعة",
"A church-led commitment to pray, give, and send so that gospel access begins": "الكنيسة تقودها روح الإلتزام بالصلاة والعطاء والإرسال لتفتح أبواب الوصول بالإنجيل",
"A clean, elegant theme for DOXA Life - Engaging every people group by 2033": "تصميم أنيق وبسيط لمنصة حياة دوكسا - للوصول إلى جميع الناس بحلول عام 2033",
"A simple path to faithful obedience": "الطريق البسيط للطاعة الأمينة",
@ -47,6 +47,9 @@
"Close": "مغلق",
"Close video": "إغلاق الفيديو",
"Commit": "إلتزام",
"100+ People Praying": "أكثر من 100 شخص يصلّون",
"1+ People Praying": "شخص واحد أو أكثر يصلّي",
"No One Praying": "لا أحد يصلّي",
"Contact": "جهة الإتصال",
"Contact Page": "صفحة الاتّصال",
"Contact Us": "تواصل معنا",
@ -132,7 +135,7 @@
"Message": "الرسالة",
"Mobilization of 20,000+ DOXA partnership missionaries": "حشد أكثر من 20.000 مبشّر بالتعاون مع شركاء دوكسا لتحقيق الرسالة المشتركة",
"Mobilize": "حشد المؤمنين",
"Mobilize 144+ people praying 10 minutes a day for all {0} people groups": "حشد أكثر من 144 شخص للصلاة لمدة 10 دقائق يوميا من أجل جميع المجموعات العرقية البالغ عددها {0} مجموعة",
"Mobilize 100+ people praying daily for each DOXA people group": "حشد أكثر من 100 شخص للصلاة يوميًا من أجل كل مجموعة بشرية من مجموعات دوكسا",
"Mobilize others in your church to join in prayer": "شجّعوا الآخرين في كنيستك على المشاركة في الصلاة",
"Mobilize toward the goal of at least 144 prayer partners to cover the people group in continuous, daily prayer (10 minutes each, 24 hours a day).": "تعبئة المشاركين نحو هدف الحصول على ما يقل عن 144 شريك صلاة لتغطية المجموعة البشرية بصلاة مستمرة يوميا، (10 دقائق كل شخص، على مدار 24 ساعة).",
"More": "المزيد",
@ -146,6 +149,7 @@
"Not Engaged": "غير مُنخرَط",
"Our gift to Jesus": "هديتنا إلى الرب يسوع",
"Our hope is to cover each of them in extraordinary prayer. You and your church can be part of it.": "رجاؤنا أن نغطي كل واحد منهم بصلاة استثنائية. يمكنك أنت وكنيستك أن تكونوا جزءًا من ذلك.",
"Out of {0} DOXA people groups:": "من بين {0} مجموعة بشرية من دوكسا:",
"Overview": "نظرة عامة",
"Page Not Found": "الصفحة غير موجودة",
"Partner": "شارك",
@ -155,7 +159,7 @@
"People Group": "مجموعة بشرية",
"People Group Not Found": "المجموعة البشرية غير موجودة",
"People committed to praying": "الأشخاص الذين التزموا بالصلاة",
"People groups with committed 24-hour prayer coverage": "المجموعات العرقية التي تتم تغطيتها بالصلاة المستمرة على مدار 24 ساعة",
"People groups with complete daily prayer coverage": "المجموعات العرقية التي لديها تغطية صلاة يومية كاملة",
"Per Page": "لكل صفحة",
"Phone": "الهاتف",
"Phone number is too long": "رقم الهاتف طويل جدًا",
@ -172,6 +176,7 @@
"Pray regularly for this people group and for gospel breakthrough": "واظبوا على الصلاة من أجل هذه المجموعة، طالبين أن يفتح الله الطريق لانتشار الإنجيل بينهم",
"Prayer Campaign QR Code": "رمز الاستجابة السريعة (QR) لحملة الصلاة",
"Prayer Coverage": "التغطية المستمرة بالصلاة",
"Prayer coverage progress": "تقدم تغطية الصلاة",
"Prayer Goal": "الغاية من الصلاة",
"Prayer Progress": "النموّ في حياة الصلاة",
"Prayer Status": "حالة الصلاة",

View file

@ -1,4 +1,5 @@
{
"Daily Prayer Coverage": "Tägliche Gebetsabdeckung",
"All Countries": "Alle Länder",
"Countries": "Länder",
"Country Not Found": "Land nicht gefunden",
@ -6,7 +7,6 @@
"Other": "Andere",
"People Groups": "Volksgruppen",
"There are %count% people groups in %country%. Check the map for the people groups on the border of this country as well.": "In %country% gibt es %count% Volksgruppen. Sieh auch auf der Karte nach den Volksgruppen an der Grenze dieses Landes.",
"24-Hour Prayer Coverage": "24-Stunden-Gebetsabdeckung",
"A church-led commitment to pray, give, and send so that gospel access begins": "Verpflichtung einer Ortsgemeinde zum Beten, Geben und Senden, damit ein Volk Zugang zum Evangelium erhält",
"A clean, elegant theme for DOXA Life - Engaging every people group by 2033": "Ein klares, elegantes Thema für DOXA Life – Bis 2033 alle Volksgruppen erreichen",
"A simple path to faithful obedience": "Drei einfache Schritte, die du gehen kannst",
@ -47,6 +47,9 @@
"Close": "Schließen",
"Close video": "Video schließen",
"Commit": "Jetzt mitmachen",
"100+ People Praying": "100+ Menschen beten",
"1+ People Praying": "1+ Menschen beten",
"No One Praying": "Niemand betet",
"Contact": "Kontakt",
"Contact Page": "Kontaktseite",
"Contact Us": "Kontaktiere uns",
@ -132,7 +135,7 @@
"Message": "Nachricht",
"Mobilization of 20,000+ DOXA partnership missionaries": "20,000 DOXA-Partnerschafts-Missionare zu mobilisieren",
"Mobilize": "Mobilize",
"Mobilize 144+ people praying 10 minutes a day for all {0} people groups": "Mobilisiere 144+ Fürbitter, welche 10 Minuten am Tag für alle {0} Volksgruppen beten",
"Mobilize 100+ people praying daily for each DOXA people group": "Mobilisiere 100+ Menschen, die täglich für jede DOXA-Volksgruppe beten",
"Mobilize others in your church to join in prayer": "Mobilisieren Sie andere in Ihrer Gemeinde, sich dem Gebet anzuschließen",
"Mobilize toward the goal of at least 144 prayer partners to cover the people group in continuous, daily prayer (10 minutes each, 24 hours a day).": "Mobilisiere für das Ziel, mindestens 144 Gebetspartner zu gewinnen, die diese Volksgruppe täglich ununterbrochen im Gebet begleiten (jeweils 10 Minuten, innerhalb 24 Stunden eines Tages).",
"More": "Mehr",
@ -146,6 +149,7 @@
"Not Engaged": "Nicht-engagiert",
"Our gift to Jesus": "Unser Geschenk an Jesus",
"Our hope is to cover each of them in extraordinary prayer. You and your church can be part of it.": "Unsere Hoffnung ist es, jede von ihnen mit außergewöhnlichem Gebet abzudecken. Du und deine Gemeinde können Teil davon sein.",
"Out of {0} DOXA people groups:": "Von {0} DOXA-Volksgruppen:",
"Overview": "Übersicht",
"Page Not Found": "Seite nicht gefunden",
"Partner": "Partner",
@ -155,7 +159,7 @@
"People Group": "Personengruppe",
"People Group Not Found": "Personengruppe nicht gefunden",
"People committed to praying": "Menschen, die sich dem Beten verpflichtet haben",
"People groups with committed 24-hour prayer coverage": "Volksgruppen mit zugesagter 24-Stunden-Gebetsabdeckung",
"People groups with complete daily prayer coverage": "Volksgruppen mit vollständiger täglicher Gebetsabdeckung",
"Per Page": "Pro Seite",
"Phone": "Telefon",
"Phone number is too long": "Die Telefonnummer ist zu lang.",
@ -172,6 +176,7 @@
"Pray regularly for this people group and for gospel breakthrough": "Betet regelmäßig für dieses Volk und für einen Durchbruch des Evangeliums",
"Prayer Campaign QR Code": "QR-Code für die Gebetskampagne",
"Prayer Coverage": "Gebetsabdeckung",
"Prayer coverage progress": "Fortschritt der Gebetsabdeckung",
"Prayer Goal": "Gebetsziel",
"Prayer Progress": "Gebetsfortschritt",
"Prayer Status": "Gebetsstatus",

View file

@ -1,5 +1,5 @@
{
"24-Hour Prayer Coverage": "24-Hour Prayer Coverage",
"Daily Prayer Coverage": "Daily Prayer Coverage",
"A church-led commitment to pray, give, and send so that gospel access begins": "A church-led commitment to pray, give, and send so that gospel access begins",
"A clean, elegant theme for DOXA Life - Engaging every people group by 2033": "A clean, elegant theme for DOXA Life - Engaging every people group by 2033",
"A simple path to faithful obedience": "A simple path to faithful obedience",
@ -40,6 +40,9 @@
"Close": "Close",
"Close video": "Close video",
"Commit": "Commit",
"100+ People Praying": "100+ People Praying",
"1+ People Praying": "1+ People Praying",
"No One Praying": "No One Praying",
"Contact": "Contact",
"All Countries": "All Countries",
"Contact Page": "Contact Page",
@ -132,7 +135,7 @@
"Message": "Message",
"Mobilization of 20,000+ DOXA partnership missionaries": "Mobilization of 20,000+ DOXA partnership missionaries",
"Mobilize": "Mobilize",
"Mobilize 144+ people praying 10 minutes a day for all {0} people groups": "Mobilize 144+ people praying 10 minutes a day for all {0} people groups",
"Mobilize 100+ people praying daily for each DOXA people group": "Mobilize 100+ people praying daily for each DOXA people group",
"Mobilize others in your church to join in prayer": "Mobilize others in your church to join in prayer",
"Mobilize toward the goal of at least 144 prayer partners to cover the people group in continuous, daily prayer (10 minutes each, 24 hours a day).": "Mobilize toward the goal of at least 144 prayer partners to cover the people group in continuous, daily prayer (10 minutes each, 24 hours a day).",
"More": "More",
@ -146,6 +149,7 @@
"Not Engaged": "Not Engaged",
"Our gift to Jesus": "Our gift to Jesus",
"Our hope is to cover each of them in extraordinary prayer. You and your church can be part of it.": "Our hope is to cover each of them in extraordinary prayer. You and your church can be part of it.",
"Out of {0} DOXA people groups:": "Out of {0} DOXA people groups:",
"Overview": "Overview",
"Page Not Found": "Page Not Found",
"Partner": "Partner",
@ -155,7 +159,7 @@
"People Group": "People Group",
"People Group Not Found": "People Group Not Found",
"People committed to praying": "People committed to praying",
"People groups with committed 24-hour prayer coverage": "People groups with committed 24-hour prayer coverage",
"People groups with complete daily prayer coverage": "People groups with complete daily prayer coverage",
"Per Page": "Per Page",
"Phone": "Phone",
"Phone number is too long": "Phone number is too long",
@ -172,6 +176,7 @@
"Pray regularly for this people group and for gospel breakthrough": "Pray regularly for this people group and for gospel breakthrough",
"Prayer Campaign QR Code": "Prayer Campaign QR Code",
"Prayer Coverage": "Prayer Coverage",
"Prayer coverage progress": "Prayer coverage progress",
"Prayer Goal": "Prayer Goal",
"Prayer Progress": "Prayer Progress",
"Prayer Status": "Prayer Status",

View file

@ -1,4 +1,5 @@
{
"Daily Prayer Coverage": "Cobertura diaria de oración",
"All Countries": "Todos los Países",
"Countries": "Países",
"Country Not Found": "País no encontrado",
@ -6,7 +7,6 @@
"Other": "Otros",
"People Groups": "Grupos Étnicos",
"There are %count% people groups in %country%. Check the map for the people groups on the border of this country as well.": "Hay %count% grupos étnicos en %country%. Consulta también el mapa para ver los grupos étnicos en la frontera de este país.",
"24-Hour Prayer Coverage": "Cobertura de oración las 24 horas",
"A church-led commitment to pray, give, and send so that gospel access begins": "Un compromiso impulsado por la iglesia para orar, dar y enviar, con el fin de que el evangelio sea accesible",
"A clean, elegant theme for DOXA Life - Engaging every people group by 2033": "Un tema limpio y elegante para DOXA Life: involucrar a todos los grupos de personas para 2033",
"A simple path to faithful obedience": "Un camino sencillo hacia la obediencia fiel",
@ -47,6 +47,9 @@
"Close": "Cerrar",
"Close video": "Cerrar vídeo",
"Commit": "Confirmar",
"100+ People Praying": "100+ personas orando",
"1+ People Praying": "1+ personas orando",
"No One Praying": "Nadie orando",
"Contact": "Contacto",
"Contact Page": "Página de contacto",
"Contact Us": "Contáctanos",
@ -132,7 +135,7 @@
"Message": "Mensaje",
"Mobilization of 20,000+ DOXA partnership missionaries": "Movilización de más de 20.000 misioneros asociados a DOXA",
"Mobilize": "Movilizar",
"Mobilize 144+ people praying 10 minutes a day for all {0} people groups": "Movilizar a más de 144 personas para que recen 10 minutos al día por los {0} grupos étnicos.",
"Mobilize 100+ people praying daily for each DOXA people group": "Movilizar a más de 100 personas que oren diariamente por cada grupo étnico DOXA.",
"Mobilize others in your church to join in prayer": "Anima a otros miembros de tu iglesia a unirse a la oración",
"Mobilize toward the goal of at least 144 prayer partners to cover the people group in continuous, daily prayer (10 minutes each, 24 hours a day).": "Movilízate con el objetivo de conseguir al menos 144 compañeros de oración para cubrir al grupo étnico con oraciones continuas y diarias (10 minutos cada uno, las 24 horas del día).",
"More": "Más",
@ -146,6 +149,7 @@
"Not Engaged": "No comprometido",
"Our gift to Jesus": "Nuestro regalo para Jesús",
"Our hope is to cover each of them in extraordinary prayer. You and your church can be part of it.": "Nuestra esperanza es cubrir a cada uno de ellos con oración extraordinaria. Tú y tu iglesia pueden ser parte de ello.",
"Out of {0} DOXA people groups:": "De {0} grupos étnicos DOXA:",
"Overview": "Resumen",
"Page Not Found": "Página no encontrada",
"Partner": "Asociarse",
@ -155,7 +159,7 @@
"People Group": "Grupo Étnico",
"People Group Not Found": "Grupo de personas no encontrado",
"People committed to praying": "Personas comprometidas con la oración",
"People groups with committed 24-hour prayer coverage": "Grupos de personas comprometidos con la cobertura de oración las 24 horas del día.",
"People groups with complete daily prayer coverage": "Grupos étnicos con cobertura diaria completa de oración",
"Per Page": "Por página",
"Phone": "Teléfono",
"Phone number is too long": "El número de teléfono es demasiado largo.",
@ -172,6 +176,7 @@
"Pray regularly for this people group and for gospel breakthrough": "Reza con regularidad por este grupo étnico y por que el Evangelio se abra paso entre ellos",
"Prayer Campaign QR Code": "Código QR de la campaña de oración",
"Prayer Coverage": "Cobertura de oración",
"Prayer coverage progress": "Progreso de la cobertura de oración",
"Prayer Goal": "Objetivo de oración",
"Prayer Progress": "Progreso de la oración",
"Prayer Status": "Estado de la oración",

View file

@ -1,4 +1,5 @@
{
"Daily Prayer Coverage": "Couverture de prière quotidienne",
"All Countries": "Tous les pays",
"Countries": "Pays",
"Country Not Found": "Pays introuvable",
@ -6,7 +7,6 @@
"Other": "Autre",
"People Groups": "Peuples",
"There are %count% people groups in %country%. Check the map for the people groups on the border of this country as well.": "Il y a %count% peuples en %country%. Consultez la carte pour découvrir également les peuples situés à la frontière de ce pays.",
"24-Hour Prayer Coverage": "Couverture de prière 24h/24",
"A church-led commitment to pray, give, and send so that gospel access begins": "Un engagement d'église locale pour prier, donner et envoyer afin que l'accès à l'Évangile commence",
"A clean, elegant theme for DOXA Life - Engaging every people group by 2033": "Un thème épuré et élégant pour DOXA Life - Engager chaque peuple d'ici 2033",
"A simple path to faithful obedience": "Un chemin simple vers une obéissance fidèle",
@ -47,6 +47,9 @@
"Close": "Fermer",
"Close video": "Fermer la vidéo",
"Commit": "S'engager",
"100+ People Praying": "100+ personnes en prière",
"1+ People Praying": "1+ personnes en prière",
"No One Praying": "Personne ne prie",
"Contact": "Contact",
"Contact Page": "Page de contact",
"Contact Us": "Contactez-nous",
@ -132,7 +135,7 @@
"Message": "Message",
"Mobilization of 20,000+ DOXA partnership missionaries": "Mobilisation de plus de 20 000 missionnaires en partenariat DOXA",
"Mobilize": "Mobiliser",
"Mobilize 144+ people praying 10 minutes a day for all {0} people groups": "Mobiliser plus de 144 personnes priant 10 minutes par jour pour chacun des {0} peuples",
"Mobilize 100+ people praying daily for each DOXA people group": "Mobiliser plus de 100 personnes priant chaque jour pour chaque peuple DOXA",
"Mobilize others in your church to join in prayer": "Mobilisez d'autres membres de votre église pour qu'ils se joignent à la prière",
"Mobilize toward the goal of at least 144 prayer partners to cover the people group in continuous, daily prayer (10 minutes each, 24 hours a day).": "Mobilisez-vous pour atteindre l'objectif d'au moins 144 partenaires de prière afin de couvrir ce peuple par une prière quotidienne et continue (10 minutes chacun, 24 heures sur 24).",
"More": "Plus",
@ -146,6 +149,7 @@
"Not Engaged": "Non engagé",
"Our gift to Jesus": "Notre offrande à Jésus",
"Our hope is to cover each of them in extraordinary prayer. You and your church can be part of it.": "Notre espoir est de couvrir chacun d'eux d'une prière extraordinaire. Vous et votre église pouvez y participer.",
"Out of {0} DOXA people groups:": "Sur {0} peuples DOXA :",
"Overview": "Aperçu",
"Page Not Found": "Page introuvable",
"Partner": "Partenariat",
@ -155,7 +159,7 @@
"People Group": "Peuple",
"People Group Not Found": "Peuple introuvable",
"People committed to praying": "Personnes engagées dans la prière",
"People groups with committed 24-hour prayer coverage": "Peuples bénéficiant d'une couverture de prière 24h/24",
"People groups with complete daily prayer coverage": "Peuples bénéficiant d'une couverture de prière quotidienne complète",
"Per Page": "Par page",
"Phone": "Téléphone",
"Phone number is too long": "Le numéro de téléphone est trop long.",
@ -172,6 +176,7 @@
"Pray regularly for this people group and for gospel breakthrough": "Priez régulièrement pour ce peuple et pour une percée de l'Évangile",
"Prayer Campaign QR Code": "Code QR de la campagne de prière",
"Prayer Coverage": "Couverture de prière",
"Prayer coverage progress": "Progression de la couverture de prière",
"Prayer Goal": "Objectif de la prière",
"Prayer Progress": "Progrès dans la prière",
"Prayer Status": "Statut de prière",

View file

@ -1,4 +1,5 @@
{
"Daily Prayer Coverage": "दैनिक प्रार्थना कवरेज",
"All Countries": "सभी देश",
"Countries": "देश",
"Country Not Found": "देश नहीं मिला",
@ -6,7 +7,6 @@
"Other": "अन्य",
"People Groups": "लोगों के समूह",
"There are %count% people groups in %country%. Check the map for the people groups on the border of this country as well.": "%country% में %count% लोगों के समूह हैं। इस देश की सीमा पर स्थित लोगों के समूहों के लिए मानचित्र भी देखें।",
"24-Hour Prayer Coverage": "24-घंटे की प्रार्थना कवरेज",
"A church-led commitment to pray, give, and send so that gospel access begins": "सुसमाचार की पहुँच शुरू हो सके, इसके लिए चर्च के नेतृत्व में प्रार्थना करने, दान देने और भेजने की प्रतिबद्धता।",
"A clean, elegant theme for DOXA Life - Engaging every people group by 2033": "DOXA Life के लिए एक स्वच्छ, सुरुचिपूर्ण थीम - 2033 तक प्रत्येक जनसमूह को संलग्न करना",
"A simple path to faithful obedience": "वफादार आज्ञाकारिता का एक सरल मार्ग",
@ -47,6 +47,9 @@
"Close": "बन्द करें",
"Close video": "वीडियो बंद करें",
"Commit": "प्रतिबद्धता",
"100+ People Praying": "100+ लोग प्रार्थना कर रहे हैं",
"1+ People Praying": "1+ लोग प्रार्थना कर रहे हैं",
"No One Praying": "कोई प्रार्थना नहीं कर रहा",
"Contact": "संपर्क करे",
"Contact Page": "संपर्क पृष्ठ",
"Contact Us": "हमसे संपर्क करें",
@ -132,7 +135,7 @@
"Message": "संदेश",
"Mobilization of 20,000+ DOXA partnership missionaries": "20,000+ DOXA साझेदारी मिशनरियों का संगठित होना",
"Mobilize": "लगातार सक्रिय रहो",
"Mobilize 144+ people praying 10 minutes a day for all {0} people groups": "सभी {0} जनसमूहों के लिए प्रतिदिन 10 मिनट प्रार्थना करने हेतु 144+ लोगों को सक्रिय करें।",
"Mobilize 100+ people praying daily for each DOXA people group": "प्रत्येक DOXA जनसमूह के लिए प्रतिदिन प्रार्थना करने हेतु 100+ लोगों को सक्रिय करें।",
"Mobilize others in your church to join in prayer": "अपने चर्च में दूसरों को प्रार्थना में शामिल होने के लिए प्रेरित करें।",
"Mobilize toward the goal of at least 144 prayer partners to cover the people group in continuous, daily prayer (10 minutes each, 24 hours a day).": "लोगों के समूह को निरंतर, दैनिक प्रार्थना (प्रत्येक 10 मिनट, दिन में 24 घंटे) के माध्यम से आच्छादित करने के लिए कम से कम 144 प्रार्थना साझेदारों को जुटाएँ।",
"More": "और ज्यादा",
@ -146,6 +149,7 @@
"Not Engaged": "अप्रवेशित",
"Our gift to Jesus": "यीशु को हमारा उपहार",
"Our hope is to cover each of them in extraordinary prayer. You and your church can be part of it.": "हमारी आशा है कि हम उनमें से प्रत्येक को असाधारण प्रार्थना से ढकें। आप और आपका चर्च इसका हिस्सा बन सकते हैं।",
"Out of {0} DOXA people groups:": "{0} DOXA जनसमूहों में से:",
"Overview": "अवलोकन",
"Page Not Found": "पृष्ठ नहीं मिला",
"Partner": "साझेदार",
@ -155,7 +159,7 @@
"People Group": "लोगों का समूह",
"People Group Not Found": "लोग समूह नहीं मिला",
"People committed to praying": "प्रार्थना के लिए प्रतिबद्ध लोग",
"People groups with committed 24-hour prayer coverage": "प्रतिबद्ध 24-घंटे की प्रार्थना कवरेज वाले लोगों के समूह",
"People groups with complete daily prayer coverage": "पूर्ण दैनिक प्रार्थना कवरेज वाले जनसमूह",
"Per Page": "प्रति पृष्ठ",
"Phone": "फ़ोन",
"Phone number is too long": "फ़ोन नंबर बहुत लंबा है",
@ -172,6 +176,7 @@
"Pray regularly for this people group and for gospel breakthrough": "इस जनसमूह और सुसमाचार की सफलता के लिए नियमित रूप से प्रार्थना करें।",
"Prayer Campaign QR Code": "प्रार्थना अभियान क्यूआर कोड",
"Prayer Coverage": "प्रार्थना कवरेज",
"Prayer coverage progress": "प्रार्थना कवरेज की प्रगति",
"Prayer Goal": "प्रार्थना का लक्ष्य",
"Prayer Progress": "प्रार्थना की प्रगति",
"Prayer Status": "प्रार्थना की स्थिति",

View file

@ -1,4 +1,5 @@
{
"Daily Prayer Coverage": "Cobertura diária de oração",
"All Countries": "Todos os países",
"Countries": "Países",
"Country Not Found": "País não encontrado",
@ -6,7 +7,6 @@
"Other": "Outros",
"People Groups": "Grupos étnicos",
"There are %count% people groups in %country%. Check the map for the people groups on the border of this country as well.": "Existem %count% grupos étnicos em %country%. Verifique no mapa também os grupos étnicos na fronteira deste país.",
"24-Hour Prayer Coverage": "Cobertura de oração 24 horas por dia",
"A church-led commitment to pray, give, and send so that gospel access begins": "Um compromisso liderado pela igreja para orar, doar e enviar, para que o evangelho comece a se tornar acessível",
"A clean, elegant theme for DOXA Life - Engaging every people group by 2033": "Um tema limpo e elegante para a DOXA Life - Envolvendo todos os grupos étnicos até 2033",
"A simple path to faithful obedience": "Um caminho simples para a obediência fiel",
@ -47,6 +47,9 @@
"Close": "Fechar",
"Close video": "Fechar vídeo",
"Commit": "Comprometa-se",
"100+ People Praying": "100+ pessoas orando",
"1+ People Praying": "1+ pessoas orando",
"No One Praying": "Ninguém orando",
"Contact": "Contatos",
"Contact Page": "Página de contacto",
"Contact Us": "Entre em contato conosco",
@ -132,7 +135,7 @@
"Message": "Mensagem",
"Mobilization of 20,000+ DOXA partnership missionaries": "Mobilização de mais de 20.000 missionários parceiros de DOXA",
"Mobilize": "Mobilize",
"Mobilize 144+ people praying 10 minutes a day for all {0} people groups": "Mobilizar mais de 144 pessoas para orar 10 minutos por dia por todos os {0} grupos étnicos",
"Mobilize 100+ people praying daily for each DOXA people group": "Mobilizar mais de 100 pessoas para orar diariamente por cada grupo étnico DOXA",
"Mobilize others in your church to join in prayer": "Mobilize outros membros da sua igreja para se unirem em oração",
"Mobilize toward the goal of at least 144 prayer partners to cover the people group in continuous, daily prayer (10 minutes each, 24 hours a day).": "Mobilize-se com o objetivo de ter pelo menos 144 parceiros de oração para cobrir o grupo étnico em oração contínua e diária (10 minutos cada, 24 horas por dia).",
"More": "Mais",
@ -146,6 +149,7 @@
"Not Engaged": "Não engajado",
"Our gift to Jesus": "Nossa oferta a Jesus",
"Our hope is to cover each of them in extraordinary prayer. You and your church can be part of it.": "Nossa esperança é cobrir cada um deles com oração extraordinária. Você e sua igreja podem fazer parte disso.",
"Out of {0} DOXA people groups:": "De {0} grupos étnicos DOXA:",
"Overview": "Visão geral",
"Page Not Found": "Página não encontrada",
"Partner": "Faça Parceria",
@ -155,7 +159,7 @@
"People Group": "Grupo étnico",
"People Group Not Found": "Grupo de pessoas não encontrado",
"People committed to praying": "Pessoas comprometidas com a oração",
"People groups with committed 24-hour prayer coverage": "Grupos étnicos com cobertura de oração 24 horas por dia",
"People groups with complete daily prayer coverage": "Grupos étnicos com cobertura diária completa de oração",
"Per Page": "Por página",
"Phone": "Telefone",
"Phone number is too long": "O número de telefone é muito longo",
@ -172,6 +176,7 @@
"Pray regularly for this people group and for gospel breakthrough": "Reze regularmente por este grupo étnico e por um avanço do Evangelho",
"Prayer Campaign QR Code": "Código QR da Campanha de Oração",
"Prayer Coverage": "Cobertura de oração",
"Prayer coverage progress": "Progresso da cobertura de oração",
"Prayer Goal": "Meta de oração",
"Prayer Progress": "Progresso da oração",
"Prayer Status": "Status de oração",

View file

@ -1,4 +1,5 @@
{
"Daily Prayer Coverage": "Ежедневная молитвенная поддержка",
"All Countries": "Все страны",
"Countries": "Страны",
"Country Not Found": "Страна не найдена",
@ -6,7 +7,6 @@
"Other": "Другое",
"People Groups": "Группы людей",
"There are %count% people groups in %country%. Check the map for the people groups on the border of this country as well.": "Страна %country% насчитывает %count% групп людей. Проверьте также на карте группы людей, расположенные вдоль границ этой страны.",
"24-Hour Prayer Coverage": "24-часовая молитвенная поддержка",
"A church-led commitment to pray, give, and send so that gospel access begins": "Обязательство церкви молиться, жертвовать и посылать миссионеров, чтобы Евангелие стало доступным",
"A clean, elegant theme for DOXA Life - Engaging every people group by 2033": "Чистая, элегантная тема для DOXA Life — привлечение всех народов к 2033 году",
"A simple path to faithful obedience": "Простой путь к верному послушанию",
@ -47,6 +47,9 @@
"Close": "Закрыть",
"Close video": "Закрыть видео",
"Commit": "Подтвердить",
"100+ People Praying": "100+ человек молятся",
"1+ People Praying": "1+ человек молится",
"No One Praying": "Никто не молится",
"Contact": "Контакт",
"Contact Page": "Страница контактов",
"Contact Us": "Связаться с нами",
@ -132,7 +135,7 @@
"Message": "Сообщение",
"Mobilization of 20,000+ DOXA partnership missionaries": "Мобилизация более 20 000 миссионеров-партнеров DOXA",
"Mobilize": "Мобилизовать",
"Mobilize 144+ people praying 10 minutes a day for all {0} people groups": "Мобилизуйте 144+ человек для молитвы по 10 минут в день за все {0} народностей",
"Mobilize 100+ people praying daily for each DOXA people group": "Мобилизуйте 100+ человек для ежедневной молитвы за каждую народность DOXA",
"Mobilize others in your church to join in prayer": "Призовите других членов вашей церкви присоединиться к молитве",
"Mobilize toward the goal of at least 144 prayer partners to cover the people group in continuous, daily prayer (10 minutes each, 24 hours a day).": "Мобилизуйтесь для достижения цели: собрать как минимум 144 молитвенных партнера, которые будут ежедневно, непрерывно молиться за эту народность (по 10 минут каждый, 24 часа в сутки).",
"More": "Больше",
@ -146,6 +149,7 @@
"Not Engaged": "Невовлечённый",
"Our gift to Jesus": "Наш подарок Иисусу",
"Our hope is to cover each of them in extraordinary prayer. You and your church can be part of it.": "Мы надеемся покрыть каждую из них особой молитвой. Вы и ваша церковь можете стать частью этого.",
"Out of {0} DOXA people groups:": "Из {0} народностей DOXA:",
"Overview": "Обзор",
"Page Not Found": "Страница не найдена",
"Partner": "Партнер",
@ -155,7 +159,7 @@
"People Group": "Группа людей",
"People Group Not Found": "Группа людей не найдена",
"People committed to praying": "Люди, посвятившие себя молитве",
"People groups with committed 24-hour prayer coverage": "Народности, охваченные постоянной 24-часовой молитвенной поддержкой",
"People groups with complete daily prayer coverage": "Народности с полной ежедневной молитвенной поддержкой",
"Per Page": "За страницу",
"Phone": "Телефон",
"Phone number is too long": "Номер телефона слишком длинный",
@ -172,6 +176,7 @@
"Pray regularly for this people group and for gospel breakthrough": "Регулярно молитесь за этот народ и за прорыв Евангелия",
"Prayer Campaign QR Code": "QR-код молитвенной кампании",
"Prayer Coverage": "Молитвенное покрытие",
"Prayer coverage progress": "Прогресс молитвенного покрытия",
"Prayer Goal": "Цель молитвы",
"Prayer Progress": "Прогресс молитвы",
"Prayer Status": "Статус молитвы",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -19,21 +19,40 @@ export interface PrayerStatisticsResponse {
committed_duration: string
}
interface PeopleGroupListResponse {
posts?: Array<{ people_committed?: number | string | null }>
}
const FULL_PRAYER_COVERAGE_COUNT = 100
export default defineCachedEventHandler(
async (): Promise<PrayerStatisticsResponse> => {
const config = useRuntimeConfig()
const prayBaseUrl = String(config.public.prayBaseUrl || '').replace(/\/$/, '')
const data = await $fetch<Partial<PrayerStatisticsResponse>>(
`${prayBaseUrl}/api/people-groups/statistics`,
{ timeout: 10_000 }
)
const data = await $fetch<Partial<PrayerStatisticsResponse>>(`${prayBaseUrl}/api/people-groups/statistics`, { timeout: 10_000 })
let totalWithPrayer = Number(data.total_with_prayer || 0)
let totalWithFullPrayer = Number(data.total_with_full_prayer || 0)
try {
const list = await $fetch<PeopleGroupListResponse>(
`${prayBaseUrl}/api/people-groups/list?fields=people_committed`,
{ timeout: 10_000 }
)
const committedCounts = (list.posts || []).map(post => Number(post.people_committed || 0))
totalWithPrayer = committedCounts.filter(count => count > 0).length
totalWithFullPrayer = committedCounts.filter(count => count >= FULL_PRAYER_COVERAGE_COUNT).length
} catch (error) {
console.warn('Unable to derive prayer coverage statistics from people-group list:', error)
}
return {
total: Number(data.total || 0),
total_unengaged: Number(data.total_unengaged || 0),
total_population: Number(data.total_population || 0),
unengaged_population: Number(data.unengaged_population || 0),
total_with_prayer: Number(data.total_with_prayer || 0),
total_with_full_prayer: Number(data.total_with_full_prayer || 0),
total_with_prayer: totalWithPrayer,
total_with_full_prayer: totalWithFullPrayer,
total_adopted: Number(data.total_adopted || 0),
people_committed: String(data.people_committed || '0'),
committed_duration: String(data.committed_duration || '0')