Hide inactive boards, keep source and target stack apart, make the interval configurable
Build package / php-lint (8.2) (push) Successful in 46s
Build package / php-lint (8.3) (push) Successful in 40s
Build package / php-lint (8.4) (push) Successful in 35s
Build package / xml-lint (push) Successful in 13s
Build package / unit-tests (push) Successful in 46s
Build package / package (push) Successful in 1m3s

- Boards: BoardService::getUserBoards() defaults to $includeArchived = true,
  and that flag also gates the `deleted_at = 0` condition, so archived and
  trashed boards showed up in the dropdown. Request the filtered query
  instead, with a fallback to the no-arg call if the signature ever changes.
  Stacks need nothing: StackMapper::findAll() always filters deleted_at.
- Each stack dropdown now hides whatever the other one holds, so source and
  target can no longer be set to the same stack. The save-time check stays
  as the backstop for rows stored before this rule.
- RunWorkflowsJob reads its interval from config.php
  ('workflow_deck_automation.interval', seconds, default 300, clamped to a
  60s minimum). TimedJob re-reads the interval on every cron pass, so a
  changed value takes effect without any occ command.
This commit is contained in:
Patrick Niebeling
2026-08-13 14:33:28 +02:00
parent 8f3e3e694a
commit 13903f8137
5 changed files with 69 additions and 7 deletions
+8 -2
View File
@@ -74,7 +74,7 @@
<NcSelect
v-model="form.sourceStackId"
input-label="Quell-Stapel"
:options="stackOptions"
:options="sourceStackOptions"
:reduce="option => option.value"
:disabled="!form.boardId"
placeholder="Quell-Stapel wählen" />
@@ -82,7 +82,7 @@
<NcSelect
v-model="form.targetStackId"
input-label="Ziel-Stapel"
:options="stackOptions"
:options="targetStackOptions"
:reduce="option => option.value"
:disabled="!form.boardId"
placeholder="Ziel-Stapel wählen" />
@@ -167,6 +167,12 @@ const participantOptions = ref([])
const boardOptions = computed(() => boards.value.map((board) => ({ value: board.id, label: board.title })))
// Source and target must differ, so each dropdown hides what the other one
// already holds — the error message on save stays as the backstop for
// workflows stored before this rule existed.
const sourceStackOptions = computed(() => stackOptions.value.filter((option) => option.value !== form.targetStackId))
const targetStackOptions = computed(() => stackOptions.value.filter((option) => option.value !== form.sourceStackId))
const form = reactive(emptyForm())
function emptyForm() {