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    private String _name;
047    
048    public int getWidth()
049    {
050        return _width > 0
051                ? _width
052                : SearchUIColumnHelper.getDefaultColumnWidth(this);
053    }
054    
055    @Override
056    public void setName(String name)
057    {
058        _name = name;
059    }
060    
061    @Override
062    public String getName()
063    {
064        if (_name != null)
065        {
066            return _name;
067        }
068        return super.getName();
069    }
070    
071    public void setWidth (int width)
072    {
073        _width = width;
074    }
075    
076    public boolean isHidden()
077    {
078        return _hidden;
079    }
080    
081    public void setHidden (boolean hidden)
082    {
083        _hidden = hidden;
084    }
085    
086    public boolean isEditable()
087    {
088        return _editable && SearchUIColumnHelper.isEditionAllowed(this);
089    }
090    
091    public void setEditable (boolean editable)
092    {
093        _editable = editable;
094    }
095    
096    public boolean isSortable()
097    {
098        return _sortable && SearchUIColumnHelper.isSortAllowed(this);
099    }
100    
101    public void setSortable (boolean sortable)
102    {
103        _sortable = sortable;
104    }
105    
106    public boolean allowSortOnMultipleJoin()
107    {
108        return _allowSortOnMultipleJoin;
109    }
110    
111    public void setAllowSortOnMultipleJoin(boolean allowSortOnMultipleJoin)
112    {
113        _allowSortOnMultipleJoin = allowSortOnMultipleJoin;
114    }
115    
116    public String getDefaultSorter()
117    {
118        return isSortable()
119                ? _defaultSorter.orElse(null)
120                : null;
121    }
122    
123    public void setDefaultSorter(Optional<String> defaultSorter)
124    {
125        _defaultSorter = defaultSorter;
126    }
127    
128    public String getRenderer()
129    {
130        return _renderer
131                .or(this::_getDefaultRenderer)
132                .orElse(null);
133    }
134    
135    private Optional<String> _getDefaultRenderer()
136    {
137        String defaultRenderer = null;
138        if (getDefinition() instanceof SystemProperty systemProperty)
139        {
140            defaultRenderer = systemProperty.getRenderer();
141        }
142        else if (Content.ATTRIBUTE_TITLE.equals(ViewHelper.getModelViewItemPath(this)))
143        {
144            defaultRenderer = "Ametys.plugins.cms.search.SearchGridHelper.renderTitle";
145        }
146        
147        return Optional.ofNullable(defaultRenderer)
148                       .filter(StringUtils::isNotEmpty);
149    }
150    
151    public void setRenderer(Optional<String> renderer)
152    {
153        this._renderer = renderer;
154    }
155    
156    public String getConverter()
157    {
158        return _converter
159                .or(() -> SearchUIColumnHelper.getElementDefinitionDefaultConverter(getDefinition()))
160                .orElse(null);
161    }
162    
163    public void setConverter(Optional<String> converter)
164    {
165        this._converter = converter;
166    }
167    
168    @Override
169    public ViewElementSearchUIColumn createInstance()
170    {
171        return new ViewElementSearchUIColumn();
172    }
173
174    @Override
175    public Map<String, Object> toJSON(DefinitionContext context)
176    {
177        Map<String, Object> json = super.toJSON(context);
178
179        if (!json.isEmpty())
180        {
181            json.putAll(SearchUIColumnHelper.columnPropertiesToJSON(this));
182        }
183        return json;
184    }
185    
186    @Override
187    public void copyTo(ViewItem item)
188    {
189        super.copyTo(item);
190        
191        assert item instanceof ViewElementSearchUIColumn;
192        ViewElementSearchUIColumn column = (ViewElementSearchUIColumn) item;
193        column.setName(_name);
194        
195        column.setWidth(_width);
196        column.setHidden(_hidden);
197        
198        column.setEditable(_editable);
199        column.setSortable(_sortable);
200        column.setAllowSortOnMultipleJoin(_allowSortOnMultipleJoin);
201        column.setDefaultSorter(_defaultSorter);
202        
203        column.setRenderer(_renderer);
204        column.setConverter(_converter);
205    }
206}