196 lines
5.3 KiB
JavaScript
196 lines
5.3 KiB
JavaScript
import {
|
|
createResource,
|
|
createSignal,
|
|
mergeProps,
|
|
onMount,
|
|
Show,
|
|
} from "solid-js";
|
|
|
|
import List from "../modules/list";
|
|
import CreateDeviceModal from "../modals/create-device-modal";
|
|
import DeviceService from "../services/device-service";
|
|
import ShowRegistrationCodeModal from "../modals/show-registration-code-modal";
|
|
import DeleteIntegrationModal from "../modals/delete-integration-modal";
|
|
|
|
function DevicesView(props) {
|
|
props = mergeProps({ onIntegrationClicked: () => {} }, props);
|
|
const DEVICES_LIST_TYPE = "devices";
|
|
const INTEGRATION_LIST_TYPE = "integrations";
|
|
|
|
const [listType, setListType] = createSignal(INTEGRATION_LIST_TYPE);
|
|
const [devices, setDevices] = createSignal([]);
|
|
const [integrations, { refetch: refetchIntegrations }] = createResource(
|
|
DeviceService.getIntegrations
|
|
);
|
|
|
|
CreateDeviceModal.onDeviceCreated(() => {
|
|
handleRefreshDevices();
|
|
});
|
|
|
|
onMount(() => {
|
|
handleRefreshDevices();
|
|
DeleteIntegrationModal.onIntegrationDeleted(() => {
|
|
refetchIntegrations();
|
|
});
|
|
});
|
|
|
|
function handleNewDevice() {
|
|
CreateDeviceModal.Handler.show();
|
|
}
|
|
|
|
async function handleRefreshDevices() {
|
|
let devices = await DeviceService.getDevices();
|
|
setDevices(devices);
|
|
}
|
|
|
|
function handleRegisterIntegration() {
|
|
ShowRegistrationCodeModal.Handler.show();
|
|
}
|
|
|
|
function handleDeleteIntegration(integration) {
|
|
DeleteIntegrationModal.setIntegration(integration);
|
|
DeleteIntegrationModal.Handler.show();
|
|
}
|
|
|
|
function handleIntegrationItemClicked(item) {
|
|
props.onIntegrationClicked(item.integration);
|
|
}
|
|
|
|
return (
|
|
<div
|
|
class={
|
|
"d-flex flex-column overflow-hidden flex-fill px-3 pb-2 pt-3 " +
|
|
props.class
|
|
}
|
|
>
|
|
<div class="d-flex flex-row">
|
|
<div class="d-flex flex-row flex-fill">
|
|
<button
|
|
class={
|
|
"btn me-2 mb-3" +
|
|
(listType() === INTEGRATION_LIST_TYPE
|
|
? " btn-secondary"
|
|
: " btn-dark")
|
|
}
|
|
onClick={() => setListType(INTEGRATION_LIST_TYPE)}
|
|
>
|
|
<i class="bi bi-gear me-2"></i>
|
|
Integrations
|
|
</button>
|
|
<button
|
|
class={
|
|
"btn me-2 mb-3" +
|
|
(listType() === DEVICES_LIST_TYPE
|
|
? " btn-secondary"
|
|
: " btn-dark")
|
|
}
|
|
onClick={() => setListType(DEVICES_LIST_TYPE)}
|
|
>
|
|
<i class="bi bi-tv me-2"></i>
|
|
Devices
|
|
</button>
|
|
</div>
|
|
<div class="d-flex flex-row justify-content-end flex-fill">
|
|
<Show when={listType() === DEVICES_LIST_TYPE}>
|
|
<button class="btn btn-dark me-2 mb-3" onClick={handleNewDevice}>
|
|
<i class="bi bi-plus-square me-2"></i>
|
|
New Device
|
|
</button>
|
|
</Show>
|
|
<Show when={listType() === INTEGRATION_LIST_TYPE}>
|
|
<button
|
|
class="btn btn-dark me-2 mb-3"
|
|
onClick={handleRegisterIntegration}
|
|
>
|
|
<i class="bi bi-plus-square me-2"></i>
|
|
Register
|
|
</button>
|
|
</Show>
|
|
</div>
|
|
</div>
|
|
<Show when={listType() === DEVICES_LIST_TYPE}>
|
|
<List
|
|
onListItemClick={() => {}}
|
|
items={devices().map((device) => ({
|
|
id: {
|
|
html: <span class="font-monospace">{device.getId()}</span>,
|
|
},
|
|
name: {
|
|
text: device.getName(),
|
|
},
|
|
description: {
|
|
text: device.getDescription(),
|
|
},
|
|
device,
|
|
}))}
|
|
class={"flex-fill"}
|
|
columns={[
|
|
{
|
|
id: "id",
|
|
name: "id",
|
|
width: 6,
|
|
},
|
|
{
|
|
id: "name",
|
|
name: "Name",
|
|
width: 10,
|
|
},
|
|
{
|
|
id: "description",
|
|
name: "Description",
|
|
},
|
|
]}
|
|
></List>
|
|
</Show>
|
|
<Show when={listType() === INTEGRATION_LIST_TYPE}>
|
|
<List
|
|
onListItemClick={handleIntegrationItemClicked}
|
|
items={(integrations() || []).map((integration) => ({
|
|
id: {
|
|
html: <span class="font-monospace">{integration.getId()}</span>,
|
|
},
|
|
name: {
|
|
text: integration.getName(),
|
|
},
|
|
options: {
|
|
html: (
|
|
<>
|
|
<button
|
|
class="btn btn-outline-secondary me-2"
|
|
onClick={(event) => {
|
|
event.stopPropagation();
|
|
handleDeleteIntegration(integration);
|
|
}}
|
|
>
|
|
<i class="bi bi-trash-fill"></i>
|
|
</button>
|
|
</>
|
|
),
|
|
},
|
|
integration: integration,
|
|
}))}
|
|
class={"flex-fill"}
|
|
columns={[
|
|
{
|
|
id: "id",
|
|
name: "id",
|
|
width: 6,
|
|
},
|
|
{
|
|
id: "name",
|
|
name: "Name",
|
|
},
|
|
{
|
|
id: "options",
|
|
name: "",
|
|
width: 4,
|
|
},
|
|
]}
|
|
></List>
|
|
</Show>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
export default DevicesView;
|