From b52063932cfb4a2fa939aaa9ca65e1f3fd01ebf5 Mon Sep 17 00:00:00 2001 From: Arkadii Yakovets Date: Sat, 21 Sep 2024 08:32:36 -0700 Subject: [PATCH] Fix dynamic tooltips behavior --- backend/apps/owasp/api/search/project.py | 2 +- backend/apps/owasp/index/project.py | 2 -- backend/apps/owasp/models/mixins/project.py | 5 ---- .../apps/owasp/templates/search/issue.html | 20 ++++++++++--- .../apps/owasp/templates/search/project.html | 28 +++++++++++++------ backend/apps/slack/commands/projects.py | 4 +-- 6 files changed, 39 insertions(+), 22 deletions(-) diff --git a/backend/apps/owasp/api/search/project.py b/backend/apps/owasp/api/search/project.py index 815219261..ba7054371 100644 --- a/backend/apps/owasp/api/search/project.py +++ b/backend/apps/owasp/api/search/project.py @@ -13,7 +13,6 @@ def get_projects(query, attributes=None, limit=25): "attributesToRetrieve": attributes or [ "idx_contributors_count", - "idx_created_at", "idx_forks_count", "idx_leaders", "idx_level", @@ -22,6 +21,7 @@ def get_projects(query, attributes=None, limit=25): "idx_summary", "idx_topics", "idx_type", + "idx_updated_at", "idx_url", ], "hitsPerPage": limit, diff --git a/backend/apps/owasp/index/project.py b/backend/apps/owasp/index/project.py index 93fe594c3..0be2271cb 100644 --- a/backend/apps/owasp/index/project.py +++ b/backend/apps/owasp/index/project.py @@ -15,7 +15,6 @@ class ProjectIndex(AlgoliaIndex): fields = ( "idx_companies", "idx_contributors_count", - "idx_created_at", "idx_description", "idx_forks_count", "idx_languages", @@ -41,7 +40,6 @@ class ProjectIndex(AlgoliaIndex): "desc(idx_contributors_count)", "desc(idx_forks_count)", "desc(idx_updated_at)", - "desc(idx_create_at)", ], "ranking": [ "typo", diff --git a/backend/apps/owasp/models/mixins/project.py b/backend/apps/owasp/models/mixins/project.py index 24fa1c1be..c213b848a 100644 --- a/backend/apps/owasp/models/mixins/project.py +++ b/backend/apps/owasp/models/mixins/project.py @@ -11,11 +11,6 @@ def idx_companies(self): """Return companies for indexing.""" return join_values(fields=(o.company for o in self.organizations.all())) - @property - def idx_created_at(self): - """Return created at for indexing.""" - return self.created_at - @property def idx_contributors_count(self): """Return contributors count for indexing.""" diff --git a/backend/apps/owasp/templates/search/issue.html b/backend/apps/owasp/templates/search/issue.html index 5872b56c1..ff8818823 100644 --- a/backend/apps/owasp/templates/search/issue.html +++ b/backend/apps/owasp/templates/search/issue.html @@ -179,6 +179,8 @@
How to tackle it
}, methods: { async getIssues() { + this.removeTooltips(); + const response = await fetch(`/api/v1/owasp/search/issue?q=${this.searchQuery}`) .then(res => res.json()) .then(json => { @@ -194,12 +196,22 @@
How to tackle it
this.issues = json; }) .catch(err => console.error("There was an error! ", err)); - this.reinitializeTooltips(); + + this.addTooltips(); + }, + addTooltips() { + const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); + tooltipTriggerList.forEach(function(tooltipTriggerEl) { + new bootstrap.Tooltip(tooltipTriggerEl); + }); }, - reinitializeTooltips() { + removeTooltips() { const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); - tooltipTriggerList.map(function(tooltipTriggerEl) { - return new bootstrap.Tooltip(tooltipTriggerEl); + tooltipTriggerList.forEach(function(tooltipTriggerEl) { + const tooltipInstance = bootstrap.Tooltip.getInstance(tooltipTriggerEl); + if (tooltipInstance) { + tooltipInstance.dispose(); + } }); }, showIssueDetails(issue) { diff --git a/backend/apps/owasp/templates/search/project.html b/backend/apps/owasp/templates/search/project.html index 5e9b489db..681f4e99d 100644 --- a/backend/apps/owasp/templates/search/project.html +++ b/backend/apps/owasp/templates/search/project.html @@ -34,12 +34,12 @@
-
${project.created_at} ago
+
${project.updated_at} ago
- +
}, methods: { async getProjects() { + this.removeTooltips(); + const response = await fetch(`/api/v1/owasp/search/project?q=${this.searchQuery}`) .then(res => res.json()) .then(json => { json.forEach(project => { - project.created_at = dayjs.unix(project.idx_created_at || '').fromNow(true); project.level = project.idx_level.charAt(0).toUpperCase() + project.idx_level.slice(1).toLowerCase(); project.summary = marked.parse(project.idx_summary || ''); project.topics = project.idx_topics ? project.idx_topics.sort(() => Math.random() - 0.5).slice(0, 20) : []; + project.updated_at = dayjs.unix(project.idx_updated_at || '').fromNow(true); }); this.projects = json; }) .catch(err => console.error("There was an error! ", err)); - this.reinitializeTooltips(); + + this.addTooltips(); + }, + addTooltips() { + const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); + tooltipTriggerList.forEach(function(tooltipTriggerEl) { + new bootstrap.Tooltip(tooltipTriggerEl); + }); }, - reinitializeTooltips() { + removeTooltips() { const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); - tooltipTriggerList.map(function(tooltipTriggerEl) { - return new bootstrap.Tooltip(tooltipTriggerEl); + tooltipTriggerList.forEach(function(tooltipTriggerEl) { + const tooltipInstance = bootstrap.Tooltip.getInstance(tooltipTriggerEl); + if (tooltipInstance) { + tooltipInstance.dispose(); + } }); }, showProjectDetails(project) { diff --git a/backend/apps/slack/commands/projects.py b/backend/apps/slack/commands/projects.py index 117f819da..d9f0a5deb 100644 --- a/backend/apps/slack/commands/projects.py +++ b/backend/apps/slack/commands/projects.py @@ -31,13 +31,13 @@ def handler(ack, command, client): attributes = [ "idx_contributors_count", - "idx_created_at", "idx_forks_count", "idx_leaders", "idx_level", "idx_name", "idx_stars_count", "idx_summary", + "idx_updated_at", "idx_url", ] if projects := get_projects(search_query, attributes=attributes, limit=10): @@ -79,7 +79,7 @@ def handler(ack, command, client): blocks.append( markdown( f"\n*{idx + 1}.* <{project['idx_url']}|*{name_truncated}*>\n" - f"_Created {natural_date(project['idx_created_at'])}" + f"_Updated {natural_date(project['idx_updated_at'])}" f"{stars_count}{forks_count}{contributors_count}_\n" f"_{project['idx_level'].capitalize()} project. " f"Leader{pluralize(len(leaders))}: {', '.join(leaders)}_\n"