diff --git a/allianceauth/static/allianceauth/js/filterDropDown/filterDropDown.js b/allianceauth/static/allianceauth/js/filterDropDown/filterDropDown.js
index c01ca649..c41415b2 100644
--- a/allianceauth/static/allianceauth/js/filterDropDown/filterDropDown.js
+++ b/allianceauth/static/allianceauth/js/filterDropDown/filterDropDown.js
@@ -1,4 +1,4 @@
-/*
+/**
* filterDropDown.js
*
* Copyright (C) 2017-18 Erik Kalkoken
@@ -6,234 +6,262 @@
* Extension for the jQuery plug-in DataTables (developed and tested with v1.10.15)
*
* Version 0.4.0
- *
-**/
+ **/
+(($) => {
+ 'use strict';
-(function ($) {
-
- // parse initialization array and returns filterDef array to faster and easy use
- // also sets defaults for properties that are not set
- function parseInitArray(initArray) {
- // initialization and setting defaults
- let filterDef = {
- "columns": [],
- "columnsIdxList": [],
- "bootstrap": false,
- "autoSize": true,
- "ajax": null,
- "label": "Filter "
+ /**
+ * Parse initialization array and returns filterDef array to faster and easy use,
+ * also sets defaults for properties that are not set
+ *
+ * @param initArray
+ * @returns {{autoSize: boolean, bootstrap_version: number, columnsIdxList: *[], columns: *[], bootstrap: boolean, label: string, ajax: null}}
+ */
+ const parseInitArray = (initArray) => {
+ /**
+ * Default filter definition
+ *
+ * @type {{autoSize: boolean, bootstrap_version: number, columnsIdxList: *[], columns: *[], bootstrap: boolean, label: string, ajax: null}}
+ */
+ const filterDef = {
+ 'columns': [],
+ 'columnsIdxList': [],
+ 'bootstrap': false,
+ 'bootstrap_version': 3,
+ 'autoSize': true,
+ 'ajax': null,
+ 'label': 'Filter '
};
- // set filter properties if they have been defined
- // otherwise the defaults will be used
- if (("bootstrap" in initArray) && (typeof initArray.bootstrap === 'boolean')) {
+ // Set filter properties if they have been defined otherwise the defaults will be used
+ if (('bootstrap' in initArray) && (typeof initArray.bootstrap === 'boolean')) {
filterDef.bootstrap = initArray.bootstrap;
}
- if (("autoSize" in initArray) && (typeof initArray.autoSize === 'boolean')) {
+ if (('bootstrap_version' in initArray) && (typeof initArray.bootstrap_version === 'number')) {
+ filterDef.bootstrap_version = initArray.bootstrap_version;
+ }
+
+ if (('autoSize' in initArray) && (typeof initArray.autoSize === 'boolean')) {
filterDef.autoSize = initArray.autoSize;
}
- if (("ajax" in initArray) && (typeof initArray.ajax === 'string')) {
+ if (('ajax' in initArray) && (typeof initArray.ajax === 'string')) {
filterDef.ajax = initArray.ajax;
}
- if (("label" in initArray) && (typeof initArray.label === 'string')) {
+ if (('label' in initArray) && (typeof initArray.label === 'string')) {
filterDef.label = initArray.label;
}
- // add definition for each column
- if ("columns" in initArray) {
- initArray.columns.forEach(function (initColumn) {
- if (("idx" in initColumn) && (typeof initColumn.idx === 'number')) {
- // initialize column
- let idx = initColumn.idx;
- filterDef['columns'][idx] = {
- "title": null,
- "maxWidth": null,
- "autoSize": true
+ // Add definition for each column
+ if ('columns' in initArray) {
+ initArray.columns.forEach((initColumn) => {
+ if (('idx' in initColumn) && (typeof initColumn.idx === 'number')) {
+ // Initialize column
+ const idx = initColumn.idx;
+
+ filterDef.columns[idx] = {
+ 'title': null,
+ 'maxWidth': null,
+ 'autoSize': true
};
- // add to list of indices in same order they appear in the init array
- filterDef['columnsIdxList'].push(idx);
+ // Add to a list of indices in the same order they appear in the init array
+ filterDef.columnsIdxList.push(idx);
- // set column properties if they have been defined
- // otherwise the defaults will be used
- if (('title' in initColumn)
- && (typeof initColumn.title === 'string')
- ) {
- filterDef['columns'][idx].title = initColumn.title;
+ // Set column properties if they have been defined otherwise the defaults will be used
+ if (('title' in initColumn) && (typeof initColumn.title === 'string')) {
+ filterDef.columns[idx].title = initColumn.title;
}
- if (('maxWidth' in initColumn)
- && (typeof initColumn.maxWidth === 'string')
- ) {
- filterDef['columns'][idx].maxWidth = initColumn.maxWidth;
+ if (('maxWidth' in initColumn) && (typeof initColumn.maxWidth === 'string')) {
+ filterDef.columns[idx].maxWidth = initColumn.maxWidth;
}
- if (('autoSize' in initColumn)
- && (typeof initColumn.autoSize === 'boolean')
- ) {
- filterDef['columns'][idx].autoSize = initColumn.autoSize;
+ if (('autoSize' in initColumn) && (typeof initColumn.autoSize === 'boolean')) {
+ filterDef.columns[idx].autoSize = initColumn.autoSize;
}
}
});
}
+
return filterDef;
- }
+ };
- // Add option d to given select object
- function addOption(select, d) {
- if (d != "") {
- select.append('');
+ /**
+ * Add option d to the given select object
+ *
+ * @param select
+ * @param d
+ */
+ const addOption = (select, d) => {
+ if (d !== '') {
+ select.append(``);
}
- }
+ };
- // initalizing select for current column and applying event to react to changes
- function initSelectForColumn(id, column) {
- let select = $("#" + id + "_filterSelect" + column.index());
- select.on('change', function () {
- let val = $.fn.dataTable.util.escapeRegex($(this).val());
- column
- .search(val ? '^' + val + '$' : '', true, false)
- .draw();
+ /**
+ * Initialize the select element for given column and apply event to react to changes
+ *
+ * @param id
+ * @param column
+ * @returns {*|jQuery|HTMLElement}
+ */
+ const initSelectForColumn = (id, column) => {
+ const select = $(`#${id}_filterSelect${column.index()}`);
+
+ $(select).change(() => {
+ const val = $.fn.dataTable.util.escapeRegex($(select).val());
+
+ column.search(val ? `^${val}$` : '', true, false).draw();
});
- return select
- }
- // Add filterDropDown container div, draw select elements with default options
- // use preInit so that elements are created and correctly shown before data is loaded
- $(document).on('preInit.dt', function (e, settings) {
- if (e.namespace !== 'dt') return;
+ return select;
+ };
- // get api object for current dt table
- var api = new $.fn.dataTable.Api(settings);
+ // Add filterDropDown container div, draw select elements with default options.
+ // Use preInit so that elements are created and correctly shown before data is loaded
+ $(document).on('preInit.dt', (e, settings) => {
+ if (e.namespace !== 'dt') {
+ return;
+ }
- // get id of current table
- var id = api.table().node().id;
+ // Get the api object for the current dt table
+ const api = new $.fn.dataTable.Api(settings);
- // get initialization object for current table to retrieve custom settings
- var initObj = api.init();
+ // Get the id of the current table
+ const id = api.table().node().id;
- // only proceed if filter has been defined in current table, otherwise don't do anything.
- if (!("filterDropDown" in initObj)) return;
+ // Get the initialization object for the current table to retrieve custom settings
+ const initObj = api.init();
- // get current filter definition from init array
- var filterDef = parseInitArray(initObj.filterDropDown);
+ // Only proceed if the filter has been defined in the current table,
+ // otherwise don't do anything.
+ if (!('filterDropDown' in initObj)) {
+ return;
+ }
+
+ // Get the current filter definition from the init array
+ const filterDef = parseInitArray(initObj.filterDropDown);
// only proceed if there are any columns defined
- if (filterDef.columns.length == 0) return;
+ if (filterDef.columns.length === 0) {
+ return;
+ }
- // get container div for current data table to add new elements to
- var container = api.table().container();
+ // Get container div for the current data table to add new elements to
+ const container = api.table().container();
+
+ // Add filter elements to DOM
+ const filterWrapperId = `${id}_filterWrapper`;
+
+ // Set CSS classes for the filter wrapper div depending on bootstrap setting
+ let divCssClass = `${filterWrapperId} ${(filterDef.bootstrap) ? 'form-inline' : ''}`;
+ if (filterDef.bootstrap && filterDef.bootstrap_version === 5) {
+ divCssClass = `${filterWrapperId} input-group my-3`;
+ }
- // add filter elements to DOM
- var filterWrapperId = id + "_filterWrapper";
- var divCssClass = filterWrapperId + " " + (
- (filterDef.bootstrap)
- ? "form-inline"
- : ""
- );
$(container).prepend(
- '
'
- + filterDef.label
- + '
'
+ `
${filterDef.label}
`
);
api.columns(filterDef.columnsIdxList).every(function () {
- let idx = this.index();
+ const idx = this.index();
// set title of current column
let colName = (filterDef.columns[idx].title !== null)
? filterDef.columns[idx].title
: $(this.header()).html();
- if (colName == "") colName = 'column ' + (idx + 1);
+ if (colName === '') {
+ colName = `column ${idx + 1}`;
+ }
- // adding select element for current column to container
- let selectId = id + "_filterSelect" + idx;
- $('#' + filterWrapperId).append(
- ''
- );
+ // Adding the select element for current column to container
+ const selectId = `${id}_filterSelect${idx}`;
- // initalizing select for current column and applying event to react to changes
- let select = $("#" + selectId).empty()
- .append('');
+ // Set CSS classes for the select element depending on bootstrap setting
+ let selectMarkup = ``;
+ if (filterDef.bootstrap && filterDef.bootstrap_version === 5) {
+ selectMarkup = ``;
+ }
- // set max width of select elements to current width (which is defined by the size of the title)
- // turn off on for very small screens for responsive design or if autoSize has been set to false
+ $('#' + filterWrapperId).append(selectMarkup);
+
+ // Initializing select for current column and applying event to react to changes
+ const select = $('#' + selectId)
+ .empty()
+ .append(``);
+
+ // Set max width of select elements to current width (which is defined by the size of the title)
+ // Turn off on for very small screens for responsive design, or if autoSize has been set to false
if (filterDef.autoSize && filterDef.columns[idx].autoSize && (screen.width > 768)) {
select.css('max-width', select.outerWidth());
}
- // apply optional css style if defined in init array
- // will override automatic max width setting
+ // Apply optional css style if defined in the init array will override automatic max width setting
if (filterDef.columns[idx].maxWidth !== null) {
select.css('max-width', filterDef.columns[idx].maxWidth);
}
});
-
});
- // filter table and add available options to dropDowns
- $(document).on('init.dt', function (e, settings) {
- if (e.namespace !== 'dt') return;
+ // Filter table and add available options to dropDowns
+ $(document).on('init.dt', (e, settings) => {
+ if (e.namespace !== 'dt') {
+ return;
+ }
- // get api object for current dt table
- var api = new $.fn.dataTable.Api(settings);
+ // Get api object for current dt table
+ const api = new $.fn.dataTable.Api(settings);
- // get id of current table
- var id = api.table().node().id;
+ // Get id of current table
+ const id = api.table().node().id;
- // get initialization object for current table to retrieve custom settings
- var initObj = api.init();
+ // Get the initialization object for current table to retrieve custom settings
+ const initObj = api.init();
- // only proceed if filter has been defined in current table, otherwise don't do anything.
- if (!("filterDropDown" in initObj)) return;
+ // Only proceed if a filter has been defined in the current table, otherwise don't do anything.
+ if (!('filterDropDown' in initObj)) {
+ return;
+ }
- // get current filter definition
- var filterDef = parseInitArray(initObj.filterDropDown);
+ // Get current filter definition
+ const filterDef = parseInitArray(initObj.filterDropDown);
if (filterDef.ajax == null) {
api.columns(filterDef.columnsIdxList).every(function () {
- let column = this
- let select = initSelectForColumn(id, column);
- column.data().unique().sort().each(function (d) {
- addOption(select, d)
+ const column = this;
+ const select = initSelectForColumn(id, column);
+
+ column.data().unique().sort().each((d) => {
+ addOption(select, d);
});
});
} else {
- // fetch column options from server for server side processing
- let columnsQuery = (
- "columns="
- + encodeURIComponent(
+ // Fetch column options from server for server side processing
+ const columnsQuery = (
+ `columns=${encodeURIComponent(
api.columns(filterDef.columnsIdxList).dataSrc().join()
- )
- )
- $.getJSON(filterDef.ajax + "?" + columnsQuery, function (columnsOptions) {
+ )}`
+ );
+
+ $.getJSON(`${filterDef.ajax}?${columnsQuery}`, (columnsOptions) => {
api.columns(filterDef.columnsIdxList).every(function () {
- let column = this;
- let select = initSelectForColumn(id, column);
- let columnName = column.dataSrc()
+ const column = this;
+ const select = initSelectForColumn(id, column);
+ const columnName = column.dataSrc();
+
if (columnName in columnsOptions) {
- columnsOptions[columnName].forEach(function (d) {
- addOption(select, d)
+ columnsOptions[columnName].forEach((d) => {
+ addOption(select, d);
});
} else {
- console.warn(
- "Missing column '" + columnName + "' in ajax response."
- )
+ console.warn(`Missing column '${columnName}' in ajax response.`);
}
});
});
}
});
-
-}(jQuery));
+})(jQuery);
diff --git a/allianceauth/static/allianceauth/js/filterDropDown/filterDropDown.min.js b/allianceauth/static/allianceauth/js/filterDropDown/filterDropDown.min.js
index f4ac8527..2e304a4e 100644
--- a/allianceauth/static/allianceauth/js/filterDropDown/filterDropDown.min.js
+++ b/allianceauth/static/allianceauth/js/filterDropDown/filterDropDown.min.js
@@ -1 +1,2 @@
-!function(t){function n(t){let n={columns:[],columnsIdxList:[],bootstrap:!1,autoSize:!0,ajax:null,label:"Filter "};return"bootstrap"in t&&"boolean"==typeof t.bootstrap&&(n.bootstrap=t.bootstrap),"autoSize"in t&&"boolean"==typeof t.autoSize&&(n.autoSize=t.autoSize),"ajax"in t&&"string"==typeof t.ajax&&(n.ajax=t.ajax),"label"in t&&"string"==typeof t.label&&(n.label=t.label),"columns"in t&&t.columns.forEach(function(t){if("idx"in t&&"number"==typeof t.idx){let e=t.idx;n.columns[e]={title:null,maxWidth:null,autoSize:!0},n.columnsIdxList.push(e),"title"in t&&"string"==typeof t.title&&(n.columns[e].title=t.title),"maxWidth"in t&&"string"==typeof t.maxWidth&&(n.columns[e].maxWidth=t.maxWidth),"autoSize"in t&&"boolean"==typeof t.autoSize&&(n.columns[e].autoSize=t.autoSize)}}),n}function e(t,n){""!=n&&t.append('")}function i(n,e){let i=t("#"+n+"_filterSelect"+e.index());return i.on("change",function(){let n=t.fn.dataTable.util.escapeRegex(t(this).val());e.search(n?"^"+n+"$":"",!0,!1).draw()}),i}t(document).on("preInit.dt",function(e,i){if("dt"===e.namespace){var o=new t.fn.dataTable.Api(i),l=o.table().node().id,a=o.init();if("filterDropDown"in a){var u=n(a.filterDropDown);if(0!=u.columns.length){var s=o.table().container(),c=l+"_filterWrapper",r=c+" "+(u.bootstrap?"form-inline":"");t(s).prepend('
`),e.columns(a.columnsIdxList).every(function(){const t=this.index();let o=null!==a.columns[t].title?a.columns[t].title:c(this.header()).html();""===o&&(o="column "+(t+1));const e=s+"_filterSelect"+t;let n=``;a.bootstrap&&5===a.bootstrap_version&&(n=``),c("#"+l).append(n);const i=c("#"+e).empty().append(``);a.autoSize&&a.columns[t].autoSize&&768{if("dt"===t.namespace){const e=new c.fn.dataTable.Api(o),i=e.table().node().id,n=e.init();if("filterDropDown"in n){const s=r(n.filterDropDown);if(null==s.ajax)e.columns(s.columnsIdxList).every(function(){const t=this,o=u(i,t);t.data().unique().sort().each(t=>{l(o,t)})});else{const a="columns="+encodeURIComponent(e.columns(s.columnsIdxList).dataSrc().join());c.getJSON(s.ajax+"?"+a,n=>{e.columns(s.columnsIdxList).every(function(){const t=this,o=u(i,t),e=t.dataSrc();e in n?n[e].forEach(t=>{l(o,t)}):console.warn(`Missing column '${e}' in ajax response.`)})})}}}})})(jQuery);
+//# sourceMappingURL=filterDropDown.min.js.map
\ No newline at end of file
diff --git a/allianceauth/static/allianceauth/js/filterDropDown/filterDropDown.min.js.map b/allianceauth/static/allianceauth/js/filterDropDown/filterDropDown.min.js.map
new file mode 100644
index 00000000..75a7a2f6
--- /dev/null
+++ b/allianceauth/static/allianceauth/js/filterDropDown/filterDropDown.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["filterDropDown.js"],"names":["parseInitArray","filterDef","columns","columnsIdxList","bootstrap","bootstrap_version","autoSize","ajax","label","initArray","forEach","initColumn","idx","title","maxWidth","push","addOption","select","d","append","initSelectForColumn","id","column","$","index","change","val","fn","dataTable","util","escapeRegex","search","draw","document","on","e","settings","namespace","api","Api","table","node","initObj","init","filterDropDown","length","container","filterWrapperId","let","divCssClass","prepend","every","this","colName","header","html","selectId","selectMarkup","empty","screen","width","css","outerWidth","data","unique","sort","each","columnsQuery","encodeURIComponent","dataSrc","join","getJSON","columnName","columnsOptions","console","warn","jQuery"],"mappings":"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"}
\ No newline at end of file