Flatten nested repos

This commit is contained in:
sas.fajri
2026-04-27 10:13:31 +07:00
parent 01c2963a43
commit 8347aef8f4
17935 changed files with 5015229 additions and 3 deletions

View File

@@ -0,0 +1,78 @@
<template>
<v-menu
v-model="menu2"
:close-on-content-click="false"
:nudge-right="40"
lazy
transition="scale-transition"
offset-y
full-width
max-width="290px"
min-width="290px"
>
<v-text-field
slot="activator"
v-model="computedDateFormatted"
:label=init_label
hint="DD-MM-YYYY format"
persistent-hint
readonly
solo
hide-details
class="ma-1"
></v-text-field>
<v-date-picker v-model="init_date" no-title @input="menu2 = false"></v-date-picker>
</v-menu>
</template>
<script>
module.exports = {
props : ['label', 'date', 'data'],
data () {
return {
init_date: this.date ? this.date : new Date().toISOString().substr(0, 10),
dateFormatted: this.formatDate(new Date().toISOString().substr(0, 10)),
menu1: false,
menu2: false,
init_label: this.label ? this.label : 'Date',
init_data: this.data ? this.data : ''
}
},
computed: {
computedDateFormatted () {
return this.formatDate(this.init_date)
}
},
watch: {
init_date (n, o) {
this.dateFormatted = this.formatDate(this.init_date)
this.$emit('change', {"old_date":o, "new_date":n, "data":this.init_data});
}
},
methods: {
formatDate (date) {
if (!date) return null
const [year, month, day] = date.split('-')
return `${day}-${month}-${year}`
},
parseDate (date) {
if (!date) return null
const [month, day, year] = date.split('/')
return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`
},
emitChange (n, o) {
console.log("old:"+o)
console.log("new:"+n)
}
}
}
</script>

View File

@@ -0,0 +1,78 @@
<template>
<v-menu
v-model="menu2"
:close-on-content-click="false"
:nudge-right="40"
lazy
transition="scale-transition"
offset-y
full-width
max-width="290px"
min-width="290px"
>
<v-text-field
slot="activator"
v-model="computedDateFormatted"
:label=init_label
hint="DD-MM-YYYY format"
persistent-hint
readonly
solo
hide-details
class="ma-1"
></v-text-field>
<v-date-picker v-model="init_date" no-title @input="menu2 = false"></v-date-picker>
</v-menu>
</template>
<script>
module.exports = {
props : ['label', 'date', 'data'],
data () {
return {
init_date: this.date ? this.date : new Date().toISOString().substr(0, 10),
dateFormatted: this.formatDate(new Date().toISOString().substr(0, 10)),
menu1: false,
menu2: false,
init_label: this.label ? this.label : 'Date',
init_data: this.data ? this.data : ''
}
},
computed: {
computedDateFormatted () {
return this.formatDate(this.init_date)
}
},
watch: {
init_date (n, o) {
this.dateFormatted = this.formatDate(this.init_date)
this.$emit('change', {"old_date":o, "new_date":n, "data":this.init_data});
}
},
methods: {
formatDate (date) {
if (!date) return null
const [year, month, day] = date.split('-')
return `${day}-${month}-${year}`
},
parseDate (date) {
if (!date) return null
const [month, day, year] = date.split('/')
return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`
},
emitChange (n, o) {
console.log("old:"+o)
console.log("new:"+n)
}
}
}
</script>

View File

@@ -0,0 +1,43 @@
<template>
<div style="height:30px;
position:fixed;bottom:0px;
left:50%;
color:white;
font-size:16px;
padding-bottom:5px;
font-weight:bold;
z-index:999;
margin-left:-150px;width:300px;">
Pasien hari ini : {{ hari_ini }} , menyusul {{ total - hari_ini}}
</div>
</template>
<script>
module.exports = {
computed: {
total() {
try {
let pxs = this.$store.state.re_patient.patients
return pxs.length
} catch(e) {
return 0
}
},
hari_ini() {
try {
let pxs = this.$store.state.re_patient.patients
let curdate = moment().format('DD.MM.YYYY')
let xtot = _.filter(pxs,function(p) {
let xdate = moment(p.T_OrderHeaderDate).format('DD.MM.YYYY')
return curdate == xdate
});
return xtot.length
} catch(e) {
return 0
}
}
},
methods: {
}
}
</script>

View File

@@ -0,0 +1,89 @@
<template>
<v-dialog
v-model="dialog"
max-width="500px"
>
<v-card>
<v-card-text>
<v-layout row wrap>
<v-flex xs12>
<v-text-field
label="Pemeriksaan"
v-model="selected_px.t_testname"
readonly
></v-text-field>
</v-flex>
<v-flex xs12>
<v-text-field
label="Metode sekarang"
v-model="selected_px.methode_name"
readonly
></v-text-field>
</v-flex>
<v-flex xs12>
<v-select
:items="methods"
item-text="Nat_MethodeName"
item-value="Nat_MethodeID"
return-object
v-model="selected_method"
label="Pilih Metode baru"
></v-select>
</v-flex>
</v-layout>
</v-card-text>
<v-card-actions>
<v-btn color="primary" flat @click="dialog=!dialog">Tutup</v-btn>
<v-spacer></v-spacer>
<v-btn color="primary" dark @click="save">Simpan</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<script>
module.exports = {
data () {
return {
}
},
computed : {
dialog : {
get () { return this.$store.state.normal_method.dialog_method },
set (v) { this.$store.commit('normal_method/update_dialog_method', v) }
},
methods () {
return this.$store.state.normal_method.methods
},
selected_method : {
get () { return this.$store.state.normal_method.selected_method },
set (v) { this.$store.commit('normal_method/update_selected_method', v) }
},
selected_px () {
return this.$store.state.re_px.selected_px
}
},
methods : {
save () {
this.$store.dispatch('normal_method/save_method')
}
},
watch : {
dialog(val, old) {
if (val && !old) {
this.$store.dispatch('normal_method/search_method')
}
}
}
}
</script>

View File

@@ -0,0 +1,65 @@
<template>
<v-dialog
v-model="dialog"
max-width="500px"
persistent
>
<v-card>
<v-card-text>
<v-layout row wrap>
<v-flex xs12>
<v-textarea
rows="5"
outline
label="Catatan Proses"
hide-details
v-model="result_note"
></v-textarea>
</v-flex>
</v-layout>
</v-card-text>
<v-card-actions>
<v-btn color="primary" flat @click="dialog=!dialog">Tutup</v-btn>
<v-spacer></v-spacer>
<v-btn color="primary" @click="save">Simpan</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<style>
/* .v-overlay--active {
z-index: 1005 !important;
}
.v-dialog__content--active {
z-index: 1006 !important;
} */
</style>
<script>
module.exports = {
data () {
return {}
},
computed : {
dialog : {
get () { return this.$store.state.re_patient.dialog_note },
set (v) { this.$store.commit('re_patient/update_dialog_note', v) }
},
result_note : {
get () { return this.$store.state.re_patient.result_note },
set (v) { this.$store.commit('re_patient/update_result_note', v) }
}
},
methods : {
save () {
this.$store.dispatch('re_patient/save_note')
}
}
}
</script>

View File

@@ -0,0 +1,102 @@
<template>
<v-dialog
v-model="dialog"
max-width="500px"
persistent
>
<v-card>
<v-card-text>
<v-layout row wrap mb-2 v-show="info_req.note_fo != ''">
<v-flex xs12>
<h5 class="caption">Catatan FO</h5>
<h3 class="title font-weight-regular">{{info_req.note_fo}}</h3>
</v-flex>
</v-layout>
<v-layout row wrap mb-2 v-show="info_req.note_fo_ver != ''">
<v-flex xs12>
<h5 class="caption">Catatan Screening</h5>
<h3 class="title font-weight-regular">{{info_req.note_fo_ver}}</h3>
</v-flex>
</v-layout>
<v-layout row wrap mb-2 v-show="info_req.note_sampling != ''">
<v-flex xs12>
<h5 class="caption">Catatan Specimen</h5>
<h3 class="title font-weight-regular">{{info_req.note_sampling}}</h3>
</v-flex>
</v-layout>
<v-layout row wrap mb-2 v-show="info_req.req_fo.length > 0">
<v-flex xs12>
<h5 class="caption">Requirement FO</h5>
<h3 class="title font-weight-regular">{{info_req.req_fo.join(', ')}}</h3>
</v-flex>
</v-layout>
<v-layout row wrap mb-2 v-show="info_req.req_spec_col.length > 0">
<v-flex xs12>
<h5 class="caption">Requirement Specimen Collection</h5>
<h3 class="title font-weight-regular">{{info_req.req_spec_col.join(', ')}}</h3>
</v-flex>
</v-layout>
<v-layout row wrap mb-2 v-show="info_req.req_spec_ver.length > 0">
<v-flex xs12>
<h5 class="caption">Requirement Specimen Verification</h5>
<h3 class="title font-weight-regular">{{info_req.req_spec_ver.join(', ')}}</h3>
</v-flex>
</v-layout>
<v-layout row wrap mb-2 v-show="info_req.req_samp_ver.length > 0">
<v-flex xs12>
<h5 class="caption">Requirement Sample Verification</h5>
<h3 class="title font-weight-regular">{{info_req.req_samp_ver.join(', ')}}</h3>
</v-flex>
</v-layout>
<v-layout row wrap mb-2 v-show="info_req.req_pre_an.length > 0">
<v-flex xs12>
<h5 class="caption">Requirement Pre Analitik</h5>
<h3 class="title font-weight-regular">{{info_req.req_pre_an.join(', ')}}</h3>
</v-flex>
</v-layout>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="primary" flat @click="dialog=!dialog">Tutup</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<style>
/* .v-overlay--active {
z-index: 1005 !important;
}
.v-dialog__content--active {
z-index: 1006 !important;
} */
</style>
<script>
module.exports = {
data () {
return {}
},
computed : {
dialog : {
get () { return this.$store.state.re_patient.dialog_req },
set (v) { this.$store.commit('re_patient/update_dialog_req', v) }
},
info_req () {
return this.$store.state.re_patient.info_req
}
},
methods : {
}
}
</script>

View File

@@ -0,0 +1,137 @@
<template>
<v-dialog
v-model="dialog"
max-width="400px"
>
<v-card>
<v-card-title primary-title class="grey darken-3 white--text">
<h3 class="headliine">Tambah Template Hasil</h3>
</v-card-title>
<v-card-text>
<v-layout row wrap>
<v-flex xs12>
<v-text-field
label="Pemeriksaan"
readonly
v-model="curr_px"
></v-text-field>
</v-flex>
<v-flex xs12>
<v-text-field
label="Keterangan Hasil"
v-model="template_new_value"
:error="error || dup_error"
:error-messages="error_msg"
></v-text-field>
</v-flex>
</v-layout>
</v-card-text>
<v-card-actions>
<v-btn color="primary" flat @click="dialog=false">Tutup</v-btn>
<v-spacer></v-spacer>
<v-btn color="primary" dark @click="save">Simpan</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<script>
module.exports = {
data() {
return {
error_messages: ''
}
},
computed : {
dialog : {
get() {
return this.$store.state.re_px.dialog_template_new
},
set (v) {
this.$store.commit('re_px/update_dialog_template_new', v)
}
},
template_new_value : {
get() {
return this.$store.state.re_px.template_new_value
},
set (v) {
this.$store.commit('re_px/update_template_new_value', v)
}
},
curr_px () {
return this.$store.state.re_px.selected_px.t_testname
},
error () {
if (this.template_new_value.length < 1) {
this.error_messages = "Keterangan Isi Hasil tidak boleh kosong !"
return true
}
this.error_messages = ""
return false
},
error_msg () {
if (this.error_messages != '')
return this.error_messages
return this.dup_error_messages
},
dup_error : {
get() { return this.$store.state.re_px.dup_template_error.status },
set (v) {
let x = this.$store.state.re_px.dup_template_error
x.status = v
this.$store.commit('re_px/update_dup_template_error', x)
}
},
dup_error_messages : {
get() { return this.$store.state.re_px.dup_template_error.messages },
set (v) {
let x = this.$store.state.re_px.dup_template_error
x.messages = v
this.$store.commit('re_px/update_dup_template_error', x)
}
}
},
methods : {
save () {
if (this.error) {
return
} else {
this.$store.dispatch('re_px/save_template')
}
}
},
watch : {
template_new_value (v, o) {
if (this.dup_error) {
if (v != o)
this.$store.commit('re_px/update_dup_template_error', {
status: false,
messages: ''
})
}
},
dialog (v, o) {
if (v && !o)
this.template_new_value = ''
}
}
}
</script>

View File

@@ -0,0 +1,87 @@
<template>
<v-dialog
v-model="dialog"
persistent
max-width="500px"
transition="dialog-transition"
>
<v-layout class="fill-height" column>
<v-card class="grow" color="blue-grey lighten-2">
<v-card-title primary-title class="title white--text pb-2">
HISTORI PEMERIKSAAN
</v-card-title>
<v-card-text class="pt-2 pb-2">
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="white" flat @click="dialog = false">Tutup</v-btn>
</v-card-actions>
</v-card>
</v-layout>
</v-dialog>
</template>
<style scoped>
</style>
<script>
module.exports = {
data() {
return {
query: "",
items: [],
headers: [
{
text: "PEMERIKSAAN",
align: "left",
sortable: false,
width: "45%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "HASIL",
align: "left",
sortable: false,
value: "mr",
width: "35%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "FLAG",
align: "left",
sortable: false,
value: "mr",
width: "20%",
class: "pa-2 blue lighten-3 white--text"
}
],
isLoading: false
};
},
methods : {
},
computed : {
dialog : {
get () { return this.$store.state.re_history.dialog_history },
set (v) { this.$store.commit('re_history/update_dialog_history', v) }
}
},
mounted () {
}
}
</script>

View File

@@ -0,0 +1,209 @@
<template>
<v-dialog
v-model="dialog"
persistent
max-width="1000px"
min-height="600px"
transition="dialog-transition"
>
<v-layout class="fill-height" column>
<v-card class="grow" color="blue-grey lighten-2">
<v-card-title primary-title class="title white--text pb-2">
HISTORI PEMERIKSAAN
<v-spacer></v-spacer>
<v-btn color="white" flat @click="filter_test()">{{text_filter_test}}</v-btn>
<v-btn color="white" flat @click="uncheck_all()">Clear Test</v-btn>
<v-btn color="white" flat @click="dialog = false">Tutup</v-btn>
</v-card-title>
<v-card-text class="pt-2 pb-2">
<v-layout v-if="show_filter_test" xs12 row wrap style="background-color:white;padding-top:10px;border-radius:10px 10px 0px 0px;padding-left:10px;">
<v-flex xs3 v-for="(p, i) in pxs" v-bind:key="p.code" class="pr-2 pb-1">
<v-layout row>
<v-flex class="boxoutline" class="text-left" style="padding-top:10px" pl-2 pr-2 xs2>
<v-layout row align-left justify-space-between>
<v-icon v-if="! px_selected(p.code)" @click="selectPx(p.code)" style="color:red">clear</v-icon>
<v-icon v-if="px_selected(p.code)" @click="unSelectPx(p.code)" style="color:green">check</v-icon>
</v-layout>
</v-flex>
<v-flex class="boxoutline " style="text-overflow:ellipsis;overflow:hidden;padding-top:10px;" xs11>
<span >{{p.name}}</span>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout row wrap>
<v-flex xs12 >
<v-card>
<v-card-text class="pt-1 pb-1 pl-1 pr-1">
<v-data-table
:headers="new_headers" :items="result"
:loading="isLoading"
hide-actions class="elevation-1 table-history"
>
<template slot="items" slot-scope="props">
<td class="text-xs-left pl-2 pr-2 pa-1 green--text" >
{{ props.item.px_name }}
</td>
<td class="text-xs-left pl-2 pr-2 pa-1" >
{{ props.item.unit}}
</td>
<td class="text-xs-left pl-2 pr-2 pa-1" v-for="xdate in dates" >
{{ props.item.result[xdate] }}
</td>
</template>
</v-data-table>
</v-card-text>
</v-card>
</v-flex>
</v-layout>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="white" flat @click="dialog = false">Tutup</v-btn>
</v-card-actions>
</v-card>
</v-layout>
</v-dialog>
</template>
<style>
.table-history table td {
height: 40px !important
}
.boxoutline {
color: #000099;
border: 1px solid #e6f7ff;
justify-content: center;
height: 55px;
line-height: 25px;
padding-left: 5px;
background: #b3e7ff;
font-size: 14px;
border-radius: 1px;
font-weight: 200;
}
.boxoutline:hover {
background: #e6f7ff!important;
font-size: 14px;
font-weight: 300;
}
</style>
<script>
module.exports = {
data() {
return {
query: "",
items: [],
isLoading: false,
show_filter_test: false
};
},
methods : {
filter_test() {
this.show_filter_test = !this.show_filter_test
},
oneMoment : function(d) {
return window.oneMoment(d)
},
uncheck_all() {
this.$store.commit('re_history/update_selected_px',[])
},
selectPx(code) {
console.log('Select ' + code )
let pxs = this.$store.state.re_history.pxs
let obj = _.filter(pxs,function(o){ return o.code == code})
let spx = this.$store.state.re_history.selected_px
let n_spx = _.concat(spx,obj)
this.$store.commit('re_history/update_selected_px',n_spx)
},
unSelectPx(code) {
let spx = this.$store.state.re_history.selected_px
let new_spx = _.filter(spx,function(o){ return o.code != code })
this.$store.commit('re_history/update_selected_px',new_spx)
},
px_selected(code) {
let spx = this.$store.state.re_history.selected_px
let rst = _.findIndex(spx,{'code':code})
if (rst == -1 ) return false
return true
},
},
computed : {
dates() {
return this.$store.state.re_history.dates
},
text_filter_test() {
if (this.show_filter_test) return "Hide Test"
return "Show Test"
},
new_headers() {
let headers = [
{
text: "PEMERIKSAAN",
align: "left",
sortable: false,
width: "45%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "Unit",
align: "left",
sortable: false,
value: "mr",
width: "16%",
class: "pa-2 blue lighten-3 white--text"
} ]
for(let i =0; i< this.dates.length ; i++ ) {
headers.push({
text: this.dates[i],
align: "left",
sortable: false,
value: "mr",
width: "15%",
class: "pa-2 blue lighten-3 white--text"
})
}
return headers
},
result () {
let spx = this.$store.state.re_history.selected_px
let rst = this.$store.state.re_history.result
let new_rst = _.filter(rst, function(r) {
return _.findIndex(spx,{'code':r.code}) > -1
})
return new_rst
},
pxs () {
return this.$store.state.re_history.pxs
},
dialog : {
get () { return this.$store.state.re_history.dialog_history },
set (v) { this.$store.commit('re_history/update_dialog_history', v) }
},
selected_px: {
get () { return this.$store.state.re_history.selected_px }
}
},
}
</script>

View File

@@ -0,0 +1,87 @@
<template>
<v-dialog
v-model="dialog"
persistent
max-width="500px"
transition="dialog-transition"
>
<v-layout class="fill-height" column>
<v-card class="grow" color="blue-grey lighten-2">
<v-card-title primary-title class="title white--text pb-2">
HISTORI PEMERIKSAAN
</v-card-title>
<v-card-text class="pt-2 pb-2">
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="white" flat @click="dialog = false">Tutup</v-btn>
</v-card-actions>
</v-card>
</v-layout>
</v-dialog>
</template>
<style scoped>
.v-card__actions { display:none }
</style>
<script>
module.exports = {
data() {
return {
query: "",
items: [],
headers: [
{
text: "PEMERIKSAAN",
align: "left",
sortable: false,
width: "45%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "HASIL",
align: "left",
sortable: false,
value: "mr",
width: "35%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "FLAG",
align: "left",
sortable: false,
value: "mr",
width: "20%",
class: "pa-2 blue lighten-3 white--text"
}
],
isLoading: false
};
},
methods : {
},
computed : {
dialog : {
get () { return this.$store.state.re_history.dialog_history },
set (v) { this.$store.commit('re_history/update_dialog_history', v) }
}
},
mounted () {
}
}
</script>

View File

@@ -0,0 +1,236 @@
<template>
<v-layout row wrap>
<v-flex xs12>
<v-card class="pa-2" v-show="!detail">
<v-layout row wrap>
<v-flex xs3>
<div class="caption font-weight-light">No Reg / Tanggal</div>
<div class="subheading">{{ selected_patient.T_OrderHeaderLabNumber }} / {{ order_date }}</div>
</v-flex>
<v-flex xs3>
<div class="caption font-weight-light">Nama / Jenis Kelamin</div>
<div class="subheading">{{ selected_patient.M_PatientName }} / {{ selected_patient.M_SexName }}
</div>
</v-flex>
<v-flex xs3>
<div class="caption font-weight-light">DOB / Umur</div>
<div class="subheading">{{ dob_date }} / {{ age }}</div>
</v-flex>
<!-- <v-flex xs3>
<div class="caption font-weight-light">Pengirim</div>
<div class="subheading">{{ selected_patient.doctor_sender_name }}&nbsp;</div>
</v-flex>
-->
</v-layout>
<v-btn absolute dark top right color="black" flat depressed @click="detail = !detail" class="btn-detail">
<v-icon>keyboard_arrow_up</v-icon>
</v-btn>
</v-card>
</v-flex>
<v-flex xs12 v-show="detail">
<v-card class="pa-2">
<v-layout row wrap>
<v-flex xs6>
<div class="caption font-weight-light">No Reg / Tanggal</div>
<div class="subheading">{{ selected_patient.T_OrderHeaderLabNumber }} / {{ order_date }}</div>
<div class="caption font-weight-light mt-2">Nama / Jenis Kelamin</div>
<div class="subheading">{{ selected_patient.M_PatientName }} / {{ selected_patient.M_SexName }}
</div>
<div class="caption font-weight-light mt-2">DOB / Umur</div>
<div class="subheading">{{ dob_date }} / {{ age }}</div>
<div class="caption font-weight-light mt-2">Phone</div>
<div class="subheading">{{ selected_patient.M_PatientHP }}
</div>
<div class="caption font-weight-light mt-2">Diagnose</div>
<div class="subheading">{{ selected_patient.T_OrderHeaderDiagnose }}</div>
</v-flex>
<v-flex xs6>
<div class="caption font-weight-light">Corporate</div>
<div class="subheading">{{ selected_patient.CorporateName }} &nbsp;</div>
<!-- <div class="caption font-weight-light mt-2">Pengirim</div>
<div class="subheading">{{ selected_patient.doctor_sender_name }}&nbsp;</div>
<div class="caption font-weight-light mt-2">Pengiriman Hasil</div>
<div class="subheading">{{ selected_patient.delivery ? selected_patient.delivery.join(",
"):''}}&nbsp;</div>
-->
<div class="caption font-weight-light mt-2">Format Hasil</div>
<div class="subheading">{{ langs }}&nbsp;</div>
</v-flex>
</v-layout>
<v-layout row v-show="false">
<v-flex xs3>
<v-layout row wrap pr-2>
<v-flex xs7 pr-2>
<v-text-field label="Nomor Lab" v-model="selected_patient.T_OrderHeaderLabNumber"
readonly></v-text-field>
</v-flex>
<v-flex xs5>
<v-text-field label="Tanggal" v-model="order_date" readonly></v-text-field>
</v-flex>
<v-flex xs12>
<v-text-field label="Nama" v-model="selected_patient.M_PatientName"
readonly></v-text-field>
</v-flex>
</v-layout>
</v-flex>
<v-flex xs3>
<v-layout row wrap pl-2>
<v-flex xs5 pr-2>
<v-text-field label="DOB" v-model="dob_date" readonly></v-text-field>
</v-flex>
<v-flex xs7 pl-2>
<v-text-field label="Umur" v-model="age" readonly></v-text-field>
</v-flex>
<v-flex xs12>
<v-text-field label="Jenis Kelamin" v-model="selected_patient.M_SexName"
readonly></v-text-field>
</v-flex>
</v-layout>
</v-flex>
<v-flex xs3>
<v-layout row wrap pl-2>
<v-flex xs12>
<v-text-field label="Dokter" v-model="selected_patient.doctor_pj_name"
readonly></v-text-field>
</v-flex>
<v-flex xs12>
<v-text-field label="Corporate" v-model="selected_patient.CorporateName"
readonly></v-text-field>
</v-flex>
</v-layout>
</v-flex>
<v-flex xs3>
<v-layout row wrap pl-2>
<v-flex xs12 mb-3>
<v-text-field label="No HP" v-model="selected_patient.M_PatientHP" readonly
hide-details></v-text-field>
</v-flex>
<v-flex xs12>
<v-text-field label="Catatan Pasien" outline readonly hide-details
v-model="selected_patient.M_PatientNote"></v-text-field>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout row wrap v-show="false">
<v-flex xs4 pr-2>
<v-text-field label="Catatan FO" outline readonly hide-details
v-model="selected_patient.T_OrderHeaderFoNote"></v-text-field>
</v-flex>
<v-flex xs4 pr-2>
<v-text-field label="Catatan Sampling" outline readonly hide-details
v-model="selected_patient.T_OrderHeaderSamplingNote"></v-text-field>
</v-flex>
<v-flex xs4>
<v-text-field label="Catatan Sample Handling" outline readonly hide-details
v-model="selected_patient.T_OrderHeaderResultNote"></v-text-field>
</v-flex>
</v-layout>
<v-btn absolute dark top right color="black" flat depressed @click="detail=!detail" class="btn-detail">
<v-icon>keyboard_arrow_down</v-icon>
</v-btn>
</v-card>
</v-flex>
</v-layout>
</template>
<style scoped>
.btn-detail {
min-width: 0px !important;
height: auto;
padding: 0px;
top: 5px;
right: 5px;
}
</style>
<script>
module.exports = {
data() {
return {
detail: false
}
},
computed: {
selected_patient() {
let x = this.$store.state.re_patient.selected_patient
if (x)
return x
return {}
},
order_date() {
let d = this.selected_patient.T_OrderHeaderDate
let e = ''
try {
e = d.substr(0, 10).split('-').reverse().join('-')
} catch (e) { /*console.log(e.message)*/ }
return e
},
dob_date() {
let d = this.selected_patient.M_PatientDOB
let e = ''
try {
e = d.substr(0, 10).split('-').reverse().join('-')
} catch (e) { /*console.log(e.message)*/ }
return e
},
age() {
let d = this.selected_patient.T_OrderHeaderM_PatientAge
return d
let e = ''
try {
e = d.replace(/tahun/, 'th').replace(/bulan/, 'bl').replace(/hari/, 'hr')
} catch (e) { /*console.log(e.message)*/ }
return e
},
langs() {
let x = this.selected_patient
if (!x) return ''
let si_01 = x.T_OrderHeaderLangIsSI == 'Y' ? ' (SI)' : ''
let si_02 = x.T_OrderHeaderAddOnSecondLangIsSI == 'Y' ? ' (SI)' : ''
if (!x.SecondM_LangID) return x.M_LangName + si_01
return x.M_LangName + si_01 + ', ' + x.SecondM_LangName + si_02
}
},
methods: {
}
}
</script>

View File

@@ -0,0 +1,222 @@
<template>
<v-layout class="fill-height" column>
<v-card class="grow">
<hr style="border-top:0px solid #c8c8c8;" />
<div class="one-critical-value-header"
:data-header-id="selected_patient.T_OrderHeaderID" ></div>
<v-data-table
:headers="headers" :items="patients"
:loading="isLoading"
hide-actions class="xelevation-1">
<template slot="items" slot-scope="props">
<tr :class="{
'susulan' : is_susulan(props.item),
'valid_done': is_valid_done(props.item), 'valid_partial':is_valid_partial(props.item) }"
>
<td
class="text-xs-left pa-2 green--text" v-bind:class="[ is_cito(props.item)]"
@click="select(props.item)">
<span style="color:black">{{ props.item.T_OrderHeaderLabNumber }}</span><br/>
<span style="color:#660000">{{props.item.T_OrderHeaderLabNumberExt}}</span>
</td>
<td
class="text-xs-left pa-2" v-bind:class="[ is_cito(props.item)]"
@click="select(props.item)">
{{ props.item.M_PatientName }} <br/>
<span style="color:#660000">{{format_date(props.item.T_OrderHeaderDate)}}</span>
</td>
<td>
<v-icon v-if="is_selected(props.item)" >pan_tool</v-icon>
</td>
</tr>
</template>
</v-data-table>
</v-card>
</v-layout>
</template>
<style scoped>
div.v-table__overflow {
height:680px!important;
overflow-y:scroll;
}
tr.susulan {
background-image: linear-gradient(to right, white 5%);
}
tr.susulan.verif_partial{
background-image: linear-gradient(to right, rgba(255, 0, 0,0.9) 5%, white 5%, white 40%,yellow 70%);
}
tr.susulan.verif_done {
background-image: linear-gradient(to right, rgba(255, 0, 0,0.9) 5%, yellow 5%);
}
tr.susulan.verif_partial.valid_partial {
background-image: linear-gradient(to right, #99e699 5%,#99e699 5%, #99e699 40%, #ef9f13 60%);
}
tr.susulan.valid_partial {
background-image: linear-gradient(to right, #ef9f13,#ef9f13, #ef9f13, #ef9f13);
}
tr.susulan.valid_done{
background-image: linear-gradient(to right, #c16eb0,#c16eb0, #c16eb0, #c16eb0);
}
tr.verif_partial{
background-image: linear-gradient(to right, white 40%,yellow 70%);
}
tr.verif_done {
background-image: linear-gradient(to right, yellow,yellow, yellow, yellow);
}
tr.verif_partial.valid_partial {
background-image: linear-gradient(to right, #ef9f13,#ef9f13 #ef9f13, #ef9f13);
}
tr.valid_partial {
background-image: linear-gradient(to right, #ef9f13,#ef9f13, #ef9f13, #ef9f13);
}
tr.valid_done{
background-image: linear-gradient(to right, #c16eb0,#c16eb0, #c16eb0, #c16eb0);
}
.searchbox .v-input.v-text-field .v-input__slot{
min-height:60px;
}
.searchbox .v-btn {
min-height:60px;
}
table.v-table tbody td,table.v-table tbody th {
height: 40px;
}
table.v-table thead tr {
height: 40px;
}
</style>
<script>
module.exports = {
data() {
return {
query: "",
items: [],
headers: [
{
text: "NO REG",
align: "left",
sortable: false,
value: "mr",
width: "30%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "NAMA",
align: "left",
sortable: false,
value: "mr",
width: "60%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "",
align: "center",
sortable: false,
value: "mr",
width: "10%",
class: "pa-2 text-xs-right blue lighten-3 white--text"
}
],
isLoading: false
};
},
methods : {
is_valid_partial(i) {
return i.T_OrderHeaderAddOnValidationDone == 'P'
},
is_susulan(i) {
let cur_date = moment().format('DD.MM.YYYY')
let o_date = moment(i.T_OrderHeaderDate).format('DD.MM.YYYY')
return cur_date != o_date
},
is_valid_done(i) {
return i.T_OrderHeaderAddOnValidationDone == 'Y'
},
is_verif_partial(i) {
return i.T_OrderHeaderAddOnVerificationDone == 'P'
},
is_verif_done(i) {
return i.T_OrderHeaderAddOnVerificationDone == 'Y'
},
oneMoment : function(d) {
return window.oneMoment(d)
},
format_date(p) {
return moment(p).format("DD.MM.YYYY HH:mm")
},
select (item) {
this.$store.commit('re_patient/update_selected_patient', item)
this.$store.commit('re_px/update_id', item.T_OrderHeaderID)
this.$store.dispatch('re_px/search')
this.$store.dispatch('re_patient/info_req')
},
is_selected (item) {
let x = this.$store.state.re_patient.selected_patient
if (!x)
return ''
if (x.T_OrderHeaderID == item.T_OrderHeaderID)
return 'green lighten-4'
return ''
},
is_cito (item) {
let x = this.$store.state.re_patient.selected_patient
if (!x)
return ''
if (item.T_OrderHeaderIsCito == "Y")
return 'amber'
return ''
},
change_page(x) {
this.curr_patient_page = x
this.$store.dispatch('re_patient/search')
}
},
computed : {
patients () {
return this.$store.state.re_patient.patients
},
total_patient () {
return this.$store.state.re_patient.total_patient
},
total_patient_page () {
return this.$store.state.re_patient.total_patient_page
},
curr_patient_page : {
get () { return this.$store.state.re_patient.curr_patient_page },
set (v) { this.$store.commit('re_patient/update_curr_patient_page', v) }
},
selected_patient() {
return this.$store.state.re_patient.selected_patient;
}
},
mounted () {
this.$store.dispatch('re_patient/search')
}
}
</script>

View File

@@ -0,0 +1,475 @@
<template>
<v-layout class="fill-height flex-card" column>
<v-card class="fill-height">
<!-- <v-subheader>
<h3 class="title">DAFTAR PASIEN</h3>
</v-subheader> -->
<hr style="border-top:0px solid #c8c8c8;" />
<!--
<v-progress-linear :indeterminate="true" class="mt-1 mb-1" v-if="search_status == 1"
height="10" striped></v-progress-linear>
-->
<v-data-table
:headers="headers" :items="pxs"
:loading="search_status == 1"
hide-actions class="xelevation-1">
<template slot="items" slot-scope="props">
<tr :class="{'red lighten-4': props.item.verification == 'Y',
'green lighten-4': props.item.validation== 'Y' }">
<td class="text-xs-left pt-2 pb-2 pr-2 green--text" v-bind:class="margin_left(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'N'" colspan="7">
{{ props.item.t_testname }}
</td>
<td class="text-xs-left pt-2 pb-2 pr-2 green--text" v-bind:class="margin_left(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'">
{{ props.item.t_testname }}
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'" style="position: relative">
<v-textarea
v-if="props.item.ResultGroupName === 'FNA'"
:value="props.item.result === null || props.item.result === ''?'Belum diisi':'Terlampir'"
append-icon="description"
solo
readonly
single-line
rows=1
auto-grow
hide-details
label=""
type="text"
@click:append="openDialogFNA(props.item)"
></v-textarea>
<v-textarea
v-if="props.item.ResultGroupName === 'Papsmear'"
:value="props.item.result === null || props.item.result === ''?'Belum diisi':'Terlampir'"
append-icon="description"
solo
readonly
single-line
rows=1
auto-grow
hide-details
label=""
type="text"
@click:append="openDialogPapsmear(props.item)"
></v-textarea>
<v-textarea
label=""
solo
rows=1
hide-details
v-on:keyup="update_result(props.index, $event.target.value)"
:value="props.item.result"
v-if="props.item.is_quantitative == 'Y' && props.item.ResultGroupName === 'LAB'"
auto-grow
:readonly="props.item.T_OrderDetailVerification == 'Y'"
:flat="props.item.T_OrderDetailVerification == 'Y'"
v-show="(props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic && props.item.resample == 'N') ||
(props.item.resample == 'Y' && props.item.resample_status == 'W')"
></v-textarea>
<v-select
:items="props.item.template"
label=""
item-value="T_ResultTemplateValue"
item-text="T_ResultTemplateValue"
v-if="props.item.is_quantitative == 'N' && props.item.ResultGroupName === 'LAB'"
solo
hide-details
:value="props.item.result"
@change="update_result(props.index, $event)"
:disabled="props.item.T_OrderDetailVerification == 'Y'"
v-show="(props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic && props.item.resample == 'N') ||
(props.item.resample == 'Y' && props.item.resample_status == 'W')"
>
<template style="margin-top: 3px;" v-slot:append-outer>
<v-btn icon dark color="blue" small class="btn-outer ma-0" @click="template_new(props.item)"><v-icon>add_circle</v-icon></v-btn>
</template>
</v-select>
<span class="body-1" v-show="props.item.sample_worklist_receive != 'Y' || !props.item.pre_analytic || (props.item.resample == 'Y' && props.item.resample_status != 'W')">{{init_result(props.item)}}</span>
<!-- <v-textarea
solo
hide-details
rows="2"
:value="props.item.result"
@change="update_result(props.index, $event)"
>
</v-textarea> -->
<v-btn style="width: 28px;padding-bottom: 10px;" v-if="props.item.is_quantitative == 'Y' && props.item.result_instrument_n > 0 " color="blue lighten-2" class="btn_rerun" icon flat small @click="rerun_me(props.index, props.item)">
<v-img :src="icon_info" aspect-ratio="1" height="15" contain></v-img>
</v-btn>
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'">
{{ !init_blank(props.item) ? props.item.result_flag : '' }}
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'">
{{ !init_blank(props.item) ? props.item.normal_note : '' }}
<a href="javascript:;" v-show="props.item.normal_note != '' && props.item.normal_note != null && props.item.sample_processing == 'Y' && !init_blank(props.item)" @click="normalChange(props)"><v-icon small color="blue">create</v-icon></a>
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'">
{{ !init_blank(props.item) ? props.item.unit_name : '' }}
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'">
{{ !init_blank(props.item) ? props.item.methode_name : '' }}
<a href="javascript:;" v-show="props.item.methode_name != '' && props.item.methode_name != null && props.item.sample_processing == 'Y' && !init_blank(props.item)" @click="methodeChange(props)"><v-icon small color="blue">create</v-icon></a>
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'">
<v-textarea
label=""
solo
rows=1
hide-details
v-on:keyup="update_note(props.index, $event.target.value)"
:value="props.item.note"
auto-grow
:readonly="props.item.T_OrderDetailVerification == 'Y'"
:flat="props.item.T_OrderDetailVerification == 'Y'"
v-show="props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic && !init_blank(props.item)"
></v-textarea>
</td>
</tr>
</template>
</v-data-table>
</v-card>
<one-process-re-rerun-result></one-process-re-rerun-result>
<one-process-re-history></one-process-re-history>
<one-process-re-fna></one-process-re-fna>
<one-process-re-papsmear></one-process-re-papsmear>
<v-snackbar
v-model="snackbar"
:timeout="5000"
bottom right
>
{{ save_text }}
<v-btn
color="pink"
flat
@click="snackbar = false"
>
Close
</v-btn>
</v-snackbar>
<one-dialog-template>
</one-dialog-template>
</v-layout>
</template>
<style scoped>
div.v-table__overflow {
height:640px!important;
overflow-y:scroll;
}
.searchbox .v-input.v-text-field .v-input__slot{
min-height:60px;
}
.searchbox .v-btn {
min-height:60px;
}
table.v-table tbody td,table.v-table tbody th {
height: 40px;
}
table.v-table thead tr {
height: 40px;
}
.btn_rerun {
position: absolute;
top: 10px;
right: 2px
}
.flex-card {
min-height: -webkit-min-content;
display: flex;
}
.v-text-field.v-text-field--solo .v-input__control {
min-height: 32px;
box-shadow:none;
border: 1px solid black;
}
.v-textarea.v-text-field--box.v-text-field--single-line .v-text-field__prefix, .v-textarea.v-text-field--box.v-text-field--single-line textarea, .v-textarea.v-text-field--enclosed.v-text-field--single-line .v-text-field__prefix, .v-textarea.v-text-field--enclosed.v-text-field--single-line textarea {
margin-top: 2px;
}
.v-textarea.v-text-field--solo .v-input__append-inner, .v-textarea.v-text-field--solo .v-input__append-outer, .v-textarea.v-text-field--solo .v-input__prepend-inner, .v-textarea.v-text-field--solo .v-input__prepend-outer {
align-self: flex-start;
margin-top: 3px;
}
.v-textarea.v-text-field--solo .v-input__append-inner .v-input__icon {
align-items: center;
display: inline-flex;
height: 24px;
flex: 1 0 auto;
justify-content: center;
min-width: 24px;
width: 24px;
padding-bottom: 6px;
padding-left: 18px;
}
.v-text-field.v-text-field--solo .v-input__append-outer, .v-text-field.v-text-field--solo .v-input__prepend-outer {
margin-top: 3px;
}
</style>
<script>
let ts = '?ts=' + moment().format('YYMMDDhhmmss')
module.exports = {
components : {
'one-process-re-rerun-result': httpVueLoader('./oneProcessReRerunResult.vue' + ts ),
'one-process-re-history': httpVueLoader('./oneProcessReHistory.vue' + ts ),
'one-process-re-fna': httpVueLoader('./oneResultFNA.vue' + ts ),
'one-process-re-papsmear': httpVueLoader('./oneResultPapsmear.vue' + ts ),
'one-dialog-template': httpVueLoader('./oneProcessReDialogResultTemplateNew.vue' + ts )
},
data() {
return {
query: "",
save_text: "Data telah tersimpan.",
items: [],
headers: [
{
text: "NAMA PEMERIKSAAN",
align: "left",
sortable: false,
value: "mr",
width: "15%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "HASIL",
align: "left",
sortable: false,
value: "mr",
width: "15%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "FLAG",
align: "left",
sortable: false,
value: "mr",
width: "10%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "NILAI NORMAL",
align: "left",
sortable: false,
value: "mr",
width: "15%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "UNIT",
align: "left",
sortable: false,
value: "mr",
width: "10%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "METODE",
align: "left",
sortable: false,
value: "mr",
width: "15%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "CATATAN",
align: "left",
sortable: false,
value: "mr",
width: "20%",
class: "pa-2 blue lighten-3 white--text"
}
],
isLoading: false
};
},
computed : {
pxs () {
return this.$store.state.re_px.pxs
},
icon_info () {
return window.BASE_URL + '/one-ui/apps/image/info.png'
},
snackbar : {
get () { return this.$store.state.re_px.snackbar },
set (v) { this.$store.commit('re_px/update_snackbar', v) }
},
search_status () {
return this.$store.state.re_px.search_status
},
selected_px () {
return this.$store.state.re_px.selected_px
}
},
methods : {
openDialogFNA(value){
if(value.result === null || value.result === ''){
var results = []
results.push({xid:'0',orderdetail_id:value.id,code:'A',label:'Diagnosis Klinis',result:''})
results.push({xid:'0',orderdetail_id:value.id,code:'B',label:'Makroskopis/Tindakan',result:''})
results.push({xid:'0',orderdetail_id:value.id,code:'C',label:'Mikroskopis',result:''})
results.push({xid:'0',orderdetail_id:value.id,code:'D',label:'Kesimpulan/Diagnosa',result:''})
results.push({xid:'0',orderdetail_id:value.id,code:'E',label:'Saran',result:''})
this.$store.commit("re_fna/update_results",results)
this.$store.dispatch("re_fna/get_doctors",{token:''})
}
else
this.$store.dispatch("re_fna/get_fnaresult",value)
},
openDialogPapsmear(value){
this.$store.dispatch("re_papsmear/get_papsmearresult",value)
},
oneMoment : function(d) {
return window.oneMoment(d)
},
select (idx, item) {
this.$store.commit('re_px/update_selected_px', item)
this.$store.commit('re_px/update_selected_px_idx', idx)
},
is_selected (item) {
return ''
},
margin_left (item) {
if (item.level == 2)
return 'pl-4'
if (item.level == 3)
return 'pl-5'
return 'pl-2'
},
rerun_me (idx, item) {
if(item.verification == 'Y' ) return
this.select(idx, item)
this.$store.commit('re_px/update_dialog_rerun', true)
},
update_result(idx, result) {
let x = this.$store.state.re_px.pxs
x[idx]['result'] = result
this.$store.commit('re_px/update_pxs', {records:x})
},
update_note(idx, note) {
let x = this.$store.state.re_px.pxs
x[idx]['note'] = note
this.$store.commit('re_px/update_pxs', {records:x})
},
template_new(item) {
this.$store.commit('re_px/update_selected_px', item)
this.$store.commit('re_px/update_dialog_template_new', true)
},
methodeChange(d) {
if (d.item.verification == 'Y') return
this.select(d.index, d.item)
this.$store.commit('normal_method/update_nattest_id', d.item.nattest_id)
this.$store.commit('normal_method/update_id', d.item.id)
this.$store.commit('normal_method/update_dialog_method', true)
},
normalChange(d) {
return
},
init_result(x) {
if (x.verification == "Y" || x.validation == "Y")
return x.result
let susul_date = moment(x.T_OrderPromiseDateTime).format('DD.MM.YYYY HH:mm')
// Override
if (x.resample == "Y") {
if (x.resample_status == "N")
return "Bahan belum"
if (x.resample_status == "R")
return "Hasil Menyusul : " + susul_date
if (x.resample_status == "W")
return x.result
}
if (x.sample_receive != 'Y')
return "Bahan belum"
if (x.sample_receive == 'Y' && !x.pre_analytic)
return "Belum Pre Analitik"
if (x.sample_receive == 'Y' && x.pre_analytic)
{
if (x.sample_worklist_receive == "Y")
return x.result
else
return "Hasil Menyusul : " + susul_date
}
},
init_blank(x) {
if (x.verification == "Y" || x.validation == "Y")
return false
// Override
if (x.resample == "Y") {
if (x.resample_status == "N" || x.resample_status == "R")
return true
}
if (x.sample_receive != 'Y' || !x.pre_analytic || x.sample_worklist_receive != "Y")
return true
return false
}
},
mounted () {
// this.$store.dispatch('re_patient/search')
}
}
</script>

View File

@@ -0,0 +1,604 @@
<template>
<v-layout class="fill-height flex-card" column>
<v-card class="fill-height">
<!-- <v-subheader>
<h3 class="title">DAFTAR PASIEN</h3>
</v-subheader> -->
<hr style="border-top:0px solid #c8c8c8;" />
<!--
<v-progress-linear :indeterminate="true" class="mt-1 mb-1" v-if="search_status == 1"
height="10" striped></v-progress-linear>
-->
<v-data-table :headers="headers" :items="pxs" :loading="search_status == 1" hide-actions class="xelevation-1">
<template slot="items" slot-scope="props">
<tr :class="{
'red lighten-4': props.item.verification == 'Y',
'green lighten-4': props.item.validation == 'Y'
}">
<td class="text-xs-left pt-2 pb-2 pr-2 green--text" v-bind:class="margin_left(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'N'" colspan="7">
{{ props.item.t_testname }}
</td>
<td class="text-xs-left pt-2 pb-2 pr-2 green--text" v-bind:class="margin_left(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'">
{{ props.item.t_testname }}
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'"
style="position: relative">
<v-textarea label="" disabled solo rows=1 hide-details
v-on:keyup="update_result(props.index, $event.target.value)" :value="props.item.result"
@keydown.ctrl.a="keyDownResult(props.index, props.item)" auto-grow
:readonly="props.item.T_OrderDetailVerification == 'Y'"
:flat="props.item.T_OrderDetailVerification == 'Y'" v-show="(props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic && props.item.resample == 'N') ||
(props.item.resample == 'Y' && props.item.resample_status == 'W')"></v-textarea>
<!-- <v-textarea
:value="props.item.result === null || props.item.result === '' ? 'Belum diisi' : 'Terlampir'"
append-icon="description"
v-if="(props.item.ResultGroupName === 'DFI' && props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic && props.item.resample == 'N') ||
(props.item.ResultGroupName === 'DFI' && props.item.resample == 'Y' && props.item.resample_status == 'W')" solo
readonly single-line rows=1 auto-grow hide-details label="" type="text"
@click:append="openDialogDNAFRagmentasi(props.item)"></v-textarea>
<v-textarea
:value="props.item.result === null || props.item.result === '' ? 'Belum diisi' : 'Terlampir'"
append-icon="description"
v-if="(props.item.ResultGroupName === 'Preparasi Sperma' && props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic && props.item.resample == 'N') ||
(props.item.ResultGroupName === 'Preparasi Sperma' && props.item.resample == 'Y' && props.item.resample_status == 'W')"
solo readonly single-line rows=1 auto-grow hide-details label="" type="text"
@click:append="openDialogPreparasiSperma(props.item)"></v-textarea>
<v-textarea
:value="props.item.result === null || props.item.result === '' ? 'Belum diisi' : 'Terlampir'"
append-icon="description"
v-if="(props.item.ResultGroupName === 'FNA' && props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic && props.item.resample == 'N') ||
(props.item.ResultGroupName === 'FNA' && props.item.resample == 'Y' && props.item.resample_status == 'W')" solo
readonly single-line rows=1 auto-grow hide-details label="" type="text"
@click:append="openDialogFNA(props.item)"></v-textarea>
<v-textarea
:value="props.item.result === null || props.item.result === '' ? 'Belum diisi' : 'Terlampir'"
append-icon="description"
v-if="(props.item.ResultGroupName === 'Cytologi' && props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic && props.item.resample == 'N') ||
(props.item.ResultGroupName === 'Cytologi' && props.item.resample == 'Y' && props.item.resample_status == 'W')" solo
readonly single-line rows=1 auto-grow hide-details label="" type="text"
@click:append="openDialogCytologi(props.item)"></v-textarea>
<v-textarea
:value="props.item.result === null || props.item.result === '' ? 'Belum diisi' : 'Terlampir'"
append-icon="description"
v-if="(props.item.ResultGroupName === 'Papsmear' && props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic && props.item.resample == 'N') ||
(props.item.ResultGroupName === 'Papsmear' && props.item.resample == 'Y' && props.item.resample_status == 'W')"
solo readonly single-line rows=1 auto-grow hide-details label="" type="text"
@click:append="openDialogPapsmear(props.item)"></v-textarea>
<v-textarea
:value="props.item.result === null || props.item.result === '' ? 'Belum diisi' : 'Terlampir'"
append-icon="description"
v-if="(props.item.ResultGroupName === 'Pap Smear (Liquid C Prep)' && props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic && props.item.resample == 'N') ||
(props.item.ResultGroupName === 'Pap Smear (Liquid C Prep)' && props.item.resample == 'Y' && props.item.resample_status == 'W')"
solo readonly single-line rows=1 auto-grow hide-details label="" type="text"
@click:append="openDialogLcprep(props.item)"></v-textarea>
<v-textarea
:value="props.item.result === null || props.item.result === '' ? 'Belum diisi' : props.item.result"
append-icon="description"
v-if="(props.item.ResultGroupName === 'Mikro' && props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic === 'Y' && props.item.resample == 'N') ||
(props.item.ResultGroupName === 'Mikro' && props.item.resample == 'Y' && props.item.resample_status == 'W')" solo
readonly single-line rows=1 auto-grow hide-details label="" type="text"
@click:append="openDialogMikro(props.item)"></v-textarea>
<v-textarea label="" solo rows=1 hide-details
v-on:keyup="update_result(props.index, $event.target.value)" :value="props.item.result"
v-if="props.item.is_quantitative == 'Y' && props.item.ResultGroupName === 'LAB'"
@keydown.ctrl.a="keyDownResult(props.index, props.item)" auto-grow
:readonly="props.item.T_OrderDetailVerification == 'Y'"
:flat="props.item.T_OrderDetailVerification == 'Y'" v-show="(props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic && props.item.resample == 'N') ||
(props.item.resample == 'Y' && props.item.resample_status == 'W')"></v-textarea>
<v-select :items="props.item.template" label="" item-value="T_ResultTemplateValue"
item-text="T_ResultTemplateValue"
v-if="props.item.is_quantitative == 'N' && props.item.ResultGroupName === 'LAB'" solo
hide-details :value="props.item.result" @change="update_result(props.index, $event)"
:disabled="props.item.T_OrderDetailVerification == 'Y'" v-show="(props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic && props.item.resample == 'N') ||
(props.item.resample == 'Y' && props.item.resample_status == 'W')">
<template style="margin-top: 3px;" v-slot:append-outer>
<v-btn icon dark color="blue" small class="btn-outer ma-0"
@click="template_new(props.item)"><v-icon>add_circle</v-icon></v-btn>
</template>
</v-select>
-->
<span class="body-1"
v-show="props.item.sample_worklist_receive != 'Y' || !props.item.pre_analytic || (props.item.resample == 'Y' && props.item.resample_status != 'W')">{{ init_result(props.item) }}</span>
<!-- <v-textarea
solo
hide-details
rows="2"
:value="props.item.result"
@change="update_result(props.index, $event)"
>
</v-textarea>
<v-btn style="width: 28px;padding-bottom: 10px;"
v-if="props.item.is_quantitative == 'Y' && props.item.result_instrument_n > 0"
color="blue lighten-2" class="btn_rerun" icon flat small
@click="rerun_me(props.index, props.item)">
<v-img :src="icon_info" aspect-ratio="1" height="15" contain></v-img>
</v-btn> -->
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'">
<span v-if="props.item.is_result = 'Y'" class="one-critical-value" :data-detail-id="props.item.id"
style="margin-right:20px"></span>
{{props.item.result_flag}}
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'">
{{ props.item.normal_note}}
<a href="javascript:;"
v-show="props.item.normal_note != '' && props.item.normal_note != null && props.item.sample_processing == 'Y' && !init_blank_normal(props.item) && false"
@click="normalChange(props)"><v-icon small color="blue">create</v-icon></a>
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'">
{{props.item.unit_name}}
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'">
{{props.item.methode_name}}
<a href="javascript:;"
v-show="props.item.methode_name != '' && props.item.methode_name != null && props.item.sample_processing == 'Y' && !init_blank_normal(props.item)"
@click="methodeChange(props)"><v-icon small color="blue">create</v-icon></a>
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)"
@click="select(props.index, props.item)" v-if="props.item.is_result == 'Y'">
<v-textarea label="" solo rows=1 hide-details
v-on:keyup="update_note(props.index, $event.target.value)" :value="props.item.note" auto-grow
@keydown.ctrl.a="keyDownResult(props.index, props.item)"
:readonly="props.item.T_OrderDetailVerification == 'Y'"
:flat="props.item.T_OrderDetailVerification == 'Y'"
v-show="props.item.sample_worklist_receive == 'Y' && props.item.pre_analytic && !init_blank(props.item)"></v-textarea>
</td>
</tr>
</template>
</v-data-table>
</v-card>
<one-process-re-rerun-result></one-process-re-rerun-result>
<one-process-re-history></one-process-re-history>
<one-process-re-fna></one-process-re-fna>
<one-process-re-cytologi></one-process-re-cytologi>
<one-process-re-papsmear></one-process-re-papsmear>
<one-process-re-lcprep></one-process-re-lcprep>
<one-process-re-mikro></one-process-re-mikro>
<one-process-re-preparasisperma></one-process-re-preparasisperma>
<one-process-re-dnafragmentasi></one-process-re-dnafragmentasi>
<v-snackbar v-model="snackbar" :timeout="5000" bottom right>
{{ save_text }}
<v-btn color="pink" flat @click="snackbar = false">
Close
</v-btn>
</v-snackbar>
<one-dialog-template>
</one-dialog-template>
</v-layout>
</template>
<style scoped>
div.v-table__overflow {
height: 640px !important;
overflow-y: scroll;
}
.searchbox .v-input.v-text-field .v-input__slot {
min-height: 60px;
}
.searchbox .v-btn {
min-height: 60px;
}
table.v-table tbody td,
table.v-table tbody th {
height: 40px;
}
table.v-table thead tr {
height: 40px;
}
.btn_rerun {
position: absolute;
top: 10px;
right: 2px
}
.flex-card {
min-height: -webkit-min-content;
display: flex;
}
.v-text-field.v-text-field--solo .v-input__control {
min-height: 32px;
box-shadow: none;
border: 1px solid black;
}
.v-textarea.v-text-field--box.v-text-field--single-line .v-text-field__prefix,
.v-textarea.v-text-field--box.v-text-field--single-line textarea,
.v-textarea.v-text-field--enclosed.v-text-field--single-line .v-text-field__prefix,
.v-textarea.v-text-field--enclosed.v-text-field--single-line textarea {
margin-top: 2px;
}
.v-textarea.v-text-field--solo .v-input__append-inner,
.v-textarea.v-text-field--solo .v-input__append-outer,
.v-textarea.v-text-field--solo .v-input__prepend-inner,
.v-textarea.v-text-field--solo .v-input__prepend-outer {
align-self: flex-start;
margin-top: 3px;
}
.v-textarea.v-text-field--solo .v-input__append-inner .v-input__icon {
align-items: center;
display: inline-flex;
height: 24px;
flex: 1 0 auto;
justify-content: center;
min-width: 24px;
width: 24px;
padding-bottom: 6px;
padding-left: 18px;
}
.v-text-field.v-text-field--solo .v-input__append-outer,
.v-text-field.v-text-field--solo .v-input__prepend-outer {
margin-top: 3px;
}
table.table_antibiotics {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
table.table_antibiotics tbody td,
table.table_antibiotics tbody th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
table.table_antibiotics tbody tr:nth-child(even) {
background-color: #dddddd;
}
</style>
<script>
let ts = '?ts=' + moment().format('YYMMDDhhmmss')
module.exports = {
components: {
'one-process-re-rerun-result': httpVueLoader('./oneProcessReRerunResult.vue' + ts),
'one-process-re-history': httpVueLoader('./oneProcessReHistory.vue' + ts),
'one-process-re-fna': httpVueLoader('./oneResultFNA.vue' + ts),
'one-process-re-cytologi': httpVueLoader('./oneResultCytologi.vue' + ts),
'one-process-re-papsmear': httpVueLoader('./oneResultPapsmear.vue' + ts),
'one-process-re-lcprep': httpVueLoader('./oneResultLcprep.vue' + ts),
'one-process-re-mikro': httpVueLoader('./oneResultMikro.vue' + ts),
'one-dialog-template': httpVueLoader('./oneProcessReDialogResultTemplateNew.vue' + ts),
'one-process-re-preparasisperma': httpVueLoader('./oneResultPreparasiSperma.vue' + ts),
'one-process-re-dnafragmentasi': httpVueLoader('./oneResultDNAFragmentasi.vue' + ts),
},
data() {
return {
query: "",
save_text: "Data telah tersimpan.",
items: [],
headers: [
{
text: "NAMA PEMERIKSAAN",
align: "left",
sortable: false,
value: "mr",
width: "15%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "HASIL",
align: "left",
sortable: false,
value: "mr",
width: "15%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "FLAG",
align: "left",
sortable: false,
value: "mr",
width: "10%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "NILAI NORMAL",
align: "left",
sortable: false,
value: "mr",
width: "15%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "UNIT",
align: "left",
sortable: false,
value: "mr",
width: "10%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "METODE",
align: "left",
sortable: false,
value: "mr",
width: "15%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "CATATAN",
align: "left",
sortable: false,
value: "mr",
width: "20%",
class: "pa-2 blue lighten-3 white--text"
}
],
isLoading: false
};
},
computed: {
pxs() {
return this.$store.state.re_px.pxs
},
icon_info() {
return window.BASE_URL + '/one-ui/apps/image/info.png'
},
snackbar: {
get() { return this.$store.state.re_px.snackbar },
set(v) { this.$store.commit('re_px/update_snackbar', v) }
},
search_status() {
return this.$store.state.re_px.search_status
},
selected_px() {
return this.$store.state.re_px.selected_px
},
selected_patient() {
return this.$store.state.re_patient.selected_patient;
}
},
methods: {
async keyDownResult(idx, item) {
await this.$store.dispatch('re_normal/update', item.id)
if (this.$store.state.re_normal.error == "") {
let result = this.$store.state.re_normal.result
let pxs = this.$store.state.re_px.pxs
pxs[idx]["normal_id"] = result.T_OrderDetailNat_NormalValueID
pxs[idx]["normal_note"] = result.T_OrderDetailNormalValueNote
pxs[idx]["methode_id"] = result.T_OrderDetailNat_MethodeID
pxs[idx]["methode_name"] = result.Nat_MethodeName
let data = { records: pxs }
this.$store.commit("re_px/update_pxs", data)
}
},
openDialogFNA(value) {
if (value.result === null || value.result === '') {
var results = []
results.push({ xid: '0', orderdetail_id: value.id, code: 'A', label: 'Diagnosis Klinis', result: '' })
results.push({ xid: '0', orderdetail_id: value.id, code: 'B', label: 'Makroskopis/Tindakan', result: '' })
results.push({ xid: '0', orderdetail_id: value.id, code: 'C', label: 'Mikroskopis', result: '' })
results.push({ xid: '0', orderdetail_id: value.id, code: 'D', label: 'Kesimpulan/Diagnosa', result: '' })
results.push({ xid: '0', orderdetail_id: value.id, code: 'E', label: 'Saran', result: '' })
this.$store.commit("re_fna/update_results", results)
this.$store.dispatch("re_fna/get_doctors", { token: '' })
}
else
this.$store.dispatch("re_fna/get_fnaresult", value)
},
openDialogCytologi(value) {
//console.log(value.result)
if (value.result === null || value.result === '') {
console.log("ane-01")
var results = []
results.push({ xid: '0', orderdetail_id: value.id, code: 'A', label: 'Makroskopis', result: '' })
results.push({ xid: '0', orderdetail_id: value.id, code: 'B', label: 'Mikroskopis', result: '' })
results.push({ xid: '0', orderdetail_id: value.id, code: 'C', label: 'Kesimpulan', result: '' })
this.$store.commit("re_cytologi/update_results", results)
this.$store.dispatch("re_cytologi/get_doctors", { token: '' })
}
else {
console.log("ane-09")
this.$store.dispatch("re_cytologi/get_cytologiresult", value)
}
},
openDialogPapsmear(value) {
this.$store.commit("re_papsmear/update_selected_papsmear", value)
this.$store.dispatch("re_papsmear/get_papsmearresult", value)
},
openDialogLcprep(value) {
console.log(value)
this.$store.commit("re_lcprep/update_selected_lcprep", value)
this.$store.dispatch("re_lcprep/get_lcprepresult", value)
},
openDialogMikro(value) {
this.$store.commit("re_mikro/update_selected_mikro", value)
this.$store.dispatch("re_mikro/get_mikroresult", value)
},
openDialogPreparasiSperma(value) {
console.log(value)
this.$store.commit("re_preparasisperma/update_selected_preparasisperma", value)
if (value.result === null || value.result === '') {
var results = { xid: '0' }
console.log('result null')
this.$store.commit("re_preparasisperma/update_results", results)
this.$store.dispatch("re_preparasisperma/get_doctors_preparasi_sperma", { token: '' })
}
else
this.$store.dispatch("re_preparasisperma/get_preparasispermaresult", value)
},
openDialogDNAFRagmentasi(value) {
this.$store.commit("re_dnafragmentasi/update_selected_dnafragmentasi", value)
this.$store.dispatch("re_dnafragmentasi/get_dnafragmentasiresult", value)
},
oneMoment: function (d) {
return window.oneMoment(d)
},
select(idx, item) {
this.$store.commit('re_px/update_selected_px', item)
this.$store.commit('re_px/update_selected_px_idx', idx)
},
is_selected(item) {
return ''
},
margin_left(item) {
if (item.level == 2)
return 'pl-4'
if (item.level == 3)
return 'pl-5'
return 'pl-2'
},
rerun_me(idx, item) {
if (item.verification == 'Y') return
this.select(idx, item)
this.$store.commit('re_px/update_dialog_rerun', true)
},
update_result(idx, result) {
let x = this.$store.state.re_px.pxs
x[idx]['result'] = result
this.$store.commit('re_px/update_pxs', { records: x })
},
update_note(idx, note) {
let x = this.$store.state.re_px.pxs
x[idx]['note'] = note
this.$store.commit('re_px/update_pxs', { records: x })
},
template_new(item) {
this.$store.commit('re_px/update_selected_px', item)
this.$store.commit('re_px/update_dialog_template_new', true)
},
methodeChange(d) {
if (d.item.verification == 'Y') return
this.select(d.index, d.item)
this.$store.commit('normal_method/update_nattest_id', d.item.nattest_id)
this.$store.commit('normal_method/update_id', d.item.id)
this.$store.commit('normal_method/update_dialog_method', true)
},
normalChange(d) {
return
},
init_result(x) {
if (x.verification == "Y" || x.validation == "Y")
return x.result
let susul_date = moment(x.T_OrderPromiseDateTime).format('DD.MM.YYYY HH:mm')
// Override
if (x.resample == "Y") {
if (x.resample_status == "N")
return "Bahan belum"
if (x.resample_status == "R")
return "Hasil Menyusul : " + susul_date
if (x.resample_status == "W")
return x.result
}
if (x.sample_receive != 'Y')
return "Bahan belum"
if (x.sample_receive == 'Y' && !x.pre_analytic)
return "Belum Pre Analitik"
if (x.sample_receive == 'Y' && x.pre_analytic) {
if (x.sample_worklist_receive == "Y")
return x.result
else
return "Hasil Menyusul : " + susul_date
}
},
init_blank_normal(x) {
if (x.verification == "Y" || x.validation == "Y")
return false
if (x.sample_receive != "Y")
return true
return false
},
init_blank(x) {
if (x.verification == "Y" || x.validation == "Y")
return false
// Override
if (x.resample == "Y") {
if (x.resample_status == "N" || x.resample_status == "R")
return true
}
if (x.sample_receive != 'Y' || !x.pre_analytic || x.sample_worklist_receive != "Y")
return true
return false
}
},
watch: {
selected_patient(n, o) {
setTimeout(() => {
window.render_one_critical_value();
window.render_one_critical_value_header();
}, 1500);
}
},
mounted() {
console.log('dna fragmentasi')
// this.$store.dispatch('re_patient/search')
}
}
</script>

View File

@@ -0,0 +1,174 @@
<template>
<v-dialog
v-model="dialog"
persistent
max-width="500px"
transition="dialog-transition"
>
<v-layout class="fill-height" column>
<v-card class="grow">
<v-card-text>
<v-data-table
:headers="headers" :items="reruns"
:loading="isLoading"
hide-actions class="elevation-1">
<template slot="items" slot-scope="props">
<td class="text-xs-left pa-2 green--text" v-bind:class="is_selected(props.item)">
{{get_instrument_date(props.item)}}
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)">
{{ props.item.branch_name }}
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)">
{{ props.item.result }}
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)">
<v-btn flat icon color="green" @click="select(props.item)">
<v-icon>get_app</v-icon>
</v-btn>
</td>
</template>
</v-data-table>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="blue darken-1" flat @click="dialog = false">Tutup</v-btn>
<!-- <v-btn color="blue darken-1" :dark="btn_save_enabled" @click="save" :disabled="!btn_save_enabled">Simpan</v-btn> -->
</v-card-actions>
</v-card>
</v-layout>
</v-dialog>
</template>
<style scoped>
.searchbox .v-input.v-text-field .v-input__slot{
min-height:60px;
}
.searchbox .v-btn {
min-height:60px;
}
table.v-table tbody td,table.v-table tbody th {
height: 40px;
}
table.v-table thead tr {
height: 40px;
}
</style>
<script>
module.exports = {
data() {
return {
query: "",
items: [],
headers: [
{
text: "TANGGAL",
align: "left",
sortable: false,
value: "mr",
width: "40%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "CABANG",
align: "left",
sortable: false,
value: "mr",
width: "35%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "HASIL",
align: "left",
sortable: false,
value: "mr",
width: "20%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "",
align: "left",
sortable: false,
value: "mr",
width: "5%",
class: "pa-2 blue lighten-3 white--text"
}
],
isLoading: false
};
},
methods : {
oneMoment : function(d) {
return window.oneMoment(d)
},
get_instrument_date(i) {
// debugger
let rst = ''
try {
rst = moment(i.instrument_date).format('DD.MM.YYYY HH:mm')
} catch(e) {}
return rst
},
select (item) {
this.$store.commit('re_px/update_selected_rerun', item)
// this.$store.commit('re_px/update_dialog_rerun', false)
/* let x = this.$store.state.re_px.pxs
x[this.$store.state.re_px.selected_px_idx]['result'] = item.result
x[this.$store.state.re_px.selected_px_idx]['result_id'] = item.result_id
console.log(x)
this.$store.commit('re_px/update_pxs', {records:x})
*/
this.$store.dispatch("re_px/savererun", item)
console.log(item)
},
is_selected (item) {
// let x = this.$store.state.re_patient.selected_patient
// if (!x)
// return ''
// if (x.T_OrderHeaderID == item.T_OrderHeaderID)
// return 'green lighten-4'
return ''
}
},
computed : {
reruns () {
return this.$store.state.re_px.reruns
},
dialog : {
get () { return this.$store.state.re_px.dialog_rerun },
set (v) { this.$store.commit('re_px/update_dialog_rerun', v) }
}
},
mounted () {
// this.$store.dispatch('re_px/search_rerun')
},
watch : {
dialog(n, o) {
if (n && !o) {
this.$store.dispatch('re_px/search_rerun')
}
}
}
}
</script>

View File

@@ -0,0 +1,489 @@
<template>
<v-card class="mb-1 pa-1">
<v-layout row>
<v-flex xs8>
<v-layout>
<one-date-picker label="Tgl. Awal" :date="sdate" class="mydate" data="0"
@change="changeDate"></one-date-picker>
<one-edate-picker label="Tgl. Akhir" :date="edate" class="mydate" data="0"
@change="echangeDate"></one-edate-picker>
<v-text-field class="flex ma-1" label="" placeholder="No Reg / Nama" single-line solo hide-details
v-model="search" @keyup.native="keySearch"></v-text-field>
<v-select :items="companies" class="ma-1" v-model="company" item-text="CorporateName"
item-value="CorporateID" label="Kelompok Pelanggan" return-object solo hide-details
clearable></v-select>
<!-- <v-autocomplete v-model="company" :items="companies" :loading="loading_company"
:search-input.sync="search_company" class="ma-1 ml-1 mr-1" hide-no-data filled
item-text="CorporateName" item-value="CorporateID" label=""
placeholder="Cari Kelompok Pelanggan" return-object solo hide-details></v-autocomplete>
<v-select :items="groups" class="ma-1" v-model="selected_group" item-text="group_name"
item-value="group_id" label="Grup Pemeriksaan" return-object solo hide-details
clearable></v-select> -->
</v-layout>
</v-flex>
<v-flex xs2>
<v-layout>
<v-btn class="btn-search one-btn-icon ma-1" color="success" @click="searchs">
<span class="icon-search"><span>
</v-btn>
</v-layout>
</v-flex>
<v-flex xs6 class="text-xs-right">
<!-- <img :src="'../../../libs/image/' + img_lang" height="36" style="float:left" alt="" /> -->
<v-btn v-show="false" v-for="(lang, n) in langs" v-bind:key="n" color="grey lighten-1"
class="one-btn-icon pl-2 pr-2 ml-0 mr-1" depressed :outline="!lang_selected(lang)"
@click="lang_change(lang)">
<img :src="'../../../libs/image/' + img_lang_2(lang.code, lang.is_si)" height="40" alt="" />
</v-btn>
<v-btn v-if="show_re_age" class="btn-search one-btn-icon ma-1" color="brown" @click="re_calc_age" dark>
Re. Age
</v-btn>
<!-- <v-btn v-show="!info_req_perfect" class="btn-search one-btn-icon ma-1" color="red" @click="info" dark>
<v-icon>info</v-icon>
</v-btn>
<v-btn class="btn-search one-btn-icon ma-1" color="red" @click="note" dark>
<v-icon>library_books</v-icon>
</v-btn>
<v-btn color="blue-grey" class="white--text ma-1" @click="histories" v-show="btn_history_show">
Histori
</v-btn> -->
<v-btn @click="doPrintKultur()" class="white--text ma-1" color="red darken-2" dark v-show="btn_print_kultur_show">Print out kultur <v-icon right
dark>print</v-icon></v-btn>
<v-btn @click="doPrintPapsmear()" class="white--text ma-1" color="brown" dark v-show="btn_print_papsmear_show">Print out papsmear <v-icon right
dark>print</v-icon></v-btn>
<v-btn @click="doPrintPatient()" class="white--text ma-1" color="purple darken-2" dark>Cetak History <v-icon right
dark>print</v-icon></v-btn>
<v-btn @click="doPrint()" class="white--text ma-1" color="orange" dark>Cetak <v-icon right
dark>print</v-icon></v-btn>
<v-btn color="blue" class="white--text ma-1" @click="save_result">
Simpan
<v-icon right dark>save_alt</v-icon>
</v-btn>
<!-- <v-btn color="green" class="white--text ma-1" @click="save_validate" :disabled="!btn_validation_enable"
:dark="btn_validation_enable">
Validasi
<v-icon right dark>save_alt</v-icon>
</v-btn>
<v-btn color="red" class="white--text ma-1" @click="unvalidate" dark>
UnValidasi
<v-icon right dark>save_alt</v-icon>
</v-btn> -->
</v-flex>
</v-layout>
<one-dialog-print :title="printtitle" :width="printwidth" :height="700" :status="openprint" :urlprint="urlprint"
@close-dialog-print="openprint = false"></one-dialog-print>
<v-dialog v-model="dialog_print_new"
max-width="1000px"
persistent>
<v-card>
<v-card-text>
<v-layout row wrap>
<v-flex xs12>
<object style="overflow: hidden;" width="100%" :height="700" :data="urlprint"></object>
</v-flex>
</v-layout>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="primary" @click="closePrint">Tutup</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
<v-dialog v-model="dialog_status"
max-width="500px"
persistent>
<v-card>
<v-card-text>
<v-layout row wrap>
<v-flex xs12>{{status_print}}}
</v-flex>
</v-layout>
</v-card-text>
<v-card-actions>
<v-btn color="primary" flat @click="dialog_status=!dialog_status">Abaikan</v-btn>
<v-spacer></v-spacer>
<v-btn color="primary" @click="add_log_print">Ya, mengerti</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-card>
</template>
<style scoped>
.mydate {
width: 150px;
}
button {
height: 48px;
}
.btn-search {
font-size: 1.5em
}
</style>
<script>
module.exports = {
components: {
'one-date-picker': httpVueLoader('./oneDatePicker.vue'),
'one-edate-picker': httpVueLoader('./oneEndDatePicker.vue'),
'one-dialog-print': httpVueLoader('../../common/oneDialogPrintX.vue')
},
data() {
return {
search_company: ''
}
},
watch: {
search_company(n, o) {
this.$store.dispatch('company/search', n)
}
},
computed: {
test_not_yet: {
get() { return this.$store.state.helper.test_not_yet },
set(v) { this.$store.commit('helper/update_test_not_yet', v) }
},
urlprint: {
get() { return this.$store.state.helper.urlprint },
set(v) { this.$store.commit('helper/update_urlprint', v) }
},
printtitle: {
get() { return this.$store.state.helper.printtitle },
set(v) { this.$store.commit('helper/update_printtitle', v) }
},
printwidth: {
get() { return this.$store.state.helper.printwidth },
set(v) { this.$store.commit('helper/update_printwidth', v) }
},
show_re_age() {
return this.$store.state.re_patient.selected_patient.T_OrderHeaderAddOnRequestChangeDOB == 'Y'
},
company: {
get() { return this.$store.state.company.company },
set(v) { this.$store.commit('company/update_company', v) }
},
companies() {
return this.$store.state.company.companies
},
loading_company() {
return this.$store.state.company.loading
},
nolab: {
get() { return this.$store.state.re_patient.nolab },
set(v) { this.$store.commit('re_patient/update_nolab', v) }
},
search: {
get() { return this.$store.state.re_patient.search },
set(v) { this.$store.commit('re_patient/update_search', v) }
},
status_print: {
get() { return this.$store.state.helper.status_print },
set(v) { this.$store.commit('helper/update_status_print', v) }
},
dialog_status : {
get () { return this.$store.state.helper.dialog_status },
set (v) { this.$store.commit('helper/update_dialog_status', v) }
},
groups() {
return this.$store.state.re_px.groups
},
selected_group: {
get() { return this.$store.state.re_px.selected_group },
set(v) {
this.$store.commit('re_px/update_selected_group', v)
this.$store.dispatch('re_patient/search')
}
},
btn_validation_enable() {
return true
let x = this.$store.state.re_px.pxs
// console.log(x)
let y = 0, n = 0
for (let i in x) {
// console.log(i+' : '+x[i].t_testname+' : '+x[i].is_result+' : '+x[i].validation+' : '+x[i].verification)
if (x[i].is_result == 'Y') {
n++
if (x[i].validation == 'Y') { y++; }
}
}
// console.log("n:"+n+" y:"+y)
if (y < 1) return false
return true
},
btn_validation_show() {
let x = this.$store.state.re_px.pxs
let z = 0, n = 0
for (let i in x) {
if (x[i].is_result == 'Y') {
n++
if (x[i].validation_old == 'Y')
z++
}
}
if (z == n) return false
return true
},
btn_print_papsmear_show() {
let x = this.$store.state.re_px.pxs
for (let i in x) {
if (x[i].t_testid == '1611') {
return true
}
}
// return true
},
btn_print_kultur_show() {
let x = this.$store.state.re_px.pxs
for (let i in x) {
if (x[i].ResultGroupName == 'Mikro') {
return true
}
}
// return true
},
lang() {
return this.$store.state.re_patient.selected_patient.M_LangCode
},
img_lang() {
if (this.lang == "ID")
return "inako.png"
// return "flag-ina_48.png"
else if (this.lang == "EN")
return "engko.png"
// return "flag-us_48.png"
},
langs() {
return this.$store.state.re_patient.langs
},
sdate: {
get() { return this.$store.state.re_patient.s_date },
set(v) { this.$store.commit('re_patient/update_sdate', v) }
},
edate: {
get() { return this.$store.state.re_patient.e_date },
set(v) { this.$store.commit('re_patient/update_edate', v) }
},
selected_patient() {
return this.$store.state.re_patient.selected_patient
},
btn_history_show() {
if (!this.selected_patient) return false
if (!this.selected_patient.is_history) return false
if (this.selected_patient.is_history == "N") return false
return true
},
info_req_perfect() {
let x = false
try {
x = this.$store.state.re_patient.info_req.is_perfect == 'Y';
} catch (error) {
}
return x
},
openprint: {
get() {
return this.$store.state.helper.open_print
},
set(val) {
this.$store.commit("helper/update_open_print", false)
}
},
dialog_print_new: {
get() {
return this.$store.state.helper.dialog_print_new
},
set(val) {
this.$store.commit("helper/update_dialog_print_new", false)
}
}
},
methods: {
searchs() {
this.$store.dispatch('re_patient/search')
},
async re_calc_age() {
let orderID = this.$store.state.re_patient.selected_patient.T_OrderHeaderID
await this.$store.dispatch('helper/calc_age', orderID)
},
add_log_print() {
id = this.$store.state.re_patient.selected_patient.T_OrderHeaderID
let tests = this.$store.state.helper.test_not_yet
this.$store.dispatch('helper/insertlogprint', {orderid : id, tests: tests})
/*
tm = Date.now()
let user = one_user()
this.printwidth = 1700
this.printtitle = ""
let rpt = 'rpt_test'
this.urlprint = "/birt/run?__report=report/one/lab/" + rpt + ".rptdesign&__format=pdf&PID=" + id + "&username=" + user.M_StaffName + "&tm=" + tm
this.$store.commit("helper/update_open_print", true)
*/
},
closePrint() {
id = this.$store.state.re_patient.selected_patient.T_OrderHeaderID
this.$store.dispatch('helper/check_status_print', id)
},
doPrint() {
id = this.$store.state.re_patient.selected_patient.T_OrderHeaderID
tm = Date.now()
let user = one_user()
this.printwidth = 1700
this.printtitle = ""
let rpt = 'rpt_test'
// https://devcpone.aplikasi.web.id/birt/run?__report=report/one/lab/rpt_test.rptdesign&__format=pdf&PID=1&username=adhi&tm=1717726294764
this.urlprint = "/birt/run?__report=report/one/lab/" + rpt + ".rptdesign&__format=pdf&PID=" + id + "&username=" + user.M_StaffName + "&tm=" + tm
this.$store.commit("helper/update_dialog_print_new", true)
},
doPrintPatient() {
id = this.$store.state.re_patient.selected_patient.T_OrderHeaderID
tm = Date.now()
let user = one_user()
this.printwidth = 1700
this.printtitle = ""
let rpt = 'rpt_test_history'
// https://cpone.aplikasi.web.id/birt/run?__report=report/one/lab/rpt_test_history.rptdesign&__format=pdf&PID=7931&username=adhi&tm=1717726294764
this.urlprint = "/birt/run?__report=report/one/lab/" + rpt + ".rptdesign&__format=pdf&PID=" + id + "&username=" + user.M_StaffName + "&tm=" + tm
this.$store.commit("helper/update_open_print", true)
},
doPrintPapsmear() {
id = this.$store.state.re_patient.selected_patient.T_OrderHeaderID
tm = Date.now()
let user = one_user()
this.printwidth = 1700
this.printtitle = ""
let rpt = 'rpt_test_papsmear'
// https://cpone.aplikasi.web.id/birt/run?__report=report/one/lab/rpt_test_papsmear.rptdesign&__format=pdf&PID=323&username=PETUGAS%20SAMPLE%20LAB&tm=1721461717824
this.urlprint = "/birt/run?__report=report/one/lab/" + rpt + ".rptdesign&__format=pdf&PID=" + id + "&username=" + user.M_StaffName + "&tm=" + tm
this.$store.commit("helper/update_open_print", true)
},
doPrintKultur() {
id = this.$store.state.re_patient.selected_patient.T_OrderHeaderID
tm = Date.now()
let user = one_user()
this.printwidth = 1700
this.printtitle = ""
let rpt = 'rpt_test_mikro'
// https://cpone.aplikasi.web.id/birt/run?__report=report/one/lab/rpt_test_mikro.rptdesign&__format=pdf&PID=2088&username=PETUGAS%20SAMPLE%20LAB&tm=1721461717824
this.urlprint = "/birt/run?__report=report/one/lab/" + rpt + ".rptdesign&__format=pdf&PID=" + id + "&username=" + user.M_StaffName + "&tm=" + tm
this.$store.commit("helper/update_open_print", true)
},
keySearch(e) {
if (e.which == 13) {
this.searchs()
}
},
search_px() {
this.$store.dispatch('re_px/search')
},
save_result() {
this.$store.dispatch('re_px/save')
},
save_validate() {
this.$store.dispatch('re_px/confirm')
let patient = this.$store.state.re_patient.selected_patient
if (patient.T_OrderHeaderAddOnValidationDone == 'N') {
patient.T_OrderHeaderAddOnValidationDone = 'P'
}
let patients = this.$store.state.re_patient.patients;
for (let i = 0; i < patients.length; i++) {
if (patients[i].M_PatientID == patient.M_PatientID) {
patients[i] = patient
}
}
let dt = { records: patients, total_page: 1, total: patients.length }
this.$store.commit("re_patient/update_patients", dt)
console.log('pat', patients)
},
unvalidate() {
this.$store.dispatch('re_px/unvalidate')
},
histories() {
this.$store.dispatch('re_history/history')
this.$store.commit('re_history/update_dialog_history', true)
},
img_lang_2(lang, si) {
if (lang == "ID" && si == "N")
return "inako.png"
if (lang == "ID" && si == "Y")
return "inasi.png"
if (lang == "EN" && si == "N")
return "engko.png"
if (lang == "EN" && si == "Y")
return "engsi.png"
},
lang_change(lang) {
this.$store.commit('re_patient/update_lang', lang)
this.$store.dispatch('re_px/lang_export')
},
lang_selected(lang) {
if (lang.code == this.$store.state.re_patient.lang_code)
return true
return false
},
changeDate(x) {
this.sdate = x.new_date
this.searchs()
},
echangeDate(x) {
this.edate = x.new_date
this.searchs()
},
note() {
this.$store.commit('re_patient/update_dialog_note', true)
},
info() {
this.$store.commit('re_patient/update_dialog_req', true)
}
},
mounted() {
//this.$store.dispatch('company/search', {search_company: ''})
this.$store.dispatch('re_px/search_group')
}
}
</script>

View File

@@ -0,0 +1,171 @@
<template>
<v-dialog
v-model="dialog"
persistent
max-width="500px"
transition="dialog-transition"
>
<v-layout class="fill-height" column>
<v-card class="grow">
<v-card-text>
<v-data-table
:headers="headers" :items="reruns"
:loading="isLoading"
hide-actions class="elevation-1">
<template slot="items" slot-scope="props">
<td class="text-xs-left pa-2 green--text" v-bind:class="is_selected(props.item)">
{{get_instrument_date(props.item)}}
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)">
{{ props.item.instrument_name }}
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)">
{{ props.item.result }}
</td>
<td class="text-xs-left pa-2" v-bind:class="is_selected(props.item)">
<v-btn flat icon color="green" @click="select(props.item)">
<v-icon>get_app</v-icon>
</v-btn>
</td>
</template>
</v-data-table>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="blue darken-1" flat @click="dialog = false">Tutup</v-btn>
<!-- <v-btn color="blue darken-1" :dark="btn_save_enabled" @click="save" :disabled="!btn_save_enabled">Simpan</v-btn> -->
</v-card-actions>
</v-card>
</v-layout>
</v-dialog>
</template>
<style scoped>
.searchbox .v-input.v-text-field .v-input__slot{
min-height:60px;
}
.searchbox .v-btn {
min-height:60px;
}
table.v-table tbody td,table.v-table tbody th {
height: 40px;
}
table.v-table thead tr {
height: 40px;
}
</style>
<script>
module.exports = {
data() {
return {
query: "",
items: [],
headers: [
{
text: "TANGGAL",
align: "left",
sortable: false,
value: "mr",
width: "40%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "ALAT",
align: "left",
sortable: false,
value: "mr",
width: "35%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "HASIL",
align: "left",
sortable: false,
value: "mr",
width: "20%",
class: "pa-2 blue lighten-3 white--text"
},
{
text: "",
align: "left",
sortable: false,
value: "mr",
width: "5%",
class: "pa-2 blue lighten-3 white--text"
}
],
isLoading: false
};
},
methods : {
oneMoment : function(d) {
return window.oneMoment(d)
},
get_instrument_date(i) {
// debugger
let rst = ''
try {
rst = moment(i.instrument_date).format('DD.MM.YYYY HH:mm')
} catch(e) {}
return rst
},
select (item) {
this.$store.commit('re_px/update_selected_rerun', item)
this.$store.commit('re_px/update_dialog_rerun', false)
let x = this.$store.state.re_px.pxs
x[this.$store.state.re_px.selected_px_idx]['result'] = item.result
x[this.$store.state.re_px.selected_px_idx]['resultInstrumentID'] = item.resultInstrumentID
console.log(x)
this.$store.commit('re_px/update_pxs', {records:x})
},
is_selected (item) {
// let x = this.$store.state.re_patient.selected_patient
// if (!x)
// return ''
// if (x.T_OrderHeaderID == item.T_OrderHeaderID)
// return 'green lighten-4'
return ''
}
},
computed : {
reruns () {
return this.$store.state.re_px.reruns
},
dialog : {
get () { return this.$store.state.re_px.dialog_rerun },
set (v) { this.$store.commit('re_px/update_dialog_rerun', v) }
}
},
mounted () {
// this.$store.dispatch('re_px/search_rerun')
},
watch : {
dialog(n, o) {
if (n && !o) {
this.$store.dispatch('re_px/search_rerun')
}
}
}
}
</script>

View File

@@ -0,0 +1,109 @@
<template>
<v-layout row justify-center>
<v-dialog v-model="dialog_cytologi" persistent max-width="40%">
<v-card>
<v-card-title>
<span class="headline">CYTOLOGI</span>
</v-card-title>
<v-card-text>
<v-layout mb-2 row>
<v-flex xs12>
<v-select
class="mini-select"
item-text="name"
return-object
outline
:items="doctors"
v-model="selected_doctor"
hide-details
label="Dokter"
></v-select>
<p v-if="error_doctor" class="error pl-2 pr-2" style="color:#fff">Dokternya siapa ? jangan lupa ya ...</p>
</v-flex>
</v-layout>
<v-layout wrap>
<v-flex xs12>
<v-layout v-for="result in results" mb-2 row>
<v-flex xs12>
<v-textarea
auto-grow
:label="result.label"
outline
rows="2"
v-model="result.result"
hide-details
></v-textarea>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="blue darken-1" flat @click="dialog_cytologi = false">Tutup</v-btn>
<v-btn v-if="!onprocess" color="blue darken-1" @click="saveResult_Cytologi" flat >Simpan</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-layout>
</template>
<script>
module.exports = {
mounted() {
//this.$store.dispatch("re_cytologi/get_doctors",{token:''})
},
data() {
return {
error_doctor:false
};
},
computed: {
onprocess(){
return this.$store.state.re_cytologi.onprocess
},
dialog_cytologi: {
get() {
return this.$store.state.re_cytologi.dialog_cytologi
},
set(val) {
this.$store.commit("re_cytologi/update_dialog_cytologi", val)
}
},
results: {
get() {
return this.$store.state.re_cytologi.results
},
set(val) {
this.$store.commit("re_cytologi/update_results", val)
}
},
doctors(){
return this.$store.state.re_cytologi.doctors
},
selected_doctor: {
get() {
return this.$store.state.re_cytologi.selected_doctor
},
set(val) {
this.$store.commit("re_cytologi/update_selected_doctor", val)
}
}
},
methods: {
saveResult_Cytologi(){
//this.$store.dispatch("re_cytologi/saveresult_cytologi",{results:this.results})
if(_.isEmpty(this.selected_doctor) || this.selected_doctor == '0'){
this.error_doctor = true
}else
this.$store.commit("re_cytologi/update_onprocess", true)
this.$store.dispatch("re_cytologi/saveresult_cytologi",{doctor:this.selected_doctor.id,results:this.results})
}
}
}
</script>

View File

@@ -0,0 +1,190 @@
<template>
<v-layout row justify-center>
<v-dialog v-model="dialog_dnafragmentasi" persistent max-width="40%">
<v-card>
<v-card-title>
<span class="headline">DNA FRAGMENTASI INDEKS</span>
</v-card-title>
<v-card-text>
<v-layout mb-2 row>
<v-flex pa-2 xs6>
<v-select
class="mini-select"
item-text="name"
return-object
outline
:items="doctors"
v-model="selected_doctor"
hide-details
label="Dokter"
></v-select>
<p v-if="error_doctor" class="error pl-2 pr-2" style="color:#fff">Dokternya siapa ? jangan lupa ya ...</p>
</v-flex>
<v-flex pa-2 xs6>
<v-select
class="mini-select"
item-text="name"
return-object
outline
:items="methodes"
v-model="selected_methode"
hide-details
label="Metode"
></v-select>
</v-flex>
</v-layout>
<v-layout wrap>
<v-flex xs12>
<v-layout mb-2 row>
<v-flex pa-2 xs6>
<v-text-field
label="Sperma dengan Halo Luas"
outline
v-model="results.halo_luas"
hide-details
></v-text-field>
</v-flex>
<v-flex pa-2 xs6>
<v-text-field
label="Sperma dengan Halo Sedang"
outline
v-model="results.halo_sedang"
hide-details
></v-text-field>
</v-flex>
</v-layout>
<v-layout mb-2 row>
<v-flex pa-2 xs6>
<v-text-field
label="Sperma dengan Halo Sempit"
outline
v-model="results.halo_sempit"
hide-details
></v-text-field>
</v-flex>
<v-flex pa-2 xs6>
<v-text-field
label="Sperma dengan Tanpa Halo"
outline
v-model="results.tanpa_halo"
hide-details
></v-text-field>
</v-flex>
</v-layout>
<v-layout mb-2 row>
<v-flex pa-2 xs4>
<v-text-field
label="DFI"
outline
v-model="results.dfi"
hide-details
></v-text-field>
</v-flex>
<v-flex pa-2 xs4>
<v-textarea
auto-grow
label="Keterangan"
outline
grow
v-model="results.kesimpulan"
hide-details
></v-textarea>
</v-flex>
<v-flex pa-2 xs4>
<v-textarea
auto-grow
label="Catatan"
outline
grow
v-model="results.catatan"
hide-details
></v-textarea>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="blue darken-1" flat @click="dialog_dnafragmentasi = false">Tutup</v-btn>
<v-btn v-if="!onprocess" color="blue darken-1" @click="saveResult_DNAFragmentasi" flat >Simpan</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-layout>
</template>
<script>
module.exports = {
mounted() {
console.log("dialog dna fragmentasi")
//this.$store.dispatch("re_fragmentasi/get_doctors",{token:''})
},
data() {
return {
error_doctor:false
};
},
computed: {
onprocess(){
return this.$store.state.re_dnafragmentasi.onprocess
},
dialog_dnafragmentasi: {
get() {
return this.$store.state.re_dnafragmentasi.dialog_dnafragmentasi
},
set(val) {
this.$store.commit("re_dnafragmentasi/update_dialog_dnafragmentasi", val)
}
},
results: {
get() {
return this.$store.state.re_dnafragmentasi.results
},
set(val) {
this.$store.commit("re_dnafragmentasi/update_results", val)
}
},
doctors(){
return this.$store.state.re_dnafragmentasi.doctors
},
selected_doctor: {
get() {
return this.$store.state.re_dnafragmentasi.selected_doctor
},
set(val) {
this.$store.commit("re_dnafragmentasi/update_selected_doctor", val)
}
},
methodes(){
return this.$store.state.re_dnafragmentasi.methodes
},
selected_methode: {
get() {
return this.$store.state.re_dnafragmentasi.selected_methode
},
set(val) {
this.$store.commit("re_dnafragmentasi/update_selected_methode", val)
}
}
},
methods: {
saveResult_DNAFragmentasi(){
console.log('in save')
//this.$store.dispatch("re_fragmentasi/saveresult_cytologi",{results:this.results})
if(_.isEmpty(this.selected_doctor) || this.selected_doctor == '0'){
this.error_doctor = true
}else
this.$store.commit("re_dnafragmentasi/update_onprocess", true)
this.$store.dispatch("re_dnafragmentasi/saveresult_dnafragmentasi",{methode:this.selected_methode,doctor:this.selected_doctor,results:this.results})
}
}
}
</script>

View File

@@ -0,0 +1,170 @@
<template>
<v-layout row justify-center>
<v-dialog v-model="dialog_fna" persistent max-width="40%">
<v-card>
<v-card-title>
<span class="headline">FNA</span>
</v-card-title>
<v-card-text>
<v-layout mb-2 row>
<v-flex xs12>
<v-select
class="mini-select"
item-text="name"
return-object
outline
:items="doctors"
v-model="selected_doctor"
hide-details
label="Dokter"
></v-select>
<p v-if="error_doctor" class="error pl-2 pr-2" style="color:#fff">Dokternya siapa ? jangan lupa ya ...</p>
</v-flex>
</v-layout>
<v-layout row>
<v-flex xs12>
<v-layout v-for="result in results" mb-2 row>
<v-flex xs12>
<v-textarea
auto-grow
:label="result.label"
outline
rows="2"
v-model="result.result"
hide-details
></v-textarea>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout mt-1 style="border:1px solid black" align-center row pa-2>
<v-flex xs9>
<input type="file" id="files" ref="files" multiple v-on:change="handleFileUploads()"/>
</v-flex>
<v-flex xs3 class="text-xs-right">
<v-btn :disabled="show_progrees_upload" small dark color="blue lighten-1" @click="submitFiles()">Upload</v-btn>
</v-flex>
</v-layout>
<p v-if="error_image" class="mt-1 error pl-2 pr-2" style="color:#fff">Pilih 2 foto ya</p>
<v-layout v-if="show_progrees_upload" row align-center>
<v-flex xs12>
<v-progress-linear :indeterminate="true"></v-progress-linear>
</v-flex>
</v-layout>
<v-card class="mt-1">
<v-layout v-if="images.length > 0 && !show_progrees_upload" align-center row>
<v-flex v-for="image in images" xs6 pa-2>
<v-img :src="image.image_url">
<div class="fill-height bottom-gradient"></div>
</v-img>
</v-flex>
</v-layout>
</v-card>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="blue darken-1" flat @click="dialog_fna = false">Tutup</v-btn>
<v-btn v-if="!onprocess" color="blue darken-1" @click="saveResult_Fna" flat >Simpan</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-layout>
</template>
<script>
module.exports = {
mounted() {
//this.$store.dispatch("re_fna/get_doctors",{token:''})
},
data() {
return {
error_doctor:false,
error_image:false
};
},
computed: {
show_progrees_upload: {
get() {
return this.$store.state.re_fna.show_progrees_upload
},
set(val) {
this.$store.commit("re_fna/update_show_progrees_upload", val)
}
},
images(){
return this.$store.state.re_fna.images
},
onprocess(){
return this.$store.state.re_fna.onprocess
},
dialog_fna: {
get() {
return this.$store.state.re_fna.dialog_fna
},
set(val) {
this.$store.commit("re_fna/update_dialog_fna", val)
}
},
results: {
get() {
return this.$store.state.re_fna.results
},
set(val) {
this.$store.commit("re_fna/update_results", val)
}
},
doctors(){
return this.$store.state.re_fna.doctors
},
selected_doctor: {
get() {
return this.$store.state.re_fna.selected_doctor
},
set(val) {
this.$store.commit("re_fna/update_selected_doctor", val)
}
}
},
methods: {
handleFileUploads(){
this.files = this.$refs.files.files;
},
removeFile( key ){
this.files.splice( key, 1 );
},
submitFiles(){
this.error_image = false
let formData = new FormData()
for( var i = 0; i < this.files.length; i++ ){
let file = this.files[i];
formData.append('files[' + i + ']', file)
}
if(this.files.length > 1){
this.files = []
this.show_progrees_upload = true
formData.append('orderid', this.$store.state.re_patient.selected_patient.T_OrderHeaderID)
formData.append('labnumber', this.$store.state.re_patient.selected_patient.T_OrderHeaderLabNumber)
formData.append('token', one_token())
this.$store.dispatch("re_fna/uploadimage",formData)
}
else{
this.error_image = true
}
},
saveResult_Fna(){
if(_.isEmpty(this.selected_doctor) || this.selected_doctor == '0'){
this.error_doctor = true
}else
this.$store.commit("re_fna/update_onprocess", true)
this.$store.dispatch("re_fna/saveresult_fna",{doctor:this.selected_doctor.id,results:this.results})
}
}
}
</script>

View File

@@ -0,0 +1,170 @@
<template>
<v-layout row justify-center>
<v-dialog v-model="dialog_fna" persistent max-width="40%">
<v-card>
<v-card-title>
<span class="headline">FNA</span>
</v-card-title>
<v-card-text>
<v-layout mb-2 row>
<v-flex xs12>
<v-select
class="mini-select"
item-text="name"
return-object
outline
:items="doctors"
v-model="selected_doctor"
hide-details
label="Dokter"
></v-select>
<p v-if="error_doctor" class="error pl-2 pr-2" style="color:#fff">Dokternya siapa ? jangan lupa ya ...</p>
</v-flex>
</v-layout>
<v-layout row>
<v-flex xs12>
<v-layout v-for="result in results" mb-2 row>
<v-flex xs12>
<v-textarea
auto-grow
:label="result.label"
outline
rows="2"
v-model="result.result"
hide-details
></v-textarea>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout mt-1 style="border:1px solid black" align-center row pa-2>
<v-flex xs9>
<input type="file" id="files" ref="files" multiple v-on:change="handleFileUploads()"/>
</v-flex>
<v-flex xs3 class="text-xs-right">
<v-btn :disabled="show_progrees_upload" small dark color="blue lighten-1" @click="submitFiles()">Upload</v-btn>
</v-flex>
</v-layout>
<p v-if="error_image" class="mt-1 error pl-2 pr-2" style="color:#fff">Pilih 2 foto ya</p>
<v-layout v-if="show_progrees_upload" row align-center>
<v-flex xs12>
<v-progress-linear :indeterminate="true"></v-progress-linear>
</v-flex>
</v-layout>
<v-card class="mt-1">
<v-layout v-if="images.length > 0 && !show_progrees_upload" align-center row>
<v-flex v-for="image in images" xs6 pa-2>
<v-img :src="image.image_url">
<div class="fill-height bottom-gradient"></div>
</v-img>
</v-flex>
</v-layout>
</v-card>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="blue darken-1" flat @click="dialog_fna = false">Tutup</v-btn>
<v-btn v-if="!onprocess" color="blue darken-1" @click="saveResult_Fna" flat >Simpan</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-layout>
</template>
<script>
module.exports = {
mounted() {
//this.$store.dispatch("re_fna/get_doctors",{token:''})
},
data() {
return {
error_doctor:false,
error_image:false
};
},
computed: {
show_progrees_upload: {
get() {
return this.$store.state.re_fna.show_progrees_upload
},
set(val) {
this.$store.commit("re_fna/update_show_progrees_upload", val)
}
},
images(){
return this.$store.state.re_fna.images
},
onprocess(){
return this.$store.state.re_fna.onprocess
},
dialog_fna: {
get() {
return this.$store.state.re_fna.dialog_fna
},
set(val) {
this.$store.commit("re_fna/update_dialog_fna", val)
}
},
results: {
get() {
return this.$store.state.re_fna.results
},
set(val) {
this.$store.commit("re_fna/update_results", val)
}
},
doctors(){
return this.$store.state.re_fna.doctors
},
selected_doctor: {
get() {
return this.$store.state.re_fna.selected_doctor
},
set(val) {
this.$store.commit("re_fna/update_selected_doctor", val)
}
}
},
methods: {
handleFileUploads(){
this.files = this.$refs.files.files;
},
removeFile( key ){
this.files.splice( key, 1 );
},
submitFiles(){
this.error_image = false
let formData = new FormData()
for( var i = 0; i < this.files.length; i++ ){
let file = this.files[i];
formData.append('files[' + i + ']', file)
}
if(this.files.length === 2){
this.files = []
this.show_progrees_upload = true
formData.append('orderid', this.$store.state.re_patient.selected_patient.T_OrderHeaderID)
formData.append('labnumber', this.$store.state.re_patient.selected_patient.T_OrderHeaderLabNumber)
formData.append('token', one_token())
this.$store.dispatch("re_fna/uploadimage",formData)
}
else{
this.error_image = true
}
},
saveResult_Fna(){
if(_.isEmpty(this.selected_doctor) || this.selected_doctor == '0'){
this.error_doctor = true
}else
this.$store.commit("re_fna/update_onprocess", true)
this.$store.dispatch("re_fna/saveresult_fna",{doctor:this.selected_doctor.id,results:this.results})
}
}
}
</script>

View File

@@ -0,0 +1,253 @@
<template>
<v-layout row justify-center>
<v-dialog v-model="dialog_lcprep" persistent max-width="75%">
<v-card>
<v-card-title class="red white--text">
<span class="headline">PAP SMEAR (LCPrep)</span>
</v-card-title>
<v-card-text>
<v-layout class="mb-2" row>
<v-flex xs12>
<v-select
item-text="name"
return-object
style="font-size:12px"
class="mini-select"
outline
:items="doctors"
v-model="selected_doctor"
hide-details
label="Dokter"
></v-select>
<p v-if="error_doctor" class="error pl-2 pr-2" style="color:#fff">Dokternya siapa ? jangan lupa ya ...</p>
</v-flex>
</v-layout>
<v-layout class="mt-2 mb-2" row>
<v-flex xs6>
<v-card
outlined
class="mr-1 pa-2"
>
<v-card-text>
<p class="overline mb-0 font-weight-bold">ADEKUASI BAHAN PEMERIKSAAN</p>
<v-checkbox v-for="chx_adekuasi in adekuasi"
class="mono"
v-model="chx_adekuasi.chex"
:label="chx_adekuasi.name"
hide-details
></v-checkbox>
</v-card-text>
</v-card>
</v-flex>
<v-flex xs6>
<v-card
outlined
class="ml-1 pa-2"
>
<v-card-text>
<p class="overline mb-0 font-weight-bold">KATEGORI UMUM</p>
<v-checkbox v-for="chx_kategoriumum in kategoriumum"
class="mono"
v-model="chx_kategoriumum.chex"
:label="chx_kategoriumum.name"
hide-details
></v-checkbox>
</v-card-text>
</v-card>
</v-flex>
</v-layout>
<v-divider></v-divider>
<v-layout wrap>
<v-flex v-for="(details,idx) in interpretasi" :class="{'xs3':idx===0,'xs7 pl-1':idx===1,'xs2 pl-1':idx===2}">
<v-layout row>
<v-flex xs12>
<v-card>
<v-card-title color="warning" class="purple white--text">
<h5 class="subheader overline font-weight-bold">{{details.group_name}}</h5>
</v-card-title>
<v-list
dense
subheader
single-line
v-for="(subgroups,idxx) in details.subgroups" :key="details.id"
>
<v-subheader class="font-weight-black">{{subgroups.subgroup_name}}</v-subheader>
<v-list-tile v-if="subgroups.childs.length > 0" v-for="(childs,idxxx) in subgroups.childs" :key="childs.id" >
<div v-if="childs.has_result === 'Y' && childs.type_result === 'CHECK'"
:class="{'pl-0':childs.code.length === 2,'pl-4':childs.code.length === 4}"
>
<v-list-tile-action class="mb-2 mono">
<v-checkbox
v-model="childs.chex"
:label="childs.name"
:disabled="childs.is_parent === 'Y'"
@change="changeChildsChex(childs,idxxx,idxx,idx)"
hide-details
></v-checkbox>
</v-list-tile-action>
</div>
<div v-if="childs.has_result === 'Y' && childs.type_result === 'TEXT'">
<v-list-tile-action class="mb-2 pl-0 mono">
<v-text-field
label=""
single-line
v-model="childs.value"
></v-text-field>
</v-list-tile-action>
</div>
</v-list>
</v-card>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout class="mb-2 mt-2" column >
<v-card>
<v-card-title color="warning" class="purple white--text">
<h5 class="subheader overline font-weight-bold">HASIL AKHIR</h5>
</v-card-title>
<v-card-text class="pa-2">
<v-layout v-for="result in results" mt-2 mb-2 row>
<v-flex xs12>
<v-textarea
auto-grow
:label="result.label"
outline
rows="2"
v-model="result.result"
hide-details
></v-textarea>
</v-flex>
</v-layout>
</v-card-text>
</v-card>
</v-layout>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="blue darken-1" flat @click="dialog_lcprep = false">Tutup</v-btn>
<v-btn v-if="!onprocess" color="blue darken-1" @click="saveResult_Lcprep" flat >Simpan</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-layout>
</template>
<style scoped>
.v-input.lcprep .v-label {
height: 20px!important;
line-height: 25px!important;
}
</style>
<script>
module.exports = {
mounted() {
//this.$store.dispatch("re_lcprep/get_doctors",{token:''})
},
data() {
return {
error_doctor:false
};
},
computed: {
onprocess(){
return this.$store.state.re_lcprep.onprocess
},
dialog_lcprep: {
get() {
return this.$store.state.re_lcprep.dialog_lcprep
},
set(val) {
this.$store.commit("re_lcprep/update_dialog_lcprep", val)
}
},
results: {
get() {
return this.$store.state.re_lcprep.results
},
set(val) {
this.$store.commit("re_lcprep/update_results", val)
}
},
adekuasi: {
get() {
return this.$store.state.re_lcprep.adekuasi
},
set(val) {
this.$store.commit("re_lcprep/update_adekuasi", val)
}
},
kategoriumum: {
get() {
return this.$store.state.re_lcprep.kategoriumum
},
set(val) {
this.$store.commit("re_lcprep/update_kategoriumum", val)
}
},
interpretasi: {
get() {
return this.$store.state.re_lcprep.interpretasi
},
set(val) {
this.$store.commit("re_lcprep/update_interpretasi", val)
}
},
doctors(){
return this.$store.state.re_lcprep.doctors
},
selected_doctor: {
get() {
return this.$store.state.re_lcprep.selected_doctor
},
set(val) {
this.$store.commit("re_lcprep/update_selected_doctor", val)
}
}
},
methods: {
changeChildsChex(childs,idxxx,idxx,idx){
let interpretasi = this.interpretasi
var parent_id = interpretasi[idx].subgroups[idxx].childs[idxxx].parent_id
if(parent_id !== '0'){
let childs = interpretasi[idx].subgroups[idxx].childs
let index_parent = _.findIndex(childs, function(o) { return o.id === parent_id })
if(childs.chex)
interpretasi[idx].subgroups[idxx].childs[index_parent].chex = true
else
{
let xfilter = _.filter(childs, { 'chex': true, 'parent_id': parent_id })
if(xfilter.length === 0)
interpretasi[idx].subgroups[idxx].childs[index_parent].chex = false
else
interpretasi[idx].subgroups[idxx].childs[index_parent].chex = true
}
}
this.interpretasi = interpretasi
},
saveResult_Lcprep(){
if(_.isEmpty(this.selected_doctor) || this.selected_doctor.id == '0'){
this.error_doctor = true
}else{
this.$store.commit("re_lcprep/update_onprocess", true)
let selected_lcprep = this.$store.state.re_lcprep.selected_lcprep
var prm = {
doctor:this.selected_doctor.id,
order_id:selected_lcprep.order_id,
detail_id:selected_lcprep.id,
results:this.results,
interpretasi:this.interpretasi,
kategoriumum:this.kategoriumum,
adekuasi:this.adekuasi
}
this.$store.dispatch("re_lcprep/saveresult_lcprep",prm)
}
}
}
}
</script>

View File

@@ -0,0 +1,362 @@
<template>
<v-layout row justify-center>
<v-dialog v-model="dialog_mikro" persistent max-width="50%">
<v-card>
<v-card-title class="teal white--text">
<span class="headline">Mikro</span>
</v-card-title>
<v-card-text>
<v-layout class="mb-0" row>
<v-flex xs6 pa-2 pb-0>
<v-select
item-text="value"
return-object
class="mini-select"
:items="result_values"
v-model="selected_result_value"
label="Pilih Hasil"
outline
hide-details
></v-select>
<p v-if="error_hasil" class="error pt-1 pl-2 pr-2" style="color:#fff">Hasilnya apa ? jangan lupa ya ...</p>
</v-flex>
</v-layout>
<v-layout class="mb-0" row>
<v-flex xs6 pa-2 pb-0>
<v-select
item-text="name"
return-object
class="mini-select"
:items="doctors"
v-model="selected_doctor"
label="Pilih Dokter"
outline
hide-details
></v-select>
<p v-if="error_doctor" class="error pt-1 pl-2 pr-2" style="color:#fff">Dokternya siapa ? jangan lupa ya ...</p>
</v-flex>
<v-flex xs6 v-if="selected_result_value.id === 'Positif'" pa-2 pb-0>
<v-select
class="mini-select"
item-text="name"
return-object
:items="bacteries"
v-model="selected_bacteria"
label="Pilih Bakteri"
outline
hide-details
></v-select>
<p v-if="error_bacteria" class="error pt-1 pl-2 pr-2" style="color:#fff">Bakterinya ? jangan lupa ya ...</p>
</v-flex>
</v-layout>
<v-layout v-if="selected_result_value.id === 'other'" class="pl-2 pr-2" row>
<v-flex xs12>
<v-textarea
auto-grow
label="Hasil Lainnya"
outline
rows="2"
v-model="results.result_other"
hide-details
></v-textarea>
<p v-if="error_result_other" class="error pt-1 pl-2 pr-2" style="color:#fff">Hasil Lainnya : harus diisi</p>
</v-flex>
</v-layout>
<v-layout v-if="selected_result_value.id === 'Positif'" class="mb-2" row>
<v-flex xs6 pa-2 pb-0>
<v-text-field
label="Hasil Biakan"
outline
v-model="results.hasil_biakan"
hide-details
></v-text-field>
</v-flex>
<v-flex xs6 pa-2 pb-0>
<v-text-field
label="Jenis Bahan"
outline
v-model="results.sample_name"
hide-details
></v-text-field>
</v-flex>
</v-layout>
<v-layout v-if="selected_result_value.id === 'Positif'" class="mb-2" row>
<v-flex xs12>
<table style="width:100%;border-collapse: collapse;" class="table_antibiotics">
<thead>
<tr>
<th width="5%" style="padding: 8px;border: 1px solid black;" rowspan="2">No.</th>
<th width="22%" style="padding: 8px;border: 1px solid black;" rowspan="2">Jenis Obat</th>
<th style="padding: 8px;border: 1px solid black;" colspan="3">Standart</th>
<th width="10%" style="padding: 8px;border: 1px solid black;" rowspan="2">Test</th>
<th width="23%" style="padding: 8px;border: 1px solid black;" rowspan="2">Keterangan</th>
</tr>
<tr>
<th width="12%" style="padding: 8px;border: 1px solid black;">R &#60;</th>
<th width="12%" style="padding: 8px;border: 1px solid black;"> &#61;&#60; I &#61; </th>
<th width="12%" style="padding: 8px;border: 1px solid black;">S &#62;&#61;</th>
</tr>
</thead>
<tbody>
<tr style="border: 1px solid black;"
v-for="detail in results.details"
>
<td style="border: 1px solid black;padding: 8px;text-align:center">{{detail.xno}}</td>
<td style="border: 1px solid black;padding: 8px;">{{detail.T_AntibioticName}}</td>
<td style="border: 1px solid black;padding: 8px;text-align:center">{{detail.T_AntibioticNoteR}}</td>
<td style="border: 1px solid black;padding: 8px;text-align:center">{{detail.T_AntibioticNoteI}}</td>
<td style="border: 1px solid black;padding: 8px;text-align:center">{{detail.T_AntibioticNoteS}}</td>
<td style="border: 1px solid black;padding: 8px;">
<v-text-field
single-line
v-model="detail.value"
@change="changeValue(detail,detail.value)"
hide-details
></v-text-field>
</td>
<td style="border: 1px solid black;padding: 8px;text-align:center">
<v-btn style="min-width:30px" v-if="detail.chx_r === 'Y'" color="teal" dark small>R</v-btn>
<v-btn style="min-width:30px" v-if="detail.chx_r === 'N'" color="red" dark small>R</v-btn>
<v-btn style="min-width:30px" v-if="detail.chx_i === 'Y'" color="teal" dark small>I</v-btn>
<v-btn style="min-width:30px" v-if="detail.chx_i === 'N'" color="red" dark small>I</v-btn>
<v-btn style="min-width:30px" v-if="detail.chx_s === 'Y'" color="teal" dark small>S</v-btn>
<v-btn style="min-width:30px" v-if="detail.chx_s === 'N'" color="red" dark small>S</v-btn>
</td>
</tr>
</tbody>
</table>
</v-flex>
</v-layout>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="grey darken-1" flat @click="dialog_mikro = false">Tutup</v-btn>
<v-btn v-if="!onprocess" color="blue darken-1" @click="saveResult_Mikro" flat >Simpan</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-layout>
</template>
<style scoped>
table.table_antibiotics {
font-family: arial, sans-serif;
border-collapse: collapse;
width: 100%;
}
table.table_antibiotics tbody td, table.table_antibiotics tbody th {
border: 1px solid #dddddd;
text-align: left;
padding: 8px;
}
table.table_antibiotics tbody tr:nth-child(even) {
background-color: #dddddd;
}
</style>
<script>
module.exports = {
mounted() {
//this.$store.dispatch("re_mikro/get_doctors",{token:''})
},
data() {
return {
error_doctor:false,
error_bacteria:false,
error_hasil:false,
error_result_other:false
};
},
computed: {
onprocess(){
return this.$store.state.re_mikro.onprocess
},
disable_save(){
return this.$store.state.re_mikro.disable_save
},
selected_result_value: {
get() {
return this.$store.state.re_mikro.selected_result_value
},
set(val) {
this.$store.commit("re_mikro/update_selected_result_value", val)
}
},
result_values(){
return this.$store.state.re_mikro.result_values
},
bacteries(){
return this.$store.state.re_mikro.bacteries
},
selected_bacteria: {
get() {
return this.$store.state.re_mikro.selected_bacteria
},
set(val) {
this.$store.commit("re_mikro/update_selected_bacteria", val)
this.$store.dispatch("re_mikro/getantibiotics", val)
}
},
dialog_mikro: {
get() {
return this.$store.state.re_mikro.dialog_mikro
},
set(val) {
this.$store.commit("re_mikro/update_dialog_mikro", val)
}
},
results: {
get() {
return this.$store.state.re_mikro.results
},
set(val) {
this.$store.commit("re_mikro/update_results", val)
}
},
hasil_biakan: {
get() {
return this.$store.state.re_mikro.hasil_biakan
},
set(val) {
this.$store.commit("re_mikro/update_hasil_biakan", val)
}
},
result_other: {
get() {
return this.$store.state.re_mikro.result_other
},
set(val) {
this.$store.commit("re_mikro/update_result_other", val)
}
},
sample_name: {
get() {
return this.$store.state.re_mikro.sample_name
},
set(val) {
this.$store.commit("re_mikro/update_sample_name", val)
}
},
interpretasi: {
get() {
return this.$store.state.re_mikro.interpretasi
},
set(val) {
this.$store.commit("re_mikro/update_interpretasi", val)
}
},
doctors(){
return this.$store.state.re_mikro.doctors
},
selected_doctor: {
get() {
return this.$store.state.re_mikro.selected_doctor
},
set(val) {
this.$store.commit("re_mikro/update_selected_doctor", val)
}
}
},
methods: {
changeValue(detail,value){
let antibiotics = this.results.details
let idx = _.findIndex(antibiotics, function(o) { return o.T_AntibioticID === detail.T_AntibioticID })
console.log(antibiotics[idx])
antibiotics[idx].value = value
antibiotics[idx].chx_r = 'N'
antibiotics[idx].chx_s = 'N'
antibiotics[idx].chx_i = 'N'
if(
((detail.T_AntibioticMinInclusiveR === 'N' && parseFloat(antibiotics[idx].value) > detail.T_AntibioticMinValueR) ||
(detail.T_AntibioticMinInclusiveR === 'Y' && parseFloat(antibiotics[idx].value) >= detail.T_AntibioticMinValueR)) &&
((detail.T_AntibioticMaxInclusiveR === 'N' && parseFloat(antibiotics[idx].value) < detail.T_AntibioticMaxValueR) ||
(detail.T_AntibioticMaxInclusiveR === 'Y' && parseFloat(antibiotics[idx].value) <= detail.T_AntibioticMaxValueR))
){
antibiotics[idx].chx_r = 'Y'
antibiotics[idx].note = 'R'
}
if(
((detail.T_AntibioticMinInclusiveS === 'N' && parseFloat(antibiotics[idx].value) > detail.T_AntibioticMinValueS) ||
(detail.T_AntibioticMinInclusiveS === 'Y' && parseFloat(antibiotics[idx].value) >= detail.T_AntibioticMinValueS)) &&
((detail.T_AntibioticMaxInclusiveS === 'N' && parseFloat(antibiotics[idx].value) < detail.T_AntibioticMaxValueS) ||
(detail.T_AntibioticMaxInclusiveS === 'Y' && parseFloat(antibiotics[idx].value) <= detail.T_AntibioticMaxValueS))
){
antibiotics[idx].chx_s = 'Y'
antibiotics[idx].note = 'S'
}
if(
((detail.T_AntibioticMinInclusiveI === 'N' && parseFloat(antibiotics[idx].value) > detail.T_AntibioticMinValueI) ||
(detail.T_AntibioticMinInclusiveI === 'Y' && parseFloat(antibiotics[idx].value) >= detail.T_AntibioticMinValueI)) &&
((detail.T_AntibioticMaxInclusiveI === 'N' && parseFloat(antibiotics[idx].value) < detail.T_AntibioticMaxValueI) ||
(detail.T_AntibioticMaxInclusiveI === 'Y' && parseFloat(antibiotics[idx].value) <= detail.T_AntibioticMaxValueI))
){
antibiotics[idx].chx_i = 'Y'
antibiotics[idx].note = 'I'
}
this.results.details = antibiotics
},
getAntibiotics(){
console.log(this.selected_bacteria)
var prm = this.selected_bacteria
this.$store.dispatch("re_mikro/getantibiotics", prm)
},
changeChildsChex(childs,idxxx,idxx,idx){
let interpretasi = this.interpretasi
var parent_id = interpretasi[idx].subgroups[idxx].childs[idxxx].parent_id
if(parent_id !== '0'){
let childs = interpretasi[idx].subgroups[idxx].childs
let index_parent = _.findIndex(childs, function(o) { return o.id === parent_id })
if(childs.chex)
interpretasi[idx].subgroups[idxx].childs[index_parent].chex = true
else
{
let xfilter = _.filter(childs, { 'chex': true, 'parent_id': parent_id })
if(xfilter.length === 0)
interpretasi[idx].subgroups[idxx].childs[index_parent].chex = false
else
interpretasi[idx].subgroups[idxx].childs[index_parent].chex = true
}
}
this.interpretasi = interpretasi
},
saveResult_Mikro(){
var go_save = true
this.$store.commit("re_mikro/update_disable_save", true)
if(_.isEmpty(this.selected_doctor) || this.selected_doctor.id == '0'){
this.error_doctor = true
go_save = false
}
if(this.selected_result_value.id === 'Positif' && (_.isEmpty(this.selected_bacteria) || this.selected_bacteria.id == '0')){
this.error_bacteria = true
go_save = false
}
if(this.selected_result_value.id === 'other' && this.results.result_other === ''){
this.error_result_other = true
go_save = false
}
if(go_save){
this.$store.commit("re_mikro/update_onprocess", true)
let selected_mikro = this.$store.state.re_mikro.selected_mikro
var prm = {
result_value:this.selected_result_value.id,
doctor:this.selected_doctor.id,
bacteria:this.selected_bacteria.id,
hasil_biakan:this.hasil_biakan,
sample_name:this.sample_name,
results:this.results
}
this.$store.dispatch("re_mikro/saveresult_mikro",prm)
}else{
this.$store.commit("re_mikro/update_disable_save", false)
}
}
}
}
</script>

View File

@@ -0,0 +1,255 @@
<template>
<v-layout row justify-center>
<v-dialog v-model="dialog_papsmear" persistent max-width="50%">
<v-card>
<v-card-title class="red white--text">
<span class="headline">PAP SMEAR</span>
</v-card-title>
<v-card-text>
<v-layout class="mb-2" row>
<v-flex xs8>
<v-select
item-text="name"
return-object
style="font-size:12px"
class="mini-select"
outline
:items="doctors"
v-model="selected_doctor"
hide-details
label="Dokter"
></v-select>
<p v-if="error_doctor" class="error pl-2 pr-2" style="color:#fff">Dokternya siapa ? jangan lupa ya ...</p>
</v-flex>
<v-flex pt-2 xs4>
<v-layout class="pa-2" align-center text-xs-right row>
<v-flex xs12>
<h3 class="subheading font-weight-bold">Bahan dari :</h3>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout class="mt-2 mb-2" wrap>
<v-flex xs8>
<v-layout v-for="(check,index) in checks" align-center mb-1 row>
<v-flex xs1>
<v-btn v-if="check.selected === 'N'" @click="changeChecksSelected(check,index)" small style="min-width:18px"><v-icon small>close</v-icon></v-btn>
<v-btn color="teal" dark v-if="check.selected === 'Y'" @click="changeChecksSelected(check,index)" small style="min-width:18px"><v-icon small>check</v-icon></v-btn>
</v-flex>
<v-flex xs5 pl-2>
<label class="body-2 font-weight-bold mb-0 mono">{{check.name}}</label>
</v-flex>
<v-flex xs6>
<v-text-field
outline
v-model="check.note"
:disabled="check.selected === 'N'"
@change="changeNote(check,index)"
single-line
hide-details
></v-text-field>
</v-flex>
</v-layout>
</v-flex>
<v-flex pr-4 xs4>
<v-layout align-center text-xs-right v-for="(bahan,i) in bahans" align-center mb-1 row>
<v-flex xs15 pl-2>
<label class="body-2 font-weight-bold mb-0 mono">{{bahan.name}}</label>
</v-flex>
<v-flex xs1>
<v-btn v-if="bahan.selected === 'N'" @click="changeBahansSelected(bahan,i)" small style="min-width:18px"><v-icon small>close</v-icon></v-btn>
<v-btn color="teal" dark v-if="bahan.selected === 'Y'" @click="changeBahansSelected(bahan,i)" small style="min-width:18px"><v-icon small>check</v-icon></v-btn>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-divider></v-divider>
<v-layout mt-2 mb-2 align-center row>
<v-flex xs3>
<span class="subheading font-weight-bold">
Kategori keganasan :
</span>
</v-flex>
<v-flex text-xs-right xs9>
<span v-for="(category,idx) in categories">
<v-btn v-if="category.selected === 'N'" @click="changeCategoriesSelected(category,idx)" small style="min-width:18px"><v-icon small>close</v-icon></v-btn>
<v-btn color="teal" dark v-if="category.selected === 'Y'" @click="changeCategoriesSelected(category,idx)" small style="min-width:18px"><v-icon small>check</v-icon></v-btn>
<span class="pl-1 pr-2">{{category.name}}</span>
</span>
</v-flex>
</v-layout>
<v-divider></v-divider>
<v-layout mt-2 mb-2 align-center row>
<v-flex xs3>
<span class="subheading font-weight-bold">
Index maturasi :
</span>
</v-flex>
<v-flex xs1>
<span class="subheading font-weight-bold">
M.I
</span>
</v-flex>
<v-flex v-for="(mtr,m) in maturasi.value" xs3 pl-2 pt-2 pb-2>
<v-text-field
v-model="mtr"
@change="changeMaturasi(mtr,m)"
outline
single-line
hide-details
></v-text-field>
</v-flex>
</v-layout>
<v-divider></v-divider>
<v-layout v-for="result in results" mt-2 mb-2 row>
<v-flex xs12>
<v-textarea
auto-grow
:label="result.label"
outline
rows="2"
v-model="result.result"
hide-details
></v-textarea>
</v-flex>
</v-layout>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="blue darken-1" flat @click="dialog_papsmear = false">Tutup</v-btn>
<v-btn v-if="!onprocess" color="blue darken-1" @click="saveResult_Papsmear" flat >Simpan</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-layout>
</template>
<script>
module.exports = {
mounted() {
//this.$store.dispatch("re_papsmear/get_doctors",{token:''})
},
data() {
return {
error_doctor:false
};
},
computed: {
dialog_papsmear: {
get() {
return this.$store.state.re_papsmear.dialog_papsmear
},
set(val) {
this.$store.commit("re_papsmear/update_dialog_papsmear", val)
}
},
results: {
get() {
return this.$store.state.re_papsmear.results
},
set(val) {
this.$store.commit("re_papsmear/update_results", val)
}
},
checks: {
get() {
return this.$store.state.re_papsmear.checks
},
set(val) {
this.$store.commit("re_papsmear/update_checks", val)
}
},
maturasi: {
get() {
return this.$store.state.re_papsmear.maturasi
},
set(val) {
this.$store.commit("re_papsmear/update_maturasi", val)
}
},
bahans: {
get() {
return this.$store.state.re_papsmear.bahans
},
set(val) {
this.$store.commit("re_papsmear/update_bahans", val)
}
},
categories: {
get() {
return this.$store.state.re_papsmear.categories
},
set(val) {
this.$store.commit("re_papsmear/update_categories", val)
}
},
doctors(){
return this.$store.state.re_papsmear.doctors
},
onprocess(){
return this.$store.state.re_papsmear.onprocess
},
selected_doctor: {
get() {
return this.$store.state.re_papsmear.selected_doctor
},
set(val) {
this.$store.commit("re_papsmear/update_selected_doctor", val)
}
}
},
methods: {
saveResult_Papsmear(){
if(_.isEmpty(this.selected_doctor) || this.selected_doctor == '0'){
this.error_doctor = true
}else{
this.$store.commit("re_papsmear/update_onprocess", true)
let selected_papsmear = this.$store.state.re_papsmear.selected_papsmear
var prm = {
order_id:selected_papsmear.order_id,
detail_id:selected_papsmear.id,
doctor:this.selected_doctor.id,
checks:this.checks,
maturasi:this.maturasi,
bahans:this.bahans,
categories:this.categories,
results:this.results
}
this.$store.dispatch("re_papsmear/saveresult_papsmear",prm)
}
},
changeChecksSelected(value,idx){
let checks = this.$store.state.re_papsmear.checks
checks[idx].selected = value.selected === 'N'?'Y':'N'
if(checks[idx].selected === 'N')
checks[idx].note = ''
this.checks = checks
},
changeNote(value,idx){
let checks = this.$store.state.re_papsmear.checks
checks[idx].note = value.note
this.checks = checks
},
changeCategoriesSelected(value,idx){
let categories = this.$store.state.re_papsmear.categories
categories[idx].selected = value.selected === 'N'?'Y':'N'
this.categories = categories
},
changeBahansSelected(value,idx){
let bahans = this.$store.state.re_papsmear.bahans
bahans[idx].selected = value.selected === 'N'?'Y':'N'
this.bahans = bahans
},
changeMaturasi(value,idx){
let mx = this.$store.state.re_papsmear.maturasi
mx.value[idx] = value
this.maturasi = mx
}
}
}
</script>

View File

@@ -0,0 +1,378 @@
<template>
<v-layout row justify-center>
<v-dialog v-model="dialog_preparasisperma" persistent max-width="70%">
<v-card>
<v-card-title>
<span class="headline">PREPARASI SPERMA</span>
</v-card-title>
<v-card-text>
<v-layout mb-3 row>
<v-flex pl-0 xs4>
<v-select
class="mini-select"
item-text="name"
return-object
outline
:items="doctors"
v-model="selected_doctor"
hide-details
label="Dokter"
></v-select>
<p v-if="error_doctor" class="error pl-2 pr-2" style="color:#fff">Dokternya siapa ? jangan lupa ya ...</p>
</v-flex>
</v-layout>
<v-layout mb-2 row>
<v-flex class="font-weight-bold" xs12>
<v-select
class="mini-select"
item-text="name"
return-object
outline
:items="methodes"
v-model="selected_methode"
hide-details
label="Metode"
></v-select>
</v-flex>
</v-layout>
<v-layout row>
<v-flex xs12>
<v-layout mb-2 row>
<v-flex xs6>
<v-layout mb-2 row>
<v-flex class="font-weight-bold" xs12>Pre Preparasi</v-flex>
</v-layout>
<v-layout mb-2 row>
<v-flex xs4>Volume</v-flex>
<v-flex pa-1 xs2>
<v-text-field
label="Volume"
outline
v-model="results.Other_PreparasiSpermaPreVolume"
></v-text-field>
</v-flex>
</v-layout>
<v-layout row>
<v-flex xs4>Motilitas</v-flex>
<v-flex pa-1 xs2>
<v-text-field
label="Progresive"
outline
v-model="results.Other_PreparasiSpermaPreMotilitasA"
></v-text-field>
</v-flex>
<v-flex pa-1 xs2>
<v-text-field
label="Non Progresive"
outline
v-model="results.Other_PreparasiSpermaPreMotilitasB"
></v-text-field>
</v-flex>
<v-flex pa-1 xs2>
<v-text-field
label="Immotile"
outline
v-model="results.Other_PreparasiSpermaPreMotilitasC"
></v-text-field>
</v-flex>
</v-layout>
<v-layout row>
<v-flex xs4>Konsentrasi</v-flex>
<v-flex xs6>
<v-text-field
label="Konsentrasi"
outline
v-model="results.Other_PreparasiSpermaPreKonsentrasi"
></v-text-field>
</v-flex>
</v-layout>
<v-layout row>
<v-flex xs4>Kontaminan</v-flex>
<v-flex xs6>
<v-text-field
label="Kontaminan"
outline
v-model="results.Other_PreparasiSpermaPreKontaminan"
></v-text-field>
</v-flex>
</v-layout>
</v-flex>
<v-flex xs6>
<v-layout mb-2 row>
<v-flex class="font-weight-bold" xs12>Post Preparasi</v-flex>
</v-layout>
<v-layout mb-2 row>
<v-flex xs4>Volume</v-flex>
<v-flex pa-1 xs2>
<v-text-field
label="Volume"
outline
v-model="results.Other_PreparasiSpermaPostVolume"
></v-text-field>
</v-flex>
</v-layout>
<v-layout row>
<v-flex xs4>Motilitas</v-flex>
<v-flex pa-1 xs2>
<v-text-field
label="Progresive"
outline
v-model="results.Other_PreparasiSpermaPostMotilitasA"
></v-text-field>
</v-flex>
<v-flex pa-1 xs2>
<v-text-field
label="Non Progresive"
outline
v-model="results.Other_PreparasiSpermaPostMotilitasB"
></v-text-field>
</v-flex>
<v-flex pa-1 xs2>
<v-text-field
label="Immotile"
outline
v-model="results.Other_PreparasiSpermaPostMotilitasC"
></v-text-field>
</v-flex>
</v-layout>
<v-layout row>
<v-flex xs4>Konsentrasi</v-flex>
<v-flex xs6>
<v-text-field
label="Konsentrasi"
outline
v-model="results.Other_PreparasiSpermaPostKonsentrasi"
></v-text-field>
</v-flex>
</v-layout>
<v-layout row>
<v-flex xs4>Kontaminan</v-flex>
<v-flex xs6>
<v-text-field
label="Kontaminan"
outline
v-model="results.Other_PreparasiSpermaPostKontaminan"
></v-text-field>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout row>
<v-flex xs12>
<v-textarea
auto-grow
label="Keterangan"
outline
rows="2"
v-model="results.Other_PreparasiSpermaNote"
hide-details
></v-textarea>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout mt-1 style="border:1px solid black" align-center row pa-2>
<v-flex pa-2 xs6>
<v-layout row>
<v-flex pt-2 xs9>
<input type="file" id="files_pre" ref="prefile" multiple v-on:change="handleFileUploads('PRE')"/>
</v-flex>
<v-flex xs3 class="text-xs-right">
<v-btn :disabled="show_progrees_upload" small dark color="blue lighten-1" @click="submitFiles()">Upload | PRE</v-btn>
</v-flex>
</v-layout>
<v-layout v-if="error_image_pre" row>
<v-flex xs12>
<p class="mt-1 error pl-2 pr-2" style="color:#fff">Pilih 1 foto ya</p>
</v-flex>
</v-layout>
</v-flex>
<v-flex pa-2 xs6>
<v-layout row>
<v-flex pt-2 xs9>
<input type="file" id="files_post" ref="postfile" multiple v-on:change="handleFileUploads('POST')"/>
</v-flex>
<v-flex xs3 class="text-xs-right">
<v-btn :disabled="show_progrees_upload" small dark color="blue lighten-1" @click="submitFiles()">Upload | POST</v-btn>
</v-flex>
</v-layout>
<v-layout v-if="error_image_post" row>
<v-flex xs12>
<p class="mt-1 error pl-2 pr-2" style="color:#fff">Pilih 1 foto ya</p>
</v-flex>
</v-layout>
</v-flex>
</v-layout>
<v-layout v-if="show_progrees_upload" row align-center>
<v-flex xs12>
<v-progress-linear :indeterminate="true"></v-progress-linear>
</v-flex>
</v-layout>
<v-card class="mt-1">
<v-layout align-center row>
<v-flex pa-2 xs6>
<v-card>
<v-layout align-center justify-center row>
<v-flex xs12>
<v-img v-if="pre_image.image_url" :src="pre_image.image_url" aspect-ratio="1"></v-img>
<div v-if="!pre_image.image_url" class="display-2 text-xs-center ma-3">PRE IMAGE</div>
</v-flex>
</v-layout>
</v-card>
</v-flex>
<v-flex pa-2 xs6>
<v-card>
<v-layout align-center justify-center row>
<v-flex xs12>
<v-img v-if="post_image.image_url" :src="post_image.image_url" aspect-ratio="1"></v-img>
<div v-if="!post_image.image_url" class="display-2 text-xs-center ma-3">POST IMAGE</div>
</v-flex>
</v-layout>
</v-card>
</v-flex>
</v-layout>
</v-card>
</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn color="blue darken-1" flat @click="dialog_preparasisperma = false">Tutup</v-btn>
<v-btn v-if="!onprocess" color="blue darken-1" @click="saveResult" flat >Simpan</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</v-layout>
</template>
<script>
module.exports = {
mounted() {
//this.$store.dispatch("re_preparasisperma/get_doctors",{token:''})
this.files = ''
},
data() {
return {
error_doctor:false,
error_image_pre:false,
error_image_post:false,
type_image:'PRE'
};
},
computed: {
pre_image(){
return this.$store.state.re_preparasisperma.pre_image
},
post_image(){
return this.$store.state.re_preparasisperma.post_image
},
show_progrees_upload: {
get() {
return this.$store.state.re_preparasisperma.show_progrees_upload
},
set(val) {
this.$store.commit("re_preparasisperma/update_show_progrees_upload", val)
}
},
images(){
return this.$store.state.re_preparasisperma.images
},
onprocess(){
return this.$store.state.re_preparasisperma.onprocess
},
dialog_preparasisperma: {
get() {
return this.$store.state.re_preparasisperma.dialog_preparasisperma
},
set(val) {
this.$store.commit("re_preparasisperma/update_dialog_preparasisperma", val)
}
},
results: {
get() {
return this.$store.state.re_preparasisperma.results
},
set(val) {
this.$store.commit("re_preparasisperma/update_results", val)
}
},
doctors(){
return this.$store.state.re_preparasisperma.doctors
},
selected_doctor: {
get() {
return this.$store.state.re_preparasisperma.selected_doctor
},
set(val) {
this.$store.commit("re_preparasisperma/update_selected_doctor", val)
}
},
methodes(){
return this.$store.state.re_preparasisperma.methodes
},
selected_methode: {
get() {
return this.$store.state.re_preparasisperma.selected_methode
},
set(val) {
this.$store.commit("re_preparasisperma/update_selected_methode", val)
}
}
},
methods: {
handleFileUploads(value){
if(value === 'PRE'){
this.files = this.$refs.prefile.files;
//this.$refs.prefile.files = []
}
else{
this.files = this.$refs.postfile.files;
//this.$refs.postfile.files = []
}
console.log(this.files)
this.type_image = value
},
removeFile( key ){
this.files.splice( key, 1 );
},
submitFiles(){
this.error_image = false
this.error_image_pre = false
this.error_image_post = false
let formData = new FormData()
console.log(this.files)
for( var i = 0; i < this.files.length; i++ ){
let file = this.files[i];
formData.append('files[' + i + ']', file)
}
if(this.files.length == 1){
this.files = []
this.show_progrees_upload = true
formData.append('orderid', this.$store.state.re_patient.selected_patient.T_OrderHeaderID)
formData.append('labnumber', this.$store.state.re_patient.selected_patient.T_OrderHeaderLabNumber)
formData.append('token', one_token())
formData.append('type', this.type_image)
this.$store.dispatch("re_preparasisperma/uploadimage_preparasi_sperma",formData)
}
else{
if(this.type_image === 'PRE')
this.error_image_pre = true
else
this.error_image_post = true
}
},
saveResult(){
var selected_x = this.$store.state.re_preparasisperma.selected_preparasisperma
this.$store.commit("re_preparasisperma/update_onprocess", true)
this.$store.dispatch("re_preparasisperma/saveresult",{orderdetailid:selected_x.id,doctor:this.selected_doctor.id,methode:this.selected_methode.id,results:this.results})
}
}
}
</script>