Author: bleny Date: 2014-03-26 16:09:58 +0100 (Wed, 26 Mar 2014) New Revision: 1758 Url: http://forge.codelutin.com/projects/wao/repository/revisions/1758 Log: refs #4483 add all fields in ui for samplerows filter, dynamically reload content Added: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/SampleRowsFilterValuesJsonAction.java trunk/wao-web/src/main/resources/template/bootstrap/simple/ trunk/wao-web/src/main/resources/template/bootstrap/simple/select.ftl Removed: trunk/wao-web/src/main/resources/template/bootstrap/select.ftl Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/json/WaoJsonActionSupport.java trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/sampling-plan.jsp trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp trunk/wao-web/src/main/webapp/js/wao.js Modified: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/json/WaoJsonActionSupport.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/json/WaoJsonActionSupport.java 2014-03-26 11:16:22 UTC (rev 1757) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/json/WaoJsonActionSupport.java 2014-03-26 15:09:58 UTC (rev 1758) @@ -22,7 +22,12 @@ */ import fr.ifremer.wao.web.WaoActionSupport; +import org.apache.struts2.convention.annotation.Result; +import org.apache.struts2.convention.annotation.Results; +@Results({ + @Result(name="success", type="json") +}) public class WaoJsonActionSupport extends WaoActionSupport { private static final long serialVersionUID = 1L; Added: trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/SampleRowsFilterValuesJsonAction.java =================================================================== --- trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/SampleRowsFilterValuesJsonAction.java (rev 0) +++ trunk/wao-web/src/main/java/fr/ifremer/wao/web/action/obsmer/SampleRowsFilterValuesJsonAction.java 2014-03-26 15:09:58 UTC (rev 1758) @@ -0,0 +1,52 @@ +package fr.ifremer.wao.web.action.obsmer; + +import com.opensymphony.xwork2.Preparable; +import fr.ifremer.wao.SampleRowsFilter; +import fr.ifremer.wao.services.service.ObsMerSamplingPlan; +import fr.ifremer.wao.services.service.ObsMerSamplingPlanService; +import fr.ifremer.wao.services.service.SampleRowsFilterValues; +import fr.ifremer.wao.web.action.json.WaoJsonActionSupport; + +public class SampleRowsFilterValuesJsonAction extends WaoJsonActionSupport implements Preparable { + + private static final long serialVersionUID = 1L; + + protected transient ObsMerSamplingPlanService service; + + protected transient SampleRowsFilter filter; + + protected SampleRowsFilterValues filterValues; + + public void setService(ObsMerSamplingPlanService service) { + this.service = service; + } + + public SampleRowsFilter getFilter() { + if (filter == null) { + prepare(); + } + return filter; + } + + @Override + public void prepare() { + + filter = service.newSampleRowsFilter(session.getAuthenticatedWaoUser()); + + } + + @Override + public String execute() { + + ObsMerSamplingPlan samplingPlan = service.getSamplingPlan(filter); + + filterValues = samplingPlan.getFilterValues(); + + return SUCCESS; + } + + public SampleRowsFilterValues getFilterValues() { + return filterValues; + } + +} Deleted: trunk/wao-web/src/main/resources/template/bootstrap/select.ftl =================================================================== --- trunk/wao-web/src/main/resources/template/bootstrap/select.ftl 2014-03-26 11:16:22 UTC (rev 1757) +++ trunk/wao-web/src/main/resources/template/bootstrap/select.ftl 2014-03-26 15:09:58 UTC (rev 1758) @@ -1,141 +0,0 @@ -<#-- -/* - * $Id$ - * - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ ---> -<#setting number_format="#.#####"> -TOTO -<select<#rt/> - name="${parameters.name?default("")?html}"<#rt/> -<#if parameters.get("size")??> - size="${parameters.get("size")?html}"<#rt/> -</#if> -<#if parameters.disabled?default(false)> - disabled="disabled"<#rt/> -</#if> -<#if parameters.tabindex??> - tabindex="${parameters.tabindex?html}"<#rt/> -</#if> -<#if parameters.id??> - id="${parameters.id?html}"<#rt/> -</#if> -<#include "/${parameters.templateDir}/${parameters.expandTheme}/css.ftl" /> -<#if parameters.title??> - title="${parameters.title?html}"<#rt/> -</#if> -<#if parameters.multiple?default(false)> - multiple="multiple"<#rt/> -</#if> -<#include "/${parameters.templateDir}/${parameters.expandTheme}/scripting-events.ftl" /> -<#include "/${parameters.templateDir}/${parameters.expandTheme}/common-attributes.ftl" /> -<#include "/${parameters.templateDir}/${parameters.expandTheme}/dynamic-attributes.ftl" /> -> -<#if parameters.headerKey?? && parameters.headerValue??> - <option value="${parameters.headerKey?html}" - <#if tag.contains(parameters.nameValue, parameters.headerKey) == true> - selected="selected" - </#if> - >${parameters.headerValue?html}</option> -</#if> -<#if parameters.emptyOption?default(false)> - <option value=""></option> -</#if> -<@s.iterator value="parameters.list"> - <#if parameters.listKey??> - <#if stack.findValue(parameters.listKey)??> - <#assign itemKey = stack.findValue(parameters.listKey)/> - <#assign itemKeyStr = stack.findString(parameters.listKey)/> - <#else> - <#assign itemKey = ''/> - <#assign itemKeyStr = ''/> - </#if> - <#else> - <#assign itemKey = stack.findValue('top')/> - <#assign itemKeyStr = stack.findString('top')> - </#if> - <#if parameters.listValue??> - <#if stack.findString(parameters.listValue)??> - <#assign itemValue = stack.findString(parameters.listValue)/> - <#else> - <#assign itemValue = ''/> - </#if> - <#else> - <#assign itemValue = stack.findString('top')/> - </#if> - <#if parameters.listCssClass??> - <#if stack.findString(parameters.listCssClass)??> - <#assign itemCssClass= stack.findString(parameters.listCssClass)/> - <#else> - <#assign itemCssClass = ''/> - </#if> - </#if> - <#if parameters.listCssStyle??> - <#if stack.findString(parameters.listCssStyle)??> - <#assign itemCssStyle= stack.findString(parameters.listCssStyle)/> - <#else> - <#assign itemCssStyle = ''/> - </#if> - </#if> - <#if parameters.listTitle??> - <#if stack.findString(parameters.listTitle)??> - <#assign itemTitle= stack.findString(parameters.listTitle)/> - <#else> - <#assign itemTitle = ''/> - </#if> - </#if> - <option value="${itemKeyStr?html}"<#rt/> - <#if tag.contains(parameters.nameValue, itemKey) == true> - selected="selected"<#rt/> - </#if> - <#if itemCssClass?if_exists != ""> - class="${itemCssClass?html}"<#rt/> - </#if> - <#if itemCssStyle?if_exists != ""> - style="${itemCssStyle?html}"<#rt/> - </#if> - <#if itemTitle?if_exists != ""> - title="${itemTitle?html}"<#rt/> - </#if> - >${itemValue?html}</option><#lt/> -</@s.iterator> - -<#include "/${parameters.templateDir}/${parameters.expandTheme}/optgroup.ftl" /> - -</select> - -<#if parameters.multiple?default(false)> - <#if (parameters.id?? && parameters.name??)> - <input type="hidden" id="__multiselect_${parameters.id?html}" name="__multiselect_${parameters.name?html}" value=""<#rt/> - </#if> - <#if (parameters.id?? && !parameters.name??)> - <input type="hidden" id="__multiselect_${parameters.id?html}" name="__multiselect_${parameters.id?html}" value=""<#rt/> - </#if> - <#if ( !parameters.id?? && parameters.name??)> - <input type="hidden" id="__multiselect_${parameters.id?html}" name="__multiselect_${parameters.id?html}" value=""<#rt/> - </#if> - <#if ( !parameters.id?? && !parameters.name??)> - <input type="hidden" id="" name="" value="" <#rt/> - </#if> - -<#if parameters.disabled?default(false)> - disabled="disabled"<#rt/> -</#if> - /> -</#if> Copied: trunk/wao-web/src/main/resources/template/bootstrap/simple/select.ftl (from rev 1757, trunk/wao-web/src/main/resources/template/bootstrap/select.ftl) =================================================================== --- trunk/wao-web/src/main/resources/template/bootstrap/simple/select.ftl (rev 0) +++ trunk/wao-web/src/main/resources/template/bootstrap/simple/select.ftl 2014-03-26 15:09:58 UTC (rev 1758) @@ -0,0 +1,143 @@ +<#-- +/* + * $Id$ + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +--> +<#setting number_format="#.#####"> +<select<#rt/> + name="${parameters.name?default("")?html}"<#rt/> +<#if parameters.get("size")??> + size="${parameters.get("size")?html}"<#rt/> +</#if> +<#if parameters.disabled?default(false)> + disabled="disabled"<#rt/> +</#if> +<#if parameters.tabindex??> + tabindex="${parameters.tabindex?html}"<#rt/> +</#if> +<#if parameters.id??> + id="${parameters.id?html}"<#rt/> +</#if> +<#if parameters.dataBinding??> + data-binding="${parameters.dataBinding?html}"<#rt/> +</#if> +<#include "/${parameters.templateDir}/${parameters.expandTheme}/css.ftl" /> +<#if parameters.title??> + title="${parameters.title?html}"<#rt/> +</#if> +<#if parameters.multiple?default(false)> + multiple="multiple"<#rt/> +</#if> +<#include "/${parameters.templateDir}/${parameters.expandTheme}/scripting-events.ftl" /> +<#include "/${parameters.templateDir}/${parameters.expandTheme}/common-attributes.ftl" /> +<#include "/${parameters.templateDir}/${parameters.expandTheme}/dynamic-attributes.ftl" /> +> +<#if parameters.headerKey?? && parameters.headerValue??> + <option value="${parameters.headerKey?html}" + <#if tag.contains(parameters.nameValue, parameters.headerKey) == true> + selected="selected" + </#if> + >${parameters.headerValue?html}</option> +</#if> +<#if parameters.emptyOption?default(false)> + <option value=""></option> +</#if> +<@s.iterator value="parameters.list"> + <#if parameters.listKey??> + <#if stack.findValue(parameters.listKey)??> + <#assign itemKey = stack.findValue(parameters.listKey)/> + <#assign itemKeyStr = stack.findString(parameters.listKey)/> + <#else> + <#assign itemKey = ''/> + <#assign itemKeyStr = ''/> + </#if> + <#else> + <#assign itemKey = stack.findValue('top')/> + <#assign itemKeyStr = stack.findString('top')> + </#if> + <#if parameters.listValue??> + <#if stack.findString(parameters.listValue)??> + <#assign itemValue = stack.findString(parameters.listValue)/> + <#else> + <#assign itemValue = ''/> + </#if> + <#else> + <#assign itemValue = stack.findString('top')/> + </#if> + <#if parameters.listCssClass??> + <#if stack.findString(parameters.listCssClass)??> + <#assign itemCssClass= stack.findString(parameters.listCssClass)/> + <#else> + <#assign itemCssClass = ''/> + </#if> + </#if> + <#if parameters.listCssStyle??> + <#if stack.findString(parameters.listCssStyle)??> + <#assign itemCssStyle= stack.findString(parameters.listCssStyle)/> + <#else> + <#assign itemCssStyle = ''/> + </#if> + </#if> + <#if parameters.listTitle??> + <#if stack.findString(parameters.listTitle)??> + <#assign itemTitle= stack.findString(parameters.listTitle)/> + <#else> + <#assign itemTitle = ''/> + </#if> + </#if> + <option value="${itemKeyStr?html}"<#rt/> + <#if tag.contains(parameters.nameValue, itemKey) == true> + selected="selected"<#rt/> + </#if> + <#if itemCssClass?if_exists != ""> + class="${itemCssClass?html}"<#rt/> + </#if> + <#if itemCssStyle?if_exists != ""> + style="${itemCssStyle?html}"<#rt/> + </#if> + <#if itemTitle?if_exists != ""> + title="${itemTitle?html}"<#rt/> + </#if> + >${itemValue?html}</option><#lt/> +</@s.iterator> + +<#include "/${parameters.templateDir}/${parameters.expandTheme}/optgroup.ftl" /> + +</select> + +<#if parameters.multiple?default(false)> + <#if (parameters.id?? && parameters.name??)> + <input type="hidden" id="__multiselect_${parameters.id?html}" name="__multiselect_${parameters.name?html}" value=""<#rt/> + </#if> + <#if (parameters.id?? && !parameters.name??)> + <input type="hidden" id="__multiselect_${parameters.id?html}" name="__multiselect_${parameters.id?html}" value=""<#rt/> + </#if> + <#if ( !parameters.id?? && parameters.name??)> + <input type="hidden" id="__multiselect_${parameters.id?html}" name="__multiselect_${parameters.id?html}" value=""<#rt/> + </#if> + <#if ( !parameters.id?? && !parameters.name??)> + <input type="hidden" id="" name="" value="" <#rt/> + </#if> + +<#if parameters.disabled?default(false)> + disabled="disabled"<#rt/> +</#if> + /> +</#if> Modified: trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/sampling-plan.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/sampling-plan.jsp 2014-03-26 11:16:22 UTC (rev 1757) +++ trunk/wao-web/src/main/webapp/WEB-INF/content/obsmer/sampling-plan.jsp 2014-03-26 15:09:58 UTC (rev 1758) @@ -28,11 +28,19 @@ <s:text name="wao.ui.page.SamplingPlan.title" /> </title> - <style> - .currentMonth{ - background-color: yellow; - } - </style> + <script> + + var SAMPLE_ROWS_FILTER_VALUES_JSON_URL = '<s:url action="sample-rows-filter-values-json" />'; + + $(document).ready(function () { + + var sampleRowsFilterController = new SampleRowsFilterController(SAMPLE_ROWS_FILTER_VALUES_JSON_URL); + sampleRowsFilterController.init(); + + }); + + </script> + </head> <h1> @@ -62,44 +70,51 @@ label="%{getText('wao.ui.entity.Company')}" list="samplingPlan.filterValues.companies" multiple="true" - cssClass="input-xxlarge" /> + dataBinding="companies" + cssClass="input-xlarge" /> <s:select name="filter.programNames" label="%{getText('wao.ui.field.SampleRow.programName')}" list="samplingPlan.filterValues.programNames" multiple="true" - cssClass="input-xxlarge" /> + dataBinding="programNames" + cssClass="input-xlarge" /> <s:select name="filter.fishingZoneFacadeNames" label="%{getText('wao.ui.field.FishingZone.facadeName')}" list="samplingPlan.filterValues.fishingZoneFacadeNames" multiple="true" - cssClass="input-xxlarge" /> + dataBinding="fishingZoneFacadeNames" + cssClass="input-xlarge" /> <s:select name="filter.fishingZoneSectorNames" label="%{getText('wao.ui.field.FishingZone.sectorName')}" list="samplingPlan.filterValues.fishingZoneSectorNames" multiple="true" - cssClass="input-xxlarge" /> + dataBinding="fishingZoneSectorNames" + cssClass="input-xlarge" /> <s:select name="filter.sampleRowCodes" label="%{getText('wao.ui.field.SampleRow.code')}" list="samplingPlan.filterValues.sampleRowCodes" multiple="true" - cssClass="input-xxlarge" /> + dataBinding="sampleRowCodes" + cssClass="input-xlarge" /> <s:select name="filter.fishingGearDcfIds" label="%{getText('wao.ui.entity.fishingGearDCF')}" list="samplingPlan.filterValues.fishingGearDcfs" value="%getText(#value)" multiple="true" - cssClass="input-xxlarge" /> + dataBinding="fishingGearDcfs" + cssClass="input-xlarge" /> <s:select name="filter.targetSpeciesDcfIds" label="%{getText('wao.ui.entity.targetSpeciesDCF')}" list="samplingPlan.filterValues.targetSpeciesDcfs" multiple="true" - cssClass="input-xxlarge" /> + dataBinding="targetSpeciesDcfs" + cssClass="input-xlarge" /> <s:url action="sampling-plan" id="samplingPlanUrl" /> <s:a href="%{samplingPlanUrl}" cssClass="btn"> Modified: trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp =================================================================== --- trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp 2014-03-26 11:16:22 UTC (rev 1757) +++ trunk/wao-web/src/main/webapp/WEB-INF/decorators/layout.jsp 2014-03-26 15:09:58 UTC (rev 1758) @@ -28,7 +28,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title><decorator:title default="Wao"/> - Wao</title> - <sj:head locale="fr" jqueryui="true" loadAtOnce="true" jquerytheme="start" /> + <sj:head locale="fr" jqueryui="true" /> <sb:head /> <script type="text/javascript" src="<s:url value='/js/moment-js-2.5.1/moment-with-langs.js' />"></script> <script type="text/javascript" src="<s:url value='/js/select2-3.4.5/select2.min.js' />"></script> Modified: trunk/wao-web/src/main/webapp/js/wao.js =================================================================== --- trunk/wao-web/src/main/webapp/js/wao.js 2014-03-26 11:16:22 UTC (rev 1757) +++ trunk/wao-web/src/main/webapp/js/wao.js 2014-03-26 15:09:58 UTC (rev 1758) @@ -18,6 +18,107 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ + +var SampleRowsFilterModel = function (filterValuesUrl) { + + var self = this; + + this.filterValues = {}; + this.filterValuesUrl = filterValuesUrl; + + this.setFilterValues = function (filterValues) { + this.filterValues = filterValues; + $(this).trigger('updated'); + }; + + this.updateFilterValues = function(filter) { + var successCallback = function (data) { + self.setFilterValues(data.filterValues) + }; + $.get(this.filterValuesUrl, filter, successCallback); + } + +}; + +var SampleRowsFilterView = function (sampleRowsFilterModel) { + + var self = this; + + this.model = sampleRowsFilterModel; + + this.getFilter = function () { + var filter = {}; + $('select').each(function (index, select) { + var $select = $(select); + var parameterName = $select.prop('name'); + var parameterValues = []; + $select.find('option:selected').each(function (index, option) { + parameterValues.push($(option).prop('value')); + }); + filter[parameterName] = parameterValues; + }); + $('input[type=text]').each(function (index, input) { + var $input = $(input); + var parameterName = $(input).prop('name'); + var parameterValue = $(input).prop('value'); + filter[parameterName] = parameterValue; + }); + return filter; + }; + + this.refreshFilterValues = function() { + // store options selected by user to re-select them after update + var filter = this.getFilter(); + var filterValues = this.model.filterValues; + $('select').each(function (index, select) { + var $select = $(select).empty(); + var name = $select.prop('name'); + // FIXME brendan 26/03/14 should be data-binding but freemarker break the template :-( + var binding = $select.attr('databinding'); + var options = filterValues[binding]; + $.each(options, function (value, label) { + if (typeof value == "number") { + value = label; + } + var optionHtml = '<option value="' + value + '">' + label + '</option>'; + $select.append(optionHtml); + }); + var selectedOptions = filter[name]; + $.each(selectedOptions, function (index, selectedOption) { + $select.find('option[value="' + selectedOption + '"]').prop('selected', 'selected'); + }); + }); + } + + $(this.model).on('updated', function () { + self.refreshFilterValues(); + }); + +}; + +var SampleRowsFilterController = function (filterValuesUrl) { + + var self = this; + + this.model = new SampleRowsFilterModel(filterValuesUrl); + this.view = new SampleRowsFilterView(this.model); + + this.onFilterChange = function () { + var filter = this.view.getFilter(); + this.model.updateFilterValues(filter); + }; + + this.init = function () { + $('input').change(function () { + self.onFilterChange(); + }); + $('select').change(function () { + self.onFilterChange(); + }); + } + +}; + $(document).ready(function () { $('select').select2();