Skip to content

Can not use outlets when the controller inherits from stimulus flatpicker.Β #115

@miguelperez

Description

@miguelperez

I have a filter controller that has different filtering controllers inside. The filtering controllers can submit the filter controller. I have two types of filter a date range using flatpicker and a users list that is a regular stimulus controller. each filter also provides a mechanism to "clear" its selection, after clearing they submit the form to update the results.

The issue I am seeing is that the date range picker controller does not recognize the outlets whereas the people filter controller does.

The following code is simplified and probably missing closing brackets.

Date range controller

import { Controller } from "@hotwired/stimulus";
import Flatpickr from 'stimulus-flatpickr'
import { Spanish } from "flatpickr/dist/l10n/es.js";
import { english } from "flatpickr/dist/l10n/default.js";

export default class extends Flatpickr {
  static outlets = ["filter-form"]
  static targets = [....]
  .....

clearAll(evt) {
    evt.preventDefault();
    this.fp.clear();
    const formattedDates = this.fp.selectedDates.map(date => {
      return date.toLocaleDateString('en-GB', {day: 'numeric', month: 'short', year: 'numeric'}).toLowerCase();
    });
    this.defaultStartDateTarget.value = this.checkDateValue(formattedDates[0]);
    this.defaultEndDateTarget.value = this.checkDateValue(formattedDates[1]);
    if (this.hasFilterFormOutlet) {
      this.filterFormOutlet.submit(evt);
    }
  }

The HTML is the following:

<div data-controller="date-range-picker" data-date-range-picker-filter-form-outlet=".filter-form" >

The HTML form (the filter stimulus controller) is defined like this:

<%= form_with url: some_path,
                method: :get,
                html: {
                  class: "filter-form"
                },
                data: {
                  turbo_action: "advance",
                  controller: "filter-form",
                  turbo_frame: "some_frame",
                } do |form| %>

There is another stimulus controller that declares the same outlet as the datepicker. Is for a list of checkboxes that upon selecting one, it will submit the form:

import { Controller } from "@hotwired/stimulus"

// Connects to data-controller="people-picker-list"
export default class extends Controller {
  static targets = ["checkboxes", "searchInput", "selected"];
  static outlets = ["filter-form"];

clearAll(evt) {
    evt.preventDefault();
    this.checkboxesTargets.forEach((checkbox) => {
      checkbox.checked = false;
    });
    this.selectedTarget.value = "";
    
    if (this.hasFilterFormOutlet) {
      this.filterFormOutlet.submit(evt);
    }
  }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions