mirror of
				https://github.com/ae-utbm/sith.git
				synced 2025-11-04 02:53:06 +00:00 
			
		
		
		
	Format with biome instead of standard
This commit is contained in:
		@@ -1,60 +1,66 @@
 | 
			
		||||
/* eslint-disable camelcase */
 | 
			
		||||
$(function () {
 | 
			
		||||
  // const buttons = $('.choose_file_button')
 | 
			
		||||
  const popups = $('.choose_file_widget')
 | 
			
		||||
  popups.dialog({
 | 
			
		||||
    autoOpen: false,
 | 
			
		||||
    modal: true,
 | 
			
		||||
    width: '90%',
 | 
			
		||||
    create: function (event) {
 | 
			
		||||
      const target = $(event.target)
 | 
			
		||||
      target.parent().css({
 | 
			
		||||
        position: 'fixed',
 | 
			
		||||
        top: '5%',
 | 
			
		||||
        bottom: '5%'
 | 
			
		||||
      })
 | 
			
		||||
      target.css('height', '300px')
 | 
			
		||||
      console.log(target)
 | 
			
		||||
    },
 | 
			
		||||
    buttons: [
 | 
			
		||||
      {
 | 
			
		||||
        text: 'Choose',
 | 
			
		||||
        click: function () {
 | 
			
		||||
          console.log($('#file_id'))
 | 
			
		||||
          $('input[name=' + $(this).attr('name') + ']').attr('value', $('#file_id').attr('value'))
 | 
			
		||||
          $(this).dialog('close')
 | 
			
		||||
        },
 | 
			
		||||
        disabled: true
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  })
 | 
			
		||||
  $('.choose_file_button').button().on('click', function () {
 | 
			
		||||
    const popup = popups.filter('[name=' + $(this).attr('name') + ']')
 | 
			
		||||
    console.log(popup)
 | 
			
		||||
    popup.html('<iframe src="/file/popup" width="100%" height="95%"></iframe><div id="file_id" value="null" />')
 | 
			
		||||
    popup.dialog({ title: $(this).text() }).dialog('open')
 | 
			
		||||
  })
 | 
			
		||||
  $('#quick_notif li').click(function () {
 | 
			
		||||
    $(this).hide()
 | 
			
		||||
  })
 | 
			
		||||
})
 | 
			
		||||
$(() => {
 | 
			
		||||
	// const buttons = $('.choose_file_button')
 | 
			
		||||
	const popups = $(".choose_file_widget");
 | 
			
		||||
	popups.dialog({
 | 
			
		||||
		autoOpen: false,
 | 
			
		||||
		modal: true,
 | 
			
		||||
		width: "90%",
 | 
			
		||||
		create: (event) => {
 | 
			
		||||
			const target = $(event.target);
 | 
			
		||||
			target.parent().css({
 | 
			
		||||
				position: "fixed",
 | 
			
		||||
				top: "5%",
 | 
			
		||||
				bottom: "5%",
 | 
			
		||||
			});
 | 
			
		||||
			target.css("height", "300px");
 | 
			
		||||
			console.log(target);
 | 
			
		||||
		},
 | 
			
		||||
		buttons: [
 | 
			
		||||
			{
 | 
			
		||||
				text: "Choose",
 | 
			
		||||
				click: function () {
 | 
			
		||||
					console.log($("#file_id"));
 | 
			
		||||
					$(`input[name=${$(this).attr("name")}]`).attr(
 | 
			
		||||
						"value",
 | 
			
		||||
						$("#file_id").attr("value"),
 | 
			
		||||
					);
 | 
			
		||||
					$(this).dialog("close");
 | 
			
		||||
				},
 | 
			
		||||
				disabled: true,
 | 
			
		||||
			},
 | 
			
		||||
		],
 | 
			
		||||
	});
 | 
			
		||||
	$(".choose_file_button")
 | 
			
		||||
		.button()
 | 
			
		||||
		.on("click", function () {
 | 
			
		||||
			const popup = popups.filter(`[name=${$(this).attr("name")}]`);
 | 
			
		||||
			console.log(popup);
 | 
			
		||||
			popup.html(
 | 
			
		||||
				'<iframe src="/file/popup" width="100%" height="95%"></iframe><div id="file_id" value="null" />',
 | 
			
		||||
			);
 | 
			
		||||
			popup.dialog({ title: $(this).text() }).dialog("open");
 | 
			
		||||
		});
 | 
			
		||||
	$("#quick_notif li").click(function () {
 | 
			
		||||
		$(this).hide();
 | 
			
		||||
	});
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
export function createQuickNotif (msg) {
 | 
			
		||||
  const el = document.createElement('li')
 | 
			
		||||
  el.textContent = msg
 | 
			
		||||
  el.addEventListener('click', () => el.parentNode.removeChild(el))
 | 
			
		||||
  document.getElementById('quick_notif').appendChild(el)
 | 
			
		||||
function createQuickNotif(msg) {
 | 
			
		||||
	const el = document.createElement("li");
 | 
			
		||||
	el.textContent = msg;
 | 
			
		||||
	el.addEventListener("click", () => el.parentNode.removeChild(el));
 | 
			
		||||
	document.getElementById("quick_notif").appendChild(el);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function deleteQuickNotifs () {
 | 
			
		||||
  const el = document.getElementById('quick_notif')
 | 
			
		||||
  while (el.firstChild) {
 | 
			
		||||
    el.removeChild(el.firstChild)
 | 
			
		||||
  }
 | 
			
		||||
function deleteQuickNotifs() {
 | 
			
		||||
	const el = document.getElementById("quick_notif");
 | 
			
		||||
	while (el.firstChild) {
 | 
			
		||||
		el.removeChild(el.firstChild);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function display_notif () {
 | 
			
		||||
  $('#header_notif').toggle().parent().toggleClass('white')
 | 
			
		||||
function display_notif() {
 | 
			
		||||
	$("#header_notif").toggle().parent().toggleClass("white");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// You can't get the csrf token from the template in a widget
 | 
			
		||||
@@ -63,21 +69,21 @@ export function display_notif () {
 | 
			
		||||
// Sadly, getting the cookie is not possible with CSRF_COOKIE_HTTPONLY or CSRF_USE_SESSIONS is True
 | 
			
		||||
// So, the true workaround is to get the token from the dom
 | 
			
		||||
// https://docs.djangoproject.com/en/2.0/ref/csrf/#acquiring-the-token-if-csrf-use-sessions-is-true
 | 
			
		||||
export function getCSRFToken () {
 | 
			
		||||
  return $('[name=csrfmiddlewaretoken]').val()
 | 
			
		||||
function getCSRFToken() {
 | 
			
		||||
	return $("[name=csrfmiddlewaretoken]").val();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const initialUrlParams = new URLSearchParams(window.location.search)
 | 
			
		||||
const initialUrlParams = new URLSearchParams(window.location.search);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @readonly
 | 
			
		||||
 * @enum {number}
 | 
			
		||||
 */
 | 
			
		||||
const History = {
 | 
			
		||||
  NONE: 0,
 | 
			
		||||
  PUSH: 1,
 | 
			
		||||
  REPLACE: 2
 | 
			
		||||
}
 | 
			
		||||
	NONE: 0,
 | 
			
		||||
	PUSH: 1,
 | 
			
		||||
	REPLACE: 2,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {string} key
 | 
			
		||||
@@ -85,27 +91,30 @@ const History = {
 | 
			
		||||
 * @param {History} action
 | 
			
		||||
 * @param {URL | null} url
 | 
			
		||||
 */
 | 
			
		||||
export function update_query_string (key, value, action = History.REPLACE, url = null) {
 | 
			
		||||
  if (!url) {
 | 
			
		||||
    url = new URL(window.location.href)
 | 
			
		||||
  }
 | 
			
		||||
  if (value === undefined || value === null || value === '') {
 | 
			
		||||
    // If the value is null, undefined or empty => delete it
 | 
			
		||||
    url.searchParams.delete(key)
 | 
			
		||||
  } else if (Array.isArray(value)) {
 | 
			
		||||
    url.searchParams.delete(key)
 | 
			
		||||
    value.forEach((v) => url.searchParams.append(key, v))
 | 
			
		||||
  } else {
 | 
			
		||||
    url.searchParams.set(key, value)
 | 
			
		||||
  }
 | 
			
		||||
function update_query_string(key, value, action = History.REPLACE, url = null) {
 | 
			
		||||
	let ret = url;
 | 
			
		||||
	if (!ret) {
 | 
			
		||||
		ret = new URL(window.location.href);
 | 
			
		||||
	}
 | 
			
		||||
	if (value === undefined || value === null || value === "") {
 | 
			
		||||
		// If the value is null, undefined or empty => delete it
 | 
			
		||||
		ret.searchParams.delete(key);
 | 
			
		||||
	} else if (Array.isArray(value)) {
 | 
			
		||||
		ret.searchParams.delete(key);
 | 
			
		||||
		for (const v of value) {
 | 
			
		||||
			ret.searchParams.append(key, v);
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		ret.searchParams.set(key, value);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
  if (action === History.PUSH) {
 | 
			
		||||
    window.history.pushState(null, '', url.toString())
 | 
			
		||||
  } else if (action === History.REPLACE) {
 | 
			
		||||
    window.history.replaceState(null, '', url.toString())
 | 
			
		||||
  }
 | 
			
		||||
	if (action === History.PUSH) {
 | 
			
		||||
		window.history.pushState(null, "", ret.toString());
 | 
			
		||||
	} else if (action === History.REPLACE) {
 | 
			
		||||
		window.history.replaceState(null, "", ret.toString());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
  return url
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TODO : If one day a test workflow is made for JS in this project
 | 
			
		||||
@@ -116,27 +125,29 @@ export function update_query_string (key, value, action = History.REPLACE, url =
 | 
			
		||||
 * @param {string} url The paginated endpoint to fetch
 | 
			
		||||
 * @return {Promise<Object[]>}
 | 
			
		||||
 */
 | 
			
		||||
export async function fetch_paginated (url) {
 | 
			
		||||
  const max_per_page = 199
 | 
			
		||||
  const paginated_url = new URL(url, document.location.origin)
 | 
			
		||||
  paginated_url.searchParams.set('page_size', max_per_page.toString())
 | 
			
		||||
  paginated_url.searchParams.set('page', '1')
 | 
			
		||||
async function fetch_paginated(url) {
 | 
			
		||||
	const max_per_page = 199;
 | 
			
		||||
	const paginated_url = new URL(url, document.location.origin);
 | 
			
		||||
	paginated_url.searchParams.set("page_size", max_per_page.toString());
 | 
			
		||||
	paginated_url.searchParams.set("page", "1");
 | 
			
		||||
 | 
			
		||||
  const first_page = (await (await fetch(paginated_url)).json())
 | 
			
		||||
  const results = first_page.results
 | 
			
		||||
	const first_page = await (await fetch(paginated_url)).json();
 | 
			
		||||
	const results = first_page.results;
 | 
			
		||||
 | 
			
		||||
  const nb_pictures = first_page.count
 | 
			
		||||
  const nb_pages = Math.ceil(nb_pictures / max_per_page)
 | 
			
		||||
	const nb_pictures = first_page.count;
 | 
			
		||||
	const nb_pages = Math.ceil(nb_pictures / max_per_page);
 | 
			
		||||
 | 
			
		||||
  if (nb_pages > 1) {
 | 
			
		||||
    const promises = []
 | 
			
		||||
    for (let i = 2; i <= nb_pages; i++) {
 | 
			
		||||
      paginated_url.searchParams.set('page', i.toString())
 | 
			
		||||
      promises.push(
 | 
			
		||||
        fetch(paginated_url).then(res => res.json().then(json => json.results))
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
    results.push(...(await Promise.all(promises)).flat())
 | 
			
		||||
  }
 | 
			
		||||
  return results
 | 
			
		||||
	if (nb_pages > 1) {
 | 
			
		||||
		const promises = [];
 | 
			
		||||
		for (let i = 2; i <= nb_pages; i++) {
 | 
			
		||||
			paginated_url.searchParams.set("page", i.toString());
 | 
			
		||||
			promises.push(
 | 
			
		||||
				fetch(paginated_url).then((res) =>
 | 
			
		||||
					res.json().then((json) => json.results),
 | 
			
		||||
				),
 | 
			
		||||
			);
 | 
			
		||||
		}
 | 
			
		||||
		results.push(...(await Promise.all(promises)).flat());
 | 
			
		||||
	}
 | 
			
		||||
	return results;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										104
									
								
								core/static/core/js/shorten.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										104
									
								
								core/static/core/js/shorten.min.js
									
									
									
									
										vendored
									
									
								
							@@ -19,4 +19,106 @@
 | 
			
		||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 | 
			
		||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 | 
			
		||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
			
		||||
!function(e){e.fn.shorten=function(s){"use strict";var t={showChars:100,minHideChars:10,ellipsesText:"...",moreText:"more",lessText:"less",onLess:function(){},onMore:function(){},errMsg:null,force:!1};return s&&e.extend(t,s),(!e(this).data("jquery.shorten")||!!t.force)&&(e(this).data("jquery.shorten",!0),e(document).off("click",".morelink"),e(document).on({click:function(){var s=e(this);return s.hasClass("less")?(s.removeClass("less"),s.html(t.moreText),s.parent().prev().animate({},function(){s.parent().prev().prev().show()}).hide("fast",function(){t.onLess()})):(s.addClass("less"),s.html(t.lessText),s.parent().prev().animate({},function(){s.parent().prev().prev().hide()}).show("fast",function(){t.onMore()})),!1}},".morelink"),this.each(function(){var s=e(this),n=s.html();if(s.text().length>t.showChars+t.minHideChars){var r=n.substr(0,t.showChars);if(r.indexOf("<")>=0){for(var a=!1,o="",i=0,l=[],h=null,c=0,f=0;f<=t.showChars;c++)if("<"!=n[c]||a||(a=!0,"/"==(h=n.substring(c+1,n.indexOf(">",c)))[0]?h!="/"+l[0]?t.errMsg="ERROR en HTML: the top of the stack should be the tag that closes":l.shift():"br"!=h.toLowerCase()&&l.unshift(h)),a&&">"==n[c]&&(a=!1),a)o+=n.charAt(c);else if(f++,i<=t.showChars)o+=n.charAt(c),i++;else if(l.length>0){for(j=0;j<l.length;j++)o+="</"+l[j]+">";break}r=e("<div/>").html(o+'<span class="ellip">'+t.ellipsesText+"</span>").html()}else r+=t.ellipsesText;var p='<div class="shortcontent">'+r+'</div><div class="allcontent">'+n+'</div><span><a href="javascript://nop/" class="morelink">'+t.moreText+"</a></span>";s.html(p),s.find(".allcontent").hide(),e(".shortcontent p:last",s).css("margin-bottom",0)}}))}}(jQuery);
 | 
			
		||||
!(function (e) {
 | 
			
		||||
	e.fn.shorten = function (s) {
 | 
			
		||||
		"use strict";
 | 
			
		||||
		var t = {
 | 
			
		||||
			showChars: 100,
 | 
			
		||||
			minHideChars: 10,
 | 
			
		||||
			ellipsesText: "...",
 | 
			
		||||
			moreText: "more",
 | 
			
		||||
			lessText: "less",
 | 
			
		||||
			onLess: function () {},
 | 
			
		||||
			onMore: function () {},
 | 
			
		||||
			errMsg: null,
 | 
			
		||||
			force: !1,
 | 
			
		||||
		};
 | 
			
		||||
		return (
 | 
			
		||||
			s && e.extend(t, s),
 | 
			
		||||
			(!e(this).data("jquery.shorten") || !!t.force) &&
 | 
			
		||||
				(e(this).data("jquery.shorten", !0),
 | 
			
		||||
				e(document).off("click", ".morelink"),
 | 
			
		||||
				e(document).on(
 | 
			
		||||
					{
 | 
			
		||||
						click: function () {
 | 
			
		||||
							var s = e(this);
 | 
			
		||||
							return (
 | 
			
		||||
								s.hasClass("less")
 | 
			
		||||
									? (s.removeClass("less"),
 | 
			
		||||
										s.html(t.moreText),
 | 
			
		||||
										s
 | 
			
		||||
											.parent()
 | 
			
		||||
											.prev()
 | 
			
		||||
											.animate({}, function () {
 | 
			
		||||
												s.parent().prev().prev().show();
 | 
			
		||||
											})
 | 
			
		||||
											.hide("fast", function () {
 | 
			
		||||
												t.onLess();
 | 
			
		||||
											}))
 | 
			
		||||
									: (s.addClass("less"),
 | 
			
		||||
										s.html(t.lessText),
 | 
			
		||||
										s
 | 
			
		||||
											.parent()
 | 
			
		||||
											.prev()
 | 
			
		||||
											.animate({}, function () {
 | 
			
		||||
												s.parent().prev().prev().hide();
 | 
			
		||||
											})
 | 
			
		||||
											.show("fast", function () {
 | 
			
		||||
												t.onMore();
 | 
			
		||||
											})),
 | 
			
		||||
								!1
 | 
			
		||||
							);
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
					".morelink",
 | 
			
		||||
				),
 | 
			
		||||
				this.each(function () {
 | 
			
		||||
					var s = e(this),
 | 
			
		||||
						n = s.html();
 | 
			
		||||
					if (s.text().length > t.showChars + t.minHideChars) {
 | 
			
		||||
						var r = n.substr(0, t.showChars);
 | 
			
		||||
						if (r.indexOf("<") >= 0) {
 | 
			
		||||
							for (
 | 
			
		||||
								var a = !1, o = "", i = 0, l = [], h = null, c = 0, f = 0;
 | 
			
		||||
								f <= t.showChars;
 | 
			
		||||
								c++
 | 
			
		||||
							)
 | 
			
		||||
								if (
 | 
			
		||||
									("<" != n[c] ||
 | 
			
		||||
										a ||
 | 
			
		||||
										((a = !0),
 | 
			
		||||
										"/" == (h = n.substring(c + 1, n.indexOf(">", c)))[0]
 | 
			
		||||
											? h != "/" + l[0]
 | 
			
		||||
												? (t.errMsg =
 | 
			
		||||
														"ERROR en HTML: the top of the stack should be the tag that closes")
 | 
			
		||||
												: l.shift()
 | 
			
		||||
											: "br" != h.toLowerCase() && l.unshift(h)),
 | 
			
		||||
									a && ">" == n[c] && (a = !1),
 | 
			
		||||
									a)
 | 
			
		||||
								)
 | 
			
		||||
									o += n.charAt(c);
 | 
			
		||||
								else if ((f++, i <= t.showChars)) (o += n.charAt(c)), i++;
 | 
			
		||||
								else if (l.length > 0) {
 | 
			
		||||
									for (j = 0; j < l.length; j++) o += "</" + l[j] + ">";
 | 
			
		||||
									break;
 | 
			
		||||
								}
 | 
			
		||||
							r = e("<div/>")
 | 
			
		||||
								.html(o + '<span class="ellip">' + t.ellipsesText + "</span>")
 | 
			
		||||
								.html();
 | 
			
		||||
						} else r += t.ellipsesText;
 | 
			
		||||
						var p =
 | 
			
		||||
							'<div class="shortcontent">' +
 | 
			
		||||
							r +
 | 
			
		||||
							'</div><div class="allcontent">' +
 | 
			
		||||
							n +
 | 
			
		||||
							'</div><span><a href="javascript://nop/" class="morelink">' +
 | 
			
		||||
							t.moreText +
 | 
			
		||||
							"</a></span>";
 | 
			
		||||
						s.html(p),
 | 
			
		||||
							s.find(".allcontent").hide(),
 | 
			
		||||
							e(".shortcontent p:last", s).css("margin-bottom", 0);
 | 
			
		||||
					}
 | 
			
		||||
				}))
 | 
			
		||||
		);
 | 
			
		||||
	};
 | 
			
		||||
})(jQuery);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,3 @@
 | 
			
		||||
/* eslint-disable camelcase */
 | 
			
		||||
/**
 | 
			
		||||
 * Builders to use Select2 in our templates.
 | 
			
		||||
 *
 | 
			
		||||
@@ -158,15 +157,15 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @param {Select2Options} options
 | 
			
		||||
 */
 | 
			
		||||
export function sithSelect2 (options) {
 | 
			
		||||
  const elem = $(options.element)
 | 
			
		||||
  return elem.select2({
 | 
			
		||||
    theme: elem[0].multiple ? 'classic' : 'default',
 | 
			
		||||
    minimumInputLength: 2,
 | 
			
		||||
    templateResult: select_item_builder(options.picture_getter),
 | 
			
		||||
    ...options.data_source,
 | 
			
		||||
    ...(options.overrides || {})
 | 
			
		||||
  })
 | 
			
		||||
function sithSelect2(options) {
 | 
			
		||||
	const elem = $(options.element);
 | 
			
		||||
	return elem.select2({
 | 
			
		||||
		theme: elem[0].multiple ? "classic" : "default",
 | 
			
		||||
		minimumInputLength: 2,
 | 
			
		||||
		templateResult: select_item_builder(options.picture_getter),
 | 
			
		||||
		...options.data_source,
 | 
			
		||||
		...(options.overrides || {}),
 | 
			
		||||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -180,12 +179,12 @@ export function sithSelect2 (options) {
 | 
			
		||||
 * @param {Select2Object[]} source The array containing the data
 | 
			
		||||
 * @param {RemoteSourceOptions} options
 | 
			
		||||
 */
 | 
			
		||||
export function local_data_source (source, options) {
 | 
			
		||||
  if (options.excluded) {
 | 
			
		||||
    const ids = options.excluded()
 | 
			
		||||
    return { data: source.filter((i) => !ids.includes(i.id)) }
 | 
			
		||||
  }
 | 
			
		||||
  return { data: source }
 | 
			
		||||
function local_data_source(source, options) {
 | 
			
		||||
	if (options.excluded) {
 | 
			
		||||
		const ids = options.excluded();
 | 
			
		||||
		return { data: source.filter((i) => !ids.includes(i.id)) };
 | 
			
		||||
	}
 | 
			
		||||
	return { data: source };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -203,38 +202,38 @@ export function local_data_source (source, options) {
 | 
			
		||||
 * @param {string} source The url of the endpoint
 | 
			
		||||
 * @param {RemoteSourceOptions} options
 | 
			
		||||
 */
 | 
			
		||||
export function remote_data_source (source, options) {
 | 
			
		||||
  jQuery.ajaxSettings.traditional = true
 | 
			
		||||
  const params = {
 | 
			
		||||
    url: source,
 | 
			
		||||
    dataType: 'json',
 | 
			
		||||
    cache: true,
 | 
			
		||||
    delay: 250,
 | 
			
		||||
    data: function (params) {
 | 
			
		||||
      return {
 | 
			
		||||
        search: params.term,
 | 
			
		||||
        exclude: [
 | 
			
		||||
          ...(this.val() || []).map((i) => parseInt(i)),
 | 
			
		||||
          ...(options.excluded ? options.excluded() : [])
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (options.result_converter) {
 | 
			
		||||
    params.processResults = function (data) {
 | 
			
		||||
      return { results: data.results.map(options.result_converter) }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (options.overrides) {
 | 
			
		||||
    Object.assign(params, options.overrides)
 | 
			
		||||
  }
 | 
			
		||||
  return { ajax: params }
 | 
			
		||||
function remote_data_source(source, options) {
 | 
			
		||||
	jQuery.ajaxSettings.traditional = true;
 | 
			
		||||
	const params = {
 | 
			
		||||
		url: source,
 | 
			
		||||
		dataType: "json",
 | 
			
		||||
		cache: true,
 | 
			
		||||
		delay: 250,
 | 
			
		||||
		data: function (params) {
 | 
			
		||||
			return {
 | 
			
		||||
				search: params.term,
 | 
			
		||||
				exclude: [
 | 
			
		||||
					...(this.val() || []).map((i) => Number.parseInt(i)),
 | 
			
		||||
					...(options.excluded ? options.excluded() : []),
 | 
			
		||||
				],
 | 
			
		||||
			};
 | 
			
		||||
		},
 | 
			
		||||
	};
 | 
			
		||||
	if (options.result_converter) {
 | 
			
		||||
		params.processResults = (data) => ({
 | 
			
		||||
			results: data.results.map(options.result_converter),
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
	if (options.overrides) {
 | 
			
		||||
		Object.assign(params, options.overrides);
 | 
			
		||||
	}
 | 
			
		||||
	return { ajax: params };
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function item_formatter (user) {
 | 
			
		||||
  if (user.loading) {
 | 
			
		||||
    return user.text
 | 
			
		||||
  }
 | 
			
		||||
function item_formatter(user) {
 | 
			
		||||
	if (user.loading) {
 | 
			
		||||
		return user.text;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -242,21 +241,21 @@ export function item_formatter (user) {
 | 
			
		||||
 * @param {null | function(Object):string} picture_getter
 | 
			
		||||
 * @return {function(string): jQuery|HTMLElement}
 | 
			
		||||
 */
 | 
			
		||||
function select_item_builder (picture_getter) {
 | 
			
		||||
  return (item) => {
 | 
			
		||||
    const picture =
 | 
			
		||||
      typeof picture_getter === 'function' ? picture_getter(item) : null
 | 
			
		||||
    const img_html = picture
 | 
			
		||||
      ? `<img 
 | 
			
		||||
function select_item_builder(picture_getter) {
 | 
			
		||||
	return (item) => {
 | 
			
		||||
		const picture =
 | 
			
		||||
			typeof picture_getter === "function" ? picture_getter(item) : null;
 | 
			
		||||
		const img_html = picture
 | 
			
		||||
			? `<img 
 | 
			
		||||
          src="${picture_getter(item)}" 
 | 
			
		||||
          alt="${item.text}" 
 | 
			
		||||
          onerror="this.src = '/static/core/img/unknown.jpg'" 
 | 
			
		||||
        />`
 | 
			
		||||
      : ''
 | 
			
		||||
			: "";
 | 
			
		||||
 | 
			
		||||
    return $(`<div class="select-item">
 | 
			
		||||
		return $(`<div class="select-item">
 | 
			
		||||
        ${img_html}
 | 
			
		||||
         <span class="select-item-text">${item.text}</span>
 | 
			
		||||
         </div>`)
 | 
			
		||||
  }
 | 
			
		||||
         </div>`);
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user