Merge commit '49dcab2a0e6e2b5a2de22a4256ec383b3b9ddb28' into uat

# Conflicts:
#	src/views/trials/trials-panel/reading/dicoms/components/DicomCanvas.vue
#	src/views/trials/trials-panel/reading/dicoms/customize/CustomizeDicomCanvas.vue
#	src/views/trials/trials-panel/visit/crc-upload/index.vue
#	vue.config.js
uat_us
wangxiaoshuang 2024-05-29 16:19:16 +08:00
commit 0ce246689b
276 changed files with 15873 additions and 7945 deletions

View File

@ -27,7 +27,7 @@ VUE_APP_LOGOUT_FOR_PERMISSION = false
VUE_APP_LOGOUT_FOR_TIME = 1800
# 是否开启密码正则验证 true:是 false:否
VUE_APP_PASSWORD_FOR_PERMISSION = true
VUE_APP_PASSWORD_FOR_PERMISSION = false
# 密码校验规则
VUE_APP_PASSWORD_FOR_REGULAR = ^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[-_.@^+\$!%#*?&\$~])[A-Za-z0-9-~_.@^+\$~!%#*?&]{8,32}$
@ -35,6 +35,9 @@ VUE_APP_PASSWORD_FOR_REGULAR = ^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[-_.@^+\$!
# 是否开启文档签署验证 true:是 false:否
VUE_APP_WORD_FOR_PERMISSION = false
# 公司名称
VUE_APP_COMPANY_NAME = "Extensive Imaging"
# dicom文件地址
VUE_APP_DICOM_PATH = 'https://zyypacs.oss-cn-shanghai.aliyuncs.com'

View File

@ -29,6 +29,9 @@ VUE_APP_PASSWORD_FOR_REGULAR = ^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[-_.@^+\$!
# 是否开启文档签署验证 true:是 false:否
VUE_APP_WORD_FOR_PERMISSION = true
# 公司名称
VUE_APP_COMPANY_NAME = "Extensive Imaging"
# dicom文件地址
# VUE_APP_DICOM_PATH = 'http://101.132.193.237:7080'
VUE_APP_DICOM_PATH = 'https://zyypacs-prod.oss-cn-shanghai.aliyuncs.com'

View File

@ -31,6 +31,9 @@ VUE_APP_PASSWORD_FOR_REGULAR = ^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[-_.@^+\$!
# 是否开启文档签署验证 true:是 false:否
VUE_APP_WORD_FOR_PERMISSION = true
# 公司名称
VUE_APP_COMPANY_NAME = "Extensive Imaging"
# dicom文件地址
VUE_APP_DICOM_PATH = 'https://zyypacs-uat.oss-cn-shanghai.aliyuncs.com'

View File

@ -2,7 +2,7 @@
ENV = 'production'
NODE_ENV = 'production'
# base public path
VUE_APP_BASE_PATH = 'https://ei-code-prod.s3.amazonaws.com/2024-01-31/'
VUE_APP_BASE_PATH = 'https://ei-code-prod.s3.amazonaws.com/2024-04-29/'
# 是否开启登陆限制 true:是 false:否
VUE_APP_LOGIN_FOR_PERMISSION = false
@ -28,6 +28,9 @@ VUE_APP_PASSWORD_FOR_REGULAR = ^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[-_.@^+\$!
# 是否开启文档签署验证 true:是 false:否
VUE_APP_WORD_FOR_PERMISSION = true
# 公司名称
VUE_APP_COMPANY_NAME = "Elevate Imaging"
# dicom文件地址
VUE_APP_DICOM_PATH = 'https://zyypacs-usa.oss-us-west-1.aliyuncs.com'

9
package-lock.json generated
View File

@ -11520,6 +11520,15 @@
"resolved": "https://registry.npmmirror.com/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
},
"moment-timezone": {
"version": "0.5.45",
"resolved": "https://registry.npmmirror.com/moment-timezone/-/moment-timezone-0.5.45.tgz",
"integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==",
"dev": true,
"requires": {
"moment": "^2.29.4"
}
},
"move-concurrently": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/move-concurrently/-/move-concurrently-1.0.1.tgz",

View File

@ -2,7 +2,7 @@
"name": "EICS",
"version": "1.3.2",
"scripts": {
"dev": "vue-cli-service serve --open",
"dev": "vue-cli-service serve --open --mode development",
"build": "vue-cli-service build",
"build:prod": "vue-cli-service build --mode prod",
"build:uat": "vue-cli-service build --mode uat",
@ -83,6 +83,7 @@
"eslint-plugin-vue": "^6.2.2",
"html-webpack-plugin": "3.2.0",
"minio": "^7.1.3",
"moment-timezone": "^0.5.45",
"node-xlsx": "^0.21.0",
"runjs": "^4.3.2",
"script-ext-html-webpack-plugin": "2.1.3",

View File

@ -148,8 +148,8 @@ export default {
} else {
this.tableData = Object.assign([], this.arr)
}
console.log(JSON.stringify(this.$path))
console.log(JSON.stringify(this.tableData))
// console.log(JSON.stringify(this.$path))
// console.log(JSON.stringify(this.tableData))
}
}
}

View File

@ -22,9 +22,9 @@ export function getBasicDataSelects(param) {
})
}
export function getBasicDataAllSelect(params) {
export function getBasicDataAllSelect(params, isSystem) {
return request({
url: params ? `/Dictionary/getBasicDataAllSelect?TrialReadingCriterionId=${params}` : `/Dictionary/getBasicDataAllSelect`,
url: params ? (isSystem ? `/Dictionary/getBasicDataAllSelect?SystemReadingCriterionId=${params}` : `/Dictionary/getBasicDataAllSelect?TrialReadingCriterionId=${params}`) : `/Dictionary/getBasicDataAllSelect`,
method: 'get'
})
}

View File

@ -1747,6 +1747,21 @@ export function deleteTrialExternalUser(id) {
method: 'delete'
})
}
export function getUserTobeDoneRecord() {
return request({
url: `/PersonalWorkstation/getUserTobeDoneRecord`,
method: 'get'
})
}
export function getNeedSignTrialDocTrialIdList() {
return request({
url: `/PersonalWorkstation/getNeedSignTrialDocTrialIdList`,
method: 'get'
})
}
export function getBasicStat() {
return request({
url: `/PersonalWorkstation/getBasicStat`,
@ -2795,6 +2810,29 @@ export function saveImageQuality(param) {
data: param
})
}
export function getIsSuvMaxLesion(param) {
return request({
url: `/LuganoCalculate/getIsSuvMaxLesion`,
method: 'post',
data: param
})
}
export function getCanChooseNotMerge(param) {
return request({
url: `/LuganoCalculate/getCanChooseNotMerge`,
method: 'post',
data: param
})
}
export function saveTaskQuestion(saveQuestionType, param) {
return request({
url: `/SaveTaskQuestion/${saveQuestionType}`,
method: 'post',
data: param
})
}
export function deleteReadingRowAnswer(param) {
return request({
url: `/ReadingImageTask/deleteReadingRowAnswer`,
@ -2864,6 +2902,14 @@ export function asyncTrialCriterionDictionary(param) {
})
}
export function configTrialProcessInfoVerification(param) {
return request({
url: `/TrialConfig/configTrialProcessInfoVerification`,
method: 'post',
data: param
})
}
export function getTrialEmailNoticeConfigList(param) {
return request({
url: `/TrialEmailNoticeConfig/getTrialEmailNoticeConfigList`,
@ -3519,3 +3565,105 @@ export function getTrialSiteSurveySelectList(param) {
data: param
})
}
export function getCanMergeLesion(param) {
return request({
url: `/ReadingImageTask/getCanMergeLesion`,
method: 'post',
data: param
})
}
export function mergeLesion(param) {
return request({
url: `/ReadingImageTask/mergeLesion`,
method: 'post',
data: param
})
}
export function resetAndAsyncCriterion(param) {
return request({
url: `/Inspection/ReadingCriterion/ResetAndAsyncCriterion`,
method: 'post',
data: param
})
}
export function batchSetCriterionJoinJoinAnalysis(param) {
return request({
url: `/DoctorWorkload/batchSetCriterionJoinJoinAnalysis`,
method: 'post',
data: param
})
}
export function updateTrialVirtualSiteCode(param) {
return request({
url: `/TaskConsistentRule/updateTrialVirtualSiteCode`,
method: 'post',
data: param
})
}
export function getUpdateVirtualSiteCodeList(param) {
return request({
url: `/TaskConsistentRule/getUpdateVirtualSiteCodeList?trialId=${param.trialId}`,
method: 'get'
})
}
export function addDefaultQuestions(param) {
return request({
url: `/ReadingMedicineQuestion/addDefaultQuestions`,
method: 'post',
data: param
})
}
export function getReadingCalculationData(param) {
return request({
url: `/ReadingImageTask/getReadingCalculationData`,
method: 'post',
data: param
})
}
export function getTrialSignDocumentList(param) {
return request({
url: `/TrialDocument/getTrialSignDocumentList`,
method: 'post',
data: param
})
}
export function getPreviousOtherPicturePath(param) {
return request({
url: `/ReadingImageTask/getPreviousOtherPicturePath`,
method: 'post',
data: param
})
}
export function verifyIsCanConfirm(param) {
return request({
url: `/ReadingMedicineQuestion/verifyIsCanConfirm`,
method: 'post',
data: param
})
}
export function getPTAndCtSeries(param) {
return request({
url: `/SubjectVisit/getPTAndCtSeries`,
method: 'post',
data: param
})
}
export function getDicomSeriesInfo(param) {
return request({
url: `/SubjectVisit/getDicomSeriesInfo`,
method: 'post',
data: param
})
}

View File

@ -7,7 +7,12 @@ export function login(data) {
data
})
}
export function loginOut() {
return request({
url: `/User/loginOut`,
method: 'get'
})
}
export function getAllDictionary() {
return request({
url: '/dictionary/getAllDictionary',

BIN
src/assets/pic-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 15 KiB

BIN
src/assets/zzlogo4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -2,13 +2,13 @@
<template>
<div class="trialsTab">
<el-tabs v-model="trialsTab" @tab-click="clickTab">
<el-tab-pane v-for="item of trialsRouter.children.find(v => {return v.name == 'TrialsPanel'}).children" :key="`tab${item.path}`" :disabled="TotalNeedSignTrialDocCount !== 0" :label="$t(item.LanguageMark)" :name="item.path">
<el-tab-pane v-for="item of trialsRouter.children.find(v => {return v.name == 'TrialsPanel'}).children" :key="`tab${item.path}`" :disabled="TotalNeedSignTrialDocCount !== 0 && item.path !== '/trials/trials-panel/attachments'" :label="$t(item.LanguageMark)" :name="item.path">
<el-tabs v-if="!item.tabHiddn" v-model="trialsTabChild" @tab-click="clickTab">
<el-tab-pane
v-for="item1 of item.children"
v-if="TrialConfig && isShow(item1.path)"
:key="`tab1${item1.path}`"
:disabled="TotalNeedSignTrialDocCount !== 0 || (TrialStatusStr === 'Initializing' && (item1.path === '/trials/trials-panel/setting/personnel-manage' || item1.path === '/trials/trials-panel/setting/qc-question' || item1.path === '/trials/trials-panel/setting/reading-unit' || item1.path === '/trials/trials-panel/setting/medical-audit' || item1.path === '/trials/trials-panel/setting/email-manage'))"
:disabled="TotalNeedSignTrialDocCount !== 0 && item1.path !== '/trials/trials-panel/attachments/self-attachment' || (TrialStatusStr === 'Initializing' && (item1.path === '/trials/trials-panel/setting/personnel-manage' || item1.path === '/trials/trials-panel/setting/qc-question' || item1.path === '/trials/trials-panel/setting/reading-unit' || item1.path === '/trials/trials-panel/setting/medical-audit' || item1.path === '/trials/trials-panel/setting/email-manage'))"
:label="$t(item1.LanguageMark)"
:name="item1.path"
/>

View File

@ -14,8 +14,8 @@
:on-exceed="handleExceed"
accept=".pdf"
>
<el-button size="small" type="primary" :disabled="btnDisabled || $route.query.ReviewStatus === '1'" >Upload</el-button>
<span slot="tip" class="el-upload__tip">(must be in pdf format. 1/2 pages, please confirm information integrity)</span>
<el-button size="small" type="primary" :disabled="btnDisabled || $route.query.ReviewStatus === '1'" >{{ $t('system:GcpCertificate:upload:Upload') }}</el-button>
<span slot="tip" class="el-upload__tip">{{$t('system:GcpCertificate:tap:must2') }}</span>
</el-upload>
</div>
</template>
@ -45,6 +45,7 @@ export default {
},
methods: {
initFileList() {
if(!this.doctorId) return
getAttachmentByType(this.doctorId, this.type)
.then(res => {
if (res.IsSuccess) {
@ -129,7 +130,7 @@ export default {
this.fileList = []
this.$emit('getFileList', '', '')
this.$message({
message: 'Deleted successfully!',
message: this.$t('common:message:deletedSuccessfully'),
type: 'success'
})
}

View File

@ -9,7 +9,7 @@
:file-list="fileList"
:accept="accept"
>
<el-button size="small" type="primary" :disabled="isDisabled">Upload</el-button>
<el-button size="small" type="primary" :disabled="isDisabled">{{ $t('common:button:upload') }}</el-button>
</el-upload>
</div>
</template>
@ -39,6 +39,7 @@ export default {
}
},
mounted() {
if(!this.doctorId) return
this.initFileList()
},
methods: {
@ -143,8 +144,7 @@ export default {
this.$confirm('Sure to remove?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
}).then(() => {
deleteAttachment(file.Id, file.Path)
.then(res => {
@ -152,7 +152,7 @@ export default {
this.fileList.splice(this.fileList.findIndex(item => item.Id === file.Id), 1)
this.$emit('getFileList', this.fileList)
this.$message({
message: 'Deleted successfully!',
message: this.$t('common:message:deletedSuccessfully'),
type: 'success'
})
}

View File

@ -64,7 +64,7 @@
</template>
</el-table-column>
<el-table-column
v-if="hasPermi(['trials:trials-panel:visit:crc-upload:upload']) && allowAddOrEdit"
v-if="hasPermi(['trials:trials-panel:visit:crc-upload:edit']) && allowAddOrEdit"
:label="$t('common:action:action')"
min-width="120"
>
@ -81,7 +81,6 @@
<!-- 移除 -->
<el-button
v-if="(data.SubmitState*1 < 2 || (data.SubmitState === 2 && data.IsQCConfirmedReupload))"
v-hasPermi="['trials:trials-panel:visit:crc-upload:upload']"
icon="el-icon-delete"
circle
:title="$t('common:button:delete')"
@ -127,7 +126,7 @@
</el-table-column>
<el-table-column
v-if="hasPermi(['trials:trials-panel:visit:crc-upload:upload']) && allowAddOrEdit"
v-if="hasPermi(['trials:trials-panel:visit:crc-upload:edit']) && allowAddOrEdit"
:label="$t('common:action:action')"
min-width="200"
>
@ -144,7 +143,6 @@
<!-- 移除 -->
<el-button
v-if="data.SubmitState*1 < 2 || (data.SubmitState === 2 && data.IsQCConfirmedReupload)"
v-hasPermi="['trials:trials-panel:visit:crc-upload:upload']"
icon="el-icon-delete"
circle
:title="$t('common:button:delete')"
@ -200,7 +198,7 @@
</el-table-column>
<el-table-column
v-if="hasPermi(['trials:trials-panel:visit:crc-upload:upload']) && allowAddOrEdit"
v-if="hasPermi(['trials:trials-panel:visit:crc-upload:edit']) && allowAddOrEdit"
:label="$t('common:action:action')"
min-width="200"
>
@ -237,7 +235,7 @@
icon="el-icon-download"
size="small"
:loading="downloadLoading"
@click.native.prevent="handleDownloadTpl(cd.ClinicalDataTrialSetId)"
@click.native.prevent="handleDownloadTpl(cd)"
>
{{ $t('trials:uploadClinicalData:button:downloadTemplate') }}
</el-button>
@ -551,11 +549,8 @@ export default {
})
})
},
handleDownloadTpl(clinicalDataTrialSetId) {
this.downloadLoading = true
DownloadTrialClinicalFile(clinicalDataTrialSetId).then(data => {
this.downloadLoading = false
}).catch(() => { this.downloadLoading = false })
handleDownloadTpl(cd) {
window.open(this.OSSclientConfig.basePath + cd.Path)
}
}

View File

@ -27,6 +27,7 @@ export default
ReadingUnitConfirmation: 108, //
MedicalAudit: 215,//
HeavyReadingApproval: 216,//
ResetAndAsyncCriterion: 218, //
}
}
</script>

1
src/icons/svg/record.svg Normal file
View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1710814433132" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6202" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M509.48 9.666C232.874 9.666 8.666 233.874 8.666 510.48c0 276.618 224.206 500.818 500.814 500.818 276.618 0 500.818-224.202 500.818-500.818 0-276.606-224.2-500.814-500.818-500.814z m0 896.198c-218.384 0-395.378-176.994-395.378-395.382 0-218.384 176.996-395.378 395.378-395.378 218.388 0 395.382 176.996 395.382 395.378 0.002 218.388-176.992 395.382-395.382 395.382z m26.362-390.848v-189.042c0-29.136-23.578-52.718-52.718-52.718s-52.716 23.582-52.716 52.718v210.87c0 0.18 0.012 0.356 0.014 0.534 0.006 0.686 0.018 1.37 0.052 2.054 0.026 0.52 0.072 1.036 0.112 1.55 0.026 0.334 0.042 0.666 0.076 1 0.06 0.632 0.142 1.258 0.226 1.884 0.028 0.21 0.05 0.422 0.08 0.63 0.102 0.698 0.222 1.388 0.35 2.076 0.026 0.136 0.046 0.276 0.074 0.412 0.142 0.732 0.304 1.458 0.476 2.178 0.022 0.098 0.042 0.196 0.068 0.292 0.182 0.744 0.382 1.48 0.596 2.21l0.068 0.244c0.22 0.74 0.46 1.474 0.71 2.202l0.078 0.228c0.256 0.732 0.532 1.454 0.818 2.17 0.032 0.076 0.06 0.154 0.09 0.23 0.292 0.718 0.602 1.428 0.926 2.13l0.104 0.228c0.334 0.716 0.684 1.424 1.05 2.124 0.032 0.058 0.06 0.12 0.09 0.178 0.386 0.732 0.79 1.454 1.208 2.164l0.044 0.078a52.9 52.9 0 0 0 8.716 11.054l148.508 148.506c20.594 20.598 53.956 20.598 74.548 0 20.586-20.586 20.586-53.95 0-74.542l-133.648-133.642z" fill="#FFFFFF" p-id="6203"></path></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -23,23 +23,22 @@
<div style="margin-left:20px;">
<el-dropdown class="dropdown-container" trigger="click">
<span class="el-dropdown-link">
{{ name }}
<span v-if="userTypeShortName">({{ userTypeShortName }})</span>
{{ `${name} (${userTypeShortName})` }}
<!-- {{ name }}
<span v-if="userTypeShortName"> ({{ userTypeShortName }}) </span> -->
<i class="el-icon-caret-bottom" />
</span>
<el-dropdown-menu slot="dropdown" class="user-dropdown">
<el-dropdown-item v-if="!isReviewer">
<span style="display:block;" @click="editInfo">Edit Info</span>
</el-dropdown-item>
<el-dropdown-item>
<span style="display:block;" @click="account">Account</span>
<span style="display:block;" @click="editInfo">{{$t('system:navbar:button:Profile')}}</span>
</el-dropdown-item>
<el-dropdown-item divided>
<span style="display:block;" @click="logout">Log Out</span>
<span style="display:block;" @click="logout">{{$t('system:navbar:button:Log Out')}}</span>
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<TopLang></TopLang>
</div>
</div>
</div>
@ -50,12 +49,15 @@ import {mapGetters, mapMutations} from 'vuex'
import Breadcrumb from '@/components/Breadcrumb'
import Hamburger from '@/components/Hamburger'
import Screenfull from '@/components/Screenfull'
import TopLang from './topLang'
export default {
components: {
Breadcrumb,
Hamburger,
Screenfull
Screenfull,
TopLang
},
data() {
return {
@ -89,9 +91,6 @@ export default {
editInfo() {
this.$router.push({ name: 'BaiscInfo' })
},
account() {
this.$router.push({ name: 'Account' })
}
}
}
</script>

View File

@ -0,0 +1,54 @@
<template>
<el-dropdown
style="height:50px;line-height: 60px;"
@command="handleSetLanguage"
>
<span class="el-dropdown-link">
<svg-icon icon-class="language" style="font-size:25px;margin:0 10px;" />
<!-- {{ language==='zh'?'语言:中文':'Language: English' }} -->
<!-- <i class="el-icon-arrow-down el-icon--right" /> -->
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
:disabled="language==='zh'"
command="zh"
>中文
</el-dropdown-item>
<el-dropdown-item
:disabled="language==='en'"
command="en"
>English
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
<script>
import { mapGetters, mapMutations } from 'vuex'
export default {
name: 'TopLang',
data() {
return {}
},
computed: {
...mapGetters({
language: 'language'
})
},
methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }),
handleSetLanguage(lang) {
this.$i18n.locale = lang
this.setLanguage(lang)
this.$updateDictionary()
window.location.reload()
}
}
}
</script>
<style lang="scss" scoped>
</style>

View File

@ -160,10 +160,16 @@ Vue.prototype.fileToBlob = (file) => {
var _vm
async function VueInit () {
var params
var res
if (~window.location.href.indexOf('/readingDicoms') || ~window.location.href.indexOf('/noneDicomReading') || ~window.location.href.indexOf('/criterionquestions') || ~window.location.href.indexOf('/petct')) {
params = $q('TrialReadingCriterionId')
res = await getBasicDataAllSelect(params)
} else if (~window.location.href.indexOf('/ecrfPreview')) {
params = $q('SystemReadingCriterionId')
res = await getBasicDataAllSelect(params, true)
} else {
res = await getBasicDataAllSelect(params)
}
var res = await getBasicDataAllSelect(params)
var Internationalization = await getFrontInternationalizationList()
Vue.prototype.$tl = Internationalization.Result
let zhMessages = {}, enMessages = {}
@ -326,6 +332,7 @@ async function VueInit () {
}
const h = _vm.$createElement
/* eslint-disable */
window.VUE_APP_COMPANY_NAME = process.env.VUE_APP_COMPANY_NAME;
waitOperate(eval(process.env.VUE_APP_LOGOUT_FOR_PERMISSION) ? () => {
var lang = zzSessionStorage.getItem('lang')?zzSessionStorage.getItem('lang'):'zh'
if ( _vm.$route.path === '/ReviewersResearchForm' || _vm.$route.path === '/ReviewersResearch' || _vm.$route.path === '/login' || _vm.$route.path === '/researchForm' || _vm.$route.path === '/researchLogin' || _vm.$route.path === '/email-recompose' || _vm.$route.path === '/recompose' || _vm.$route.path === '/resetpassword' || _vm.$route.path === '/error') {

View File

@ -56,6 +56,9 @@ router.beforeEach(async(to, from, next) => {
/* has no token*/
if (whiteList.indexOf(to.path) !== -1) {
// 在免登录whiteList中直接进入
if (to.path === '/readingDicoms' || to.path === '/noneDicomReading'){
OSSclient()
}
next()
} else {
if (to.path === '/researchForm') {

View File

@ -139,6 +139,13 @@ export const constantRoutes = [
hidden: true,
component: () => import('@/views/trials/trials-panel/reading/dicoms/components/Fusion/PetCt')
},
{
path: '/historyScreenshot',
name: 'historyScreenshot',
hidden: true,
component: () => import('@/views/trials/trials-panel/reading/dicoms/components/Fusion/HistoryScreenshot')
},
{
path: '/visitDicomReview',
name: 'visitDicomReview',
@ -242,6 +249,11 @@ export const constantRoutes = [
component: () => import('@/views/404'),
hidden: true
},
{
path: '/ecrfPreview',
component: () => import('@/views/dictionary/template/components/ECRF'),
hidden: true
},
{
path: '/editUser',
component: Layout,
@ -250,12 +262,7 @@ export const constantRoutes = [
children: [{
path: 'baiscInfo',
name: 'BaiscInfo',
component: () => import('@/views/user/editInfo')
},
{
path: 'account',
name: 'Account',
component: () => import('@/views/user/account')
component: () => import('@/views/user/myInfo')
}
]
}

View File

@ -40,6 +40,7 @@ const getters = {
activeSeries: state => state.reading.activeSeries,
lastCanvasTaskId: state => state.reading.lastCanvasTaskId,
imageQuality: state => state.reading.imageQuality,
imageQualityIssues: state => state.reading.imageQualityIssues,
language: state => state.lang.language,
TotalNeedSignSystemDocCount: state => state.user.TotalNeedSignSystemDocCount,
TotalNeedSignTrialDocCount: state => state.user.TotalNeedSignTrialDocCount,

View File

@ -29,7 +29,8 @@ const getDefaultState = () => {
currentReadingTaskState: 2,
activeSeries: {},
lastCanvasTaskId: '',
imageQuality: null
imageQuality: null,
imageQualityIssues: null
}
}
function getQuestions(questions) {
@ -183,6 +184,7 @@ const actions = {
state.activeSeries = {}
state.lastCanvasTaskId = ''
state.imageQuality = null
state.imageQualityIssues = null
resolve()
})
},
@ -875,6 +877,9 @@ const actions = {
setImageQuality({ state }, imageQuality) {
state.imageQuality = isNaN(parseInt(imageQuality)) ? null : parseInt(imageQuality)
},
setImageQualityIssues({ state }, imageQualityIssues) {
state.imageQualityIssues = isNaN(parseInt(imageQualityIssues)) ? null : parseInt(imageQualityIssues)
},
addQuestionMeasuredData({ state }, obj) {
return new Promise(resolve => {
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)

View File

@ -1,5 +1,5 @@
import { getToken, setToken, removeToken, setName, removeName } from '@/utils/auth'
import { login, getUserMenuTree, getUserPermissions } from '@/api/user'
import { login,loginOut,getUserMenuTree, getUserPermissions } from '@/api/user'
import { resetRouter } from '@/router'
import md5 from 'js-md5'
@ -78,6 +78,9 @@ const mutations = {
}
const actions = {
changeUserName({ commit }, userName) {
commit('SET_USERNAME', userName)
},
// user login
login({ commit }, userInfo) {
const { username, password } = userInfo
@ -175,12 +178,17 @@ const actions = {
commit('SET_NAME', zzSessionStorage.getItem('realName'))
},
// user logout
logout({ commit, state }) {
removeToken() // must remove token first
resetRouter()
removeName()
zzSessionStorage.clear()
commit('RESET_STATE')
async logout({ commit, state }) {
try{
await loginOut()
removeToken() // must remove token first
resetRouter()
removeName()
zzSessionStorage.clear()
commit('RESET_STATE')
}catch(e){
console.log(e)
}
},
setToken({ commit }, token) {
commit('SET_TOKEN', token)

View File

@ -54,7 +54,7 @@ export const anonymization = function (file, config) {
}
}
}
console.log(dataset)
// console.log(dataset)
let newDicomFile = dataset.write()
const bufferArray = new Uint8Array(newDicomFile)
const blob = new Blob([bufferArray], { type: 'application/octet-stream' })

View File

@ -3,6 +3,8 @@ import { Message, MessageBox, Alert } from 'element-ui'
import store from '@/store'
import router from '@/router'
import Vue from 'vue'
import moment from 'moment-timezone';
console.log(moment.tz.guess())
axios.defaults.withCredentials = false
const service = axios.create({
baseURL: '/api',
@ -19,6 +21,7 @@ service.interceptors.request.use(
config.headers['Content-Type'] = 'application/json;charset=UTF-8'
var language = zzSessionStorage.getItem('lang')
config.headers['Accept-Language'] = language === 'en'?'en-US,en;q=0.5':'zh-CN,zh;q=0.9'
config.headers['TimeZoneId'] = moment.tz.guess()
if (store.getters.token) {
config.headers.Authorization = `Bearer ${store.getters.token}`
}
@ -59,7 +62,11 @@ service.interceptors.response.use(
MessageBox.confirm(res.ErrorMessage, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => {
if(res.Code === 6) {
window.close()
}
}
})
}
return Promise.reject(res)
@ -71,7 +78,7 @@ service.interceptors.response.use(
var message = ''
if (error && error.response) {
const status = error.response.status
if (error.response.data && error.response.data.Code === -1) {
if (error.response.data && (error.response.data.Code === -1 || error.response.data.Code === -2)) {
store.dispatch('user/logout').then(() => {
router.push(`/login`)
this.$i18n.locale = 'zh'

View File

@ -1,137 +1,135 @@
<template>
<div class="app-container menu">
<el-tree
:props="defaultProps"
:data="treeData"
node-key="Id"
:default-expand-all="true"
:expand-on-click-node="false"
style="width:80%;"
>
<span slot-scope="{ node, data }" class="custom-tree-node">
<span v-if="data.FunctionName">{{ node.label }} --------------------(Function)</span>
<span v-else>{{ node.label }}</span>
<span>
<el-button type="text" icon="el-icon-plus" size="small" @click="() => append(data)">Append</el-button>
<el-button
type="text"
icon="el-icon-edit"
size="small"
@click="() => edit(data)"
>Edit</el-button>
<el-button type="text" icon="el-icon-delete" size="small" @click="() => remove(data)">Delete</el-button>
</span>
</span>
</el-tree>
<menu-form v-if="model_cfg.visible" :form="currenNode" width="500px" @close="closeModel" />
</div>
</template>
<script>
import { getMenuFunction, deleteMenuFunction } from '@/api/admin'
import MenuForm from './components/MenuForm'
import { model_cfg } from './menu'
export default {
name: 'Menu',
components: { MenuForm },
data() {
return {
model_cfg,
treeData: [],
defaultProps: {
label: 'MenuName',
children: 'Children'
},
dialogVisible: false,
title: '',
currenNode: {},
nodeId: '',
parentId: ''
}
},
mounted() {
this.getlist()
},
methods: {
//
getlist() {
const loading = this.$loading({
target: document.querySelector('.menu'),
fullscreen: false,
lock: true,
text: 'Loading',
spinner: 'el-icon-loading'
})
getMenuFunction().then(res => {
loading.close()
this.treeData = res.Result
}).catch(() => { loading.close() })
},
//
append(node) {
this.currenNode = {}
this.currenNode.ParentId = node.Id
this.currenNode.Status = 1
// this.currenNode.ShowOrder = 0
this.nodeId = node.Id
this.model_cfg.title = 'Append'
this.model_cfg.visible = true
},
//
edit(node) {
// eslint-disable-next-line no-unused-vars
const { Children, CreateTime, CreateUserId, UpdateTime, UpdateUserId, ...obj } = JSON.parse(JSON.stringify(node))
obj.MetaBreadcrumb = obj.MetaBreadcrumb ? 1 : 0
obj.Hidden = obj.Hidden ? 1 : 0
this.currenNode = obj
this.nodeId = node.Id
this.model_cfg.title = 'Edit'
this.model_cfg.visible = true
},
//
remove(node) {
this.$confirm('Sure to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
deleteMenuFunction(node.Id)
.then(res => {
if (res.IsSuccess) {
this.getlist()
this.$message.success('Deleted successfully!')
}
})
})
},
//
closeModel() {
this.model_cfg.visible = false
this.getlist()
}
}
}
</script>
<style lang="scss">
.menu{
.el-tree {
margin-top: 20px;
}
.el-tree-node{
margin-top: 5px;
}
.custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
padding-right: 8px;
}
.el-dialog__body{
padding: 10px;
}
}
</style>
<template>
<div class="app-container menu">
<el-tree
:props="defaultProps"
:data="treeData"
node-key="Id"
:default-expand-all="true"
:expand-on-click-node="false"
style="width:80%;"
>
<span slot-scope="{ node, data }" class="custom-tree-node">
<span v-if="data.FunctionName">{{ node.label }} --------------------(Function)</span>
<span v-else>{{ node.label }}</span>
<span>
<el-button type="text" icon="el-icon-plus" size="small" @click="() => append(data)">Append</el-button>
<el-button
type="text"
icon="el-icon-edit"
size="small"
@click="() => edit(data)"
>Edit</el-button>
<el-button type="text" icon="el-icon-delete" size="small" @click="() => remove(data)">Delete</el-button>
</span>
</span>
</el-tree>
<menu-form v-if="model_cfg.visible" :form="currenNode" width="500px" @close="closeModel" />
</div>
</template>
<script>
import { getMenuFunction, deleteMenuFunction } from '@/api/admin'
import MenuForm from './components/MenuForm'
import { model_cfg } from './menu'
export default {
name: 'Menu',
components: { MenuForm },
data() {
return {
model_cfg,
treeData: [],
defaultProps: {
label: 'MenuName',
children: 'Children'
},
dialogVisible: false,
title: '',
currenNode: {},
nodeId: '',
parentId: ''
}
},
mounted() {
this.getlist()
},
methods: {
//
getlist() {
const loading = this.$loading({
target: document.querySelector('.menu'),
fullscreen: false,
lock: true,
text: 'Loading',
spinner: 'el-icon-loading'
})
getMenuFunction().then(res => {
loading.close()
this.treeData = res.Result
}).catch(() => { loading.close() })
},
//
append(node) {
this.currenNode = {}
this.currenNode.ParentId = node.Id
this.currenNode.Status = 1
// this.currenNode.ShowOrder = 0
this.nodeId = node.Id
this.model_cfg.title = 'Append'
this.model_cfg.visible = true
},
//
edit(node) {
// eslint-disable-next-line no-unused-vars
const { Children, CreateTime, CreateUserId, UpdateTime, UpdateUserId, ...obj } = JSON.parse(JSON.stringify(node))
obj.MetaBreadcrumb = obj.MetaBreadcrumb ? 1 : 0
obj.Hidden = obj.Hidden ? 1 : 0
this.currenNode = obj
this.nodeId = node.Id
this.model_cfg.title = 'Edit'
this.model_cfg.visible = true
},
//
remove(node) {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true
})
.then(() => {
deleteMenuFunction(node.Id)
.then(res => {
if (res.IsSuccess) {
this.getlist()
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
})
})
},
//
closeModel() {
this.model_cfg.visible = false
this.getlist()
}
}
}
</script>
<style lang="scss">
.menu{
.el-tree {
margin-top: 20px;
}
.el-tree-node{
margin-top: 5px;
}
.custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
padding-right: 8px;
}
.el-dialog__body{
padding: 10px;
}
}
</style>

View File

@ -89,16 +89,15 @@ export default {
})
},
handleDeleteRole(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
}).then(() => {
deleteUserTypeRole(row.Id).then((res) => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex((item) => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
})
})

View File

@ -1,39 +1,38 @@
<template>
<el-card class="box-card" style="width:800px;" size="small">
<!-- <div slot="header" class="clearfix">
<span>Security</span>
</div> -->
<div>
<el-button type="danger" @click="handleReset">Reset Password</el-button>
</div>
</el-card>
</template>
<script>
import { resetPassword } from '@/api/admin'
export default {
name: 'Account',
props: {
userId: { type: String, default: '' }
},
methods: {
handleReset() {
this.$confirm('Sure to reset password?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
resetPassword(this.userId).then(res => {
if (res.IsSuccess) {
this.$message({
message: 'Reset password successfully',
type: 'success'
})
}
})
})
}
}
}
</script>
<template>
<el-card class="box-card" style="width:800px;" size="small">
<!-- <div slot="header" class="clearfix">
<span>Security</span>
</div> -->
<div>
<el-button type="danger" @click="handleReset">Reset Password</el-button>
</div>
</el-card>
</template>
<script>
import { resetPassword } from '@/api/admin'
export default {
name: 'Account',
props: {
userId: { type: String, default: '' }
},
methods: {
handleReset() {
this.$confirm('Sure to reset password?', {
type: 'warning',
distinguishCancelAndClose: true,
})
.then(() => {
resetPassword(this.userId).then(res => {
if (res.IsSuccess) {
this.$message({
message: 'Reset password successfully',
type: 'success'
})
}
})
})
}
}
}
</script>

View File

@ -113,18 +113,17 @@ export default {
},
//
handleDeleteUser(data) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
deleteSysUser(data.Id)
.then(res => {
if (res.IsSuccess) {
this.users.splice(this.users.findIndex(item => item.Id === data.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
})
})

View File

@ -14,27 +14,26 @@
<span v-else>{{ employment.RankCN }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item :label="$t('resumeInfo:label:Physician')">
<span v-if="isEnglish">{{ employment.Physician }}</span>
<span v-else>{{ employment.PhysicianCN }}</span>
</el-form-item>
</el-col>
<!-- <el-col :span="6">-->
<!-- <el-form-item :label="$t('resumeInfo:label:Physician')">-->
<!-- <span v-if="isEnglish">{{ employment.Physician }}</span>-->
<!-- <span v-else>{{ employment.PhysicianCN }}</span>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="6">
<el-form-item :label="$t('resumeInfo:label:Position')">
<span v-if="isEnglish">{{ employment.Position }}</span>
<span v-else>{{ employment.PositionCN }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item :label="$t('resumeInfo:label:Hospital')">
<span v-if="isEnglish">{{ employment.HospitalName }}</span>
<span v-else>{{ employment.HospitalNameCN }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item :label="$t('resumeInfo:label:Affiliated')">
<span v-if="isEnglish">{{ employment.UniversityAffiliated }}</span>

View File

@ -90,11 +90,12 @@ export default {
this.setLanguage('zh')
this.$updateDictionary()
}
this.title = this.doctorInfo.BasicInfoView?`${this.doctorInfo.BasicInfoView.FirstName} ${this.doctorInfo.BasicInfoView.LastName}${this.$t('resumeInfo:title:Details')}`:''
this.title = this.doctorInfo.BasicInfoView?`${this.doctorInfo.BasicInfoView.BlindName}${this.$t('resumeInfo:title:Details')}`:''
}
},
mounted() {
this.isEnglish = !!((this.$route.query.isEnglish === true || this.$route.query.isEnglish === 'true'))
this.isEnglish = this.$i18n.locale === 'zh' ? false : true
this.doctorId = this.$route.query.doctorId
this.initForm()
},
@ -135,6 +136,7 @@ export default {
} else {
this.workInfo.Position = this.workInfo.Position
this.workInfo.PositionCN = this.workInfo.PositionCN
//
}
this.workInfo.PositionOther = this.workInfo.PositionOther ? 'Other - ' + this.workInfo.PositionOther : 'Other'
}
@ -179,7 +181,7 @@ export default {
this.holiday = res.Result.InHoliday ? 'Yes' : 'No'
this.doctorInfo = res.Result
!this.doctorInfo.ResearchPublicationView ? this.doctorInfo.ResearchPublicationView = {} : '';
this.title = `${this.doctorInfo.BasicInfoView.BlindName} 's Details`
this.title = this.doctorInfo.BasicInfoView?`${this.doctorInfo.BasicInfoView.BlindName}${this.$t('resumeInfo:title:Details')}`:''
this.htmlTitle = this.title
this.initStatus()
this.initEmploymentInfo()

View File

@ -126,8 +126,7 @@ export default {
this.$confirm('Sure to sign out', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.$store.dispatch('user/logout').then(res => {

View File

@ -63,7 +63,7 @@
import * as dicomParser from 'dicom-parser'
import * as cornerstone from 'cornerstone-core'
import * as cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader'
import dicomStore from '@/utils/dicom-store.js'
import dicomStore from '@/utils/dicom-store'
import dicomViewer from '@/components/Dicom/DicomViewer'
import dicomPreview from '@/components/Dicom/DicomPreview'
@ -86,6 +86,10 @@ export default {
uid: {
type: String,
default: ''
},
studyList: {
type: Array,
default: []
}
},
@ -102,7 +106,7 @@ export default {
var totalHeight = window.innerHeight || document.body.clientHeight
var wrapper = this.$refs['preview-wrapper']
wrapper.style.height = (totalHeight - 70) + 'px'
if (!dicomStore.studyList || !this.uid) return
if (!this.studyList || !this.uid) return
this.loadStudy()
},
@ -120,7 +124,7 @@ export default {
return newObj
},
loadStudy() {
var studyList = dicomStore.studyList
var studyList = this.studyList
var studyUid = this.uid
var studyItem = studyList.find(function(item) {
return item.dicomInfo.studyUid === studyUid

View File

@ -64,21 +64,24 @@
</div>
</div>
<div v-if="showDelete" @click.stop="">
<div v-if="showDelete" @click.stop="" style="display: flex;flex-direction: row;justify-content: space-between;">
<span style="font-size: 12px;">{{ $t('trials:audit:table:isReading') }}</span>
<el-switch
v-model="item.isReading"
size="mini"
@change="changeReadingStatus($event, item)"
/>
<span style="font-size: 12px;">{{ $t('trials:audit:table:isDelete') }}</span>
<el-switch
v-model="item.isDeleted"
size="mini"
@change="changeDeleteStatus($event, item)"
/>
<div>
<span style="font-size: 12px;margin-right: 5px">{{ $t('trials:audit:table:isReading') }}</span>
<el-switch
v-model="item.isReading"
size="mini"
@change="changeReadingStatus($event, item)"
/>
</div>
<div>
<span style="font-size: 12px;margin-right: 5px">{{ $t('trials:audit:table:isDelete') }}</span>
<el-switch
v-model="item.isDeleted"
size="mini"
@change="changeDeleteStatus($event, item)"
/>
</div>
</div>
<div v-if="item.prefetchInstanceCount>0 && item.prefetchInstanceCount<item.instanceCount">
<el-progress :percentage="parseInt(((item.prefetchInstanceCount/item.instanceCount)*100).toFixed(2))" />
@ -403,6 +406,7 @@ export default {
data.isReading = true
}
var message = this.$t('trials:audit:message:changeSeriesStatus').replace('xxx', statusStr)
message = message.replace('yyy', this.$fd('YesOrNo', !data.isReading))
this.$confirm(message, {
distinguishCancelAndClose: true,
type: 'warning'
@ -430,6 +434,7 @@ export default {
data.isDeleted = true
}
var message = this.$t('trials:audit:message:changeSeriesStatus').replace('xxx', statusStr)
message = message.replace('yyy', this.$fd('YesOrNo', !data.isDeleted))
this.$confirm(message, {
distinguishCancelAndClose: true,
type: 'warning'

View File

@ -83,21 +83,24 @@
</div>
</div>
<div v-if="showDelete" @click.stop="">
<div v-if="showDelete" @click.stop="" style="display: flex;flex-direction: row;justify-content: space-between;">
<span style="font-size: 12px;">{{ $t('trials:audit:table:isReading') }}</span>
<el-switch
v-model="series.isReading"
size="mini"
@change="changeReadingStatus($event, series)"
/>
<span style="font-size: 12px;">{{ $t('trials:audit:table:isDelete') }}</span>
<el-switch
v-model="series.isDeleted"
size="mini"
@change="changeDeleteStatus($event, series)"
/>
<div>
<span style="font-size: 12px;">{{ $t('trials:audit:table:isReading') }}</span>
<el-switch
v-model="series.isReading"
size="mini"
@change="changeReadingStatus($event, series)"
/>
</div>
<div>
<span style="font-size: 12px;">{{ $t('trials:audit:table:isDelete') }}</span>
<el-switch
v-model="series.isDeleted"
size="mini"
@change="changeDeleteStatus($event, series)"
/>
</div>
</div>
<!-- <div style="position: absolute;bottom: -10px;left: 0;width: 100%;">
<el-progress v-if="series.prefetchInstanceCount>0 && series.prefetchInstanceCount<series.instanceCount" :percentage="Number(series.prefetchInstanceCount/series.instanceCount)*100" />
@ -353,6 +356,7 @@ export default {
data.isReading = true
}
var message = this.$t('trials:audit:message:changeSeriesStatus').replace('xxx', statusStr)
message = message.replace('yyy', this.$fd('YesOrNo', !data.isReading))
this.$confirm(message, {
distinguishCancelAndClose: true,
type: 'warning'
@ -380,6 +384,7 @@ export default {
data.isDeleted = true
}
var message = this.$t('trials:audit:message:changeSeriesStatus').replace('xxx', statusStr)
message = message.replace('yyy', this.$fd('YesOrNo', !data.isDeleted))
this.$confirm(message, {
distinguishCancelAndClose: true,
type: 'warning'

View File

@ -244,8 +244,7 @@ export default {
this.$confirm('是否确认废除此文件?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true

View File

@ -33,7 +33,7 @@
<el-table-column prop="ModuleTypeValueCN" label="模块" show-overflow-tooltip align="left" min-width="230px" />
<el-table-column prop="Description" label="操作名称" :show-overflow-tooltip="true" min-width="200px">
<template slot-scope="scope">
<span>{{ scope.row.Description }}{{scope.row.DescriptionCN}}</span>
<span>{{ scope.row.DescriptionCN }}{{scope.row.Description}}</span>
</template>
</el-table-column>
<el-table-column prop="DescriptionCN" label="其他" :show-overflow-tooltip="true" min-width="140px">
@ -608,11 +608,11 @@
<div style="padding: 0 40px;display: flex;flex-direction: column">
<div style="text-align: right;height: 50px;">
<el-select v-model="copeParams.FromItemId" collapse-tags filterable placeholder="完全拷贝对象" clearable size="small">
<el-option v-for="item of list" v-if="drawer_cfg.drawerChild && item.ConfigType === 'M' && item.ObjectTypeId === selectRow.ObjectTypeId && item.OptTypeId && item.ChildrenTypeId " :value="item.Id" :label="item.Description" />
<el-option v-for="item of list" v-if="drawer_cfg.drawerChild && item.ConfigType === 'M' && item.ObjectTypeId === selectRow.ObjectTypeId && item.OptTypeId && item.ChildrenTypeId " :value="item.Id" :label="item.DescriptionCN" />
</el-select>
<el-button type="primary" size="mini" style="margin-right: 10px" @click="handleOverCope(selectRow)"></el-button>
<el-select v-model="copeParams.DataSourceGuids" multiple collapse-tags filterable placeholder="拷贝对象" clearable size="small">
<el-option v-for="item of list" v-if="drawer_cfg.drawerChild && item.ConfigType === 'M' && item.ObjectTypeId === selectRow.ObjectTypeId && item.OptTypeId && item.ChildrenTypeId " :value="item.Id" :label="item.Description" />
<el-option v-for="item of list" v-if="drawer_cfg.drawerChild && item.ConfigType === 'M' && item.ObjectTypeId === selectRow.ObjectTypeId && item.OptTypeId && item.ChildrenTypeId " :value="item.Id" :label="item.DescriptionCN" />
</el-select>
<el-button type="primary" size="mini" @click="handleCope(selectRow)"></el-button>
<el-button type="primary" size="mini" @click="handleAdd(selectRow)"></el-button>
@ -668,6 +668,12 @@
<el-table-column prop="TrialConfigRelyFieldName" label="依赖字段" min-width="120px" :show-overflow-tooltip="true" />
<el-table-column label="操作" align="center" min-width="180" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleCopyData(scope.row)"
>复制</el-button>
<el-button
size="mini"
type="text"
@ -1146,6 +1152,16 @@ export default {
this.title = '修改'
this.rowDrop2()
},
handleCopyData (row) {
this.$confirm('确定复制该条记录到当前稽查下吗?').then(() => {
let params = {...row}
delete params.Id
addOrUpdateFrontAuditConfig(params).then(() => {
this.$message.success(this.$t('common:message:savedSuccessfully'))
this.getList()
})
})
},
/** 提交按钮 */
submitForm: function() {
this.$refs['form'].validate(valid => {

View File

@ -125,18 +125,17 @@ export default {
},
//
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
deleteDictionary(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
this.$store.dispatch('global/setDictionary', {})
}
})

View File

@ -239,18 +239,17 @@ export default {
},
//
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
deleteEmailNoticeConfig(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
})
})

View File

@ -139,11 +139,10 @@ export default {
},
// CRO
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -152,7 +151,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => {
this.loading = false

View File

@ -8,12 +8,15 @@
label-width="170px"
>
<div class="base-dialog-body">
<el-form-item label="Hospital CN: " prop="SiteId">
<el-select v-model="form.SiteId" style="width: 100%" filterable @change="siteChange">
<el-form-item label="Site: ">
<el-select v-model="form.SiteId" style="width: 100%" clearable filterable @change="siteChange">
<el-option v-for="item of siteList" :value="item.Id" :key="item.Id" :label="item.SiteName">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="Hospital CN: " prop="HospitalNameCN">
<el-input v-model="form.HospitalNameCN" />
</el-form-item>
<el-form-item label="Hospital EN: " prop="HospitalName">
<el-input v-model="form.HospitalName" />
</el-form-item>
@ -88,9 +91,7 @@ export default {
},
siteList: [],
rules: {
SiteId: [{ required: true, message: 'Please specify', trigger: 'blur' },
{ max: 50, message: 'The maximum length is 50' }],
HospitalName: [{ required: true, message: 'Please specify', trigger: 'blur' }, { max: 50, message: 'The maximum length is 50' }],
HospitalNameCN: [{ required: true, message: 'Please specify', trigger: 'blur' }, { max: 50, message: 'The maximum length is 50' }],
UniversityAffiliated: [{ max: 100, message: 'The maximum length is 100' }],
UniversityAffiliatedCN: [{ max: 100, message: 'The maximum length is 100' }],
Country: [{ required: true, message: 'Please specify', trigger: 'blur' },
@ -116,7 +117,8 @@ export default {
this.siteList.forEach(o => {
if (o.Id === v) {
this.form.CityCN = o.City
this.form.HospitalNameCN = o.SiteName
this.form.HospitalNameCN = o.SiteNameCN
this.form.HospitalName = o.SiteName
this.form.ProvinceCN = o.Province
this.form.CountryCN = o.Country
}

View File

@ -1,256 +1,255 @@
<template>
<box-content>
<div class="search">
<el-form :inline="true" size="small" class="base-search-form">
<el-form-item label="Hospital:">
<el-input v-model="searchData.HospitalName" style="width:100px;" />
</el-form-item>
<el-form-item label="Province:">
<el-input v-model="searchData.Province" style="width:100px;" />
</el-form-item>
<el-form-item label="City:">
<el-input v-model="searchData.City" style="width:100px;" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleSearch">Search</el-button>
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">Reset</el-button>
</el-form-item>
</el-form>
<span style="margin-left:auto;">
<el-button
size="small"
type="primary"
style="margin-left:auto;"
icon="el-icon-plus"
@click="handleAddHospital"
>New</el-button>
</span>
</div>
<!-- hospital列表 -->
<el-table
v-loading="loading"
v-adaptive="{bottomOffset:60}"
:data="list"
stripe
height="100"
@sort-change="handleSortByColumn"
>
<el-table-column type="index" width="40" />
<el-table-column
prop="HospitalName"
label="Hospital"
min-width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="HospitalNameCN"
label="Hospital CN"
min-width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="UniversityAffiliated"
label="University Affiliated"
min-width="170"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="UniversityAffiliatedCN"
label="University Affiliated CN"
min-width="170"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="Country"
label="Country"
width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CountryCN"
label="Country CN"
width="140"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="Province"
label="Province"
width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="ProvinceCN"
label="Province CN"
width="140"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="City"
label="City"
width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CityCN"
label="City CN"
width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column label="Action" width="150">
<template slot-scope="scope">
<el-button
circle
icon="el-icon-edit-outline"
title="编辑"
@click="handleEdit(scope.row)"
/>
<el-button
circle
icon="el-icon-delete"
title="删除"
@click="handleDelete(scope.row)"
/>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="getList" />
<el-dialog
v-if="editDialog.visible"
:visible.sync="editDialog.visible"
:close-on-click-modal="false"
:title="editDialog.title"
width="600px"
custom-class="base-dialog-wrapper"
>
<hospital-form v-if="editDialog.visible" :data="rowData" @close="close" @getList="getList" />
</el-dialog>
</box-content>
</template>
<script>
import { getHospitalPageList, deleteHospital } from '@/api/dictionary'
import BoxContent from '@/components/BoxContent'
import Pagination from '@/components/Pagination'
import HospitalForm from './HospitalForm'
const searchDataDefault = () => {
return {
HospitalName: '',
Province: '',
City: '',
PageIndex: 1,
PageSize: 20,
Asc: true,
SortField: ''
}
}
export default {
name: 'Hospitals',
components: { BoxContent, Pagination, HospitalForm },
data() {
return {
searchData: searchDataDefault(),
editDialog: { visible: false, title: '' },
list: [],
total: 0,
loading: false,
rowData: {}
}
},
mounted() {
this.getList()
},
methods: {
//
getList() {
this.loading = true
getHospitalPageList(this.searchData).then(res => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}).catch(() => {
this.loading = false
})
},
//
handleAddHospital() {
this.rowData = {}
this.editDialog.title = 'Add'
this.editDialog.visible = true
},
//
handleEdit(row) {
this.rowData = row
this.editDialog.title = 'Edit'
this.editDialog.visible = true
},
//
handleDelete(row) {
this.$confirm('Sure to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
deleteHospital(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
}
this.loading = false
}).catch(() => {
this.loading = false
})
})
},
//
handleSearch() {
this.searchData.PageIndex = 1
this.getList()
},
//
handleReset() {
this.searchData = searchDataDefault()
this.getList()
},
//
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
},
//
close() {
this.editDialog.visible = false
}
}
}
</script>
<style lang="scss" scoped>
.hospitals{
height: 100%;
}
</style>
<template>
<box-content>
<div class="search">
<el-form :inline="true" size="small" class="base-search-form">
<el-form-item label="Hospital:">
<el-input v-model="searchData.HospitalName" style="width:100px;" />
</el-form-item>
<el-form-item label="Province:">
<el-input v-model="searchData.Province" style="width:100px;" />
</el-form-item>
<el-form-item label="City:">
<el-input v-model="searchData.City" style="width:100px;" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleSearch">Search</el-button>
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">Reset</el-button>
</el-form-item>
</el-form>
<span style="margin-left:auto;">
<el-button
size="small"
type="primary"
style="margin-left:auto;"
icon="el-icon-plus"
@click="handleAddHospital"
>New</el-button>
</span>
</div>
<!-- hospital列表 -->
<el-table
v-loading="loading"
v-adaptive="{bottomOffset:60}"
:data="list"
stripe
height="100"
@sort-change="handleSortByColumn"
>
<el-table-column type="index" width="40" />
<el-table-column
prop="HospitalName"
label="Hospital"
min-width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="HospitalNameCN"
label="Hospital CN"
min-width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="UniversityAffiliated"
label="University Affiliated"
min-width="170"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="UniversityAffiliatedCN"
label="University Affiliated CN"
min-width="170"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="Country"
label="Country"
width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CountryCN"
label="Country CN"
width="140"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="Province"
label="Province"
width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="ProvinceCN"
label="Province CN"
width="140"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="City"
label="City"
width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CityCN"
label="City CN"
width="120"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column label="Action" width="150">
<template slot-scope="scope">
<el-button
circle
icon="el-icon-edit-outline"
title="编辑"
@click="handleEdit(scope.row)"
/>
<el-button
circle
icon="el-icon-delete"
title="删除"
@click="handleDelete(scope.row)"
/>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="getList" />
<el-dialog
v-if="editDialog.visible"
:visible.sync="editDialog.visible"
:close-on-click-modal="false"
:title="editDialog.title"
width="600px"
custom-class="base-dialog-wrapper"
>
<hospital-form v-if="editDialog.visible" :data="rowData" @close="close" @getList="getList" />
</el-dialog>
</box-content>
</template>
<script>
import { getHospitalPageList, deleteHospital } from '@/api/dictionary'
import BoxContent from '@/components/BoxContent'
import Pagination from '@/components/Pagination'
import HospitalForm from './HospitalForm'
const searchDataDefault = () => {
return {
HospitalName: '',
Province: '',
City: '',
PageIndex: 1,
PageSize: 20,
Asc: true,
SortField: ''
}
}
export default {
name: 'Hospitals',
components: { BoxContent, Pagination, HospitalForm },
data() {
return {
searchData: searchDataDefault(),
editDialog: { visible: false, title: '' },
list: [],
total: 0,
loading: false,
rowData: {}
}
},
mounted() {
this.getList()
},
methods: {
//
getList() {
this.loading = true
getHospitalPageList(this.searchData).then(res => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}).catch(() => {
this.loading = false
})
},
//
handleAddHospital() {
this.rowData = {}
this.editDialog.title = 'Add'
this.editDialog.visible = true
},
//
handleEdit(row) {
this.rowData = row
this.editDialog.title = 'Edit'
this.editDialog.visible = true
},
//
handleDelete(row) {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
})
.then(() => {
this.loading = true
deleteHospital(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
this.loading = false
}).catch(() => {
this.loading = false
})
})
},
//
handleSearch() {
this.searchData.PageIndex = 1
this.getList()
},
//
handleReset() {
this.searchData = searchDataDefault()
this.getList()
},
//
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
},
//
close() {
this.editDialog.visible = false
}
}
}
</script>
<style lang="scss" scoped>
.hospitals{
height: 100%;
}
</style>

View File

@ -213,11 +213,10 @@ export default {
},
// Site
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -227,7 +226,7 @@ export default {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$store.dispatch('global/setSite', {})
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => {
this.loading = false

View File

@ -139,11 +139,10 @@ export default {
},
// Sponsor
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -152,7 +151,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => {
this.loading = false

View File

@ -182,11 +182,10 @@ export default {
})
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -195,7 +194,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => { this.loading = false })
})

View File

@ -154,11 +154,10 @@ export default {
})
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -167,7 +166,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => { this.loading = false })
})

View File

@ -183,11 +183,10 @@ export default {
})
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -196,7 +195,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => { this.loading = false })
})

View File

@ -182,11 +182,10 @@ export default {
})
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -195,7 +194,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => { this.loading = false })
})

View File

@ -153,11 +153,10 @@ export default {
})
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -166,7 +165,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => { this.loading = false })
})

View File

@ -206,11 +206,10 @@ export default {
})
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -219,7 +218,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => { this.loading = false })
})

View File

@ -183,11 +183,10 @@ export default {
})
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -196,7 +195,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => { this.loading = false })
})

View File

@ -122,11 +122,10 @@ export default {
})
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -135,7 +134,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => { this.loading = false })
})

View File

@ -1,162 +1,161 @@
<template>
<box-content>
<!-- 搜索框 -->
<div class="search">
<span style="margin-left:auto;">
<el-button
type="primary"
size="mini"
@click="handleAdd"
>
Add
</el-button>
</span>
</div>
<!-- 受试者列表 -->
<el-table
v-loading="loading"
v-adaptive="{bottomOffset:45}"
:data="list"
stripe
height="100"
style="width:100%"
>
<el-table-column type="index" width="40" />
<el-table-column
prop="Code"
label="编号"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
prop="Name"
label="场景类型"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="Value"
label="签名内容(EN)"
show-overflow-tooltip
/>
<el-table-column
prop="ValueCN"
label="签名内容(CN)"
show-overflow-tooltip
/>
<el-table-column
prop="UpdateTime"
label="更新时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CreateTime"
label="创建时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column label="Action" width="200" fixed="right">
<template slot-scope="scope">
<el-button
type="text"
@click="handleEdit(scope.row)"
>
Edit
</el-button>
<el-button type="text" @click="handleDelete(scope.row)">Delete</el-button>
</template>
</el-table-column>
</el-table>
<!-- 场景配置 -->
<el-dialog
v-if="editVisible"
:visible.sync="editVisible"
:close-on-click-modal="false"
:title="title"
width="700px"
append-to-body
custom-class="base-dialog-wrapper"
>
<SceneConfigForm :parent-id="parentId" :data="rowData" @closeDialog="closeDialog" @getList="getList" />
</el-dialog>
</box-content>
</template>
<script>
import { getChildList, deleteSystemBasicData } from '@/api/dictionary'
import BoxContent from '@/components/BoxContent'
import SceneConfigForm from './SceneConfigForm'
export default {
name: 'SignTemplate',
components: { BoxContent, SceneConfigForm },
props: {
parentId: {
type: String,
required: true
}
},
data() {
return {
loading: false,
list: [],
rowData: {},
title: '',
editVisible: false
}
},
mounted() {
this.getList()
},
methods: {
//
getList() {
this.loading = true
getChildList(this.parentId).then(res => {
this.loading = false
this.list = res.Result
}).catch(() => { this.loading = false })
},
//
handleAdd() {
this.rowData = {}
this.title = 'Add'
this.editVisible = true
},
//
handleEdit(row) {
this.rowData = { ...row }
this.title = 'Edit'
this.editVisible = true
},
//
handleDelete(row) {
this.$confirm('Sure to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
deleteSystemBasicData(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
}
})
})
},
//
closeDialog() {
this.editVisible = false
}
}
}
</script>
<template>
<box-content>
<!-- 搜索框 -->
<div class="search">
<span style="margin-left:auto;">
<el-button
type="primary"
size="mini"
@click="handleAdd"
>
Add
</el-button>
</span>
</div>
<!-- 受试者列表 -->
<el-table
v-loading="loading"
v-adaptive="{bottomOffset:45}"
:data="list"
stripe
height="100"
style="width:100%"
>
<el-table-column type="index" width="40" />
<el-table-column
prop="Code"
label="编号"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
prop="Name"
label="场景类型"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="Value"
label="签名内容(EN)"
show-overflow-tooltip
/>
<el-table-column
prop="ValueCN"
label="签名内容(CN)"
show-overflow-tooltip
/>
<el-table-column
prop="UpdateTime"
label="更新时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CreateTime"
label="创建时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column label="Action" width="200" fixed="right">
<template slot-scope="scope">
<el-button
type="text"
@click="handleEdit(scope.row)"
>
Edit
</el-button>
<el-button type="text" @click="handleDelete(scope.row)">Delete</el-button>
</template>
</el-table-column>
</el-table>
<!-- 场景配置 -->
<el-dialog
v-if="editVisible"
:visible.sync="editVisible"
:close-on-click-modal="false"
:title="title"
width="700px"
append-to-body
custom-class="base-dialog-wrapper"
>
<SceneConfigForm :parent-id="parentId" :data="rowData" @closeDialog="closeDialog" @getList="getList" />
</el-dialog>
</box-content>
</template>
<script>
import { getChildList, deleteSystemBasicData } from '@/api/dictionary'
import BoxContent from '@/components/BoxContent'
import SceneConfigForm from './SceneConfigForm'
export default {
name: 'SignTemplate',
components: { BoxContent, SceneConfigForm },
props: {
parentId: {
type: String,
required: true
}
},
data() {
return {
loading: false,
list: [],
rowData: {},
title: '',
editVisible: false
}
},
mounted() {
this.getList()
},
methods: {
//
getList() {
this.loading = true
getChildList(this.parentId).then(res => {
this.loading = false
this.list = res.Result
}).catch(() => { this.loading = false })
},
//
handleAdd() {
this.rowData = {}
this.title = 'Add'
this.editVisible = true
},
//
handleEdit(row) {
this.rowData = { ...row }
this.title = 'Edit'
this.editVisible = true
},
//
handleDelete(row) {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
})
.then(() => {
deleteSystemBasicData(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
})
})
},
//
closeDialog() {
this.editVisible = false
}
}
}
</script>

View File

@ -1,229 +1,228 @@
<template>
<box-content>
<!-- 搜索框 -->
<div class="search">
<el-form :inline="true" size="mini" class="base-search-form">
<el-form-item label="编号:">
<el-input v-model="searchData.Code" style="width:100px;" />
</el-form-item>
<el-form-item label="模板:">
<el-input v-model="searchData.Name" style="width:100px;" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleReset">Reset</el-button>
<el-button type="primary" @click="handleSearch">Search</el-button>
</el-form-item>
</el-form>
<span style="margin-left:auto;">
<el-button
type="primary"
size="mini"
@click="handleAdd"
>
New
</el-button>
</span>
</div>
<!-- 受试者列表 -->
<el-table
v-loading="loading"
v-adaptive="{bottomOffset:45}"
:data="list"
stripe
height="100"
style="width:100%"
@sort-change="handleSortByColumn"
>
<el-table-column type="index" width="40" />
<el-table-column
prop="Code"
label="Code"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
prop="Name"
label="模板"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="Value"
label="签名内容(EN)"
show-overflow-tooltip
/>
<el-table-column
prop="ValueCN"
label="签名内容(CN)"
show-overflow-tooltip
/>
<el-table-column
prop="UpdateTime"
label="更新时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CreateTime"
label="创建时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column label="Action" width="200" fixed="right">
<template slot-scope="scope">
<el-button
type="text"
@click="handleEdit(scope.row)"
>
Edit
</el-button>
<el-button
type="text"
@click="handleConfig(scope.row)"
>
场景配置
</el-button>
<el-button type="text" @click="handleDelete(scope.row)">Delete</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="getList" />
<!-- 新增编辑 -->
<el-dialog
v-if="editVisible"
:visible.sync="editVisible"
:close-on-click-modal="false"
:title="title"
width="700px"
custom-class="base-dialog-wrapper"
>
<SignTemplateForm :data="rowData" @closeDialog="closeDialog" @getList="getList" />
</el-dialog>
<!-- 场景配置 -->
<el-dialog
v-if="configVisible"
:visible.sync="configVisible"
title="场景配置"
:fullscreen="true"
append-to-body
custom-class="base-dialog-wrapper"
>
<SceneList :parent-id="rowData.Id" @closeDialog="closeDialog" />
</el-dialog>
</box-content>
</template>
<script>
import { getSystemBasicDataList, deleteSystemBasicData } from '@/api/dictionary'
import BoxContent from '@/components/BoxContent'
import SignTemplateForm from './components/SignTemplateForm'
import SceneList from './components/SceneList'
import Pagination from '@/components/Pagination'
const searchDataDefault = () => {
return {
Code: '',
Name: '',
PageIndex: 1,
PageSize: 20
}
}
export default {
name: 'SignTemplate',
components: { BoxContent, SignTemplateForm, Pagination, SceneList },
data() {
return {
searchData: searchDataDefault(),
loading: false,
list: [],
total: 0,
rowData: {},
title: '',
editVisible: false,
configVisible: false
}
},
mounted() {
this.getList()
},
methods: {
//
getList() {
this.loading = true
getSystemBasicDataList(this.searchData).then(res => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}).catch(() => { this.loading = false })
},
//
handleAdd() {
this.rowData = {}
this.title = 'Add'
this.editVisible = true
},
//
handleEdit(row) {
this.rowData = { ...row }
this.title = 'Edit'
this.editVisible = true
},
//
handleDelete(row) {
this.$confirm('Sure to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
deleteSystemBasicData(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
}
})
})
},
//
handleConfig(row) {
this.rowData = { ...row }
this.configVisible = true
},
//
handleSearch() {
this.searchData.PageIndex = 1
this.getList()
},
//
handleReset() {
this.searchData = searchDataDefault()
this.getList()
},
//
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
},
//
closeDialog() {
this.editVisible = false
}
}
}
</script>
<template>
<box-content>
<!-- 搜索框 -->
<div class="search">
<el-form :inline="true" size="mini" class="base-search-form">
<el-form-item label="编号:">
<el-input v-model="searchData.Code" style="width:100px;" />
</el-form-item>
<el-form-item label="模板:">
<el-input v-model="searchData.Name" style="width:100px;" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleReset">Reset</el-button>
<el-button type="primary" @click="handleSearch">Search</el-button>
</el-form-item>
</el-form>
<span style="margin-left:auto;">
<el-button
type="primary"
size="mini"
@click="handleAdd"
>
New
</el-button>
</span>
</div>
<!-- 受试者列表 -->
<el-table
v-loading="loading"
v-adaptive="{bottomOffset:45}"
:data="list"
stripe
height="100"
style="width:100%"
@sort-change="handleSortByColumn"
>
<el-table-column type="index" width="40" />
<el-table-column
prop="Code"
label="Code"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
prop="Name"
label="模板"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="Value"
label="签名内容(EN)"
show-overflow-tooltip
/>
<el-table-column
prop="ValueCN"
label="签名内容(CN)"
show-overflow-tooltip
/>
<el-table-column
prop="UpdateTime"
label="更新时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CreateTime"
label="创建时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column label="Action" width="200" fixed="right">
<template slot-scope="scope">
<el-button
type="text"
@click="handleEdit(scope.row)"
>
Edit
</el-button>
<el-button
type="text"
@click="handleConfig(scope.row)"
>
场景配置
</el-button>
<el-button type="text" @click="handleDelete(scope.row)">Delete</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="getList" />
<!-- 新增编辑 -->
<el-dialog
v-if="editVisible"
:visible.sync="editVisible"
:close-on-click-modal="false"
:title="title"
width="700px"
custom-class="base-dialog-wrapper"
>
<SignTemplateForm :data="rowData" @closeDialog="closeDialog" @getList="getList" />
</el-dialog>
<!-- 场景配置 -->
<el-dialog
v-if="configVisible"
:visible.sync="configVisible"
title="场景配置"
:fullscreen="true"
append-to-body
custom-class="base-dialog-wrapper"
>
<SceneList :parent-id="rowData.Id" @closeDialog="closeDialog" />
</el-dialog>
</box-content>
</template>
<script>
import { getSystemBasicDataList, deleteSystemBasicData } from '@/api/dictionary'
import BoxContent from '@/components/BoxContent'
import SignTemplateForm from './components/SignTemplateForm'
import SceneList from './components/SceneList'
import Pagination from '@/components/Pagination'
const searchDataDefault = () => {
return {
Code: '',
Name: '',
PageIndex: 1,
PageSize: 20
}
}
export default {
name: 'SignTemplate',
components: { BoxContent, SignTemplateForm, Pagination, SceneList },
data() {
return {
searchData: searchDataDefault(),
loading: false,
list: [],
total: 0,
rowData: {},
title: '',
editVisible: false,
configVisible: false
}
},
mounted() {
this.getList()
},
methods: {
//
getList() {
this.loading = true
getSystemBasicDataList(this.searchData).then(res => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}).catch(() => { this.loading = false })
},
//
handleAdd() {
this.rowData = {}
this.title = 'Add'
this.editVisible = true
},
//
handleEdit(row) {
this.rowData = { ...row }
this.title = 'Edit'
this.editVisible = true
},
//
handleDelete(row) {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
})
.then(() => {
deleteSystemBasicData(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
})
})
},
//
handleConfig(row) {
this.rowData = { ...row }
this.configVisible = true
},
//
handleSearch() {
this.searchData.PageIndex = 1
this.getList()
},
//
handleReset() {
this.searchData = searchDataDefault()
this.getList()
},
//
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
},
//
closeDialog() {
this.editVisible = false
}
}
}
</script>

View File

@ -162,11 +162,10 @@ export default {
})
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -175,7 +174,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => { this.loading = false })
})

View File

@ -7,6 +7,7 @@
<el-button
size="mini"
type="primary"
:disabled="isCompleteConfig"
@click="handleAdd"
style="margin-right: 10px;"
>
@ -59,12 +60,13 @@
show-overflow-tooltip
>
<template slot-scope="scope">
<el-button size="small" type="primary" @click="openChildren(scope.row)">
<el-button size="small" :disabled="isCompleteConfig" type="primary" @click="openChildren(scope.row)">
配置
</el-button>
<el-button
type="danger"
size="small"
:disabled="isCompleteConfig"
@click="handleDelete(scope.row)"
>
删除
@ -151,6 +153,10 @@ export default {
criterionId: {
type: String,
required: true
},
isCompleteConfig: {
type: Boolean,
required: true
}
},
components: {

View File

@ -19,6 +19,52 @@
/>
</el-select>
</el-form-item>
<el-form-item
v-if="form.Type === 'group'"
label="分组名称"
prop="GroupName"
>
<el-input v-model="form.GroupName" />
</el-form-item>
<el-form-item
label="分组标识"
v-if="form.Type === 'group'"
prop="GroupClassify"
>
<el-select
v-model="form.GroupClassify"
clearable
>
<el-option
v-for="item of groupClassifyList"
:key="item.Id"
:value="parseInt(item.Code)"
:label="item.ValueCN"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="form.Type === 'group'"
label="分组名称EN"
prop="GroupEnName"
>
<el-input v-model="form.GroupEnName" />
</el-form-item>
<el-form-item
v-if="form.Type !== 'group'"
label="问题名称"
prop="QuestionName"
>
<el-input v-model="form.QuestionName" />
</el-form-item>
<el-form-item
v-if="form.Type !== 'group'"
label="问题名称EN"
prop="QuestionEnName"
>
<el-input v-model="form.QuestionEnName" />
</el-form-item>
<!-- 数值类型 -->
<el-form-item
v-if="form.Type === 'number' || form.Type === 'calculation'"
@ -75,52 +121,6 @@
/>
</el-select>
</el-form-item>
<el-form-item
v-if="form.Type === 'group'"
label="分组名称"
prop="GroupName"
>
<el-input v-model="form.GroupName" />
</el-form-item>
<el-form-item
label="分组标识"
prop="GroupClassify"
>
<el-select
v-model="form.GroupClassify"
clearable
>
<el-option
v-for="item of groupClassifyList"
:key="item.Id"
:value="parseInt(item.Code)"
:label="item.ValueCN"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="form.Type === 'group'"
label="分组名称EN"
prop="GroupEnName"
>
<el-input v-model="form.GroupEnName" />
</el-form-item>
<el-form-item
v-if="form.Type !== 'group'"
label="问题名称"
prop="QuestionName"
>
<el-input v-model="form.QuestionName" />
</el-form-item>
<el-form-item
v-if="form.Type !== 'group'"
label="问题名称EN"
prop="QuestionEnName"
>
<el-input v-model="form.QuestionEnName" />
</el-form-item>
<!-- <el-form-item
v-if="form.Type === 'select' || form.Type === 'radio'"
label="选项"
@ -170,7 +170,7 @@
placeholder="选项请用‘|’分割多个选项"
/>
</el-form-item>
<el-form-item label="问题分类">
<el-form-item label="问题分类" v-if="form.Type !== 'group'">
<!-- <el-radio-group v-model="form.QuestionClassify">
<el-radio v-for="item of $d.QuestionClassify" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group> -->
@ -406,6 +406,7 @@
</el-form-item>
<el-form-item
label="问题标识"
v-if="form.Type !== 'group'"
prop="QuestionType"
>
<el-select

View File

@ -1,7 +1,7 @@
<template>
<div class="criterion-config">
<el-tabs v-model="activeName">
<el-tab-pane label="访视阅片" name="0">
<el-tab-pane :label="'访视阅片'" name="0">
<div class="search-form" style="display:flex;justify-content: space-between;">
<el-form :inline="true" size="mini" class="base-search-form">
<el-form-item label="名称">
@ -18,7 +18,7 @@
:disabled="list.length === 0"
size="mini"
type="primary"
@click="preview.visible = true"
@click="handlePreview"
>
预览
</el-button>
@ -200,7 +200,7 @@
v-if="addOrEdit.visible"
:visible.sync="addOrEdit.visible"
:close-on-click-modal="false"
:title="addOrEdit.title"
:title="`${addOrEdit.title}`"
width="600px"
append-to-body
custom-class="base-dialog-wrapper"
@ -303,6 +303,9 @@ export default {
this.getList()
},
methods: {
handlePreview() {
window.open(`/ecrfPreview?SystemReadingCriterionId=${this.criterionId}&lang=${this.$i18n.locale}`)
},
getList() {
this.loading = true
this.searchData.ReadingQuestionCriterionSystemId = this.criterionId

View File

@ -104,6 +104,7 @@
<el-button
type="danger"
size="mini"
:disabled="scope.row.IsCompleteConfig"
@click="handleDelete(scope.row)"
>
删除
@ -133,7 +134,7 @@
<el-dialog
v-if="configVisible"
title="eCRF"
:title="'eCRF' + `(${rowData.CriterionName})`"
:visible.sync="configVisible"
:close-on-click-modal="false"
:fullscreen="true"
@ -145,7 +146,7 @@
<el-dialog
v-if="configBaseDataVisible"
title="基础数据配置"
:title="'基础数据配置' + `(${rowData.CriterionName})`"
:visible.sync="configBaseDataVisible"
:close-on-click-modal="false"
:fullscreen="true"
@ -190,6 +191,7 @@ export default {
addDialog: { title: '', visible: false }
}
},
mounted() {
this.getList()
},

View File

@ -137,11 +137,10 @@ export default {
})
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -150,7 +149,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => { this.loading = false })
})

View File

@ -1,109 +1,109 @@
<template>
<div v-loading="loading" style="min-height:400px;">
<el-form
v-if="isRender"
ref="questions"
size="small"
:model="questionForm"
>
<CriterionFormItem
v-for="question of questions"
:key="question.Id"
:question="question"
:question-form="questionForm"
:reading-task-state="readingTaskState"
:criterion-id="criterionId"
@resetFormItemData="resetFormItemData"
@setFormItemData="setFormItemData"
/>
</el-form>
</div>
</template>
<script>
import { getSystemReadingQuestion } from '@/api/dictionary'
import CriterionFormItem from './CriterionFormItem'
export default {
name: 'EcrfPreview',
components: {
CriterionFormItem
},
props: {
criterionId: {
type: String,
required: true
}
},
data() {
return {
loading: false,
questions: [],
questionForm: {},
publicQuestions: [],
isRender: false,
readingTaskState: 0,
activeName: 0
}
},
mounted() {
this.getQuestions()
},
methods: {
getQuestions() {
this.loading = true
var param = {
id: this.criterionId
}
getSystemReadingQuestion(param).then(res => {
res.Result.SinglePage.map((v) => {
if (v.Type === 'group' && v.Childrens.length === 0) return
if (!v.IsPage && v.Type !== 'group' && v.Type !== 'summary') {
this.$set(this.questionForm, v.Id, v.DefaultValue)
}
if (v.Childrens && v.Childrens.length > 0) {
this.setChild(v.Childrens)
}
})
this.questions = res.Result.SinglePage
this.isRender = true
this.loading = false
}).catch(() => { this.loading = false })
},
setChild(obj) {
obj.forEach(i => {
if (i.Type !== 'group' && i.Type !== 'summary' && i.Id) {
this.$set(this.questionForm, i.Id, '')
}
if (i.Childrens && i.Childrens.length > 0) {
this.setChild(i.Childrens)
}
})
},
resetFormItemData(v) {
this.questionForm[v] = ''
},
setFormItemData(obj) {
this.$set(this.questionForm, obj.key, obj.val)
}
}
}
</script>
<style lang="scss" scoped>
::-webkit-scrollbar {
width: 7px;
height: 7px;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
background: #d0d0d0;
}
.tabContent{
height:300px;
overflow-y: auto;
}
</style>
<template>
<div v-loading="loading" style="min-height:400px;">
<el-form
v-if="isRender"
ref="questions"
size="small"
:model="questionForm"
>
<CriterionFormItem
v-for="question of questions"
:key="question.Id"
:question="question"
:question-form="questionForm"
:reading-task-state="readingTaskState"
:criterion-id="criterionId"
@resetFormItemData="resetFormItemData"
@setFormItemData="setFormItemData"
/>
</el-form>
</div>
</template>
<script>
import { getSystemReadingQuestion } from '@/api/dictionary'
import CriterionFormItem from './CriterionFormItem'
import {mapMutations} from "vuex";
export default {
name: 'EcrfPreview',
components: {
CriterionFormItem
},
data() {
return {
loading: false,
questions: [],
questionForm: {},
publicQuestions: [],
isRender: false,
readingTaskState: 0,
activeName: 0
}
},
mounted() {
this.$i18n.locale = this.$route.query.lang
this.setLanguage(this.$route.query.lang)
this.$updateDictionary()
this.criterionId = this.$route.query.SystemReadingCriterionId
this.getQuestions()
},
methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }),
getQuestions() {
this.loading = true
var param = {
id: this.criterionId
}
getSystemReadingQuestion(param).then(res => {
res.Result.SinglePage.map((v) => {
if (v.Type === 'group' && v.Childrens.length === 0) return
if (!v.IsPage && v.Type !== 'group' && v.Type !== 'summary') {
this.$set(this.questionForm, v.Id, v.DefaultValue)
}
if (v.Childrens && v.Childrens.length > 0) {
this.setChild(v.Childrens)
}
})
this.questions = res.Result.SinglePage
this.isRender = true
this.loading = false
}).catch(() => { this.loading = false })
},
setChild(obj) {
obj.forEach(i => {
if (i.Type !== 'group' && i.Type !== 'summary' && i.Id) {
this.$set(this.questionForm, i.Id, '')
}
if (i.Childrens && i.Childrens.length > 0) {
this.setChild(i.Childrens)
}
})
},
resetFormItemData(v) {
this.questionForm[v] = ''
},
setFormItemData(obj) {
this.$set(this.questionForm, obj.key, obj.val)
}
}
}
</script>
<style lang="scss" scoped>
::-webkit-scrollbar {
width: 7px;
height: 7px;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
background: #d0d0d0;
}
.tabContent{
height:300px;
overflow-y: auto;
}
</style>

View File

@ -104,7 +104,7 @@
v-if="config.configType === 2"
v-loading="loading"
ref="multipleTable"
:data="$d && $d.GlobalAssessType"
:data="GlobalAssessType"
stripe
@selection-change="handleSelectionChange"
>
@ -165,7 +165,7 @@
<script>
import BaseModel from '@/components/BaseModel'
import { getAssessType, setAssessType, setDictionaryBaseLineUse, setDictionaryFollowVisitUse, setSystemGlobalInfo, getSystemGlobalInfo } from '@/api/dictionary'
import { getCriterionDictionary, getAssessType, setAssessType, setDictionaryBaseLineUse, setDictionaryFollowVisitUse, setSystemGlobalInfo, getSystemGlobalInfo } from '@/api/dictionary'
export default {
props: {
data: {
@ -192,7 +192,8 @@ export default {
IsMustGlobalReading: false,
form: {
IsMustGlobalReading: false
}
},
GlobalAssessType: []
}
},
beforecreate() {
@ -204,8 +205,17 @@ export default {
mounted() {
this.getList()
this.getSystemGlobalInfo()
this.getCriterionDictionary()
},
methods: {
getCriterionDictionary() {
getCriterionDictionary({
ReadingCriterionId: this.criterionId,
DictionaryCode: 'GlobalAssessType'
}).then(res => {
this.GlobalAssessType = res.Result.GlobalAssessType
})
},
getSystemGlobalInfo() {
getSystemGlobalInfo({
SystemCriterionId: this.criterionId

View File

@ -72,7 +72,7 @@
v-loading="loading"
style="width: 100%"
ref="multipleTable"
:data="$d.OncologyAssessType"
:data="OncologyAssessType"
stripe
@selection-change="handleSelectionChange"
>
@ -81,13 +81,13 @@
width="55">
</el-table-column>
<el-table-column
prop="raw.ValueCN"
prop="ValueCN"
label="中文值"
show-overflow-tooltip
>
</el-table-column>
<el-table-column
prop="raw.Value"
prop="Value"
label="英文值"
show-overflow-tooltip
>
@ -105,7 +105,7 @@
<script>
import BaseModel from '@/components/BaseModel'
import { getSystemOncologyInfo, setSystemOncologyInfo } from '@/api/dictionary'
import { getSystemOncologyInfo, setSystemOncologyInfo, getCriterionDictionary } from '@/api/dictionary'
export default {
props: {
data: {
@ -132,13 +132,23 @@ export default {
preview: { visible: false, title: 'eCRF预览' },
config: { visible: false, title: '肿瘤学阅片结果', appendToBody: true, width: '600px', configType: 0 },
selectedList: [],
OncologyAssessType: [],
IsOncologyReading: true
}
},
mounted() {
this.getList()
this.getCriterionDictionary()
},
methods: {
getCriterionDictionary() {
getCriterionDictionary({
ReadingCriterionId: this.criterionId,
DictionaryCode: 'OncologyAssessType'
}).then(res => {
this.OncologyAssessType = res.Result.OncologyAssessType
})
},
toggleSelection(rows) {
console.log(this.$refs.multipleTable)
if (rows) {
@ -173,9 +183,9 @@ export default {
this.config.title = '肿瘤学阅片结果'
this.config.visible = true
this.$nextTick(() => {
var a = this.$d.OncologyAssessType.filter(v => {
var a = this.OncologyAssessType.filter(v => {
return !!this.list.find(v1 => {
return v1.DictionaryId === v.id
return v1.DictionaryId === v.Id
})
})
this.toggleSelection(a)
@ -184,15 +194,15 @@ export default {
},
handleSave() {
this.loading = true
var a = this.$d.OncologyAssessType.filter(v => {
var a = this.OncologyAssessType.filter(v => {
return !!this.list.find(v1 => {
return v1.DictionaryId === v.id
return v1.DictionaryId === v.Id
})
})
var params = {
SystemCriterionId: this.criterionId,
ParentCode: 'OncologyAssessType',
DictionaryIds: this.config.configType === 1 ? a.map(v => v.id) : this.selectedList.map(v => v.id),
DictionaryIds: this.config.configType === 1 ? a.map(v => v.Id) : this.selectedList.map(v => v.Id),
IsSystemCriterion: true,
IsOncologyReading: this.form.IsOncologyReading
}

View File

@ -170,11 +170,10 @@ export default {
})
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -183,7 +182,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => { this.loading = false })
})

View File

@ -217,11 +217,10 @@ export default {
},
//
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading = true
@ -230,7 +229,7 @@ export default {
this.loading = false
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
}).catch(() => { this.loading = false })
})

View File

@ -1,188 +1,187 @@
<template>
<div class="template-wrapper">
<div class="left-wrapper">
<box-content>
<div class="search">
<SearchForm
size="mini"
:that="this"
:search-data="searchData"
:search-form="template_form"
:search-handle="template_handle"
@search="handleSearch"
@reset="handleReset"
/>
<span style="margin-left:auto;">
<el-button type="primary" size="small" style="margin-left:auto;" @click="handleAdd">New</el-button>
<el-button type="primary" size="small" @click="handleSetting">Setting</el-button>
</span>
</div>
<base-table
v-loading="loading"
:columns="template_cols"
:list="list"
:search-data="searchData"
:total="total"
@getList="getList"
@items="handleView"
@edit="handleEdit"
@delete="handleDelete"
@sortByColumn="sortByColumn"
/>
</box-content>
</div>
<div class="right-wrapper">
<div v-if="template.Name">
<span>Name:</span>
<el-input v-model="template.Name" size="small" style="width:150px;" readonly />
</div>
<el-table v-if="template.Name" ref="itemList" v-loading="itemLoading" :data="itmeList" class="table" size="small" @select="onTableSelect">
<el-table-column type="selection" width="50" />
<el-table-column type="index" width="40" />
<el-table-column prop="Name" label="Item" show-overflow-tooltip />
</el-table>
</div>
<template-form v-if="template_model.visible" :data="rowData" @close="closeModel" />
</div>
</template>
<script>
import { getQaTemplateList, deleteQATemplate, getQaTemplateConfigList, configQATemplateItem } from '@/api/dictionary'
import { template_cols, template_form, template_handle, template_model } from './template'
import BoxContent from '@/components/BoxContent'
import SearchForm from '@/components/BaseForm/search-form'
import BaseTable from '@/components/BaseTable'
import TemplateForm from './components/TemplateForm'
import tableMixins from '@/mixins/table'
const searchDataDefault = () => {
return {
Name: '',
PageIndex: 1,
PageSize: 20
}
}
export default {
name: 'TemplateList',
components: { BoxContent, SearchForm, BaseTable, TemplateForm },
mixins: [tableMixins],
data() {
return {
template_cols,
template_form,
template_handle,
template_model,
searchData: searchDataDefault(),
list: [],
total: 0,
loading: false,
rowData: {},
template: {},
itmeList: [],
itemLoading: false
}
},
mounted() {
this.getList()
},
methods: {
getList() {
this.loading = true
getQaTemplateList(this.searchData).then(res => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
this.template = {}
this.itmeList = []
})
},
handleAdd() {
this.rowData = {}
this.template_model.title = 'New'
this.template_model.visible = true
},
handleSetting() {
this.$router.push({ name: 'TemplateOfSetting' })
},
handleEdit(row) {
this.rowData = row
this.template_model.title = 'Edit'
this.template_model.visible = true
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
deleteQATemplate(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
}
})
})
},
handleView(row) {
this.template = row
this.itemLoading = true
getQaTemplateConfigList(row.Id, row.ModalityId).then(res => {
this.itmeList = res.Result
this.itmeList.forEach(val => {
this.$nextTick(
function() {
this.$refs.itemList.toggleRowSelection(val, val.IsSelect)
}.bind(this)
)
})
this.itemLoading = false
})
},
onTableSelect(rows, row) {
const param = {
qaTemplateItemId: row.Id,
qaTemplateId: this.template.Id,
isSelect: rows.indexOf(row) !== -1
}
configQATemplateItem(param).then(res => {
this.$message.success('Updated successfully')
})
},
handleReset() {
this.searchData = searchDataDefault()
this.getList()
this.template = {}
this.itmeList = []
},
closeModel() {
this.template_model.visible = false
this.getList()
}
}
}
</script>
<style lang="scss">
.template-wrapper{
height: 100%;
display: flex;
.left-wrapper{
width: 0;
flex-grow: 4;
border-right: 1px solid #ccc;
}
.right-wrapper{
width: 0;
flex-grow: 3;
padding: 5px;
thead{
.el-table-column--selection{
.cell {
display: none;
}
}
}
}
}
</style>
<template>
<div class="template-wrapper">
<div class="left-wrapper">
<box-content>
<div class="search">
<SearchForm
size="mini"
:that="this"
:search-data="searchData"
:search-form="template_form"
:search-handle="template_handle"
@search="handleSearch"
@reset="handleReset"
/>
<span style="margin-left:auto;">
<el-button type="primary" size="small" style="margin-left:auto;" @click="handleAdd">New</el-button>
<el-button type="primary" size="small" @click="handleSetting">Setting</el-button>
</span>
</div>
<base-table
v-loading="loading"
:columns="template_cols"
:list="list"
:search-data="searchData"
:total="total"
@getList="getList"
@items="handleView"
@edit="handleEdit"
@delete="handleDelete"
@sortByColumn="sortByColumn"
/>
</box-content>
</div>
<div class="right-wrapper">
<div v-if="template.Name">
<span>Name:</span>
<el-input v-model="template.Name" size="small" style="width:150px;" readonly />
</div>
<el-table v-if="template.Name" ref="itemList" v-loading="itemLoading" :data="itmeList" class="table" size="small" @select="onTableSelect">
<el-table-column type="selection" width="50" />
<el-table-column type="index" width="40" />
<el-table-column prop="Name" label="Item" show-overflow-tooltip />
</el-table>
</div>
<template-form v-if="template_model.visible" :data="rowData" @close="closeModel" />
</div>
</template>
<script>
import { getQaTemplateList, deleteQATemplate, getQaTemplateConfigList, configQATemplateItem } from '@/api/dictionary'
import { template_cols, template_form, template_handle, template_model } from './template'
import BoxContent from '@/components/BoxContent'
import SearchForm from '@/components/BaseForm/search-form'
import BaseTable from '@/components/BaseTable'
import TemplateForm from './components/TemplateForm'
import tableMixins from '@/mixins/table'
const searchDataDefault = () => {
return {
Name: '',
PageIndex: 1,
PageSize: 20
}
}
export default {
name: 'TemplateList',
components: { BoxContent, SearchForm, BaseTable, TemplateForm },
mixins: [tableMixins],
data() {
return {
template_cols,
template_form,
template_handle,
template_model,
searchData: searchDataDefault(),
list: [],
total: 0,
loading: false,
rowData: {},
template: {},
itmeList: [],
itemLoading: false
}
},
mounted() {
this.getList()
},
methods: {
getList() {
this.loading = true
getQaTemplateList(this.searchData).then(res => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
this.template = {}
this.itmeList = []
})
},
handleAdd() {
this.rowData = {}
this.template_model.title = 'New'
this.template_model.visible = true
},
handleSetting() {
this.$router.push({ name: 'TemplateOfSetting' })
},
handleEdit(row) {
this.rowData = row
this.template_model.title = 'Edit'
this.template_model.visible = true
},
handleDelete(row) {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
})
.then(() => {
deleteQATemplate(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
})
})
},
handleView(row) {
this.template = row
this.itemLoading = true
getQaTemplateConfigList(row.Id, row.ModalityId).then(res => {
this.itmeList = res.Result
this.itmeList.forEach(val => {
this.$nextTick(
function() {
this.$refs.itemList.toggleRowSelection(val, val.IsSelect)
}.bind(this)
)
})
this.itemLoading = false
})
},
onTableSelect(rows, row) {
const param = {
qaTemplateItemId: row.Id,
qaTemplateId: this.template.Id,
isSelect: rows.indexOf(row) !== -1
}
configQATemplateItem(param).then(res => {
this.$message.success('Updated successfully')
})
},
handleReset() {
this.searchData = searchDataDefault()
this.getList()
this.template = {}
this.itmeList = []
},
closeModel() {
this.template_model.visible = false
this.getList()
}
}
}
</script>
<style lang="scss">
.template-wrapper{
height: 100%;
display: flex;
.left-wrapper{
width: 0;
flex-grow: 4;
border-right: 1px solid #ccc;
}
.right-wrapper{
width: 0;
flex-grow: 3;
padding: 5px;
thead{
.el-table-column--selection{
.cell {
display: none;
}
}
}
}
}
</style>

View File

@ -1,182 +1,181 @@
<template>
<box-content>
<div class="search">
<SearchForm
size="mini"
:that="this"
:search-data="searchData"
:search-form="setting_form"
:search-handle="setting_handle"
@search="handleSearch"
@reset="handleReset"
/>
<span style="margin-left:auto;">
<el-button type="primary" size="small" style="margin-left:auto;" @click="handleAdd">New</el-button>
</span>
</div>
<base-table
v-loading="loading"
:columns="setting_cols"
:list="list"
:search-data="searchData"
:total="total"
@getList="getList"
@edit="handleEdit"
@delete="handleDelete"
@sortByColumn="sortByColumn"
>
<!-- 选择自定义slot -->
<template slot="modalitySlot" slot-scope="{scope}">
{{ scope.row.ModalityList && scope.row.ModalityList.length>0?scope.row.ModalityList.join(', '):'' }}
</template>
</base-table>
<setting-form v-if="setting_model.visible" :data="rowData" @close="closeModel" />
</box-content>
</template>
<script>
import { getQATemplateItemList, deleteQATemplateItem } from '@/api/dictionary'
import { getBasicDataSelects } from '@/api/dictionary/dictionary'
import { setting_cols, setting_form, setting_handle, setting_model } from './template'
import BoxContent from '@/components/BoxContent'
import SearchForm from '@/components/BaseForm/search-form'
import BaseTable from '@/components/BaseTable'
import SettingForm from './components/SettingForm.vue'
const searchDataDefault = () => {
return {
ModalityId: '',
PageIndex: 1,
PageSize: 20
}
}
export default {
name: 'TemplateSettings',
components: { BoxContent, SearchForm, BaseTable, SettingForm },
data() {
return {
setting_cols,
setting_form,
setting_handle,
setting_model,
list: [],
loading: false,
total: 0,
searchData: searchDataDefault(),
rowData: {},
readingType: {}
}
},
mounted() {
this.getList()
this.getInfo()
},
methods: {
getList() {
this.loading = true
getQATemplateItemList(this.searchData).then(res => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}).catch(() => { this.loading = false })
},
findItemIndex(key) {
return this.setting_form.findIndex(value => value.prop && value.prop === key
)
},
async getInfo() {
await this.getDicData()
if (this.readingType.length > 0) {
const index = this.findItemIndex('ModalityId')
this.$set(this.setting_form[index], 'options', this.readingType)
}
},
getDicData() {
getBasicDataSelects(['ReadingType']).then(res => {
const { ReadingType } = { ...res.Result }
this.readingType = ReadingType || {}
}).catch(() => {})
},
handleAdd() {
this.rowData = {}
this.setting_model.title = 'Add'
this.setting_model.visible = true
},
handleEdit(row) {
this.rowData = row
this.setting_model.title = 'Add'
this.setting_model.visible = true
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
deleteQATemplateItem(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
}
})
})
},
sortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
},
handleReset() {
this.searchData = searchDataDefault()
this.getList()
},
closeModel() {
this.setting_model.visible = false
this.getList()
}
}
}
</script>
<style lang="scss">
.template-setting{
height: 100%;
.el-header{
.filter-container{
margin-top: 10px;
display: flex;
align-items: center;
span{
font-size:13px;
margin-right:5px;
}
.mr{
margin-right: 5px;
width: 120px;
}
}
}
.el-main{
height:calc(100% - 40px);
padding: 0 20px;
.data-table{
height: 100%;
}
}
.el-footer{
padding: 0 20px;
}
.el-dialog__header{
padding:10px;
}
.el-dialog__body{
padding:10px;
}
}
</style>
<template>
<box-content>
<div class="search">
<SearchForm
size="mini"
:that="this"
:search-data="searchData"
:search-form="setting_form"
:search-handle="setting_handle"
@search="handleSearch"
@reset="handleReset"
/>
<span style="margin-left:auto;">
<el-button type="primary" size="small" style="margin-left:auto;" @click="handleAdd">New</el-button>
</span>
</div>
<base-table
v-loading="loading"
:columns="setting_cols"
:list="list"
:search-data="searchData"
:total="total"
@getList="getList"
@edit="handleEdit"
@delete="handleDelete"
@sortByColumn="sortByColumn"
>
<!-- 选择自定义slot -->
<template slot="modalitySlot" slot-scope="{scope}">
{{ scope.row.ModalityList && scope.row.ModalityList.length>0?scope.row.ModalityList.join(', '):'' }}
</template>
</base-table>
<setting-form v-if="setting_model.visible" :data="rowData" @close="closeModel" />
</box-content>
</template>
<script>
import { getQATemplateItemList, deleteQATemplateItem } from '@/api/dictionary'
import { getBasicDataSelects } from '@/api/dictionary/dictionary'
import { setting_cols, setting_form, setting_handle, setting_model } from './template'
import BoxContent from '@/components/BoxContent'
import SearchForm from '@/components/BaseForm/search-form'
import BaseTable from '@/components/BaseTable'
import SettingForm from './components/SettingForm.vue'
const searchDataDefault = () => {
return {
ModalityId: '',
PageIndex: 1,
PageSize: 20
}
}
export default {
name: 'TemplateSettings',
components: { BoxContent, SearchForm, BaseTable, SettingForm },
data() {
return {
setting_cols,
setting_form,
setting_handle,
setting_model,
list: [],
loading: false,
total: 0,
searchData: searchDataDefault(),
rowData: {},
readingType: {}
}
},
mounted() {
this.getList()
this.getInfo()
},
methods: {
getList() {
this.loading = true
getQATemplateItemList(this.searchData).then(res => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}).catch(() => { this.loading = false })
},
findItemIndex(key) {
return this.setting_form.findIndex(value => value.prop && value.prop === key
)
},
async getInfo() {
await this.getDicData()
if (this.readingType.length > 0) {
const index = this.findItemIndex('ModalityId')
this.$set(this.setting_form[index], 'options', this.readingType)
}
},
getDicData() {
getBasicDataSelects(['ReadingType']).then(res => {
const { ReadingType } = { ...res.Result }
this.readingType = ReadingType || {}
}).catch(() => {})
},
handleAdd() {
this.rowData = {}
this.setting_model.title = 'Add'
this.setting_model.visible = true
},
handleEdit(row) {
this.rowData = row
this.setting_model.title = 'Add'
this.setting_model.visible = true
},
handleDelete(row) {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
})
.then(() => {
deleteQATemplateItem(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
})
})
},
sortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
},
handleReset() {
this.searchData = searchDataDefault()
this.getList()
},
closeModel() {
this.setting_model.visible = false
this.getList()
}
}
}
</script>
<style lang="scss">
.template-setting{
height: 100%;
.el-header{
.filter-container{
margin-top: 10px;
display: flex;
align-items: center;
span{
font-size:13px;
margin-right:5px;
}
.mr{
margin-right: 5px;
width: 120px;
}
}
}
.el-main{
height:calc(100% - 40px);
padding: 0 20px;
.data-table{
height: 100%;
}
}
.el-footer{
padding: 0 20px;
}
.el-dialog__header{
padding:10px;
}
.el-dialog__body{
padding:10px;
}
}
</style>

View File

@ -1,162 +1,161 @@
<template>
<box-content>
<!-- 搜索框 -->
<div class="search">
<span style="margin-left:auto;">
<el-button
type="primary"
size="mini"
@click="handleAdd"
>
Add
</el-button>
</span>
</div>
<!-- 受试者列表 -->
<el-table
v-loading="loading"
v-adaptive="{bottomOffset:45}"
:data="list"
stripe
height="100"
style="width:100%"
>
<el-table-column type="index" width="40" />
<el-table-column
prop="Code"
label="编号"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
prop="Name"
label="场景类型"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="Value"
label="签名内容(EN)"
show-overflow-tooltip
/>
<el-table-column
prop="ValueCN"
label="签名内容(CN)"
show-overflow-tooltip
/>
<el-table-column
prop="UpdateTime"
label="更新时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CreateTime"
label="创建时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column label="Action" width="200" fixed="right">
<template slot-scope="scope">
<el-button
type="text"
@click="handleEdit(scope.row)"
>
Edit
</el-button>
<el-button type="text" @click="handleDelete(scope.row)">Delete</el-button>
</template>
</el-table-column>
</el-table>
<!-- 场景配置 -->
<el-dialog
v-if="editVisible"
:visible.sync="editVisible"
:close-on-click-modal="false"
:title="title"
width="700px"
append-to-body
custom-class="base-dialog-wrapper"
>
<SceneConfigForm :parent-id="parentId" :data="rowData" @closeDialog="closeDialog" @getList="getList" />
</el-dialog>
</box-content>
</template>
<script>
import { getChildList, deleteSystemBasicData } from '@/api/dictionary'
import BoxContent from '@/components/BoxContent'
import SceneConfigForm from './SceneConfigForm'
export default {
name: 'SignTemplate',
components: { BoxContent, SceneConfigForm },
props: {
parentId: {
type: String,
required: true
}
},
data() {
return {
loading: false,
list: [],
rowData: {},
title: '',
editVisible: false
}
},
mounted() {
this.getList()
},
methods: {
//
getList() {
this.loading = true
getChildList(this.parentId).then(res => {
this.loading = false
this.list = res.Result
}).catch(() => { this.loading = false })
},
//
handleAdd() {
this.rowData = {}
this.title = 'Add'
this.editVisible = true
},
//
handleEdit(row) {
this.rowData = { ...row }
this.title = 'Edit'
this.editVisible = true
},
//
handleDelete(row) {
this.$confirm('Sure to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
deleteSystemBasicData(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
}
})
})
},
//
closeDialog() {
this.editVisible = false
}
}
}
</script>
<template>
<box-content>
<!-- 搜索框 -->
<div class="search">
<span style="margin-left:auto;">
<el-button
type="primary"
size="mini"
@click="handleAdd"
>
Add
</el-button>
</span>
</div>
<!-- 受试者列表 -->
<el-table
v-loading="loading"
v-adaptive="{bottomOffset:45}"
:data="list"
stripe
height="100"
style="width:100%"
>
<el-table-column type="index" width="40" />
<el-table-column
prop="Code"
label="编号"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
prop="Name"
label="场景类型"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="Value"
label="签名内容(EN)"
show-overflow-tooltip
/>
<el-table-column
prop="ValueCN"
label="签名内容(CN)"
show-overflow-tooltip
/>
<el-table-column
prop="UpdateTime"
label="更新时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CreateTime"
label="创建时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column label="Action" width="200" fixed="right">
<template slot-scope="scope">
<el-button
type="text"
@click="handleEdit(scope.row)"
>
Edit
</el-button>
<el-button type="text" @click="handleDelete(scope.row)">Delete</el-button>
</template>
</el-table-column>
</el-table>
<!-- 场景配置 -->
<el-dialog
v-if="editVisible"
:visible.sync="editVisible"
:close-on-click-modal="false"
:title="title"
width="700px"
append-to-body
custom-class="base-dialog-wrapper"
>
<SceneConfigForm :parent-id="parentId" :data="rowData" @closeDialog="closeDialog" @getList="getList" />
</el-dialog>
</box-content>
</template>
<script>
import { getChildList, deleteSystemBasicData } from '@/api/dictionary'
import BoxContent from '@/components/BoxContent'
import SceneConfigForm from './SceneConfigForm'
export default {
name: 'SignTemplate',
components: { BoxContent, SceneConfigForm },
props: {
parentId: {
type: String,
required: true
}
},
data() {
return {
loading: false,
list: [],
rowData: {},
title: '',
editVisible: false
}
},
mounted() {
this.getList()
},
methods: {
//
getList() {
this.loading = true
getChildList(this.parentId).then(res => {
this.loading = false
this.list = res.Result
}).catch(() => { this.loading = false })
},
//
handleAdd() {
this.rowData = {}
this.title = 'Add'
this.editVisible = true
},
//
handleEdit(row) {
this.rowData = { ...row }
this.title = 'Edit'
this.editVisible = true
},
//
handleDelete(row) {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
})
.then(() => {
deleteSystemBasicData(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
})
})
},
//
closeDialog() {
this.editVisible = false
}
}
}
</script>

View File

@ -1,229 +1,228 @@
<template>
<box-content>
<!-- 搜索框 -->
<div class="search">
<el-form :inline="true" size="mini" class="base-search-form">
<el-form-item label="编号:">
<el-input v-model="searchData.Code" style="width:100px;" />
</el-form-item>
<el-form-item label="模板:">
<el-input v-model="searchData.Name" style="width:100px;" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleReset">Reset</el-button>
<el-button type="primary" @click="handleSearch">Search</el-button>
</el-form-item>
</el-form>
<span style="margin-left:auto;">
<el-button
type="primary"
size="mini"
@click="handleAdd"
>
New
</el-button>
</span>
</div>
<!-- 受试者列表 -->
<el-table
v-loading="loading"
v-adaptive="{bottomOffset:45}"
:data="list"
stripe
height="100"
style="width:100%"
@sort-change="handleSortByColumn"
>
<el-table-column type="index" width="40" />
<el-table-column
prop="Code"
label="Code"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
prop="Name"
label="模板"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="Value"
label="签名内容(EN)"
show-overflow-tooltip
/>
<el-table-column
prop="ValueCN"
label="签名内容(CN)"
show-overflow-tooltip
/>
<el-table-column
prop="UpdateTime"
label="更新时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CreateTime"
label="创建时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column label="Action" width="200" fixed="right">
<template slot-scope="scope">
<el-button
type="text"
@click="handleEdit(scope.row)"
>
Edit
</el-button>
<el-button
type="text"
@click="handleConfig(scope.row)"
>
场景配置
</el-button>
<el-button type="text" @click="handleDelete(scope.row)">Delete</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="getList" />
<!-- 新增编辑 -->
<el-dialog
v-if="editVisible"
:visible.sync="editVisible"
:close-on-click-modal="false"
:title="title"
width="700px"
custom-class="base-dialog-wrapper"
>
<SignTemplateForm :data="rowData" @closeDialog="closeDialog" @getList="getList" />
</el-dialog>
<!-- 场景配置 -->
<el-dialog
v-if="configVisible"
:visible.sync="configVisible"
title="场景配置"
:fullscreen="true"
append-to-body
custom-class="base-dialog-wrapper"
>
<SceneList :parent-id="rowData.Id" @closeDialog="closeDialog" />
</el-dialog>
</box-content>
</template>
<script>
import { getSystemBasicDataList, deleteSystemBasicData } from '@/api/dictionary'
import BoxContent from '@/components/BoxContent'
import SignTemplateForm from './components/SignTemplateForm'
import SceneList from './components/SceneList'
import Pagination from '@/components/Pagination'
const searchDataDefault = () => {
return {
Code: '',
Name: '',
PageIndex: 1,
PageSize: 20
}
}
export default {
name: 'SignTemplate',
components: { BoxContent, SignTemplateForm, Pagination, SceneList },
data() {
return {
searchData: searchDataDefault(),
loading: false,
list: [],
total: 0,
rowData: {},
title: '',
editVisible: false,
configVisible: false
}
},
mounted() {
this.getList()
},
methods: {
//
getList() {
this.loading = true
getSystemBasicDataList(this.searchData).then(res => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}).catch(() => { this.loading = false })
},
//
handleAdd() {
this.rowData = {}
this.title = 'Add'
this.editVisible = true
},
//
handleEdit(row) {
this.rowData = { ...row }
this.title = 'Edit'
this.editVisible = true
},
//
handleDelete(row) {
this.$confirm('Sure to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
deleteSystemBasicData(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
}
})
})
},
//
handleConfig(row) {
this.rowData = { ...row }
this.configVisible = true
},
//
handleSearch() {
this.searchData.PageIndex = 1
this.getList()
},
//
handleReset() {
this.searchData = searchDataDefault()
this.getList()
},
//
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
},
//
closeDialog() {
this.editVisible = false
}
}
}
</script>
<template>
<box-content>
<!-- 搜索框 -->
<div class="search">
<el-form :inline="true" size="mini" class="base-search-form">
<el-form-item label="编号:">
<el-input v-model="searchData.Code" style="width:100px;" />
</el-form-item>
<el-form-item label="模板:">
<el-input v-model="searchData.Name" style="width:100px;" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleReset">Reset</el-button>
<el-button type="primary" @click="handleSearch">Search</el-button>
</el-form-item>
</el-form>
<span style="margin-left:auto;">
<el-button
type="primary"
size="mini"
@click="handleAdd"
>
New
</el-button>
</span>
</div>
<!-- 受试者列表 -->
<el-table
v-loading="loading"
v-adaptive="{bottomOffset:45}"
:data="list"
stripe
height="100"
style="width:100%"
@sort-change="handleSortByColumn"
>
<el-table-column type="index" width="40" />
<el-table-column
prop="Code"
label="Code"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
prop="Name"
label="模板"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="Value"
label="签名内容(EN)"
show-overflow-tooltip
/>
<el-table-column
prop="ValueCN"
label="签名内容(CN)"
show-overflow-tooltip
/>
<el-table-column
prop="UpdateTime"
label="更新时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="CreateTime"
label="创建时间"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column label="Action" width="200" fixed="right">
<template slot-scope="scope">
<el-button
type="text"
@click="handleEdit(scope.row)"
>
Edit
</el-button>
<el-button
type="text"
@click="handleConfig(scope.row)"
>
场景配置
</el-button>
<el-button type="text" @click="handleDelete(scope.row)">Delete</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination class="page" :total="total" :page.sync="searchData.PageIndex" :limit.sync="searchData.PageSize" @pagination="getList" />
<!-- 新增编辑 -->
<el-dialog
v-if="editVisible"
:visible.sync="editVisible"
:close-on-click-modal="false"
:title="title"
width="700px"
custom-class="base-dialog-wrapper"
>
<SignTemplateForm :data="rowData" @closeDialog="closeDialog" @getList="getList" />
</el-dialog>
<!-- 场景配置 -->
<el-dialog
v-if="configVisible"
:visible.sync="configVisible"
title="场景配置"
:fullscreen="true"
append-to-body
custom-class="base-dialog-wrapper"
>
<SceneList :parent-id="rowData.Id" @closeDialog="closeDialog" />
</el-dialog>
</box-content>
</template>
<script>
import { getSystemBasicDataList, deleteSystemBasicData } from '@/api/dictionary'
import BoxContent from '@/components/BoxContent'
import SignTemplateForm from './components/SignTemplateForm'
import SceneList from './components/SceneList'
import Pagination from '@/components/Pagination'
const searchDataDefault = () => {
return {
Code: '',
Name: '',
PageIndex: 1,
PageSize: 20
}
}
export default {
name: 'SignTemplate',
components: { BoxContent, SignTemplateForm, Pagination, SceneList },
data() {
return {
searchData: searchDataDefault(),
loading: false,
list: [],
total: 0,
rowData: {},
title: '',
editVisible: false,
configVisible: false
}
},
mounted() {
this.getList()
},
methods: {
//
getList() {
this.loading = true
getSystemBasicDataList(this.searchData).then(res => {
this.loading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}).catch(() => { this.loading = false })
},
//
handleAdd() {
this.rowData = {}
this.title = 'Add'
this.editVisible = true
},
//
handleEdit(row) {
this.rowData = { ...row }
this.title = 'Edit'
this.editVisible = true
},
//
handleDelete(row) {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
})
.then(() => {
deleteSystemBasicData(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
})
})
},
//
handleConfig(row) {
this.rowData = { ...row }
this.configVisible = true
},
//
handleSearch() {
this.searchData.PageIndex = 1
this.getList()
},
//
handleReset() {
this.searchData = searchDataDefault()
this.getList()
},
//
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.searchData.Asc = true
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
this.searchData.PageIndex = 1
this.getList()
},
//
closeDialog() {
this.editVisible = false
}
}
}
</script>

View File

@ -5,7 +5,7 @@
<!-- 首次登录修改密码 -->
{{ $t('recompose:title:init') }}
</div>
<el-form ref="passwordForm" v-loading="loading" label-position="right" :model="password" :rules="passwordFormRules" label-width="180px">
<el-form ref="passwordForm" v-loading="loading" label-position="right" :model="password" :rules="passwordFormRules" label-width="200px">
<!-- 邮箱 -->
<el-form-item :label="$t('recompose:form:email')" prop="Email">
<el-input v-model="password.Email" disabled />

View File

@ -1,242 +1,241 @@
<template>
<div class="app-container adjustment-container data-list">
<div class="filter-container">
<el-input v-model="listQuery.Reviewer" style="width:220px" size="small" placeholder="Reviewer ID" class="mr" />
<el-date-picker
v-model="listQuery.BeginMonth"
size="small"
placeholder="Beginning date"
type="month"
value-format="yyyy-MM"
disabled
class="mr"
/>
<el-button size="small" type="text" @click="handleReset">Reset</el-button>
<el-button type="primary" size="small" @click="handleSearch">Search</el-button>
<el-button style="margin-left:auto" type="primary" size="small" @click="handleNew">New</el-button>
</div>
<div class="data-table">
<el-table
v-loading="listLoading"
stripe
:data="list"
height="100%"
size="small"
@sort-change="sortByColumn"
>
<el-table-column type="index" width="50" />
<el-table-column
prop="LastName"
label="Name"
min-width="100"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">{{ scope.row.LastName + ' / ' + scope.row.FirstName }}</template>
</el-table-column>
<el-table-column
prop="ChineseName"
label="Name CN"
min-width="120"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
prop="ReviewerCode"
label="Reviewer ID"
min-width="110"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
prop="AdjustPaymentUSD"
label="Amount($)"
min-width="120"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">{{ scope.row.AdjustPaymentUSD | rounding }}</template>
</el-table-column>
<el-table-column
prop="AdjustPaymentCNY"
label="Amount(¥)"
min-width="120"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.AdjustPaymentCNY | rounding }}</span>
</template>
</el-table-column>
<el-table-column prop="Note" label="Note" min-width="120" show-overflow-tooltip />
<el-table-column
prop="YearMonth"
label="Adjust Month"
min-width="120"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column label="Action">
<template slot-scope="scope">
<el-button size="small" type="text" :disabled="scope.row.IsLock" @click="handleEdit(scope.row)">Edit</el-button>
<el-button
size="small"
type="text"
:disabled="scope.row.IsLock"
@click="handleDelete(scope.row)"
>Delete</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination">
<pagination :total="total" :page.sync="listQuery.PageIndex" :limit.sync="listQuery.PageSize" @pagination="getList" />
</div>
<el-dialog
:title="title"
:visible.sync="dialogVisible"
:close-on-click-modal="false"
width="600px"
>
<adjustment-form
:key="timer"
:row="row"
:date="date"
:exchange-rate="exchangeRate"
@closeDialog="closeDialog"
@getList="getList"
/>
</el-dialog>
</div>
</template>
<script>
import Pagination from '@/components/Pagination'
import AdjustmentForm from './components/AdjustmentForm'
import { getPaymentAdjustmentList, deletePaymentAdjustment } from '@/api/financials'
import { FormatTime } from '@/utils/formatter'
export default {
filters: {
rounding(value) {
return value ? Number(value).toFixed(2) : value
}
},
components: { Pagination, AdjustmentForm },
data() {
return {
listQuery: {
TrialCode: '',
Reviewer: '',
BeginMonth: '',
EndMonth: '',
PageIndex: 1,
PageSize: 20,
Asc: false,
SortField: ''
},
listLoading: false,
list: [],
total: 0,
exchangeRate: '',
date: '',
timer: '',
dialogVisible: false,
title: '',
row: ''
}
},
mounted() {
this.date = this.$router.currentRoute.query.date
this.listQuery.BeginMonth = this.date
this.listQuery.EndMonth = this.date
// this.exchangeRate = this.$router.currentRoute.query.exchangeRate ? parseInt(this.$router.currentRoute.query.exchangeRate) : 0
this.exchangeRate = this.$router.currentRoute.query.exchangeRate ? this.$router.currentRoute.query.exchangeRate : 0
this.getList()
},
methods: {
getList() {
this.listLoading = true
getPaymentAdjustmentList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
})
},
handleNew() {
this.title = 'New'
this.row = {}
this.timer = new Date().getTime()
this.dialogVisible = true
},
handleEdit(row) {
this.title = 'Edit'
this.row = JSON.parse(JSON.stringify(row))
this.timer = new Date().getTime()
this.dialogVisible = true
},
handleDelete(row) {
this.$confirm('Confirm to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
deletePaymentAdjustment(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.indexOf(row), 1)
this.total = this.total - 1
this.$message.success('Deleted successfully !')
}
})
})
},
handleSearch() {
this.listQuery.PageIndex = 1
this.getList()
},
handleReset() {
this.listQuery.PageIndex = 1
this.listQuery.Reviewer = ''
this.getList()
},
sortByColumn(column) {
if (column.order === 'ascending') {
this.listQuery.Asc = true
} else {
this.listQuery.Asc = false
}
this.listQuery.SortField = column.prop
this.listQuery.PageIndex = 1
this.getList()
},
closeDialog() {
this.dialogVisible = false
},
adjustMonthFormatter(row) {
if (row.AdjustedYearMonth) {
const date = new Date(row.AdjustedYearMonth)
return FormatTime(date, 'yyyy-MM')
} else {
return ''
}
}
}
}
</script>
<style lang="scss">
.adjustment-container{
.filter-container{
display: flex;
align-items: center;
.mr{
margin-right:5px;
}
}
.list-container{
height: calc(100% - 80px);
}
}
</style>
<template>
<div class="app-container adjustment-container data-list">
<div class="filter-container">
<el-input v-model="listQuery.Reviewer" style="width:220px" size="small" placeholder="Reviewer ID" class="mr" />
<el-date-picker
v-model="listQuery.BeginMonth"
size="small"
placeholder="Beginning date"
type="month"
value-format="yyyy-MM"
disabled
class="mr"
/>
<el-button size="small" type="text" @click="handleReset">Reset</el-button>
<el-button type="primary" size="small" @click="handleSearch">Search</el-button>
<el-button style="margin-left:auto" type="primary" size="small" @click="handleNew">New</el-button>
</div>
<div class="data-table">
<el-table
v-loading="listLoading"
stripe
:data="list"
height="100%"
size="small"
@sort-change="sortByColumn"
>
<el-table-column type="index" width="50" />
<el-table-column
prop="LastName"
label="Name"
min-width="100"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">{{ scope.row.LastName + ' / ' + scope.row.FirstName }}</template>
</el-table-column>
<el-table-column
prop="ChineseName"
label="Name CN"
min-width="120"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
prop="ReviewerCode"
label="Reviewer ID"
min-width="110"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column
prop="AdjustPaymentUSD"
label="Amount($)"
min-width="120"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">{{ scope.row.AdjustPaymentUSD | rounding }}</template>
</el-table-column>
<el-table-column
prop="AdjustPaymentCNY"
label="Amount(¥)"
min-width="120"
sortable="custom"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.AdjustPaymentCNY | rounding }}</span>
</template>
</el-table-column>
<el-table-column prop="Note" label="Note" min-width="120" show-overflow-tooltip />
<el-table-column
prop="YearMonth"
label="Adjust Month"
min-width="120"
sortable="custom"
show-overflow-tooltip
/>
<el-table-column label="Action">
<template slot-scope="scope">
<el-button size="small" type="text" :disabled="scope.row.IsLock" @click="handleEdit(scope.row)">Edit</el-button>
<el-button
size="small"
type="text"
:disabled="scope.row.IsLock"
@click="handleDelete(scope.row)"
>Delete</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination">
<pagination :total="total" :page.sync="listQuery.PageIndex" :limit.sync="listQuery.PageSize" @pagination="getList" />
</div>
<el-dialog
:title="title"
:visible.sync="dialogVisible"
:close-on-click-modal="false"
width="600px"
>
<adjustment-form
:key="timer"
:row="row"
:date="date"
:exchange-rate="exchangeRate"
@closeDialog="closeDialog"
@getList="getList"
/>
</el-dialog>
</div>
</template>
<script>
import Pagination from '@/components/Pagination'
import AdjustmentForm from './components/AdjustmentForm'
import { getPaymentAdjustmentList, deletePaymentAdjustment } from '@/api/financials'
import { FormatTime } from '@/utils/formatter'
export default {
filters: {
rounding(value) {
return value ? Number(value).toFixed(2) : value
}
},
components: { Pagination, AdjustmentForm },
data() {
return {
listQuery: {
TrialCode: '',
Reviewer: '',
BeginMonth: '',
EndMonth: '',
PageIndex: 1,
PageSize: 20,
Asc: false,
SortField: ''
},
listLoading: false,
list: [],
total: 0,
exchangeRate: '',
date: '',
timer: '',
dialogVisible: false,
title: '',
row: ''
}
},
mounted() {
this.date = this.$router.currentRoute.query.date
this.listQuery.BeginMonth = this.date
this.listQuery.EndMonth = this.date
// this.exchangeRate = this.$router.currentRoute.query.exchangeRate ? parseInt(this.$router.currentRoute.query.exchangeRate) : 0
this.exchangeRate = this.$router.currentRoute.query.exchangeRate ? this.$router.currentRoute.query.exchangeRate : 0
this.getList()
},
methods: {
getList() {
this.listLoading = true
getPaymentAdjustmentList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
})
},
handleNew() {
this.title = 'New'
this.row = {}
this.timer = new Date().getTime()
this.dialogVisible = true
},
handleEdit(row) {
this.title = 'Edit'
this.row = JSON.parse(JSON.stringify(row))
this.timer = new Date().getTime()
this.dialogVisible = true
},
handleDelete(row) {
this.$confirm('Confirm to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
})
.then(() => {
deletePaymentAdjustment(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.indexOf(row), 1)
this.total = this.total - 1
this.$message.success('Deleted successfully !')
}
})
})
},
handleSearch() {
this.listQuery.PageIndex = 1
this.getList()
},
handleReset() {
this.listQuery.PageIndex = 1
this.listQuery.Reviewer = ''
this.getList()
},
sortByColumn(column) {
if (column.order === 'ascending') {
this.listQuery.Asc = true
} else {
this.listQuery.Asc = false
}
this.listQuery.SortField = column.prop
this.listQuery.PageIndex = 1
this.getList()
},
closeDialog() {
this.dialogVisible = false
},
adjustMonthFormatter(row) {
if (row.AdjustedYearMonth) {
const date = new Date(row.AdjustedYearMonth)
return FormatTime(date, 'yyyy-MM')
} else {
return ''
}
}
}
}
</script>
<style lang="scss">
.adjustment-container{
.filter-container{
display: flex;
align-items: center;
.mr{
margin-right:5px;
}
}
.list-container{
height: calc(100% - 80px);
}
}
</style>

View File

@ -1,198 +1,198 @@
<template>
<div class="app-container exchange-rate data-list">
<div class="filter-container">
<el-date-picker
v-model="listQuery.SearchMonth"
size="small"
placeholder="Search Month"
value-format="yyyy-MM"
format="yyyy-MM"
type="month"
style="width:150px;margin-right:5px"
:picker-options="pickerOption"
/>
<el-button size="small" type="text" @click="handleReset">Reset</el-button>
<el-button type="primary" size="small" @click="handleSearch">Search</el-button>
<el-button style="margin-left:auto" type="primary" size="small" @click="handleNew">New</el-button>
</div>
<div class="list-container">
<el-table
v-loading="listLoading"
:data="list"
stripe
class="table"
height="100%"
size="small"
>
<el-table-column type="index" width="50" />
<el-table-column prop="YearMonth" label="Month" min-width="60" show-overflow-tooltip />
<el-table-column prop="Rate" label="Rate" min-width="60" show-overflow-tooltip />
<el-table-column prop="UpdateTime" label="Update Time" min-width="70" show-overflow-tooltip />
<el-table-column fixed="right" label="Action" min-width="150">
<template slot-scope="scope" min-width="130">
<el-button
size="small"
type="text"
@click="handleEdit(scope.row)"
>Edit</el-button>
<el-button
size="small"
type="text"
@click="handleDelete(scope.row)"
>Delete</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination">
<pagination :total="total" :page.sync="listQuery.PageIndex" :limit.sync="listQuery.PageSize" @pagination="getList" />
</div>
<el-dialog
:key="timer"
:title="title"
:visible.sync="dialogVisible"
width="500px"
:close-on-click-modal="false"
size="small"
>
<el-form ref="rateForm" label-width="150px" :rules="rules" :model="form" size="small">
<el-form-item label="Month: " prop="YearMonth">
<el-date-picker
v-model="form.YearMonth"
type="month"
value-format="yyyy-MM"
:disabled="form.Id !=''&& form.Id !=undefined"
/>
</el-form-item>
<el-form-item label="Exchange Rate: " prop="Rate">
<el-input v-model="form.Rate" type="number" />
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="small" @click="dialogVisible = false">Cancel</el-button>
<el-button type="primary" :disabled="btnDisabled" size="small" @click="handleSave">Ok</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { getRateList, addOrUpdateExchangeRate, deleteExchangeRate } from '@/api/financials'
import Pagination from '@/components/Pagination'
export default {
name: 'ExchangeRate',
components: { Pagination },
data() {
return {
listQuery: { SearchMonth: '', PageIndex: 1, PageSize: 20 },
list: [],
listLoading: false,
total: 0,
dialogVisible: false,
title: '',
timer: '',
form: {},
rules: {
Rate: [{ required: true, message: 'Please specify', trigger: 'blur' }],
YearMonth: [{ required: true, message: 'Please specify', trigger: 'blur' }]
},
btnDisabled: false,
pickerOption: {
disabledDate: time => {
return time.getTime() > Date.now()
}
}
}
},
mounted() { this.getList() },
methods: {
getList() {
this.listLoading = true
getRateList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}).catch(() => { this.listLoading = false })
},
handleNew() {
this.form = {}
this.title = 'Add'
this.timer = new Date().getTime()
this.dialogVisible = true
},
handleEdit(row) {
this.title = 'Edit'
this.form = JSON.parse(JSON.stringify(row))
this.timer = new Date().getTime()
this.dialogVisible = true
},
handleSave() {
this.$refs.rateForm.validate(valid => {
if (valid) {
this.btnDisabled = true
const param = {
Rate: this.form.Rate,
YearMonth: this.form.YearMonth
}
this.form.Id ? param.Id = this.form.Id : ''
addOrUpdateExchangeRate(param).then(res => {
if (res.IsSuccess) {
this.getList()
this.$message.success('Updated successfully!')
this.dialogVisible = false
}
this.btnDisabled = false
})
.catch(() => { this.btnDisabled = false })
}
})
},
handleDelete(row) {
this.$confirm('Confirm to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Yes',
cancelButtonText: 'No'
})
.then(() => {
deleteExchangeRate(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
}
})
})
.catch(action => {})
},
handleSearch() {
this.listQuery.PageIndex = 1
this.getList()
},
handleReset() {
this.listQuery.SearchMonth = ''
this.listQuery.PageIndex = 1
this.getList()
}
}
}
</script>
<style lang="scss" scoped>
.exchange-rate{
padding: 0;
.filter-container{
display: flex;
align-items: center;
}
.list-container{
height: calc(100% - 70px);
}
.el-date-editor.el-input{
width: 100%;
}
.el-date-editor.el-input__inner {
width: 100%;
}
}
</style>
<template>
<div class="app-container exchange-rate data-list">
<div class="filter-container">
<el-date-picker
v-model="listQuery.SearchMonth"
size="small"
placeholder="Search Month"
value-format="yyyy-MM"
format="yyyy-MM"
type="month"
style="width:150px;margin-right:5px"
:picker-options="pickerOption"
/>
<el-button size="small" type="text" @click="handleReset">Reset</el-button>
<el-button type="primary" size="small" @click="handleSearch">Search</el-button>
<el-button style="margin-left:auto" type="primary" size="small" @click="handleNew">New</el-button>
</div>
<div class="list-container">
<el-table
v-loading="listLoading"
:data="list"
stripe
class="table"
height="100%"
size="small"
>
<el-table-column type="index" width="50" />
<el-table-column prop="YearMonth" label="Month" min-width="60" show-overflow-tooltip />
<el-table-column prop="Rate" label="Rate" min-width="60" show-overflow-tooltip />
<el-table-column prop="UpdateTime" label="Update Time" min-width="70" show-overflow-tooltip />
<el-table-column fixed="right" label="Action" min-width="150">
<template slot-scope="scope" min-width="130">
<el-button
size="small"
type="text"
@click="handleEdit(scope.row)"
>Edit</el-button>
<el-button
size="small"
type="text"
@click="handleDelete(scope.row)"
>Delete</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination">
<pagination :total="total" :page.sync="listQuery.PageIndex" :limit.sync="listQuery.PageSize" @pagination="getList" />
</div>
<el-dialog
:key="timer"
:title="title"
:visible.sync="dialogVisible"
width="500px"
:close-on-click-modal="false"
size="small"
>
<el-form ref="rateForm" label-width="150px" :rules="rules" :model="form" size="small">
<el-form-item label="Month: " prop="YearMonth">
<el-date-picker
v-model="form.YearMonth"
type="month"
value-format="yyyy-MM"
:disabled="form.Id !=''&& form.Id !=undefined"
/>
</el-form-item>
<el-form-item label="Exchange Rate: " prop="Rate">
<el-input v-model="form.Rate" type="number" />
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="small" @click="dialogVisible = false">Cancel</el-button>
<el-button type="primary" :disabled="btnDisabled" size="small" @click="handleSave">Ok</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { getRateList, addOrUpdateExchangeRate, deleteExchangeRate } from '@/api/financials'
import Pagination from '@/components/Pagination'
export default {
name: 'ExchangeRate',
components: { Pagination },
data() {
return {
listQuery: { SearchMonth: '', PageIndex: 1, PageSize: 20 },
list: [],
listLoading: false,
total: 0,
dialogVisible: false,
title: '',
timer: '',
form: {},
rules: {
Rate: [{ required: true, message: 'Please specify', trigger: 'blur' }],
YearMonth: [{ required: true, message: 'Please specify', trigger: 'blur' }]
},
btnDisabled: false,
pickerOption: {
disabledDate: time => {
return time.getTime() > Date.now()
}
}
}
},
mounted() { this.getList() },
methods: {
getList() {
this.listLoading = true
getRateList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}).catch(() => { this.listLoading = false })
},
handleNew() {
this.form = {}
this.title = 'Add'
this.timer = new Date().getTime()
this.dialogVisible = true
},
handleEdit(row) {
this.title = 'Edit'
this.form = JSON.parse(JSON.stringify(row))
this.timer = new Date().getTime()
this.dialogVisible = true
},
handleSave() {
this.$refs.rateForm.validate(valid => {
if (valid) {
this.btnDisabled = true
const param = {
Rate: this.form.Rate,
YearMonth: this.form.YearMonth
}
this.form.Id ? param.Id = this.form.Id : ''
addOrUpdateExchangeRate(param).then(res => {
if (res.IsSuccess) {
this.getList()
this.$message.success('Updated successfully!')
this.dialogVisible = false
}
this.btnDisabled = false
})
.catch(() => { this.btnDisabled = false })
}
})
},
handleDelete(row) {
this.$confirm('Confirm to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Yes',
cancelButtonText: 'No'
})
.then(() => {
deleteExchangeRate(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
})
})
.catch(action => {})
},
handleSearch() {
this.listQuery.PageIndex = 1
this.getList()
},
handleReset() {
this.listQuery.SearchMonth = ''
this.listQuery.PageIndex = 1
this.getList()
}
}
}
</script>
<style lang="scss" scoped>
.exchange-rate{
padding: 0;
.filter-container{
display: flex;
align-items: center;
}
.list-container{
height: calc(100% - 70px);
}
.el-date-editor.el-input{
width: 100%;
}
.el-date-editor.el-input__inner {
width: 100%;
}
}
</style>

View File

@ -1,324 +1,323 @@
<template>
<div class="rates-container">
<div class="title">
<p>Rank-Based Rates</p>
<el-button
type="primary"
class="addBtn"
size="small"
@click="handleAdd"
>New</el-button>
</div>
<el-table
v-loading="listLoading"
size="small"
:data="list"
max-height="300"
stripe
class="table"
>
<el-table-column type="index" width="40" />
<el-table-column prop="RankName" label="Rank" show-overflow-tooltip min-width="100" />
<el-table-column prop="Training" label="Training ($)" min-width="90" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{ scope.row.Training | rounding }}</span>
</template>
</el-table-column>
<el-table-column prop="RefresherTraining" label="Refresher Training ($)" min-width="130" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{ scope.row.RefresherTraining | rounding }}</span>
</template>
</el-table-column>
<el-table-column label="Timepoint" align="center">
<el-table-column
prop="Timepoint"
label="Regular ($)"
min-width="90"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.Timepoint | rounding }}</span>
</template>
</el-table-column>
<el-table-column
prop="TimepointIn48H"
label="48-hour ($)"
min-width="90"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.TimepointIn48H | rounding }}</span>
</template>
</el-table-column>
<el-table-column
prop="TimepointIn24H"
label="24-hour ($)"
min-width="90"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.TimepointIn24H | rounding }}</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="Adjudication" align="center">
<el-table-column
prop="Adjudication"
label="Regular ($)"
min-width="90"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.Adjudication | rounding }}</span>
</template>
</el-table-column>
<el-table-column
prop="AdjudicationIn48H"
label="48-hour ($)"
min-width="90"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.AdjudicationIn48H | rounding }}</span>
</template>
</el-table-column>
<el-table-column
prop="AdjudicationIn24H"
label="24-hour ($)"
min-width="90"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.AdjudicationIn24H | rounding }}</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="Global" label="Global ($)" min-width="100" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{ scope.row.Global | rounding }}</span>
</template>
</el-table-column>
<el-table-column prop="Downtime" label="Downtime ($)" min-width="100" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{ scope.row.Downtime | rounding }}</span>
</template>
</el-table-column>
<el-table-column
fixed="right"
label="Action"
min-width="100"
>
<template slot-scope="scope" min-width="130">
<el-button
size="small"
type="text"
@click="handleEdit(scope.row)"
>Edit</el-button>
<el-button
size="small"
type="text"
@click="handleDelete(scope.row)"
>Delete</el-button>
</template>
</el-table-column>
</el-table>
<pagination style="text-align:right;margin-top:5px;" :total="total" :page.sync="listQuery.PageIndex" :limit.sync="listQuery.PageSize" @pagination="getList" />
<el-dialog
:key="timer"
:title="title"
:visible.sync="dialogVisible"
width="500px"
:close-on-click-modal="false"
>
<el-form ref="baseRateForm" label-width="190px" :rules="rules" :model="baseRateForm" size="small">
<el-form-item label="Rank: " prop="RankName">
<el-input v-model="baseRateForm.RankName" />
</el-form-item>
<el-form-item label="Training ($): " prop="Training">
<!-- <el-input v-model="baseRateForm.Training" type="number" /> -->
<el-input-number v-model="baseRateForm.Training" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Refresher Training ($): " prop="RefresherTraining">
<el-input-number v-model="baseRateForm.RefresherTraining" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Timepoint ($): " prop="Timepoint">
<!-- <el-input v-model="baseRateForm.Timepoint" type="number" /> -->
<el-input-number v-model="baseRateForm.Timepoint" style="width:100%;" :min="0" @input="timepointChange" />
</el-form-item>
<el-form-item label="Timepoint 48H ($): " prop="TimepointIn48H">
<!-- <el-input v-model="baseRateForm.TimepointIn48H" type="number" /> -->
<el-input-number v-model="baseRateForm.TimepointIn48H" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Timepoint 24H ($): " prop="TimepointIn24H">
<!-- <el-input v-model="baseRateForm.TimepointIn24H" type="number" /> -->
<el-input-number v-model="baseRateForm.TimepointIn24H" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Adjudication ($): " prop="Adjudication">
<!-- <el-input v-model="baseRateForm.Adjudication" type="number" /> -->
<el-input-number v-model="baseRateForm.Adjudication" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Adjudication 48H ($): " prop="AdjudicationIn48H">
<!-- <el-input v-model="baseRateForm.AdjudicationIn48H" type="number" /> -->
<el-input-number v-model="baseRateForm.AdjudicationIn48H" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Adjudication 24H ($): " prop="AdjudicationIn24H">
<!-- <el-input v-model="baseRateForm.AdjudicationIn24H" type="number" /> -->
<el-input-number v-model="baseRateForm.AdjudicationIn24H" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Global ($): " prop="Global">
<el-input v-model="baseRateForm.Global" disabled type="number" />
</el-form-item>
<el-form-item label="Downtime ($): " prop="Downtime">
<el-input-number v-model="baseRateForm.Downtime" style="width:100%;" :min="0" />
<!-- <el-input v-model="baseRateForm.Downtime" type="number" /> -->
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="small" @click="dialogVisible = false">Cancel</el-button>
<el-button type="primary" :disabled="btnDisabled" size="small" @click="handleSave">Ok</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Pagination from '@/components/Pagination'
import { getRankPriceList, addOrUpdateRankPrice, deleteRankPrice } from '@/api/financials'
const getListQueryDefault = () => {
return {
PageSize: 20,
PageIndex: 1,
Asc: false,
SortField: ''
}
}
export default {
name: 'RankBasedRates',
components: { Pagination },
filters: {
rounding(value) {
return value ? Number(value).toFixed(2) : value
}
},
data() {
return {
listQuery: getListQueryDefault(),
list: [],
listLoading: false,
total: 0,
baseRateForm: {},
dialogVisible: false,
btnDisabled: false,
title: '',
timer: '',
rules: {
RankName: [
{ required: true, message: 'Please specify', trigger: 'blur' },
{ max: 50, message: 'The maximum length is 50' }
],
Training: [{ required: true, message: 'Please specify', trigger: 'blur' }],
Timepoint: [{ required: true, message: 'Please specify', trigger: 'blur' }],
TimepointIn24H: [{ required: true, message: 'Please specify', trigger: 'blur' }],
TimepointIn48H: [{ required: true, message: 'Please specify', trigger: 'blur' }],
Adjudication: [{ required: true, message: 'Please specify', trigger: 'blur' }],
AdjudicationIn24H: [{ required: true, message: 'Please specify', trigger: 'blur' }],
AdjudicationIn48H: [{ required: true, message: 'Please specify', trigger: 'blur' }],
Global: [{ required: true, message: 'Please specify', trigger: 'blur' }],
Downtime: [{ required: true, message: 'Please specify', trigger: 'blur' }],
RefresherTraining: [{ required: true, message: 'Please specify', trigger: 'blur' }]
}
}
},
mounted() { this.getList() },
methods: {
getList() {
this.listLoading = true
getRankPriceList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}).catch(() => { this.listLoading = false })
},
handleAdd() {
this.baseRateForm = {}
this.timer = new Date().getTime()
this.title = 'Add'
this.dialogVisible = true
},
handleEdit(row) {
this.title = 'Edit'
this.timer = new Date().getTime()
this.baseRateForm = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
},
handleDelete(row) {
this.$confirm('Confirm to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
deleteRankPrice(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success('Deleted successfully!')
}
})
.catch(err => {
console.log(err)
})
})
},
handleSave() {
this.$refs.baseRateForm.validate(valid => {
if (valid) {
this.btnDisabled = true
addOrUpdateRankPrice(this.baseRateForm).then(res => {
this.getList()
this.btnDisabled = false
this.$message.success('Saved successfully!')
this.dialogVisible = false
}).catch(() => { this.btnDisabled = false })
}
})
},
timepointChange() {
this.baseRateForm.Global = this.baseRateForm.Timepoint / 2
}
}
}
</script>
<style lang="scss" scoped>
.rates-container {
.title {
position: relative;
height: 35px;
line-height: 35px;
background: #e4ebf1;
border-left: 3px solid #0fc8e0;
padding-left: 5px;
margin-bottom:10px;
font-size: 13px;
p{
margin: 0;
}
.addBtn {
position: absolute;
right: 0px;
top: 50%;
height: 30px;
margin-top: -15px;
}
}
}
</style>
<template>
<div class="rates-container">
<div class="title">
<p>Rank-Based Rates</p>
<el-button
type="primary"
class="addBtn"
size="small"
@click="handleAdd"
>New</el-button>
</div>
<el-table
v-loading="listLoading"
size="small"
:data="list"
max-height="300"
stripe
class="table"
>
<el-table-column type="index" width="40" />
<el-table-column prop="RankName" label="Rank" show-overflow-tooltip min-width="100" />
<el-table-column prop="Training" label="Training ($)" min-width="90" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{ scope.row.Training | rounding }}</span>
</template>
</el-table-column>
<el-table-column prop="RefresherTraining" label="Refresher Training ($)" min-width="130" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{ scope.row.RefresherTraining | rounding }}</span>
</template>
</el-table-column>
<el-table-column label="Timepoint" align="center">
<el-table-column
prop="Timepoint"
label="Regular ($)"
min-width="90"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.Timepoint | rounding }}</span>
</template>
</el-table-column>
<el-table-column
prop="TimepointIn48H"
label="48-hour ($)"
min-width="90"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.TimepointIn48H | rounding }}</span>
</template>
</el-table-column>
<el-table-column
prop="TimepointIn24H"
label="24-hour ($)"
min-width="90"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.TimepointIn24H | rounding }}</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column label="Adjudication" align="center">
<el-table-column
prop="Adjudication"
label="Regular ($)"
min-width="90"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.Adjudication | rounding }}</span>
</template>
</el-table-column>
<el-table-column
prop="AdjudicationIn48H"
label="48-hour ($)"
min-width="90"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.AdjudicationIn48H | rounding }}</span>
</template>
</el-table-column>
<el-table-column
prop="AdjudicationIn24H"
label="24-hour ($)"
min-width="90"
show-overflow-tooltip
>
<template slot-scope="scope">
<span>{{ scope.row.AdjudicationIn24H | rounding }}</span>
</template>
</el-table-column>
</el-table-column>
<el-table-column prop="Global" label="Global ($)" min-width="100" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{ scope.row.Global | rounding }}</span>
</template>
</el-table-column>
<el-table-column prop="Downtime" label="Downtime ($)" min-width="100" show-overflow-tooltip>
<template slot-scope="scope">
<span>{{ scope.row.Downtime | rounding }}</span>
</template>
</el-table-column>
<el-table-column
fixed="right"
label="Action"
min-width="100"
>
<template slot-scope="scope" min-width="130">
<el-button
size="small"
type="text"
@click="handleEdit(scope.row)"
>Edit</el-button>
<el-button
size="small"
type="text"
@click="handleDelete(scope.row)"
>Delete</el-button>
</template>
</el-table-column>
</el-table>
<pagination style="text-align:right;margin-top:5px;" :total="total" :page.sync="listQuery.PageIndex" :limit.sync="listQuery.PageSize" @pagination="getList" />
<el-dialog
:key="timer"
:title="title"
:visible.sync="dialogVisible"
width="500px"
:close-on-click-modal="false"
>
<el-form ref="baseRateForm" label-width="190px" :rules="rules" :model="baseRateForm" size="small">
<el-form-item label="Rank: " prop="RankName">
<el-input v-model="baseRateForm.RankName" />
</el-form-item>
<el-form-item label="Training ($): " prop="Training">
<!-- <el-input v-model="baseRateForm.Training" type="number" /> -->
<el-input-number v-model="baseRateForm.Training" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Refresher Training ($): " prop="RefresherTraining">
<el-input-number v-model="baseRateForm.RefresherTraining" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Timepoint ($): " prop="Timepoint">
<!-- <el-input v-model="baseRateForm.Timepoint" type="number" /> -->
<el-input-number v-model="baseRateForm.Timepoint" style="width:100%;" :min="0" @input="timepointChange" />
</el-form-item>
<el-form-item label="Timepoint 48H ($): " prop="TimepointIn48H">
<!-- <el-input v-model="baseRateForm.TimepointIn48H" type="number" /> -->
<el-input-number v-model="baseRateForm.TimepointIn48H" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Timepoint 24H ($): " prop="TimepointIn24H">
<!-- <el-input v-model="baseRateForm.TimepointIn24H" type="number" /> -->
<el-input-number v-model="baseRateForm.TimepointIn24H" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Adjudication ($): " prop="Adjudication">
<!-- <el-input v-model="baseRateForm.Adjudication" type="number" /> -->
<el-input-number v-model="baseRateForm.Adjudication" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Adjudication 48H ($): " prop="AdjudicationIn48H">
<!-- <el-input v-model="baseRateForm.AdjudicationIn48H" type="number" /> -->
<el-input-number v-model="baseRateForm.AdjudicationIn48H" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Adjudication 24H ($): " prop="AdjudicationIn24H">
<!-- <el-input v-model="baseRateForm.AdjudicationIn24H" type="number" /> -->
<el-input-number v-model="baseRateForm.AdjudicationIn24H" style="width:100%;" :min="0" />
</el-form-item>
<el-form-item label="Global ($): " prop="Global">
<el-input v-model="baseRateForm.Global" disabled type="number" />
</el-form-item>
<el-form-item label="Downtime ($): " prop="Downtime">
<el-input-number v-model="baseRateForm.Downtime" style="width:100%;" :min="0" />
<!-- <el-input v-model="baseRateForm.Downtime" type="number" /> -->
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="small" @click="dialogVisible = false">Cancel</el-button>
<el-button type="primary" :disabled="btnDisabled" size="small" @click="handleSave">Ok</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import Pagination from '@/components/Pagination'
import { getRankPriceList, addOrUpdateRankPrice, deleteRankPrice } from '@/api/financials'
const getListQueryDefault = () => {
return {
PageSize: 20,
PageIndex: 1,
Asc: false,
SortField: ''
}
}
export default {
name: 'RankBasedRates',
components: { Pagination },
filters: {
rounding(value) {
return value ? Number(value).toFixed(2) : value
}
},
data() {
return {
listQuery: getListQueryDefault(),
list: [],
listLoading: false,
total: 0,
baseRateForm: {},
dialogVisible: false,
btnDisabled: false,
title: '',
timer: '',
rules: {
RankName: [
{ required: true, message: 'Please specify', trigger: 'blur' },
{ max: 50, message: 'The maximum length is 50' }
],
Training: [{ required: true, message: 'Please specify', trigger: 'blur' }],
Timepoint: [{ required: true, message: 'Please specify', trigger: 'blur' }],
TimepointIn24H: [{ required: true, message: 'Please specify', trigger: 'blur' }],
TimepointIn48H: [{ required: true, message: 'Please specify', trigger: 'blur' }],
Adjudication: [{ required: true, message: 'Please specify', trigger: 'blur' }],
AdjudicationIn24H: [{ required: true, message: 'Please specify', trigger: 'blur' }],
AdjudicationIn48H: [{ required: true, message: 'Please specify', trigger: 'blur' }],
Global: [{ required: true, message: 'Please specify', trigger: 'blur' }],
Downtime: [{ required: true, message: 'Please specify', trigger: 'blur' }],
RefresherTraining: [{ required: true, message: 'Please specify', trigger: 'blur' }]
}
}
},
mounted() { this.getList() },
methods: {
getList() {
this.listLoading = true
getRankPriceList(this.listQuery).then(res => {
this.listLoading = false
this.list = res.Result.CurrentPageData
this.total = res.Result.TotalCount
}).catch(() => { this.listLoading = false })
},
handleAdd() {
this.baseRateForm = {}
this.timer = new Date().getTime()
this.title = 'Add'
this.dialogVisible = true
},
handleEdit(row) {
this.title = 'Edit'
this.timer = new Date().getTime()
this.baseRateForm = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
},
handleDelete(row) {
this.$confirm('Confirm to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
})
.then(() => {
deleteRankPrice(row.Id)
.then(res => {
if (res.IsSuccess) {
this.list.splice(this.list.findIndex(item => item.Id === row.Id), 1)
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
})
.catch(err => {
console.log(err)
})
})
},
handleSave() {
this.$refs.baseRateForm.validate(valid => {
if (valid) {
this.btnDisabled = true
addOrUpdateRankPrice(this.baseRateForm).then(res => {
this.getList()
this.btnDisabled = false
this.$message.success('Saved successfully!')
this.dialogVisible = false
}).catch(() => { this.btnDisabled = false })
}
})
},
timepointChange() {
this.baseRateForm.Global = this.baseRateForm.Timepoint / 2
}
}
}
</script>
<style lang="scss" scoped>
.rates-container {
.title {
position: relative;
height: 35px;
line-height: 35px;
background: #e4ebf1;
border-left: 3px solid #0fc8e0;
padding-left: 5px;
margin-bottom:10px;
font-size: 13px;
p{
margin: 0;
}
.addBtn {
position: absolute;
right: 0px;
top: 50%;
height: 30px;
margin-top: -15px;
}
}
}
</style>

View File

@ -340,11 +340,10 @@ export default {
},
handleView(row) { row.SowFullPath ? window.open(row.SowFullPath, '_blank') : '' },
handleDeleteSOW(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'OK',
cancelButtonText: 'Cancel'
})
.then(() => {
const param = { SowPath: row.SowPath, TrialId: row.TrialId }

View File

@ -92,7 +92,7 @@ export default {
if (res.IsSuccess) {
this.fileList = []
this.$message({
message: 'Deleted successfully!',
message: this.$t('common:message:deletedSuccessfully'),
type: 'success'
})
this.$emit('getFileList', this.fileList)

View File

@ -7,7 +7,7 @@
ref="resetForm"
v-loading="formLoading"
:model="form"
label-width="150px"
label-width="200px"
:rules="rules"
class="demo-ruleForm"
size="small"
@ -31,7 +31,7 @@
<el-form-item :label="$t('trials:researchForm:form:verifyCode')" required>
<el-col :span="18">
<el-form-item prop="VerificationCode">
<el-input v-model="form.VerificationCode" autocomplete="off" />
<el-input v-model="form.VerificationCode" autocomplete="off" />
</el-form-item>
</el-col>
<el-col :span="6" style="text-align:right;">
@ -122,17 +122,17 @@ export default {
}
}
}
var validatePass = (rule, value, callback) => {
if (value === '') {
//
callback(new Error(this.$t('passwordReset:formRule:password')))
} else {
if (this.CheckPass !== '') {
this.$refs.resetForm.validateField('CheckPass')
}
callback()
}
}
// var validatePass = (rule, value, callback) => {
// if (value === '') {
// //
// callback(new Error(this.$t('passwordReset:formRule:password')))
// } else {
// if (this.CheckPass !== '') {
// this.$refs.resetForm.validateField('CheckPass')
// }
// callback()
// }
// }
var validatePass2 = (rule, value, callback) => {
if (value === '' || value === undefined) {
//
@ -205,6 +205,8 @@ export default {
verifyAnonymousVerifyCode(this.form.EmailOrPhone, this.form.VerificationCode).then(res => {
this.formLoading = false
this.users = res.Result
//
this.$message.success(this.$t('passwordReset:message:verifiedSuccessfully'))
}).catch(() => { this.formLoading = false })
},
handleEmailChange() {
@ -268,7 +270,7 @@ export default {
/*/deep/ .is-error{*/
/* margin-bottom: 40px;*/
/*}*/
/deep/ .is-error.my_new_pwd{
.is-error.my_new_pwd{
margin-bottom: 40px;
}
</style>

View File

@ -7,7 +7,7 @@
<div class="login-l">
<div class="login-logo">
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="">
<img v-else src="@/assets/zzlogo3.png" alt="">
<img v-else src="@/assets/zzlogo4.png" alt="">
</div>
<div class="login-image">
<img src="@/assets/login-bg.png">
@ -78,7 +78,7 @@
type="primary"
style="width:100%;margin-bottom:10px;"
size="medium"
@click.native.prevent="loginIn"
@click.native.prevent="handleLogin"
>
{{ $t('login:button:login') }}
</el-button>
@ -109,7 +109,7 @@
<span style="color:#428bca">关于</span>
</a>
</div>
<Vcode :show="isShow" slider-text="" :imgs="[Img1]" @success="onSuccess" />
<Vcode :show="isShow" :fail-text="$t('login:button:failText')" :success-text="$t('login:button:successText')" :slider-text="$t('login:button:sliderText')" :imgs="[Img1]" @success="onSuccess" />
<el-dialog
v-if="aboutVisible"
:visible.sync="aboutVisible"
@ -148,7 +148,7 @@ import { mapGetters, mapMutations } from 'vuex'
import TopLang from './topLang'
// import NoticeMarquee from '../trials/trials-layout/components/noticeMarquee'
import Vcode from 'vue-puzzle-vcode'
import Img1 from '@/assets/pic-1.png'
import Img1 from '@/assets/pic-2.png'
export default {
name: 'Login',
components: { TopLang, Vcode },
@ -180,6 +180,7 @@ export default {
loginType: null,
location: null,
isShow: false,
showCode: false,
Img1
}
},
@ -230,7 +231,11 @@ export default {
this.loginType = this.$route.query.loginType
this.$refs.loginForm.validate(valid => {
if (valid) {
this.isShow = true
if (this.showCode) {
this.isShow = true
} else {
this.onSuccess()
}
} else {
// console.log('error submit!!')
return false
@ -239,6 +244,7 @@ export default {
},
loginIn() {
this.loading = true
this.showCode = false
this.$store.dispatch('user/login', this.loginForm).then((res) => {
if (!res) {
// ,
@ -273,6 +279,7 @@ export default {
})
})
.catch(() => {
this.showCode = true
this.loading = false
})
},

View File

@ -14,7 +14,7 @@
v-if="(state === 0 && userTypeEnumInt === 0)"
type="primary"
size="small"
@click="handleSubmit"
@click="handleSubmit('submit')"
>
{{ $t('trials:researchForm:button:submit') }}
</el-button>
@ -23,7 +23,7 @@
v-if="(state === 1 && hasPermi(['role:spm','role:cpm']))"
type="primary"
size="small"
@click="handleSubmit"
@click="handleSubmit('approve')"
>
{{ $t('trials:researchForm:button:auditPasses') }}
</el-button>
@ -243,35 +243,22 @@ export default {
}).catch(() => { this.loading = false })
},
//
handleSubmit() {
handleSubmit(type) {
if (this.userTypeEnumInt === 0) {
// if (this.$refs['researchParticipants'].list.length === 0 && this.$refs['researchEquipments'].list.length === 0) {
// this.$alert(this.$t('trials:researchForm:message:saveWarning'))
// return
// }
// var list = this.$refs['researchParticipants'].list
// var cIdx = list.findIndex(i => parseInt(i.TrialRoleCode) === 1)
// var pIdx = list.findIndex(i => parseInt(i.TrialRoleCode) === 4)
// if (cIdx === -1 || pIdx === -1) {
// // crc1
// this.$alert(this.$t('trials:researchForm:message:saveWarning1'))
// return
// }
this.loading = true
this.$refs['baseResearchInfo'].handleSave(true).then(res => {
this.loading = false
if (res) {
this.submit()
this.submit(type)
}
}).catch(() => { this.loading = false })
} else {
this.submit()
this.submit(type)
}
},
submit() {
//
this.$confirm(this.$t('trials:researchForm:message:submitWarning'), {
this.$confirm(this.userTypeEnumInt === 0 ? this.$t('trials:researchForm:message:submitWarning') : this.$t('trials:researchForm:message:submitWarning2'), {
type: 'warning',
distinguishCancelAndClose: true
}).then(() => {
@ -287,7 +274,12 @@ export default {
if (this.userTypeEnumInt !== 0) {
this.$emit('refreshPage')
}
this.$message.success(this.$t('common:message:savedSuccessfully'))
// this.$message.success(this.$t('common:message:savedSuccessfully'))
if(type === 'approve'){
this.$message.success(this.$t('common:message:approvedSuccessfully'))
}else{
this.$message.success(this.$t('trials:researchForm:message:savedSuccessfully'))
}
}
}).catch(() => { this.loading = false })
}).catch(() => {})
@ -320,7 +312,7 @@ export default {
if (res.IsSuccess) {
this.initPage()
this.$emit('refreshPage')
this.$message.success(this.$t('common:message:savedSuccessfully'))
this.$message.success(this.$t('common:message:approvedSuccessfully'))
}
}).catch(() => {
this.loading = false

View File

@ -53,13 +53,13 @@
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item :label="$t('resumeInfo:label:WeChat')">
<span>{{ basicInfo.WeChat }}</span>
</el-form-item>
</el-col>
</el-row>
<!-- <el-row>-->
<!-- <el-col :span="6">-->
<!-- <el-form-item :label="$t('resumeInfo:label:WeChat')">-->
<!-- <span>{{ basicInfo.WeChat }}</span>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
</el-form>
</div>
</template>

View File

@ -14,27 +14,27 @@
<span v-else>{{ employment.RankCN }}</span>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item :label="$t('resumeInfo:label:Physician')">
<span v-if="isEnglish">{{ employment.Physician }}</span>
<span v-else>{{ employment.PhysicianCN }}</span>
</el-form-item>
</el-col>
<!-- <el-col :span="6">-->
<!-- <el-form-item :label="$t('resumeInfo:label:Physician')">-->
<!-- <span v-if="isEnglish">{{ employment.Physician }}</span>-->
<!-- <span v-else>{{ employment.PhysicianCN }}</span>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="6">
<el-form-item :label="$t('resumeInfo:label:Position')">
<span v-if="isEnglish">{{ employment.Position }}</span>
<span v-else>{{ employment.PositionCN }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item :label="$t('resumeInfo:label:Hospital')">
<span v-if="isEnglish">{{ employment.HospitalName }}</span>
<span v-else>{{ employment.HospitalNameCN }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item :label="$t('resumeInfo:label:Affiliated')">
<span v-if="isEnglish">{{ employment.UniversityAffiliated }}</span>

View File

@ -189,8 +189,8 @@ export default {
this.pageLoading = false
if (res.IsSuccess) {
if (res.Result) {
this.holiday = res.Result.InHoliday ? 'Yes' : 'No'
this.doctorInfo = res.Result
this.holiday = res.Result.InHoliday ? 'Yes' : 'No'
!this.doctorInfo.ResearchPublicationView ? this.doctorInfo.ResearchPublicationView = {} : '';
this.title = `${this.doctorInfo.BasicInfoView.FirstName} ${this.doctorInfo.BasicInfoView.LastName}${this.$t('resumeInfo:title:Details')}`
this.htmlTitle = this.title

View File

@ -3,7 +3,8 @@
<div class="box-wrapper">
<h2 style="text-align:center;">
<!-- 中心调研表 -->
独立阅片人信息填写
<!-- 独立阅片人信息填写 -->
{{$t("trials:researchForm:form:title")}}
</h2>
<el-card shadow="hover" style="padding-top: 40px">
<el-form
@ -58,6 +59,7 @@ import { sendVerifyCode, verifySendCode, getTrialSurveyInitInfo } from '@/api/re
import { verifyEmialGetDoctorInfo, sendEmialVerifyCode } from '@/api/reviewers'
import { login, getUserMenuTree, getUserPermissions } from '@/api/user'
import store from '@/store'
import { mapMutations } from 'vuex'
export default {
data() {
var checkPhone = (rule, value, callback) => {
@ -149,9 +151,14 @@ export default {
isHaveSiteSurveyRecord: false
}
},
created(){
this.$i18n.locale = this.$route.query.lang
this.setLanguage(this.$route.query.lang)
},
mounted() {
},
methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }),
//
onSubmit() {
this.$refs['resetForm'].validate(valid => {
@ -176,7 +183,7 @@ export default {
store.dispatch('user/setTree', menuTree.Result)
store.dispatch('user/setPermissions', permissions.Result)
// this.$router.push({ path: `/researchForm?trialId=${this.trialId}&trialSiteSurveyId=${res.Result.TrialSiteSurveyId}` })
this.$router.push({path: `/ReviewersResearchForm?Id=${res.Result.DoctorId ? res.Result.DoctorId : ''}&tabActive=BasicInfo&ReviewStatus=${res.Result.ReviewStatus}`})
this.$router.push({path: `/ReviewersResearchForm?Id=${res.Result.DoctorId ? res.Result.DoctorId : ''}&tabActive=BasicInfo&ReviewStatus=${res.Result.ReviewStatus}&lang=${this.$route.query.lang}`})
}).catch(() => {
this.btnLoading = false
this.sendDisabled = false

View File

@ -1,32 +1,33 @@
<template>
<div class="app-container">
<el-tabs v-model="active" :before-leave="checkLeave" @tab-click="clickTab">
<el-tab-pane label="Basic Info" name="BasicInfo">
<el-tab-pane :label="$t('system:reviewer:tab:BasicInfo')" name="BasicInfo">
<basic-info v-if="load.BasicInfo" />
</el-tab-pane>
<el-tab-pane label="Employment" name="Employment">
<el-tab-pane :label="$t('system:reviewer:tab:Employment')" name="Employment">
<Employment v-if="load.Employment" />
</el-tab-pane>
<el-tab-pane label="Specialty" name="Specialty">
<el-tab-pane :label="$t('system:reviewer:tab:Specialty')" name="Specialty">
<specialty v-if="load.Specialty" />
</el-tab-pane>
<el-tab-pane label="Education & Training" name="EducationTraining">
<!--Education & Training-->
<el-tab-pane :label="$t('system:reviewer:tab:Education&Training')" name="EducationTraining">
<education-training v-if="load.EducationTraining" />
</el-tab-pane>
<el-tab-pane label="Research & Publication" name="ResearchPublication">
<!--Research & Publication-->
<el-tab-pane :label="$t('system:reviewer:tab:Research&Publication')" name="ResearchPublication">
<research-publication v-if="load.ResearchPublication" />
</el-tab-pane>
<el-tab-pane label="Trial Experience" name="TrialExperience">
<el-tab-pane :label="$t('system:reviewer:tab:TrialExperience')" name="TrialExperience">
<trial-experience v-if="load.TrialExperience" />
</el-tab-pane>
<el-tab-pane label="Credentials" name="Credentials">
<el-tab-pane :label="$t('system:reviewer:tab:Credentials')" name="Credentials">
<Credentials v-if="load.Credentials" />
</el-tab-pane>
<el-tab-pane label="Resumes" name="Resumes">
<el-tab-pane :label="$t('system:reviewer:tab:Resumes')" name="Resumes">
<Resumes v-if="load.Resumes" />
</el-tab-pane>
<el-tab-pane label="Agreements" name="Agreements">
<el-tab-pane :label="$t('system:reviewer:tab:Agreements')" name="Agreements">
<Agreements v-if="load.Agreements" />
</el-tab-pane>
</el-tabs>
@ -44,6 +45,7 @@ import Resumes from './components/Resumes'
import Agreements from './components/Agreements'
import Setting from './components/Setting'
import { changeURLStatic, getQueryString } from '@/utils/history.js'
import { mapMutations } from 'vuex'
export default {
components: {
BasicInfo,
@ -74,6 +76,10 @@ export default {
}
}
},
created(){
this.$i18n.locale = this.$route.query.lang
this.setLanguage(this.$route.query.lang)
},
mounted() {
this.active = this.$route.query.tabActive
if (this.$route.query.Id === '' && this.active !== 'BasicInfo') {
@ -82,13 +88,14 @@ export default {
this.load[this.active] = true
},
methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }),
clickTab(tab, event) {
if (this.load[tab.name] === false) {
this.load[tab.name] = true
}
changeURLStatic('tabActive', tab.name)
const id = getQueryString('Id')
this.$router.push({ path: `/ReviewersResearchForm?Id=${id}&tabActive=${tab.name}&ReviewStatus=${getQueryString('ReviewStatus')}` })
this.$router.push({ path: `/ReviewersResearchForm?Id=${id}&tabActive=${tab.name}&ReviewStatus=${getQueryString('ReviewStatus')}&lang=${this.$i18n.locale}` })
},
checkLeave() {
const id = getQueryString('Id')

View File

@ -1,21 +1,21 @@
<template>
<div v-loading="loading" class="resumes-container">
<div class="resume-content" v-if="!$route.query.ReviewStatus">
<p>Consultant Agreement</p>
<p>{{$t('system:Agreements:title:Consultant Agreement')}}</p>
<div class="upload-content">
<upload-files ref="uploadAgreement" :disabled="$route.query.ReviewStatus === '1'" :doctor-id="doctorId" type="Consultant Agreement" accept=".pdf" @getFileList="getFileList" />
</div>
<p>(must be in pdf format)</p>
<p>{{ $t('system:GcpCertificate:tap:must') }}</p>
</div>
<div v-if="!$route.query.ReviewStatus">
<el-table :data="agreementList" size="small">
<el-table-column type="index" width="40" />
<el-table-column prop="FileName" label="Consultant Agreement" width="300" />
<el-table-column prop="CreateTime" label="Upload Time" width="150" />
<el-table-column label="Action" width="400">
<el-table-column prop="FileName" :label="$t('system:Agreements:table:Consultant Agreement')" width="300" />
<el-table-column prop="CreateTime" :label="$t('system:Agreements:table:Upload Time')" width="150" />
<el-table-column :label="$t('common:action:action')" width="400">
<template slot-scope="scope">
<el-button type="text" size="small" @click="handlePreview(scope.row)">View</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleRemoveFile(scope.row)">Delete</el-button>
<el-button type="text" size="small" @click="handlePreview(scope.row)">{{$t('trials:enrolledReviews:button:view')}}</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleRemoveFile(scope.row)">{{$t('common:button:delete')}}</el-button>
</template>
</el-table-column>
</el-table>
@ -24,21 +24,22 @@
<span style="margin-right: 20px">
{{$t('trials:enrolledReviews:message:SOW')}}
</span>
<el-button size="small" type="primary" :disabled="$route.query.ReviewStatus === '1'" @click="addCol(0, $t('trials:enrolledReviews:message:SOW'))">Upload</el-button>
<el-button size="small" type="primary" :disabled="$route.query.ReviewStatus === '1'" @click="addCol(0, $t('trials:enrolledReviews:message:SOW'))">
{{ $t('common:button:upload') }}</el-button>
<el-button size="small" type="primary" @click="handleDownload('Reviewer_SOW_Template')">
<i class="el-icon-view el-icon-download"></i>
Template
{{ $t('common:button:template') }}
</el-button>
</div>
<el-table :data="sowList" size="small">
<el-table-column type="index" width="40" />
<el-table-column label="Criterion Type" width="120">
<el-table-column :label="$t('system:Agreements:table:Criterion Type')" width="120">
<template slot-scope="scope">
{{ scope.row.CriterionName }}
</template>
</el-table-column>
<el-table-column prop="FileName" label="Statement of Work" width="400" />
<el-table-column prop="IsEnable" label="Is Enable" width="100">
<el-table-column prop="FileName" :label="$t('system:Agreements:table:Statement of Work')" width="400" />
<el-table-column prop="IsEnable" :label="$t('system:Agreements:table:Is Enable')" width="100">
<template slot-scope="scope">
<el-switch
v-model="scope.row.IsEnable"
@ -48,13 +49,14 @@
/>
</template>
</el-table-column>
<el-table-column prop="Remark" label="Remark" width="200" />
<el-table-column prop="CreateTime" label="Upload Time" width="150" />
<el-table-column label="Action" width="400">
<el-table-column prop="Remark" :label="$t('system:Agreements:Remark')" width="200" />
<el-table-column prop="CreateTime" :label="$t('system:Agreements:Upload Time')" width="150" />
<el-table-column :label="$t('common:action:action')" width="400">
<template slot-scope="scope">
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handlePreview3(scope.row)">View</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleEditCol(scope.row, 0, $t('trials:enrolledReviews:message:SOW'))">Edit</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleRemoveFile3(scope.row)">Delete</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handlePreview3(scope.row)">{{$t('trials:enrolledReviews:button:view')}}</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleEditCol(scope.row, 0, $t('trials:enrolledReviews:message:SOW'))">
{{ $t('common:button:edit') }}</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleRemoveFile3(scope.row)">{{ $t('common:button:delete') }}</el-button>
</template>
</el-table-column>
</el-table>
@ -62,17 +64,17 @@
<span style="margin-right: 20px">
{{$t('trials:enrolledReviews:message:EQC')}}
</span>
<el-button size="small" type="primary" :disabled="$route.query.ReviewStatus === '1'" @click="addCol(1, $t('trials:enrolledReviews:message:EQC'))">Upload</el-button>
<el-button size="small" type="primary" :disabled="$route.query.ReviewStatus === '1'" @click="addCol(1, $t('trials:enrolledReviews:message:EQC'))">{{$t('common:button:upload')}}</el-button>
</div>
<el-table :data="ackSowList" size="small" v-if="!$route.query.ReviewStatus">
<el-table-column type="index" width="40" />
<el-table-column label="Criterion Type" width="120">
<el-table-column :label="$t('system:Agreements:table:Criterion Type')" width="120">
<template slot-scope="scope">
{{ scope.row.CriterionName }}
</template>
</el-table-column>
<el-table-column prop="FileName" label="Acknowledgement of SOW" width="400" />
<el-table-column prop="IsEnable" label="Is Enable" width="100">
<el-table-column prop="FileName" :label="$t('system:Agreements:table:Acknowledgement of SOW')" width="400" />
<el-table-column prop="IsEnable" :label="$t('system:Agreements:table:Is Enable')" width="100">
<template slot-scope="scope">
<el-switch
v-model="scope.row.IsEnable"
@ -82,13 +84,13 @@
/>
</template>
</el-table-column>
<el-table-column prop="Remark" label="Remark" width="200" />
<el-table-column prop="CreateTime" label="Upload Time" width="150" />
<el-table-column prop="Remark" :label="$t('system:Agreements:table:Remark')" width="200" />
<el-table-column prop="CreateTime" :label="$t('system:Agreements:table:Upload Time')" width="150" />
<el-table-column label="Action" width="400">
<template slot-scope="scope">
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handlePreview3(scope.row)">View</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleEditCol(scope.row, 1, $t('trials:enrolledReviews:message:EQC'))">Edit</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleRemoveFile3(scope.row)">Delete</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handlePreview3(scope.row)">{{$t('common:button:view')}}</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleEditCol(scope.row, 1, $t('trials:enrolledReviews:message:EQC'))">{{$t('common:button:edit')}}</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleRemoveFile3(scope.row)">{{$t('common:button:delete')}}</el-button>
</template>
</el-table-column>
</el-table>
@ -101,7 +103,7 @@
label-width="120px"
size="small"
>
<el-form-item label="Criterion Type " prop="CriterionType">
<el-form-item :label="$t('system:Agreements:label:Criterion Type')" prop="CriterionType">
<el-select v-model="form.CriterionType">
<el-option
v-for="item of $d.CriterionType"
@ -111,7 +113,7 @@
/>
</el-select>
</el-form-item>
<el-form-item label="File" prop="FilePath">
<el-form-item :label="$t('system:Agreements:label:File')" prop="FilePath">
<el-upload
class="upload-demo"
action
@ -126,11 +128,11 @@
<el-button size="small" type="primary" :disabled="fileList.length > 0">{{$t('common:button:upload')}}</el-button>
</el-upload>
</el-form-item>
<el-form-item label="Remark">
<el-form-item :label="$t('system:Agreements:label:Remark')">
<el-input v-model="form.Remark" type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"></el-input>
</el-form-item>
<el-form-item label="Is Enable">
<el-form-item :label="$t('system:Agreements:label:Is Enable')">
<el-switch
v-model="form.IsEnable"
:active-value="true"
@ -140,8 +142,8 @@
</el-form>
</template>
<template slot="dialog-footer">
<el-button :disabled="btnLoading" size="small" type="primary" @click="handleCancle">Cancel</el-button>
<el-button size="small" type="primary" :loading="btnLoading" @click="handleSave">Save</el-button>
<el-button :disabled="btnLoading" size="small" type="primary" @click="handleCancle">{{ $t('common:button:cancel') }}</el-button>
<el-button size="small" type="primary" :loading="btnLoading" @click="handleSave">{{ $t('common:button:save') }}</el-button>
</template>
</BaseModel>
</div>
@ -272,6 +274,7 @@ export default {
this.model_cfg.title = title
},
initSowList() {
if (!this.doctorId) return
getDoctorCriterionFile({
fileType: 0,
DoctorId: this.doctorId

View File

@ -15,31 +15,31 @@
>
<el-row>
<el-col :span="12">
<el-form-item v-if="basicInfo.ReviewerCode" label="ID: ">
<el-form-item v-if="basicInfo.ReviewerCode" :label="$t('system:reviewer:label:Id')">
<el-input v-model="basicInfo.ReviewerCode" disabled size="small" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="Surname: " prop="LastName">
<el-form-item :label="$t('system:reviewer:label:LastName')" prop="LastName">
<el-input v-model="basicInfo.LastName" :disabled="$route.query.ReviewStatus === '1'" size="small" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="Given Name: " prop="FirstName">
<el-form-item :label="$t('system:reviewer:label:FirstName')" prop="FirstName">
<el-input v-model="basicInfo.FirstName" :disabled="$route.query.ReviewStatus === '1'" size="small" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="Name CN: " prop="ChineseName">
<el-form-item :label="$t('system:reviewer:label:NameCN')" prop="ChineseName">
<el-input v-model="basicInfo.ChineseName" :disabled="$route.query.ReviewStatus === '1'" size="small" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="Gender: " prop="Sex">
<el-form-item :label="$t('system:reviewer:label:Gender')" prop="Sex">
<el-select
v-model="basicInfo.Sex"
prop="Sex"
@ -59,12 +59,12 @@
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="Phone: " prop="Phone">
<el-form-item :label="$t('system:reviewer:label:Phone')" prop="Phone">
<el-input :disabled="$route.query.ReviewStatus === '1'" v-model="basicInfo.Phone" size="small" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="Title: " prop="TitleIds">
<el-form-item :label="$t('system:reviewer:label:Title')" prop="TitleIds">
<el-select
:disabled="$route.query.ReviewStatus === '1'"
v-model="basicInfo.TitleIds[0]"
@ -89,17 +89,15 @@
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="EMail: " prop="EMail">
<el-form-item :label="$t('system:reviewer:label:Email')" prop="EMail">
<el-input v-model="basicInfo.EMail" :disabled="$route.query.ReviewStatus === '1'" size="small" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="WeChat: " prop="WeChat">
<el-input v-model="basicInfo.WeChat" :disabled="$route.query.ReviewStatus === '1'" size="small" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<!-- <el-col :span="12">-->
<!-- <el-form-item label="WeChat: " prop="WeChat">-->
<!-- <el-input v-model="basicInfo.WeChat" :disabled="$route.query.ReviewStatus === '1'" size="small" />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12">
<!-- <el-form-item label="Payment Type: " prop="Nation">
<el-radio-group v-model="basicInfo.Nation">
@ -108,7 +106,7 @@
</el-radio-group>
</el-form-item> -->
<el-form-item label="Payment Type: " prop="Nation">
<el-form-item :label="$t('system:reviewer:label:Country')" prop="Nation">
<el-select
:disabled="$route.query.ReviewStatus === '1'"
v-model="basicInfo.Nation"
@ -116,11 +114,13 @@
clearable
class="mr"
>
<el-option v-for="item of $d.AttendedReviewerType" :value="item.value" :label="item.label" />
<el-option v-for="item of $d.AttendedReviewerType" :value="item.value" :label="item.label" :key="item.id"/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- <el-row>-->
<!-- </el-row>-->
<el-row>
<el-form-item style="margin-left: 120px">
<el-button
@ -129,7 +129,7 @@
:loading="isDisabled"
size="small"
@click="handleSave"
>Save</el-button>
> {{ $t('common:button:save') }}</el-button>
</el-form-item>
</el-row>
</el-form>

View File

@ -2,7 +2,7 @@
<div class="credentials-container">
<div class="clearfix">
<el-card class="e-card">
<p class="title">Diploma of the highest medical degree 最高医学学位毕业证书
<p class="title">{{$t('system:Credentials:title:Diploma of the highest medical degree')}}
</p>
<upload-file :doctor-id="doctorId" type="Diploma of the highest medical degree" />
<!-- <el-button size="mini" type="primary" style="position: absolute;bottom:10px;right: 10px;" @click="handleDownload('Reviewer_DiplomaOfTheHighestMedicalDegree_Template')">-->
@ -12,7 +12,7 @@
</el-card>
<el-card class="e-card">
<p class="title">Medical Qualification Certificate 医师资格证
<p class="title">{{$t('system:Credentials:title:Medical Qualification Certificate')}}
<!-- <el-button size="mini" type="primary" style="position: absolute;bottom:10px;right: 10px;" @click="handleDownload('Reviewer_MedicalQualificationCertificate_Template')">-->
<!-- <i class="el-icon-view el-icon-download"></i>-->
<!-- Template-->
@ -22,7 +22,7 @@
</el-card>
<el-card class="e-card">
<p class="title">Practice License 医师执业证
<p class="title">{{$t('system:Credentials:title:Practice License')}}
<!-- <el-button size="mini" type="primary" style="position: absolute;bottom:10px;right: 10px;" @click="handleDownload('Reviewer_PracticeLicense_Template')">-->
<!-- <i class="el-icon-view el-icon-download"></i>-->
<!-- Template-->
@ -31,7 +31,7 @@
<upload-file :doctor-id="doctorId" type="Practice License" />
</el-card>
</div>
<h6 style="line-height:30px;font-size:13px;">Modality Certificate 大型医用设备上岗证</h6>
<h6 style="line-height:30px;font-size:13px;">{{$t('system:Credentials:title:Modality Certificate')}}</h6>
<div class="clearfix">
<el-card class="e-card">
<p class="title">CT

View File

@ -1,8 +1,9 @@
<template>
<div v-loading="loading" class="form-container">
<div class="title-wrapper">
<p>Education (in chronological order)</p>
<el-button class="add" :disabled="$route.query.ReviewStatus === '1'" size="small" @click="handleAddEducation">Add</el-button>
<p>{{ $t('system:reviewer:title:Education') }}</p>
<el-button class="add" :disabled="$route.query.ReviewStatus === '1'" size="small" @click="handleAddEducation">
{{ $t('common:button:add') }}</el-button>
</div>
<el-table
ref="educationTbl"
@ -14,29 +15,29 @@
<el-table-column type="index" width="30" />
<el-table-column
prop="BeginDateStr"
label="Start"
:label="$t('system:EducationTraining:table:Start')"
min-width="55"
show-overflow-tooltip
/>
<el-table-column
prop="EndDateStr"
label="End"
:label="$t('system:EducationTraining:table:End')"
min-width="55"
show-overflow-tooltip
/>
<el-table-column prop="Degree" label="Degree" min-width="70" show-overflow-tooltip>
<el-table-column prop="Degree" :label="$t('system:EducationTraining:table:Degree')" min-width="70" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.DegreeCN?`${scope.row.Degree} / ${scope.row.DegreeCN}`:scope.row.Degree }}
</template>
</el-table-column>
<el-table-column prop="Major" label="Major" min-width="120" show-overflow-tooltip>
<el-table-column prop="Major" :label="$t('system:EducationTraining:table:Major')" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.MajorCN?`${scope.row.Major} / ${scope.row.MajorCN}`:scope.row.Major }}
</template>
</el-table-column>
<el-table-column
prop="Organization"
label="Institution"
:label="$t('system:EducationTraining:table:Institution')"
min-width="150"
show-overflow-tooltip
>
@ -44,32 +45,35 @@
{{ scope.row.OrganizationCN?`${scope.row.Organization} / ${scope.row.OrganizationCN}`:scope.row.Organization }}
</template>
</el-table-column>
<el-table-column prop="City" label="City" min-width="90" show-overflow-tooltip>
<el-table-column prop="City" :label="$t('system:EducationTraining:table:City')" min-width="90" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.CityCN?`${scope.row.City} / ${scope.row.CityCN}`:scope.row.City }}
</template>
</el-table-column>
<el-table-column prop="Province" label="State/Province" min-width="90" show-overflow-tooltip>
<el-table-column prop="Province" :label="$t('system:EducationTraining:table:State/Province')" min-width="90" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.ProvinceCN?`${scope.row.Province} / ${scope.row.ProvinceCN}`:scope.row.Province }}
</template>
</el-table-column>
<el-table-column prop="Country" label="Country" min-width="80" show-overflow-tooltip>
<el-table-column prop="Country" :label="$t('system:EducationTraining:table:Country')" min-width="80" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.CountryCN?`${scope.row.Country} / ${scope.row.CountryCN}`:scope.row.Country }}
</template>
</el-table-column>
<el-table-column label="Operation" min-width="120">
<el-table-column :label="$t('system:EducationTraining:table:Operation')" min-width="120">
<template slot-scope="scope">
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleEducationEdit(scope.row)">Edit</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleEducationDelete(scope.row)">Delete</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleEducationEdit(scope.row)">
{{ $t('common:button:edit') }}</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleEducationDelete(scope.row)">
{{ $t('common:button:delete') }}</el-button>
</template>
</el-table-column>
</el-table>
<div class="title-wrapper" style="margin-top:40px;">
<p>Postgraduate Training (in chronological order)</p>
<el-button class="add" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleAddPostgraduate">Add</el-button>
<p>{{ $t('system:reviewer:title:Postgraduate') }}</p>
<el-button class="add" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleAddPostgraduate">
{{ $t('common:button:add') }}</el-button>
</div>
<el-table
ref="postgraduateTbl"
@ -81,24 +85,24 @@
<el-table-column type="index" width="30" />
<el-table-column
prop="BeginDateStr"
label="Start"
:label="$t('system:EducationTraining:table:Start')"
min-width="55"
show-overflow-tooltip
/>
<el-table-column
prop="EndDateStr"
label="End"
:label="$t('system:EducationTraining:table:End')"
min-width="55"
show-overflow-tooltip
/>
<el-table-column prop="Training" label="Training" min-width="70" show-overflow-tooltip>
<el-table-column prop="Training" :label="$t('system:EducationTraining:table:Training')" min-width="70" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.TrainingCN?`${scope.row.Training} / ${scope.row.TrainingCN}`:scope.row.Training }}
</template>
</el-table-column>
<el-table-column
prop="Major"
label="Specialty/Research Field"
:label="$t('system:EducationTraining:table:Specialty/Research Field')"
min-width="155"
show-overflow-tooltip
>
@ -106,32 +110,32 @@
{{ scope.row.MajorCN?`${scope.row.Major} / ${scope.row.MajorCN}`:scope.row.Major }}
</template>
</el-table-column>
<el-table-column prop="Hospital" label="Hospital" min-width="120" show-overflow-tooltip>
<el-table-column prop="Hospital" :label="$t('system:EducationTraining:table:Hospital')" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.HospitalCN?`${scope.row.Hospital} / ${scope.row.HospitalCN}`:scope.row.Hospital }}
</template>
</el-table-column>
<el-table-column prop="School" label="University" min-width="120" show-overflow-tooltip>
<el-table-column prop="School" :label="$t('system:EducationTraining:table:University')" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.SchoolCN?`${scope.row.School} / ${scope.row.SchoolCN}`:scope.row.School }}
</template>
</el-table-column>
<el-table-column prop="City" label="City" min-width="100" show-overflow-tooltip>
<el-table-column prop="City" :label="$t('system:EducationTraining:table:City')" min-width="100" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.CityCN?`${scope.row.City} / ${scope.row.CityCN}`:scope.row.City }}
</template>
</el-table-column>
<el-table-column prop="Province" label="State/Province" min-width="100" show-overflow-tooltip>
<el-table-column prop="Province" :label="$t('system:EducationTraining:table:State/Province')" min-width="100" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.ProvinceCN?`${scope.row.Province} / ${scope.row.ProvinceCN}`:scope.row.Province }}
</template>
</el-table-column>
<el-table-column prop="Country" label="Country" min-width="90" show-overflow-tooltip>
<el-table-column prop="Country" :label="$t('system:EducationTraining:table:Country')" min-width="90" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.CountryCN?`${scope.row.Country} / ${scope.row.CountryCN}`:scope.row.Country }}
</template>
</el-table-column>
<el-table-column label="Operation" min-width="120">
<el-table-column :label="$t('system:EducationTraining:table:Operation')" min-width="120">
<template slot-scope="scope">
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handlePostgraduateEdit(scope.row)">Edit</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handlePostgraduateDelete(scope.row)">Delete</el-button>
@ -147,7 +151,7 @@
:close-on-click-modal="false"
>
<el-form v-if="educationDialogVisible" ref="educationForm" size="small" label-width="120px" :model="educationForm" :rules="educationRules">
<el-form-item label="Start" prop="BeginDate">
<el-form-item :label="$t('system:EducationTraining:table:Start')" prop="BeginDate">
<el-date-picker
v-model="educationForm.BeginDate"
type="month"
@ -158,7 +162,7 @@
:picker-options="beginPickerOption"
/>
</el-form-item>
<el-form-item label="End" prop="EndDate">
<el-form-item :label="$t('system:EducationTraining:table:End')" prop="EndDate">
<el-date-picker
v-model="educationForm.EndDate"
type="month"
@ -169,8 +173,8 @@
:picker-options="endpickerOption"
/>
</el-form-item>
<el-form-item label="Degree" prop="Degree">
<el-select v-model="educationForm.Degree" placeholder="Please select" size="small">
<el-form-item :label="$t('system:EducationTraining:table:Degree')" prop="Degree">
<el-select v-model="educationForm.Degree" size="small">
<el-option
v-for="item in degreeOptions"
:key="item.value"
@ -180,7 +184,7 @@
</el-select>
</el-form-item>
<el-form-item label="Major" prop="Major">
<el-form-item :label="$t('system:EducationTraining:table:Major')" prop="Major">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input v-model="educationForm.Major" placeholder="Please specify in English" size="small" />
@ -190,7 +194,7 @@
</el-col>
</el-row>
</el-form-item>
<el-form-item label="Institution" prop="Organization">
<el-form-item :label="$t('system:EducationTraining:table:Institution')" prop="Organization">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input v-model="educationForm.Organization" placeholder="Please specify in English" size="small" />
@ -200,7 +204,7 @@
</el-col>
</el-row>
</el-form-item>
<el-form-item label="City" prop="City">
<el-form-item :label="$t('system:EducationTraining:table:City')" prop="City">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input v-model="educationForm.City" placeholder="Please specify in English" size="small" />
@ -211,7 +215,7 @@
</el-row>
</el-form-item>
<el-form-item label="State/Province" prop="Province">
<el-form-item :label="$t('system:EducationTraining:table:State/Province')" prop="Province">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input v-model="educationForm.Province" placeholder="Please specify in English" size="small" />
@ -221,7 +225,7 @@
</el-col>
</el-row>
</el-form-item>
<el-form-item label="Country" prop="Country">
<el-form-item :label="$t('system:EducationTraining:table:Country')" prop="Country">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input v-model="educationForm.Country" placeholder="Please specify in English" size="small" />
@ -233,7 +237,7 @@
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" size="small" :loading="isDisabled" @click="handleEducationSave">Save</el-button>
<el-button type="primary" size="small" :loading="isDisabled" @click="handleEducationSave">{{ $t('common:button:save') }}</el-button>
</span>
</el-dialog>
@ -245,7 +249,7 @@
:close-on-click-modal="false"
>
<el-form v-if="postgraduateDialogVisible" ref="postgraduateForm" size="small" label-width="190px" :model="postgraduateForm" :rules="postgraduateRules">
<el-form-item label="Start" prop="BeginDate">
<el-form-item :label="$t('system:EducationTraining:table:Start')" prop="BeginDate">
<el-date-picker
v-model="postgraduateForm.BeginDate"
type="month"
@ -256,7 +260,7 @@
size="small"
/>
</el-form-item>
<el-form-item label="End" prop="EndDate">
<el-form-item :label="$t('system:EducationTraining:table:End')" prop="EndDate">
<el-date-picker
v-model="postgraduateForm.EndDate"
type="month"
@ -267,7 +271,7 @@
size="small"
/>
</el-form-item>
<el-form-item label="Training" prop="Training">
<el-form-item :label="$t('system:EducationTraining:table:Training')" prop="Training">
<el-select v-model="postgraduateForm.Training" placeholder="Please select" size="small">
<el-option
v-for="item in TrainingOptions"
@ -277,7 +281,7 @@
/>
</el-select>
</el-form-item>
<el-form-item label="Specialty / Research Field" prop="Major">
<el-form-item :label="$t('system:EducationTraining:table:Specialty/Research Field')" prop="Major">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input v-model="postgraduateForm.Major" placeholder="Please specify in English" size="small" />
@ -287,7 +291,7 @@
</el-col>
</el-row>
</el-form-item>
<el-form-item label="Hospital" prop="Hospital">
<el-form-item :label="$t('system:EducationTraining:table:Hospital')" prop="Hospital">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input v-model="postgraduateForm.Hospital" placeholder="Please specify in English" size="small" />
@ -297,7 +301,7 @@
</el-col>
</el-row>
</el-form-item>
<el-form-item label="University" prop="School">
<el-form-item :label="$t('system:EducationTraining:table:University')" prop="School">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input v-model="postgraduateForm.School" placeholder="Please specify in English" size="small" />
@ -308,7 +312,7 @@
</el-row>
</el-form-item>
<el-form-item label="City" prop="City">
<el-form-item :label="$t('system:EducationTraining:table:City')" prop="City">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input v-model="postgraduateForm.City" placeholder="Please specify in English" size="small" />
@ -318,7 +322,7 @@
</el-col>
</el-row>
</el-form-item>
<el-form-item label="State/Province" prop="Province">
<el-form-item :label="$t('system:EducationTraining:table:State/Province')" prop="Province">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input v-model="postgraduateForm.Province" placeholder="Please specify in English" size="small" />
@ -328,7 +332,7 @@
</el-col>
</el-row>
</el-form-item>
<el-form-item label="Country" prop="Country">
<el-form-item :label="$t('system:EducationTraining:table:Country')" prop="Country">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input v-model="postgraduateForm.Country" placeholder="Please specify in English" size="small" />
@ -340,7 +344,7 @@
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button size="small" type="primary" :loading="isDisabled" @click="handlePostgraduateSave">Save</el-button>
<el-button size="small" type="primary" :loading="isDisabled" @click="handlePostgraduateSave">{{ $t('common:button:save') }}</el-button>
</span>
</el-dialog>
</div>
@ -528,7 +532,6 @@ export default {
if (valid) {
this.isDisabled = true
this.educationForm.DoctorId = this.$route.query.Id
if (this.educationForm.Degree === 'Bachelor') {
this.educationForm.DegreeCN = '学士'
} else if (this.educationForm.Degree === 'Master') {
@ -564,8 +567,7 @@ export default {
this.$confirm('Confirm to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'OK',
cancelButtonText: 'Cancel'
})
.then(() => {
deleteEducationInfo(row.Id)
@ -633,8 +635,7 @@ export default {
this.$confirm('Confirm to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'OK',
cancelButtonText: 'Cancel'
})
.then(() => {
deletePostgraduateInfo(row.Id)

View File

@ -13,7 +13,7 @@
<el-row>
<el-col :span="14">
<el-form-item label="Hospital: " prop="HospitalId">
<el-form-item :label="$t('system:reviewer:label:Hospital')" prop="HospitalId">
<el-select
v-model="employmentForm.HospitalId"
placeholder="select"
@ -39,13 +39,12 @@
<el-row>
<el-col :span="14">
<el-form-item label="Affiliated University: ">
<el-form-item :label="$t('system:reviewer:label:AffiliatedUniversity')">
<el-input
:disabled="$route.query.ReviewStatus === '1'"
v-model="UniversityAffiliated"
type="textarea"
autosize
disabled
size="small"
/>
</el-form-item>
@ -53,29 +52,29 @@
</el-row>
<el-row>
<el-col :span="14">
<el-form-item label="City: ">
<el-input :disabled="$route.query.ReviewStatus === '1'" v-model="City" disabled size="small" />
<el-form-item :label="$t('system:reviewer:label:City')">
<el-input :disabled="$route.query.ReviewStatus === '1'" v-model="City" size="small" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="14">
<el-form-item label="State/Province: ">
<el-input :disabled="$route.query.ReviewStatus === '1'" v-model="Province" disabled size="small" />
<el-form-item :label="$t('system:reviewer:label:State/Province')">
<el-input :disabled="$route.query.ReviewStatus === '1'" v-model="Province" size="small" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="14">
<el-form-item label="Country: ">
<el-input :disabled="$route.query.ReviewStatus === '1'" v-model="Country" disabled size="small" />
<el-form-item :label="$t('system:reviewer:label:Country')">
<el-input :disabled="$route.query.ReviewStatus === '1'" v-model="Country" size="small" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="14">
<el-form-item label="Department: " prop="DepartmentId">
<el-form-item :label="$t('system:reviewer:label:Department')" prop="DepartmentId">
<el-select
v-model="employmentForm.DepartmentId"
placeholder="select"
@ -123,7 +122,7 @@
<el-row>
<el-col :span="14">
<el-form-item label="Rank: " prop="RankId">
<el-form-item :label="$t('system:reviewer:label:Rank')" prop="RankId">
<el-select
:disabled="$route.query.ReviewStatus === '1'"
v-model="employmentForm.RankId"
@ -141,7 +140,7 @@
<el-option
v-for="item of $d.Rank"
:key="item.id"
:label="item.raw.Value"
:label="item.label"
:value="item.id"
/>
<!-- <el-option label="Other" :value="otherId" />-->
@ -170,99 +169,98 @@
</el-col>
</el-row>
<el-row>
<el-col :span="14">
<el-form-item label="Physician: " prop="PhysicianId" >
<el-select
v-model="employmentForm.PhysicianId"
placeholder="select"
:disabled="$route.query.ReviewStatus === '1'"
@change="PhysicianChange"
style="width:100%;"
size="small"
>
<el-option
v-for="item of $d.PhysicianOriginal"
:key="item.id"
:label="item.raw.Value"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item v-if="$fd('PhysicianOriginal', employmentForm.PhysicianId, 'id') === '其它' || $fd('PhysicianOriginal', employmentForm.PhysicianId, 'id') === 'Other'" class="other-item" prop="Physician">
<el-input
:disabled="$route.query.ReviewStatus === '1'"
v-model="employmentForm.Physician"
placeholder="Please specify"
size="small"
/>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item v-if="$fd('PhysicianOriginal', employmentForm.PhysicianId, 'id') === '其它' || $fd('PhysicianOriginal', employmentForm.PhysicianId, 'id') === 'Other'" class="other-item" prop="PhysicianCN">
<el-input
:disabled="$route.query.ReviewStatus === '1'"
v-model="employmentForm.PhysicianCN"
placeholder="请用中文注明"
size="small"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="14">
<el-form-item label="Position: " prop="PositionId">
<el-select
:disabled="$route.query.ReviewStatus === '1'"
v-model="employmentForm.PositionId"
placeholder="select"
style="width:100%;"
size="small"
>
<!-- <el-option
v-for="(key,value) of dictionaryList.Position"
:key="key"
:label="key"
:value="value"
/> -->
<el-option
v-for="item of dictionaryList.Position"
:key="item.Id"
:label="item.Value"
:value="item.Id"
/>
<el-option label="Other" :value="otherId" />
<el-option label="None" value="f30a074b-2b47-4a92-97ec-e15086d37883" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item v-if="employmentForm.PositionId===otherId" class="other-item" prop="PositionOther">
<el-input
:disabled="$route.query.ReviewStatus === '1'"
v-model="employmentForm.PositionOther"
placeholder="Please specify"
size="small"
/>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item v-if="employmentForm.PositionId===otherId" class="other-item" prop="PositionOtherCN">
<el-input
:disabled="$route.query.ReviewStatus === '1'"
v-model="employmentForm.PositionOtherCN"
placeholder="请用中文注明"
size="small"
/>
</el-form-item>
</el-col>
</el-row>
<!-- <el-row>-->
<!-- <el-col :span="14">-->
<!-- <el-form-item label="Physician: " prop="PhysicianId" >-->
<!-- <el-select-->
<!-- v-model="employmentForm.PhysicianId"-->
<!-- placeholder="select"-->
<!-- :disabled="$route.query.ReviewStatus === '1'"-->
<!-- @change="PhysicianChange"-->
<!-- style="width:100%;"-->
<!-- size="small"-->
<!-- >-->
<!-- <el-option-->
<!-- v-for="item of $d.PhysicianOriginal"-->
<!-- :key="item.id"-->
<!-- :label="item.raw.Value"-->
<!-- :value="item.id"-->
<!-- />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="5">-->
<!-- <el-form-item v-if="$fd('PhysicianOriginal', employmentForm.PhysicianId, 'id') === '其它' || $fd('PhysicianOriginal', employmentForm.PhysicianId, 'id') === 'Other'" class="other-item" prop="Physician">-->
<!-- <el-input-->
<!-- :disabled="$route.query.ReviewStatus === '1'"-->
<!-- v-model="employmentForm.Physician"-->
<!-- placeholder="Please specify"-->
<!-- size="small"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="5">-->
<!-- <el-form-item v-if="$fd('PhysicianOriginal', employmentForm.PhysicianId, 'id') === '其它' || $fd('PhysicianOriginal', employmentForm.PhysicianId, 'id') === 'Other'" class="other-item" prop="PhysicianCN">-->
<!-- <el-input-->
<!-- :disabled="$route.query.ReviewStatus === '1'"-->
<!-- v-model="employmentForm.PhysicianCN"-->
<!-- placeholder="请用中文注明"-->
<!-- size="small"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- <el-row>-->
<!-- <el-col :span="14">-->
<!-- <el-form-item label="Position: " prop="PositionId">-->
<!-- <el-select-->
<!-- :disabled="$route.query.ReviewStatus === '1'"-->
<!-- v-model="employmentForm.PositionId"-->
<!-- placeholder="select"-->
<!-- style="width:100%;"-->
<!-- size="small"-->
<!-- >-->
<!-- &lt;!&ndash; <el-option-->
<!-- v-for="(key,value) of dictionaryList.Position"-->
<!-- :key="key"-->
<!-- :label="key"-->
<!-- :value="value"-->
<!-- /> &ndash;&gt;-->
<!-- <el-option-->
<!-- v-for="item of dictionaryList.Position"-->
<!-- :key="item.Id"-->
<!-- :label="item.Value"-->
<!-- :value="item.Id"-->
<!-- />-->
<!-- <el-option label="Other" :value="otherId" />-->
<!-- <el-option label="None" value="f30a074b-2b47-4a92-97ec-e15086d37883" />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="5">-->
<!-- <el-form-item v-if="employmentForm.PositionId===otherId" class="other-item" prop="PositionOther">-->
<!-- <el-input-->
<!-- :disabled="$route.query.ReviewStatus === '1'"-->
<!-- v-model="employmentForm.PositionOther"-->
<!-- placeholder="Please specify"-->
<!-- size="small"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="5">-->
<!-- <el-form-item v-if="employmentForm.PositionId===otherId" class="other-item" prop="PositionOtherCN">-->
<!-- <el-input-->
<!-- :disabled="$route.query.ReviewStatus === '1'"-->
<!-- v-model="employmentForm.PositionOtherCN"-->
<!-- placeholder="请用中文注明"-->
<!-- size="small"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
<el-form-item>
<el-button type="primary" :disabled="isDisabled || $route.query.ReviewStatus === '1'" size="small" @click="handleSave">Save</el-button>
<el-button type="primary" :disabled="isDisabled || $route.query.ReviewStatus === '1'" size="small" @click="handleSave">{{ $t('common:button:save') }}</el-button>
</el-form-item>
</el-form>
</div>
@ -377,9 +375,9 @@ export default {
this.loading = true
this.isDisabled = true
const param = {}
var o = this.$d.PhysicianOriginal.find(v => {
return v.id === this.employmentForm.PhysicianId
})
// var o = this.$d.PhysicianOriginal.find(v => {
// return v.id === this.employmentForm.PhysicianId
// })
param.Id = this.$route.query.Id
param.DepartmentId = this.employmentForm.DepartmentId
param.DepartmentOther = this.employmentForm.DepartmentId === this.otherId ? this.employmentForm.DepartmentOther : ''
@ -387,9 +385,9 @@ export default {
param.RankId = this.employmentForm.RankId
param.RankOther = this.employmentForm.RankId === this.otherId ? this.employmentForm.RankOther : ''
param.RankOtherCN = this.employmentForm.RankId === this.otherId ? this.employmentForm.RankOtherCN : ''
param.PhysicianId = this.employmentForm.PhysicianId
param.Physician = o.label !== '其它' && o.label !== 'Other' ? o.raw.Value : this.employmentForm.Physician
param.PhysicianCN = o.label !== '其它' && o.label !== 'Other' ? o.raw.ValueCN : this.employmentForm.PhysicianCN
// param.PhysicianId = this.employmentForm.PhysicianId
// param.Physician = o.label !== '' && o.label !== 'Other' ? o.raw.Value : this.employmentForm.Physician
// param.PhysicianCN = o.label !== '' && o.label !== 'Other' ? o.raw.ValueCN : this.employmentForm.PhysicianCN
param.PositionId = this.employmentForm.PositionId
param.PositionOther = this.employmentForm.PositionId === this.otherId ? this.employmentForm.PositionOther : ''
param.PositionOtherCN = this.employmentForm.PositionId === this.otherId ? this.employmentForm.PositionOtherCN : ''

View File

@ -1,8 +1,8 @@
<template>
<div class="gcp-container">
<el-radio-group v-model="GCP" style="margin-bottom:20px">
<el-radio :label="1">Yes</el-radio>
<el-radio :label="0">No</el-radio>
<el-radio :label="1">{{ $t('system:GcpCertificate:radio:Yes') }}</el-radio>
<el-radio :label="0">{{ $t('system:GcpCertificate:radio:No') }}</el-radio>
</el-radio-group>
<div v-if="GCP" class="upload-container">
<!-- <upload-file :doctor-id="doctorId" type="GCP" />-->
@ -19,13 +19,13 @@
:on-exceed="handleExceed"
accept=".pdf"
>
<el-button size="small" type="primary" :loading="btnDisabled">Upload</el-button>
<span slot="tip" style="margin-left:10px;" class="el-upload__tip">(must be in pdf format)</span>
<el-button size="small" type="primary" :loading="btnDisabled">{{ $t('system:GcpCertificate:upload:Upload') }}</el-button>
<span slot="tip" style="margin-left:10px;" class="el-upload__tip">{{ $t('system:GcpCertificate:tap:must') }}</span>
</el-upload>
</div>
<div>
<el-button :loading="saveBtnLoading" :disabled="(fileList.length === 0 && GCP === 1)" type="primary" size="small" style="margin-top:20px" @click="handleSaveGCP">
Save
{{ $t('common:button:save') }}
</el-button>
</div>
</div>
@ -97,6 +97,7 @@ export default {
})
},
initFileList() {
if(!this.doctorId) return
getAttachmentByType(this.doctorId, 'GCP')
.then(res => {
if (res.IsSuccess) {
@ -181,7 +182,7 @@ export default {
this.fileList = []
this.GCPID = ''
this.$message({
message: 'Deleted successfully!',
message: this.$t('common:message:deletedSuccessfully'),
type: 'success'
})
}

View File

@ -1,7 +1,7 @@
<template>
<div class="form-container" style="width:80%;">
<el-form ref="researchForm" v-loading="loading" label-width="140px" :model="researchForm" size="small">
<el-form-item label="Field of Research: ">
<el-form-item :label="$t('system:reviewer:label:Field of Research')">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input :disabled="$route.query.ReviewStatus === '1'" v-model="researchForm.Research" type="textarea" rows="5" placeholder="Please specify in English" size="small" />
@ -11,7 +11,7 @@
</el-col>
</el-row>
</el-form-item>
<el-form-item label="Grants: ">
<el-form-item :label="$t('system:reviewer:label:Grants')">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input :disabled="$route.query.ReviewStatus === '1'" v-model="researchForm.Grants" type="textarea" rows="5" placeholder="Please specify in English" size="small" />
@ -21,7 +21,7 @@
</el-col>
</el-row>
</el-form-item>
<el-form-item label="Publications: ">
<el-form-item :label="$t('system:reviewer:label:Publications')">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input :disabled="$route.query.ReviewStatus === '1'" v-model="researchForm.Publications" type="textarea" rows="5" placeholder="Please specify in English" size="small" />
@ -31,7 +31,7 @@
</el-col>
</el-row>
</el-form-item>
<el-form-item label="Awards & Honors: ">
<el-form-item :label="$t('system:reviewer:label:Awards & Honors')">
<el-row type="flex" justify="space-between">
<el-col :span="11">
<el-input :disabled="$route.query.ReviewStatus === '1'" v-model="researchForm.AwardsHonors" type="textarea" rows="5" placeholder="Please specify in English" size="small" />
@ -42,7 +42,8 @@
</el-row>
</el-form-item>
<el-form-item>
<el-button :disabled="$route.query.ReviewStatus === '1'" type="primary" :loading="isDisabled" @click="handleSave">Save</el-button>
<el-button :disabled="$route.query.ReviewStatus === '1'" type="primary" :loading="isDisabled" @click="handleSave">
{{ $t('common:button:save') }}</el-button>
</el-form-item>
</el-form>
</div>

View File

@ -1,7 +1,7 @@
<template>
<div v-loading="loading" class="resumes-container">
<div class="resume-content">
<p>Resume</p>
<p>{{ $t('system:Resumes:title:Resume') }}</p>
<div class="upload-content">
<!-- <upload-files ref="uploadResume" :doctor-id="doctorId" :data-list="resumeList" :language="2" btn-name="Upload(English)" type="Resume" accept=".doc, .docx" @getFileList="getFileList" /> -->
<div class="uploadFile-container">
@ -14,21 +14,21 @@
:file-list="resumeList"
accept=".doc,.docx"
>
<el-button size="small" type="primary" :disabled="isDisabled || $route.query.ReviewStatus === '1'">Upload</el-button>
<el-button size="small" type="primary" :disabled="isDisabled || $route.query.ReviewStatus === '1'">{{ $t('system:GcpCertificate:upload:Upload') }}</el-button>
</el-upload>
</div>
</div>
<p>(must be in doc,docx format)</p>
<p>{{ $t('system:GcpCertificate:tap:must') }}</p>
</div>
<div class="resumeTbl">
<el-table :data="resumeListEN" size="small">
<el-table-column type="index" width="40" />
<el-table-column prop="FileName" label="Resume" width="180" show-overflow-tooltip />
<el-table-column prop="CreateTime" label="Upload Time" width="150" show-overflow-tooltip />
<el-table-column prop="FileName" :label="$t('system:Resumes:table:Resume')" width="180" show-overflow-tooltip />
<el-table-column prop="CreateTime" :label="$t('system:Resumes:table:Upload Time')" width="150" show-overflow-tooltip />
<el-table-column
prop="IsOfficial"
label="Official"
:label="$t('system:Resumes:table:Official')"
width="100"
>
<template slot-scope="scope">
@ -37,7 +37,7 @@
</el-table-column>
<el-table-column
prop="Language"
label="Language"
:label="$t('system:Resumes:table:Language')"
width="100"
show-overflow-tooltip
>
@ -46,23 +46,23 @@
<!-- <el-button size="small" type="text" @click="handleLanguageClick(scope.row)">{{ scope.row.Language===1?'CH':scope.row.Language===2?'EN':'Setting' }}</el-button> -->
</template>
</el-table-column>
<el-table-column label="Action" width="400">
<el-table-column :label="$t('common:action:action')" width="400">
<template slot-scope="scope">
<el-button type="text" size="small" @click="handlePreview(scope.row)">Download</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleRemoveFile(scope.row)">Delete</el-button>
<el-button type="text" size="small" @click="handlePreview(scope.row)">{{ $t('common:button:download') }}</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleRemoveFile(scope.row)">{{ $t('common:button:delete') }}</el-button>
<el-button
type="text"
size="small"
:disabled="scope.row.IsOfficial || $route.query.ReviewStatus === '1'"
@click="handleSetOfiical(scope.row)"
>Set as Official</el-button>
>{{ $t('system:Resumes:button:Set as Official') }}</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="resume-content" style="margin-top:10px;">
<p>中文简历</p>
<p>{{ $t('system:Resumes:title:ResumeCN') }}</p>
<div class="upload-content">
<div class="uploadFile-container">
<el-upload
@ -74,20 +74,20 @@
:file-list="resumeList"
accept=".doc, .docx"
>
<el-button size="small" type="primary" :disabled="isDisabled || $route.query.ReviewStatus === '1'">上传</el-button>
<el-button size="small" type="primary" :disabled="isDisabled || $route.query.ReviewStatus === '1'">{{ $t('system:GcpCertificate:upload:Upload') }}</el-button>
</el-upload>
</div>
</div>
<p>(必须是 doc,docx 格式)</p>
<p>{{ $t('system:GcpCertificate:tap:must') }}</p>
</div>
<div class="resumeTbl">
<el-table :data="resumeListCN" size="small">
<el-table-column type="index" width="40" />
<el-table-column prop="FileName" label="Resume" width="180" show-overflow-tooltip />
<el-table-column prop="CreateTime" label="Upload Time" width="150" show-overflow-tooltip />
<el-table-column prop="FileName" :label="$t('system:Resumes:table:Resume')" width="180" show-overflow-tooltip />
<el-table-column prop="CreateTime" :label="$t('system:Resumes:table:Upload Time')" width="150" show-overflow-tooltip />
<el-table-column
prop="IsOfficial"
label="Official"
:label="$t('system:Resumes:table:Official')"
width="100"
>
<template slot-scope="scope">
@ -96,7 +96,7 @@
</el-table-column>
<el-table-column
prop="Language"
label="Language"
:label="$t('system:Resumes:table:Language')"
width="100"
show-overflow-tooltip
>
@ -105,16 +105,16 @@
<!-- <el-button size="small" type="text" @click="handleLanguageClick(scope.row)">{{ scope.row.Language===1?'CH':scope.row.Language===2?'EN':'Setting' }}</el-button> -->
</template>
</el-table-column>
<el-table-column label="Action" width="400">
<el-table-column :label="$t('common:action:action')" width="400">
<template slot-scope="scope">
<el-button type="text" size="small" @click="handlePreview(scope.row)">Download</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleRemoveFile(scope.row)">Delete</el-button>
<el-button type="text" size="small" @click="handlePreview(scope.row)">{{ $t('common:button:download') }}</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleRemoveFile(scope.row)">{{ $t('common:button:delete') }}</el-button>
<el-button
type="text"
size="small"
:disabled="scope.row.IsOfficial"
:disabled="scope.row.IsOfficial || $route.query.ReviewStatus === '1'"
@click="handleSetOfiical(scope.row)"
>Set as Official</el-button>
>{{ $t('system:Resumes:button:Set as Official') }}</el-button>
</template>
</el-table-column>
</el-table>
@ -163,6 +163,7 @@ export default {
}
},
created() {
if(!this.doctorId) return
this.getResumeList()
},
methods: {
@ -266,11 +267,10 @@ export default {
}
},
handleRemoveFile(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
}).then(() => {
deleteAttachment(row.Id, row.Path)
.then(res => {
@ -278,7 +278,7 @@ export default {
this.resumeList.splice(this.resumeList.findIndex(item => item.Id === row.Id), 1)
this.filterByLanguage()
this.$message({
message: 'Deleted successfully!',
message: this.$t('common:message:deletedSuccessfully'),
type: 'success'
})
}

View File

@ -2,68 +2,68 @@
<div v-loading="loading" class="check-container form-container">
<el-form ref="checkForm" :model="checkForm" label-width="200px" size="small" :rules="rules">
<div class="title-wrapper">
<p>盲化信息</p>
<p>{{$t('system:Setting:title:Blinded information') }}</p>
</div>
<div class="check-content">
<el-form-item label="Blind Name" prop="BlindName">
<el-form-item :label="$t('system:Setting:label:Blind Name')" prop="BlindName">
<el-input
v-model="checkForm.BlindName"
style="width:300px"
/>
</el-form-item>
<el-form-item label="Blind NameCN" prop="BlindNameCN">
<el-form-item :label="$t('system:Setting:label:Blind NameCN')" prop="BlindNameCN">
<el-input
v-model="checkForm.BlindNameCN"
style="width:300px"
/>
</el-form-item>
<el-form-item label="Blind Publications" prop="BlindPublications">
<el-form-item :label="$t('system:Setting:label:Blind Publications')" prop="BlindPublications">
<el-input v-model="checkForm.BlindPublications" type="textarea" rows="8" style="width:60%;" size="small" />
</el-form-item>
</div>
<div class="title-wrapper">
<p>Setting</p>
<p>{{$t('system:Setting:title:Blinded Setting') }}</p>
</div>
<div class="check-content">
<el-form-item label="Information Confirmed?">
<el-form-item :label="$t('system:Setting:label:Information Confirmed?')">
<el-radio-group v-model="checkForm.ReviewStatus" @change="handleChange">
<el-radio :label="1">Yes</el-radio>
<el-radio :label="2">No</el-radio>
<el-radio :label="1">{{$t('system:Setting:label:Information Confirmed?:Yes')}}</el-radio>
<el-radio :label="2">{{$t('system:Setting:label:Information Confirmed?:No')}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="Contractor Status?">
<el-form-item :label="$t('system:Setting:label:Contractor Status?')">
<el-radio-group v-model="checkForm.CooperateStatus" @change="handleChange">
<el-radio :label="1">Yes</el-radio>
<el-radio :label="2">No</el-radio>
<el-radio :label="1">{{$t('system:Setting:label:Information Confirmed?:Yes')}}</el-radio>
<el-radio :label="2">{{$t('system:Setting:label:Information Confirmed?:No')}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="Accepting New Trials?">
<el-form-item :label="$t('system:Setting:label:Accepting New Trials?')">
<el-radio-group v-model="checkForm.AcceptingNewTrial" :disabled="radioDisabled">
<el-radio :label="true">Yes</el-radio>
<el-radio :label="false">No</el-radio>
<el-radio :label="true">{{$t('system:Setting:label:Information Confirmed?:Yes')}}</el-radio>
<el-radio :label="false">{{$t('system:Setting:label:Information Confirmed?:No')}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="Actively Reading?">
<el-form-item :label="$t('system:Setting:label:Actively Reading?')">
<el-radio-group v-model="checkForm.ActivelyReading" :disabled="radioDisabled">
<el-radio :label="true">Yes</el-radio>
<el-radio :label="false">No</el-radio>
<el-radio :label="true">{{$t('system:Setting:label:Information Confirmed?:Yes')}}</el-radio>
<el-radio :label="false">{{$t('system:Setting:label:Information Confirmed?:No')}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="Is Virtual?">
<el-form-item :label="$t('system:Setting:label:Is Virtual?')">
<el-radio-group v-model="checkForm.IsVirtual" :disabled="radioDisabled">
<el-radio :label="true">Yes</el-radio>
<el-radio :label="false">No</el-radio>
<el-radio :label="true">{{$t('system:Setting:label:Information Confirmed?:Yes')}}</el-radio>
<el-radio :label="false">{{$t('system:Setting:label:Information Confirmed?:No')}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="On Vacation: ">
<el-form-item :label="$t('system:Setting:label:On Vacation:')">
<span style="font-size:12px;margin-right:20px;">{{ checkForm.InHoliday }}</span>
<el-button type="text" @click="handleView">Planned Vacation</el-button>
<el-button type="text" @click="handleView">{{ $t('system:Setting:Planned Vacation') }}</el-button>
</el-form-item>
<el-form-item label="Comment: " prop="AdminComment">
<el-form-item :label="$t('system:Setting:label:Comment:')" prop="AdminComment">
<el-input
v-model="checkForm.AdminComment"
type="textarea"
@ -73,12 +73,12 @@
</el-form-item>
<el-form-item style="margin-top:20px">
<el-button type="primary" :disabled="isDisabled" @click="handleSave">Save</el-button>
<el-button type="primary" :disabled="isDisabled" @click="handleSave">{{ $t('common:button:save') }}</el-button>
</el-form-item>
</div>
</el-form>
<el-dialog
title="Vacation"
:title="$t('system:Setting:title:Vacation')"
:visible.sync="dialogVisible"
width="50%"
:close-on-click-modal="false"
@ -87,37 +87,38 @@
<div>
<el-date-picker
v-model="daterange"
style="width: 360px"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
type="daterange"
range-separator="to"
start-placeholder="Beginning Date"
end-placeholder="End Date"
:start-placeholder="$t('system:Setting:label:Beginning Date')"
:end-placeholder="$t('system:Setting:label:End Date')"
size="small"
/>
<el-button style="margin-left:10px;" type="primary" size="small" @click="handleAddHoliday">Add</el-button>
<el-button style="margin-left:10px;" type="primary" size="small" @click="handleAddHoliday">{{ $t('common:button:add') }}</el-button>
</div>
<el-table v-loading="loading2" :data="gridData" size="small">
<el-table-column type="index" />
<el-table-column
property="StartDate"
label="Beginning Date"
:label="$t('system:Setting:table:Beginning Date')"
min-width="120"
:formatter="beginTimeFormatter"
/>
<el-table-column
property="EndDate"
label="End Date"
:label="$t('system:Setting:table:End Date')"
min-width="120"
:formatter="endTimeFormatter"
/>
<el-table-column label="Action" fixed="right" min-width="200">
<el-table-column :label="$t('common:action:action')" fixed="right" min-width="200">
<template slot-scope="scope">
<el-button type="text" @click="handleDelete(scope.row)">Delete</el-button>
<el-button type="text" @click="handleDelete(scope.row)">{{ $t('common:button:delete') }}</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<div class="pagination" style="padding: 10px 0;text-align: right">
<el-pagination
background
layout="total,sizes,prev, pager, next"
@ -165,7 +166,6 @@ export default {
rules: {
AdminComment: [{ max: 500, message: 'The maximum length is 500' }],
BlindName: [{ required: true, message: 'Please specify', trigger: 'blur' }],
BlindNameCN: [{ required: true, message: 'Please specify', trigger: 'blur' }]
},
doctorId: this.$route.query.Id,
isDisabled: false,
@ -184,6 +184,7 @@ export default {
},
methods: {
initForm() {
if (!this.doctorId) return
getAuditState(this.doctorId).then(res => {
if (res.Result) {
this.checkForm = res.Result
@ -204,7 +205,7 @@ export default {
if (res.IsSuccess) {
if (res.Result) { this.checkForm.Id = res.Result }
this.isDisabled = false
this.$message.success('Saved successfully')
this.$message.success(this.$t('common:message:savedSuccessfully'))
}
})
.catch(() => {
@ -258,11 +259,9 @@ export default {
}
},
handleDelete(row) {
this.$confirm('Sure to delete?', {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'Ok',
cancelButtonText: 'Cancel'
})
.then(() => {
this.loading2 = true
@ -274,7 +273,7 @@ export default {
this.gridData.splice(index, 1)
this.totalItems = this.totalItems - 1
}
this.$message.success('Deleted successfully!')
this.$message.success(this.$t('common:message:deletedSuccessfully'))
}
this.loading2 = false
})

View File

@ -12,7 +12,7 @@
>
<el-row>
<el-col :span="12">
<el-form-item label="Specialty: " prop="SpecialityId">
<el-form-item :label="$t('system:reviewer:label:Specialty')" prop="SpecialityId">
<el-select
v-model="specialtyForm.SpecialityId"
:disabled="$route.query.ReviewStatus === '1'"
@ -59,7 +59,7 @@
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="Subspeciality: " prop="SubspecialityIds">
<el-form-item :label="$t('system:reviewer:label:Subspeciality')" prop="SubspecialityIds">
<el-select
v-model="specialtyForm.SubspecialityIds"
:disabled="$route.query.ReviewStatus === '1'"
@ -116,7 +116,7 @@
<el-row>
<el-col :span="12">
<el-form-item label="Modality: " prop="ReadingTypeIds">
<el-form-item :label="$t('system:reviewer:label:Modality')" prop="ReadingTypeIds">
<el-select
:disabled="$route.query.ReviewStatus === '1'"
v-model="specialtyForm.ReadingTypeIds"
@ -171,7 +171,8 @@
</el-col>
</el-row>
<el-form-item>
<el-button type="primary" :disabled="isDisabled || $route.query.ReviewStatus === '1'" size="small" @click="handleSave">Save</el-button>
<el-button type="primary" :disabled="isDisabled || $route.query.ReviewStatus === '1'" size="small" @click="handleSave">
{{ $t('common:button:save') }}</el-button>
</el-form-item>
</el-form>
</div>

View File

@ -1,8 +1,8 @@
<template>
<div class="form-container">
<div class="title-wrapper">
<p>Clinical Trial Experience</p>
<el-button :disabled="$route.query.ReviewStatus === '1'" class="add" size="small" @click="handleAddClinicalTrial">Add</el-button>
<p>{{$t('system:TrialExperience:title:Clinical Trial Experience')}}</p>
<el-button :disabled="$route.query.ReviewStatus === '1'" class="add" size="small" @click="handleAddClinicalTrial">{{$t('common:button:add')}}</el-button>
</div>
<div style="padding:0 40px;">
<el-table
@ -13,36 +13,37 @@
size="small"
>
<el-table-column type="index" width="40" />
<el-table-column prop="Phase" label="Phase" min-width="50" />
<el-table-column prop="EvaluationCriteriaList" label="Review Criteria" min-width="100">
<el-table-column prop="Phase" :label="$t('system:TrialExperience:title:Phase')" min-width="50" />
<el-table-column prop="EvaluationCriteriaList" :label="$t('system:TrialExperience:title:Review Criteria')" min-width="100">
<template slot-scope="scope">
{{ scope.row.EvaluationCriteriaList.length>0? scope.row.EvaluationCriteriaList.join(', '):'' }}
</template>
</el-table-column>
<el-table-column prop="EvaluationCriteriaList" label="Starting And Ending Date" min-width="100">
<el-table-column prop="EvaluationCriteriaList" :label="$t('system:TrialExperience:title:Starting And Ending Date')" min-width="100">
<template slot-scope="scope">
<span v-if="scope.row.StartTime">{{ scope.row.StartTime.split('-')[0] }}-{{scope.row.EndTime ? scope.row.EndTime.split('-')[0] : ''}}</span>
</template>
</el-table-column>
<el-table-column prop="VisitReadingCount" label="Visit Reading Count" min-width="70" />
<el-table-column prop="EvaluationContent" label="Indication" min-width="70" />
<el-table-column label="Operation" min-width="200">
<el-table-column prop="VisitReadingCount" :label="$t('system:TrialExperience:title:Visit Reading Count')" min-width="70" />
<el-table-column prop="EvaluationContent" :label="$t('system:TrialExperience:Indication')" min-width="70" />
<el-table-column :label="$t('system:TrialExperience:Operation')" min-width="200">
<template slot-scope="scope">
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleEdit(scope.row)">Edit</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleDel(scope.row)">Delete</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleEdit(scope.row)">
{{ $t('common:button:edit') }}</el-button>
<el-button type="text" size="small" :disabled="$route.query.ReviewStatus === '1'" @click="handleDel(scope.row)">{{ $t('common:button:delete') }}</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="title-wrapper" style="margin-top:10px;">
<p>GCP Certificate</p>
<p>{{$t('system:TrialExperience:title:GCP Certificate')}}</p>
</div>
<div style="margin-left:40px;width:40%">
<gcp-certificate :doctor-id="doctorId" :gcp="GCP" :gcp-id="GCPID" />
</div>
<div class="title-wrapper" style="margin-top:10px;">
<p>Other Relevant Experience</p>
<p>{{$t('system:TrialExperience:title:Other Relevant Experience')}}</p>
</div>
<div style="padding:0 40px;">
<el-row type="flex" justify="space-between">
@ -59,7 +60,8 @@
<el-input v-model="OtherClinicalExperienceCN" :disabled="$route.query.ReviewStatus === '1'" type="textarea" rows="5" placeholder="请用中文注明" size="small" />
</el-col>
</el-row>
<el-button type="primary" size="small" style="margin-top:20px" :disabled="isBtnDisabled || $route.query.ReviewStatus === '1'" @click="handleSaveOtherClinical">Save</el-button>
<el-button type="primary" size="small" style="margin-top:20px" :disabled="isBtnDisabled || $route.query.ReviewStatus === '1'" @click="handleSaveOtherClinical">
{{ $t('common:button:save') }}</el-button>
</div>
<el-dialog v-if="clinicalTrialDialogVisible" :title="clinicalTrialDialogTitle" :visible.sync="clinicalTrialDialogVisible" width="480px" :close-on-click-modal="false">
<el-form
@ -70,8 +72,8 @@
:model="clinicalTrialForm"
size="small"
>
<el-form-item label="Phase" prop="PhaseId">
<el-select v-model="clinicalTrialForm.PhaseId" placeholder="Please select">
<el-form-item :label="$t('system:TrialExperience:label:Phase')" prop="PhaseId">
<el-select v-model="clinicalTrialForm.PhaseId">
<!-- <el-option
v-for="(key,value) of dictionaryList.Phase"
:key="value"
@ -86,10 +88,9 @@
/>
</el-select>
</el-form-item>
<el-form-item label="Review Criteria" prop="EvaluationCriteriaIdList">
<el-form-item :label="$t('system:TrialExperience:label:Review Criteria')" prop="EvaluationCriteriaIdList">
<el-select
v-model="clinicalTrialForm.EvaluationCriteriaIdList"
placeholder="Please select"
multiple
>
<!-- <el-option v-for="(key,value) of dictionaryList.ReadingStandard" :key="value" :label="key" :value="value" /> -->
@ -101,29 +102,29 @@
/>
</el-select>
</el-form-item>
<el-form-item label="Start Time" prop="StartTime">
<el-form-item :label="$t('system:TrialExperience:label:Start Time')" prop="StartTime">
<el-date-picker
v-model="clinicalTrialForm.StartTime"
type="year"
placeholder="Select Start Time">
>
</el-date-picker>
</el-form-item>
<el-form-item label="End Time" prop="EndTime">
<el-form-item :label="$t('system:TrialExperience:label:End Time')" prop="EndTime">
<el-date-picker
v-model="clinicalTrialForm.EndTime"
type="year"
placeholder="Select End Time">
>
</el-date-picker>
</el-form-item>
<el-form-item label="Visit Reading Count" prop="VisitReadingCount">
<el-form-item :label="$t('system:TrialExperience:Visit Reading Count')" prop="VisitReadingCount">
<el-input style="width: 100%" oninput="value=value.replace(/[^\d]/g,'')" v-model="clinicalTrialForm.VisitReadingCount" controls-position="right" :min="0" />
</el-form-item>
<el-form-item label="Indication" prop="EvaluationContent">
<el-form-item :label="$t('system:TrialExperience:Indication')" prop="EvaluationContent">
<el-input v-model="clinicalTrialForm.EvaluationContent" />
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button type="primary" size="small" :loading="isDisabled" @click="handleSave">Save</el-button>
<el-button type="primary" size="small" :loading="isDisabled" @click="handleSave">{{ $t('common:button:save') }}</el-button>
</span>
</el-dialog>
</div>
@ -265,8 +266,7 @@ export default {
this.$confirm('Confirm to delete?', {
type: 'warning',
distinguishCancelAndClose: true,
confirmButtonText: 'OK',
cancelButtonText: 'Cancel'
})
.then(() => {
deleteTrialExperience(row.Id)

View File

@ -1,39 +1,34 @@
<template>
<div class="app-container">
<el-tabs v-model="active" @tab-click="clickTab">
<el-tab-pane label="Basic Info" name="BasicInfo">
<el-tab-pane :label="$t('system:reviewer:tab:BasicInfo')" name="BasicInfo">
<basic-info v-if="load.BasicInfo" />
</el-tab-pane>
<el-tab-pane label="Employment" name="Employment">
<el-tab-pane :label="$t('system:reviewer:tab:Employment')" name="Employment">
<Employment v-if="load.Employment" />
</el-tab-pane>
<el-tab-pane label="Specialty" name="Specialty">
<el-tab-pane :label="$t('system:reviewer:tab:Specialty')" name="Specialty">
<specialty v-if="load.Specialty" />
</el-tab-pane>
<el-tab-pane label="Education & Training" name="EducationTraining">
<el-tab-pane :label="$t('system:reviewer:tab:Education&Training')" name="EducationTraining">
<education-training v-if="load.EducationTraining" />
</el-tab-pane>
<el-tab-pane label="Research & Publication" name="ResearchPublication">
<el-tab-pane :label="$t('system:reviewer:tab:Research&Publication')" name="ResearchPublication">
<research-publication v-if="load.ResearchPublication" />
</el-tab-pane>
<el-tab-pane label="Trial Experience" name="TrialExperience">
<el-tab-pane :label="$t('system:reviewer:tab:TrialExperience')" name="TrialExperience">
<trial-experience v-if="load.TrialExperience" />
</el-tab-pane>
<el-tab-pane label="Credentials" name="Credentials">
<el-tab-pane :label="$t('system:reviewer:tab:Credentials')" name="Credentials">
<Credentials v-if="load.Credentials" />
</el-tab-pane>
<el-tab-pane label="Resumes" name="Resumes">
<el-tab-pane :label="$t('system:reviewer:tab:Resumes')" name="Resumes">
<Resumes v-if="load.Resumes" />
</el-tab-pane>
<el-tab-pane label="Agreements" name="Agreements">
<el-tab-pane :label="$t('system:reviewer:tab:Agreements')" name="Agreements">
<Agreements v-if="load.Agreements" />
</el-tab-pane>
<el-tab-pane label="Setting" name="Setting">
<el-tab-pane :label="$t('system:reviewer:tab:Setting')" name="Setting">
<Setting v-if="load.Setting" />
</el-tab-pane>
</el-tabs>

View File

@ -4,14 +4,14 @@
<div class="search">
<div class="base-search-form">
<el-form size="small" :inline="true">
<el-form-item label="Name:">
<el-form-item :label="$t('reviewers-list:label:Name')">
<el-input
v-model="searchData.Name"
style="width:100px;"
clearable
/>
</el-form-item>
<el-form-item label="Modality:">
<el-form-item :label="$t('reviewers-list:label:Modality')">
<el-select
v-model="searchData.ReadingTypeIdList"
clearable
@ -33,7 +33,7 @@
/>
</el-select>
</el-form-item>
<el-form-item label="Subspeciality:">
<el-form-item :label="$t('reviewers-list:label:Subspeciality')">
<el-select
v-model="searchData.SubspecialityIdList"
multiple
@ -50,271 +50,36 @@
</el-select>
</el-form-item>
<el-form-item>
<!-- <el-button type="text" @click="handleMore">More</el-button> -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch">Search</el-button>
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">Reset</el-button>
<el-button type="primary" icon="el-icon-search" @click="handleSearch">{{ $t('common:button:search') }}</el-button>
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">{{ $t('common:button:reset') }}</el-button>
<el-button
icon="el-icon-download"
type="primary"
:disabled="!(selectArr.length>0)"
@click="handleDownLoadOffical"
>Download CV</el-button>
>{{$t('reviewers-list:label:DownloadCV')}}</el-button>
<el-button
type="primary"
icon="el-icon-link"
@click="showResearchLink"
>
采集链接
{{$t('reviewers-list:label:showResearchLink')}}
</el-button>
</el-form-item>
</el-form>
</div>
<span style="margin-left:auto;">
<el-switch
v-model="isEN"
active-text="EN"
inactive-text="中文"
style="margin-right:10px;"
@change="handleIsEnChange"
/>
<el-button size="small" icon="el-icon-plus" type="primary" @click="handleNew">New</el-button>
<!-- <el-switch-->
<!-- v-model="isEN"-->
<!-- active-text="EN"-->
<!-- inactive-text="中文"-->
<!-- style="margin-right:10px;"-->
<!-- @change="handleIsEnChange"-->
<!-- />-->
<el-button size="small" icon="el-icon-plus" type="primary" @click="handleNew">{{$t('common:button:new')}}</el-button>
</span>
</div>
<!-- 更多搜索条件 -->
<el-drawer
:visible.sync="isShow"
:with-header="false"
size="410px"
>
<div style="padding:10px;">
<el-form label-width="160px" size="mini">
<el-form-item label="Name">
<el-input
v-model="searchData.Name"
placeholder="Name"
style="width:100%;"
clearable
/>
</el-form-item>
<el-form-item label="Modality">
<el-select
v-model="searchData.ReadingTypeIdList"
placeholder="Modality"
clearable
multiple
style="width:100%;"
>
<!-- <el-option
v-for="(key,value) of dictionaryList.ReadingType"
:key="key"
:label="key"
:value="value"
/> -->
<el-option
v-for="item of dict.type.ReadingType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="Subspeciality">
<el-select
v-model="searchData.SubspecialityIdList"
placeholder="Subspeciality"
multiple
clearable
style="width:100%;"
>
<!-- <el-option
v-for="(key,value) of dictionaryList.Subspeciality"
:key="key"
:label="key"
:value="value"
/> -->
<el-option
v-for="item of dict.type.Subspeciality"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="Department">
<el-select
v-model="searchData.DepartmentId"
placeholder="Department"
style="width:100%;"
clearable
>
<!-- <el-option
v-for="(key,value) of dictionaryList.Department"
:key="key"
:label="key"
:value="value"
/> -->
<el-option
v-for="item of dict.type.Department"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="Rank">
<el-select
v-model="searchData.RankId"
placeholder="Rank"
style="width:100%;"
clearable
>
<!-- <el-option
v-for="(key,value) of dictionaryList.Rank"
:key="key"
:label="key"
:value="value"
/> -->
<el-option
v-for="item of dict.type.Rank"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="Position">
<el-select
v-model="searchData.PositionId"
placeholder="Position"
style="width:100%;"
clearable
>
<!-- <el-option
v-for="(key,value) of dictionaryList.Position"
:key="key"
:label="key"
:value="value"
/> -->
<el-option
v-for="item of dict.type.Position"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="Institution">
<el-select
v-model="searchData.HospitalId"
placeholder="Institution"
style="width:100%;"
clearable
>
<el-option
v-for="(item,index) in hospitalList"
:key="index"
:label="item.HospitalName"
:value="item.Id"
/>
</el-select>
</el-form-item>
<el-form-item label="Review Criteria">
<el-select
v-model="searchData.EvaluationCriteriaIdList"
placeholder="Please select"
style="width:100%;"
clearable
multiple
>
<!-- <el-option v-for="(key,value) of dictionaryList.ReadingStandard" :key="key" :label="key" :value="value" /> -->
<el-option
v-for="item of dict.type.ReadingStandard"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item label="Enrollment">
<el-select
v-model="searchData.EnrollStatus"
placeholder="Enrollment"
style="width:100%;"
clearable
>
<el-option key="2" label="Yes" :value="2" />
<el-option key="1" label="No" :value="1" />
</el-select>
</el-form-item>
<el-form-item label="Information Confirmed">
<el-select
v-model="searchData.InformationConfirmed"
placeholder="Information Confirmed"
style="width:100%;"
clearable
>
<el-option key="1" label="Yes" :value="1" />
<el-option key="2" label="No" :value="2" />
</el-select>
</el-form-item>
<el-form-item label="Contractor Status">
<el-select
v-model="searchData.ContractorStatus"
placeholder="Contractor Status"
style="width:100%;"
clearable
>
<el-option key="1" label="Yes" :value="1" />
<el-option key="2" label="No" :value="2" />
</el-select>
</el-form-item>
<el-form-item label="Accepting New Trials">
<el-select
v-model="searchData.AcceptingNewTrial"
placeholder="Accepting New Trials"
style="width:100%;"
clearable
>
<el-option key="2" label="Yes" :value="true" />
<el-option key="1" label="No" :value="false" />
</el-select>
</el-form-item>
<el-form-item label="Actively Reading">
<el-select
v-model="searchData.ActivelyReading"
placeholder="Actively Reading"
style="width:100%;"
clearable
>
<el-option key="2" label="Yes" :value="true" />
<el-option key="1" label="No" :value="false" />
</el-select>
</el-form-item>
<el-form-item label="Payment Type: ">
<el-select
v-model="searchData.Nation"
clearable
style="width:100%;"
>
<el-option v-for="item of $d.AttendedReviewerType" :value="item.value" :label="item.label" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSelectSearch">Search</el-button>
<el-button type="primary" @click="handleReset">Reset</el-button>
<el-button type="primary" @click="isShow=false">Back</el-button>
</el-form-item>
</el-form>
</div>
</el-drawer>
<!-- 医生列表 -->
<el-table
v-adaptive="{bottomOffset:55}"
@ -330,7 +95,7 @@
<el-table-column
align="left"
prop="LastName"
label="Name"
:label="$t('reviewers-list:table:Name')"
show-overflow-tooltip
width="130"
sortable="custom"
@ -341,15 +106,15 @@
</el-table-column>
<el-table-column
prop="ChineseName"
label="Name CN"
:label="$t('reviewers-list:table:NameCN')"
show-overflow-tooltip
width="90"
align="left"
/>
<el-table-column prop="ReviewerCode" label="ID" width="80" show-overflow-tooltip sortable="custom" />
<el-table-column prop="AccountUserName" label="User Name" width="140" show-overflow-tooltip sortable="custom" />
<el-table-column prop="ReviewerCode" :label="$t('reviewers-list:table:ID')" width="80" show-overflow-tooltip sortable="custom" />
<el-table-column prop="AccountUserName" :label="$t('reviewers-list:table:UserName')" width="140" show-overflow-tooltip sortable="custom" />
<el-table-column
label="Reading"
:label="$t('reviewers-list:table:Reading')"
width="100"
show-overflow-tooltip
sortable="custom"
@ -370,7 +135,7 @@
</template>
</el-table-column>
<el-table-column
label="Finished"
:label="$t('reviewers-list:table:Finished')"
width="100"
show-overflow-tooltip
sortable="custom"
@ -393,7 +158,7 @@
<el-table-column
align="left"
prop="SpecialityId"
label="Specialty"
:label="$t('reviewers-list:table:Specialty')"
sortable="custom"
show-overflow-tooltip
width="130"
@ -407,7 +172,7 @@
<el-table-column
align="left"
prop="Subspeciality"
label="Subspecialty"
:label="$t('reviewers-list:table:Subspecialty')"
show-overflow-tooltip
min-width="150"
>
@ -422,7 +187,7 @@
</el-table-column>
<el-table-column
prop="HospitalName"
label="Institution"
:label="$t('reviewers-list:table:Institution')"
min-width="110"
align="left"
sortable="custom"
@ -436,7 +201,7 @@
</el-table-column>
<el-table-column
prop="City"
label="Location"
:label="$t('reviewers-list:table:Location')"
width="110"
align="left"
sortable="custom"
@ -450,7 +215,7 @@
</el-table-column>
<el-table-column
prop="IsVirtual"
label="Virtual"
:label="$t('reviewers-list:table:Virtual')"
min-width="80"
align="left"
sortable="custom"
@ -464,7 +229,7 @@
</el-table-column>
<el-table-column
prop="ReviewStatus"
label="Confirmed"
:label="$t('reviewers-list:table:Confirmed')"
min-width="80"
align="left"
sortable="custom"
@ -476,27 +241,27 @@
</span>
</template>
</el-table-column>
<el-table-column label="Action" min-width="200" align="left" fixed="right">
<el-table-column :label="$t('common:action:action')" min-width="200" align="left" fixed="right">
<template slot-scope="scope">
<el-button
size="mini"
circle
icon="el-icon-info"
title="Detail"
:title="$t('reviewers-list:table:Detail')"
@click="handleDetail(scope.row)"
/>
<el-button
size="mini"
circle
icon="el-icon-edit-outline"
title="Edit"
:title="$t('reviewers-list:table:Edit')"
@click="handleEdit(scope.row)"
/>
<el-button
size="mini"
icon="el-icon-view"
circle
title="盲态简历"
:title="$t('reviewers-list:table:Blind')"
@click="lookResumeInfo(scope.row)"
/>
</template>
@ -515,13 +280,13 @@
<template slot="dialog-body">
<div>
<i style="color:#428bca;" class="el-icon-success" />
<span>成功创建分享链接</span>
<span>{{ $t('reviewers-list:message:msg1')}}</span>
</div>
<div style="margin:10px 0;">
<span style="">个人简历填写链接</span><el-input type="textarea" :autosize="{ minRows: 2, maxRows: 4}" v-model="shareLink" readonly style="width: 100%;margin-top: 10px" />
<span style="">{{ $t('reviewers-list:message:msg2') }}</span><el-input type="textarea" :autosize="{ minRows: 2, maxRows: 4}" v-model="shareLink" readonly style="width: 100%;margin-top: 10px" />
</div>
<div>
<el-button type="primary" round @click="copyCode"></el-button>
<el-button type="primary" round @click="copyCode">{{ $t('reviewers-list:button:copyCode') }}</el-button>
</div>
</template>
</base-model>
@ -602,17 +367,20 @@ export default {
},
tokenKey: getToken(),
share_model: { visible: false, title: '', width: '500px' },
shareLink: null
shareLink: null,
isEnglish: false
}
},
dicts: ['ReadingType', 'Subspeciality', 'Department', 'Rank', 'Position', 'ReadingStandard'],
computed: {
...mapGetters(['hospitalList', 'reviewersQuery', 'isEnglish'])
...mapGetters(['hospitalList', 'reviewersQuery'])
},
created() {
this.isEN = this.isEnglish
this.reviewersQuery ? this.listQuery = this.reviewersQuery : ''
this.initPage()
// this.isEnglish = !!((this.$route.query.isEnglish === true || this.$route.query.isEnglish === 'true'))
this.isEnglish = this.$i18n.locale === 'zh' ? false : true
this.isEN = this.isEnglish
},
methods: {
copyCode() {
@ -637,7 +405,7 @@ export default {
},
showResearchLink() {
const trialId = this.trialId
this.shareLink = `${location.protocol}//${location.host}/ReviewersResearch`
this.shareLink = `${location.protocol}//${location.host}/ReviewersResearch?lang=${this.$store.getters.language}`
this.share_model.visible = true
},
lookResumeInfo(row) {

Some files were not shown because too many files have changed in this diff Show More