From 9ebe519900d4662b5fe79174900e4b6e1484a0d7 Mon Sep 17 00:00:00 2001 From: Reinaldo Neto Date: Thu, 22 Jul 2021 12:05:35 -0300 Subject: [PATCH 1/5] [FIX] Permissions to edit livechat --- app/lib/methods/getPermissions.js | 3 ++- app/views/RoomInfoView/index.js | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/app/lib/methods/getPermissions.js b/app/lib/methods/getPermissions.js index 1c4c56b46b5..d7626c71756 100644 --- a/app/lib/methods/getPermissions.js +++ b/app/lib/methods/getPermissions.js @@ -48,7 +48,8 @@ const PERMISSIONS = [ 'view-user-administration', 'view-all-teams', 'view-all-team-channels', - 'convert-team' + 'convert-team', + 'edit-omnichannel-contact' ]; export async function setPermissions() { diff --git a/app/views/RoomInfoView/index.js b/app/views/RoomInfoView/index.js index a966463bf65..79f720ad62b 100644 --- a/app/views/RoomInfoView/index.js +++ b/app/views/RoomInfoView/index.js @@ -55,6 +55,7 @@ class RoomInfoView extends React.Component { isMasterDetail: PropTypes.bool, jitsiEnabled: PropTypes.bool, editRoomPermission: PropTypes.array, + editLiveChatPermission: PropTypes.array, roles: PropTypes.array } @@ -184,7 +185,7 @@ class RoomInfoView extends React.Component { loadRoom = async() => { const { room: roomState } = this.state; - const { route, editRoomPermission } = this.props; + const { route, editRoomPermission, editLiveChatPermission } = this.props; let room = route.params?.room; if (room && room.observe) { this.roomObservable = room.observe(); @@ -204,7 +205,9 @@ class RoomInfoView extends React.Component { } } - const permissions = await RocketChat.hasPermission([editRoomPermission], room.rid); + const permissionToEdit = this.isLivechat ? editLiveChatPermission : editRoomPermission; + + const permissions = await RocketChat.hasPermission([permissionToEdit], room.rid); if (permissions[0]) { this.setState({ showEdit: true }, () => this.setHeader()); } @@ -370,6 +373,7 @@ const mapStateToProps = state => ({ isMasterDetail: state.app.isMasterDetail, jitsiEnabled: state.settings.Jitsi_Enabled || false, editRoomPermission: state.permissions['edit-room'], + editLiveChatPermission: state.permissions['edit-omnichannel-contact'], roles: state.roles }); From 1e70f49ce987a74a1c889a317348a8e2c0767db9 Mon Sep 17 00:00:00 2001 From: Reinaldo Neto Date: Sat, 24 Jul 2021 15:49:39 -0300 Subject: [PATCH 2/5] [FIX] Custom fields labels and values --- app/views/LivechatEditView.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/LivechatEditView.js b/app/views/LivechatEditView.js index 6ba4143e740..ea5600cb2bf 100644 --- a/app/views/LivechatEditView.js +++ b/app/views/LivechatEditView.js @@ -54,12 +54,12 @@ const LivechatEditView = ({ const visitorCustomFields = result.customFields .filter(field => field.visibility !== 'hidden' && field.scope === 'visitor') .map(field => ({ [field._id]: (visitor.livechatData && visitor.livechatData[field._id]) || '' })) - .reduce((ret, field) => ({ [field]: field, ...ret })); + .reduce((ret, field) => ({ [Object.keys(field)[0]]: Object.values(field)[0], ...ret })); const livechatCustomFields = result.customFields .filter(field => field.visibility !== 'hidden' && field.scope === 'room') .map(field => ({ [field._id]: (livechat.livechatData && livechat.livechatData[field._id]) || '' })) - .reduce((ret, field) => ({ [field]: field, ...ret })); + .reduce((ret, field) => ({ [Object.keys(field)[0]]: Object.values(field)[0], ...ret })); return setCustomFields({ visitor: visitorCustomFields, livechat: livechatCustomFields }); } From c82a2235c9a8eb40b92689577b36d720abfbdc0f Mon Sep 17 00:00:00 2001 From: Reinaldo Neto Date: Mon, 26 Jul 2021 17:26:32 -0300 Subject: [PATCH 3/5] refactor field --- app/views/LivechatEditView.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/LivechatEditView.js b/app/views/LivechatEditView.js index ea5600cb2bf..55724ad8827 100644 --- a/app/views/LivechatEditView.js +++ b/app/views/LivechatEditView.js @@ -54,12 +54,12 @@ const LivechatEditView = ({ const visitorCustomFields = result.customFields .filter(field => field.visibility !== 'hidden' && field.scope === 'visitor') .map(field => ({ [field._id]: (visitor.livechatData && visitor.livechatData[field._id]) || '' })) - .reduce((ret, field) => ({ [Object.keys(field)[0]]: Object.values(field)[0], ...ret })); + .reduce((ret, field) => ({ ...field, ...ret })); const livechatCustomFields = result.customFields .filter(field => field.visibility !== 'hidden' && field.scope === 'room') .map(field => ({ [field._id]: (livechat.livechatData && livechat.livechatData[field._id]) || '' })) - .reduce((ret, field) => ({ [Object.keys(field)[0]]: Object.values(field)[0], ...ret })); + .reduce((ret, field) => ({ ...field, ...ret })); return setCustomFields({ visitor: visitorCustomFields, livechat: livechatCustomFields }); } From 3d9575c155076c4b459ec777d813bb1f2dec2a62 Mon Sep 17 00:00:00 2001 From: Reinaldo Neto Date: Mon, 26 Jul 2021 18:43:00 -0300 Subject: [PATCH 4/5] Added the permission to edit livechat room custom fields --- app/lib/methods/getPermissions.js | 3 ++- app/views/LivechatEditView.js | 24 +++++++++++++++++++++--- app/views/RoomInfoView/index.js | 16 ++++++++++------ 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/app/lib/methods/getPermissions.js b/app/lib/methods/getPermissions.js index d7626c71756..764b725e020 100644 --- a/app/lib/methods/getPermissions.js +++ b/app/lib/methods/getPermissions.js @@ -49,7 +49,8 @@ const PERMISSIONS = [ 'view-all-teams', 'view-all-team-channels', 'convert-team', - 'edit-omnichannel-contact' + 'edit-omnichannel-contact', + 'edit-livechat-room-customfields' ]; export async function setPermissions() { diff --git a/app/views/LivechatEditView.js b/app/views/LivechatEditView.js index 6ba4143e740..78b728489b5 100644 --- a/app/views/LivechatEditView.js +++ b/app/views/LivechatEditView.js @@ -37,10 +37,11 @@ Title.propTypes = { }; const LivechatEditView = ({ - user, navigation, route, theme + user, navigation, route, theme, editOmnichannelContact, editLivechatRoomCustomfields }) => { const [customFields, setCustomFields] = useState({}); const [availableUserTags, setAvailableUserTags] = useState([]); + const [permissions, setPermissions] = useState([]); const params = {}; const inputs = {}; @@ -139,9 +140,15 @@ const LivechatEditView = ({ const onChangeText = (key, text) => { params[key] = text; }; + const getPermissions = async() => { + const permissionsArray = await RocketChat.hasPermission([editOmnichannelContact, editLivechatRoomCustomfields], livechat.rid); + setPermissions(permissionsArray); + }; + useEffect(() => { getAgentDepartments(); getCustomFields(); + getPermissions(); }, []); return ( @@ -162,6 +169,7 @@ const LivechatEditView = ({ onChangeText={text => onChangeText('name', text)} onSubmitEditing={() => { inputs.name.focus(); }} theme={theme} + editable={!!permissions[0]} /> onChangeText('email', text)} onSubmitEditing={() => { inputs.phone.focus(); }} theme={theme} + editable={!!permissions[0]} /> {Object.entries(customFields?.visitor || {}).map(([key, value], index, array) => ( ))} onChangeText('topic', text)} onSubmitEditing={() => inputs.tags.focus()} theme={theme} + editable={!!permissions[1]} /> <TextInput @@ -236,6 +248,7 @@ const LivechatEditView = ({ } }} theme={theme} + editable={!!permissions[1]} /> <Chips items={tagParam.map(tag => ({ text: { text: tag }, value: tag }))} @@ -257,6 +270,7 @@ const LivechatEditView = ({ submit(); }} theme={theme} + editable={!!permissions[1]} /> ))} @@ -274,7 +288,9 @@ LivechatEditView.propTypes = { user: PropTypes.object, navigation: PropTypes.object, route: PropTypes.object, - theme: PropTypes.string + theme: PropTypes.string, + editOmnichannelContact: PropTypes.array, + editLivechatRoomCustomfields: PropTypes.array }; LivechatEditView.navigationOptions = ({ title: I18n.t('Livechat_edit') @@ -282,7 +298,9 @@ LivechatEditView.navigationOptions = ({ const mapStateToProps = state => ({ server: state.server.server, - user: getUserSelector(state) + user: getUserSelector(state), + editOmnichannelContact: state.permissions['edit-omnichannel-contact'], + editLivechatRoomCustomfields: state.permissions['edit-livechat-room-customfields'] }); export default connect(mapStateToProps)(withTheme(LivechatEditView)); diff --git a/app/views/RoomInfoView/index.js b/app/views/RoomInfoView/index.js index 79f720ad62b..6d0918f16af 100644 --- a/app/views/RoomInfoView/index.js +++ b/app/views/RoomInfoView/index.js @@ -55,7 +55,8 @@ class RoomInfoView extends React.Component { isMasterDetail: PropTypes.bool, jitsiEnabled: PropTypes.bool, editRoomPermission: PropTypes.array, - editLiveChatPermission: PropTypes.array, + editOmnichannelContact: PropTypes.array, + editLivechatRoomCustomfields: PropTypes.array, roles: PropTypes.array } @@ -185,7 +186,9 @@ class RoomInfoView extends React.Component { loadRoom = async() => { const { room: roomState } = this.state; - const { route, editRoomPermission, editLiveChatPermission } = this.props; + const { + route, editRoomPermission, editOmnichannelContact, editLivechatRoomCustomfields + } = this.props; let room = route.params?.room; if (room && room.observe) { this.roomObservable = room.observe(); @@ -205,10 +208,10 @@ class RoomInfoView extends React.Component { } } - const permissionToEdit = this.isLivechat ? editLiveChatPermission : editRoomPermission; + const permissionToEdit = this.isLivechat ? [editOmnichannelContact, editLivechatRoomCustomfields] : [editRoomPermission]; - const permissions = await RocketChat.hasPermission([permissionToEdit], room.rid); - if (permissions[0]) { + const permissions = await RocketChat.hasPermission(permissionToEdit, room.rid); + if (permissions.some(Boolean)) { this.setState({ showEdit: true }, () => this.setHeader()); } } @@ -373,7 +376,8 @@ const mapStateToProps = state => ({ isMasterDetail: state.app.isMasterDetail, jitsiEnabled: state.settings.Jitsi_Enabled || false, editRoomPermission: state.permissions['edit-room'], - editLiveChatPermission: state.permissions['edit-omnichannel-contact'], + editOmnichannelContact: state.permissions['edit-omnichannel-contact'], + editLivechatRoomCustomfields: state.permissions['edit-livechat-room-customfields'], roles: state.roles }); From bd98e14469cd56effd061989b5a4a5709ba07184 Mon Sep 17 00:00:00 2001 From: Reinaldo Neto <reinaldonetof@hotmail.com> Date: Sun, 15 Aug 2021 15:25:40 -0300 Subject: [PATCH 5/5] Fix the inputs.focus() --- app/views/LivechatEditView.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/LivechatEditView.js b/app/views/LivechatEditView.js index 5ff99daf2c3..f92215ffab5 100644 --- a/app/views/LivechatEditView.js +++ b/app/views/LivechatEditView.js @@ -188,7 +188,7 @@ const LivechatEditView = ({ onSubmitEditing={() => { const keys = Object.keys(customFields?.visitor || {}); if (keys.length > 0) { - const key = keys.pop(); + const key = keys[0]; inputs[key].focus(); } else { inputs.topic.focus(); @@ -205,7 +205,7 @@ const LivechatEditView = ({ onChangeText={text => onChangeText(key, text)} onSubmitEditing={() => { if (array.length - 1 > index) { - return inputs[array[index + 1]].focus(); + return inputs[array[index + 1][0]].focus(); } inputs.topic.focus(); }}