15 |
15 |
16 from logilab.mtconverter import xml_escape |
16 from logilab.mtconverter import xml_escape |
17 |
17 |
18 from cubicweb.selectors import (match_kwargs, one_line_rset, non_final_entity, |
18 from cubicweb.selectors import (match_kwargs, one_line_rset, non_final_entity, |
19 specified_etype_implements, yes) |
19 specified_etype_implements, yes) |
20 from cubicweb.utils import make_uid |
20 from cubicweb.utils import make_uid, compute_cardinality |
21 from cubicweb.view import EntityView |
21 from cubicweb.view import EntityView |
22 from cubicweb.common import tags |
22 from cubicweb.common import tags |
23 from cubicweb.web import INTERNAL_FIELD_VALUE, stdmsgs, eid_param |
23 from cubicweb.web import INTERNAL_FIELD_VALUE, stdmsgs, eid_param |
24 from cubicweb.web.form import FormViewMixIn |
24 from cubicweb.web.form import FormViewMixIn |
25 from cubicweb.web.formfields import guess_field |
25 from cubicweb.web.formfields import guess_field |
91 # FIXME editableField class could be toggleable from userprefs |
91 # FIXME editableField class could be toggleable from userprefs |
92 |
92 |
93 _ondblclick = "showInlineEditionForm(%(eid)s, '%(rtype)s', '%(divid)s')" |
93 _ondblclick = "showInlineEditionForm(%(eid)s, '%(rtype)s', '%(divid)s')" |
94 _defaultlandingzone = u'<img title="%s" class="needsvalidation" src="data/file.gif"/>' |
94 _defaultlandingzone = u'<img title="%s" class="needsvalidation" src="data/file.gif"/>' |
95 _landingzonemsg = _('double click to edit this field') |
95 _landingzonemsg = _('double click to edit this field') |
|
96 # default relation vids according to cardinality |
|
97 _one_rvid = 'incontext' |
|
98 _many_rvid = 'csv' |
|
99 |
|
100 def _compute_best_vid(self, entity, rtype, role): |
|
101 if compute_cardinality(entity.e_schema, |
|
102 entity.schema.rschema(rtype), |
|
103 role) in '+*': |
|
104 return self._many_rvid |
|
105 return self._one_rvid |
96 |
106 |
97 def cell_call(self, row, col, rtype=None, role='subject', |
107 def cell_call(self, row, col, rtype=None, role='subject', |
98 reload=False, # controls reloading the whole page after change |
108 reload=False, # controls reloading the whole page after change |
99 rvid='textoutofcontext', # vid to be applied to other side of rtype |
109 rvid=None, # vid to be applied to other side of rtype |
100 escape=True, # depending on the vid, will xml_escape or not |
110 escape=True, # depending on the vid, will xml_escape or not |
101 default=None, # default value |
111 default=None, # default value |
102 landing_zone=None # prepend value with a separate html element to click onto |
112 landing_zone=None # prepend value with a separate html element to click onto |
103 # (esp. needed when values are links) |
113 # (esp. needed when values are links) |
104 ): |
114 ): |
105 """display field to edit entity's `rtype` relation on double-click""" |
115 """display field to edit entity's `rtype` relation on double-click""" |
106 assert rtype |
116 assert rtype |
107 rschema = self.schema.rschema(rtype) |
|
108 entity = self.entity(row, col) |
117 entity = self.entity(row, col) |
|
118 rschema = entity.schema.rschema(rtype) |
109 if not default: |
119 if not default: |
110 default = xml_escape(self.req._('<no value>')) |
120 default = xml_escape(self.req._('<no value>')) |
111 if rschema.is_final(): |
121 if rschema.is_final(): |
112 value = entity.printable_value(rtype) or default |
122 value = entity.printable_value(rtype) or default |
113 if not entity.has_perm('update'): |
123 if not entity.has_perm('update'): |
114 self.w(value) |
124 self.w(value) |
115 return |
125 return |
116 else: |
126 else: |
|
127 if rvid is None: |
|
128 rvid = self._compute_best_vid(entity, rtype, role) |
117 rset = entity.related(rtype, role) |
129 rset = entity.related(rtype, role) |
118 candidate = self.view(rvid, rset, 'null') |
130 candidate = self.view(rvid, rset, 'null') |
119 if candidate and escape: |
131 if candidate and escape: |
120 value = xml_escape(candidate) |
132 value = xml_escape(candidate) |
121 value = candidate or default |
133 value = candidate or default |
144 table_class='', button_bar_class='buttonbar', |
156 table_class='', button_bar_class='buttonbar', |
145 display_progress_div=False) |
157 display_progress_div=False) |
146 self.w(form.form_render(renderer=renderer)) |
158 self.w(form.form_render(renderer=renderer)) |
147 |
159 |
148 def _build_relation_form(self, entity, value, rtype, role, row, col, rvid, default, escape, lzone): |
160 def _build_relation_form(self, entity, value, rtype, role, row, col, rvid, default, escape, lzone): |
|
161 print 'relation', rvid |
149 divid = 'd%s' % make_uid('%s-%s' % (rtype, entity.eid)) |
162 divid = 'd%s' % make_uid('%s-%s' % (rtype, entity.eid)) |
150 event_data = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, 'vid' : rvid, |
163 event_data = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, 'vid' : rvid, |
151 'default' : default, 'role' : role, 'escape' : escape, 'lzone' : lzone} |
164 'default' : default, 'role' : role, 'escape' : escape, 'lzone' : lzone} |
152 onsubmit = ("return inlineValidateRelationForm('%(divid)s-form', '%(rtype)s', " |
165 onsubmit = ("return inlineValidateRelationForm('%(divid)s-form', '%(rtype)s', " |
153 "'%(role)s', '%(eid)s', '%(divid)s', '%(vid)s', '%(default)s', '%(escape)s', '%(lzone)s');" |
166 "'%(role)s', '%(eid)s', '%(divid)s', '%(vid)s', '%(default)s', '%(escape)s', '%(lzone)s');" |