001/*
002 *  Copyright 2023 Anyware Services
003 *
004 *  Licensed under the Apache License, Version 2.0 (the "License");
005 *  you may not use this file except in compliance with the License.
006 *  You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 *  Unless required by applicable law or agreed to in writing, software
011 *  distributed under the License is distributed on an "AS IS" BASIS,
012 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 *  See the License for the specific language governing permissions and
014 *  limitations under the License.
015 */
016package org.ametys.cms.search.ui.model.impl;
017
018import java.util.Map;
019import java.util.Optional;
020
021import org.apache.commons.lang3.StringUtils;
022
023import org.ametys.cms.repository.Content;
024import org.ametys.cms.search.model.SystemProperty;
025import org.ametys.cms.search.ui.model.SearchUIColumn;
026import org.ametys.cms.search.ui.model.SearchUIColumnHelper;
027import org.ametys.runtime.model.DefinitionContext;
028import org.ametys.runtime.model.ElementDefinition;
029import org.ametys.runtime.model.ViewElement;
030import org.ametys.runtime.model.ViewHelper;
031import org.ametys.runtime.model.ViewItem;
032
033/**
034 * This class represents a result column
035 */
036public class ViewElementSearchUIColumn extends ViewElement implements SearchUIColumn<ElementDefinition>
037{
038    private int _width = -1;
039    private boolean _hidden;
040    private boolean _editable = true;
041    private boolean _sortable = true;
042    private boolean _allowSortOnMultipleJoin;
043    private Optional<String> _defaultSorter = Optional.empty();
044    private Optional<String> _renderer = Optional.empty();
045    private Optional<String> _converter = Optional.empty();
046    
047    public int getWidth()
048    {
049        return _width > 0
050                ? _width
051                : SearchUIColumnHelper.getDefaultColumnWidth(this);
052    }
053    
054    public void setWidth (int width)
055    {
056        _width = width;
057    }
058    
059    public boolean isHidden()
060    {
061        return _hidden;
062    }
063    
064    public void setHidden (boolean hidden)
065    {
066        _hidden = hidden;
067    }
068    
069    public boolean isEditable()
070    {
071        return _editable && SearchUIColumnHelper.isEditionAllowed(this);
072    }
073    
074    public void setEditable (boolean editable)
075    {
076        _editable = editable;
077    }
078    
079    public boolean isSortable()
080    {
081        return _sortable && SearchUIColumnHelper.isSortAllowed(this);
082    }
083    
084    public void setSortable (boolean sortable)
085    {
086        _sortable = sortable;
087    }
088    
089    public boolean allowSortOnMultipleJoin()
090    {
091        return _allowSortOnMultipleJoin;
092    }
093    
094    public void setAllowSortOnMultipleJoin(boolean allowSortOnMultipleJoin)
095    {
096        _allowSortOnMultipleJoin = allowSortOnMultipleJoin;
097    }
098    
099    public String getDefaultSorter()
100    {
101        return isSortable()
102                ? _defaultSorter.orElse(null)
103                : null;
104    }
105    
106    public void setDefaultSorter(Optional<String> defaultSorter)
107    {
108        _defaultSorter = defaultSorter;
109    }
110    
111    public String getRenderer()
112    {
113        return _renderer
114                .or(this::_getDefaultRenderer)
115                .orElse(null);
116    }
117    
118    private Optional<String> _getDefaultRenderer()
119    {
120        String defaultRenderer = null;
121        if (getDefinition() instanceof SystemProperty systemProperty)
122        {
123            defaultRenderer = systemProperty.getRenderer();
124        }
125        else if (Content.ATTRIBUTE_TITLE.equals(ViewHelper.getModelViewItemPath(this)))
126        {
127            defaultRenderer = "Ametys.plugins.cms.search.SearchGridHelper.renderTitle";
128        }
129        
130        return Optional.ofNullable(defaultRenderer)
131                       .filter(StringUtils::isNotEmpty);
132    }
133    
134    public void setRenderer(Optional<String> renderer)
135    {
136        this._renderer = renderer;
137    }
138    
139    public String getConverter()
140    {
141        return _converter
142                .or(() -> SearchUIColumnHelper.getElementDefinitionDefaultConverter(getDefinition()))
143                .orElse(null);
144    }
145    
146    public void setConverter(Optional<String> converter)
147    {
148        this._converter = converter;
149    }
150    
151    @Override
152    public ViewElementSearchUIColumn createInstance()
153    {
154        return new ViewElementSearchUIColumn();
155    }
156
157    @Override
158    public Map<String, Object> toJSON(DefinitionContext context)
159    {
160        Map<String, Object> json = super.toJSON(context);
161
162        if (!json.isEmpty())
163        {
164            json.putAll(SearchUIColumnHelper.columnPropertiesToJSON(this));
165        }
166        return json;
167    }
168    
169    @Override
170    public void copyTo(ViewItem item)
171    {
172        super.copyTo(item);
173        
174        assert item instanceof ViewElementSearchUIColumn;
175        ViewElementSearchUIColumn column = (ViewElementSearchUIColumn) item;
176        
177        column.setWidth(_width);
178        column.setHidden(_hidden);
179        
180        column.setEditable(_editable);
181        column.setSortable(_sortable);
182        column.setAllowSortOnMultipleJoin(_allowSortOnMultipleJoin);
183        column.setDefaultSorter(_defaultSorter);
184        
185        column.setRenderer(_renderer);
186        column.setConverter(_converter);
187    }
188}