entity.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. ((dn, schema, inputs, ldifOutput, classContainer, addClassSelect, addClassBtn) => {
  2. let changes = [],
  3. multipleValues = {},
  4. maxInputId = 0,
  5. newClasses = {},
  6. attributeCount = {};
  7. function ComputeChanges() {
  8. let classChanges = [];
  9. let actualChanges = [];
  10. for (let i in newClasses)
  11. classChanges.push(`add: objectClass\nobjectClass: ${i}`);
  12. for (let i = 0; i < changes.length; ++i) {
  13. let ch = changes[i];
  14. if (!ch)
  15. continue;
  16. if (ch.initialValue.length && ch.newValue.length && (multipleValues[ch.attrName] || 0) === 1) {
  17. actualChanges.push(`replace: ${ch.attrName}\n${ch.attrName}: ${ch.newValue}`);
  18. } else {
  19. if (ch.initialValue.length) {
  20. if ((multipleValues[ch.attrName] || 0) === 1)
  21. actualChanges.push(`delete: ${ch.attrName}`);
  22. else
  23. actualChanges.push(`delete: ${ch.attrName}\nattribute: ${ch.initialValue}`);
  24. }
  25. if (ch.newValue.length)
  26. actualChanges.push(`add: ${ch.attrName}\n${ch.attrName}: ${ch.newValue}`);
  27. }
  28. }
  29. let totalChanges = classChanges.concat(actualChanges.sort((a, b) => b.localeCompare(a)));
  30. if (!totalChanges.length)
  31. return "";
  32. return `dn: ${dn}\nchangetype: modify\n` + totalChanges.join("\n-\n");
  33. }
  34. function UpdateLdif() {
  35. ldifOutput.textContent = ComputeChanges();
  36. ldifOutput.style.height = ldifOutput.scrollHeight + "px"
  37. }
  38. function onValueChanged(input) {
  39. let initialValue = input.dataset.initialValue || "",
  40. inputId = input.dataset.inputId,
  41. newValue = input.value || "",
  42. attrName = input.dataset.attributeName;
  43. if (initialValue === newValue)
  44. changes[inputId] = undefined;
  45. else
  46. changes[inputId] = { initialValue: initialValue, newValue: newValue, attrName: attrName };
  47. UpdateLdif();
  48. }
  49. let prevItem = null; // input field
  50. function addAddButton(item) { // item is the input field
  51. let addButton = document.createElement("a");
  52. addButton.innerText = "Add";
  53. addButton.src = "#";
  54. addButton.parentInput = item;
  55. addButton.addEventListener("click", (e) => {
  56. e.preventDefault();
  57. let line = addButton.parentInput.parentNode.parentNode;
  58. let copy = line.cloneNode(true);
  59. line.parentNode.insertBefore(copy, line);
  60. let input = copy.querySelectorAll("label > input")[0];
  61. input.value = "";
  62. input.dataset.initialValue = "";
  63. input.addEventListener("change", e => onValueChanged(e.currentTarget));
  64. input.dataset.inputId = ++maxInputId;
  65. let button = copy.querySelectorAll("label > span > a")[0];
  66. button.parentNode.removeChild(button);
  67. });
  68. item.parentNode.children[0].appendChild(addButton);
  69. }
  70. function manageDuplicateAttributes(li, input) {
  71. attributeCount[input.dataset.attributeName] = (attributeCount[input.dataset.attributeName] || {});
  72. attributeCount[input.dataset.attributeName][input.dataset.klass] = true;
  73. if (Object.keys(attributeCount[input.dataset.attributeName]).length > 1)
  74. li.style.display = "none";
  75. }
  76. inputs.forEach(i => {
  77. maxInputId = Math.max(i.dataset.inputId, maxInputId);
  78. let attrName = i.dataset.attributeName;
  79. if ((i.dataset.initialValue || "").length)
  80. multipleValues[attrName] = (multipleValues[attrName] || 0) + 1;
  81. i.addEventListener("change", e => onValueChanged(e.currentTarget))
  82. if (prevItem != null &&
  83. prevItem.dataset.attributeName !== i.dataset.attributeName) {
  84. addAddButton(prevItem);
  85. }
  86. prevItem = i;
  87. manageDuplicateAttributes(i.parentElement.parentElement, i);
  88. });
  89. prevItem && addAddButton(prevItem);
  90. function CreateClassAttributeDom(className, name, init, isMandatory) {
  91. let li = document.createElement("li");
  92. let label = document.createElement("label");
  93. label.classList.add("LDAPAttribute");
  94. li.appendChild(label);
  95. let span = document.createElement("span");
  96. if (isMandatory)
  97. span.classList.add("mandatory");
  98. span.innerText = name;
  99. let input = document.createElement("input");
  100. input.type = "text";
  101. input.value = init;
  102. input.dataset.initialValue = init;
  103. input.dataset.inputId = ++maxInputId;
  104. input.dataset.name = name;
  105. input.dataset.klass = className;
  106. input.dataset.attributeName = name;
  107. input.required = isMandatory;
  108. input.addEventListener("change", e => onValueChanged(e.currentTarget))
  109. label.appendChild(span);
  110. label.appendChild(input);
  111. addAddButton(input);
  112. manageDuplicateAttributes(li, input);
  113. return li;
  114. }
  115. function CreateClassDom(schema, className) {
  116. let classDom = document.createElement("fieldset");
  117. classDom.classList.add("LDAPClass");
  118. let legend = document.createElement("legend");
  119. let legendInner = document.createElement("h3");
  120. legendInner.innerText = className +' (' +schema["type"] +')';
  121. legend.appendChild(legendInner);
  122. classDom.appendChild(legend);
  123. let list = document.createElement("ul");
  124. for (let i of schema["must"])
  125. list.appendChild(CreateClassAttributeDom(className, i, "", true));
  126. for (let i of schema["may"])
  127. list.appendChild(CreateClassAttributeDom(className, i, "", false));
  128. classDom.appendChild(list);
  129. return classDom;
  130. }
  131. addClassBtn.addEventListener("click", () => {
  132. let targetClass = addClassSelect.value;
  133. if (!schema[targetClass])
  134. return;
  135. for (let i of addClassSelect.children) {
  136. if (i.value === targetClass) {
  137. addClassSelect.removeChild(i);
  138. break;
  139. }
  140. }
  141. newClasses[targetClass] = true;
  142. let dom = CreateClassDom(schema[targetClass], targetClass);
  143. classContainer.appendChild(dom);
  144. UpdateLdif();
  145. });
  146. })(
  147. window['dn'], window['schema'],
  148. document.querySelectorAll(".LDAPAttribute > input"), document.getElementById("ldifOutput"),
  149. document.getElementById("classContainer"),
  150. document.getElementById("addClassSelect"), document.getElementById("addClassBtn"));