001/*
002 *  Copyright 2017 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.plugins.contentio.synchronize.search;
017
018import java.util.HashMap;
019import java.util.LinkedHashMap;
020import java.util.LinkedList;
021import java.util.List;
022import java.util.Map;
023import java.util.UUID;
024
025import org.ametys.runtime.i18n.I18nizableText;
026
027import com.google.common.collect.ImmutableMap;
028
029/**
030 * Search model configuration for SCC import/search tool
031 */
032public class SCCSearchModelConfiguration
033{
034    /** Criteria to mask imported elements in SCCSearchTool */
035    public static final String CRITERIA_MASK_IMPORTED = "maskImported";
036    
037    private static final Map<String, Object> __MASK_IMPORTED_CRITERION = ImmutableMap.of(
038            "id", CRITERIA_MASK_IMPORTED, 
039            "label", new I18nizableText("plugin.contentio", "PLUGINS_CONTENTIO_UITOOL_SEARCH_MASK_IMPORTED"), 
040            "type", "BOOLEAN"
041        );
042    
043    private boolean _displayMaskImported = true;
044    private Map<String, Map<String, Object>> _criteria = new LinkedHashMap<>();
045    private List<Map<String, Object>> _columns = new LinkedList<>();
046
047    /**
048     * Set to <code>false</code> if you don't want to display the maskImported criteria.
049     * @param displayMaskImported <code>false</code> if you want to disable the maskImportedCriteria
050     */
051    public void displayMaskImported(boolean displayMaskImported)
052    {
053        _displayMaskImported = displayMaskImported;
054    }
055    
056    /**
057     * Add a criterion to the model.
058     * @param id ID
059     */
060    public void addCriterion(String id)
061    {
062        addCriterion(id, new I18nizableText(id));
063    }
064    
065    /**
066     * Add a criterion to the model.
067     * @param id ID
068     * @param label Internationalized label
069     */
070    public void addCriterion(String id, I18nizableText label)
071    {
072        addCriterion(id, label, "STRING");
073    }
074
075    /**
076     * Add a criterion to the model.
077     * @param id ID
078     * @param label Internationalized label
079     * @param type Type (string, boolean, etc.)
080     */
081    public void addCriterion(String id, I18nizableText label, String type)
082    {
083        addCriterion(id, label, type, null);
084    }
085
086    /**
087     * Add a criterion to the model.
088     * @param id ID
089     * @param label Internationalized label
090     * @param type Type (string, boolean, etc.)
091     * @param widget The widget to display
092     */
093    public void addCriterion(String id, I18nizableText label, String type, String widget)
094    {
095        Map<String, Object> criterion = new HashMap<>();
096        criterion.put("id", id);
097        criterion.put("label", label);
098        criterion.put("type", type);
099        criterion.put("widget", widget);
100        _criteria.put(id, criterion);
101    }
102
103    /**
104     * Add a column to the model.
105     * @param id ID
106     */
107    public void addColumn(String id)
108    {
109        addColumn(id, new I18nizableText(id));
110    }
111    
112    /**
113     * Add a column to the model.
114     * @param id ID
115     * @param label Internationalized label
116     */
117    public void addColumn(String id, I18nizableText label)
118    {
119        addColumn(id, label, 150);
120    }
121    
122    /**
123     * Add a column to the model.
124     * @param id ID
125     * @param label Internationalized label
126     * @param width Width of the column
127     */
128    public void addColumn(String id, I18nizableText label, int width)
129    {
130        addColumn(id, label, width, true);
131    }
132
133    /**
134     * Add a column to the model.
135     * @param id ID
136     * @param label Internationalized label
137     * @param sortable true if sortable
138     */
139    public void addColumn(String id, I18nizableText label, boolean sortable)
140    {
141        addColumn(id, label, 150, sortable);
142    }
143    
144    /**
145     * Add a column to the model.
146     * @param id ID
147     * @param label Internationalized label
148     * @param width Width of the column
149     * @param sortable true if sortable
150     */
151    public void addColumn(String id, I18nizableText label, int width, boolean sortable)
152    {
153        addColumn(id, label, width, sortable, "STRING");
154    }
155
156    /**
157     * Add a column to the model.
158     * @param id ID
159     * @param label Internationalized label
160     * @param width Width of the column
161     * @param sortable true if sortable
162     * @param type Type (string, boolean, etc.)
163     */
164    public void addColumn(String id, I18nizableText label, int width, boolean sortable, String type)
165    {
166        String renderer = null;
167        if (_displayMaskImported && _columns.isEmpty())
168        {
169            renderer = "Ametys.plugins.contentio.search.SCCSearchTool.renderImported";
170        }
171        addColumn(id, label, width, sortable, type, renderer);
172    }
173
174    /**
175     * Add a column to the model.
176     * @param id ID
177     * @param label Internationalized label
178     * @param width Width of the column
179     * @param sortable true if sortable
180     * @param type Type (string, boolean, etc.)
181     * @param renderer The render JS function
182     */
183    public void addColumn(String id, I18nizableText label, int width, boolean sortable, String type, String renderer)
184    {
185        Map<String, Object> column = new HashMap<>();
186        column.put("id", id);
187        column.put("label", label);
188        column.put("sortable", sortable);
189        column.put("type", type);
190        column.put("width", width);
191        column.put("renderer", renderer);
192        
193        _columns.add(column);
194    }
195
196    /**
197     * Convert criteria and columns to JSON Map and add searchUrlPlugin, searchUrl and pageSize to JSON results.
198     * @return A Map to be convert as JSON
199     */
200    public Map<String, Object> toJSON()
201    {
202        Map<String, Object> json = new HashMap<>();
203        Map<String, Map<String, Object>> displayedCriteria = new LinkedHashMap<>(_criteria);
204        if (_displayMaskImported)
205        {
206            displayedCriteria.put(CRITERIA_MASK_IMPORTED, __MASK_IMPORTED_CRITERION);
207        }
208        
209        json.put("criteria", ImmutableMap.of(UUID.randomUUID().toString(), ImmutableMap.of("elements", displayedCriteria, "role", "fieldset")));
210        json.put("columns", _columns);
211        json.put("searchUrlPlugin", "contentio");
212        json.put("searchUrl", "scc-search/list.json");
213        json.put("pageSize", 50);
214        return json;
215    }
216}