actionsbuilder.parameters.ts 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650
  1. module ActionsBuilder {
  2. export class Parameters {
  3. public parametersContainer: HTMLElement;
  4. public parametersHelpElement: HTMLElement;
  5. private _action: Action = null;
  6. private _viewer: Viewer;
  7. private _currentObject: any;
  8. /*
  9. * Constructor
  10. */
  11. constructor(viewer: Viewer) {
  12. // Get HTML elements
  13. this.parametersContainer = document.getElementById("ParametersElementID");
  14. this.parametersHelpElement = document.getElementById("ParametersHelpElementID");
  15. // Configure this
  16. this._viewer = viewer;
  17. // Configure events
  18. window.addEventListener("resize", (event: Event) => {
  19. this.onResize(event);
  20. });
  21. }
  22. /*
  23. * Clears the parameters fileds in the parameters view
  24. */
  25. public clearParameters(): void {
  26. if (this.parametersContainer.children === null) {
  27. return;
  28. }
  29. while (this.parametersContainer.children.length > 0) {
  30. this.parametersContainer.removeChild(this.parametersContainer.firstChild);
  31. }
  32. }
  33. /*
  34. * Creates parameters fields
  35. * @param action: the action to configure
  36. */
  37. public createParameters(action: Action): void {
  38. // Clear parameters fields and draw help description
  39. this._action = action;
  40. this.clearParameters();
  41. if (action === null) {
  42. return;
  43. }
  44. this._createHelpSection(action);
  45. this._createNodeSection(action);
  46. // Get properties
  47. var properties = action.properties;
  48. var propertiesResults = action.propertiesResults;
  49. var targetParameterSelect: HTMLSelectElement = null;
  50. var targetParameterNameSelect: HTMLSelectElement = null;
  51. var propertyPathSelect: HTMLSelectElement = null;
  52. var propertyPathOptionalSelect: HTMLSelectElement = null;
  53. var booleanSelect: HTMLSelectElement = null;
  54. var propertyInput: HTMLInputElement = null;
  55. var propertyPathIndice = -1;
  56. if (properties.length === 0) {
  57. return;
  58. }
  59. // Draw properties
  60. for (var i = 0; i < properties.length; i++) {
  61. // Create separator
  62. var separator = document.createElement("hr");
  63. separator.noShade = true;
  64. separator.className = "ParametersElementSeparatorClass";
  65. this.parametersContainer.appendChild(separator);
  66. // Create parameter text
  67. var parameterName = document.createElement("a");
  68. parameterName.text = properties[i].text;
  69. parameterName.className = "ParametersElementTitleClass";
  70. this.parametersContainer.appendChild(parameterName);
  71. if (properties[i].text === "parameter" || properties[i].text === "target" || properties[i].text === "parent") {
  72. if (properties[i].targetType === null) {
  73. var parameterInput = document.createElement("input");
  74. parameterInput.value = propertiesResults[i].value;
  75. parameterInput.className = "ParametersElementInputClass";
  76. this.parametersContainer.appendChild(parameterInput);
  77. // Configure event
  78. parameterInput.onkeyup = this._propertyInputChanged(parameterInput, i);
  79. }
  80. else {
  81. // Create target select element
  82. targetParameterSelect = document.createElement("select");
  83. targetParameterSelect.className = "ParametersElementSelectClass";
  84. this.parametersContainer.appendChild(targetParameterSelect);
  85. // Create target name select element
  86. targetParameterNameSelect = document.createElement("select");
  87. targetParameterNameSelect.className = "ParametersElementSelectClass";
  88. this.parametersContainer.appendChild(targetParameterNameSelect);
  89. // Events and configure
  90. (this._parameterTargetChanged(targetParameterSelect, targetParameterNameSelect, propertyPathSelect, propertyPathOptionalSelect, i))(null);
  91. targetParameterSelect.value = propertiesResults[i].targetType;
  92. targetParameterNameSelect.value = propertiesResults[i].value;
  93. targetParameterSelect.onchange = this._parameterTargetChanged(targetParameterSelect, targetParameterNameSelect, propertyPathSelect, propertyPathOptionalSelect, i);
  94. targetParameterNameSelect.onchange = this._parameterTargetNameChanged(targetParameterSelect, targetParameterNameSelect, i);
  95. }
  96. }
  97. else if (properties[i].text === "propertyPath") {
  98. propertyPathIndice = i;
  99. // Create property path select
  100. propertyPathSelect = document.createElement("select");
  101. propertyPathSelect.className = "ParametersElementSelectClass";
  102. this.parametersContainer.appendChild(propertyPathSelect);
  103. // Create additional select
  104. propertyPathOptionalSelect = document.createElement("select");
  105. propertyPathOptionalSelect.className = "ParametersElementSelectClass";
  106. this.parametersContainer.appendChild(propertyPathOptionalSelect);
  107. // Events and configure
  108. (this._propertyPathSelectChanged(targetParameterSelect, propertyPathSelect, propertyPathOptionalSelect, null, null, i))(null);
  109. var property = this._action.propertiesResults[i].value.split(".");
  110. if (property.length > 0) {
  111. if (property.length === 1) {
  112. propertyPathSelect.value = property[0];
  113. }
  114. else {
  115. var completePropertyPath = "";
  116. for (var j = 0; j < property.length - 1; j++) {
  117. completePropertyPath += property[j];
  118. completePropertyPath += (j === property.length - 2) ? "" : ".";
  119. }
  120. propertyPathSelect.value = completePropertyPath;
  121. this._viewer.utils.setElementVisible(propertyPathOptionalSelect, true);
  122. }
  123. this._fillAdditionalPropertyPath(targetParameterSelect, propertyPathSelect, propertyPathOptionalSelect);
  124. propertyPathOptionalSelect.value = property[property.length - 1];
  125. if (propertyPathOptionalSelect.options.length === 0 || propertyPathOptionalSelect.options[0].textContent === "") {
  126. this._viewer.utils.setElementVisible(propertyPathOptionalSelect, false);
  127. }
  128. }
  129. targetParameterSelect.onchange = this._parameterTargetChanged(targetParameterSelect, targetParameterNameSelect, propertyPathSelect, propertyPathOptionalSelect, i - 1);
  130. propertyPathSelect.onchange = this._propertyPathSelectChanged(targetParameterSelect, propertyPathSelect, propertyPathOptionalSelect, null, null, i);
  131. propertyPathOptionalSelect.onchange = this._additionalPropertyPathSelectChanged(propertyPathSelect, propertyPathOptionalSelect, i);
  132. }
  133. else if (properties[i].text === "operator") {
  134. var conditionOperatorSelect = document.createElement("select");
  135. conditionOperatorSelect.className = "ParametersElementSelectClass";
  136. this.parametersContainer.appendChild(conditionOperatorSelect);
  137. // Configure event
  138. (this._conditionOperatorSelectChanged(conditionOperatorSelect, i))(null);
  139. conditionOperatorSelect.value = propertiesResults[i].value;
  140. conditionOperatorSelect.onchange = this._conditionOperatorSelectChanged(conditionOperatorSelect, i);
  141. }
  142. else if (properties[i].text === "sound") {
  143. var soundSelect = document.createElement("select");
  144. soundSelect.className = "ParametersElementSelectClass";
  145. this.parametersContainer.appendChild(soundSelect);
  146. // Configure event
  147. (this._soundSelectChanged(soundSelect, i))(null);
  148. soundSelect.value = propertiesResults[i].value;
  149. soundSelect.onchange = this._soundSelectChanged(soundSelect, i);
  150. }
  151. else {
  152. var isBoolean = propertiesResults[i].value === "true" || propertiesResults[i].value === "false";
  153. var object = this._getObjectFromType(targetParameterSelect.value);
  154. if (object !== null) {
  155. var property = this._action.propertiesResults[i - 1].value.split(".");
  156. for (var j = 0; j < property.length && object !== undefined; j++) {
  157. object = object[property[j]];
  158. if (j === property.length - 1) {
  159. isBoolean = isBoolean || typeof object === "boolean";
  160. }
  161. }
  162. }
  163. booleanSelect = document.createElement("select");
  164. booleanSelect.className = "ParametersElementSelectClass";
  165. this.parametersContainer.appendChild(booleanSelect);
  166. // Configure event
  167. (this._booleanSelectChanged(booleanSelect, i))(null);
  168. booleanSelect.value = propertiesResults[i].value;
  169. booleanSelect.onchange = this._booleanSelectChanged(booleanSelect, i);
  170. propertyInput = document.createElement("input");
  171. propertyInput.value = propertiesResults[i].value;
  172. propertyInput.className = "ParametersElementInputClass";
  173. this.parametersContainer.appendChild(propertyInput);
  174. // Configure event
  175. propertyInput.onkeyup = this._propertyInputChanged(propertyInput, i);
  176. if (propertyPathIndice !== -1 && properties[i].text === "value") {
  177. propertyPathSelect.onchange = this._propertyPathSelectChanged(targetParameterSelect, propertyPathSelect, propertyPathOptionalSelect, booleanSelect, propertyInput, propertyPathIndice);
  178. }
  179. if (isBoolean) {
  180. this._viewer.utils.setElementVisible(booleanSelect, true);
  181. this._viewer.utils.setElementVisible(propertyInput, false);
  182. }
  183. else {
  184. this._viewer.utils.setElementVisible(booleanSelect, false);
  185. this._viewer.utils.setElementVisible(propertyInput, true);
  186. }
  187. }
  188. }
  189. }
  190. /*
  191. * Resizes the parameters view
  192. * @param: the resize event
  193. */
  194. public onResize(event?: Event): void {
  195. var tools = document.getElementById("ToolsButtonsID");
  196. this.parametersContainer.style.height = window.innerHeight - tools.getBoundingClientRect().height - 25 - 200 + "px";
  197. this.parametersHelpElement.style.height = 200 + "px";
  198. }
  199. /*
  200. * Returns the boolean select change event
  201. * @param booleanSelect: the boolean select element
  202. * @param indice: the properties result indice
  203. */
  204. private _booleanSelectChanged(booleanSelect: HTMLSelectElement, indice: number): (ev: Event) => void {
  205. return (ev: Event) => {
  206. if (booleanSelect.options.length === 0) {
  207. var values = ["true", "false"];
  208. for (var i = 0; i < values.length; i++) {
  209. var option = document.createElement("option");
  210. option.value = option.text = values[i];
  211. booleanSelect.add(option);
  212. }
  213. }
  214. else {
  215. this._action.propertiesResults[indice].value = booleanSelect.value;
  216. }
  217. };
  218. }
  219. /*
  220. * Returns the sound select change event
  221. * @param soundSelect: the sound select element
  222. * @param indice: the properties result indice
  223. */
  224. private _soundSelectChanged(soundSelect: HTMLSelectElement, indice: number): (ev: Event) => void {
  225. return (ev: Event) => {
  226. if (soundSelect.options.length === 0) {
  227. for (var i = 0; i < SceneElements.SOUNDS.length; i++) {
  228. var option = document.createElement("option");
  229. option.value = option.text = SceneElements.SOUNDS[i];
  230. soundSelect.add(option);
  231. }
  232. this._sortList(soundSelect);
  233. }
  234. else {
  235. this._action.propertiesResults[indice].value = soundSelect.value;
  236. }
  237. };
  238. }
  239. /*
  240. * Returns the condition opeator select changed event
  241. * @param conditionOperatorSelect: the condition operator select element
  242. * @param indice: the properties result indice
  243. */
  244. private _conditionOperatorSelectChanged(conditionOperatorSelect: HTMLSelectElement, indice: number): (ev: Event) => void {
  245. return (ev: Event) => {
  246. if (conditionOperatorSelect.options.length === 0) {
  247. for (var i = 0; i < SceneElements.OPERATORS.length; i++) {
  248. var option = document.createElement("option");
  249. option.value = option.text = SceneElements.OPERATORS[i];
  250. //conditionOperatorSelect.options.add(option);
  251. conditionOperatorSelect.add(option);
  252. }
  253. }
  254. else {
  255. this._action.propertiesResults[indice].value = conditionOperatorSelect.value;
  256. }
  257. };
  258. }
  259. /*
  260. * Returns the property input changed event
  261. * @param propertyInput: the property input
  262. * @param indice: the properties result indice
  263. */
  264. private _propertyInputChanged(propertyInput: HTMLInputElement, indice: number): (ev: Event) => void {
  265. return (ev: Event) => {
  266. this._action.propertiesResults[indice].value = propertyInput.value;
  267. };
  268. }
  269. /*
  270. * Returns the propertyPath select changed event
  271. * @param targetParameterSelect: the target/parameter select element
  272. * @param propertyPathSelect: the propertyPath select element
  273. * @param additionalPropertyPathSelect: the additional propertyPath select element
  274. * @param indice: the properties indice in action.properties
  275. */
  276. private _propertyPathSelectChanged(targetParameterSelect: HTMLSelectElement, propertyPathSelect: HTMLSelectElement,
  277. additionalPropertyPathSelect: HTMLSelectElement, booleanSelect: HTMLSelectElement, propertyInput: HTMLInputElement,
  278. indice: number): (event: Event) => void
  279. {
  280. return (event: Event) => {
  281. if (propertyPathSelect.options.length === 0) {
  282. // Configure start values
  283. var properties = this._getPropertiesFromType(targetParameterSelect.value);
  284. if (properties !== null) {
  285. for (var i = 0; i < properties.length; i++) {
  286. var option = document.createElement("option");
  287. option.value = option.text = properties[i];
  288. propertyPathSelect.add(option);
  289. }
  290. }
  291. } else {
  292. // Set property
  293. this._action.propertiesResults[indice].value = propertyPathSelect.value;
  294. if (booleanSelect !== null && propertyInput !== null) {
  295. var object = this._getObjectFromType(targetParameterSelect.value);
  296. var isBoolean = false;
  297. if (object !== null) {
  298. var property = this._action.propertiesResults[indice].value.split(".");
  299. for (var j = 0; j < property.length; j++) {
  300. object = object[property[j]];
  301. if (j === property.length - 1) {
  302. isBoolean = isBoolean || typeof object === "boolean";
  303. }
  304. }
  305. }
  306. if (isBoolean) {
  307. this._viewer.utils.setElementVisible(booleanSelect, true);
  308. this._viewer.utils.setElementVisible(propertyInput, false);
  309. }
  310. else {
  311. this._viewer.utils.setElementVisible(booleanSelect, false);
  312. this._viewer.utils.setElementVisible(propertyInput, true);
  313. }
  314. }
  315. }
  316. // Configure addition property
  317. this._fillAdditionalPropertyPath(targetParameterSelect, propertyPathSelect, additionalPropertyPathSelect);
  318. // Sort
  319. this._sortList(propertyPathSelect);
  320. };
  321. }
  322. private _fillAdditionalPropertyPath(targetParameterSelect: HTMLSelectElement, propertyPathSelect: HTMLSelectElement,
  323. additionalPropertyPathSelect: HTMLSelectElement): void
  324. {
  325. additionalPropertyPathSelect.options.length = 0;
  326. var object = this._getObjectFromType(targetParameterSelect.value);
  327. if (object !== null) {
  328. var propertyPath = propertyPathSelect.value.split(".");
  329. for (var i = 0; i < propertyPath.length; i++) {
  330. object = object[propertyPath[i]];
  331. }
  332. }
  333. if (object === null || object === undefined || (typeof (object)).toLowerCase() === "string") {
  334. this._viewer.utils.setElementVisible(additionalPropertyPathSelect, false);
  335. return;
  336. }
  337. // Add options
  338. var emptyOption = document.createElement("option");
  339. emptyOption.value = emptyOption.text = "";
  340. additionalPropertyPathSelect.add(emptyOption);
  341. for (var thing in object) {
  342. var type = SceneElements.GetInstanceOf(object[thing]);
  343. var index = SceneElements.TYPES.indexOf(type);
  344. if (index !== -1) {
  345. var option = document.createElement("option");
  346. option.value = option.text = thing;
  347. additionalPropertyPathSelect.add(option);
  348. emptyOption.text += thing + ", ";
  349. }
  350. }
  351. if (additionalPropertyPathSelect.options.length === 0 || additionalPropertyPathSelect.options[0].textContent === "") {
  352. this._viewer.utils.setElementVisible(additionalPropertyPathSelect, false);
  353. }
  354. else {
  355. this._viewer.utils.setElementVisible(additionalPropertyPathSelect, true);
  356. }
  357. }
  358. /*
  359. * Returns the additional propertyPath select changed event
  360. * @param propertyPathSelect: the propertyPath select element
  361. * @param additionalPropertyPathSelect: the additional propertyPath select element
  362. * @param indice: the properties indice in action.properties
  363. */
  364. private _additionalPropertyPathSelectChanged(propertyPathSelect: HTMLSelectElement, additionalPropertyPathSelect: HTMLSelectElement,
  365. indice: number): (event: Event) => void
  366. {
  367. return (event: Event) => {
  368. var property = propertyPathSelect.value;
  369. var additionalProperty = additionalPropertyPathSelect.value;
  370. if (additionalProperty !== "") {
  371. property += ".";
  372. property += additionalPropertyPathSelect.value;
  373. }
  374. this._action.propertiesResults[indice].value = property;
  375. };
  376. }
  377. /*
  378. * Returns the parameter/target select changed event
  379. * @param targetParameterSelect: the target/parameter select element
  380. * @param targetParameterNameSelect: the target/parameter name select element
  381. * @param propertyPathSelect: the propertyPath select element
  382. * @param additionalPropertyPathSelect: the additional propertyPath select element
  383. * @param indice: the properties indice in action.properties
  384. */
  385. private _parameterTargetChanged(targetParameterSelect: HTMLSelectElement, targetParameterNameSelect: HTMLSelectElement,
  386. propertyPathSelect: HTMLSelectElement, additionalPropertyPathSelect: HTMLSelectElement, indice: number): (event: Event) => void
  387. {
  388. return (event: Event) => {
  389. if (targetParameterSelect.options.length === 0) {
  390. // Configure start values
  391. var options = [
  392. { text: "Mesh", targetType: "MeshProperties" },
  393. { text: "Light", targetType: "LightProperties" },
  394. { text: "Camera", targetType: "CameraProperties" },
  395. { text: "Scene", targetType: "SceneProperties" }
  396. ];
  397. targetParameterSelect.options.length = 0;
  398. for (var i = 0; i < options.length; i++) {
  399. var option = document.createElement("option");
  400. option.text = options[i].text;
  401. option.value = options[i].targetType;
  402. targetParameterSelect.add(option);
  403. }
  404. targetParameterSelect.value = this._action.propertiesResults[indice].targetType;
  405. } else {
  406. this._action.propertiesResults[indice].targetType = targetParameterSelect.value;
  407. var names = this._getListFromType(targetParameterSelect.value);
  408. if (names !== null && names.length > 0) {
  409. this._action.propertiesResults[indice].value = names[0];
  410. }
  411. else {
  412. this._action.propertiesResults[indice].value = "";
  413. }
  414. if (propertyPathSelect !== null) {
  415. this._action.propertiesResults[indice + 1].value = ""; // propertyPath
  416. }
  417. }
  418. // Configure target names
  419. var targetParameterProperties = this._getTargetFromType(targetParameterSelect.value);
  420. targetParameterNameSelect.options.length = 0;
  421. if (targetParameterProperties !== null) {
  422. for (var i = 0; i < targetParameterProperties.length; i++) {
  423. var option = document.createElement("option");
  424. option.text = option.value = targetParameterProperties[i];
  425. targetParameterNameSelect.add(option);
  426. }
  427. }
  428. targetParameterNameSelect.value = this._action.propertiesResults[indice].value;
  429. // Clear property path
  430. if (propertyPathSelect !== null) {
  431. propertyPathSelect.options.length = 0;
  432. additionalPropertyPathSelect.options.length = 0;
  433. this._propertyPathSelectChanged(targetParameterSelect, propertyPathSelect, additionalPropertyPathSelect, null, null, indice + 1)(null);
  434. }
  435. this._sortList(targetParameterNameSelect);
  436. this._sortList(targetParameterSelect);
  437. };
  438. }
  439. /*
  440. * Returns the parameter/target name select changed
  441. * @param indice: the properties indice to change
  442. */
  443. private _parameterTargetNameChanged(targetParameterSelect: HTMLSelectElement, targetParameterNameSelect: HTMLSelectElement, indice: number): (event: Event) => void {
  444. return (event: Event) => {
  445. this._action.propertiesResults[indice].value = targetParameterNameSelect.value;
  446. };
  447. }
  448. /*
  449. * Returns the array of objects names in function of its type
  450. * @param type: the target type
  451. */
  452. public _getTargetFromType(type: string): Array<string> {
  453. if (type === "MeshProperties" || type === "Mesh") {
  454. return SceneElements.MESHES;
  455. }
  456. if (type === "LightProperties" || type === "Light") {
  457. return SceneElements.LIGHTS;
  458. }
  459. if (type === "CameraProperties" || type === "Camera") {
  460. return SceneElements.CAMERAS;
  461. }
  462. return null;
  463. }
  464. /*
  465. * Returns the properties in function of its type
  466. * @param type: the target type
  467. */
  468. private _getPropertiesFromType(type: string): Array<string> {
  469. if (type === "MeshProperties" || type === "Mesh") {
  470. return SceneElements.MESH_PROPERTIES;
  471. }
  472. if (type === "LightProperties" || type === "Light") {
  473. return SceneElements.LIGHT_PROPERTIES;
  474. }
  475. if (type === "CameraProperties" || type === "Camera") {
  476. return SceneElements.CAMERA_PROPERTIES;
  477. }
  478. if (type === "SceneProperties" || type === "Scene") {
  479. return SceneElements.SCENE_PROPERTIES;
  480. }
  481. return null;
  482. }
  483. public _getListFromType(type: string): string[] {
  484. if (type === "MeshProperties" || type === "Mesh") {
  485. return SceneElements.MESHES;
  486. }
  487. if (type === "LightProperties" || type === "Light") {
  488. return SceneElements.LIGHTS;
  489. }
  490. if (type === "CameraProperties" || type === "Camera") {
  491. return SceneElements.CAMERAS;
  492. }
  493. return null;
  494. }
  495. /*
  496. * Returns the object in function of the given type
  497. * @param type: the target type
  498. */
  499. public _getObjectFromType(type: string): any {
  500. if (type === "MeshProperties" || type === "Mesh") {
  501. this._currentObject = SceneElements.MESH;
  502. return SceneElements.MESH;
  503. }
  504. if (type === "LightProperties" || type === "Light") {
  505. this._currentObject = SceneElements.LIGHT;
  506. return SceneElements.LIGHT;
  507. }
  508. if (type === "CameraProperties" || type === "Camera") {
  509. this._currentObject = SceneElements.CAMERA;
  510. return SceneElements.CAMERA;
  511. }
  512. if (type === "SceneProperties" || type === "Scene") {
  513. this._currentObject = SceneElements.SCENE;
  514. return SceneElements.SCENE;
  515. }
  516. return null;
  517. }
  518. /*
  519. * Creates the node section (top of parameters)
  520. * @param action: the action element to get color, text, name etc.
  521. */
  522. private _createNodeSection(action: Action): void {
  523. var element = document.createElement("div");
  524. element.style.background = <string>this._viewer.getSelectedNodeColor(action.type, action.node.detached);
  525. element.className = "ParametersElementNodeClass";
  526. var text = document.createElement("a");
  527. text.text = action.name;
  528. text.className = "ParametersElementNodeTextClass";
  529. element.appendChild(text);
  530. this.parametersContainer.appendChild(element);
  531. }
  532. /*
  533. * Creates the help section
  534. * @param action : the action containing the description
  535. */
  536. private _createHelpSection(action: Action): void {
  537. // Get description
  538. var element = Elements.GetElementFromName(action.name);
  539. if (element !== null) {
  540. this.parametersHelpElement.textContent = element.description;
  541. }
  542. }
  543. /*
  544. * Alphabetically sorts a HTML select element options
  545. * @param element : the HTML select element to sort
  546. */
  547. private _sortList(element: HTMLSelectElement): void {
  548. var options = [];
  549. for (var i = element.options.length - 1; i >= 0; i--) {
  550. options.push(element.removeChild(element.options[i]));
  551. }
  552. options.sort((a, b) => {
  553. return a.innerHTML.localeCompare(b.innerHTML);
  554. });
  555. for (var i = 0; i < options.length; i++) {
  556. element.add(options[i]);
  557. }
  558. }
  559. }
  560. }