index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. <template>
  2. <div class="oa-sys-list-view">
  3. <div class="searchBox">
  4. <div class="form">
  5. <span class="formSpan">项目名称:</span>
  6. <el-input v-model="queryParams.xmmc" placeholder="请输入项目名称" style="width: 210px" />
  7. </div>
  8. <div class="form">
  9. <span class="formSpan">跟踪人员:</span>
  10. <UserOrgTree v-model="queryParams['gzryId']" placeholder="请选择跟踪人员" />
  11. </div>
  12. <div class="form">
  13. <span class="formSpan">年份:</span>
  14. <el-input v-model="queryParams.year" placeholder="请输入年份" />
  15. </div>
  16. <div class="form">
  17. <span class="formSpan">状态:</span>
  18. <el-select v-model="queryParams.zts" multiple collapse-tags placeholder="请选择状态">
  19. <el-option
  20. v-for="(item, index) in getDictOptions(DICT_TYPE.TRACKING_PROJECT_STATE)"
  21. :key="index"
  22. :label="item.label"
  23. :value="item.value"
  24. />
  25. </el-select>
  26. </div>
  27. <div class="form">
  28. <span class="formSpan">区域关联:</span>
  29. <el-select v-model="queryParams.qylevel" placeholder="区域是否关联子级">
  30. <el-option value="1" label="关联子级" />
  31. <el-option value="0" label="不关联子级" />
  32. </el-select>
  33. </div>
  34. <div class="form">
  35. <span class="formSpan">区域:</span>
  36. <DistrictTree
  37. class="form-item-disable-style"
  38. placeholder="请选择区域"
  39. v-model="queryParams.district"
  40. style="width: 100%"
  41. />
  42. </div>
  43. <div class="form">
  44. <span class="formSpan">所属板块:</span>
  45. <el-select v-model="queryParams.ssbk" placeholder="请选择所属板块" clearable>
  46. <el-option
  47. v-for="dict in getDictOptions(DICT_TYPE.PROJECT_SECTOR)"
  48. :key="dict.value"
  49. :label="dict.label"
  50. :value="dict.value"
  51. />
  52. </el-select>
  53. </div>
  54. <div class="from">
  55. <div class="btnBox">
  56. <el-button type="primary" style="background: #3485ff" @click="searchHandle">
  57. <img src="@/assets/imgs/OA/search.png" class="mr-8px" alt="" />
  58. 查询</el-button
  59. >
  60. <el-button type="primary" @click="addOrEditHandle()">
  61. <img src="@/assets/imgs/OA/open.png" class="mr-8px" alt="" />
  62. 新增</el-button
  63. >
  64. </div>
  65. </div>
  66. </div>
  67. <div class="infoBox">
  68. <ul>
  69. <li v-for="(item, index) in infoList" :key="index" class="mr-40px">
  70. <img class="mr-8px" :src="getAssetURL(item.icon)" alt="" />
  71. <p>{{ item.name }}:</p>
  72. <h4 class="font-size-18px">{{ item.num.toFixed(0) }}{{ item.unit }}</h4>
  73. </li>
  74. </ul>
  75. </div>
  76. <div class="tableBox">
  77. <div class="table" ref="tableRef">
  78. <el-table
  79. stripe
  80. :data="tableData"
  81. style="width: 100%; height: 100%"
  82. highlight-current-row
  83. :style="{ height: tableHeight + 'px' }"
  84. :header-cell-style="{
  85. background: '#E5F0FB',
  86. color: '#233755',
  87. height: '50px'
  88. }"
  89. >
  90. <el-table-column label="序号" width="60" align="center">
  91. <template #default="scope">{{ scope.$index + 1 }}</template>
  92. </el-table-column>
  93. <el-table-column prop="zt" label="状态" width="80">
  94. <template #default="scope">
  95. {{ getDictLabel(DICT_TYPE.TRACKING_PROJECT_STATE, scope.row.zt) }}
  96. </template>
  97. </el-table-column>
  98. <el-table-column prop="zt" label="所属板块" width="120">
  99. <template #default="scope">
  100. {{ getDictLabel(DICT_TYPE.PROJECT_SECTOR, scope.row.ssbk) }}
  101. </template>
  102. </el-table-column>
  103. <el-table-column prop="xzqmc" label="区域" width="160">
  104. <template #default="scope">
  105. {{ formatDistrict(scope.row.xzqmc)[0] }}
  106. </template>
  107. </el-table-column>
  108. <el-table-column prop="xzqmc" label="县市区" width="100">
  109. <template #default="scope">
  110. {{ formatDistrict(scope.row.xzqmc)[1] }}
  111. </template>
  112. </el-table-column>
  113. <el-table-column prop="gzry" label="跟踪人员" width="90" />
  114. <el-table-column
  115. prop="jf"
  116. label="甲方单位"
  117. width="300"
  118. :show-overflow-tooltip="true"
  119. sortable
  120. />
  121. <el-table-column label="年份" width="90" align="center" sortable prop="year" />
  122. <el-table-column
  123. :show-overflow-tooltip="true"
  124. prop="xmmc"
  125. label="项目名称"
  126. :min-width="320"
  127. />
  128. <el-table-column prop="sfjc" label="进场" width="80" sortable>
  129. <template #default="scope">
  130. {{ scope.row.sfjc == '0' ? '是' : '否' }}
  131. </template>
  132. </el-table-column>
  133. <el-table-column prop="ygje" label="预算(元)" width="140" align="center" sortable>
  134. <template #default="scope">
  135. {{ (scope.row.ygje ?? 0).toFixed(2) }}
  136. </template>
  137. </el-table-column>
  138. <el-table-column prop="zbje" label="中标额(元)" width="140" align="center" sortable>
  139. <template #default="scope">
  140. {{ (scope.row.zbje ?? 0).toFixed(2) }}
  141. </template>
  142. </el-table-column>
  143. <el-table-column prop="jfks" label="甲方科室" width="180" :show-overflow-tooltip="true" />
  144. <el-table-column
  145. prop="jfdjr"
  146. label="甲方对接人"
  147. width="120"
  148. :show-overflow-tooltip="true"
  149. />
  150. <el-table-column prop="qyzj" label="区域总监" width="90" />
  151. <el-table-column
  152. prop="xmbm"
  153. label="项目归属部门"
  154. width="160"
  155. :show-overflow-tooltip="true"
  156. />
  157. <el-table-column prop="latestModifyTime" label="更新时间" width="180" sortable>
  158. <template #default="scope">
  159. {{ formatDate(scope.row.latestModifyTime) }}
  160. </template>
  161. </el-table-column>
  162. <el-table-column prop="xmjl" label="开关" width="100">
  163. <template #default="scope">
  164. <el-switch
  165. v-model="scope.row.status"
  166. :active-value="0"
  167. @change="switchChange(scope.row)"
  168. :inactive-value="1"
  169. />
  170. </template>
  171. </el-table-column>
  172. <el-table-column label="操作" width="120" fixed="right">
  173. <template #default="scope">
  174. <div style="display: flex">
  175. <div
  176. class="operateBtn"
  177. style="margin-right: 8px"
  178. @click="addOrEditHandle(scope.row)"
  179. >
  180. <span>编辑</span>
  181. </div>
  182. <dialog-confirm
  183. title="删除将无法恢复该条数据,确认删除吗?"
  184. confirmButtonText="确定"
  185. cancelButtonText="取消"
  186. @confirm="deleteHandle(scope.row)"
  187. placement="top-end"
  188. width="360"
  189. >
  190. <template #reference>
  191. <div class="operateBtn" v-hasRole="['projectTrackDel']">
  192. <span>删除</span>
  193. </div>
  194. </template>
  195. </dialog-confirm>
  196. </div>
  197. </template>
  198. </el-table-column>
  199. </el-table>
  200. </div>
  201. <div class="pageBox">
  202. <el-pagination
  203. v-model:current-page="queryParams.pageNo"
  204. :page-size="queryParams.pageSize"
  205. background
  206. layout="sizes, total, prev, pager, next, jumper"
  207. :total="total"
  208. :page-sizes="[15, 20, 30, 40]"
  209. @size-change="handleSizeChange"
  210. @current-change="handleCurrentChange"
  211. />
  212. </div>
  213. </div>
  214. <div class="editorCover" v-if="dialogVisible" :title="dialogTitle" align-center>
  215. <div class="cover-header">
  216. <h2>{{ dialogTitle }}</h2>
  217. </div>
  218. <div class="cover-content">
  219. <el-form
  220. ref="ruleFormRef"
  221. :rules="rules"
  222. :model="formData"
  223. style="width: 100%"
  224. label-width="auto"
  225. class="demo-ruleForm"
  226. status-icon
  227. >
  228. <el-form-item label="项目名称" prop="xmmc">
  229. <el-input v-model="formData.xmmc" />
  230. </el-form-item>
  231. <el-row :gutter="100">
  232. <el-col :span="12">
  233. <el-form-item label="所属板块" prop="ssbk">
  234. <el-select
  235. v-model="formData.ssbk"
  236. placeholder="请选择所属板块"
  237. clearable
  238. style="width: 100%"
  239. >
  240. <el-option
  241. v-for="dict in getDictOptions(DICT_TYPE.PROJECT_SECTOR)"
  242. :key="dict.value"
  243. :label="dict.label"
  244. :value="dict.value"
  245. />
  246. </el-select>
  247. </el-form-item>
  248. </el-col>
  249. <el-col :span="12">
  250. <el-form-item label="所属部门" prop="xmbmId">
  251. <DeptTree
  252. v-model="formData.xmbmId"
  253. @node-click="(item) => treeNodeClick(item, 'xmbm')"
  254. placeholder="请选择部门"
  255. />
  256. </el-form-item>
  257. </el-col>
  258. </el-row>
  259. <el-row :gutter="100">
  260. <el-col :span="12">
  261. <el-form-item label="跟踪人员" prop="gzryId">
  262. <UserOrgTree
  263. v-model="formData.gzryId"
  264. placeholder="请选择跟踪人员"
  265. @node-click="(item) => treeNodeClick(item, 'gzry')"
  266. />
  267. </el-form-item>
  268. </el-col>
  269. <el-col :span="12">
  270. <el-form-item label="区域总监" prop="qyzjId">
  271. <UserOrgTree
  272. v-model="formData.qyzjId"
  273. placeholder="请选择区域总监"
  274. @node-click="(item) => treeNodeClick(item, 'qyzj')"
  275. />
  276. </el-form-item>
  277. </el-col>
  278. </el-row>
  279. <el-row :gutter="100">
  280. <el-col :span="12">
  281. <el-form-item label="甲方单位" prop="jfId">
  282. <TreeSelectV2
  283. :data="contractTree"
  284. :props="{ label: 'name', value: 'id' }"
  285. v-model="formData.jfId"
  286. :filter-method="filterNodeMethod"
  287. @node-click="(item) => treeNodeClick(item, 'jf')"
  288. style="width: 100%"
  289. />
  290. </el-form-item>
  291. </el-col>
  292. <el-col :span="12">
  293. <el-form-item label="甲方科室" prop="jfks">
  294. <el-input v-model="formData.jfks" />
  295. </el-form-item>
  296. </el-col>
  297. </el-row>
  298. <el-row :gutter="100">
  299. <el-col :span="12">
  300. <el-form-item label="甲方对接人" prop="jfdjr">
  301. <el-input v-model="formData.jfdjr" />
  302. </el-form-item>
  303. </el-col>
  304. <el-col :span="12">
  305. <el-form-item label="是否进场" prop="sfjc">
  306. <el-select v-model="formData.sfjc" style="width: 100%">
  307. <el-option label="是" :value="0" />
  308. <el-option label="否" :value="1" />
  309. </el-select>
  310. </el-form-item>
  311. </el-col>
  312. </el-row>
  313. <el-row :gutter="100">
  314. <el-col :span="12">
  315. <el-form-item label="预估金额(元)" prop="ygje">
  316. <el-input v-model="formData.ygje" />
  317. </el-form-item>
  318. </el-col>
  319. <el-col :span="12">
  320. <el-form-item label="中标金额(元)" prop="zbje">
  321. <el-input v-model="formData.zbje" />
  322. </el-form-item>
  323. </el-col>
  324. </el-row>
  325. <el-row :gutter="100">
  326. <el-col :span="12">
  327. <el-form-item label="行政区" prop="xzqdm">
  328. <DistrictTree
  329. class="form-item-disable-style"
  330. placeholder="请选择行政区"
  331. v-model="formData.xzqdm"
  332. @node-click="(item, labels) => treeNodeClick(labels, 'xzqmc')"
  333. style="width: 100%"
  334. />
  335. </el-form-item>
  336. </el-col>
  337. <el-col :span="12">
  338. <el-form-item label="谁可见" prop="visibleUserIds">
  339. <UserOrgTree
  340. v-model="visibleUserIds"
  341. :multiple="true"
  342. placeholder="请选择跟谁可见"
  343. @change="visibleUserChange"
  344. />
  345. </el-form-item>
  346. </el-col>
  347. </el-row>
  348. <el-row :gutter="100">
  349. <el-col :span="12">
  350. <el-form-item label="状态" prop="zt">
  351. <el-select v-model="formData.zt" placeholder="请选择状态" style="width: 100%">
  352. <el-option
  353. v-for="(item, index) in getDictOptions(DICT_TYPE.TRACKING_PROJECT_STATE)"
  354. :key="index"
  355. :label="item.label"
  356. :value="item.value"
  357. />
  358. </el-select>
  359. </el-form-item>
  360. </el-col>
  361. <el-col :span="12">
  362. <el-form-item label="年份" prop="year">
  363. <el-input v-model="formData.year" placeholder="请输入年份" />
  364. </el-form-item>
  365. </el-col>
  366. </el-row>
  367. <el-form-item label="备注" prop="desc">
  368. <el-input v-model="formData.bz" rows="5" type="textarea" />
  369. </el-form-item>
  370. </el-form>
  371. </div>
  372. <div class="cover-footer">
  373. <el-button @click="dialogVisible = false">关闭</el-button>
  374. <el-button type="primary" @click="saveProjectTracking(ruleFormRef)"> 保存 </el-button>
  375. </div>
  376. </div>
  377. </div>
  378. </template>
  379. <script setup lang="ts">
  380. import type { FormInstance, FormRules } from 'element-plus'
  381. import { useQuery } from '@tanstack/vue-query'
  382. import { DICT_TYPE, getDictLabel, getDictOptions } from '@/utils/dict'
  383. import { IFormType, useMixins, infoList } from './common'
  384. import request from '@/config/axios'
  385. import { formatDate } from '@/utils/formatTime'
  386. import { filterNodeMethod } from '@/utils/tree'
  387. import { getAssetURL } from '@/utils/auth'
  388. import TreeSelectV2 from '@/components/TreeSelectV2/index.vue'
  389. import UserOrgTree from '@/views/OaSystem/components/UserOrgTree/index.vue'
  390. import DeptTree from '@/views/OaSystem/components/DeptTree/index.vue'
  391. import DistrictTree from '@/views/OaSystem/components/DistrictTree/index.vue'
  392. import { queryCustomerTree } from '@/service/contract'
  393. defineOptions({ name: 'ProjectTrack' })
  394. /***
  395. * 查询委托方数据
  396. * **/
  397. const { data: contractTree } = useQuery(['contractTree'], async () => await queryCustomerTree(), {
  398. staleTime: Infinity
  399. })
  400. const visibleUserIds = ref<string[]>([])
  401. const tableRef: any = ref(null)
  402. const tableHeight: any = ref(0)
  403. const { queryParams, formData, initFormData } = useMixins()
  404. const handleSizeChange = (size) => {
  405. queryParams.pageNo = 1
  406. queryParams.pageSize = size
  407. queryProjectTrackByPage()
  408. }
  409. const handleCurrentChange = (pageNo: number) => {
  410. queryParams.pageNo = pageNo
  411. queryProjectTrackByPage()
  412. }
  413. const formatDistrict = (xzqmc: string) => {
  414. if (!xzqmc) return ''
  415. const narr: string[] = []
  416. const arrs = xzqmc.split('-')
  417. if (arrs.length === 1) {
  418. narr.push(arrs[0], '省级')
  419. return narr
  420. }
  421. if (arrs.length === 2) {
  422. narr.push(`${arrs[0]}-${arrs[1]}`, '市级')
  423. }
  424. if (arrs.length === 3) {
  425. narr.push(`${arrs[0]}-${arrs[1]}`, arrs[2])
  426. }
  427. return narr
  428. }
  429. const tableData = ref<Array<any>>([])
  430. const total = ref<number>()
  431. const searchHandle: () => void = () => {
  432. queryParams.pageNo = 1
  433. queryProjectTrackingSummary()
  434. queryProjectTrackByPage()
  435. }
  436. const queryProjectTrackByPage = async (): Promise<void> => {
  437. const urlApi = `/projectTracking/page`
  438. const sendData = {
  439. ...queryParams
  440. }
  441. if (queryParams.qylevel == '1' && sendData['district']) {
  442. sendData['district'] = sendData['district'].toString().replaceAll('00', '')
  443. }
  444. const result = await request.get({ url: urlApi, params: sendData }, '/business')
  445. tableData.value = result['list']
  446. total.value = result['total']
  447. }
  448. const queryProjectTrackByDetail = async (id: string): Promise<void> => {
  449. const urlApi = `/projectTracking/getById`
  450. const sendData = {
  451. id
  452. }
  453. return await request.get({ url: urlApi, params: sendData }, '/business')
  454. }
  455. const removeProjectTrackByDetail = async (id: string): Promise<void> => {
  456. const urlApi = `/projectTracking/delete`
  457. const sendData = {
  458. id
  459. }
  460. return await request.get({ url: urlApi, params: sendData }, '/business')
  461. }
  462. queryProjectTrackByPage()
  463. /**
  464. * 项目金额、项目个数汇总
  465. */
  466. const queryProjectTrackingSummary = async (): Promise<void> => {
  467. const urlApi = `/projectTracking/summary`
  468. const sendData = {
  469. ...queryParams
  470. }
  471. if (queryParams.qylevel == '1' && sendData['district']) {
  472. sendData['district'] = sendData['district'].toString().replaceAll('00', '')
  473. }
  474. const result = await request.get({ url: urlApi, params: sendData }, '/business')
  475. const amount = result ? result.amount ?? 0 : 0
  476. const zbAmount = result ? result.zbAmount ?? 0 : 0
  477. infoList[0]['num'] = result ? result.nums ?? 0 : 0
  478. infoList[1]['num'] = amount / 10000
  479. infoList[2]['num'] = result ? result.zbNums ?? 0 : 0
  480. infoList[3]['num'] = zbAmount / 10000
  481. }
  482. queryProjectTrackingSummary()
  483. /**
  484. * 项目跟踪:新增、编辑
  485. */
  486. const dialogTitle = ref<string>('项目跟踪填报')
  487. const dialogVisible = ref<boolean>(false)
  488. const addOrEditHandle = (row?: IFormType) => {
  489. dialogVisible.value = true
  490. if (!row) {
  491. dialogTitle.value = '项目跟踪填报'
  492. initFormData()
  493. visibleUserIds.value = []
  494. } else {
  495. dialogTitle.value = '项目跟踪编辑'
  496. queryProjectTrackByDetail(row['id']).then((result) => {
  497. initFormData(result as any)
  498. visibleUserIds.value = result['visibleUserIds'].split(',')
  499. })
  500. }
  501. }
  502. const deleteHandle = (row) => {
  503. removeProjectTrackByDetail(row['id']).then((result: any) => {
  504. if (result) {
  505. searchHandle()
  506. }
  507. })
  508. }
  509. const treeNodeClick = (item, type: string) => {
  510. if (!item) return
  511. if (type === 'xzqmc') {
  512. formData.value[type] = item.join('-')
  513. return
  514. }
  515. formData.value[type] = item['label'] || item['name']
  516. }
  517. const visibleUserChange = (item) => {
  518. formData.value['visibleUserIds'] = item.join(',')
  519. }
  520. const rules = reactive<FormRules<IFormType>>({
  521. xmmc: [{ required: true, message: '项目名称不能为空', trigger: 'blur' }],
  522. ssbk: [{ required: true, message: '所属板块不能为空', trigger: 'change' }],
  523. xmbmId: [{ required: true, message: '所属部门不能为空', trigger: 'change' }],
  524. gzryId: [{ required: true, message: '跟踪人员不能为空', trigger: 'change' }],
  525. qyzjId: [{ required: true, message: '区域总监不能为空', trigger: 'change' }],
  526. jfId: [{ required: true, message: '甲方单位不能为空', trigger: 'blur' }],
  527. jfks: [{ required: true, message: '甲方科室不能为空', trigger: 'blur' }],
  528. jfdjr: [{ required: true, message: '甲方对接人不能为空', trigger: 'blur' }],
  529. sfjc: [{ required: true, message: '是否进场不能为空', trigger: 'change' }],
  530. ygje: [{ required: true, message: '预估金额不能为空', trigger: 'blur' }],
  531. zbje: [{ required: true, message: '中标金额不能为空', trigger: 'blur' }],
  532. xzqdm: [{ required: true, message: '行政区不能为空', trigger: 'change' }],
  533. visibleUserIds: [{ required: true, message: '谁可见不能为空', trigger: 'change' }],
  534. zt: [{ required: true, message: '状态不能为空', trigger: 'change' }],
  535. year: [{ required: true, message: '年份不能为空', trigger: 'change' }]
  536. })
  537. const ruleFormRef = ref<FormInstance>()
  538. const saveProjectTracking = async (formEl: FormInstance | undefined): Promise<void> => {
  539. if (!formEl) return
  540. await formEl.validate(async (valid, fields) => {
  541. if (valid) {
  542. const urlApi = `/projectTracking/save`
  543. const sendData = {
  544. ...formData.value
  545. }
  546. // sendData['visibleUserIds'] = visibleUserIds.value.join(',')
  547. const result = await request.post({ url: urlApi, data: sendData }, '/business')
  548. if (result) {
  549. searchHandle()
  550. dialogVisible.value = false
  551. }
  552. } else {
  553. console.log('error submit!', fields)
  554. }
  555. })
  556. }
  557. const switchChange = (item) => {
  558. updateStatus({
  559. id: item['id'],
  560. status: item['status']
  561. })
  562. }
  563. const updateStatus = async (data: { id: string; status: string }): Promise<void> => {
  564. const urlApi = `/update-status`
  565. return await request.put({ url: urlApi, data: data }, '/business')
  566. }
  567. onMounted(() => {
  568. tableHeight.value = tableRef.value.clientHeight
  569. })
  570. </script>
  571. <style lang="scss" scoped>
  572. :deep(.el-radio) {
  573. margin-right: 10px;
  574. }
  575. .searchBox {
  576. display: flex;
  577. white-space: nowrap;
  578. .form {
  579. margin-right: 16px !important;
  580. }
  581. .formSpan {
  582. width: auto !important;
  583. }
  584. }
  585. .oa-sys-list-view {
  586. position: relative;
  587. .editorCover {
  588. position: absolute;
  589. left: 0px;
  590. right: 0px;
  591. top: 0px;
  592. bottom: 0px;
  593. z-index: 9;
  594. background: #fff;
  595. display: flex;
  596. flex-direction: column;
  597. border-radius: 20px;
  598. > div {
  599. &.cover-header {
  600. padding: 20px 30px;
  601. }
  602. &.cover-content {
  603. padding: 20px 100px;
  604. flex: 1px;
  605. flex-grow: 1;
  606. overflow: auto;
  607. }
  608. &.cover-footer {
  609. text-align: right;
  610. padding: 40px;
  611. }
  612. }
  613. }
  614. }
  615. .form {
  616. width: 225px !important;
  617. }
  618. </style>