diff --git a/backend/api/src/modules/audit/audit.controller.spec.ts b/backend/api/src/modules/audit/audit.controller.spec.ts index 861ce03..2689d2e 100644 --- a/backend/api/src/modules/audit/audit.controller.spec.ts +++ b/backend/api/src/modules/audit/audit.controller.spec.ts @@ -204,7 +204,7 @@ describe('AuditController', () => { const result = controller.createAuditTrail(); expect(result).toEqual({ - message: 'Proses audit trail dijalankan', + message: 'Audit trail process started', status: 'STARTED', }); expect(mockAuditService.storeAuditTrail).toHaveBeenCalled(); diff --git a/backend/api/src/modules/audit/audit.controller.ts b/backend/api/src/modules/audit/audit.controller.ts index 53977e4..8bec19c 100644 --- a/backend/api/src/modules/audit/audit.controller.ts +++ b/backend/api/src/modules/audit/audit.controller.ts @@ -41,6 +41,6 @@ export class AuditController { @UseGuards(AuthGuard) createAuditTrail() { this.auditService.storeAuditTrail(); - return { message: 'Proses audit trail dijalankan', status: 'STARTED' }; + return { message: 'Audit trail process started', status: 'STARTED' }; } } diff --git a/backend/api/src/modules/auth/auth.controller.spec.ts b/backend/api/src/modules/auth/auth.controller.spec.ts index 30e9d12..2ac157f 100644 --- a/backend/api/src/modules/auth/auth.controller.spec.ts +++ b/backend/api/src/modules/auth/auth.controller.spec.ts @@ -178,7 +178,7 @@ describe('AuthController', () => { const result = controller.logout(mockResponse as any); - expect(result).toEqual({ message: 'Logout berhasil' }); + expect(result).toEqual({ message: 'Logout successful' }); expect(mockResponse.clearCookie).toHaveBeenCalledWith('access_token', { httpOnly: true, secure: false, @@ -195,7 +195,7 @@ describe('AuthController', () => { const result = controller.logout(mockResponse as any); - expect(result).toEqual({ message: 'Logout berhasil' }); + expect(result).toEqual({ message: 'Logout successful' }); expect(mockResponse.clearCookie).toHaveBeenCalledWith('access_token', { httpOnly: true, secure: true, diff --git a/backend/api/src/modules/auth/auth.controller.ts b/backend/api/src/modules/auth/auth.controller.ts index 72b2948..514c434 100644 --- a/backend/api/src/modules/auth/auth.controller.ts +++ b/backend/api/src/modules/auth/auth.controller.ts @@ -63,6 +63,6 @@ export class AuthController { sameSite: 'strict', }); - return { message: 'Logout berhasil' }; + return { message: 'Logout successful' }; } } diff --git a/backend/api/src/modules/auth/auth.service.ts b/backend/api/src/modules/auth/auth.service.ts index 377a09b..19f4796 100644 --- a/backend/api/src/modules/auth/auth.service.ts +++ b/backend/api/src/modules/auth/auth.service.ts @@ -73,7 +73,7 @@ export class AuthService { }); if (!user || !(await bcrypt.compare(password, user.password_hash))) { - throw new UnauthorizedException('Username atau password salah'); + throw new UnauthorizedException('Wrong username or password'); } const csrfToken = crypto.randomBytes(32).toString('hex'); diff --git a/backend/api/src/modules/auth/dto/auth.dto.ts b/backend/api/src/modules/auth/dto/auth.dto.ts index bc29e51..a54deac 100644 --- a/backend/api/src/modules/auth/dto/auth.dto.ts +++ b/backend/api/src/modules/auth/dto/auth.dto.ts @@ -7,13 +7,13 @@ export enum UserRole { } export class AuthDto { - @IsNotEmpty({ message: 'Username wajib diisi' }) - @IsString({ message: 'Username harus berupa string' }) - @Length(1, 100, { message: 'Username maksimal 100 karakter' }) + @IsNotEmpty({ message: 'Username is required' }) + @IsString({ message: 'Username must be a string' }) + @Length(1, 100, { message: 'Username must be at most 100 characters' }) username: string; - @IsNotEmpty({ message: 'Password wajib diisi' }) - @IsString({ message: 'Password harus berupa string' }) - @Length(6, undefined, { message: 'Password minimal 6 karakter' }) + @IsNotEmpty({ message: 'Password is required' }) + @IsString({ message: 'Password must be a string' }) + @Length(6, undefined, { message: 'Password must be at least 6 characters' }) password: string; } diff --git a/backend/api/src/modules/auth/dto/create-user.dto.ts b/backend/api/src/modules/auth/dto/create-user.dto.ts index 2ea6edc..5807ea3 100644 --- a/backend/api/src/modules/auth/dto/create-user.dto.ts +++ b/backend/api/src/modules/auth/dto/create-user.dto.ts @@ -9,26 +9,26 @@ import { Expose, Transform } from 'class-transformer'; import { UserRole } from './auth.dto'; export class CreateUserDto { - @IsNotEmpty({ message: 'Nama lengkap wajib diisi' }) - @IsString({ message: 'Nama lengkap harus berupa string' }) - @Length(1, 255, { message: 'Nama lengkap maksimal 255 karakter' }) + @IsNotEmpty({ message: 'Full name is required' }) + @IsString({ message: 'Full name must be a string' }) + @Length(1, 255, { message: 'Full name must be at most 255 characters' }) nama_lengkap: string; - @IsNotEmpty({ message: 'Username wajib diisi' }) - @IsString({ message: 'Username harus berupa string' }) - @Length(1, 100, { message: 'Username maksimal 100 karakter' }) + @IsNotEmpty({ message: 'Username is required' }) + @IsString({ message: 'Username must be a string' }) + @Length(1, 100, { message: 'Username must be at most 100 characters' }) username: string; - @IsNotEmpty({ message: 'Password wajib diisi' }) - @IsString({ message: 'Password harus berupa string' }) + @IsNotEmpty({ message: 'Password is required' }) + @IsString({ message: 'Password must be a string' }) @Length(6, 100, { - message: 'Password minimal 6 karakter dan maksimal 100 karakter', + message: 'Password must be between 6 and 100 characters', }) password: string; @IsOptional() - @IsString({ message: 'Role harus berupa string' }) - @IsEnum(UserRole, { message: 'Role harus "admin" atau "user"' }) + @IsString({ message: 'Role must be a string' }) + @IsEnum(UserRole, { message: 'Role must be "admin" or "user"' }) role?: UserRole; } diff --git a/backend/api/src/modules/fabric/fabric.service.spec.ts b/backend/api/src/modules/fabric/fabric.service.spec.ts index e9d6873..090cdf2 100644 --- a/backend/api/src/modules/fabric/fabric.service.spec.ts +++ b/backend/api/src/modules/fabric/fabric.service.spec.ts @@ -184,7 +184,7 @@ describe('FabricService', () => { await expect( service.storeLog('log-1', 'CREATE', 'user-1', '{}'), - ).rejects.toThrow('Gagal menyimpan log ke blockchain'); + ).rejects.toThrow('Failed to store log to blockchain'); }); it('should not validate empty id (NO VALIDATION)', async () => { @@ -273,7 +273,7 @@ describe('FabricService', () => { ); await expect(service.getLogById('non-existent')).rejects.toThrow( - 'Gagal mengambil log dari blockchain', + 'Failed to retrieve log from blockchain', ); }); @@ -325,7 +325,7 @@ describe('FabricService', () => { ); await expect(service.getAllLogs()).rejects.toThrow( - 'Gagal mengambil semua log dari blockchain', + 'Failed to retrieve all logs from blockchain', ); }); }); @@ -370,7 +370,7 @@ describe('FabricService', () => { ); await expect(service.getLogsWithPagination(10, '')).rejects.toThrow( - 'Gagal mengambil log dengan paginasi dari blockchain', + 'Failed to retrieve logs with pagination from blockchain', ); }); diff --git a/backend/api/src/modules/fabric/fabric.service.ts b/backend/api/src/modules/fabric/fabric.service.ts index 4057651..c80d992 100644 --- a/backend/api/src/modules/fabric/fabric.service.ts +++ b/backend/api/src/modules/fabric/fabric.service.ts @@ -65,7 +65,7 @@ export class FabricService implements OnModuleInit, OnApplicationShutdown { const message = error instanceof Error ? error.message : 'Unknown error'; this.logger.error(`Failed to store log: ${message}`); throw new InternalServerErrorException( - 'Gagal menyimpan log ke blockchain', + 'Failed to store log to blockchain', ); } } @@ -78,7 +78,7 @@ export class FabricService implements OnModuleInit, OnApplicationShutdown { const message = error instanceof Error ? error.message : 'Unknown error'; this.logger.error(`Failed to get log by ID: ${message}`); throw new InternalServerErrorException( - 'Gagal mengambil log dari blockchain', + 'Failed to retrieve log from blockchain', ); } } @@ -91,7 +91,7 @@ export class FabricService implements OnModuleInit, OnApplicationShutdown { const message = error instanceof Error ? error.message : 'Unknown error'; this.logger.error(`Failed to get all logs: ${message}`); throw new InternalServerErrorException( - 'Gagal mengambil semua log dari blockchain', + 'Failed to retrieve all logs from blockchain', ); } } @@ -106,7 +106,7 @@ export class FabricService implements OnModuleInit, OnApplicationShutdown { const message = error instanceof Error ? error.message : 'Unknown error'; this.logger.error(`Failed to get logs with pagination: ${message}`); throw new InternalServerErrorException( - 'Gagal mengambil log dengan paginasi dari blockchain', + 'Failed to retrieve logs with pagination from blockchain', ); } } diff --git a/backend/api/src/modules/log/dto/store-log.dto.ts b/backend/api/src/modules/log/dto/store-log.dto.ts index 351b5a1..c0fb63a 100644 --- a/backend/api/src/modules/log/dto/store-log.dto.ts +++ b/backend/api/src/modules/log/dto/store-log.dto.ts @@ -1,12 +1,12 @@ import { IsString, IsNotEmpty, Length, IsEnum } from 'class-validator'; export class StoreLogDto { - @IsNotEmpty({ message: 'ID wajib diisi' }) - @IsString({ message: 'ID harus berupa string' }) + @IsNotEmpty({ message: 'ID is required' }) + @IsString({ message: 'ID must be a string' }) id: string; - @IsNotEmpty({ message: 'Event wajib diisi' }) - @IsString({ message: 'Event harus berupa string' }) + @IsNotEmpty({ message: 'Event is required' }) + @IsString({ message: 'Event must be a string' }) @IsEnum( [ 'tindakan_dokter_created', @@ -20,17 +20,17 @@ export class StoreLogDto { 'rekam_medis_deleted', ], { - message: 'Event tidak valid', + message: 'Invalid event', }, ) - @Length(1, 100, { message: 'Event maksimal 100 karakter' }) + @Length(1, 100, { message: 'Event must be at most 100 characters' }) event: string; - @IsNotEmpty({ message: 'User ID wajib diisi' }) - @IsString({ message: 'User ID harus berupa string' }) + @IsNotEmpty({ message: 'User ID is required' }) + @IsString({ message: 'User ID must be a string' }) user_id: string; - @IsNotEmpty({ message: 'Payload wajib diisi' }) - @IsString({ message: 'Payload harus berupa string' }) + @IsNotEmpty({ message: 'Payload is required' }) + @IsString({ message: 'Payload must be a string' }) payload: string; } diff --git a/backend/api/src/modules/obat/obat.service.ts b/backend/api/src/modules/obat/obat.service.ts index 6cd48cc..411787b 100644 --- a/backend/api/src/modules/obat/obat.service.ts +++ b/backend/api/src/modules/obat/obat.service.ts @@ -134,7 +134,7 @@ export class ObatService { async createObat(dto: CreateObatDto, user: ActiveUserPayload) { if (!(await this.isIdVisitExists(dto.id_visit))) { - throw new BadRequestException(`ID Visit ${dto.id_visit} tidak ditemukan`); + throw new BadRequestException(`Visit ID ${dto.id_visit} not found`); } try { @@ -157,7 +157,7 @@ export class ObatService { async createObatToDBAndBlockchain(dto: CreateObatDto, userId: number) { if (!(await this.isIdVisitExists(dto.id_visit))) { - throw new BadRequestException(`Visit with id ${dto.id_visit} not found`); + throw new BadRequestException(`Visit id ${dto.id_visit} not found`); } try { @@ -200,11 +200,11 @@ export class ObatService { const obatId = Number(id); if (isNaN(obatId)) { - throw new BadRequestException('ID obat tidak valid'); + throw new BadRequestException('ID medicine not valid'); } if (!(await this.getObatById(obatId))) { - throw new BadRequestException(`Obat with id ${obatId} not found`); + throw new BadRequestException(`Medicine with id ${obatId} not found`); } try { @@ -244,15 +244,13 @@ export class ObatService { const obatId = Number(id); if (isNaN(obatId)) { - throw new BadRequestException('ID obat tidak valid'); + throw new BadRequestException('Medicine ID not valid'); } const existingObat = await this.getObatById(obatId); if (!existingObat) { - throw new BadRequestException( - `Pemberian obat dengan ID ${obatId} tidak ditemukan`, - ); + throw new BadRequestException(`Medicine with ID ${obatId} not found`); } const hasUpdates = @@ -261,7 +259,7 @@ export class ObatService { dto.aturan_pakai !== existingObat.aturan_pakai; if (!hasUpdates) { - throw new BadRequestException('Tidak ada perubahan data obat'); + throw new BadRequestException('No changes in medicine data detected'); } try { @@ -325,12 +323,12 @@ export class ObatService { const obatId = Number(id); if (isNaN(obatId)) { - throw new BadRequestException('ID obat tidak valid'); + throw new BadRequestException('Medicine ID not valid'); } const existingObat = await this.getObatById(obatId); if (!existingObat) { - throw new BadRequestException(`Obat dengan ID ${obatId} tidak ditemukan`); + throw new BadRequestException(`Medicine with ID ${obatId} not found`); } try { diff --git a/backend/api/src/modules/rekammedis/dto/create-rekammedis.dto.ts b/backend/api/src/modules/rekammedis/dto/create-rekammedis.dto.ts index 12d680a..6823141 100644 --- a/backend/api/src/modules/rekammedis/dto/create-rekammedis.dto.ts +++ b/backend/api/src/modules/rekammedis/dto/create-rekammedis.dto.ts @@ -14,27 +14,29 @@ import { import { Transform } from 'class-transformer'; export class CreateRekamMedisDto { - @IsNotEmpty({ message: 'Nomor rekam medis (no_rm) wajib diisi' }) + @IsNotEmpty({ message: 'Medical record number (no_rm) is required' }) @IsString() - @Length(1, 20, { message: 'Nomor rekam medis maksimal 20 karakter' }) + @Length(1, 20, { + message: 'Medical record number must be at most 20 characters', + }) no_rm: string; - @IsNotEmpty({ message: 'Nama pasien wajib diisi' }) + @IsNotEmpty({ message: 'Patient name is required' }) @IsString() - @Length(1, 100, { message: 'Nama pasien maksimal 100 karakter' }) + @Length(1, 100, { message: 'Patient name must be at most 100 characters' }) nama_pasien: string; @IsOptional() - @IsInt({ message: 'Umur harus berupa angka bulat' }) - @Min(0, { message: 'Umur tidak boleh negatif' }) - @Max(150, { message: 'Umur tidak valid' }) + @IsInt({ message: 'Age must be an integer' }) + @Min(0, { message: 'Age cannot be negative' }) + @Max(150, { message: 'Age is not valid' }) @Transform(({ value }) => (value ? parseInt(value) : null)) umur?: number; @IsOptional() @IsString() @IsIn(['L', 'P', 'l', 'p'], { - message: 'Jenis kelamin harus "L" (Laki-laki) atau "P" (Perempuan)', + message: 'Gender must be "L" (Male) or "P" (Female)', }) @Transform(({ value }) => value?.toUpperCase()) jenis_kelamin?: string; @@ -42,7 +44,7 @@ export class CreateRekamMedisDto { @IsOptional() @IsString() @IsIn(['A', 'B', 'AB', 'O', '-'], { - message: 'Golongan darah harus A, B, AB, O, atau -', + message: 'Blood type must be A, B, AB, O, or -', }) @Length(1, 2) gol_darah?: string; @@ -70,37 +72,37 @@ export class CreateRekamMedisDto { anamnese?: string; @IsOptional() - @IsInt({ message: 'Tekanan darah sistolik harus berupa angka bulat' }) + @IsInt({ message: 'Systolic blood pressure must be an integer' }) @Transform(({ value }) => (value ? parseInt(value) : null)) sistolik?: number; @IsOptional() - @IsInt({ message: 'Tekanan darah diastolik harus berupa angka bulat' }) + @IsInt({ message: 'Diastolic blood pressure must be an integer' }) @Transform(({ value }) => (value ? parseInt(value) : null)) diastolik?: number; @IsOptional() - @IsInt({ message: 'Nadi harus berupa angka bulat' }) + @IsInt({ message: 'Pulse must be an integer' }) @Transform(({ value }) => (value ? parseInt(value) : null)) nadi?: number; @IsOptional() - @IsNumber({}, { message: 'Suhu harus berupa angka' }) + @IsNumber({}, { message: 'Temperature must be a number' }) @Transform(({ value }) => (value ? parseFloat(value) : null)) suhu?: number; @IsOptional() - @IsInt({ message: 'Pernapasan harus berupa angka bulat' }) + @IsInt({ message: 'Respiration must be an integer' }) @Transform(({ value }) => (value ? parseInt(value) : null)) nafas?: number; @IsOptional() - @IsNumber({}, { message: 'Tinggi badan harus berupa angka' }) + @IsNumber({}, { message: 'Height must be a number' }) @Transform(({ value }) => (value ? parseFloat(value) : null)) tinggi_badan?: number; @IsOptional() - @IsNumber({}, { message: 'Berat badan harus berupa angka' }) + @IsNumber({}, { message: 'Weight must be a number' }) @Transform(({ value }) => (value ? parseFloat(value) : null)) berat_badan?: number; @@ -114,6 +116,6 @@ export class CreateRekamMedisDto { tindak_lanjut?: string; @IsOptional() - @IsDateString({}, { message: 'Waktu visit harus berupa tanggal yang valid' }) + @IsDateString({}, { message: 'Visit time must be a valid date' }) waktu_visit?: string; } diff --git a/backend/api/src/modules/rekammedis/dto/payload-rekammedis.dto.ts b/backend/api/src/modules/rekammedis/dto/payload-rekammedis.dto.ts index 81e5d8d..1ed50e2 100644 --- a/backend/api/src/modules/rekammedis/dto/payload-rekammedis.dto.ts +++ b/backend/api/src/modules/rekammedis/dto/payload-rekammedis.dto.ts @@ -1,18 +1,18 @@ import { IsEnum, IsNumber, IsString } from 'class-validator'; export class PayloadRekamMedisDto { - @IsNumber({}, { message: 'ID dokter harus berupa angka' }) + @IsNumber({}, { message: 'Doctor ID must be a number' }) dokter_id: number; - @IsString({ message: 'ID kunjungan harus berupa string' }) + @IsString({ message: 'Visit ID must be a string' }) visit_id: string; - @IsEnum({}, { message: 'Anamnese harus berupa enum' }) + @IsEnum({}, { message: 'Anamnese must be an enum' }) anamnese: string; - @IsEnum({}, { message: 'Jenis kasus harus berupa enum' }) + @IsEnum({}, { message: 'Case type must be an enum' }) jenis_kasus: string; - @IsEnum({}, { message: 'Tindak lanjut harus berupa enum' }) + @IsEnum({}, { message: 'Follow-up must be an enum' }) tindak_lanjut: string; } diff --git a/backend/api/src/modules/tindakandokter/tindakandokter.controller.ts b/backend/api/src/modules/tindakandokter/tindakandokter.controller.ts index f308829..d34393d 100644 --- a/backend/api/src/modules/tindakandokter/tindakandokter.controller.ts +++ b/backend/api/src/modules/tindakandokter/tindakandokter.controller.ts @@ -43,6 +43,7 @@ export class TindakanDokterController { skip, page, orderBy: orderBy ? { [orderBy]: order || 'asc' } : undefined, + order, }); } diff --git a/backend/api/src/modules/tindakandokter/tindakandokter.service.ts b/backend/api/src/modules/tindakandokter/tindakandokter.service.ts index b17c59f..fdb834b 100644 --- a/backend/api/src/modules/tindakandokter/tindakandokter.service.ts +++ b/backend/api/src/modules/tindakandokter/tindakandokter.service.ts @@ -125,7 +125,7 @@ export class TindakanDokterService { }); if (!visitExists) { - throw new BadRequestException(`ID Visit ${dto.id_visit} tidak ditemukan`); + throw new BadRequestException(`Visit ID ${dto.id_visit} not found`); } const response = await this.prisma.validation_queue.create({ @@ -172,7 +172,7 @@ export class TindakanDokterService { }); return newTindakan; } catch (error) { - console.error('Error creating Rekam Medis:', error); + console.error('Error creating Doctor Action:', error); throw error; } } @@ -181,7 +181,7 @@ export class TindakanDokterService { const tindakanId = Number(id); if (Number.isNaN(tindakanId)) { - throw new BadRequestException('ID tindakan tidak valid'); + throw new BadRequestException('Invalid action ID'); } return this.prisma.pemberian_tindakan.findUnique({ @@ -197,15 +197,13 @@ export class TindakanDokterService { const tindakanId = Number(id); if (Number.isNaN(tindakanId)) { - throw new BadRequestException('ID tindakan tidak valid'); + throw new BadRequestException('Invalid doctor action ID'); } const existing = await this.getTindakanDokterById(tindakanId); if (!existing) { - throw new BadRequestException( - `Tindakan dokter dengan ID ${id} tidak ditemukan`, - ); + throw new BadRequestException(`Doctor Action with ID ${id} not found`); } const hasUpdates = @@ -215,7 +213,7 @@ export class TindakanDokterService { dto.kelompok_tindakan !== existing.kelompok_tindakan; if (!hasUpdates) { - throw new BadRequestException('Tidak ada data tindakan yang diubah'); + throw new BadRequestException("Doctor action data hasn't been changed"); } if (dto.id_visit) { @@ -224,9 +222,7 @@ export class TindakanDokterService { }); if (!visitExists) { - throw new BadRequestException( - `ID Visit ${dto.id_visit} tidak ditemukan`, - ); + throw new BadRequestException(`Visit ID ${dto.id_visit} not found`); } } @@ -276,7 +272,7 @@ export class TindakanDokterService { }); return updatedTindakan; } catch (error) { - console.error('Error updating Tindakan Dokter:', error); + console.error('Error updating Doctor Action:', error); throw error; } } @@ -285,7 +281,7 @@ export class TindakanDokterService { const tindakanId = parseInt(id, 10); if (Number.isNaN(tindakanId)) { - throw new BadRequestException('ID tindakan tidak valid'); + throw new BadRequestException('Invalid action ID'); } const currentData = await this.prisma.pemberian_tindakan.findUnique({ @@ -293,9 +289,7 @@ export class TindakanDokterService { }); if (!currentData) { - throw new BadRequestException( - `Tindakan dokter dengan ID ${id} tidak ditemukan`, - ); + throw new BadRequestException(`Doctor action with ID ${id} not found`); } const idLog = `TINDAKAN_${id}`; @@ -330,15 +324,13 @@ export class TindakanDokterService { const tindakanId = Number(id); if (Number.isNaN(tindakanId)) { - throw new BadRequestException('ID tindakan tidak valid'); + throw new BadRequestException('Invalid action ID'); } const existingTindakan = await this.getTindakanDokterById(tindakanId); if (!existingTindakan) { - throw new BadRequestException( - `Tindakan dokter dengan ID ${id} tidak ditemukan`, - ); + throw new BadRequestException(`Doctor action with ID ${id} not found`); } try { @@ -368,7 +360,7 @@ export class TindakanDokterService { return validationQueue; } catch (error) { - console.error('Error deleting Tindakan Dokter:', error); + console.error('Error deleting Doctor Action:', error); throw error; } } @@ -376,14 +368,14 @@ export class TindakanDokterService { async deleteTindakanDokterFromDBAndBlockchain(id: number, userId: number) { const tindakanId = Number(id); if (Number.isNaN(tindakanId)) { - throw new BadRequestException('ID tindakan tidak valid'); + throw new BadRequestException('Invalid action ID'); } const existingTindakan = await this.getTindakanDokterById(tindakanId); if (!existingTindakan) { throw new BadRequestException( - `Tindakan dokter dengan ID ${tindakanId} tidak ditemukan`, + `Doctor action with ID ${tindakanId} not found`, ); } @@ -410,7 +402,7 @@ export class TindakanDokterService { }); return deletedTindakan; } catch (error) { - console.error('Error deleting Tindakan Dokter:', error); + console.error('Error deleting Doctor Action:', error); throw error; } } diff --git a/frontend/hospital-log/src/components/dashboard/DataTable.vue b/frontend/hospital-log/src/components/dashboard/DataTable.vue index 5d12564..9e8c379 100644 --- a/frontend/hospital-log/src/components/dashboard/DataTable.vue +++ b/frontend/hospital-log/src/components/dashboard/DataTable.vue @@ -81,7 +81,7 @@ const handleDeleteCancel = () => { > {{ column.label }} - Aksi + Action @@ -112,7 +112,7 @@ const handleDeleteCancel = () => { d="M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4" /> -

{{ emptyMessage || "Tidak ada data" }}

+

{{ emptyMessage || "No data available" }}

@@ -196,7 +196,7 @@ const handleDeleteCancel = () => { ? 'tooltip tooltip-right flex items-center justify-center' : '', ]" - data-tip="Data ini sedang dalam proses validasi untuk dihapus" + data-tip="This data is currently undergoing validation for deletion" > diff --git a/frontend/hospital-log/src/components/dashboard/PageHeader.vue b/frontend/hospital-log/src/components/dashboard/PageHeader.vue index d7d5f8a..e8f6e00 100644 --- a/frontend/hospital-log/src/components/dashboard/PageHeader.vue +++ b/frontend/hospital-log/src/components/dashboard/PageHeader.vue @@ -12,7 +12,7 @@ const dateTime = ref(new Date()); let clockInterval: number; const formattedDate = computed(() => - dateTime.value.toLocaleDateString("id-ID", { + dateTime.value.toLocaleDateString("en-US", { day: "2-digit", month: "long", year: "numeric", diff --git a/frontend/hospital-log/src/components/dashboard/PaginationControls.vue b/frontend/hospital-log/src/components/dashboard/PaginationControls.vue index fc56b46..249251c 100644 --- a/frontend/hospital-log/src/components/dashboard/PaginationControls.vue +++ b/frontend/hospital-log/src/components/dashboard/PaginationControls.vue @@ -39,15 +39,14 @@ const handlePageChange = (page: number) => {
- Menampilkan data {{ startIndex }} - {{ endIndex }} dari - {{ totalCount }} data + Showing data {{ startIndex }} - {{ endIndex }} from {{ totalCount }} items
- Data per halaman: + Items per page: diff --git a/frontend/hospital-log/src/views/auth/Login.vue b/frontend/hospital-log/src/views/auth/Login.vue index 24880b3..2824d3d 100644 --- a/frontend/hospital-log/src/views/auth/Login.vue +++ b/frontend/hospital-log/src/views/auth/Login.vue @@ -8,12 +8,12 @@ import { useRouter } from "vue-router"; const validationSchema = toTypedSchema( zod.object({ username: zod - .string({ message: "Input tidak valid" }) - .min(1, { message: "Masukkan username" }), + .string({ message: "Invalid input" }) + .min(1, { message: "Please enter username" }), password: zod - .string({ message: "Input tidak valid" }) - .min(1, { message: "Masukkan password" }) - .min(6, { message: "Password minimal 6 karakter" }), + .string({ message: "Invalid input" }) + .min(1, { message: "Please enter password" }) + .min(6, { message: "Password must be at least 6 characters" }), }) ); @@ -55,7 +55,7 @@ const onSubmit = handleSubmit(async (values: any) => { if (error && Array.isArray(error.message)) { loginError.value = error.message[0]; } else { - loginError.value = error.message || "Terjadi kesalahan saat login."; + loginError.value = error.message || "An error occurred during login."; } } finally { isLoading.value = false; @@ -63,7 +63,7 @@ const onSubmit = handleSubmit(async (values: any) => { }); const baseButtonClass = - "btn btn-primary hover:btn-primary-content text-white font-bold border-primary py-4 px-4 rounded-md focus:outline-none focus:shadow-outline w-full"; + "btn bg-dark text-white font-bold py-4 px-4 rounded-md focus:outline-none focus:shadow-outline w-full"; const buttonClass = computed(() => { return [ @@ -96,7 +96,7 @@ const buttonClass = computed(() => { class="shadow appearance-none border rounded w-full py-2 px-3 mb-1 text-dark leading-tight focus:outline-none focus:shadow-outline" id="username" type="text" - placeholder="Masukkan username" + placeholder="Enter username" /> {{ usernameError }}
@@ -109,7 +109,7 @@ const buttonClass = computed(() => { class="shadow appearance-none border rounded w-full py-2 px-3 text-dark mb-1 leading-tight focus:outline-none focus:shadow-outline" id="password" type="password" - placeholder="Masukkan password" + placeholder="Enter password" /> {{ passwordError }}
@@ -119,7 +119,7 @@ const buttonClass = computed(() => { v-if="isLoading" class="loading loading-dots loading-sm" > - Masuk + Sign In
diff --git a/frontend/hospital-log/src/views/dashboard/DashboardView.vue b/frontend/hospital-log/src/views/dashboard/DashboardView.vue index 00eaadb..8a05b7d 100644 --- a/frontend/hospital-log/src/views/dashboard/DashboardView.vue +++ b/frontend/hospital-log/src/views/dashboard/DashboardView.vue @@ -86,7 +86,7 @@ const rekamMedisCountLineChartData = computed(() => { labels: labels, datasets: [ { - label: "Jumlah Rekam Medis Baru", + label: "New Medical Records Count", backgroundColor: "#1a2a4f", borderColor: "#1a2a4f", borderWidth: 2, @@ -123,7 +123,7 @@ const rekamMedisLineChartOptions = ref({ callbacks: { label: function (context: any) { return ( - context.dataset.label + ": " + context.parsed.y + " rekam medis" + context.dataset.label + ": " + context.parsed.y + " medical records" ); }, }, @@ -159,10 +159,10 @@ const rekamMedisLineChartOptions = ref({ }); const auditDataPerKelompokData = computed(() => ({ - labels: ["Rekam Medis", "Pemberian Tindakan", "Obat"], + labels: ["Medical Records", "Doctor Actions", "Medicine"], datasets: [ { - label: "Jumlah Data", + label: "Data Count", backgroundColor: "#1a2a4f", data: stats.tamperedDataPerKelompok.value, }, @@ -200,11 +200,11 @@ const auditBarOption = { const normalizeTableName = (tableName: string) => { switch (tableName) { case "rekam_medis": - return "Rekam Medis"; + return "Medical Records"; case "pemberian_tindakan": - return "Pemberian Tindakan"; - case "obat": - return "Obat"; + return "Doctor Actions"; + case "pemberian_obat": + return "Medicine Administration"; default: return tableName; } @@ -262,31 +262,33 @@ onMounted(() => {
- +
-

Total Rekam Medis

+

Total Medical Records

{{ stats.countRekamMedis }}

-

Total Tindakan Dokter

+

Total Doctor Actions

{{ stats.countTindakanDokter }}

-

Total Obat

+

+ Total Medicine Administration +

{{ stats.countObat }}

-

Total Data Audit

+

Total Audit Data

{{ stats.auditNonTampered.value + stats.auditTampered.value }}

@@ -297,7 +299,7 @@ onMounted(() => { class="flex flex-col flex-2 mt-4 bg-white p-4 rounded-lg shadow-md min-w-0" >
- Jumlah Rekam Medis Baru 7 Hari Terakhir + New Medical Records in Last 7 Days
{ to="/rekam-medis" class="text-sm hover:opacity-75 transition-all" > - Lihat Data Rekam Medis >> + View Medical Records >>
- Data Audit Trail + Audit Trail Summary
{ to="/audit-trail" class="text-sm hover:opacity-75 transition-all" > - Lihat Detail Audit Trail >> + View Audit Trail Details >>
@@ -347,17 +349,17 @@ onMounted(() => {
- Data yang perlu divalidasi ({{ validasiData.totalCount }}{{ + validasiData.totalCount + }})
- - - + + + @@ -383,13 +385,13 @@ onMounted(() => { to="/validasi" class="text-sm hover:opacity-75 transition-all" > - Lihat Detail Validasi Data >> + View Validation Details >>
- Tampered data per kelompok data + Tampered data per data group
): AuditLogType => { }; const typeLabelMap: Record = { - rekam_medis: "Rekam Medis", - tindakan: "Tindakan", - obat: "Obat", + rekam_medis: "Medical Records", + tindakan: "Actions", + obat: "Medicine", proof: "Proof", - unknown: "Tidak Diketahui", + unknown: "Unknown", }; const normalizeEntry = (entry: any): AuditLogEntry => { @@ -343,17 +343,17 @@ onMounted(async () => { }); socket.on("connect", () => { - console.log("Berhasil terhubung ke WebSocket:", socket.id); + console.log("Successfully connected to WebSocket:", socket.id); }); socket.on("audit.progress", (data) => { - console.log("Menerima progres:", data); + console.log("Receiving progress:", data); status.value = "RUNNING"; progres.value = data.progress_count; }); socket.on("audit.complete", (data) => { - console.log("Menerima selesai:", data); + console.log("Receiving completion:", data); fetchData(); status.value = "COMPLETED"; }); @@ -379,7 +379,7 @@ onBeforeUnmount(() => {
- +
{
- +
Tampering Status
@@ -448,14 +448,14 @@ onBeforeUnmount(() => {
{ status === 'STARTING' || status === 'RUNNING' " - text="Lakukan Audit" + text="Run Audit" @click="showAuditModal" />
@@ -509,11 +509,9 @@ onBeforeUnmount(() => {
-

- Proses audit sedang berjalan... -

+

Audit process is running...

- {{ progres }} data telah diperiksa + {{ progres }} data has been checked

@@ -523,7 +521,7 @@ onBeforeUnmount(() => { :data="logs" :columns="AUDIT_TABLE_COLUMNS" :is-loading="api.isLoading.value" - empty-message="Tidak ada log audit" + empty-message="No audit logs available" :is-aksi="false" /> { const validationErrors: CreateObatFormErrors = {}; if (!data.value.id_visit.trim()) { - validationErrors.id_visit = "ID Visit wajib diisi"; + validationErrors.id_visit = "ID Visit is required"; } if (!data.value.obat.trim()) { - validationErrors.obat = "Nama obat wajib diisi"; + validationErrors.obat = "Medicine name is required"; } const jumlahRaw = data.value.jumlah_obat.trim(); if (!jumlahRaw) { - validationErrors.jumlah_obat = "Jumlah obat wajib diisi"; + validationErrors.jumlah_obat = "Medicine quantity is required"; } else { const jumlahNumber = Number(jumlahRaw); if (!Number.isInteger(jumlahNumber) || jumlahNumber <= 0) { validationErrors.jumlah_obat = - "Jumlah obat harus berupa bilangan bulat positif"; + "Medicine quantity must be a positive integer"; } } @@ -164,7 +164,7 @@ const handleSubmit = async () => { } catch (error) { console.error("Failed to create obat:", error); submitError.value = - (error as ApiError)?.message || "Gagal menyimpan data obat."; + (error as ApiError)?.message || "Failed to save medicine data."; } finally { isLoading.value = false; } @@ -194,7 +194,7 @@ watch( ); onMounted(() => { - document.title = "Tambah Pemberian Obat - Hospital Log"; + document.title = "Add Medicine Administration - Hospital Log"; fetchVisitOptions(""); }); @@ -203,19 +203,22 @@ onMounted(() => {
- +
-
Tambah Pemberian Obat
+
Add Medicine Administration
@@ -264,7 +267,7 @@ onMounted(() => { class="mt-2" label="ID Visit" type="text" - placeholder="Masukkan ID visit" + placeholder="Enter visit ID" v-model="data.id_visit" :error="errors.id_visit || null" list="visit-options" @@ -280,25 +283,25 @@ onMounted(() => { @@ -308,7 +311,7 @@ onMounted(() => { >
diff --git a/frontend/hospital-log/src/views/dashboard/obat/DetailObatView.vue b/frontend/hospital-log/src/views/dashboard/obat/DetailObatView.vue index 05c113c..6956089 100644 --- a/frontend/hospital-log/src/views/dashboard/obat/DetailObatView.vue +++ b/frontend/hospital-log/src/views/dashboard/obat/DetailObatView.vue @@ -127,7 +127,7 @@ const fetchLogData = async () => { onMounted(async () => { await fetchData(); await fetchLogData(); - document.title = "Rekam Medis Detail - Hospital Log"; + document.title = "Medicine Administration Detail - Hospital Log"; }); @@ -136,8 +136,8 @@ onMounted(async () => {
@@ -145,21 +145,21 @@ onMounted(async () => { -
Detail Pemberian Obat
+
Medicine Administration Detail

ID: {{ data?.id }}

ID Visit: {{ data?.id_visit }}

-

Obat: {{ data?.obat }}

-

Jumlah Obat: {{ data?.jumlah_obat }}

-

Aturan Pakai: {{ data?.aturan_pakai }}

+

Medicine: {{ data?.obat }}

+

Medicine Quantity: {{ data?.jumlah_obat }}

+

Usage Instructions: {{ data?.aturan_pakai }}


-
Log Perubahan
+
Change Log
diff --git a/frontend/hospital-log/src/views/dashboard/obat/ObatView.vue b/frontend/hospital-log/src/views/dashboard/obat/ObatView.vue index d44322c..5aed38f 100644 --- a/frontend/hospital-log/src/views/dashboard/obat/ObatView.vue +++ b/frontend/hospital-log/src/views/dashboard/obat/ObatView.vue @@ -51,15 +51,15 @@ const sortOrder = ref<"asc" | "desc">( const tableColumns = [ { key: "id" as keyof ObatData, label: "#", class: "text-dark" }, { key: "id_visit" as keyof ObatData, label: "ID Visit", class: "text-dark" }, - { key: "obat" as keyof ObatData, label: "Obat", class: "text-dark" }, + { key: "obat" as keyof ObatData, label: "Medicine", class: "text-dark" }, { key: "jumlah_obat" as keyof ObatData, - label: "Jumlah Obat", + label: "Medicine Quantity", class: "text-dark", }, { key: "aturan_pakai" as keyof ObatData, - label: "Aturan Pakai", + label: "Usage Instructions", class: "text-dark", }, ]; @@ -207,7 +207,10 @@ onMounted(async () => {
- +
{
@@ -272,7 +275,7 @@ onMounted(async () => { d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" /> - Data obat berhasil dikirim untuk validasi penghapusan + Medicine data successfully sent for deletion validation
@@ -280,7 +283,7 @@ onMounted(async () => { :data="data" :columns="tableColumns" :is-loading="api.isLoading.value" - empty-message="Tidak ada data obat" + empty-message="No medicine data available" @details="handleDetails" @update="handleUpdate" @delete="handleDelete" diff --git a/frontend/hospital-log/src/views/dashboard/obat/UpdateObatView.vue b/frontend/hospital-log/src/views/dashboard/obat/UpdateObatView.vue index 89b112c..1dfea5d 100644 --- a/frontend/hospital-log/src/views/dashboard/obat/UpdateObatView.vue +++ b/frontend/hospital-log/src/views/dashboard/obat/UpdateObatView.vue @@ -110,7 +110,7 @@ const handleSubmit = async () => { isLoading.value = true; if (id.value === data.value.id) { if (id.value !== parseInt(route.params.id as string)) { - alert("ID tidak valid. Data akan dimuat ulang."); + alert("Invalid ID. Data will be reloaded."); await fetchData(); return; } @@ -181,7 +181,7 @@ const fetchLogData = async () => { onMounted(async () => { await fetchData(); await fetchLogData(); - document.title = "Rekam Medis Detail - Hospital Log"; + document.title = "Medicine Administration Detail - Hospital Log"; }); @@ -190,8 +190,8 @@ onMounted(async () => {
@@ -199,12 +199,12 @@ onMounted(async () => { -
Update Pemberian Obat
+
Update Medicine Administration
@@ -239,40 +239,40 @@ onMounted(async () => { />
- Simpan Perubahan + Save Changes

-
Log Perubahan
+
Change Log
diff --git a/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/CreateTindakanDokterView.vue b/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/CreateTindakanDokterView.vue index e72f28f..b443009 100644 --- a/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/CreateTindakanDokterView.vue +++ b/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/CreateTindakanDokterView.vue @@ -128,7 +128,7 @@ const handleSubmit = async () => { } catch (error) { console.error("Failed to create tindakan:", error); submitError.value = - (error as ApiError)?.message || "Gagal menyimpan data tindakan."; + (error as ApiError)?.message || "Failed to save action data."; } finally { isLoading.value = false; } @@ -158,7 +158,7 @@ watch( ); onMounted(() => { - document.title = "Tambah Pemberian Tindakan - Hospital Log"; + document.title = "Add Doctor Action - Hospital Log"; fetchVisitOptions(""); }); @@ -167,10 +167,7 @@ onMounted(() => {
- +
@@ -178,13 +175,13 @@ onMounted(() => {
  • Pemberian TindakanDoctor Action
  • -
  • Tambah Pemberian Tindakan
  • +
  • Add Doctor Action
-
Tambah Pemberian Tindakan
+
Add Doctor Action
{ { { >
diff --git a/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/DetailTindakanDokterView.vue b/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/DetailTindakanDokterView.vue index c8cff3e..b85fbbb 100644 --- a/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/DetailTindakanDokterView.vue +++ b/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/DetailTindakanDokterView.vue @@ -128,7 +128,7 @@ const fetchLogData = async () => { onMounted(async () => { await fetchData(); await fetchLogData(); - document.title = `Detail Pemberian Tindakan - ID ${route.params.id}`; + document.title = `Doctor Action Details - ID ${route.params.id}`; }); @@ -137,8 +137,8 @@ onMounted(async () => {
@@ -147,28 +147,28 @@ onMounted(async () => {
  • - Pemberian Tindakan + Doctor Actions
  • -
  • Detail Pemberian Tindakan {{ route.params.id }}
  • +
  • Doctor Action Details {{ route.params.id }}
-
Detail Pemberian Tindakan
+
Doctor Action Details

ID: {{ tindakan?.id }}

-

ID Visit: {{ tindakan?.id_visit }}

-

Tindakan: {{ tindakan?.tindakan }}

+

Visit ID: {{ tindakan?.id_visit }}

+

Doctor Action: {{ tindakan?.tindakan }}

- Kategori Tindakan: + Doctor Action Category: {{ tindakan?.kategori_tindakan || "-" }}

- Kelompok Tindakan: + Doctor Action Group: {{ tindakan?.kelompok_tindakan || "-" }}


-
Log Perubahan
+
Change Log
diff --git a/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/TindakanDokterEditView.vue b/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/TindakanDokterEditView.vue index a42ea57..99e9374 100644 --- a/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/TindakanDokterEditView.vue +++ b/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/TindakanDokterEditView.vue @@ -275,7 +275,7 @@ const handleSubmit = async () => { } catch (error) { console.error("Failed to update tindakan:", error); submitError.value = - (error as ApiError)?.message || "Gagal memperbarui data tindakan."; + (error as ApiError)?.message || "Failed to update action data."; } finally { isSubmitting.value = false; } @@ -312,7 +312,7 @@ onMounted(async () => { fetchLogData(), fetchVisitOptions(""), ]); - document.title = `Edit Pemberian Tindakan - ID ${routeId.value}`; + document.title = `Edit Doctor Action - ID ${routeId.value}`; }); watch( @@ -342,8 +342,8 @@ watch(
@@ -352,13 +352,13 @@ watch(
  • - Pemberian Tindakan + Doctor Actions
  • -
  • Update Pemberian Tindakan {{ routeId }}
  • +
  • Update Doctor Action {{ routeId }}
-
Update Pemberian Tindakan
+
Update Doctor Action
@@ -412,9 +412,9 @@ watch( />

-
Log Perubahan
+
Change Log
diff --git a/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/TindakanView.vue b/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/TindakanView.vue index 0f09bf6..e862376 100644 --- a/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/TindakanView.vue +++ b/frontend/hospital-log/src/views/dashboard/pemberian-tindakan/TindakanView.vue @@ -72,25 +72,12 @@ const updateQueryParams = () => { }; const fetchData = async () => { - console.log("Fetch Data Params :", { - take: pagination.pageSize.value.toString(), - page: pagination.page.value.toString(), - orderBy: sortBy.value, - order: sortOrder.value, - ...(searchIdVisit.value && { id_visit: searchIdVisit.value }), - ...(filter.value.tindakan && { tindakan: filter.value.tindakan }), - ...(filter.value.kategori.length > 0 - ? { kategori: filter.value.kategori.join(",") } - : {}), - ...(filter.value.kelompok.length > 0 - ? { kelompok: filter.value.kelompok.join(",") } - : {}), - }); try { const queryParams = new URLSearchParams({ take: pagination.pageSize.value.toString(), page: pagination.page.value.toString(), orderBy: sortBy.value, + order: sortOrder.value, ...(searchIdVisit.value && { id_visit: searchIdVisit.value }), ...(filter.value.tindakan && { tindakan: filter.value.tindakan }), ...(filter.value.kategori.length > 0 @@ -166,7 +153,10 @@ const handleSortChange = (newSortBy: string) => { }; const toggleSortOrder = () => { + console.log(sortOrder.value); sortOrder.value = sortOrder.value === "asc" ? "desc" : "asc"; + pagination.reset(); + fetchData(); }; const handlePageSizeChange = (newSize: number) => { @@ -191,7 +181,7 @@ const handleDelete = async (item: TindakanDokter) => { await fetchData(); } catch (error) { console.error("Error deleting tindakan:", error); - alert("Gagal menghapus data tindakan"); + alert("Failed to delete action data"); } }; @@ -226,7 +216,7 @@ onMounted(async () => { } await fetchData(); - document.title = "Tindakan Dokter - Hospital Log"; + document.title = "Doctors Actions - Hospital Log"; }); @@ -235,8 +225,8 @@ onMounted(async () => {
{
- +
Action Group
{
Action Category { @click="handleApplyFilter" class="btn btn-sm bg-dark hover:bg-light hover:text-dark active:inset-shadow-sm active:inset-shadow-black/50" > - Terapkan + Apply
@@ -334,14 +324,14 @@ onMounted(async () => {
@@ -391,9 +381,7 @@ onMounted(async () => { d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z" /> - Data tindakan berhasil dikirim untuk validasi penghapusan + Action data successfully sent for deletion validation
@@ -401,7 +389,7 @@ onMounted(async () => { :data="data" :columns="TINDAKAN_TABLE_COLUMNS" :is-loading="api.isLoading.value" - empty-message="Tidak ada data tindakan" + empty-message="No action data available" @details="handleDetails" @update="handleUpdate" @delete="handleDelete" diff --git a/frontend/hospital-log/src/views/dashboard/rekam-medis/CreateRekamMedisView.vue b/frontend/hospital-log/src/views/dashboard/rekam-medis/CreateRekamMedisView.vue index 77c9d62..ed5f00f 100644 --- a/frontend/hospital-log/src/views/dashboard/rekam-medis/CreateRekamMedisView.vue +++ b/frontend/hospital-log/src/views/dashboard/rekam-medis/CreateRekamMedisView.vue @@ -3,7 +3,6 @@ import Sidebar from "../../../components/dashboard/Sidebar.vue"; import Footer from "../../../components/dashboard/Footer.vue"; import PageHeader from "../../../components/dashboard/PageHeader.vue"; import { onMounted, ref, watch } from "vue"; -import { useRoute } from "vue-router"; import FieldInput from "../../../components/dashboard/FieldInput.vue"; import { FILTER } from "../../../constants/pagination"; import { @@ -12,7 +11,6 @@ import { } from "../../../validation/rekamMedis"; import { useApi } from "../../../composables/useApi"; -const route = useRoute(); const api = useApi(); const data = ref<{ @@ -233,7 +231,7 @@ watch( ); onMounted(() => { - document.title = "Tambah Rekam Medis - Hospital Log"; + document.title = "Add Medical Record - Hospital Log"; }); @@ -242,8 +240,8 @@ onMounted(() => {
@@ -251,12 +249,12 @@ onMounted(() => { -
Tambah Rekam Medis
+
Add Medical Record
-
Mohon tunggu, sedang menambahkan rekam medis...
+
Please wait, adding medical record...
{
- Identitas Pasien + Patient Identity
{ />
Gender

{

Blood Type
{
{
- Tanda-Tanda Vital + Vital Signs
{ /> { /> { /> { /> { /> { >
- Informasi Medis + Medical Information
@@ -494,7 +492,7 @@ onMounted(() => {
Kelompok DataTipe AksiID UserData GroupAction TypeUser ID