Built files from Bizgaze WebServer
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

chat.template.js 81KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755
  1. var Unibase;
  2. (function (Unibase) {
  3. let Platform;
  4. (function (Platform) {
  5. let Connect;
  6. (function (Connect) {
  7. let Components;
  8. (function (Components) {
  9. class ChatTemplate {
  10. getChatTemplate() {
  11. const isFullScreen = Components.Chat.isFullScreen;
  12. const _template = `<div class="chatapp" id="chatAppWrap">
  13. <div class="chatapp-body h-100 position-relative" id="chatAppBody">
  14. <section class="chats-contacts-wrap chat-flex-column" id="chatsContactsSection">
  15. <div id="chatHeaderNav" class="chat-header-nav d-flex chat-header">
  16. <a href="javascript:;" id="closeChatPanel" class="nav-link px-0 flex-center">
  17. <i class="icon dripicons-chevron-right font-20 text-danger"></i>
  18. </a>
  19. <ul class="nav nav-tabs nav-light nav-line d-flex justify-content-between flex-grow-1 flex-shrink-0 text-center px-1 h-100 chat-header-nav-tabs"
  20. role="tablist" id="chatHeaderNavTabs">
  21. <li class="nav-item chat-tab w-50">
  22. <a onclick="Unibase.Platform.Connect.Components.Chat.Instance().displayRecentChats()"
  23. href="javascript:;" class="nav-link _btncomment active">
  24. <i class="las la-sms font-24"></i><span>Chats</span>
  25. </a>
  26. </li>
  27. <li class="nav-item contact-tab w-50">
  28. <a onclick="Unibase.Platform.Connect.Components.Chat.Instance().Displaycontacts();"
  29. href="javascript:;" class="nav-link _btnDisplayUser">
  30. <i class="las la-address-book font-24"></i><span>Contacts</span>
  31. </a>
  32. </li>
  33. <li class="nav-item w-20 d-none">
  34. <a href="javascript:;"
  35. onclick="Unibase.Platform.Connect.Components.Chat.Instance().makeACall();"
  36. class="nav-link _btnmakeacall"><i class="las la-phone font-24"></i><span>Call</span></a>
  37. </li>
  38. <li class="nav-item d-none">
  39. <a href="javascript:;" class="nav-link" id="drpdwn" data-toggle="dropdown" role="button"
  40. aria-haspopup="false" aria-expanded="false"><i class="fa fa-ellipsis-v"></i></a>
  41. <div class="dropdown-menu dropdown-menu-right font-12" id="drpdownmenu">
  42. <a class="dropdown-item" href="javascript:;"
  43. onclick=" Unibase.Platform.Connect.Components.Chat.Instance().createnewgroup()">
  44. <i class="dropdown-icon zmdi zmdi-accounts-add"></i><span>New group</span></a>
  45. <a class="dropdown-item" href="javascript:;">
  46. <i class="dropdown-icon zmdi zmdi-settings"></i><span>Settings</span></a>
  47. <a class="dropdown-item" href="javascript:;" onclick="_BizgazeNotify_Chats.refreshChat()">
  48. <i class="dropdown-icon zmdi zmdi-refresh-sync"></i><span>Refresh</span></a>
  49. <a class="dropdown-item" href="javascript:;" id="closeChatPanel"
  50. onclick="Unibase.Platform.Connect.Components.Chat.Instance().closechatpanel();">
  51. <i class="dropdown-icon icon dripicons-cross"></i><span>Exit chat</span></a>
  52. </div>
  53. </li>
  54. </ul>
  55. <div class="dropdown chat-header-dropdown flex-center">
  56. <a class="nav-link dropdown-toggle no-caret btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30" href="javascript:;" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  57. <span class="btn-icon-wrap"><i class="icon dripicons-dots-3 rotate-90d font-20 text-dark"></i></span>
  58. </a>
  59. <div class="dropdown-menu">
  60. <a class="dropdown-item p-1 font-14 view-my-profile" href="javascript:;" id="viewMyProfile">My Info</a>
  61. <a class="dropdown-item p-1 font-14 chat-fullscreen-btn d-none ${!isFullScreen ? 'd-md-flex' : ''}" href="javascript:;" id="chatFullScreenBtn" onclick="Unibase.Platform.Connect.Components.Chat.Instance().toggleChatFullScreen();">Fullscreen</a>
  62. </div>
  63. </div>
  64. </div>
  65. <div class="chatapp-users-list chat-flex-column flex-grow-1 overflow-y-auto">
  66. <div class="div-chat-search c-gap-10 pa-10">
  67. <div class="chatapp-search-div flex-grow-1">
  68. <input type="text" id="txtSearchChats" name="txtSearchChats"
  69. class="custom-chat-input chatAppSearch recentchatsearch search-input" placeholder="Search"
  70. onkeyup="Unibase.Platform.Connect.Components.Chat.Instance().searchParticipants('recentchatsearch','recentchats','');">
  71. <i class="fa fa-search chatappSearchIcon search-icon biz-highlight-bg-color"
  72. id="search_contactlist"></i><i id="txt_chats_clearSearch"
  73. class="icon dripicons-cross search-close hidden"></i>
  74. </div>
  75. <a href="javascript:;" class="avatar avatar-sm d-30 newlabel"
  76. onclick="Unibase.Platform.Connect.Components.Chat.Instance().Displaycontacts();"
  77. title="New Chat">
  78. <div class="avatar-text avatar-text-primary rounded-circle"><span class="initial-wrap"><span><i class="las la-edit font-20"></i></span></span></div>
  79. </a>
  80. </div>
  81. <div data-simplebar class="userlist simple-scroll-bar px-10 pb-10 flex-grow-1" id="chatGroupsWrap">
  82. <ul class="list-groupchat list-group list-group-flush"></ul>
  83. </div>
  84. </div>
  85. <div class="div_ContactsList chat-flex-column flex-grow-1 overflow-y-auto hidden">
  86. <div class="div-chat-search c-gap-10 pa-10">
  87. <div class="chatapp-search-div flex-grow-1">
  88. <input id="txtSearchContacts" type="text" name="txtSearchContacts"
  89. class="custom-chat-input pl-25 chatAppSearch search-input" placeholder="Search"
  90. onkeyup="Unibase.Platform.Connect.Components.Chat.Instance().loadContacts(true);">
  91. <i class="fa fa-search chatappSearchIcon biz-highlight-bg-color search-icon"
  92. id="search_contactlist"></i>
  93. <i class="icon dripicons-cross search-close hidden" id="clearContactsSearch"></i>
  94. </div>
  95. <a href="javascript:;" class="avatar avatar-sm d-30 newlabel"
  96. onclick="Unibase.Platform.Connect.Components.Chat.Instance().createnewgroup();"
  97. title="New Group">
  98. <div class="avatar-text avatar-text-primary rounded-circle">
  99. <span class="initial-wrap"><span><i class="las la-users font-24"></i></span></span>
  100. </div>
  101. </a>
  102. </div>
  103. <div data-simplebar class="userlist simple-scroll-bar px-10 pb-10" id="chatContactsWrap">
  104. <ul class="list-group list-chat-contacts list-group-flush">
  105. </ul>
  106. <div class="contacts-morebtn mt-10 text-center">
  107. <a class="btn btn-outline-primary btn-sm load-more-list-btn"
  108. onclick="Unibase.Platform.Connect.Components.Chat.Instance().loadContacts()"><span
  109. class="contacts_more mr-10 d-none">0</span>More</a>
  110. </div>
  111. </div>
  112. </div>
  113. </section>
  114. ${!isFullScreen ? this.getChatMessagesBodyHtml() : ''}
  115. <section class="new-group chat-flex-column hidden" id="newGroupSection">
  116. <div id="createGroupHeader" class="chat-header d-flex align-items-center c-gap-10">
  117. <div class="btn_backChatWindow chatanchorhoverdark">
  118. <a onclick="Unibase.Platform.Connect.Components.Chat.Instance().closechatgroup();"
  119. href="javascript:;"
  120. class="btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30">
  121. <span class="btn-icon-wrap"><i class="text-dark" data-icon="l"></i></span>
  122. </a>
  123. </div>
  124. <div class="div-user-group-Name flex-between-center flex-grow-1 c-gap-10 r-gap-5 mnw-0">
  125. <div class="Profile_name font-weight-500 text-dark font-15 text-truncate">Create New Group</div>
  126. </div>
  127. </div>
  128. <div class="CreateNewChatGroup chat-flex-column flex-grow-1 overflow-y-auto"></div>
  129. </section>
  130. <section class="profiledetails chat-flex-column h-100 hidden" id="profileDetailsSection"></section>
  131. <section class="starredmsgs-section chat-flex-column hidden">
  132. <div id="starMsgHeader">
  133. <div class="d-flex align-items-center c-gap-5" style="height:60px;background-color:rgb(232, 238, 245)">
  134. <a href="javascript:;" class="btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30" id="closestarmsgswindow"><span class="btn-icon-wrap"><i class="text-dark" data-icon="l"></i></span>
  135. </a>
  136. <div class="font-weight-500 text-dark font-15 text-truncate">Stared Messages</div>
  137. </div>
  138. <div class="starredmessages"></div>
  139. </div>
  140. <ul class="staredmsgs-list" style="display:inline-flex;flex-direction:column;margin:10px"></ul>
  141. </section>
  142. <section class="forward-contacts-section chat-flex-column hidden" id="forwardContactsSection"></section>
  143. <section class="message-info chat-flex-column h-100 hidden" id="messageInfoSection"></section>
  144. </div>${isFullScreen ? this.getChatFullScreenHtml() : ''}
  145. <div class="webcam hidden"></div>
  146. <div class="audio_controls hidden" style="position:absolute;top:85%;left:10%;"></div>
  147. </div>`;
  148. return _template;
  149. }
  150. getChatFullScreenHtml() {
  151. return `<div class="chat-convo-section" id="chatConvoSection">
  152. <div class="chat-noconvomsg-wrap flex-grow-1 overflow-y-auto flex-center flex-column r-gap-25 biz-bg-hightlight-color_10 hidden" id="chatNoConvoMsgWrap">
  153. <i class="las la-comments noconvo-icon font-50"></i>
  154. <div class="noconvo-msg-text text-center">
  155. <h5 class="mb-15">No chats found!</h5>
  156. <p class="w-300p">Pick a person from contacts tab and start your conversation.</p>
  157. </div>
  158. </div>
  159. ${!$('#chatConvoBody').length ? this.getChatMessagesBodyHtml() : ''}</div>
  160. <div class="chat-fullscreen-modal-wrap">
  161. <div class="modal fade fullscreen-modal" id="fullScreenModal">
  162. <div class="modal-dialog h-100 modal-dialog-centered mt-0" role="document">
  163. <div class="modal-content" id="fullScreenModalContent"></div>
  164. </div>
  165. </div>
  166. <div class="modal-backdrop fade show hidden position-absolute" id="fullScreenModalBackdrop"></div>
  167. </div>`;
  168. }
  169. getChatMessagesBodyHtml() {
  170. return `<section class="chat-convo-body chat-flex-column hidden" id="chatConvoBody"><input type="hidden" class="prevcontactname">
  171. <div id="chatMsgHeaderWrap" class="chat-header">
  172. <div id="chatMsgHeader" class="h-100"></div>
  173. <div id="selectedMsgsCountHeader" class="h-100 hidden">
  174. <div class="d-flex h-100 align-items-center c-gap-5">
  175. <a href="javascript:;" class="btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30"
  176. id="closeMsgMultiActionBtn">
  177. <span class="btn-icon-wrap"><i class="text-dark" data-icon="l"></i></span>
  178. </a>
  179. <div class="font-weight-500 text-dark font-15 text-truncate d-flex align-items-center c-gap-5"><span class="selected-msgs-count">0</span><span>messages selected</span></div>
  180. </div>
  181. </div>
  182. <div id="starMsgHeader" class="h-100 hidden">
  183. <div class="d-flex h-100 align-items-center c-gap-5">
  184. <a href="javascript:;" class="btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30"
  185. onclick="Unibase.Platform.Connect.Components.Chat.Instance().closeStarMessages();"><span
  186. class="btn-icon-wrap"><i class="text-dark" data-icon="l"></i></span>
  187. </a>
  188. <div class="font-weight-500 text-dark font-15 text-truncate">Stared Messages</div>
  189. </div>
  190. </div>
  191. </div>
  192. <div data-simplebar class="simple-scroll-bar pt-15 flex-grow-1 biz-bg-hightlight-color_5 msg-list-wrap" id="msgList">
  193. <ul class="grpdetails"></ul>
  194. <div class="more_msg d-none"><a href="javascript:;" class="btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30 morediv"
  195. onclick="Unibase.Platform.Connect.Components.Chat.Instance().LoadMessages()" data-moreindex='0' ;
  196. data-isfirst='true'><span class="btn-icon-wrap"><i class="fa fa-angle-double-up font-25"></i></span></a></div>
  197. <ul class="list-unstyled messageslist"></ul>
  198. <div class="mx-2 typing" id="chatTypingMsg"></div>
  199. </div>
  200. <div class="remove_template text-danger text-center font-12 hidden">
  201. <hr style="margin:0px 0px 5px 0px">You can't send messages to this group because you're not a participant of this group
  202. <hr style="margin:5px 0px 0px 0px">
  203. </div>
  204. <div id="chatFooter" class="chat-footer biz-bg-hightlight-color_10">
  205. <div class="chat-emojis hidden" id="chatEmojis"></div>
  206. <ul class="list-group list-group-flush biz-bg-hightlight-color_10 pt-10 px-10 mentionable-contact-list biz-custom-scrollbar hidden"
  207. id="mentionableContactList"></ul>
  208. <div class="div_selected_files hidden c-gap-15"></div>
  209. <div id="quoteMsgWrap" class="quote-msg-wrap biz-bg-hightlight-color_20 hidden"></div>
  210. <div class="d-flex align-items-center c-gap-10 flex-grow-1 msg-input-wrap">
  211. <div class="flex-grow-1 chatapp-search-div">
  212. <textarea type="text" rows="1" id="input_msg_send_chatapp" name="send-msg"
  213. class="input-msg-send custom-chat-input pl-35" placeholder="Type something" /></textarea>
  214. <a href="javascript:;"
  215. class="btn btn-icon btn-rounded btn-soft-primary d-26 search-icon chat-emoji-icon"
  216. id="chatEmojiIcon">
  217. <span class="btn-icon-wrap"><i class="las la-smile font-25"></i></span>
  218. </a>
  219. <div class="hidden div_CLose search-close">
  220. <a href="javascript:;" class="text-danger">
  221. <i class="icon dripicons-cross empty_text"></i>
  222. </a>
  223. </div>
  224. </div>
  225. <div class="record_div ml-6 hidden" style="position: absolute;background-color: #b5c9a6;width: 96%;height: 48px;border-radius: 10px;font-size: 20px;z-index: 1;display: flex;">
  226. <span class="ml-10 ">Recording.......</span>
  227. <span class="" style="width: 30px;">
  228. <ul style="display:flex;">
  229. <li><span id="minutes"></span></li>
  230. <p>:</p>
  231. <li><span id="seconds"></span></li>
  232. </ul>
  233. </span>
  234. <a href="javascript:;" class="btn btn-icon btn-primary btn-rounded d-30 voicemsg-send-btn cursor-pointer mt-10 ml-120">
  235. <span class="btn-icon-wrap"><i class="las la-paper-plane msg-option font-20"></i></span></a>
  236. </div>
  237. <div class="msg-option-container d-flex align-items-center c-gap-15 font-20">
  238. <div class="msg-compose-options align-items-center c-gap-15">
  239. <div class="btn-file msg-option attachments-btn cursor-pointer">
  240. <label class="my-0" for="chat_attachments">
  241. <i class="las la-paperclip font-22 biz-highlight-bg-color"></i></span>
  242. <input type="file" id="chat_attachments" class="fileUpload hidden" multiple="multiple"
  243. onchange="Unibase.Platform.Connect.Components.Chat.Instance().LoadAttachments(this)">
  244. </div>
  245. <div class="div_camera">
  246. <div class="btn-file msg-option">
  247. <a href="javascript:;" class="input_camera"
  248. onclick="Unibase.Platform.Connect.Components.Chat.Instance().webcam();">
  249. <i class="las la-camera biz-highlight-bg-color font-22"></i>
  250. </a>
  251. </div>
  252. </div>
  253. <div class="div_video hidden">
  254. <div class="msg-option">
  255. <a href="javascript:;" class="video btn-icon-wrap"
  256. onclick="Unibase.Platform.Connect.Components.Chat.Instance().openvideo();">
  257. <i class="las la-video biz-highlight-bg-color font-22"></i>
  258. </a>
  259. </div>
  260. </div>
  261. </div>
  262. <div class="hidden" id="icon_send">
  263. <a href="javascript:;" class="btn btn-icon btn-primary btn-rounded d-30 msg-send-btn">
  264. <span class="btn-icon-wrap"> <i class="las la-paper-plane msg-option font-20"></i></span>
  265. </a>
  266. </div>
  267. <div class="voicemsg_icon" id="recordaudio">
  268. <a href="javascript:;" class="btn btn-icon btn-primary btn-rounded d-30 msg-send-btn" onclick="Unibase.Platform.Connect.Components.Chat.Instance().voicemsg()">
  269. <span class="btn-icon-wrap"><i class="fa fa-microphone msg-option font-20"></i></span>
  270. </a>
  271. </div>
  272. </div>
  273. </div>
  274. <div class="msg-multiaction-btns hidden">
  275. <div class="d-flex justify-content-between c-gap-10">
  276. <a href="javascript:;"
  277. class="btn btn-icon btn-flush-biz-theme btn-rounded flush-soft-hover delete-icon footer-multiaction disabled"
  278. data-item="Delete"><span class="btn-icon-wrap"><i
  279. class="icon dripicons-trash font-18"></i></span></a>
  280. <a href="javascript:;"
  281. class="btn btn-icon btn-flush-biz-theme btn-rounded flush-soft-hover star-icon footer-multiaction disabled"
  282. data-item="Star"><span class="btn-icon-wrap"><i class="icon dripicons-star font-18"></i></span></a>
  283. <a href="javascript:;"
  284. class="btn btn-icon btn-flush-biz-theme btn-rounded flush-soft-hover copy-icon footer-multiaction disabled"
  285. data-item="Copy" id="copyicon"><span class="btn-icon-wrap"><i class="icon dripicons-copy font-18"></i></span></a>
  286. <a href="javascript:;"
  287. class="btn btn-icon btn-flush-biz-theme btn-rounded flush-soft-hover forward-icon footer-multiaction disabled"
  288. data-item="Forward"><span class="btn-icon-wrap"><i class="icon dripicons-forward font-18"></i></span></a>
  289. </div>
  290. </div>
  291. </div>
  292. <div class="chat_down hidden" id="icon_down" style="display: block;position: absolute;bottom: 60px;">
  293. <a href="javascript:;" class="btn btn-icon btn-primary btn-rounded d-30 msg-send-btn" onclick="Unibase.Platform.Connect.Components.Chat.Instance().chatdown();">
  294. <span class="btn-icon-wrap"><i class="fa fa-angle-down"></i></span></a>
  295. </div>
  296. </section>`;
  297. }
  298. getMsgInfoBodyHtml() {
  299. return ` <div id="msgInfoHeader" class="chat-header">
  300. <div class="d-flex h-100 align-items-center c-gap-5">
  301. <a href="javascript:;" class="btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30" id="msgInfoBackBtn"
  302. onclick="Unibase.Platform.Connect.Components.Chat.Instance().closeMsgInfo();">
  303. <span class="btn-icon-wrap"><i class="text-dark" data-icon="l"></i></span>
  304. </a>
  305. <div class="font-weight-500 text-dark font-15 text-truncate">Message info</div>
  306. </div>
  307. </div>
  308. <div class="msg-info-body chat-flex-column flex-grow-1" id="msfInfoBody">
  309. <div id="msgInfoTxt" class="msg-info-text text-right py-20 px-10 flex-shrink-0">
  310. <span class="badge badge-primary font-14 rounded-20 msg-span"></span></div>
  311. <div data-simplebar class="simple-scroll-bar chat-scrollbar pb-20 px-10 flex-grow-1">
  312. <div class="d-flex flex-column r-gap-10">
  313. <div class="delivered-user-list-wrap biz-bg-hightlight-color_10 rounded-10 pa-10"
  314. id="deliveredUserListWrap">
  315. <div class="d-flex flex-column r-gap-10">
  316. <div class="flex-between-center c-gap-10">
  317. <h6 class="deliver">Delivered To</h6>
  318. <i class="las la-check-double font-20"></i>
  319. </div>
  320. <ul class="list-group list-group-flush delivereduserslist hidden"></ul>
  321. </div>
  322. </div>
  323. <div class="read-user-list-wrap biz-bg-hightlight-color_10 rounded-10 pa-10" id="readUserListWrap">
  324. <div class="d-flex flex-column r-gap-10">
  325. <div class="flex-between-center c-gap-10">
  326. <h6 class="read">Read by</h6>
  327. <i class="las la-check-double font-20" style="color:#00B0FF"></i>
  328. </div>
  329. <ul class="list-group list-group-flush readuserslist hidden"></ul>
  330. </div>
  331. </div>
  332. </div>
  333. </div>
  334. </div>`;
  335. }
  336. getContactsTemplate(contacts) {
  337. const instance = this;
  338. ChatTemplate.contacts = contacts;
  339. let _template = "";
  340. let photopath = [];
  341. contacts.sort((a, b) => a.contactName.localeCompare(b.contactName));
  342. let firstLetter = '';
  343. if (!contacts.length) {
  344. _template = "<li class='d-flex align-items-center justify-content-center mt-4'>No contacts found</li>";
  345. }
  346. else {
  347. for (let i = 0; i < contacts.length; i++) {
  348. if (contacts[i].contactId == Components.Chat.currentUser.userId) {
  349. continue;
  350. }
  351. var contactChatGroupId = 0;
  352. var chatinfo = Components.Chat.recentChats.find(x => x.contactId == contacts[i].contactId);
  353. if (chatinfo != undefined) {
  354. contactChatGroupId = chatinfo.chatGroupId;
  355. }
  356. const avatarHtml = instance.getUserAvatarHtml(contacts[i]);
  357. photopath[0] = contacts[i].photoUrl ? contacts[i].photoUrl : '';
  358. let contactFirstLetter = contacts[i].contactName[0].toLowerCase();
  359. if (firstLetter == "") {
  360. firstLetter = contactFirstLetter;
  361. _template += `<li class="list-group-item py-2 first-letter-heading h5 text-capitalize">${firstLetter}</li>`;
  362. }
  363. else if (firstLetter != contactFirstLetter) {
  364. firstLetter = contactFirstLetter;
  365. _template += `<li class="list-group-item py-2 first-letter-heading h5 text-capitalize">${firstLetter.toUpperCase()}</li>`;
  366. }
  367. contacts[i].about = "";
  368. _template += `<li class="contactuser${i} list-group-item border-0 px-1 py-1 flex-between-center c-gap-10">
  369. <a href="javascript:void(0);" data-contactId=${contacts[i].contactId} data-chatgroupid=${contacts[i].chatGroupId} data-isprivate=true class="media contactuser chatUserList flex-between-center c-gap-10 flex-grow-1 mnw-0" onclick="Unibase.Platform.Connect.Components.Chat.Instance().privatewindow(${contacts[i].contactId})" id="msgConvoItem_${contacts[i].contactId}">${avatarHtml}<div class="media-body mnw-0"><div class="username text-dark font-weight-500 font-15 text-truncate" title="${contacts[i].contactName}">${contacts[i].contactName}</div><div class="last-chat-msg" title="${contacts[i].about}">${contacts[i].about}</div></div></a><div class="chat-call-options d-none"></div></li>`;
  370. }
  371. }
  372. return _template;
  373. }
  374. getPrivateWindowTemplate(chats) {
  375. const avatarHtml = this.getUserAvatarHtml(chats, false, true);
  376. var lastseen = (chats.lastSeen == null || chats.lastSeen == '' || chats.lastSeen == undefined || chats.lastSeen == "null") ? '' : Unibase.Platform.Helpers.DateTimeHelper.Instance().formatLocal(chats.lastSeen);
  377. const _template = `<div class="media div_chatMediaHeader align-items-center chatanchorhoverdark h-100 c-gap-5">
  378. <a href="javascript:;" class="btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover flex-shrink-0 d-30 ${Components.Chat.isFullScreen ? 'hidden' : ''}" onclick="Unibase.Platform.Connect.Components.Chat.Instance().closeprivatewindow();" id="closePrivateWindowBtn"><span class="btn-icon-wrap"><i class="text-dark" data-icon="l"></i></span></a>
  379. <input type="hidden" value="${chats.contactName}" id="hfChats_chatGroupName">
  380. <input type="hidden" value='${chats.chatGroupId}' id="hfChats_chatGroupId">
  381. <input type="hidden" value='${chats.contactId}' id="private_id">
  382. <div class="d-flex imgchatUser_${chats.chatGroupId} align-items-center c-gap-10 flex-grow-1 mnw-0">${avatarHtml}
  383. <div class="media-body text-truncate">
  384. <a onclick="Unibase.Platform.Connect.Components.Chat.Instance().profileDetails();" href = "javascript:void(0);" class="user-name" title="${chats.contactName}"><span class="text-dark grpname_${chats.chatGroupId} font-weight-500 font-15">${chats.contactName}</span><div class="lastseen_${chats.contactId} text-light-60 font-11 text-truncate" data-lastseen='${chats.lastSeen}'>${lastseen}</div></div></a></div>
  385. <div class="chat-options-wrap">
  386. <ul class="navbar-nav hk-navbar-content div_chatMediaHeader">
  387. <li class="nav-item dropdown dropdown-authentication">
  388. <a class="nav-link dropdown-toggle no-caret btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30" href="javascript:;" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  389. <span class="btn-icon-wrap"><i class="icon dripicons-dots-3 rotate-90d font-20 text-dark"></i></span>
  390. </a>
  391. <div class="dropdown-menu dropdown-menu-right" id="t1" style="position:absolute;font-size:12px">
  392. <a class="dropdown-item d-none" href="javascript:;"><i class="dropdown-icon zmdi zmdi-star-outline biz-highlight-bg-color"></i>Stared Messages</a>
  393. <a class="dropdown-item btnSearchChat p-1 font-14" href="javascript:;" onclick="Unibase.Platform.Connect.Components.Chat.Instance().searchdesign();">Search</a>
  394. <a onclick="Unibase.Platform.Connect.Components.Chat.Instance().muteAlert();" class="dropdown-item p-1 font-14 mute-option Mute" data-mute="Mute" href="javascript:;">Mute</a>
  395. <a onclick="Unibase.Platform.Connect.Components.Chat.Instance().clearChat();" class="dropdown-item p-1 font-14" href="javascript:;">Clear Chat</a>
  396. </div></li></ul></div></div>`;
  397. return _template;
  398. }
  399. getTypingTemplate(contactname) {
  400. var contactid = Components.Chat.contacts.find(x => x.contactName == contactname).contactId;
  401. const _template = '<span class="badge badge-light pull-left mt-3 typingspan_' + contactid + '"style="position:relative;">' + contactname + '' + " " + 'is ' + "typing" + '<div class="dot_wave pt-5"><div class="dot"></div><div class="dot"></div><div class="dot"></div></div></span><br><br><br>';
  402. return _template;
  403. }
  404. getNewGroupTemplate() {
  405. const _template = `
  406. <div class="chat-group-top-header flex-shrink-0 px-5">
  407. <div class="divtxt_ContactsSearch">
  408. <div class="chatapp-search-div">
  409. <input id="txtSearchParticipants" type="text" class="custom-chat-input required txt_SearchNewParticipants search-input" value="" placeholder="Search Contacts..." onkeyup="Unibase.Platform.Connect.Components.Chat.Instance().searchParticipants('txt_SearchNewParticipants','grp_newparticipants');">
  410. <i class="fa fa-search search-icon"></i>
  411. <i class="icon dripicons-cross search-close hidden" id="clearGroupContactsSearch"></i>
  412. </div></div>
  413. <div class="div-ChatNewParticipants mt-10">
  414. <div class="divtxt_chatGroupName flex-between-center c-gap-5">
  415. <div class="group-pic-upload-btn position-relative">
  416. <a href="javascript:;" class="btn btn-icon btn-icon-circle btn-primary btn-rounded btn-xs btn-file"><span class="btn-icon-wrap"><i class="las la-camera font-18"></i></span><input type="file" class="groupImgUpload" onclick="Unibase.Platform.Connect.Components.Chat.Instance().newGroupProfile(this);"></a></div>
  417. <div class="input-group">
  418. <input id="txt_GroupName" type="text" class="text-center custom-chat-input required rounded-20 txt_chatGroupName" onkeyup="Unibase.Platform.Connect.Components.Chat.Instance().groupname();" value="" placeholder="Enter Group Name">
  419. </div>
  420. <div class="participant_avatar avatar-group avatar-group-sm avatar-group-overlapped flex-center hidden"></div>
  421. </div>
  422. </div>
  423. </div>
  424. <div data-simplebar class="Chat-NewParticipants userlist simple-scroll-bar px-10 pb-10 flex-grow-1"><ul class="list-chatgroup list-group list-group-flush h-100" id="chatGroupList"></ul></div>
  425. <div class="chat-group-footer btn_saveGroup hidden"><a href="javascript:;" class="btn btn-outline-smoke mr-10" onclick="Unibase.Platform.Connect.Components.Chat.Instance().closechatgroup();">Cancel</a><a href="javascript:;" class="btn btn-primary" id="btn_addtoGrpName" onclick="Unibase.Platform.Connect.Components.Chat.Instance().Savegroup();">Create</a></div>
  426. </div>`;
  427. return _template;
  428. }
  429. getGroupContactsTemplate(contacts) {
  430. let _template = "";
  431. let user = Unibase.Platform.Membership.Infos.Identity.currentUser;
  432. let contactLength = contacts.length;
  433. contacts.sort((a, b) => a.contactName.localeCompare(b.contactName));
  434. let firstLetter = '';
  435. for (let i = 0; i < contactLength; i++) {
  436. const contactId = contacts[i].contactId;
  437. const avatarHtml = this.getUserAvatarHtml(contacts[i]);
  438. let contactFirstLetter = contacts[i].contactName[0].toLowerCase();
  439. if (firstLetter == "") {
  440. firstLetter = contactFirstLetter;
  441. _template += `<li class="list-group-item py-2 first-letter-heading h5 text-capitalize hidden">${firstLetter.toUpperCase()}</li>`;
  442. }
  443. else if (firstLetter != contactFirstLetter) {
  444. firstLetter = contactFirstLetter;
  445. _template += `<li class="list-group-item py-2 first-letter-heading h5 text-capitalize hidden">${firstLetter.toUpperCase()}</li>`;
  446. }
  447. contacts[i].about = "";
  448. _template += '<li class="groupuser grp_newparticipants list-group-item px-1 py-2" id="groupContactUser_' + contactId + '" data-contactname="' + contacts[i].contactName + '">' +
  449. '<a href="javascript:void(0);" class="media flex-between-center flex-grow-1 c-gap-10 mnw-0">' +
  450. avatarHtml + '<div class="media-body flex-grow-1 mnw-0"><div class="username text-dark font-weight-500 font-15 text-truncate" title="' + contacts[i].contactName + '">' + contacts[i].contactName + '</div><div class="last-chat-msg" title="' + contacts[i].about + '">' + contacts[i].about + '</div></div>' +
  451. '<div class="chat-call-options justify-content-between">' +
  452. '<div class="custom-control custom-checkbox checkbox-primary">' +
  453. '<input type="checkbox" name="chatgroupuser" id="chkuser_' + contactId + '" value=' + contactId + ' class="custom-control-input groupusercheckbox chkuser_' + contactId + '">' +
  454. '<label class="custom-control-label" for="chkuser_' + contactId + '"><span id="contactid_' + contactId + '" class="hidden">' + contactId + '</span></label>' +
  455. '</div></div></div>' +
  456. '</a>' +
  457. '</li>';
  458. }
  459. return _template;
  460. }
  461. getProfileTemplate() {
  462. return `<div id="profileHeaderWrap" class="chat-header">
  463. <div id="profileHeader" class="h-100"></div>
  464. <div id="mediaHeader" class="h-100 hidden">
  465. <div class="d-flex h-100 align-items-center c-gap-5">
  466. <a href="javascript:;"
  467. class="btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30"
  468. id="mediaBackBtn" onclick="Unibase.Platform.Connect.Components.Chat.Instance().closeMediaInfo();"><span class="btn-icon-wrap"><i class="text-dark" data-icon="l"></i></span>
  469. </a>
  470. <div class="font-weight-500 text-dark font-15 text-truncate">Media,links,docs</div>
  471. </div>
  472. </div>
  473. </div>
  474. <div class="Search_participants flex-shrink-0 mx-10 my-5 hidden">
  475. <div class="flex-between-center c-gap-5">
  476. <div class="chatapp-search-div flex-grow-1"><input id="txtSearchParticipants" type="text"
  477. class="custom-chat-input required txt_SearchChat oldgrp_newparticipanrsearch search-input" value="" placeholder="Search Contacts..."
  478. onkeyup="Unibase.Platform.Connect.Components.Chat.Instance().searchParticipants('oldgrp_newparticipanrsearch','oldgrp_newparticipants');">
  479. <i class="fa fa-search search-icon"></i><a href="javascript:;" class="search-close hidden"><i class="icon dripicons-cross"></i></a></div>
  480. <div class="participant_avatar avatar-group avatar-group-sm avatar-group-overlapped flex-center hidden">
  481. </div>
  482. </div>
  483. </div>
  484. <div data-simplebar class="simple-scroll-bar profilebody flex-grow-1 px-10 pb-20 pt-5 h-100">
  485. <div class="profileDetails"></div>
  486. </div>`;
  487. }
  488. getprofileheader() {
  489. const _template = `<div class="group-info-header h-100">
  490. <div class="d-flex h-100 align-items-center c-gap-10">
  491. <div class="flex-grow-1 d-flex align-items-center c-gap-10"><a href="javascript:;" data-contactid=${Components.Chat.contactId} class="btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30" id="closeContactInfoBtn" onclick="Unibase.Platform.Connect.Components.Chat.Instance().closeContactInfo();"><span class="btn-icon-wrap"><i class="text-dark" data-icon="l"></i></span></a><div class="profile-heading text-truncate text-dark font-weight-500 font-15">${Components.Chat.contactId != 0 ? 'Contact' : 'Group'} Info</div></div><a href="javascript:;" class="btn_AddChatParticipants btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30 hidden" onclick="Unibase.Platform.Connect.Components.Chat.Instance().AddParticipants();"><span class="btn-icon-wrap"><i class="las la-user-plus font-20 "></i></span></a></div></div></div><div class="add-participants-header h-100 hidden">
  492. <div class="d-flex h-100 align-items-center c-gap-10">
  493. <div class="flex-grow-1 d-flex align-items-center c-gap-10"><a href="javascript:;" class="btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30" id="closeAddParticipantsBtn" onclick="Unibase.Platform.Connect.Components.Chat.Instance().closeAddParticipants();"><span class="btn-icon-wrap"><i class="text-dark" data-icon="l"></i></span></a><div class="profile-heading text-truncate text-dark font-weight-500 font-15">Add Participants</div></div><a href="javascript:;" onclick="Unibase.Platform.Connect.Components.Chat.Instance().Savegroup();" id="btn_addtoGrpName" class="btn_saveGroup hidden font-14 ml-auto"><span class="btn btn-xs btn-primary">Save</span></a></div>
  494. </div></div>`;
  495. return _template;
  496. }
  497. getprofilebody() {
  498. var imginput = '';
  499. var contact = Components.Chat.contacts.find(x => x.contactId == Components.Chat.contactId);
  500. if (Components.Chat.contactId == 0) {
  501. contact = Components.Chat.recentChats.find(x => x.chatGroupId == Components.Chat.chatGroupId);
  502. }
  503. var phoneNumber = '', emailId = '';
  504. if (contact != undefined && Components.Chat.contactId != 0) {
  505. phoneNumber = contact.phoneNumber;
  506. emailId = contact.emailId;
  507. }
  508. var contactName = contact.contactName;
  509. let avatarHtml = this.getUserAvatarHtml(contact, false, true);
  510. avatarHtml = avatarHtml.replace('avatar-sm', 'avatar-xl d-100');
  511. if (!Components.Chat.isPrivate) {
  512. imginput = '<span class="btn btn-icon btn-icon-circle btn-primary btn-xs d-20" style="position:absolute;top:10%;z-index:1;left:56%;"><i class="fa fa-pencil"></i></span><input type="file" id="profileImageInput" class="Profile_image hidden" onchange="Unibase.Platform.Connect.Components.Chat.Instance().changeProfileImage(this);" accept="image/png,image/jpeg">';
  513. }
  514. const template = `<div class="profile-details-wrap" id="profileDetailsWrap"><div class="user-profile-info flex-center flex-column r-gap-10" id="userProfileInfo"><label class="profile-header-img flex-center flex-shrink-0 my-0 cursor-pointer" for="profileImageInput" imgchatUser_${Components.Chat.chatGroupId} title="Upload Image">${imginput}</label>${avatarHtml}
  515. <div class="div-user-group-Name d-flex flex-column justify-content-center mnw-0 r-gap-5 w-100">
  516. <div class="profile-name-wrap position-relative flex-center c-gap-10"><span class="Profile_name grpname_${Components.Chat.chatGroupId} font-weight-500 font-18 text-center text-dark">${contactName}</span><div class="edit-group-input-wrap position-relative mb-5 hidden" id="editGroupInputWrap"><input type="text" class="custom-chat-input text-dark font-weight-500 edit_groupdetailsInput pr-30" value="${contactName} " data-prevvalue="${contactName} "></a>
  517. <a href="javascript:;" class="save_changes btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-26" onclick="Unibase.Platform.Connect.Components.Chat.Instance().changeGroupName();"><span class="btn-icon-wrap"><i class="icon dripicons-checkmark"></i></span></a></div><a href="javascript:;" class="edit_grpdetails btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-26 hidden" onclick="Unibase.Platform.Connect.Components.Chat.Instance().EditgroupDetails('${contactName}');"><span class="btn-icon-wrap"><i class="fa fa-pencil font-14"></i></span></a></div>
  518. <div class="flex-center flex-column font-12 r-gap-3 text-center user-info-section hidden" id="userInfoSection"><span class="partipant-count hidden">
  519. </span><span class="user-mobile-no">${phoneNumber}</span><span class="user-email">${emailId}</span></div></div>
  520. </div>
  521. <div class="profile-media-link flex-between-center c-gap-10 pa-10 biz-bg-hightlight-color_10 rounded-10 font-weight-500 text-dark cursor-pointer" id="profileMediaLink"><h6>Media, links and docs</h6><span class="badge badge-primary badge-sm rounded-10 font-10 media-links-count">0</span></div>
  522. <div class="star-messages-link flex-between-center c-gap-10 pa-10 biz-bg-hightlight-color_10 rounded-10 font-weight-500 text-dark cursor-pointer" id="starMessagesLink" onclick="Unibase.Platform.Connect.Components.Chat.Instance().starmessages();"><span class="d-flex c-gap-10"><h6>Star messages</h6><a href="javascript:;" class="btn btn-icon btn-icon-circle btn-primary btn-xs d-20"><span class="btn-icon-wrap"><i class="icon dripicons-star"></i></span></a></span><span class="badge badge-primary badge-sm rounded-10 font-10 star-messages-count">0</span></div>
  523. <div class="div-Chat-Groups biz-bg-hightlight-color_10 rounded-10 pa-10 hidden">
  524. <div class="d-flex flex-column r-gap-10"><div class="groups-header flex-between-center c-gap-10">
  525. <h6>Groups</h6>
  526. <span class="badge badge-primary badge-sm rounded-10 font-10 countChatGroups">0</span>
  527. </div>
  528. <ul class="list-group list-group-flush Chat-Chat-Group hidden">
  529. </ul>
  530. </div></div>
  531. <div class="div-Chat-Participants biz-bg-hightlight-color_10 rounded-10 pa-10 hidden">
  532. <div class="d-flex flex-column r-gap-10"><div class="participants-header flex-between-center c-gap-10">
  533. <h6>Participants</h6>
  534. <span class="badge badge-primary badge-sm rounded-10 font-10 countChatParticipants">0</span>
  535. </div>
  536. <div class="chatapp-search-div"><i class="fa fa-search search-icon biz-highlight-bg-color"></i><input type="text" class="participants_search custom-chat-input search-input" placeholder="Search Participants" onkeyup="Unibase.Platform.Connect.Components.Chat.Instance().searchParticipants('participants_search','grp_participents');"></div>
  537. <ul class="list-group list-group-flush Notify-Chat-Participants hidden">
  538. </ul>
  539. </div></div>
  540. <div class="div-Chat-AddParticipants biz-bg-hightlight-color_10 rounded-10 pa-10 hidden">
  541. <div class="d-flex flex-column r-gap-10"><div class="add-participants-header flex-between-center c-gap-10">
  542. <h6>Add Participants</h6>
  543. <span class="badge badge-primary badge-sm rounded-10 font-10 countChatAddParticipants">0</span>
  544. </div>
  545. <ul class="list-group list-group-flush Notify-Chat-AddParticipants hidden">
  546. </ul>
  547. </div></div>
  548. <div class="profile-action-div div-Chat-Block text-center">
  549. <a href="javascript:void(0);" class="btn btn-sm btn-outline-danger blockUser hidden" onclick="Unibase.Platform.Connect.Components.Chat.Instance().BlockAlert()">
  550. <span class="icon-label mr-5"><i class="fa fa-ban"></i></span>
  551. <span class="blkbtn-text">Block User</span>
  552. </a>
  553. <a href="javascript:void(0);" onclick="Unibase.Platform.Connect.Components.Chat.Instance().exitGroup();" class="btn btn-sm btn-outline-danger ExitFromGroup hidden">
  554. <span class="icon-label mr-5"><i class="fa fa-sign-out"></i></span>
  555. <span class="btn-text">Exit Group</span>
  556. </a>
  557. </div>
  558. </div>
  559. <div id="profileMediaWrap" class="profile-media-wrap hidden"><ul class="nav nav-tabs nav-line profile-media-tabs px-10" role="tablist" id="profileMediaTabs">
  560. <li class="nav-item"><a href="javascript:void(0);" onclick="Unibase.Platform.Connect.Components.Chat.Instance().mediaFiles();" class="nav-link div-Chat-Media">Media <span class="countMediaFiles hidden count-span badge badge-primary badge-sm rounded-10 font-10">0</span></a></li>
  561. <li class="nav-item"><a href="javascript:void(0);"onclick=" Unibase.Platform.Connect.Components.Chat.Instance().links();" class="nav-link div-Chat-Links">Links<span class="linkCount hidden count-span badge badge-primary badge-sm rounded-10 font-10">0</span></a></li>
  562. <li class="nav-item"><a href="javascript:void(0);"onclick=" Unibase.Platform.Connect.Components.Chat.Instance().documentFiles();" class="nav-link div-Chat-Docs">Documents <span class="countDocFiles hidden count-span badge badge-primary badge-sm rounded-10 font-10">0</span></a></li>
  563. </ul>
  564. <div class="tab-content mb-20" id="profileTabContent">
  565. <div class="links-content-tab tab-pane fade" role="tabpanel" id="links_files">
  566. <div id="Chat-Links" class="Chat-ListUrls d-flex flex-column r-gap-15">
  567. <div class="text-center text-danger">No Links</div>
  568. </div>
  569. </div>
  570. <div class="links-content-tab tab-pane fade" role="tabpanel" id="Chat-Mediafiles">
  571. <div id="Chat-Media" class="chat-media d-flex flex-column r-gap-15">
  572. <div class="text-center text-danger">No Media</div>
  573. </div>
  574. </div>
  575. <div class="links-content-tab tab-pane fade" role="tabpanel" id="Chat-docfiles">
  576. <div id="Chat-Docs" class="Chat-Chat-Docs d-flex flex-column r-gap-15">
  577. <div class="text-center text-danger">No Documents</h6>
  578. </div>
  579. </div>
  580. </div>
  581. </div>`;
  582. return template;
  583. }
  584. getAddParticipants(contactId, contactName) {
  585. var contact = Components.Chat.contacts.find(x => x.contactId == contactId);
  586. const avatarHtml = this.getUserAvatarHtml(contact);
  587. const _template = `<li class="list-group-item groupuser oldgrp_newparticipants px-1 py-2" id="groupParticipant_${contactId}" data-contactname="${contactName}">
  588. <a href ="javascript:;" class="flex-between-center c-gap-10 groupParticipant_${contactId}">
  589. <div class="d-flex align-items-center c-gap-10 flex-grow-1 mnw-0">${avatarHtml}<div class="name text-dark font-15 font-weight-500 text-truncate" id="contactname_${contactId}">${contactName}</div></div>
  590. <input type="checkbox" name="selected_participants" id="checkuser_${contactId}" value='${contactId}' class="checkuser_${contactId} transform-scale-1_1"></div>
  591. <label id="contactid_${contactId}" class="hidden">${contactId}</label>
  592. </a></li>`;
  593. return _template;
  594. }
  595. getgroupsbycid(groupname) {
  596. var chatGroupId = 0;
  597. var chatinfo = Components.Chat.recentChats.find(x => x.contactName == groupname && !x.isPrivate);
  598. if (chatinfo != undefined) {
  599. chatGroupId = chatinfo.chatGroupId;
  600. }
  601. const avatarHtml = this.getUserAvatarHtml(chatinfo);
  602. const _template = `<li class="list-group-item px-1 py-2 common-group-item" id="groupuser_${chatGroupId}"><a href="javascript:;" data-contactid="0" data-chatgroupid="${chatGroupId}" onclick="Unibase.Platform.Connect.Components.Chat.Instance().privatewindow(${chatGroupId});" class="media participent d-flex align-items-center c-gap-10 mnw-0" id="msgConvoItem_${chatGroupId}">${avatarHtml}
  603. <div class="media-body mnw-0 flex-grow-1"><div class="username text-dark font-weight-500 font-15 text-truncate" title="${groupname}">${groupname}</div></div></a></li>`;
  604. return _template;
  605. }
  606. getForwardContacts(contacts) {
  607. var forwardcontactshtml = "";
  608. let contactLength = contacts.length;
  609. for (let i = 0; i < contactLength; i++) {
  610. const avatarHtml = this.getUserAvatarHtml(contacts[i]);
  611. var idclass = contacts[i].contactId == 0 ? contacts[i].chatGroupId : contacts[i].contactId;
  612. idclass = "frdid_" + idclass;
  613. forwardcontactshtml += '<li class="list-group-item forwardcontact px-1 py-2 ' + idclass + ' " id="Forwarduser_' + i + '" data-contactname="' + contacts[i].contactName + '">' +
  614. '<a href ="javascript:;"class="d-flex align-items-center c-gap-10 groupuser_' + i + '"><label class="d-flex align-items-center c-gap-10 flex-grow-1 mnw-0" for="chkuser_' + i + '">' + avatarHtml + '<div class="name font-15 font-weight-500 text-dark text-truncate" id = "forwardcontactname_' + i + '" > ' + contacts[i].contactName + ' </div></label>' +
  615. '<input type="checkbox" name="forwardcontact" id="chkuser_' + i + '" class=" chkforward_' + contacts[i].contactId + '" value=' + contacts[i].contactId + ' data-contactid=' + contacts[i].contactId + ' data-chatgroupid=' + contacts[i].chatGroupId + '>' +
  616. '<lable id="forwardcontactid_' + i + '" class="hidden">' + contacts[i].contactId + '</lable>' +
  617. '</a></li>';
  618. }
  619. return forwardcontactshtml;
  620. }
  621. getForwardTemplate() {
  622. const html = `<div id="forwardContactsHeader" class="chat-header flex-between-center c-gap-10"><div class="d-flex align-items-center c-gap-10"><a onclick="Unibase.Platform.Connect.Components.Chat.Instance().closeForwardContacts();" href="javascript:;" class="btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30"><span class="btn-icon-wrap"><i class="text-dark" data-icon="l"></i></span></a><div class="div-user-group-Name flex-between-center flex-grow-1 c-gap-10 r-gap-5 mnw-0"><div class="Profile_name font-weight-500 text-dark font-15 text-truncate">Forward Contacts</div></div></div><a class="btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-30 _btnSendToMany hidden" href="javascript:;" id="forwardSendBtn"><span class="btn-icon-wrap"><i class="zmdi zmdi-mail-send zmdi-hc-lg"></i></span></a></div>
  623. <div class="Forward_Contacts flex-grow-1 chat-flex-column overflow-y-auto">
  624. <div class="div_forwardMessage chat-flex-column">
  625. <div class="pt-1 pb-2 flex-shrink-0">
  626. <div role ="search" class="chatapp-search-div chat-search mx-2">
  627. <input type="text" id="search_forwardcontacts" name ="search_forwardcontacts" class="custom-chat-input search_forwardcontacts search-input" placeholder="Search" onkeyup="Unibase.Platform.Connect.Components.Chat.Instance().searchParticipants('search_forwardcontacts','forwardcontact');"><i class="fa fa-search search-icon"></i></div></div>
  628. <div data-simplebar class="Forward_messaagecontacts simple-scroll-bar px-10 pb-10 flex-grow-1"><ul class="forwardcontacts_list list-group list-group-flush"></ul></div></div></div>`;
  629. return html;
  630. }
  631. getselectedcontacts(name, i) {
  632. const _template = '<li class="selected_groupcontaccts_' + i + '"><span class="badge badge-light">' + name + '</span></li>';
  633. return _template;
  634. }
  635. getMediaFiles(path, imgshow) {
  636. const _template = '<div class="preview_file"><a href="javascript:void(0);" onclick="Unibase.Platform.Connect.Components.Chat.Instance().filePreview(\'' + path + '\')" class="d-inline-block"><img src="' + imgshow + '" onerror="ReloadImage(event)" data-dynamic="1" class="d-50"></a></div>';
  637. return _template;
  638. }
  639. getLinks(message) {
  640. const _template = `<div class="text-truncate w-100"><span class="link-message text-truncate font-14"><a href='${message}' target="_blank" title="${message}">${message}</a></span></div>`;
  641. return _template;
  642. }
  643. getProfileSettings(photourl, contactname) {
  644. const html = '<div class="profilesettings"><span class="imageProfile"><center><img src=' + photourl + ' style="height:30%;width:30%" class="profile_image rounded-circle"><i class="fa fa-pencil"><input type="file" class="change_profile hidden"></i></center><span class="profile_contactname">' + contactname + '</span><span class="profile_contactid"></span></div>';
  645. return html;
  646. }
  647. getMentionableContactTemplate(contact) {
  648. const { contactId, contactName } = contact;
  649. let avatarHtml = this.getUserAvatarHtml(contact);
  650. avatarHtml = avatarHtml.replace('avatar-sm', 'avatar-xs d-30');
  651. const _template = `<li class="list-group-item pa-5 flex-between-center mentionble-contact" id="mentionbleContact_${contactId}" data-contactname="@${contactName}">
  652. <a href ="javascript:;" class="d-flex align-items-center c-gap-10 w-100 mnw-0">${avatarHtml}
  653. <div class="media-body flex-grow-1 mnw-0 d-flex flex-column justify-content-center">
  654. <div class="flex-between-center c-gap-10 text-dark font-weight-500 font-13 text-truncate" title="${contactName}">${contactName}</div>
  655. </div>
  656. </a></li>`;
  657. return _template;
  658. }
  659. getUserAvatarHtml(contactInfo, isOnlineVisible = false, isPrivateWindow = false) {
  660. let avatarHtml = '<div class="media-img-wrap avatar ImagePng_' + contactInfo.chatGroupId + ' avatar-sm flex-shrink-0 cursor-pointer" onclick="Unibase.Platform.Connect.Components.Chat.Instance().showProfileImgPreview()" title="Preview Profile">';
  661. if (!contactInfo.photoUrl) {
  662. let avatarTxt = "";
  663. let headingTxt = contactInfo.contactName;
  664. if (headingTxt) {
  665. let matches = headingTxt.match(/\b(\w)/g);
  666. if (matches.length == 1) {
  667. avatarTxt = $.trim(headingTxt).substr(0, 2);
  668. }
  669. else {
  670. avatarTxt = matches.join('').slice(0, 2);
  671. }
  672. avatarHtml += `<div class="avatar-text avatar-text-${isPrivateWindow ? 'inv-' : ''}primary rounded-circle" data-text="${avatarTxt}"><span class="initial-wrap"><span>${avatarTxt}</span></span></div>`;
  673. }
  674. else {
  675. avatarHtml = '';
  676. }
  677. }
  678. else {
  679. var photoUrl = Components.Chat.Instance().getFilePath(contactInfo.photoUrl);
  680. avatarHtml += `<img src='${photoUrl}' data-dynamic="1" class="avatar-img chatuser-img" data-loaded="0">`;
  681. }
  682. avatarHtml += `${isOnlineVisible ? `<span class="badge ${contactInfo.isonline ? 'active' : ''} badge-green badge-indicator online-status-icon" id ="contact_badge_${contactInfo.contactId}"></span>` : ''}</div>`;
  683. return avatarHtml;
  684. }
  685. getEmojiPattern() {
  686. return /^(?:\uD83D(?:\uDD73\uFE0F?|\uDC41(?:(?:\uFE0F(?:\u200D\uD83D\uDDE8\uFE0F?)?|\u200D\uD83D\uDDE8\uFE0F?))?|[\uDDE8\uDDEF]\uFE0F?|\uDC4B(?:\uD83C[\uDFFB-\uDFFF])?|\uDD90(?:(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F))?|[\uDD96\uDC4C\uDC48\uDC49\uDC46\uDD95\uDC47\uDC4D\uDC4E\uDC4A\uDC4F\uDE4C\uDC50\uDE4F\uDC85\uDCAA\uDC42\uDC43\uDC76\uDC66\uDC67](?:\uD83C[\uDFFB-\uDFFF])?|\uDC71(?:(?:\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2640\u2642]\uFE0F?))?)|\u200D(?:[\u2640\u2642]\uFE0F?)))?|\uDC68(?:(?:\uD83C(?:\uDFFB(?:\u200D(?:\uD83E(?:\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFC-\uDFFF]|[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD])|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92]|\u2708\uFE0F?))?|\uDFFC(?:\u200D(?:\uD83E(?:\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF]|[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD])|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92]|\u2708\uFE0F?))?|\uDFFD(?:\u200D(?:\uD83E(?:\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD])|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92]|\u2708\uFE0F?))?|\uDFFE(?:\u200D(?:\uD83E(?:\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF]|[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD])|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92]|\u2708\uFE0F?))?|\uDFFF(?:\u200D(?:\uD83E(?:\uDD1D\u200D\uD83D\uDC68\uD83C[\uDFFB-\uDFFE]|[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD])|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92]|\u2708\uFE0F?))?)|\u200D(?:\uD83E[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD]|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D(?:\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uDC68\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92])|\u2708\uFE0F?|\u2764(?:\uFE0F\u200D\uD83D(?:\uDC8B\u200D\uD83D\uDC68|\uDC68)|\u200D\uD83D(?:\uDC8B\u200D\uD83D\uDC68|\uDC68)))))?|\uDC69(?:(?:\uD83C(?:\uDFFB(?:\u200D(?:\uD83E(?:\uDD1D\u200D\uD83D(?:\uDC69\uD83C[\uDFFC-\uDFFF]|\uDC68\uD83C[\uDFFC-\uDFFF])|[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD])|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92]|\u2708\uFE0F?))?|\uDFFC(?:\u200D(?:\uD83E(?:\uDD1D\u200D\uD83D(?:\uDC69\uD83C[\uDFFB\uDFFD-\uDFFF]|\uDC68\uD83C[\uDFFB\uDFFD-\uDFFF])|[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD])|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92]|\u2708\uFE0F?))?|\uDFFD(?:\u200D(?:\uD83E(?:\uDD1D\u200D\uD83D(?:\uDC69\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF]|\uDC68\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD])|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92]|\u2708\uFE0F?))?|\uDFFE(?:\u200D(?:\uD83E(?:\uDD1D\u200D\uD83D(?:\uDC69\uD83C[\uDFFB-\uDFFD\uDFFF]|\uDC68\uD83C[\uDFFB-\uDFFD\uDFFF])|[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD])|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92]|\u2708\uFE0F?))?|\uDFFF(?:\u200D(?:\uD83E(?:\uDD1D\u200D\uD83D(?:\uDC69\uD83C[\uDFFB-\uDFFE]|\uDC68\uD83C[\uDFFB-\uDFFE])|[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD])|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92]|\u2708\uFE0F?))?)|\u200D(?:\uD83E[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD]|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D(?:\uDC69\u200D\uD83D(?:\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?)|\uDC66(?:\u200D\uD83D\uDC66)?|\uDC67(?:\u200D\uD83D[\uDC66\uDC67])?|[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92])|\u2708\uFE0F?|\u2764(?:\uFE0F\u200D\uD83D(?:\uDC8B\u200D\uD83D[\uDC68\uDC69]|[\uDC68\uDC69])|\u200D\uD83D(?:\uDC8B\u200D\uD83D[\uDC68\uDC69]|[\uDC68\uDC69])))))?|[\uDC74\uDC75](?:\uD83C[\uDFFB-\uDFFF])?|[\uDE4D\uDE4E\uDE45\uDE46\uDC81\uDE4B\uDE47\uDC6E](?:(?:\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|\uDD75(?:(?:\uFE0F(?:\u200D(?:[\u2642\u2640]\uFE0F?))?|\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|[\uDC82\uDC77](?:(?:\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|\uDC78(?:\uD83C[\uDFFB-\uDFFF])?|\uDC73(?:(?:\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|[\uDC72\uDC70\uDC7C](?:\uD83C[\uDFFB-\uDFFF])?|[\uDC86\uDC87\uDEB6](?:(?:\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|[\uDC83\uDD7A](?:\uD83C[\uDFFB-\uDFFF])?|\uDD74(?:(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F))?|\uDC6F(?:\u200D(?:[\u2642\u2640]\uFE0F?))?|[\uDEA3\uDEB4\uDEB5](?:(?:\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|[\uDEC0\uDECC\uDC6D\uDC6B\uDC6C](?:\uD83C[\uDFFB-\uDFFF])?|\uDDE3\uFE0F?|\uDC15(?:\u200D\uD83E\uDDBA)?|[\uDC3F\uDD4A\uDD77\uDD78\uDDFA\uDEE3\uDEE4\uDEE2\uDEF3\uDEE5\uDEE9\uDEF0\uDECE\uDD70\uDD79\uDDBC\uDD76\uDECD\uDDA5\uDDA8\uDDB1\uDDB2\uDCFD\uDD6F\uDDDE\uDDF3\uDD8B\uDD8A\uDD8C\uDD8D\uDDC2\uDDD2\uDDD3\uDD87\uDDC3\uDDC4\uDDD1\uDDDD\uDEE0\uDDE1\uDEE1\uDDDC\uDECF\uDECB\uDD49]\uFE0F?|[\uDE00\uDE03\uDE04\uDE01\uDE06\uDE05\uDE02\uDE42\uDE43\uDE09\uDE0A\uDE07\uDE0D\uDE18\uDE17\uDE1A\uDE19\uDE0B\uDE1B-\uDE1D\uDE10\uDE11\uDE36\uDE0F\uDE12\uDE44\uDE2C\uDE0C\uDE14\uDE2A\uDE34\uDE37\uDE35\uDE0E\uDE15\uDE1F\uDE41\uDE2E\uDE2F\uDE32\uDE33\uDE26-\uDE28\uDE30\uDE25\uDE22\uDE2D\uDE31\uDE16\uDE23\uDE1E\uDE13\uDE29\uDE2B\uDE24\uDE21\uDE20\uDE08\uDC7F\uDC80\uDCA9\uDC79-\uDC7B\uDC7D\uDC7E\uDE3A\uDE38\uDE39\uDE3B-\uDE3D\uDE40\uDE3F\uDE3E\uDE48-\uDE4A\uDC8B\uDC8C\uDC98\uDC9D\uDC96\uDC97\uDC93\uDC9E\uDC95\uDC9F\uDC94\uDC9B\uDC9A\uDC99\uDC9C\uDDA4\uDCAF\uDCA2\uDCA5\uDCAB\uDCA6\uDCA8\uDCA3\uDCAC\uDCAD\uDCA4\uDC40\uDC45\uDC44\uDC8F\uDC91\uDC6A\uDC64\uDC65\uDC63\uDC35\uDC12\uDC36\uDC29\uDC3A\uDC31\uDC08\uDC2F\uDC05\uDC06\uDC34\uDC0E\uDC2E\uDC02-\uDC04\uDC37\uDC16\uDC17\uDC3D\uDC0F\uDC11\uDC10\uDC2A\uDC2B\uDC18\uDC2D\uDC01\uDC00\uDC39\uDC30\uDC07\uDC3B\uDC28\uDC3C\uDC3E\uDC14\uDC13\uDC23-\uDC27\uDC38\uDC0A\uDC22\uDC0D\uDC32\uDC09\uDC33\uDC0B\uDC2C\uDC1F-\uDC21\uDC19\uDC1A\uDC0C\uDC1B-\uDC1E\uDC90\uDCAE\uDD2A\uDDFE\uDDFB\uDC92\uDDFC\uDDFD\uDD4C\uDED5\uDD4D\uDD4B\uDC88\uDE82-\uDE8A\uDE9D\uDE9E\uDE8B-\uDE8E\uDE90-\uDE9C\uDEF5\uDEFA\uDEB2\uDEF4\uDEF9\uDE8F\uDEA8\uDEA5\uDEA6\uDED1\uDEA7\uDEF6\uDEA4\uDEA2\uDEEB\uDEEC\uDCBA\uDE81\uDE9F-\uDEA1\uDE80\uDEF8\uDD5B\uDD67\uDD50\uDD5C\uDD51\uDD5D\uDD52\uDD5E\uDD53\uDD5F\uDD54\uDD60\uDD55\uDD61\uDD56\uDD62\uDD57\uDD63\uDD58\uDD64\uDD59\uDD65\uDD5A\uDD66\uDD25\uDCA7\uDEF7\uDD2E\uDC53-\uDC62\uDC51\uDC52\uDCFF\uDC84\uDC8D\uDC8E\uDD07-\uDD0A\uDCE2\uDCE3\uDCEF\uDD14\uDD15\uDCFB\uDCF1\uDCF2\uDCDE-\uDCE0\uDD0B\uDD0C\uDCBB\uDCBD-\uDCC0\uDCFA\uDCF7-\uDCF9\uDCFC\uDD0D\uDD0E\uDCA1\uDD26\uDCD4-\uDCDA\uDCD3\uDCD2\uDCC3\uDCDC\uDCC4\uDCF0\uDCD1\uDD16\uDCB0\uDCB4-\uDCB8\uDCB3\uDCB9\uDCB1\uDCB2\uDCE7-\uDCE9\uDCE4-\uDCE6\uDCEB\uDCEA\uDCEC-\uDCEE\uDCDD\uDCBC\uDCC1\uDCC2\uDCC5-\uDCD0\uDD12\uDD13\uDD0F-\uDD11\uDD28\uDD2B\uDD27\uDD29\uDD17\uDD2C\uDD2D\uDCE1\uDC89\uDC8A\uDEAA\uDEBD\uDEBF\uDEC1\uDED2\uDEAC\uDDFF\uDEAE\uDEB0\uDEB9-\uDEBC\uDEBE\uDEC2-\uDEC5\uDEB8\uDEAB\uDEB3\uDEAD\uDEAF\uDEB1\uDEB7\uDCF5\uDD1E\uDD03\uDD04\uDD19-\uDD1D\uDED0\uDD4E\uDD2F\uDD00-\uDD02\uDD3C\uDD3D\uDD05\uDD06\uDCF6\uDCF3\uDCF4\uDD31\uDCDB\uDD30\uDD1F-\uDD24\uDD34\uDFE0-\uDFE2\uDD35\uDFE3-\uDFE5\uDFE7-\uDFE9\uDFE6\uDFEA\uDFEB\uDD36-\uDD3B\uDCA0\uDD18\uDD33\uDD32\uDEA9])|\uD83E(?:[\uDD1A\uDD0F\uDD1E\uDD1F\uDD18\uDD19\uDD1B\uDD1C\uDD32\uDD33\uDDB5\uDDB6\uDDBB\uDDD2](?:\uD83C[\uDFFB-\uDFFF])?|\uDDD1(?:(?:\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:\uD83E(?:\uDD1D\u200D\uD83E\uDDD1\uD83C[\uDFFB-\uDFFF]|[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD])|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92]|\u2708\uFE0F?))?)|\u200D(?:\uD83E(?:\uDD1D\u200D\uD83E\uDDD1|[\uDDB0\uDDB1\uDDB3\uDDB2\uDDAF\uDDBC\uDDBD])|\u2695\uFE0F?|\uD83C[\uDF93\uDFEB\uDF3E\uDF73\uDFED\uDFA4\uDFA8]|\u2696\uFE0F?|\uD83D[\uDD27\uDCBC\uDD2C\uDCBB\uDE80\uDE92]|\u2708\uFE0F?)))?|[\uDDD4\uDDD3](?:\uD83C[\uDFFB-\uDFFF])?|[\uDDCF\uDD26\uDD37](?:(?:\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|[\uDD34\uDDD5\uDD35\uDD30\uDD31\uDD36](?:\uD83C[\uDFFB-\uDFFF])?|[\uDDB8\uDDB9\uDDD9-\uDDDD](?:(?:\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|[\uDDDE\uDDDF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?|[\uDDCD\uDDCE\uDDD6\uDDD7\uDD38](?:(?:\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|\uDD3C(?:\u200D(?:[\u2642\u2640]\uFE0F?))?|[\uDD3D\uDD3E\uDD39\uDDD8](?:(?:\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|[\uDD23\uDD70\uDD29\uDD2A\uDD11\uDD17\uDD2D\uDD2B\uDD14\uDD10\uDD28\uDD25\uDD24\uDD12\uDD15\uDD22\uDD2E\uDD27\uDD75\uDD76\uDD74\uDD2F\uDD20\uDD73\uDD13\uDDD0\uDD7A\uDD71\uDD2C\uDD21\uDD16\uDDE1\uDD0E\uDD0D\uDD1D\uDDBE\uDDBF\uDDE0\uDDB7\uDDB4\uDD3A\uDDB0\uDDB1\uDDB3\uDDB2\uDD8D\uDDA7\uDDAE\uDD8A\uDD9D\uDD81\uDD84\uDD93\uDD8C\uDD99\uDD92\uDD8F\uDD9B\uDD94\uDD87\uDDA5\uDDA6\uDDA8\uDD98\uDDA1\uDD83\uDD85\uDD86\uDDA2\uDD89\uDDA9\uDD9A\uDD9C\uDD8E\uDD95\uDD96\uDD88\uDD8B\uDD97\uDD82\uDD9F\uDDA0\uDD40\uDD6D\uDD5D\uDD65\uDD51\uDD54\uDD55\uDD52\uDD6C\uDD66\uDDC4\uDDC5\uDD5C\uDD50\uDD56\uDD68\uDD6F\uDD5E\uDDC7\uDDC0\uDD69\uDD53\uDD6A\uDD59\uDDC6\uDD5A\uDD58\uDD63\uDD57\uDDC8\uDDC2\uDD6B\uDD6E\uDD5F-\uDD61\uDD80\uDD9E\uDD90\uDD91\uDDAA\uDDC1\uDD67\uDD5B\uDD42\uDD43\uDD64\uDDC3\uDDC9\uDDCA\uDD62\uDD44\uDDED\uDDF1\uDDBD\uDDBC\uDE82\uDDF3\uDE90\uDDE8\uDDE7\uDD47-\uDD49\uDD4E\uDD4F\uDD4D\uDD4A\uDD4B\uDD45\uDD3F\uDD4C\uDE80\uDE81\uDDFF\uDDE9\uDDF8\uDDF5\uDDF6\uDD7D\uDD7C\uDDBA\uDDE3-\uDDE6\uDD7B\uDE71-\uDE73\uDD7E\uDD7F\uDE70\uDDE2\uDE95\uDD41\uDDEE\uDE94\uDDFE\uDE93\uDDAF\uDDF0\uDDF2\uDDEA-\uDDEC\uDE78-\uDE7A\uDE91\uDE92\uDDF4\uDDF7\uDDF9-\uDDFD\uDDEF])|[\u263A\u2639\u2620\u2763\u2764]\uFE0F?|\u270B(?:\uD83C[\uDFFB-\uDFFF])?|[\u270C\u261D](?:(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F))?|\u270A(?:\uD83C[\uDFFB-\uDFFF])?|\u270D(?:(?:\uD83C[\uDFFB-\uDFFF]|\uFE0F))?|\uD83C(?:\uDF85(?:\uD83C[\uDFFB-\uDFFF])?|\uDFC3(?:(?:\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|[\uDFC7\uDFC2](?:\uD83C[\uDFFB-\uDFFF])?|\uDFCC(?:(?:\uFE0F(?:\u200D(?:[\u2642\u2640]\uFE0F?))?|\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|[\uDFC4\uDFCA](?:(?:\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|\uDFCB(?:(?:\uFE0F(?:\u200D(?:[\u2642\u2640]\uFE0F?))?|\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|[\uDFF5\uDF36\uDF7D\uDFD4-\uDFD6\uDFDC-\uDFDF\uDFDB\uDFD7\uDFD8\uDFDA\uDFD9\uDFCE\uDFCD\uDF21\uDF24-\uDF2C\uDF97\uDF9F\uDF96\uDF99-\uDF9B\uDF9E\uDFF7\uDD70\uDD71\uDD7E\uDD7F\uDE02\uDE37]\uFE0F?|\uDFF4(?:(?:\u200D\u2620\uFE0F?|\uDB40\uDC67\uDB40\uDC62\uDB40(?:\uDC65\uDB40\uDC6E\uDB40\uDC67\uDB40\uDC7F|\uDC73\uDB40\uDC63\uDB40\uDC74\uDB40\uDC7F|\uDC77\uDB40\uDC6C\uDB40\uDC73\uDB40\uDC7F)))?|\uDFF3(?:(?:\uFE0F(?:\u200D\uD83C\uDF08)?|\u200D\uD83C\uDF08))?|\uDDE6\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF]|\uDDE7\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF]|\uDDE8\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF]|\uDDE9\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF]|\uDDEA\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA]|\uDDEB\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7]|\uDDEC\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE]|\uDDED\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA]|\uDDEE\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9]|\uDDEF\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5]|\uDDF0\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF]|\uDDF1\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE]|\uDDF2\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF]|\uDDF3\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF]|\uDDF4\uD83C\uDDF2|\uDDF5\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE]|\uDDF6\uD83C\uDDE6|\uDDF7\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC]|\uDDF8\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF]|\uDDF9\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF]|\uDDFA\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF]|\uDDFB\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA]|\uDDFC\uD83C[\uDDEB\uDDF8]|\uDDFD\uD83C\uDDF0|\uDDFE\uD83C[\uDDEA\uDDF9]|\uDDFF\uD83C[\uDDE6\uDDF2\uDDFC]|[\uDFFB-\uDFFF\uDF38-\uDF3C\uDF37\uDF31-\uDF35\uDF3E-\uDF43\uDF47-\uDF53\uDF45\uDF46\uDF3D\uDF44\uDF30\uDF5E\uDF56\uDF57\uDF54\uDF5F\uDF55\uDF2D-\uDF2F\uDF73\uDF72\uDF7F\uDF71\uDF58-\uDF5D\uDF60\uDF62-\uDF65\uDF61\uDF66-\uDF6A\uDF82\uDF70\uDF6B-\uDF6F\uDF7C\uDF75\uDF76\uDF7E\uDF77-\uDF7B\uDF74\uDFFA\uDF0D-\uDF10\uDF0B\uDFE0-\uDFE6\uDFE8-\uDFED\uDFEF\uDFF0\uDF01\uDF03-\uDF07\uDF09\uDFA0-\uDFA2\uDFAA\uDF11-\uDF20\uDF0C\uDF00\uDF08\uDF02\uDF0A\uDF83\uDF84\uDF86-\uDF8B\uDF8D-\uDF91\uDF80\uDF81\uDFAB\uDFC6\uDFC5\uDFC0\uDFD0\uDFC8\uDFC9\uDFBE\uDFB3\uDFCF\uDFD1-\uDFD3\uDFF8\uDFA3\uDFBD\uDFBF\uDFAF\uDFB1\uDFAE\uDFB0\uDFB2\uDCCF\uDC04\uDFB4\uDFAD\uDFA8\uDF92\uDFA9\uDF93\uDFBC\uDFB5\uDFB6\uDFA4\uDFA7\uDFB7-\uDFBB\uDFA5\uDFAC\uDFEE\uDFF9\uDFE7\uDFA6\uDD8E\uDD91-\uDD9A\uDE01\uDE36\uDE2F\uDE50\uDE39\uDE1A\uDE32\uDE51\uDE38\uDE34\uDE33\uDE3A\uDE35\uDFC1\uDF8C])|\u26F7\uFE0F?|\u26F9(?:(?:\uFE0F(?:\u200D(?:[\u2642\u2640]\uFE0F?))?|\uD83C(?:[\uDFFB-\uDFFF](?:\u200D(?:[\u2642\u2640]\uFE0F?))?)|\u200D(?:[\u2642\u2640]\uFE0F?)))?|[\u2618\u26F0\u26E9\u2668\u26F4\u2708\u23F1\u23F2\u2600\u2601\u26C8\u2602\u26F1\u2744\u2603\u2604\u26F8\u2660\u2665\u2666\u2663\u265F\u26D1\u260E\u2328\u2709\u270F\u2712\u2702\u26CF\u2692\u2694\u2699\u2696\u26D3\u2697\u26B0\u26B1\u26A0\u2622\u2623\u2B06\u2197\u27A1\u2198\u2B07\u2199\u2B05\u2196\u2195\u2194\u21A9\u21AA\u2934\u2935\u269B\u2721\u2638\u262F\u271D\u2626\u262A\u262E\u25B6\u23ED\u23EF\u25C0\u23EE\u23F8-\u23FA\u23CF\u2640\u2642\u2695\u267E\u267B\u269C\u2611\u2714\u2716\u303D\u2733\u2734\u2747\u203C\u2049\u3030\u00A9\u00AE\u2122]\uFE0F?|[\u0023\u002A\u0030-\u0039](?:\uFE0F\u20E3|\u20E3)|[\u2139\u24C2\u3297\u3299\u25FC\u25FB\u25AA\u25AB]\uFE0F?|[\u2615\u26EA\u26F2\u26FA\u26FD\u2693\u26F5\u231B\u23F3\u231A\u23F0\u2B50\u26C5\u2614\u26A1\u26C4\u2728\u26BD\u26BE\u26F3\u267F\u26D4\u2648-\u2653\u26CE\u23E9-\u23EC\u2B55\u2705\u274C\u274E\u2795-\u2797\u27B0\u27BF\u2753-\u2755\u2757\u26AB\u26AA\u2B1B\u2B1C\u25FE\u25FD])$/;
  687. }
  688. getGroupParticipants(participants) {
  689. var adminbadge = '';
  690. var style = "";
  691. var contactInfo = Components.Chat.contacts.find(x => x.contactId == participants.recipientId);
  692. var options = '<a href="javascript:;" onclick="Unibase.Platform.Connect.Components.Chat.Instance().adminOptions()" data-isadmin=' + participants.isAdmin + ' data-contactid=' + contactInfo.contactId + ' data-chatGroupId=' + contactInfo.chatGroupId + ' class="dotsicon btn btn-flush-biz-theme btn-icon btn-rounded flush-soft-hover d-26 flex-shrink-0 fromParticipant_' + contactInfo.contactId + '" data-toggle="dropdown" role = "button" aria-haspopup="false" aria-expanded="false" > ' +
  693. '<span class="btn-icon-wrap"><i class="icon dripicons-dots-3 rotate-90d font-20 text-dark"></i></span>' +
  694. '<div class="dropdown-menu-right dropdown-menu grpoptionshtml" id ="drpdownmenu"></div></a>';
  695. if (participants.recipientId == Components.Chat.currentUser.userId) {
  696. contactInfo.contactName = "You";
  697. options = "";
  698. participants.isAdmin ? $('.btn_AddChatParticipants').removeClass('hidden') : "";
  699. }
  700. if (participants.isAdmin) {
  701. style = 'style="position:absolute;right:26px"';
  702. adminbadge = '<span class="badge badge-sm badge-soft-primary font-10 recipientbadge" ' + style + '>Admin</span>';
  703. }
  704. const avatarHtml = this.getUserAvatarHtml(contactInfo);
  705. const _template = `<li class="list-group-item px-1 py-2 flex-between-center position-relative grp_participents isadmin_${participants.isAdmin} participant_${participants.recipientId}" data-contactname='${contactInfo.contactName}' data-isAdmin=${participants.isAdmin} id="groupParticipantUser_${contactInfo.contactId}">
  706. <a href ="javascript:;" class="d-flex align-items-center c-gap-10 participent w-100 mnw-0">${avatarHtml}
  707. <div class="media-body flex-grow-1 mnw-0 d-flex flex-column justify-content-center">
  708. <label id="contactid" class="hidden">${contactInfo.contactId}</label>
  709. <input type="hidden" class="contactname_hidden_${contactInfo.contactName}" value="${contactInfo.contactId}"><div class="name flex-between-center c-gap-10 text-dark font-weight-500 font-15" id="contactName_${contactInfo.contactId}" title="${contactInfo.contactName}"><span class="text-truncate">${contactInfo.contactName}</span> ${adminbadge}</div>
  710. <div class="user-about hidden"></div>
  711. </div>
  712. </a>${options}</li>`;
  713. return _template;
  714. }
  715. getRecentChatsTemplate(chatInfo) {
  716. var instance = this;
  717. var { chatGroupId, contactName, isPrivate, contactId, lastMessage, messageLastUpdatedDate, unReadMessagesCount, isMute } = chatInfo;
  718. var msg = lastMessage;
  719. const avatarHtml = instance.getUserAvatarHtml(chatInfo, true);
  720. msg == '' ? messageLastUpdatedDate = '' : messageLastUpdatedDate = messageLastUpdatedDate;
  721. if (chatInfo.lastMessage == null) {
  722. msg = '';
  723. }
  724. if (chatGroupId == 0) {
  725. chatGroupId = contactId;
  726. }
  727. var unreadbadge = "";
  728. if (unReadMessagesCount > 0) {
  729. unreadbadge = `<span class="badge badge-sm badge-primary unread_messages_${chatGroupId} rounded-10 font-10">${unReadMessagesCount}</span>`;
  730. }
  731. var msgdate = "";
  732. if (messageLastUpdatedDate != undefined && messageLastUpdatedDate != '') {
  733. msgdate = Components.Chat.Instance().timeAnddateFormat(messageLastUpdatedDate);
  734. msgdate = (msgdate == "Invalid date") ? messageLastUpdatedDate : msgdate;
  735. }
  736. var _template = `<li class="userChat_${chatGroupId} recentchats list-group-item chat-group-item pa-0" data-contactname=${contactName}>
  737. <a href="javascript:void(0);" data-isprivate=${isPrivate} data-chatgroupid=${chatGroupId} data-contactId=${contactId} class="media contactuser d-flex px-1 py-2 c-gap-10 chatUserList" onclick="Unibase.Platform.Connect.Components.Chat.Instance().privatewindow(${chatGroupId})" id="msgConvoItem_${chatGroupId}"><div class="d-flex align-items-center c-gap-10 flex-grow-1 mnw-0">${avatarHtml}
  738. <div class="media-body mnw-0 flex-grow-1"><div class="username text-dark grpname_${chatGroupId} font-weight-500 font-15 text-truncate" title="${contactName}">${contactName}</div><div class="user-last-chat_${chatGroupId} last-chat-msg" title="${msg}">${msg}</div><div class="text-green font-12 text-truncate w-80p typing_active_${chatGroupId} hidden" data-typingcontacts=''><strong>typing...</strong></div></div></div>
  739. <div class="chat-details flex-shrink-0 d-flex flex-column justify-content-between align-items-end r-gap-5"><div class="last-chat-time font-11 ${!msgdate ? 'hidden' : ''}">${msgdate}</div><div class="d-flex align-items-end c-gap-10"><i class="zmdi zmdi-volume-off mute-status-icon font-16 ${!isMute ? 'hidden' : ''}"></i> ${unreadbadge}</div></div></a></li>`;
  740. return _template;
  741. }
  742. getWebCamHtml() {
  743. return `<div class="web_cam position-relative biz-bg-hightlight-color_10 h-100"><span class="back_btn position-absolute r-0 bg-trans-dark-50 d-26 z-index-1 flex-center"><a href="javascript:;" onclick="Unibase.Platform.Connect.Components.Chat.Instance().closecam();" title="Close"><i class="icon dripicons-cross text-white font-18"></i></a></span><div class="cam_hidden flex-center h-100"><video id="cam_pic" autoplay="true" class="w-100 h-100" style="object-fit: fill"></video><div id="camErrMsg" class="hidden text-danger text-center"></div></div><center class="camera-controls bg-trans-dark-50" id="camerControls"><a class="back_cam d-none" href="javascript:;" onclick="Unibase.Platform.Connect.Components.Chat.Instance().back_tocam();"><i class="las la-arrow-left"></i></a><a href="javascript:;" class="btn-file" onclick="Unibase.Platform.Connect.Components.Chat.Instance().webcampicture();"><i class="las la-camera"></i></a><a href="javascript:;" class="send_pic d-none" onclick="Unibase.Platform.Connect.Components.Chat.Instance().webcamimage();"><i class="las la-caret-right"></i></a></center><div class="canvas_hidden w-100 h-100 hidden"><canvas id="chat_size" class="hidden border w-100 h-100"></canvas><img id="cam_image" class="cam_data w-100 h-100"></div></div>`;
  744. }
  745. static Instance() {
  746. if (this.instance === undefined)
  747. this.instance = new ChatTemplate();
  748. return this.instance;
  749. }
  750. }
  751. Components.ChatTemplate = ChatTemplate;
  752. })(Components = Connect.Components || (Connect.Components = {}));
  753. })(Connect = Platform.Connect || (Platform.Connect = {}));
  754. })(Platform = Unibase.Platform || (Unibase.Platform = {}));
  755. })(Unibase || (Unibase = {}));