<%= label_tag "child_product_category", t(".form.menopause_age") %>
+ <%= image_tag "icons/info-circle.svg", class: "info-image" %>
+ <%= label_tag "child_product_category", t(".form.menopause_age_info"), class: "info-label" %>
<%= form.input_field :menopause_age,
- type: "number",
- class: "form_fild price_select rounded w-100 form-control mb-0",
- data: { mhc_calculator_target: "menopauseAge" } %>
+ type: "number",
+ class: "form_fild price_select rounded w-100 form-control mb-0",
+ placeholder: "48",
+ data: { mhc_calculator_target: "menopauseAge" } %>
<%= label_tag "child_product_category", t(".form.average_menstruation_cycle_duration") %>
diff --git a/config/locales/en/en.yml b/config/locales/en/en.yml
index c497785e4..f5adc0ea3 100644
--- a/config/locales/en/en.yml
+++ b/config/locales/en/en.yml
@@ -79,11 +79,11 @@ en:
use_less_link: https://zerowastelviv.org.ua/en/zero-waste-nappies-en/
mhc_description_block:
mhc_description_block_html:
- "These data are approximate, and exact values may vary depending on your individual needs and habits.
+ "These data are approximate, and exact values may vary depending on your individual needs and habits.
Using reusable menstrual products can significantly reduce waste and serve as a cost-effective alternative to disposable options.
- You can optimize the use of these products at any stage, which will help lower expenses and increase comfort.
- We recommend exploring methods for the effective use of reusable menstrual products and learning about their benefits.
- More %{information_link} about the calculations regarding the quantity and cost of these products can be found in our materials
+ You can optimize the use of these products at any stage, which will help lower expenses and increase comfort.
+ We recommend exploring methods for the effective use of reusable menstrual products and learning about their benefits.
+ More %{information_link} about the calculations regarding the quantity and cost of these products can be found in our materials
or by %{contact_link} with your questions."
information_link_text: "detailed information"
contact_link_text: "contacting us"
@@ -99,7 +99,8 @@ en:
user_age: "Your age"
menstruation_age: "Age at First Menstruation"
menopause_age: "Age at Menopause"
- average_menstruation_cycle_duration: "Average Menstrual Cycle Duration (days)"
+ menopause_age_info: "NEED TO BE CHANGED!!! Waiting for information"
+ average_menstruation_cycle_duration: "Average Menstrual Cycle Duration (mainly 21-35 days)"
pads_per_cycle: "Average Products Used Per Cycle"
pad_category: "Product Category"
budgetary: "Budgetary"
@@ -167,7 +168,7 @@ en:
about_us: "About us"
admin: "Admin"
calculate: "Diaper calculator"
- mhc_calculator: "Pad calculator"
+ mhc_calculator: "Menstrual calculator"
log_out: "Log Out"
sign_up: "Sign Up"
log_in: "Log In"
diff --git a/config/locales/uk/uk.yml b/config/locales/uk/uk.yml
index 2c42a20c9..92c23578d 100644
--- a/config/locales/uk/uk.yml
+++ b/config/locales/uk/uk.yml
@@ -48,11 +48,11 @@ uk:
use_less_link: "https://zerowastelviv.org.ua/zero-waste-nappies/"
mhc_description_block:
mhc_description_block_html:
- "Ці дані є орієнтовними, і точні значення можуть варіюватися залежно від ваших індивідуальних потреб та звичок.
- Використання багаторазових менструальних засобів може значно зменшити кількість відходів і стати економічно
- вигідною альтернативою одноразовим продуктам. Ви можете оптимізувати використання цих засобів на будь-якому етапі,
- що дозволить знизити витрати та підвищити комфорт. Ми рекомендуємо ознайомитися з методами ефективного використання
- багаторазових менструальних продуктів та їх перевагами. Більш %{information_link} про розрахунки кількості та вартості
+ "Ці дані є орієнтовними, і точні значення можуть варіюватися залежно від ваших індивідуальних потреб та звичок.
+ Використання багаторазових менструальних засобів може значно зменшити кількість відходів і стати економічно
+ вигідною альтернативою одноразовим продуктам. Ви можете оптимізувати використання цих засобів на будь-якому етапі,
+ що дозволить знизити витрати та підвищити комфорт. Ми рекомендуємо ознайомитися з методами ефективного використання
+ багаторазових менструальних продуктів та їх перевагами. Більш %{information_link} про розрахунки кількості та вартості
цих продуктів можна знайти в наших матеріалах або звернувшись %{contact_link} з вашими питаннями."
information_link_text: "детальну інформацію"
contact_link_text: "до нас"
@@ -68,7 +68,8 @@ uk:
user_age: "Ваш вік"
menstruation_age: "Вік початку менструації"
menopause_age: "Вік настання менопаузи"
- average_menstruation_cycle_duration: "Середня тривалість менструального циклу (дні)"
+ menopause_age_info: "НЕОБІХІДНО ЗМІНИТИ!!! Інформація від замовника очікується"
+ average_menstruation_cycle_duration: "Середня тривалість менструального циклу (переважно 21-35 днів)"
pads_per_cycle: "Середня кількість засобів гігієни за цикл"
pad_category: "Категорія засобів гігієни"
budgetary: "Бюджетна"
@@ -150,7 +151,7 @@ uk:
admin: "Адміністратор"
calculate: "Калькулятор підгузків"
log_out: "Вийти"
- mhc_calculator: "Калькулятор прокладок"
+ mhc_calculator: "Mенструальний калькулятор"
sign_up: "Зареєструватися"
log_in: "Увійти"
contact_us: "Зв'яжіться з нами"
diff --git a/db/schema.rb b/db/schema.rb
index f9d11adeb..1fd5f5399 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -54,15 +54,15 @@
end
create_table "calculators", force: :cascade do |t|
- t.uuid "uuid", default: -> { "gen_random_uuid()" }, null: false
- t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "slug"
- t.boolean "preferable", default: false, null: false
- t.index ["name"], name: "index_calculators_on_name", unique: true
+ t.string "uk_name", default: "", null: false
+ t.string "en_name", default: "", null: false
+ t.string "color", default: "#8fba3b"
+ t.text "uk_notes"
+ t.text "en_notes"
t.index ["slug"], name: "index_calculators_on_slug", unique: true
- t.index ["uuid"], name: "index_calculators_on_uuid", unique: true
end
create_table "categories", force: :cascade do |t|
@@ -70,10 +70,11 @@
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "priority", default: 0, null: false
- t.boolean "preferable", default: false, null: false
t.string "en_name"
- t.index "lower((en_name)::text)", name: "index_categories_on_en_name", unique: true
- t.index "lower((uk_name)::text)", name: "index_categories_on_uk_name", unique: true
+ t.decimal "price", precision: 10, scale: 2, default: "0.0", null: false
+ t.bigint "field_id"
+ t.boolean "preferable", default: false, null: false
+ t.index ["field_id"], name: "index_categories_on_field_id"
end
create_table "category_categoryables", force: :cascade do |t|
@@ -107,21 +108,15 @@
end
create_table "fields", force: :cascade do |t|
- t.uuid "uuid", default: -> { "gen_random_uuid()" }, null: false
- t.bigint "calculator_id", null: false
- t.string "selector", null: false
- t.string "type", null: false
- t.string "label"
- t.string "name"
- t.string "value"
- t.integer "from"
- t.integer "to"
- t.integer "kind", null: false
+ t.string "kind", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "unit", default: 0
+ t.string "uk_label", default: "", null: false
+ t.string "en_label", default: "", null: false
+ t.string "var_name", default: "", null: false
+ t.bigint "calculator_id", null: false
t.index ["calculator_id"], name: "index_fields_on_calculator_id"
- t.index ["uuid"], name: "index_fields_on_uuid", unique: true
end
create_table "flipper_features", force: :cascade do |t|
@@ -142,6 +137,19 @@
t.index ["feature_key", "key", "value"], name: "index_flipper_gates_on_feature_key_and_key_and_value", unique: true
end
+ create_table "formulas", force: :cascade do |t|
+ t.string "expression", default: "", null: false
+ t.string "uk_label", default: "", null: false
+ t.string "en_label", default: "", null: false
+ t.string "uk_unit"
+ t.string "en_unit"
+ t.bigint "calculator_id", null: false
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.integer "priority", default: 0, null: false
+ t.index ["calculator_id"], name: "index_formulas_on_calculator_id"
+ end
+
create_table "messages", force: :cascade do |t|
t.string "title", null: false
t.string "message", null: false
@@ -233,6 +241,9 @@
add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
add_foreign_key "authorizations", "users"
+ add_foreign_key "categories", "fields"
add_foreign_key "category_categoryables", "categories"
add_foreign_key "diapers_periods", "categories"
+ add_foreign_key "fields", "calculators"
+ add_foreign_key "formulas", "calculators"
end
From cf0a7d6d53d7e47aed564263f8a005bf7c99be70 Mon Sep 17 00:00:00 2001
From: DanielVajnagi <82052651+DanielVajnagi@users.noreply.github.com>
Date: Thu, 13 Feb 2025 12:28:53 +0200
Subject: [PATCH 2/9] removed schema file from PR
---
db/schema.rb | 249 ---------------------------------------------------
1 file changed, 249 deletions(-)
delete mode 100644 db/schema.rb
diff --git a/db/schema.rb b/db/schema.rb
deleted file mode 100644
index 1fd5f5399..000000000
--- a/db/schema.rb
+++ /dev/null
@@ -1,249 +0,0 @@
-# This file is auto-generated from the current state of the database. Instead
-# of editing this file, please use the migrations feature of Active Record to
-# incrementally modify your database, and then regenerate this schema definition.
-#
-# This file is the source Rails uses to define your schema when running `bin/rails
-# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
-# be faster and is potentially less error prone than running all of your
-# migrations from scratch. Old migrations may fail to apply correctly if those
-# migrations use external dependencies or application code.
-#
-# It's strongly recommended that you check this file into your version control system.
-
-ActiveRecord::Schema[7.2].define(version: 2025_01_23_135823) do
- # These are extensions that must be enabled in order to support this database
- enable_extension "pgcrypto"
- enable_extension "plpgsql"
-
- create_table "active_storage_attachments", force: :cascade do |t|
- t.string "name", null: false
- t.string "record_type", null: false
- t.bigint "record_id", null: false
- t.bigint "blob_id", null: false
- t.datetime "created_at", precision: nil, null: false
- t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id"
- t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
- end
-
- create_table "active_storage_blobs", force: :cascade do |t|
- t.string "key", null: false
- t.string "filename", null: false
- t.string "content_type"
- t.text "metadata"
- t.string "service_name", null: false
- t.bigint "byte_size", null: false
- t.string "checksum", null: false
- t.datetime "created_at", precision: nil, null: false
- t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
- end
-
- create_table "active_storage_variant_records", force: :cascade do |t|
- t.bigint "blob_id", null: false
- t.string "variation_digest", null: false
- t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
- end
-
- create_table "authorizations", force: :cascade do |t|
- t.string "uid"
- t.string "provider"
- t.bigint "user_id", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["uid", "provider"], name: "index_authorizations_on_uid_and_provider", unique: true
- t.index ["user_id"], name: "index_authorizations_on_user_id"
- end
-
- create_table "calculators", force: :cascade do |t|
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.string "slug"
- t.string "uk_name", default: "", null: false
- t.string "en_name", default: "", null: false
- t.string "color", default: "#8fba3b"
- t.text "uk_notes"
- t.text "en_notes"
- t.index ["slug"], name: "index_calculators_on_slug", unique: true
- end
-
- create_table "categories", force: :cascade do |t|
- t.string "uk_name"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.integer "priority", default: 0, null: false
- t.string "en_name"
- t.decimal "price", precision: 10, scale: 2, default: "0.0", null: false
- t.bigint "field_id"
- t.boolean "preferable", default: false, null: false
- t.index ["field_id"], name: "index_categories_on_field_id"
- end
-
- create_table "category_categoryables", force: :cascade do |t|
- t.bigint "category_id"
- t.string "categoryable_type"
- t.bigint "categoryable_id"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["category_id"], name: "index_category_categoryables_on_category_id"
- t.index ["categoryable_type", "categoryable_id", "category_id"], name: "unique_of_category_categoryables_index", unique: true
- t.index ["categoryable_type", "categoryable_id"], name: "index_category_categoryables_on_categoryable"
- end
-
- create_table "diapers_periods", force: :cascade do |t|
- t.bigint "category_id", null: false
- t.decimal "price", precision: 8, scale: 2, null: false
- t.integer "period_start", null: false
- t.integer "period_end", null: false
- t.integer "usage_amount", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["category_id"], name: "index_diapers_periods_on_category_id"
- end
-
- create_table "feature_flags", force: :cascade do |t|
- t.string "name", null: false
- t.boolean "enabled", default: false, null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["name"], name: "index_feature_flags_on_name", unique: true
- end
-
- create_table "fields", force: :cascade do |t|
- t.string "kind", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.integer "unit", default: 0
- t.string "uk_label", default: "", null: false
- t.string "en_label", default: "", null: false
- t.string "var_name", default: "", null: false
- t.bigint "calculator_id", null: false
- t.index ["calculator_id"], name: "index_fields_on_calculator_id"
- end
-
- create_table "flipper_features", force: :cascade do |t|
- t.string "key", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.text "en_description"
- t.text "uk_description"
- t.index ["key"], name: "index_flipper_features_on_key", unique: true
- end
-
- create_table "flipper_gates", force: :cascade do |t|
- t.string "feature_key", null: false
- t.string "key", null: false
- t.text "value"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["feature_key", "key", "value"], name: "index_flipper_gates_on_feature_key_and_key_and_value", unique: true
- end
-
- create_table "formulas", force: :cascade do |t|
- t.string "expression", default: "", null: false
- t.string "uk_label", default: "", null: false
- t.string "en_label", default: "", null: false
- t.string "uk_unit"
- t.string "en_unit"
- t.bigint "calculator_id", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.integer "priority", default: 0, null: false
- t.index ["calculator_id"], name: "index_formulas_on_calculator_id"
- end
-
- create_table "messages", force: :cascade do |t|
- t.string "title", null: false
- t.string "message", null: false
- t.string "email", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- end
-
- create_table "prices", force: :cascade do |t|
- t.decimal "sum", precision: 8, scale: 2
- t.string "priceable_type"
- t.bigint "priceable_id"
- t.integer "category_id"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["category_id", "priceable_id", "priceable_type"], name: "idx_on_category_id_priceable_id_priceable_type_1fa9ce7f24", unique: true
- t.index ["category_id"], name: "index_prices_on_category_id"
- t.index ["priceable_type", "priceable_id"], name: "index_prices_on_priceable"
- end
-
- create_table "product_types", force: :cascade do |t|
- t.uuid "uuid", default: -> { "gen_random_uuid()" }, null: false
- t.string "title"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["uuid"], name: "index_product_types_on_uuid", unique: true
- end
-
- create_table "products", force: :cascade do |t|
- t.uuid "uuid", default: -> { "gen_random_uuid()" }, null: false
- t.string "title"
- t.bigint "product_type_id"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.index ["product_type_id"], name: "index_products_on_product_type_id"
- t.index ["title"], name: "index_products_on_title", unique: true
- t.index ["uuid"], name: "index_products_on_uuid", unique: true
- end
-
- create_table "site_settings", force: :cascade do |t|
- t.string "title", default: "ZeroWaste", null: false
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- end
-
- create_table "users", force: :cascade do |t|
- t.string "email", default: "", null: false
- t.string "encrypted_password", default: "", null: false
- t.string "reset_password_token"
- t.datetime "reset_password_sent_at"
- t.datetime "remember_created_at"
- t.string "confirmation_token"
- t.datetime "confirmed_at"
- t.datetime "confirmation_sent_at"
- t.integer "failed_attempts", default: 0, null: false
- t.string "unlock_token"
- t.datetime "locked_at"
- t.datetime "created_at", null: false
- t.datetime "updated_at", null: false
- t.string "first_name", null: false
- t.string "last_name", null: false
- t.string "country"
- t.integer "sign_in_count", default: 0, null: false
- t.datetime "current_sign_in_at"
- t.datetime "last_sign_in_at"
- t.string "current_sign_in_ip"
- t.string "last_sign_in_ip"
- t.string "provider"
- t.string "uid"
- t.boolean "blocked", default: false, null: false
- t.integer "role", default: 0
- t.boolean "receive_recomendations", default: false, null: false
- t.index ["email"], name: "index_users_on_email", unique: true
- t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
- end
-
- create_table "versions", force: :cascade do |t|
- t.string "item_type"
- t.string "{:null=>false}"
- t.bigint "item_id", null: false
- t.string "event", null: false
- t.string "whodunnit"
- t.text "object"
- t.datetime "created_at"
- t.text "object_changes"
- t.index ["item_type", "item_id"], name: "index_versions_on_item_type_and_item_id"
- end
-
- add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
- add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
- add_foreign_key "authorizations", "users"
- add_foreign_key "categories", "fields"
- add_foreign_key "category_categoryables", "categories"
- add_foreign_key "diapers_periods", "categories"
- add_foreign_key "fields", "calculators"
- add_foreign_key "formulas", "calculators"
-end
From 9b23e8f4675a99a249fb2a60e341060e29b52b29 Mon Sep 17 00:00:00 2001
From: DanielVajnagi <82052651+DanielVajnagi@users.noreply.github.com>
Date: Thu, 13 Feb 2025 12:50:43 +0200
Subject: [PATCH 3/9] add images and updated schema file
---
app/assets/images/menstrual-cup.jpg | Bin 0 -> 2155434 bytes
app/assets/images/menstrual-disk.jpeg | Bin 0 -> 698473 bytes
app/assets/images/menstrual-panties.jpg | Bin 0 -> 432933 bytes
app/assets/images/reusable-pads.jpg | Bin 0 -> 1007273 bytes
db/schema.rb | 249 ++++++++++++++++++++++++
5 files changed, 249 insertions(+)
create mode 100644 app/assets/images/menstrual-cup.jpg
create mode 100644 app/assets/images/menstrual-disk.jpeg
create mode 100644 app/assets/images/menstrual-panties.jpg
create mode 100644 app/assets/images/reusable-pads.jpg
create mode 100644 db/schema.rb
diff --git a/app/assets/images/menstrual-cup.jpg b/app/assets/images/menstrual-cup.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..86ef3abbcf8f082bd68c93753924baab6786b5d9
GIT binary patch
literal 2155434
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