ny
昨天 282fbc6488f4e8ceb5fda759f963ee88fbf7b999
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<script lang="ts" setup>
import type { ScrollActionType } from '@jnpf/ui';
 
import { nextTick, reactive, ref, toRefs } from 'vue';
 
import { useGlobSetting, useMessage } from '@jnpf/hooks';
import { ScrollContainer } from '@jnpf/ui';
import { BasicModal, useModalInner } from '@jnpf/ui/modal';
 
import { getFreeApproverUserList, reduceApprover } from '#/api/workFlow/task';
import { $t } from '#/locales';
 
interface State {
  list: any[];
  listQuery: any;
  loading: boolean;
  finish: boolean;
  total: number;
}
 
defineEmits(['register']);
 
const globSetting = useGlobSetting();
const { createMessage } = useMessage();
const apiUrl = ref(globSetting.apiURL);
const [registerModal] = useModalInner(init);
const infiniteBody = ref<Nullable<ScrollActionType>>(null);
const state = reactive<State>({
  list: [],
  listQuery: {
    organizeId: '',
    currentPage: 1,
    pageSize: 100000,
    sort: 'desc',
    sidx: '',
    keyword: '',
    enabledMark: 1,
  },
  loading: false,
  finish: false,
  total: 0,
});
const { list, listQuery, loading } = toRefs(state);
 
function init(data) {
  state.listQuery.id = data.id;
  state.listQuery.keyword = '';
  state.list = [];
  initData();
  nextTick(() => {
    bindScroll();
  });
}
function initData() {
  state.loading = true;
  getFreeApproverUserList(state.listQuery).then((res) => {
    if (res.data.list.length < state.listQuery.pageSize) {
      state.finish = true;
    }
    state.list = [...state.list, ...res.data.list];
    state.total = res.data.pagination.total;
    state.loading = false;
  });
}
function bindScroll() {
  const bodyRef = infiniteBody.value;
  const vBody = bodyRef?.getScrollWrap();
  vBody?.addEventListener('scroll', () => {
    if (vBody.scrollHeight - vBody.clientHeight - vBody.scrollTop <= 200 && !state.loading && !state.finish) {
      state.listQuery.currentPage += 1;
      initData();
    }
  });
}
function handleSearch() {
  state.list = [];
  state.finish = false;
  state.listQuery.currentPage = 1;
  state.listQuery.pageSize = 20;
  initData();
}
function handleReduceApprover(id, index) {
  const query = { ids: [id] };
  reduceApprover(state.listQuery.id, query).then((res) => {
    createMessage.success(res.msg);
    state.list.splice(index, 1);
  });
}
</script>
<template>
  <BasicModal v-bind="$attrs" @register="registerModal" title="加签人员" :footer="null" class="transfer-modal member-modal">
    <div class="transfer__body">
      <div class="transfer-pane left-pane">
        <div class="transfer-pane__tool">
          <a-input-search :placeholder="$t('common.enterKeyword')" allow-clear v-model:value="listQuery.keyword" @search="handleSearch" />
        </div>
        <div class="transfer-pane__body transfer-pane__body-tab">
          <ScrollContainer v-loading="loading && listQuery.currentPage === 1" ref="infiniteBody">
            <div v-for="(item, index) in list" :key="item.id" class="selected-item selected-item-user">
              <div class="selected-item-main">
                <a-avatar :size="36" :src="apiUrl + item.headIcon" class="selected-item-headIcon" />
                <div class="selected-item-text">
                  <p class="name">{{ item.fullName }}</p>
                  <p class="organize" :title="item.organize">{{ item.organize }}</p>
                </div>
                <i class="icon-ym icon-ym-app-delete px-[5px]" @click.stop="handleReduceApprover(item.id, index)"></i>
              </div>
            </div>
            <jnpf-empty v-if="!list.length" />
          </ScrollContainer>
        </div>
      </div>
    </div>
  </BasicModal>
</template>