Commit 3d8d4749 authored by Aurelien Campeas's avatar Aurelien Campeas
Browse files

preliminary support for inline edition of relations

--HG--
branch : tls-sprint
parent ba01605cdd9a
......@@ -443,13 +443,13 @@ function validateForm(formid, action, onsuccess) {
/*
* called by live-edit forms to submit changes
* called by reledit forms to submit changes
* @param formid : the dom id of the form used
* @param rtype : the attribute being edited
* @param eid : the eid of the entity being edited
* @param reload: boolean to reload page if true (when changing URL dependant data)
*/
function inlineValidateForm(formid, rtype, eid, divid, reload) {
function inlineValidateAttributeForm(formid, rtype, eid, divid, reload) {
try {
var form = getNode(formid);
if (typeof FCKeditorAPI != "undefined") {
......@@ -488,6 +488,41 @@ function inlineValidateForm(formid, rtype, eid, divid, reload) {
return false;
}
function inlineValidateRelationForm(formid, rtype, eid, divid, reload) {
try {
var form = getNode(formid);
var zipped = formContents(form);
var d = asyncRemoteExec('edit_relation', 'apply', zipped[0], zipped[1], rtype, eid);
} catch (ex) {
log('got exception', ex);
return false;
}
d.addCallback(function (result, req) {
handleFormValidationResponse(formid, noop, result);
if (reload) {
log(result[1]);
//document.location.href = result[1];
} else {
log(result[2]);
var fieldview = getNode(divid);
// XXX using innerHTML is very fragile and won't work if
// we mix XHTML and HTML
fieldview.innerHTML = result[2];
// switch inline form off only if no error
if (result[0]) {
// hide global error messages
jQuery('div.errorMessage').remove();
jQuery('#appMsg').hide();
cancelInlineEdit(eid, rtype, divid);
}
}
return false;
});
return false;
}
/**** inline edition ****/
function showInlineEditionForm(eid, rtype, divid) {
jQuery('#' + divid).hide();
......
......@@ -387,7 +387,7 @@ class JSonController(Controller):
except Exception, err:
self.req.cnx.rollback()
self.exception('unexpected error in js_validateform')
return (False, self.req._(str(err)))
return (False, self.req._(str(err).decode('utf-8')))
return (False, '???')
@jsonize
......@@ -403,6 +403,17 @@ class JSonController(Controller):
else:
return (success, args, None)
@jsonize
def js_edit_relation(self, action, names, values,
rtype, eid, role='subject', vid='list'):
success, args = self.validate_form(action, names, values)
if success:
entity = self.req.eid_rset(eid).get_entity(0, 0)
rset = entity.related(rtype, role)
return (success, args, self.view(vid, rset))
else:
return (success, args, None)
@jsonize
def js_i18n(self, msgids):
"""returns the translation of `msgid`"""
......
......@@ -20,7 +20,8 @@ from cubicweb.view import EntityView
from cubicweb.common import tags
from cubicweb.web import INTERNAL_FIELD_VALUE, stdmsgs, eid_param
from cubicweb.web.form import CompositeForm, EntityFieldsForm, FormViewMixIn
from cubicweb.web.formwidgets import Button, SubmitButton, ResetButton
from cubicweb.web.formfields import RelationField
from cubicweb.web.formwidgets import Button, SubmitButton, ResetButton, Select
from cubicweb.web.formrenderers import (FormRenderer, EntityFormRenderer,
EntityCompositeFormRenderer,
EntityInlinedFormRenderer)
......@@ -88,12 +89,12 @@ class ClickAndEditFormView(FormViewMixIn, EntityView):
# FIXME editableField class could be toggleable from userprefs
onsubmit = ("return inlineValidateForm('%(divid)s-form', '%(rtype)s', "
onsubmit = ("return inlineValidateAttributeForm('%(divid)s-form', '%(rtype)s', "
"'%(eid)s', '%(divid)s', %(reload)s);")
ondblclick = "showInlineEditionForm(%(eid)s, '%(rtype)s', '%(divid)s')"
def cell_call(self, row, col, rtype=None, role='subject', reload=False,
vid='autolimited'):
vid='list'):
"""display field to edit entity's `rtype` relation on double-click"""
rschema = self.schema.rschema(rtype)
entity = self.entity(row, col)
......@@ -104,10 +105,43 @@ class ClickAndEditFormView(FormViewMixIn, EntityView):
value = entity.printable_value(rtype)
else:
rset = entity.related(rtype, role)
value = self.view(vid, rset, 'null')
value = ' %s ' % self.view(vid, rset, 'null')
if not entity.has_perm('update'):
self.w(value)
return
if rschema.is_final():
self._edit_attribute(entity, value, rtype, role, reload, row, col)
else:
self._edit_relation(entity, value, rtype, role, reload, row, col)
def _edit_relation(self, entity, value, rtype, role, reload, row, col):
rtype = 'person_in_charge'
entity = self.entity(row, col)
divid = 'd%s' % make_uid('%s-%s' % (rtype, entity.eid))
event_data = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype,
'reload' : dumps(reload)}
form = EntityFieldsForm(self.req, None, entity=entity, action='#',
domid='%s-form' % divid,
cssstyle='display: none',
onsubmit=("return inlineValidateRelationForm('%(divid)s-form', '%(rtype)s', "
"'%(eid)s', '%(divid)s', %(reload)s);" % event_data),
form_buttons=[SubmitButton(),
Button(stdmsgs.BUTTON_CANCEL,
onclick="cancelInlineEdit(%s,\'%s\',\'%s\')" %\
(entity.eid, rtype, divid))])
form.form_add_hidden(u'__maineid', entity.eid)
form.append_field(RelationField(name=rtype, sort=True,
widget=Select(dict(size=1)),
label=u' '))
renderer = FormRenderer(display_label=False, display_help=False,
display_fields=[(rtype, role)],
table_class='', button_bar_class='buttonbar',
display_progress_div=False)
self.w(tags.div(value, klass='editableField', id=divid,
ondblclick=self.ondblclick % event_data))
self.w(form.form_render(renderer=renderer))
def _edit_attribute(self, entity, value, rtype, role, reload, row, col):
eid = entity.eid
divid = 'd%s' % make_uid('%s-%s' % (rtype, eid))
event_data = {'divid' : divid, 'eid' : eid, 'rtype' : rtype,
......@@ -121,7 +155,7 @@ class ClickAndEditFormView(FormViewMixIn, EntityView):
domid='%s-form' % divid, action='#',
cssstyle='display: none',
onsubmit=self.onsubmit % event_data)
form.form_add_hidden(u'__maineid', entity.eid)
form.form_add_hidden(u'__maineid', eid)
renderer = FormRenderer(display_label=False, display_help=False,
display_fields=[(rtype, role)],
table_class='', button_bar_class='buttonbar',
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment