From c74817bd4ec3e1f62fa319f2040df6179904d851 Mon Sep 17 00:00:00 2001 From: Kevin Cantrell Date: Fri, 17 Apr 2026 11:06:05 +0900 Subject: [PATCH 1/2] bump dev --- src/app.html | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app.html b/src/app.html index ca67dd58..914ec836 100644 --- a/src/app.html +++ b/src/app.html @@ -15,3 +15,4 @@
%sveltekit.body%
+ From b7d4c63619251fdd0b57ca30d0a5c0942c170ea0 Mon Sep 17 00:00:00 2001 From: Kevin Cantrell Date: Fri, 17 Apr 2026 17:40:34 +0900 Subject: [PATCH 2/2] reports now have an end_of_day property and switch to activate it in the /reports page --- CLAUDE.md | 24 +- database.types.ts | 2350 +++++++++++++++++ messages/en.json | 2 + messages/ja.json | 2 + package.json | 3 +- pnpm-lock.yaml | 152 +- src/lib/api/api.dtos.ts | 2 + src/lib/components/layout/AppPage.svelte | 6 +- src/routes/demo/+page.svelte | 6 - src/routes/demo/paraglide/+page.svelte | 22 - src/routes/locations/+page.svelte | 2 +- .../locations/[location_id]/+page.svelte | 2 +- .../devices/[dev_eui]/+page.svelte | 23 +- .../devices/[dev_eui]/csvExportDialog.svelte | 2 +- .../devices/[dev_eui]/settings/+page.svelte | 2 + .../[location_id]/devices/create/+page.svelte | 2 +- .../[location_id]/settings/+page.svelte | 2 +- src/routes/locations/create/+page.svelte | 2 +- src/routes/reports/+page.svelte | 2 +- .../reports/[report_id]/edit/+page.server.ts | 2 +- .../reports/[report_id]/edit/+page.svelte | 10 +- .../edit/ReportCadenceSection.svelte | 8 +- .../[report_id]/edit/report-form.types.ts | 2 +- src/routes/rules/+page.svelte | 2 +- src/routes/rules/create/+page.svelte | 2 +- 25 files changed, 2558 insertions(+), 76 deletions(-) create mode 100644 database.types.ts delete mode 100644 src/routes/demo/+page.svelte delete mode 100644 src/routes/demo/paraglide/+page.svelte diff --git a/CLAUDE.md b/CLAUDE.md index 8811d7b6..d99d8c04 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -39,7 +39,7 @@ Every page that can be reached by navigating "into" something (create, edit, set **Always use:** ```svelte - goto(resolve('/target-route'))}> + goto(resolve('/target-route'))}> ← {m.action_back()} ``` @@ -404,6 +404,28 @@ import { AppActionRow, AppFormStack, AppNotice, AppPage, AppSection } from '$lib --- +## Scrollable list pages + +Pages such as `/reports` and `/rules` that render a `CwDataTable` **must remain vertically scrollable on all devices**. The app shell's `.app-shell__main` is the single scroll container (`overflow: auto`). `AppPage` uses `flex: 1 0 auto` (grow but never shrink) so that tall pages force `.app-shell__main` to scroll rather than compressing the content to fit the viewport. + +**Rules:** +- Never change `AppPage`'s flex to `1 1 auto` (shrinkable) — that re-breaks scrolling on every page. +- Never put `flex-1` or `min-h-0` on a `CwCard` that wraps a data table — it pins the card to viewport height. + +```svelte + + + + + + + + + +``` + +--- + ## Checklist for new pages ### UI diff --git a/database.types.ts b/database.types.ts new file mode 100644 index 00000000..9bda790f --- /dev/null +++ b/database.types.ts @@ -0,0 +1,2350 @@ +export type Json = + | string + | number + | boolean + | null + | { [key: string]: Json | undefined } + | Json[] + +export type Database = { + // Allows to automatically instantiate createClient with right options + // instead of createClient(URL, KEY) + __InternalSupabase: { + PostgrestVersion: "13.0.4" + } + public: { + Tables: { + api_keys: { + Row: { + api_key: string | null + created_at: string + Description: string | null + expires_at: string | null + id: number + owner_id: string + } + Insert: { + api_key?: string | null + created_at?: string + Description?: string | null + expires_at?: string | null + id?: number + owner_id?: string + } + Update: { + api_key?: string | null + created_at?: string + Description?: string | null + expires_at?: string | null + id?: number + owner_id?: string + } + Relationships: [ + { + foreignKeyName: "api_keys_owner_id_fkey" + columns: ["owner_id"] + isOneToOne: false + referencedRelation: "profiles" + referencedColumns: ["id"] + }, + ] + } + babylon_connection_types: { + Row: { + created_at: string + id: number + name: string + type_id: number + } + Insert: { + created_at?: string + id?: number + name: string + type_id?: number + } + Update: { + created_at?: string + id?: number + name?: string + type_id?: number + } + Relationships: [] + } + babylon_decoders: { + Row: { + created_at: string + decoder: string | null + decoder_id: number + id: number + name: string + } + Insert: { + created_at?: string + decoder?: string | null + decoder_id?: number + id?: number + name?: string + } + Update: { + created_at?: string + decoder?: string | null + decoder_id?: number + id?: number + name?: string + } + Relationships: [] + } + babylon_in_connections: { + Row: { + connection_id: number + connection_name: string + created_at: string + endpoint: string + id: number + password: string | null + port: number | null + profile_id: string + type: number + username: string | null + } + Insert: { + connection_id?: number + connection_name: string + created_at?: string + endpoint: string + id?: number + password?: string | null + port?: number | null + profile_id: string + type: number + username?: string | null + } + Update: { + connection_id?: number + connection_name?: string + created_at?: string + endpoint?: string + id?: number + password?: string | null + port?: number | null + profile_id?: string + type?: number + username?: string | null + } + Relationships: [ + { + foreignKeyName: "public_babylon_connections_profile_id_fkey" + columns: ["profile_id"] + isOneToOne: false + referencedRelation: "profiles" + referencedColumns: ["id"] + }, + { + foreignKeyName: "public_babylon_in_connections_type_fkey" + columns: ["type"] + isOneToOne: false + referencedRelation: "babylon_connection_types" + referencedColumns: ["type_id"] + }, + ] + } + babylon_input_output: { + Row: { + created_at: string + id: number + in_id: number + out_id: number + } + Insert: { + created_at?: string + id?: number + in_id: number + out_id: number + } + Update: { + created_at?: string + id?: number + in_id?: number + out_id?: number + } + Relationships: [ + { + foreignKeyName: "babylon_input_output_in_id_fkey" + columns: ["in_id"] + isOneToOne: false + referencedRelation: "babylon_in_connections" + referencedColumns: ["connection_id"] + }, + { + foreignKeyName: "babylon_input_output_out_id_fkey" + columns: ["out_id"] + isOneToOne: false + referencedRelation: "babylon_out_connections" + referencedColumns: ["connection_id"] + }, + ] + } + babylon_notifiers: { + Row: { + api_key: string | null + created_at: string + host: string | null + id: number + isSecure: boolean + name: string + notifier_id: number | null + password: string | null + port: number | null + type: number | null + username: string | null + } + Insert: { + api_key?: string | null + created_at?: string + host?: string | null + id?: number + isSecure?: boolean + name: string + notifier_id?: number | null + password?: string | null + port?: number | null + type?: number | null + username?: string | null + } + Update: { + api_key?: string | null + created_at?: string + host?: string | null + id?: number + isSecure?: boolean + name?: string + notifier_id?: number | null + password?: string | null + port?: number | null + type?: number | null + username?: string | null + } + Relationships: [] + } + babylon_notifiers_out_connections: { + Row: { + created_at: string + id: number + notifier_id: number + out_connection_id: number + } + Insert: { + created_at?: string + id?: number + notifier_id: number + out_connection_id: number + } + Update: { + created_at?: string + id?: number + notifier_id?: number + out_connection_id?: number + } + Relationships: [] + } + babylon_out_connections: { + Row: { + connection_id: number + connection_name: string + created_at: string + decoder: number | null + endpoint: string | null + id: number + password: string | null + port: number | null + profile_id: string + type: number + username: string | null + } + Insert: { + connection_id?: number + connection_name: string + created_at?: string + decoder?: number | null + endpoint?: string | null + id?: number + password?: string | null + port?: number | null + profile_id: string + type: number + username?: string | null + } + Update: { + connection_id?: number + connection_name?: string + created_at?: string + decoder?: number | null + endpoint?: string | null + id?: number + password?: string | null + port?: number | null + profile_id?: string + type?: number + username?: string | null + } + Relationships: [ + { + foreignKeyName: "public_babylon_out_connections_decoder_fkey" + columns: ["decoder"] + isOneToOne: false + referencedRelation: "babylon_decoders" + referencedColumns: ["decoder_id"] + }, + { + foreignKeyName: "public_babylon_out_connections_profile_id_fkey" + columns: ["profile_id"] + isOneToOne: false + referencedRelation: "profiles" + referencedColumns: ["id"] + }, + { + foreignKeyName: "public_babylon_out_connections_type_fkey" + columns: ["type"] + isOneToOne: false + referencedRelation: "babylon_connection_types" + referencedColumns: ["type_id"] + }, + ] + } + communication_methods: { + Row: { + communication_method_id: number + created_at: string + id: number + is_active: boolean + name: string + } + Insert: { + communication_method_id?: number + created_at?: string + id?: number + is_active?: boolean + name: string + } + Update: { + communication_method_id?: number + created_at?: string + id?: number + is_active?: boolean + name?: string + } + Relationships: [] + } + cw_air_alerts: { + Row: { + air_created_at: string | null + created_at: string + dev_eui: string + id: number + rule_group_id: string | null + triggering_rule_group: string + } + Insert: { + air_created_at?: string | null + created_at?: string + dev_eui: string + id?: number + rule_group_id?: string | null + triggering_rule_group: string + } + Update: { + air_created_at?: string | null + created_at?: string + dev_eui?: string + id?: number + rule_group_id?: string | null + triggering_rule_group?: string + } + Relationships: [ + { + foreignKeyName: "cw_air_alerts_air_row_fkey" + columns: ["dev_eui", "air_created_at"] + isOneToOne: false + referencedRelation: "cw_air_data" + referencedColumns: ["dev_eui", "created_at"] + }, + { + foreignKeyName: "cw_air_alerts_rule_group_id_fkey" + columns: ["rule_group_id"] + isOneToOne: false + referencedRelation: "cw_rules" + referencedColumns: ["ruleGroupId"] + }, + ] + } + cw_air_annotations: { + Row: { + created_at: string + created_by: string + dev_eui: string + id: number + include_in_report: boolean + note: string | null + title: string + } + Insert: { + created_at: string + created_by: string + dev_eui: string + id?: number + include_in_report?: boolean + note?: string | null + title: string + } + Update: { + created_at?: string + created_by?: string + dev_eui?: string + id?: number + include_in_report?: boolean + note?: string | null + title?: string + } + Relationships: [ + { + foreignKeyName: "cw_air_annotations_air_fk" + columns: ["dev_eui", "created_at"] + isOneToOne: false + referencedRelation: "cw_air_data" + referencedColumns: ["dev_eui", "created_at"] + }, + ] + } + cw_air_data: { + Row: { + battery_level: number | null + co: number | null + co2: number | null + created_at: string + dev_eui: string + humidity: number | null + is_simulated: boolean + lux: number | null + pressure: number | null + rainfall: number | null + smoke_detected: boolean | null + temperature_c: number | null + uv_index: number | null + vape_detected: boolean | null + wind_direction: number | null + wind_speed: number | null + } + Insert: { + battery_level?: number | null + co?: number | null + co2?: number | null + created_at?: string + dev_eui: string + humidity?: number | null + is_simulated?: boolean + lux?: number | null + pressure?: number | null + rainfall?: number | null + smoke_detected?: boolean | null + temperature_c?: number | null + uv_index?: number | null + vape_detected?: boolean | null + wind_direction?: number | null + wind_speed?: number | null + } + Update: { + battery_level?: number | null + co?: number | null + co2?: number | null + created_at?: string + dev_eui?: string + humidity?: number | null + is_simulated?: boolean + lux?: number | null + pressure?: number | null + rainfall?: number | null + smoke_detected?: boolean | null + temperature_c?: number | null + uv_index?: number | null + vape_detected?: boolean | null + wind_direction?: number | null + wind_speed?: number | null + } + Relationships: [] + } + cw_air_data_duplicate: { + Row: { + battery_level: number | null + co: number | null + co2: number | null + created_at: string + dev_eui: string + humidity: number | null + is_simulated: boolean + lux: number | null + pressure: number | null + rainfall: number | null + smoke_detected: boolean | null + temperature_c: number | null + uv_index: number | null + vape_detected: boolean | null + wind_direction: number | null + wind_speed: number | null + } + Insert: { + battery_level?: number | null + co?: number | null + co2?: number | null + created_at?: string + dev_eui: string + humidity?: number | null + is_simulated?: boolean + lux?: number | null + pressure?: number | null + rainfall?: number | null + smoke_detected?: boolean | null + temperature_c?: number | null + uv_index?: number | null + vape_detected?: boolean | null + wind_direction?: number | null + wind_speed?: number | null + } + Update: { + battery_level?: number | null + co?: number | null + co2?: number | null + created_at?: string + dev_eui?: string + humidity?: number | null + is_simulated?: boolean + lux?: number | null + pressure?: number | null + rainfall?: number | null + smoke_detected?: boolean | null + temperature_c?: number | null + uv_index?: number | null + vape_detected?: boolean | null + wind_direction?: number | null + wind_speed?: number | null + } + Relationships: [] + } + cw_data_metadata: { + Row: { + adder: number + created_at: string + formatting: string | null + icon: string | null + id: number + multiplier: number + name: string + notation: string + public_name: string | null + } + Insert: { + adder?: number + created_at?: string + formatting?: string | null + icon?: string | null + id?: number + multiplier?: number + name: string + notation?: string + public_name?: string | null + } + Update: { + adder?: number + created_at?: string + formatting?: string | null + icon?: string | null + id?: number + multiplier?: number + name?: string + notation?: string + public_name?: string | null + } + Relationships: [] + } + cw_device_gateway: { + Row: { + created_at: string + dev_eui: string + gateway_id: string + id: number + last_update: string + rssi: number | null + snr: number | null + } + Insert: { + created_at?: string + dev_eui: string + gateway_id: string + id?: number + last_update?: string + rssi?: number | null + snr?: number | null + } + Update: { + created_at?: string + dev_eui?: string + gateway_id?: string + id?: number + last_update?: string + rssi?: number | null + snr?: number | null + } + Relationships: [ + { + foreignKeyName: "cw_device_gateway_dev_eui_fkey" + columns: ["dev_eui"] + isOneToOne: false + referencedRelation: "cw_devices" + referencedColumns: ["dev_eui"] + }, + { + foreignKeyName: "cw_device_gateway_gateway_id_fkey" + columns: ["gateway_id"] + isOneToOne: false + referencedRelation: "cw_gateways" + referencedColumns: ["gateway_id"] + }, + ] + } + cw_device_owners: { + Row: { + dev_eui: string + id: number + owner_id: number + permission_level: number + user_id: string + } + Insert: { + dev_eui: string + id?: number + owner_id?: number + permission_level?: number + user_id: string + } + Update: { + dev_eui?: string + id?: number + owner_id?: number + permission_level?: number + user_id?: string + } + Relationships: [ + { + foreignKeyName: "cw_device_owners_dev_eui_fkey" + columns: ["dev_eui"] + isOneToOne: false + referencedRelation: "cw_devices" + referencedColumns: ["dev_eui"] + }, + { + foreignKeyName: "cw_device_owners_user_id_fkey" + columns: ["user_id"] + isOneToOne: false + referencedRelation: "profiles" + referencedColumns: ["id"] + }, + ] + } + cw_device_type: { + Row: { + created_at: string + data_table: string | null + data_table_v2: string + decoder: string | null + default_upload_interval: number | null + id: number + isActive: boolean + manufacturer: string | null + model: string | null + name: string + primary_data: string | null + primary_data_notation: string + primary_data_v2: string + primary_divider: number + primary_multiplier: number | null + secondary_data: string + secondary_data_notation: string + secondary_data_v2: string + secondary_divider: number + secondary_multiplier: number + TTI_application_id: string | null + } + Insert: { + created_at?: string + data_table?: string | null + data_table_v2: string + decoder?: string | null + default_upload_interval?: number | null + id?: number + isActive?: boolean + manufacturer?: string | null + model?: string | null + name: string + primary_data?: string | null + primary_data_notation?: string + primary_data_v2: string + primary_divider?: number + primary_multiplier?: number | null + secondary_data?: string + secondary_data_notation?: string + secondary_data_v2: string + secondary_divider?: number + secondary_multiplier?: number + TTI_application_id?: string | null + } + Update: { + created_at?: string + data_table?: string | null + data_table_v2?: string + decoder?: string | null + default_upload_interval?: number | null + id?: number + isActive?: boolean + manufacturer?: string | null + model?: string | null + name?: string + primary_data?: string | null + primary_data_notation?: string + primary_data_v2?: string + primary_divider?: number + primary_multiplier?: number | null + secondary_data?: string + secondary_data_notation?: string + secondary_data_v2?: string + secondary_divider?: number + secondary_multiplier?: number + TTI_application_id?: string | null + } + Relationships: [] + } + cw_device_x_cw_data_metadata: { + Row: { + created_at: string + cw_data_metadata: number + device_type_id: number + id: number + relation_id: number + } + Insert: { + created_at?: string + cw_data_metadata: number + device_type_id: number + id?: number + relation_id?: number + } + Update: { + created_at?: string + cw_data_metadata?: number + device_type_id?: number + id?: number + relation_id?: number + } + Relationships: [ + { + foreignKeyName: "cw_device_x_cw_data_metadata_cw_data_metadata_fkey" + columns: ["cw_data_metadata"] + isOneToOne: false + referencedRelation: "cw_data_metadata" + referencedColumns: ["id"] + }, + { + foreignKeyName: "cw_device_x_cw_data_metadata_device_type_id_fkey" + columns: ["device_type_id"] + isOneToOne: false + referencedRelation: "cw_device_type" + referencedColumns: ["id"] + }, + ] + } + cw_devices: { + Row: { + battery_changed_at: string | null + battery_level: number | null + dev_eui: string + error_status: string | null + group: string | null + installed_at: string | null + last_data_updated_at: string | null + lat: number | null + location_id: number | null + long: number | null + name: string + primary_data: number | null + report_endpoint: string | null + secondary_data: number | null + sensor_serial: string | null + sensor1_serial: string | null + sensor2_serial: string | null + tti_name: string | null + type: number | null + upload_interval: number | null + user_id: string | null + warranty_start_date: string | null + } + Insert: { + battery_changed_at?: string | null + battery_level?: number | null + dev_eui: string + error_status?: string | null + group?: string | null + installed_at?: string | null + last_data_updated_at?: string | null + lat?: number | null + location_id?: number | null + long?: number | null + name?: string + primary_data?: number | null + report_endpoint?: string | null + secondary_data?: number | null + sensor_serial?: string | null + sensor1_serial?: string | null + sensor2_serial?: string | null + tti_name?: string | null + type?: number | null + upload_interval?: number | null + user_id?: string | null + warranty_start_date?: string | null + } + Update: { + battery_changed_at?: string | null + battery_level?: number | null + dev_eui?: string + error_status?: string | null + group?: string | null + installed_at?: string | null + last_data_updated_at?: string | null + lat?: number | null + location_id?: number | null + long?: number | null + name?: string + primary_data?: number | null + report_endpoint?: string | null + secondary_data?: number | null + sensor_serial?: string | null + sensor1_serial?: string | null + sensor2_serial?: string | null + tti_name?: string | null + type?: number | null + upload_interval?: number | null + user_id?: string | null + warranty_start_date?: string | null + } + Relationships: [ + { + foreignKeyName: "cw_devices_location_id_fkey" + columns: ["location_id"] + isOneToOne: false + referencedRelation: "cw_locations" + referencedColumns: ["location_id"] + }, + { + foreignKeyName: "cw_devices_type_fkey" + columns: ["type"] + isOneToOne: false + referencedRelation: "cw_device_type" + referencedColumns: ["id"] + }, + ] + } + cw_gateways: { + Row: { + created_at: string + gateway_id: string + gateway_name: string + id: number + is_online: boolean + is_public: boolean + updated_at: string | null + } + Insert: { + created_at?: string + gateway_id: string + gateway_name: string + id?: number + is_online: boolean + is_public?: boolean + updated_at?: string | null + } + Update: { + created_at?: string + gateway_id?: string + gateway_name?: string + id?: number + is_online?: boolean + is_public?: boolean + updated_at?: string | null + } + Relationships: [] + } + cw_gateways_owners: { + Row: { + created_at: string + gateway_id: number + id: number + user_id: string + } + Insert: { + created_at?: string + gateway_id: number + id?: number + user_id: string + } + Update: { + created_at?: string + gateway_id?: number + id?: number + user_id?: string + } + Relationships: [ + { + foreignKeyName: "cw_gateways_owners_gateway_id_fkey" + columns: ["gateway_id"] + isOneToOne: false + referencedRelation: "cw_gateways" + referencedColumns: ["id"] + }, + { + foreignKeyName: "cw_gateways_owners_user_id_fkey" + columns: ["user_id"] + isOneToOne: false + referencedRelation: "profiles" + referencedColumns: ["id"] + }, + ] + } + cw_location_owners: { + Row: { + admin_user_id: string + description: string | null + id: number + is_active: boolean | null + location_id: number + owner_id: number + permission_level: number | null + user_id: string + } + Insert: { + admin_user_id: string + description?: string | null + id?: number + is_active?: boolean | null + location_id: number + owner_id?: number + permission_level?: number | null + user_id: string + } + Update: { + admin_user_id?: string + description?: string | null + id?: number + is_active?: boolean | null + location_id?: number + owner_id?: number + permission_level?: number | null + user_id?: string + } + Relationships: [ + { + foreignKeyName: "cw_location_owners_location_id_fkey" + columns: ["location_id"] + isOneToOne: false + referencedRelation: "cw_locations" + referencedColumns: ["location_id"] + }, + { + foreignKeyName: "cw_location_owners_user_id_fkey" + columns: ["user_id"] + isOneToOne: false + referencedRelation: "profiles" + referencedColumns: ["id"] + }, + ] + } + cw_locations: { + Row: { + created_at: string + description: string | null + group: string | null + lat: number | null + location_id: number + long: number | null + map_zoom: number | null + name: string + owner_id: string | null + } + Insert: { + created_at?: string + description?: string | null + group?: string | null + lat?: number | null + location_id?: number + long?: number | null + map_zoom?: number | null + name: string + owner_id?: string | null + } + Update: { + created_at?: string + description?: string | null + group?: string | null + lat?: number | null + location_id?: number + long?: number | null + map_zoom?: number | null + name?: string + owner_id?: string | null + } + Relationships: [ + { + foreignKeyName: "cw_locations_owner_id_fkey" + columns: ["owner_id"] + isOneToOne: false + referencedRelation: "profiles" + referencedColumns: ["id"] + }, + ] + } + cw_notifier_types: { + Row: { + created_at: string + id: number + name: string + notifier_id: number + notifier_value: number + } + Insert: { + created_at?: string + id?: number + name: string + notifier_id: number + notifier_value: number + } + Update: { + created_at?: string + id?: number + name?: string + notifier_id?: number + notifier_value?: number + } + Relationships: [] + } + cw_permission_level_types: { + Row: { + created_at: string + id: number + name: string + permission_level_id: number + } + Insert: { + created_at?: string + id?: number + name: string + permission_level_id?: number + } + Update: { + created_at?: string + id?: number + name?: string + permission_level_id?: number + } + Relationships: [] + } + cw_power_data: { + Row: { + created_at: string + current: number | null + dev_eui: string + id: number + voltage: number | null + watts: number | null + } + Insert: { + created_at?: string + current?: number | null + dev_eui: string + id?: number + voltage?: number | null + watts?: number | null + } + Update: { + created_at?: string + current?: number | null + dev_eui?: string + id?: number + voltage?: number | null + watts?: number | null + } + Relationships: [ + { + foreignKeyName: "cw_power_data_dev_eui_fkey" + columns: ["dev_eui"] + isOneToOne: false + referencedRelation: "cw_devices" + referencedColumns: ["dev_eui"] + }, + ] + } + cw_relay_data: { + Row: { + created_at: string + dev_eui: string + id: number + last_update: string + relay_1: boolean | null + relay_2: boolean | null + } + Insert: { + created_at?: string + dev_eui: string + id?: number + last_update: string + relay_1?: boolean | null + relay_2?: boolean | null + } + Update: { + created_at?: string + dev_eui?: string + id?: number + last_update?: string + relay_1?: boolean | null + relay_2?: boolean | null + } + Relationships: [ + { + foreignKeyName: "cw_relay_data_dev_eui_fkey" + columns: ["dev_eui"] + isOneToOne: true + referencedRelation: "cw_devices" + referencedColumns: ["dev_eui"] + }, + ] + } + cw_rule_criteria: { + Row: { + created_at: string + criteria_id: number | null + id: number + operator: string + parent_id: string | null + reset_value: number | null + ruleGroupId: string + subject: string + trigger_value: number + } + Insert: { + created_at?: string + criteria_id?: number | null + id?: number + operator: string + parent_id?: string | null + reset_value?: number | null + ruleGroupId: string + subject: string + trigger_value: number + } + Update: { + created_at?: string + criteria_id?: number | null + id?: number + operator?: string + parent_id?: string | null + reset_value?: number | null + ruleGroupId?: string + subject?: string + trigger_value?: number + } + Relationships: [ + { + foreignKeyName: "public_cw_rule_criteria_ruleGroupId_fkey" + columns: ["ruleGroupId"] + isOneToOne: false + referencedRelation: "cw_rules" + referencedColumns: ["ruleGroupId"] + }, + ] + } + cw_rule_triggered: { + Row: { + created_at: string + dev_eui: string + id: number + rule_group_id: string + } + Insert: { + created_at?: string + dev_eui: string + id?: number + rule_group_id: string + } + Update: { + created_at?: string + dev_eui?: string + id?: number + rule_group_id?: string + } + Relationships: [ + { + foreignKeyName: "cw_rule_triggered_dev_eui_fkey" + columns: ["dev_eui"] + isOneToOne: false + referencedRelation: "cw_devices" + referencedColumns: ["dev_eui"] + }, + { + foreignKeyName: "cw_rule_triggered_rule_group_id_fkey" + columns: ["rule_group_id"] + isOneToOne: false + referencedRelation: "cw_rules" + referencedColumns: ["ruleGroupId"] + }, + ] + } + cw_rules: { + Row: { + action_recipient: string + created_at: string + dev_eui: string | null + id: number + is_triggered: boolean + last_triggered: string | null + name: string + notifier_type: number + profile_id: string + ruleGroupId: string + send_using: string | null + trigger_count: number + } + Insert: { + action_recipient: string + created_at?: string + dev_eui?: string | null + id?: number + is_triggered?: boolean + last_triggered?: string | null + name: string + notifier_type: number + profile_id?: string + ruleGroupId: string + send_using?: string | null + trigger_count?: number + } + Update: { + action_recipient?: string + created_at?: string + dev_eui?: string | null + id?: number + is_triggered?: boolean + last_triggered?: string | null + name?: string + notifier_type?: number + profile_id?: string + ruleGroupId?: string + send_using?: string | null + trigger_count?: number + } + Relationships: [ + { + foreignKeyName: "cw_rules_dev_eui_fkey" + columns: ["dev_eui"] + isOneToOne: false + referencedRelation: "cw_devices" + referencedColumns: ["dev_eui"] + }, + { + foreignKeyName: "cw_rules_notifier_type_fkey" + columns: ["notifier_type"] + isOneToOne: false + referencedRelation: "cw_notifier_types" + referencedColumns: ["notifier_id"] + }, + { + foreignKeyName: "public_cw_rules_profile_id_fkey" + columns: ["profile_id"] + isOneToOne: false + referencedRelation: "profiles" + referencedColumns: ["id"] + }, + ] + } + cw_soil_data: { + Row: { + created_at: string + dev_eui: string + ec: number | null + moisture: number | null + ph: number | null + temperature_c: number | null + } + Insert: { + created_at?: string + dev_eui: string + ec?: number | null + moisture?: number | null + ph?: number | null + temperature_c?: number | null + } + Update: { + created_at?: string + dev_eui?: string + ec?: number | null + moisture?: number | null + ph?: number | null + temperature_c?: number | null + } + Relationships: [] + } + cw_soil_data_duplicate: { + Row: { + created_at: string + dev_eui: string + ec: number | null + moisture: number | null + ph: number | null + temperature_c: number | null + } + Insert: { + created_at?: string + dev_eui: string + ec?: number | null + moisture?: number | null + ph?: number | null + temperature_c?: number | null + } + Update: { + created_at?: string + dev_eui?: string + ec?: number | null + moisture?: number | null + ph?: number | null + temperature_c?: number | null + } + Relationships: [] + } + cw_traffic2: { + Row: { + bicycle_count: number + bus_count: number + car_count: number + created_at: string + dev_eui: string + id: number + line_number: number | null + motorcycle_count: number + people_count: number + traffic_hour: string | null + train_count: number + truck_count: number + } + Insert: { + bicycle_count?: number + bus_count?: number + car_count?: number + created_at?: string + dev_eui: string + id?: number + line_number?: number | null + motorcycle_count?: number + people_count?: number + traffic_hour?: string | null + train_count?: number + truck_count?: number + } + Update: { + bicycle_count?: number + bus_count?: number + car_count?: number + created_at?: string + dev_eui?: string + id?: number + line_number?: number | null + motorcycle_count?: number + people_count?: number + traffic_hour?: string | null + train_count?: number + truck_count?: number + } + Relationships: [ + { + foreignKeyName: "cw_traffic2_dev_eui_fkey" + columns: ["dev_eui"] + isOneToOne: false + referencedRelation: "cw_devices" + referencedColumns: ["dev_eui"] + }, + ] + } + cw_water_data: { + Row: { + created_at: string + deapth_cm: number | null + dev_eui: string + id: number + pressure: number | null + spo2: number | null + temperature_c: number | null + } + Insert: { + created_at?: string + deapth_cm?: number | null + dev_eui: string + id?: number + pressure?: number | null + spo2?: number | null + temperature_c?: number | null + } + Update: { + created_at?: string + deapth_cm?: number | null + dev_eui?: string + id?: number + pressure?: number | null + spo2?: number | null + temperature_c?: number | null + } + Relationships: [ + { + foreignKeyName: "cw_water_data_dev_eui_fkey" + columns: ["dev_eui"] + isOneToOne: false + referencedRelation: "cw_devices" + referencedColumns: ["dev_eui"] + }, + ] + } + cw_watermeter_uplinks: { + Row: { + battery_level: number | null + count: number + created_at: string + dev_eui: string + id: number + internal_temp: number | null + } + Insert: { + battery_level?: number | null + count: number + created_at?: string + dev_eui: string + id?: number + internal_temp?: number | null + } + Update: { + battery_level?: number | null + count?: number + created_at?: string + dev_eui?: string + id?: number + internal_temp?: number | null + } + Relationships: [ + { + foreignKeyName: "cw_watermeter_uplinks_dev_eui_fkey" + columns: ["dev_eui"] + isOneToOne: false + referencedRelation: "cw_devices" + referencedColumns: ["dev_eui"] + }, + ] + } + devices: { + Row: { + active: boolean + created_at: string | null + dev_eui: string + device_name: string | null + id: number + lat: number | null + linked_device_eui: string | null + lng: number | null + profile_id: string | null + type: string | null + } + Insert: { + active?: boolean + created_at?: string | null + dev_eui: string + device_name?: string | null + id?: number + lat?: number | null + linked_device_eui?: string | null + lng?: number | null + profile_id?: string | null + type?: string | null + } + Update: { + active?: boolean + created_at?: string | null + dev_eui?: string + device_name?: string | null + id?: number + lat?: number | null + linked_device_eui?: string | null + lng?: number | null + profile_id?: string | null + type?: string | null + } + Relationships: [] + } + ip_log: { + Row: { + created_at: string + dev_eui: string | null + device_id: string + id: number + ip: string | null + timestamp: string | null + } + Insert: { + created_at?: string + dev_eui?: string | null + device_id: string + id?: number + ip?: string | null + timestamp?: string | null + } + Update: { + created_at?: string + dev_eui?: string | null + device_id?: string + id?: number + ip?: string | null + timestamp?: string | null + } + Relationships: [ + { + foreignKeyName: "ip_log_dev_eui_fkey" + columns: ["dev_eui"] + isOneToOne: false + referencedRelation: "cw_devices" + referencedColumns: ["dev_eui"] + }, + ] + } + locations: { + Row: { + created_at: string | null + description: string | null + dev_eui: string | null + id: number + lat: number | null + lng: number | null + name: string + profile_id: string | null + sensor_type: string | null + } + Insert: { + created_at?: string | null + description?: string | null + dev_eui?: string | null + id?: number + lat?: number | null + lng?: number | null + name: string + profile_id?: string | null + sensor_type?: string | null + } + Update: { + created_at?: string | null + description?: string | null + dev_eui?: string | null + id?: number + lat?: number | null + lng?: number | null + name?: string + profile_id?: string | null + sensor_type?: string | null + } + Relationships: [] + } + permissions: { + Row: { + allowed_by_profile_id: string | null + allowed_profile_id: string | null + created_at: string | null + description: string | null + id: number + resource: string + role_id: number + } + Insert: { + allowed_by_profile_id?: string | null + allowed_profile_id?: string | null + created_at?: string | null + description?: string | null + id?: number + resource: string + role_id: number + } + Update: { + allowed_by_profile_id?: string | null + allowed_profile_id?: string | null + created_at?: string | null + description?: string | null + id?: number + resource?: string + role_id?: number + } + Relationships: [ + { + foreignKeyName: "permissions_allowed_by_profile_id_fkey" + columns: ["allowed_by_profile_id"] + isOneToOne: false + referencedRelation: "profiles" + referencedColumns: ["id"] + }, + { + foreignKeyName: "permissions_allowed_profile_id_fkey" + columns: ["allowed_profile_id"] + isOneToOne: false + referencedRelation: "profiles" + referencedColumns: ["id"] + }, + ] + } + profiles: { + Row: { + accepted_agreements: boolean + avatar_url: string | null + created_at: string + discord: string | null + email: string | null + employer: string | null + full_name: string | null + id: string + last_login: string | null + line_id: string | null + phone_number: string | null + updated_at: string | null + username: string | null + website: string | null + } + Insert: { + accepted_agreements?: boolean + avatar_url?: string | null + created_at?: string + discord?: string | null + email?: string | null + employer?: string | null + full_name?: string | null + id: string + last_login?: string | null + line_id?: string | null + phone_number?: string | null + updated_at?: string | null + username?: string | null + website?: string | null + } + Update: { + accepted_agreements?: boolean + avatar_url?: string | null + created_at?: string + discord?: string | null + email?: string | null + employer?: string | null + full_name?: string | null + id?: string + last_login?: string | null + line_id?: string | null + phone_number?: string | null + updated_at?: string | null + username?: string | null + website?: string | null + } + Relationships: [] + } + report_alert_points: { + Row: { + created_at: string + data_point_key: string + hex_color: string | null + id: number + max: number | null + min: number | null + name: string + operator: string | null + report_id: string + user_id: string + value: number | null + } + Insert: { + created_at?: string + data_point_key: string + hex_color?: string | null + id?: number + max?: number | null + min?: number | null + name: string + operator?: string | null + report_id: string + user_id?: string + value?: number | null + } + Update: { + created_at?: string + data_point_key?: string + hex_color?: string | null + id?: number + max?: number | null + min?: number | null + name?: string + operator?: string | null + report_id?: string + user_id?: string + value?: number | null + } + Relationships: [ + { + foreignKeyName: "report_alert_points_report_id_fkey" + columns: ["report_id"] + isOneToOne: false + referencedRelation: "reports" + referencedColumns: ["report_id"] + }, + ] + } + report_data_processing_schedules: { + Row: { + created_at: string + crosses_midnight: boolean + day_of_week: number + end_time: string + id: string + is_enabled: boolean + report_id: string + rule_type: string + start_time: string + timezone: string + updated_at: string + valid_from: string | null + valid_to: string | null + } + Insert: { + created_at?: string + crosses_midnight?: boolean + day_of_week: number + end_time: string + id?: string + is_enabled?: boolean + report_id: string + rule_type?: string + start_time: string + timezone?: string + updated_at?: string + valid_from?: string | null + valid_to?: string | null + } + Update: { + created_at?: string + crosses_midnight?: boolean + day_of_week?: number + end_time?: string + id?: string + is_enabled?: boolean + report_id?: string + rule_type?: string + start_time?: string + timezone?: string + updated_at?: string + valid_from?: string | null + valid_to?: string | null + } + Relationships: [ + { + foreignKeyName: "report_data_processing_schedules_report_id_fkey" + columns: ["report_id"] + isOneToOne: false + referencedRelation: "reports" + referencedColumns: ["report_id"] + }, + ] + } + report_recipients: { + Row: { + communication_method: number + created_at: string + email: string | null + id: number + name: string | null + report_id: string + user_id: string | null + } + Insert: { + communication_method: number + created_at?: string + email?: string | null + id?: number + name?: string | null + report_id: string + user_id?: string | null + } + Update: { + communication_method?: number + created_at?: string + email?: string | null + id?: number + name?: string | null + report_id?: string + user_id?: string | null + } + Relationships: [ + { + foreignKeyName: "report_recipients_communication_method_fkey" + columns: ["communication_method"] + isOneToOne: false + referencedRelation: "communication_methods" + referencedColumns: ["communication_method_id"] + }, + { + foreignKeyName: "report_recipients_report_id_fkey" + columns: ["report_id"] + isOneToOne: false + referencedRelation: "reports" + referencedColumns: ["report_id"] + }, + ] + } + report_user_schedule: { + Row: { + created_at: string + dev_eui: string + end_of_day: boolean + end_of_month: boolean + end_of_week: boolean + id: number + is_active: boolean + report_id: string | null + report_user_schedule_id: number + user_id: string + utc_offset: number + } + Insert: { + created_at?: string + dev_eui: string + end_of_day?: boolean + end_of_month?: boolean + end_of_week?: boolean + id?: number + is_active?: boolean + report_id?: string | null + report_user_schedule_id?: number + user_id?: string + utc_offset?: number + } + Update: { + created_at?: string + dev_eui?: string + end_of_day?: boolean + end_of_month?: boolean + end_of_week?: boolean + id?: number + is_active?: boolean + report_id?: string | null + report_user_schedule_id?: number + user_id?: string + utc_offset?: number + } + Relationships: [ + { + foreignKeyName: "report_user_schedule_dev_eui_fkey" + columns: ["dev_eui"] + isOneToOne: false + referencedRelation: "cw_devices" + referencedColumns: ["dev_eui"] + }, + { + foreignKeyName: "report_user_schedule_report_id_fkey" + columns: ["report_id"] + isOneToOne: false + referencedRelation: "reports" + referencedColumns: ["report_id"] + }, + { + foreignKeyName: "report_user_schedule_user_id_fkey" + columns: ["user_id"] + isOneToOne: false + referencedRelation: "profiles" + referencedColumns: ["id"] + }, + ] + } + reports: { + Row: { + created_at: string + data_pull_interval: number + dev_eui: string + id: number + name: string + report_id: string + user_id: string | null + } + Insert: { + created_at?: string + data_pull_interval?: number + dev_eui: string + id?: number + name: string + report_id?: string + user_id?: string | null + } + Update: { + created_at?: string + data_pull_interval?: number + dev_eui?: string + id?: number + name?: string + report_id?: string + user_id?: string | null + } + Relationships: [ + { + foreignKeyName: "reports_dev_eui_fkey" + columns: ["dev_eui"] + isOneToOne: false + referencedRelation: "cw_devices" + referencedColumns: ["dev_eui"] + }, + { + foreignKeyName: "reports_user_id_fkey" + columns: ["user_id"] + isOneToOne: false + referencedRelation: "profiles" + referencedColumns: ["id"] + }, + ] + } + reports_templates: { + Row: { + created_at: string + dev_eui: string | null + id: number + name: string + owner_id: string + recipients: string | null + template: Json + } + Insert: { + created_at?: string + dev_eui?: string | null + id?: number + name: string + owner_id?: string + recipients?: string | null + template: Json + } + Update: { + created_at?: string + dev_eui?: string | null + id?: number + name?: string + owner_id?: string + recipients?: string | null + template?: Json + } + Relationships: [ + { + foreignKeyName: "reports_templates_dev_eui_fkey" + columns: ["dev_eui"] + isOneToOne: false + referencedRelation: "cw_devices" + referencedColumns: ["dev_eui"] + }, + { + foreignKeyName: "reports_templates_owner_id_fkey" + columns: ["owner_id"] + isOneToOne: false + referencedRelation: "profiles" + referencedColumns: ["id"] + }, + ] + } + stripe_customers: { + Row: { + attrs: Json | null + created: string | null + description: string | null + email: string | null + id: string | null + name: string | null + } + Insert: { + attrs?: Json | null + created?: string | null + description?: string | null + email?: string | null + id?: string | null + name?: string | null + } + Update: { + attrs?: Json | null + created?: string | null + description?: string | null + email?: string | null + id?: string | null + name?: string | null + } + Relationships: [] + } + stripe_products: { + Row: { + active: boolean | null + attrs: Json | null + created: string | null + default_price: string | null + description: string | null + id: string | null + name: string | null + updated: string | null + } + Insert: { + active?: boolean | null + attrs?: Json | null + created?: string | null + default_price?: string | null + description?: string | null + id?: string | null + name?: string | null + updated?: string | null + } + Update: { + active?: boolean | null + attrs?: Json | null + created?: string | null + default_price?: string | null + description?: string | null + id?: string | null + name?: string | null + updated?: string | null + } + Relationships: [] + } + stripe_subscriptions: { + Row: { + attrs: Json | null + currency: string | null + current_period_end: string | null + current_period_start: string | null + customer: string | null + id: string | null + } + Insert: { + attrs?: Json | null + currency?: string | null + current_period_end?: string | null + current_period_start?: string | null + customer?: string | null + id?: string | null + } + Update: { + attrs?: Json | null + currency?: string | null + current_period_end?: string | null + current_period_start?: string | null + customer?: string | null + id?: string | null + } + Relationships: [] + } + user_discord_connections: { + Row: { + access_token: string + avatar: string | null + created_at: string | null + discord_user_id: string + discord_username: string + id: string + token_type: string + updated_at: string | null + user_id: string + } + Insert: { + access_token: string + avatar?: string | null + created_at?: string | null + discord_user_id: string + discord_username: string + id?: string + token_type: string + updated_at?: string | null + user_id: string + } + Update: { + access_token?: string + avatar?: string | null + created_at?: string | null + discord_user_id?: string + discord_username?: string + id?: string + token_type?: string + updated_at?: string | null + user_id?: string + } + Relationships: [] + } + } + Views: { + [_ in never]: never + } + Functions: { + cw_traffic_daily_totals: { + Args: { dev_eui: string; end_ts: string; start_ts: string; tz?: string } + Returns: { + total_bicycles: number + total_buses: number + total_cars: number + total_people: number + total_trucks: number + traffic_day: string + }[] + } + delete_avatar: { + Args: { avatar_url: string } + Returns: Record + } + delete_storage_object: { + Args: { bucket: string; object: string } + Returns: Record + } + get_filtered_device_report_data_multi_v2: { + Args: { + p_columns: string[] + p_dev_id: string + p_end_time: string + p_interval_minutes: number + p_maxs: number[] + p_mins: number[] + p_ops: string[] + p_start_time: string + p_timezone?: string + } + Returns: Json[] + } + get_hloc_data: + | { + Args: { + p_bucket_interval: string + p_dev_eui: string + p_metric: string + p_time_range: string + } + Returns: { + bucket: string + close_val: number + dev_eui: string + high_val: number + low_val: number + open_val: number + }[] + } + | { + Args: { + p_bucket_interval: string + p_dev_eui: string + p_metric: string + p_table: string + p_time_range: string + } + Returns: { + bucket: string + close_val: number + dev_eui: string + high_val: number + low_val: number + open_val: number + }[] + } + | { + Args: { + device_eui: string + end_time: string + start_time: string + table_name: string + time_interval: string + } + Returns: { + close: number + high: number + interval_time: string + low: number + open: number + }[] + } + get_location_for_user: { Args: { user_id: string }; Returns: number[] } + get_road_events: { + Args: { time_grouping: string } + Returns: { + event_count: number + group_period: string + }[] + } + get_road_events_summary1: { + Args: { + classes: string[] + end_date: string + line_id: string + start_date: string + time_span: string + } + Returns: { + count: number + period_start: string + }[] + } + get_table_columns: { + Args: { p_table: unknown } + Returns: { + column_name: string + }[] + } + is_device_admin_for: + | { + Args: { p_dev_eui: string } + Returns: { + error: true + } & "Could not choose the best candidate function between: public.is_device_admin_for(p_dev_eui => text), public.is_device_admin_for(p_dev_eui => varchar). Try renaming the parameters or the function itself in the database so function overloading can be resolved" + } + | { + Args: { p_dev_eui: string } + Returns: { + error: true + } & "Could not choose the best candidate function between: public.is_device_admin_for(p_dev_eui => text), public.is_device_admin_for(p_dev_eui => varchar). Try renaming the parameters or the function itself in the database so function overloading can be resolved" + } + is_device_member_for: { Args: { p_dev_eui: string }; Returns: boolean } + is_device_owner_for: { Args: { dev: string }; Returns: boolean } + is_location_member_for: { Args: { loc_id: number }; Returns: boolean } + is_location_owner_for: { Args: { loc_id: number }; Returns: boolean } + } + Enums: { + [_ in never]: never + } + CompositeTypes: { + [_ in never]: never + } + } +} + +type DatabaseWithoutInternals = Omit + +type DefaultSchema = DatabaseWithoutInternals[Extract] + +export type Tables< + DefaultSchemaTableNameOrOptions extends + | keyof (DefaultSchema["Tables"] & DefaultSchema["Views"]) + | { schema: keyof DatabaseWithoutInternals }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] & + DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Views"]) + : never = never, +> = DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? (DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] & + DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Views"])[TableName] extends { + Row: infer R + } + ? R + : never + : DefaultSchemaTableNameOrOptions extends keyof (DefaultSchema["Tables"] & + DefaultSchema["Views"]) + ? (DefaultSchema["Tables"] & + DefaultSchema["Views"])[DefaultSchemaTableNameOrOptions] extends { + Row: infer R + } + ? R + : never + : never + +export type TablesInsert< + DefaultSchemaTableNameOrOptions extends + | keyof DefaultSchema["Tables"] + | { schema: keyof DatabaseWithoutInternals }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] + : never = never, +> = DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Insert: infer I + } + ? I + : never + : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"] + ? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends { + Insert: infer I + } + ? I + : never + : never + +export type TablesUpdate< + DefaultSchemaTableNameOrOptions extends + | keyof DefaultSchema["Tables"] + | { schema: keyof DatabaseWithoutInternals }, + TableName extends DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"] + : never = never, +> = DefaultSchemaTableNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[DefaultSchemaTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Update: infer U + } + ? U + : never + : DefaultSchemaTableNameOrOptions extends keyof DefaultSchema["Tables"] + ? DefaultSchema["Tables"][DefaultSchemaTableNameOrOptions] extends { + Update: infer U + } + ? U + : never + : never + +export type Enums< + DefaultSchemaEnumNameOrOptions extends + | keyof DefaultSchema["Enums"] + | { schema: keyof DatabaseWithoutInternals }, + EnumName extends DefaultSchemaEnumNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"] + : never = never, +> = DefaultSchemaEnumNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[DefaultSchemaEnumNameOrOptions["schema"]]["Enums"][EnumName] + : DefaultSchemaEnumNameOrOptions extends keyof DefaultSchema["Enums"] + ? DefaultSchema["Enums"][DefaultSchemaEnumNameOrOptions] + : never + +export type CompositeTypes< + PublicCompositeTypeNameOrOptions extends + | keyof DefaultSchema["CompositeTypes"] + | { schema: keyof DatabaseWithoutInternals }, + CompositeTypeName extends PublicCompositeTypeNameOrOptions extends { + schema: keyof DatabaseWithoutInternals + } + ? keyof DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"] + : never = never, +> = PublicCompositeTypeNameOrOptions extends { + schema: keyof DatabaseWithoutInternals +} + ? DatabaseWithoutInternals[PublicCompositeTypeNameOrOptions["schema"]]["CompositeTypes"][CompositeTypeName] + : PublicCompositeTypeNameOrOptions extends keyof DefaultSchema["CompositeTypes"] + ? DefaultSchema["CompositeTypes"][PublicCompositeTypeNameOrOptions] + : never + +export const Constants = { + public: { + Enums: {}, + }, +} as const diff --git a/messages/en.json b/messages/en.json index 3a84cf7d..e0bee1ae 100644 --- a/messages/en.json +++ b/messages/en.json @@ -381,6 +381,8 @@ "reports_create_schedule_active_description": "Turn this delivery schedule on.", "reports_create_schedule_week_label": "Weekly", "reports_create_schedule_week_description": "Send this report each week.", + "reports_create_schedule_day_label": "Daily", + "reports_create_schedule_day_description": "Send this report each day.", "reports_create_schedule_month_label": "Month-end", "reports_create_schedule_month_description": "Send this report at the end of the month.", "reports_create_schedule_child_device_label": "Device ID", diff --git a/messages/ja.json b/messages/ja.json index 689065ef..06cf796a 100644 --- a/messages/ja.json +++ b/messages/ja.json @@ -381,6 +381,8 @@ "reports_create_schedule_active_description": "この配信スケジュールを有効にします。", "reports_create_schedule_week_label": "毎週", "reports_create_schedule_week_description": "このレポートを毎週送信します。", + "reports_create_schedule_day_label": "毎日", + "reports_create_schedule_day_description": "このレポートを毎日送信します。", "reports_create_schedule_month_label": "月末", "reports_create_schedule_month_description": "このレポートを月末に送信します。", "reports_create_schedule_child_device_label": "デバイス ID", diff --git a/package.json b/package.json index 576cabd5..5194d121 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "prettier": "^3.8.1", "prettier-plugin-svelte": "^3.5.0", "prettier-plugin-tailwindcss": "^0.7.2", + "supabase": "^2.92.0", "svelte": "^5.53.0", "svelte-check": "^4.4.1", "tailwindcss": "^4.2.0", @@ -53,7 +54,7 @@ }, "packageManager": "pnpm@10.18.2+sha512.9fb969fa749b3ade6035e0f109f0b8a60b5d08a1a87fdf72e337da90dcc93336e2280ca4e44f2358a649b83c17959e9993e777c2080879f3801e6f0d999ad3dd", "dependencies": { - "@cropwatchdevelopment/cwui": "0.1.80", + "@cropwatchdevelopment/cwui": "0.1.81", "@supabase/supabase-js": "^2.98.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c16500a2..0bfc4078 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@cropwatchdevelopment/cwui': - specifier: 0.1.80 - version: 0.1.80(svelte@5.53.0) + specifier: 0.1.81 + version: 0.1.81(svelte@5.53.0) '@supabase/supabase-js': specifier: ^2.98.0 version: 2.98.0 @@ -84,6 +84,9 @@ importers: prettier-plugin-tailwindcss: specifier: ^0.7.2 version: 0.7.2(prettier-plugin-svelte@3.5.0(prettier@3.8.1)(svelte@5.53.0))(prettier@3.8.1) + supabase: + specifier: ^2.92.0 + version: 2.92.0 svelte: specifier: ^5.53.0 version: 5.53.0 @@ -114,8 +117,8 @@ importers: packages: - '@cropwatchdevelopment/cwui@0.1.80': - resolution: {integrity: sha512-GxAM4CHhInGz7mlOthne1q9y9Zepdjb6xLNiB0wetVdDKxrK8KzYmYKhGYhbY7p2pNheTshbmOpwGXyu+S17Sg==, tarball: https://npm.pkg.github.com/download/@cropwatchdevelopment/cwui/0.1.80/7e3089a477c33f11969eb0c30e54e3cbe81a4ef9} + '@cropwatchdevelopment/cwui@0.1.81': + resolution: {integrity: sha512-ty48ciFa18hthih+sw3LboQx0NvB+iMx91SICyzG0e1HvLoeufFsnOi6YatNiFbSpKE2Yj93KukX2H3fHAWQ+w==, tarball: https://npm.pkg.github.com/download/@cropwatchdevelopment/cwui/0.1.81/4f46216a4dfd83b279b5f5eb8510b73da94e5f66} peerDependencies: svelte: ^5.0.0 @@ -1027,6 +1030,10 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + agent-base@9.0.0: + resolution: {integrity: sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==} + engines: {node: '>= 20'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -1062,6 +1069,10 @@ packages: resolution: {integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==} engines: {node: 20 || >=22} + bin-links@6.0.0: + resolution: {integrity: sha512-X4CiKlcV2GjnCMwnKAfbVWpHa++65th9TuzAEYtZoATiOE2DQKhSp4CJlyLoTqdhBKlXjpXjCTYPNNFS33Fi6w==} + engines: {node: ^20.17.0 || >=22.9.0} + bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} @@ -1099,6 +1110,10 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} + cmd-shim@8.0.0: + resolution: {integrity: sha512-Jk/BK6NCapZ58BKUxlSI+ouKRbjH1NLZCgJkYoab+vEHUY3f6OzpNBN9u7HFSv9J6TRDGs4PLOHezoKGaFRSCA==} + engines: {node: ^20.17.0 || >=22.9.0} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1138,6 +1153,10 @@ packages: engines: {node: '>=4'} hasBin: true + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1291,6 +1310,10 @@ packages: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1309,6 +1332,10 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1350,6 +1377,10 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + https-proxy-agent@9.0.0: + resolution: {integrity: sha512-/MVmHp58WkOypgFhCLk4fzpPcFQvTJ/e6LBI7irpIO2HfxUbpmYoHF+KzipzJpxxzJu7aJNWQ0xojJ/dzV2G5g==} + engines: {node: '>= 20'} + human-id@4.1.3: resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} hasBin: true @@ -1568,6 +1599,11 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -1577,6 +1613,10 @@ packages: encoding: optional: true + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -1586,6 +1626,10 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + npm-normalize-package-bin@5.0.0: + resolution: {integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==} + engines: {node: ^20.17.0 || >=22.9.0} + obug@2.1.1: resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} @@ -1751,10 +1795,18 @@ packages: engines: {node: '>=14'} hasBin: true + proc-log@6.1.0: + resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} + engines: {node: ^20.17.0 || >=22.9.0} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + read-cmd-shim@6.0.0: + resolution: {integrity: sha512-1zM5HuOfagXCBWMN83fuFI/x+T/UhZ7k+KIzhrHXcQoeX5+7gmaDYjELQHmmzIodumBHeByBJT4QYS7ufAgs7A==} + engines: {node: ^20.17.0 || >=22.9.0} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -1795,6 +1847,10 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + sirv@3.0.2: resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} engines: {node: '>=18'} @@ -1818,6 +1874,11 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + supabase@2.92.0: + resolution: {integrity: sha512-K6fGeS4gfXtDehn7JIXLS5Co8NAzskWATNO89H2ttwMv7yLheM9tqK0uA8O7/LCt44Y36swQcvtAIuh3z8Flrw==} + engines: {npm: '>=8'} + hasBin: true + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1850,6 +1911,10 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tar@7.5.13: + resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} + engines: {node: '>=18'} + tar@7.5.9: resolution: {integrity: sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==} engines: {node: '>=18'} @@ -2022,6 +2087,10 @@ packages: jsdom: optional: true + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -2045,6 +2114,10 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + write-file-atomic@7.0.1: + resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} + engines: {node: ^20.17.0 || >=22.9.0} + ws@8.19.0: resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} engines: {node: '>=10.0.0'} @@ -2074,7 +2147,7 @@ packages: snapshots: - '@cropwatchdevelopment/cwui@0.1.80(svelte@5.53.0)': + '@cropwatchdevelopment/cwui@0.1.81(svelte@5.53.0)': dependencies: svelte: 5.53.0 @@ -2867,6 +2940,8 @@ snapshots: agent-base@7.1.4: {} + agent-base@9.0.0: {} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -2894,6 +2969,14 @@ snapshots: balanced-match@4.0.3: {} + bin-links@6.0.0: + dependencies: + cmd-shim: 8.0.0 + npm-normalize-package-bin: 5.0.0 + proc-log: 6.1.0 + read-cmd-shim: 6.0.0 + write-file-atomic: 7.0.1 + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 @@ -2928,6 +3011,8 @@ snapshots: clsx@2.1.1: {} + cmd-shim@8.0.0: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -2957,6 +3042,8 @@ snapshots: cssesc@3.0.0: {} + data-uri-to-buffer@4.0.1: {} + debug@4.4.3: dependencies: ms: 2.1.3 @@ -3156,6 +3243,11 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -3174,6 +3266,10 @@ snapshots: flatted@3.3.3: {} + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + fsevents@2.3.2: optional: true @@ -3207,6 +3303,13 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@9.0.0: + dependencies: + agent-base: 9.0.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + human-id@4.1.3: {} iceberg-js@0.8.1: {} @@ -3362,16 +3465,26 @@ snapshots: natural-compare@1.4.0: {} + node-domexception@1.0.0: {} + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + node-gyp-build@4.8.4: {} nopt@8.1.0: dependencies: abbrev: 3.0.1 + npm-normalize-package-bin@5.0.0: {} + obug@2.1.1: {} optionator@0.9.4: @@ -3470,8 +3583,12 @@ snapshots: prettier@3.8.1: {} + proc-log@6.1.0: {} + punycode@2.3.1: {} + read-cmd-shim@6.0.0: {} + readdirp@4.1.2: {} resolve-from@4.0.0: {} @@ -3525,6 +3642,8 @@ snapshots: siginfo@2.0.0: {} + signal-exit@4.1.0: {} + sirv@3.0.2: dependencies: '@polka/url': 1.0.0-next.29 @@ -3544,6 +3663,15 @@ snapshots: strip-json-comments@3.1.1: {} + supabase@2.92.0: + dependencies: + bin-links: 6.0.0 + https-proxy-agent: 9.0.0 + node-fetch: 3.3.2 + tar: 7.5.13 + transitivePeerDependencies: + - supports-color + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -3594,6 +3722,14 @@ snapshots: tapable@2.3.0: {} + tar@7.5.13: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + tar@7.5.9: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -3730,6 +3866,8 @@ snapshots: - tsx - yaml + web-streams-polyfill@3.3.3: {} + webidl-conversions@3.0.1: {} webpack-virtual-modules@0.6.2: {} @@ -3750,6 +3888,10 @@ snapshots: word-wrap@1.2.5: {} + write-file-atomic@7.0.1: + dependencies: + signal-exit: 4.1.0 + ws@8.19.0: {} yallist@5.0.0: {} diff --git a/src/lib/api/api.dtos.ts b/src/lib/api/api.dtos.ts index 1a34374e..5f3c09cf 100644 --- a/src/lib/api/api.dtos.ts +++ b/src/lib/api/api.dtos.ts @@ -192,6 +192,7 @@ export interface ReportUserScheduleDto { is_active?: boolean; end_of_week?: boolean; end_of_month?: boolean; + end_of_day?: boolean; user_id?: string; report_id?: string | null; created_at?: string; @@ -202,6 +203,7 @@ export interface CreateReportUserScheduleRequest { created_at?: string; dev_eui: string; end_of_month?: boolean; + end_of_day?: boolean; end_of_week?: boolean; id?: number; is_active?: boolean; diff --git a/src/lib/components/layout/AppPage.svelte b/src/lib/components/layout/AppPage.svelte index 9848e3fd..0cba639e 100644 --- a/src/lib/components/layout/AppPage.svelte +++ b/src/lib/components/layout/AppPage.svelte @@ -29,8 +29,7 @@