Commit | Line | Data |
---|---|---|
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); |