support search on contact page

This commit is contained in:
Son Nguyen Kim 2021-07-14 18:57:25 +02:00
parent ac1f56f206
commit 55dcd63654
2 changed files with 65 additions and 12 deletions

View File

@ -51,19 +51,47 @@
</p>
</div>
</div>
</div>
<form method="post">
<input type="hidden" name="form-name" value="create">
{{ new_contact_form.csrf_token }}
<div class="row mb-5">
<div class="col-12 col-lg-6 pt-1">
<label class="form-label">Where do you want to send the email?</label>
<form method="post">
<input type="hidden" name="form-name" value="create">
{{ new_contact_form.csrf_token }}
{{ new_contact_form.email(class="form-control", placeholder="First Last <email@example.com>", autofocus=True) }}
{{ render_field_errors(new_contact_form.email) }}
<div class="small-text">
Where do you want to send the email?
</div>
<button class="btn btn-primary mt-2">Create reverse-alias</button>
</form>
</div>
{{ new_contact_form.email(class="form-control", placeholder="First Last <email@example.com>", autofocus=True) }}
{{ render_field_errors(new_contact_form.email) }}
<button class="btn btn-primary mt-2">Create reverse-alias</button>
</form>
<div class="col-12 col-lg-6 pt-1">
<div class="float-right d-flex">
<form method="post">
<input type="hidden" name="form-name" value="search">
<input type="search" name="query" value="{{ query }}"
placeholder="Enter to search for contacts"
class="form-control shadow mr-2"
style="max-width: 20em"
>
</form>
{% if query %}
{% if highlight_contact_id %}
<a href="{{ url_for("dashboard.alias_contact_manager", alias_id=alias.id, highlight_contact_id=highlight_contact_id) }}"
class="btn btn-light">Reset</a>
{% else %}
<a href="{{ url_for("dashboard.alias_contact_manager", alias_id=alias.id) }}"
class="btn btn-light">Reset</a>
{% endif %}
{% endif %}
</div>
</div>
</div>
<div class="row">
{% for contact_info in contact_infos %}

View File

@ -60,7 +60,9 @@ class ContactInfo(object):
latest_email_log: EmailLog
def get_contact_infos(alias: Alias, page=0, contact_id=None) -> [ContactInfo]:
def get_contact_infos(
alias: Alias, page=0, contact_id=None, query: str = ""
) -> [ContactInfo]:
"""if contact_id is set, only return the contact info for this contact"""
sub = (
db.session.query(
@ -115,6 +117,14 @@ def get_contact_infos(alias: Alias, page=0, contact_id=None) -> [ContactInfo]:
)
)
if query:
q = q.filter(
or_(
Contact.website_email.ilike(f"%{query}%"),
Contact.name.ilike(f"%{query}%"),
)
)
if contact_id:
q = q.filter(Contact.id == contact_id)
@ -153,6 +163,8 @@ def alias_contact_manager(alias_id):
if request.args.get("page"):
page = int(request.args.get("page"))
query = request.args.get("query") or ""
# sanity check
if not alias:
flash("You do not have access to this page", "warning")
@ -248,7 +260,18 @@ def alias_contact_manager(alias_id):
url_for("dashboard.alias_contact_manager", alias_id=alias_id)
)
contact_infos = get_contact_infos(alias, page)
elif request.form.get("form-name") == "search":
query = request.form.get("query")
return redirect(
url_for(
"dashboard.alias_contact_manager",
alias_id=alias_id,
query=query,
highlight_contact_id=highlight_contact_id,
)
)
contact_infos = get_contact_infos(alias, page, query=query)
last_page = len(contact_infos) < PAGE_LIMIT
# if highlighted contact isn't included, fetch it
@ -256,7 +279,8 @@ def alias_contact_manager(alias_id):
contact_ids = [contact_info.contact.id for contact_info in contact_infos]
if highlight_contact_id and highlight_contact_id not in contact_ids:
contact_infos = (
get_contact_infos(alias, contact_id=highlight_contact_id) + contact_infos
get_contact_infos(alias, contact_id=highlight_contact_id, query=query)
+ contact_infos
)
return render_template(
@ -267,4 +291,5 @@ def alias_contact_manager(alias_id):
highlight_contact_id=highlight_contact_id,
page=page,
last_page=last_page,
query=query,
)