Skip to content

Commit

Permalink
Merge pull request #447 from droberts-ctrlo/input-components
Browse files Browse the repository at this point in the history
Refactored out input components into different files
  • Loading branch information
abeverley authored Aug 6, 2024
2 parents 617216f + 72d8dd5 commit c5c9599
Show file tree
Hide file tree
Showing 8 changed files with 383 additions and 290 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
class AutocompleteComponent {
readonly type = 'autocomplete';
input: JQuery<HTMLInputElement>;
el: JQuery<HTMLElement>;

constructor(el: HTMLElement | JQuery<HTMLElement>) {
this.el = $(el);
this.input = this.el.find<HTMLInputElement>('.form-control');
}

init() {
const suggestionCallback = (suggestion: { id: number, name:string }) => {
this.el.find('input[type="hidden"]').val(suggestion.id);
};

import(/* webpackChunkName: "typeahead" */ 'util/typeahead')
.then(({ default: TypeaheadBuilder }) => {
const builder = new TypeaheadBuilder();
builder
.withInput(this.input)
.withCallback(suggestionCallback)
.withAjaxSource(this.getURL())
.withAppendQuery()
.withName('users')
.build();
});
}

getURL(): string {
const devEndpoint = window.siteConfig?.urls?.autocompleteApi;
const layoutIdentifier = $('body').data('layout-identifier');

return devEndpoint ?? `/${layoutIdentifier ? layoutIdentifier + '/' : ''}match/user/?q=`;
}
}

export default function autocompleteComponent(el: HTMLElement | JQuery<HTMLElement>) {
new AutocompleteComponent(el).init();
}
290 changes: 0 additions & 290 deletions src/frontend/components/form-group/input/lib/component.js

This file was deleted.

48 changes: 48 additions & 0 deletions src/frontend/components/form-group/input/lib/component.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { Component } from "component";
import passwordComponent from "./passwordComponent";
import logoComponent from "./logoComponent";
import documentComponent from "./documentComponent";
import fileComponent from "./fileComponent";
import dateComponent from "./dateComponent";
import autocompleteComponent from "./autocompleteComponent";
import { initValidationOnField } from "validation";

type ComponentInitializer = (element: JQuery<HTMLElement> | HTMLElement) => void;

class InputComponent extends Component {
private static componentMap: { [key: string]: ComponentInitializer } = {
'input--password': passwordComponent,
'input--logo': logoComponent,
'input--document': documentComponent,
'input--file': fileComponent,
'input--datepicker': dateComponent,
'input--autocomplete': autocompleteComponent
};

constructor(element: HTMLElement | JQuery<HTMLElement>) {
super(element);
this.initializeComponent();
this.initializeValidation();
}

private initializeComponent() {
const $el = $(this.element);

for (const [className, initializer] of Object.entries(InputComponent.componentMap)) {
if ($el.hasClass(className)) {
initializer(this.element);
break; // Assuming only one component type per element
}
}
}

private initializeValidation() {
const $el = $(this.element);

if ($el.hasClass('input--required')) {
initValidationOnField($el);
}
}
}

export default InputComponent;
Loading

0 comments on commit c5c9599

Please sign in to comment.