From e06cf1ae34fe7807f73a3ce89d98ab5d5c4304e8 Mon Sep 17 00:00:00 2001 From: Gisle Aune Date: Fri, 6 Oct 2023 13:15:19 +0200 Subject: [PATCH] script editor --- effects/animation.go | 6 +- effects/gradient.go | 8 +- effects/pattern.go | 4 +- effects/random.go | 6 +- effects/vrange.go | 2 +- frontend/src/lib/components/Checkbox.svelte | 8 +- frontend/src/lib/components/Icon.svelte | 11 ++ frontend/src/lib/components/Modal.svelte | 20 ++- .../src/lib/components/ModalSection.svelte | 9 +- .../components/bforms/BFormColorOption.svelte | 13 ++ .../lib/components/bforms/BFormOption.svelte | 13 +- .../components/bforms/BFormParameter.svelte | 12 +- .../scripting/ScriptAssignmentState.svelte | 3 - .../components/scripting/ScriptBlock.svelte | 58 +++++++ .../scripting/ScriptCondition.svelte | 31 ++++ .../components/scripting/ScriptEffect.svelte | 74 +++++++++ .../components/scripting/ScriptLine.svelte | 111 +++++++++++++ .../scripting/ScriptLineBlock.svelte | 19 +++ .../components/scripting/ScriptMatch.svelte | 38 +++++ .../lib/components/scripting/ScriptSet.svelte | 18 +++ frontend/src/lib/contexts/ModalContext.svelte | 3 +- frontend/src/lib/modals/DeviceModal.svelte | 2 - frontend/src/lib/modals/ScriptModal.svelte | 120 ++++++++++++++ frontend/src/lib/models/assignment.ts | 14 +- frontend/src/lib/models/command.ts | 13 ++ frontend/src/lib/models/device.ts | 4 + frontend/src/lib/models/script.ts | 146 +++++++++++++++++- frontend/src/lib/models/uistate.ts | 3 +- frontend/src/routes/+page.svelte | 12 +- services/httpapiv1/service.go | 6 +- services/mysqldb/mysqlgen/db.go | 10 ++ services/mysqldb/mysqlgen/script.sql.go | 9 ++ services/mysqldb/queries/script.sql | 3 + services/mysqldb/service.go | 29 ++-- services/uistate/data.go | 6 +- 35 files changed, 776 insertions(+), 68 deletions(-) create mode 100644 frontend/src/lib/components/scripting/ScriptBlock.svelte create mode 100644 frontend/src/lib/components/scripting/ScriptCondition.svelte create mode 100644 frontend/src/lib/components/scripting/ScriptEffect.svelte create mode 100644 frontend/src/lib/components/scripting/ScriptLine.svelte create mode 100644 frontend/src/lib/components/scripting/ScriptLineBlock.svelte create mode 100644 frontend/src/lib/components/scripting/ScriptMatch.svelte create mode 100644 frontend/src/lib/components/scripting/ScriptSet.svelte create mode 100644 frontend/src/lib/modals/ScriptModal.svelte diff --git a/effects/animation.go b/effects/animation.go index 7244b65..4cc0e26 100644 --- a/effects/animation.go +++ b/effects/animation.go @@ -7,9 +7,9 @@ import ( ) type Solid struct { - States []device.State `json:"states,omitempty"` - AnimationMS int64 `json:"animationMs,omitempty"` - Interleave int `json:"interleave,omitempty"` + States []device.State `json:"states"` + AnimationMS int64 `json:"animationMs"` + Interleave int `json:"interleave"` } func (e Solid) State(_, length, round int) device.State { diff --git a/effects/gradient.go b/effects/gradient.go index 0a83374..4b2b2f2 100644 --- a/effects/gradient.go +++ b/effects/gradient.go @@ -7,10 +7,10 @@ import ( ) type Gradient struct { - States []device.State `json:"states,omitempty"` - AnimationMS int64 `json:"animationMs,omitempty"` - Reverse bool `json:"reverse,omitempty"` - Interpolate bool `json:"interpolate,omitempty"` + States []device.State `json:"states"` + AnimationMS int64 `json:"animationMs"` + Reverse bool `json:"reverse"` + Interpolate bool `json:"interpolate"` } func (e Gradient) State(index, length, round int) device.State { diff --git a/effects/pattern.go b/effects/pattern.go index 0c3f6c9..78ef3fc 100644 --- a/effects/pattern.go +++ b/effects/pattern.go @@ -7,8 +7,8 @@ import ( ) type Pattern struct { - States []device.State `json:"states,omitempty"` - AnimationMS int64 `json:"animationMs,omitempty"` + States []device.State `json:"states"` + AnimationMS int64 `json:"animationMs"` } func (e Pattern) State(index, _, round int) device.State { diff --git a/effects/random.go b/effects/random.go index d5e88e6..49982d7 100644 --- a/effects/random.go +++ b/effects/random.go @@ -8,9 +8,9 @@ import ( ) type Random struct { - States []device.State `json:"states,omitempty"` - Interpolate bool `json:"interpolate,omitempty"` - AnimationMS int64 `json:"animationMs,omitempty"` + States []device.State `json:"states"` + Interpolate bool `json:"interpolate"` + AnimationMS int64 `json:"animationMs"` } func (e Random) State(_, _, _ int) device.State { diff --git a/effects/vrange.go b/effects/vrange.go index 6fee806..ac6e257 100644 --- a/effects/vrange.go +++ b/effects/vrange.go @@ -7,7 +7,7 @@ import ( ) type VRange struct { - States []device.State `json:"states,omitempty"` + States []device.State `json:"states"` Variable string `json:"variable"` Min float64 `json:"min"` Max float64 `json:"max"` diff --git a/frontend/src/lib/components/Checkbox.svelte b/frontend/src/lib/components/Checkbox.svelte index db6c19e..21c2c8e 100644 --- a/frontend/src/lib/components/Checkbox.svelte +++ b/frontend/src/lib/components/Checkbox.svelte @@ -4,12 +4,13 @@ import Icon, { type IconName } from "./Icon.svelte"; export let tabIndex: number | undefined | null = void(0); - export let checked = false; + export let checked: boolean | string | number; export let centered = false; export let disabled = false; export let noLabel = false; export let noBorder = false; export let inline = false; + export let small = false; export let icon: IconName = "check"; export let label = "(Missing label property)"; @@ -35,6 +36,7 @@ class:centered class:noLabel class:inline + class:small role="checkbox" aria-checked={checked} aria-disabled={disabled} @@ -72,6 +74,10 @@ margin-bottom: 0 font-size: 0.75em + &.small + padding-top: 0 + font-size: 0.65em + div.checkbox.centered margin: auto diff --git a/frontend/src/lib/components/Icon.svelte b/frontend/src/lib/components/Icon.svelte index df2337f..2623abe 100644 --- a/frontend/src/lib/components/Icon.svelte +++ b/frontend/src/lib/components/Icon.svelte @@ -55,7 +55,13 @@ import { faMasksTheater } from "@fortawesome/free-solid-svg-icons/faMasksTheater"; import { faTag } from "@fortawesome/free-solid-svg-icons/faTag"; import { faFilter } from "@fortawesome/free-solid-svg-icons/faFilter"; + import { faSignature } from "@fortawesome/free-solid-svg-icons/faSignature"; + import { faAsterisk } from "@fortawesome/free-solid-svg-icons/faAsterisk"; + import { faPlay } from "@fortawesome/free-solid-svg-icons/faPlay"; + import { faClockRotateLeft } from "@fortawesome/free-solid-svg-icons/faClockRotateLeft"; + import { faNoteSticky } from "@fortawesome/free-solid-svg-icons/faNoteSticky"; + const icons = { "clock": faClock, "thumbtack": faThumbtack, @@ -90,6 +96,11 @@ "masks_theater": faMasksTheater, "tag": faTag, "filter": faFilter, + "signature": faSignature, + "asterisk": faAsterisk, + "play": faPlay, + "clock_rotate_left": faClockRotateLeft, + "note_sticky": faNoteSticky, }; export type IconName = keyof typeof icons; diff --git a/frontend/src/lib/components/Modal.svelte b/frontend/src/lib/components/Modal.svelte index 4504b7b..388d90e 100644 --- a/frontend/src/lib/components/Modal.svelte +++ b/frontend/src/lib/components/Modal.svelte @@ -6,6 +6,8 @@ export let submitText: string = "Submit"; export let cancelLabel: string = "Cancel"; export let wide: boolean = false; + export let ultrawide: boolean = false; + export let fullheight: boolean = false; export let error: string | null = null; export let closable: boolean = false; export let disabled: boolean = false; @@ -28,7 +30,7 @@ {#if show}