Thursday, June 04, 2026 3:48:07 AM
> additional_logs_controller.js
import ApplicationController from "./application_controller";
import * as R from "ramda";
import $ from "../helpers/cash_dom";

// Connects to data-controller="additional-logs"
export default class extends ApplicationController {
  static targets = ["emptyState", "pathsContainer", "pathsList", "pathCount"];
  static values = { paths: Array };

  connect() {
    this.paths = R.clone(this.pathsValue);
    this.#renderPaths();
  }

  add(_event) {
    this.paths.push("");
    this.#renderPaths();
  }

  update(event) {
    const elem = $(event.currentTarget);
    const index = parseInt(elem.data("index"));

    this.paths[index] = elem.val();
  }

  remove(event) {
    const index = parseInt($(event.currentTarget).data("pathIndex"));
    this.paths.splice(index, 1);
    this.#renderPaths();
  }

  //////////////////////////////////////////////////////////////////////////////

  #createPathRow(path, index) {
    return `
      <tr>
        <td class="col-11">
          <input
            type="text"
            class="form-control form-control-sm font-monospace"
            name="server[server_settings][additional_logs][]"
            placeholder="logs/custom.log or /full/path/to/log.log"
            value="${path}"
            data-action="input->additional-logs#update"
            data-index="${index}"
          >
        </td>
        <td class="col">
          <button
            type="button"
            class="btn btn-outline-danger btn-sm w-100"
            data-action="click->additional-logs#remove"
            data-path-index="${index}"
            title="Remove log path"
          >
            <i class="bi bi-trash"></i>
          </button>
        </td>
      </tr>
    `;
  }

  #renderPaths() {
    const emptyStateElem = $(this.emptyStateTarget);
    const pathsContainerElem = $(this.pathsContainerTarget);
    const pathsListElem = $(this.pathsListTarget);
    const pathCountElem = $(this.pathCountTarget);
    const pathLength = this.paths.length;

    if (pathLength === 0) {
      emptyStateElem.show();
      pathsContainerElem.hide();
      pathsListElem.html("");
      pathCountElem.text("0");
    } else {
      emptyStateElem.hide();
      pathsContainerElem.show();
      pathCountElem.text(pathLength);

      pathsListElem.html("");
      this.paths.forEach((path, index) => {
        const pathRow = this.#createPathRow(path, index);
        pathsListElem.append(pathRow);
      });
    }
  }
}
All opinions represented herein are my own
- © 2024 - 2026 itsthedevman
- build 4294fb2