update filter in a more generic way

This commit is contained in:
Jordan Blasenhauer 2024-06-11 10:00:00 +02:00
parent b645580a37
commit 5ab3578430
2 changed files with 152 additions and 203 deletions

View file

@ -74,8 +74,8 @@ function useGetFormDataAttr(el) {
}
/**
@name useFilterSettingsAdvanced
@description Filter advanced settings templates based on filters object.
@name useFilter
@description Filter keys of an items list of objects with filters.
@example
const filters = [
{
@ -90,91 +90,46 @@ function useGetFormDataAttr(el) {
},
];
const plugins = [
const data = [
{
id: "clientcache",
stream: "no",
name: "Client cache",
description: "Manage caching for clients.",
version: "1.0",
type: "core",
method: "manual",
page: false,
settings: {
USE_CLIENT_CACHE: {
context: "multisite",
default: "no",
help: "Tell client to store locally static files.",
id: "use-client-cache-default",
label: "Use client cache",
regex: "^(yes|no)$",
type: "check",
containerClass: "z-3",
pattern: "^(yes|no)$",
inpType: "checkbox",
name: "Use client cache",
columns: {
pc: 4,
tablet: 6,
mobile: 12,
},
disabled: true,
value: "yes",
popovers: [
{
iconColor: "info",
iconName: "info",
text: "Tell client to store locally static files.",
},
{
iconColor: "orange",
iconName: "disk",
text: "inp_popover_multisite",
},
],
},
},
checksum: null,
},
},
{
id: "whitelist",
stream: "no",
name: "whitelist",
description: "Whitelist IP",
}
];
@param {object} plugins - Object with the plugins data.
@param {object} filters - Object with the filters data.
*/
function useFilterPluginsAdvanced(plugins, filters) {
function useFilter(items, filters) {
// loop on filters to determine types
filters = removeDefaultFilters(filters);
// Case no filters, return plugins
if (filters.length === 0) return plugins;
// Case no filters, return items
if (filters.length === 0) return items;
// loop on filters to determine types
const filterTypes = [];
filters.forEach((filter) => {
if (!filterTypes.includes(filter.type)) filterTypes.push(filter.type);
});
// Deepcopy
const data = JSON.parse(JSON.stringify(plugins));
const data = JSON.parse(JSON.stringify(items));
const filterData = [];
// Loop on data
for (let i = 0; i < data.length; i++) {
// Prepare data
const items = [];
const plugin = JSON.parse(JSON.stringify(data[i]));
// Get SETTING_NAME as id
const settings = plugin.settings;
for (const key in settings) {
items.push({ id: key });
items.push(settings[key]);
}
// Get settings and remove settings from plugin to avoid duplicate
delete plugin["settings"];
items.push(plugin);
const item = data[i];
// Check if one filter of type "select" in filters
if (filterTypes.includes("select") && !isMatchingSelect(filters, items))
if (filterTypes.includes("select") && !isItemSelect(filters, item))
continue;
if (filterTypes.includes("keyword") && !isMatchingKeyword(filters, items))
if (filterTypes.includes("keyword") && !isItemKeyword(filters, item))
continue;
filterData.push(data[i]);
@ -213,7 +168,7 @@ function removeDefaultFilters(filters) {
}
/**
@name isMatchingKeyword
@name isItemKeyword
@description Check all items keys if at least one match with the filter value.
@example
const filters = [
@ -231,46 +186,42 @@ function removeDefaultFilters(filters) {
@param filters - Array of filters
@param items - Array of items
*/
function isMatchingKeyword(filters, items) {
function isItemKeyword(filters, item) {
// Match if at least one match
let atLeastOneMatch = false;
for (let i = 0; i < items.length; i++) {
const item = items[i];
for (let j = 0; j < filters.length; j++) {
const filter = filters[j];
// Avoid filter cases
const filterValue = filter.value;
const filterType = filter.type;
if (filterType !== "keyword") continue;
for (let j = 0; j < filters.length; j++) {
const filter = filters[j];
// Avoid filter cases
const filterValue = filter.value;
const filterType = filter.type;
if (filterType !== "keyword" || (filterType === "keyword" && !filterValue))
continue;
for (let k = 0; k < filter.keys.length; k++) {
const key = filter.keys[k];
// Avoid if key not found in item
if (!item[key]) continue;
const value = item[key].replaceAll("_", " ").toLowerCase();
// Avoid non-primitive value
if (typeof value !== "string" && typeof value !== "number") continue;
// Check if value contains filter value
for (let k = 0; k < filter.keys.length; k++) {
const key = filter.keys[k];
// Avoid if key not found in item
if (!item[key]) continue;
const value = item[key].replaceAll("_", " ").toLowerCase();
// Avoid non-primitive value
if (typeof value !== "string" && typeof value !== "number") continue;
// Check if value contains filter value
if (
value &&
value
.toString()
.toLowerCase()
.includes(filterValue.replaceAll("_", " ").toLowerCase())
) {
atLeastOneMatch = true;
break;
}
if (
value &&
value
.toString()
.toLowerCase()
.includes(filter.value.replaceAll("_", " ").toLowerCase())
) {
return true;
}
}
}
return atLeastOneMatch;
return false;
}
/**
@name isMatchingSelect
@name isItemSelect
@description Check all items keys if at least one match exactly the filter value.
@example
const filters = [
@ -288,33 +239,31 @@ function isMatchingKeyword(filters, items) {
@param filters - Array of filters
@param items - Array of items
*/
function isMatchingSelect(filters, items) {
let atLeastOneMatch = false;
for (let i = 0; i < items.length; i++) {
const item = items[i];
for (let j = 0; j < filters.length; j++) {
const filter = filters[j];
// Avoid filter cases
const filterValue = filter.value;
const filterType = filter.type;
if (filterType !== "select") continue;
for (let k = 0; k < filter.keys.length; k++) {
const key = filter.keys[k];
// Avoid if key not found in item
if (!item[key]) continue;
const value = item[key];
// Avoid non-primitive value
if (typeof value !== "string" && typeof value !== "number") continue;
// Value need to match exactly filter value
if (value.toString().toLowerCase() === filterValue.toLowerCase()) {
atLeastOneMatch = true;
break;
}
function isItemSelect(filters, item) {
for (let j = 0; j < filters.length; j++) {
const filter = filters[j];
// Avoid filter cases
const filterValue = filter.value;
const filterType = filter.type;
if (
filterType !== "select" ||
(filterType === "select" && filterValue === "all")
)
continue;
for (let k = 0; k < filter.keys.length; k++) {
const key = filter.keys[k];
// Avoid if key not found in item
if (!item[key]) continue;
const value = item[key];
// Avoid non-primitive value
if (typeof value !== "string" && typeof value !== "number") continue;
// Value need to match exactly filter value
if (value.toString().toLowerCase() === filterValue.toLowerCase()) {
return true;
}
}
}
return atLeastOneMatch;
return false;
}
export { useForm, useFilterPluginsAdvanced };
export { useForm, useFilter };

View file

@ -6022,12 +6022,7 @@ const data = [
},
];
const filters = [
{
type: "keyword",
value: "whitelist_ip",
keys: ["id", "label", "name", "description", "help", "value"],
},
const filtersPlugin = [
{
type: "select",
value: "core",
@ -6035,7 +6030,20 @@ const filters = [
},
];
function useFilterSettings(plugins, filters) {
const filtersSettings = [
{
type: "keyword",
value: "client",
keys: ["id", "label", "name", "description", "help", "value"],
},
];
function useFilter(items, filters) {
// loop on filters to determine types
filters = removeDefaultFilters(filters);
// Case no filters, return items
if (filters.length === 0) return items;
// loop on filters to determine types
const filterTypes = [];
filters.forEach((filter) => {
@ -6043,106 +6051,98 @@ function useFilterSettings(plugins, filters) {
});
// Deepcopy
const data = JSON.parse(JSON.stringify(plugins));
const data = JSON.parse(JSON.stringify(items));
const filterData = [];
// Loop on data
for (let i = 0; i < data.length; i++) {
// Prepare data
const items = [];
const plugin = JSON.parse(JSON.stringify(data[i]));
// Get SETTING_NAME as id
const settings = plugin.settings;
for (const key in settings) {
items.push({ id: key });
items.push(settings[key]);
}
// Get settings and remove settings from plugin to avoid duplicate
delete plugin["settings"];
items.push(plugin);
const item = data[i];
// Check if one filter of type "select" in filters
if (filterTypes.includes("select") && !isMatchingSelect(filters, items))
if (filterTypes.includes("select") && !isItemSelect(filters, item))
continue;
if (filterTypes.includes("keyword") && !isMatchingKeyword(filters, items))
if (filterTypes.includes("keyword") && !isItemKeyword(filters, item))
continue;
filterData.push(data[i]);
}
return filterData;
}
function isMatchingKeyword(filters, items) {
function removeDefaultFilters(filters) {
// Remove filters with type "select" and "all" as value
filters = filters.filter((filter) => {
return filter.type !== "select" || filter.value !== "all";
});
// Remove filters with type "keyword" and empty value
filters = filters.filter((filter) => {
return filter.type !== "keyword" || filter.value !== "";
});
return filters;
}
function isItemKeyword(filters, item) {
// Match if at least one match
let atLeastOneMatch = false;
for (let i = 0; i < items.length; i++) {
const item = items[i];
for (let j = 0; j < filters.length; j++) {
const filter = filters[j];
// Avoid filter cases
const filterValue = filter.value;
const filterType = filter.type;
for (let j = 0; j < filters.length; j++) {
const filter = filters[j];
// Avoid filter cases
const filterValue = filter.value;
const filterType = filter.type;
if (filterType !== "keyword" || (filterType === "keyword" && !filterValue))
continue;
for (let k = 0; k < filter.keys.length; k++) {
const key = filter.keys[k];
// Avoid if key not found in item
if (!item[key]) continue;
const value = item[key].replaceAll("_", " ").toLowerCase();
// Avoid non-primitive value
if (typeof value !== "string" && typeof value !== "number") continue;
// Check if value contains filter value
if (
filterType !== "keyword" ||
(filterType === "keyword" && !filterValue)
)
continue;
for (let k = 0; k < filter.keys.length; k++) {
const key = filter.keys[k];
// Avoid if key not found in item
if (!item[key]) continue;
const value = item[key].replaceAll("_", " ").toLowerCase();
// Avoid non-primitive value
if (typeof value !== "string" && typeof value !== "number") continue;
// Check if value contains filter value
if (
value &&
value
.toString()
.toLowerCase()
.includes(filter.value.replaceAll("_", " ").toLowerCase())
) {
atLeastOneMatch = true;
break;
}
value &&
value
.toString()
.toLowerCase()
.includes(filter.value.replaceAll("_", " ").toLowerCase())
) {
return true;
}
}
}
return atLeastOneMatch;
return false;
}
function isMatchingSelect(filters, items) {
let atLeastOneMatch = false;
for (let i = 0; i < items.length; i++) {
const item = items[i];
for (let j = 0; j < filters.length; j++) {
const filter = filters[j];
// Avoid filter cases
const filterValue = filter.value;
const filterType = filter.type;
if (
filterType !== "select" ||
(filterType === "select" && filterValue === "all")
)
continue;
for (let k = 0; k < filter.keys.length; k++) {
const key = filter.keys[k];
// Avoid if key not found in item
if (!item[key]) continue;
const value = item[key];
// Avoid non-primitive value
if (typeof value !== "string" && typeof value !== "number") continue;
// Value need to match exactly filter value
if (value.toString().toLowerCase() === filterValue.toLowerCase()) {
atLeastOneMatch = true;
break;
}
function isItemSelect(filters, item) {
for (let j = 0; j < filters.length; j++) {
const filter = filters[j];
// Avoid filter cases
const filterValue = filter.value;
const filterType = filter.type;
if (
filterType !== "select" ||
(filterType === "select" && filterValue === "all")
)
continue;
for (let k = 0; k < filter.keys.length; k++) {
const key = filter.keys[k];
// Avoid if key not found in item
if (!item[key]) continue;
const value = item[key];
// Avoid non-primitive value
if (typeof value !== "string" && typeof value !== "number") continue;
// Value need to match exactly filter value
if (value.toString().toLowerCase() === filterValue.toLowerCase()) {
return true;
}
}
}
return atLeastOneMatch;
return false;
}
useFilterSettings(data, filters);
//useFilter(data, filtersPlugin);
const setting = [data[0]["settings"]["USE_CLIENT_CACHE"]];
useFilter(setting, filtersSettings);