Change the way the showcase JS works.

- Put the images in a language folder ("en", "fr"), which will make it
  easier to add orther languages later on.
- Resize the images to fit the already existing ones.
- Add a `display_showcase` parameter to the
  `list_bills` and `home` views.
This commit is contained in:
Alexis Métaireau 2023-11-23 19:36:39 +01:00
parent ff4b6534d5
commit df7eb6b253
32 changed files with 146 additions and 175 deletions

View file

@ -46,3 +46,4 @@ SUPPORTED_LANGUAGES = [
"uk", "uk",
"zh_Hans", "zh_Hans",
] ]
SHOWCASE_LANGUAGES = ["en", "fr"]

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

View file

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 108 KiB

View file

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 79 KiB

View file

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 77 KiB

View file

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

View file

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 84 KiB

View file

Before

Width:  |  Height:  |  Size: 114 KiB

After

Width:  |  Height:  |  Size: 114 KiB

View file

Before

Width:  |  Height:  |  Size: 89 KiB

After

Width:  |  Height:  |  Size: 89 KiB

View file

Before

Width:  |  Height:  |  Size: 92 KiB

After

Width:  |  Height:  |  Size: 92 KiB

View file

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

View file

@ -1,106 +1,91 @@
{% extends "layout.html" %} {% extends "layout.html" %}
{% block body %} {% block body %}
<header id="header" class="row"> <header id="header" class="row">
<div class="col-xs-12 col-sm-5 offset-md-2"> <div class="col-xs-12 col-sm-5 offset-md-2">
<h2>{{ _("Manage your shared <br />expenses, easily") }}</h2> <h2>
{% if is_demo_project_activated %} {{ _("Manage your shared <br />expenses, easily") }}
<a href="{{ url_for('.demo') }}" class="tryout btn"> </h2>
{{ _("Try out the demo") }} {% if is_demo_project_activated %}
</a> <a href="{{ url_for(".demo") }}" class="tryout btn">{{ _("Try out the demo") }}</a>
{% endif %} {% endif %}
{% if g.lang == 'fr' %} {% if g.lang == 'fr' or g.lang == 'en' %}
ou {{ _("or") }}
<span class="side-to-side"> <span class="side-to-side">
<a class="showcase btn" onclick="javascript:showGallery(); return false;">Voir la BD explicative</a> <a class="showcase btn"
<img class="showcaseimg" src="{{ url_for("static", filename='images/indicate.svg') }}" /> onclick="javascript:showGallery(); return false;">{{ _("See the explicative comics") }}</a>
<img class="showcaseimg"
src="{{ url_for("static", filename='images/indicate.svg') }}" />
</span> </span>
{% else %} {% endif %}
--
<span class="side-to-side">
<a class="showcase btn" onclick="javascript:showGallery_en(); return false;">See the explicative comics</a>
<img class="showcaseimg" src="{{ url_for("static", filename='images/indicate.svg') }}" />
</span>
{% endif %}
</div>
<div class="col-xs-12 col-sm-4">
<table class="additional-content"><tr>
<td>
{{ _("You're sharing a house?") }}<br />
{{ _("Going on holidays with friends?") }}<br />
{{ _("Simply sharing money with others?") }} <br />
<strong>{{ _("We can help!") }}</strong>
</td>
<td>
<img class="shareimg" src="{{ url_for("static", filename='images/share.svg') }}" />
</td>
</tr></table>
</div>
</header>
<main class="row home">
<div class="card-deck ml-auto mr-auto">
<div class="card">
<div class="card-header">
{{ _("Log in to an existing project") }}
</div>
<div class="card-body">
<form
id="authentication-form"
class="form-horizontal"
action="{{ url_for('.authenticate') }}"
method="post">
<fieldset class="form-group">
<legend></legend>
{{ forms.authenticate(auth_form, home=True) }}
</fieldset>
<div class="controls">
<button class="btn btn-primary btn-block" type="submit">
{{ _("Log in") }}
</button>
<a
class="password-reminder btn btn-link"
href="{{ url_for('.remind_password') }}"
>{{ _("can't remember your password?") }}</a
>
</div>
</form>
</div>
</div> </div>
<div class="card"> <div class="col-xs-12 col-sm-4">
<div class="card-header"> <table class="additional-content">
{{ _("Create a new project") }} <tr>
</div> <td>
<div class="card-body"> {{ _("You're sharing a house?") }}
{% if is_public_project_creation_allowed %} <br />
<form {{ _("Going on holidays with friends?") }}
id="creation-form" <br />
class="form-horizontal" {{ _("Simply sharing money with others?") }}
action="{{ url_for('.create_project') }}" <br />
method="post" <strong>{{ _("We can help!") }}</strong>
> </td>
<td>
<img class="shareimg"
src="{{ url_for("static", filename='images/share.svg') }}" />
</td>
</tr>
</table>
</div>
</header>
<main class="row home">
<div class="card-deck ml-auto mr-auto">
<div class="card">
<div class="card-header">{{ _("Log in to an existing project") }}</div>
<div class="card-body">
<form id="authentication-form"
class="form-horizontal"
action="{{ url_for(".authenticate") }}"
method="post">
<fieldset class="form-group"> <fieldset class="form-group">
{{ forms.create_project(project_form, home=True) }} <legend></legend>
{{ forms.authenticate(auth_form, home=True) }}
</fieldset> </fieldset>
<div class="controls"> <div class="controls">
<button class="btn btn-primary btn-block" type="submit"> <button class="btn btn-primary btn-block" type="submit">{{ _("Log in") }}</button>
{{ _("Create") }} <a class="password-reminder btn btn-link"
</button> href="{{ url_for(".remind_password") }}">{{ _("can't remember your password?") }}</a>
</div> </div>
</form>
</div>
</div>
<div class="card">
<div class="card-header">{{ _("Create a new project") }}</div>
<div class="card-body">
{% if is_public_project_creation_allowed %}
<form id="creation-form"
class="form-horizontal"
action="{{ url_for(".create_project") }}"
method="post">
<fieldset class="form-group">
{{ forms.create_project(project_form, home=True) }}
</fieldset>
<div class="controls">
<button class="btn btn-primary btn-block" type="submit">{{ _("Create") }}</button>
</div>
</form> </form>
{% else %} {% else %}
<a href="{{ url_for('.create_project') }}"> <a href="{{ url_for(".create_project") }}">{{ _("Create a new project") }}</a>
{{ _("Create a new project") }} {% endif %}
</a> </div>
{% endif %}
</div> </div>
</div> </div>
</div> </main>
</main>
{% endblock %} {% endblock %}
{% block js %} {% block js %}
$('#creation-form #password').tooltip({ $('#creation-form #password').tooltip({
title: "{{ _("Don\\'t reuse a personal password. Choose a private code and send it to your friends") }}", title: "{{ _("Don\\'t reuse a personal password. Choose a private code and send it to your friends") }}",
trigger: 'focus', trigger: 'focus',
placement: 'right' placement: 'right'
}); });
{% endblock %} {% endblock %}

View file

@ -46,7 +46,7 @@
</script> </script>
</head> </head>
<body class="d-flex flex-column h-100"> <body class="d-flex flex-column h-100">
{% if g.lang == 'fr' %}{% include "showcase.html" %}{% endif %} {% if display_showcase %}{% include "showcase.html" %}{% endif %}
<nav class="navbar navbar-expand-lg fixed-top navbar-dark bg-dark"> <nav class="navbar navbar-expand-lg fixed-top navbar-dark bg-dark">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarToggler" aria-controls="navbarToggler" aria-expanded="false" aria-label="Toggle navigation"> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarToggler" aria-controls="navbarToggler" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>

View file

@ -1,93 +1,75 @@
<div id="pswp" class="hiddenpswp" tabindex="-1" role="dialog" aria-hidden="true"> <div id="pswp"
<div class="pswp__bg"></div> class="hiddenpswp"
<div class="pswp__scroll-wrap"> tabindex="-1"
<div class="pswp__container"> role="dialog"
<div class="pswp__item"></div> aria-hidden="true">
<div class="pswp__item"></div> <div class="pswp__bg"></div>
<div class="pswp__item"></div> <div class="pswp__scroll-wrap">
</div> <div class="pswp__container">
<div class="pswp__ui pswp__ui--hidden"> <div class="pswp__item"></div>
<div class="pswp__top-bar"> <div class="pswp__item"></div>
<div class="pswp__counter"></div> <div class="pswp__item"></div>
<button class="pswp__button pswp__button--close" title="Fermer (Esc)"></button>
<div class="pswp__preloader">
<div class="pswp__preloader__icn">
<div class="pswp__preloader__cut">
<div class="pswp__preloader__donut"></div>
</div>
</div>
</div>
</div>
<button class="pswp__button pswp__button--arrow--left" title="Suivant (flèche droite)">
</button>
<button class="pswp__button pswp__button--arrow--right" title="Précédent (flèche gauche)">
</button>
<div class="pswp__caption">
<div class="pswp__caption__center"></div>
</div>
</div>
</div> </div>
<div class="pswp__ui pswp__ui--hidden">
<div class="pswp__top-bar">
<div class="pswp__counter"></div>
<button class="pswp__button pswp__button--close" title="Fermer (Esc)"></button>
<div class="pswp__preloader">
<div class="pswp__preloader__icn">
<div class="pswp__preloader__cut">
<div class="pswp__preloader__donut"></div>
</div>
</div>
</div>
</div>
<button class="pswp__button pswp__button--arrow--left"
title="Suivant (flèche droite)"></button>
<button class="pswp__button pswp__button--arrow--right"
title="Précédent (flèche gauche)"></button>
<div class="pswp__caption">
<div class="pswp__caption__center"></div>
</div>
</div>
</div>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var pswpElement = document.getElementById('pswp'); var pswpElement = document.getElementById("pswp");
var items = JSON.parse('[{"h": 2450, "src": "{{ url_for("static", filename="showcase/1.webp") }}", "w": 2450}, {"h": 2509, "src": "{{ url_for("static", filename="showcase/2.webp") }}", "w": 2221}, {"h": 2536, "src": "{{ url_for("static", filename="showcase/3.webp") }}", "w": 2101}, {"h": 2722, "src": "{{ url_for("static", filename="showcase/4.webp") }}", "w": 2348}, {"h": 2745, "src": "{{ url_for("static", filename="showcase/5.webp") }}", "w": 1804}, {"h": 3307, "src": "{{ url_for("static", filename="showcase/6.webp") }}", "w": 2897}, {"h": 2321, "src": "{{ url_for("static", filename="showcase/7.webp") }}", "w": 2239}, {"h": 2470, "src": "{{ url_for("static", filename="showcase/8.webp") }}", "w": 2419}, {"h": 3307, "src": "{{ url_for("static", filename="showcase/9.webp") }}", "w": 2602}]');
var items_en = JSON.parse('[{"h": 2450, "src": "{{ url_for("static", filename="showcase_en/1.webp") }}", "w": 2450}, {"h": 2509, "src": "{{ url_for("static", filename="showcase_en/2.webp") }}", "w": 2221}, {"h": 2536, "src": "{{ url_for("static", filename="showcase_en/3.webp") }}", "w": 2101}, {"h": 2722, "src": "{{ url_for("static", filename="showcase_en/4.webp") }}", "w": 2348}, {"h": 2745, "src": "{{ url_for("static", filename="showcase_en/5.webp") }}", "w": 1804}, {"h": 3307, "src": "{{ url_for("static", filename="showcase_en/6.webp") }}", "w": 2897}, {"h": 2321, "src": "{{ url_for("static", filename="showcase_en/7.webp") }}", "w": 2239}, {"h": 2470, "src": "{{ url_for("static", filename="showcase_en/8.webp") }}", "w": 2419}, {"h": 3307, "src": "{{ url_for("static", filename="showcase_en/9.webp") }}", "w": 2602}]');
var options = { var options = {
index: 0, index: 0,
loop: false, loop: false,
}; };
function showGallery(){ function showGallery(){
let items = [
{"h": 2450, "src": "{{ url_for('static', filename='showcase/' + g.lang + '/1.webp') }}", "w": 2450},
{"h": 2509, "src": "{{ url_for('static', filename='showcase/' + g.lang + '/2.webp') }}", "w": 2221},
{"h": 2536, "src": "{{ url_for('static', filename='showcase/' + g.lang + '/3.webp') }}", "w": 2101},
{"h": 2722, "src": "{{ url_for('static', filename='showcase/' + g.lang + '/4.webp') }}", "w": 2348},
{"h": 2745, "src": "{{ url_for('static', filename='showcase/' + g.lang + '/5.webp') }}", "w": 1804},
{"h": 3307, "src": "{{ url_for('static', filename='showcase/' + g.lang + '/6.webp') }}", "w": 2897},
{"h": 2321, "src": "{{ url_for('static', filename='showcase/' + g.lang + '/7.webp') }}", "w": 2239},
{"h": 2470, "src": "{{ url_for('static', filename='showcase/' + g.lang + '/8.webp') }}", "w": 2419},
{"h": 3307, "src": "{{ url_for('static', filename='showcase/' + g.lang + '/9.webp') }}", "w": 2602}
];
/* the CSS and JS for photoswipe is loaded dynamically // CSS and JS are loaded dynamically when the gallery opens
* so that they are not loaded if the gallery is not open */ $('head').append('<link rel="stylesheet" type="text/css" href="{{ url_for("static", filename="photoswipe/default-skin/default-skin.css") }}">');
$('head').append('<link rel="stylesheet" type="text/css" href="{{ url_for("static", filename="photoswipe/photoswipe.css") }}">');
$('head').append('<link rel="stylesheet" type="text/css" href="{{ url_for("static", filename="photoswipe/default-skin/default-skin.css") }}">'); var script = document.createElement("script");
$('head').append('<link rel="stylesheet" type="text/css" href="{{ url_for("static", filename="photoswipe/photoswipe.css") }}">'); script.type = "text/javascript";
script.src = "{{ url_for('static', filename='photoswipe/photoswipe.min.js')}}";
var script = document.createElement("script"); script.onload = function(){
script.type = "text/javascript"; var script2 = document.createElement("script");
script.src = "{{ url_for('static', filename='photoswipe/photoswipe.min.js')}}"; script2.type = "text/javascript";
script.onload = function(){ script2.src = "{{ url_for('static', filename='photoswipe/photoswipe-ui-default.min.js')}}";
var script2 = document.createElement("script"); script2.onload = function(){
script2.type = "text/javascript"; pswpElement.className="pswp";
script2.src = "{{ url_for('static', filename='photoswipe/photoswipe-ui-default.min.js')}}"; var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);
script2.onload = function(){ gallery.init();
pswpElement.className="pswp"; };
var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items_en, options); document.body.appendChild(script2);
gallery.init();
};
document.body.appendChild(script2);
};
document.body.appendChild(script);
}
function showGallery_en(){
/* the CSS and JS for photoswipe is loaded dynamically
* so that they are not loaded if the gallery is not open */
$('head').append('<link rel="stylesheet" type="text/css" href="{{ url_for("static", filename="photoswipe/default-skin/default-skin.css") }}">');
$('head').append('<link rel="stylesheet" type="text/css" href="{{ url_for("static", filename="photoswipe/photoswipe.css") }}">');
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "{{ url_for('static', filename='photoswipe/photoswipe.min.js')}}";
script.onload = function(){
var script2 = document.createElement("script");
script2.type = "text/javascript";
script2.src = "{{ url_for('static', filename='photoswipe/photoswipe-ui-default.min.js')}}";
script2.onload = function(){
pswpElement.className="pswp";
var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, options);
gallery.init();
}; };
document.body.appendChild(script2); document.body.appendChild(script);
};
document.body.appendChild(script);
} }
</script> </script>

View file

@ -8,12 +8,14 @@ Basically, this blueprint takes care of the authentication and provides
some shortcuts to make your life better when coding (see `pull_project` some shortcuts to make your life better when coding (see `pull_project`
and `add_project_id` for a quick overview) and `add_project_id` for a quick overview)
""" """
from functools import wraps
import hashlib import hashlib
import json import json
import os import os
from functools import wraps
from urllib.parse import urlparse, urlunparse from urllib.parse import urlparse, urlunparse
import qrcode
import qrcode.image.svg
from flask import ( from flask import (
Blueprint, Blueprint,
Response, Response,
@ -32,8 +34,6 @@ from flask import (
) )
from flask_babel import gettext as _ from flask_babel import gettext as _
from flask_mail import Message from flask_mail import Message
import qrcode
import qrcode.image.svg
from sqlalchemy_continuum import Operation from sqlalchemy_continuum import Operation
from werkzeug.exceptions import NotFound from werkzeug.exceptions import NotFound
from werkzeug.security import check_password_hash from werkzeug.security import check_password_hash
@ -295,12 +295,14 @@ def home():
is_public_project_creation_allowed = current_app.config[ is_public_project_creation_allowed = current_app.config[
"ALLOW_PUBLIC_PROJECT_CREATION" "ALLOW_PUBLIC_PROJECT_CREATION"
] ]
display_showcase = g.lang in current_app.config["SHOWCASE_LANGUAGES"]
return render_template( return render_template(
"home.html", "home.html",
project_form=project_form, project_form=project_form,
is_demo_project_activated=is_demo_project_activated, is_demo_project_activated=is_demo_project_activated,
is_public_project_creation_allowed=is_public_project_creation_allowed, is_public_project_creation_allowed=is_public_project_creation_allowed,
display_showcase=display_showcase,
auth_form=auth_form, auth_form=auth_form,
session=session, session=session,
) )
@ -676,6 +678,7 @@ def list_bills():
csrf_form=csrf_form, csrf_form=csrf_form,
add_bill=request.values.get("add_bill", False), add_bill=request.values.get("add_bill", False),
current_view="list_bills", current_view="list_bills",
display_showcase=g.lang in current_app.config["SHOWCASE_LANGUAGES"],
) )