diff --git a/assets/js/aap/aap.js b/assets/js/aap/aap.js index a312386f92bcafde3f109f8adf6213e0d5e929a8..6f0e4844a4e40322013ab6933c39b37b446304db 100755 --- a/assets/js/aap/aap.js +++ b/assets/js/aap/aap.js @@ -5923,6 +5923,16 @@ var aapObj = { canAddCard: isContributor, canEditHeader: isContributor, editable: isContributor, + enableMention: true, + canContributes: Object.keys(projectContributors).map(key => { + const contributor = projectContributors[key]; + return { + id: key, + name: contributor.name, + alias: contributor.username, + image: contributor.image + }; + }), onParticipate: function (data) { var contributors = data.contributors.map(contributor => contributor.id); var index = contributors.indexOf(userId); @@ -6088,59 +6098,54 @@ var aapObj = { status: created.header, parentId: projectId, parentType: 'projects', - component: 'kanban' + component: 'kanban', + mentions: created.contributors.map(c => c.alias), }; if (wsCO && wsCO.id) post.emiter = wsCO.id; + const is_contributor = created.contributors.some(s => s.id === userId); coInterface.actions.request_create_action(post).then(function (response) { - if (response.success) { - // send create notification - var id_at_kanban = created.id; - created.id = response.data._id.$id; - created.actions = [{ - icon: 'fa fa-archive', - bstooltip: { text: trad.delete, position: 'top' }, - action: 'onCardArchiveClick', - bstooltip: { text: trad['Archive'], position: 'top' } - }, { icon: 'fa fa-commenting', badge: '0', action: 'onCardCommentClick' }, { - icon: 'fa fa-picture-o', - badge: '0', - action: 'onCardPictureClick', - hideCondition: { badge: '0' } - }, - { - icon: 'fa fa-file', - badge: '0', - action: 'onCardFileClick', - hideCondition: { badge: '0' } + // send create notification + var id_at_kanban = created.id; + created.id = response._id.$id; + created.actions = [{ + icon: 'fa fa-archive', + bstooltip: { text: trad.delete, position: 'top' }, + action: 'onCardArchiveClick', + bstooltip: { text: trad['Archive'], position: 'top' } + }, { icon: 'fa fa-commenting', badge: '0', action: 'onCardCommentClick' }, { + icon: 'fa fa-picture-o', + badge: '0', + action: 'onCardPictureClick', + hideCondition: { badge: '0' } + }, + { + icon: 'fa fa-file', + badge: '0', + action: 'onCardFileClick', + hideCondition: { badge: '0' } + }, + { + badge: '0/0', + className: 'kanban-no-task-action' + }, { + icon: `fa ${is_contributor ? "fa-unlink" : "fa-link"}`, + bstooltip: { + text: is_contributor ? coTranslate("Quit") : coTranslate("Participate"), + position: 'top' }, - { - badge: '0/0', - className: 'kanban-no-task-action' - }, { - icon: 'fa fa-link', - bstooltip: { - text: coTranslate('Participate'), - position: 'top' - }, - action: 'onParticipate' - }]; - $(container).kanban('setData', { column: created.header, id: id_at_kanban, data: created }); - coInterface.actions.update_action_position({ - action: created.id, - group: created.header, - emiter: wsCO && wsCO.id ? wsCO.id : null, - component: 'kanban', - server_url: baseUrl - }).then(); - } - else - toastr.error(coTranslate(response.data)); + action: 'onParticipate' + }]; + $(container).kanban('setData', { column: created.header, id: id_at_kanban, data: created }); + coInterface.actions.update_action_position({ + action: created.id, + group: created.header, + emiter: wsCO && wsCO.id ? wsCO.id : null, + component: 'kanban', + server_url: baseUrl + }).then(); }).catch(function (error) { - if (error && error.data) - toastr.error(coTranslate(error.data)); - else - mylog.error(error); + mylog.error(error); }); }, onHeaderChange: function (changedHeader) { @@ -6202,7 +6207,9 @@ var aapObj = { text: trad.yes, btnClass: 'btn btn-warning', action: function () { - coInterface.actions.request_archive(action.id).then(); + coInterface.actions.request_archive(action.id).then(() => { + kanbanContainerDom.kanban("deleteData", action) + }); } } } @@ -6217,6 +6224,26 @@ var aapObj = { ajaxPost(null, url, post, function (html) { $('#action-modal-preview').empty().html(html); }, null, 'text'); + }, + onContributorRemove: arg => { + const was_contributor = arg.contributor.id === userId; + const data = $.extend({}, arg.card, {actions: arg.card.actions.map(m => { + if (m.action === "onParticipate") { + m.icon = `fa ${was_contributor ? "fa-link" : "fa-unlink"}`; + m.bstooltip.text = was_contributor ? coTranslate("Participate") : coTranslate("Quit"); + } + return m; + })}); + if (was_contributor) { + kanbanContainerDom.kanban("setData", { + id: arg.card.id, + data: data, + }) + } + coInterface.actions.request_participation({ + action: arg.card.id, + contributors: arg.card.contributors.map(c => c.id), + }).then(r => toastr.success("La liste de contributeur a été mise à jour.")); } }); $(document.body).off('action.set-contributor').on('action.set-contributor', function (event, data) { diff --git a/assets/js/co.js b/assets/js/co.js index 4d1c74d516fc527bb0dd45ed4b68310d090ec6de..ee55bfba35dd73783e1b0b03d12e636e0f680bb4 100755 --- a/assets/js/co.js +++ b/assets/js/co.js @@ -1837,20 +1837,21 @@ var coInterface = { }); }, request_create_action: function (post) { - var url = baseUrl; + var url = "/costum/project/action/request/new"; return new Promise(function (resolve, reject) { if (typeof post !== 'object' || !post) reject({ - success: false, - data: 'Empty parameter' + side: "client", + msg: 'Empty parameter', + fn: "request_create_action", }); else { - if (post.serverUrl) { - url = post.serverUrl; - delete post.serverUrl; - } - url += '/costum/project/action/request/new'; + if (post.server_url) { + url = post.server_url + url; + delete post.server_url; + } else + url = baseUrl + url; var key_list = ['name', 'status', 'parentId', 'parentType']; var ft = { success: true, data: [] }; key_list.forEach(function (key_item) { @@ -1862,8 +1863,28 @@ var coInterface = { if (!ft.success) ft.data = 'Missing parameters : ' + ft.data.join(', ') + '.'; if (!ft.success) - reject(ft); - ajaxPost(null, url, post, resolve, reject); + reject({ + side: "client", + msg: ft.data, + fn: "request_create_action", + }); + else + ajaxPost(null, url, post, response => { + if (response.success) + resolve(response.content); + else + reject({ + side: "server", + msg: response.content, + fn: "request_create_action", + }); + }, (xhr, status, error) => { + reject({ + side: "server", + msg: error, + fn: "request_create_action", + }); + }); } }); }, @@ -1948,10 +1969,26 @@ var coInterface = { }, request_participation: function (args) { return new Promise(function (resolve, reject) { + const fn = "request_participation"; + if (typeof args !== 'object' || !args) - reject('Undefined argument'); - else if (typeof args.action === 'undefined' || typeof args.contributor === 'undefined') - reject('Argument error'); + reject({ + side: "client", + msg: "Argument format error", + fn, + }); + else if (typeof args.action === 'undefined') + reject({ + side: "client", + msg: "Undefined action id", + fn, + }); + else if (typeof args.contributor === "undefined" && typeof args.contributors === "undefined") + reject({ + side: "client", + msg: "Should provide contributor id(s)", + fn, + }); else { var url = baseUrl; if (typeof args.server_url === 'string') @@ -1959,13 +1996,17 @@ var coInterface = { url += '/costum/project/action/request/set_contributors'; var post = { action: args.action, - contributor: args.contributor, emiter: wsCO && wsCO.id ? wsCO.id : '' }; - if (typeof args.participate === 'number') - post.participate = args.participate; - else - post.participate = 0; + if (typeof args.contributors === "object") + post.contributors = args.contributors; + else if (typeof args.contributor === "string") { + post.contributor = args.contributor; + if (typeof args.participate === 'number') + post.participate = args.participate; + else + post.participate = 0; + } ajaxPost(null, url, post, resolve, reject); } }); diff --git a/assets/js/directory/directorySocket.js b/assets/js/directory/directorySocket.js index fb9d90c1b9105a0c308f79bcf35a6c245df86c72..350235a1d788e620442cc6a21b64aa317973c260 100644 --- a/assets/js/directory/directorySocket.js +++ b/assets/js/directory/directorySocket.js @@ -35,6 +35,12 @@ var directorySocket = { filterGroup.results.$grid.masonry('destroy'); filterGroup.results.$grid.masonry({itemSelector: '.smartgrid-slide-element', 'columnWidth': '.searchEntityContainer.smartgrid-slide-element'}); + targetDiv = document.querySelector(`.msr-id-${_id}`); + let image = targetDiv.querySelectorAll('img.lzy_img'); + image.forEach((v) => { + v.dom = "#content-results-profil"; + imageObserver.observe(v); + }); directory.bindEventAdmin(); if(filterGroup.results.map.active){ filterGroup.mapObj.addElts(datas); @@ -90,12 +96,41 @@ var directorySocket = { window[`kanbanDom${contextData.id}`].kanban('deleteData', { column: "memberof", id:_id, index: indexToDelete }); } }).on("invite_user", function(data){ - + let show = false; if(data.invitedId == userId) { directorySocket.events.invitedMe(); } - if(typeof data.donne != "undefined" && data.donne != null){ + if( + typeof userConnected.roles != "undefined" && typeof userConnected.roles.superAdmin != "undefined" && userConnected.roles.superAdmin + ){ + show = true; + }else if(contextData.type == "organizations"){ + if(typeof userConnected.links.memberOf[contextData.id] != "undefined" + && typeof userConnected.links.memberOf[contextData.id].isAdmin != "undefined" + && userConnected.links.memberOf[contextData.id].isAdmin + && (typeof userConnected.links.memberOf[contextData.id].isAdminPending == "undefined" || typeof userConnected.links.memberOf[contextData.id].isInviting == "undefined") + ){ + show = true; + } + }else if(contextData.type == "projects"){ + if(typeof userConnected.links.projects[contextData.id] != "undefined" + && typeof userConnected.links.projects[contextData.id].isAdmin != "undefined" + && userConnected.links.projects[contextData.id].isAdmin + && (typeof userConnected.links.projects[contextData.id].isAdminPending == "undefined" || typeof userConnected.links.projects[contextData.id].isInviting == "undefined") + ){ + show = true; + } + }else if(contextData.type == "organizations"){ + if(typeof userConnected.links.memberOf[contextData.id] != "undefined" + && typeof userConnected.links.memberOf[contextData.id].isAdmin != "undefined" + && userConnected.links.memberOf[contextData.id].isAdmin + && (typeof userConnected.links.memberOf[contextData.id].isAdminPending == "undefined" || typeof userConnected.links.memberOf[contextData.id].isInviting == "undefined") + ){ + show = true; + } + } + if(typeof data.donne != "undefined" && data.donne != null && show){ let donne = data.donne; let datas = {}; @@ -103,14 +138,18 @@ var directorySocket = { let community = directorySocket.events.communityVariable(donne, data.invitedId); let str = directory.showResultsDirectoryHtml(datas, "", "", community); - directorySocket.events.updateNomberElements(datas, "add"); + var targetDiv = document.querySelector(`.msr-id-${data.invitedId}`); + if (targetDiv) { + targetDiv.parentElement.remove(); + } else { + directorySocket.events.updateNomberElements(datas, "add"); + } filterGroup.results.$grid.prepend(str); filterGroup.results.$grid.masonry('destroy'); filterGroup.results.$grid.masonry({itemSelector: '.smartgrid-slide-element', 'columnWidth': '.searchEntityContainer.smartgrid-slide-element'}); - var targetDiv = document.querySelector(`.msr-id-${data.invitedId}`); - + targetDiv = document.querySelector(`.msr-id-${data.invitedId}`); var newSpan = document.createElement('span'); newSpan.className = 'entityStatusLink italic'; newSpan.textContent = 'Invitation envoyée'; @@ -119,6 +158,12 @@ var directorySocket = { var textWrap = slideHover.querySelector('.text-wrap'); var adminToolBar = slideHover.querySelector('.adminToolBarDirectory'); + let image = targetDiv.querySelectorAll('img.lzy_img'); + image.forEach((v) => { + v.dom = "#content-results-profil"; + imageObserver.observe(v); + }); + directory.bindEventAdmin(); textWrap.insertBefore(newSpan, adminToolBar); } @@ -484,12 +529,42 @@ var directorySocket = { let community = { connectType : "members", - edit : true, links : { "members" : {} } }; + if( + typeof userConnected.roles != "undefined" && typeof userConnected.roles.superAdmin != "undefined" && userConnected.roles.superAdmin + ){ + community.edit = true; + }else if(contextData.type == "organizations"){ + if(typeof userConnected.links.memberOf[contextData.id] != "undefined" + && typeof userConnected.links.memberOf[contextData.id].isAdmin != "undefined" + && userConnected.links.memberOf[contextData.id].isAdmin + && (typeof userConnected.links.memberOf[contextData.id].isAdminPending == "undefined" || typeof userConnected.links.memberOf[contextData.id].isInviting == "undefined") + ){ + community.edit = true; + } + }else if(contextData.type == "projects"){ + if(typeof userConnected.links.projects[contextData.id] != "undefined" + && typeof userConnected.links.projects[contextData.id].isAdmin != "undefined" + && userConnected.links.projects[contextData.id].isAdmin + && (typeof userConnected.links.projects[contextData.id].isAdminPending == "undefined" || typeof userConnected.links.projects[contextData.id].isInviting == "undefined") + ){ + community.edit = true; + } + }else if(contextData.type == "events"){ + if(typeof userConnected.links.events[contextData.id] != "undefined" + && typeof userConnected.links.events[contextData.id].isAdmin != "undefined" + && userConnected.links.events[contextData.id].isAdmin + && (typeof userConnected.links.events[contextData.id].isAdminPending == "undefined" || typeof userConnected.links.events[contextData.id].isInviting == "undefined") + ){ + community.edit = true; + } + } + + community.links["members"][_id] = { type: data.collection, date : data.modified @@ -498,11 +573,12 @@ var directorySocket = { return community; }, updateNomberElements: function(datas, type) { - let aElement = document.querySelector('a[data-type-dir="members"]'); - let badgeElement = aElement.querySelector('.badge'); - let newNbbadge = type == "add" ? Object.keys(datas).length + parseInt(badgeElement.textContent) : parseInt(badgeElement.textContent) - 1; - badgeElement.textContent = newNbbadge; - + if(contextData.type == "organizations" || contextData.type == "projects"){ + let aElement = document.querySelector(`a[data-type-dir="${contextData.type == "organizations" ? "members" : "contributors"}"]`); + let badgeElement = aElement.querySelector('.badge'); + let newNbbadge = type == "add" ? Object.keys(datas).length + parseInt(badgeElement.textContent) : parseInt(badgeElement.textContent) - 1; + badgeElement.textContent = newNbbadge; + } let spanElement = document.querySelector('.count-nbr'); let nbnewdata = type == "add" ? Object.keys(datas).length + parseInt(spanElement.textContent) : parseInt(spanElement.textContent) - 1; spanElement.textContent = nbnewdata; diff --git a/views/admin/communityMailing.php b/views/admin/communityMailing.php index 99d345948a83a2c450784aa639f9054359b4385c..4cf98404ee268ecb0ebcb72938334476285ca741 100755 --- a/views/admin/communityMailing.php +++ b/views/admin/communityMailing.php @@ -378,7 +378,7 @@ jQuery(document).ready(function() { collection:costum.contextType, path:"allToRoot", value:listInvitation, - updateCache : true + // updateCache : true }, function(){}); }, function(data){ diff --git a/views/admin/index.php b/views/admin/index.php index 88fc372b67b0fa0c274d5b4d1fe9bf023f9b2f28..84ee6595bf616b7ff6141b4fae6e7e1e4e330158 100755 --- a/views/admin/index.php +++ b/views/admin/index.php @@ -76,7 +76,7 @@ .admin-menu-item { text-align: left; padding: 10px 20px 10px 30px; - border-bottom: 1px solid; + /* border-bottom: 1px solid; */ } .admin-menu-item.active, .admin-menu-item:hover { background-color: #d4e1ea; @@ -359,7 +359,7 @@ <br> <br> <div class="col-xs-12 col-sm-12 no-padding text-center "> - <img src="<?php echo Yii::app()->theme->baseUrl.'/assets/img/admin.gif'; ?>" class="" style="width: 70%"> + <img src="<?php echo Yii::app()->theme->baseUrl.'/assets/img/admin.png'; ?>" class="" style="width: 80%"> </div> <?php } ?> <!--<div class="col-xs-12 col-sm-offset-1 col-sm-10 shadow2 bg-white margin-top-35">