Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix to broken state change updates on some fields #37

Merged
merged 3 commits into from
Dec 13, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Fixed
- Oneof value that has a message with no fields would cause the UI to become unresponsive
- State loss between methods causing repeated fields to be reset to empty and the "add" button becoming unresponsive

## [v0.3.2] - 2020-11-25

Expand Down
2 changes: 1 addition & 1 deletion frontend/src/controls/TextArea.svelte
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<script>
import InputLabel from "./InputLabel.svelte";
export let label;
export let label = undefined;
export let hint = "";
export let value = "";
export let width = "400px";
Expand Down
12 changes: 4 additions & 8 deletions frontend/src/views/FieldBool.svelte
Original file line number Diff line number Diff line change
@@ -1,26 +1,22 @@
<script>
import { onMount, beforeUpdate } from 'svelte';
import Checkbox from "../controls/Checkbox.svelte";

export let field;
export let state;
export let key;
export let idx;

let val;
let val, labelColor, removeable;

const resetState = () => {
$: {
val = key !== undefined ? key : idx >= 0 ? idx : field.name;
if (!state[val]) {
state[val] = false;
}
labelColor = key !== undefined ? "var(--accent-color3)" : idx >= 0 ? "var(--accent-color2)" : undefined;
removeable = idx >= 0;
}

onMount(resetState)
beforeUpdate(resetState)

const labelColor = key !== undefined ? "var(--accent-color3)" : idx >= 0 ? "var(--accent-color2)" : undefined;
const removeable = idx >= 0;
</script>

<style>
Expand Down
14 changes: 4 additions & 10 deletions frontend/src/views/FieldBoolValue.svelte
Original file line number Diff line number Diff line change
@@ -1,30 +1,24 @@
<script>
import { onMount, beforeUpdate } from 'svelte';
import Radio from "../controls/Radio.svelte";

export let field;
export let state;
export let idx;
export let key;

let val;
let val, labelColor, removeable;

const resetState = () => {
$: {
val = key !== undefined ? key : idx >= 0 ? idx : field.name;
labelColor = key !== undefined ? "var(--accent-color3)" : idx >= 0 ? "var(--accent-color2)" : undefined;
removeable = idx >= 0;
}

const labelColor = key !== undefined ? "var(--accent-color3)" : idx >= 0 ? "var(--accent-color2)" : undefined;
const removeable = idx >= 0;

onMount(resetState)
beforeUpdate(resetState)

const options = [
{label: "nil", value: undefined},
{label: "false", value: false},
{label: "true", value: true},
];

</script>

<style>
Expand Down
13 changes: 4 additions & 9 deletions frontend/src/views/FieldEnum.svelte
Original file line number Diff line number Diff line change
@@ -1,26 +1,21 @@
<script>
import { onMount, beforeUpdate } from 'svelte';
import Dropdown from "../controls/Dropdown.svelte";

export let field;
export let state;
export let key;
export let idx;

let val;
let val, labelColor, removeable;

const resetState = () => {
$: {
val = key !== undefined ? key : idx >= 0 ? idx : field.name;
if (!state[val]) {
state[val] = field.enum[0];
}
labelColor = key !== undefined ? "var(--accent-color3)" : idx >= 0 ? "var(--accent-color2)" : undefined;
removeable = idx >= 0;
}

onMount(resetState)
beforeUpdate(resetState)

const labelColor = key !== undefined ? "var(--accent-color3)" : idx >= 0 ? "var(--accent-color2)" : undefined;
const removeable = idx >= 0;

const onSelectChanged = ({ detail: { value }}) => {
state[val] = value;
Expand Down
45 changes: 23 additions & 22 deletions frontend/src/views/FieldMap.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -17,34 +17,35 @@
// changes we swap in and out the state object and where it should be tracked: map items or
// the real state object. Luckly JS Objects can be passed by reference so this works.

beforeUpdate(() => {
if (!state[field.name] || !mapItems[field.full_name]) {
return
let keyType = field.map_key.kind;
let valType = field.map_value.kind;

$: {
if (state[field.name] && mapItems[field.full_name]) {
const stateKeys = Object.keys(state[field.name])
if (mapItems[field.full_name].length === 0 && stateKeys.length > 0) {
stateKeys.forEach(k => {
mapItems[field.full_name].push({key: k});
})
mapItems[field.full_name] = mapItems[field.full_name];
}
}
const stateKeys = Object.keys(state[field.name])
if (mapItems[field.full_name].length === 0 && stateKeys.length > 0) {
stateKeys.forEach(k => {
mapItems[field.full_name].push({key: k});
})
mapItems[field.full_name] = mapItems[field.full_name];

keyType = field.map_key.kind;
valType = field.map_value.kind;
if (field.map_value.kind === "message" || field.map_value.kind === "group") {
valType = field.map_value.message.name;
}
})

const keyType = field.map_key.kind;
let valType = field.map_value.kind;
let valMsg = false;
if (field.map_value.kind === "message" || field.map_value.kind === "group") {
valType = field.map_value.message.name;
valMsg = true;
}
if (!mapItems[field.full_name]) {
mapItems[field.full_name] = [];
}

if (!mapItems[field.full_name]) {
mapItems[field.full_name] = [];
if (!state[field.name]) {
state[field.name] = {};
}
}

if (!state[field.name]) {
state[field.name] = {};
}

const onAddButtonClicked = () => {
mapItems[field.full_name] = [...mapItems[field.full_name], {key: "", ref: {}}];
Expand Down
12 changes: 4 additions & 8 deletions frontend/src/views/FieldMessage.svelte
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<script>
import { onMount, beforeUpdate } from 'svelte';
import MessageField from "./MessageField.svelte";
import InputLabel from "../controls/InputLabel.svelte";
import Checkbox from "../controls/Checkbox.svelte";
Expand All @@ -11,19 +10,16 @@
export let idx;
export let oneof = false;

const labelColor = key !== undefined ? "var(--accent-color3)" : idx >= 0 ? "var(--accent-color2)" : undefined;
const removeable = idx >= 0;

let val;
const resetState = () => {
let val, labelColor, removeable;
$: {
val = key !== undefined ? key : idx >= 0 ? idx : name;
if (!state[val] && (oneof || idx >= 0)) {
state[val] = {}
}
labelColor = key !== undefined ? "var(--accent-color3)" : idx >= 0 ? "var(--accent-color2)" : undefined;
removeable = idx >= 0;
}
onMount(resetState)
beforeUpdate(resetState)


const onEnabledChanged = ({ detail: checked}) => {
state[val] = checked ? {} : null
Expand Down
9 changes: 6 additions & 3 deletions frontend/src/views/FieldNilText.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@
export let idx;
export let multiline = false;

const val = key !== undefined ? key : idx >= 0 ? idx : field.name;
const labelColor = key !== undefined ? "var(--accent-color3)" : idx >= 0 ? "var(--accent-color2)" : undefined;
const removeable = idx >= 0;
let val, labelColor, removeable;
$: {
val = key !== undefined ? key : idx >= 0 ? idx : field.name;
labelColor = key !== undefined ? "var(--accent-color3)" : idx >= 0 ? "var(--accent-color2)" : undefined;
removeable = idx >= 0;
}

const onEnabledChanged = ({ detail: checked}) => {
state[val] = checked ? "" : undefined
Expand Down
9 changes: 3 additions & 6 deletions frontend/src/views/FieldOneof.svelte
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
<script>
import { onMount, beforeUpdate } from 'svelte';
import InputLabel from "../controls/InputLabel.svelte";
import Dropdown from "../controls/Dropdown.svelte";
import MessageField from "./MessageField.svelte";

export let field = {};
export let state;

const items = field.oneof.map(x => x.name);
let items;
let selectedValue = undefined;

const selectValue = () => {
$: {
items = field.oneof.map(x => x.name);
const k = Object.keys(state)
checkSelected:
for (let i = 0; i < k.length; i++) {
Expand All @@ -23,9 +23,6 @@
}
}

onMount(selectValue)
beforeUpdate(selectValue)

const onSelectChanged = ({ detail: { value }}) => {
if (selectedValue) {
delete state[selectedValue]
Expand Down
12 changes: 4 additions & 8 deletions frontend/src/views/FieldText.svelte
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<script>
import { onMount, beforeUpdate } from 'svelte';
import TextField from "../controls/TextField.svelte";
import TextArea from "../controls/TextArea.svelte";

Expand All @@ -10,20 +9,17 @@
export let multiline = false;
export let placeholder = "";

let val;
let val, labelColor, removeable;

const resetState = () => {
$: {
val = key !== undefined ? key : idx >= 0 ? idx : field.name;
if (!state[val]) {
state[val] = key !== undefined ? "" : null;
}
labelColor = key !== undefined ? "var(--accent-color3)" : idx >= 0 ? "var(--accent-color2)" : undefined;
removeable = idx >= 0;
}

const labelColor = key !== undefined ? "var(--accent-color3)" : idx >= 0 ? "var(--accent-color2)" : undefined;
const removeable = idx >= 0;

onMount(resetState)
beforeUpdate(resetState)
</script>

{#if multiline }
Expand Down
23 changes: 13 additions & 10 deletions frontend/src/views/FieldWellKnown.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,20 @@
export let key;
export let idx;

let field = {
name: name,
kind: message.full_name,
}

let field = {};
let placeholder = "";
if (field.kind === "google.protobuf.Timestamp") {
placeholder = "2006-01-02T15:04:05.000Z";
}
if (field.kind === "google.protobuf.Duration") {
placeholder = "0.1s";
$: {
field = {
name: name,
kind: message.full_name,
}

if (field.kind === "google.protobuf.Timestamp") {
placeholder = "2006-01-02T15:04:05.000Z";
}
if (field.kind === "google.protobuf.Duration") {
placeholder = "0.1s";
}
}
</script>

Expand Down
21 changes: 11 additions & 10 deletions frontend/src/views/RepeatedField.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -15,21 +15,22 @@
cloneTarget[key] = clone(target[key]);
}
return cloneTarget;
} else {
return target;
}
return f
}
return target;
}

hint = field.kind;
if (field.kind === "message" || field.kind === "group") {
hint = field.message.full_name;
}

if (!state[field.name]) {
state[field.name] = []
$: {
if (!state[field.name]) {
state[field.name] = []
}
hint = field.kind;
if (field.kind === "message" || field.kind === "group") {
hint = field.message.full_name;
}
}


const onAddButtonClicked = () => {
state[field.name] = [...state[field.name], null]
}
Expand Down
1 change: 1 addition & 0 deletions internal/server/foobar.proto
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ message BarRequest {
repeated Baz type_repeated_enum = 4;
repeated bytes type_repeated_bytes = 5;
repeated Bar type_repeated_message = 6;
repeated uint32 uint32repeated = 7;
}

message BarResponse {}
Expand Down