Files
bruno 13dc8fdaad
FlowDeck CI / lint (push) Canceled after 0s
FlowDeck CI / test (push) Canceled after 0s
FlowDeck CI / docker (push) Canceled after 0s
fix: A38 phase 2 — 0 doublon de fonction globale + garde-fou (v7.34.0)
- Inventaire exhaustif des 13 noms `function NAME` définis 2+ fois
  (templates + static/js) avec scan de profondeur de brace (strings,
  comments, backticks gérés) : 12 sont déjà scopés dans des IIFEs
  depuis A27 (escHtml/flush/emit/setMeta/initials/up/esc/show/close…) —
  aucun conflit de page possible.
- Seul doublon GLOBALE = openCardDetail (corps byte-identiques ×2 dans
  board_fragment + detailed_board, fragments de vues mutuellement
  exclusifs) → dédupliquée vers static/js/app.js, 2 copies supprimées ;
  les onclick/@click des deux fragments appellent la même définition
  (owner/repo globaux fournis par board.js au moment du clic).
- test_no_duplicate_global_functions : garde-fou 0-doublon entre
  templates et static/js (scanner naïf, plafond ponytail commenté).

Reste A38 : méthodes jumelles library/local_workspace (~9-21 noms
communs, corps divergents) → fusion workspace-tree.js reportée
(réconciliation sans E2E, même logique que A39/A20).

suite **1093/1093** · ruff OK · node --check vert · docs à jour
2026-10-02 09:18:04 -04:00

54 lines
2.5 KiB
HTML

<!-- Kanban Board Fragment — loaded via HTMX -->
<div id="view-content" class="kanban-container" x-data="kanbanBoard()">
{% set statuses = [('todo', 'To-do', 'var(--gray)', 0), ('progress', 'In progress', 'var(--blue)', 1), ('done', 'Complete', 'var(--green)', 2)] %}
{% for status, label, color, _ in statuses %}
<div class="kanban-column">
<div class="kanban-column-header">
<span class="col-dot" style="background: {{ color }};"></span>
{{ label }}
<span class="col-count">{{ groups|map(attribute='counts')|map(attribute=status)|sum }}</span>
</div>
{% for group in groups %}
<div class="kanban-group-header" @click="toggleGroup('{{ group.id }}')">
<span class="group-chevron" :class="{ 'open': !collapsedGroups.includes('{{ group.id }}') }">▶</span>
{{ group.name }}
<span class="group-count">{{ group.counts[status] }}</span>
</div>
<div class="kanban-cards" x-show="!collapsedGroups.includes('{{ group.id }}')"
data-group="{{ group.id }}" data-status="{{ status }}"
id="kanban-{{ group.id }}-{{ status }}">
{% for card in group.cards if card.status == status %}
<div class="kanban-card card-status-{{ card.status }}"
data-card-id="{{ card.id }}"
@click="openCardDetail('{{ card.id }}')">
<div class="card-header">
<span class="card-icon">{{ card.icon }}</span>
<span class="card-title">{{ card.title }}</span>
</div>
<div class="card-meta">
{% if card.assignee %}
<div class="card-assignee">
<div class="card-avatar" title="{{ card.assignee }}">{{ card.assignee[0] }}</div>
<span>{{ card.assignee }}</span>
</div>
{% endif %}
{% if card.tag %}
<span class="card-tag" style="background: {{ card.tag_color }}20; color: {{ card.tag_color }};">{{ card.tag }}</span>
{% endif %}
{% if card.due_date %}
<div class="card-date"><span>{{ fd_icon("calendar",14) }}</span> {{ card.due_date }}</div>
{% endif %}
</div>
</div>
{% endfor %}
<button class="kanban-new-card" @click="newCard('{{ group.id }}', '{{ status }}')">+ New page</button>
</div>
{% endfor %}
<button class="kanban-new-group" @click="newGroup()" style="margin-top: 12px;">+ New group</button>
</div>
{% endfor %}
</div>
<!-- A38 : openCardDetail vit dans static/js/app.js (dedupliquee,
corps identique x2 dans ces deux fragments de vue) -->