bindCreatePanelEvents function domain

Last updated: 2026-03-04T23:21:38.431Z

Metrics

LOC: 109 Complexity: 13 Params: 1

Signature

bindCreatePanelEvents(panel: HTMLElement): : void

Architecture violations

View all

  • [warning] max-cyclomatic-complexity: 'bindCreatePanelEvents' has cyclomatic complexity 13 (max 10)
  • [warning] max-lines: 'bindCreatePanelEvents' has 109 lines (max 80)

Source Code

function bindCreatePanelEvents(panel: HTMLElement): void {
  // Toggle fixed/generator on mode change
  panel.addEventListener("change", (e) => {
    const target = e.target as HTMLSelectElement;
    if (!target.classList.contains("field-mode-select")) return;
    const row = target.closest("tr")!;
    const isFixed = target.value === "fixed";
    (row.querySelector(".field-fixed-value") as HTMLElement).style.display =
      isFixed ? "inline-block" : "none";
    (
      row.querySelector(".field-generator-container") as HTMLElement
    ).style.display = isFixed ? "none" : "inline-block";
  });

  // Remove field row
  panel.addEventListener("click", (e) => {
    const target = e.target as HTMLElement;
    if (!target.classList.contains("btn-remove-row")) return;
    target.closest("tr")?.remove();
  });

  // Add field row
  panel
    .querySelector("#create-add-field-row")
    ?.addEventListener("click", () => {
      const tbody = panel.querySelector("#create-fields-tbody");
      if (!tbody) return;
      const wrapper = document.createElement("tbody");
      wrapper.innerHTML = buildTemplateFieldRow();
      const newRow = wrapper.querySelector("tr");
      if (newRow) {
        tbody.appendChild(newRow);
        upgradeRowSearchableSelects(newRow);
      }
    });

  panel.querySelector("#create-panel-cancel")?.addEventListener("click", () => {
    panel.remove();
  });

  panel
    .querySelector("#create-panel-save")
    ?.addEventListener("click", async () => {
      const nameInput = panel.querySelector(
        "#create-form-name",
      ) as HTMLInputElement;
      const urlInput = panel.querySelector(
        "#create-form-url",
      ) as HTMLInputElement;

      const name = nameInput.value.trim();
      if (!name) {
        nameInput.focus();
        showToast(t("errorTemplateNameRequired"));
        return;
      }

      const urlPattern = urlInput.value.trim() || "*";
      const templateFields: FormTemplateField[] = [];

      panel.querySelectorAll("tr.template-field-row").forEach((row) => {
        const matchType =
          ((
            row.querySelector(
              ".field-type-match-container .fa-ss__value",
            ) as HTMLInputElement
          )?.value as FieldType) ?? ("name" as FieldType);
        const mode = (
          row.querySelector(".field-mode-select") as HTMLSelectElement
        ).value as "fixed" | "generator";
        const fixedValue = (
          row.querySelector(".field-fixed-value") as HTMLInputElement
        ).value;
        const generatorType =
          ((
            row.querySelector(
              ".field-generator-container .fa-ss__value",
            ) as HTMLInputElement
          )?.value as FieldType) ?? ("name" as FieldType);

        templateFields.push({
          key: matchType,
          label: fieldTypeLabel(matchType),
          mode,
          matchByFieldType: matchType,
          fixedValue: mode === "fixed" ? fixedValue : undefined,
          generatorType: mode === "generator" ? generatorType : undefined,
        });
      });

      const newForm: SavedForm = {
        id: `tpl-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,
        name,
        urlPattern,
        fields: {},
        templateFields,
        createdAt: Date.now(),
        updatedAt: Date.now(),
      };

      await chrome.runtime.sendMessage({
        type: "UPDATE_FORM",
        payload: newForm,
      });
      panel.remove();
      await loadSavedForms();
      showToast(t("toastTemplateCreated", [name]));
    });
}

Dependencies (Outgoing)

graph LR bindCreatePanelEvents["bindCreatePanelEvents"] buildTemplateFieldRow["buildTemplateFieldRow"] upgradeRowSearchableSelects["upgradeRowSearchableSelects"] fieldTypeLabel["fieldTypeLabel"] loadSavedForms["loadSavedForms"] bindCreatePanelEvents -->|calls| buildTemplateFieldRow bindCreatePanelEvents -->|calls| upgradeRowSearchableSelects bindCreatePanelEvents -->|calls| fieldTypeLabel bindCreatePanelEvents -->|calls| loadSavedForms style bindCreatePanelEvents fill:#dbeafe,stroke:#2563eb,stroke-width:2px click bindCreatePanelEvents "63724b3d20cd4419.html" click buildTemplateFieldRow "6e5eee1aa17b57cc.html" click upgradeRowSearchableSelects "90e9f01206f5f2c7.html" click fieldTypeLabel "861a0ec11bc0b27b.html" click loadSavedForms "cf1ee6d5c3ab3b9b.html"
TargetType
buildTemplateFieldRow calls
upgradeRowSearchableSelects calls
fieldTypeLabel calls
loadSavedForms calls
change dynamic_call
click dynamic_call

Impact (Incoming)

graph LR bindCreatePanelEvents["bindCreatePanelEvents"] openCreatePanel["openCreatePanel"] openCreatePanel -->|calls| bindCreatePanelEvents style bindCreatePanelEvents fill:#dbeafe,stroke:#2563eb,stroke-width:2px click bindCreatePanelEvents "63724b3d20cd4419.html" click openCreatePanel "16ceabf613d86e61.html"
SourceType
openCreatePanel calls