odoo18/addons/hw_posbox_homepage/static/src/app/Homepage.js

149 lines
5.9 KiB
JavaScript

/* global owl */
import { SingleData } from "./components/SingleData.js";
import { FooterButtons } from "./components/FooterButtons.js";
import { ServerDialog } from "./components/dialog/ServerDialog.js";
import { WifiDialog } from "./components/dialog/WifiDialog.js";
import useStore from "./hooks/useStore.js";
import { UpdateDialog } from "./components/dialog/UpdateDialog.js";
import { DeviceDialog } from "./components/dialog/DeviceDialog.js";
import { SixDialog } from "./components/dialog/SixDialog.js";
import { LoadingFullScreen } from "./components/LoadingFullScreen.js";
import { IconButton } from "./components/IconButton.js";
const { Component, xml, useState, onWillStart } = owl;
export class Homepage extends Component {
static props = {};
static components = {
SingleData,
FooterButtons,
ServerDialog,
WifiDialog,
UpdateDialog,
DeviceDialog,
SixDialog,
LoadingFullScreen,
IconButton,
};
setup() {
this.store = useStore();
this.state = useState({ data: {}, loading: true, waitRestart: false });
this.store.advanced = localStorage.getItem("showAdvanced") === "true";
onWillStart(async () => {
await this.loadInitialData();
});
setInterval(() => {
this.loadInitialData();
}, 10000);
}
async loadInitialData() {
try {
const data = await this.store.rpc({
url: "/hw_posbox_homepage/data",
});
if (data.system === "Linux") {
this.store.isLinux = true;
}
this.state.data = data;
this.store.base = data;
this.state.loading = false;
this.store.update = new Date().getTime();
} catch {
console.warn("Error while fetching data");
}
}
async restartOdooService() {
try {
await this.store.rpc({
url: "/hw_posbox_homepage/restart_odoo_service",
});
this.state.waitRestart = true;
} catch {
console.warn("Error while restarting Odoo Service");
}
}
toggleAdvanced() {
this.store.advanced = !this.store.advanced;
localStorage.setItem("showAdvanced", this.store.advanced);
}
static template = xml`
<LoadingFullScreen t-if="this.state.waitRestart">
<t t-set-slot="body">
Restarting IoT Box, please wait...
</t>
</LoadingFullScreen>
<div t-if="!this.state.loading" class="w-100 d-flex flex-column align-items-center justify-content-center" style="background-color: #F1F1F1; height: 100vh">
<div class="bg-white p-4 rounded overflow-auto position-relative" style="width: 100%; max-width: 600px;">
<div class="position-absolute end-0 top-0 mt-3 me-4 d-flex gap-1">
<IconButton onClick.bind="toggleAdvanced" icon="this.store.advanced ? 'fa-cog' : 'fa-cogs'" />
<IconButton onClick.bind="restartOdooService" icon="'fa-power-off'" />
</div>
<div class="d-flex mb-4 flex-column align-items-center justify-content-center">
<h4 class="text-center m-0">IoT Box - <t t-esc="state.data.hostname" /></h4>
</div>
<div t-if="this.store.advanced" class="alert alert-warning" role="alert">
<p class="m-0 fw-bold">HTTPS certificate</p>
<small>Error code: <t t-esc="state.data.certificate_details" /></small>
</div>
<SingleData name="'Name'" value="state.data.hostname" icon="'fa-id-card'">
<t t-set-slot="button">
<ServerDialog t-if="this.store.isLinux" />
</t>
</SingleData>
<SingleData t-if="this.store.advanced" name="'Version'" value="state.data.version" icon="'fa-microchip'">
<t t-set-slot="button">
<UpdateDialog t-if="this.store.isLinux" />
</t>
</SingleData>
<SingleData t-if="this.store.advanced" name="'IP address'" value="state.data.ip" icon="'fa-globe'" />
<SingleData t-if="this.store.advanced" name="'MAC address'" value="state.data.mac.toUpperCase()" icon="'fa-address-card'" />
<SingleData t-if="this.store.isLinux" name="'Internet Status'" value="state.data.network_status" icon="'fa-wifi'">
<t t-set-slot="button">
<WifiDialog />
</t>
</SingleData>
<SingleData name="'Odoo database connected'" value="state.data.server_status" icon="'fa-link'">
<t t-set-slot="button">
<ServerDialog />
</t>
</SingleData>
<SingleData t-if="state.data.pairing_code" name="'Pairing Code'" value="state.data.pairing_code" icon="'fa-code'"/>
<SingleData t-if="this.store.advanced" name="'Six terminal'" value="state.data.six_terminal" icon="'fa-money'">
<t t-set-slot="button">
<SixDialog />
</t>
</SingleData>
<SingleData name="'Devices'" value="state.data.iot_device_status.length + ' devices'" icon="'fa-plug'">
<t t-set-slot="button">
<DeviceDialog />
</t>
</SingleData>
<hr class="mt-5" />
<FooterButtons />
<div class="d-flex justify-content-center gap-2 mt-2">
<a href="https://www.odoo.com/fr_FR/help" target="_blank" class="link-primary">Help</a>
<a href="https://www.odoo.com/documentation/master/applications/general/iot.html" target="_blank" class="link-primary">Documentation</a>
</div>
</div>
</div>
<div t-else="" class="w-100 d-flex align-items-center justify-content-center" style="background-color: #F1F1F1; height: 100vh">
<div class="spinner-border" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
`;
}