Merge pull request #4040 from davecivicrm/CRM-15207
[civicrm-core.git] / js / jquery / jquery.crmeditable.js
CommitLineData
1fe97a01 1/**
99d24adf
CW
2 * Copyright (C) 2012 Xavier Dutoit
3 * Licensed to CiviCRM under the Academic Free License version 3.0.
4 *
5 * @see http://wiki.civicrm.org/confluence/display/CRMDOC/Structure+convention+for+automagic+edit+in+place
6 */
6a488035 7(function($) {
d4838efc
CW
8 $.fn.crmEditableEntity = function() {
9 var
10 el = this[0],
11 ret = {},
12 $row = this.first().closest('.crm-entity');
4f1c81da 13 ret.entity = $row.data('entity') || $row[0].id.split('-')[0];
14 ret.id = $row.data('id') || $row[0].id.split('-')[1];
2d221ef7 15 ret.action = $row.data('action') || 'setvalue';
4f1c81da 16
d4838efc
CW
17 if (!ret.entity || !ret.id) {
18 return false;
19 }
60158442 20 $('.crm-editable, [data-field]', $row).each(function() {
d4838efc
CW
21 var fieldName = $(this).data('field') || this.className.match(/crmf-(\S*)/)[1];
22 if (fieldName) {
23 ret[fieldName] = $(this).text();
24 if (this === el) {
25 ret.field = fieldName;
6a488035 26 }
6a488035 27 }
d4838efc
CW
28 });
29 return ret;
30 };
6a488035 31
99d24adf
CW
32 $.fn.crmEditable = function(options) {
33 var checkable = function() {
34 $(this).change(function() {
35 var info = $(this).crmEditableEntity();
36 if (!info.field) {
37 return false;
38 }
39 var checked = $(this).is(':checked');
40 var params = {
41 sequential: 1,
42 id: info.id,
43 field: info.field,
44 value: checked ? 1 : 0
45 };
2d221ef7 46 CRM.api(info.entity, info.action, params, {
99d24adf
CW
47 context: this,
48 error: function(data) {
49 editableSettings.error.call(this, info.entity, info.field, checked, data);
50 },
51 success: function(data) {
52 editableSettings.success.call(this, info.entity, info.field, checked, data);
d4838efc 53 }
6a488035 54 });
99d24adf
CW
55 });
56 };
57
58 var defaults = {
59 form: {},
60 callBack: function(data) {
61 if (data.is_error) {
62 editableSettings.error.call(this, data);
63 } else {
64 return editableSettings.success.call(this, data);
6a488035 65 }
99d24adf
CW
66 },
67 error: function(entity, field, value, data) {
68 $(this).crmError(data.error_message, ts('Error'));
69 $(this).removeClass('crm-editable-saving');
70 },
71 success: function(entity, field, value, data) {
6a488035 72 var $i = $(this);
e11b84ce 73 CRM.status(ts('Saved'));
99d24adf
CW
74 $i.removeClass('crm-editable-saving crm-error');
75 $i.html(value);
76 }
77 };
6a488035 78
99d24adf
CW
79 var editableSettings = $.extend({}, defaults, options);
80 return this.each(function() {
81 var $i = $(this);
82 var fieldName = "";
6a488035 83
99d24adf
CW
84 if (this.nodeName == "INPUT" && this.type == "checkbox") {
85 checkable.call(this, this);
86 return;
87 }
6a488035 88
99d24adf
CW
89 var settings = {
90 tooltip: 'Click to edit...',
91 placeholder: '<span class="crm-editable-placeholder">Click to edit</span>',
92 data: function(value, settings) {
93 return value.replace(/<(?:.|\n)*?>/gm, '');
6a488035 94 }
99d24adf
CW
95 };
96 if ($i.data('placeholder')) {
97 settings.placeholder = $i.data('placeholder');
98 } else {
99 settings.placeholder = '<span class="crm-editable-placeholder">Click to edit</span>';
100 }
101 if ($i.data('tooltip')) {
102 settings.placeholder = $i.data('tooltip')
103 } else {
104 settings.tooltip = 'Click to edit...';
105 }
106 if ($i.data('type')) {
107 settings.type = $i.data('type');
108 settings.onblur = 'submit';
109 }
110 if ($i.data('options')) {
111 settings.data = $i.data('options');
112 }
113 if (settings.type == 'textarea') {
114 $i.addClass('crm-editable-textarea-enabled');
115 }
116 else {
117 $i.addClass('crm-editable-enabled');
118 }
119
120 $i.editable(function(value, settings) {
121 $i.addClass('crm-editable-saving');
122 var
123 info = $i.crmEditableEntity(),
124 params = {},
2d221ef7 125 action = $i.data('action') || info.action;
99d24adf
CW
126 if (!info.field) {
127 return false;
6a488035 128 }
99d24adf
CW
129 if (info.id && info.id !== 'new') {
130 params.id = info.id;
6a488035 131 }
99d24adf
CW
132 if (action === 'setvalue') {
133 params.field = info.field;
134 params.value = value;
6a488035 135 }
99d24adf
CW
136 else {
137 params[info.field] = value;
6a488035 138 }
99d24adf
CW
139 CRM.api(info.entity, action, params, {
140 context: this,
141 error: function(data) {
142 editableSettings.error.call(this, info.entity, info.field, value, data);
6a488035 143 },
99d24adf
CW
144 success: function(data) {
145 if ($i.data('options')) {
146 value = $i.data('options')[value];
6a488035 147 }
99d24adf
CW
148 $i.trigger('crmFormSuccess');
149 editableSettings.success.call(this, info.entity, info.field, value, data);
6a488035 150 }
99d24adf
CW
151 });
152 }, settings);
6a488035
TO
153 });
154 };
155
156})(jQuery);