PageSourceSearch

https://freelanceunlocked.com/assets/baseline/controllers/lazy/pretty_filters_controller-7a4e44e6.js

js freelanceunlocked.com collected 2026-10-04 05:51:02 UTC 2,035 bytes, 65 lines download raw bytes

1import ApplicationController from "application_controller"
2
3export default class extends ApplicationController {
4  static values = {
5    filters: Object // { fieldName: { short: "f", default: "default" } }
6  }
7
8  connect() {
9    this.submit = this.submit.bind(this)
10    this.element.addEventListener("submit", this.submit)
11  }
12
13  disconnect() {
14    this.element.removeEventListener("submit", this.submit)
15  }
16
17  submit(event) {
18    event.preventDefault()
19    Turbo.visit(this.#buildUrl())
20  }
21
22  #buildUrl() {
23    const formData = new FormData(this.element)
24    const segments = []
25
26    for (const [fieldName, options] of Object.entries(this.filtersValue)) {
27      const arrayValues = formData.getAll(`${fieldName}[]`)
28
29      if (arrayValues.length > 0) {
30        const defaults = options.default || []
31        if (arrayValues.length !== defaults.length || !arrayValues.every(value => defaults.includes(value)))
32          segments.push(`${options.short}:${arrayValues.map(encodeURIComponent).join(",")}`)
33        continue
34      }
35
36      // Use the last value to handle Rails' hidden field + checkbox pattern.
37      const values = formData.getAll(fieldName)
38      if (options.type === "boolean") {
39        const value = this.#booleanValue(values)
40        if (value !== null && value !== options.default)
41          segments.push(`${options.short}:${value ? "t" : "f"}`)
42        continue
43      }
44
45      const value = values.filter(value => value).pop()?.trim()
46      const defaultValue = Object.hasOwn(options, "default") ? options.default : ""
47      if (value && value !== defaultValue)
48        segments.push(`${options.short}:${encodeURIComponent(value)}`)
49    }
50
51    const base = this.element.action
52    return segments.length > 0 ? `${base}/${segments.join("/")}` : base
53  }
54
55  #booleanValue(values) {
56    const value = values.filter(value => value !== "").pop()?.trim()
57
58    if (["1", "true", "t", "on"].includes(value))
59      return true
60    if (["0", "false", "f", "off"].includes(value))
61      return false
62
63    return null
64  }
65}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.