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}