2 * Copyright (C) 2012 Xavier Dutoit
3 * Licensed to CiviCRM under the Academic Free License version 3.0.
5 * @see http://wiki.civicrm.org/confluence/display/CRMDOC/Structure+convention+for+automagic+edit+in+place
8 $.fn
.crmEditableEntity = function() {
12 $row
= this.first().closest('.crm-entity');
13 ret
.entity
= $row
.data('entity') || $row
[0].id
.split('-')[0];
14 ret
.id
= $row
.data('id') || $row
[0].id
.split('-')[1];
15 ret
.action
= $row
.data('action') || 'setvalue';
17 if (!ret
.entity
|| !ret
.id
) {
20 $('.crm-editable, [data-field]', $row
).each(function() {
21 var fieldName
= $(this).data('field') || this.className
.match(/crmf-(\S*)/)[1];
23 ret
[fieldName
] = $(this).text();
25 ret
.field
= fieldName
;
32 $.fn
.crmEditable = function(options
) {
33 var checkable = function() {
34 $(this).change(function() {
35 var info
= $(this).crmEditableEntity();
39 var checked
= $(this).is(':checked');
44 value
: checked
? 1 : 0
46 CRM
.api(info
.entity
, info
.action
, params
, {
48 error: function(data
) {
49 editableSettings
.error
.call(this, info
.entity
, info
.field
, checked
, data
);
51 success: function(data
) {
52 editableSettings
.success
.call(this, info
.entity
, info
.field
, checked
, data
);
60 callBack: function(data
) {
62 editableSettings
.error
.call(this, data
);
64 return editableSettings
.success
.call(this, data
);
67 error: function(entity
, field
, value
, data
) {
68 $(this).crmError(data
.error_message
, ts('Error'));
69 $(this).removeClass('crm-editable-saving');
71 success: function(entity
, field
, value
, data
) {
73 CRM
.status(ts('Saved'));
74 $i
.removeClass('crm-editable-saving crm-error');
79 var editableSettings
= $.extend({}, defaults
, options
);
80 return this.each(function() {
84 if (this.nodeName
== "INPUT" && this.type
== "checkbox") {
85 checkable
.call(this, this);
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, '');
96 if ($i
.data('placeholder')) {
97 settings
.placeholder
= $i
.data('placeholder');
99 settings
.placeholder
= '<span class="crm-editable-placeholder">Click to edit</span>';
101 if ($i
.data('tooltip')) {
102 settings
.placeholder
= $i
.data('tooltip')
104 settings
.tooltip
= 'Click to edit...';
106 if ($i
.data('type')) {
107 settings
.type
= $i
.data('type');
108 settings
.onblur
= 'submit';
110 if ($i
.data('options')) {
111 settings
.data
= $i
.data('options');
113 if (settings
.type
== 'textarea') {
114 $i
.addClass('crm-editable-textarea-enabled');
117 $i
.addClass('crm-editable-enabled');
120 $i
.editable(function(value
, settings
) {
121 $i
.addClass('crm-editable-saving');
123 info
= $i
.crmEditableEntity(),
125 action
= $i
.data('action') || info
.action
;
129 if (info
.id
&& info
.id
!== 'new') {
132 if (action
=== 'setvalue') {
133 params
.field
= info
.field
;
134 params
.value
= value
;
137 params
[info
.field
] = value
;
139 CRM
.api(info
.entity
, action
, params
, {
141 error: function(data
) {
142 editableSettings
.error
.call(this, info
.entity
, info
.field
, value
, data
);
144 success: function(data
) {
145 if ($i
.data('options')) {
146 value
= $i
.data('options')[value
];
148 $i
.trigger('crmFormSuccess');
149 editableSettings
.success
.call(this, info
.entity
, info
.field
, value
, data
);