HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //home/arjun/projects/buyercall_new/buyercall/buyercall/assets/components/widgets/components.js
/* jshint esversion: 6 */

// Libraries
var Backbone = require('backbone');
var utils = require('../utils');

// Views
var { Agents, AgentsView } = require('./call_settings_agents');
var { AgentCreationModalView } = require('../agents/agents');
var NumberSelectView = require('./call_settings_numbers');
var PagesView = require('./triggers_pages');

// Templates
var selectTypeTemplate = require('./templates/step_select_type.tpl');
var beforeCallTemplate = require('./templates/step_before_call.tpl');
var startingCallTemplate = require('./templates/step_starting_call.tpl');
var callSettingsTemplate = require('./templates/step_call_settings.tpl');
var unavailabilityTemplate = require('./templates/step_unavailability.tpl');
var triggerTemplate = require('./templates/step_triggers.tpl');

// Settings &c
const defaultImages = require('./default_images');
const defaultSettings = require('./default_settings');
const MAX_FILE_SIZE = 2 * 1024 * 1024;
const MAX_IMAGE_HEIGHT = 400;
const MAX_IMAGE_WIDTH = 600;


var ColorPickerView = Backbone.View.extend({
    initialize: function () {
        this.eventsEnabled = true;

        this.render();
        this.$colorPicker.on('changeColor.colorpicker', () => {
            this.model.set('color', this.$colorPicker.colorpicker('getValue'));
        });
    },

    render: function() {
        this.$colorPicker = this.$el.colorpicker();
    }
});

var PositionPickerView = Backbone.View.extend({
    events: {
        'change select': 'handleChange'
    },

    handleChange: function (e) {
        this.model.set('position', e.currentTarget.value);
    }
});

var WidgetPage = Backbone.View.extend({
    className: 'widget-legend col-md-4 call-feature-sidebar',

    events: {
        'change input': 'handleChange',
        'change select': 'handleChange',
        'change textarea': 'handleChange'
    },

    initialize: function (options) {
        this.widgetId = options.widgetId;
        this.render();
    },

    render: function () {
        Agents.allAgents = new Agents({ excludeGroups: true });
        Agents.allAgents.fetch();

        this.$el.html(this.template(this.model.toJSON()));
        return this;
    },

    handleChange: function () {
        var settings = {},
            getTags = (tagName) => this.el.getElementsByTagName(tagName),
            tags;

        tags = [].slice.call(getTags('input'));
        tags.forEach(function (input) {
            let prop = utils.idToPropertyName(input.id);
            switch (input.type) {
                case 'text':
                case 'number':
                case 'hidden':
                    settings[prop] = input.value;
                    break;
                case 'checkbox':
                case 'radio':
                    settings[prop] = input.checked;
                    break;
            }
        });

        tags = [].slice.call(getTags('select'));
        tags.push.apply(tags, getTags('textarea'));
        tags.forEach(function (control) {
            let prop = utils.idToPropertyName(control.id);
            settings[prop] = control.value;
        });

        this.model.set(settings);
    }
});

var SelectTypeView = WidgetPage.extend({
    className: 'widget-type',
    template: selectTypeTemplate,

    events: {
        // Bootstrap Wizard triggers change:value on div, not input
        'change:value div': 'changeType'
    },

    changeType: function () {
        this.model.set('widgetType', this.$('input[name=widget-type]:checked').val());
    }
});

var BeforeCallView = WidgetPage.extend({
    events: {
        'change #widget-name': 'handleChange',
        'change #widget-branding': 'handleChange',
        'change input': 'handleChange',
        'change select': 'handleChange',
        'change textarea': 'handleChange',
        'change input[type=checkbox]': 'handleWidgetTypeChange',
        'change #widget-default-image': 'handleWidgetImageChange'
    },

    initialize: function (options) {
        WidgetPage.prototype.initialize.call(this, options);

        this.model.on('change:typeTab', () => {
            if (this.model.get('typeTab')) {
                this.$('#widget-tab-section').show(400);
            }else {
                this.$('#widget-tab-section').hide(400);
            }
        });

        this.model.on('change:typeImage', () => {
            if (this.$('#widget-type-image').prop('checked')) {
                this.$('#widget-image-section').show(400);
                this.handleWidgetImageChange();
            } else {
                this.$('#widget-image-section').hide(400);
            }
        });
    },

    render: function() {
        var that = this;

        this.el.innerHTML = beforeCallTemplate(this.model.toJSON());

        new ColorPickerView({
            el: this.$("#widget-color-container"),
            model: this.model
        });
        new PositionPickerView({
            el: this.$("#widget-position-container"),
            model: this.model
        });

        if (!this.model.get('typeImage')) {
            this.$('#widget-image-section').hide();
        }
        if (this.model.hasCustomImage()) {
            this.$('#widget-image-box').show();
        }

        this.$('.slider').each((i, el) => {
            var $el = $(el),
                $input = this.$('#' + $el.attr('data-slider-input')),
                $slider = $el.noUiSlider({
                    start: parseFloat($input.val()),
                    range: {
                        min: parseFloat($el.attr('data-slider-min')),
                        max: parseFloat($el.attr('data-slider-max')),
                    },
                });
            $slider.on('change', (e, value) => {
                $input.val(value).trigger('change');
            });
        });
        this.$('#widget-upload-image').dropzone({
            url: '/outbound/image',
            headers: {
                'X-CSRFToken': $('meta[name="csrf-token"]').attr('content')
            },
            init: function () {
                this.on('addedfile', function(file) {
                    utils.flash('');

                    if (file.size > MAX_FILE_SIZE) {
                        utils.flash(__('Image file size must be < 2 MB.'));
                        this.removeAllFiles();
                        return;
                    }
                    if (file.width > MAX_IMAGE_WIDTH || file.height > MAX_IMAGE_WIDTH) {
                        utils.flash(__('Image size must be smaller than 600x400.'));
                        this.removeAllFiles();
                        return;
                    }
                });
                this.on('error', function (file, response, xhr) {
                    utils.flash(response);
                });
                this.on('success', function (evt, response) {
                    that.model.set({ customImage: response.filename });
                });
            }
        });
    },

    handleWidgetTypeChange: function (event) {
        var typeTab = this.$('#widget-type-tab').prop('checked'),
            typeImage = this.$('#widget-type-image').prop('checked');

        this.model.set({typeTab: typeTab, typeImage: typeImage});
    },

    handleWidgetImageChange: function (event) {
        var imageName = this.$('#widget-default-image').val();

        if (!imageName || imageName === "Custom") {
            this.$('#widget-image-box').show();
        } else {
            this.$('#widget-image-box').hide();
        }
    }
});

var StartingCallView = WidgetPage.extend({
    events: {
        'change input': 'handleChange',
        'change select': 'handleChange',
        'change textarea': 'handleChange',
        'change #widget-add-hidden-information': 'handleHiddenChange',
    },

    template: startingCallTemplate,

    handleHiddenChange: function (e) {
        this.$('#widget-hidden-information').prop('disabled', !e.currentTarget.checked);
    }
});

var CallSettingsView = WidgetPage.extend({
    className: 'col-md-12',
    template: callSettingsTemplate,

    events: {
        'change input': 'handleChange',
        'change select': 'handleChange',
        'change textarea': 'handleChange',
        'change input#widget-enable-notifications': 'handleNotificationsChange',
        'click #add-agent-btn': 'handleAddAgentClick',
    },

    initialize: function (options) {
        this.widgetId = options.widgetId;

        this.agents = new Agents(this.model.get('agents') || []);
        this.render();
        this.listenTo(this.agents, 'change remove add', () => {
            this.model.set({
                agents: this.agents.toJSON()
            });
        });
        // This is to hide feature for when BW TNs are used for widgets.
        //this.listenTo(this.model, 'change:fromNumberType', () => {
        //    if (this.model.get('fromNumberType') === 'tracking') {
        //        this.$('.row.routing-type, .row.retry-interval').hide();
        //    } else {
        //        this.$('.row.routing-type, .row.retry-interval').show();
        //    }
        //});
        this.listenTo(this.model, 'change:widgetType', this.showHideNameRow);
    },

    render: function () {
        this.$el.html(this.template(this.model.toJSON()));
        if (!this.model.get('notifyNone')) {
            this.$('.notification-settings').show();
        }
        this.showHideNameRow();
        this.$('#widget-name-adf').val(this.model.get('name'));

        new AgentsView({
            el: this.$('#widget-agents'),
            collection: this.agents,
            excludeGroups: true,
        });

        new NumberSelectView({
            el: this.$('#from-number'),
            settings: this.model
        });

        return this;
    },

    showHideNameRow: function () {
        if (this.model.get('widgetType') == 'adf') {
            this.$('.widget-name-row').show();
        } else {
            this.$('.widget-name-row').hide();
        }
    },

    handleChange: function (evt) {
        WidgetPage.prototype.handleChange.call(this);

        if(evt.target.id === "widget-add-hidden-information"){
            this.$('#widget-hidden-information').prop('disabled', !evt.target.checked);
        }

        if (this.model.get('widgetType') == 'adf' && this.model.has('nameAdf')) {
            this.model.set('name', this.model.get('nameAdf'));
            this.model.unset('nameAdf');
        }

        var retryRouting = [
            this.$('#widget-retry-routing-1').val(),
            this.$('#widget-retry-routing-2').val(),
            this.$('#widget-retry-routing-3').val()
        ];
        this.model.set({
            retryRouting: retryRouting
        });

        this.disableNotifyAdfRecipients();
    },

    handleNotificationsChange: function (e) {
        this.model.set('notifyNone', !e.currentTarget.checked);
        if (this.model.get('notifyNone')) {
            this.$('.notification-settings').hide();
        } else {
            this.$('.notification-settings').show();
        }
    },

    handleAddAgentClick: function (e) {
        $('#new-agent-modal').modal();
        new AgentCreationModalView({
            el: '#new-agent-modal',
            collection: this.agents,
        });
    },

    disableNotifyAdfRecipients: function () {
        var loNotifyAdf = $('#widget-notify-adf').is(':checked');

        if (loNotifyAdf) {
            //enable text area
            $('#widget-notify-adf-custom').prop('disabled', false);

        } else {
            //disable text area
            $('#widget-notify-adf-custom').prop('disabled', true);
        }
    },
});

var UnavailabilityView = WidgetPage.extend({
    template: unavailabilityTemplate
});

var TriggerView = WidgetPage.extend({
    className: 'widget-type',
    template: triggerTemplate,

    initialize: function (options) {
        this.widgetId = options.widgetId;

        var pages = this.model.get('pages') || [];

        this.pagesColl = new Backbone.Collection(
            pages.map((url) => new Backbone.Model({
                url: url,
                id: _.uniqueId()
            }))
        );
        this.listenTo(this.pagesColl, 'add remove', () => {
            this.model.set('pages', this.pagesColl.toJSON().map(
                (model) => model.url
            ));
        });
        this.listenTo(this.model, 'change:triggerBasedOnTime', (model, val) => {
            this.$('#widget-trigger-interval').prop('disabled', !val);
        });
        this.listenTo(this.model, 'change:triggerBasedOnPage', (model, val) => {
            this.$('#widget-trigger-page-interval').prop('disabled', !val);
        });

        this.render();
    },

    render: function () {
        this.$el.html(this.template(this.model.toJSON()));
        new PagesView({ collection: this.pagesColl }).$el.appendTo(
            this.$('#pages-container')
        );

        return this;
    }
});


module.exports = {
    SelectTypeView,
    BeforeCallView,
    StartingCallView,
    CallSettingsView,
    UnavailabilityView,
    TriggerView,
};