diff options
Diffstat (limited to 'webapp')
-rw-r--r-- | webapp/client/client.jsx | 2 | ||||
-rw-r--r-- | webapp/components/admin_console/audits.jsx | 27 | ||||
-rw-r--r-- | webapp/components/admin_console/compliance_reports.jsx | 197 | ||||
-rw-r--r-- | webapp/components/backstage/installed_commands.jsx | 15 | ||||
-rw-r--r-- | webapp/components/backstage/installed_incoming_webhooks.jsx | 15 | ||||
-rw-r--r-- | webapp/components/backstage/installed_outgoing_webhooks.jsx | 15 | ||||
-rw-r--r-- | webapp/components/login/login.jsx | 4 | ||||
-rw-r--r-- | webapp/components/sidebar.jsx | 2 | ||||
-rw-r--r-- | webapp/i18n/en.json | 20 | ||||
-rw-r--r-- | webapp/i18n/es.json | 4 | ||||
-rw-r--r-- | webapp/sass/responsive/_mobile.scss | 9 | ||||
-rw-r--r-- | webapp/sass/routes/_admin-console.scss | 11 | ||||
-rw-r--r-- | webapp/sass/routes/_compliance.scss | 38 | ||||
-rw-r--r-- | webapp/sass/routes/_module.scss | 1 | ||||
-rw-r--r-- | webapp/stores/integration_store.jsx | 142 | ||||
-rw-r--r-- | webapp/utils/async_client.jsx | 6 |
16 files changed, 292 insertions, 216 deletions
diff --git a/webapp/client/client.jsx b/webapp/client/client.jsx index 12cf21f5c..3ee7b1de9 100644 --- a/webapp/client/client.jsx +++ b/webapp/client/client.jsx @@ -1203,7 +1203,7 @@ export default class Client { end(this.handleResponse.bind(this, 'listTeamCommands', success, error)); } - regenCommandToken = (commandId, suggest, success, error) => { + regenCommandToken = (commandId, success, error) => { request. post(`${this.getCommandsRoute()}/regen_token`). set(this.defaultHeaders). diff --git a/webapp/components/admin_console/audits.jsx b/webapp/components/admin_console/audits.jsx index 1f94de7da..cb500f29c 100644 --- a/webapp/components/admin_console/audits.jsx +++ b/webapp/components/admin_console/audits.jsx @@ -75,24 +75,25 @@ export default class Audits extends React.Component { <div> <ComplianceReports/> - <div className='panel'> + <div className='panel audit-panel'> <h3> <FormattedMessage id='admin.audits.title' - defaultMessage='User Activity' + defaultMessage='User Activity Logs' /> + <button + type='submit' + className='btn btn-link pull-right' + onClick={this.reload} + > + <i className='fa fa-refresh'></i> + <FormattedMessage + id='admin.audits.reload' + defaultMessage='Reload User Activity Logs' + /> + </button> </h3> - <button - type='submit' - className='btn btn-primary' - onClick={this.reload} - > - <FormattedMessage - id='admin.audits.reload' - defaultMessage='Reload' - /> - </button> - <div className='audit__panel'> + <div className='audit-panel__table'> {content} </div> </div> diff --git a/webapp/components/admin_console/compliance_reports.jsx b/webapp/components/admin_console/compliance_reports.jsx index 41d8ce32c..a93f7a17c 100644 --- a/webapp/components/admin_console/compliance_reports.jsx +++ b/webapp/components/admin_console/compliance_reports.jsx @@ -266,121 +266,120 @@ export default class ComplianceReports extends React.Component { } return ( - <div className='panel'> + <div className='panel compliance-panel'> <h3> <FormattedMessage id='admin.compliance_reports.title' defaultMessage='Compliance Reports' /> </h3> - - <table> - <tbody> - <tr> - <td - colSpan='5' - style={{paddingBottom: '6px'}} - > - <FormattedMessage - id='admin.compliance_reports.desc' - defaultMessage='Job Name:' - /> - <input - style={{width: '425px'}} - type='text' - className='form-control' - id='desc' - ref='desc' - placeholder={Utils.localizeMessage('admin.compliance_reports.desc_placeholder', 'Ex "Audit 445 for HR"')} - /> - </td> - </tr> - <tr> - <td> - <FormattedMessage - id='admin.compliance_reports.from' - defaultMessage='From:' - /> - <input - type='text' - className='form-control' - id='from' - ref='from' - placeholder={Utils.localizeMessage('admin.compliance_reports.from_placeholder', 'Ex "2016-03-11"')} - /> - </td> - <td style={{paddingLeft: '4px'}}> - <FormattedMessage - id='admin.compliance_reports.to' - defaultMessage='To:' - /> - <input - type='text' - className='form-control' - id='to' - ref='to' - placeholder={Utils.localizeMessage('admin.compliance_reports.to_placeholder', 'Ex "2016-03-15"')} - /> - </td> - <td style={{paddingLeft: '4px'}}> - <FormattedMessage - id='admin.compliance_reports.emails' - defaultMessage='Emails:' - /> - <input - style={{width: '325px'}} - type='text' - className='form-control' - id='emails' - ref='emails' - placeholder={Utils.localizeMessage('admin.compliance_reports.emails_placeholder', 'Ex "bill@example.com, bob@example.com"')} - /> - </td> - <td style={{paddingLeft: '4px'}}> - <FormattedMessage - id='admin.compliance_reports.keywords' - defaultMessage='Keywords:' - /> - <input - style={{width: '250px'}} - type='text' - className='form-control' - id='keywords' - ref='keywords' - placeholder={Utils.localizeMessage('admin.compliance_reports.keywords_placeholder', 'Ex "shorting stock"')} - /> - </td> - <td> - <button - id='run-button' - type='submit' - className='btn btn-primary' - onClick={this.runReport} - style={{marginTop: '20px', marginLeft: '20px'}} - > - <FormattedMessage - id='admin.compliance_reports.run' - defaultMessage='Run' - /> - </button> - </td> - </tr> - </tbody> - </table> - {serverError} - <div style={{marginTop: '20px'}}> + <div className='row'> + <div className='col-sm-6 col-md-4 form-group'> + <label> + <FormattedMessage + id='admin.compliance_reports.desc' + defaultMessage='Job Name:' + /> + </label> + <input + type='text' + className='form-control' + id='desc' + ref='desc' + placeholder={Utils.localizeMessage('admin.compliance_reports.desc_placeholder', 'E.g. "Audit 445 for HR"')} + /> + </div> + <div className='col-sm-3 col-md-2 form-group'> + <label> + <FormattedMessage + id='admin.compliance_reports.from' + defaultMessage='From:' + /> + </label> + <input + type='text' + className='form-control' + id='from' + ref='from' + placeholder={Utils.localizeMessage('admin.compliance_reports.from_placeholder', 'E.g. "2016-03-11"')} + /> + </div> + <div className='col-sm-3 col-md-2 form-group'> + <label> + <FormattedMessage + id='admin.compliance_reports.to' + defaultMessage='To:' + /> + </label> + <input + type='text' + className='form-control' + id='to' + ref='to' + placeholder={Utils.localizeMessage('admin.compliance_reports.to_placeholder', 'E.g. "2016-03-15"')} + /> + </div> + </div> + <div className='row'> + <div className='col-sm-6 col-md-4 form-group'> + <label> + <FormattedMessage + id='admin.compliance_reports.emails' + defaultMessage='Emails:' + /> + </label> + <input + type='text' + className='form-control' + id='emails' + ref='emails' + placeholder={Utils.localizeMessage('admin.compliance_reports.emails_placeholder', 'E.g. "bill@example.com, bob@example.com"')} + /> + </div> + <div className='col-sm-6 col-md-4 form-group'> + <label> + <FormattedMessage + id='admin.compliance_reports.keywords' + defaultMessage='Keywords:' + /> + </label> + <input + type='text' + className='form-control' + id='keywords' + ref='keywords' + placeholder={Utils.localizeMessage('admin.compliance_reports.keywords_placeholder', 'E.g. "shorting stock"')} + /> + </div> + </div> + <div className='clearfix'> <button + id='run-button' type='submit' className='btn btn-primary' + onClick={this.runReport} + > + <FormattedMessage + id='admin.compliance_reports.run' + defaultMessage='Run Compliance Report' + /> + </button> + </div> + {serverError} + <div className='text-right'> + <button + type='submit' + className='btn btn-link' onClick={this.reload} > + <i className='fa fa-refresh'></i> <FormattedMessage id='admin.compliance_reports.reload' - defaultMessage='Reload' + defaultMessage='Reload Completed Compliance Reports' /> </button> </div> - <div className='compliance__panel'> + <div className='compliance-panel__table'> {content} </div> </div> diff --git a/webapp/components/backstage/installed_commands.jsx b/webapp/components/backstage/installed_commands.jsx index 71373e077..df1f56687 100644 --- a/webapp/components/backstage/installed_commands.jsx +++ b/webapp/components/backstage/installed_commands.jsx @@ -5,6 +5,7 @@ import React from 'react'; import * as AsyncClient from 'utils/async_client.jsx'; import IntegrationStore from 'stores/integration_store.jsx'; +import TeamStore from 'stores/team_store.jsx'; import * as Utils from 'utils/utils.jsx'; import {FormattedMessage} from 'react-intl'; @@ -20,16 +21,18 @@ export default class InstalledCommands extends React.Component { this.regenCommandToken = this.regenCommandToken.bind(this); this.deleteCommand = this.deleteCommand.bind(this); + const teamId = TeamStore.getCurrentId(); + this.state = { - commands: IntegrationStore.getCommands(), - loading: !IntegrationStore.hasReceivedCommands() + commands: IntegrationStore.getCommands(teamId), + loading: !IntegrationStore.hasReceivedCommands(teamId) }; } componentDidMount() { IntegrationStore.addChangeListener(this.handleIntegrationChange); - if (window.mm_config.EnableCommands === 'true' && this.state.loading) { + if (window.mm_config.EnableCommands === 'true') { AsyncClient.listTeamCommands(); } } @@ -39,9 +42,11 @@ export default class InstalledCommands extends React.Component { } handleIntegrationChange() { + const teamId = TeamStore.getCurrentId(); + this.setState({ - commands: IntegrationStore.getCommands(), - loading: !IntegrationStore.hasReceivedCommands() + commands: IntegrationStore.getCommands(teamId), + loading: !IntegrationStore.hasReceivedCommands(teamId) }); } diff --git a/webapp/components/backstage/installed_incoming_webhooks.jsx b/webapp/components/backstage/installed_incoming_webhooks.jsx index 389f65919..0a38a6ab5 100644 --- a/webapp/components/backstage/installed_incoming_webhooks.jsx +++ b/webapp/components/backstage/installed_incoming_webhooks.jsx @@ -5,6 +5,7 @@ import React from 'react'; import * as AsyncClient from 'utils/async_client.jsx'; import IntegrationStore from 'stores/integration_store.jsx'; +import TeamStore from 'stores/team_store.jsx'; import * as Utils from 'utils/utils.jsx'; import {FormattedMessage} from 'react-intl'; @@ -19,16 +20,18 @@ export default class InstalledIncomingWebhooks extends React.Component { this.deleteIncomingWebhook = this.deleteIncomingWebhook.bind(this); + const teamId = TeamStore.getCurrentId(); + this.state = { - incomingWebhooks: IntegrationStore.getIncomingWebhooks(), - loading: !IntegrationStore.hasReceivedIncomingWebhooks() + incomingWebhooks: IntegrationStore.getIncomingWebhooks(teamId), + loading: !IntegrationStore.hasReceivedIncomingWebhooks(teamId) }; } componentDidMount() { IntegrationStore.addChangeListener(this.handleIntegrationChange); - if (window.mm_config.EnableIncomingWebhooks === 'true' && this.state.loading) { + if (window.mm_config.EnableIncomingWebhooks === 'true') { AsyncClient.listIncomingHooks(); } } @@ -38,9 +41,11 @@ export default class InstalledIncomingWebhooks extends React.Component { } handleIntegrationChange() { + const teamId = TeamStore.getCurrentId(); + this.setState({ - incomingWebhooks: IntegrationStore.getIncomingWebhooks(), - loading: !IntegrationStore.hasReceivedIncomingWebhooks() + incomingWebhooks: IntegrationStore.getIncomingWebhooks(teamId), + loading: !IntegrationStore.hasReceivedIncomingWebhooks(teamId) }); } diff --git a/webapp/components/backstage/installed_outgoing_webhooks.jsx b/webapp/components/backstage/installed_outgoing_webhooks.jsx index e0817fda8..b79bc3530 100644 --- a/webapp/components/backstage/installed_outgoing_webhooks.jsx +++ b/webapp/components/backstage/installed_outgoing_webhooks.jsx @@ -5,6 +5,7 @@ import React from 'react'; import * as AsyncClient from 'utils/async_client.jsx'; import IntegrationStore from 'stores/integration_store.jsx'; +import TeamStore from 'stores/team_store.jsx'; import * as Utils from 'utils/utils.jsx'; import {FormattedMessage} from 'react-intl'; @@ -20,16 +21,18 @@ export default class InstalledOutgoingWebhooks extends React.Component { this.regenOutgoingWebhookToken = this.regenOutgoingWebhookToken.bind(this); this.deleteOutgoingWebhook = this.deleteOutgoingWebhook.bind(this); + const teamId = TeamStore.getCurrentId(); + this.state = { - outgoingWebhooks: IntegrationStore.getOutgoingWebhooks(), - loading: !IntegrationStore.hasReceivedOutgoingWebhooks() + outgoingWebhooks: IntegrationStore.getOutgoingWebhooks(teamId), + loading: !IntegrationStore.hasReceivedOutgoingWebhooks(teamId) }; } componentDidMount() { IntegrationStore.addChangeListener(this.handleIntegrationChange); - if (window.mm_config.EnableOutgoingWebhooks === 'true' && this.state.loading) { + if (window.mm_config.EnableOutgoingWebhooks === 'true') { AsyncClient.listOutgoingHooks(); } } @@ -39,9 +42,11 @@ export default class InstalledOutgoingWebhooks extends React.Component { } handleIntegrationChange() { + const teamId = TeamStore.getCurrentId(); + this.setState({ - outgoingWebhooks: IntegrationStore.getOutgoingWebhooks(), - loading: !IntegrationStore.hasReceivedOutgoingWebhooks() + outgoingWebhooks: IntegrationStore.getOutgoingWebhooks(teamId), + loading: !IntegrationStore.hasReceivedOutgoingWebhooks(teamId) }); } diff --git a/webapp/components/login/login.jsx b/webapp/components/login/login.jsx index 0a12ed645..8ae3fdd4d 100644 --- a/webapp/components/login/login.jsx +++ b/webapp/components/login/login.jsx @@ -85,8 +85,7 @@ export default class Login extends React.Component { browserHistory.push('/should_verify_email?&email=' + encodeURIComponent(loginId)); return; } else if (err.id === 'store.sql_user.get_for_login.app_error' || - err.id === 'ent.ldap.do_login.user_not_registered.app_error' || - err.id === 'ent.ldap.do_login.user_filtered.app_error') { + err.id === 'ent.ldap.do_login.user_not_registered.app_error') { this.setState({ showMfa: false, serverError: ( @@ -98,6 +97,7 @@ export default class Login extends React.Component { }); } else if (err.id === 'api.user.check_user_password.invalid.app_error' || err.id === 'ent.ldap.do_login.invalid_password.app_error') { this.setState({ + showMfa: false, serverError: ( <FormattedMessage id='login.invalidPassword' diff --git a/webapp/components/sidebar.jsx b/webapp/components/sidebar.jsx index 8325478f3..d20fef603 100644 --- a/webapp/components/sidebar.jsx +++ b/webapp/components/sidebar.jsx @@ -514,7 +514,7 @@ export default class Sidebar extends React.Component { <div className='sidebar__divider__text'> <FormattedMessage id='sidebar.otherMembers' - defaultMessage='Other teams' + defaultMessage='Outside this team' /> </div> </div>); diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json index b622c9ab1..7e46903db 100644 --- a/webapp/i18n/en.json +++ b/webapp/i18n/en.json @@ -75,8 +75,8 @@ "add_outgoing_webhook.triggerWOrds": "Trigger Words (One Per Line)", "add_outgoing_webhook.triggerWords": "Trigger Words (One Per Line)", "add_outgoing_webhook.triggerWordsOrChannelRequired": "A valid channel or a list of trigger words is required", - "admin.audits.reload": "Reload", - "admin.audits.title": "User Activity", + "admin.audits.reload": "Reload User Activity Logs", + "admin.audits.title": "User Activity Logs", "admin.compliance.directoryDescription": "Directory to which compliance reports are written. If blank, will be set to ./data/.", "admin.compliance.directoryExample": "Ex \"./data/\"", "admin.compliance.directoryTitle": "Compliance Directory Location:", @@ -91,18 +91,18 @@ "admin.compliance.title": "Compliance Settings", "admin.compliance.true": "true", "admin.compliance_reports.desc": "Job Name:", - "admin.compliance_reports.desc_placeholder": "Ex \"Audit 445 for HR\"", + "admin.compliance_reports.desc_placeholder": "E.g. \"Audit 445 for HR\"", "admin.compliance_reports.emails": "Emails:", - "admin.compliance_reports.emails_placeholder": "Ex \"bill@example.com, bob@example.com\"", + "admin.compliance_reports.emails_placeholder": "E.g. \"bill@example.com, bob@example.com\"", "admin.compliance_reports.from": "From:", - "admin.compliance_reports.from_placeholder": "Ex \"2016-03-11\"", + "admin.compliance_reports.from_placeholder": "E.g. \"2016-03-11\"", "admin.compliance_reports.keywords": "Keywords:", - "admin.compliance_reports.keywords_placeholder": "Ex \"shorting stock\"", - "admin.compliance_reports.reload": "Reload", - "admin.compliance_reports.run": "Run", + "admin.compliance_reports.keywords_placeholder": "E.g. \"shorting stock\"", + "admin.compliance_reports.reload": "Reload Completed Compliance Reports", + "admin.compliance_reports.run": "Run Compliance Report", "admin.compliance_reports.title": "Compliance Reports", "admin.compliance_reports.to": "To:", - "admin.compliance_reports.to_placeholder": "Ex \"2016-03-15\"", + "admin.compliance_reports.to_placeholder": "E.g. \"2016-03-15\"", "admin.compliance_table.desc": "Description", "admin.compliance_table.download": "Download", "admin.compliance_table.params": "Params", @@ -1130,7 +1130,7 @@ "sidebar.direct": "Direct Messages", "sidebar.more": "More", "sidebar.moreElips": "More...", - "sidebar.otherMembers": "Other teams", + "sidebar.otherMembers": "Outside this team", "sidebar.pg": "Private Groups", "sidebar.removeList": "Remove from list", "sidebar.tutorialScreen1": "<h4>Channels</h4><p><strong>Channels</strong> organize conversations across different topics. They’re open to everyone on your team. To send private communications use <strong>Direct Messages</strong> for a single person or <strong>Private Groups</strong> for multiple people.</p>", diff --git a/webapp/i18n/es.json b/webapp/i18n/es.json index ce29d234b..7aa3071f6 100644 --- a/webapp/i18n/es.json +++ b/webapp/i18n/es.json @@ -1130,7 +1130,7 @@ "sidebar.direct": "Mensajes Directos", "sidebar.more": "Más", "sidebar.moreElips": "Más...", - "sidebar.otherMembers": "Otros equipos", + "sidebar.otherMembers": "Fuera de este equipo", "sidebar.pg": "Grupos Privados", "sidebar.removeList": "Remover de la lista", "sidebar.tutorialScreen1": "<h4>Canales</h4><p><strong>Canales</strong> organizan las conversaciones en diferentes tópicos. Son abiertos para cualquier persona de tu equipo. Para enviar comunicaciones privadas con una sola persona utiliza <strong>Mensajes Directos</strong> o con multiples personas utilizando <strong>Grupos Privados</strong>.</p>", @@ -1341,7 +1341,9 @@ "user.settings.general.title": "Configuración General", "user.settings.general.uploadImage": "Pinchar 'Editar' para subir una imagen.", "user.settings.general.username": "Nombre de usuario", + "user.settings.general.usernameInfo": "Escoge algo que sea fácil de reconocer y recordar para tus compañeros.", "user.settings.general.usernameReserved": "Este nombre de usuario está reservado, por favor escoge otro", + "user.settings.general.usernameRestrictions": "El nombre de usuario debe comenzar con una letra y debe contener entre {min} y {max} caracteres en minúscula creado con numeros, letras y los símbolos '.', '-', y '_'.", "user.settings.general.validEmail": "Por favor ingresa una dirección de correo electrónico válida", "user.settings.general.validImage": "Sólo pueden ser utilizadas imágenes JPG o PNG en el perfil", "user.settings.import_theme.cancel": "Cancelar", diff --git a/webapp/sass/responsive/_mobile.scss b/webapp/sass/responsive/_mobile.scss index 3a4cd3b89..cc3d7a4b9 100644 --- a/webapp/sass/responsive/_mobile.scss +++ b/webapp/sass/responsive/_mobile.scss @@ -11,6 +11,15 @@ } } + .compliance-panel, + .audit-panel { + .row { + > .form-group { + padding-left: 15px; + } + } + } + .user-popover { pointer-events: none; } diff --git a/webapp/sass/routes/_admin-console.scss b/webapp/sass/routes/_admin-console.scss index 65fefdb33..0f47e7529 100644 --- a/webapp/sass/routes/_admin-console.scss +++ b/webapp/sass/routes/_admin-console.scss @@ -160,17 +160,6 @@ width: 100%; } - .compliance__panel, - .audit__panel { - background-color: $white; - border: 1px solid $border-gray; - height: 70vh; - margin-top: 10px; - overflow: auto; - padding: 5px; - width: 100%; - } - .app__content { color: #333; diff --git a/webapp/sass/routes/_compliance.scss b/webapp/sass/routes/_compliance.scss new file mode 100644 index 000000000..57eb538c6 --- /dev/null +++ b/webapp/sass/routes/_compliance.scss @@ -0,0 +1,38 @@ +@charset 'UTF-8'; + +.compliance-panel__table, +.audit-panel__table { + background-color: $white; + border: 1px solid $border-gray; + margin-top: 10px; + max-height: 70vh; + min-height: 100px; + overflow: auto; + padding: 5px; + width: 100%; +} + +.compliance-panel, +.audit-panel { + .row { + > .form-group { + padding-left: 0; + + &:first-child { + padding-left: 15px; + } + } + + label { + font-weight: 600; + } + } + + .fa-refresh { + margin-right: 5px; + } +} + +.compliance-panel { + margin-bottom: 3em; +} diff --git a/webapp/sass/routes/_module.scss b/webapp/sass/routes/_module.scss index 4f3f6f9cd..11b815007 100644 --- a/webapp/sass/routes/_module.scss +++ b/webapp/sass/routes/_module.scss @@ -4,6 +4,7 @@ @import 'activity-log'; @import 'admin-console'; @import 'backstage'; +@import 'compliance'; @import 'docs'; @import 'error-page'; @import 'loading'; diff --git a/webapp/stores/integration_store.jsx b/webapp/stores/integration_store.jsx index 12cbc3407..454e6290b 100644 --- a/webapp/stores/integration_store.jsx +++ b/webapp/stores/integration_store.jsx @@ -15,14 +15,11 @@ class IntegrationStore extends EventEmitter { this.dispatchToken = AppDispatcher.register(this.handleEventPayload.bind(this)); - this.incomingWebhooks = []; - this.receivedIncomingWebhooks = false; + this.incomingWebhooks = new Map(); - this.outgoingWebhooks = []; - this.receivedOutgoingWebhooks = false; + this.outgoingWebhooks = new Map(); - this.commands = []; - this.receivedCommands = false; + this.commands = new Map(); } addChangeListener(callback) { @@ -37,100 +34,119 @@ class IntegrationStore extends EventEmitter { this.emit(CHANGE_EVENT); } - hasReceivedIncomingWebhooks() { - return this.receivedIncomingWebhooks; + hasReceivedIncomingWebhooks(teamId) { + return this.incomingWebhooks.has(teamId); } - getIncomingWebhooks() { - return this.incomingWebhooks; + getIncomingWebhooks(teamId) { + return this.incomingWebhooks.get(teamId) || []; } - setIncomingWebhooks(incomingWebhooks) { - this.incomingWebhooks = incomingWebhooks; - this.receivedIncomingWebhooks = true; + setIncomingWebhooks(teamId, incomingWebhooks) { + this.incomingWebhooks.set(teamId, incomingWebhooks); } addIncomingWebhook(incomingWebhook) { - this.incomingWebhooks.push(incomingWebhook); + const teamId = incomingWebhook.team_id; + const incomingWebhooks = this.getIncomingWebhooks(teamId); + + incomingWebhooks.push(incomingWebhook); + + this.setIncomingWebhooks(teamId, incomingWebhooks); } - removeIncomingWebhook(id) { - for (let i = 0; i < this.incomingWebhooks.length; i++) { - if (this.incomingWebhooks[i].id === id) { - this.incomingWebhooks.splice(i, 1); - break; - } - } + removeIncomingWebhook(teamId, id) { + let incomingWebhooks = this.getIncomingWebhooks(teamId); + + incomingWebhooks = incomingWebhooks.filter((incomingWebhook) => incomingWebhook.id !== id); + + this.setIncomingWebhooks(teamId, incomingWebhooks); } - hasReceivedOutgoingWebhooks() { - return this.receivedOutgoingWebhooks; + hasReceivedOutgoingWebhooks(teamId) { + return this.outgoingWebhooks.has(teamId); } - getOutgoingWebhooks() { - return this.outgoingWebhooks; + getOutgoingWebhooks(teamId) { + return this.outgoingWebhooks.get(teamId) || []; } - setOutgoingWebhooks(outgoingWebhooks) { - this.outgoingWebhooks = outgoingWebhooks; - this.receivedOutgoingWebhooks = true; + setOutgoingWebhooks(teamId, outgoingWebhooks) { + this.outgoingWebhooks.set(teamId, outgoingWebhooks); } addOutgoingWebhook(outgoingWebhook) { - this.outgoingWebhooks.push(outgoingWebhook); + const teamId = outgoingWebhook.team_id; + const outgoingWebhooks = this.getOutgoingWebhooks(teamId); + + outgoingWebhooks.push(outgoingWebhook); + + this.setOutgoingWebhooks(teamId, outgoingWebhooks); } updateOutgoingWebhook(outgoingWebhook) { - for (let i = 0; i < this.outgoingWebhooks.length; i++) { - if (this.outgoingWebhooks[i].id === outgoingWebhook.id) { - this.outgoingWebhooks[i] = outgoingWebhook; + const teamId = outgoingWebhook.team_id; + const outgoingWebhooks = this.getOutgoingWebhooks(teamId); + + for (let i = 0; i < outgoingWebhooks.length; i++) { + if (outgoingWebhooks[i].id === outgoingWebhook.id) { + outgoingWebhooks[i] = outgoingWebhook; break; } } + + this.setOutgoingWebhooks(teamId, outgoingWebhooks); } - removeOutgoingWebhook(id) { - for (let i = 0; i < this.outgoingWebhooks.length; i++) { - if (this.outgoingWebhooks[i].id === id) { - this.outgoingWebhooks.splice(i, 1); - break; - } - } + removeOutgoingWebhook(teamId, id) { + let outgoingWebhooks = this.getOutgoingWebhooks(teamId); + + outgoingWebhooks = outgoingWebhooks.filter((outgoingWebhook) => outgoingWebhook.id !== id); + + this.setOutgoingWebhooks(teamId, outgoingWebhooks); } - hasReceivedCommands() { - return this.receivedCommands; + hasReceivedCommands(teamId) { + return this.commands.has(teamId); } - getCommands() { - return this.commands; + getCommands(teamId) { + return this.commands.get(teamId) || []; } - setCommands(commands) { - this.commands = commands; - this.receivedCommands = true; + setCommands(teamId, commands) { + this.commands.set(teamId, commands); } addCommand(command) { - this.commands.push(command); + const teamId = command.team_id; + const commands = this.getCommands(teamId); + + commands.push(command); + + this.setCommands(teamId, commands); } updateCommand(command) { - for (let i = 0; i < this.commands.length; i++) { - if (this.commands[i].id === command.id) { - this.commands[i] = command; + const teamId = command.team_id; + const commands = this.getCommands(teamId); + + for (let i = 0; i < commands.length; i++) { + if (commands[i].id === command.id) { + commands[i] = command; break; } } + + this.setCommands(teamId, commands); } - removeCommand(id) { - for (let i = 0; i < this.commands.length; i++) { - if (this.commands[i].id === id) { - this.commands.splice(i, 1); - break; - } - } + removeCommand(teamId, id) { + let commands = this.getCommands(teamId); + + commands = commands.filter((command) => command.id !== id); + + this.setCommands(teamId, commands); } handleEventPayload(payload) { @@ -138,7 +154,7 @@ class IntegrationStore extends EventEmitter { switch (action.type) { case ActionTypes.RECEIVED_INCOMING_WEBHOOKS: - this.setIncomingWebhooks(action.incomingWebhooks); + this.setIncomingWebhooks(action.teamId, action.incomingWebhooks); this.emitChange(); break; case ActionTypes.RECEIVED_INCOMING_WEBHOOK: @@ -146,11 +162,11 @@ class IntegrationStore extends EventEmitter { this.emitChange(); break; case ActionTypes.REMOVED_INCOMING_WEBHOOK: - this.removeIncomingWebhook(action.id); + this.removeIncomingWebhook(action.teamId, action.id); this.emitChange(); break; case ActionTypes.RECEIVED_OUTGOING_WEBHOOKS: - this.setOutgoingWebhooks(action.outgoingWebhooks); + this.setOutgoingWebhooks(action.teamId, action.outgoingWebhooks); this.emitChange(); break; case ActionTypes.RECEIVED_OUTGOING_WEBHOOK: @@ -162,11 +178,11 @@ class IntegrationStore extends EventEmitter { this.emitChange(); break; case ActionTypes.REMOVED_OUTGOING_WEBHOOK: - this.removeOutgoingWebhook(action.id); + this.removeOutgoingWebhook(action.teamId, action.id); this.emitChange(); break; case ActionTypes.RECEIVED_COMMANDS: - this.setCommands(action.commands); + this.setCommands(action.teamId, action.commands); this.emitChange(); break; case ActionTypes.RECEIVED_COMMAND: @@ -178,7 +194,7 @@ class IntegrationStore extends EventEmitter { this.emitChange(); break; case ActionTypes.REMOVED_COMMAND: - this.removeCommand(action.id); + this.removeCommand(action.teamId, action.id); this.emitChange(); break; } diff --git a/webapp/utils/async_client.jsx b/webapp/utils/async_client.jsx index a562964b1..6535c024d 100644 --- a/webapp/utils/async_client.jsx +++ b/webapp/utils/async_client.jsx @@ -1145,6 +1145,7 @@ export function listIncomingHooks() { AppDispatcher.handleServerAction({ type: ActionTypes.RECEIVED_INCOMING_WEBHOOKS, + teamId: Client.teamId, incomingWebhooks: data }); }, @@ -1168,6 +1169,7 @@ export function listOutgoingHooks() { AppDispatcher.handleServerAction({ type: ActionTypes.RECEIVED_OUTGOING_WEBHOOKS, + teamId: Client.teamId, outgoingWebhooks: data }); }, @@ -1230,6 +1232,7 @@ export function deleteIncomingHook(id) { () => { AppDispatcher.handleServerAction({ type: ActionTypes.REMOVED_INCOMING_WEBHOOK, + teamId: Client.teamId, id }); }, @@ -1245,6 +1248,7 @@ export function deleteOutgoingHook(id) { () => { AppDispatcher.handleServerAction({ type: ActionTypes.REMOVED_OUTGOING_WEBHOOK, + teamId: Client.teamId, id }); }, @@ -1282,6 +1286,7 @@ export function listTeamCommands() { AppDispatcher.handleServerAction({ type: ActionTypes.RECEIVED_COMMANDS, + teamId: Client.teamId, commands: data }); }, @@ -1321,6 +1326,7 @@ export function deleteCommand(id) { () => { AppDispatcher.handleServerAction({ type: ActionTypes.REMOVED_COMMAND, + teamId: Client.teamId, id }); }, |