support ski and snowboard as gear

This commit is contained in:
Tim
2025-06-08 09:28:27 +02:00
parent 929f8a6989
commit 2fbcbdeed7
13 changed files with 42 additions and 16 deletions

View File

@@ -5,5 +5,5 @@ def validate_gear_id(gear_id: int):
core_dependencies.validate_id(id=gear_id, min=0, message="Invalid gear ID")
def validate_gear_type(gear_type: int):
# Check if gear type is between 1 and 3
core_dependencies.validate_type(type=gear_type, min=1, max=4, message="Invalid gear type")
# Check if gear type is within known id range
core_dependencies.validate_type(type=gear_type, min=1, max=6, message="Invalid gear type")

View File

@@ -30,7 +30,7 @@ class Gear(Base):
comment="Gear nickname (May include spaces)",
)
gear_type = Column(
Integer, nullable=False, comment="Gear type (1 - bike, 2 - shoes, 3 - wetsuit, 4 - racquet)"
Integer, nullable=False, comment="Gear type (1 - bike, 2 - shoes, 3 - wetsuit, 4 - racquet, 5 - ski, 6 - snowboard)"
)
user_id = Column(
Integer,

View File

@@ -188,9 +188,11 @@ The table bellow details the activity types supported by Endurain:
## Supported gear types
The table bellow details the gear types supported by Endurain:
| Name | Value |
| ---- | --- |
| Bike | 1 |
| Shoes | 2 |
| Wetsuit | 3 |
| Racquet | 4 |
| Name | Value |
|-----------|-------|
| Bike | 1 |
| Shoes | 2 |
| Wetsuit | 3 |
| Racquet | 4 |
| Ski | 5 |
| Snowboard | 6 |

View File

@@ -51,7 +51,7 @@ Endurain currently supports:
- Garmin Connect integration for syncing activities, gear and body composition
- Activity feeds and statistics (week/month)
- Basic activity privacy settings
- Gear tracking (wetsuits, bicycles, shoes, racquets)
- Gear tracking (wetsuits, bicycles, shoes, racquets, skis, snowboards)
- Default gear for activity types
- User pages with stats and activity histories
- Follower features (view activities)

View File

@@ -33,6 +33,8 @@
<option value="2">{{ $t("gearsAddEditGearModalComponent.addEditGearModalAddTypeOption2") }}</option>
<option value="3">{{ $t("gearsAddEditGearModalComponent.addEditGearModalAddTypeOption3") }}</option>
<option value="4">{{ $t("gearsAddEditGearModalComponent.addEditGearModalAddTypeOption4") }}</option>
<option value="5">{{ $t("gearsAddEditGearModalComponent.addEditGearModalAddTypeOption5") }}</option>
<option value="6">{{ $t("gearsAddEditGearModalComponent.addEditGearModalAddTypeOption6") }}</option>
</select>
<!-- date fields -->
<label for="gearDateAddEdit"><b>* {{ $t("gearsAddEditGearModalComponent.addEditGearModalAddDateLabel") }}</b></label>

View File

@@ -2,9 +2,11 @@
<li class="list-group-item d-flex justify-content-between px-0 bg-body-tertiary">
<div class="d-flex align-items-center">
<img src="/src/assets/avatar/bicycle1.png" alt="Bycicle avatar" width="55" height="55" class="rounded-circle" v-if="gear.gear_type == 1">
<img src="/src/assets/avatar/running_shoe1.png" alt="Bycicle avatar" width="55" height="55" class="rounded-circle" v-else-if="gear.gear_type == 2">
<img src="/src/assets/avatar/wetsuit1.png" alt="Bycicle avatar" width="55" height="55" class="rounded-circle" v-else-if="gear.gear_type == 3">
<img src="/src/assets/avatar/racquet1.png" alt="Bycicle avatar" width="55" height="55" class="rounded-circle" v-else>
<img src="/src/assets/avatar/running_shoe1.png" alt="running shoe avatar" width="55" height="55" class="rounded-circle" v-else-if="gear.gear_type == 2">
<img src="/src/assets/avatar/wetsuit1.png" alt="wetsuit avatar" width="55" height="55" class="rounded-circle" v-else-if="gear.gear_type == 3">
<img src="/src/assets/avatar/racquet1.png" alt="racquet avatar" width="55" height="55" class="rounded-circle" v-else-if="gear.gear_type == 4">
<img src="/src/assets/avatar/ski.png" alt="ski avatar" width="55" height="55" class="rounded-circle" v-else-if="gear.gear_type == 5">
<img src="/src/assets/avatar/snowboard.png" alt="snowboard avatar" width="55" height="55" class="rounded-circle" v-else>
<div class="ms-3">
<div class="fw-bold">
<router-link :to="{ name: 'gear', params: { id: gear.id }}" class="link-body-emphasis link-underline-opacity-0 link-underline-opacity-100-hover">
@@ -15,7 +17,9 @@
<span v-if="gear.gear_type == 1">{{ $t("gearsListComponent.gearListTypeOption1") }}</span>
<span v-else-if="gear.gear_type == 2">{{ $t("gearsListComponent.gearListTypeOption2") }}</span>
<span v-else-if="gear.gear_type == 3">{{ $t("gearsListComponent.gearListTypeOption3") }}</span>
<span v-else>{{ $t("gearsListComponent.gearListTypeOption4") }}</span>
<span v-else-if="gear.gear_type == 4">{{ $t("gearsListComponent.gearListTypeOption4") }}</span>
<span v-else-if="gear.gear_type == 5">{{ $t("gearsListComponent.gearListTypeOption5") }}</span>
<span v-else>{{ $t("gearsListComponent.gearListTypeOption6") }}</span>
<br>
</div>
</div>

View File

@@ -9,6 +9,8 @@
"addEditGearModalAddTypeOption2": "Schuhe",
"addEditGearModalAddTypeOption3": "Neoprenanzug",
"addEditGearModalAddTypeOption4": "Tennisschläger",
"addEditGearModalAddTypeOption5": "Ski",
"addEditGearModalAddTypeOption6": "Snowboard",
"addEditGearModalAddDateLabel": "Erstellt am",
"addEditGearModalAddIsActiveLabel": "Ist aktiv",
"addEditGearModalAddIsActiveOption1": "Aktiv",

View File

@@ -3,7 +3,9 @@
"gearListTypeOption1": "Fahrrad",
"gearListTypeOption2": "Schuhe",
"gearListTypeOption3": "Neoprenanzug",
"gearListTypeOption4": "Rack",
"gearListTypeOption4": "Tennisschläger",
"gearListTypeOption5": "Ski",
"gearListTypeOption6": "Snowboard",
"gearListGearIsInactiveBadge": "Inaktiv",
"gearListGearFromStrava": "Strava",
"gearListGearFromGarminConnect": "Garmin Connect",

View File

@@ -9,6 +9,8 @@
"gearTypeOption2": "Schuhe",
"gearTypeOption3": "Neoprenanzug",
"gearTypeOption4": "Tennisschläger",
"gearTypeOption5": "Ski",
"gearTypeOption6": "Snowboard",
"gearFromStrava": "Strava",
"gearFromGarminConnect": "Garmin Connect",
"labelBrand": "Hersteller",

View File

@@ -9,6 +9,8 @@
"addEditGearModalAddTypeOption2": "Shoes",
"addEditGearModalAddTypeOption3": "Wetsuit",
"addEditGearModalAddTypeOption4": "Racquet",
"addEditGearModelAddTypeOption5": "Ski",
"addEditGearModalAddTypeOption6": "Snowboard",
"addEditGearModalAddDateLabel": "Created date",
"addEditGearModalAddIsActiveLabel": "Is active",
"addEditGearModalAddIsActiveOption1": "Active",

View File

@@ -4,6 +4,8 @@
"gearListTypeOption2": "Shoes",
"gearListTypeOption3": "Wetsuit",
"gearListTypeOption4": "Racquet",
"gearListTypeOption5": "Ski",
"gearListTypeOption6": "Snowboard",
"gearListGearIsInactiveBadge": "Inactive",
"gearListGearFromStrava": "Strava",
"gearListGearFromGarminConnect": "Garmin Connect",

View File

@@ -9,6 +9,8 @@
"gearTypeOption2": "Shoes",
"gearTypeOption3": "Wetsuit",
"gearTypeOption4": "Racquet",
"gearTypeOption5": "Ski",
"gearTypeOption6": "Snowboard",
"gearFromStrava": "Strava",
"gearFromGarminConnect": "Garmin Connect",
"labelBrand": "Brand",

View File

@@ -38,9 +38,15 @@
<span class="ms-2 badge bg-primary-subtle border border-primary-subtle text-primary-emphasis align-middle" v-else-if="gear?.gear_type == 3">
{{ $t("gearView.gearTypeOption3") }}
</span>
<span class="ms-2 badge bg-primary-subtle border border-primary-subtle text-primary-emphasis align-middle" v-else>
<span class="ms-2 badge bg-primary-subtle border border-primary-subtle text-primary-emphasis align-middle" v-else-if="gear?.gear_type == 4">
{{ $t("gearView.gearTypeOption4") }}
</span>
<span class="ms-2 badge bg-primary-subtle border border-primary-subtle text-primary-emphasis align-middle" v-else-if="gear?.gear_type == 5">
{{ $t("gearView.gearTypeOption5") }}
</span>
<span class="ms-2 badge bg-primary-subtle border border-primary-subtle text-primary-emphasis align-middle" v-else>
{{ $t("gearView.gearTypeOption6") }}
</span>
<span class="ms-2 badge bg-primary-subtle border border-primary-subtle text-primary-emphasis align-middle" v-if="gear?.strava_gear_id">
{{ $t("gearView.gearFromStrava") }}
</span>