Newer
Older
smart-home-server / webclient-vue / src / features / scripts / pages / ScriptsScopesPage.vue
@Eugene Sukhodolskiy Eugene Sukhodolskiy 23 hours ago 2 KB Add script detail pages with scope grouping
<template>
  <section class="page">
    <GnPageHeader title="Scopes" kicker="Scripts">
      <template #actions>
        <GnBadge variant="primary">{{ scriptsStore.totalScopes }} scopes</GnBadge>
      </template>
    </GnPageHeader>

    <AppLoadingState v-if="scriptsStore.isLoadingScopes" text="Loading scopes" />

    <AppErrorState
      v-else-if="scriptsStore.errorScopes"
      title="Scopes loading failed"
      :message="scriptsStore.errorScopes.message"
      :retry="scriptsStore.loadScopes"
    />

    <AppEmptyState
      v-else-if="scriptsStore.scopes.length === 0"
      title="No scopes"
      message="No script scopes registered."
    />

    <div v-else class="devices-panel">
      <GnTable :columns="tableColumns" :rows="scriptsStore.scopes" caption="Script scopes">
        <template #cell-name="{ row }">
          <router-link
            :to="{ name: 'script-detail', params: { type: 'scopes', id: row.name } }"
            class="script-link"
          >
            {{ row.name }}
          </router-link>
        </template>

        <template #cell-state="{ row }">
          <GnBadge :variant="row.state === 'enabled' ? 'success' : 'secondary'"
          >{{ row.state }}</GnBadge>
        </template>

        <template #cell-actions="{ row }">
          <GnButton
            v-if="row.state === 'enabled'"
            variant="secondary"
            icon="ph-pause"
            @click="toggle(row.name, false)"
          >
            Disable
          </GnButton>
          <GnButton
            v-else
            variant="primary"
            icon="ph-play"
            @click="toggle(row.name, true)"
          >
            Enable
          </GnButton>
        </template>
      </GnTable>
    </div>
  </section>
</template>

<script setup>
import { onMounted } from "vue";
import { useRouter } from "vue-router";
import { useScriptsStore } from "../../../stores/scripts";
import { GnPageHeader, GnBadge, GnTable, GnButton } from "gnexus-ui-kit/vue";
import AppEmptyState from "../../../components/feedback/AppEmptyState.vue";
import AppErrorState from "../../../components/feedback/AppErrorState.vue";
import AppLoadingState from "../../../components/feedback/AppLoadingState.vue";

const router = useRouter();
const scriptsStore = useScriptsStore();

const tableColumns = [
  { key: "name", label: "Name" },
  { key: "filename", label: "File" },
  { key: "state", label: "State" },
  { key: "path", label: "Path" },
  { key: "actions", label: "Actions" },
];

function goToDetail(name) {
  router.push({ name: "script-detail", params: { type: "scopes", id: name } });
}

function toggle(name, enabled) {
  scriptsStore.setScopeState(name, enabled);
}

onMounted(() => {
  scriptsStore.loadScopes();
});
</script>

<style scoped>
.script-link {
  color: var(--color-primary);
}
</style>