diff --git a/submodules/groups/groups.js b/submodules/groups/groups.js
index 895f7493..bd7568f8 100644
--- a/submodules/groups/groups.js
+++ b/submodules/groups/groups.js
@@ -1,1663 +1,1663 @@
-define(function(require) {
- var $ = require('jquery'),
- _ = require('lodash'),
- monster = require('monster');
-
- var app = {
- requests: {},
-
- subscribe: {
- 'callflows.fetchActions': 'groupsDefineActions',
- 'callflows.groups.edit': '_groupsEdit'
- },
-
- groupsRender: function(data, target, callbacks) {
- var self = this,
- groups_html = $(self.getTemplate({
- name: 'edit',
- data: data,
- submodule: 'groups'
- })),
- groupForm = groups_html.find('#group-form');
-
- monster.ui.validate(groupForm, {
- rules: {
- 'name': {
- required: true
- }
- }
- });
-
- self.winkstartTabs(groups_html);
-
- $('#tab_users > .rows', groups_html).sortable({
- handle: '.column.first'
- });
-
- self.groupsRenderEndpointList(data, groups_html);
-
- $('.group-save', groups_html).click(function(ev) {
- ev.preventDefault();
-
- var $this = $(this);
-
- if (!$this.hasClass('disabled')) {
- $this.addClass('disabled');
-
- if (monster.ui.valid(groupForm)) {
- var form_data = monster.ui.getFormData('group-form');
- self.groupsCleanFormData(form_data, data.field_data);
-
- form_data.endpoints = {};
-
- $('.rows .row:not(#row_no_data)', groups_html).each(function(k, v) {
- form_data.endpoints[$(v).data('id')] = {
- type: $(v).data('type'),
- weight: k + 1
- };
- });
-
- delete data.data.resources;
- delete data.data.endpoints;
-
- self.groupsSave(form_data, data, callbacks.save_success);
- } else {
- $this.removeClass('disabled');
- monster.ui.alert(self.i18n.active().callflows.groups.there_were_errors_on_the_form);
- }
- }
- });
-
- $('.group-delete', groups_html).click(function(ev) {
- ev.preventDefault();
-
- monster.ui.confirm(self.i18n.active().callflows.groups.are_you_sure_you_want_to_delete, function() {
- self.groupsDelete(data, callbacks.delete_success);
- });
- });
-
- var add_user = function() {
- var $user = $('#select_user_id', groups_html);
-
- if ($user.val() !== 'empty_option_user') {
- var user_id = $user.val();
-
- $.each(data.field_data.users, function(k, v) {
- if (user_id === v.id) {
- var user_data = {
- endpoint_id: user_id,
- endpoint_type: 'user',
- endpoint_name: v.first_name + ' ' + v.last_name
- };
-
- data.data.endpoints.push(user_data);
-
- data.data.endpoints.sort(function(a, b) {
- return a.endpoint_name.toLowerCase() > b.endpoint_name.toLowerCase();
- });
-
- self.groupsRenderEndpointList(data, groups_html);
- $user.val('empty_option_user');
- }
- });
- }
- },
- add_device = function() {
- var $device = $('#select_device_id', groups_html);
-
- if ($device.val() !== 'empty_option_device') {
- var device_id = $device.val();
-
- $.each(data.field_data.devices, function(k, v) {
- if (device_id === v.id) {
- var device_data = {
- endpoint_id: device_id,
- endpoint_type: 'device',
- endpoint_name: v.name
- };
-
- data.data.endpoints.push(device_data);
-
- data.data.endpoints.sort(function(a, b) {
- return a.endpoint_name.toLowerCase() > b.endpoint_name.toLowerCase();
- });
-
- self.groupsRenderEndpointList(data, groups_html);
-
- $device.val('empty_option_device');
- }
- });
- }
- };
-
- $('#select_user_id', groups_html).change(function() {
- add_user();
- });
- $('#select_device_id', groups_html).change(function() {
- add_device();
- });
-
- groups_html.find('#group-form').on('click', '.action_endpoint.delete', function() {
- var endpoint_id = $(this).data('id');
- //removes it from the grid
- $('#row_endpoint_' + endpoint_id, groups_html).remove();
- //re-add it to the dropdown
- $('#option_endpoint_' + endpoint_id, groups_html).show();
- //if grid empty, add no data line
- if ($('.rows .row', groups_html).size() === 0) {
- $('.rows', groups_html)
- .append($(self.getTemplate({
- name: 'endpoint_row',
- submodule: 'groups'
- })));
- }
-
- /* TODO For some reason splice doesn't work and I don't have time to make it better for now */
- var new_list = [];
-
- $.each(data.data.endpoints, function(k, v) {
- if (!(v.endpoint_id === endpoint_id)) {
- new_list.push(v);
- }
- });
-
- data.data.endpoints = new_list;
- });
-
- (target)
- .empty()
- .append(groups_html);
- },
-
- // Added for the subscribed event to avoid refactoring mediaEdit
- _groupsEdit: function(args) {
- var self = this;
- self.groupsEdit(args.data, args.parent, args.target, args.callbacks, args.data_defaults);
- },
-
- groupsEdit: function(data, _parent, _target, _callbacks, data_defaults) {
- var self = this,
- parent = _parent || $('#groups-content'),
- target = _target || $('#groups-view', parent),
- callbacks = {
- save_success: _callbacks.save_success,
- save_error: _callbacks.save_error,
- delete_success: _callbacks.delete_success,
- delete_error: _callbacks.delete_error,
- after_render: _callbacks.after_render
- },
- defaults = {
- data: $.extend(true, {
- endpoints: {},
- music_on_hold: {}
- }, data_defaults || {}),
- field_data: {}
- };
-
- monster.parallel({
- device_list: function(callback) {
- self.groupsRequestDeviceList({
- success: function(data) {
- defaults.field_data.devices = data;
- callback(null, data);
- }
- });
- },
- user_list: function(callback) {
- self.groupsRequestUserList({
- success: function(data) {
- defaults.field_data.users = data;
- callback(null, {});
- }
- });
- },
-
- groups_get: function(callback) {
- if (typeof data === 'object' && data.id) {
- self.callApi({
- resource: 'group.get',
- data: {
- accountId: self.accountId,
- groupId: data.id
- },
- success: function(data) {
- callback(null, data);
- }
- });
- } else {
- callback(null, {});
- }
- }
- }, function(err, results) {
- var render_data = defaults;
-
- if (typeof data === 'object' && data.id) {
- render_data = $.extend(true, defaults, results.groups_get);
- }
-
- render_data = self.groupsFormatData(render_data);
-
- self.groupsRender(render_data, target, callbacks);
- });
- },
-
- groupsRenderEndpointList: function(data, parent) {
- var self = this;
-
- $('.rows', parent).empty();
-
- if ('endpoints' in data.data && data.data.endpoints.length > 0) {
- $.each(data.data.endpoints, function(k, item) {
- $('.rows', parent)
- .append($(self.getTemplate({
- name: 'endpoint_row',
- data: item,
- submodule: 'groups'
- })));
- $('#option_endpoint_' + item.endpoint_id, parent).hide();
- });
- } else {
- $('.rows', parent)
- .empty()
- .append($(self.getTemplate({
- name: 'endpoint_row',
- submodule: 'groups'
- })));
- }
- },
-
- groupsCleanFormData: function(form_data, field_data) {
- delete form_data.extra;
- },
-
- groupsFormatData: function(data) {
- var user_item,
- endpoint_item,
- list_endpoint = [];
-
- $.each(data.field_data.users, function(k, v) {
- if (v.id in data.data.endpoints) {
- endpoint_item = {
- endpoint_type: 'user',
- endpoint_id: v.id,
- endpoint_name: v.first_name + ' ' + v.last_name,
- endpoint_weight: data.data.endpoints[v.id].weight || 0
- };
-
- list_endpoint.push(endpoint_item);
- }
- });
-
- $.each(data.field_data.devices, function(k, v) {
- if (v.id in data.data.endpoints) {
- endpoint_item = {
- endpoint_type: 'device',
- endpoint_id: v.id,
- endpoint_name: v.name,
- endpoint_weight: data.data.endpoints[v.id].weight || 0
- };
-
- list_endpoint.push(endpoint_item);
- }
- });
-
- list_endpoint.sort(function(a, b) {
- return a.endpoint_weight - b.endpoint_weight;
- });
-
- data.data.endpoints = list_endpoint;
-
- return data;
- },
-
- groupsDefineActions: function(args) {
- var self = this,
- callflow_nodes = args.actions;
-
- $.extend(callflow_nodes, {
- 'ring_group[]': {
- name: self.i18n.active().oldCallflows.ring_group,
- icon: 'ring_group',
- category: self.i18n.active().oldCallflows.basic_cat,
- module: 'ring_group',
- tip: self.i18n.active().oldCallflows.ring_group_tip,
- data: {
- name: ''
- },
- rules: [
- {
- type: 'quantity',
- maxSize: '1'
- }
- ],
- isUsable: 'true',
- weight: 20,
- caption: function(node) {
- return node.getMetadata('name') || '';
- },
- edit: function(node, callback) {
- self.groupsEditRingGroup(node, callback);
- }
- },
- 'groups': {
- name: self.i18n.active().callflows.groups.title,
- module: 'groups',
- listEntities: function(callback) {
- self.callApi({
- resource: 'group.list',
- data: {
- accountId: self.accountId,
- filters: {
- paginate: false
- }
- },
- success: function(data, status) {
- callback && callback(data.data);
- }
- });
- },
- editEntity: 'callflows.groups.edit'
- },
- 'page_group[]': {
- name: self.i18n.active().oldCallflows.page_group,
- icon: 'ring_group',
- category: self.i18n.active().oldCallflows.advanced_cat,
- module: 'page_group',
- tip: self.i18n.active().oldCallflows.page_group_tip,
- data: {
- name: ''
- },
- rules: [
- {
- type: 'quantity',
- maxSize: '1'
- }
- ],
- isUsable: 'true',
- weight: 30,
- caption: function(node) {
- return node.getMetadata('name') || '';
- },
- edit: function(node, callback) {
- self.groupsEditPageGroup(node, callback);
- }
- },
-
- /*'eavesdrop[]': {
- name: self.i18n.active().callflows.eavesdrop.name,
- icon: 'headset',
- category: self.i18n.active().oldCallflows.advanced_cat,
- module: 'eavesdrop',
- tip: self.i18n.active().callflows.eavesdrop.tip,
- data: {},
- rules: [
- {
- type: 'quantity',
- maxSize: '1'
- }
- ],
- isUsable: 'true',
- weight: 48,
- caption: function(node) {
- return '';
- },
- edit: function(node, callback) {
- self.groupsGetEndpoints(function(formattedData) {
- var popup, popup_html;
-
- popup_html = $(self.getTemplate({
- name: 'eavesdrop',
- data: {
- fieldData: formattedData,
- data: {
- 'selectedId': node.getMetadata('device_id') || node.getMetadata('user_id') || '',
- 'approvedId': node.getMetadata('approved_device_id') || node.getMetadata('approved_user_id') || node.getMetadata('approved_group_id') || ''
- }
- },
- submodule: 'groups'
- }));
-
- monster.ui.tooltips(popup_html);
-
- $('#add', popup_html).click(function() {
- var setData = function(field, value) {
- if (value === 'endpoint_empty') {
- node.deleteMetadata('user_id');
- node.deleteMetadata('device_id');
- } else if (value === 'approved_empty') {
- node.deleteMetadata('approved_user_id');
- node.deleteMetadata('approved_group_id');
- node.deleteMetadata('approved_device_id');
- } else {
- node.setMetadata(field, value);
- }
- };
-
- var endpointField = $('#endpoint_selector option:selected').data('type') + '_id',
- endpointVal = $('#endpoint_selector option:selected').val(),
- approvedEndpointField = 'approved_' + $('#approved_endpoint_selector option:selected').data('type') + '_id',
- approvedEndpointVal = $('#approved_endpoint_selector option:selected').val();
-
- setData(endpointField, endpointVal);
- setData(approvedEndpointField, approvedEndpointVal);
-
- popup.dialog('close');
- });
-
- popup = monster.ui.dialog(popup_html, {
- title: self.i18n.active().callflows.eavesdrop.title,
- beforeClose: function() {
- if (typeof callback === 'function') {
- callback();
- }
- }
- });
- });
- }
- },*/
-
- /*'intercept[]': {
- name: self.i18n.active().callflows.intercept.name,
- icon: 'uturn_arrow',
- category: self.i18n.active().oldCallflows.advanced_cat,
- module: 'intercept',
- tip: self.i18n.active().callflows.intercept.tip,
- data: {},
- rules: [
- {
- type: 'quantity',
- maxSize: '1'
- }
- ],
- isUsable: 'true',
- weight: 48,
- caption: function(node) {
- return '';
- },
- edit: function(node, callback) {
- self.groupsGetEndpoints(function(formattedData) {
- var popup, popup_html;
-
- popup_html = $(self.getTemplate({
- name: 'intercept',
- data: {
- fieldData: formattedData,
- data: {
- 'selectedId': node.getMetadata('device_id') || node.getMetadata('user_id') || '',
- 'approvedId': node.getMetadata('approved_device_id') || node.getMetadata('approved_user_id') || node.getMetadata('approved_group_id') || ''
- }
- },
- submodule: 'groups'
- }));
-
- monster.ui.tooltips(popup_html);
-
- $('#add', popup_html).click(function() {
- var setData = function(field, value) {
- if (value === 'endpoint_empty') {
- node.deleteMetadata('user_id');
- node.deleteMetadata('device_id');
- } else if (value === 'approved_empty') {
- node.deleteMetadata('approved_user_id');
- node.deleteMetadata('approved_group_id');
- node.deleteMetadata('approved_device_id');
- } else {
- node.setMetadata(field, value);
- }
- };
-
- var endpointField = $('#endpoint_selector option:selected').data('type') + '_id',
- endpointVal = $('#endpoint_selector option:selected').val(),
- approvedEndpointField = 'approved_' + $('#approved_endpoint_selector option:selected').data('type') + '_id',
- approvedEndpointVal = $('#approved_endpoint_selector option:selected').val();
-
- setData(endpointField, endpointVal);
- setData(approvedEndpointField, approvedEndpointVal);
-
- popup.dialog('close');
- });
-
- popup = monster.ui.dialog(popup_html, {
- title: self.i18n.active().callflows.intercept.title,
- beforeClose: function() {
- if (typeof callback === 'function') {
- callback();
- }
- }
- });
- });
- }
- },*/
-
- 'ring_group_toggle[action=login]': {
- name: self.i18n.active().callflows.ringGroupToggle.loginTitle,
- icon: 'ring_group',
- category: self.i18n.active().callflows.ringGroupToggle.category,
- module: 'ring_group_toggle',
- tip: self.i18n.active().callflows.ringGroupToggle.loginTip,
- data: {
- action: 'login',
- callflow_id: 'null'
- },
- rules: [
- {
- type: 'quantity',
- maxSize: '1'
- }
- ],
- isUsable: 'true',
- weight: 1,
- caption: function(node, caption_map) {
- var id = node.getMetadata('callflow_id'),
- return_value = '';
-
- if (id in caption_map) {
- if (caption_map[id].hasOwnProperty('name')) {
- return_value = caption_map[id].name;
- } else if (caption_map[id].hasOwnProperty('numbers')) {
- return_value = caption_map[id].numbers.toString();
- }
- }
-
- return return_value;
- },
- edit: function(node, callback) {
- self.callApi({
- resource: 'callflow.list',
- data: {
- accountId: self.accountId,
- filters: { paginate: false }
- },
- success: function(data, status) {
- var popup, popup_html, _data = [];
-
- $.each(data.data, function() {
- if (!this.featurecode && this.id !== self.flow.id) {
- this.name = this.name ? this.name : ((this.numbers) ? this.numbers.toString() : self.i18n.active().oldCallflows.no_numbers);
-
- _data.push(this);
- }
- });
-
- popup_html = $(self.getTemplate({
- name: 'ring_group_login_dialog',
- data: {
- objects: {
- type: 'callflow',
- items: _.sortBy(_data, 'name'),
- selected: node.getMetadata('callflow_id') || ''
- }
- },
- submodule: 'groups'
- }));
-
- $('#add', popup_html).click(function() {
- node.setMetadata('callflow_id', $('#object-selector', popup_html).val());
-
- node.caption = $('#object-selector option:selected', popup_html).text();
-
- popup.dialog('close');
- });
-
- popup = monster.ui.dialog(popup_html, {
- title: self.i18n.active().oldCallflows.callflow_title,
- beforeClose: function() {
- if (typeof callback === 'function') {
- callback();
- }
- }
- });
- }
- });
- }
- },
-
- 'ring_group_toggle[action=logout]': {
- name: self.i18n.active().callflows.ringGroupToggle.logoutTitle,
- icon: 'ring_group',
- category: self.i18n.active().callflows.ringGroupToggle.category,
- module: 'ring_group_toggle',
- tip: self.i18n.active().callflows.ringGroupToggle.logoutTip,
- data: {
- action: 'logout',
- callflow_id: 'null'
- },
- rules: [
- {
- type: 'quantity',
- maxSize: '1'
- }
- ],
- isUsable: 'true',
- weight: 2,
- caption: function(node, caption_map) {
- var id = node.getMetadata('callflow_id'),
- return_value = '';
-
- if (id in caption_map) {
- if (caption_map[id].hasOwnProperty('name')) {
- return_value = caption_map[id].name;
- } else if (caption_map[id].hasOwnProperty('numbers')) {
- return_value = caption_map[id].numbers.toString();
- }
- }
-
- return return_value;
- },
- edit: function(node, callback) {
- self.callApi({
- resource: 'callflow.list',
- data: {
- accountId: self.accountId,
- filters: { paginate: false }
- },
- success: function(data, status) {
- var popup, popup_html, _data = [];
-
- $.each(data.data, function() {
- if (!this.featurecode && this.id !== self.flow.id) {
- this.name = this.name ? this.name : ((this.numbers) ? this.numbers.toString() : self.i18n.active().oldCallflows.no_numbers);
-
- _data.push(this);
- }
- });
-
- popup_html = $(self.getTemplate({
- name: 'ring_group_logout_dialog',
- data: {
- objects: {
- type: 'callflow',
- items: _.sortBy(_data, 'name'),
- selected: node.getMetadata('callflow_id') || ''
- }
- },
- submodule: 'groups'
- }));
-
- $('#add', popup_html).click(function() {
- node.setMetadata('callflow_id', $('#object-selector', popup_html).val());
-
- node.caption = $('#object-selector option:selected', popup_html).text();
-
- popup.dialog('close');
- });
-
- popup = monster.ui.dialog(popup_html, {
- title: self.i18n.active().oldCallflows.callflow_title,
- beforeClose: function() {
- if (typeof callback === 'function') {
- callback();
- }
- }
- });
- }
- });
- }
- }
- });
- },
-
- groupsGetEndpoints: function(callback) {
- var self = this;
-
- monster.parallel({
- 'group': function(callback) {
- self.groupsGroupList(function(data) {
- callback(null, data);
- });
- },
- 'user': function(callback) {
- self.groupsRequestUserList({
- success: function(data) {
- callback(null, data);
- }
- });
- },
- 'device': function(callback) {
- self.groupsRequestDeviceList({
- success: function(data) {
- callback(null, data);
- }
- });
- }
- }, function(err, results) {
- var data = self.groupsFormatEndpoints(results);
-
- callback(data);
- });
- },
-
- groupsFormatEndpoints: function(data) {
- _.each(data.user, function(user) {
- user.name = user.first_name + ' ' + user.last_name;
- });
-
- return data;
- },
-
- groupsEditPageGroup: function(node, callback) {
- var self = this;
-
- monster.waterfall([
- function(callback) {
- self.groupsRequestDeviceList({
- success: function(data) {
- callback(null, data);
- }
- });
- }
- ], function(err, data) {
- var popup,
- popup_html,
- endpoints = node.getMetadata('endpoints'),
- selected_endpoints = {},
- unselected_endpoints = [],
- unselected_groups = [],
- unselected_devices = [],
- unselected_users = [];
-
- if (endpoints) {
- // We need to translate the endpoints to prevent nasty O(N^2) time complexities,
- // we also need to clone to prevent managing of objects
- $.each($.extend(true, {}, endpoints), function(i, obj) {
- obj.name = 'Undefined Device';
- selected_endpoints[obj.id] = obj;
- });
- }
-
- $.each(data, function(i, obj) {
- obj.endpoint_type = 'device';
- if (obj.id in selected_endpoints) {
- selected_endpoints[obj.id].endpoint_type = 'device';
- selected_endpoints[obj.id].owner_id = obj.owner_id;
- selected_endpoints[obj.id].name = obj.name;
- } else {
- unselected_devices.push(obj);
- }
- });
-
- unselected_devices = _.sortBy(unselected_devices, 'name');
-
- self.groupsGroupList(function(_data) {
- $.each(_data, function(i, obj) {
- obj.endpoint_type = 'group';
- if (obj.id in selected_endpoints) {
- selected_endpoints[obj.id].endpoint_type = 'group';
- selected_endpoints[obj.id].name = obj.name;
- } else {
- unselected_groups.push(obj);
- }
- });
-
- unselected_groups = _.sortBy(unselected_groups, 'name');
-
- monster.waterfall([
- function(callback) {
- self.groupsRequestUserList({
- success: function(data) {
- callback(null, data);
- }
- });
- }
- ], function(err, _data) {
- $.each(_data, function(i, obj) {
- obj.name = obj.first_name + ' ' + obj.last_name;
- obj.endpoint_type = 'user';
- if (obj.id in selected_endpoints) {
- selected_endpoints[obj.id].endpoint_type = 'user';
- selected_endpoints[obj.id].name = obj.name;
- } else {
- unselected_users.push(obj);
- }
- });
- unselected_users = _.sortBy(unselected_users, 'name');
-
- popup_html = $(self.getTemplate({
- name: 'page_group_dialog',
- data: {
- form: {
- name: node.getMetadata('name') || '',
- audio: node.getMetadata('audio') || 'one-way'
- }
- },
- submodule: 'groups'
- }));
- $.each(unselected_groups, function() {
- $('#groups_pane .connect.left', popup_html)
- .append($(self.getTemplate({
- name: 'page_group_element',
- data: this,
- submodule: 'groups'
- })));
- });
-
- $.each(unselected_devices, function() {
- $('#devices_pane .connect.left', popup_html)
- .append($(self.getTemplate({
- name: 'page_group_element',
- data: this,
- submodule: 'groups'
- })));
- });
-
- $.each(unselected_users, function() {
- $('#users_pane .connect.left', popup_html)
- .append($(self.getTemplate({
- name: 'page_group_element',
- data: this,
- submodule: 'groups'
- })));
- });
-
- $.each(selected_endpoints, function() {
- //Check if user/device exists.
- if (this.endpoint_type) {
- $('.connect.right', popup_html)
- .append($(self.getTemplate({
- name: 'page_group_element',
- data: this,
- submodule: 'groups'
- })));
- }
- });
-
- $('#name', popup_html).bind('keyup blur change', function() {
- $('.column.right .title', popup_html).html('Page Group - ' + $(this).val());
- });
-
- $('ul.settings1 > li > a', popup_html).click(function(item) {
- $('.pane_content', popup_html).hide();
-
- //Reset Search field
- $('.searchfield', popup_html).val('');
- $('.column.left li', popup_html).show();
-
- $('ul.settings1 > li', popup_html).removeClass('current');
-
- var tab_id = $(this).attr('id');
-
- if (tab_id === 'users_tab_link') {
- $('#users_pane', popup_html).show();
- } else if (tab_id === 'devices_tab_link') {
- $('#devices_pane', popup_html).show();
- } else if (tab_id === 'groups_tab_link') {
- $('#groups_pane', popup_html).show();
- }
-
- $(this).parent().addClass('current');
- });
-
- $('.searchsubmit2', popup_html).click(function() {
- $('.searchfield', popup_html).val('');
- $('.column li', popup_html).show();
- });
-
- $('#devices_pane .searchfield', popup_html).keyup(function() {
- $('#devices_pane .column.left li').each(function() {
- if ($('.item_name', $(this)).html().toLowerCase().indexOf($('#devices_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
- $(this).hide();
- } else {
- $(this).show();
- }
- });
- });
-
- $('#users_pane .searchfield', popup_html).keyup(function() {
- $('#users_pane .column.left li').each(function() {
- if ($('.item_name', $(this)).html().toLowerCase().indexOf($('#users_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
- $(this).hide();
- } else {
- $(this).show();
- }
- });
- });
-
- $('#groups_pane .searchfield', popup_html).keyup(function() {
- $('#groups_pane .column.left li').each(function() {
- if ($('.item_name', $(this)).html().toLowerCase().indexOf($('#groups_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
- $(this).hide();
- } else {
- $(this).show();
- }
- });
- });
-
- if ($.isEmptyObject(selected_endpoints)) {
- $('.column.right .connect', popup_html).addClass('no_element');
- } else {
- $('.column.right .connect', popup_html).removeClass('no_element');
- }
-
- $('.column.left .options', popup_html).hide();
- $('.column.left .actions', popup_html).hide();
-
- $('.options .option.delay', popup_html).bind('keyup', function() {
- $(this).parents('li').data('delay', $(this).val());
- });
-
- $('.options .option.timeout', popup_html).bind('keyup', function() {
- $(this).parents('li').data('timeout', $(this).val());
- });
-
- $('#save_ring_group', popup_html).click(function() {
- var name = $('#name', popup_html).val();
- var audio = $('#audio', popup_html).val();
-
- endpoints = [];
-
- $('.right .connect li', popup_html).each(function() {
- var item_data = $(this).data();
- delete item_data.owner_id;
- endpoints.push(item_data);
- });
-
- node.setMetadata('endpoints', endpoints);
- node.setMetadata('name', name);
- node.setMetadata('audio', audio);
- node.caption = name;
-
- popup.dialog('close');
- });
-
- popup = monster.ui.dialog(popup_html, {
- title: self.i18n.active().oldCallflows.page_group_title,
- beforeClose: function() {
- if (typeof callback === 'function') {
- callback();
- }
- }
- });
-
- // $('.scrollable', popup).jScrollPane({
- // horizontalDragMinWidth: 0,
- // horizontalDragMaxWidth: 0
- // });
-
- $('.connect', popup).sortable({
- connectWith: $('.connect.right', popup),
- zIndex: 2000,
- helper: 'clone',
- appendTo: $('.wrapper', popup),
- scroll: false,
- tolerance: 'pointer',
- receive: function(ev, ui) {
- var data = ui.item[0].dataset,
- list_li = [],
- confirm_text;
-
- if (data.endpoint_type === 'device') {
- confirm_text = self.i18n.active().oldCallflows.the_owner_of_this_device_is_already;
- $('.connect.right li', popup_html).each(function() {
- if ($(this).data('id') === data.owner_id) {
- list_li.push($(this));
- }
- });
- } else if (data.endpoint_type === 'user') {
- confirm_text = self.i18n.active().oldCallflows.this_user_has_already_some_devices;
- $('.connect.right li', popup_html).each(function() {
- if ($(this).data('owner_id') === data.id) {
- list_li.push($(this));
- }
- });
- }
-
- if (list_li.length > 0) {
- monster.ui.confirm(confirm_text,
- function() {
- $.each(list_li, function() {
- remove_element(this);
- });
- },
- function() {
- remove_element(ui.item);
- }
- );
- }
-
- if ($(this).hasClass('right')) {
- $('.options', ui.item).show();
- $('.actions', ui.item).show();
- //$('.item_name', ui.item).addClass('right');
- $('.column.right .connect', popup).removeClass('no_element');
- }
- }
- });
-
- $(popup_html).delegate('.trash', 'click', function() {
- var $parent_li = $(this).parents('li').first();
- remove_element($parent_li);
- });
-
- $('.pane_content', popup_html).hide();
- $('#users_pane', popup_html).show();
-
- var remove_element = function(li) {
- var $parent_li = li;
- var data = $parent_li.data();
- data.name = jQuery.trim($('.item_name', $parent_li).html());
- $('#' + data.endpoint_type + 's_pane .connect.left', popup_html)
- .append($(self.getTemplate({
- name: 'page_group_element',
- data: data,
- submodule: 'groups'
- })));
- $parent_li.remove();
-
- if ($('.connect.right li', popup_html).size() === 0) {
- $('.column.right .connect', popup).addClass('no_element');
- }
-
- if (data.name.toLowerCase().indexOf($('#' + data.endpoint_type + 's_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
- $('#' + data.id, popup_html).hide();
- }
- };
- });
- });
- });
- },
-
- groupsEditRingGroup: function(node, callback) {
- var self = this,
- default_timeout = '20',
- default_delay = '0';
-
- monster.waterfall([
- function(callback) {
- self.groupsRequestDeviceList({
- success: function(data) {
- callback(null, data);
- }
- });
- }
- ], function(err, data) {
- var popup,
- popup_html,
- endpoints = node.getMetadata('endpoints'),
- selected_endpoints = {},
- unselected_endpoints = [],
- unselected_groups = [],
- unselected_devices = [],
- unselected_users = [];
-
- if (endpoints) {
- // We need to translate the endpoints to prevent nasty O(N^2) time complexities,
- // we also need to clone to prevent managing of objects
- $.each($.extend(true, {}, endpoints), function(i, obj) {
- obj.name = self.i18n.active().oldCallflows.undefined_device;
- selected_endpoints[obj.id] = obj;
- });
- }
-
- $.each(data, function(i, obj) {
- obj.endpoint_type = 'device';
- if (obj.id in selected_endpoints) {
- selected_endpoints[obj.id].endpoint_type = 'device';
- selected_endpoints[obj.id].owner_id = obj.owner_id;
- selected_endpoints[obj.id].name = obj.name;
- } else {
- obj.delay = default_delay;
- obj.timeout = default_timeout;
- unselected_devices.push(obj);
- }
- });
-
- unselected_devices = _.sortBy(unselected_devices, 'name');
-
- self.groupsGroupList(function(_data) {
- $.each(_data, function(i, obj) {
- obj.endpoint_type = 'group';
- if (obj.id in selected_endpoints) {
- selected_endpoints[obj.id].endpoint_type = 'group';
- selected_endpoints[obj.id].name = obj.name;
- } else {
- obj.delay = default_delay;
- obj.timeout = default_timeout;
- unselected_groups.push(obj);
- }
- });
-
- unselected_groups = _.sortBy(unselected_groups, 'name');
-
- monster.waterfall([
- function(callback) {
- self.groupsRequestUserList({
- success: function(data) {
- callback(null, data);
- }
- });
- }
- ], function(err, _data) {
- $.each(_data, function(i, obj) {
- obj.name = obj.first_name + ' ' + obj.last_name;
- obj.endpoint_type = 'user';
- if (obj.id in selected_endpoints) {
- selected_endpoints[obj.id].endpoint_type = 'user';
- selected_endpoints[obj.id].name = obj.name;
- } else {
- obj.delay = default_delay;
- obj.timeout = default_timeout;
- unselected_users.push(obj);
- }
- });
-
- unselected_users = _.sortBy(unselected_users, 'name');
-
- self.groupsMediaList(function(_data) {
- var media_array = _data.sort(function(a, b) {
- return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1;
- }),
- mediaId = node.getMetadata('ringback') || 'default',
- isShoutcast = mediaId.indexOf('://') >= 0 && mediaId !== 'silence_stream://300000',
- strategy = node.getMetadata('strategy');
-
- popup_html = $(self.getTemplate({
- name: 'ring_group_dialog',
- data: {
- form: {
- name: node.getMetadata('name') || '',
- strategy: {
- items: [
- {
- id: 'simultaneous',
- name: self.i18n.active().oldCallflows.at_the_same_time
- },
- {
- id: 'single',
- name: self.i18n.active().oldCallflows.in_order
- }
- ],
- selected: node.getMetadata('strategy') || 'simultaneous'
- },
- timeout: node.getMetadata('timeout') || '30',
- repeats: node.getMetadata('repeats') || 1,
- ringback: {
- items: $.merge([
- {
- id: 'default',
- name: self.i18n.active().oldCallflows.default,
- class: 'uneditable'
- },
- {
- id: 'silence_stream://300000',
- name: self.i18n.active().oldCallflows.silence,
- class: 'uneditable'
- },
- {
- id: 'shoutcast_url',
- name: self.i18n.active().callflows.media.shoutcastURL,
- class: 'uneditable'
- }
- ], media_array),
- selected: isShoutcast ? 'shoutcast_url' : mediaId,
- shoutcastValue: mediaId
- }
- }
- },
- submodule: 'groups'
- }));
-
- $.each(unselected_groups, function() {
- $('#groups_pane .connect.left', popup_html)
- .append($(self.getTemplate({
- name: 'ring_group_element',
- data: this,
- submodule: 'groups'
- })));
- });
-
- $.each(unselected_devices, function() {
- $('#devices_pane .connect.left', popup_html)
- .append($(self.getTemplate({
- name: 'ring_group_element',
- data: this,
- submodule: 'groups'
- })));
- });
-
- $.each(unselected_users, function() {
- $('#users_pane .connect.left', popup_html)
- .append($(self.getTemplate({
- name: 'ring_group_element',
- data: this,
- submodule: 'groups'
- })));
- });
-
- $.each(selected_endpoints, function() {
- //Check if user/device exists.
- if (this.endpoint_type) {
- $('.connect.right', popup_html)
- .append($(self.getTemplate({
- name: 'ring_group_element',
- data: this,
- submodule: 'groups'
- })));
- }
- });
-
- //Hide delay column if ring strategy is set to 'In order'
- if (strategy === 'single') {
- $('.options .option.delay', popup_html).hide();
- }
-
- $('#name', popup_html).bind('keyup blur change', function() {
- $('.column.right .title', popup_html).html(self.i18n.active().oldCallflows.ring_group_val + $(this).val());
- });
-
- $('#ringback', popup_html).change(function(e) {
- var val = $(this).val(),
- isShoutcast = val === 'shoutcast_url';
-
- popup_html.find('.shoutcast-div').toggleClass('hidden', !isShoutcast).find('input').val('');
-
- if ($(this).find('option:selected').hasClass('uneditable')) {
- $('.media_action[data-action="edit"]', popup_html).hide();
- } else {
- $('.media_action[data-action="edit"]', popup_html).show();
- }
- });
-
- $('.media_action', popup_html).click(function(e) {
- var isCreation = $(this).data('action') === 'create',
- mediaData = isCreation ? {} : { id: $('#ringback', popup_html).val() };
-
- monster.pub('callflows.media.editPopup', {
- data: mediaData,
- callback: function(_mediaData) {
- if (_mediaData) {
- if (isCreation) {
- $('#ringback', popup_html).append('');
- } else {
- $('#ringback option[value="' + _mediaData.id + '"]', popup_html).text(_mediaData.name);
- }
- $('#ringback', popup_html).val(_mediaData.id);
- }
- }
- });
- });
-
- $('ul.settings1 > li > a', popup_html).click(function(item) {
- $('.pane_content', popup_html).hide();
-
- //Reset Search field
- $('.searchfield', popup_html).val('');
- $('.column.left li', popup_html).show();
-
- $('ul.settings1 > li', popup_html).removeClass('current');
-
- var tab_id = $(this).attr('id');
-
- if (tab_id === 'users_tab_link') {
- $('#users_pane', popup_html).show();
- } else if (tab_id === 'devices_tab_link') {
- $('#devices_pane', popup_html).show();
- } else if (tab_id === 'groups_tab_link') {
- $('#groups_pane', popup_html).show();
- }
-
- $(this).parent().addClass('current');
- });
-
- $('.searchsubmit2', popup_html).click(function() {
- $('.searchfield', popup_html).val('');
- $('.column li', popup_html).show();
- });
-
- $('#devices_pane .searchfield', popup_html).keyup(function() {
- $('#devices_pane .column.left li').each(function() {
- if ($('.item_name', $(this)).html().toLowerCase().indexOf($('#devices_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
- $(this).hide();
- } else {
- $(this).show();
- }
- });
- });
-
- $('#users_pane .searchfield', popup_html).keyup(function() {
- $('#users_pane .column.left li').each(function() {
- if ($('.item_name', $(this)).html().toLowerCase().indexOf($('#users_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
- $(this).hide();
- } else {
- $(this).show();
- }
- });
- });
-
- $('#groups_pane .searchfield', popup_html).keyup(function() {
- $('#groups_pane .column.left li').each(function() {
- if ($('.item_name', $(this)).html().toLowerCase().indexOf($('#groups_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
- $(this).hide();
- } else {
- $(this).show();
- }
- });
- });
-
- if ($.isEmptyObject(selected_endpoints)) {
- $('.column.right .connect', popup_html).addClass('no_element');
- } else {
- $('.column.right .connect', popup_html).removeClass('no_element');
- }
-
- $('.column.left .options', popup_html).hide();
- $('.column.left .actions', popup_html).hide();
-
- $('.options .option.delay', popup_html).bind('keyup', function() {
- $(this).parents('li').data('delay', $(this).val());
- });
-
- $('.options .option.timeout', popup_html).bind('keyup', function() {
- $(this).parents('li').data('timeout', $(this).val());
- });
-
- $('#strategy', popup_html).bind('change', function() {
- var strategy = $(this).val(),
- $delay = $('.options .option.delay', popup_html);
- $delayTitle = $('.options .delay_title', popup_html);
-
- if (strategy === 'single') {
- $delay.hide();
- $delayTitle.hide();
- } else {
- $delay.show();
- $delayTitle.show();
- }
- });
-
- $('#save_ring_group', popup_html).click(function() {
- var name = $('#name', popup_html).val(),
- global_timeout = 0,
- strategy = $('#strategy', popup_html).val(),
- ringback = $('#ringback', popup_html).val(),
- repeats = $('#repeats', popup_html).val(),
- shoutcastValue = $('.shoutcast-url-input', popup_html).val();
-
- if (ringback === 'shoutcast_url') {
- ringback = shoutcastValue;
- }
-
- endpoints = [];
-
- if (strategy === 'simultaneous') {
- var computeTimeout = function(delay, local_timeout, global_timeout) {
- var duration = delay + local_timeout;
-
- if (duration > global_timeout) {
- global_timeout = duration;
- }
-
- return global_timeout;
- };
- } else {
- var computeTimeout = function(delay, local_timeout, global_timeout) {
- global_timeout += local_timeout;
-
- return global_timeout;
- };
- }
-
- $('.right .connect li', popup_html).each(function() {
- var item_data = $(this).data();
-
- if (strategy === 'single') {
- delete item_data.delay;
- }
- delete item_data.owner_id;
- endpoints.push(item_data);
- global_timeout = computeTimeout(parseFloat(item_data.delay), parseFloat(item_data.timeout), global_timeout);
- });
-
- if (repeats < 1) {
- repeats = 1;
- }
-
- node.setMetadata('endpoints', endpoints);
- node.setMetadata('name', name);
- node.setMetadata('strategy', strategy);
- node.setMetadata('timeout', global_timeout);
- node.setMetadata('repeats', repeats);
- if (ringback === 'default') {
- node.deleteMetadata('ringback', ringback);
- } else {
- node.setMetadata('ringback', ringback);
- }
-
- node.caption = name;
-
- popup.dialog('close');
- });
-
- monster.ui.tooltips(popup_html);
-
- popup = monster.ui.dialog(popup_html, {
- title: self.i18n.active().oldCallflows.ring_group,
- beforeClose: function() {
- if (typeof callback === 'function') {
- callback();
- }
- }
- });
-
- // $('.scrollable', popup).jScrollPane({
- // horizontalDragMinWidth: 0,
- // horizontalDragMaxWidth: 0
- // });
-
- $('.connect', popup).sortable({
- connectWith: $('.connect.right', popup),
- zIndex: 2000,
- helper: 'clone',
- appendTo: $('.wrapper', popup),
- scroll: false,
- tolerance: 'pointer',
- receive: function(ev, ui) {
- var data = ui.item[0].dataset,
- list_li = [],
- confirm_text;
-
- if (data.endpoint_type === 'device') {
- confirm_text = self.i18n.active().oldCallflows.the_owner_of_this_device_is_already;
- $('.connect.right li', popup_html).each(function() {
- if ($(this).data('id') === data.owner_id) {
- list_li.push($(this));
- }
- });
- } else if (data.endpoint_type === 'user') {
- confirm_text = self.i18n.active().oldCallflows.this_user_has_already_some_devices;
- $('.connect.right li', popup_html).each(function() {
- if ($(this).data('owner_id') === data.id) {
- list_li.push($(this));
- }
- });
- }
-
- if (list_li.length > 0) {
- monster.ui.confirm(confirm_text,
- function() {
- $.each(list_li, function() {
- remove_element(this);
- });
- },
- function() {
- remove_element(ui.item);
- }
- );
- }
-
- if ($(this).hasClass('right')) {
- $('.options', ui.item).show();
- $('.actions', ui.item).show();
- //$('.item_name', ui.item).addClass('right');
- $('.column.right .connect', popup).removeClass('no_element');
- }
- }
- });
-
- $(popup_html).delegate('.trash', 'click', function() {
- var $parent_li = $(this).parents('li').first();
- remove_element($parent_li);
- });
-
- $('.pane_content', popup_html).hide();
- $('#users_pane', popup_html).show();
- if ($('#ringback option:selected').hasClass('uneditable')) {
- $('.media_action[data-action="edit"]', popup_html).hide();
- } else {
- $('.media_action[data-action="edit"]', popup_html).show();
- }
-
- var remove_element = function(li) {
- var $parent_li = li;
- var data = $parent_li.data();
- data.name = jQuery.trim($('.item_name', $parent_li).html());
- $('#' + data.endpoint_type + 's_pane .connect.left', popup_html)
- .append($(self.getTemplate({
- name: 'ring_group_element',
- data: data,
- submodule: 'groups'
- })));
- $parent_li.remove();
-
- if ($('.connect.right li', popup_html).size() === 0) {
- $('.column.right .connect', popup).addClass('no_element');
- }
-
- if (data.name.toLowerCase().indexOf($('#' + data.endpoint_type + 's_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
- $('#' + data.id, popup_html).hide();
- }
- };
- });
- });
- });
- });
- },
-
- groupsGroupList: function(callback) {
- var self = this;
-
- self.callApi({
- resource: 'group.list',
- data: {
- accountId: self.accountId,
- filters: {
- paginate: false
- }
- },
- success: function(data, status) {
- callback && callback(data.data);
- }
- });
- },
-
- groupsMediaList: function(callback) {
- var self = this;
-
- self.callApi({
- resource: 'media.list',
- data: {
- accountId: self.accountId,
- filters: {
- paginate: false
- }
- },
- success: function(data, status) {
- callback && callback(data.data);
- }
- });
- },
-
- groupsNormalizeData: function(form_data) {
- delete form_data.users;
- return form_data;
- },
-
- groupsSave: function(form_data, data, success, error) {
- var self = this,
- normalized_data = self.groupsNormalizeData($.extend(true, {}, data.data, form_data));
-
- if (typeof data.data === 'object' && data.data.id) {
- self.callApi({
- resource: 'group.update',
- data: {
- accountId: self.accountId,
- groupId: data.data.id,
- data: normalized_data
- },
- success: function(_data) {
- success(_data.data, status, 'update');
- }
- });
- } else {
- self.callApi({
- resource: 'group.create',
- data: {
- accountId: self.accountId,
- data: normalized_data
- },
- success: function(_data) {
- success(_data.data, status, 'create');
- }
- });
- }
- },
-
- groupsDelete: function(data, callback) {
- var self = this;
-
- if (typeof data.data === 'object' && data.data.id) {
- self.callApi({
- resource: 'group.delete',
- data: {
- accountId: self.accountId,
- groupId: data.data.id
- },
- success: function(_data) {
- callback && callback(_data, status);
- }
- });
- }
- },
-
- groupsRequestUserList: function(args) {
- var self = this;
-
- self.callApi({
- resource: 'user.list',
- data: _.merge({
- accountId: self.accountId,
- filters: {
- paginate: false
- }
- }, args.data),
- success: function(data, status) {
- args.hasOwnProperty('success') && args.success(data.data);
- },
- error: function(parsedError) {
- args.hasOwnProperty('error') && args.error(parsedError);
- }
- });
- },
-
- groupsRequestDeviceList: function(args) {
- var self = this;
-
- self.callApi({
- resource: 'device.list',
- data: _.merge({
- accountId: self.accountId,
- filters: {
- paginate: false
- }
- }, args.data),
- success: function(data, status) {
- args.hasOwnProperty('success') && args.success(data.data);
- },
- error: function(parsedError) {
- args.hasOwnProperty('error') && args.error(parsedError);
- }
- });
- }
- };
-
- return app;
-});
+define(function(require) {
+ var $ = require('jquery'),
+ _ = require('lodash'),
+ monster = require('monster');
+
+ var app = {
+ requests: {},
+
+ subscribe: {
+ 'callflows.fetchActions': 'groupsDefineActions',
+ 'callflows.groups.edit': '_groupsEdit'
+ },
+
+ groupsRender: function(data, target, callbacks) {
+ var self = this,
+ groups_html = $(self.getTemplate({
+ name: 'edit',
+ data: data,
+ submodule: 'groups'
+ })),
+ groupForm = groups_html.find('#group-form');
+
+ monster.ui.validate(groupForm, {
+ rules: {
+ 'name': {
+ required: true
+ }
+ }
+ });
+
+ self.winkstartTabs(groups_html);
+
+ $('#tab_users > .rows', groups_html).sortable({
+ handle: '.column.first'
+ });
+
+ self.groupsRenderEndpointList(data, groups_html);
+
+ $('.group-save', groups_html).click(function(ev) {
+ ev.preventDefault();
+
+ var $this = $(this);
+
+ if (!$this.hasClass('disabled')) {
+ $this.addClass('disabled');
+
+ if (monster.ui.valid(groupForm)) {
+ var form_data = monster.ui.getFormData('group-form');
+ self.groupsCleanFormData(form_data, data.field_data);
+
+ form_data.endpoints = {};
+
+ $('.rows .row:not(#row_no_data)', groups_html).each(function(k, v) {
+ form_data.endpoints[$(v).data('id')] = {
+ type: $(v).data('type'),
+ weight: k + 1
+ };
+ });
+
+ delete data.data.resources;
+ delete data.data.endpoints;
+
+ self.groupsSave(form_data, data, callbacks.save_success);
+ } else {
+ $this.removeClass('disabled');
+ monster.ui.alert(self.i18n.active().callflows.groups.there_were_errors_on_the_form);
+ }
+ }
+ });
+
+ $('.group-delete', groups_html).click(function(ev) {
+ ev.preventDefault();
+
+ monster.ui.confirm(self.i18n.active().callflows.groups.are_you_sure_you_want_to_delete, function() {
+ self.groupsDelete(data, callbacks.delete_success);
+ });
+ });
+
+ var add_user = function() {
+ var $user = $('#select_user_id', groups_html);
+
+ if ($user.val() !== 'empty_option_user') {
+ var user_id = $user.val();
+
+ $.each(data.field_data.users, function(k, v) {
+ if (user_id === v.id) {
+ var user_data = {
+ endpoint_id: user_id,
+ endpoint_type: 'user',
+ endpoint_name: v.first_name + ' ' + v.last_name
+ };
+
+ data.data.endpoints.push(user_data);
+
+ data.data.endpoints.sort(function(a, b) {
+ return a.endpoint_name.toLowerCase() > b.endpoint_name.toLowerCase();
+ });
+
+ self.groupsRenderEndpointList(data, groups_html);
+ $user.val('empty_option_user');
+ }
+ });
+ }
+ },
+ add_device = function() {
+ var $device = $('#select_device_id', groups_html);
+
+ if ($device.val() !== 'empty_option_device') {
+ var device_id = $device.val();
+
+ $.each(data.field_data.devices, function(k, v) {
+ if (device_id === v.id) {
+ var device_data = {
+ endpoint_id: device_id,
+ endpoint_type: 'device',
+ endpoint_name: v.name
+ };
+
+ data.data.endpoints.push(device_data);
+
+ data.data.endpoints.sort(function(a, b) {
+ return a.endpoint_name.toLowerCase() > b.endpoint_name.toLowerCase();
+ });
+
+ self.groupsRenderEndpointList(data, groups_html);
+
+ $device.val('empty_option_device');
+ }
+ });
+ }
+ };
+
+ $('#select_user_id', groups_html).change(function() {
+ add_user();
+ });
+ $('#select_device_id', groups_html).change(function() {
+ add_device();
+ });
+
+ groups_html.find('#group-form').on('click', '.action_endpoint.delete', function() {
+ var endpoint_id = $(this).data('id');
+ //removes it from the grid
+ $('#row_endpoint_' + endpoint_id, groups_html).remove();
+ //re-add it to the dropdown
+ $('#option_endpoint_' + endpoint_id, groups_html).show();
+ //if grid empty, add no data line
+ if ($('.rows .row', groups_html).size() === 0) {
+ $('.rows', groups_html)
+ .append($(self.getTemplate({
+ name: 'endpoint_row',
+ submodule: 'groups'
+ })));
+ }
+
+ /* TODO For some reason splice doesn't work and I don't have time to make it better for now */
+ var new_list = [];
+
+ $.each(data.data.endpoints, function(k, v) {
+ if (!(v.endpoint_id === endpoint_id)) {
+ new_list.push(v);
+ }
+ });
+
+ data.data.endpoints = new_list;
+ });
+
+ (target)
+ .empty()
+ .append(groups_html);
+ },
+
+ // Added for the subscribed event to avoid refactoring mediaEdit
+ _groupsEdit: function(args) {
+ var self = this;
+ self.groupsEdit(args.data, args.parent, args.target, args.callbacks, args.data_defaults);
+ },
+
+ groupsEdit: function(data, _parent, _target, _callbacks, data_defaults) {
+ var self = this,
+ parent = _parent || $('#groups-content'),
+ target = _target || $('#groups-view', parent),
+ callbacks = {
+ save_success: _callbacks.save_success,
+ save_error: _callbacks.save_error,
+ delete_success: _callbacks.delete_success,
+ delete_error: _callbacks.delete_error,
+ after_render: _callbacks.after_render
+ },
+ defaults = {
+ data: $.extend(true, {
+ endpoints: {},
+ music_on_hold: {}
+ }, data_defaults || {}),
+ field_data: {}
+ };
+
+ monster.parallel({
+ device_list: function(callback) {
+ self.groupsRequestDeviceList({
+ success: function(data) {
+ defaults.field_data.devices = data;
+ callback(null, data);
+ }
+ });
+ },
+ user_list: function(callback) {
+ self.groupsRequestUserList({
+ success: function(data) {
+ defaults.field_data.users = data;
+ callback(null, {});
+ }
+ });
+ },
+
+ groups_get: function(callback) {
+ if (typeof data === 'object' && data.id) {
+ self.callApi({
+ resource: 'group.get',
+ data: {
+ accountId: self.accountId,
+ groupId: data.id
+ },
+ success: function(data) {
+ callback(null, data);
+ }
+ });
+ } else {
+ callback(null, {});
+ }
+ }
+ }, function(err, results) {
+ var render_data = defaults;
+
+ if (typeof data === 'object' && data.id) {
+ render_data = $.extend(true, defaults, results.groups_get);
+ }
+
+ render_data = self.groupsFormatData(render_data);
+
+ self.groupsRender(render_data, target, callbacks);
+ });
+ },
+
+ groupsRenderEndpointList: function(data, parent) {
+ var self = this;
+
+ $('.rows', parent).empty();
+
+ if ('endpoints' in data.data && data.data.endpoints.length > 0) {
+ $.each(data.data.endpoints, function(k, item) {
+ $('.rows', parent)
+ .append($(self.getTemplate({
+ name: 'endpoint_row',
+ data: item,
+ submodule: 'groups'
+ })));
+ $('#option_endpoint_' + item.endpoint_id, parent).hide();
+ });
+ } else {
+ $('.rows', parent)
+ .empty()
+ .append($(self.getTemplate({
+ name: 'endpoint_row',
+ submodule: 'groups'
+ })));
+ }
+ },
+
+ groupsCleanFormData: function(form_data, field_data) {
+ delete form_data.extra;
+ },
+
+ groupsFormatData: function(data) {
+ var user_item,
+ endpoint_item,
+ list_endpoint = [];
+
+ $.each(data.field_data.users, function(k, v) {
+ if (v.id in data.data.endpoints) {
+ endpoint_item = {
+ endpoint_type: 'user',
+ endpoint_id: v.id,
+ endpoint_name: v.first_name + ' ' + v.last_name,
+ endpoint_weight: data.data.endpoints[v.id].weight || 0
+ };
+
+ list_endpoint.push(endpoint_item);
+ }
+ });
+
+ $.each(data.field_data.devices, function(k, v) {
+ if (v.id in data.data.endpoints) {
+ endpoint_item = {
+ endpoint_type: 'device',
+ endpoint_id: v.id,
+ endpoint_name: v.name,
+ endpoint_weight: data.data.endpoints[v.id].weight || 0
+ };
+
+ list_endpoint.push(endpoint_item);
+ }
+ });
+
+ list_endpoint.sort(function(a, b) {
+ return a.endpoint_weight - b.endpoint_weight;
+ });
+
+ data.data.endpoints = list_endpoint;
+
+ return data;
+ },
+
+ groupsDefineActions: function(args) {
+ var self = this,
+ callflow_nodes = args.actions;
+
+ $.extend(callflow_nodes, {
+ 'ring_group[]': {
+ name: self.i18n.active().oldCallflows.ring_group,
+ icon: 'ring_group',
+ category: self.i18n.active().oldCallflows.basic_cat,
+ module: 'ring_group',
+ tip: self.i18n.active().oldCallflows.ring_group_tip,
+ data: {
+ name: ''
+ },
+ rules: [
+ {
+ type: 'quantity',
+ maxSize: '1'
+ }
+ ],
+ isUsable: 'true',
+ weight: 20,
+ caption: function(node) {
+ return node.getMetadata('name') || '';
+ },
+ edit: function(node, callback) {
+ self.groupsEditRingGroup(node, callback);
+ }
+ },
+ 'groups': {
+ name: self.i18n.active().callflows.groups.title,
+ module: 'groups',
+ listEntities: function(callback) {
+ self.callApi({
+ resource: 'group.list',
+ data: {
+ accountId: self.accountId,
+ filters: {
+ paginate: false
+ }
+ },
+ success: function(data, status) {
+ callback && callback(data.data);
+ }
+ });
+ },
+ editEntity: 'callflows.groups.edit'
+ },
+ 'page_group[]': {
+ name: self.i18n.active().oldCallflows.page_group,
+ icon: 'ring_group',
+ category: self.i18n.active().oldCallflows.advanced_cat,
+ module: 'page_group',
+ tip: self.i18n.active().oldCallflows.page_group_tip,
+ data: {
+ name: ''
+ },
+ rules: [
+ {
+ type: 'quantity',
+ maxSize: '1'
+ }
+ ],
+ isUsable: 'true',
+ weight: 30,
+ caption: function(node) {
+ return node.getMetadata('name') || '';
+ },
+ edit: function(node, callback) {
+ self.groupsEditPageGroup(node, callback);
+ }
+ },
+
+ /*'eavesdrop[]': {
+ name: self.i18n.active().callflows.eavesdrop.name,
+ icon: 'headset',
+ category: self.i18n.active().oldCallflows.advanced_cat,
+ module: 'eavesdrop',
+ tip: self.i18n.active().callflows.eavesdrop.tip,
+ data: {},
+ rules: [
+ {
+ type: 'quantity',
+ maxSize: '1'
+ }
+ ],
+ isUsable: 'true',
+ weight: 48,
+ caption: function(node) {
+ return '';
+ },
+ edit: function(node, callback) {
+ self.groupsGetEndpoints(function(formattedData) {
+ var popup, popup_html;
+
+ popup_html = $(self.getTemplate({
+ name: 'eavesdrop',
+ data: {
+ fieldData: formattedData,
+ data: {
+ 'selectedId': node.getMetadata('device_id') || node.getMetadata('user_id') || '',
+ 'approvedId': node.getMetadata('approved_device_id') || node.getMetadata('approved_user_id') || node.getMetadata('approved_group_id') || ''
+ }
+ },
+ submodule: 'groups'
+ }));
+
+ monster.ui.tooltips(popup_html);
+
+ $('#add', popup_html).click(function() {
+ var setData = function(field, value) {
+ if (value === 'endpoint_empty') {
+ node.deleteMetadata('user_id');
+ node.deleteMetadata('device_id');
+ } else if (value === 'approved_empty') {
+ node.deleteMetadata('approved_user_id');
+ node.deleteMetadata('approved_group_id');
+ node.deleteMetadata('approved_device_id');
+ } else {
+ node.setMetadata(field, value);
+ }
+ };
+
+ var endpointField = $('#endpoint_selector option:selected').data('type') + '_id',
+ endpointVal = $('#endpoint_selector option:selected').val(),
+ approvedEndpointField = 'approved_' + $('#approved_endpoint_selector option:selected').data('type') + '_id',
+ approvedEndpointVal = $('#approved_endpoint_selector option:selected').val();
+
+ setData(endpointField, endpointVal);
+ setData(approvedEndpointField, approvedEndpointVal);
+
+ popup.dialog('close');
+ });
+
+ popup = monster.ui.dialog(popup_html, {
+ title: self.i18n.active().callflows.eavesdrop.title,
+ beforeClose: function() {
+ if (typeof callback === 'function') {
+ callback();
+ }
+ }
+ });
+ });
+ }
+ },*/
+
+ /*'intercept[]': {
+ name: self.i18n.active().callflows.intercept.name,
+ icon: 'uturn_arrow',
+ category: self.i18n.active().oldCallflows.advanced_cat,
+ module: 'intercept',
+ tip: self.i18n.active().callflows.intercept.tip,
+ data: {},
+ rules: [
+ {
+ type: 'quantity',
+ maxSize: '1'
+ }
+ ],
+ isUsable: 'true',
+ weight: 48,
+ caption: function(node) {
+ return '';
+ },
+ edit: function(node, callback) {
+ self.groupsGetEndpoints(function(formattedData) {
+ var popup, popup_html;
+
+ popup_html = $(self.getTemplate({
+ name: 'intercept',
+ data: {
+ fieldData: formattedData,
+ data: {
+ 'selectedId': node.getMetadata('device_id') || node.getMetadata('user_id') || '',
+ 'approvedId': node.getMetadata('approved_device_id') || node.getMetadata('approved_user_id') || node.getMetadata('approved_group_id') || ''
+ }
+ },
+ submodule: 'groups'
+ }));
+
+ monster.ui.tooltips(popup_html);
+
+ $('#add', popup_html).click(function() {
+ var setData = function(field, value) {
+ if (value === 'endpoint_empty') {
+ node.deleteMetadata('user_id');
+ node.deleteMetadata('device_id');
+ } else if (value === 'approved_empty') {
+ node.deleteMetadata('approved_user_id');
+ node.deleteMetadata('approved_group_id');
+ node.deleteMetadata('approved_device_id');
+ } else {
+ node.setMetadata(field, value);
+ }
+ };
+
+ var endpointField = $('#endpoint_selector option:selected').data('type') + '_id',
+ endpointVal = $('#endpoint_selector option:selected').val(),
+ approvedEndpointField = 'approved_' + $('#approved_endpoint_selector option:selected').data('type') + '_id',
+ approvedEndpointVal = $('#approved_endpoint_selector option:selected').val();
+
+ setData(endpointField, endpointVal);
+ setData(approvedEndpointField, approvedEndpointVal);
+
+ popup.dialog('close');
+ });
+
+ popup = monster.ui.dialog(popup_html, {
+ title: self.i18n.active().callflows.intercept.title,
+ beforeClose: function() {
+ if (typeof callback === 'function') {
+ callback();
+ }
+ }
+ });
+ });
+ }
+ },*/
+
+ 'ring_group_toggle[action=login]': {
+ name: self.i18n.active().callflows.ringGroupToggle.loginTitle,
+ icon: 'ring_group',
+ category: self.i18n.active().callflows.ringGroupToggle.category,
+ module: 'ring_group_toggle',
+ tip: self.i18n.active().callflows.ringGroupToggle.loginTip,
+ data: {
+ action: 'login',
+ callflow_id: 'null'
+ },
+ rules: [
+ {
+ type: 'quantity',
+ maxSize: '1'
+ }
+ ],
+ isUsable: 'true',
+ weight: 1,
+ caption: function(node, caption_map) {
+ var id = node.getMetadata('callflow_id'),
+ return_value = '';
+
+ if (id in caption_map) {
+ if (caption_map[id].hasOwnProperty('name')) {
+ return_value = caption_map[id].name;
+ } else if (caption_map[id].hasOwnProperty('numbers')) {
+ return_value = caption_map[id].numbers.toString();
+ }
+ }
+
+ return return_value;
+ },
+ edit: function(node, callback) {
+ self.callApi({
+ resource: 'callflow.list',
+ data: {
+ accountId: self.accountId,
+ filters: { paginate: false }
+ },
+ success: function(data, status) {
+ var popup, popup_html, _data = [];
+
+ $.each(data.data, function() {
+ if (!this.featurecode && this.id !== self.flow.id) {
+ this.name = this.name ? this.name : ((this.numbers) ? this.numbers.toString() : self.i18n.active().oldCallflows.no_numbers);
+
+ _data.push(this);
+ }
+ });
+
+ popup_html = $(self.getTemplate({
+ name: 'ring_group_login_dialog',
+ data: {
+ objects: {
+ type: 'callflow',
+ items: _.sortBy(_data, 'name'),
+ selected: node.getMetadata('callflow_id') || ''
+ }
+ },
+ submodule: 'groups'
+ }));
+
+ $('#add', popup_html).click(function() {
+ node.setMetadata('callflow_id', $('#object-selector', popup_html).val());
+
+ node.caption = $('#object-selector option:selected', popup_html).text();
+
+ popup.dialog('close');
+ });
+
+ popup = monster.ui.dialog(popup_html, {
+ title: self.i18n.active().oldCallflows.callflow_title,
+ beforeClose: function() {
+ if (typeof callback === 'function') {
+ callback();
+ }
+ }
+ });
+ }
+ });
+ }
+ },
+
+ 'ring_group_toggle[action=logout]': {
+ name: self.i18n.active().callflows.ringGroupToggle.logoutTitle,
+ icon: 'ring_group',
+ category: self.i18n.active().callflows.ringGroupToggle.category,
+ module: 'ring_group_toggle',
+ tip: self.i18n.active().callflows.ringGroupToggle.logoutTip,
+ data: {
+ action: 'logout',
+ callflow_id: 'null'
+ },
+ rules: [
+ {
+ type: 'quantity',
+ maxSize: '1'
+ }
+ ],
+ isUsable: 'true',
+ weight: 2,
+ caption: function(node, caption_map) {
+ var id = node.getMetadata('callflow_id'),
+ return_value = '';
+
+ if (id in caption_map) {
+ if (caption_map[id].hasOwnProperty('name')) {
+ return_value = caption_map[id].name;
+ } else if (caption_map[id].hasOwnProperty('numbers')) {
+ return_value = caption_map[id].numbers.toString();
+ }
+ }
+
+ return return_value;
+ },
+ edit: function(node, callback) {
+ self.callApi({
+ resource: 'callflow.list',
+ data: {
+ accountId: self.accountId,
+ filters: { paginate: false }
+ },
+ success: function(data, status) {
+ var popup, popup_html, _data = [];
+
+ $.each(data.data, function() {
+ if (!this.featurecode && this.id !== self.flow.id) {
+ this.name = this.name ? this.name : ((this.numbers) ? this.numbers.toString() : self.i18n.active().oldCallflows.no_numbers);
+
+ _data.push(this);
+ }
+ });
+
+ popup_html = $(self.getTemplate({
+ name: 'ring_group_logout_dialog',
+ data: {
+ objects: {
+ type: 'callflow',
+ items: _.sortBy(_data, 'name'),
+ selected: node.getMetadata('callflow_id') || ''
+ }
+ },
+ submodule: 'groups'
+ }));
+
+ $('#add', popup_html).click(function() {
+ node.setMetadata('callflow_id', $('#object-selector', popup_html).val());
+
+ node.caption = $('#object-selector option:selected', popup_html).text();
+
+ popup.dialog('close');
+ });
+
+ popup = monster.ui.dialog(popup_html, {
+ title: self.i18n.active().oldCallflows.callflow_title,
+ beforeClose: function() {
+ if (typeof callback === 'function') {
+ callback();
+ }
+ }
+ });
+ }
+ });
+ }
+ }
+ });
+ },
+
+ groupsGetEndpoints: function(callback) {
+ var self = this;
+
+ monster.parallel({
+ 'group': function(callback) {
+ self.groupsGroupList(function(data) {
+ callback(null, data);
+ });
+ },
+ 'user': function(callback) {
+ self.groupsRequestUserList({
+ success: function(data) {
+ callback(null, data);
+ }
+ });
+ },
+ 'device': function(callback) {
+ self.groupsRequestDeviceList({
+ success: function(data) {
+ callback(null, data);
+ }
+ });
+ }
+ }, function(err, results) {
+ var data = self.groupsFormatEndpoints(results);
+
+ callback(data);
+ });
+ },
+
+ groupsFormatEndpoints: function(data) {
+ _.each(data.user, function(user) {
+ user.name = user.first_name + ' ' + user.last_name;
+ });
+
+ return data;
+ },
+
+ groupsEditPageGroup: function(node, callback) {
+ var self = this;
+
+ monster.waterfall([
+ function(callback) {
+ self.groupsRequestDeviceList({
+ success: function(data) {
+ callback(null, data);
+ }
+ });
+ }
+ ], function(err, data) {
+ var popup,
+ popup_html,
+ endpoints = node.getMetadata('endpoints'),
+ selected_endpoints = {},
+ unselected_endpoints = [],
+ unselected_groups = [],
+ unselected_devices = [],
+ unselected_users = [];
+
+ if (endpoints) {
+ // We need to translate the endpoints to prevent nasty O(N^2) time complexities,
+ // we also need to clone to prevent managing of objects
+ $.each($.extend(true, {}, endpoints), function(i, obj) {
+ obj.name = 'Undefined Device';
+ selected_endpoints[obj.id] = obj;
+ });
+ }
+
+ $.each(data, function(i, obj) {
+ obj.endpoint_type = 'device';
+ if (obj.id in selected_endpoints) {
+ selected_endpoints[obj.id].endpoint_type = 'device';
+ selected_endpoints[obj.id].owner_id = obj.owner_id;
+ selected_endpoints[obj.id].name = obj.name;
+ } else {
+ unselected_devices.push(obj);
+ }
+ });
+
+ unselected_devices = _.sortBy(unselected_devices, 'name');
+
+ self.groupsGroupList(function(_data) {
+ $.each(_data, function(i, obj) {
+ obj.endpoint_type = 'group';
+ if (obj.id in selected_endpoints) {
+ selected_endpoints[obj.id].endpoint_type = 'group';
+ selected_endpoints[obj.id].name = obj.name;
+ } else {
+ unselected_groups.push(obj);
+ }
+ });
+
+ unselected_groups = _.sortBy(unselected_groups, 'name');
+
+ monster.waterfall([
+ function(callback) {
+ self.groupsRequestUserList({
+ success: function(data) {
+ callback(null, data);
+ }
+ });
+ }
+ ], function(err, _data) {
+ $.each(_data, function(i, obj) {
+ obj.name = obj.first_name + ' ' + obj.last_name;
+ obj.endpoint_type = 'user';
+ if (obj.id in selected_endpoints) {
+ selected_endpoints[obj.id].endpoint_type = 'user';
+ selected_endpoints[obj.id].name = obj.name;
+ } else {
+ unselected_users.push(obj);
+ }
+ });
+ unselected_users = _.sortBy(unselected_users, 'name');
+
+ popup_html = $(self.getTemplate({
+ name: 'page_group_dialog',
+ data: {
+ form: {
+ name: node.getMetadata('name') || '',
+ audio: node.getMetadata('audio') || 'one-way'
+ }
+ },
+ submodule: 'groups'
+ }));
+ $.each(unselected_groups, function() {
+ $('#groups_pane .connect.left', popup_html)
+ .append($(self.getTemplate({
+ name: 'page_group_element',
+ data: this,
+ submodule: 'groups'
+ })));
+ });
+
+ $.each(unselected_devices, function() {
+ $('#devices_pane .connect.left', popup_html)
+ .append($(self.getTemplate({
+ name: 'page_group_element',
+ data: this,
+ submodule: 'groups'
+ })));
+ });
+
+ $.each(unselected_users, function() {
+ $('#users_pane .connect.left', popup_html)
+ .append($(self.getTemplate({
+ name: 'page_group_element',
+ data: this,
+ submodule: 'groups'
+ })));
+ });
+
+ $.each(selected_endpoints, function() {
+ //Check if user/device exists.
+ if (this.endpoint_type) {
+ $('.connect.right', popup_html)
+ .append($(self.getTemplate({
+ name: 'page_group_element',
+ data: this,
+ submodule: 'groups'
+ })));
+ }
+ });
+
+ $('#name', popup_html).bind('keyup blur change', function() {
+ $('.column.right .title', popup_html).html('Page Group - ' + $(this).val());
+ });
+
+ $('ul.settings1 > li > a', popup_html).click(function(item) {
+ $('.pane_content', popup_html).hide();
+
+ //Reset Search field
+ $('.searchfield', popup_html).val('');
+ $('.column.left li', popup_html).show();
+
+ $('ul.settings1 > li', popup_html).removeClass('current');
+
+ var tab_id = $(this).attr('id');
+
+ if (tab_id === 'users_tab_link') {
+ $('#users_pane', popup_html).show();
+ } else if (tab_id === 'devices_tab_link') {
+ $('#devices_pane', popup_html).show();
+ } else if (tab_id === 'groups_tab_link') {
+ $('#groups_pane', popup_html).show();
+ }
+
+ $(this).parent().addClass('current');
+ });
+
+ $('.searchsubmit2', popup_html).click(function() {
+ $('.searchfield', popup_html).val('');
+ $('.column li', popup_html).show();
+ });
+
+ $('#devices_pane .searchfield', popup_html).keyup(function() {
+ $('#devices_pane .column.left li').each(function() {
+ if ($('.item_name', $(this)).html().toLowerCase().indexOf($('#devices_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
+ $(this).hide();
+ } else {
+ $(this).show();
+ }
+ });
+ });
+
+ $('#users_pane .searchfield', popup_html).keyup(function() {
+ $('#users_pane .column.left li').each(function() {
+ if ($('.item_name', $(this)).html().toLowerCase().indexOf($('#users_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
+ $(this).hide();
+ } else {
+ $(this).show();
+ }
+ });
+ });
+
+ $('#groups_pane .searchfield', popup_html).keyup(function() {
+ $('#groups_pane .column.left li').each(function() {
+ if ($('.item_name', $(this)).html().toLowerCase().indexOf($('#groups_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
+ $(this).hide();
+ } else {
+ $(this).show();
+ }
+ });
+ });
+
+ if ($.isEmptyObject(selected_endpoints)) {
+ $('.column.right .connect', popup_html).addClass('no_element');
+ } else {
+ $('.column.right .connect', popup_html).removeClass('no_element');
+ }
+
+ $('.column.left .options', popup_html).hide();
+ $('.column.left .actions', popup_html).hide();
+
+ $('.options .option.delay', popup_html).bind('keyup', function() {
+ $(this).parents('li').data('delay', $(this).val());
+ });
+
+ $('.options .option.timeout', popup_html).bind('keyup', function() {
+ $(this).parents('li').data('timeout', $(this).val());
+ });
+
+ $('#save_ring_group', popup_html).click(function() {
+ var name = $('#name', popup_html).val();
+ var audio = $('#audio', popup_html).val();
+
+ endpoints = [];
+
+ $('.right .connect li', popup_html).each(function() {
+ var item_data = $(this).data();
+ delete item_data.owner_id;
+ endpoints.push(item_data);
+ });
+
+ node.setMetadata('endpoints', endpoints);
+ node.setMetadata('name', name);
+ node.setMetadata('audio', audio);
+ node.caption = name;
+
+ popup.dialog('close');
+ });
+
+ popup = monster.ui.dialog(popup_html, {
+ title: self.i18n.active().oldCallflows.page_group_title,
+ beforeClose: function() {
+ if (typeof callback === 'function') {
+ callback();
+ }
+ }
+ });
+
+ // $('.scrollable', popup).jScrollPane({
+ // horizontalDragMinWidth: 0,
+ // horizontalDragMaxWidth: 0
+ // });
+
+ $('.connect', popup).sortable({
+ connectWith: $('.connect.right', popup),
+ zIndex: 2000,
+ helper: 'clone',
+ appendTo: $('.wrapper', popup),
+ scroll: false,
+ tolerance: 'pointer',
+ receive: function(ev, ui) {
+ var data = ui.item[0].dataset,
+ list_li = [],
+ confirm_text;
+
+ if (data.endpoint_type === 'device') {
+ confirm_text = self.i18n.active().oldCallflows.the_owner_of_this_device_is_already;
+ $('.connect.right li', popup_html).each(function() {
+ if ($(this).data('id') === data.owner_id) {
+ list_li.push($(this));
+ }
+ });
+ } else if (data.endpoint_type === 'user') {
+ confirm_text = self.i18n.active().oldCallflows.this_user_has_already_some_devices;
+ $('.connect.right li', popup_html).each(function() {
+ if ($(this).data('owner_id') === data.id) {
+ list_li.push($(this));
+ }
+ });
+ }
+
+ if (list_li.length > 0) {
+ monster.ui.confirm(confirm_text,
+ function() {
+ $.each(list_li, function() {
+ remove_element(this);
+ });
+ },
+ function() {
+ remove_element(ui.item);
+ }
+ );
+ }
+
+ if ($(this).hasClass('right')) {
+ $('.options', ui.item).show();
+ $('.actions', ui.item).show();
+ //$('.item_name', ui.item).addClass('right');
+ $('.column.right .connect', popup).removeClass('no_element');
+ }
+ }
+ });
+
+ $(popup_html).delegate('.trash', 'click', function() {
+ var $parent_li = $(this).parents('li').first();
+ remove_element($parent_li);
+ });
+
+ $('.pane_content', popup_html).hide();
+ $('#users_pane', popup_html).show();
+
+ var remove_element = function(li) {
+ var $parent_li = li;
+ var data = $parent_li.data();
+ data.name = jQuery.trim($('.item_name', $parent_li).html());
+ $('#' + data.endpoint_type + 's_pane .connect.left', popup_html)
+ .append($(self.getTemplate({
+ name: 'page_group_element',
+ data: data,
+ submodule: 'groups'
+ })));
+ $parent_li.remove();
+
+ if ($('.connect.right li', popup_html).size() === 0) {
+ $('.column.right .connect', popup).addClass('no_element');
+ }
+
+ if (data.name.toLowerCase().indexOf($('#' + data.endpoint_type + 's_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
+ $('#' + data.id, popup_html).hide();
+ }
+ };
+ });
+ });
+ });
+ },
+
+ groupsEditRingGroup: function(node, callback) {
+ var self = this,
+ default_timeout = '20',
+ default_delay = '0';
+
+ monster.waterfall([
+ function(callback) {
+ self.groupsRequestDeviceList({
+ success: function(data) {
+ callback(null, data);
+ }
+ });
+ }
+ ], function(err, data) {
+ var popup,
+ popup_html,
+ endpoints = node.getMetadata('endpoints'),
+ selected_endpoints = {},
+ unselected_endpoints = [],
+ unselected_groups = [],
+ unselected_devices = [],
+ unselected_users = [];
+
+ if (endpoints) {
+ // We need to translate the endpoints to prevent nasty O(N^2) time complexities,
+ // we also need to clone to prevent managing of objects
+ $.each($.extend(true, {}, endpoints), function(i, obj) {
+ obj.name = self.i18n.active().oldCallflows.undefined_device;
+ selected_endpoints[obj.id] = obj;
+ });
+ }
+
+ $.each(data, function(i, obj) {
+ obj.endpoint_type = 'device';
+ if (obj.id in selected_endpoints) {
+ selected_endpoints[obj.id].endpoint_type = 'device';
+ selected_endpoints[obj.id].owner_id = obj.owner_id;
+ selected_endpoints[obj.id].name = obj.name;
+ } else {
+ obj.delay = default_delay;
+ obj.timeout = default_timeout;
+ unselected_devices.push(obj);
+ }
+ });
+
+ unselected_devices = _.sortBy(unselected_devices, 'name');
+
+ self.groupsGroupList(function(_data) {
+ $.each(_data, function(i, obj) {
+ obj.endpoint_type = 'group';
+ if (obj.id in selected_endpoints) {
+ selected_endpoints[obj.id].endpoint_type = 'group';
+ selected_endpoints[obj.id].name = obj.name;
+ } else {
+ obj.delay = default_delay;
+ obj.timeout = default_timeout;
+ unselected_groups.push(obj);
+ }
+ });
+
+ unselected_groups = _.sortBy(unselected_groups, 'name');
+
+ monster.waterfall([
+ function(callback) {
+ self.groupsRequestUserList({
+ success: function(data) {
+ callback(null, data);
+ }
+ });
+ }
+ ], function(err, _data) {
+ $.each(_data, function(i, obj) {
+ obj.name = obj.first_name + ' ' + obj.last_name;
+ obj.endpoint_type = 'user';
+ if (obj.id in selected_endpoints) {
+ selected_endpoints[obj.id].endpoint_type = 'user';
+ selected_endpoints[obj.id].name = obj.name;
+ } else {
+ obj.delay = default_delay;
+ obj.timeout = default_timeout;
+ unselected_users.push(obj);
+ }
+ });
+
+ unselected_users = _.sortBy(unselected_users, 'name');
+
+ self.groupsMediaList(function(_data) {
+ var media_array = _data.sort(function(a, b) {
+ return a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1;
+ }),
+ mediaId = node.getMetadata('ringback') || 'default',
+ isShoutcast = mediaId.indexOf('://') >= 0 && mediaId !== 'silence_stream://300000',
+ strategy = node.getMetadata('strategy');
+
+ popup_html = $(self.getTemplate({
+ name: 'ring_group_dialog',
+ data: {
+ form: {
+ name: node.getMetadata('name') || '',
+ strategy: {
+ items: [
+ {
+ id: 'simultaneous',
+ name: self.i18n.active().oldCallflows.at_the_same_time
+ },
+ {
+ id: 'single',
+ name: self.i18n.active().oldCallflows.in_order
+ }
+ ],
+ selected: node.getMetadata('strategy') || 'simultaneous'
+ },
+ timeout: node.getMetadata('timeout') || '30',
+ repeats: node.getMetadata('repeats') || 1,
+ ringback: {
+ items: $.merge([
+ {
+ id: 'default',
+ name: self.i18n.active().oldCallflows.default,
+ class: 'uneditable'
+ },
+ {
+ id: 'silence_stream://300000',
+ name: self.i18n.active().oldCallflows.silence,
+ class: 'uneditable'
+ },
+ {
+ id: 'shoutcast_url',
+ name: self.i18n.active().callflows.media.shoutcastURL,
+ class: 'uneditable'
+ }
+ ], media_array),
+ selected: isShoutcast ? 'shoutcast_url' : mediaId,
+ shoutcastValue: mediaId
+ }
+ }
+ },
+ submodule: 'groups'
+ }));
+
+ $.each(unselected_groups, function() {
+ $('#groups_pane .connect.left', popup_html)
+ .append($(self.getTemplate({
+ name: 'ring_group_element',
+ data: this,
+ submodule: 'groups'
+ })));
+ });
+
+ $.each(unselected_devices, function() {
+ $('#devices_pane .connect.left', popup_html)
+ .append($(self.getTemplate({
+ name: 'ring_group_element',
+ data: this,
+ submodule: 'groups'
+ })));
+ });
+
+ $.each(unselected_users, function() {
+ $('#users_pane .connect.left', popup_html)
+ .append($(self.getTemplate({
+ name: 'ring_group_element',
+ data: this,
+ submodule: 'groups'
+ })));
+ });
+
+ $.each(selected_endpoints, function() {
+ //Check if user/device exists.
+ if (this.endpoint_type) {
+ $('.connect.right', popup_html)
+ .append($(self.getTemplate({
+ name: 'ring_group_element',
+ data: this,
+ submodule: 'groups'
+ })));
+ }
+ });
+
+ //Hide delay column if ring strategy is set to 'In order'
+ if (strategy === 'single') {
+ $('.options .option.delay', popup_html).hide();
+ }
+
+ $('#name', popup_html).bind('keyup blur change', function() {
+ $('.column.right .title', popup_html).html(self.i18n.active().oldCallflows.ring_group_val + $(this).val());
+ });
+
+ $('#ringback', popup_html).change(function(e) {
+ var val = $(this).val(),
+ isShoutcast = val === 'shoutcast_url';
+
+ popup_html.find('.shoutcast-div').toggleClass('hidden', !isShoutcast).find('input').val('');
+
+ if ($(this).find('option:selected').hasClass('uneditable')) {
+ $('.media_action[data-action="edit"]', popup_html).hide();
+ } else {
+ $('.media_action[data-action="edit"]', popup_html).show();
+ }
+ });
+
+ $('.media_action', popup_html).click(function(e) {
+ var isCreation = $(this).data('action') === 'create',
+ mediaData = isCreation ? {} : { id: $('#ringback', popup_html).val() };
+
+ monster.pub('callflows.media.editPopup', {
+ data: mediaData,
+ callback: function(_mediaData) {
+ if (_mediaData) {
+ if (isCreation) {
+ $('#ringback', popup_html).append('');
+ } else {
+ $('#ringback option[value="' + _mediaData.id + '"]', popup_html).text(_mediaData.name);
+ }
+ $('#ringback', popup_html).val(_mediaData.id);
+ }
+ }
+ });
+ });
+
+ $('ul.settings1 > li > a', popup_html).click(function(item) {
+ $('.pane_content', popup_html).hide();
+
+ //Reset Search field
+ $('.searchfield', popup_html).val('');
+ $('.column.left li', popup_html).show();
+
+ $('ul.settings1 > li', popup_html).removeClass('current');
+
+ var tab_id = $(this).attr('id');
+
+ if (tab_id === 'users_tab_link') {
+ $('#users_pane', popup_html).show();
+ } else if (tab_id === 'devices_tab_link') {
+ $('#devices_pane', popup_html).show();
+ } else if (tab_id === 'groups_tab_link') {
+ $('#groups_pane', popup_html).show();
+ }
+
+ $(this).parent().addClass('current');
+ });
+
+ $('.searchsubmit2', popup_html).click(function() {
+ $('.searchfield', popup_html).val('');
+ $('.column li', popup_html).show();
+ });
+
+ $('#devices_pane .searchfield', popup_html).keyup(function() {
+ $('#devices_pane .column.left li').each(function() {
+ if ($('.item_name', $(this)).html().toLowerCase().indexOf($('#devices_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
+ $(this).hide();
+ } else {
+ $(this).show();
+ }
+ });
+ });
+
+ $('#users_pane .searchfield', popup_html).keyup(function() {
+ $('#users_pane .column.left li').each(function() {
+ if ($('.item_name', $(this)).html().toLowerCase().indexOf($('#users_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
+ $(this).hide();
+ } else {
+ $(this).show();
+ }
+ });
+ });
+
+ $('#groups_pane .searchfield', popup_html).keyup(function() {
+ $('#groups_pane .column.left li').each(function() {
+ if ($('.item_name', $(this)).html().toLowerCase().indexOf($('#groups_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
+ $(this).hide();
+ } else {
+ $(this).show();
+ }
+ });
+ });
+
+ if ($.isEmptyObject(selected_endpoints)) {
+ $('.column.right .connect', popup_html).addClass('no_element');
+ } else {
+ $('.column.right .connect', popup_html).removeClass('no_element');
+ }
+
+ $('.column.left .options', popup_html).hide();
+ $('.column.left .actions', popup_html).hide();
+
+ $('.options .option.delay', popup_html).bind('keyup', function() {
+ $(this).parents('li').data('delay', $(this).val());
+ });
+
+ $('.options .option.timeout', popup_html).bind('keyup', function() {
+ $(this).parents('li').data('timeout', $(this).val());
+ });
+
+ $('#strategy', popup_html).bind('change', function() {
+ var strategy = $(this).val(),
+ $delay = $('.options .option.delay', popup_html);
+ $delayTitle = $('.options .delay_title', popup_html);
+
+ if (strategy === 'single') {
+ $delay.hide();
+ $delayTitle.hide();
+ } else {
+ $delay.show();
+ $delayTitle.show();
+ }
+ });
+
+ $('#save_ring_group', popup_html).click(function() {
+ var name = $('#name', popup_html).val(),
+ global_timeout = 0,
+ strategy = $('#strategy', popup_html).val(),
+ ringback = $('#ringback', popup_html).val(),
+ repeats = $('#repeats', popup_html).val(),
+ shoutcastValue = $('.shoutcast-url-input', popup_html).val();
+
+ if (ringback === 'shoutcast_url') {
+ ringback = shoutcastValue;
+ }
+
+ endpoints = [];
+
+ if (strategy === 'simultaneous') {
+ var computeTimeout = function(delay, local_timeout, global_timeout) {
+ var duration = delay + local_timeout;
+
+ if (duration > global_timeout) {
+ global_timeout = duration;
+ }
+
+ return global_timeout;
+ };
+ } else {
+ var computeTimeout = function(delay, local_timeout, global_timeout) {
+ global_timeout += local_timeout;
+
+ return global_timeout;
+ };
+ }
+
+ $('.right .connect li', popup_html).each(function() {
+ var item_data = $(this).data();
+
+ if (strategy === 'single') {
+ delete item_data.delay;
+ }
+ delete item_data.owner_id;
+ endpoints.push(item_data);
+ global_timeout = computeTimeout(parseFloat(item_data.delay), parseFloat(item_data.timeout), global_timeout);
+ });
+
+ if (repeats < 1) {
+ repeats = 1;
+ }
+
+ node.setMetadata('endpoints', endpoints);
+ node.setMetadata('name', name);
+ node.setMetadata('strategy', strategy);
+ node.setMetadata('timeout', global_timeout);
+ node.setMetadata('repeats', repeats);
+ if (ringback === 'default') {
+ node.deleteMetadata('ringback', ringback);
+ } else {
+ node.setMetadata('ringback', ringback);
+ }
+
+ node.caption = name;
+
+ popup.dialog('close');
+ });
+
+ monster.ui.tooltips(popup_html);
+
+ popup = monster.ui.dialog(popup_html, {
+ title: self.i18n.active().oldCallflows.ring_group,
+ beforeClose: function() {
+ if (typeof callback === 'function') {
+ callback();
+ }
+ }
+ });
+
+ // $('.scrollable', popup).jScrollPane({
+ // horizontalDragMinWidth: 0,
+ // horizontalDragMaxWidth: 0
+ // });
+
+ $('.connect', popup).sortable({
+ connectWith: $('.connect.right', popup),
+ zIndex: 2000,
+ helper: 'clone',
+ appendTo: $('.wrapper', popup),
+ scroll: false,
+ tolerance: 'pointer',
+ receive: function(ev, ui) {
+ var data = ui.item[0].dataset,
+ list_li = [],
+ confirm_text;
+
+ if (data.endpoint_type === 'device') {
+ confirm_text = self.i18n.active().oldCallflows.the_owner_of_this_device_is_already;
+ $('.connect.right li', popup_html).each(function() {
+ if ($(this).data('id') === data.owner_id) {
+ list_li.push($(this));
+ }
+ });
+ } else if (data.endpoint_type === 'user') {
+ confirm_text = self.i18n.active().oldCallflows.this_user_has_already_some_devices;
+ $('.connect.right li', popup_html).each(function() {
+ if ($(this).data('owner_id') === data.id) {
+ list_li.push($(this));
+ }
+ });
+ }
+
+ if (list_li.length > 0) {
+ monster.ui.confirm(confirm_text,
+ function() {
+ $.each(list_li, function() {
+ remove_element(this);
+ });
+ },
+ function() {
+ remove_element(ui.item);
+ }
+ );
+ }
+
+ if ($(this).hasClass('right')) {
+ $('.options', ui.item).show();
+ $('.actions', ui.item).show();
+ //$('.item_name', ui.item).addClass('right');
+ $('.column.right .connect', popup).removeClass('no_element');
+ }
+ }
+ });
+
+ $(popup_html).delegate('.trash', 'click', function() {
+ var $parent_li = $(this).parents('li').first();
+ remove_element($parent_li);
+ });
+
+ $('.pane_content', popup_html).hide();
+ $('#users_pane', popup_html).show();
+ if ($('#ringback option:selected').hasClass('uneditable')) {
+ $('.media_action[data-action="edit"]', popup_html).hide();
+ } else {
+ $('.media_action[data-action="edit"]', popup_html).show();
+ }
+
+ var remove_element = function(li) {
+ var $parent_li = li;
+ var data = $parent_li.data();
+ data.name = jQuery.trim($('.item_name', $parent_li).html());
+ $('#' + data.endpoint_type + 's_pane .connect.left', popup_html)
+ .append($(self.getTemplate({
+ name: 'ring_group_element',
+ data: data,
+ submodule: 'groups'
+ })));
+ $parent_li.remove();
+
+ if ($('.connect.right li', popup_html).size() === 0) {
+ $('.column.right .connect', popup).addClass('no_element');
+ }
+
+ if (data.name.toLowerCase().indexOf($('#' + data.endpoint_type + 's_pane .searchfield', popup_html).val().toLowerCase()) === -1) {
+ $('#' + data.id, popup_html).hide();
+ }
+ };
+ });
+ });
+ });
+ });
+ },
+
+ groupsGroupList: function(callback) {
+ var self = this;
+
+ self.callApi({
+ resource: 'group.list',
+ data: {
+ accountId: self.accountId,
+ filters: {
+ paginate: false
+ }
+ },
+ success: function(data, status) {
+ callback && callback(data.data);
+ }
+ });
+ },
+
+ groupsMediaList: function(callback) {
+ var self = this;
+
+ self.callApi({
+ resource: 'media.list',
+ data: {
+ accountId: self.accountId,
+ filters: {
+ paginate: false
+ }
+ },
+ success: function(data, status) {
+ callback && callback(data.data);
+ }
+ });
+ },
+
+ groupsNormalizeData: function(form_data) {
+ delete form_data.users;
+ return form_data;
+ },
+
+ groupsSave: function(form_data, data, success, error) {
+ var self = this,
+ normalized_data = self.groupsNormalizeData($.extend(true, {}, data.data, form_data));
+
+ if (typeof data.data === 'object' && data.data.id) {
+ self.callApi({
+ resource: 'group.update',
+ data: {
+ accountId: self.accountId,
+ groupId: data.data.id,
+ data: normalized_data
+ },
+ success: function(_data) {
+ success(_data.data, status, 'update');
+ }
+ });
+ } else {
+ self.callApi({
+ resource: 'group.create',
+ data: {
+ accountId: self.accountId,
+ data: normalized_data
+ },
+ success: function(_data) {
+ success(_data.data, status, 'create');
+ }
+ });
+ }
+ },
+
+ groupsDelete: function(data, callback) {
+ var self = this;
+
+ if (typeof data.data === 'object' && data.data.id) {
+ self.callApi({
+ resource: 'group.delete',
+ data: {
+ accountId: self.accountId,
+ groupId: data.data.id
+ },
+ success: function(_data) {
+ callback && callback(_data, status);
+ }
+ });
+ }
+ },
+
+ groupsRequestUserList: function(args) {
+ var self = this;
+
+ self.callApi({
+ resource: 'user.list',
+ data: _.merge({
+ accountId: self.accountId,
+ filters: {
+ paginate: false
+ }
+ }, args.data),
+ success: function(data, status) {
+ args.hasOwnProperty('success') && args.success(data.data);
+ },
+ error: function(parsedError) {
+ args.hasOwnProperty('error') && args.error(parsedError);
+ }
+ });
+ },
+
+ groupsRequestDeviceList: function(args) {
+ var self = this;
+
+ self.callApi({
+ resource: 'device.list',
+ data: _.merge({
+ accountId: self.accountId,
+ filters: {
+ paginate: false
+ }
+ }, args.data),
+ success: function(data, status) {
+ args.hasOwnProperty('success') && args.success(data.data);
+ },
+ error: function(parsedError) {
+ args.hasOwnProperty('error') && args.error(parsedError);
+ }
+ });
+ }
+ };
+
+ return app;
+});