# Firebase
# Pinia
# stores/trello.ts
import { defineStore } from 'pinia';
import { collection, query, getDocs, orderBy, doc, setDoc, Timestamp, updateDoc } from "firebase/firestore";
import { db } from "../firebase";
export const useTrelloStore = defineStore({
id: 'trello',
state: () => {
return {
columns: [],
columnas: []
}
},
getters: {
},
actions: {
// Añadir datos
async addArray() {
const docData = { data: this.columns};
await setDoc(doc(db, "trello", "columns"), docData);
},
// Añadir dato
async addItem(title) {
const docRef = await setDoc(doc(db, "trello", "Columns"),
{
title: title,
});
},
// Actualizar dato
async updateItem() {
const columnRef = doc(db, 'columns', '4' );
await updateDoc(columnRef,
{ tasks: [
{
id: "1",
title: "Tarea 2 Columna 4",
createdAt: "20/12/2023"
},
{
id: "2",
title: "Tarea 2 Columna 4",
createdAt: "20/12/2023"
},
{
id: "3",
title: "Tarea 3 Columna 4",
createdAt: "20/12/2023"
}
]
});
},
// Obtener datos
async getItems () {
const column = query(collection(db, "trello"));
this.columns = [];
const queryColumnSnapshot = await getDocs(column);
queryColumnSnapshot.forEach((doc) => {
let item = doc.data();
item.id = doc.id;
this.columnas.push(item);
console.log("Columnas: ", this.columnas);
});
// Filtar datos
this.columns = this.columnas[0].data;
console.log("Columns: ", this.columns);
},
}
});
# Importar datos
import { useTrelloStore } from '../stores/trello';
const trelloStore = useTrelloStore();
trelloStore.getItems();
# Nuevas funciones
const remove = (idx) => {
console.log("Columna ID: ", idx)
trelloStore.columns = trelloStore.columns.filter((c) => c.id !== idx);
}
function createColumn() {
const column: Column = {
id: nanoid(),
title: "",
tasks: [],
};
trelloStore.columns.push(column);
nextTick(() => {
(
document.querySelector(
".column:last-of-type .title-input"
) as HTMLInputElement
).focus();
console.log("Columnas: ", trelloStore.columns)
});
}
# Nuevo template
<template>
<div class="flex-wrap flex items-start overflow-x-auto gap-4">
<draggable
v-model="trelloStore.columns"
group="columns"
:animation="150"
handle=".drag-handle"
item-key="id"
class="flex-wrap flex gap-4 items-start"
>
<template #item="{ element: column }: { element: Column }">
<div class="column bg-gray-200 p-5 rounded min-w-[250px]">
<header class="justify-between flex font-bold mb-4 ">
<drag-handle />
<input
class="title-input bg-transparent focus:bg-white rounded px-1 w-4/5"
@keydown.enter="($event.target as HTMLInputElement).blur()"
@keydown.escape="
column.title === ''
? (trelloStore.columns = trelloStore.columns.filter((c) => c.id !== column.id))
: null
"
type="text"
v-model="column.title"
/>
<Remove @click="remove(column.id)"/>
</header>
<draggable
v-model="column.tasks"
group="tasks"
:animation="150"
item-key="id">
<template #item="{ element: task }: { element: Task }">
<TrelloBoardTask
:task="task"
@delete="column.tasks = column.tasks.filter((t) => t.id !== $event)"
/>
</template>
</draggable>
<footer>
<NewTask @add="column.tasks.push($event)" />
</footer>
</div>
</template>
</draggable>
<button
@click="createColumn"
class="bg-gray-200 whitespace-nowrap p-2 rounded opacity-50"
>
+ Añadir columna
</button>
<!-- <RawDisplayer :value="trelloStore.columns" title="List" /> -->
</div>
</template>
# app.vue
<script setup>
import { useTrelloStore } from './stores/trello';
const trelloStore = useTrelloStore();
</script>
<template>
<div class="p-5 h-[100vh] bg-teal-600 over-flow-auto">
<h1 class="text-2xl text-white flex items-center mb-10">
<button
type="button"
class="text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 me-2 mb-2 dark:bg-blue-600 dark:hover:bg-blue-700 focus:outline-none dark:focus:ring-blue-800"
v-on:click="trelloStore.addArray()"
>Guardar
</button>
<img width="200" class="mr-3" src="/vue.png" alt="Vue.js-ES">
Trello-Tablero
</h1>
<NuxtPage />
</div>
</template>