Change addressbook group / template on client side, not server side

Fixes the issue where the nextmatch_controller is part of the context for the request, but the first thing set_template() does when the server tells the nextmatch to change the template is destroy the controller.  This means that when the data is parsed, the context is missing or damaged.
This commit is contained in:
nathangray 2020-08-07 13:18:41 -06:00 committed by Ralf Becker
parent 20cd1cf802
commit ee472bb5a9
6 changed files with 87 additions and 19 deletions

View File

@ -933,7 +933,7 @@ class addressbook_ui extends addressbook_bo
$query['actions'] = $this->get_actions($query['col_filter']['tid']); $query['actions'] = $this->get_actions($query['col_filter']['tid']);
} }
$query['template'] = $query['grouped_view'] == 'duplicates' ? 'addressbook.index.duplicate_rows' : 'addressbook.index.org_rows'; $template = $query['grouped_view'] == 'duplicates' ? 'addressbook.index.duplicate_rows' : 'addressbook.index.org_rows';
if ($query['advanced_search']) if ($query['advanced_search'])
{ {
@ -945,7 +945,7 @@ class addressbook_ui extends addressbook_bo
$query['search'] = $query['advanced_search']; $query['search'] = $query['advanced_search'];
} }
switch ($query['template']) switch ($template)
{ {
case 'addressbook.index.org_rows': case 'addressbook.index.org_rows':
if ($query['order'] != 'org_name') if ($query['order'] != 'org_name')
@ -1684,19 +1684,9 @@ class addressbook_ui extends addressbook_bo
} }
else // contacts view else // contacts view
{ {
if ($query['sitemgr_display'])
{
$query['template'] = $query['sitemgr_display'].'.rows';
}
else
{
$query['template'] = 'addressbook.index.rows';
}
if($query['col_filter']['parent_id']) if($query['col_filter']['parent_id'])
{ {
$query['grouped_view'] = $query['col_filter']['parent_id']; $query['grouped_view'] = $query['col_filter']['parent_id'];
$query['template'] = strpos($query['grouped_view'], 'duplicate') === 0 ?
'addressbook.index.duplicate_rows' : 'addressbook.index.org_rows';
} }
// Query doesn't like parent_id // Query doesn't like parent_id
unset($query['col_filter']['parent_id']); unset($query['col_filter']['parent_id']);

View File

@ -30,6 +30,7 @@ require("jqueryui");
require("../jsapi/egw_global"); require("../jsapi/egw_global");
require("../etemplate/et2_types"); require("../etemplate/et2_types");
var egw_app_1 = require("../../api/js/jsapi/egw_app"); var egw_app_1 = require("../../api/js/jsapi/egw_app");
var etemplate2_1 = require("../../api/js/etemplate/etemplate2");
/** /**
* UI for Addressbook * UI for Addressbook
* *
@ -123,7 +124,7 @@ var AddressbookApp = /** @class */ (function (_super) {
if (_app === 'addressbook' && state && state.type && state.type === 'view' && state.id === _id) { if (_app === 'addressbook' && state && state.type && state.type === 'view' && state.id === _id) {
var content = egw.dataGetUIDdata('addressbook::' + _id); var content = egw.dataGetUIDdata('addressbook::' + _id);
if (content.data) { if (content.data) {
var view = etemplate2.getById('addressbook-view'); var view = etemplate2_1.etemplate2.getById('addressbook-view');
if (view) { if (view) {
view.widgetContainer._children[0].set_value({ content: content.data }); view.widgetContainer._children[0].set_value({ content: content.data });
} }
@ -144,7 +145,7 @@ var AddressbookApp = /** @class */ (function (_super) {
else if (!content) { else if (!content) {
// No data on the event, we'll have to reload if calendar column is visible // No data on the event, we'll have to reload if calendar column is visible
// to get the updated information // to get the updated information
var nm = etemplate2.getById('addressbook-index').widgetContainer.getWidgetById('nm'); var nm = etemplate2_1.etemplate2.getById('addressbook-index').widgetContainer.getWidgetById('nm');
var pref = nm ? nm._getPreferences() : false; var pref = nm ? nm._getPreferences() : false;
if (pref && pref.visible.indexOf('calendar_calendar') > -1) { if (pref && pref.visible.indexOf('calendar_calendar') > -1) {
nm.refresh(null, 'update'); nm.refresh(null, 'update');
@ -153,6 +154,38 @@ var AddressbookApp = /** @class */ (function (_super) {
} }
return true; return true;
}; };
/**
* Change handler for contact / org selectbox
*
* @param node
* @param widget
*/
AddressbookApp.prototype.change_grouped_view = function (node, widget) {
var nm = etemplate2_1.etemplate2.getById('addressbook-index').widgetContainer.getDOMWidgetById('nm');
var template = "addressbook.index.rows";
var value = {};
if (nm.activeFilters.sitemgr_display) {
template = nm.activeFilters.sitemgr_display + '.rows';
}
else if (widget.getValue().indexOf("org_name") == 0) {
template = "addressbook.index.org_rows";
}
else if (widget.getValue().indexOf('duplicate') === 0) {
template = 'addressbook.index.duplicate_rows';
}
if (nm.activeFilters.col_filter.parent_id) {
template = widget.getValue().indexOf('duplicate') === 0 ?
'addressbook.index.duplicate_rows' : 'addressbook.index.org_rows';
}
var promise = nm.set_template(template);
value[widget.id] = widget.getValue();
if (promise) {
jQuery.when.apply(null, promise).done(function () {
nm.applyFilters(value);
});
}
return !promise;
};
/** /**
* Open CRM view * Open CRM view
* *
@ -178,7 +211,7 @@ var AddressbookApp = /** @class */ (function (_super) {
*/ */
AddressbookApp.prototype.view_set_list = function (filter) { AddressbookApp.prototype.view_set_list = function (filter) {
// Find the infolog list // Find the infolog list
var list = etemplate2.getById(jQuery(this.et2.getInstanceManager().DOMContainer).nextAll('.et2_container').attr('id')); var list = etemplate2_1.etemplate2.getById(jQuery(this.et2.getInstanceManager().DOMContainer).nextAll('.et2_container').attr('id'));
var nm = list ? list.widgetContainer.getWidgetById('nm') : null; var nm = list ? list.widgetContainer.getWidgetById('nm') : null;
if (nm) { if (nm) {
nm.applyFilters(filter); nm.applyFilters(filter);
@ -810,7 +843,7 @@ var AddressbookApp = /** @class */ (function (_super) {
var state = _super.prototype.getState.call(this); var state = _super.prototype.getState.call(this);
if (jQuery.isEmptyObject(state)) { if (jQuery.isEmptyObject(state)) {
// Not in a list view. Try to find contact ID // Not in a list view. Try to find contact ID
var etemplates = etemplate2.getByApplication('addressbook'); var etemplates = etemplate2_1.etemplate2.getByApplication('addressbook');
for (var i = 0; i < etemplates.length; i++) { for (var i = 0; i < etemplates.length; i++) {
var content = etemplates[i].widgetContainer.getArrayMgr("content"); var content = etemplates[i].widgetContainer.getArrayMgr("content");
if (content && content.getEntry('id')) { if (content && content.getEntry('id')) {
@ -854,7 +887,7 @@ var AddressbookApp = /** @class */ (function (_super) {
// Clear advanced search, which is in session and etemplate // Clear advanced search, which is in session and etemplate
egw.json('addressbook.addressbook_ui.ajax_clear_advanced_search', [], function () { egw.json('addressbook.addressbook_ui.ajax_clear_advanced_search', [], function () {
framework.setWebsiteTitle('addressbook', ''); framework.setWebsiteTitle('addressbook', '');
var index = etemplate2.getById('addressbook-index'); var index = etemplate2_1.etemplate2.getById('addressbook-index');
if (index && index.widgetContainer) { if (index && index.widgetContainer) {
var nm = index.widgetContainer.getWidgetById('nm'); var nm = index.widgetContainer.getWidgetById('nm');
if (nm) { if (nm) {
@ -869,7 +902,7 @@ var AddressbookApp = /** @class */ (function (_super) {
else if (state.state.grouped_view) { else if (state.state.grouped_view) {
// Deal with grouped views that are not valid (not in list of options) // Deal with grouped views that are not valid (not in list of options)
// by faking viewing that organisation // by faking viewing that organisation
var index = etemplate2.getById('addressbook-index'); var index = etemplate2_1.etemplate2.getById('addressbook-index');
if (index && index.widgetContainer) { if (index && index.widgetContainer) {
var grouped = index.widgetContainer.getWidgetById('grouped_view'); var grouped = index.widgetContainer.getWidgetById('grouped_view');
var options; var options;

View File

@ -18,6 +18,7 @@ import '../jsapi/egw_global';
import '../etemplate/et2_types'; import '../etemplate/et2_types';
import {EgwApp} from '../../api/js/jsapi/egw_app'; import {EgwApp} from '../../api/js/jsapi/egw_app';
import {etemplate2} from "../../api/js/etemplate/etemplate2";
/** /**
* UI for Addressbook * UI for Addressbook
@ -167,6 +168,46 @@ class AddressbookApp extends EgwApp
return true; return true;
} }
/**
* Change handler for contact / org selectbox
*
* @param node
* @param widget
*/
change_grouped_view(node, widget)
{
let nm = etemplate2.getById('addressbook-index').widgetContainer.getDOMWidgetById('nm');
let template = "addressbook.index.rows";
let value = {};
if(nm.activeFilters.sitemgr_display)
{
template = nm.activeFilters.sitemgr_display + '.rows';
}
else if(widget.getValue().indexOf("org_name") == 0)
{
template = "addressbook.index.org_rows";
}
else if(widget.getValue().indexOf('duplicate') === 0)
{
template = 'addressbook.index.duplicate_rows';
}
if(nm.activeFilters.col_filter.parent_id)
{
template = widget.getValue().indexOf('duplicate') === 0 ?
'addressbook.index.duplicate_rows' : 'addressbook.index.org_rows';
}
let promise = nm.set_template(template)
value[widget.id] = widget.getValue();
if(promise)
{
jQuery.when.apply(null, promise).done(function ()
{
nm.applyFilters(value);
});
}
return !promise;
}
/** /**
* Open CRM view * Open CRM view
* *

View File

@ -175,7 +175,7 @@
</template> </template>
<template id="addressbook.index.row" template="" lang="" group="0" version="1.3.001"> <template id="addressbook.index.row" template="" lang="" group="0" version="1.3.001">
<buttononly align="right" statustext="Advanced search" image="advanced-search" background_image="1" id="advanced-search" onclick="egw(window).openPopup(egw::link('/index.php','menuaction=addressbook.addressbook_ui.search'),'870','610','_blank','addressbook',null,true); return false;"/> <buttononly align="right" statustext="Advanced search" image="advanced-search" background_image="1" id="advanced-search" onclick="egw(window).openPopup(egw::link('/index.php','menuaction=addressbook.addressbook_ui.search'),'870','610','_blank','addressbook',null,true); return false;"/>
<select statustext="Select a view" id="grouped_view" no_lang="1" rows="1" empty_label="All contacts"/> <select statustext="Select a view" id="grouped_view" no_lang="1" rows="1" empty_label="All contacts" onchange="app.addressbook.change_grouped_view"/>
</template> </template>
<template id="addressbook.index.right" template="" lang="" group="0" version="1.7.001"> <template id="addressbook.index.right" template="" lang="" group="0" version="1.7.001">
<select align="right" id="col_filter[tid]" empty_label="All types"/> <select align="right" id="col_filter[tid]" empty_label="All types"/>

View File

@ -1564,6 +1564,7 @@ var et2_nextmatch = /** @class */ (function (_super) {
this.dataview.destroy(); this.dataview.destroy();
this.rowProvider.destroy(); this.rowProvider.destroy();
this.controller.destroy(); this.controller.destroy();
this.controller = null;
// Free any children from previous template // Free any children from previous template
// They may get left behind because of how detached nodes are processed // They may get left behind because of how detached nodes are processed
// We don't use iterateOver because it checks sub-children // We don't use iterateOver because it checks sub-children
@ -1639,6 +1640,7 @@ var et2_nextmatch = /** @class */ (function (_super) {
this.dynheight.initialized = false; this.dynheight.initialized = false;
this.resize(); this.resize();
}, this)); }, this));
return promise;
}; };
// Some accessors to match conventions // Some accessors to match conventions
et2_nextmatch.prototype.set_hide_header = function (hide) { et2_nextmatch.prototype.set_hide_header = function (hide) {

View File

@ -2134,6 +2134,7 @@ export class et2_nextmatch extends et2_DOMWidget implements et2_IResizeable, et2
this.dataview.destroy(); this.dataview.destroy();
this.rowProvider.destroy(); this.rowProvider.destroy();
this.controller.destroy(); this.controller.destroy();
this.controller = null;
// Free any children from previous template // Free any children from previous template
// They may get left behind because of how detached nodes are processed // They may get left behind because of how detached nodes are processed
@ -2228,6 +2229,7 @@ export class et2_nextmatch extends et2_DOMWidget implements et2_IResizeable, et2
this.resize(); this.resize();
}, this) }, this)
); );
return promise;
} }
// Some accessors to match conventions // Some accessors to match conventions