Skip to content

Show "Last login" label next to the login method #622

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
4 changes: 2 additions & 2 deletions readthedocsext/theme/static/readthedocsext/theme/js/site.js

Large diffs are not rendered by default.

31 changes: 26 additions & 5 deletions readthedocsext/theme/templates/account/login.html
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@
</div>
</div>

<div class="ui small stackable teal centered fluid wrapping menu"
data-bind="semanticui: {tabs: {history: true, autoTabActivation: false}}">
<div class="ui small stackable teal centered fluid wrapping menu" data-bind="semanticui: {tabs: {
{% if last_login_tab %}autoTabActivation: '{{ last_login_tab }}'{% endif %}
}}">

<a class="item" data-tab="vcs">
<i class="fas fa-cloud icon"></i>
Expand All @@ -42,6 +43,7 @@

{# If allowed providers is given, disable the email menu item #}
<a class="{% if allowed_providers %}disabled{% endif %} item"
{% if last_login_tab == "email" %} data-tooltip="Last used" data-variation="teal visible" data-position="top center" {% endif %}
data-tab="email">
<i class="fas fa-envelope icon"></i>
{% block authentication_email_text %}
Expand All @@ -50,8 +52,7 @@
</a>

{% if USE_ORGANIZATIONS %}
<a class="item"
href="{% url "saml_resolve_login" %}{% if redirect_field_value %}?{{ redirect_field_name }}={{ redirect_field_value }}{% endif %}">
<a class="item" data-tab="sso">
<i class="fas fa-shield-alt icon"></i>
{% trans "Single sign-on" %}
</a>
Expand Down Expand Up @@ -100,14 +101,34 @@
<div class="ui stackable relaxed text menu">
<a class="item" href="{% url 'account_reset_password' %}">{% trans "Forgot your password?" %}</a>
<div class="right menu">
<button class="ui primary button" type="submit">{% trans "Log in" %}</button>
<button class="ui primary button"
data-bind="click: $root.save_login_method"
data-provider="email"
type="submit">{% trans "Log in" %}</button>
</div>
</div>

</form>
{% endblock authentication_email %}
</div>

{% if USE_ORGANIZATIONS %}
<div class="ui basic center aligned tab segment" data-tab="sso">
<a href="{% url "saml_resolve_login" %}{% if redirect_field_value %}?{{ redirect_field_name }}={{ redirect_field_value }}{% endif %}">

<button class="ui button"
data-bind="click: $root.save_login_method"
data-provider="sso"
type="submit"
{% if last_login_method == "sso" %} data-tooltip="Last used" data-variation="teal visible" data-position="right center" {% endif %}
title="Single sign-on">
<i class="fas fa-shield-alt icon" aria-hidden="true"></i>
{% trans "Log in using single sign-on" %}
</button>
</a>
</div>
{% endif %}

{% block authentication_extra %}
{% endblock authentication_extra %}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
{% trans "GitHub" as provider_name %}
<li class="item">
<a class="ui button"
{% if last_login_method == "github" or last_login_method == "githubapp" %} data-tooltip="Last used" data-variation="teal visible" data-position="right center" {% endif %}
data-bind="click: $root.show_modal('github-select')"
title="{{ provider_name }}">
<i class="fa-brands fa-github icon"></i>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,26 @@
action="{% provider_login_url provider.id process=process scope=scope auth_params=auth_params %}">
{% csrf_token %}

{# djlint: off #}
<button class="ui {{ button_classes }} button"
data-bind="click: $root.save_login_method"
data-provider="{{ provider.id }}"
type="submit"
title="{{ provider.name }}">
<i class="fa-brands fa-{{ provider.name|lower }} icon"></i>
{% blocktrans trimmed with provider_name=provider.app.name|default:provider.name verbiage=verbiage|default:'Connect to' %}
{{ verbiage }} {{ provider_name }}
{% endblocktrans %}
</button>

</form>
{% if last_login_method == provider.id|lower %}
data-tooltip="Last used"
data-variation="teal visible"
data-position="right center"
{% endif %}

title="{{ provider.name }}">
{# djlint: on #}

<i class="fa-brands fa-{{ provider.name|lower }} icon"></i>
{% blocktrans trimmed with provider_name=provider.app.name|default:provider.name verbiage=verbiage|default:'Connect to' %}
{{ verbiage }} {{ provider_name }}
{% endblocktrans %}
</button>

</form>
{% endif %}
36 changes: 36 additions & 0 deletions src/js/application/views.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,16 @@ export class ApplicationView {
if (found_modal.length === 0) {
console.debug("Modal not found:", selector);
}

// Remove "visible" variation property to remove "Last used" tooltip
const buttons = document.querySelectorAll("button.ui");
for (const button of buttons) {
if (button.dataset.variation) {
const variation = button.dataset.variation.split(" ");
variation.pop("visible");
button.dataset.variation = variation.join(" ");
}
}
};
}

Expand Down Expand Up @@ -94,4 +104,30 @@ export class ApplicationView {
}
return false;
}

/**
* Save the provider used for login.
*
* This could be used like:
*
* .. code:: html
*
* <form method="post" action="...">
* <button data-bind="click: $root.save_login_method">
* Log in using GitHub
* </button>
* </form>
*
* @param {Object} data - Context data
* @param {Event} event - Click event
* @returns {knockout_click}
*/
save_login_method(data, event) {
const elem = event.currentTarget;
if (window.isSecureContext) {
console.debug("Setting last login method: ", elem.dataset.provider);
cookieStore.set("last-login-method", elem.dataset.provider);
}
return true;
}
}