Built files from Bizgaze WebServer
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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 = {}));