| | |
| | | <div class="homeCard"> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="作业申请单位" prop="workDetail.involvedDepIds"> |
| | | <el-cascader style="width: 100%" v-model="form.workDetail.involvedDepIds" :options="departList" :props="depProps" :show-all-levels="false"/> |
| | | <el-form-item label="作业申请单位" prop="applyDepId"> |
| | | <el-cascader style="width: 100%" v-model="form.applyDepId" :options="departList2" :props="props" :show-all-levels="false" placeholder="明确到具体车间" @change="findParent" clearable/> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="动火级别" prop="workLevel"> |
| | | <el-select v-model="form.workLevel"> |
| | | <el-select v-model="form.workLevel" clearable> |
| | | <el-option |
| | | v-for="item in workLevelList" |
| | | :key="item.value" |
| | |
| | | <el-col :span="12"> |
| | | <el-form-item label="作业地点及动火部位" prop="workLocation"> |
| | | <el-input |
| | | v-model="form.workContent" |
| | | v-model="form.workLocation" |
| | | :autosize="{ minRows: 1 }" |
| | | type="textarea" |
| | | placeholder="请输入作业内容" |
| | | placeholder="请输入作业地点及动火部位" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="动火方式" prop="workDetail.hotMethod"> |
| | | <el-form-item label="动火方式" prop="workDetail.workMethod"> |
| | | <el-input |
| | | v-model="form.workDetail.hotMethod" |
| | | v-model="form.workDetail.workMethod" |
| | | :autosize="{ minRows: 1 }" |
| | | type="textarea" |
| | | placeholder="请输入动火方式" |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="动火人级证书编号" prop="operatorUids"> |
| | | <el-select v-model="form.operatorUids" multiple> |
| | | <el-form-item label="作业人及证件编号" prop="operatorUids"> |
| | | <el-select v-model="form.operatorUids" multiple clearable> |
| | | <el-option |
| | | v-for="item in workerList" |
| | | :key="item.uid" |
| | |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="作业单位" prop="workDetail.involvedDepIds"> |
| | | <el-cascader style="width: 100%" v-model="form.workDetail.involvedDepIds" :props="depProps" :options="departList" :show-all-levels="false"/> |
| | | <el-form-item label="作业单位" prop="workDepId"> |
| | | <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="departList" :show-all-levels="false"/> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="作业负责人" prop="operatorUids"> |
| | | <el-select v-model="form.operatorUids" multiple> |
| | | <el-form-item label="作业负责人" prop="headUids"> |
| | | <el-select v-model="form.headUids" multiple @change="getStartEndIds" clearable> |
| | | <el-option |
| | | v-for="item in workerList" |
| | | :key="item.uid" |
| | |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="分析人" prop="operatorUids"> |
| | | <el-select v-model="form.operatorUids" multiple> |
| | | <el-form-item label="分析人" prop="analystUids"> |
| | | <el-select v-model="form.analystUids" multiple clearable> |
| | | <el-option |
| | | v-for="item in workerList" |
| | | :key="item.uid" |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="关联其他特殊作业" prop="workDetail.otherSpecialWork"> |
| | | <el-select v-model="form.workDetail.otherSpecialWork" multiple> |
| | | <el-form-item label="关联其他特殊作业" prop="involveOtherWork"> |
| | | <el-select v-model="form.involveOtherWork" multiple clearable> |
| | | <el-option |
| | | v-for="item in otherWorkList" |
| | | :key="item.value" |
| | |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="分析人" prop="operatorUids"> |
| | | <el-select v-model="form.operatorUids" multiple> |
| | | <el-form-item label="监护人" prop="guardianUids"> |
| | | <el-select v-model="form.guardianUids" multiple @change="getSafetyIds" clearable> |
| | | <el-option |
| | | v-for="item in workerList" |
| | | :key="item.uid" |
| | |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="绑定执法仪" prop="cameraIds"> |
| | | <el-select v-model="form.cameraIds" multiple> |
| | | <el-select v-model="form.cameraIds" multiple clearable> |
| | | <el-option |
| | | v-for="item in deviceList" |
| | | :key="item.id" |
| | |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <!-- <el-col :span="12">--> |
| | | <!-- <el-form-item label="动火作业实施时间" prop="expStartTime">--> |
| | | <!-- <el-date-picker--> |
| | | <!-- v-model="form.expStartTime"--> |
| | | <!-- format="YYYY-MM-DD HH:mm"--> |
| | | <!-- value-format="YYYY-MM-DD HH:mm:00"--> |
| | | <!-- type="datetimerange"--> |
| | | <!-- range-separator="至"--> |
| | | <!-- start-placeholder="开始时间"--> |
| | | <!-- end-placeholder="结束时间"--> |
| | | <!-- />--> |
| | | <!-- </el-form-item>--> |
| | | <!-- </el-col>--> |
| | | <el-col :span="12"> |
| | | <el-form-item label="动火作业实施时间" prop="workTimeLine"> |
| | | <el-form-item label="预计(整体)开始时间" prop="expStartTime"> |
| | | <el-date-picker |
| | | v-model="form.workTimeLine" |
| | | v-model="form.expStartTime" |
| | | format="YYYY-MM-DD HH:mm" |
| | | value-format="YYYY-MM-DD HH:mm:00" |
| | | type="datetimerange" |
| | | range-separator="至" |
| | | start-placeholder="开始时间" |
| | | end-placeholder="结束时间" |
| | | type="datetime" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="预计(整体)完成时间" prop="workTimeLine"> |
| | | <el-form-item label="预计(整体)完成时间" prop="expEndTime"> |
| | | <el-date-picker |
| | | v-model="form.workTimeLine" |
| | | v-model="form.expEndTime" |
| | | format="YYYY-MM-DD HH:mm" |
| | | value-format="YYYY-MM-DD HH:mm:00" |
| | | type="datetime" |
| | |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="备注" prop="info"> |
| | | <el-form-item label="风险辨识" prop="riskIdentification"> |
| | | <el-input |
| | | v-model="form.workContent" |
| | | v-model="form.riskIdentification" |
| | | :autosize="{ minRows: 1 }" |
| | | type="textarea" |
| | | placeholder="请输入风险辨识" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="备注" prop="remark"> |
| | | <el-input |
| | | v-model="form.remark" |
| | | :autosize="{ minRows: 1 }" |
| | | type="textarea" |
| | | placeholder="请输入作业备注" |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-table :data="safeData" style="width: 100%" border> |
| | | <el-table-column type="index" label="序号" width="80px"/> |
| | | <el-table-column prop="name" label="安全措施"/> |
| | | <el-table-column prop="address" label="确认人"> |
| | | <template #default="scope"> |
| | | <el-row style="display: flex;justify-content: center"> |
| | | <el-table :data="safetyMeasureBasicList" style="width: 90%" border> |
| | | <el-table-column type="index" label="序号" width="100px" align="center"/> |
| | | <el-table-column prop="measureContent" label="安全措施" align="center"/> |
| | | <!-- <el-table-column prop="address" label="确认人">--> |
| | | <!-- <template #default="scope">--> |
| | | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="address" label="操作"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" size="small" :icon="Edit">修改确认人</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <!-- </template>--> |
| | | <!-- </el-table-column>--> |
| | | <!-- <el-table-column prop="address" label="操作">--> |
| | | <!-- <template #default="scope">--> |
| | | <!-- <el-button link type="primary" size="small" :icon="Edit">修改确认人</el-button>--> |
| | | <!-- </template>--> |
| | | <!-- </el-table-column>--> |
| | | </el-table> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="其他安全措施填报人" prop="info"> |
| | | <el-select v-model="form.operatorUids" multiple> |
| | | <el-form-item label="安全措施确认人" prop="safetyMeasureUids"> |
| | | <el-select v-model="form.safetyMeasureUids" multiple clearable> |
| | | <el-option |
| | | v-for="item in workerList" |
| | | :key="item.uid" |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-table :data="form.reviewData" style="width: 100%" border> |
| | | <el-table-column prop="item" label="审批签字项目"/> |
| | | <el-table-column prop="isCheck" label="是否必签"> |
| | | <!-- <el-row>--> |
| | | <!-- <el-col :span="12">--> |
| | | <!-- <el-form-item label="其他安全措施">--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="form.workContent"--> |
| | | <!-- :autosize="{ minRows: 2 }"--> |
| | | <!-- type="textarea"--> |
| | | <!-- placeholder="请输入其他安全措施"--> |
| | | <!-- />--> |
| | | <!-- </el-form-item>--> |
| | | <!-- </el-col>--> |
| | | <!-- <el-col :span="12">--> |
| | | <!-- <el-form-item label="编制人">--> |
| | | <!-- <el-input--> |
| | | <!-- v-model="form.workContent"--> |
| | | <!-- placeholder="请输入编制人"--> |
| | | <!-- />--> |
| | | <!-- </el-form-item>--> |
| | | <!-- </el-col>--> |
| | | <!-- </el-row>--> |
| | | <el-row style="display: flex;justify-content: center"> |
| | | <el-table :data="form.approvalDepBasicList" style="width: 90%" border> |
| | | <el-table-column prop="content" label="审批签字项目" align="center"/> |
| | | <el-table-column prop="approvalType" label="是否必签" align="center"> |
| | | <template #default="scope"> |
| | | <el-radio-group v-model="scope.row.isCheck"> |
| | | <el-radio :label="1">所有必签</el-radio> |
| | | <el-radio :label="2">任一</el-radio> |
| | | <el-radio :label="3">非必签</el-radio> |
| | | </el-radio-group> |
| | | <el-form-item label="" prop="acceptUid"> |
| | | <el-radio-group v-model="scope.row.approvalType"> |
| | | <el-radio :label="0">所有必签</el-radio> |
| | | <el-radio :label="1">任一</el-radio> |
| | | <el-radio :label="2">非必签</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="names" label="审批人"> |
| | | <el-table-column prop="approvalUids" label="审批人" align="center"> |
| | | <template #default="scope"> |
| | | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="address" label="操作"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" size="small" :icon="Edit">选择审批人</el-button> |
| | | <el-select v-model="scope.row.approvalUids" multiple :disabled="isFirstRow(scope.$index)" clearable> |
| | | <el-option |
| | | v-for="item in workerList" |
| | | :key="item.uid" |
| | | :label="item.username" |
| | | :value="item.uid" |
| | | /> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="完工验收" prop="info"> |
| | | <el-select v-model="form.operatorUids"> |
| | | <el-form-item label="完工验收" prop="acceptUid"> |
| | | <el-select v-model="form.acceptUid" clearable> |
| | | <el-option |
| | | v-for="item in workerList" |
| | | :key="item.uid" |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="现场开始结束确认人" prop="info"> |
| | | <el-select v-model="form.operatorUids" multiple> |
| | | <el-form-item label="现场开始结束确认人" prop="startOrEndUids"> |
| | | <el-select v-model="form.startOrEndUids" multiple clearable> |
| | | <el-option |
| | | v-for="item in workerList" |
| | | :key="item.uid" |
| | |
| | | workLevelList: Array<any>, |
| | | otherWorkList: Array<any>, |
| | | equipmentDialog: boolean, |
| | | props:{}, |
| | | depProps:{}, |
| | | safeData: [] |
| | | safetyMeasureBasicList: [] |
| | | } |
| | | export default defineComponent({ |
| | | name: 'fireForm', |
| | | components: { |
| | | |
| | | }, |
| | | props:['departList','workerList','deviceList'], |
| | | components: {}, |
| | | props:['departList','departList2','workerList','deviceList'], |
| | | setup(props: any, context: any) { |
| | | const userInfo = useUserInfo() |
| | | const { userInfos } = storeToRefs(userInfo); |
| | | const state = reactive<stateType>({ |
| | | equipmentDialog: false, |
| | | safetyMeasureBasicList: [], |
| | | form: { |
| | | operatorUids: [], |
| | | workType: 1, |
| | | workLevel: null, |
| | | workContent: '', |
| | | workLocation: '', |
| | | maBaseId: null, |
| | | hazardIdentification: '', |
| | | workType: 1, |
| | | workLevel: null, |
| | | applyDepId: null, |
| | | seDepId: null, |
| | | expStartTime: '', |
| | | expEndTime: '', |
| | | operatorUids: [], |
| | | headUids: [], |
| | | analystUids: [], |
| | | guardianUids: [], |
| | | workDepId: null, |
| | | workContent: '', |
| | | workLocation: '', |
| | | riskIdentification: '', |
| | | involveOtherWork: '', |
| | | safetyMeasureUids: [], |
| | | approvalDepBasicList: [], |
| | | acceptUid: null, |
| | | startOrEndUids: [], |
| | | cameraIds: [], |
| | | workDetail:{ |
| | | hotMethod: '', |
| | | otherSpecialWork: [] |
| | | }, |
| | | receiveUids: [], |
| | | workTimeLine: [], |
| | | expStartTime: '', |
| | | expEndTime: '', |
| | | reviewData: [ |
| | | { |
| | | item: '作业负责人意见', |
| | | isCheck: null, |
| | | names: [] |
| | | }, |
| | | { |
| | | item: '车间主任意见', |
| | | isCheck: null, |
| | | names: [] |
| | | }, |
| | | { |
| | | item: '运营安环科意见', |
| | | isCheck: null, |
| | | names: [] |
| | | }, |
| | | { |
| | | item: '运营单位负责人意见', |
| | | isCheck: null, |
| | | names: [] |
| | | }, |
| | | { |
| | | item: '事业部安环科意见', |
| | | isCheck: null, |
| | | names: [] |
| | | }, |
| | | { |
| | | item: '事业部负责人审批意见', |
| | | isCheck: null, |
| | | names: [] |
| | | }, |
| | | { |
| | | item: '公司主要负责人审批意见', |
| | | isCheck: null, |
| | | names: [] |
| | | }, |
| | | { |
| | | item: '岗位当班班长验票情况', |
| | | isCheck: null, |
| | | names: [] |
| | | } |
| | | ] |
| | | workDetail: { |
| | | workMethod: '' |
| | | } |
| | | }, |
| | | workLevelList: [ |
| | | { |
| | |
| | | value: 8 |
| | | } |
| | | ], |
| | | props:{ |
| | | expandTrigger: 'hover', |
| | | label: 'depName', |
| | | value: 'depId', |
| | | emitPath: false |
| | | }, |
| | | depProps:{ |
| | | expandTrigger: 'hover', |
| | | label: 'depName', |
| | | value: 'depId' |
| | | }, |
| | | safeData: [] |
| | | value: 'depId', |
| | | checkStrictly: true, |
| | | emitPath: false |
| | | } |
| | | }); |
| | | const ruleFormRef = ref<FormInstance>() |
| | | const applyRules = reactive<FormRules>({ |
| | | operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | workType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | workLevel: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | applyDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | workLevel: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | hazardIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | analystUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | involveOtherWork: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | riskIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | cameraIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | workTimeLine: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | "workDetail.hotMethod": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] |
| | | expStartTime: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | expEndTime: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | safetyMeasureUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | acceptUid: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | startOrEndUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], |
| | | "workDetail.workMethod": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] |
| | | }); |
| | | |
| | | // 页面载入时执行方法 |
| | | onMounted(() => { |
| | | state.form.involvedDepIds = userInfos.value.depId |
| | | }); |
| | | getBasicData() |
| | | }); |
| | | |
| | | const findParent = ()=>{ |
| | | state.form.seDepId = findNearestDepLevel2DepId(props.departList2,state.form.applyDepId) |
| | | console.log(state.form.seDepId,'state.form.seDepId') |
| | | } |
| | | |
| | | // 获取基础数据 |
| | | const getBasicData = async ()=>{ |
| | | const res = await workApplyApi().getFormData(1) |
| | | if (res.data.code === '200') { |
| | | state.safetyMeasureBasicList = JSON.parse(JSON.stringify(res.data.data.safetyMeasureBasicList)) |
| | | if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ |
| | | state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ |
| | | content, |
| | | approvalDepBasicId: id, |
| | | approvalUids: [], |
| | | approvalType: null |
| | | })) |
| | | }else{ |
| | | state.form.approvalDepBasicList = [] |
| | | } |
| | | } else { |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: res.data.msg |
| | | }); |
| | | } |
| | | }; |
| | | |
| | | const getStartEndIds = ()=>{ |
| | | state.form.startOrEndUids = state.form.headUids |
| | | state.form.approvalDepBasicList[0].approvalUids = state.form.headUids |
| | | } |
| | | |
| | | const getSafetyIds = ()=>{ |
| | | state.form.safetyMeasureUids = state.form.guardianUids |
| | | } |
| | | |
| | | const isFirstRow = (index)=> { |
| | | return index === 0; |
| | | } |
| | | |
| | | const submitForm = async (formEl: FormInstance | undefined) => { |
| | | if (!formEl) return |
| | | await formEl.validate(async (valid, fields) => { |
| | | if (valid) { |
| | | for(let i of state.form.approvalDepBasicList){ |
| | | if(i.approvalUids.length == 0){ |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: '部分审批人未配置' |
| | | }); |
| | | return |
| | | } |
| | | } |
| | | if(Array.isArray(state.form.involveOtherWork)){ |
| | | state.form.involveOtherWork = state.form.involveOtherWork.join(',') |
| | | } |
| | | const res = await workApplyApi().submitFireApply(state.form) |
| | | if (res.data.code === '200') { |
| | | ElMessage({ |
| | | type: 'success', |
| | | message: '提交成功!' |
| | | }); |
| | | formEl.resetFields() |
| | | getBasicData() |
| | | } else { |
| | | ElMessage({ |
| | | type: 'warning', |
| | | message: res.data.msg |
| | | }); |
| | | state.form.involveOtherWork = state.form.involveOtherWork.split(',') |
| | | } |
| | | } else { |
| | | console.log('error submit!', fields) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | const findNearestDepLevel2DepId = (data, targetDepId) => { |
| | | let nearestDepId = null; |
| | | |
| | | const traverseTree = (node) => { |
| | | if (node.depId === targetDepId) { |
| | | return true; |
| | | } |
| | | |
| | | if (node.children && node.children.length > 0) { |
| | | for (const child of node.children) { |
| | | const found = traverseTree(child); |
| | | if (found) { |
| | | if (child.depLevel === 2) { |
| | | nearestDepId = child.depId; |
| | | } |
| | | return true; |
| | | } |
| | | } |
| | | } |
| | | |
| | | return false; |
| | | }; |
| | | |
| | | for (const root of data) { |
| | | traverseTree(root); |
| | | } |
| | | |
| | | return nearestDepId; |
| | | }; |
| | | |
| | | // 折线图 |
| | | const renderMenu = async (value: string) => { |
| | |
| | | }; |
| | | return { |
| | | renderMenu, |
| | | getBasicData, |
| | | getStartEndIds, |
| | | getSafetyIds, |
| | | isFirstRow, |
| | | submitForm, |
| | | findParent, |
| | | Search, |
| | | ruleFormRef, |
| | | applyRules, |
| | |
| | | overflow: hidden; |
| | | position: relative; |
| | | overflow-y: scroll; |
| | | padding: 40px 0 100px; |
| | | padding: 0 0 120px; |
| | | .homeCard{ |
| | | width: 100%; |
| | | padding: 20px; |
| | |
| | | margin-bottom: 20px; |
| | | } |
| | | .applyBtn{ |
| | | position: absolute; |
| | | position: fixed; |
| | | left: 0; |
| | | bottom: 0; |
| | | z-index: 999; |
| | | width: 100%; |
| | | background: #fff; |
| | | padding-top: 15px; |
| | | padding: 20px 0; |
| | | box-shadow: 0 -3px 8px rgba(150,150,150,.1); |
| | | display: flex; |
| | | align-items: center; |