/* * This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony). * * Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ import {Controller} from "@hotwired/stimulus"; import "tom-select/dist/css/tom-select.bootstrap5.css"; import '../../css/components/tom-select_extensions.css'; import TomSelect from "tom-select"; import TomSelect_click_to_edit from '../../tomselect/click_to_edit/click_to_edit' import TomSelect_autoselect_typed from '../../tomselect/autoselect_typed/autoselect_typed' TomSelect.define('click_to_edit', TomSelect_click_to_edit) TomSelect.define('autoselect_typed', TomSelect_autoselect_typed) export default class extends Controller { _tomSelect; connect() { let settings = { persistent: false, create: true, maxItems: 1, createOnBlur: true, selectOnTab: true, //This a an ugly solution to disable the delimiter parsing of the TomSelect plugin delimiter: 'VERY_L0NG_D€LIMITER_WHICH_WILL_NEVER_BE_ENCOUNTERED_IN_A_STRING', render: { item: (data, escape) => { return '' + escape(data.label) + ''; }, option: (data, escape) => { if (data.image) { return "
" + data.label + "
" } return '
' + escape(data.label) + '
'; } }, plugins: { 'autoselect_typed': {}, 'click_to_edit': {}, 'clear_button': {}, "restore_on_backspace": {} } }; if(this.element.dataset.autocomplete) { const base_url = this.element.dataset.autocomplete; settings.searchField = "label"; settings.sortField = "label"; settings.valueField = "label"; settings.load = (query, callback) => { if(query.length < 2){ callback(); return; } const url = base_url.replace('__QUERY__', encodeURIComponent(query)); fetch(url) .then(response => response.json()) .then(json => { const data = json.map(x => { return { "label": x.name, "image": x.image, } }); callback(data); }).catch(()=>{ callback(); }); }; } this._tomSelect = new TomSelect(this.element, settings); } disconnect() { super.disconnect(); //Destroy the TomSelect instance this._tomSelect.destroy(); } }