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}