ajaxSelect.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. mgJsComponentHandler.addDefaultComponent('mg-ajax-select', {
  2. template : '#t-mg-ajax-select',
  3. props: [
  4. 'component_id',
  5. 'component_namespace',
  6. 'component_index',
  7. 'reload_fields_ids',
  8. 'is_multiple',
  9. 'hide_by_default_if_no_data'
  10. ],
  11. data : function() {
  12. return {
  13. options: [],
  14. selected: null,
  15. selectInstance: null,
  16. showItemDescription: null,
  17. };
  18. },
  19. created: function () {
  20. var self = this;
  21. //create reload events
  22. for (var key in self.reload_fields_ids) {
  23. if (!self.reload_fields_ids.hasOwnProperty(key)) {
  24. continue;
  25. }
  26. mgEventHandler.on('SelectFieldValueChanged', self.reload_fields_ids[key], function(id, params){
  27. self.loadAjaxData();
  28. });
  29. }
  30. self.$nextTick(function() {
  31. self.initSelect();
  32. self.loadAjaxData();
  33. });
  34. },
  35. methods: {
  36. initSelect: function() {
  37. var self = this;
  38. if ($('#' + self.component_id).hasClass('selectized')) {
  39. var selectizedInstance = $('#' + self.component_id).selectize();
  40. selectizedInstance[0].selectize.destroy();
  41. }
  42. var config = {
  43. valueField: 'key',
  44. labelField: 'value',
  45. searchField: 'value',
  46. create: false,
  47. plugins: ['remove_button'],
  48. copyClassesToDropdown: false,
  49. options: self.options,
  50. items: self.selected,
  51. };
  52. var selSelect = $('#' + self.component_id).selectize(config);
  53. self.selectInstance = selSelect[0].selectize;
  54. self.selectInstance .on('change', function(value){
  55. self.selectChangeAction();
  56. });
  57. },
  58. loadAjaxData: function() {
  59. var self = this;
  60. this.addLoader();
  61. var loadFormData = false;
  62. for (var key in self.reload_fields_ids) {
  63. if (!self.reload_fields_ids.hasOwnProperty(key)) {
  64. continue;
  65. }
  66. if (self.reload_fields_ids[key] !== '' && self.reload_fields_ids)
  67. {
  68. loadFormData = true;
  69. break;
  70. }
  71. }
  72. if (loadFormData) {
  73. var tmpForm = $("select[name='" + self.component_id + "']").parents('form').first();
  74. var tmpFormId = $(tmpForm).attr('id');
  75. var tmpFormDataHandler = new mgFormControler(tmpFormId);
  76. var formData = tmpFormDataHandler.getFieldsData();
  77. if (typeof formData.formData !== 'undefined') {
  78. formData = formData.formData;
  79. }
  80. } else {
  81. var formData = new FormData();
  82. }
  83. var requestParams = {
  84. loadData: self.component_id,
  85. namespace: self.component_namespace,
  86. index: self.component_index
  87. };
  88. for (var pair of formData.entries()) {
  89. requestParams[pair[0]] = pair[1];
  90. }
  91. var response = mgPageControler.vueLoader.vloadData(requestParams);
  92. return response.done(function(data){
  93. self.options = [];
  94. for (var key in data.data.rawData.options) {
  95. if (!data.data.rawData.options.hasOwnProperty(key)) {
  96. continue;
  97. }
  98. var tmpOpt = {};
  99. tmpOpt[key] = data.data.rawData.options[key];
  100. self.options.push({}[key] = data.data.rawData.options[key]);
  101. }
  102. self.selected = typeof data.data.rawData.selected === 'string' ? [data.data.rawData.selected] : data.data.rawData.selected;
  103. self.showItemDescription = typeof data.data.rawData.additionalData === 'undefined' && typeof data.data.rawData.additionalData.showItemDescription === 'undefined' ? data.data.rawData.additionalData.showItemDescription : false;
  104. self.$nextTick(function() {
  105. self.showSelectIfHidden();
  106. });
  107. self.$nextTick(function() {
  108. self.initSelect();
  109. });
  110. mgEventHandler.runCallback('SelectFieldDataLoaded', self.component_id, {instance: self, data: data.data.rawData});
  111. self.removeLoader();
  112. }).fail(function(){
  113. self.removeLoader();
  114. self.$nextTick(function() {
  115. self.initSelect();
  116. });
  117. mgEventHandler.runCallback('SelectFieldDataLoaded', self.component_id, {instance: self, data: data.data.rawData});
  118. });
  119. },
  120. showSelectIfHidden : function() {
  121. var self = this;
  122. if (self.hide_by_default_if_no_data && self.options.length > 0) {
  123. if ($('#' + self.component_id).parents('.lu-form-group').first().length > 0) {
  124. $('#' + self.component_id).parents('.lu-form-group').first().removeAttr('hidden');
  125. }
  126. }
  127. },
  128. selectChangeAction : function() {
  129. this.$nextTick(function() {
  130. mgEventHandler.runCallback('SelectFieldValueChanged', this.component_id, {data: this});
  131. });
  132. },
  133. addLoader: function() {
  134. var selectizeLoader = '<div class="lu-preloader lu-preloader--sm mg-selectize-loader"></div>';
  135. $('#' + this.component_id).parent().find('.selectize-input').first().append(selectizeLoader);
  136. },
  137. removeLoader: function () {
  138. $('#' + this.component_id).parent().find('.mg-selectize-loader').remove();
  139. }
  140. }
  141. });