summaryrefslogtreecommitdiff
path: root/addons/web_linkedin/static/src/js
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web_linkedin/static/src/js')
-rw-r--r--addons/web_linkedin/static/src/js/linkedin.js288
1 files changed, 288 insertions, 0 deletions
diff --git a/addons/web_linkedin/static/src/js/linkedin.js b/addons/web_linkedin/static/src/js/linkedin.js
new file mode 100644
index 00000000000..d08aa3ede28
--- /dev/null
+++ b/addons/web_linkedin/static/src/js/linkedin.js
@@ -0,0 +1,288 @@
+/*---------------------------------------------------------
+ * OpenERP web_linkedin (module)
+ *---------------------------------------------------------*/
+
+openerp.web_linkedin = function(instance) {
+ var QWeb = instance.web.qweb;
+ var _t = instance.web._t;
+
+ instance.web_linkedin.LinkedinTester = instance.web.Class.extend({
+ init: function() {
+ this.linkedin_added = false;
+ this.linkedin_def = $.Deferred();
+ this.auth_def = $.Deferred();
+ },
+ test_linkedin: function() {
+ var self = this;
+ return this.test_api_key().pipe(function() {
+ if (self.linkedin_added)
+ return self.linkedin_def.promise();
+ var tag = document.createElement('script');
+ tag.type = 'text/javascript';
+ tag.src = "http://platform.linkedin.com/in.js";
+ tag.innerHTML = 'api_key : ' + self.api_key + '\nauthorize : true';
+ document.getElementsByTagName('head')[0].appendChild(tag);
+ self.linkedin_added = true;
+ $(tag).load(function() {
+ IN.Event.on(IN, "auth", function() {
+ self.auth_def.resolve();
+ });
+ self.linkedin_def.resolve();
+ });
+ return self.linkedin_def.promise();
+ });
+ },
+ test_api_key: function() {
+ var self = this;
+ if (this.api_key) {
+ return $.when();
+ }
+ return new instance.web.Model("ir.config_parameter").call("set_param", ["web.linkedin.apikey", ""]).pipe(function() {
+ return new instance.web.Model("ir.config_parameter").call("get_param", ["web.linkedin.apikey"]).pipe(function(a) {
+ if (!!a) {
+ self.api_key = a;
+ return true;
+ } else {
+ return $.Deferred().reject();
+ }
+ });
+ });
+ },
+ test_authentication: function() {
+ return this.auth_def.promise();
+ },
+ });
+
+ instance.web_linkedin.tester = new instance.web_linkedin.LinkedinTester();
+
+ instance.web_linkedin.Linkedin = instance.web.form.FieldChar.extend({
+ init: function() {
+ this._super.apply(this, arguments);
+ this.display_dm = new instance.web.DropMisordered(true);
+ },
+ initialize_content: function() {
+ var $ht = $(QWeb.render("FieldChar.linkedin"));
+ var $in = this.$("input");
+ $in.replaceWith($ht);
+ this.$(".oe_linkedin_input").append($in);
+ this.$(".oe_linkedin_img").click(_.bind(this.search_linkedin, this));
+ this._super();
+
+ },
+ search_linkedin: function() {
+ var self = this;
+ this.display_dm.add(instance.web_linkedin.tester.test_linkedin()).then(function() {
+ var pop = new instance.web_linkedin.LinkedinPopup(self, self.get("value"));
+ pop.open();
+ pop.on("selected", this, function(entity) {
+ self.selected_entity(entity);
+ });
+ }, _.bind(this.linkedin_disabled, this));
+ },
+ linkedin_disabled: function() {
+ if (instance.connection.uid !== 1) {
+ instance.web.dialog($(QWeb.render("LinkedIn.DisabledWarning")), {
+ title: _t("LinkedIn is not enabled"),
+ buttons: [
+ {text: _t("Ok"), click: function() { $(this).dialog("close"); }}
+ ]
+ });
+ } else {
+ new instance.web_linkedin.KeyWizard(this).open();
+ }
+ },
+ selected_entity: function(entity) {
+ var self = this;
+ this.create_on_change(entity).then(function(to_change) {
+ self.view.on_processed_onchange({value:to_change});
+ });
+ },
+ create_on_change: function(entity) {
+ var self = this;
+ var to_change = {};
+ var defs = [];
+ if (entity.__type === "company") {
+ to_change.is_company = true;
+ to_change.name = entity.name;
+ to_change.photo = false;
+ if (entity.logoUrl) {
+ defs.push(self.rpc('/web_linkedin/binary/url2binary',
+ {'url': entity.logoUrl}).pipe(function(data){
+ to_change.photo = data;
+ }));
+ }
+ to_change.website = entity.websiteUrl;
+ to_change.phone = false;
+ _.each(entity.locations.values || [], function(el) {
+ to_change.phone = el.contactInfo.phone1;
+ });
+ var children_def = $.Deferred();
+ IN.API.PeopleSearch().fields(commonPeopleFields).params({
+ "company-name" : entity.name,
+ "current-company": true,
+ "count": 25,
+ }).result(function(result) {
+ children_def.resolve(result);
+ });
+ defs.push(children_def.pipe(function(result) {
+ var defs = _.map(result.people.values || [], function(el) {
+ el.__type = "people";
+ return self.create_on_change(el);
+ });
+ return $.when.apply($, defs).pipe(function() {
+ var p_to_change = _.toArray(arguments);
+ to_change.child_ids = p_to_change;
+ });
+ }));
+ /* TODO
+ to_change.linkedinUrl = _.str.sprintf("http://www.linkedin.com/company/%d", entity.id);
+ */
+ } else { // people
+ to_change.is_company = false;
+ to_change.name = entity.formattedName;
+ to_change.photo = false;
+ if (entity.pictureUrl) {
+ defs.push(self.rpc('/web_linkedin/binary/url2binary',
+ {'url': entity.pictureUrl}).pipe(function(data){
+ to_change.photo = data;
+ }));
+ }
+ to_change.mobile = false;
+ to_change.phone = false;
+ _.each(entity.phoneNumbers.values || [], function(el) {
+ if (el.phoneType === "mobile") {
+ to_change.mobile = el.phoneNumber;
+ } else {
+ to_change.phone = el.phoneNumber;
+ }
+ });
+ to_change.function = entity.headline;
+ /* TODO
+ to_change.linkedinUrl = entity.publicProfileUrl;
+ */
+ }
+ return $.when.apply($, defs).pipe(function() {
+ return to_change;
+ });
+ },
+ });
+
+ instance.web.form.widgets.add('linkedin', 'instance.web_linkedin.Linkedin');
+
+ var commonPeopleFields = ["id", "picture-url", "public-profile-url",
+ "formatted-name", "location", "phone-numbers", "im-accounts",
+ "main-address", "headline"];
+
+ instance.web_linkedin.LinkedinPopup = instance.web.Dialog.extend({
+ template: "Linkedin.popup",
+ init: function(parent, text) {
+ this._super(parent, {title:_t("LinkedIn search")});
+ this.text = text;
+ this.limit = 15;
+ },
+ start: function() {
+ this._super();
+ var self = this;
+ this.on("authentified", this, this.authentified);
+ instance.web_linkedin.tester.test_authentication().then(function() {
+ self.trigger("authentified");
+ });
+ },
+ authentified: function() {
+ var self = this;
+ cdef = $.Deferred();
+ pdef = $.Deferred();
+ IN.API.Raw(_.str.sprintf(
+ "company-search:(companies:" +
+ "(id,name,logo-url,description,industry,website-url,locations))?keywords=%s&count=%d",
+ encodeURI(this.text), this.limit)).result(function (result) {
+ cdef.resolve(result);
+ });
+ IN.API.PeopleSearch().fields(commonPeopleFields).
+ params({"keywords": this.text, "count": this.limit}).result(function(result) {
+ pdef.resolve(result);
+ });
+ return $.when(cdef, pdef).then(function(companies, people) {
+ var lst = companies.companies.values || [];
+ var plst = people.people.values || [];
+ lst = _.initial(lst, _.min([self.limit / 2, plst.length]));
+ _.map(lst, function(el) {
+ el.__type = "company";
+ return el;
+ });
+ plst = _.first(plst, self.limit - lst.length)
+ _.map(plst, function(el) {
+ el.__type = "people";
+ return el;
+ });
+ lst = plst.concat(lst);
+ console.log("Linkedin search found:", lst.length, lst);
+ self.result = lst;
+ self.display_result();
+ });
+ },
+ display_result: function() {
+ var self = this;
+ var i = 0;
+ var $row;
+ _.each(self.result, function(el) {
+ var pc = new instance.web_linkedin.EntityWidget(self, el);
+ if (i % 5 === 0) {
+ $row = $("<div style='display: table-row;width:100%'/>");
+ $row.appendTo(self.$(">div"));
+ }
+ pc.appendTo($row);
+ pc.$element.css("display", "table-cell");
+ pc.$element.css("width", "20%");
+ pc.on("selected", self, function(data) {
+ self.trigger("selected", data);
+ self.destroy();
+ });
+ i++;
+ });
+ if (self.result.length === 0) {
+ self.$(">div").text(_t("No results found"));
+ }
+ },
+ });
+
+ instance.web_linkedin.EntityWidget = instance.web.Widget.extend({
+ template: "Linkedin.EntityWidget",
+ init: function(parent, data) {
+ this._super(parent);
+ this.data = data;
+ },
+ start: function() {
+ var self = this;
+ this.$element.click(function() {
+ self.trigger("selected", self.data);
+ });
+ if (this.data.__type === "company") {
+ this.$("h3").text(this.data.name);
+ self.$("img").attr("src", this.data.logoUrl);
+ } else { // people
+ this.$("h3").text(this.data.formattedName);
+ self.$("img").attr("src", this.data.pictureUrl);
+ }
+ },
+ });
+
+
+ instance.web_linkedin.KeyWizard = instance.web.Dialog.extend({
+ template: "LinkedIn.KeyWizard",
+ init: function(parent, text) {
+ this._super(parent, {title:_t("LinkedIn API Key")});
+ },
+ start: function() {
+ this._super();
+ var self = this;
+ this.$("button").click(function() {
+ var value = self.$("input").val();
+ return new instance.web.Model("ir.config_parameter").call("set_param", ["web.linkedin.apikey", value]).pipe(function() {
+ self.destroy();
+ });
+ });
+ },
+ });
+};
+// vim:et fdc=0 fdl=0: