FinancialPlanAccountTreeNode.vue 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <template>
  2. <q-expansion-item
  3. v-if="hasChildren"
  4. v-model="expanded"
  5. dense
  6. expand-separator
  7. header-class="account-tree-row"
  8. :style="{ '--account-depth': depth }"
  9. >
  10. <template #header>
  11. <q-item-section class="account-code">{{ node.code }}</q-item-section>
  12. <q-item-section class="account-name text-weight-medium">{{ node.description }}</q-item-section>
  13. <q-item-section class="account-type">{{ node.chart_type }}</q-item-section>
  14. <q-item-section side class="account-actions">
  15. <NodeActions :node="node" :can-edit="canEdit" :can-delete="canDelete" @edit="$emit('edit', node)" @delete="$emit('delete', node.id)" />
  16. </q-item-section>
  17. </template>
  18. <FinancialPlanAccountTreeNode
  19. v-for="child in node.children"
  20. :key="child.id"
  21. :node="child"
  22. :depth="depth + 1"
  23. :force-expanded="forceExpanded"
  24. :can-edit="canEdit"
  25. :can-delete="canDelete"
  26. @edit="$emit('edit', $event)"
  27. @delete="$emit('delete', $event)"
  28. />
  29. </q-expansion-item>
  30. <q-item v-else dense class="account-tree-row" :style="{ '--account-depth': depth }">
  31. <q-item-section class="account-code">{{ node.code }}</q-item-section>
  32. <q-item-section class="account-name">{{ node.description }}</q-item-section>
  33. <q-item-section class="account-type">{{ node.chart_type }}</q-item-section>
  34. <q-item-section side class="account-actions">
  35. <NodeActions :node="node" :can-edit="canEdit" :can-delete="canDelete" @edit="$emit('edit', node)" @delete="$emit('delete', node.id)" />
  36. </q-item-section>
  37. </q-item>
  38. </template>
  39. <script setup>
  40. import { computed, defineComponent, h, ref, watch } from "vue";
  41. import { QBtn, QChip } from "quasar";
  42. defineOptions({ name: "FinancialPlanAccountTreeNode" });
  43. defineEmits(["edit", "delete"]);
  44. const props = defineProps({
  45. node: { type: Object, required: true },
  46. depth: { type: Number, default: 0 },
  47. forceExpanded: { type: Boolean, default: false },
  48. canEdit: { type: Boolean, default: false },
  49. canDelete: { type: Boolean, default: false },
  50. });
  51. const hasChildren = computed(() => props.node.children?.length > 0);
  52. const expanded = ref(props.depth === 0);
  53. watch(() => props.forceExpanded, (value) => value && (expanded.value = true), { immediate: true });
  54. const NodeActions = defineComponent({
  55. props: {
  56. node: { type: Object, default: () => ({}) },
  57. canEdit: Boolean,
  58. canDelete: Boolean,
  59. },
  60. emits: ["edit", "delete"],
  61. setup(actionProps, { emit }) {
  62. return () => actionProps.node.unit_id
  63. ? h("div", { class: "row no-wrap q-gutter-xs" }, [
  64. actionProps.canEdit ? h(QBtn, { flat: true, round: true, dense: true, icon: "mdi-pencil-outline", color: "secondary", onClick: (event) => { event.stopPropagation(); emit("edit"); } }) : null,
  65. actionProps.canDelete ? h(QBtn, { flat: true, round: true, dense: true, icon: "mdi-trash-can-outline", color: "negative", onClick: (event) => { event.stopPropagation(); emit("delete"); } }) : null,
  66. ])
  67. : h(QChip, { dense: true, color: "blue-grey-1", textColor: "blue-grey-7", icon: "mdi-lock-outline", label: "Matriz" });
  68. },
  69. });
  70. </script>
  71. <style scoped>
  72. :deep(.account-tree-row) { min-height: 48px; padding-left: calc(16px + (var(--account-depth) * 28px)); border-bottom: 1px solid #dedede; }
  73. :deep(.account-code) { flex: 0 0 15%; min-width: 75px; }
  74. :deep(.account-name) { flex: 1 1 auto; min-width: 0; }
  75. :deep(.account-type) { flex: 0 0 16%; min-width: 85px; }
  76. :deep(.account-actions) { flex: 0 0 105px; }
  77. </style>