dxfComparePanel.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /* eslint-disable no-undef */
  2. export default class DxfComparePanel {
  3. compareDetail;
  4. container;
  5. viewer;
  6. constructor(viewer, container = document.body) {
  7. this.init(viewer, container);
  8. }
  9. init(viewer, container) {
  10. this.viewer = viewer;
  11. this.container = container;
  12. this.buildPanel();
  13. this.initEvents();
  14. }
  15. buildPanel() {
  16. const panelContainer = document.createElement("div");
  17. panelContainer.classList.add("compare-panel-container");
  18. const header = document.createElement("h3");
  19. panelContainer.appendChild(header);
  20. this.container.appendChild(panelContainer);
  21. const compareDetail = document.createElement("div");
  22. compareDetail.classList.add("compare-detail");
  23. panelContainer.appendChild(compareDetail);
  24. this.compareDetail = compareDetail;
  25. const changes = this.viewer.getCompareChanges();
  26. if (!changes) {
  27. return;
  28. }
  29. const changesValues = Object.values(changes);
  30. header.innerHTML = `差异列表(${changesValues.length})`;
  31. const addedChangesValues = changesValues.filter((val) => val.type === "Added");
  32. const deletedChangeValues = changesValues.filter((val) => val.type === "Removed");
  33. const modifiedChanageValues = changesValues.filter((val) => val.type === "Modified");
  34. if (addedChangesValues.length > 0) {
  35. this.buildList(addedChangesValues, "新增");
  36. }
  37. if (deletedChangeValues.length > 0) {
  38. this.buildList(deletedChangeValues, "删除");
  39. }
  40. if (modifiedChanageValues.length > 0) {
  41. this.buildList(modifiedChanageValues, "修改");
  42. }
  43. }
  44. buildList(changesValues, text) {
  45. const section = document.createElement("div");
  46. section.classList.add("compare-list", "compare-add");
  47. this.compareDetail.appendChild(section);
  48. this.buildListTitle(section, `${text}(<b>${changesValues.length}</b>)`);
  49. const listEle = document.createElement("ul");
  50. listEle.classList.add("list", "hide");
  51. section.appendChild(listEle);
  52. let listFragment = "";
  53. changesValues.forEach((val) => {
  54. listFragment += `<li data-id=${val.id} class="list-item">${val.handle}</li>`;
  55. });
  56. listEle.innerHTML = listFragment;
  57. }
  58. buildListTitle(group, title) {
  59. const listTitle = document.createElement("div");
  60. listTitle.classList.add("list-title", "compare-collapse");
  61. group.appendChild(listTitle);
  62. const titleIcon = document.createElement("span");
  63. titleIcon.classList.add("title-icon");
  64. listTitle.appendChild(titleIcon);
  65. const titleContent = document.createElement("span");
  66. titleContent.classList.add("title-content");
  67. titleContent.innerHTML = title;
  68. listTitle.appendChild(titleContent);
  69. }
  70. initEvents() {
  71. const listTitles = document.querySelectorAll(".list-title");
  72. listTitles.forEach((listTitle) => {
  73. listTitle.addEventListener("click", () => {
  74. listTitle.classList.toggle("compare-collapse");
  75. listTitle.nextSibling?.classList.toggle("hide");
  76. });
  77. });
  78. const lists = document.querySelectorAll(".list");
  79. lists.forEach((list) => {
  80. list.addEventListener("click", (e) => {
  81. if (e.target.tagName.toUpperCase() === "LI" && e.target.dataset.id) {
  82. this.viewer.zoomToCompareChange(e.target.dataset.id);
  83. }
  84. });
  85. });
  86. }
  87. destroy() {
  88. this.container.remove();
  89. this.container = undefined;
  90. }
  91. }