Skip to content

Commit

Permalink
Merge branch 'refs/heads/master' into 9544_offline_freetext
Browse files Browse the repository at this point in the history
  • Loading branch information
jkuester committed Jan 6, 2025
2 parents 471bf18 + cfa682f commit c0b3081
Show file tree
Hide file tree
Showing 123 changed files with 7,332 additions and 1,524 deletions.
1 change: 1 addition & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ https://docs.communityhealthtoolkit.org/contribute/code/workflow/#commit-message

# Code review checklist
<!-- Remove or comment out any items that do not apply to this PR; in the remaining boxes, replace the [ ] with [x]. -->
- [ ] UI/UX backwards compatible: Test it works for the new design (enabled by default). And test it works in the old design, enable `can_view_old_navigation` permission to see the old design.
- [ ] Readable: Concise, well named, follows the [style guide](https://docs.communityhealthtoolkit.org/contribute/code/style-guide/), documented if necessary.
- [ ] Documented: Configuration and user documentation on [cht-docs](https://github.com/medic/cht-docs/)
- [ ] Tested: Unit and/or e2e where appropriate
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ Builds brought to you courtesy of GitHub Actions.

## Copyright

Copyright 2013-2022 Medic Mobile, Inc. <[email protected]>
Copyright 2013-2025 Medic Mobile, Inc. <[email protected]>

## License

Expand Down
5 changes: 4 additions & 1 deletion admin/src/js/services/session.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,14 @@ const _ = require('lodash/core');
}
ipCookie.remove(COOKIE_NAME, { path: '/' });
userCtxCookieValue = undefined;
// Clear browser history to prevent loading page on browser's back button after logout.
$window.history.pushState(null, null, '/');
$window.location.href = `/${Location.dbName}/login?${params.toString()}`;
};

const logout = function() {
return $http.delete('/_session')
return $http
.delete('/_session')
.catch(function() {
// Set cookie to force login before using app
ipCookie('login', 'force', { path: '/' });
Expand Down
11 changes: 11 additions & 0 deletions admin/tests/unit/services/session.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ describe('Session service', function() {
let ipCookie;
let ipCookieRemove;
let location;
let pushStateStub;
let $httpBackend;
let Location;

Expand All @@ -14,6 +15,7 @@ describe('Session service', function() {
ipCookie = sinon.stub();
ipCookieRemove = sinon.stub();
ipCookie.remove = ipCookieRemove;
pushStateStub = sinon.stub();
Location = {};
location = {};
module(function ($provide) {
Expand All @@ -24,6 +26,7 @@ describe('Session service', function() {
$provide.factory('$window', function() {
return {
angular: { callbacks: [] },
history: { pushState: pushStateStub },
location: location,
};
});
Expand Down Expand Up @@ -59,6 +62,8 @@ describe('Session service', function() {
$httpBackend.flush();
chai.expect(location.href).to.equal(`/DB_NAME/login?redirect=CURRENT_URL&username=${expected.name}`);
chai.expect(ipCookieRemove.args[0][0]).to.equal('userCtx');
chai.expect(pushStateStub.calledOnce).to.be.true;
chai.expect(pushStateStub.args[0]).to.have.members([ null, null, '/' ]);
done();
});

Expand All @@ -73,6 +78,8 @@ describe('Session service', function() {
$httpBackend.flush();
chai.expect(location.href).to.equal('/DB_NAME/login?redirect=CURRENT_URL');
chai.expect(ipCookieRemove.args[0][0]).to.equal('userCtx');
chai.expect(pushStateStub.calledOnce).to.be.true;
chai.expect(pushStateStub.args[0]).to.have.members([ null, null, '/' ]);
done();
});

Expand All @@ -96,6 +103,7 @@ describe('Session service', function() {
service.checkCurrentSession();
$httpBackend.flush();
chai.expect(ipCookieRemove.callCount).to.equal(0);
chai.expect(pushStateStub.notCalled).to.be.true;
done();
});

Expand All @@ -114,6 +122,8 @@ describe('Session service', function() {
$httpBackend.flush();
chai.expect(location.href).to.equal(`/DB_NAME/login?redirect=CURRENT_URL&username=${expected.name}`);
chai.expect(ipCookieRemove.args[0][0]).to.equal('userCtx');
chai.expect(pushStateStub.calledOnce).to.be.true;
chai.expect(pushStateStub.args[0]).to.have.members([ null, null, '/' ]);
done();
});

Expand All @@ -125,6 +135,7 @@ describe('Session service', function() {
service.checkCurrentSession();
$httpBackend.flush();
chai.expect(ipCookieRemove.callCount).to.equal(0);
chai.expect(pushStateStub.notCalled).to.be.true;
done();
});

Expand Down
1,352 changes: 1,352 additions & 0 deletions api/resources/translations/messages-ar.properties

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions api/resources/translations/messages-fr.properties
Original file line number Diff line number Diff line change
Expand Up @@ -854,7 +854,7 @@ messages.n.report_accepted = Merci {{contact.name}} d'avoir enregistré {{patien
messages.n.validation.patient_name = {{\#patient_name}} Le format est incorrect, assurez-vous que le message commence avec N suivi d'un espace et du nom de la personne (maximum 30 charactères).{{/patient_name}}{{^patient_name}} Le format est incorrect, assurez-vous que le message commence avec N suivi du nom de la personne.{{/patient_name}}
messages.off.report_accepted = Aucune autre notification concernant {{patient_name}} ne sera envoyée tant que vous n'aurez pas envoyé 'ON {{patient_id}}'. {{\#chw_sms}} {{chw_sms}} {{/chw_sms}}
messages.on.report_accepted = Les notifications pour {{patient_name}} ({{patient_id}}) ont été réactivées. {{\#chw_sms}} {{chw_sms}} {{/chw_sms}}
messages.p.report_accepted = Merci pour avoir enregistré la grossesse
messages.p.report_accepted = Merci pour avoir enregistré la grossesse de {{patient_name}} ({{patient_id}}).{{\#expected_date}} La date prévue pour l'accouchement est {{\#date}}{{expected_date}}{{/date}}{{/expected_date}}
messages.p.validation.last_menstrual_period = Le format d'enregistrement pour {{patient_name}} est incorrect, merci de vous assurer que la dernière menstruation soit un nombre entre 2 et 42.
messages.relay.chw_sms = {{\#chw_sms}}{{chw_sms}}{{/chw_sms}}
messages.schedule.anc.checkin = Où est-ce que {{patient_name}} a acouché? Répondez par 'D {{patient_id}} F' pour un accouchement dans un centre de santé, 'D {{patient_id}} S' pour un accouchement à domicile avec une accoucheuse qualifiée, 'D {{patient_id}} NS pour un accouchement à domicile non qualifié.
Expand Down Expand Up @@ -934,8 +934,8 @@ messages.schedule.postnatal.day_7 = Merci de vérifier si le {{patient_name}} ({
messages.schedule.postnatal.day_7_overdue = Est-ce que le patient {{patient_name}} ({{patient_id}}) est allé à la CPON du 7ème jour ? Confirmez avec 'M {{patient_id}}'. Merci \!
messages.schedule.postnatal.week_6 = Merci de vérifier si le {{patient_name}} ({{patient_id}}) est partie cette semaine pour sa visite postnatale de la semaine - 6. Quand c'est fait, merci de nous le notifier avec 'M {{patient_id}}'. Merci \!
messages.schedule.postnatal.week_6_overdue = Est-ce que {{patient_name}} ({{patient_id}}) est allée pour sa visite de 6eme semaine? Merci de confirmer en envoyant 'M {{patient_id}}'. Merci\!
messages.schedule.registration.followup_anc = Salut {{contact.name}}, n'oubliez de soumettre l'enregistrement de la grossesse pour {{patient_name}} {{patient_id}} avec 'P {{patient_id}} <Weeks since LMP>'. Merci\!
messages.schedule.registration.followup_anc_pnc = {{contact.name}}, est-ce que {{patient_name}} {{patient_id}} a besoin de soins? Pour enregistrer une grossesse envoyer 'P {{patient_id}} <Weeks since LMP>'. Pour les Soins postnataux, soumettre un rapport d'accouchement en envoyant 'D {{patient_id}} <Delivery Code> <Days Since Delivery>'. Merci\!
messages.schedule.registration.followup_anc = Salut {{contact.name}}, n'oubliez de soumettre l'enregistrement de la grossesse pour {{patient_name}} {{patient_id}} avec 'P {{patient_id}} <Semaines depuis les dernières règles>'. Merci\!
messages.schedule.registration.followup_anc_pnc = {{contact.name}}, est-ce que {{patient_name}} {{patient_id}} a besoin de soins? Pour enregistrer une grossesse envoyer 'P {{patient_id}} <Semaines depuis les dernières règles>'. Pour les Soins postnataux, soumettre un rapport d'accouchement en envoyant 'D {{patient_id}} <Code Accouchement> <Jours depuis Accouchement>'. Merci\!
messages.sent.by = Soumis par {{senderName}}
messages.unknown.sender = Émetteur inconnu
messages.v.report_accepted = Merci beaucoup {{contact.name}}, la visite de {{patient_name}} ({{patient_id}}) a été enregistrée.
Expand Down
117 changes: 58 additions & 59 deletions api/resources/translations/messages-id.properties
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ Contacts = Orang
Contacts\ file\ help = Pilih file .json untuk kontak
Content = Isi
Continue = Lanjut
Current\ Password =
Current\ Password = Kata sandi saat ini
Dashboard\ settings\ page = Halaman pengaturan dashboard
Date\ display\ format = Format tampilan tanggal
Datetime\ display\ format = Format tampilan tanggalwaktu
Expand All @@ -61,7 +61,7 @@ Delete = Hapus
Deleting = Menghapus
Disable = Dimatikan
Discard\ changes\ to\ current\ language = Anda ingin melanjutkan dan membuang perubahan yang dibuat bagi bahasa yang saat ini digunakan?
Display =
Display = Tampilan
District = Kabupaten
District\ Contact\ Name = Nama Kontak
District\ Contact\ Phone = Nomor telepon
Expand Down Expand Up @@ -162,7 +162,7 @@ No\ registrations\ found = Tidak ada registrasi yang ditemukan untuk jadwal ini.
No\ report\ selected = Tidak ada laporan yang dipilih
No\ reports\ found = Tidak ada laporan ditemukan
No\ schedules\ found = Tidak ada jadwal yang ditemukan
No\ submission =
No\ submission = Jangan bagikan data dampak.
No\ task\ selected = Tidak ada tugas yang dipilih
No\ tasks\ found = Tidak ada tugas yang ditemukan
Notes = Catatan
Expand Down Expand Up @@ -280,18 +280,18 @@ action.district_hospital.add = Kabupaten Baru
action.health_center.add = Puskesmas Baru
action.person.add = Orang Baru
action.report.add = Aksi Baru
admin.app.name =
admin.display =
admin.display.datetime =
admin.app.name = Manajemen Aplikasi
admin.display = Tampilan
admin.display.datetime = Tanggal & waktu
admin.message.queue = Pesan Keluar
admin.message.queue.created =
admin.message.queue.due =
admin.message.queue.created = Dibuat
admin.message.queue.due = Jatuh tempo
admin.message.queue.error = Error ketika mengambil pesan
admin.message.queue.message = Pesan
admin.message.queue.recipient = Penerima
admin.message.queue.scheduled = Terjadwal
admin.message.queue.status = Status
admin.message.queue.tab.due =
admin.message.queue.tab.due = Jatuh tempo
admin.message.queue.tab.muted.future = Tidak akan dikirim
admin.message.queue.tab.muted.past = Tidak terkirim
admin.message.queue.tab.scheduled = Terjadwal
Expand All @@ -302,7 +302,7 @@ admin.pagination.first = Pertama
admin.pagination.last = Terakhir
admin.pagination.next = Lanjut
admin.pagination.prev = Sebelumnya
admin.targets.description =
admin.targets.description = Tujuan dengan nilai -1 akan menunjukkan target tanpa tujuan.
after\ the = setelah
analytics.anc.active-pregnancies = Kehamilan Aktif
analytics.anc.delivery-locations = Lokasi persalinan yang dilaporkan
Expand Down Expand Up @@ -331,28 +331,28 @@ analytics.reporting.not_submitted = Laporan hilang
analytics.reporting.reporting_rate = Kecepatan Pelaporan
analytics.reporting.reports = Laporan
analytics.target.add = Tambah target
analytics.target.aggregates =
analytics.target.aggregates.disabled =
analytics.target.aggregates.error =
analytics.target.aggregates.error.no.contact =
analytics.target.aggregates.error.not.found =
analytics.target.aggregates.no.data =
analytics.target.aggregates.no.target.selected =
analytics.target.aggregates.no.targets =
analytics.target.aggregates.ratio =
analytics.target.aggregates.reported =
analytics.target.aggregates.select.error =
analytics.target.aggregates.supervisees.meeting.goal =
analytics.target.aggregates.total =
analytics.target.aggregates = Agregat target
analytics.target.aggregates.disabled = Agregat target dinonaktifkan
analytics.target.aggregates.error = Terjadi kesalahan saat mengambil agregat target
analytics.target.aggregates.error.no.contact = Terjadi kesalahan saat memuat agregat target. Pengguna Anda tidak memiliki tempat tinggal utama atau tidak memiliki akses ke tempat tinggal terkait. Hubungi administrator Anda untuk memperbaiki masalah ini.
analytics.target.aggregates.error.not.found = Terjadi kesalahan saat memuat agregat target\: Target tidak ditemukan.
analytics.target.aggregates.no.data = Tidak ada data
analytics.target.aggregates.no.target.selected = Tidak ada target yang dipilih.
analytics.target.aggregates.no.targets = Tidak ada agregat target yang ditemukan
analytics.target.aggregates.ratio = {{pass}} dari {{total}}
analytics.target.aggregates.reported = Dilaporkan
analytics.target.aggregates.select.error = Terjadi kesalahan saat memuat agregat target.
analytics.target.aggregates.supervisees.meeting.goal = CHW yang mencapai tujuan
analytics.target.aggregates.total = Total
analytics.target.aggregates.reporting_period = Periode pelaporan
analytics.target.goal = Tujuan
analytics.target.goal.help =
analytics.target.goal.help = Jika Anda tidak ingin menampilkan target, masukkan nilai '-1'.
analytics.target.icon = Icon
analytics.target.icon.help = ID Icon yang terkonfigurasi
analytics.target.id = ID Unik
analytics.target.monthly_goal = Tujuan Perbulan
analytics.target.name = Nama
analytics.target.name.help =
analytics.target.name.help = Jika Anda menambahkan terjemahan untuk nama target di sini, Anda tetap harus menambahkannya di halaman bahasa.
analytics.target.type = Tipe
analytics.target.type.count = Hitung
analytics.target.type.percent = Persen
Expand All @@ -369,25 +369,27 @@ android_app.data_usage.system.title = Sistim-luas
android_app.data_usage.title = Penggunaan Data App
android_app.data_usage.tx = Dikirimkan
android_app.version.title = Versi Android App
app.name =
app.version.unknown =
app.name = Aplikasi
app.version.unknown = Tidak Diketahui - koneksi internet diperlukan.
associated.contact = Kontak yang berhubungan
associated.contact.help = Ketika pengguna ini membuat laporan, mereka akan dihubungkan kepada kontak ini
autoreply = jawab otomatis
birth_date = Tanggal Lahir
branding =
branding.favicon.field =
branding.logo.field =
branding.title.field =
branding = Branding
branding.favicon.field = Ikon kecil
branding.logo.field = Logo
branding.title.field = Judul
branding.title.field.help =
branding.icon.field = Ikon besar
branding.icon.field.help = Akan ditampilkan untuk instalasi PWA. Harus berukuran setidaknya 144 piksel persegi.
browser.compatibility.title = Hubungi Supervisor Anda
browser.compatibility.description = Silakan hubungi supervisor Anda untuk memperbarui browser Anda.
browser.compatibility.confirm = Oke
bulkdelete.confirm.action = Hapus
bulkdelete.confirm.title = Hapus pencatatan?
bulkdelete.confirm.title.plural = Hapus pencatatan yang dipilih?
call = Telepon
case_id =
case_id = ID Kasus
child_birth_date = Tanggal Lahir Anak
child_birth_outcome = Outcome Anak dilahirkan
child_birth_weight = Berat Lahir Anak
Expand Down Expand Up @@ -948,9 +950,9 @@ person.field.title = Judul
phone\ number\ not\ unique = Nomor ini sudah teregistrasi untuk kontak {{name}}
place.deleted = [dihapus]
place.unavailable = [tidak tersedia]
privacy.policy =
privacy.policy.accept =
privacy.policy.not.found =
privacy.policy = Kebijakan Privasi
privacy.policy.accept = Setujui
privacy.policy.not.found = Kebijakan Privasi tidak ditemukan
purge.description =
purge.title =
quarter = Kuartal
Expand Down Expand Up @@ -1106,15 +1108,12 @@ setup.start = Selesai
setup.statistics.description =
setup.statistics.title =
sidebar_menu.title = Menu
simprints.disabled =
simprints.register = Daftar dengan Simprints
simprints.search = Cari dengan Simprints
sms_message.message = Pesan Masuk
sms_received = Pesan SMS telah diterima; akan segera dibaca. Bila anda ingin mengirim formulir teks, masukkan kode formulir yang benar dan kirim kembali.
state.cleared = dibersihkan
state.delivered = terkirim
state.denied = ditolak
state.duplicate =
state.duplicate = duplikat
state.failed = gagal
state.forwarded-by-gateway = diteruskan oleh gateway
state.forwarded-to-gateway = diteruskan ke gateway
Expand All @@ -1124,29 +1123,29 @@ state.received = diterima
state.received-by-gateway = diterima oleh gateway
state.scheduled = terjadwal
state.sent = terkirim
status.review.correct =
status.review.errors =
status.review.title =
status.review.unverified =
status.review.correct = Ditinjau\: benar
status.review.errors = Ditinjau\: terdapat kesalahan
status.review.title = Tinjauan manajer
status.review.unverified = Belum ditinjau
status.sms.invalid = Invalid SMS
status.sms.title = SMS validitas
status.sms.valid = Valid SMS
submit.icon =
submit.icon = Unggah ikon
sync.last_success = Sinkronisasi terakhir
sync.now =
sync.now = Sinkronkan sekarang
sync.status.in_progress = Saat ini melakukan sinkronisasi
sync.status.not_required = Semua laporan disinkronkan
sync.status.required = Laporan yang perlu disinkronkan
sync.status.unknown = Tidak diketahui
sys.empty = Pesan terlihat kosong.
sys.facility_not_found = Fasilitas tidak ditemukan.
sys.form_not_found = Formulir '{{form}}' tidak ditemukan.
sys.incorrect_type =
sys.incorrect_type = Jenis bidang tidak sesuai {{key}}, diharapkan {{expectedType}}.
sys.missing_fields = Tidak ditemukan atau salah\: {{fields}}.
sys.recipient_not_found = Penerima pesan tidak ditemukan
targets.all_time.subtitle = Total
targets.births.title = Kelahiran
targets.count.default = {{pass}} dari {{total}}
targets.count.default = {{pass}} dari {{total}}
targets.disabled = Target dinonaktifkan untuk pengguna admin. Jika Anda perlu melihat sasaran, login sebagai user biasa.
targets.this_month.subtitle = Bulan ini
targets.last_month.subtitle = Bulan sebelumnya
Expand All @@ -1163,12 +1162,12 @@ tasks.0.messages.0.to = Kepada
tasks.0.state = Status
tasks.0.timestamp = Waktu
tasks.disabled = Tugas dimatikan bagi pengguna admin. Bila ingin melihat tugas, login sebagai pengguna normal
tasks.none = Tidak ada tugas.\n
tasks.none.n.weeks = {WEEKS, plural, \=1{Tidak ada tugas di minggu depan.} other{Tidak ada tugas di \# minggu ke depan.}}
tasks.none = Tidak ada tugas.
tasks.none.n.weeks = {WEEKS, plural, one{Tidak ada tugas di minggu depan.} other{Tidak ada tugas di \# minggu ke depan.}}
testing.description =
testing.title =
testing.title =
title =
to\ recipient = Kepada {{recipient}}
to\ recipient = Kepada {{recipient}}
today = hari ini
tomorrow = besok
training_cards.confirm.exit = Pelatihan ini belum selesai. Jika Anda keluar sekarang, Anda akan kehilangan kemajuan Anda dan akan diminta lagi nanti untuk menyelesaikannya.
Expand All @@ -1181,12 +1180,12 @@ training_materials.page.no_trainings = Tidak ditemukan pelatihan
training_materials.page.title = Materi pelatihan
translation.add = Tambah terjemahan
translation.key = Kunci terjemahan
unique.id =
upgrade =
upgrade.description =
upload =
upload.favicon =
upload.header.logo =
unique.id = ID Unik
upgrade = Tingkatkan
upgrade.description = Untuk meningkatkan aplikasi Anda ke rilis, beta, atau cabang tertentu, disarankan untuk melakukan staging terlebih dahulu. Ini memungkinkan pekerjaan latar belakang diselesaikan untuk mempersiapkan instalasi tanpa mengganggu pengguna. Setelah proses staging selesai, klik Instal untuk melanjutkan peningkatan. Tindakan ini tidak dapat dibatalkan, jadi pastikan data Anda telah dicadangkan dan pengguna Anda telah diberi tahu tentang waktu henti.
upload = Unggah
upload.favicon = Favicon
upload.header.logo = Logo Header
upload.icon = Unggah Icon
upload.json.forms.help = File harus berisi daftar kode JSON tentang definisi formulir. Semua formulir yang sudah ada akan digantikan.
upload.json.forms.title = Unggah formulir JSON
Expand Down Expand Up @@ -1228,8 +1227,8 @@ welcome.setup.description = Gunakan petunjuk kami untuk pengaturan penting pada
welcome.setup.title = Ijinkan kami mengatur sistim anda
welcome.tour.description = Gunakan tur produk untuk mengenal platform Medic. Tur akan otomatis mulai setelah konfigurasi selesai. Anda dapat menemukannya pada menu drop-down.
welcome.tour.title = Ijinkan kami untuk menjelaskan
wipe.device.description =
wipe.device.title =
wipe.device.description = PERINGATAN! Ini akan menghapus semua data dari perangkat Anda dan mengeluarkan Anda. Data yang belum tersinkronisasi akan hilang!
wipe.device.title = Hapus Data Perangkat
with = Dengan
with.lmp = Dengan Periode Menstruasi Terakhir
without.lmp = Tanpa Periode Menstruasi Terakhir
Expand Down
19 changes: 19 additions & 0 deletions api/src/errors.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
class PublicError extends Error {
constructor(publicMessage, ...args) {
super(publicMessage, ...args);
this.publicMessage = publicMessage;
}
}

class NotFoundError extends Error {
constructor(message, ...args) {
super(message, ...args);
this.status = 404; // simulate PouchDb error
this.statusCode = 404; // simulate Request error
}
}

module.exports = {
PublicError,
NotFoundError,
};
Loading

0 comments on commit c0b3081

Please sign in to comment.