mix format

This commit is contained in:
Nir
2025-04-12 12:30:15 +03:00
parent d29b3e4ae4
commit bbfe5aaa9f
8 changed files with 230 additions and 86 deletions
@@ -14,6 +14,7 @@
</div>
</div>
</figure>
<input
id={"position_#{@car.id}"}
type="text"
@@ -23,10 +24,12 @@
disabled
/>
</div>
<div class="card-content">
<div class="media is-flex mb-5">
<div class="media-content">
<p class="title is-5"><%= @summary.display_name %></p>
<%= unless is_nil(@car.model) do %>
<p class="subtitle is-6 has-text-weight-light">
Model <%= @car.model %>
@@ -44,6 +47,7 @@
</p>
<% end %>
</div>
<div class="icons ml-5">
<span
class={"#{if @fetch_status, do: "", else: "is-hidden "}spinner has-tooltip-top has-tooltip-left-mobile"}
@@ -51,6 +55,7 @@
>
<span class="is-loading"></span>
</span>
<%= if @summary.is_preconditioning do %>
<span
class="icon has-text-grey-dark has-tooltip-top has-tooltip-left-mobile"
@@ -59,6 +64,7 @@
<span class="mdi mdi-air-conditioner"></span>
</span>
<% end %>
<%= if @summary.climate_keeper_mode == "dog" do %>
<span
class="icon has-text-grey-dark has-tooltip-top has-tooltip-left-mobile"
@@ -67,6 +73,7 @@
<span class="mdi mdi-dog-side"></span>
</span>
<% end %>
<%= if not is_nil(@summary.battery_level) and not is_nil(@summary.usable_battery_level) and @summary.battery_level - @summary.usable_battery_level > 2 do %>
<span
class="icon has-text-link has-tooltip-top has-tooltip-left-mobile"
@@ -75,6 +82,7 @@
<span class="mdi mdi-snowflake"></span>
</span>
<% end %>
<%= if @summary.state != :driving and @summary.is_user_present do %>
<span
class="icon has-text-grey-dark has-tooltip-top has-tooltip-left-mobile"
@@ -83,6 +91,7 @@
<span class="mdi mdi-account"></span>
</span>
<% end %>
<%= if @summary.plugged_in == true do %>
<span
class="icon has-text-grey-dark has-tooltip-top has-tooltip-left-mobile"
@@ -91,6 +100,7 @@
<span class="mdi mdi-power-plug"></span>
</span>
<% end %>
<%= if @summary.windows_open do %>
<span
class="icon has-text-grey-dark has-tooltip-top has-tooltip-left-mobile"
@@ -99,6 +109,7 @@
<span class="mdi mdi-window-open"></span>
</span>
<% end %>
<%= if @summary.doors_open do %>
<span
class="icon has-text-grey-dark has-tooltip-top has-tooltip-left-mobile"
@@ -107,6 +118,7 @@
<span class="mdi mdi-car-door"></span>
</span>
<% end %>
<%= if @summary.sentry_mode do %>
<span
class="icon has-text-grey-dark has-tooltip-top has-tooltip-left-mobile"
@@ -115,6 +127,7 @@
<span class="mdi mdi-shield-check"></span>
</span>
<% end %>
<%= if @summary.center_display_state == 7 do %>
<span
class="icon has-text-grey-dark has-tooltip-top has-tooltip-left-mobile"
@@ -123,6 +136,7 @@
<span class="mdi mdi-cctv"></span>
</span>
<% end %>
<%= unless is_nil(@summary.locked) do %>
<span
class="icon has-text-grey-dark has-tooltip-top has-tooltip-left-mobile"
@@ -135,6 +149,7 @@
</span>
</span>
<% end %>
<%= if @summary.update_available do %>
<span
class="icon has-text-grey-dark has-tooltip-top has-tooltip-left-mobile"
@@ -145,6 +160,7 @@
<span class="mdi mdi-gift-outline"></span>
</span>
<% end %>
<%= unless is_nil(@summary.tpms_soft_warning_fl) or is_nil(@summary.tpms_soft_warning_fr) or is_nil(@summary.tpms_soft_warning_rl) or is_nil(@summary.tpms_soft_warning_rr) do %>
<%= if @summary.tpms_soft_warning_fl or @summary.tpms_soft_warning_fr or @summary.tpms_soft_warning_rl or @summary.tpms_soft_warning_rr do %>
<% tires = [
@@ -152,20 +168,25 @@
{:fr, {@summary.tpms_soft_warning_fr, @summary.tpms_pressure_fr}},
{:rl, {@summary.tpms_soft_warning_rl, @summary.tpms_pressure_rl}},
{:rr, {@summary.tpms_soft_warning_rr, @summary.tpms_pressure_rr}}
] %>
<% tire_warnings =
] %> <% tire_warnings =
Enum.filter(tires, fn {_tire, {warn, _}} -> warn end)
|> Enum.map(fn
{:fl, {true, val}} -> "Front left (#{format_tpms(val, @settings.unit_of_pressure)})"
{:fr, {true, val}} -> "Front right (#{format_tpms(val, @settings.unit_of_pressure)})"
{:rl, {true, val}} -> "Rear left (#{format_tpms(val, @settings.unit_of_pressure)})"
{:rr, {true, val}} -> "Rear right (#{format_tpms(val, @settings.unit_of_pressure)})"
_ -> nil
end)
|> Enum.filter(& &1)
%>
{:fl, {true, val}} ->
"Front left (#{format_tpms(val, @settings.unit_of_pressure)})"
{:fr, {true, val}} ->
"Front right (#{format_tpms(val, @settings.unit_of_pressure)})"
{:rl, {true, val}} ->
"Rear left (#{format_tpms(val, @settings.unit_of_pressure)})"
{:rr, {true, val}} ->
"Rear right (#{format_tpms(val, @settings.unit_of_pressure)})"
_ ->
nil
end)
|> Enum.filter(& &1) %>
<span
class="icon has-text-grey-dark has-tooltip-top has-tooltip-left-mobile"
data-tooltip={
@@ -180,6 +201,7 @@
</span>
<% end %>
<% end %>
<%= if @summary.healthy == false do %>
<span
class="icon has-text-danger has-tooltip-top has-tooltip-left-mobile"
@@ -190,17 +212,21 @@
<% end %>
</div>
</div>
<div class="content">
<table class="table is-narrow is-fullwidth">
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody style="font-variant-numeric: tabular-nums;">
<tr>
<td class="has-text-weight-medium"><%= gettext("Status") %></td>
<td>
<%= raw(
@translate_state.(@summary.state) <>
@@ -216,6 +242,7 @@
) %>
</td>
</tr>
<%= if @summary.state == :charging and not is_nil(@summary.time_to_full_charge) do %>
<% current_time = Timex.now()
@@ -228,6 +255,7 @@
Timex.format!(local_finish_time, "%Y-%m-%d %H:%M:%S", :strftime) %>
<tr>
<td class="has-text-weight-medium"><%= gettext("Remaining Time") %></td>
<td>
<%= round(@summary.time_to_full_charge * 60 * 60)
|> Convert.sec_to_str()
@@ -235,11 +263,14 @@
|> Enum.join(", ") %>
</td>
</tr>
<tr>
<td class="has-text-weight-medium"><%= gettext("Expected Finish Time") %></td>
<td><%= formatted_finish_time %></td>
</tr>
<% end %>
<%= unless is_nil(@summary.ideal_battery_range_km) do %>
<tr>
<td class="has-text-weight-medium">
@@ -248,6 +279,7 @@
:rated -> gettext("Range (rated)")
end %>
</td>
<td>
<%= range =
case @settings.preferred_range do
@@ -263,9 +295,11 @@
</td>
</tr>
<% end %>
<%= unless is_nil(@summary.est_battery_range_km) do %>
<tr>
<td class="has-text-weight-medium"><%= gettext("Range (est.)") %></td>
<td>
<%= if @settings.unit_of_length == :mi do
"#{Convert.km_to_miles(@summary.est_battery_range_km, 1)} mi"
@@ -275,25 +309,30 @@
</td>
</tr>
<% end %>
<%= if @summary.state == :charging do %>
<%= unless is_nil(@summary.charge_energy_added) do %>
<tr>
<td class="has-text-weight-medium"><%= gettext("Charged") %></td>
<td><%= @summary.charge_energy_added %> kWh</td>
</tr>
<% end %>
<%= unless is_nil(@summary.charger_power) do %>
<tr>
<td class="has-text-weight-medium"><%= gettext("Charger Power") %></td>
<td><%= @summary.charger_power %> kW</td>
</tr>
<% end %>
<% end %>
<%= if @summary.plugged_in do %>
<%= unless @summary.scheduled_charging_start_time in [nil, :unknown] do %>
<tr>
<td class="has-text-weight-medium"><%= gettext("Scheduled Charging") %></td>
<td>
<%= tag(:span,
data: [date: @summary.scheduled_charging_start_time |> DateTime.to_iso8601()],
@@ -303,13 +342,16 @@
</td>
</tr>
<% end %>
<%= if not is_nil(@summary.charge_limit_soc) do %>
<tr>
<td class="has-text-weight-medium"><%= gettext("Charge Limit") %></td>
<td><%= @summary.charge_limit_soc %>%</td>
</tr>
<% end %>
<% end %>
<%= unless is_nil(@summary.battery_level) do %>
<% {soc_text, tooltip} =
(fn ->
@@ -345,6 +387,7 @@
end).() %>
<tr>
<td class="has-text-weight-medium"><%= gettext("State of Charge") %></td>
<td>
<span class="has-tooltip-top has-tooltip-right-desktop" data-tooltip={tooltip}>
<%= soc_text %>
@@ -352,9 +395,11 @@
</td>
</tr>
<% end %>
<%= if @summary.state == :driving and not is_nil(@summary.speed) do %>
<tr>
<td class="has-text-weight-medium"><%= gettext("Speed") %></td>
<td>
<%= if @settings.unit_of_length == :mi do
"#{Convert.km_to_miles(@summary.speed, 0)} mph"
@@ -364,10 +409,12 @@
</td>
</tr>
<% end %>
<%= if @summary.state not in [:asleep, :offline, :suspended] or DateTime.diff(DateTime.utc_now(), @summary.since) < 30*60 do %>
<%= unless is_nil(@summary.outside_temp) do %>
<tr>
<td class="has-text-weight-medium"><%= gettext("Outside Temperature") %></td>
<td>
<%= if @settings.unit_of_temperature == :F do
"#{Convert.celsius_to_fahrenheit(@summary.outside_temp, 1)} °F"
@@ -377,9 +424,11 @@
</td>
</tr>
<% end %>
<%= unless is_nil(@summary.inside_temp) do %>
<tr>
<td class="has-text-weight-medium"><%= gettext("Inside Temperature") %></td>
<td>
<%= if @settings.unit_of_temperature == :F do
"#{Convert.celsius_to_fahrenheit(@summary.inside_temp, 1)} °F"
@@ -390,9 +439,11 @@
</tr>
<% end %>
<% end %>
<%= unless is_nil(@summary.odometer) do %>
<tr>
<td class="has-text-weight-medium"><%= gettext("Mileage") %></td>
<td>
<%= if @settings.unit_of_length == :mi do
"#{Convert.km_to_miles(@summary.odometer, 0)} mi"
@@ -402,9 +453,11 @@
</td>
</tr>
<% end %>
<%= unless is_nil(@summary.version) do %>
<tr>
<td class="has-text-weight-medium"><%= gettext("Version") %></td>
<td>
<%= link(@summary.version,
to:
@@ -417,7 +470,7 @@
<% end %>
</tbody>
</table>
<%= cond do
<%= cond do
not is_nil(@error) ->
link(@error,
to: "#",
@@ -1,6 +1,7 @@
<nav class="breadcrumb" aria-label="breadcrumbs">
<ul>
<li><.link navigate={~p"/"}><%= gettext("Home") %></.link></li>
<li class="is-active"><.link navigate=""><%= gettext("Charge Cost") %></.link></li>
</ul>
</nav>
@@ -8,6 +9,7 @@
<.form :let={f} for={@changeset} phx-submit="save" class="charging_process">
<div class="field is-horizontal">
<div class="field-label"></div>
<div class="field-body">
<div class="field">
<div class="card-image">
@@ -24,7 +26,7 @@
style="height: 250px; position: relative;"
/>
</figure>
<%= text_input(:position, "#{@charging_process.id}",
<%= text_input(:position, "#{@charging_process.id}",
value:
"#{@charging_process.position.latitude},#{@charging_process.position.longitude}",
phx_hook: "TriggerChange",
@@ -36,9 +38,10 @@
</div>
</div>
</div>
<div class="field is-horizontal" style="margin-top: -6px;">
<div class="field-label is-normal"></div>
<div class="field-body">
<div class="field is-grouped is-grouped-multiline">
<%= unless is_nil(@charging_process.end_date) do %>
@@ -47,7 +50,7 @@
<span class="tag is-primary is-light">
<span class="icon"><span class="mdi mdi-calendar-range"></span></span>
</span>
<%= content_tag(:span, "–",
<%= content_tag(:span, "–",
data: [
start_date: DateTime.to_iso8601(@charging_process.start_date),
end_date: DateTime.to_iso8601(@charging_process.end_date)
@@ -59,22 +62,23 @@
</div>
</div>
<% end %>
<div class="control">
<div id="car-tag" class="tags has-addons">
<span class="tag is-info is-light">
<span class="icon"><span class="mdi mdi-car"></span></span>
</span>
<span class="tag"><%= @charging_process.car.name %></span>
<span class="tag"><%= @charging_process.car.name %></span>
</div>
</div>
<%= unless is_nil(@charging_process.charge_energy_added) do %>
<div class="control">
<div id="energy-tag" class="tags has-addons">
<span class="tag is-warning is-light">
<span class="icon"><span class="mdi mdi-flash"></span></span>
</span>
<span class="tag">
<%= Decimal.round(
Decimal.max(
@@ -87,23 +91,24 @@
</div>
</div>
<% end %>
<%= unless is_nil(@charging_process.duration_min) do %>
<div class="control">
<div id="duration-tag" class="tags has-addons">
<span class="tag is-light">
<span class="icon"><span class="mdi mdi-clock"></span></span>
</span>
<span class="tag"><%= @charging_process.duration_min %> min</span>
<span class="tag"><%= @charging_process.duration_min %> min</span>
</div>
</div>
<% end %>
<div class="control">
<div id="location-tag" class="tags has-addons">
<span class="tag is-danger is-light">
<span class="icon"><span class="mdi mdi-map-marker"></span></span>
</span>
<span class="tag">
<%= case @charging_process do
%ChargingProcess{geofence: %GeoFence{name: name}} ->
@@ -126,11 +131,12 @@
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-normal">
<%= label(f, :cost, gettext("Cost"), class: "label") %>
</div>
<div class="field-body">
<div class="field has-addons">
<p class="control">
@@ -142,6 +148,7 @@
]) %>
</span>
</p>
<p class="control is-expanded">
<%= text_input(f, :cost,
class: "input",
@@ -152,18 +159,21 @@
autofocus: true
) %>
</p>
<p class="help is-danger"><%= error_tag(f, :cost) %></p>
</div>
</div>
</div>
<div class="field is-horizontal mt-5">
<div class="field-label"></div>
<div class="field-body">
<div class="field is-grouped">
<div class="control">
<%= link(gettext("Back"), to: @redirect_to, class: "button") %>
</div>
<div class="control" style="min-width: 300px;">
<%= submit(if(is_nil(@notification), do: gettext("Save"), else: @notification.message),
phx_disable_with: gettext("Saving..."),
@@ -1,7 +1,9 @@
<nav class="breadcrumb" aria-label="breadcrumbs">
<ul>
<li><.link navigate={~p"/"}><%= gettext("Home") %></.link></li>
<li><.link navigate={~p"/geo-fences"}><%= gettext("Geo-Fences") %></.link></li>
<li class="is-active">
<a href="#">
<%= case @action do
@@ -18,52 +20,58 @@
<div class="field-label is-normal">
<%= label(f, :position, gettext("Position"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<div id="map_container" phx-update="ignore">
<figure id="map" style="height: 400px; position: relative;" phx-hook="Map"></figure>
</div>
<%= hidden_input(f, :latitude) %>
<%= hidden_input(f, :longitude) %>
<%= hidden_input(f, :radius) %>
<%= hidden_input(f, :latitude) %> <%= hidden_input(f, :longitude) %> <%= hidden_input(
f,
:radius
) %>
</div>
<%= if @show_errors do %>
<p class="help is-danger">
<%= error_tag(f, :address_id) %>
<%= error_tag(f, :latitude) %>
<%= error_tag(f, :longitude) %>
<%= error_tag(f, :radius) %>
<%= error_tag(f, :address_id) %> <%= error_tag(f, :latitude) %> <%= error_tag(
f,
:longitude
) %> <%= error_tag(f, :radius) %>
</p>
<% end %>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-normal">
<%= label class: "label" do
gettext("Name")
end %>
</div>
<div class="field-body">
<div class="field is-expanded">
<div class="control">
<%= text_input(f, :name, class: "input", placeholder: gettext("Name")) %>
</div>
<%= if @show_errors do %>
<p class="help is-danger"><%= error_tag(f, :name) %></p>
<% end %>
</div>
</div>
</div>
<div class="field is-horizontal mt-4">
<div class="field-label is-normal">
<%= label class: "label" do
gettext("Cost")
end %>
</div>
<div class="field-body">
<div class="field has-addons">
<p class="control">
@@ -74,6 +82,7 @@
]) %>
</span>
</p>
<p class="control is-expanded">
<%= text_input(f, :cost_per_unit,
class: "input",
@@ -83,19 +92,21 @@
placeholder: "0.00"
) %>
</p>
<%= if @show_errors do %>
<p class="help is-danger"><%= error_tag(f, :cost_per_unit) %></p>
<% end %>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-normal">
<%= label class: "label" do
gettext("Session fee")
end %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
@@ -108,15 +119,17 @@
placeholder: "0.00"
) %>
</div>
<%= if @show_errors do %>
<p class="help is-danger"><%= error_tag(f, :session_fee) %></p>
<% end %>
</div>
</div>
</div>
<div class="field is-horizontal mt-5">
<div class="field-label"></div>
<div class="field-body">
<div class="field is-grouped">
<div class="control">
@@ -124,6 +137,7 @@
<%= gettext("Back") %>
</.link>
</div>
<div class="control">
<%= submit(gettext("Save"),
phx_disable_with: gettext("Saving..."),
@@ -150,13 +164,16 @@
{if @show_modal, do: [phx_window_keyup: "keyup"], else: []}
>
</div>
<div class="modal-card modal-content">
<header class="modal-card-head">
<p class="modal-card-title"><%= gettext("Charging Costs") %></p>
<button class="button is-text is-rounded" aria-label="close" phx-click="close-modal">
<span class="icon is-small"><i class="mdi mdi-close"></i></span>
</button>
</header>
<section class="modal-card-body">
<p>
<%= raw(
@@ -169,10 +186,12 @@
) %>
</p>
</section>
<footer class="modal-card-foot">
<button class="button" phx-click="calc-costs" phx-value-result="no">
<%= gettext("Continue") %>
</button>
<button class="button is-info" phx-click="calc-costs" phx-value-result="yes">
<%= gettext("Add costs retroactively") %>
</button>
@@ -1,6 +1,7 @@
<nav class="breadcrumb" aria-label="breadcrumbs">
<ul>
<li><.link navigate={~p"/"}><%= gettext("Home") %></.link></li>
<li class="is-active">
<.link navigate={~p"/geo-fences"}><%= gettext("Geo-Fences") %></.link>
</li>
@@ -21,26 +22,33 @@
<thead class="is-hidden-mobile">
<tr>
<th><%= gettext("Name") %></th>
<th><%= gettext("Position") %></th>
<th><%= gettext("Radius") %></th>
<th></th>
</tr>
</thead>
<tbody style="font-variant-numeric: tabular-nums;">
<%= for geofence <- @geofences do %>
<tr>
<td class="has-text-weight-medium is-truncated" style="min-width: 0; max-width: 180px">
<%= geofence.name %>
</td>
<td class="is-hidden-mobile has-text-weight-light" style="width: 30%">
<%= geofence.latitude %>, <%= geofence.longitude %>
</td>
<td class="is-hidden-mobile has-text-weight-light" style="width: 10%">
<%= case @unit_of_length do
:ft -> geofence.radius |> Convert.m_to_ft() |> round()
:m -> geofence.radius |> round()
end %> <%= @unit_of_length %>
</td>
<td>
<div class="field is-grouped is-pulled-right">
<p class="control">
@@ -51,6 +59,7 @@
<span class="icon"><span class="mdi mdi-square-edit-outline"></span></span>
</.link>
</p>
<p class="control">
<%= link(raw("<span class='icon'><span class='mdi mdi-trash-can'></span></span>"),
to: "#",
@@ -1,6 +1,7 @@
<nav class="breadcrumb" aria-label="breadcrumbs">
<ul>
<li><.link navigate={~p"/"}><%= gettext("Home") %></.link></li>
<li class="is-active"><.link navigate=""><%= gettext("TeslaFi Import") %></.link></li>
</ul>
</nav>
@@ -14,7 +15,7 @@
count: length(@status.files)
) %>
</h2>
<%= link(raw("<span class='icon'><span class='mdi mdi-reload'></span></span>"),
<%= link(raw("<span class='icon'><span class='mdi mdi-reload'></span></span>"),
to: "#",
type: "button",
class: "button is-text is-inverted",
@@ -26,6 +27,7 @@
<div class="table-container">
<table class="table is-narrow is-hoverable is-fullwidth">
<thead></thead>
<tbody>
<%= for %{path: path, date: date, complete: complete} <- @status.files do %>
<% {year, month} =
@@ -37,7 +39,9 @@
end %>
<tr>
<td style="font-variant-numeric: tabular-nums;"><%= "#{month}/#{year}" %></td>
<td><%= Path.absname(path) %></td>
<td class="has-text-centered" style="min-width: 30px;">
<span class="spinner">
<%= case {@status.state, complete} do %>
@@ -83,7 +87,7 @@
</div>
</div>
</div>
<div class="field">
<div class="control">
<%= submit(gettext("Import"),
@@ -1,6 +1,7 @@
<nav class="breadcrumb" aria-label="breadcrumbs">
<ul>
<li><.link navigate={~p"/"}><%= gettext("Home") %></.link></li>
<li class="is-active"><.link navigate={~p"/settings"}><%= gettext("Settings") %></.link></li>
</ul>
</nav>
@@ -17,7 +18,7 @@
</ul>
</div>
<% end %>
<.form
:let={f}
for={get_in(@car_settings, [@car, :changeset])}
@@ -27,31 +28,37 @@
<div class="columns is-mobile is-centered">
<div class="column">
<h2 class="title is-4"><%= gettext("Data Collection") %></h2>
<div class="field is-horizontal center-vertically">
<div class="field-label is-normal is-paddingless">
<%= label(f, :enabled, gettext("Enabled"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<%= checkbox(f, :enabled, class: "switch is-rounded is-success") %>
<%= label(f, :enabled, nil) %>
<%= checkbox(f, :enabled, class: "switch is-rounded is-success") %> <%= label(
f,
:enabled,
nil
) %>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="columns is-mobile is-centered">
<div class="column">
<h2 class="title is-4"><%= gettext("Sleep Mode") %></h2>
<%= unless Ecto.Changeset.get_field(f.source, :use_streaming_api) do %>
<div class="field is-horizontal center-vertically">
<div class="field-label is-normal">
<%= label(f, :suspend_min, gettext("Time to Try Sleeping"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
@@ -65,16 +72,19 @@
) %>
</div>
</div>
<p class="help is-danger"><%= error_tag(f, :suspend_min) %></p>
</div>
</div>
</div>
<div class="field is-horizontal center-vertically">
<div class="field-label is-normal">
<%= label(f, :suspend_after_idle_min, gettext("Idle Time Before Trying to Sleep"),
class: "label"
) %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
@@ -88,16 +98,18 @@
) %>
</div>
</div>
<p class="help is-danger"><%= error_tag(f, :suspend_after_idle_min) %></p>
</div>
</div>
</div>
<% end %>
<div class="field is-horizontal mb-0">
<div class="field-label is-normal is-paddingless">
<label class="label"><%= gettext("Requirements") %></label>
</div>
<div class="field-body">
<div class="field" style="min-width: 280px;">
<div class="control">
@@ -116,57 +128,72 @@
</div>
</div>
</div>
<div class="columns is-mobile is-centered">
<div class="column">
<h2 class="title is-4"><%= gettext("Charge cost") %></h2>
<div class="field is-horizontal center-vertically">
<div class="field-label is-normal is-paddingless">
<%= label(f, :free_supercharging, gettext("Free Supercharging"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<%= checkbox(f, :free_supercharging, class: "switch is-rounded is-success") %>
<%= label(f, :free_supercharging, nil) %>
<%= checkbox(f, :free_supercharging, class: "switch is-rounded is-success") %> <%= label(
f,
:free_supercharging,
nil
) %>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="columns is-mobile is-centered">
<div class="column">
<h2 class="title is-4"><%= gettext("Streaming API") %></h2>
<div class="field is-horizontal center-vertically">
<div class="field-label is-normal is-paddingless">
<%= label(f, :use_streaming_api, gettext("Enabled"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<%= checkbox(f, :use_streaming_api, class: "switch is-rounded is-success") %>
<%= label(f, :use_streaming_api, nil) %>
<%= checkbox(f, :use_streaming_api, class: "switch is-rounded is-success") %> <%= label(
f,
:use_streaming_api,
nil
) %>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="columns is-mobile is-centered">
<div class="column">
<h2 class="title is-4"><%= gettext("Battery") %></h2>
<div class="field is-horizontal center-vertically">
<div class="field-label is-normal is-paddingless">
<%= label(f, :lfp_battery, gettext("LFP Battery"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
<%= checkbox(f, :lfp_battery, class: "switch is-rounded is-success") %>
<%= label(f, :lfp_battery, nil) %>
<%= checkbox(f, :lfp_battery, class: "switch is-rounded is-success") %> <%= label(
f,
:lfp_battery,
nil
) %>
</div>
</div>
</div>
@@ -184,12 +211,14 @@
<div class="columns is-mobile is-centered">
<div class="column">
<h2 class="title is-4"><%= gettext("Range") %></h2>
<div class="field is-horizontal center-vertically">
<div class="field-label is-normal">
<%= label f, :preferred_range, class: "label has-tooltip-multiline", data_tooltip: gettext("The car's estimate of remaining range is based on a fixed energy consumption in Wh/km. The Wh/km factor is determined by Tesla and is not country specific whereas the rated range is based on regulatory tests in the different markets for that vehicle.") do %>
<%= gettext("Preferred Range") %><span class="icon is-small">&nbsp;<span class="mdi mdi-information"></span></span>
<% end %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
@@ -200,21 +229,23 @@
]) %>
</div>
</div>
<p class="help is-danger"><%= error_tag(f, :preferred_range) %></p>
</div>
</div>
</div>
</div>
</div>
<div class="columns is-mobile is-centered">
<div class="column">
<h2 class="title is-4"><%= gettext("Language") %></h2>
<div class="field is-horizontal">
<div class="field-label is-normal">
<%= label(f, :ui, gettext("Web App"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
@@ -225,11 +256,12 @@
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-normal">
<%= label(f, :language, gettext("Addresses"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
@@ -239,20 +271,23 @@
) %>
</div>
</div>
<p class="help is-danger"><%= @refresh_error || error_tag(f, :language) %></p>
</div>
</div>
</div>
</div>
</div>
<div class="columns is-mobile is-centered">
<div class="column">
<h2 class="title is-4"><%= gettext("Units") %></h2>
<div class="field is-horizontal">
<div class="field-label is-normal">
<%= label(f, :unit_of_length, gettext("Length"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
@@ -260,14 +295,17 @@
<%= select(f, :unit_of_length, [:km, :mi]) %>
</div>
</div>
<p class="help is-danger"><%= error_tag(f, :unit_of_length) %></p>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-normal">
<%= label(f, :unit_of_temperature, gettext("Temperature"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
@@ -275,14 +313,17 @@
<%= select(f, :unit_of_temperature, "°C": :C, "°F": :F) %>
</div>
</div>
<p class="help is-danger"><%= error_tag(f, :unit_of_temperature) %></p>
</div>
</div>
</div>
<div class="field is-horizontal">
<div class="field-label is-normal">
<%= label(f, :unit_of_pressure, gettext("Tire Pressure"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
@@ -290,20 +331,23 @@
<%= select(f, :unit_of_pressure, [:bar, :psi]) %>
</div>
</div>
<p class="help is-danger"><%= error_tag(f, :unit_of_pressure) %></p>
</div>
</div>
</div>
</div>
</div>
<div class="columns is-mobile is-centered">
<div class="column">
<h2 class="title is-4"><%= gettext("URLs") %></h2>
<div class="field is-horizontal center-vertically">
<div class="field-label is-normal">
<%= label(f, :base_url, gettext("Web App"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
@@ -314,15 +358,17 @@
placeholder: "teslamate.example.com"
) %>
</div>
<p class="help is-danger"><%= error_tag(f, :base_url) %></p>
</div>
</div>
</div>
<div class="field is-horizontal center-vertically">
<div class="field-label is-normal">
<%= label(f, :grafana_url, gettext("Dashboards"), class: "label") %>
</div>
<div class="field-body">
<div class="field">
<div class="control">
@@ -333,6 +379,7 @@
placeholder: "grafana.example.com"
) %>
</div>
<p class="help is-danger"><%= error_tag(f, :grafana_url) %></p>
</div>
</div>
@@ -347,6 +394,7 @@
<tbody>
<tr>
<th align="right"><%= gettext("Version") %></th>
<td>
<%= Application.spec(:teslamate, :vsn) %><strong><%= if @update do
vsn = link @update, to: "https://github.com/teslamate-org/teslamate/releases",
@@ -356,8 +404,10 @@
end %></strong>
</td>
</tr>
<tr>
<th align="right"><%= gettext("GitHub") %></th>
<td>
<%= link("teslamate-org/teslamate",
to: "https://github.com/teslamate-org/teslamate",
@@ -366,8 +416,10 @@
) %>
</td>
</tr>
<tr>
<th align="right"><%= gettext("Documentation") %></th>
<td>
<%= link("docs.teslamate.org",
to: "https://docs.teslamate.org",
@@ -13,7 +13,7 @@
Error: <%= @error %>
</div>
<% end %>
<%= if @token == "" do %>
<div class="field">
<%= label(f, :access, gettext("Access Token"), class: "label") %>
@@ -30,7 +30,7 @@
</span>
</div>
</div>
<div class="field">
<%= label(f, :refresh, gettext("Refresh Token"), class: "label") %>
<div class="control has-icons-left">
@@ -53,9 +53,7 @@
to: @provider,
target: "_blank",
rel: "noopener noreferrer"
) %>
<%= raw(
) %> <%= raw(
gettext(
"You are using the API key (%{token}) provided by %{url}. It will allow your TeslaMate to access the official Tesla Fleet API and Tesla Telemetry streaming.",
token: @token,
@@ -64,7 +62,7 @@
) %>
</p>
<% end %>
<div class="field mt-5">
<div class="control">
<%= submit(gettext("Sign in"),
@@ -85,7 +83,7 @@
) %>
</div>
</div>
<%= if @token == "" do %>
<p class="is-size-7 has-text-centered is-italic has-text-weight-light">
<% here_link =
@@ -93,9 +91,7 @@
to: "https://docs.teslamate.org/docs/faq#how-to-generate-your-own-tokens",
target: "_blank",
rel: "noopener noreferrer"
) %>
<%= raw(
) %> <%= raw(
gettext(
"Obtaining tokens through the Tesla API requires programming experience or a 3rd-party service. Information can be found %{here}.",
here: safe_to_string(here_link)
@@ -1,12 +1,12 @@
<!DOCTYPE html>
<html lang={Plug.Conn.get_session(@conn, :locale)}>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<.live_title suffix=" · TeslaMate">
<%= assigns[:page_title] || "Home" %>
</.live_title>
<link phx-track-static rel="stylesheet" href={Routes.static_path(@conn, "/assets/app.css")} />
<link
rel="apple-touch-icon"
@@ -34,15 +34,14 @@
rel="mask-icon"
href={Routes.static_path(@conn, "/safari-pinned-tab.svg?v=5AB53N3ALo")}
color="#363636"
/>
<link rel="shortcut icon" href={Routes.static_path(@conn, "/favicon.ico?v=5AB53N3ALo")} />
/> <link rel="shortcut icon" href={Routes.static_path(@conn, "/favicon.ico?v=5AB53N3ALo")} />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="msapplication-TileColor" content="#ffffff" />
<meta name="theme-color" content="#363636" />
<%= csrf_meta_tag() %>
<meta name="theme-color" content="#363636" /> <%= csrf_meta_tag() %>
<script>
window.LIVE_PATH = "<%= Routes.static_path(@conn, "/live") %>";
</script>
<script
defer
phx-track-static
@@ -51,6 +50,7 @@
>
</script>
</head>
<body tabIndex="0">
<nav class="navbar is-dark" role="navigation" aria-label="main navigation">
<div class="container">
@@ -61,7 +61,7 @@
width: "90px"
) %>
</a>
<a
role="button"
class="navbar-burger burger"
@@ -69,12 +69,11 @@
aria-expanded="false"
data-target="navbar"
>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span>
<span aria-hidden="true"></span> <span aria-hidden="true"></span>
<span aria-hidden="true"></span>
</a>
</div>
<div id="navbar" class="navbar-menu">
<div class="navbar-end">
<%= if grafana_url = @conn.assigns.settings.grafana_url do %>
@@ -82,6 +81,7 @@
<a class="navbar-link is-arrowless">
<span class="icon"><i class="mdi mdi-view-dashboard"></i></span>&nbsp;<span><%= gettext "Dashboards" %></span>
</a>
<div class="navbar-dropdown">
<%= for %{"title" => title, "uid" => uid} <- list_dashboards() do %>
<%= link(title,
@@ -94,12 +94,14 @@
</div>
</div>
<% end %>
<.link
navigate={Routes.live_path(@conn, TeslaMateWeb.GeoFenceLive.Index)}
class="navbar-item mr-5"
>
<span class="icon"><i class="mdi mdi-map-marker-radius"></i></span>&nbsp;<span><%= gettext("Geo-Fences") %></span>
</.link>
<.link
navigate={Routes.live_path(@conn, TeslaMateWeb.SettingsLive.Index)}
class="navbar-item mr-5"
@@ -110,9 +112,7 @@
</div>
</div>
</nav>
<% update = TeslaMate.Updater.get_update() %>
<% update = TeslaMate.Updater.get_update() %>
<main
role="main"
style="overflow: hidden;"
@@ -127,13 +127,13 @@
target: "_blank",
rel: "noopener noreferrer"
) %>
<div class="notification is-warning">
<p class="title is-5 is-spaced">
<span class="icon"><i class="mdi mdi-shield-alert"></i></span>&nbsp;<%= gettext(
"No encryption key provided"
) %>
</p>
<p class="subtitle is-6">
<%= raw(
gettext(
@@ -141,6 +141,7 @@
)
) %>
</p>
<p class="subtitle is-6">
<%= raw(
gettext(
@@ -148,6 +149,7 @@
)
) %>
</p>
<p class="subtitle is-6">
<%= raw(
gettext("For more information, see the updated installation guides on %{link}",
@@ -157,15 +159,14 @@
</p>
</div>
<% end %>
<%= Enum.map(@flash, fn {flash_key, flash_message} -> %>
<p class={"notification is-#{flash_key}"}><%= flash_message %></p>
<% end) %>
<%= @inner_content %>
<%= @inner_content %>
</div>
</main>
<footer class="footer">
<div class="content has-text-centered">
<%= if update do %>