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.

106 lines
4.3 KiB

  1. /* Copyright 2017 LasLabs Inc.
  2. License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */
  3. odoo.define('bus_presence_systray', function (require) {
  4. "use strict";
  5. var Bus = require('bus.bus').bus;
  6. var DataModel = require('web.DataModel');
  7. var Session = require('web.session');
  8. var SystrayMenu = require('web.SystrayMenu');
  9. var Widget = require('web.Widget');
  10. var Qweb = require('web.core').qweb;
  11. var LocalStorage = require('web.local_storage');
  12. function on(type, listener) {
  13. if (window.addEventListener) {
  14. window.addEventListener(type, listener);
  15. } else {
  16. // IE8
  17. window.attachEvent('on' + type, listener);
  18. }
  19. }
  20. var BusPresenceSystray = Widget.extend({
  21. template: 'bus_presence_systray',
  22. events: {
  23. 'click .o-user-status-select': 'onClickUserStatusSelect',
  24. },
  25. init: function() {
  26. this._super.apply(this, arguments);
  27. this.resPartnerMod = new DataModel('res.partner');
  28. this.busPresenceMod = new DataModel('bus.presence');
  29. Bus.on('notification', this, _.throttle(this.notificationsUpdateCurrentUserStatus.bind(this), 100, {leading: false}));
  30. on('storage', this.onStorage.bind(this));
  31. },
  32. start: function () {
  33. this.startDetermineUserStatus();
  34. Bus.start_polling();
  35. return this._super();
  36. },
  37. startDetermineUserStatus: function () {
  38. if (Bus.is_master === true) {
  39. this.writeBusPresenceStatus('online');
  40. this.updateUserStatusIcon('online');
  41. LocalStorage.setItem('user.partner_im_status', 'online');
  42. } else {
  43. var statusVal = LocalStorage.getItem('user.partner_im_status');
  44. this.updateUserStatusIcon(statusVal);
  45. }
  46. },
  47. onStorage: function (event) {
  48. if (event.key === 'user.partner_im_status') {
  49. this.updateUserStatusIcon(event.newValue);
  50. }
  51. },
  52. notificationsUpdateCurrentUserStatus: function (notifications) {
  53. _.each(notifications, $.proxy(
  54. function (notification) {
  55. var model = notification[0][1];
  56. var partnerId = notification[1].id;
  57. if (model === 'bus.presence' && partnerId === Session.partner_id) {
  58. var status = notification[1].im_status;
  59. this.updateUserStatusIcon(status);
  60. LocalStorage.setItem('user.partner_im_status', status);
  61. }
  62. }, this)
  63. );
  64. },
  65. queryUpdateCurrentUserStatus: function () {
  66. this.resPartnerMod.query(['im_status'])
  67. .filter([['id', '=', Session.partner_id]])
  68. .first()
  69. .then($.proxy(
  70. function (result) {
  71. this.updateUserStatusIcon(result.im_status);
  72. LocalStorage.setItem('user.partner_im_status', status);
  73. }, this)
  74. );
  75. },
  76. updateUserStatusIcon: function (status) {
  77. var options = {'status': status};
  78. var $icon = this.$('.o-user-systray-status');
  79. $icon.empty().append($(Qweb.render('mail.chat.UserStatus', options)));
  80. },
  81. onClickUserStatusSelect: function (event) {
  82. var status = $(event.currentTarget).attr('name');
  83. this.updateUserStatusIcon(status);
  84. this.writeBusPresenceStatus(status);
  85. LocalStorage.setItem('user.partner_im_status', status);
  86. },
  87. writeBusPresenceStatus: function (status) {
  88. this.busPresenceMod.query(['id'])
  89. .filter([['partner_id', '=', Session.partner_id]])
  90. .first()
  91. .then($.proxy(
  92. function (result) {
  93. this.busPresenceMod.call('write', [[result.id], {'status': status}]);
  94. }, this)
  95. );
  96. },
  97. });
  98. SystrayMenu.Items.push(BusPresenceSystray);
  99. });