From bc790762d69f0ed5480dde2c9c4d5c28930c1ffe Mon Sep 17 00:00:00 2001 From: jordi fita mas Date: Mon, 22 Jan 2024 20:54:03 +0100 Subject: [PATCH] Add remove_campsite_type_option function --- deploy/remove_campsite_type_option.sql | 24 ++++ pkg/campsite/types/option.go | 15 ++- pkg/database/funcs.go | 5 + po/ca.po | 32 +++-- po/es.po | 32 +++-- po/fr.po | 32 +++-- revert/remove_campsite_type_option.sql | 7 + sqitch.plan | 1 + test/remove_campsite_type_option.sql | 123 ++++++++++++++++++ verify/remove_campsite_type_option.sql | 7 + .../admin/campsite/option/index.gohtml | 9 ++ 11 files changed, 247 insertions(+), 40 deletions(-) create mode 100644 deploy/remove_campsite_type_option.sql create mode 100644 revert/remove_campsite_type_option.sql create mode 100644 test/remove_campsite_type_option.sql create mode 100644 verify/remove_campsite_type_option.sql diff --git a/deploy/remove_campsite_type_option.sql b/deploy/remove_campsite_type_option.sql new file mode 100644 index 0000000..1d6dad9 --- /dev/null +++ b/deploy/remove_campsite_type_option.sql @@ -0,0 +1,24 @@ +-- Deploy camper:remove_campsite_type_option to pg +-- requires: roles +-- requires: schema_camper +-- requires: campsite_type_option +-- requires: campsite_type_option_i18n +-- requires: campsite_type_option_cost + +begin; + +set search_path to camper, public; + +create or replace function remove_campsite_type_option(option_id integer) returns void as +$$ + delete from campsite_type_option_cost where campsite_type_option_id = option_id; + delete from campsite_type_option_i18n where campsite_type_option_id = option_id; + delete from campsite_type_option where campsite_type_option_id = option_id; +$$ + language sql +; + +revoke execute on function remove_campsite_type_option(integer) from public; +grant execute on function remove_campsite_type_option(integer) to admin; + +commit; diff --git a/pkg/campsite/types/option.go b/pkg/campsite/types/option.go index 954ad2d..68744a9 100644 --- a/pkg/campsite/types/option.go +++ b/pkg/campsite/types/option.go @@ -88,8 +88,10 @@ func (h *AdminHandler) optionHandler(user *auth.User, company *auth.Company, con f.MustRender(w, r, user, company) case http.MethodPut: editOption(w, r, user, company, conn, f) + case http.MethodDelete: + deleteOption(w, r, user, conn, f.TypeSlug, f.ID) default: - httplib.MethodNotAllowed(w, r, http.MethodGet, http.MethodPut) + httplib.MethodNotAllowed(w, r, http.MethodGet, http.MethodPut, http.MethodDelete) } default: http.NotFound(w, r) @@ -194,6 +196,17 @@ func editOption(w http.ResponseWriter, r *http.Request, user *auth.User, company }) } +func deleteOption(w http.ResponseWriter, r *http.Request, user *auth.User, conn *database.Conn, typeSlug string, id int) { + if err := user.VerifyCSRFToken(r); err != nil { + http.Error(w, err.Error(), http.StatusForbidden) + return + } + if err := conn.RemoveCampsiteTypeOption(r.Context(), id); err != nil { + panic(err) + } + httplib.Redirect(w, r, "/admin/campsites/types/"+typeSlug+"/options", http.StatusSeeOther) +} + func processOptionForm(w http.ResponseWriter, r *http.Request, user *auth.User, company *auth.Company, conn *database.Conn, f *optionForm, act func(ctx context.Context, tx *database.Tx) error) { if ok, err := form.Handle(f, w, r, user); err != nil { return diff --git a/pkg/database/funcs.go b/pkg/database/funcs.go index e5341bc..44e2284 100644 --- a/pkg/database/funcs.go +++ b/pkg/database/funcs.go @@ -51,6 +51,11 @@ func (tx *Tx) TranslateCampsiteTypeOption(ctx context.Context, id int, langTag l return err } +func (c *Conn) RemoveCampsiteTypeOption(ctx context.Context, id int) error { + _, err := c.Exec(ctx, "select remove_campsite_type_option($1)", id) + return err +} + func (c *Conn) OrderCampsiteTypeOptions(ctx context.Context, ids []int) error { _, err := c.Exec(ctx, "select order_campsite_type_options($1)", ids) return err diff --git a/po/ca.po b/po/ca.po index f5c63a8..7373511 100644 --- a/po/ca.po +++ b/po/ca.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: camper\n" "Report-Msgid-Bugs-To: jordi@tandem.blog\n" -"POT-Creation-Date: 2024-01-22 19:51+0100\n" +"POT-Creation-Date: 2024-01-22 20:50+0100\n" "PO-Revision-Date: 2023-07-22 23:45+0200\n" "Last-Translator: jordi fita mas \n" "Language-Team: Catalan \n" @@ -655,6 +655,7 @@ msgid "Caption" msgstr "Llegenda" #: web/templates/admin/campsite/carousel/index.gohtml:32 +#: web/templates/admin/campsite/option/index.gohtml:31 #: web/templates/admin/services/index.gohtml:30 #: web/templates/admin/services/index.gohtml:75 #: web/templates/admin/user/index.gohtml:23 @@ -672,6 +673,7 @@ msgid "Are you sure you wish to delete this slide?" msgstr "Esteu segur de voler esborrar aquesta diapositiva?" #: web/templates/admin/campsite/carousel/index.gohtml:50 +#: web/templates/admin/campsite/option/index.gohtml:47 #: web/templates/admin/services/index.gohtml:47 #: web/templates/admin/services/index.gohtml:91 #: web/templates/admin/user/index.gohtml:37 @@ -760,7 +762,11 @@ msgctxt "action" msgid "Add Option" msgstr "Afegeix opció" -#: web/templates/admin/campsite/option/index.gohtml:47 +#: web/templates/admin/campsite/option/index.gohtml:35 +msgid "Are you sure you wish to delete this option?" +msgstr "Esteu segur de voler esborrar aquesta opció?" + +#: web/templates/admin/campsite/option/index.gohtml:56 msgid "No campsite type options added yet." msgstr "No s’ha afegit cap opció al tipus d’allotjament encara." @@ -1425,14 +1431,14 @@ msgstr "Estat" msgid "No booking found." msgstr "No s’ha trobat cap reserva." -#: pkg/legal/admin.go:258 pkg/app/user.go:249 pkg/campsite/types/option.go:344 +#: pkg/legal/admin.go:258 pkg/app/user.go:249 pkg/campsite/types/option.go:357 #: pkg/campsite/types/feature.go:259 pkg/campsite/types/admin.go:483 #: pkg/season/admin.go:412 pkg/services/admin.go:316 #: pkg/surroundings/admin.go:321 msgid "Name can not be empty." msgstr "No podeu deixar el nom en blanc." -#: pkg/legal/admin.go:259 pkg/campsite/types/option.go:345 +#: pkg/legal/admin.go:259 pkg/campsite/types/option.go:358 #: pkg/campsite/types/feature.go:260 pkg/campsite/types/admin.go:484 msgid "Name must have at least one letter." msgstr "El nom ha de tenir com a mínim una lletra." @@ -1496,39 +1502,39 @@ msgstr "El fitxer has de ser una imatge PNG o JPEG vàlida." msgid "Access forbidden" msgstr "Accés prohibit" -#: pkg/campsite/types/option.go:348 +#: pkg/campsite/types/option.go:361 msgid "Minimum can not be empty." msgstr "No podeu deixar el mínim en blanc." -#: pkg/campsite/types/option.go:349 +#: pkg/campsite/types/option.go:362 msgid "Minimum must be an integer number." msgstr "El valor del mínim ha de ser un número enter." -#: pkg/campsite/types/option.go:351 +#: pkg/campsite/types/option.go:364 msgid "Minimum must be zero or greater." msgstr "El valor del mínim ha de ser com a mínim zero." -#: pkg/campsite/types/option.go:354 +#: pkg/campsite/types/option.go:367 msgid "Maximum can not be empty." msgstr "No podeu deixar el màxim en blanc." -#: pkg/campsite/types/option.go:355 +#: pkg/campsite/types/option.go:368 msgid "Maximum must be an integer number." msgstr "El valor del màxim ha de ser un número enter." -#: pkg/campsite/types/option.go:357 +#: pkg/campsite/types/option.go:370 msgid "Maximum must be equal or greater than minimum." msgstr "El valor del màxim ha de ser igual o superir al del mínim." -#: pkg/campsite/types/option.go:361 pkg/campsite/types/admin.go:499 +#: pkg/campsite/types/option.go:374 pkg/campsite/types/admin.go:499 msgid "Price per night can not be empty." msgstr "No podeu deixar el preu per nit en blanc." -#: pkg/campsite/types/option.go:362 pkg/campsite/types/admin.go:500 +#: pkg/campsite/types/option.go:375 pkg/campsite/types/admin.go:500 msgid "Price per night must be a decimal number." msgstr "El preu per nit ha de ser un número decimal." -#: pkg/campsite/types/option.go:363 pkg/campsite/types/admin.go:501 +#: pkg/campsite/types/option.go:376 pkg/campsite/types/admin.go:501 msgid "Price per night must be zero or greater." msgstr "El preu per nit ha de ser com a mínim zero." diff --git a/po/es.po b/po/es.po index ec46f1c..c0db30a 100644 --- a/po/es.po +++ b/po/es.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: camper\n" "Report-Msgid-Bugs-To: jordi@tandem.blog\n" -"POT-Creation-Date: 2024-01-22 19:51+0100\n" +"POT-Creation-Date: 2024-01-22 20:50+0100\n" "PO-Revision-Date: 2023-07-22 23:46+0200\n" "Last-Translator: jordi fita mas \n" "Language-Team: Spanish \n" @@ -655,6 +655,7 @@ msgid "Caption" msgstr "Leyenda" #: web/templates/admin/campsite/carousel/index.gohtml:32 +#: web/templates/admin/campsite/option/index.gohtml:31 #: web/templates/admin/services/index.gohtml:30 #: web/templates/admin/services/index.gohtml:75 #: web/templates/admin/user/index.gohtml:23 @@ -672,6 +673,7 @@ msgid "Are you sure you wish to delete this slide?" msgstr "¿Estáis seguro de querer borrar esta diapositiva?" #: web/templates/admin/campsite/carousel/index.gohtml:50 +#: web/templates/admin/campsite/option/index.gohtml:47 #: web/templates/admin/services/index.gohtml:47 #: web/templates/admin/services/index.gohtml:91 #: web/templates/admin/user/index.gohtml:37 @@ -760,7 +762,11 @@ msgctxt "action" msgid "Add Option" msgstr "Añadir opción" -#: web/templates/admin/campsite/option/index.gohtml:47 +#: web/templates/admin/campsite/option/index.gohtml:35 +msgid "Are you sure you wish to delete this option?" +msgstr "¿Estáis seguro de querer borrar esta opción?" + +#: web/templates/admin/campsite/option/index.gohtml:56 msgid "No campsite type options added yet." msgstr "No se ha añadido ninguna opció al tipo de alojamiento todavía." @@ -1425,14 +1431,14 @@ msgstr "Estado" msgid "No booking found." msgstr "No se ha encontrado ninguna reserva." -#: pkg/legal/admin.go:258 pkg/app/user.go:249 pkg/campsite/types/option.go:344 +#: pkg/legal/admin.go:258 pkg/app/user.go:249 pkg/campsite/types/option.go:357 #: pkg/campsite/types/feature.go:259 pkg/campsite/types/admin.go:483 #: pkg/season/admin.go:412 pkg/services/admin.go:316 #: pkg/surroundings/admin.go:321 msgid "Name can not be empty." msgstr "No podéis dejar el nombre en blanco." -#: pkg/legal/admin.go:259 pkg/campsite/types/option.go:345 +#: pkg/legal/admin.go:259 pkg/campsite/types/option.go:358 #: pkg/campsite/types/feature.go:260 pkg/campsite/types/admin.go:484 msgid "Name must have at least one letter." msgstr "El nombre tiene que tener como mínimo una letra." @@ -1496,39 +1502,39 @@ msgstr "El archivo tiene que ser una imagen PNG o JPEG válida." msgid "Access forbidden" msgstr "Acceso prohibido" -#: pkg/campsite/types/option.go:348 +#: pkg/campsite/types/option.go:361 msgid "Minimum can not be empty." msgstr "No podéis dejar el mínimo en blanco." -#: pkg/campsite/types/option.go:349 +#: pkg/campsite/types/option.go:362 msgid "Minimum must be an integer number." msgstr "El valor de mínimo tiene que ser un número entero." -#: pkg/campsite/types/option.go:351 +#: pkg/campsite/types/option.go:364 msgid "Minimum must be zero or greater." msgstr "El valor de mínimo tiene que ser como mínimo cero." -#: pkg/campsite/types/option.go:354 +#: pkg/campsite/types/option.go:367 msgid "Maximum can not be empty." msgstr "No podéis dejar el máxmimo en blanco." -#: pkg/campsite/types/option.go:355 +#: pkg/campsite/types/option.go:368 msgid "Maximum must be an integer number." msgstr "El valor del máximo tiene que ser un número entero." -#: pkg/campsite/types/option.go:357 +#: pkg/campsite/types/option.go:370 msgid "Maximum must be equal or greater than minimum." msgstr "El valor del máximo tiene que ser igual o mayor al del mínimo." -#: pkg/campsite/types/option.go:361 pkg/campsite/types/admin.go:499 +#: pkg/campsite/types/option.go:374 pkg/campsite/types/admin.go:499 msgid "Price per night can not be empty." msgstr "No podéis dejar el precio por noche en blanco." -#: pkg/campsite/types/option.go:362 pkg/campsite/types/admin.go:500 +#: pkg/campsite/types/option.go:375 pkg/campsite/types/admin.go:500 msgid "Price per night must be a decimal number." msgstr "El precio por noche tiene que ser un número decimal." -#: pkg/campsite/types/option.go:363 pkg/campsite/types/admin.go:501 +#: pkg/campsite/types/option.go:376 pkg/campsite/types/admin.go:501 msgid "Price per night must be zero or greater." msgstr "El precio por noche tiene que ser como mínimo cero." diff --git a/po/fr.po b/po/fr.po index 03fced8..1f7bd92 100644 --- a/po/fr.po +++ b/po/fr.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: camper\n" "Report-Msgid-Bugs-To: jordi@tandem.blog\n" -"POT-Creation-Date: 2024-01-22 19:51+0100\n" +"POT-Creation-Date: 2024-01-22 20:50+0100\n" "PO-Revision-Date: 2023-12-20 10:13+0100\n" "Last-Translator: Oriol Carbonell \n" "Language-Team: French \n" @@ -656,6 +656,7 @@ msgid "Caption" msgstr "Légende" #: web/templates/admin/campsite/carousel/index.gohtml:32 +#: web/templates/admin/campsite/option/index.gohtml:31 #: web/templates/admin/services/index.gohtml:30 #: web/templates/admin/services/index.gohtml:75 #: web/templates/admin/user/index.gohtml:23 @@ -673,6 +674,7 @@ msgid "Are you sure you wish to delete this slide?" msgstr "Êtes-vous sûr de vouloir supprimer cette diapositive ?" #: web/templates/admin/campsite/carousel/index.gohtml:50 +#: web/templates/admin/campsite/option/index.gohtml:47 #: web/templates/admin/services/index.gohtml:47 #: web/templates/admin/services/index.gohtml:91 #: web/templates/admin/user/index.gohtml:37 @@ -761,7 +763,11 @@ msgctxt "action" msgid "Add Option" msgstr "Ajouter une option" -#: web/templates/admin/campsite/option/index.gohtml:47 +#: web/templates/admin/campsite/option/index.gohtml:35 +msgid "Are you sure you wish to delete this option?" +msgstr "Êtes-vous sûr de vouloir supprimer cette option ?" + +#: web/templates/admin/campsite/option/index.gohtml:56 msgid "No campsite type options added yet." msgstr "Aucune option de type de camping n’a encore été ajoutée." @@ -1426,14 +1432,14 @@ msgstr "Statut" msgid "No booking found." msgstr "Aucune réservation trouvée." -#: pkg/legal/admin.go:258 pkg/app/user.go:249 pkg/campsite/types/option.go:344 +#: pkg/legal/admin.go:258 pkg/app/user.go:249 pkg/campsite/types/option.go:357 #: pkg/campsite/types/feature.go:259 pkg/campsite/types/admin.go:483 #: pkg/season/admin.go:412 pkg/services/admin.go:316 #: pkg/surroundings/admin.go:321 msgid "Name can not be empty." msgstr "Le nom ne peut pas être laissé vide." -#: pkg/legal/admin.go:259 pkg/campsite/types/option.go:345 +#: pkg/legal/admin.go:259 pkg/campsite/types/option.go:358 #: pkg/campsite/types/feature.go:260 pkg/campsite/types/admin.go:484 msgid "Name must have at least one letter." msgstr "Le nom doit comporter au moins une lettre." @@ -1497,39 +1503,39 @@ msgstr "Le fichier doit être une image PNG ou JPEG valide." msgid "Access forbidden" msgstr "Accès interdit" -#: pkg/campsite/types/option.go:348 +#: pkg/campsite/types/option.go:361 msgid "Minimum can not be empty." msgstr "Le minimum ne peut pas être vide." -#: pkg/campsite/types/option.go:349 +#: pkg/campsite/types/option.go:362 msgid "Minimum must be an integer number." msgstr "Le minimum doit être un nombre entier." -#: pkg/campsite/types/option.go:351 +#: pkg/campsite/types/option.go:364 msgid "Minimum must be zero or greater." msgstr "Le minimum doit être égal ou supérieur à zéro." -#: pkg/campsite/types/option.go:354 +#: pkg/campsite/types/option.go:367 msgid "Maximum can not be empty." msgstr "Le maximum ne peut pas être vide." -#: pkg/campsite/types/option.go:355 +#: pkg/campsite/types/option.go:368 msgid "Maximum must be an integer number." msgstr "Le maximum doit être un nombre entier." -#: pkg/campsite/types/option.go:357 +#: pkg/campsite/types/option.go:370 msgid "Maximum must be equal or greater than minimum." msgstr "Le maximum doit être égal ou supérieur au minimum." -#: pkg/campsite/types/option.go:361 pkg/campsite/types/admin.go:499 +#: pkg/campsite/types/option.go:374 pkg/campsite/types/admin.go:499 msgid "Price per night can not be empty." msgstr "Le prix par nuit ne peut pas être vide." -#: pkg/campsite/types/option.go:362 pkg/campsite/types/admin.go:500 +#: pkg/campsite/types/option.go:375 pkg/campsite/types/admin.go:500 msgid "Price per night must be a decimal number." msgstr "Le prix par nuit doit être un nombre décimal." -#: pkg/campsite/types/option.go:363 pkg/campsite/types/admin.go:501 +#: pkg/campsite/types/option.go:376 pkg/campsite/types/admin.go:501 msgid "Price per night must be zero or greater." msgstr "Le prix par nuit doit être égal ou supérieur." diff --git a/revert/remove_campsite_type_option.sql b/revert/remove_campsite_type_option.sql new file mode 100644 index 0000000..3ceae3f --- /dev/null +++ b/revert/remove_campsite_type_option.sql @@ -0,0 +1,7 @@ +-- Revert camper:remove_campsite_type_option from pg + +begin; + +drop function if exists camper.remove_campsite_type_option(integer); + +commit; diff --git a/sqitch.plan b/sqitch.plan index e102eca..5b30e5c 100644 --- a/sqitch.plan +++ b/sqitch.plan @@ -167,3 +167,4 @@ add_campsite_type [add_campsite_type@v1 campsite_type__check_in_out] 2024-01-22T edit_campsite_type [edit_campsite_type@v1 campsite_type__check_in_out] 2024-01-22T18:04:34Z jordi fita mas # Add check_in and check_out parameters to edit_campsite_type function campsite_type_i18n__check_in_out [campsite_type_i18n] 2024-01-22T18:07:21Z jordi fita mas # Add check_in and check_out fields to campsite_type_i18n translate_campsite_type [translate_campsite_type@v1 campsite_type_i18n__check_in_out] 2024-01-22T18:14:26Z jordi fita mas # Add check_in and check_out parameters to translate_campsite_type function +remove_campsite_type_option [roles schema_camper campsite_type_option campsite_type_option_i18n campsite_type_option_cost] 2024-01-22T19:25:03Z jordi fita mas # Add function to remove campsite type options diff --git a/test/remove_campsite_type_option.sql b/test/remove_campsite_type_option.sql new file mode 100644 index 0000000..bc5cd65 --- /dev/null +++ b/test/remove_campsite_type_option.sql @@ -0,0 +1,123 @@ +-- Test remove_campsite_type_option +set client_min_messages to warning; +create extension if not exists pgtap; +reset client_min_messages; + +begin; + +select plan(14); + +set search_path to camper, public; + +select has_function('camper', 'remove_campsite_type_option', array['integer']); +select function_lang_is('camper', 'remove_campsite_type_option', array['integer'], 'sql'); +select function_returns('camper', 'remove_campsite_type_option', array['integer'], 'void'); +select isnt_definer('camper', 'remove_campsite_type_option', array['integer']); +select volatility_is('camper', 'remove_campsite_type_option', array['integer'], 'volatile'); +select function_privs_are('camper', 'remove_campsite_type_option', array['integer'], 'guest', array[]::text[]); +select function_privs_are('camper', 'remove_campsite_type_option', array['integer'], 'employee', array[]::text[]); +select function_privs_are('camper', 'remove_campsite_type_option', array['integer'], 'admin', array['EXECUTE']); +select function_privs_are('camper', 'remove_campsite_type_option', array['integer'], 'authenticator', array[]::text[]); + + +set client_min_messages to warning; +truncate campsite_type_option_cost cascade; +truncate campsite_type_option_i18n cascade; +truncate campsite_type_option cascade; +truncate season cascade; +truncate media cascade; +truncate media_content cascade; +truncate company cascade; +reset client_min_messages; + +insert into company (company_id, business_name, vatin, trade_name, phone, email, web, address, city, province, postal_code, rtc_number, tourist_tax, country_code, currency_code, default_lang_tag) +values (1, 'Company 2', 'XX123', '', '555-555-555', 'a@a', '', '', '', '', '', '', 60, 'ES', 'EUR', 'ca') +; + +insert into media_content (media_type, bytes) +values ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffffff","a"};') + , ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ff00ff","a"};') + , ('image/x-xpixmap', 'static char *s[]={"1 1 1 1","a c #ffff00","a"};') + , ('text/plain', 'hello, world!') + , ('image/svg+xml', '') +; + +insert into media (media_id, company_id, original_filename, content_hash) +values (2, 1, 'cover2.xpm', sha256('static char *s[]={"1 1 1 1","a c #ffffff","a"};')) + , (3, 1, 'cover3.xpm', sha256('static char *s[]={"1 1 1 1","a c #ff00ff","a"};')) +; + +insert into campsite_type (campsite_type_id, company_id, slug, media_id, name, description, max_campers, dogs_allowed, active) +values (10, 1, '87452b88-b48f-48d3-bb6c-0296de64164e', 2, 'Type A', '

A

', 5, false, true) + , (11, 1, '9b6370f7-f941-46f2-bc6e-de455675bd0a', 3, 'Type B', '

B

', 4, true, false) +; + +insert into campsite_type_option (campsite_type_option_id, campsite_type_id, name, range) +values (12, 10, 'Option 1', '[0, 1]') + , (13, 10, 'Option 2', '[0, 1]') + , (14, 11, 'Option 3', '[0, 1]') + , (15, 11, 'Option 4', '[0, 1]') +; + +insert into season (season_id, company_id, name) +values (16, 1, 'High') +; +insert into campsite_type_option_cost (campsite_type_option_id, season_id, cost_per_night) +values (12, 16, 44) + , (13, 16, 54) + , (14, 16, 74) + , (15, 16, 84) +; + +insert into campsite_type_option_i18n (campsite_type_option_id, lang_tag, name) +values (12, 'ca', 'Opció 1') + , (12, 'es', 'Opción 1') + , (13, 'ca', 'Opció 2') + , (13, 'es', 'Opción 2') + , (14, 'ca', 'Opció 3') + , (14, 'es', 'Opción 3') + , (15, 'ca', 'Opció 4') + , (15, 'es', 'Opción 4') +; + +select lives_ok( + $$ select remove_campsite_type_option(12) $$, + 'Should be able to delete an option from the first campsite type' +); + +select lives_ok( + $$ select remove_campsite_type_option(15) $$, + 'Should be able to delete a slide from the second campsite type' +); + +select bag_eq( + $$ select campsite_type_option_id, name from campsite_type_option $$, + $$ values (13, 'Option 2') + , (14, 'Option 3') + $$, + 'Should have removed the options' +); + +select bag_eq( + $$ select campsite_type_option_id, lang_tag, name from campsite_type_option_i18n $$, + $$ values (13, 'ca', 'Opció 2') + , (13, 'es', 'Opción 2') + , (14, 'ca', 'Opció 3') + , (14, 'es', 'Opción 3') + $$, + 'Should have removed the options’ translations' +); + +select bag_eq( + $$ select campsite_type_option_id, season_id, cost_per_night from campsite_type_option_cost $$, + $$ values (13, 16, 54) + , (14, 16, 74) + $$, + 'Should have removed the options’ translations' +); + + +select * +from finish(); + +rollback; diff --git a/verify/remove_campsite_type_option.sql b/verify/remove_campsite_type_option.sql new file mode 100644 index 0000000..450252a --- /dev/null +++ b/verify/remove_campsite_type_option.sql @@ -0,0 +1,7 @@ +-- Verify camper:remove_campsite_type_option on pg + +begin; + +select has_function_privilege('camper.remove_campsite_type_option(integer)', 'execute'); + +rollback; diff --git a/web/templates/admin/campsite/option/index.gohtml b/web/templates/admin/campsite/option/index.gohtml index 9a64b7f..6114fba 100644 --- a/web/templates/admin/campsite/option/index.gohtml +++ b/web/templates/admin/campsite/option/index.gohtml @@ -28,9 +28,11 @@ {{( pgettext "Name" "header" )}} + {{( pgettext "Actions" "header" )}} + {{ $confirm := (gettext "Are you sure you wish to delete this option?")}} {{ range .Options -}} @@ -38,6 +40,13 @@ {{ .Name }} + + + {{- end }}