budibase/packages/builder/src/userInterface/EventSelector.svelte

110 lines
2.4 KiB
Svelte
Raw Normal View History

2019-09-20 09:01:35 +02:00
<script>
import IconButton from "../common/IconButton.svelte";
import StateBindingControl from "./StateBindingControl.svelte";
import {
2019-10-18 18:32:03 +02:00
find, map, keys, reduce, keyBy
2019-09-20 09:01:35 +02:00
} from "lodash/fp";
2019-10-18 18:32:03 +02:00
import { pipe, userWithFullAccess } from "../common/core";
2019-09-24 07:11:02 +02:00
import { EVENT_TYPE_MEMBER_NAME, allHandlers } from "../common/eventHandlers";
2019-10-18 18:32:03 +02:00
import { store } from "../builderStore";
2019-09-20 09:01:35 +02:00
export let event;
export let onChanged;
export let onRemoved;
2019-10-18 18:32:03 +02:00
let events;
2019-09-20 09:01:35 +02:00
let eventType;
let parameters = [];
2019-10-18 18:32:03 +02:00
store.subscribe(s => {
events = allHandlers(
{hierarchy: s.hierarchy},
userWithFullAccess({
hierarchy: s.hierarchy,
actions: keyBy("name")(s.actions)
})
);
});
2019-09-20 09:01:35 +02:00
$: {
if(event) {
2019-09-22 06:02:33 +02:00
eventType = event[EVENT_TYPE_MEMBER_NAME];
2019-09-20 09:01:35 +02:00
parameters = pipe(event.parameters, [
keys,
map(k => ({name:k, value:event.parameters[k]}))
]);
} else {
eventType = "";
parameters = [];
}
}
const eventChanged = (type, parameters) => {
const paramsAsObject = reduce(
(obj, p) => {
obj[p.name] = p.value;
return obj;
}
, {}
)(parameters)
2019-09-22 06:02:33 +02:00
const ev = {};
ev[EVENT_TYPE_MEMBER_NAME]=type;
ev.parameters = paramsAsObject;
onChanged(ev);
2019-09-20 09:01:35 +02:00
}
const eventTypeChanged = (ev) => {
const eType = find(e => e.name === ev.target.value)(events);
const emptyParameters = map(p => ({name:p, value:""}))(eType.parameters);
eventChanged(eType.name, emptyParameters);
}
2019-09-22 06:02:33 +02:00
const onParameterChanged = index => val => {
2019-09-20 09:01:35 +02:00
const newparameters = [...parameters];
2019-09-22 06:02:33 +02:00
newparameters[index].value = val;
2019-09-20 09:01:35 +02:00
eventChanged(eventType, newparameters);
}
</script>
<div class="type-selector-container">
<select class="type-selector uk-select uk-form-small " value={eventType} on:change={eventTypeChanged}>
{#each events as ev}
<option value={ev.name}>{ev.name}</option>
{/each}
</select>
<IconButton icon="trash"
size="12"
on:click={onRemoved}/>
</div>
{#if parameters}
{#each parameters as p, index}
<div>
{p.name}
</div>
<StateBindingControl onChanged={onParameterChanged(index)}
value={p.value} />
{/each}
{/if}
<style>
.type-selector-container {
display: flex;
}
.type-selector {
border-color: var(--primary50);
border-radius: 2px;
width: 50px;
flex: 1 0 auto;
}
</style>