import { A_Caller, A_Inject } from "@adaas/a-concept";
import { A_Logger } from "@adaas/a-utils/a-logger";
import { Are, AreNode } from "@adaas/are";
import { AreHTMLNode } from "src";
import { GanttStore, GanttTask } from "./GanttStore";
const COLORS = ['#5b8def', '#34c759', '#ff9f0a', '#bf5af2', '#ff375f', '#64d2ff'];
const NAMES = ['Discovery', 'Design', 'Build', 'Review', 'QA', 'Launch', 'Retro'];
/**
* GanttToolbar — the Gantt app's controls. Writes into the app's own
* {@link GanttStore} (add a task) and can reload the task list from the app's
* OWN backend (`/apps/gantt/api/tasks`).
*/
export class GanttToolbar extends Are {
@Are.Template
template(@A_Inject(A_Caller) node: AreNode) {
node.setContent(`
Tasks are served by the Gantt app's own backend.
`);
}
@Are.EventHandler
add() {
const tracks = GanttStore.tasks.length;
const start = Math.floor(Math.random() * 20);
const task: GanttTask = {
id: `t-${Date.now()}`,
name: NAMES[Math.floor(Math.random() * NAMES.length)],
start,
end: start + 3 + Math.floor(Math.random() * 6),
color: COLORS[tracks % COLORS.length],
track: tracks,
};
GanttStore.add(task);
}
@Are.EventHandler
async reload(@A_Inject(A_Logger) logger: A_Logger) {
try {
const res = await fetch('/apps/gantt/api/tasks');
const data = await res.json();
if (Array.isArray(data.tasks)) GanttStore.set(data.tasks);
} catch (error) {
logger.error(error);
}
}
@Are.Styles
styles(@A_Inject(A_Caller) node: AreHTMLNode) {
node.setStyles(`
.tb {
display: flex; align-items: center; gap: 10px;
padding: 14px 24px; border-bottom: 1px solid rgba(255,255,255,0.07);
}
.tb-btn {
padding: 7px 13px; border: 1px solid rgba(255,255,255,0.14);
border-radius: 9px; background: rgba(255,255,255,0.06);
color: #ececf1; font-size: 13px; font-weight: 600; cursor: pointer;
}
.tb-btn:hover { background: rgba(255,255,255,0.12); }
.tb-add { background: #2f6df6; border-color: transparent; }
.tb-hint { font-size: 11px; color: #7d889a; margin-left: auto; }
`);
}
}