Commit Graph

235 Commits

Author SHA1 Message Date
jordi fita mas 7f865232e0 Remove fill="currentColor" from icons.css
It’s of no use whatsoever when the SVG is used as background image, and
it was only defined in those i extracted from the TTF with FontForge
anyway.
2024-01-24 10:57:54 +01:00
jordi fita mas 0a2911749a Fix the URL to get camper.js in admin/services/form.gohtml
Otherwise, the browser assumes they are two different resources, because
i am telling it so with the two URI, and loads the same file twice,
triggering the execution of startup functions, such as the ones that
convert textareas to CKEditor divs, twice.
2024-01-24 00:52:57 +01:00
jordi fita mas 937628ca9a Use lang-selector template for location.gohtml 2024-01-24 00:48:30 +01:00
jordi fita mas 28ab22bc22 Reduce size of icon input’s buttons 2024-01-24 00:40:19 +01:00
jordi fita mas 34a16af897 Add breadcrumb to services’ form 2024-01-24 00:36:40 +01:00
jordi fita mas adfe424bd4 Do not use sr-only for service order column
Otherwise, it seems like the header is “cut off” because it has no
bottom border.
2024-01-24 00:35:02 +01:00
jordi fita mas eb59babd86 Replace icons with designs from Font Awesome
Except for area, kayak, and plot, that do not have any equivalent in
Font Awesome.
2024-01-24 00:30:09 +01:00
jordi fita mas f514f9132e Add ad management for surroundings
They only want a single ad (for now, i guess).
2024-01-23 14:53:15 +01:00
jordi fita mas e34f253620 Make the slogan user-editable and translatable
Because God forbid we have any performance; everything —**everything**—
must be user editable.
2024-01-23 11:52:39 +01:00
jordi fita mas bc790762d6 Add remove_campsite_type_option function 2024-01-22 20:54:03 +01:00
jordi fita mas 1f2ab494dd Add check_in and check_out fields to campsite_type
Apparently, each campsite type could have different check-in and
check-out times, thus i need them in the database.

I thought about using an integer or a datetime field, but customer seems
to want a text field to maybe add “before” and “after” there as well.
Translatable text it is.
2024-01-22 20:19:19 +01:00
jordi fita mas aa64e2e6e5 Replace fieldset:nth-child(3) with fieldset.campsite-options
Previously, the only type with options was plots, that was always the
third fieldset, which was the wrong thing to hardcode, but it was done
in a hurry.  Now there are more types with options, so we have to do it
properly.
2024-01-22 03:57:11 +01:00
jordi fita mas fe9abf7d75 Add rel="terms-of-service" to booking form’s link to conditions
I also changed the translatable link to not include any HTML, because it
meant that i had to retranslate them just to add a new attribute, that
does not make much sense—the attribute is not even translatable, thus
all translations must include it verbatim.
2024-01-22 03:41:54 +01:00
jordi fita mas 8fa9755c8e Fix breadcrumb title in season’s form.gohtml 2024-01-22 03:39:54 +01:00
jordi fita mas 26cc46c7b0 Add breadcrumb to all admin pages
I tried to use ../, and ../../ to make the routes relatives, but it
would not work well because the same page would have two URLs, one
ending with slash and another without, and the relative links would be
different on each case.
2024-01-21 22:44:04 +01:00
jordi fita mas 6ddc41e293 Remove trailing slash from <link> in public layout 2024-01-21 21:12:12 +01:00
jordi fita mas 64dc533949 Remove the extra <div> when saving content from CKEditor
I need to have a single top-level element in order to serialize to XML
when returning the editor’s content back to the text area, because,
unlike PostgreSQL, XMLSerializer only works with XML documents.

I added a <div> because this is the least “semantic” block element there
is, but Oriol seems to have trouble in services when trying to align
services using a grid due to this extra div.

Now i still use the div to serialize to XML, but then remove that
top-level element from the output string by stripping out its label. I
 can not be sure that all browsers would serialize the <div> in the
 same way, thus i can not use fixed indices in call to substring.
2024-01-21 21:04:51 +01:00
jordi fita mas cf527ce070 Add the application’s version to the footer
This is mostly because it is required for the “Digital Kit”, but it also
works in our favor because now i can version the URL to the static
resources.

Go 1.18 adds the info from git if the package is build from a git
repository, but this is not the case in OBS, so i instead relay on a
constant for the version number.  This constant is “updated” by Debian’s
rules, mostly due to the discussion in [0].

[0]: https://github.com/golang/go/issues/22706
2024-01-21 20:50:16 +01:00
jordi fita mas d945f55096 Add “part” of the bookings’ management
“Part”, because it is not possible to add or actually manage any
booking yet, but it has the export feature that we need to validate the
project.
2024-01-18 21:05:30 +01:00
jordi fita mas c484e9bbfc Fix the age of touristic tax
It is for people aged 17 or olded, not 16.  I was confused by the
expression “over 16”, that **seems** to mean 17 or older, but actually
includes people aged 16, too.
2024-01-18 15:29:09 +01:00
oriol carbonell pujolàs 0431532ad5 Update styles 2024-01-18 03:27:07 +01:00
oriol carbonell pujolàs 72bc89ae0f Update bicycle icon 2024-01-18 03:26:52 +01:00
jordi fita mas a11ca5b470 Add page to see login attempts for a company 2024-01-17 20:28:42 +01:00
jordi fita mas f7fdc594d5 Add admin page to list the users
There is no way, for now, to add, edit or remove users, because
currently we only need to list users.

I can not give admins access to the user table, for security
permissions, so i had to create a new view.  I could name it also ‘user’
in ‘camper’ scheme, but then i was afraid i would have problems with
unit tests and their search_path, so instead i called it
‘company_user_profile’, which is like ‘user_profile’ but for all users
in ‘company_user’.

I created a new Go package for it, rather than add the admin handler in
‘auth’, because ‘template’ depends on ‘auth’, and rendering from ‘auth’
would cause a dependency loop.

I needed to have the roles in gettext to translate them, but there is
no obvious place where to put the call to PgettextNoop.  For now, there
are in ‘NewAdminHandler’ because it is called once in the application’s
lifetime and they actually do not matter much.
2024-01-17 19:42:47 +01:00
jordi fita mas c69c715ef3 Add position relative, and reduce margin of hero
Without the position relative, the booking button is no longer on top
of the carousel depending on the screen resolution, and Oriol wants less
gap between the carrousel and the next section.
2024-01-17 17:54:05 +01:00
jordi fita mas 25308a3359 Move carousel arrows inside the carousel, in the top-right
I misunderstood Oriol, and what he really wanted was to have the arrows
on top of the image, not just move the arrows from below to above. Thus,
I no longer need the carrousel to be a flex because the buttons are now
absolutely position (slick.css already sets the container to relative
position).

These arrows need to be visually inside a single container, to have a
white background, but Slick adds the two arrows separately.  I had to
move them close together, remove the radius from the “common edge”, and
use padding to “move” the arrows, rather than translation, in order to
avoid showing a gap.
2024-01-17 17:51:02 +01:00
jordi fita mas 962996be0b Clean up a bit the credit card div from booking page 2024-01-17 13:40:32 +01:00
oriol carbonell pujolàs 10e89c16df Add credit card logos to booking page 2024-01-17 13:31:33 +01:00
jordi fita mas 41fd940108 Enable autoplay to cover’s carousel 2024-01-17 13:26:33 +01:00
jordi fita mas 76d94f76f0 Change cover’s carousel to slick, and move arrows of all to top-right
Oriol did not like that this carousel was different from the rest, and
wanted to have it like the rest, but showing only one slide at a time,
like the customer wants.

He also wanted the arrows for **all** carousels to be in the top-right
corner instead of bottom-right, mostly because the customer complains
that she does not see the arrows if they are on the bottom, and Oriol
does not like the arrows to the sides.
2024-01-17 13:22:47 +01:00
jordi fita mas b1e3f5017f Add home’s cover carousel
This is a separate carousel from the one displayed at the bottom with
location info; it is, i suppose, a carousel for the hero image.

For the database, it works exactly as the home carousel, but on the
front had to use AlpineJS instead of Slick because it needs to show a
text popping up from the bottom when the slide is show, something i do
not know how to do in Slick.

It now makes no sense to have the carousel inside the “nature” section,
because the heading is no longer in there, and moved it out into a new
“hero” div.

Since i now have two carousels in home, i had to add additional
attributes to carousel.AdminHandler to know which URL to point to when
POSTing, PUTting, or redirecting.
2024-01-16 21:05:52 +01:00
jordi fita mas 89f8f91a4b Avoid nested forms in admin
I was using a <form> to delete slides and other such elements before
adding the form to sort these same elements with drag and drop, without
realizing that i was wrapping the existing delete <form>s, that now
would not submit properly—they were submitting the sort form instead.
2024-01-16 18:32:02 +01:00
jordi fita mas 6463674c62 Remove another unused image from static
This was used as the cover image in home, but it was replaced with an
image from media.
2024-01-16 18:07:26 +01:00
jordi fita mas 0928e78bed Added copyright statement to files modified by Oriol 2024-01-16 17:58:49 +01:00
oriol carbonell pujolàs c9754bebd0 Fix width of accomodation type image 2024-01-16 17:37:40 +01:00
jordi fita mas a0f9c10193 Add management of surroundings’ highlights (points of interest)
Customer does not want the new “masonry-like” design of the surroundings
page, and wants the same style they already had: a regular list with
text and photo, alternating the photo’s side.

And, of course, they want to be able to add and edit them themselves. It
is like another carousel, but with an additional rich-text description.

The photos that we had in that page are no longer of use.
2024-01-16 01:26:35 +01:00
jordi fita mas 50bcbf012f Allow updating images in CKEditor-“powered” textarea
Had to create a custom build of CKEditor with the following plugins
added-in:

  * Autoformat
  * Block quote
  * Bold
  * General HTML Support
  * Heading
  * Image
  * Image caption
  * Image resize
  * Image style
  * Image toolbar
  * Image upload
  * Indent
  * Italic
  * Link
  * Link image
  * List
  * Media embed
  * Simple upload adapter
  * Source editing
  * Table
  * Table toolbar
  * Text transformation

The important bit is the “Simple uploader adapter”, that i modified to
upload the file as `media` instead of the default `upload` (i.e.,
modified ckeditor.js to replace "upload" with "media").

I also had to add the CSRF header somewhere in the HTML document for
JavaScript to be able to retrieve it and pass it to the uploader
adapter, or i would have to disable CSRF validation in that form, which
i did not like at all.
2024-01-16 01:26:35 +01:00
oriol carbonell pujolàs cd43fd3cfd Update public style 2024-01-15 12:32:52 +01:00
oriol carbonell pujolàs 61b76240f0 Update admin styles 2024-01-15 12:30:13 +01:00
jordi fita mas 46e73abdd9 Remove an invalid max-width for the camping-association img 2024-01-15 02:07:56 +01:00
jordi fita mas 0ed6c1b121 Added note about dogs to the campsite type page
The pets icon is just the same as the notpet but without the diagonal
bar.

The price is hardcoded in the query for now, as there is no field
in the campsite type.
2024-01-15 02:07:32 +01:00
jordi fita mas 0beb0bb315 Add VAT and tourist tax information
Since i need the number of decimals to format the price in the template,
i added them to the company, and used them in the call to price_parse().
2024-01-15 01:45:58 +01:00
jordi fita mas 76456aa9b2 Add check-in and check-out time information to campsite type’s page 2024-01-15 01:02:50 +01:00
jordi fita mas dabd197f02 Add additional information field to campsite types
This is actually just to have a fourth column in order to “balance”
lists for types that have a long descriptions.
2024-01-15 00:28:34 +01:00
jordi fita mas 81b6edbc7b Show campground map using leaflet
It is better for mobile users, as they can zoom and pan the map in their
small screens.

Had to increase header’s z-index or the zoom controls would be on top
of it.
2024-01-14 22:31:13 +01:00
oriol carbonell pujolàs 3dbcc076d2 Merge branch 'master' of ssh://dev.tandem.ws:2222/tandem/camper 2024-01-14 21:36:16 +01:00
oriol carbonell pujolàs cb97151264 Update campground map 2024-01-14 21:36:03 +01:00
jordi fita mas 79df1736f2 Add tourist tax to company
Not used anywhere yet, but i will need it when computing the booking’s
total.
2024-01-14 02:09:17 +01:00
jordi fita mas 9b96a355a4 Automatically select the departure date when arrival changes
By default, it selects the next day, unless the new arrival date is
before the current departure, in which case is left as is, because the
idea is to help people avoid useless calendar selections when booking
for next three or four months: they would need to change the month
twice, and now only at most one.
2024-01-13 02:03:27 +01:00
jordi fita mas a226d17aa7 Add the campsite type’s name in front of price if it has options
Customer wants to explicitly show that the first price, the one on top
of the options, is for the campsite type.
2024-01-13 01:37:11 +01:00
oriol carbonell pujolàs 6a2158e179 Update style 2024-01-13 01:20:31 +01:00
oriol carbonell pujolàs f04f6a3981 Replaced line icons with filled versions 2024-01-13 01:16:16 +01:00
jordi fita mas 976b2bcbcf Add position to services to be able to manually sort by admins 2024-01-13 01:15:24 +01:00
jordi fita mas 4e126237a0 Replace L10nInput with I18nInput in service
locale.Translation and form.L10nInput are no longer used.

The translation type in Postgres is now also useless, and i believe it
was never used, but i keep it because I already have a tag and i can not
just remove it, meaning that dropping it is more trouble that worth it.
2024-01-12 21:06:12 +01:00
jordi fita mas 58c3b607a1 Replace L10nInput with I18nInput in season 2024-01-12 20:26:45 +01:00
jordi fita mas 2b702d6632 Add golang template to initialize x-data for translation in admin
Had to add the DefaultLang to legal and location forms in order to use
the same template for all.
2024-01-12 19:51:12 +01:00
jordi fita mas b6cd2f7693 Use I18nInput instead of L10nInput to translate carousels 2024-01-12 19:33:44 +01:00
jordi fita mas 4d0d7a44ab Add slides to show parameter to carouselInit template
Customer wants four slides in home’s carousel, while keeping three in
the rest of the carousels.

In mobile screen, Oriol told me to always have a single slide, but in
tablet it is the given number minus one.
2024-01-11 21:04:32 +01:00
jordi fita mas 2f1895b71a Show international phone number with 00 instead of +
Customer wants it that way.
2024-01-11 20:56:35 +01:00
jordi fita mas f28664acce Replace use of L10NInput with I18nInput for campsite 2024-01-10 21:52:49 +01:00
jordi fita mas 3f46ea3a9a Add “Menu” next to the trigram symbol (“hamburger”) 2024-01-10 19:41:57 +01:00
jordi fita mas 07223f64d2 Merge remote-tracking branch 'origin/upcoming' 2023-12-22 10:41:59 +01:00
oriol carbonell pujolàs 15761a370d Change home image background 2023-12-22 10:41:27 +01:00
oriol carbonell pujolàs a5c35c8da3 Add color to booking link and fix footer image sizes 2023-12-22 10:41:02 +01:00
jordi fita mas 92db4dfff6 Only hide immediate children of label[x-show]
Otherwise, it affects the ones inside CKEditor
2023-12-22 04:12:03 +01:00
jordi fita mas 4d0123def7 Bring back the whole list of options in type page, but in accordion
This is how the customer wants it.
2023-12-22 03:27:49 +01:00
jordi fita mas 12d5356455 Add the link to the reservation conditions to the booking form
This text must be created in the administration interface, but whatever.
2023-12-22 02:29:06 +01:00
jordi fita mas 03c20fec88 Add management of legal texts 2023-12-22 02:23:18 +01:00
jordi fita mas bda3507b62 Merge remote-tracking branch 'origin/upcoming' 2023-12-22 00:22:06 +01:00
oriol carbonell pujolàs 8cfa3b1c77 Add bottom border to heading and add camping association images 2023-12-22 00:20:53 +01:00
jordi fita mas adf87fce94 Add the language switch on the header’s top most in desktop sizes
Customer wants the language switch at the same level as the email and
phone links, because that’s what they have on the old website.
2023-12-21 22:39:58 +01:00
jordi fita mas 8b9f3438a0 Merge remote-tracking branch 'origin/upcoming' 2023-12-21 21:19:18 +01:00
oriol carbonell pujolàs b2b0f035b5 Add style for booking menu item and operture footer section 2023-12-21 21:18:22 +01:00
jordi fita mas ff6e9497b5 Replace contact page with location
Customer does not want a contact page, but a page where they can write
the direction on how to reach the campground, with a Google map embed
instead of using Leaflet, because Google Maps shows the reviews right
in the map.

That means i had to replace the GPS locations with XML fields for the
customer to write.  In all four languages.

This time i tried a translation approach inspired by PrestaShop: instead
of opening a new page for each language, i have all languages in the
same page and use AlpineJS to show just a single language.  It is far
easier to write the translations, even though you do not have the source
text visible, specially in this section that there is no place for me
to put the language links.
2023-12-21 21:17:04 +01:00
jordi fita mas ca48e1d108 Fix the location of CKEditor’s translations 2023-12-21 20:20:04 +01:00
jordi fita mas 38d07fb662 Add a class to the booking menu item, and move it second to last
Oriol needs to give it style, and customer wants it there.
2023-12-21 19:13:10 +01:00
jordi fita mas 47a2b8e480 Add plot and electricity icons 2023-12-21 17:40:06 +01:00
jordi fita mas c9a6df658f Add position to campsite type features 2023-12-21 17:33:01 +01:00
jordi fita mas a7e62dbe70 Justify nav’s content to the end
This is to bring back the old behaviour when header was a flex with
space-between, that pushed the menu as far to the right as possible.
2023-12-21 16:24:39 +01:00
jordi fita mas d21b34ab40 Merge remote-tracking branch 'origin/upcoming' 2023-12-21 16:22:33 +01:00
oriol carbonell pujolàs 2379733673 Set multiply blending mode to campground map’s zones and trees 2023-12-21 16:19:04 +01:00
oriol carbonell pujolàs c555ecd432 Update campground map 2023-12-21 11:59:01 +01:00
jordi fita mas 7b6bae5062 Add the email and phone numbers at the very top
Requested by the customer
2023-12-20 20:39:26 +01:00
jordi fita mas 34081a50f4 Move home carousel to the page’s bottom
Customer requested it
2023-12-20 20:24:06 +01:00
jordi fita mas b6c4eb790f Add the country name to the footer’s address
Customer requested it
2023-12-20 20:22:47 +01:00
jordi fita mas 907d9844d3 Add the booking link to the menu
Customer requested it
2023-12-20 20:19:05 +01:00
jordi fita mas b4b7584c14 Show “full slides in the carousels, 3 slides in the biggest breakpoint
Customer does not want the next slide to show partially; either it shows
theo whole slide, or not at all.

Had to remove the min-width for campsite type’s spiel, or it would make
the whole thing fall over, i do not know why; possibly because slick
could not reduce the width to its expected value.
2023-12-20 20:11:39 +01:00
jordi fita mas 678b5cc523 Add user-defined order to campsite types, options, seasons and carousels
I use Sortable, exactly like HTMx’s sorting example does[0].  Had to
export the slug or ID of some entries to be able to add it in the hidden
input.

For forms that use ID instead of slug, had to use an input name other
than “id” because otherwise the swap would fail due to bug #1496[1].  It
is apparently fixed in a recent version of HTMx, but i did not want to
update for fear of behaviour changes.

[0]: https://htmx.org/examples/sortable/
[1]: https://github.com/bigskysoftware/htmx/issues/1496
2023-12-20 19:52:14 +01:00
oriol carbonell pujolàs b8029cd131 Update styles 2023-12-20 13:02:56 +01:00
oriol carbonell pujolàs ed099ad19f Update campground map 2023-12-20 13:02:41 +01:00
jordi fita mas 66a7ae3d27 Fix typo in Accommodation, and fix its translations 2023-12-13 23:45:36 +01:00
jordi fita mas 20d32d6a6d Keep campsite type and date when going to booking form from type page 2023-12-13 23:42:18 +01:00
oriol carbonell pujolàs 6e1d5b14bc Style changes 2023-12-13 23:23:28 +01:00
jordi fita mas cfd5d5675c Remove “Party Details” from booking form, and stylize it a bit 2023-12-12 23:16:04 +01:00
jordi fita mas ac09fd77da Use redsys_environment to choose the correct URL to send the payment to 2023-10-27 17:03:50 +02:00
jordi fita mas 0cbf973cbb Add the payment form to admin
Had to change setup_redsys because admins can not read the current
encrypt key, thus it is not possible to `set encrypt_key =
coalesce(…, encrypt_key)`.

Not that it did much sense, anyway, as i was already inside the branch
of the if when encrpty_key is null.

However, it seems that this also affects in the `on conflict` update. I
assume this is because `excluded` is some kind of row of the relation
and has the same restrictions.
2023-10-27 16:08:13 +02:00
jordi fita mas 57b4360dfb Add error messages to the booking form
I forgot _all_ of them….
2023-10-27 12:37:09 +02:00
jordi fita mas 048b7cbf90 Add the slug to the form in the campsite type public page
The idea is that the booking form will be prefilled with the values
passed from that other mini-form, and the campsite type is implicit
due to the page where the form is located at, but i need to give it to
the booking page.

The booking page does not yet use that information.
2023-10-19 21:38:44 +02:00
jordi fita mas 302ce29e4a Add the first draft of the booking and payment forms
The form is based on the one in the current website, but in a single
page instead of split into many pages; possibly each <fieldset> should
be in a separate page/view.  The idea is for Oriol to check the design
and decide how it would be presented to the user, so i needed something
to show him first.

I hardcoded the **test** data for the customer’s Redsys account.  Is
this bad? I hope not, but i am not really, really sure.

The data sent to Redsys is just a placeholder because there are booking
details that i do not know, like what i have to do with the “teenagers”
field or the area preferences, thus i can not yet have a booking
relation.  Nevertheless, had to generate a random order number up to
12-chars in length or Redsys would refuse the payment, claiming that
the order is duplicated.

The Redsys package is based on the PHP code provided by Redsys
themselves, plus some hints at the implementations from various Go
packages that did not know why they were so complicated.

Had to grant select on table country to guest in order to show the
select with the country options.

I have changed the “Postal code” input in taxDetails for “Postcode”
because this is the spell that it is used in the current web, i did not
see a reason to change it—it is an accepted form—, and i did not want to
have inconsistencies between forms.
2023-10-19 21:37:34 +02:00
jordi fita mas 96fb253354 Show the campsite type’s calendar in an “infinite scroll” carousel
Oriol does not want to waste so much vertical space for the calendar,
and wants it to show in a carousel, initially with only 6 months, and
loading the next three each time the user scrolls past the last.

I now use HTMx in the public page too for this auto-loading behavior,
based on their “infinite scroll” example[0].

Had to put the /calendar URI inside campsites because in the
calendar.gohtml i do not know the current type’s UUID, and can not use
a relative URL to “add subdirectories”, because the type does not end
with a slash.

Had to change season.CollectCalendar to expect the first month and a
number of months to show, to be able to load only 6 or 3 months after
the current, for the initial carousel content, or after the last month
of the carousel.

[0]: https://htmx.org/examples/infinite-scroll/
2023-10-18 21:06:41 +02:00