undergroundwires/privacy.sexy

View on GitHub
src/presentation/components/Scripts/View/Tree/TreeView/Node/LeafTreeNode.vue

Summary

Maintainability
Test Coverage
<template>
  <li>
    <InteractableNode
      :node-id="nodeId"
      :tree-root="treeRoot"
      class="node"
    >
      <div class="node__layout">
        <div class="node__checkbox">
          <NodeCheckbox
            :node-id="nodeId"
            :tree-root="treeRoot"
          />
        </div>
        <div class="node__content content">
          <slot
            name="node-content"
            :node-metadata="currentNode.metadata"
          />
        </div>
      </div>
    </InteractableNode>
  </li>
</template>

<script lang="ts">
import { defineComponent, computed, toRef } from 'vue';
import { useCurrentTreeNodes } from '../UseCurrentTreeNodes';
import NodeCheckbox from './NodeCheckbox.vue';
import InteractableNode from './InteractableNode.vue';
import type { TreeNode } from './TreeNode';
import type { TreeRoot } from '../TreeRoot/TreeRoot';
import type { PropType } from 'vue';

export default defineComponent({
  components: {
    NodeCheckbox,
    InteractableNode,
  },
  props: {
    nodeId: {
      type: String,
      required: true,
    },
    treeRoot: {
      type: Object as PropType<TreeRoot>,
      required: true,
    },
  },
  setup(props) {
    const { nodes } = useCurrentTreeNodes(toRef(props, 'treeRoot'));
    const currentNode = computed<TreeNode>(() => nodes.value.getNodeById(props.nodeId));

    return {
      currentNode,
    };
  },
});
</script>

<style scoped lang="scss">
@use "@/presentation/assets/styles/main" as *;
@use "./../tree-colors" as *;

.node__layout {
  display: flex;
  align-items: center;
  flex: 1;

  .node__checkbox {
    flex-shrink: 0; // Always render the checkbox properly on small screens
  }
  .node__content {
    flex: 1; // Expands the node horizontally, allowing its content to utilize full width for child item alignment, such as icons and text.
    overflow: auto; // Prevents horizontal expansion of inner content (e.g., when a code block is shown)
  }
}
.node {
  margin-bottom: $spacing-absolute-xx-small;
  margin-top: $spacing-absolute-xx-small;
  padding-bottom: $spacing-absolute-xx-small;
  padding-top: $spacing-absolute-xx-small;
  padding-right: $spacing-absolute-small;
  box-sizing: border-box;

  .content {
    display: flex; // We could provide `block`, but `flex` is more versatile.
    color: $color-node-fg;
    padding-left: $spacing-relative-small;
    padding-right: $spacing-absolute-x-small;
    text-decoration: none;
    user-select: none;
  }
}
</style>