项目报表添加ORR分布、项目报表添加权限

main
wangxiaoshuang 2026-01-05 15:23:30 +08:00
parent 99955b2eff
commit d8712f26cd
4 changed files with 215 additions and 228 deletions

View File

@ -2,16 +2,16 @@
<template> <template>
<div class="trialsTab"> <div class="trialsTab">
<el-tabs v-model="trialsTab" @tab-click="clickTab"> <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 && item.path !== '/trials/trials-panel/attachments'" :label="$t(item.LanguageMark)" :name="item.path"> <el-tab-pane v-for="item of trialsRouter.children.find(v => { return v.name == 'TrialsPanel' }).children"
<el-tabs v-if="!item.tabHiddn" v-model="trialsTabChild" @tab-click="clickTab" style="background-color: #f5f7fa;"> :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"
style="background-color: #f5f7fa;">
<template v-for="item1 of item.children"> <template v-for="item1 of item.children">
<el-tab-pane <el-tab-pane v-if="TrialConfig && isShow(item1.path)" :key="`tab1${item1.path}`"
v-if="TrialConfig && isShow(item1.path)"
:key="`tab1${item1.path}`"
: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'))" :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)" :label="$t(item1.LanguageMark)" :name="item1.path" />
:name="item1.path"
/>
</template> </template>
</el-tabs> </el-tabs>
</el-tab-pane> </el-tab-pane>
@ -119,6 +119,9 @@ export default {
methods: { methods: {
isShow: function (path) { isShow: function (path) {
var isShow = true var isShow = true
let chartList = [
'/trials/trials-panel/trial-summary/report-forms'
]
var qualityList = [ var qualityList = [
'/trials/trials-panel/visit/crc-question', '/trials/trials-panel/visit/crc-question',
'/trials/trials-panel/visit/qc-check', '/trials/trials-panel/visit/qc-check',
@ -134,6 +137,9 @@ export default {
'/trials/trials-panel/trial-summary/image-inspect', '/trials/trials-panel/trial-summary/image-inspect',
'/trials/trials-panel/trial-summary/push-record', '/trials/trials-panel/trial-summary/push-record',
] ]
if (!this.$store.state.trials.config.IsExternalViewTrialChart && ~chartList.indexOf(path) && this.hasPermi(['role:cmm', 'role:cpm', 'role:ea', 'role:mc', 'role:smm', 'role:spm'])) {
isShow = false
}
if (this.TrialConfig.QCProcessEnum === 0 && ~qualityList.indexOf(path)) { if (this.TrialConfig.QCProcessEnum === 0 && ~qualityList.indexOf(path)) {
isShow = false isShow = false
} }
@ -214,37 +220,49 @@ export default {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
&:hover { &:hover {
color: #428bca; color: #428bca;
} }
span { span {
margin-left: 3px; margin-left: 3px;
font-size: 14px; font-size: 14px;
} }
} }
.el-tabs__header { .el-tabs__header {
margin-bottom: 3px; margin-bottom: 3px;
} }
.el-tabs__item.is-active { .el-tabs__item.is-active {
font-weight: bold; font-weight: bold;
} }
position: relative; position: relative;
.el-input--medium .el-input__inner { .el-input--medium .el-input__inner {
height: 44px;line-height: 44px;width: 280px; height: 44px;
line-height: 44px;
width: 280px;
border: none; border: none;
text-align: right; text-align: right;
} }
} }
.base-model-wrapper { .base-model-wrapper {
.el-dialog__header { .el-dialog__header {
padding: 10px; padding: 10px;
.el-dialog__headerbtn { .el-dialog__headerbtn {
top: 10px; top: 10px;
right: 10px; right: 10px;
} }
} }
.el-dialog__body { .el-dialog__body {
padding: 10px 10px 10px 10px; padding: 10px 10px 10px 10px;
.base-modal-body { .base-modal-body {
min-height: 100px; min-height: 100px;
max-height: 650px; max-height: 650px;
@ -253,6 +271,7 @@ export default {
border: 1px solid #e0e0e0; border: 1px solid #e0e0e0;
} }
} }
.el-dialog__footer { .el-dialog__footer {
padding: 10px; padding: 10px;
} }

View File

@ -12,94 +12,45 @@
<span>{{ $t('trials:externalStaff:table:phone') }}:</span> <span>{{ $t('trials:externalStaff:table:phone') }}:</span>
<el-input v-model="listQuery.Phone" size="mini" class="mr" clearable /> <el-input v-model="listQuery.Phone" size="mini" class="mr" clearable />
<!-- 查询 --> <!-- 查询 -->
<el-button <el-button type="primary" size="mini" icon="el-icon-search" @click="handleSearch">
type="primary"
size="mini"
icon="el-icon-search"
@click="handleSearch"
>
{{ $t('common:button:search') }} {{ $t('common:button:search') }}
</el-button> </el-button>
<!-- 重置 --> <!-- 重置 -->
<el-button <el-button size="mini" type="primary" style="margin-right: 10px" icon="el-icon-refresh-left"
size="mini" @click="handleReset">
type="primary"
style="margin-right: 10px"
icon="el-icon-refresh-left"
@click="handleReset"
>
{{ $t('common:button:reset') }} {{ $t('common:button:reset') }}
</el-button> </el-button>
<!-- 权限配置 --> <!-- 权限配置 -->
<el-button <el-button type="primary" size="mini" style="margin-left: auto" :loading="assignLoadStatus"
type="primary" @click="openPermission">
size="mini"
style="margin-left: auto"
:loading="assignLoadStatus"
@click="openPermission"
>
{{ $t('trials:staff:button:permissionConfiguration') }} {{ $t('trials:staff:button:permissionConfiguration') }}
</el-button> </el-button>
<!-- 发送邮件 --> <!-- 发送邮件 -->
<el-button <el-button type="primary" size="mini" style="margin-left: 10px" :disabled="selectArr.length === 0"
type="primary" :loading="assignLoadStatus" icon="el-icon-message" @click="sendEmail">
size="mini"
style="margin-left: 10px"
:disabled="selectArr.length === 0"
:loading="assignLoadStatus"
icon="el-icon-message"
@click="sendEmail"
>
{{ $t('trials:staff:button:sendEmail') }} {{ $t('trials:staff:button:sendEmail') }}
</el-button> </el-button>
<!-- 添加 --> <!-- 添加 -->
<el-button <el-button type="primary" icon="el-icon-plus" size="mini" style="margin-left: 10px" :loading="assignLoadStatus"
type="primary" @click="handleAdd">
icon="el-icon-plus"
size="mini"
style="margin-left: 10px"
:loading="assignLoadStatus"
@click="handleAdd"
>
{{ $t('trials:staff:button:addExternalStaff') }} {{ $t('trials:staff:button:addExternalStaff') }}
</el-button> </el-button>
</div> </div>
</el-header> </el-header>
<el-main> <el-main>
<div class="data-table"> <div class="data-table">
<el-table <el-table v-loading="loading" :data="list" stripe height="400px" class="participant-table-list"
v-loading="loading" @selection-change="handleSelectChange" @sort-change="handleSortByColumn">
:data="list" <el-table-column type="selection" width="50" :selectable="handleSelectable" />
stripe
height="400px"
class="participant-table-list"
@selection-change="handleSelectChange"
@sort-change="handleSortByColumn"
>
<el-table-column
type="selection"
width="50"
:selectable="handleSelectable"
/>
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50" />
<el-table-column <el-table-column prop="UserRealName" :label="$t('trials:externalStaff:table:name')" show-overflow-tooltip
prop="UserRealName" sortable="custom" min-width="100">
:label="$t('trials:externalStaff:table:name')"
show-overflow-tooltip
sortable="custom"
min-width="100"
>
<template slot-scope="scope">{{ <template slot-scope="scope">{{
scope.row.LastName + ' / ' + scope.row.FirstName scope.row.LastName + ' / ' + scope.row.FirstName
}}</template> }}</template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column prop="UserType" :label="$t('trials:externalStaff:table:userType')" show-overflow-tooltip
prop="UserType" sortable="custom" min-width="120">
:label="$t('trials:externalStaff:table:userType')"
show-overflow-tooltip
sortable="custom"
min-width="120"
>
<template slot-scope="scope"> <template slot-scope="scope">
{{ {{
userTypeOptions.length > 0 userTypeOptions.length > 0
@ -110,128 +61,61 @@
}} }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column prop="Phone" :label="$t('trials:externalStaff:table:phone')" show-overflow-tooltip
prop="Phone" sortable="custom" min-width="120" />
:label="$t('trials:externalStaff:table:phone')" <el-table-column prop="Email" :label="$t('trials:externalStaff:table:email')" show-overflow-tooltip
show-overflow-tooltip sortable="custom" min-width="120" />
sortable="custom" <el-table-column prop="OrganizationName" :label="$t('trials:externalStaff:table:organization')"
min-width="120" show-overflow-tooltip sortable="custom" min-width="120" />
/>
<el-table-column
prop="Email"
:label="$t('trials:externalStaff:table:email')"
show-overflow-tooltip
sortable="custom"
min-width="120"
/>
<el-table-column
prop="OrganizationName"
:label="$t('trials:externalStaff:table:organization')"
show-overflow-tooltip
sortable="custom"
min-width="120"
/>
<el-table-column <el-table-column prop="inviteState" :label="$t('trials:externalStaff:table:status')" fixed="right"
prop="inviteState" show-overflow-tooltip sortable="custom" min-width="120">
:label="$t('trials:externalStaff:table:status')"
fixed="right"
show-overflow-tooltip
sortable="custom"
min-width="120"
>
<template slot-scope="scope">{{ <template slot-scope="scope">{{
$fd('IsJoin', scope.row.IsJoin) $fd('IsJoin', scope.row.IsJoin)
}}</template> }}</template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('common:action:action')" fixed="right" min-width="150">
:label="$t('common:action:action')"
fixed="right"
min-width="150"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button circle icon="el-icon-delete" :disabled="scope.row.IsJoin"
circle :title="$t('trials:externalStaff:button:delete')" @click="deleteTrialExternalUser(scope.row)" />
icon="el-icon-delete"
:disabled="scope.row.IsJoin"
:title="$t('trials:externalStaff:button:delete')"
@click="deleteTrialExternalUser(scope.row)"
/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
</el-main> </el-main>
<StaffExternalAdd <StaffExternalAdd ref="StaffExternalAdd" :user-type-options="userTypeOptions" @getList="refeshList" />
ref="StaffExternalAdd"
:user-type-options="userTypeOptions"
@getList="refeshList"
/>
<base-model v-if="model_config.visible" :config="model_config"> <base-model v-if="model_config.visible" :config="model_config">
<template slot="dialog-body"> <template slot="dialog-body">
<el-form <el-form :model="permission" :rules="permissionRole" ref="permissionForm" label-width="230px"
:model="permission" class="demo-ruleForm">
:rules="permissionRole" <el-form-item :label="$t('trials:externalStaff:form:IsSPMJoinReReadingApproval')"
ref="permissionForm" prop="IsSPMJoinReReadingApproval">
label-width="230px"
class="demo-ruleForm"
>
<el-form-item
:label="$t('trials:externalStaff:form:IsSPMJoinReReadingApproval')"
prop="IsSPMJoinReReadingApproval"
>
<el-radio-group v-model="permission.IsSPMJoinReReadingApproval"> <el-radio-group v-model="permission.IsSPMJoinReReadingApproval">
<el-radio <el-radio v-for="item in $d.YesOrNo" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
v-for="item in $d.YesOrNo"
:key="item.id"
:label="item.value"
>{{ item.label }}</el-radio
>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item <el-form-item :label="$t('trials:externalStaff:form:IsSPMJoinReviewerSelect')" prop="IsSPMJoinReviewerSelect">
:label="$t('trials:externalStaff:form:IsSPMJoinReviewerSelect')"
prop="IsSPMJoinReviewerSelect"
>
<el-radio-group v-model="permission.IsSPMJoinReviewerSelect"> <el-radio-group v-model="permission.IsSPMJoinReviewerSelect">
<el-radio <el-radio v-for="item in $d.YesOrNo" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
v-for="item in $d.YesOrNo"
:key="item.id"
:label="item.value"
>{{ item.label }}</el-radio
>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item <el-form-item :label="$t('trials:externalStaff:form:IsSPMJoinSiteSurvey')" prop="IsSPMJoinSiteSurvey">
:label="$t('trials:externalStaff:form:IsSPMJoinSiteSurvey')"
prop="IsSPMJoinSiteSurvey"
>
<el-radio-group v-model="permission.IsSPMJoinSiteSurvey"> <el-radio-group v-model="permission.IsSPMJoinSiteSurvey">
<el-radio <el-radio v-for="item in $d.YesOrNo" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
v-for="item in $d.YesOrNo" </el-radio-group>
:key="item.id" </el-form-item>
:label="item.value" <el-form-item :label="$t('trials:externalStaff:form:IsExternalViewTrialChart')" prop="IsSPMJoinSiteSurvey">
>{{ item.label }}</el-radio <el-radio-group v-model="permission.IsExternalViewTrialChart">
> <el-radio v-for="item in $d.YesOrNo" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-form> </el-form>
</template> </template>
<template slot="dialog-footer"> <template slot="dialog-footer">
<el-button <el-button :disabled="assignLoadStatus" size="small" type="primary" @click="model_config.visible = false">
:disabled="assignLoadStatus"
size="small"
type="primary"
@click="model_config.visible = false"
>
{{ $t('common:button:cancel') }} {{ $t('common:button:cancel') }}
</el-button> </el-button>
<el-button <el-button size="small" type="primary" :loading="assignLoadStatus" @click="savePermission">
size="small"
type="primary"
:loading="assignLoadStatus"
@click="savePermission"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</el-button> </el-button>
</template> </template>
@ -286,6 +170,7 @@ export default {
IsSPMJoinReReadingApproval: false, IsSPMJoinReReadingApproval: false,
IsSPMJoinReviewerSelect: false, IsSPMJoinReviewerSelect: false,
IsSPMJoinSiteSurvey: false, IsSPMJoinSiteSurvey: false,
IsExternalViewTrialChart: false
}, },
permissionRole: {}, permissionRole: {},
} }
@ -491,24 +376,30 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.participant-container { .participant-container {
height: 100%; height: 100%;
.el-header { .el-header {
padding-right: 5px; padding-right: 5px;
.filter-container { .filter-container {
display: flex; display: flex;
align-items: center; align-items: center;
span { span {
font-size: 13px; font-size: 13px;
margin-right: 5px; margin-right: 5px;
} }
.mr { .mr {
margin-right: 5px; margin-right: 5px;
width: 120px; width: 120px;
} }
} }
} }
.el-main { .el-main {
padding: 0px; padding: 0px;
} }
.el-footer { .el-footer {
padding: 0 20px; padding: 0 20px;
} }

View File

@ -123,7 +123,7 @@
show-overflow-tooltip sortable="custom" min-width="120" /> show-overflow-tooltip sortable="custom" min-width="120" />
<el-table-column <el-table-column
v-if="hasPermi(['trials:trials-panel:subject:edit', 'trials:trials-panel:subject:status', 'trials:trials-panel:subject:delete', 'trials:trials-panel:subject:chart', 'trials:trials-panel:subject:report'])" v-if="hasPermi(['trials:trials-panel:subject:edit', 'trials:trials-panel:subject:status', 'trials:trials-panel:subject:delete', 'trials:trials-panel:subject:report']) || (hasPermi(['trials:trials-panel:subject:chart']) && isShowChart)"
:label="$t('common:action:action')" width="240" fixed="right"> :label="$t('common:action:action')" width="240" fixed="right">
<template slot-scope="scope"> <template slot-scope="scope">
<!-- 编辑 --> <!-- 编辑 -->
@ -140,8 +140,8 @@
<el-button v-hasPermi="['trials:trials-panel:subject:report']" icon="el-icon-message" circle <el-button v-hasPermi="['trials:trials-panel:subject:report']" icon="el-icon-message" circle
:title="$t('trials:subject:title:report')" @click="handleMessage(scope.row)" /> :title="$t('trials:subject:title:report')" @click="handleMessage(scope.row)" />
<!-- 图表 --> <!-- 图表 -->
<el-button v-hasPermi="['trials:trials-panel:subject:chart']" icon="el-icon-s-data" circle <el-button v-hasPermi="['trials:trials-panel:subject:chart']" v-if="isShowChart" icon="el-icon-s-data"
:title="$t('trials:subject:title:report')" @click="handleopenSubjectChart(scope.row)" /> circle :title="$t('trials:subject:title:report')" @click="handleopenSubjectChart(scope.row)" />
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -229,6 +229,11 @@ export default {
}) })
} }
}, },
computed: {
isShowChart() {
return this.$store.state.trials.config.IsExternalViewTrialChart || !this.hasPermi(['role:cmm', 'role:cpm', 'role:ea', 'role:mc', 'role:smm', 'role:spm'])
}
},
mounted() { mounted() {
const trialsRouter = this.$store.getters.routes.find(r => { return r.name === 'Trials' }) const trialsRouter = this.$store.getters.routes.find(r => { return r.name === 'Trials' })
const trialsPanelRouter = trialsRouter.children.find(r => { return r.name === 'TrialsPanel' }).children const trialsPanelRouter = trialsRouter.children.find(r => { return r.name === 'TrialsPanel' }).children

View File

@ -18,11 +18,16 @@
<div class="chartBox" :style="{ height: isTumor ? '50%' : '100%' }"> <div class="chartBox" :style="{ height: isTumor ? '50%' : '100%' }">
<div ref="chartContainer_right" style="width: 100%; height: 100%;" v-loading="loading_right"></div> <div ref="chartContainer_right" style="width: 100%; height: 100%;" v-loading="loading_right"></div>
</div> </div>
<div class="chartBox" :style="{ position: 'relative' }" v-if="isTumor">
<div ref="chartContainer_bottom" style="width: 100%; height: 100%;" v-loading="loading_bottom"></div>
<span v-if="ORR" style="position: absolute;top: 0;right:20px">ORR: {{ ORR }}</span>
</div>
<div class="chartBox" v-if="isTumor"> <div class="chartBox" v-if="isTumor">
<div ref="chartContainer_bottom" style="width: 100%; height: 100%;" v-loading="loading_bottom"></div>
</div>
<div class="chartBox" :style="{ position: 'relative' }" v-if="isTumor">
<div ref="chartContainer_bottom_left" style="width: 100%; height: 100%;" v-loading="loading_bottom">
</div>
<span v-if="ORR" style="position: absolute;top: 0;right:20px">{{
$t("trials:reportForms:cjart:title:totleORR") }} {{ ORR }}</span>
</div>
<div class="chartBox" v-if="isTumor" style="width:100%">
<div ref="chartContainer_bottom_right" style="width: 100%; height: 100%;" v-loading="loading_bottom"> <div ref="chartContainer_bottom_right" style="width: 100%; height: 100%;" v-loading="loading_bottom">
</div> </div>
</div> </div>
@ -76,6 +81,7 @@ export default {
loading_bottom: false, loading_bottom: false,
chart_bottom: null, chart_bottom: null,
chart_bottom_right: null, chart_bottom_right: null,
chart_bottom_left: null,
// isHas_bottom_right: false, // isHas_bottom_right: false,
ORR: null ORR: null
} }
@ -369,12 +375,26 @@ export default {
// this.isHas_bottom_right = true // this.isHas_bottom_right = true
OtherInfo.PDList.forEach(item => { OtherInfo.PDList.forEach(item => {
obj2.xAxisData.push(item.SubjectCode) obj2.xAxisData.push(item.SubjectCode)
obj2.seriesData.push(item.DaysDiff) obj2.seriesData.push(item.MonthsDiff)
}) })
obj2.medianValue = this.calculateMedian(obj2.seriesData) obj2.medianValue = this.calculateMedian(obj2.seriesData)
} }
let obj3 = {
xAxisData: [],
seriesData: [],
unit: this.$t("trials:reportForms:cjart:unit:ORRValue"),
titleText: this.$t("trials:reportForms:cjart:title:ORR"),
}
if (OtherInfo.SiteORRList && OtherInfo.SiteORRList.length > 0) {
// this.isHas_bottom_right = true
OtherInfo.SiteORRList.forEach(item => {
obj3.xAxisData.push(item.TrialSiteCode)
obj3.seriesData.push(item.OrrPercent.split("%")[0])
})
}
this.$nextTick(() => { this.$nextTick(() => {
this.initChart_bottom_right(obj2) this.initChart_bottom_right(obj2)
this.initChart_bottom_left(obj3)
}) })
// else { // else {
// this.isHas_bottom_right = false // this.isHas_bottom_right = false
@ -428,6 +448,57 @@ export default {
// 4. 使 // 4. 使
this.chart_bottom.setOption(option); this.chart_bottom.setOption(option);
}, },
initChart_bottom_left(obj) {
this.chart_bottom_left = echarts.init(this.$refs.chartContainer_bottom_left);
// ...
const option = {
title: {
text: obj.titleText
},
color: this.color,
tooltip: {
trigger: 'item',
formatter: `{b} : {c}%`
},
// tooltip: {
// trigger: 'axis',
// axisPointer: {
// type: 'shadow'
// }
// },
xAxis: {
type: 'category',
data: obj.xAxisData
// data: ['aaa', 'bbb', 'ccc']
},
yAxis: {
name: obj.unit,
type: 'value',
axisLabel: {
formatter: '{value}%'
}
},
series: {
label: {
show: true,
formatter: `{c}%`,
position: 'inside',
textStyle: {
fontSize: 14, // 14px
color: '#000', //
// fontWeight: 'bold' //
}
},
data: obj.seriesData,
// data: [1, 2, 3],
type: 'bar',
barWidth: 20,
}
};
// 4. 使
this.chart_bottom_left.setOption(option);
},
initChart_bottom_right(obj) { initChart_bottom_right(obj) {
this.chart_bottom_right = echarts.init(this.$refs.chartContainer_bottom_right); this.chart_bottom_right = echarts.init(this.$refs.chartContainer_bottom_right);
// ... // ...
@ -513,6 +584,7 @@ export default {
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: #fff; background-color: #fff;
overflow-y: auto;
.search { .search {
padding: 5px; padding: 5px;