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/buyercall/assets/components/sysadmin/partnership_new.js
import $ from 'jquery';
var Backbone = require('backbone');
var _ = require('underscore');
//import {template} from '../utils';

const settings = {
    urls: {
        accountSearch: '/api/accounts/search'
    }
}
const reEmail = /^(([^<>()\[\]\.,;:\s@\"]+(\.[^<>()\[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
const reNonEmpty = /\S+.*/;

var xhr;
var cachedData = [];
var selectedDataId = null;
$('#move_account_txt').autoComplete({
	cache: false,
    source(term, response) {
        selectedDataId = null;
        try { xhr.abort(); } catch (e) {}
        xhr = $.getJSON(settings.urls.accountSearch, { q: term }, (data) => { cachedData = data;
            response(data); });
    },
    renderItem(item, search) {
        search = search.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
        //let re = new RegExp("(" + search.split(' ').join('|') + ")", "gi");
        //let name = item.name.replace(re, "<b>$1</b>");
        return `<div class="autocomplete-suggestion" data-val="${item.name}"><span class="pa-name">${item.name}</span><span class="p-name">(${item.partnership})</span></div>`;
    },
    onSelect(event, term, item) {
        const index = item.eq(0).index();
        selectedDataId = cachedData[index].id;
    }
});

var Item = Backbone.Model.extend({
    defaults: {
        name: "",
        id: null
    }
});

var ItemList = Backbone.Collection.extend({
    model: Item,

    initialize(models, settings) {
        settings = settings || {};
        this.dupField = settings.dupField || 'name';
        return this;
    },

    add(items, options) {
        if (!items.length) {
            items = [items];
        } else if (items instanceof Backbone.Collection) {
            items = items.models;
        }
        _.each(items, function(item) {
            trySetDuplicate.call(this, item, this.dupField);
        }.bind(this));

        return Backbone.Collection.prototype.add.call(this, items, options);
    }
});

function findDuplicate(original, field) {
    return this.find((v) => v.get(field) === original);
}

function trySetDuplicate(item, field) {
    var original = item.get(field),
        duplicate = findDuplicate.call(this, original, field);

    if (duplicate) {
        item.cid = duplicate.cid;
    }
}

var ListView = Backbone.View.extend({
    tagName: "li",
    template: _.template('<div class="view" title="Double-click to edit">' +
				        	'<label><%- name %></label>' +
				        	'<a class="destroy"><i class="fa fa-trash" aria-hidden="true"></i></a>' +
				        '</div>' +
				        '<input class="edit form-control" type="text" value="<%- name %>" />'
    ),
    events: {
        "dblclick .view": "edit",
        "click a.destroy": "clear",
        "keypress .edit": "updateOnEnter",
        "keyup .edit": "updateOnEsc",
        "blur .edit": "close"
    },

    initialize(settings) {
        this.isEditable = settings.isEditable;

        this.listenTo(this.model, 'change', this.render);
        this.listenTo(this.model, 'destroy', this.remove);
    },

    render() {
        this.$el.html(this.template(this.model.toJSON()));
        this.input = this.$('.edit');
        return this;
    },

    edit() {
        if (!this.isEditable) return;
        this.$el.addClass("editing");
        this.input.focus();
    },

    close() {
        var value = this.input.val();
        if (!value) {
            this.clear();
        } else {
            let collection = this.model.collection;
            if (this.model.get('name') == value 
            	|| !findDuplicate.call(collection, this.model.get(collection.dupField), collection.dupField)) {
                this.model.set({ name: value });
    			this.hide();
            } else {
            	this.input.tooltip("destroy")
                  .data("title", 'There is a duplicate item')
                  .tooltip()
                  .tooltip('show');
            }
        }
    },

    updateOnEnter(e) {
        if (e.keyCode == 13) this.close();
    },

    clear() {
        this.model.set({ 'id': null });
        this.model.destroy();
    },

    updateOnEsc(e) {
        if (e.keyCode != 27) return;
    	this.input.val(this.model.get('name'));
    	this.hide();
    },

    hide() {
    	this.$el.removeClass("editing");
    	this.input
					.data("title", '')
					.tooltip("destroy");
    }
});


var ActionView = Backbone.View.extend({
    events: {
        'keypress input[type=text]': 'createOnEnter',
        'click button': 'createOnClick'
    },

    initialize(settings) {
        this.input = this.$("input[type=text]");
        this.reValidate = settings.reValidate;
        this.isEditable = settings.isEditable;

        this.listenTo(this.collection, 'add', this.addOne);
        this.listenTo(this.collection, 'reset', this.addAll);

        this.collection.trigger('reset');
    },

    render() {
        return this;
    },

    addAll: function() {
      this.collection.each(this.addOne, this);
    },

    addOne(item) {
        let view = new ListView({ model: item, isEditable: this.isEditable });
        this.$("ul").append(view.render().el);
    },

    createOnEnter(e) {
        if (e.keyCode != 13) return;

        this.createOnClick();
    },

    createOnClick(e) {
        const value = this.input.val();
        if (!value) return;
        if (!this.reValidate.test(value)) return;

        this.collection.add(new Item({ id: this.getItemId(), name: value }));
        this.input.val('');
    },

    getItemId() {
        return null;
    }

});

function restoreItems(value) {
	value = JSON.parse(value || null);
	if (!value) return null;
	if (value instanceof Array && value.length == 0) return null;
	if (!(value instanceof Array)) return null;
	return _(value).map(v => new Item({ id: v.id, name: v.name }));
}

let restoredItems = restoreItems($('#invited_emails').val());
let invitedEmailsList = new ItemList(restoredItems);
let partnersView = new ActionView({
    el: '#partners-view',
    collection: invitedEmailsList,
    reValidate: reEmail,
    isEditable: true
});

restoredItems = restoreItems($('#moved_accounts').val());
let movedAccountsList = new ItemList(restoredItems, { dupField: 'id' });
let accountsView = new ActionView({
    el: '#accounts-view',
    collection: movedAccountsList,
    reValidate: reNonEmpty
});
accountsView.getItemId = () => {
    return selectedDataId;
}

let $partner_name = $('#name');
$('#form_partnerships_new').on('submit', (e) => {
	$('#invited_emails').val(JSON.stringify(invitedEmailsList.toJSON()));
	$('#moved_accounts').val(JSON.stringify(movedAccountsList.toJSON()));
	if(($partner_name.val() || '').trim()) return true;
	$partner_name.tooltip("destroy")
                  .data("title", 'Name has to be provided')
                  .tooltip()
                  .tooltip('show');
	return false;
});

movedAccountsList.trigger();

$partner_name.on('keyup', (e) => {
	$partner_name.data("title", '')
			.tooltip("destroy");
})