UNPKG

@cainiaofe/cn-ui-m

Version:
183 lines (182 loc) 9.2 kB
import { __assign, __awaiter, __generator, __rest } from "tslib"; import $i18n from "../../locales/i18n"; import * as React from 'react'; import { useCallback, useEffect } from 'react'; import { CnSelect } from "../cn-select"; import { formatResponse, processDataSource, search } from './service'; import CnEmployeeItem from './employee-item'; import { useSetState, useUpdateEffect, useDeepCompareEffect } from 'ahooks'; import { isFunction, isPlainObject } from 'lodash'; import classNames from 'classnames'; import { getFormattedValue, getRenderEmployee, transformToEmployeeMap, } from './util'; export var CnEmployeeSelect = function (props) { var _a = props.mokelay, mokelay = _a === void 0 ? true : _a, host = props.host, path = props.path, serviceType = props.serviceType, propDataSource = props.dataSource, typeList = props.typeList, isOnJob = props.isOnJob, isPreview = props.isPreview, readOnly = props.readOnly, _b = props.prefix, prefix = _b === void 0 ? 'cn-ui-m-' : _b, service = props.service, onChange = props.onChange, valuePaddingZero = props.valuePaddingZero, _value = props.value, defaultAvatarImgUrl = props.defaultAvatarImgUrl, showDepartTag = props.showDepartTag, others = __rest(props, ["mokelay", "host", "path", "serviceType", "dataSource", "typeList", "isOnJob", "isPreview", "readOnly", "prefix", "service", "onChange", "valuePaddingZero", "value", "defaultAvatarImgUrl", "showDepartTag"]); var _c = useSetState({ dataSource: [], searchDataSource: null, selectedEmployeeMap: {}, }), employeeData = _c[0], setEmployeeData = _c[1]; var timer = React.useRef(); var serviceRef = React.useRef(service); var clsPrefix = "".concat(prefix, "employee-select"); var formattedValue = getFormattedValue(_value, valuePaddingZero, props.useDetailValue); var searchKeys = (formattedValue || []) .map(function (i) { if (isPlainObject(i)) { return i.value || i.workNo; } return i; }) .join(','); useUpdateEffect(function () { serviceRef.current = service; }, [service]); // value变化时查询具体员工信息 useDeepCompareEffect(function () { var fetchInitData = function () { return __awaiter(void 0, void 0, void 0, function () { var result; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, search({ value: searchKeys, mokelay: mokelay, host: host, path: path, serviceType: serviceType, typeList: typeList, isOnJob: isOnJob, fromType: 'staffId', })]; case 1: result = _a.sent(); setEmployeeData({ dataSource: result, selectedEmployeeMap: transformToEmployeeMap(result), }); return [2 /*return*/]; } }); }); }; if (!formattedValue || !serviceType || propDataSource) return; fetchInitData(); }, [ searchKeys, host, mokelay, path, serviceType, typeList, isOnJob, propDataSource, ]); var clearSearchDataSource = function () { setEmployeeData({ searchDataSource: null }); }; // 搜索逻辑 var handleSearch = useCallback(function (val) { return __awaiter(void 0, void 0, void 0, function () { var temp, result; return __generator(this, function (_a) { switch (_a.label) { case 0: if (!serviceRef.current) return [3 /*break*/, 2]; return [4 /*yield*/, serviceRef.current(val, 'keywords')]; case 1: temp = _a.sent(); result = formatResponse(temp); setEmployeeData({ searchDataSource: result, }); return [2 /*return*/]; case 2: if (!serviceType || propDataSource) { return [2 /*return*/]; } if (!val) { setEmployeeData({ searchDataSource: [], }); return [2 /*return*/]; } clearTimeout(timer.current); timer.current = setTimeout(function () { return __awaiter(void 0, void 0, void 0, function () { var result; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, search({ value: val, mokelay: mokelay, host: host, path: path, serviceType: serviceType, typeList: typeList, isOnJob: isOnJob, fromType: 'keywords', })]; case 1: result = _a.sent(); setEmployeeData({ searchDataSource: result, }); return [2 /*return*/]; } }); }); }, 300); return [2 /*return*/]; } }); }); }, [host, mokelay, serviceType, path, typeList, isOnJob, propDataSource]); // 当传入外部数据源时,自动格式化并赋值到组件 useEffect(function () { if (!Array.isArray(propDataSource)) return; var processedDataSource = processDataSource(propDataSource); setEmployeeData({ dataSource: processedDataSource, }); }, [propDataSource]); return (React.createElement(CnSelect, __assign({ notFoundContent: $i18n.get({ id: 'NoDataOfRelevantPersonnelNotFoun_1386819588', dm: '暂无未找到相关人员数据', }), placeholder: $i18n.get({ id: 'PleaseEnterEmployeeIdOrNickname', dm: '请输入工号或花名', }), onSearch: handleSearch, renderSelection: function (opts) { return opts .map(function (i) { // 兼容传入工号数组的场景,此时需要从employeeMap中获取员工信息 var employeeId = isPlainObject(i) ? i === null || i === void 0 ? void 0 : i.value : i; var employee = employeeData.selectedEmployeeMap["".concat(employeeId)]; return getRenderEmployee(employee || i); }) .filter(function (item) { return item; }) .join(','); }, renderPreview: function (values) { var list = values; if (props.mode === 'single') { if (!Array.isArray(values)) { list = [values]; } } return (React.createElement("div", { className: classNames(CN_UI_HASH_CLASS_NAME, "".concat(clsPrefix, "-readonly")) }, processDataSource(list).map(function (item) { return (React.createElement(CnEmployeeItem, { defaultAvatarImgUrl: defaultAvatarImgUrl, data: item, showDepartTag: showDepartTag, mini: true })); }))); }, isPreview: readOnly || isPreview, filterLocal: false, showSearch: true, dataSource: (employeeData === null || employeeData === void 0 ? void 0 : employeeData.searchDataSource) || (employeeData === null || employeeData === void 0 ? void 0 : employeeData.dataSource), renderItem: function (item) { return (React.createElement(CnEmployeeItem, { defaultAvatarImgUrl: defaultAvatarImgUrl, data: item })); }, onCancel: clearSearchDataSource, onChange: function (value, actionType, items) { var _a; clearSearchDataSource(); if (!isFunction(onChange)) return; if (props.useDetailValue) { var valueItem = ((_a = employeeData === null || employeeData === void 0 ? void 0 : employeeData.dataSource) === null || _a === void 0 ? void 0 : _a.find(function (i) { return i.value === value.value; })) || value; onChange(valueItem, actionType, items); } else { onChange(value, actionType, items); } } }, (formattedValue ? { value: formattedValue } : {}), others))); }; CnEmployeeSelect.defaultProps = { mokelay: true, typeList: ['REGULAR', 'OUTSOURCING'], isOnJob: true, valuePaddingZero: true, };