From 618039ea18b688f4bce13157917c11862cc18560 Mon Sep 17 00:00:00 2001
From: Charan Girijala <82193104+charangirijala@users.noreply.github.com>
Date: Sat, 11 Jan 2025 17:09:28 +0530
Subject: [PATCH] =?UTF-8?q?Filters=20logic=20implemented=20=F0=9F=9A=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/modules/main/logViewer/logViewer.css | 3 ++
src/modules/main/logViewer/logViewer.html | 23 +++++++---
src/modules/main/logViewer/logViewer.js | 44 +++++++++++++++---
src/modules/services/filters/filters.js | 36 +++++++++++++++
.../filValueInputCombobox.js | 13 ++++--
src/modules/ui/helpText/helpText.css | 45 +++++++++++++++++++
src/modules/ui/helpText/helpText.html | 22 +++++++++
src/modules/ui/helpText/helpText.js | 5 +++
8 files changed, 173 insertions(+), 18 deletions(-)
create mode 100644 src/modules/ui/helpText/helpText.css
create mode 100644 src/modules/ui/helpText/helpText.html
create mode 100644 src/modules/ui/helpText/helpText.js
diff --git a/src/modules/main/logViewer/logViewer.css b/src/modules/main/logViewer/logViewer.css
index 016dec9..2bf4495 100644
--- a/src/modules/main/logViewer/logViewer.css
+++ b/src/modules/main/logViewer/logViewer.css
@@ -13,6 +13,9 @@ a {
color: #ba0517;
}
+.filter-help {
+ align-items: center;
+}
.log-errors-no-err-text {
color: #396547;
}
diff --git a/src/modules/main/logViewer/logViewer.html b/src/modules/main/logViewer/logViewer.html
index b851dfb..896f629 100644
--- a/src/modules/main/logViewer/logViewer.html
+++ b/src/modules/main/logViewer/logViewer.html
@@ -411,14 +411,23 @@
-
- Matching
- all
- these
- filters
-
+
+ Matching
+ all
+ these
+ filters
+
+
+
+
+
diff --git a/src/modules/main/logViewer/logViewer.js b/src/modules/main/logViewer/logViewer.js
index 21f0a20..69b17e7 100644
--- a/src/modules/main/logViewer/logViewer.js
+++ b/src/modules/main/logViewer/logViewer.js
@@ -1,5 +1,6 @@
/* eslint-disable inclusive-language/use-inclusive-words */
import { LightningElement, track } from 'lwc';
+import filterData from 'services/filters';
import { publish, subscribe } from 'services/pubsub';
export default class logViewer extends LightningElement {
@@ -50,6 +51,7 @@ export default class logViewer extends LightningElement {
pageNumber = 0;
linesPerPage = 100;
@track displayedData = [];
+ dataInUse = [];
fileData = [];
// @wire(MessageContext)
// messageContext;
@@ -60,9 +62,10 @@ export default class logViewer extends LightningElement {
if (data) {
if (data.fileData) {
this.fileData = data.fileData;
+ this.dataInUse = data.fileData;
this.pageNumber = 1;
this.noOfPages = Math.ceil(
- this.fileData.length / this.linesPerPage
+ this.dataInUse.length / this.linesPerPage
);
this.calculations();
}
@@ -184,15 +187,23 @@ export default class logViewer extends LightningElement {
this.linesPerPage = input;
this.pageNumber = 1;
this.noOfPages = Math.ceil(
- this.fileData.length / this.linesPerPage
+ this.dataInUse.length / this.linesPerPage
);
this.calculations();
}
}
-
+ refreshPages() {
+ this.noOfPages = Math.ceil(this.dataInUse.length / this.linesPerPage);
+ this.pageNumber = this.noOfPages === 0 ? 0 : 1;
+ this.calculations();
+ }
calculations() {
+ if (this.dataInUse.length === 0) {
+ this.displayedData = [];
+ return;
+ }
if (this.pageNumber !== 0) {
- this.displayedData = this.fileData.slice(
+ this.displayedData = this.dataInUse.slice(
this.linesPerPage * (this.pageNumber - 1),
this.linesPerPage * this.pageNumber
);
@@ -235,7 +246,7 @@ export default class logViewer extends LightningElement {
this.previousFilters = JSON.parse(
JSON.stringify(this.activeFilters)
);
- console.log('openFilter called: ', this.previousFilters);
+ // console.log('openFilter called: ', this.previousFilters);
this.filterClass =
'slds-panel slds-size_medium slds-panel_docked slds-panel_docked-right slds-panel_drawer filter-panel slds-is-open';
}
@@ -252,7 +263,7 @@ export default class logViewer extends LightningElement {
const filterIndex = event.target.dataset.filterid;
this.isFilterPopOverShowing = false;
let idx = 0;
- console.log('[LogPreviewer.js] removeFilter called', filterIndex);
+ // console.log('[LogPreviewer.js] removeFilter called', filterIndex);
if (filterIndex >= 0) {
// only splice array when item is found
this.activeFilters.splice(filterIndex, 1); // 2nd parameter means remove one item only
@@ -262,6 +273,8 @@ export default class logViewer extends LightningElement {
});
this.currentEditFilterIdx = null;
this.previousFilters = JSON.parse(JSON.stringify(this.activeFilters));
+ this.dataInUse = filterData(this.activeFilters, this.fileData);
+ this.refreshPages();
}
addFilter() {
@@ -302,12 +315,14 @@ export default class logViewer extends LightningElement {
this.handlePopoverClose();
this.activeFilters = [];
this.previousFilters = [];
+ this.dataInUse = this.fileData;
+ this.refreshPages();
}
cancelFilterEdit() {
this.isFilterEditing = false;
this.isFilterPopOverShowing = false;
- console.log('prev filters: ', this.previousFilters);
+ // console.log('prev filters: ', this.previousFilters);
if (this.previousFilters === null) {
this.activeFilters = [];
} else {
@@ -352,6 +367,21 @@ export default class logViewer extends LightningElement {
});
this.previousFilters = JSON.parse(JSON.stringify(this.activeFilters));
+
+ //call filterData from filters
+ if (
+ this.activeFilters.length > 0 &&
+ this.fileData.length > 0 &&
+ this.fileData !== undefined &&
+ this.fileData !== null
+ ) {
+ this.dataInUse = filterData(this.activeFilters, this.fileData);
+ // console.log('filtered data: ', this.dataInUse);
+ this.refreshPages();
+ } else {
+ this.dataInUse = this.fileData;
+ this.refreshPages();
+ }
}
closeFilterPopoverOnClick(event) {
diff --git a/src/modules/services/filters/filters.js b/src/modules/services/filters/filters.js
index e69de29..67b8ba0 100644
--- a/src/modules/services/filters/filters.js
+++ b/src/modules/services/filters/filters.js
@@ -0,0 +1,36 @@
+export default function filterData(filters, fileData) {
+ //condtion check for active filters
+ const activeFilters = filters.filter((filter) => filter.isActive);
+ // console.log('filters: ', activeFilters, 'fileData: ', fileData);
+ return fileData.filter((record) => {
+ return activeFilters.every(
+ ({ field, operator, value, filterValues }) => {
+ const fieldValue = record[field];
+ switch (operator) {
+ case 'equals':
+ if (
+ Array.isArray(filterValues) &&
+ filterValues.length > 0
+ ) {
+ return value.includes(fieldValue);
+ } else {
+ return fieldValue === value;
+ }
+ case 'notEqualTo':
+ if (
+ Array.isArray(filterValues) &&
+ filterValues.length > 0
+ ) {
+ return !value.includes(fieldValue);
+ } else {
+ return fieldValue !== value;
+ }
+ case 'contains':
+ return fieldValue.includes(value);
+ default:
+ return true;
+ }
+ }
+ );
+ });
+}
diff --git a/src/modules/ui/filValueInputCombobox/filValueInputCombobox.js b/src/modules/ui/filValueInputCombobox/filValueInputCombobox.js
index 9485037..d124e0a 100644
--- a/src/modules/ui/filValueInputCombobox/filValueInputCombobox.js
+++ b/src/modules/ui/filValueInputCombobox/filValueInputCombobox.js
@@ -140,13 +140,18 @@ export default class FilValueInputCombobox extends LightningElement {
// Gather all values already used in 'event' filters
const usedValues = new Set(
this.activeFilters
- .filter((filter) => filter.field === 'event') // Only consider 'event' filters
+ .filter(
+ (filter, idx) =>
+ filter.field === 'event' &&
+ idx !== this.currentFilterIdx
+ ) // Only consider 'event' filters
.flatMap((filter) => filter.filterValues || [])
);
-
// Return pickListValues excluding the used ones
return this.pickListValues.filter(
- (option) => !usedValues.has(option.value)
+ (option) =>
+ !usedValues.has(option.value) ||
+ this.checkEventSelected(option.value)
);
}
generateOptions() {
@@ -169,7 +174,7 @@ export default class FilValueInputCombobox extends LightningElement {
}
];
}
- // console.log('picklistVals ops generated', this.options);
+ // console.log('picklistVals ops generated', this.options);
}
checkEventSelected(event) {
if (this.selectedEvents.length === 0) return false;
diff --git a/src/modules/ui/helpText/helpText.css b/src/modules/ui/helpText/helpText.css
new file mode 100644
index 0000000..2d84898
--- /dev/null
+++ b/src/modules/ui/helpText/helpText.css
@@ -0,0 +1,45 @@
+.help-text-container {
+ position: relative;
+ display: inline-block;
+}
+
+.help-text-icon {
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 14px;
+ font-weight: bold;
+ cursor: pointer;
+ user-select: none;
+}
+
+/* Tooltip container */
+.help-text-content {
+ position: absolute;
+ bottom: 100%;
+ left: 50%;
+ font-size: 0.75rem;
+ color: white;
+ transform: translateX(-50%);
+ background-color: #032d60;
+ border: none;
+ border-radius: 5px;
+ padding: 0.5rem 0.75rem;
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
+ white-space: normal; /* Allow wrapping */
+ width: 200px;
+ max-width: 200px; /* Limit the width of the tooltip */
+ visibility: hidden; /* Initially hidden */
+ opacity: 0; /* Fully transparent */
+ transition: opacity 0.2s ease-in-out;
+ z-index: 1000;
+ overflow-wrap: anywhere; /* Prevent overflow for very long words */
+ text-align: left;
+}
+
+/* Show tooltip on hover */
+.help-text-container:hover .help-text-content {
+ visibility: visible;
+ opacity: 1; /* Fully visible */
+}
diff --git a/src/modules/ui/helpText/helpText.html b/src/modules/ui/helpText/helpText.html
new file mode 100644
index 0000000..d88cc2c
--- /dev/null
+++ b/src/modules/ui/helpText/helpText.html
@@ -0,0 +1,22 @@
+
+
+
diff --git a/src/modules/ui/helpText/helpText.js b/src/modules/ui/helpText/helpText.js
new file mode 100644
index 0000000..7f6b099
--- /dev/null
+++ b/src/modules/ui/helpText/helpText.js
@@ -0,0 +1,5 @@
+import { LightningElement, api } from 'lwc';
+
+export default class HelpText extends LightningElement {
+ @api content; // Text for the help tooltip
+}