Merge pull request #9428 from jitendrapurohit/CRM-19662
[civicrm-core.git] / js / wysiwyg / admin.ckeditor-configurator.js
1 // https://civicrm.org/licensing
2 (function($, _) {
3 'use strict';
4 /* jshint validthis: true */
5
6 var configRowTpl = _.template($('#config-row-tpl').html()),
7 options;
8
9 // Weird conflict with drupal styles
10 $('body').removeClass('toolbar');
11
12 function format(item) {
13 var icon = '<span class="ui-icon ui-icon-gear"></span>';
14 if (item.icon) {
15 icon = '<img src="' + CRM.config.resourceBase + item.icon + '" />';
16 }
17 return icon + '&nbsp;' + item.text;
18 }
19
20 function initOptions(data) {
21 options = _.filter(data, function(n) {
22 return $.inArray(n.id, CRM.vars.ckConfig.blacklist) < 0;
23 });
24 addOption();
25 $.each(CRM.vars.ckConfig.settings, function(key, val) {
26 if ($.inArray(key, CRM.vars.ckConfig.blacklist) < 0) {
27 var $opt = $('.crm-config-option-row:last input.crm-config-option-name');
28 $opt.val(key).change();
29 $opt.siblings('span').find(':input').val(val);
30 }
31 });
32 }
33
34 function changeOptionName() {
35 var $el = $(this),
36 name = $el.val();
37 $el.next('span').remove();
38 if (name) {
39 if (($('input.crm-config-option-name').filter(function() {return !this.value;})).length < 1) {
40 addOption();
41 }
42 var type = $el.select2('data').type;
43 if (type === 'Boolean') {
44 $el.after('<span>&nbsp; = &nbsp;<select class="crm-form-select" name="config_' + name + '"><option value="false">false</option><option value="true">true</option></select></span>');
45 }
46 else {
47 $el.after('<span>&nbsp; = &nbsp;<input class="crm-form-text ' + (type==='Number' ? 'eight" type="number"' : 'huge" type="text"') + ' name="config_' + name + '"/></span>');
48 }
49 } else {
50 $el.closest('div').remove();
51 }
52 }
53
54 function addOption() {
55 $('#crm-custom-config-options').append($(configRowTpl({})));
56 $('div:last input.crm-config-option-name', '#crm-custom-config-options').crmSelect2({
57 data: {results: options, text: 'id'},
58 formatSelection: function(field) {
59 return '<strong>' + field.id + '</strong> (' + field.type + ')';
60 },
61 formatResult: function(field) {
62 return '<strong>' + field.id + '</strong> (' + field.type + ')' +
63 '<div class="api-field-desc">' + field.description + '</div>';
64 }
65 });
66 }
67
68 $('#extraPlugins').crmSelect2({
69 multiple: true,
70 closeOnSelect: false,
71 data: CRM.vars.ckConfig.plugins,
72 escapeMarkup: _.identity,
73 formatResult: format,
74 formatSelection: format
75 });
76
77 var toolbarModifier = new ToolbarConfigurator.ToolbarModifier( 'editor-basic' );
78
79 toolbarModifier.init(_.noop);
80
81 CKEDITOR.document.getById( 'toolbarModifierWrapper' ).append( toolbarModifier.mainContainer );
82
83 $(function() {
84 var selectorOpen = false,
85 changedWhileOpen = false;
86
87 $('#toolbarModifierForm')
88 .on('submit', function(e) {
89 $('.toolbar button:last', '#toolbarModifierWrapper')[0].click();
90 $('.configContainer textarea', '#toolbarModifierWrapper').attr('name', 'config');
91 })
92 .on('change', '.config-param', function(e) {
93 changedWhileOpen = true;
94 if (!selectorOpen) {
95 $('#toolbarModifierForm').submit().block();
96 }
97 })
98 .on('change', 'input.crm-config-option-name', changeOptionName)
99 // Debounce the change event so it only fires after the multiselect is closed
100 .on('select2-open', 'input.config-param', function(e) {
101 selectorOpen = true;
102 changedWhileOpen = false;
103 })
104 .on('select2-close', 'input.config-param', function(e) {
105 selectorOpen = false;
106 if (changedWhileOpen) {
107 $(this).change();
108 }
109 });
110
111 $.getJSON(CRM.config.resourceBase + 'js/wysiwyg/ck-options.json', null, initOptions);
112 });
113
114 })(CRM.$, CRM._);