SubTabGridEdit.vue 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503
  1. <template>
  2. <a-collapse v-model:activeKey="activeKey">
  3. <a-collapse-panel
  4. key="1"
  5. :show-arrow="false"
  6. :header="Language.getNameTrl($i18n.locale, tab)"
  7. >
  8. <div v-if="!collapse">
  9. <div
  10. class="grid-container"
  11. :style="{
  12. 'padding-right': showComplexFilterPanel == true ? '360px' : '0px',
  13. }"
  14. >
  15. <div class="grid-item-row1">
  16. <SimpleFilterPanel
  17. v-model:searchText="searchText"
  18. :disabled="showComplexFilterPanel == true"
  19. :window-no="windowNo"
  20. :tab-index="tabIndex"
  21. :filter-schema="tab.filterSchema"
  22. class="m-row"
  23. @simple-search="simpleSearch"
  24. @show-complex-filter-panel="showComplexFilterPanel = true"
  25. />
  26. </div>
  27. <a-space>
  28. <a-button v-if="canEdit" @click="newModelData">
  29. {{ $t("lang.subTabGridEdit.create") }}
  30. </a-button>
  31. <a-button v-if="canEdit" @click="deleteRecords(true)">
  32. {{ $t("lang.subTabGridEdit.remove") }}
  33. </a-button>
  34. <a-button v-if="canEdit" @click="queryGridData">
  35. {{ $t("lang.subTabGridEdit.revert") }}
  36. </a-button>
  37. <a-button v-if="canEdit" @click="editAllTabData">
  38. {{ $t("lang.subTabGridEdit.editAll") }}
  39. </a-button>
  40. <a-button @click="queryGridData">
  41. {{ $t("lang.subTabGridEdit.refresh") }}
  42. </a-button>
  43. <TabButton
  44. :show-tab-dto="tab"
  45. :model-datas="modelDatas"
  46. :parent-model-data="parentModelData"
  47. :uuid="uuid"
  48. :view-type="'Grid'"
  49. :tab-buttons="tab.tabGridView ? tab.tabGridView.tabButtons : null"
  50. :curd-window-function-access="curdWindowFunctionAccess"
  51. @save-view="$emit('saveView')"
  52. @process-execute-finish="refreshParent"
  53. />
  54. <GridColumnDef
  55. :tab-grid-fields="tabGridFields"
  56. :window-no="windowNo"
  57. :tab-index="tabIndex"
  58. @property-changed="propertyChanged($event)"
  59. />
  60. </a-space>
  61. <div class="grid-item-row3-column1">
  62. <div class="sub-table-container" :style="{ 'height': modelDatas.length > 0 ? '40vh' : '24vh' }">
  63. <div
  64. :id="scrollObject.tableOutDivUuid1"
  65. ref="tableContainer1"
  66. class="col-md-12"
  67. >
  68. <div :id="scrollObject.tableOutDivUuid2" ref="tableContainer2">
  69. <table
  70. class="curd-table table-striped table-bordered float-table"
  71. :width="tableWidth"
  72. >
  73. <thead>
  74. <GridHeader
  75. :is-show-edit="canEdit"
  76. :tab-grid-fields="tabGridFields"
  77. :window-no="windowNo"
  78. :tab-index="tabIndex"
  79. :parent-model-data="parentModelDataClone"
  80. :is-chinese-english="isChineseEnglish"
  81. height="40px"
  82. @on-sort="onSort($event)"
  83. @property-changed="propertyChanged($event)"
  84. @select-all="selectAll($event)"
  85. @multiple-select="changeSelectMode($event)"
  86. />
  87. </thead>
  88. <tfoot>
  89. <GridFooter
  90. v-for="index in [1, 2, 3]"
  91. :key="'footer' + index"
  92. :tab-grid-fields="tabGridFields"
  93. :is-show-edit="canEdit"
  94. height="40px"
  95. />
  96. </tfoot>
  97. <tbody>
  98. <template v-for="(modelData, index) in modelDatas">
  99. <GridBody
  100. v-if="
  101. modelData.deleted != true &&
  102. modelData.visible == true
  103. "
  104. ref="gridBody1"
  105. :key="modelData.id + '_' + index"
  106. :is-show-edit="canEdit"
  107. :serial-number="
  108. index +
  109. 1 +
  110. (pagination.current_page - 1) * pagination.per_page
  111. "
  112. :window-no="windowNo"
  113. :tab-index="tabIndex"
  114. :tab-grid-fields="tabGridFields"
  115. :model-data="modelData"
  116. :parent-model-data="parentModelDataClone"
  117. height="40px"
  118. :class-name="tab.tabDataSource.className"
  119. :scroll-object="scrollObject"
  120. :js-url="jsUrl"
  121. @delete-record="deleteRecord(modelData, true)"
  122. @edit-record="editRecord(modelData, tabGridFields)"
  123. @click-model-data="clickModelData(modelData)"
  124. @value-changed="
  125. valueChanged($event, modelData, index)
  126. "
  127. @execute-callout="
  128. executeCallout($event, modelData, index)
  129. "
  130. />
  131. </template>
  132. </tbody>
  133. </table>
  134. </div>
  135. </div>
  136. </div>
  137. </div>
  138. <div
  139. v-if="tab != null && tab.filterSchema != null"
  140. class="grid-item-row3-column2"
  141. >
  142. <div
  143. class="toggle-filter-btn"
  144. @click="showComplexFilterPanel = !showComplexFilterPanel"
  145. >
  146. <template v-if="showComplexFilterPanel">
  147. <RightOutlined />
  148. </template>
  149. <template v-else>
  150. <LeftOutlined />
  151. </template>
  152. </div>
  153. </div>
  154. <a-drawer
  155. v-model:open="showComplexFilterPanel"
  156. :title="$t('lang.subTabGridEdit.advancedSearch')"
  157. :width="500"
  158. :footer-style="{ textAlign: 'right' }"
  159. :mask="false"
  160. :mask-closable="false"
  161. @close="showComplexFilterPanel = false"
  162. >
  163. <ComplexFilterPanel
  164. ref="complexFilterPanel"
  165. :key="'complex-filter-panel-' + windowNo + '-' + tabIndex"
  166. :window-no="windowNo"
  167. :tab-index="tabIndex"
  168. :filter-schema="tab.filterSchema"
  169. @complex-search="advancedSearchOk"
  170. />
  171. </a-drawer>
  172. <div class="grid-item-row4">
  173. <div style="float: right">
  174. <AntdPagination
  175. ref="paginationRef"
  176. :pagination="pagination"
  177. @get-page-params="getPageParams"
  178. />
  179. </div>
  180. </div>
  181. </div>
  182. <template v-if="tab.subTabs != undefined">
  183. <div
  184. v-for="(subTab, index) in tab.subTabs"
  185. :key="'sub-tab-' + index"
  186. class="row"
  187. >
  188. <div class="col-md-12">
  189. <SubTabGridEdit
  190. :ref="'subTab' + subTab.tabIndex"
  191. :is-show-edit="canEdit"
  192. :tab="subTab"
  193. :parent-model-data="selectModelData"
  194. :parent-tab="tab"
  195. :window-no="windowNo"
  196. :tab-index="subTab.tabIndex"
  197. @save-view="$emit('saveView')"
  198. @save-record-event="saveRecordEvent"
  199. @refresh-parent="refreshParent"
  200. @property-changed="propertyChanged"
  201. />
  202. </div>
  203. </div>
  204. </template>
  205. <Modal
  206. v-model:show="modal"
  207. @ok="saveRecord"
  208. @cancel="discardChildChangedData"
  209. >
  210. <template #header> 请选择 </template>
  211. <div>您修改了子表格的数据,请先‘保存’数据,或者点击‘取消’按钮。</div>
  212. </Modal>
  213. <Modal v-model:show="modal1">
  214. <template #header> 无父页签/父表格的数据 </template>
  215. <div>请先选择父页签/父表格的数据</div>
  216. </Modal>
  217. <Modal v-model:show="modal3">
  218. <template #header> 数据校验失败 </template>
  219. <div>子表格的数据存在必填字段没有填写</div>
  220. </Modal>
  221. </div>
  222. <Modal
  223. v-model:show="modal2"
  224. :large="true"
  225. @ok="showAuditPanel = false"
  226. @cancel="showAuditPanel = false"
  227. >
  228. <template #header>
  229. 记录信息{{ currIndex }}/{{ pagination.total }} - {{ tab.name }}
  230. </template>
  231. <TabAudit
  232. v-if="showAuditPanel"
  233. :tab="tab"
  234. :model-data="auditModelData"
  235. />
  236. </Modal>
  237. <Loading v-if="loading" />
  238. </a-collapse-panel>
  239. </a-collapse>
  240. </template>
  241. <script>
  242. import Common from '../../common/Common.js';
  243. import FieldUtil from '../../resource/dictionary/FieldUtil.js';
  244. import WindowClientUtil from '../../resource/dictionary/WindowClientUtil.js';
  245. import WindowServerUtil from '../../resource/dictionary/WindowServerUtil.js';
  246. import ProcessReportResource from '../../api/dic/ProcessReportResource.js';
  247. import CurdWindowEditResource from '../../api/dic/CurdWindowEditResource.js';
  248. import Context from '../common/Context.js';
  249. import Language from '../../common/Language.js';
  250. import SimpleFilterPanel from '../filter/SimpleFilterPanel.vue';
  251. import GridHeader from '../tabGridView/GridHeader.vue';
  252. import GridBody from '../tabGridView/GridBody.vue';
  253. import GridFooter from '../tabGridView/GridFooter.vue';
  254. import GridColumnDef from '../tabGridView/GridColumnDef.vue';
  255. import GridColumnDefUtil from '../tabGridView/GridColumnDef.js';
  256. import TabButton from '../tabView/TabButton.vue';
  257. import TabAudit from '../tabView/TabAudit.vue';
  258. import ComplexFilterPanel from '../filter/ComplexFilterPanel.vue';
  259. import JsUtil from '../../common/JsUtil.js';
  260. import { Notify, Uuid } from 'pc-component-v3';
  261. import { LeftOutlined, RightOutlined, ExclamationCircleOutlined } from '@ant-design/icons-vue';
  262. import { Modal } from 'ant-design-vue';
  263. import { createVNode } from 'vue';
  264. export default {
  265. name: 'SubTabGridEdit',
  266. components: {
  267. TabButton,
  268. GridHeader,
  269. GridBody,
  270. GridFooter,
  271. GridColumnDef,
  272. TabAudit,
  273. SimpleFilterPanel,
  274. ComplexFilterPanel,
  275. LeftOutlined,
  276. RightOutlined,
  277. ExclamationCircleOutlined,
  278. Modal,
  279. },
  280. props: {
  281. windowNo: {
  282. type: String,
  283. default: null,
  284. },
  285. tabIndex: {
  286. type: Number,
  287. default: null,
  288. },
  289. tab: {
  290. type: Object,
  291. default: function () {
  292. return null;
  293. },
  294. },
  295. parentTab: {
  296. type: Object,
  297. default: function () {
  298. return null;
  299. },
  300. },
  301. parentModelData: {
  302. type: Object,
  303. default: function () {
  304. return null;
  305. },
  306. },
  307. curdWindowFunctionAccess: {
  308. type: Object,
  309. default: function () {
  310. return null;
  311. },
  312. },
  313. isShowEdit: {
  314. type: Boolean,
  315. default: null,
  316. },
  317. jsUrl: {
  318. type: String,
  319. default: null,
  320. },
  321. isChineseEnglish: {
  322. type: Boolean,
  323. default: null,
  324. },
  325. },
  326. emits: [
  327. 'saveView',
  328. 'changeRootParentModelData',
  329. 'saveRecordEvent',
  330. 'propertyChanged',
  331. ],
  332. data: function () {
  333. this.Language = Language;
  334. return {
  335. tabGridFields: WindowClientUtil.getGridField(this.tab), //字段
  336. modelDatas: [],
  337. collapse: false,
  338. pagination: {
  339. total: 0,
  340. per_page: Common.pageSize, // required
  341. current_page: 1, // required
  342. // last_page: 5, // required
  343. },
  344. sortStr: '', // 排序
  345. selectModelData: {}, // 当前选择的ModelData
  346. prepareSelectModelData: {}, // 选中ModelData,未生效前的数据
  347. sortStyle: ' ASC', //排列方式
  348. uuid: Uuid.createUUID(), // 创建UUID
  349. scrollObject: {
  350. // 表格滚动
  351. tableOutDivUuid1: Uuid.createUUID(), // table 的 uuid
  352. tableOutDivUuid2: Uuid.createUUID(), // table 外部 DIV 的 uuid
  353. },
  354. multipleSelect: true,
  355. showAuditPanel: false,
  356. auditModelData: {},
  357. currIndex: 0,
  358. showComplexFilterPanel: false, // 是否显示复杂查询面板
  359. parentModelDataClone: null,
  360. loading: false,
  361. modal: false,
  362. modal1: false,
  363. modal2: false,
  364. modal3: false,
  365. activeKey: ['1'],
  366. searchText: '', // 简单过滤条件
  367. };
  368. },
  369. computed: {
  370. tableWidth: function () {
  371. // 第一列和第二列
  372. var totalWidth = 30 + 95;
  373. if (this.tabGridFields != null && this.tabGridFields.length != 0) {
  374. this.tabGridFields.forEach(function (gridFieldItem) {
  375. // 列显示的时候才计算宽度
  376. if (gridFieldItem.visible) {
  377. totalWidth += Number(gridFieldItem.width);
  378. }
  379. });
  380. }
  381. return totalWidth + 'px';
  382. },
  383. /**
  384. * 表格是否可编辑
  385. * @return
  386. */
  387. canEdit: function () {
  388. if (this.isShowEdit == false) {
  389. return false;
  390. }
  391. if (
  392. this.tab != undefined &&
  393. this.tab.tabDataSource != null &&
  394. this.tab.tabDataSource.readOnly == false
  395. ) {
  396. return true;
  397. }
  398. return false;
  399. },
  400. parentModelDataStringCopy() {
  401. return JSON.stringify(this.parentModelData);
  402. },
  403. },
  404. watch: {
  405. parentModelDataStringCopy: {
  406. handler: function (newValue, oldValue) {
  407. if (newValue != oldValue) {
  408. this.parentModelDataClone = JSON.parse(newValue);
  409. }
  410. },
  411. deep: true,
  412. },
  413. // 监控父页签的数据,如果父页签的数据发生改变,则更新列表
  414. parentModelData: {
  415. handler: function (newValue, oldValue) {
  416. let needQuery = true;
  417. console.log(newValue);
  418. if (newValue != null && newValue.restore == true) {
  419. needQuery = false;
  420. }
  421. if (needQuery) {
  422. this.$nextTick(function () {
  423. this.queryGridData();
  424. });
  425. }
  426. },
  427. immediate: true,
  428. },
  429. showComplexFilterPanel: function (newValue, oldValue) {
  430. localStorage.setItem(
  431. 'showComplexFilterPanel',
  432. newValue ? 'true' : 'false',
  433. );
  434. },
  435. },
  436. mounted: function () {
  437. var _self = this;
  438. console.log('SubTabGridEdit mounted.');
  439. this.tabGridFields = WindowClientUtil.getGridField(this.tab);
  440. GridColumnDefUtil.restoreTabGridFieldDef(
  441. this.windowNo,
  442. this.tabIndex,
  443. this.tabGridFields,
  444. );
  445. _self.showComplexFilterPanel =
  446. localStorage.getItem('showComplexFilterPanel') == 'true';
  447. },
  448. methods: {
  449. getContext: Context,
  450. auditData: function () {
  451. var _self = this;
  452. var selectedDatas = [];
  453. _self.modelDatas.forEach(function (modelData) {
  454. if (modelData.select == true) {
  455. selectedDatas.push(modelData);
  456. }
  457. });
  458. if (selectedDatas.length == 0 || selectedDatas.length > 1) {
  459. Notify.error(
  460. _self.$t('lang.Notify.error'),
  461. _self.$t('lang.subTabGridEdit.describe1'),
  462. true,
  463. );
  464. } else {
  465. _self.auditModelData = selectedDatas[0];
  466. var index = _self.modelDatas.indexOf(_self.auditModelData);
  467. if (index < 0) {
  468. index = 1;
  469. }
  470. _self.currIndex =
  471. (_self.pagination.current_page - 1) * _self.pagination.per_page +
  472. 1 +
  473. index;
  474. _self.showAuditPanel = true;
  475. _self.modal2 = true;
  476. }
  477. },
  478. // 改变多选/单选
  479. changeSelectMode: function (val) {
  480. this.multipleSelect = val;
  481. },
  482. newModelData: function () {
  483. var _self = this;
  484. // 如果 parentModelData 无数据,则不允许新建
  485. if (
  486. this.parentModelData == undefined ||
  487. this.parentModelData.id == undefined
  488. ) {
  489. this.modal1 = true;
  490. } else {
  491. _self.loading = true;
  492. WindowServerUtil.newModelData(
  493. _self.windowNo,
  494. _self.tabIndex,
  495. null,
  496. function (response) {
  497. _self.loading = false;
  498. if (response.errorCode != 0) {
  499. Notify.error('数据新建异常', response.errorMessage, false);
  500. return;
  501. }
  502. let modelData = response.data;
  503. modelData.editMode = true;
  504. modelData.visible = true;
  505. modelData.tabIndex = _self.tabIndex;
  506. modelData.changed = true;
  507. _self.modelDatas[_self.modelDatas.length] = modelData;
  508. },
  509. function () {
  510. _self.loading = false;
  511. },
  512. );
  513. }
  514. },
  515. /**
  516. * 将fieldValue添加到新的modelData中
  517. * @param {Object} fieldName
  518. * @param {Object} fieldValue
  519. */
  520. newModelDataFieldValue: function (fieldName, fieldValue) {
  521. var _self = this;
  522. // 如果 parentModelData 无数据,则不允许新建
  523. if (
  524. this.parentModelData == undefined ||
  525. this.parentModelData.id == undefined
  526. ) {
  527. this.modal1 = true;
  528. } else {
  529. _self.loading = true;
  530. WindowServerUtil.newModelData(
  531. _self.windowNo,
  532. _self.tabIndex,
  533. null,
  534. function (response) {
  535. _self.loading = false;
  536. if (response.errorCode != 0) {
  537. Notify.error('数据新建异常', response.errorMessage, false);
  538. return;
  539. }
  540. let modelData = response.data;
  541. modelData.editMode = true;
  542. modelData.visible = true;
  543. modelData.tabIndex = _self.tabIndex;
  544. modelData.data[fieldName] = fieldValue;
  545. _self.modelDatas[_self.modelDatas.length] = modelData;
  546. },
  547. function () {
  548. _self.loading = false;
  549. },
  550. );
  551. }
  552. },
  553. gridSizeSelect: function (newPageSize) {
  554. this.pagination.per_page = newPageSize;
  555. this.pagination.current_page = 1;
  556. // 刷新界面
  557. // this.queryGridData();
  558. },
  559. // 页数改变
  560. getPageParams: function (page, pageSize) {
  561. this.pagination.current_page = page;
  562. this.pagination.per_page = pageSize;
  563. this.queryGridData();
  564. },
  565. // 改变表格行元素的编辑状态
  566. editRecord: function (modelData, fieldItems) {
  567. if (modelData.visible == null) {
  568. modelData.visible = true;
  569. }
  570. if (modelData.editMode == undefined) {
  571. modelData.editMode = true;
  572. } else {
  573. var flag = true;
  574. if (modelData.editMode == true && fieldItems) {
  575. fieldItems.forEach(function (fieldItem) {
  576. if (fieldItem.mandatory == true) {
  577. if (
  578. FieldUtil.isSelectType(fieldItem) ||
  579. FieldUtil.isSearchType(fieldItem)
  580. ) {
  581. var idValue =
  582. modelData.data == undefined ||
  583. modelData.data[fieldItem.fieldName] == undefined
  584. ? undefined
  585. : modelData.data[fieldItem.fieldName].id;
  586. if (idValue == undefined || idValue == '' || idValue < 1) {
  587. flag = false;
  588. }
  589. } else {
  590. var stringValue =
  591. modelData.data == undefined ||
  592. modelData.data[fieldItem.fieldName] == undefined
  593. ? ''
  594. : modelData.data[fieldItem.fieldName].displayValue[0];
  595. if (stringValue == undefined || stringValue === '') {
  596. flag = false;
  597. }
  598. }
  599. }
  600. });
  601. if (!flag) {
  602. this.modal3 = true;
  603. return;
  604. }
  605. }
  606. modelData.editMode = !modelData.editMode;
  607. }
  608. modelData.changed = true;
  609. var index = this.modelDatas.indexOf(modelData);
  610. if (index != -1) {
  611. this.modelDatas[index] = modelData;
  612. }
  613. },
  614. // 值改变事件
  615. valueChanged: function (event, modelData, index) {
  616. var _self = this;
  617. var gridFieldItem = event.gridFieldItem;
  618. var newFieldValue = event.newFieldValue;
  619. var oldFieldValue = modelData.data[gridFieldItem.fieldName];
  620. if (FieldUtil.isFieldValueEqual(newFieldValue, oldFieldValue) == false) {
  621. modelData.data[gridFieldItem.fieldName] = newFieldValue;
  622. // modelData.data[gridFieldItem.fieldName] = newFieldValue;
  623. if (
  624. gridFieldItem.calloutProcessReportNo != undefined &&
  625. gridFieldItem.calloutProcessReportNo != null
  626. ) {
  627. _self.callout(gridFieldItem.calloutProcessReportNo, modelData, index);
  628. }
  629. if (
  630. gridFieldItem.calloutLogical != undefined &&
  631. gridFieldItem.calloutLogical != null &&
  632. gridFieldItem.calloutLogical != ''
  633. ) {
  634. _self.executeCalloutJs(
  635. gridFieldItem,
  636. gridFieldItem.calloutLogical,
  637. modelData,
  638. );
  639. }
  640. // 遍历所有的字段,判断是否有动态约束
  641. // 如果有关联的动态约束,则清空字段
  642. var fieldName0 = gridFieldItem.fieldName;
  643. _self.tabGridFields.forEach(function (item) {
  644. var fieldName1 = item.fieldName;
  645. var dynamicValidFields = item.dynamicValidFields;
  646. if (
  647. fieldName0 != fieldName1 &&
  648. dynamicValidFields != undefined &&
  649. dynamicValidFields.indexOf(fieldName0) >= 0
  650. ) {
  651. modelData.data[fieldName1].id = undefined;
  652. if (modelData.data[fieldName1].displayValue != undefined) {
  653. modelData.data[fieldName1].displayValue.splice(
  654. 0,
  655. modelData.data[fieldName1].displayValue.length,
  656. );
  657. } else {
  658. modelData.data[fieldName1].displayValue = [];
  659. }
  660. _self.modelDatas[index] = modelData;
  661. }
  662. });
  663. }
  664. },
  665. /**
  666. * 执行JS Callout
  667. */
  668. executeCalloutJs: function (gridFieldItem, scriptText, modelData) {
  669. var _self = this;
  670. let functionName =
  671. gridFieldItem.fieldName.replace('.', '_') + '_calloutjs';
  672. let exeuteFunction = function () {
  673. let actions = {
  674. changeParentModelData: _self.changeParentModelData,
  675. modelDatas: _self.modelDatas,
  676. };
  677. let context = new _self.getContext(modelData, actions);
  678. try {
  679. _self[functionName](context);
  680. } catch (error) {
  681. console.error(error);
  682. Notify.error(
  683. '数据字典定义异常',
  684. '【' +
  685. scriptText +
  686. '】Callout前端逻辑定义异常,请联系管理员检查数据字典的定义。',
  687. false,
  688. );
  689. }
  690. };
  691. if (_self[functionName] == null) {
  692. // 执行服务端的脚本
  693. const jsUrl = _self.jsUrl;
  694. if (jsUrl == null || jsUrl == undefined) {
  695. Notify.error(
  696. '数据字典定义异常',
  697. '【' +
  698. scriptText +
  699. '】Callout前端逻辑的JS文件不存在,请联系管理员检查数据字典是否存在JS文件。',
  700. false,
  701. );
  702. return;
  703. }
  704. let promise = JsUtil.dynamicLoadJsFunction(jsUrl, scriptText);
  705. promise.then(
  706. targetFunction => {
  707. if (targetFunction == null) {
  708. Notify.error(
  709. '数据字典定义异常',
  710. '【' +
  711. scriptText +
  712. '】Callout前端逻辑定义异常,请联系管理员检查数据字典的定义。',
  713. false,
  714. );
  715. return;
  716. }
  717. _self[functionName] = targetFunction;
  718. exeuteFunction();
  719. },
  720. errorData => {
  721. console.error(errorData);
  722. },
  723. );
  724. } else {
  725. exeuteFunction();
  726. }
  727. },
  728. /**
  729. * 修改父页签的数据
  730. */
  731. changeParentModelData: function (fieldName, fieldValue) {
  732. let param = {
  733. fieldName: fieldName,
  734. fieldValue: fieldValue,
  735. };
  736. this.$emit('changeRootParentModelData', param);
  737. },
  738. /**
  739. * callout
  740. * @param {[type]} calloutProcessReportNo [description]
  741. * @return {[type]} [description]
  742. */
  743. callout: function (calloutProcessReportNo, modelData, index, isBtn) {
  744. var _self = this;
  745. if(isBtn) _self.loading = true;
  746. // 查询流程和报表的定义
  747. ProcessReportResource.uniqueByNo(calloutProcessReportNo).then(
  748. response => {
  749. if (response.errorCode != 0) {
  750. Notify.error('流程和报表获取错误', response.errorMessage, true);
  751. return;
  752. }
  753. const successData = response.data;
  754. if (successData == null) {
  755. return;
  756. }
  757. // 执行服务端的脚本
  758. ProcessReportResource.runCallout(
  759. calloutProcessReportNo,
  760. modelData,
  761. ).then(
  762. successData => {
  763. if (successData && successData.modelData) {
  764. var newModelData = successData.modelData;
  765. newModelData.editMode = modelData.editMode;
  766. newModelData.visible = modelData.visible;
  767. _self.modelDatas[index] = newModelData;
  768. }
  769. _self.loading = false;
  770. },
  771. errorData => {
  772. _self.loading = false;
  773. Common.processException(errorData);
  774. },
  775. );
  776. },
  777. errorData => {
  778. _self.loading = false;
  779. Common.processException(errorData);
  780. },
  781. );
  782. },
  783. /**
  784. * 获取子页签所有的数据
  785. */
  786. getAllModelData: function () {
  787. var _self = this;
  788. // 发生改变的modelData
  789. var allModelDatas = [];
  790. this.modelDatas.forEach(function (tempModelData) {
  791. allModelDatas.push(tempModelData);
  792. });
  793. return allModelDatas;
  794. },
  795. // 获取发生改变的数据
  796. getChangedModelData: function () {
  797. var _self = this;
  798. // 发生改变的modelData
  799. var changedModelDatas = [];
  800. this.modelDatas.forEach(function (tempModelData) {
  801. if (tempModelData === _self.selectModelData) {
  802. var subTabChangedData = _self.getSubTabChangedData();
  803. if (subTabChangedData.length > 0) {
  804. tempModelData.changed = true;
  805. tempModelData.saveDatas = subTabChangedData;
  806. } else {
  807. tempModelData.saveDatas = null;
  808. }
  809. }
  810. if (tempModelData.changed == true) {
  811. changedModelDatas.push(tempModelData);
  812. }
  813. });
  814. return changedModelDatas;
  815. },
  816. // 获取子页签发生改变的数据
  817. getSubTabChangedData: function () {
  818. var subTabChangedRecords = [];
  819. if (this.tab.subTabs != undefined) {
  820. for (var index = 0; index < this.tab.subTabs.length; index++) {
  821. var subTabId = 'subTab' + this.tab.subTabs[index].tabIndex;
  822. var modelDatas = this.$refs[subTabId][0].getChangedModelData();
  823. if (modelDatas != undefined && modelDatas.length > 0) {
  824. modelDatas.forEach(function (modelData) {
  825. subTabChangedRecords.push(modelData);
  826. });
  827. }
  828. }
  829. }
  830. return subTabChangedRecords;
  831. },
  832. // 删除数据
  833. deleteRecord: function (modelData, isAlert) {
  834. var _self = this;
  835. var index = this.modelDatas.indexOf(modelData);
  836. if (index == -1) {
  837. return;
  838. }
  839. if (isAlert) {
  840. // 获取数据改动的数量
  841. var changedCount = 0;
  842. for (var i = 0, len = _self.modelDatas.length; i < len; i++) {
  843. if (_self.modelDatas[i].changed == true) {
  844. changedCount++;
  845. }
  846. }
  847. var message = '';
  848. if (changedCount > 0) {
  849. message = _self.$t('lang.subTabGridEdit.describe2', {
  850. changedCount: changedCount,
  851. });
  852. }
  853. message =
  854. message +
  855. _self.$t('lang.subTabGridEdit.someWhatThree');
  856. Modal.confirm({
  857. title: _self.$t('lang.subTabGridEdit.deleteConfirmation'),
  858. icon: createVNode(ExclamationCircleOutlined),
  859. content: message,
  860. okText: _self.$t('lang.subTabGridEdit.determine'),
  861. okType: 'danger',
  862. cancelText: _self.$t('lang.subTabGridEdit.cancel'),
  863. onOk() {
  864. _self.deleteRecord(modelData,false);
  865. },
  866. onCancel() {
  867. console.log('Cancel');
  868. },
  869. });
  870. return;
  871. }
  872. if (modelData.id < 0) {
  873. this.modelDatas.splice(index, 1);
  874. return;
  875. }
  876. modelData.deleted = true;
  877. modelData.changed = true;
  878. },
  879. // 删除选择的数据(多删)
  880. deleteRecords: function (isAlert) {
  881. var _self = this;
  882. // 待删除的数据集合
  883. var dataPrepareDelete = [];
  884. _self.modelDatas.forEach(function (modelData) {
  885. if (modelData.select == true) {
  886. dataPrepareDelete.push(modelData);
  887. }
  888. });
  889. if (dataPrepareDelete.length == 0) {
  890. Notify.error(
  891. _self.$t('lang.subTabGridEdit.noDataSelected'),
  892. _self.$t('lang.subTabGridEdit.describe3'),
  893. false,
  894. );
  895. return;
  896. }
  897. if (isAlert) {
  898. Modal.confirm({
  899. title: _self.$t('lang.subTabGridEdit.deleteConfirmation'),
  900. icon: createVNode(ExclamationCircleOutlined),
  901. content: _self.$t('lang.subTabGridEdit.someWhatOne') +
  902. dataPrepareDelete.length +
  903. _self.$t('lang.subTabGridEdit.someWhatTwo'),
  904. okText: _self.$t('lang.subTabGridEdit.determine'),
  905. okType: 'danger',
  906. cancelText: _self.$t('lang.subTabGridEdit.cancel'),
  907. onOk() {
  908. _self.deleteRecords(false);
  909. },
  910. onCancel() {
  911. console.log('Cancel');
  912. },
  913. });
  914. return;
  915. }
  916. for (var index = 0; index < dataPrepareDelete.length; index++) {
  917. if (dataPrepareDelete[index].id < 0) {
  918. var index1 = _self.modelDatas.indexOf(dataPrepareDelete[index]);
  919. if (index1 >= 0) {
  920. _self.modelDatas.splice(index1, 1);
  921. }
  922. } else {
  923. dataPrepareDelete[index].deleted = true;
  924. dataPrepareDelete[index].changed = true;
  925. }
  926. }
  927. },
  928. /**
  929. * 子页签触发父页签刷新
  930. * @return {[type]} [description]
  931. */
  932. refreshParent: function () {
  933. var _self = this;
  934. // _self.queryGridData();
  935. _self.$emit('processExecuteFinish');
  936. },
  937. // 根据查询参数获取数据模型
  938. queryGridData: function () {
  939. var _self = this;
  940. // 如果没有父页签的数据,则清空界面
  941. if (
  942. _self.parentModelData == undefined ||
  943. _self.parentModelData.id == undefined
  944. ) {
  945. _self.modelDatas.splice(0, _self.modelDatas.length);
  946. _self.selectModelData = {};
  947. return;
  948. }
  949. // 简单过滤条件
  950. // 简单过滤条件
  951. let simpleFilterCondition = null;
  952. let filterParams = null;
  953. if (_self.showComplexFilterPanel == true) {
  954. if (_self.$refs.complexFilterPanel != null) {
  955. filterParams = _self.$refs.complexFilterPanel.getFilterParams();
  956. }
  957. } else {
  958. simpleFilterCondition = _self.searchText;
  959. }
  960. // 首先判断是否有未保存的数据
  961. // 如果有未保存的数据,则不能从服务器上进行查询
  962. for (let row = 0, len = _self.modelDatas.length; row < len; row++) {
  963. let rowData = _self.modelDatas[row];
  964. if (rowData.id < 0 && rowData.deleted != true) {
  965. // 数据未保存,且未删除
  966. let rowDataStr = JSON.stringify(rowData);
  967. if (rowDataStr.indexOf(simpleFilterCondition) >= 0) {
  968. rowData.visible = true;
  969. } else {
  970. rowData.visible = false;
  971. }
  972. }
  973. // 如果表格数据已经保存过了,那么直接移除掉。
  974. if (rowData.id > 0) {
  975. _self.modelDatas.splice(row, 1);
  976. row--;
  977. len--;
  978. }
  979. }
  980. var tabQueryParam = {
  981. range: {
  982. start:
  983. (_self.pagination.current_page - 1) * _self.pagination.per_page,
  984. length: _self.pagination.per_page,
  985. },
  986. windowNo: _self.windowNo,
  987. tabIndex: _self.tabIndex,
  988. parentColumnId:
  989. _self.parentModelData == undefined
  990. ? undefined
  991. : _self.parentModelData.id,
  992. filterParams: filterParams,
  993. simpleFilterCondition: simpleFilterCondition,
  994. sortStr: _self.sortStr,
  995. };
  996. _self.loading = true;
  997. $.ajax({
  998. url: Common.getApiURL('CurdWindowResource/tabData'),
  999. type: 'post',
  1000. contentType: 'application/json',
  1001. data: JSON.stringify(tabQueryParam),
  1002. beforeSend: function (request) {
  1003. Common.addTokenToRequest(request);
  1004. },
  1005. success: function (response) {
  1006. _self.loading = false;
  1007. if (response.errorCode != 0) {
  1008. Notify.error('Error', response.errorMessage, false);
  1009. return;
  1010. }
  1011. const data = response.data;
  1012. var modelDatas = data.dataList;
  1013. WindowClientUtil.setViewDisplayAttribute(
  1014. modelDatas,
  1015. 'editMode',
  1016. false,
  1017. );
  1018. WindowClientUtil.setViewDisplayAttribute(modelDatas, 'select', false);
  1019. WindowClientUtil.setViewDisplayAttribute(modelDatas, 'visible', true);
  1020. //绑定数据模型信息
  1021. //绑定数据模型信息
  1022. modelDatas.forEach(function (modelDataItem) {
  1023. _self.modelDatas.push(modelDataItem);
  1024. });
  1025. _self.pagination.total = data.totalSize;
  1026. // _self.pagination.last_page = Math.ceil(
  1027. // data.totalSize / data.range.length,
  1028. // );
  1029. // 恢复选定的数据
  1030. if (modelDatas == undefined || modelDatas.length == 0) {
  1031. _self.selectModelData = {};
  1032. } else {
  1033. if (
  1034. _self.selectModelData != undefined &&
  1035. _self.selectModelData.id != undefined
  1036. ) {
  1037. var lastSelectedId = _self.selectModelData.id;
  1038. modelDatas.forEach(function (tempData) {
  1039. if (tempData.id == lastSelectedId) {
  1040. _self.selectModelData = tempData;
  1041. _self.selectModelData.select = true;
  1042. }
  1043. });
  1044. }
  1045. }
  1046. },
  1047. error: function (XMLHttpRequest, textStatus, errorThrown) {
  1048. _self.loading = false;
  1049. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  1050. },
  1051. });
  1052. },
  1053. // 点击了ModelData属性
  1054. clickModelData: function (modelData) {
  1055. var _self = this;
  1056. var currentIsSelect = modelData.select;
  1057. if (!_self.multipleSelect) {
  1058. _self.modelDatas.forEach(function (item) {
  1059. item.select = false;
  1060. });
  1061. }
  1062. _self.prepareSelectModelData = modelData;
  1063. _self.prepareSelectModelData.select = currentIsSelect;
  1064. _self.checkChildrenTabIsChanged();
  1065. },
  1066. // 检查子页签数据是否发生改变
  1067. checkChildrenTabIsChanged: function () {
  1068. // 获取子页签的数据
  1069. var changedModelDatas = this.getSubTabChangedData();
  1070. if (changedModelDatas != undefined && changedModelDatas.length > 0) {
  1071. // 弹出对话框,是否保存数据,或者放弃
  1072. // 如果点击保存数据,则触发父页签保存数据
  1073. this.modal = true;
  1074. // 如果点击放弃,则放弃页签改变的数据
  1075. } else {
  1076. // 无改变的数据
  1077. this.discardChildChangedData();
  1078. }
  1079. },
  1080. // 冒泡传递保存事件
  1081. saveRecord: function () {
  1082. this.prepareSelectModelData.changed = true;
  1083. this.prepareSelectModelData = {};
  1084. this.$emit('saveRecordEvent', this.parentModelData);
  1085. },
  1086. onSort: function (gridFieldItem) {
  1087. var _self = this;
  1088. var hasChangedModelData = _self.hasChangedModelData();
  1089. // 存在未保存的数据
  1090. if (hasChangedModelData == true) {
  1091. Notify.error(
  1092. _self.$t('lang.subTabGridEdit.describe4'),
  1093. _self.$t('lang.subTabGridEdit.describe5'),
  1094. false,
  1095. );
  1096. return;
  1097. }
  1098. // add by jack 20241108
  1099. // 如果是操作列不进行排序
  1100. if (gridFieldItem.fieldName == null || gridFieldItem.fieldName == '-') {
  1101. return;
  1102. }
  1103. if (
  1104. gridFieldItem.entityFieldNames != undefined &&
  1105. gridFieldItem.entityFieldNames.length > 0
  1106. ) {
  1107. _self.sortStr =
  1108. gridFieldItem.fieldName +
  1109. '.' +
  1110. gridFieldItem.entityFieldNames[gridFieldItem.entityFieldIndex] +
  1111. _self.sortStyle;
  1112. } else {
  1113. _self.sortStr = gridFieldItem.fieldName + _self.sortStyle;
  1114. }
  1115. _self.queryGridData();
  1116. _self.sortStyle = _self.sortStyle == ' ASC' ? ' DESC' : ' ASC';
  1117. },
  1118. /**
  1119. * 判断是否存在未保存的数据
  1120. * @return {Boolean} [description]
  1121. */
  1122. hasChangedModelData: function () {
  1123. var _self = this;
  1124. // 检查是否存在未保存的数据
  1125. var hasChangedModelData = false;
  1126. for (var i = 0, len = _self.modelDatas.length; i < len; i++) {
  1127. if (_self.modelDatas[i].changed == true) {
  1128. hasChangedModelData = true;
  1129. break;
  1130. }
  1131. if (_self.modelDatas[i].id < 0) {
  1132. hasChangedModelData = true;
  1133. break;
  1134. }
  1135. }
  1136. return hasChangedModelData;
  1137. },
  1138. saveRecordEvent: function (modelData) {
  1139. modelData.changed = true;
  1140. this.$emit('saveRecordEvent', this.parentModelData);
  1141. },
  1142. // 放弃子页签修改的数据
  1143. discardChildChangedData: function () {
  1144. this.prepareSelectModelData.select = !this.prepareSelectModelData.select;
  1145. if (this.prepareSelectModelData.select) {
  1146. this.selectModelData = this.prepareSelectModelData;
  1147. } else {
  1148. this.selectModelData = {};
  1149. }
  1150. this.prepareSelectModelData = {};
  1151. },
  1152. // 显示状态发生改变
  1153. propertyChanged: function (gridFieldItem) {
  1154. GridColumnDefUtil.saveGridFieldDef(
  1155. this.windowNo,
  1156. this.tabIndex,
  1157. gridFieldItem,
  1158. );
  1159. GridColumnDefUtil.restoreTabGridFieldDef(
  1160. this.windowNo,
  1161. this.tabIndex,
  1162. this.tabGridFields,
  1163. );
  1164. this.$emit('propertyChanged', gridFieldItem);
  1165. /* WindowClientUtil.gridFieldItemPropertyChanged(gridFieldItem);
  1166. this.tabGridFields.forEach(function (item) {
  1167. WindowClientUtil.restoreGridFieldItemAttr(item);
  1168. });*/
  1169. },
  1170. performValidate: function () {
  1171. var _self = this;
  1172. var validateResults = [];
  1173. if (this.$refs.gridBody1 != undefined) {
  1174. for (
  1175. var i = 0;
  1176. (i < this.$refs.gridBody1.length) & (i < _self.modelDatas.length);
  1177. i++
  1178. ) {
  1179. if (_self.modelDatas[i].changed == true) {
  1180. var validateResults1 = this.$refs.gridBody1[i].performValidate();
  1181. validateResults = validateResults.concat(validateResults1);
  1182. }
  1183. }
  1184. var validateResults2 = this.getSubTabValidePromise();
  1185. validateResults = validateResults.concat(validateResults2);
  1186. }
  1187. return validateResults;
  1188. },
  1189. // 获取子页签发生改变的数据
  1190. getSubTabValidePromise: function () {
  1191. var validateResults = [];
  1192. if (this.tab.subTabs != undefined) {
  1193. for (var index = 0; index < this.tab.subTabs.length; index++) {
  1194. var subTabId = 'subTab' + this.tab.subTabs[index].tabIndex;
  1195. var validatePromises = this.$refs[subTabId][0].performValidate();
  1196. validateResults = validateResults.concat(validatePromises);
  1197. }
  1198. }
  1199. return validateResults;
  1200. },
  1201. // 添加 modelData
  1202. addModelData: function (modelData) {
  1203. // 如果 parentModelData 无数据,则不允许新建
  1204. this.modelDatas[this.modelDatas.length] = modelData;
  1205. if (modelData.saveDatas != undefined && modelData.saveDatas.length > 0) {
  1206. modelData.saveDatas.forEach(function (saveData) {
  1207. // 恢复子页签的数据
  1208. var subTabId = 'subTab' + saveData.tabIndex;
  1209. this.$refs[subTabId][0].addModelData(saveData);
  1210. });
  1211. }
  1212. },
  1213. /**
  1214. * 替换modeldatas数据
  1215. */
  1216. replaceModelDatas: function (modelDatas) {
  1217. let _self = this;
  1218. this.modelDatas.splice(0, this.modelDatas.length);
  1219. modelDatas.forEach(modelData => {
  1220. _self.addModelData(modelData);
  1221. });
  1222. },
  1223. /**
  1224. * 全选/取消全选
  1225. * @param {Boolean} val 状态
  1226. * @return {void}
  1227. */
  1228. selectAll: function (val) {
  1229. var _self = this;
  1230. if (_self.multipleSelect) {
  1231. _self.modelDatas.forEach(function (item) {
  1232. item.select = val;
  1233. });
  1234. }
  1235. },
  1236. /**
  1237. * 点击编辑全部按钮
  1238. */
  1239. editAllTabData: function () {
  1240. var _self = this;
  1241. _self.modelDatas.forEach(function (item) {
  1242. item.editMode = true;
  1243. item.changed = true;
  1244. item.visible = true;
  1245. });
  1246. },
  1247. /**
  1248. * 简单搜索
  1249. */
  1250. simpleSearch: function (filterParams) {
  1251. var _self = this;
  1252. _self.pagination.current_page = 1;
  1253. _self.queryGridData();
  1254. },
  1255. /**
  1256. * 高级搜索
  1257. */
  1258. advancedSearchOk: function () {
  1259. var _self = this;
  1260. _self.pagination.current_page = 1;
  1261. _self.queryGridData();
  1262. },
  1263. /**
  1264. * 执行Callout
  1265. */
  1266. executeCallout: function (gridFieldItem, modelData, index, isBtn) {
  1267. var _self = this;
  1268. if (gridFieldItem.calloutProcessReportNo != null) {
  1269. _self.callout(gridFieldItem.calloutProcessReportNo, modelData, index, isBtn);
  1270. }
  1271. },
  1272. /**
  1273. * 修改根ModelData的字段数据
  1274. * @param { String } fieldName 字段名称
  1275. * @param { com.leanwo.prodog.restful.base.model.FieldValue } fieldValue 字段的值
  1276. * @author YangZhiJie 20211012
  1277. *
  1278. */
  1279. changeRootParentModelData: function (fieldName, fieldValue) {
  1280. this.$emit('changeRootParentModelData', {
  1281. fieldName: fieldName,
  1282. fieldValue: fieldValue,
  1283. });
  1284. },
  1285. },
  1286. };
  1287. </script>
  1288. <style scoped>
  1289. .fixed-table {
  1290. table-layout: fixed;
  1291. }
  1292. .toolbar-button-group-left {
  1293. float: left;
  1294. }
  1295. .toolbar-button-group-right {
  1296. float: right;
  1297. }
  1298. .table-tr-eidt {
  1299. height: 38px;
  1300. }
  1301. .table-toolbar {
  1302. width: 100%;
  1303. }
  1304. .m-row {
  1305. margin-bottom: 15px;
  1306. }
  1307. .a-audit {
  1308. cursor: pointer;
  1309. }
  1310. th {
  1311. background-color: #f7f7f7;
  1312. }
  1313. .toggle-filter-btn {
  1314. position: relative;
  1315. top: 50%;
  1316. transform: translateY(-50%);
  1317. cursor: pointer;
  1318. user-select: none;
  1319. display: flex;
  1320. align-items: center;
  1321. justify-content: center;
  1322. padding: 8px;
  1323. transition: all 0.3s;
  1324. }
  1325. .toggle-filter-btn:hover {
  1326. color: var(--ant-primary-color);
  1327. background-color: rgba(0, 0, 0, 0.04);
  1328. }
  1329. :deep(.anticon) {
  1330. font-size: 12px;
  1331. }
  1332. </style>
  1333. <style scoped>
  1334. .grid-container {
  1335. margin-top: 10px;
  1336. display: grid;
  1337. grid-template-columns: auto 17px 0px;
  1338. grid-template-rows: 40px 40px auto 40px;
  1339. gap: 5px;
  1340. justify-items: stretch;
  1341. align-items: stretch;
  1342. }
  1343. .grid-item-row1 {
  1344. grid-row-start: 1;
  1345. grid-row-end: 2;
  1346. grid-column-start: 1;
  1347. grid-column-end: 4;
  1348. }
  1349. .grid-item-row2 {
  1350. grid-row-start: 2;
  1351. grid-row-end: 3;
  1352. grid-column-start: 1;
  1353. grid-column-end: 4;
  1354. }
  1355. .grid-item-row3-column1 {
  1356. grid-row-start: 3;
  1357. grid-row-end: 4;
  1358. grid-column-start: 1;
  1359. grid-column-end: 2;
  1360. overflow: auto;
  1361. }
  1362. .grid-item-row3-column2 {
  1363. grid-row-start: 3;
  1364. grid-row-end: 4;
  1365. grid-column-start: 2;
  1366. grid-column-end: 3;
  1367. overflow: hidden;
  1368. border: 1px solid #ddd;
  1369. border-radius: 4px;
  1370. }
  1371. .grid-item-row4 {
  1372. grid-row-start: 4;
  1373. grid-row-end: 5;
  1374. grid-column-start: 1;
  1375. grid-column-end: 4;
  1376. }
  1377. .sub-table-container {
  1378. overflow: auto;
  1379. margin-left: -15px;
  1380. }
  1381. </style>