Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details

# Conflicts:
#	src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue
#	src/views/trials/trials-panel/reading/dicoms3D/components/StudyList.vue
uat_us
wangxiaoshuang 2026-03-23 15:10:29 +08:00
commit d07adc4948
56 changed files with 5434 additions and 6508 deletions

View File

@ -1,7 +1,7 @@
kind: pipeline
type: ssh
name: ssh-linux-test-irc-publish
name: ssh-linux-uat-irc-publish
platform:
os: Linux
@ -33,6 +33,38 @@ trigger:
- uat
---
kind: pipeline
type: ssh
name: ssh-linux-test-irc-publish
platform:
os: Linux
arch: 386
clone:
disable: true #禁用默认克隆
server:
host: 106.14.89.110
user: root
password:
from_secret: local_pwd
steps:
- name: publish-test-irc-web
commands:
- bash /opt/1panel/xc-deploy-new/devops-center/build-vue-then-publish.sh IRC_Web main
- name: notify-wecom
commands:
- echo $DRONE_COMMIT_AUTHOR "$DRONE_COMMIT_MESSAGE"
- bash /opt/1panel/xc-deploy-new/devops-center/drone-notify-wecom.sh "$DRONE_BUILD_STATUS" "$DRONE_REPO_NAME" "$DRONE_BRANCH" "$DRONE_BUILD_NUMBER" "4355b98e-1e72-4678-8dfb-2fc6ad0bf449" "$DRONE_COMMIT_MESSAGE" "$DRONE_COMMIT_AUTHOR" "Test_IRC_WEB" "irc.test.extimaging.com"
when:
status:
- success
- failure
trigger:
branch:
- main

10997
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -15,18 +15,17 @@
},
"dependencies": {
"@aws-sdk/client-s3": "^3.701.0",
"@cornerstonejs/adapters": "^2.19.7",
"@cornerstonejs/adapters": "4.19.2",
"@cornerstonejs/calculate-suv": "^1.1.0",
"@cornerstonejs/core": "^2.19.7",
"@cornerstonejs/dicom-image-loader": "^2.19.7",
"@cornerstonejs/tools": "^2.19.7",
"@cornerstonejs/core": "^4.19.2",
"@cornerstonejs/dicom-image-loader": "^4.19.2",
"@cornerstonejs/tools": "^4.19.2",
"@fingerprintjs/fingerprintjs": "^4.6.2",
"@icr/polyseg-wasm": "^0.4.0",
"@microsoft/signalr": "^8.0.7",
"@riophae/vue-treeselect": "^0.4.0",
"@vue-office/docx": "^1.6.2",
"@vue-office/excel": "^1.7.11",
"@vue/composition-api": "^1.7.2",
"ali-oss": "^6.17.1",
"axios": "^0.18.1",
"core-js": "^3.8.3",
@ -60,11 +59,10 @@
"screenfull": "^6.0.2",
"sortablejs": "^1.15.5",
"streamsaver": "^2.0.6",
"svg-sprite-loader": "^4.1.3",
"svgo": "^1.2.2",
"v-viewer": "^1.7.4",
"vcrontab": "^0.3.5",
"vue": "^2.6.14",
"vue": "2.7.16",
"vue-clipboard2": "^0.3.3",
"vue-contextmenujs": "^1.4.11",
"vue-count-to": "^1.0.13",
@ -98,9 +96,10 @@
"path-browserify": "^1.0.1",
"process": "^0.11.10",
"sass": "^1.63.2",
"sass-loader": "^10.4.1",
"sass-loader": "^16.0.7",
"svg-sprite-loader": "^6.0.11",
"terser-webpack-plugin": "^5.3.10",
"vue-template-compiler": "^2.6.14",
"vue-template-compiler": "2.7.16",
"webpack": "^5.96.1",
"webpack-bundle-analyzer": "^4.10.2"
},
@ -125,4 +124,4 @@
"not dead",
"not op_mini all"
]
}
}

View File

@ -74,10 +74,11 @@ export default {
zzSessionStorage.setItem('lastWorkbench', `${v.path}${query ? '?' : ''}${query}`)
var firstGoIn = this.trialsRouter.children.find(v => { return v.name === 'TrialsPanel' }).children[0]
if (this.trialsTab === '/trials/trials-panel') {
this.$router.replace({ path: `${firstGoIn.path}${query ? '?' : ''}${query}` })
var targetPath = firstGoIn.path
if (firstGoIn.children && firstGoIn.children.length > 0) {
this.$router.replace({ path: `${firstGoIn.children[0].path}${query ? '?' : ''}${query}` })
targetPath = firstGoIn.children[0].path
}
this.$router.replace({ path: `${targetPath}${query ? '?' : ''}${query}` })
}
// document.cookie = 'TrialId=' + this.$route.query.trialId + ';path=/'
},
@ -112,10 +113,11 @@ export default {
this.getTrialList()
var firstGoIn = this.trialsRouter.children.find(v => { return v.name === 'TrialsPanel' }).children[0]
if (this.trialsTab === '/trials/trials-panel') {
this.$router.replace({ path: `${firstGoIn.path}${query ? '?' : ''}${query}` })
var targetPath = firstGoIn.path
if (firstGoIn.children && firstGoIn.children.length > 0) {
this.$router.replace({ path: `${firstGoIn.children[0].path}${query ? '?' : ''}${query}` })
targetPath = firstGoIn.children[0].path
}
this.$router.replace({ path: `${targetPath}${query ? '?' : ''}${query}` })
}
},
methods: {
@ -201,15 +203,19 @@ export default {
if (~url.indexOf('?')) {
query = url.split('?')[1]
}
this.$router.push({ path: `${v.name}${query ? '?' : ''}${query}` })
var trialsPanelList = this.trialsRouter.children.find(v => { return v.name === 'TrialsPanel' }).children
var isHasChild = trialsPanelList.find(c => { return c.path === v.name }) && trialsPanelList.find(c => { return c.path === v.name }).children
if (trialsPanelList.find(c => { return c.path === v.name }) && trialsPanelList.find(c => { return c.path === v.name }).tabHiddn) {
var trialsPanelList = this.trialsRouter.children.find(item => { return item.name === 'TrialsPanel' }).children
var currentRoute = trialsPanelList.find(c => { return c.path === v.name })
if (currentRoute && currentRoute.tabHiddn) {
this.$router.push({ path: `${v.name}${query ? '?' : ''}${query}` })
return
}
var isHasChild = currentRoute && currentRoute.children
if (isHasChild && isHasChild.length > 0) {
this.trialsTabChild = isHasChild[0].path
this.$router.push({ path: `${this.trialsTabChild}${query ? '?' : ''}${query}` })
} else {
this.$router.push({ path: `${v.name}${query ? '?' : ''}${query}` })
}
} catch (e) {
console.log(e)

View File

@ -116,7 +116,7 @@ export default {
display: none !important; /* 隐藏原生 radio 输入,但仍然允许交互 */
}
::v-deep.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled)
::v-deep .el-radio:focus:not(.is-focus):not(:active):not(.is-disabled)
.el-radio__inner {
box-shadow: none !important;
}

View File

@ -86,16 +86,16 @@ export default {
}
</script>
<style lang="scss" scoped>
::v-deep.el-tabs--left .el-tabs__header.is-left {
::v-deep .el-tabs--left .el-tabs__header.is-left {
margin-right: 0;
}
.uploadDicomAndNonedicom {
::v-deep.el-tabs--border-card>.el-tabs__header .el-tabs__item {
::v-deep .el-tabs--border-card>.el-tabs__header .el-tabs__item {
color: #909399;
}
::v-deep.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active {
::v-deep .el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active {
color: #428bca;
background-color: #fff;
border-right-color: #dcdfe6;

View File

@ -56,8 +56,10 @@ export default {
</script>
<style lang="scss" scoped>
@import "~@/styles/mixin.scss";
@import "~@/styles/variables.module.scss";
@use "@/styles/mixin.scss" as *;
@use "@/styles/variables.module.scss" as *;
// @import "~@/styles/mixin.scss";
// @import "~@/styles/variables.module.scss";
.app-wrapper {
@include clearfix;

View File

@ -1,15 +1,16 @@
@import "./variables.module.scss";
@import "./mixin.scss";
@import "./transition.scss";
@import "./element-ui.scss";
@import "./sidebar.scss";
@use "./variables.module.scss";
@use "./mixin.scss";
@use "./transition.scss";
@use "./element-ui.scss";
@use "./sidebar.scss";
body {
height: 100%;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;
font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB",
"Microsoft YaHei", "微软雅黑", Arial, sans-serif;
// font-family:"Helvetica Neue", Helvetica, Arial, sans-serif;
// font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
// "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial,
@ -205,133 +206,139 @@ body .el-table th.gutter {
.el-descriptions {
box-sizing: border-box;
font-size: 14px;
color: #303133
color: #303133;
}
.el-descriptions__header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px
margin-bottom: 20px;
}
.el-descriptions__title {
font-size: 16px;
font-weight: 700
font-weight: 700;
}
.el-descriptions__body {
color: #606266;
background-color: #fff
background-color: #fff;
}
.el-descriptions__body .el-descriptions__table {
border-collapse: collapse;
width: 100%;
table-layout: fixed
table-layout: fixed;
}
.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell {
box-sizing: border-box;
text-align: left;
font-weight: 400;
line-height: 1.5
line-height: 1.5;
}
.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-left {
text-align: left
.el-descriptions__body
.el-descriptions__table
.el-descriptions-item__cell.is-left {
text-align: left;
}
.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-center {
text-align: center
.el-descriptions__body
.el-descriptions__table
.el-descriptions-item__cell.is-center {
text-align: center;
}
.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-right {
text-align: right
.el-descriptions__body
.el-descriptions__table
.el-descriptions-item__cell.is-right {
text-align: right;
}
.el-descriptions .is-bordered {
table-layout: auto
table-layout: auto;
}
.el-descriptions .is-bordered .el-descriptions-item__cell {
border: 1px solid #ebeef5;
padding: 12px 10px
padding: 12px 10px;
}
.el-descriptions :not(.is-bordered) .el-descriptions-item__cell {
padding-bottom: 12px
padding-bottom: 12px;
}
.el-descriptions--medium.is-bordered .el-descriptions-item__cell {
padding: 10px
padding: 10px;
}
.el-descriptions--medium:not(.is-bordered) .el-descriptions-item__cell {
padding-bottom: 10px
padding-bottom: 10px;
}
.el-descriptions--small {
font-size: 12px
font-size: 12px;
}
.el-descriptions--small.is-bordered .el-descriptions-item__cell {
padding: 8px 10px
padding: 8px 10px;
}
.el-descriptions--small:not(.is-bordered) .el-descriptions-item__cell {
padding-bottom: 8px
padding-bottom: 8px;
}
.el-descriptions--mini {
font-size: 12px
font-size: 12px;
}
.el-descriptions--mini.is-bordered .el-descriptions-item__cell {
padding: 6px 10px
padding: 6px 10px;
}
.el-descriptions--mini:not(.is-bordered) .el-descriptions-item__cell {
padding-bottom: 6px
padding-bottom: 6px;
}
.el-descriptions-item {
vertical-align: top
vertical-align: top;
}
.el-descriptions-item__container {
display: flex
display: flex;
}
.el-descriptions-item__container .el-descriptions-item__content,
.el-descriptions-item__container .el-descriptions-item__label {
display: inline-flex;
align-items: baseline
align-items: baseline;
}
.el-descriptions-item__container .el-descriptions-item__content {
flex: 1
flex: 1;
}
.el-descriptions-item__label.has-colon:after {
content: ":";
position: relative;
top: -.5px
top: -0.5px;
}
.el-descriptions-item__label.is-bordered-label {
font-weight: 700;
color: #909399;
background: #fafafa
background: #fafafa;
}
.el-descriptions-item__label:not(.is-bordered-label) {
margin-right: 10px
margin-right: 10px;
}
.el-descriptions-item__content {
word-break: break-word;
overflow-wrap: break-word
overflow-wrap: break-word;
}
.feedBack-box {
@ -350,7 +357,7 @@ body .el-table th.gutter {
top: 0;
width: 100%;
height: 100%;
opacity: .5;
opacity: 0.5;
background: #000;
z-index: 3999;
}
@ -371,4 +378,4 @@ body .el-table th.gutter {
height: 20px !important;
vertical-align: -0.4em !important;
cursor: pointer;
}
}

View File

@ -8366,7 +8366,7 @@
for (var i = 0; i < valarr.length; i++) {
var checkValue = valarr[i],
checklen = lengths[i],
checklen = lengths[i] || 0,
isString = false,
displaylen = checklen;

View File

@ -965,8 +965,8 @@ export default {
}
</script>
<style lang="scss" scoped>
.imageBox {
<style lang="scss">
.viewerContainer .imageBox {
position: relative;
i {

View File

@ -158,108 +158,105 @@
<div class="viewerSidethumbinner">
<el-collapse v-model="relationActiveName" @change="handelRelationActiveChange">
<template v-for="item in relationStudyListByVisitName">
<div :key="`${item.VisitName}`">
<div v-show="item.VisitName" class="text-desc" style="background-color: #1f1f1f;">
{{ item.VisitName }}
</div>
<template v-for="(study, studyIndex) in relationStudyList">
<el-collapse-item :key="`${study.StudyId}`" :name="`${study.StudyId}`"
v-if="study.VisitName === item.VisitName">
<template slot="title">
<div v-for="item in relationStudyListByVisitName" :key="`${item.VisitName}`">
<div v-show="item.VisitName" class="text-desc" style="background-color: #1f1f1f;">
{{ item.VisitName }}
</div>
<template v-for="(study, studyIndex) in relationStudyList">
<el-collapse-item :key="`${study.StudyId}`" :name="`${study.StudyId}`"
v-if="study.VisitName === item.VisitName">
<template slot="title">
<div class="text-desc">
{{ study.StudyCode }}
</div>
<!-- <div v-show="study.Description" class="text-desc">
{{ study.Description }}
</div> -->
<div v-show="study.SeriesCount" class="text-desc">
{{ study.Modalities }} : {{ study.SeriesCount }} Series
</div>
</template>
<div v-show="study.Description" class="text-desc" style="background-color: #1f1f1f;">
{{ study.Description }}
<div class="text-desc">
{{ study.StudyCode }}
</div>
<div class="viewerSidethumbs ps" style="position: relative;">
<div class="viewerSidethumbinner">
<div v-for="(seriesItem, index) in study.seriesList" :key="seriesItem.seriesId">
<div class="viewernavigatorwrapper"
style="position: relative;border:1px solid #434343;" series-type="relation"
@click="showRelationSeriesImage($event, seriesItem, studyIndex, index)">
<div class="imageBox" style="width: 72px;height:72px;">
<img class="image-preview" :src="seriesItem.previewImageUrl"
crossorigin="anonymous" alt="" style="width: 72px;height:72px;" fit="fill" />
<i class="el-icon-refresh" :title="$t('tip:refreshImage')"
@click.stop="refreshImage(item)"></i>
</div>
<!-- <div v-show="study.Description" class="text-desc">
{{ study.Description }}
</div> -->
<div class="viewernavitextwrapper">
<div
style="padding: 1px 5px 1px 1px;display: flex;justify-content: space-between;">
<div v-if="seriesItem.keySeries" style="color:red">
Key Images
</div>
<div v-else>#{{ seriesItem.seriesNumber }}</div>
<div v-if="seriesItem.isExistMutiFrames && seriesItem.instanceCount > 1">
<el-popover placement="right-start" trigger="click"
popper-class="instance_frame_wrapper">
<div class="frame_list">
<div v-for="(instance, idx) in seriesItem.instanceInfoList"
:key="instance.Id" class="frame_content"
:style="{ 'margin-bottom': idx < seriesItem.instanceInfoList.length - 1 ? '5px' : '0px' }"
@click="showMultiFrames(studyIndex, seriesItem, index, instance)">
<div>
<div>{{ instance.InstanceNumber }}</div>
<div>{{ `${instance.NumberOfFrames > 0 ? instance.NumberOfFrames : 1}
frame`
}}</div>
</div>
<div v-show="study.SeriesCount" class="text-desc">
{{ study.Modalities }} : {{ study.SeriesCount }} Series
</div>
</template>
<div v-show="study.Description" class="text-desc" style="background-color: #1f1f1f;">
{{ study.Description }}
</div>
<div class="viewerSidethumbs ps" style="position: relative;">
<div class="viewerSidethumbinner">
<div v-for="(seriesItem, index) in study.seriesList" :key="seriesItem.seriesId">
<div class="viewernavigatorwrapper"
style="position: relative;border:1px solid #434343;" series-type="relation"
@click="showRelationSeriesImage($event, seriesItem, studyIndex, index)">
<div class="imageBox" style="width: 72px;height:72px;">
<img class="image-preview" :src="seriesItem.previewImageUrl"
crossorigin="anonymous" alt="" style="width: 72px;height:72px;" fit="fill" />
<i class="el-icon-refresh" :title="$t('tip:refreshImage')"
@click.stop="refreshImage(item)"></i>
</div>
<div class="viewernavitextwrapper">
<div
style="padding: 1px 5px 1px 1px;display: flex;justify-content: space-between;">
<div v-if="seriesItem.keySeries" style="color:red">
Key Images
</div>
<div v-else>#{{ seriesItem.seriesNumber }}</div>
<div v-if="seriesItem.isExistMutiFrames && seriesItem.instanceCount > 1">
<el-popover placement="right-start" trigger="click"
popper-class="instance_frame_wrapper">
<div class="frame_list">
<div v-for="(instance, idx) in seriesItem.instanceInfoList"
:key="instance.Id" class="frame_content"
:style="{ 'margin-bottom': idx < seriesItem.instanceInfoList.length - 1 ? '5px' : '0px' }"
@click="showMultiFrames(studyIndex, seriesItem, index, instance)">
<div>
<div>{{ instance.InstanceNumber }}</div>
<div>{{ `${instance.NumberOfFrames > 0 ? instance.NumberOfFrames : 1}
frame`
}}</div>
</div>
</div>
<i slot="reference" class="el-icon-connection"
style="font-size: 15px;cursor: pointer;" />
</el-popover>
</div>
</div>
</div>
<i slot="reference" class="el-icon-connection"
style="font-size: 15px;cursor: pointer;" />
</el-popover>
</div>
<div v-show="seriesItem.instanceCount" style="padding: 1px;">
{{ seriesItem.modality }}: {{ seriesItem.instanceCount }} image
</div>
<div v-show="seriesItem.sliceThickness" style="padding: 1px;">
T: {{ seriesItem.sliceThickness }}
</div>
<el-tooltip v-show="seriesItem.description" class="item" effect="dark"
:content="seriesItem.description" placement="bottom">
<div v-show="seriesItem.description"
style="width: 120px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;padding: 1x;">
{{ seriesItem.description }}
</div>
</el-tooltip>
</div>
<div v-show="seriesItem.instanceCount" style="padding: 1px;">
{{ seriesItem.modality }}: {{ seriesItem.instanceCount }} image
</div>
<div v-show="seriesItem.sliceThickness" style="padding: 1px;">
T: {{ seriesItem.sliceThickness }}
</div>
<el-tooltip v-show="seriesItem.description" class="item" effect="dark"
:content="seriesItem.description" placement="bottom">
<div v-show="seriesItem.description"
style="width: 120px;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;padding: 1x;">
{{ seriesItem.description }}
</div>
</el-tooltip>
</div>
<!-- <el-image
class="image-preview"
style="height:72px;width:72px;"
:src="seriesItem.previewImageUrl"
fit="fill"
/> -->
<div
v-if="seriesItem.prefetchInstanceCount > 0 && seriesItem.prefetchInstanceCount < seriesItem.instanceCount * 100">
<el-progress
:percentage="parseInt((seriesItem.prefetchInstanceCount / seriesItem.instanceCount).toFixed(2))" />
</div>
</div>
<!-- <el-image
class="image-preview"
style="height:72px;width:72px;"
:src="seriesItem.previewImageUrl"
fit="fill"
/> -->
<div
v-if="seriesItem.prefetchInstanceCount > 0 && seriesItem.prefetchInstanceCount < seriesItem.instanceCount * 100">
<el-progress
:percentage="parseInt((seriesItem.prefetchInstanceCount / seriesItem.instanceCount).toFixed(2))" />
</div>
</div>
</div>
</el-collapse-item>
</template>
</div>
</template>
</div>
</el-collapse-item>
</template>
</div>
</el-collapse>
</div>
@ -1012,7 +1009,7 @@ export default {
</script>
<style lang="scss">
.imageBox {
.viewerContainer .imageBox {
position: relative;
i {

View File

@ -278,7 +278,7 @@ export default {
padding: 5px 20px;
margin-top: 5px;
background: #fff;
::v-deep.el-form-item {
::v-deep .el-form-item {
padding-bottom: 20px;
}
@ -292,10 +292,10 @@ export default {
}
}
.form-label-width{
::v-deep.el-form-item__label{
::v-deep .el-form-item__label{
width: 140px;
}
::v-deep.el-form-item__content{
::v-deep .el-form-item__content{
margin-left: 140px;
}
}
@ -304,7 +304,7 @@ export default {
text-align: center;
}
::v-deep.el-form-item {
::v-deep .el-form-item {
margin-bottom: 0px;
padding-top: 5px;
border-bottom: 1px solid #f5f7fa;

View File

@ -156,7 +156,7 @@ export default {
<style lang="scss" scoped>
.equipment_form_content{
padding: 0 10px;
::v-deep.el-form-item {
::v-deep .el-form-item {
margin-bottom: 0px;
padding: 5px 0 20px 0;
border-bottom: 1px solid #f5f7fa;

View File

@ -295,7 +295,7 @@ export default {
<style lang="scss" scoped>
.participants_form_content{
padding: 0 10px;
::v-deep.el-form-item {
::v-deep .el-form-item {
margin-bottom: 0px;
padding: 5px 0 20px 0;
border-bottom: 1px solid #f5f7fa;

View File

@ -309,7 +309,7 @@ export default {
<style lang="scss" scoped>
.participants_form_content{
padding: 0 10px;
::v-deep.el-form-item {
::v-deep .el-form-item {
margin-bottom: 0px;
padding: 5px 0 20px 0;
border-bottom: 1px solid #f5f7fa;

View File

@ -381,7 +381,7 @@ export default {
padding: 5px 20px;
margin-top: 5px;
background: #fff;
::v-deep.el-form-item {
::v-deep .el-form-item {
padding-bottom: 20px;
}
}
@ -398,7 +398,7 @@ export default {
text-align: center;
}
::v-deep.el-form-item {
::v-deep .el-form-item {
margin-bottom: 0px;
padding-top: 5px;
border-bottom: 1px solid #f5f7fa;

View File

@ -357,7 +357,7 @@ export default {
overflow-y: auto;
}
::v-deep.el-card__body {
::v-deep .el-card__body {
padding: 10px;
}
@ -365,13 +365,13 @@ export default {
// padding: 10px 20px 20px 20px;
// }
::v-deep.full-dialog-container {
::v-deep .full-dialog-container {
.el-dialog__body {
height: calc(100% - 80px);
}
}
::v-deep.dialog-container {
::v-deep .dialog-container {
// margin-top: 50px !important;
width: 75%;
height: 80%;

View File

@ -44,7 +44,7 @@ export default {
overflow: hidden;
display: flex;
flex-direction: column;
::v-deep.el-card__body {
::v-deep .el-card__body {
padding: 0px;
}
.trials-tab{

View File

@ -28,8 +28,10 @@ export default {
</script>
<style lang="scss" scoped>
@import "~@/styles/mixin.scss";
@import "~@/styles/variables.module.scss";
// @import "~@/styles/mixin.scss";
// @import "~@/styles/variables.module.scss";
@use "@/styles/mixin.scss" as *;
@use "@/styles/variables.module.scss" as *;
.trials-wrapper {
@include clearfix;

View File

@ -2928,12 +2928,12 @@ export default {
}
.series-table {
::v-deep.el-table {
::v-deep .el-table {
background-color: #1e1e1e !important;
color: #dfdfdf;
}
::v-deep.el-table td.el-table__cell,
::v-deep .el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #dfdfdf;
}
@ -2944,14 +2944,14 @@ export default {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
::v-deep .el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
}
}
::v-deep.el-table__body-wrapper {
::v-deep .el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -2962,7 +2962,7 @@ export default {
}
}
::v-deep.el-table__empty-block {
::v-deep .el-table__empty-block {
background-color: #1e1e1e !important;
}
}

View File

@ -319,23 +319,23 @@ export default {
</script>
<style lang="scss" scoped>
.series-table{
::v-deep.el-table{
::v-deep .el-table{
background-color: #1e1e1e !important;
color: #dfdfdf;
}
::v-deep.el-table td.el-table__cell, .el-table th.el-table__cell.is-leaf{
::v-deep .el-table td.el-table__cell, .el-table th.el-table__cell.is-leaf{
border-bottom: 1px solid #dfdfdf;
}
.el-table--border::after, .el-table--group::after, .el-table::before{
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper{
::v-deep .el-table__header-wrapper{
th{
background-color: #1e1e1e !important;
color: #dfdfdf;
}
}
::v-deep.el-table__body-wrapper{
::v-deep .el-table__body-wrapper{
tr{
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -344,7 +344,7 @@ export default {
background-color: #1e1e1e !important;
}
}
::v-deep.el-table__empty-block{
::v-deep .el-table__empty-block{
background-color: #1e1e1e !important;
}
}

View File

@ -2262,7 +2262,7 @@ export default {
background-color: #000;
padding: 5px 2px;
::v-deep.el-dialog {
::v-deep .el-dialog {
background: #1e1e1e;
border: 1px solid #ddd;
color: #ddd;

View File

@ -1903,7 +1903,7 @@ export default {
height: 100%;
background-color: #000;
padding: 5px 2px;
::v-deep.el-dialog {
::v-deep .el-dialog {
background: #1e1e1e;
border: 1px solid #ddd;
color: #ddd;

View File

@ -1319,12 +1319,12 @@ export default {
.merge-table {
padding: 0 10px;
::v-deep.el-table {
::v-deep .el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell,
::v-deep .el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
@ -1335,7 +1335,7 @@ export default {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
::v-deep .el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -1343,7 +1343,7 @@ export default {
}
}
::v-deep.el-table__body-wrapper {
::v-deep .el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -1354,7 +1354,7 @@ export default {
}
}
::v-deep.el-table__empty-block {
::v-deep .el-table__empty-block {
background-color: #1e1e1e !important;
}

View File

@ -989,21 +989,21 @@ export default {
padding: 5px 0;
}
::v-deep.el-table__fixed-right-patch {
::v-deep .el-table__fixed-right-patch {
background-color: #000 !important;
border-color: #444444;
}
::v-deep.el-table__fixed-body-wrapper tr:hover>td {
::v-deep .el-table__fixed-body-wrapper tr:hover>td {
background-color: #000 !important;
}
::v-deep.el-table--scrollable-x .el-table__body-wrapper {
::v-deep .el-table--scrollable-x .el-table__body-wrapper {
z-index: 2;
}
}
::v-deep.el-tag.el-tag--info {
::v-deep .el-tag.el-tag--info {
color: #000;
}
}

View File

@ -1436,12 +1436,12 @@ export default {
.merge-table {
padding: 0 10px;
::v-deep.el-table {
::v-deep .el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell,
::v-deep .el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
@ -1452,7 +1452,7 @@ export default {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
::v-deep .el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -1460,7 +1460,7 @@ export default {
}
}
::v-deep.el-table__body-wrapper {
::v-deep .el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -1471,7 +1471,7 @@ export default {
}
}
::v-deep.el-table__empty-block {
::v-deep .el-table__empty-block {
background-color: #1e1e1e !important;
}

View File

@ -1436,12 +1436,12 @@ export default {
.merge-table {
padding: 0 10px;
::v-deep.el-table {
::v-deep .el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell,
::v-deep .el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
@ -1452,7 +1452,7 @@ export default {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
::v-deep .el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -1460,7 +1460,7 @@ export default {
}
}
::v-deep.el-table__body-wrapper {
::v-deep .el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -1471,7 +1471,7 @@ export default {
}
}
::v-deep.el-table__empty-block {
::v-deep .el-table__empty-block {
background-color: #1e1e1e !important;
}

View File

@ -999,20 +999,20 @@ export default {
padding: 5px 0;
}
::v-deep.el-table__fixed-right-patch {
::v-deep .el-table__fixed-right-patch {
background-color: #000 !important;
border-color: #444444;
}
::v-deep.el-table__fixed-body-wrapper tr:hover>td {
::v-deep .el-table__fixed-body-wrapper tr:hover>td {
background-color: #000 !important;
}
::v-deep.el-table--scrollable-x .el-table__body-wrapper {
::v-deep .el-table--scrollable-x .el-table__body-wrapper {
z-index: 2;
}
}
::v-deep.el-tag.el-tag--info {
::v-deep .el-tag.el-tag--info {
color: #000;
}
}

View File

@ -614,7 +614,7 @@ export default {
}
::v-deep.el-tabs {
::v-deep .el-tabs {
box-sizing: border-box;
padding: 0 5px;
height: 100%;
@ -665,7 +665,7 @@ export default {
border: 1px solid #607d8b !important;
}
::v-deep.el-progress__text {
::v-deep .el-progress__text {
color: #ccc;
font-size: 12px;
}

View File

@ -1203,12 +1203,12 @@ export default {
.merge-table {
padding: 0 10px;
::v-deep.el-table {
::v-deep .el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell,
::v-deep .el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
@ -1219,7 +1219,7 @@ export default {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
::v-deep .el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -1227,7 +1227,7 @@ export default {
}
}
::v-deep.el-table__body-wrapper {
::v-deep .el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -1238,7 +1238,7 @@ export default {
}
}
::v-deep.el-table__empty-block {
::v-deep .el-table__empty-block {
background-color: #1e1e1e !important;
}

View File

@ -1130,12 +1130,12 @@ export default {
.merge-table {
padding: 0 10px;
::v-deep.el-table {
::v-deep .el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell,
::v-deep .el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
@ -1146,7 +1146,7 @@ export default {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
::v-deep .el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -1154,7 +1154,7 @@ export default {
}
}
::v-deep.el-table__body-wrapper {
::v-deep .el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -1165,7 +1165,7 @@ export default {
}
}
::v-deep.el-table__empty-block {
::v-deep .el-table__empty-block {
background-color: #1e1e1e !important;
}

View File

@ -952,7 +952,7 @@ export default {
background-color: #607d8b!important;
border: 1px solid #607d8b!important;
}
::v-deep.el-progress__text{
::v-deep .el-progress__text{
color: #ccc;
font-size: 12px;
}
@ -1022,7 +1022,7 @@ export default {
}
}
::v-deep.el-collapse{
::v-deep .el-collapse{
border: none;
.el-collapse-item{
background-color: #000!important;
@ -1043,7 +1043,7 @@ export default {
}
}
.sr-wrapper{
::v-deep.el-dialog{
::v-deep .el-dialog{
background: #fff !important;
border: 1px solid #ddd;
// color: #ddd;
@ -1051,12 +1051,12 @@ export default {
color:#fff;
}
}
::v-deep.sr-dialog-container{
::v-deep .sr-dialog-container{
margin-top: 50px !important;
width:75%;
height:80%;
}
::v-deep.el-dialog__body{
::v-deep .el-dialog__body{
padding: 10px;
height: calc(100% - 50px);
}
@ -1064,7 +1064,7 @@ export default {
position: relative;
}
.sr-full-dialog-container{
::v-deep.is-fullscreen .el-dialog__body{
::v-deep .is-fullscreen .el-dialog__body{
height: calc(100% - 50px);
}
}

View File

@ -887,7 +887,7 @@ export default {
background-color: #607d8b!important;
border: 1px solid #607d8b!important;
}
::v-deep.el-progress__text{
::v-deep .el-progress__text{
color: #ccc;
font-size: 12px;
}
@ -956,7 +956,7 @@ export default {
}
}
}
::v-deep.el-collapse{
::v-deep .el-collapse{
border: none;
.el-collapse-item{
background-color: #000!important;
@ -977,7 +977,7 @@ export default {
}
}
.sr-wrapper{
::v-deep.el-dialog{
::v-deep .el-dialog{
background: #fff !important;
border: 1px solid #ddd;
// color: #ddd;
@ -985,12 +985,12 @@ export default {
color:#fff;
}
}
::v-deep.sr-dialog-container{
::v-deep .sr-dialog-container{
margin-top: 50px !important;
width:75%;
height:80%;
}
::v-deep.el-dialog__body{
::v-deep .el-dialog__body{
padding: 10px;
height: calc(100% - 50px);
}
@ -998,7 +998,7 @@ export default {
position: relative;
}
.sr-full-dialog-container{
::v-deep.is-fullscreen .el-dialog__body{
::v-deep .is-fullscreen .el-dialog__body{
height: calc(100% - 50px);
}
}

View File

@ -529,7 +529,7 @@ export default {
}
</script>
<style lang="scss" scoped>
::v-deep.el-message-box__headerbtn {
::v-deep .el-message-box__headerbtn {
display: none;
}
@ -541,7 +541,7 @@ export default {
box-sizing: border-box;
background-color: #000;
::v-deep.el-tabs {
::v-deep .el-tabs {
box-sizing: border-box;
height: 100%;
display: flex;
@ -573,11 +573,11 @@ export default {
}
::v-deep.hot-keys-label {
::v-deep .hot-keys-label {
color: #dfdfdf !important;
}
::v-deep.shortcut-key-input span {
::v-deep .shortcut-key-input span {
color: #dfdfdf !important;
}
@ -588,7 +588,7 @@ export default {
// }
// }
::v-deep.el-dialog {
::v-deep .el-dialog {
background: #1e1e1e;
border: 1px solid #ddd;
color: #ddd;
@ -614,13 +614,13 @@ export default {
}
::v-deep.dialog-container {
::v-deep .dialog-container {
margin-top: 50px !important;
width: 75%;
height: 80%;
}
::v-deep.el-dialog__body {
::v-deep .el-dialog__body {
padding: 20px;
height: calc(100% - 70px);
}
@ -636,7 +636,7 @@ export default {
}
.full-dialog-container {
::v-deep.is-fullscreen .el-dialog__body {
::v-deep .is-fullscreen .el-dialog__body {
height: calc(100% - 70px);
}
}

View File

@ -142,7 +142,7 @@ export default {
getStudyList(obj) {
if (obj) {
var studyList = obj.StudyList || []
studyList = studyList.filter(i => !i.IsCriticalSequence && (i.Modalities.indexOf('CT') !== -1 || i.Modalities.indexOf('MR') !== -1) && i.Modalities.indexOf('PT') !== -1)
studyList = studyList.filter(i => !i.IsCriticalSequence && (i.Modalities.indexOf('CT') !== -1 || i.Modalities.indexOf('MR') !== -1) && (i.Modalities.indexOf('PT') !== -1 || i.Modalities.indexOf('NM') !== -1))
if (studyList.length === 0) return
this.studyList = studyList
}
@ -200,7 +200,7 @@ export default {
var series = seriesList.filter(series => series.Modality === 'CT' || series.Modality === 'MR')
this.ctSeries = series.sort((a, b) => b.instanceCount - a.instanceCount)
series = seriesList.filter(series => series.Modality === 'PT')
series = seriesList.filter(series => series.Modality === 'PT' || series.Modality === 'NM')
this.petSeries = series.sort((a, b) => b.instanceCount - a.instanceCount)
}
},
@ -235,12 +235,12 @@ export default {
</script>
<style lang="scss" scoped>
.series-table {
::v-deep.el-table {
::v-deep .el-table {
background-color: #1e1e1e !important;
color: #dfdfdf;
}
::v-deep.el-table td.el-table__cell,
::v-deep .el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #dfdfdf;
}
@ -251,14 +251,14 @@ export default {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
::v-deep .el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
}
}
::v-deep.el-table__body-wrapper {
::v-deep .el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -269,7 +269,7 @@ export default {
}
}
::v-deep.el-table__empty-block {
::v-deep .el-table__empty-block {
background-color: #1e1e1e !important;
}
}

View File

@ -95,7 +95,7 @@
<div class="dropdown-content">
<ul style="width:165px;">
<li v-for="item in wwwcArr" :key="item.label">
<a href="#" @click.stop="changeVoiRange(item)">
<span @click.stop="changeVoiRange(item)">
<div v-if="item.wc !== null"
style="display:flex;flex-direction: row;justify-content: space-between;">
<div>{{ item.label }}</div>
@ -104,7 +104,7 @@
<div v-else style="text-align:left;">
{{ item.label }}
</div>
</a>
</span>
<el-divider v-if="item.val === 1" class="divider" content-position="center">
{{ ` ${$t('trials:reading:title:preset')}` }}
</el-divider>
@ -145,9 +145,9 @@
<div class="dropdown-content">
<ul style="width:100px;">
<li v-for="rotate in rotateOptions" :key="rotate.label" style="text-align:left;">
<a href="#" @click.prevent="setViewportRotate(rotate.val)">
<span @click.prevent="setViewportRotate(rotate.val)">
{{ rotate.label }}
</a>
</span>
</li>
</ul>
</div>
@ -239,10 +239,10 @@
<!--v-if="readingTaskState < 2"-->
<ul style="width:100px;">
<li v-for="i in customizeStandards" :key="i.toolName" style="text-align:left;">
<a href="#" @click.prevent="setMoreToolActive(i.toolName)">
<span @click.prevent="setMoreToolActive(i.toolName)">
<svg-icon :icon-class="i.icon" class="svg-icon" style="margin-right: 5px;" />
{{ $t(i.i18nKey) }}
</a>
</span>
</li>
</ul>
</div>
@ -327,10 +327,10 @@
@renderAnnotations="renderAnnotations" @contentMouseup="contentMouseup" />
</div>
</div>
<div v-if="readingTool === 2" :class="['viewports-box', !isFusion ? 'viewports-box-down' : '']"
<div v-if="readingTool === 2"
:class="['viewports-box', !isFusion ? 'viewports-box-down' : '', fullScreenIndex !== null ? 'viewports-box-full-screen' : '']"
:style="gridStyle">
<div v-for="(v, index) in cellsMax" v-show="index < cells.length" :key="`viewport-fusion-${index}`"
:style="cellStyle"
:class="['grid-cell', index === activeViewportIndex ? 'cell_active' : '', index === fullScreenIndex ? 'cell-full-screen' : '']"
@dblclick="toggleFullScreen($event, index)" @click="activeViewport(index)">
<PetCtViewport :ref="`viewport-fusion-${index}`" :data-viewport-uid="`viewport-fusion-${index}`"
@ -364,7 +364,8 @@
<Segmentations ref="Segmentations" :visitInfo="taskInfo" :isMPR="isMPR"
:volumeToolGroupId="volumeToolGroupId" :viewportKey="viewportKey"
:activeViewportIndex="activeViewportIndex" :activeTool.sync="activeTool"
:actionConfiguration="actionConfiguration" @setToolsPassive="setToolsPassive" @resetQuestion="resetQuestion"/>
:actionConfiguration="actionConfiguration" @setToolsPassive="setToolsPassive"
@resetQuestion="resetQuestion" />
</el-tab-pane>
</el-tabs>
<template v-else>
@ -570,6 +571,7 @@ const {
synchronizers,
PlanarFreehandContourSegmentationTool,
BrushTool,
SegmentBidirectionalTool,
utilities: CStUtils,
// cursors
} = cornerstoneTools
@ -889,7 +891,7 @@ export default {
this.getSystemInfoReading();
},
methods: {
resetQuestion(){
resetQuestion() {
this.$refs[`ecrf_${this.lastViewportTaskId}`][0].getQuestions(false)
},
handleSegmentSave(obj) {
@ -1323,6 +1325,7 @@ export default {
cornerstoneTools.addTool(CrosshairsTool)
cornerstoneTools.addTool(PlanarFreehandContourSegmentationTool)
cornerstoneTools.addTool(BrushTool)
cornerstoneTools.addTool(SegmentBidirectionalTool)
viewportIds.forEach((viewportId, i) => {
// const toolGroupId = `viewport-${i}`
let toolGroupId = viewportId
@ -1364,6 +1367,7 @@ export default {
toolGroup.addTool(PlanarFreehandContourSegmentationTool.toolName, {
cachedStats: true,
});
toolGroup.addTool(SegmentBidirectionalTool.toolName, {});
// toolGroup.setToolActive(PlanarFreehandContourSegmentationTool.toolName, {
// bindings: [
// {
@ -1485,7 +1489,10 @@ export default {
toolGroup.setToolPassive(FixedRadiusCircleROITool.toolName)
toolGroup.setToolPassive(AngleTool.toolName)
toolGroup.setToolPassive(CobbAngleTool.toolName)
if (this.readingTool === 3) toolGroup.setToolPassive(PlanarFreehandContourSegmentationTool.toolName)
if (this.readingTool === 3) {
toolGroup.setToolPassive(PlanarFreehandContourSegmentationTool.toolName)
toolGroup.setToolPassive(SegmentBidirectionalTool.toolName, {});
}
} else {
toolGroup.setToolEnabled(ArrowAnnotateTool.toolName)
toolGroup.setToolEnabled(RectangleROITool.toolName)
@ -3038,8 +3045,7 @@ export default {
if (obj.segment) {
let study = studyList.find(item => item.StudyId === obj.segmentGroup.StudyId)
series = study.SeriesList.find(item => item.Id === obj.segmentGroup.SeriesId)
let sliceIndex = obj.segment.bidirectional.sliceIndex || 0
series.SliceIndex = series.InstanceCount - 1 - sliceIndex
series.SliceIndex = 0
series.segment = obj.segment
} else {
series = this.getMarkedSeries(studyList, obj.annotation, true)
@ -3976,14 +3982,14 @@ export default {
text-align: center;
li {
a {
span {
display: block;
padding: 5px;
}
}
}
ul li a:hover {
ul li span:hover {
background-color: #727272;
}
}
@ -4075,10 +4081,29 @@ export default {
bottom: 0;
right: 0;
z-index: 9;
overflow: hidden;
}
.viewports-box-down {
z-index: 1;
opacity: 0;
pointer-events: none;
}
.viewports-box-down {
>.grid-cell {
border-color: transparent;
}
}
.viewports-box-full-screen {
>.grid-cell {
display: none;
}
>.grid-cell.cell-full-screen {
display: flex;
}
}
.grid-cell {
@ -4086,6 +4111,9 @@ export default {
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
min-width: 0;
min-height: 0;
z-index: 1;
}
@ -4121,61 +4149,6 @@ export default {
}
}
::v-deep .manuals-dialog-container {
margin-top: 50px !important;
width: 75%;
height: 80%;
.el-dialog__body {
padding: 10px;
height: calc(100% - 50px) !important;
}
.el-dialog__header {
position: relative;
}
}
::v-deep .manuals-full-dialog-container {
.el-dialog__body {
padding: 10px;
height: calc(100% - 50px) !important;
}
.el-dialog__header {
position: relative;
}
}
::v-deep .cd-dialog-container {
background: #fff !important;
margin-top: 50px !important;
width: 75%;
height: 80%;
.el-dialog__body {
padding: 20px 20px 0 20px;
height: calc(100% - 70px);
}
.el-dialog__header {
position: relative;
}
}
::v-deep .cd-full-dialog-container {
background: #fff !important;
.el-dialog__body {
padding: 10px;
height: calc(100% - 50px) !important;
}
.el-dialog__header {
position: relative;
}
}
::v-deep .el-dropdown-menu {
.el-dropdown-menu__item {
padding: 0 5px;
@ -4218,3 +4191,60 @@ export default {
}
}
</style>
<style lang="scss">
.manuals-dialog-container {
margin-top: 50px !important;
width: 75%;
height: 80%;
.el-dialog__body {
padding: 10px;
height: calc(100% - 50px) !important;
}
.el-dialog__header {
position: relative;
}
}
.manuals-full-dialog-container {
.el-dialog__body {
padding: 10px;
height: calc(100% - 50px) !important;
}
.el-dialog__header {
position: relative;
}
}
.cd-dialog-container {
background: #fff !important;
margin-top: 50px !important;
width: 75%;
height: 80%;
.el-dialog__body {
padding: 20px 20px 0 20px;
height: calc(100% - 70px);
}
.el-dialog__header {
position: relative;
}
}
.cd-full-dialog-container {
background: #fff !important;
.el-dialog__body {
padding: 10px;
height: calc(100% - 50px) !important;
}
.el-dialog__header {
position: relative;
}
}
</style>

View File

@ -1986,12 +1986,12 @@ export default {
.merge-table {
padding: 0 10px;
::v-deep.el-table {
::v-deep .el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell,
::v-deep .el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
@ -2002,7 +2002,7 @@ export default {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
::v-deep .el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -2010,7 +2010,7 @@ export default {
}
}
::v-deep.el-table__body-wrapper {
::v-deep .el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -2021,7 +2021,7 @@ export default {
}
}
::v-deep.el-table__empty-block {
::v-deep .el-table__empty-block {
background-color: #1e1e1e !important;
}

View File

@ -208,9 +208,11 @@ const {
Enums: csToolsEnums,
segmentation,
annotation,
SegmentBidirectionalTool,
utilities: CStUtils,
} = cornerstoneTools;
const { MouseBindings, Events: toolsEvents } = csToolsEnums
const { segmentation: segmentationUtils, roundNumber } = CStUtils;
const { cache, getRenderingEngine, imageLoader, eventTarget, metaData, utilities: csUtils, volumeLoader } = cornerstone;
const { downloadDICOMData } = cornerstoneAdapters.helpers;
const { Cornerstone3D } = cornerstoneAdapters.adaptersSEG;
@ -378,26 +380,34 @@ export default {
const viewportId = `${this.viewportKey}-${this.activeViewportIndex}`
const viewport = renderingEngine.getViewport(viewportId);
this.$nextTick(() => {
[viewport.element].forEach((element) => {
const bidirectional = this.actionConfiguration.contourBidirectional.method(
element,
this.actionConfiguration.contourBidirectional
);
if (!bidirectional) {
console.log('No bidirectional found');
return;
}
item.bidirectional = bidirectional
let an = annotation.state.getAllAnnotations().find(i => i.data.segment && i.data.segment.segmentationId === bidirectional.segmentationId && i.data.segment.segmentIndex === bidirectional.segmentIndex && i.metadata.toolName === "Bidirectional");
annotation.locking.setAnnotationLocked(an.annotationUID, true)
if (DATA) {
this.segmentationId = DATA.SegmentationId;
// this.segmentIndex = this.segmentList[this.segmentList.length - 1].segments[0].segmentIndex;
this.segmentIndex = DATA.SegmentMumber;
setTimeout(() => {
this.selectSegment(DATA)
})
}
[viewport.element].forEach(async (element) => {
const bidirectionalData =
await CStUtils.segmentation.getSegmentLargestBidirectional({
segmentationId: item.segmentationId,
segmentIndices: [item.segmentIndex],
});
bidirectionalData.forEach((bidirectional) => {
const { segmentIndex } = bidirectional;
const { majorAxis, minorAxis, maxMajor, maxMinor } = bidirectional;
SegmentBidirectionalTool.hydrate(viewportId, [majorAxis, minorAxis], {
segmentIndex,
segmentationId: item.segmentationId,
});
item.bidirectional = bidirectional
let an = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === item.segmentationId && i.metadata.segmentIndex === bidirectional.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
if (an) {
annotation.locking.setAnnotationLocked(an.annotationUID, true)
}
if (DATA) {
this.segmentationId = DATA.SegmentationId;
this.segmentIndex = DATA.SegmentMumber;
setTimeout(() => {
this.selectSegment(DATA)
})
}
// render the bidirectional tool data
});
});
})
@ -427,7 +437,7 @@ export default {
}
},
viewBidirectional(item, view) {
let bidirectional = annotation.state.getAllAnnotations().find(i => i.data.segment && i.data.segment.segmentationId === this.segmentationId && i.data.segment.segmentIndex === item.segmentIndex && i.metadata.toolName === "Bidirectional");
let bidirectional = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === item.segmentationId && i.metadata.segmentIndex === item.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
annotation.visibility.setAnnotationVisibility(bidirectional.annotationUID, view)
item.bidirectionalView = view
this.resetViewport()
@ -469,16 +479,15 @@ export default {
this.segmentationId = item.segmentationId;
this.segmentIndex = item.segmentIndex;
segmentation.segmentIndex.setActiveSegmentIndex(item.segmentationId, item.segmentIndex);
console.log(item.bidirectional)
if (item.bidirectional) {
let sliceIndex = item.bidirectional.sliceIndex
let an = annotation.state.getAllAnnotations().find(i => i.metadata.segmentationId === item.segmentationId && i.metadata.segmentIndex === item.segmentIndex && i.metadata.toolName === "SegmentBidirectional");
if (!an) return false
let referencedImageId = an.metadata.referencedImageId;
let sliceIndex = metaData.get('generalImageModule', referencedImageId).instanceNumber
const renderingEngine = getRenderingEngine(this.renderingEngineId)
const viewportId = `${this.viewportKey}-${this.activeViewportIndex}`
const viewport = renderingEngine.getViewport(viewportId)
const segmentGroup =
segmentation.state.getSegmentation(this.segmentationId);
const { imageIds } = segmentGroup.representationData.Labelmap;
csUtils.jumpToSlice(viewport.element, { imageIndex: imageIds.length - 1 - sliceIndex });
csUtils.jumpToSlice(viewport.element, { imageIndex: sliceIndex - 1 });
}
if (item.lock) {
this.$emit('setToolsPassive')
@ -596,7 +605,7 @@ export default {
delAllSegment() {
segmentation.removeAllSegmentations()
segmentation.state.removeAllSegmentations()
let annotations = annotation.state.getAllAnnotations().filter(item => item.data.segmentation || item.data.segment);
let annotations = annotation.state.getAllAnnotations().filter(item => item.metadata.segmentationId && item.metadata.segmentIndex && item.metadata.toolName === "SegmentBidirectional");
annotations.forEach(item => {
annotation.state.removeAnnotation(item.annotationUID)
})
@ -613,7 +622,7 @@ export default {
segmentation.state.removeSegmentation(this.segmentationId)
let groupIndex = this.segmentList.findIndex(item => item.segmentationId === this.segmentationId)
this.segmentList.splice(groupIndex, 1)
let annotations = annotation.state.getAllAnnotations().filter(item => (item.data.segmentation && item.data.segmentation.segmentationId === this.segmentationId) || (item.data.segment && item.data.segment.segmentationId === this.segmentationId));
let annotations = annotation.state.getAllAnnotations().filter(item => item.metadata.segmentationId === this.segmentationId);
annotations.forEach(item => {
annotation.state.removeAnnotation(item.annotationUID)
})
@ -637,7 +646,7 @@ export default {
// segmentation.updateSegmentations({ segmentationId: this.segmentationId })
let index = this.segmentList[groupIndex].segments.findIndex(item => item.segmentIndex === segmentIndex)
this.segmentList[groupIndex].segments.splice(index, 1)
let annotations = annotation.state.getAllAnnotations().filter(item => (item.data.segmentation && item.data.segmentation.segmentationId === this.segmentationId && item.data.segmentation.segmentIndex === segmentIndex) || (item.data.segment && item.data.segment.segmentationId === this.segmentationId && item.data.segment.segmentIndex === segmentIndex));
let annotations = annotation.state.getAllAnnotations().filter(item => item.metadata.segmentationId === this.segmentationId && item.metadata.segmentIndex === segmentIndex);
annotations.forEach(item => {
annotation.state.removeAnnotation(item.annotationUID)
})
@ -740,9 +749,7 @@ export default {
segmentation.state.getSegmentation(segmentationId);
let { imageIds } = segmentGroup.representationData.Labelmap;
// imageIds.forEach(id => {
// console.log(metaData.get('generalImageModule', id))
// })
let segImages = imageIds.map(imageId => cache.getImage(imageId));
segImages = segImages.reverse()
let referencedImages = segImages.map(image =>
@ -818,6 +825,7 @@ export default {
labelmap3D,
metaData
);
console.log(generatedSegmentation.dataset, 'generatedSegmentation.dataset')
if (!isFile) {
const buffer = Buffer.from(dcmjs.data.datasetToDict(generatedSegmentation.dataset).write());
let blob = new Blob([buffer], { type: "application/dicom" });
@ -970,18 +978,35 @@ export default {
}
this.drawing = true
},
calculateStatistics(indices, segmentationId) {
const renderingEngine = getRenderingEngine(this.renderingEngineId)
const toolGroupId = this.isMPR ? this.volumeToolGroupId : `${this.viewportKey}-${this.activeViewportIndex}`
const viewportId = `${this.viewportKey}-${this.activeViewportIndex}`
const viewport = renderingEngine.getViewport(viewportId)
const toolGroup = ToolGroupManager.getToolGroup(toolGroupId);
const activeName = toolGroup.getActivePrimaryMouseButtonTool();
const brush = toolGroup.getToolInstance(activeName);
const stats = brush.getStatistics(viewport.element, { indices });
let segmentGroup = this.segmentList.find(item => item.segmentationId === segmentationId)
let segment = segmentGroup.segments.find(item => item.segmentIndex === indices[0])
segment.stats = stats;
async calculateStatistics(indices, segmentationId, mode) {
const stats = await segmentationUtils.getStatistics({
segmentationId,
segmentIndices: indices,
mode,
});
if (mode === 'individual') {
// Handle individual mode where stats is an object with segment indices as keys
const segmentStats = stats;
for (const segmentIndex of indices) {
if (segmentStats[segmentIndex]) {
const segmentStat = segmentStats[segmentIndex];
console.log(segmentStat, 'segmentStat')
segmentStat.count.label = 'Voxels';
let segmentGroup = this.segmentList.find(item => item.segmentationId === segmentationId)
let segment = segmentGroup.segments.find(item => item.segmentIndex === segmentIndex)
segment.stats = segmentStat;
}
}
} else {
const items = [`Statistics on ${indices.join(', ')}`];
// Handle collective mode where stats is a NamedStatistics object
const namedStats = stats;
namedStats.count.label = 'Voxels';
}
},
createSegmentationRepresentation(segmentationId) {
this.viewprotIds.forEach(id => {
@ -1004,7 +1029,7 @@ export default {
this.timeoutId = null;
this.drawing = false;
if (!this.isDel) {
this.calculateStatistics([this.segmentIndex], this.segmentationId);
this.calculateStatistics([this.segmentIndex], this.segmentationId, 'individual');
let segmentGroup = this.segmentList.find(item => item.segmentationId === this.segmentationId)
let segment = segmentGroup.segments.find(item => item.segmentIndex === this.segmentIndex)
this.getBidirectional(segment)
@ -1015,7 +1040,7 @@ export default {
segmentIndexs.push(item.segmentIndex)
this.getBidirectional(item)
})
this.calculateStatistics(segmentIndexs, this.segmentationId);
this.calculateStatistics(segmentIndexs, this.segmentationId, 'individual');
}
this.isDel = false
@ -1067,9 +1092,10 @@ export default {
}
let res = await this.getSegmentBindingList(data)
if (res && res.length > 0) questionNeedChange = true
res.forEach(async i => {
let segment = segmentGroup.find(d => d.id === i.SegmentId)
let question = await this.getQuestionConfig(i.TableQuestionId ? i.TableQuestionId : i.QuestionId, !!i.TableQuestionId);
for (let j = 0; j < res.length; j++) {
let item = res[j]
let segment = segmentGroup.segments.find(d => d.id === item.SegmentId)
let question = await this.getQuestionConfig(item.TableQuestionId ? item.TableQuestionId : item.QuestionId, !!item.TableQuestionId);
let imageToolAttribute = question.ImageToolAttribute
let answer = ''
if (imageToolAttribute === 'length' || imageToolAttribute === 'width') {
@ -1077,21 +1103,21 @@ export default {
length: "maxMajor",
width: 'maxMinor'
}
answer = segment.bidirectional && segment.stats[s[imageToolAttribute]] ? (segment.bidirectional[s[imageToolAttribute]]).toFixed(this.digitPlaces) : ''
answer = segment.bidirectional && segment.bidirectional[s[imageToolAttribute]] ? Number(segment.bidirectional[s[imageToolAttribute]]).toFixed(this.digitPlaces) : ''
} else {
answer = segment.stats && segment.stats[imageToolAttribute] ? Number((segment.stats[imageToolAttribute]).value).toFixed(this.digitPlaces) : ''
}
let o = {
Answer: answer,
QuestionId: i.QuestionId,
RowId: i.RowId,
SegmentId: i.SegmentId,
SegmentationId: i.SegmentationId,
TableQuestionId: i.TableQuestionId,
QuestionId: item.QuestionId,
RowId: item.RowId,
SegmentId: item.SegmentId,
SegmentationId: item.SegmentationId,
TableQuestionId: item.TableQuestionId,
VisitTaskId: this.visitInfo.VisitTaskId,
}
bindingList.push(o)
})
}
}
if (questionNeedChange) {
let confirm = await this.$confirm(this.$t("segment:confirm:questionNeedChange"))
@ -1196,12 +1222,16 @@ export default {
this.selectSegment(o)
this.changeColor(s.ColorRgb, o)
this.lockSegment(o, true)
setTimeout(() => {
if (SEGMENT && index === segments.length - 1) {
return this.getBidirectional(o, SEGMENT)
}
this.getBidirectional(o)
})
// setTimeout(() => {
// if (SEGMENT && index === segments.length - 1) {
// return this.getBidirectional(o, SEGMENT)
// }
// this.getBidirectional(o)
// })
if (SEGMENT && index === segments.length - 1) {
return this.getBidirectional(o, SEGMENT)
}
this.getBidirectional(o)
})
}
}

View File

@ -248,8 +248,7 @@ export default {
background-color: #607d8b !important;
border: 1px solid #607d8b !important;
}
::v-deep.el-progress__text {
::v-deep .el-progress__text{
color: #ccc;
font-size: 12px;
}
@ -300,8 +299,7 @@ export default {
}
}
::v-deep.el-collapse {
::v-deep .el-collapse{
border: none;
.el-collapse-item {

View File

@ -517,7 +517,7 @@ export default {
width: 'maxMinor'
}
if (!obj.bidirectional || !obj.bidirectional.maxMajor) return this.$confirm(this.$t("segment:error:notValue"))
answer = obj.bidirectional[s[imageToolAttribute]] ? (obj.bidirectional[s[imageToolAttribute]]).toFixed(this.digitPlaces) : ''
answer = obj.bidirectional[s[imageToolAttribute]] ? Number(obj.bidirectional[s[imageToolAttribute]]).toFixed(this.digitPlaces) : ''
} else {
if (!obj.stats) return this.$confirm(this.$t("segment:error:notValue"))
answer = obj.stats[imageToolAttribute] ? Number((obj.stats[imageToolAttribute]).value).toFixed(this.digitPlaces) : ''

View File

@ -2070,12 +2070,12 @@ export default {
.merge-table {
padding: 0 10px;
::v-deep.el-table {
::v-deep .el-table {
background-color: #1e1e1e !important;
color: #383838;
}
::v-deep.el-table td.el-table__cell,
::v-deep .el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf {
border-bottom: 1px solid #383838;
}
@ -2086,7 +2086,7 @@ export default {
background-color: #1e1e1e;
}
::v-deep.el-table__header-wrapper {
::v-deep .el-table__header-wrapper {
th {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -2094,7 +2094,7 @@ export default {
}
}
::v-deep.el-table__body-wrapper {
::v-deep .el-table__body-wrapper {
tr {
background-color: #1e1e1e !important;
color: #dfdfdf;
@ -2105,7 +2105,7 @@ export default {
}
}
::v-deep.el-table__empty-block {
::v-deep .el-table__empty-block {
background-color: #1e1e1e !important;
}

View File

@ -317,7 +317,7 @@ export default {
color: yellow;
}
}
::v-deep.el-button--text{
::v-deep .el-button--text{
color: #d0d0d0;
}
}

View File

@ -494,7 +494,7 @@ export default {
<style lang="scss" scoped>
.medical-feedback-ir{
::v-deep.search {
::v-deep .search {
padding: 0px !important;
}
}

View File

@ -366,7 +366,7 @@ export default {
color: yellow;
}
}
::v-deep.el-button--text{
::v-deep .el-button--text{
color: #d0d0d0;
}
}

View File

@ -161,16 +161,16 @@ export default {
</script>
<style lang="scss" scoped>
.issues-form{
::v-deep.el-radio-group{
::v-deep .el-radio-group{
width:300px;
}
::v-deep.el-textarea{
::v-deep .el-textarea{
width:300px;
}
::v-deep.el-input{
::v-deep .el-input{
width:300px;
}
::v-deep.el-select{
::v-deep .el-select{
width:300px;
}

View File

@ -297,7 +297,7 @@ export default {
height: 100%;
padding: 0 10px;
box-sizing: border-box;
::v-deep.el-tabs{
::v-deep .el-tabs{
box-sizing: border-box;
height: 100%;
display: flex;
@ -324,12 +324,12 @@ export default {
}
}
::v-deep.dialog-container{
::v-deep .dialog-container{
margin-top: 50px !important;
width:75%;
height:80%;
}
::v-deep.el-dialog__body{
::v-deep .el-dialog__body{
padding: 20px 20px 0 20px;
height: calc(100% - 70px);
}
@ -339,7 +339,7 @@ export default {
}
.full-dialog-container{
::v-deep.is-fullscreen .el-dialog__body{
::v-deep .is-fullscreen .el-dialog__body{
height: calc(100% - 70px);
}
}

View File

@ -884,7 +884,7 @@ export default {
</script>
<style lang="scss" scoped>
.read-task-allocation {
::v-deep.search {
::v-deep .search {
padding: 0px !important;
}
}

View File

@ -548,7 +548,7 @@ export default {
height: 100%;
background-color: #fff;
::v-deep.search {
::v-deep .search {
padding: 0px !important;
}
}

View File

@ -408,7 +408,7 @@ export default {
height: 100%;
background-color: #fff;
::v-deep.search {
::v-deep .search {
padding: 0px !important;
}
}

View File

@ -466,7 +466,7 @@ export default {
</script>
<style lang="scss" scoped>
.reread-task{
::v-deep.search {
::v-deep .search {
padding: 0px !important;
}
}

View File

@ -246,7 +246,7 @@ export default {
border: 1px solid #607d8b !important;
}
::v-deep.el-progress__text {
::v-deep .el-progress__text {
color: #ccc;
font-size: 12px;
}
@ -295,7 +295,7 @@ export default {
}
}
::v-deep.el-collapse {
::v-deep .el-collapse {
border: none;
.el-collapse-item {

View File

@ -221,12 +221,12 @@ export default {
overflow-y: auto;
}
::v-deep.el-collapse-item__header {
::v-deep .el-collapse-item__header {
background: #e5ecef;
padding-left: 10px;
}
::v-deep.el-collapse-item__content {
::v-deep .el-collapse-item__content {
padding: 10px;
}

View File

@ -562,7 +562,7 @@ export default {
background: #fff;
padding: 0px 10px;
box-sizing: border-box;
::v-deep.search {
::v-deep .search {
padding: 0px !important;
}
::v-deep .el-tabs--border-card>.el-tabs__content {

View File

@ -689,7 +689,7 @@ export default {
</script>
<style lang="scss" scoped>
.reading-period {
::v-deep.search {
::v-deep .search {
padding: 0px !important;
}
}

View File

@ -435,7 +435,7 @@ export default {
}
}
.menuSwitch {
::v-deep.el-switch__core {
::v-deep .el-switch__core {
height: 14px;
width: 28px !important;
&::after {
@ -446,7 +446,7 @@ export default {
}
}
.el-switch.is-checked {
::v-deep.el-switch__core {
::v-deep .el-switch__core {
height: 14px;
width: 28px !important;
&::after {

View File

@ -53,7 +53,7 @@ module.exports = defineConfig({
'/api': {
target: 'http://106.14.89.110:30000',
// target: 'http://101.132.253.119:7010', // uat
// target: 'http://101.132.253.119:7010', // uat
changeOrigin: true,
secure: false,
pathRewrite: {
@ -99,7 +99,7 @@ module.exports = defineConfig({
]
}),
// new BundleAnalyzerPlugin(),
process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'production' || process.env.VUE_APP_OSS_CONFIG_BUCKET === 'zyypacs-usa' ? function () { }
process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'production' || process.env.VUE_APP_OSS_CONFIG_BUCKET === 'zyypacs-usa' ? function() { }
: new WebpackAliyunOss({
from: ['./dist/**'],
dist: process.env.VUE_APP_OSS_PATH + distDate,
@ -186,7 +186,7 @@ module.exports = defineConfig({
// 生成文件的最大体积
maxAssetSize: 3000000000,
// 只给出js的性能提示
assetFilter: function (assetFileName) {
assetFilter: function(assetFileName) {
return assetFileName.endsWith('.js')
}
}