const SHARE_TO = (() => { const ShareType = { CREATE: 'create', UPDATE: 'update', CANCEL: 'cancel', }; // 当前分享的项目ID let curProjectID; // 当前项目的已分享列表 let curSharedUsers = []; // 清除缓存 function clearCache() { curProjectID = null; curSharedUsers = []; } // 最近联系人显示数量 const rencentCount = 5; // 获取初始数据:1.最近分享人 2.联系人 3.已分享人 async function getInitalData(projectID) { return await ajaxPost('/pm/api/getInitialShareData', { user_id: userID, count: rencentCount, projectID }, false); } // 获取头像视图html function getAvatarHTML(mobile, realName) { // 手机最后一位 const lastMobileNumer = mobile.substr(-1); // 显示名称为真实名称后两位 const nickName = realName.substr(-2); return `${nickName}`; } /** * 获取用户列表视图html:最近分享和联系人用 * @param {Array} users - 排序过的用户数据 * @param {Boolean} showAlphabet - 是否显示字母表分类 * @return {HTMLString} * */ function getUserHTML(users, showAlphabet) { let curLetter = ''; return users.reduce((html, user) => { const mobile = user.mobile || ''; const realName = user.real_name || ''; const company = user.company || ''; if (showAlphabet) { // 名字首个字符对应拼音 const letter = pinyinUtil.getFirstLetter(realName).substr(0, 1); if (letter !== curLetter) { curLetter = letter; html += `
  • ${letter}
  • `; } } const avatarHtml = getAvatarHTML(mobile, realName); return html + `
  • ${avatarHtml}
    ${realName}
    ${mobile}
  • `; }, ''); } // 初始化最近分享视图 function initRecentView(recentUsers) { const recentShareHTML = getUserHTML(recentUsers, false); $('#recent-share').html(recentShareHTML); // 点击最近分享列表自动添加该用户添加到搜索框中 $('#recent-share li').click(function () { const mobile = $(this).find('div span')[0].textContent; $('#share-phone').val(mobile); handleSearch() }) } // 初始化联系人视图 function initContactsView(contacts) { // 联系人按拼英首字母降序排序 contacts.sort((a, b) => { const realNameA = a.real_name || ''; const realNameB = b.real_name || ''; return realNameA.localeCompare(realNameB, 'zh-Hans-CN', { sensitivity: 'accent' }) }); const contactsHTML = getUserHTML(contacts, true); $('#contacts').html(contactsHTML); // 点击联系人自动添加该联系人添加到搜索框中 $('#contacts li:not(.letter)').click(function () { const mobile = $(this).find('div span')[0].textContent; $('#share-phone').val(mobile); $('#contacts-menue').removeClass('show'); handleSearch() }); } // 初始化已分享视图 function initSharedView(sharedUsers) { const html = sharedUsers.reduce((html, user, index) => { const mobile = user.mobile || ''; const realName = user.real_name || ''; const company = user.company || ''; const avatarHTML = getAvatarHTML(mobile, realName); const copyLabelFor = `allowCopy${index}`; const editLabelFor = `allowEdit${index}`; return html + `
  • ${avatarHTML}
    ${realName}
    ${mobile}
    ${company}
  • `; }, ''); $('#shared-list').html(html); // 编辑允许拷贝 $('#shared-list .allow-copy').click(function () { handleCheckBoxClick.call(this); handleShareAction.call(this, ShareType.UPDATE); }); // 编辑允许编辑 $('#shared-list .allow-edit').click(function () { handleCheckBoxClick.call(this); handleShareAction.call(this, ShareType.UPDATE); }); // 取消分享 $('#shared-list .cancel-share').click(function () { handleShareAction.call(this, ShareType.CANCEL); }); } // 初始化搜索结果视图 function initSearchResultView(user) { if (!user) { $('#share-search-result').html('') } else { const mobile = user.mobile || ''; const realName = user.real_name || ''; const company = user.company || ''; const avatarHTML = getAvatarHTML(mobile, realName); const html = `
  • ${avatarHTML}
    ${realName}
    ${mobile}
    ${company}
  • `; $('#share-search-result').html(html); // 允许拷贝 $('#allow-copy').click(function () { handleCheckBoxClick.call(this); }); // 允许编辑 $('#allow-edit').click(function () { handleCheckBoxClick.call(this); }); // 分享给事件 $('#share-to').click(function () { handleShareAction.call(this, ShareType.CREATE, user); }); } } // 复选框框的状态随点击更改,不处理的话input的checked并不会自动处理 function handleCheckBoxClick() { const curChecked = !$(this).attr('checked'); if (curChecked) { $(this).attr('checked', 'checked'); } else { $(this).removeAttr('checked'); } } // 添加分享、编辑分享、取消分享的动作 async function handleShareAction(shareType, user) { try { $.bootstrapLoading.start(); const receiver = $(this).data('user'); let shareData; let type = ShareType.UPDATE; if (shareType === ShareType.CREATE) { const allowCopy = !!$('#allow-copy').attr('checked'); const allowCooperate = !!$('#allow-edit').attr('checked'); shareData = [{ userID: receiver, allowCopy, allowCooperate }]; type = ShareType.CREATE; // 上传的服务器的type,删除跟更新是一样的 } else if (shareType === ShareType.UPDATE) { const allowCopy = !!$(`[data-user=${receiver}].allow-copy`).attr('checked'); const allowCooperate = !!$(`[data-user=${receiver}].allow-edit`).attr('checked'); shareData = [{ userID: receiver, allowCopy, allowCooperate }]; } else { shareData = [{ userID: receiver, isCancel: true }]; } const postData = { user_id: userID, type, projectID: curProjectID, count: rencentCount, shareData }; const rst = await ajaxPost('/pm/api/share', postData); // 请求成功后刷新视图 if (shareType === ShareType.CREATE || shareType === ShareType.CANCEL) { if (shareType === ShareType.CREATE) { user.allowCopy = shareData[0].allowCopy; user.allowCooperate = shareData[0].allowCooperate; curSharedUsers.unshift(user); $('#share-phone').val(''); initSearchResultView(); } else { curSharedUsers = curSharedUsers.filter(user => user._id !== receiver); } if (Array.isArray(rst.recentUsers)) { initRecentView(rst.recentUsers); } if (Array.isArray(rst.contacts)) { initContactsView(rst.contacts) } initSharedView(curSharedUsers); refreshShareTip(curSharedUsers); refreshTreeView(); } } catch (err) { console.log(err); alert(`${String(err)} 请重试。`); initSharedView(curSharedUsers); } finally { $.bootstrapLoading.end(); } } // 刷新项目管理树视图 // 如果是在项目管理页面,需要刷新树(分享图标可能需要清除) function refreshTreeView() { if (typeof projTreeObj !== 'undefined' && projTreeObj.tree.selected) { projTreeObj.tree.selected.data.shareInfo = curSharedUsers; const sheet = projTreeObj.workBook.getSheet(0); projTreeObj.renderSheetFuc(sheet, function () { sheet.invalidateLayout(); sheet.repaint(); }); } } // 刷新造价书的分享按钮tooltip提示 function refreshShareTip(sharedUsers) { const $shareTip = $('#share-tip'); if (!$shareTip) { return; } const limit = 2; const count = sharedUsers.length; const users = sharedUsers.slice(0, 2); const tip = users.reduce((acc, user, index) => { if (index === 0) { acc += '已分享给'; acc += user.real_name; } else { acc += ` ${user.real_name}`; } if (index === users.length - 1 && count > limit) { acc += `等${count}人`; } return acc; }, ''); $shareTip.attr('data-original-title', tip); } // 初始化分享给的页面 async function initModal(projectID) { try { curProjectID = projectID; $.bootstrapLoading.start(); // 恢复 $('#share-phone').val(''); initSearchResultView(); $('#share-hint').text(''); const { isFree, sharedUsers, recentUsers, contacts } = await getInitalData(projectID); if (isFree) { hintBox.versionBox('此功能仅在专业版中提供,免费公用版可选择单个分段进行分享。'); } else { curSharedUsers = sharedUsers; initSharedView(sharedUsers); initRecentView(recentUsers); initContactsView(contacts); setTimeout(() => $('#share-phone').focus(), 200); $('#share').modal('show'); } } catch (err) { console.log(err); alert(err); } finally { $.bootstrapLoading.end(); } } // 退出分享给页面 function exitModal() { clearCache(); } // 分享给 async function handleSearch() { let phone = $('#share-phone').val(); phone = phone && phone.trim() || ''; //$('#share-hint').text(''); initSearchResultView(); if (!phone) { $('#share-hint').text('请输入手机号码。'); return; } // 根据手机号获取用户 const user = await ajaxPost('/user/getUserByMobile', { mobile: phone }); if (!user) { $('#share-hint').text('账号不存在。'); return; } if (user._id === userID) { $('#share-hint').text('不可分享给自己。'); return; } const matched = curSharedUsers.find(item => item._id === user._id); if (matched) { $('#share-hint').text('已与该用户分享。'); return; } $('#share-hint').text(''); initSearchResultView(user); } // 一些事件的监听 function handleEventListener() { // 界面消失 $('#share').on('hide.bs.modal', function () { exitModal(); }); // 联系人下拉 $('#contacts-dropdown').click(function () { const $subMenu = $('#contacts-menue'); const visible = $subMenu.is(':visible'); if (visible) { $subMenu.removeClass('show'); } else { $subMenu.addClass('show'); } }); // 点击body时,联系人菜单的处理 $('body').click(function (e) { const body = $(this)[0]; const $contactsMenu = $('#contacts-menue'); const contactsMenu = $contactsMenu[0]; const dropdownButton = $('#contacts-dropdown')[0] if (!$contactsMenu.is(':visible')) { return; } let target = e.target; while (target !== body) { if ([contactsMenu, dropdownButton].includes(target)) { return; } target = target.parentElement; } $(contactsMenu.parentElement).removeClass('show'); $contactsMenu.removeClass('show'); }); // 输入手机号查找要分享给的用户 let keyupTime = 0; let delayTime = 500; function delayKeyup(callback) { const nowTime = Date.now(); keyupTime = nowTime; setTimeout(function () { if (nowTime - keyupTime == 0) { callback(); } }, delayTime); } $('#share-phone').on('keyup', function () { delayKeyup(function () { handleSearch(); }); }); $('#sharePhone').on('keypress', function (e) { if (e.keyCode === 13) { $(this).blur(); } }); } return { initModal, handleEventListener, getAvatarHTML, } })();