From 237f95b05e0f122ee9ec7beaf82ba366a8b220ed Mon Sep 17 00:00:00 2001 From: spring <2396852758@qq.com> Date: 星期六, 15 二月 2025 14:50:59 +0800 Subject: [PATCH] 修改设备模块bug --- src/components/do/a6-device/state.vue | 641 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 639 insertions(+), 2 deletions(-) diff --git a/src/components/do/a6-device/state.vue b/src/components/do/a6-device/state.vue index fa4c76c..ceb8aa1 100644 --- a/src/components/do/a6-device/state.vue +++ b/src/components/do/a6-device/state.vue @@ -1,13 +1,650 @@ +<!-- 璁惧鍋滅敤鍚敤 --> <template> - <div>璁惧鍋滅敤/鍚敤</div> + <div> + <div class="search"> + <el-row :gutter="10" style="width: 100%;"> + <el-col :span="20" style="display: flex;flex-wrap: wrap;"> + <div class="search_thing"> + <div class="search_label">娴佺▼缂栧彿锛�</div> + <div class="search_input"> + <el-input v-model="search.processNumber" clearable placeholder="璇疯緭鍏�" size="small" style="width: 100%" + @keyup.enter.native="getDeviceStatePage(clickNodeVal.value)"></el-input> + </div> + </div> + <div class="search_thing" style="padding-left: 20px;"> + <el-button size="small" @click="resetSearch">閲� 缃�</el-button> + <el-button size="small" type="primary" @click="getDeviceStatePage(clickNodeVal.value)">鏌� 璇�</el-button> + </div> + </el-col> + <el-col :span="4"> + <div class="btns"> + <el-button size="small" type="primary" @click="dialogVisible = true">鏂板缓</el-button> + <el-button :loading="outLoading" size="small" type="primary" @click="handleDown">瀵煎嚭Excel</el-button> + </div> + </el-col> + </el-row> + </div> + <div> + <el-table :data="tableDatalist" height="calc(100vh - 20em)" style="width: 100% ;"> + <!-- 琛ㄦ牸鍒� --> + <el-table-column align="center" header-align="center" label="搴忓彿" prop="prop" type="index" + width="70"></el-table-column> + <el-table-column label="娴佺▼缂栧彿" min-width="180" prop="processNumber"></el-table-column> + <el-table-column label="璁惧鍚嶇О" min-width="180" prop="deviceName"></el-table-column> + <el-table-column label="绠$悊缂栧彿" min-width="150" prop="managementNumber"></el-table-column> + <el-table-column label="璁惧鐘舵��" min-width="130" prop="deviceStatus"> + <template #default="{ row }"> + {{ row.deviceStatus === '0scrap' ? '鎶ュ簾' : row.deviceStatus === '1startUsing' ? '鍚敤' : '鍋滅敤' }} + </template> + </el-table-column> + <el-table-column label="鍋滅敤/鍚敤鐞嗙敱" min-width="180" prop="reason"></el-table-column> + <el-table-column label="鎻愪氦浜�" min-width="130" prop="createUser"></el-table-column> + <el-table-column label="鎻愪氦鏃ユ湡" min-width="150" prop="createTime"></el-table-column> + <el-table-column label="褰撳墠鐘舵��" min-width="130" prop="currentState"></el-table-column> + <el-table-column label="褰撳墠璐d换浜�" min-width="180" prop="currentResponsible"></el-table-column> + <!-- 鎿嶄綔鎸夐挳 --> + <el-table-column fixed="right" label="鎿嶄綔" min-width="150"> + <template #default="{ row }"> + <el-button size="small" type="text" @click="handleViewClick(row)">鏌ョ湅</el-button> + <el-button size="small" type="text" @click="handleDownOne(row)">瀵煎嚭</el-button> + <el-button size="small" type="text" @click="handleDeleteClick(row)">鍒犻櫎</el-button> + </template> + </el-table-column> + </el-table> + <el-pagination :current-page="1" :page-size="search.size" :page-sizes="[10, 20, 30, 50, 100]" + :total="search.total" layout="->,total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange" + @current-change="handleCurrentChange"> + </el-pagination> + </div> + <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="dialogVisible" title="璁惧鎯呭喌" top="5vh" + width="60%" @open="openRecordAcceptance"> + <el-steps :active="currentStep" align-center finish-status="success"> + <el-step v-for="(v, i) in steps" :key="i" :title="v" style="cursor:pointer" + @click.native="choiceStep(i)"></el-step> + </el-steps> + <el-form ref="form" :model="form" :rules="rules" label-width="130px"> + <div v-show="currentStepClick === 0"> + <el-card style="margin-top: 1em; height: 42vh; overflow-y: scroll;"> + <!-- 鍗$墖 --> + <el-row> + <el-col :span="24"> + <el-form-item label="娴佺▼缂栧彿锛�"> + <el-input v-model="form.processNumber" disabled size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="绠$悊缂栧彿锛�"> + <el-input v-model="form.managementNumber" disabled size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="璁惧鍚嶇О锛�"> + <el-input v-model="form.deviceName" disabled size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="瑙勬牸鍨嬪彿锛�"> + <el-input v-model="form.specificationModel" disabled size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item :rules="[{ required: currentStep === 0, message: '璇疯緭鍏ラ厤浠�', trigger: 'blur' }]" label="閰嶄欢锛�" + prop="accessoryPart"> + <el-input v-model="form.accessoryPart" :disabled="currentStep !== 0" size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item :rules="[{ required: currentStep === 0, message: '璇烽�夋嫨璁惧鐘舵��', trigger: 'change' }]" label="璁惧鎯呭喌锛�" + prop="deviceStatus"> + <el-select v-model="form.deviceStatus" :disabled="currentStep !== 0" placeholder="璇烽�夋嫨" size="small" + style="width:100%"> + <el-option label="鎶ュ簾" value="0scrap"></el-option> + <el-option label="鍚敤" value="1startUsing"></el-option> + <el-option label="鍋滅敤" value="2stopUsing"></el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item :rules="[{ required: currentStep === 0, message: '璇疯緭鍏ュ仠鐢ㄥ惎鐢ㄧ悊鐢�', trigger: 'blur' }]" label="鍋滅敤鍚敤鐞嗙敱锛�" + prop="reason"> + <el-input v-model="form.reason" :disabled="currentStep !== 0" :rows="3" size="small" + type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item :rules="[{ required: currentStep === 0, message: '璇烽�夋嫨涓嬬幆鑺傝矗浠讳汉', trigger: 'change' }]" label="涓嬬幆鑺傝矗浠讳汉锛�" + prop="submitNextPesponsible"> + <el-select v-model="form.submitNextPesponsible" :disabled="currentStep !== 0" clearable filterable + placeholder="璇烽�夋嫨涓嬬幆鑺傝礋璐d汉" size="small" style="width: 100%"> + <el-option v-for="item in responsibleOptions" :key="item.id" :label="item.name" :value="item.name"> + </el-option> + </el-select> + </el-form-item> + </el-col> + </el-row> + </el-card> + <el-row style="margin-top: 1em;"> + <el-col :span="4"> + 鎿嶄綔浜猴細{{ form.submitOperatingPersonnel }} + </el-col> + <el-col :span="6"> + 鏃ユ湡锛歿{ form.submitDate }} + </el-col> + </el-row> + </div> + <div v-show="currentStepClick === 1"> + <el-card style="margin-top: 1em; height: 42vh; overflow-y: scroll;"> + <el-row> + <el-col :span="24"> + <el-form-item label="閮ㄩ棬璐熻矗浜烘剰瑙侊細" prop="departmentReviewOpinion"> + <el-input v-model="form.departmentReviewOpinion" :disabled="currentStep !== 1" size="small" + type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item :rules="[{ required: currentStep === 1, message: '璇疯緭鍏ヤ笅鐜妭璐d换浜�', trigger: 'change' }]" label="涓嬬幆鑺傝矗浠讳汉锛�" + prop="departmentNextPesponsible"> + <el-select v-model="form.departmentNextPesponsible" :disabled="currentStep !== 1" clearable filterable + placeholder="璇烽�夋嫨涓嬬幆鑺傝礋璐d汉" size="small" style="width: 100%;"> + <el-option v-for="item in responsibleOptions" :key="item.id" :label="item.name" :value="item.name"> + </el-option> + </el-select> + </el-form-item> + </el-col> + </el-row> + </el-card> + <el-row style="margin-top: 1em;"> + <el-col :span="4"> + 鎿嶄綔浜猴細{{ form.departmentOperatingPersonnel }} + </el-col> + <el-col :span="6"> + 鏃ユ湡锛歿{ form.departmentDate }} + </el-col> + </el-row> + </div> + <div v-show="currentStepClick === 2"> + <el-card style="margin-top: 1em; height: 42vh; overflow-y: scroll;"> + <el-row> + <el-col :span="24"> + <el-form-item :rules="[{ required: currentStep === 2, message: '璇疯緭鍏ヨ閲忓鎰忚', trigger: 'blur' }]" label="璁¢噺瀹ゆ剰瑙侊細" + prop="measuringRoomReviewOpinion"> + <el-input v-model="form.measuringRoomReviewOpinion" :disabled="currentStep !== 2" size="small" + type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item :rules="[{ required: currentStep === 2, message: '璇疯緭鍏ヤ笅鐜妭璐d换浜�', trigger: 'blur' }]" label="涓嬬幆鑺傝矗浠讳汉锛�" + prop="measuringRoomNextPesponsible"> + <el-select v-model="form.measuringRoomNextPesponsible" :disabled="currentStep !== 2" clearable filterable + placeholder="璇烽�夋嫨涓嬬幆鑺傝礋璐d汉" size="small" style="width: 100%;"> + <el-option v-for="item in responsibleOptions" :key="item.id" :label="item.name" :value="item.name"> + </el-option> + </el-select> + </el-form-item> + </el-col> + </el-row> + </el-card> + <el-row style="margin-top: 1em;"> + <el-col :span="4"> + 鎿嶄綔浜猴細{{ form.measuringRoomOperatingPersonnel }} + </el-col> + <el-col :span="6"> + 鏃ユ湡锛歿{ form.measuringRoomDate }} + </el-col> + </el-row> + </div> + <div v-show="currentStepClick === 3"> + <el-card style="margin-top: 1em; height: 42vh; overflow-y: scroll;"> + <el-row> + <el-col :span="24"> + <el-form-item :rules="[{ required: currentStep === 3, message: '璇疯緭鍏ユ壒鍑嗘剰瑙�', trigger: 'blur' }]" label="鎵瑰噯鎰忚锛�" + prop="approvalOpinion"> + <el-input v-model="form.approvalOpinion" :disabled="currentStep !== 3" size="small" + type="textarea"></el-input> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item :rules="[{ required: currentStep === 3, message: '璇疯緭鍏ヤ笅鐜妭璐熻矗浜�', trigger: 'change' }]" label="涓嬬幆鑺傝矗浠讳汉锛�" + prop="approvalNextPesponsible"> + <el-select v-model="form.approvalNextPesponsible" :disabled="currentStep !== 3" clearable + filterable placeholder="璇烽�夋嫨涓嬬幆鑺傝礋璐d汉" size="small" style="width: 100%;"> + <el-option v-for="item in responsibleOptions" :key="item.id" :label="item.name" :value="item.name"> + </el-option> + </el-select> + </el-form-item> + </el-col> + </el-row> + </el-card> + <el-row style="margin-top: 1em;"> + <el-col :span="4"> + 鎿嶄綔浜猴細{{ form.approvalOperatingPersonnel }} + </el-col> + <el-col :span="6"> + 鏃ユ湡锛歿{ form.approvalDate }} + </el-col> + </el-row> + </div> + </el-form> + <span slot="footer" class="dialog-footer"> + <el-button v-if="currentStep !== 0 && currentStep !== 4" :loading="sumbitLoading1" + @click="submitForm('3reject')">椹冲洖</el-button> + <el-button v-if="currentStep === 0" :loading="sumbitLoading2" @click="submitForm('2save')">淇濆瓨</el-button> + <el-button v-if="currentStep !== 4" :loading="sumbitLoading3" type="primary" @click="submitForm('1submit')"> + {{ currentStep === 0 ? '鎻愪氦' : '閫氳繃' }} + </el-button> + </span> + </el-dialog> + </div> </template> - <script> +import { dateFormat } from '../../../util/date' export default { + props: { + clickNodeVal: { + type: Object, + default: () => { + return {}; + } + } + }, + data() { + return { + outLoading: false, // 瀵煎嚭loading + dialogVisible: false, + form: {}, + currentStep: 0, // 姝ラ鏉℃樉绀虹鍑犳 + currentStepClick: 0, // 鐐瑰嚮姝ラ鏉″彉鍖� + steps: ['鎻愪氦', '閮ㄩ棬璐熻矗浜�', '璁¢噺瀹�', '鎵瑰噯浜�'], + responsibleOptions: [], // 涓嬬幆鑺傝礋璐d汉 + tableDatalist: [], // table琛ㄦ牸 + rules: { + quantity: [{ required: true, message: '璇疯緭鍏ユ暟閲�', trigger: 'blur' }], + }, + search: { + size: 20, + current: 1, + total: 0, + processNumber: '' + }, + sumbitLoading1: false, + sumbitLoading2: false, + sumbitLoading3: false, + } + }, + mounted() { + this.getDeviceStatePage(this.clickNodeVal.value) + }, + methods: { + // 鍒嗛〉 + handleSizeChange(val) { + this.search.size = val + this.getDeviceStatePage(this.clickNodeVal.value) + }, + // 鍒嗛〉 + handleCurrentChange(val) { + this.search.current = val + this.getDeviceStatePage(this.clickNodeVal.value) + }, + //鎻愪氦琛ㄥ崟 + async submitForm(saveState) { + let currentStepAction; + // 璁剧疆璇ユ搷浣滃垽鏂槸鍚︿负鎻愪氦锛屼繚瀛橈紝椹冲洖锛岄�氳繃 寮�鍚痩oding + switch (saveState) { + // 鎻愪氦锛岄�氳繃 + case '1submit': + currentStepAction = this.currentStep + 1 + this.sumbitLoading1 = true + break + // 淇濆瓨 + case '2save': + currentStepAction = this.currentStep + this.sumbitLoading2 = true + break + // 椹冲洖 + case '3reject': + currentStepAction = this.currentStep - 1 + this.sumbitLoading3 = true + break + default: + break + } + this.$refs.form.validate((valid) => { + if (valid === true || saveState !== '1submit') { + // 缁欏綋鍓嶇幆鑺傝缃垱寤轰汉涓庢椂闂� + let user = JSON.parse(localStorage.getItem('user')) + const dateTime = dateFormat(new Date()) + // 鑾峰彇褰撳墠鐜妭鎿嶄綔浜轰笌鏃ユ湡 + switch (this.currentStep) { + case 0: + this.form.createUser = user.name + this.form.submitOperatingPersonnel = user.name + this.form.submitDate = dateTime + break + case 1: + this.form.departmentOperatingPersonnel = user.name + this.form.departmentDate = dateTime + break + case 2: + this.form.measuringRoomOperatingPersonnel = user.name + this.form.measuringRoomDate = dateTime + break + case 3: + this.form.approvalOperatingPersonnel = user.name + this.form.approvalDate = dateTime + break + default: + break + } + // 鑾峰彇褰撳墠鐜妭璐熻矗浜� + switch (saveState === '3reject' ? this.currentStep - 1 : this.currentStep) { + case 0: + this.form.currentResponsible = this.form.submitOperatingPersonnel + break + case 1: + this.form.currentResponsible = this.form.departmentOperatingPersonnel + break + case 2: + this.form.currentResponsible = this.form.measuringRoomOperatingPersonnel + break + case 3: + this.form.currentResponsible = this.form.approvalOperatingPersonnel + break + default: + break + } + // 鑾峰彇褰撳墠鐘舵�� + this.form.currentState = currentStepAction === 4 ? '鍏抽棴' : this.steps[currentStepAction] + this.form.deviceId = this.clickNodeVal.value + this.$axios.post(this.$api.deviceCheck.saveDeviceState, this.form, { + headers: { + 'Content-Type': 'application/json' + } + }).then(res => { + if (res.code == 200) { + this.$message.success('鎻愪氦鎴愬姛') + this.getDeviceStatePage(this.clickNodeVal.value) + this.dialogVisible = false + this.closeLoading() + } + this.closeLoading() + }) + } else { + let step = this.steps[this.currentStep] + this.$message.warning(step + ' 娴佺▼涓湁蹇呭~椤规湭濉紒'); + this.closeLoading() + } + }); + }, + closeLoading() { + this.sumbitLoading1 = false + this.sumbitLoading2 = false + this.sumbitLoading3 = false + }, + choiceStep(index) { + this.currentStepClick = index + }, + openRecordAcceptance() { + // 鑾峰彇璁惧鍩虹淇℃伅 + this.$axios.get(this.$api.deviceScope.selectDeviceByCode + '?id=' + this.clickNodeVal.value).then(res => { + this.form.deviceName = res.data.deviceName + this.form.specificationModel = res.data.specificationModel + this.form.managementNumber = res.data.managementNumber + this.$nextTick(() => { + this.$refs['form'].clearValidate() + }) + }); + // 鑾峰彇璐熻矗浜轰俊鎭� + this.getUserList() + }, + // 鑾峰彇璐熻矗浜轰俊鎭帴鍙� + getUserList() { + this.$axios.get(this.$api.deviceScope.selectUserList).then(res => { + if (res.code == 200) { + this.responsibleOptions = res.data + } + }) + }, + // 鏌ョ湅 + handleViewClick(row) { + this.form = { ...row } + // 濡傛灉绱㈠紩涓�6琛ㄧず鍏ㄩ儴閫氳繃 + this.currentStep = this.steps.indexOf(this.form.currentState) === -1 ? 4 : this.steps.indexOf(this.form.currentState) + this.currentStepClick = this.currentStep === 4 ? 0 : this.currentStep + this.$nextTick(() => { + this.$refs['form'].clearValidate() + }) + this.dialogVisible = true + }, + // 瀵煎嚭 + handleDownOne(row) { + this.outLoading = true + this.$axios.get(this.$api.deviceCheck.exportDeviceStatus + '?deviceId=' + row.deviceId + '&processNumber=' + row.processNumber, { + responseType: "blob" + }).then(res => { + this.outLoading = false + const blob = new Blob([res], { type: 'application/octet-stream' }); + //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆 + let reader = new FileReader(); + reader.readAsText(blob, 'utf-8'); + reader.onload = () => { + try { + let result = JSON.parse(reader.result); + if (result.message) { + this.$message.error(result.message); + } else { + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = '璁惧鍋�/鍚敤.doc'; + link.click(); + this.$message.success('瀵煎嚭鎴愬姛') + } + } catch (err) { + console.log(err); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = '璁惧鍋�/鍚敤.doc'; + link.click(); + this.$message.success('瀵煎嚭鎴愬姛') + } + } + }) + }, + // 鍒犻櫎 + handleDeleteClick(row) { + this.$confirm('姝ゆ搷浣滃皢鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + this.$axios.delete(this.$api.deviceCheck.deleteDeviceState + '?stateId=' + row.stateId).then(res => { + if (res.code == 200) { + this.$message.success('鍒犻櫎鎴愬姛') + this.getDeviceStatePage(this.clickNodeVal.value) + } + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, + //瀵煎嚭 + handleDown() { + this.outLoading = true + this.$axios.post(this.$api.deviceCheck.deviceStateExport, { + deviceId: this.clickNodeVal.value, + processNumber: this.search.processNumber + }, {responseType: "blob"}).then(res => { + this.outLoading = false + const blob = new Blob([res], {type: 'application/octet-stream'}); + //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆 + let reader = new FileReader(); + reader.readAsText(blob, 'utf-8'); + reader.onload = () => { + try { + let result = JSON.parse(reader.result); + if (result.message) { + this.$message.error(result.message); + } else { + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = '璁惧鍋滅敤/鍚敤.xlsx'; + link.click(); + this.$message.success('瀵煎嚭鎴愬姛') + } + } catch (err) { + console.log(err); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = '璁惧鍋滅敤/鍚敤.xlsx'; + link.click(); + this.$message.success('瀵煎嚭鎴愬姛') + } + } + }).finally(() => { + this.outLoading = false + }) + }, + resetSearch() { + this.search = { + size: 20, + current: 1, + total: 0, + processNumber: '', + } + this.getDeviceStatePage(this.clickNodeVal.value); + }, + getDeviceStatePage(deviceId) { + this.$axios.get(this.$api.deviceCheck.getDeviceStatePage + '?deviceId=' + deviceId + "&size=" + this.search.size + "¤t=" + this.search.current + "&processNumber=" + this.search.processNumber).then(res => { + if (res.code == 200) { + this.tableDatalist = res.data.records + this.search.total = res.data.total + } + }) + } + }, + watch: { + // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊 + clickNodeVal(newVal) { + if (newVal.value) { + this.componentData.entity.deviceId = this.clickNodeVal.value + this.entityCopy = this.HaveJson(this.componentData.entity) + this.getDeviceStatePage(newVal.value) + } + }, + dialogVisible(newVal) { + if (!newVal) { + this.form = { + } + this.closeLoading() + this.currentStep = 0 // 姝ラ鏉℃樉绀虹鍑犳 + this.currentStepClick = 0 // 鐐瑰嚮姝ラ鏉″彉鍖� + this.$refs['form'].clearValidate() + } + } + }, } </script> <style scoped> +.dialog-content { + max-height: 70vh; + /* 璁剧疆鏈�澶ч珮搴� */ + overflow-y: auto; + /* 鍚敤鍨傜洿婊氬姩 */ +} +h4 { + font-weight: 400; + font-size: 16px; + margin: 10px 0; +} + +/* +淇濆瓨鎻愪氦鎸夐挳鏍峰紡 +*/ +h4 .title { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; +} + +h4 .title .line { + display: inline-block; + width: 3px; + height: 16px; + background: #3A7BFA; + margin-right: 4px; +} + +.tables { + width: 100%; + height: calc(100vh - 15em); +} + +.el-from { + max-width: 400px; + margin: 0 auto; +} + +.form-row { + display: flex; + justify-content: space-between; +} + + +.form-row .el-form-item { + flex: 1; + /* 姣忎釜琛ㄥ崟椤瑰崰鎹浉鍚屾瘮渚嬬殑绌洪棿 */ + margin-right: 100px; + /* 鍙�夛細涓哄彸渚у厓绱犳坊鍔犻棿璺� */ +} + +/* 绉婚櫎鏈�鍚庝竴涓厓绱犵殑鍙宠竟璺� */ +.form-row .el-form-item:last-child { + margin-right: 0; + +} + +.search { + background-color: #fff; + margin: 10px 0; + display: flex; + align-items: center; + position: relative; +} + +.search_thing { + display: flex; + align-items: center; + height: 40px; +} + +.search_label { + width: 70px; + font-size: 14px; + text-align: right; +} + +.search_input { + width: 70%; +} + +.btns { + position: absolute; + right: 0; + top: 50%; + transform: translate(0, -50%); +} + +.form .search_label { + width: 120px; +} </style> -- Gitblit v1.9.3