Files
privacy.sexy/src/presentation/components/Scripts/View/Tree/ScriptsTree.vue
undergroundwires a721e82a4f Bump TypeScript to 5.3 with verbatimModuleSyntax
This commit upgrades TypeScript to the latest version 5.3 and introduces
`verbatimModuleSyntax` in line with the official Vue guide
recommendatinos (vuejs/docs#2592).

By enforcing `import type` for type-only imports, this commit improves
code clarity and supports tooling optimization, ensuring imports are
only bundled when necessary for runtime.

Changes:

- Bump TypeScript to 5.3.3 across the project.
- Adjust import statements to utilize `import type` where applicable,
  promoting cleaner and more efficient code.
2024-02-27 04:20:22 +01:00

95 lines
2.9 KiB
Vue

<template>
<div
class="scripts-tree-container"
:class="{
'top-padding': hasTopPadding,
}"
>
<template v-if="nodes.length">
<TreeView
:nodes="nodes"
:selected-leaf-node-ids="selectedScriptNodeIds"
:latest-filter-event="latestFilterEvent"
@node-state-changed="handleNodeChangedEvent($event)"
>
<template #node-content="{ nodeMetadata }">
<NodeContent :node-metadata="nodeMetadata" />
</template>
</TreeView>
</template>
<template v-else>
Nooo 😢
</template>
</div>
</template>
<script lang="ts">
import { defineComponent, toRef } from 'vue';
import { injectKey } from '@/presentation/injectionSymbols';
import TreeView from './TreeView/TreeView.vue';
import NodeContent from './NodeContent/NodeContent.vue';
import { useTreeViewFilterEvent } from './TreeViewAdapter/UseTreeViewFilterEvent';
import { useTreeViewNodeInput } from './TreeViewAdapter/UseTreeViewNodeInput';
import { useCollectionSelectionStateUpdater } from './TreeViewAdapter/UseCollectionSelectionStateUpdater';
import { useSelectedScriptNodeIds } from './TreeViewAdapter/UseSelectedScriptNodeIds';
import type { TreeNodeStateChangedEmittedEvent } from './TreeView/Bindings/TreeNodeStateChangedEmittedEvent';
export default defineComponent({
components: {
TreeView,
NodeContent,
},
props: {
categoryId: {
type: [Number],
default: undefined,
},
hasTopPadding: {
type: Boolean,
default: true,
},
},
setup(props) {
const useUserCollectionStateHook = injectKey((keys) => keys.useUserSelectionState);
const { selectedScriptNodeIds } = useSelectedScriptNodeIds(useUserCollectionStateHook);
const { latestFilterEvent } = useTreeViewFilterEvent();
const { treeViewInputNodes } = useTreeViewNodeInput(toRef(props, 'categoryId'));
const { updateNodeSelection } = useCollectionSelectionStateUpdater(useUserCollectionStateHook);
function handleNodeChangedEvent(event: TreeNodeStateChangedEmittedEvent) {
updateNodeSelection(event);
}
return {
nodes: treeViewInputNodes,
selectedScriptNodeIds,
latestFilterEvent,
handleNodeChangedEvent,
};
},
});
</script>
<style scoped lang="scss">
@use "@/presentation/assets/styles/main" as *;
$padding: 20px;
.scripts-tree-container {
display: flex; // We could provide `block`, but `flex` is more versatile.
overflow: auto; // Prevents horizontal expansion of inner content (e.g., when a code block is shown)
/* Set background color in consistent way so it has similar look when searching, on tree view, in cards etc. */
background: $color-scripts-bg;
flex: 1; // Expands the container to fill available horizontal space, enabling alignment of child items.
padding-bottom: $padding;
padding-left: $padding;
padding-right: $padding;
&.top-padding {
padding-top: $padding;
}
}
</style>