From 99a38a28a4a79e827d435822ba6267d0f9b393f4 Mon Sep 17 00:00:00 2001 From: Olmo del Corral Cano Date: Mon, 29 Jul 2019 14:44:09 +0200 Subject: [PATCH] collapse filters in group --- Signum.Entities/EnumMessages.cs | 2 + Signum.React/Scripts/FindOptions.ts | 1 + Signum.React/Scripts/Finder.tsx | 4 +- .../Scripts/SearchControl/FilterBuilder.tsx | 116 ++++++++++-------- Signum.React/Scripts/SearchControl/Search.css | 10 ++ Signum.React/Scripts/Signum.Entities.ts | 1 + 6 files changed, 84 insertions(+), 50 deletions(-) diff --git a/Signum.Entities/EnumMessages.cs b/Signum.Entities/EnumMessages.cs index 88ad245f61..2046e905dc 100644 --- a/Signum.Entities/EnumMessages.cs +++ b/Signum.Entities/EnumMessages.cs @@ -203,6 +203,8 @@ public enum SearchMessage PleaseSelectAnEntity, [Description("Please select one or several Entities")] PleaseSelectOneOrSeveralEntities, + [Description("{0} filters collapsed")] + _0FiltersCollapsed, } public enum SelectorMessage diff --git a/Signum.React/Scripts/FindOptions.ts b/Signum.React/Scripts/FindOptions.ts index f3dbc823cf..a578a1af2a 100644 --- a/Signum.React/Scripts/FindOptions.ts +++ b/Signum.React/Scripts/FindOptions.ts @@ -95,6 +95,7 @@ export interface PinnedFilter { export interface FilterGroupOptionParsed { groupOperation: FilterGroupOperation; frozen: boolean; + expanded: boolean; token?: QueryToken; filters: FilterOptionParsed[]; pinned?: PinnedFilter; diff --git a/Signum.React/Scripts/Finder.tsx b/Signum.React/Scripts/Finder.tsx index 3d63d97114..fca2871034 100644 --- a/Signum.React/Scripts/Finder.tsx +++ b/Signum.React/Scripts/Finder.tsx @@ -915,6 +915,8 @@ export class TokenCompleter { value: fo.value, pinned: fo.pinned && { ...fo.pinned }, filters: fo.filters.map(f => this.toFilterOptionParsed(f)), + frozen: false, + expanded: false, } as FilterGroupOptionParsed); else return ({ @@ -927,8 +929,6 @@ export class TokenCompleter { } } - - export function parseFilterValues(filterOptions: FilterOptionParsed[]): Promise { const needToStr: Lite[] = []; diff --git a/Signum.React/Scripts/SearchControl/FilterBuilder.tsx b/Signum.React/Scripts/SearchControl/FilterBuilder.tsx index 2807cbdfd3..2ecc6a703c 100644 --- a/Signum.React/Scripts/SearchControl/FilterBuilder.tsx +++ b/Signum.React/Scripts/SearchControl/FilterBuilder.tsx @@ -39,6 +39,7 @@ export default class FilterBuilder extends React.Component{ token: lastToken && hasAnyOrAll(lastToken) ? getTokenParents(lastToken).filter(a => a.queryTokenType == "AnyOrAll").lastOrNull() : undefined, filters: [], frozen: false, + expanded: true, } as FilterGroupOptionParsed : { token: this.props.lastToken, @@ -192,6 +193,7 @@ export class FilterGroupComponent extends React.Component a.queryTokenType == "AnyOrAll").lastOrNull() : this.props.prefixToken, filters: [], frozen: false, + expanded: true, } as FilterGroupOptionParsed : { token: lastToken, @@ -206,6 +208,14 @@ export class FilterGroupComponent extends React.Component this.props.onHeightChanged()); }; + handleExpandCollapse = (e: React.MouseEvent) => { + e.preventDefault(); + const fg = this.props.filterGroup; + fg.expanded = !fg.expanded; + + this.forceUpdate(() => this.props.onHeightChanged()); + } + render() { const fg = this.props.filterGroup; @@ -224,15 +234,18 @@ export class FilterGroupComponent extends React.Component
+ + + - {FilterGroupOperation.values().map((ft, i) => )}
-
+
- {fg.pinned &&
- {(this.props.renderValue ? this.props.renderValue(this) : this.renderValue())} - - - -
} + {fg.pinned && +
+ {(this.props.renderValue ? this.props.renderValue(this) : this.renderValue())} +
+ }
{this.props.showPinnedFilters &&
@@ -525,11 +545,11 @@ export class PinnedFilterEditor extends React.Component var val = binding.getValue(); if (this.props.readonly) - return {val}; + return {val}; return ( { binding.setValue(n == null ? undefined : n); this.props.onChange(); }} - validateKey={ValueLine.isNumber} formControlClass="form-control form-control-xs" htmlAttributes={{ placeholder: title, style: { width: "30px" } }} /> + validateKey={ValueLine.isNumber} formControlClass="form-control form-control-xs" htmlAttributes={{ placeholder: title, style: { width: "60px" } }} /> ); } diff --git a/Signum.React/Scripts/SearchControl/Search.css b/Signum.React/Scripts/SearchControl/Search.css index e3d9680e67..4a23021f3d 100644 --- a/Signum.React/Scripts/SearchControl/Search.css +++ b/Signum.React/Scripts/SearchControl/Search.css @@ -325,3 +325,13 @@ ul.sf-context-menu li a:not([disabled]) { .sf-query-token-part .rw-list-empty, .rw-list-option, .rw-list-optgroup { padding: 0 .5em; } + +.sf-hide-group-button{ + font-weight: bold; + color: dimgray; +} + +.sf-show-group-button { + font-weight: bold; + color: black; +} diff --git a/Signum.React/Scripts/Signum.Entities.ts b/Signum.React/Scripts/Signum.Entities.ts index 8c2aed2575..4048c2aac8 100644 --- a/Signum.React/Scripts/Signum.Entities.ts +++ b/Signum.React/Scripts/Signum.Entities.ts @@ -461,6 +461,7 @@ export module SearchMessage { export const PleaseSelectOneOrMore0_G = new MessageKey("SearchMessage", "PleaseSelectOneOrMore0_G"); export const PleaseSelectAnEntity = new MessageKey("SearchMessage", "PleaseSelectAnEntity"); export const PleaseSelectOneOrSeveralEntities = new MessageKey("SearchMessage", "PleaseSelectOneOrSeveralEntities"); + export const _0FiltersCollapsed = new MessageKey("SearchMessage", "_0FiltersCollapsed"); } export module SelectorMessage {