diff --git a/Gemfile b/Gemfile index 969c90c65..22a2c8929 100755 --- a/Gemfile +++ b/Gemfile @@ -24,7 +24,7 @@ gem "scenic" gem "secure_headers" gem "tzinfo" # For validation of user selected timezone names gem "valid_url" -# gem "farady", "~> 1.0.0" +gem "kaminari" group :development, :test do gem "climate_control" diff --git a/Gemfile.lock b/Gemfile.lock index 7f22fde26..f0f340215 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -153,6 +153,18 @@ GEM json (2.3.0) jsonapi-renderer (0.2.2) jwt (2.2.1) + kaminari (1.2.0) + activesupport (>= 4.1.0) + kaminari-actionview (= 1.2.0) + kaminari-activerecord (= 1.2.0) + kaminari-core (= 1.2.0) + kaminari-actionview (1.2.0) + actionview + kaminari-core (= 1.2.0) + kaminari-activerecord (1.2.0) + activerecord + kaminari-core (= 1.2.0) + kaminari-core (1.2.0) loofah (2.4.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) @@ -320,6 +332,7 @@ DEPENDENCIES google-cloud-storage (~> 1.11) hashdiff jwt + kaminari mutations passenger pg diff --git a/app/controllers/api/abstract_controller.rb b/app/controllers/api/abstract_controller.rb index a3fdaa4b5..4b27ef6b3 100644 --- a/app/controllers/api/abstract_controller.rb +++ b/app/controllers/api/abstract_controller.rb @@ -80,6 +80,16 @@ module Api { root: false, user: current_user } end + def maybe_paginate(collection) + page = params[:page] + per = params[:per] + + if page && per + render json: collection.page(page).per(per) + else + render json: collection + end + end private def clean_expired_farm_events diff --git a/app/controllers/api/alerts_controller.rb b/app/controllers/api/alerts_controller.rb index e1c9c2cb4..41298b2a2 100644 --- a/app/controllers/api/alerts_controller.rb +++ b/app/controllers/api/alerts_controller.rb @@ -1,7 +1,7 @@ module Api class AlertsController < Api::AbstractController def index - render json: current_device.alerts + maybe_paginate current_device.alerts end def destroy diff --git a/app/controllers/api/farm_events_controller.rb b/app/controllers/api/farm_events_controller.rb index a2913cdee..f974cd613 100644 --- a/app/controllers/api/farm_events_controller.rb +++ b/app/controllers/api/farm_events_controller.rb @@ -3,7 +3,7 @@ module Api before_action :clean_expired_farm_events, only: [:index] def index - render json: current_device.farm_events + maybe_paginate current_device.farm_events end def show diff --git a/app/controllers/api/farmware_envs_controller.rb b/app/controllers/api/farmware_envs_controller.rb index 630edf7f1..9340eb72e 100644 --- a/app/controllers/api/farmware_envs_controller.rb +++ b/app/controllers/api/farmware_envs_controller.rb @@ -10,7 +10,7 @@ module Api end def index - render json: farmware_envs + maybe_paginate farmware_envs end def show diff --git a/app/controllers/api/farmware_installations_controller.rb b/app/controllers/api/farmware_installations_controller.rb index 21a67dd3a..6b59eeaf4 100644 --- a/app/controllers/api/farmware_installations_controller.rb +++ b/app/controllers/api/farmware_installations_controller.rb @@ -1,7 +1,7 @@ module Api class FarmwareInstallationsController < Api::AbstractController def index - render json: farmware_installations + maybe_paginate farmware_installations end def show diff --git a/app/controllers/api/peripherals_controller.rb b/app/controllers/api/peripherals_controller.rb index f9fb20030..d9ed7e98e 100644 --- a/app/controllers/api/peripherals_controller.rb +++ b/app/controllers/api/peripherals_controller.rb @@ -1,7 +1,7 @@ module Api class PeripheralsController < Api::AbstractController def index - render json: current_device.peripherals + maybe_paginate current_device.peripherals end def show diff --git a/app/controllers/api/pin_bindings_controller.rb b/app/controllers/api/pin_bindings_controller.rb index a50c8821d..6809b1627 100644 --- a/app/controllers/api/pin_bindings_controller.rb +++ b/app/controllers/api/pin_bindings_controller.rb @@ -1,7 +1,7 @@ module Api class PinBindingsController < Api::AbstractController def index - render json: pin_bindings + maybe_paginate pin_bindings end def show diff --git a/app/controllers/api/plant_templates_controller.rb b/app/controllers/api/plant_templates_controller.rb index 9e398e56b..0618edcc9 100644 --- a/app/controllers/api/plant_templates_controller.rb +++ b/app/controllers/api/plant_templates_controller.rb @@ -1,7 +1,7 @@ module Api class PlantTemplatesController < Api::AbstractController def index - render json: current_device.plant_templates + maybe_paginate current_device.plant_templates end def create diff --git a/app/controllers/api/point_groups_controller.rb b/app/controllers/api/point_groups_controller.rb index a6bbef56d..bd45be617 100644 --- a/app/controllers/api/point_groups_controller.rb +++ b/app/controllers/api/point_groups_controller.rb @@ -3,7 +3,7 @@ module Api before_action :clean_expired_farm_events, only: [:destroy] def index - render json: your_point_groups + maybe_paginate your_point_groups end def show diff --git a/app/controllers/api/points_controller.rb b/app/controllers/api/points_controller.rb index 99c098c7d..18d27db68 100644 --- a/app/controllers/api/points_controller.rb +++ b/app/controllers/api/points_controller.rb @@ -20,7 +20,7 @@ module Api .where("discarded_at < ?", Time.now - HARD_DELETE_AFTER) .destroy_all - render json: points(params.fetch(:filter) { "kept" }) + maybe_paginate points(params.fetch(:filter) { "kept" }) end def show diff --git a/app/controllers/api/regimens_controller.rb b/app/controllers/api/regimens_controller.rb index 9c9eea1fd..dd168cf11 100644 --- a/app/controllers/api/regimens_controller.rb +++ b/app/controllers/api/regimens_controller.rb @@ -3,7 +3,7 @@ module Api before_action :clean_expired_farm_events, only: [:destroy] def index - render json: your_regimens + maybe_paginate your_regimens end def show diff --git a/app/controllers/api/saved_gardens_controller.rb b/app/controllers/api/saved_gardens_controller.rb index f8bcbc8e1..bd689d8b8 100644 --- a/app/controllers/api/saved_gardens_controller.rb +++ b/app/controllers/api/saved_gardens_controller.rb @@ -1,7 +1,7 @@ module Api class SavedGardensController < Api::AbstractController def index - render json: current_device.saved_gardens + maybe_paginate current_device.saved_gardens end def create diff --git a/app/controllers/api/sensor_readings_controller.rb b/app/controllers/api/sensor_readings_controller.rb index 1954a04c1..a0e945873 100644 --- a/app/controllers/api/sensor_readings_controller.rb +++ b/app/controllers/api/sensor_readings_controller.rb @@ -5,7 +5,7 @@ module Api end def index - render json: readings + maybe_paginate(readings) end def show diff --git a/app/controllers/api/sensors_controller.rb b/app/controllers/api/sensors_controller.rb index 2e259dc74..aff19605e 100644 --- a/app/controllers/api/sensors_controller.rb +++ b/app/controllers/api/sensors_controller.rb @@ -1,7 +1,7 @@ module Api class SensorsController < Api::AbstractController def index - render json: current_device.sensors + maybe_paginate current_device.sensors end def show diff --git a/app/controllers/api/tools_controller.rb b/app/controllers/api/tools_controller.rb index 706d6398d..28c70c4a1 100644 --- a/app/controllers/api/tools_controller.rb +++ b/app/controllers/api/tools_controller.rb @@ -2,7 +2,7 @@ module Api class ToolsController < Api::AbstractController def index - render json: tools + maybe_paginate tools end def show diff --git a/app/controllers/api/webcam_feeds_controller.rb b/app/controllers/api/webcam_feeds_controller.rb index a22d99ebe..82ae43f80 100644 --- a/app/controllers/api/webcam_feeds_controller.rb +++ b/app/controllers/api/webcam_feeds_controller.rb @@ -7,7 +7,7 @@ module Api end def index - render json: webcams + maybe_paginate webcams end def show diff --git a/app/serializers/point_group_serializer.rb b/app/serializers/point_group_serializer.rb index 66e128aa4..f762c7e3c 100644 --- a/app/serializers/point_group_serializer.rb +++ b/app/serializers/point_group_serializer.rb @@ -4,4 +4,8 @@ class PointGroupSerializer < ApplicationSerializer def point_ids object.point_group_items.pluck(:point_id) end + + def criteria + object.criteria || PointGroup::DEFAULT_CRITERIA + end end diff --git a/db/migrate/20200204230135_add_show_zones_to_web_app_config.rb b/db/migrate/20200204230135_add_show_zones_to_web_app_config.rb new file mode 100644 index 000000000..f4a23279b --- /dev/null +++ b/db/migrate/20200204230135_add_show_zones_to_web_app_config.rb @@ -0,0 +1,8 @@ +class AddShowZonesToWebAppConfig < ActiveRecord::Migration[6.0] + def change + add_column :web_app_configs, + :show_zones, + :boolean, + default: false + end +end diff --git a/frontend/__test_support__/additional_mocks.ts b/frontend/__test_support__/additional_mocks.tsx similarity index 73% rename from frontend/__test_support__/additional_mocks.ts rename to frontend/__test_support__/additional_mocks.tsx index 6d80eed8a..6b2b3046d 100644 --- a/frontend/__test_support__/additional_mocks.ts +++ b/frontend/__test_support__/additional_mocks.tsx @@ -1,3 +1,5 @@ +import * as React from "react"; + jest.mock("browser-speech", () => ({ talk: jest.fn(), })); @@ -16,3 +18,8 @@ window.location = { pathname: "", href: "", hash: "", search: "", hostname: "", origin: "", port: "", protocol: "", host: "", }; + +jest.mock("../error_boundary", () => ({ + // tslint:disable-next-line:no-any + ErrorBoundary: (p: any) =>
{t("Invert Jog Buttons")}
@@ -29,13 +36,16 @@ export const MoveWidgetSettingsMenu = ({ toggle, getValue }: {{t("Display Encoder Data")}
-{t("Display Encoder Data")}
+{t("Swap jog buttons (and rotate map)")}
{t("Node name")}: {last((node_name || "").split("@"))}
{t("Device ID")}: {props.deviceAccount.body.id}
{isString(private_ip) &&{t("Local IP address")}: {private_ip}
} -{t("Firmware")}: {firmware_version}
+{t("Firmware")}: {reformatFwVersion(firmware_version)}
{t("Firmware code")}: {firmware_version}
{isNumber(uptime) &&{t("Memory usage")}: {memory_usage}MB
} diff --git a/frontend/devices/components/firmware_hardware_support.ts b/frontend/devices/components/firmware_hardware_support.ts index c7b3e2190..2178c1b8f 100644 --- a/frontend/devices/components/firmware_hardware_support.ts +++ b/frontend/devices/components/firmware_hardware_support.ts @@ -11,9 +11,18 @@ export const isFwHardwareValue = (x?: unknown): x is FirmwareHardware => { return !!values.includes(x as FirmwareHardware); }; +const TMC_BOARDS = ["express_k10", "farmduino_k15"]; +const EXPRESS_BOARDS = ["express_k10"]; + +export const isTMCBoard = (firmwareHardware: FirmwareHardware | undefined) => + !!(firmwareHardware && TMC_BOARDS.includes(firmwareHardware)); + +export const isExpressBoard = (firmwareHardware: FirmwareHardware | undefined) => + !!(firmwareHardware && EXPRESS_BOARDS.includes(firmwareHardware)); + export const getBoardIdentifier = (firmwareVersion: string | undefined): string => - firmwareVersion ? firmwareVersion.slice(-1) : "undefined"; + firmwareVersion ? firmwareVersion.split(".")[3] : "undefined"; export const isKnownBoard = (firmwareVersion: string | undefined): boolean => { const boardIdentifier = getBoardIdentifier(firmwareVersion); diff --git a/frontend/devices/components/hardware_settings.tsx b/frontend/devices/components/hardware_settings.tsx index 1dbbdaf44..a94d92497 100644 --- a/frontend/devices/components/hardware_settings.tsx +++ b/frontend/devices/components/hardware_settings.tsx @@ -25,7 +25,6 @@ export class HardwareSettings extends botToMqttStatus, firmwareHardware, resources } = this.props; const { informational_settings } = this.props.bot.hardware; - const firmwareVersion = informational_settings.firmware_version; const { sync_status } = informational_settings; const botDisconnected = !isBotOnline(sync_status, botToMqttStatus); return