OCA reporting engine fork for dev and update.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

151 lines
5.9 KiB

  1. /* Copyright 2015-2019 Onestein (<https://www.onestein.eu>)
  2. * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */
  3. odoo.define('bi_view_editor', function (require) {
  4. "use strict";
  5. var JoinNodeDialog = require('bi_view_editor.JoinNodeDialog');
  6. var ModelList = require('bi_view_editor.ModelList');
  7. var FieldList = require('bi_view_editor.FieldList').FieldList;
  8. var AbstractField = require('web.AbstractField');
  9. var Data = require('web.data');
  10. var field_registry = require('web.field_registry');
  11. var BiViewEditor = AbstractField.extend({
  12. template: "bi_view_editor.Frame",
  13. events: {
  14. "click .clear-btn": "clear",
  15. },
  16. start: function () {
  17. var self = this;
  18. var res = this._super.apply(this, arguments);
  19. // Init ModelList
  20. this.model_list = new ModelList(this);
  21. this.model_list.appendTo(this.$(".body > .left"));
  22. this.model_list.on('field_clicked', this, function (field) {
  23. self.addField(_.extend({}, field));
  24. });
  25. // Init FieldList
  26. this.field_list = new FieldList(this);
  27. this.field_list.appendTo(this.$(".body > .right"));
  28. this.field_list.on('removed', this, this.fieldListRemoved);
  29. this.field_list.on('updated', this, this.fieldListChanged);
  30. this.$el.find(".body > .right").droppable({
  31. accept: "div.class-list div.field",
  32. drop: function (event, ui) {
  33. self.addField(_.extend({}, ui.draggable.data('field')));
  34. ui.draggable.draggable('option', 'revert', false);
  35. },
  36. });
  37. this.on("change:effective_readonly", this, function () {
  38. this.updateMode();
  39. });
  40. this.renderValue();
  41. this.loadAndPopulateModelList();
  42. this.updateMode();
  43. return res;
  44. },
  45. clear: function () {
  46. if (this.mode !== 'readonly') {
  47. this.field_list.set([]);
  48. this.loadAndPopulateModelList();
  49. this._setValue(this.field_list.get());
  50. }
  51. },
  52. fieldListChanged: function () {
  53. this._setValue(this.field_list.get());
  54. },
  55. fieldListRemoved: function () {
  56. console.log(this.field_list.get());
  57. this._setValue(this.field_list.get());
  58. var model = new Data.DataSet(this, "bve.view");
  59. model.call('get_clean_list', [this.value]).then(function (result) {
  60. this.field_list.set(JSON.parse(result));
  61. this._setValue(this.field_list.get());
  62. }.bind(this));
  63. this.loadAndPopulateModelList();
  64. },
  65. renderValue: function () {
  66. this.field_list.set(JSON.parse(this.value));
  67. },
  68. updateMode: function () {
  69. if (this.mode === 'readonly') {
  70. this.$el.find('.clear-btn').addClass('d-none');
  71. this.$el.find(".body .right").droppable("option", "disabled", true);
  72. } else {
  73. this.$el.find('.clear-btn').removeClass('d-none');
  74. this.$el.find('.body .right').droppable('option', 'disabled', false);
  75. }
  76. this.field_list.setMode(this.mode);
  77. this.model_list.setMode(this.mode);
  78. },
  79. loadAndPopulateModelList: function () {
  80. var model_ids = null;
  81. if (this.field_list.get().length > 0) {
  82. model_ids = this.field_list.getModelIds();
  83. }
  84. this.model_list.loadModels(model_ids).done(function (models) {
  85. this.model_list.populateModels(models);
  86. }.bind(this));
  87. },
  88. getTableAlias: function (field) {
  89. if (typeof field.table_alias === 'undefined') {
  90. var model_ids = this.field_list.getModelIds();
  91. var n = 1;
  92. while (typeof model_ids["t" + n] !== 'undefined') {
  93. n++;
  94. }
  95. return "t" + n;
  96. }
  97. return field.table_alias;
  98. },
  99. addFieldAndJoinNode: function (field, join_node) {
  100. if (join_node.join_node === -1 || join_node.table_alias === -1) {
  101. field.table_alias = this.getTableAlias(field);
  102. if (join_node.join_node === -1) {
  103. join_node.join_node = field.table_alias;
  104. } else {
  105. join_node.table_alias = field.table_alias;
  106. }
  107. this.field_list.add(join_node);
  108. } else {
  109. field.table_alias = join_node.table_alias;
  110. }
  111. this.field_list.add(field);
  112. this.loadAndPopulateModelList();
  113. this._setValue(this.field_list.get());
  114. },
  115. addField: function (field) {
  116. var data = _.extend({}, field);
  117. var model = new Data.DataSet(this, "ir.model");
  118. var field_data = this.field_list.get();
  119. model.call('get_join_nodes', [field_data, data]).then(function (result) {
  120. if (result.length === 1) {
  121. this.addFieldAndJoinNode(data, result[0]);
  122. } else if (result.length > 1) {
  123. var dialog = new JoinNodeDialog(this, {}, result, this.field_list.getModelData());
  124. dialog.open().on('chosen', this, function (e) {
  125. this.addFieldAndJoinNode(data, e.choice);
  126. });
  127. } else {
  128. data.table_alias = this.getTableAlias(data);
  129. this.field_list.add(data);
  130. this.loadAndPopulateModelList();
  131. this._setValue(this.field_list.get());
  132. }
  133. }.bind(this));
  134. },
  135. _parseValue: function (value) {
  136. return JSON.stringify(value);
  137. },
  138. });
  139. field_registry.add('BVEEditor', BiViewEditor);
  140. });