Skip to content

Conditional formatting#2538

Draft
AndyScherzinger wants to merge 23 commits intomainfrom
feat/360/conditional-formatting
Draft

Conditional formatting#2538
AndyScherzinger wants to merge 23 commits intomainfrom
feat/360/conditional-formatting

Conversation

@AndyScherzinger
Copy link
Copy Markdown
Member

WIP

@AndyScherzinger AndyScherzinger added enhancement New feature or request 2. developing Work in progress labels Apr 26, 2026
@AndyScherzinger AndyScherzinger force-pushed the feat/360/conditional-formatting branch 2 times, most recently from bd88f94 to b43b008 Compare April 27, 2026 08:07
… table

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…etion hooks

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…onse types

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
… hooks

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…ion option ID remapping

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…mutation routes for formatting API

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…onents

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…ponents

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…cement

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Adds Format rules button to table toolbar, connects FormattingManager
modal, propagates viewId through CustomTable/TableHeader for column
popovers, and evaluates formatting rules on row load and changes.

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…tingRuleColMapper

Covers column deletion marking rules broken, column type change,
selection option deletion, saveForView junction rebuild, and mapper
sync/find/delete operations.

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…atting UI

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Use OCP\DB\IResult instead of Doctrine\DBAL\Result for executeQuery mock
(IQueryBuilder declares that return type). Set newTable->setId(1) in
TablesMigratorTest formatting tests so tableIdMap entry is non-null and
the importView callback fires.

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
- Remove unused loadTable import in e2e spec
- Remove unused showError import in formatting store
- Fix v-if/v-for on same element in ConditionGroupBuilder (use wrapper template)
- Replace self-closing <input/> with <input> on void elements (FormatStylePicker, RuleEditor, RuleSetEditor)
- Remove alignment spaces before return in switch statements (no-multi-spaces)
- Replace boolean ternary with plain expression (no-unneeded-ternary)
- Fix multiline-ternary in toCSS textDecoration
- Add parentheses around mixed && / || in hasRulesForColumn (no-mixed-operators)
- Move props above setup in TableRow and Options (vue/order-in-components)

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…faults

Move TablesFormatting* psalm-types before TablesView in ResponseDefinitions
so the forward reference to TablesFormattingRuleSet is resolved in order.
Use ['groups' => []] as default for \$condition params to match declared
array shape. Widen FormattingConditionGroupInput constructor docblock to
include optional value/values fields.

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…Request::getFormat() conflict

'format' is a reserved request parameter consumed by Nextcloud's
AppFramework to determine response content type. Sending an array
as the top-level 'format' POST parameter in createRule/updateRule
caused Request::getFormat() to return array instead of ?string,
producing an HTTP 500.

Renamed controller params $format → $style (mapping back to the
internal 'format' key for FormattingRuleInput). Store actions
destructure 'format' from caller data and re-key it as 'style'
before POST/PUT so all callers remain unchanged.

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Placeholder conditions created by ConditionGroupBuilder have null
columnId and operator until the user fills them in. These caused a
HTTP 400 because PHP's isset() returns false for null, triggering the
'Condition requires columnId, columnType and operator' validation.

Filter out any condition missing columnId, operator, or columnType
before posting, and drop groups that become empty after filtering.

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…rect mutations

FilterEntry mutates its filterEntry prop in-place rather than emitting
update:filter-entry events, so onConditionUpdate was never called and
localCondition in RuleEditor always held the initial empty state.

Add a deep watcher on mutableGroups with a _syncingFromProp guard so
any in-place mutation made by FilterEntry is still emitted upward,
while re-assignment from the conditionSet prop watcher does not trigger
a redundant re-emit loop.

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
@AndyScherzinger AndyScherzinger force-pushed the feat/360/conditional-formatting branch from b43b008 to 0d4a078 Compare May 3, 2026 14:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

2. developing Work in progress enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant