103 role) in '+*': |
103 role) in '+*': |
104 return self._many_rvid |
104 return self._many_rvid |
105 return self._one_rvid |
105 return self._one_rvid |
106 |
106 |
107 def _build_landing_zone(self, lzone): |
107 def _build_landing_zone(self, lzone): |
108 return lzone or self._defaultlandingzone % {'msg' : self.req._(self._landingzonemsg)} |
108 return lzone or self._defaultlandingzone % {'msg' : xml_escape(self.req._(self._landingzonemsg))} |
109 |
109 |
110 def _build_renderer(self, entity, rtype, role): |
110 def _build_renderer(self, entity, rtype, role): |
111 return self.vreg.select_object('formrenderers', 'base', self.req, |
111 return self.vreg.select_object('formrenderers', 'base', self.req, |
112 entity=entity, |
112 entity=entity, |
113 display_label=False, display_help=False, |
113 display_label=False, display_help=False, |
127 assert role in ('subject', 'object') |
127 assert role in ('subject', 'object') |
128 if default is None: |
128 if default is None: |
129 default = xml_escape(self.req._('<no value>')) |
129 default = xml_escape(self.req._('<no value>')) |
130 entity = self.entity(row, col) |
130 entity = self.entity(row, col) |
131 rschema = entity.schema.rschema(rtype) |
131 rschema = entity.schema.rschema(rtype) |
|
132 lzone = self._build_landing_zone(landing_zone) |
132 # compute value, checking perms, build form |
133 # compute value, checking perms, build form |
133 if rschema.is_final(): |
134 if rschema.is_final(): |
134 value = entity.printable_value(rtype) or default |
135 value = entity.printable_value(rtype) or default |
135 if not entity.has_perm('update'): |
136 if not entity.has_perm('update'): |
136 self.w(value) |
137 self.w(value) |
137 return |
138 return |
138 self._attribute_form(entity, value, rtype, role, reload, |
139 self._attribute_form(entity, value, rtype, role, reload, |
139 row, col, default, landing_zone) |
140 row, col, default, lzone) |
140 else: |
141 else: |
141 dispctrl = uicfg.primaryview_display_ctrl.etype_get(entity.e_schema, |
142 dispctrl = uicfg.primaryview_display_ctrl.etype_get(entity.e_schema, |
142 rtype, role) |
143 rtype, role) |
143 vid = dispctrl.get('vid', 'reledit') |
144 vid = dispctrl.get('vid', 'reledit') |
144 if vid != 'reledit': # reledit explicitly disabled |
145 if vid != 'reledit': # reledit explicitly disabled |
158 elif get_schema_property(entity.e_schema, rschema, |
159 elif get_schema_property(entity.e_schema, rschema, |
159 role, 'composite') == role: |
160 role, 'composite') == role: |
160 self.warning('reledit cannot be applied : (... %s %s [composite])' |
161 self.warning('reledit cannot be applied : (... %s %s [composite])' |
161 % (rtype, entity.e_schema)) |
162 % (rtype, entity.e_schema)) |
162 return self.w(value) |
163 return self.w(value) |
163 self._relation_form(entity, value, rtype, role, reload, row, col, |
164 self._relation_form(entity, value, rtype, role, reload, rvid, |
164 rvid, default, landing_zone) |
165 default, lzone) |
165 |
166 |
166 |
167 |
167 def _relation_form(self, entity, value, rtype, role, row, col, reload, rvid, default, lzone): |
168 def _relation_form(self, entity, value, rtype, role, reload, rvid, default, lzone): |
168 lzone = self._build_landing_zone(lzone) |
169 """xxx-reledit div (class=field) |
|
170 +-xxx div (class="editableField") |
|
171 | +-landing zone |
|
172 +-value |
|
173 +-form-xxx div |
|
174 """ |
169 divid = 'd%s' % make_uid('%s-%s' % (rtype, entity.eid)) |
175 divid = 'd%s' % make_uid('%s-%s' % (rtype, entity.eid)) |
170 event_data = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, 'vid' : rvid, |
176 event_data = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, 'vid' : rvid, |
171 'reload' : reload, 'default' : default, 'role' : role, |
177 'reload' : dumps(reload), 'default' : default, 'role' : role, |
172 'lzone' : lzone} |
178 'lzone' : lzone} |
173 onsubmit = ("return inlineValidateRelationForm('%(rtype)s', '%(role)s', '%(eid)s', " |
179 onsubmit = ("return inlineValidateRelationForm('%(rtype)s', '%(role)s', '%(eid)s', " |
174 "'%(divid)s', %(reload)s, '%(vid)s', '%(default)s', '%(lzone)s');" |
180 "'%(divid)s', %(reload)s, '%(vid)s', '%(default)s', '%(lzone)s');" |
175 % event_data) |
181 % event_data) |
176 cancelclick = "hideInlineEdit(%s,\'%s\',\'%s\')" % ( |
182 cancelclick = "hideInlineEdit(%s,\'%s\',\'%s\')" % ( |
181 form_buttons=[SubmitButton(), |
187 form_buttons=[SubmitButton(), |
182 Button(stdmsgs.BUTTON_CANCEL, |
188 Button(stdmsgs.BUTTON_CANCEL, |
183 onclick=cancelclick)]) |
189 onclick=cancelclick)]) |
184 field = guess_field(entity.e_schema, entity.schema.rschema(rtype), role) |
190 field = guess_field(entity.e_schema, entity.schema.rschema(rtype), role) |
185 form.append_field(field) |
191 form.append_field(field) |
186 self.w(u'<div id="%s-reledit" class="field">' % divid) |
192 w = self.w |
187 self.w(tags.div(lzone, klass='editableField', id=divid, |
193 w(u'<div id="%s-reledit" class="field">' % divid) |
188 onclick=self._onclick % event_data)) |
194 w(tags.div(lzone, klass='editableField', id=divid, |
189 self.w(value) |
195 onclick=self._onclick % event_data)) |
|
196 w(value) |
190 renderer = self._build_renderer(entity, rtype, role) |
197 renderer = self._build_renderer(entity, rtype, role) |
191 self.w(form.form_render(renderer=renderer)) |
198 w(form.form_render(renderer=renderer)) |
192 self.w(u'</div>') |
199 w(u'</div>') |
193 |
200 |
194 def _attribute_form(self, entity, value, rtype, role, reload, row, col, default, lzone): |
201 def _attribute_form(self, entity, value, rtype, role, reload, row, col, default, lzone): |
|
202 """div (class=field) |
|
203 +-xxx div |
|
204 | +-xxx div (class=editableField) |
|
205 | | +-landing zone |
|
206 | +-value-xxx div |
|
207 | +-value |
|
208 +-form-xxx div |
|
209 """ |
195 eid = entity.eid |
210 eid = entity.eid |
196 divid = 'd%s' % make_uid('%s-%s' % (rtype, eid)) |
211 divid = 'd%s' % make_uid('%s-%s' % (rtype, eid)) |
197 event_data = {'divid' : divid, 'eid' : eid, 'rtype' : rtype, |
212 event_data = {'divid' : divid, 'eid' : eid, 'rtype' : rtype, |
198 'reload' : dumps(reload), 'default' : default, 'lzone' : lzone} |
213 'reload' : dumps(reload), 'default' : default} |
199 onsubmit = ("return inlineValidateAttributeForm('%(rtype)s', '%(eid)s', '%(divid)s', " |
214 onsubmit = ("return inlineValidateAttributeForm('%(rtype)s', '%(eid)s', '%(divid)s', " |
200 "%(reload)s, '%(default)s', '%(lzone)s');") |
215 "%(reload)s, '%(default)s');") |
201 buttons = [SubmitButton(stdmsgs.BUTTON_OK), |
216 buttons = [SubmitButton(stdmsgs.BUTTON_OK), |
202 Button(stdmsgs.BUTTON_CANCEL, |
217 Button(stdmsgs.BUTTON_CANCEL, |
203 onclick="hideInlineEdit(%s,\'%s\',\'%s\')" % ( |
218 onclick="hideInlineEdit(%s,\'%s\',\'%s\')" % ( |
204 eid, rtype, divid))] |
219 eid, rtype, divid))] |
205 form = self.vreg.select_object('forms', 'edition', self.req, self.rset, |
220 form = self.vreg.select_object('forms', 'edition', self.req, self.rset, |
206 row=row, col=col, form_buttons=buttons, |
221 row=row, col=col, form_buttons=buttons, |
207 domid='%s-form' % divid, action='#', |
222 domid='%s-form' % divid, action='#', |
208 cssstyle='display: none', |
223 cssstyle='display: none', |
209 onsubmit=onsubmit % event_data) |
224 onsubmit=onsubmit % event_data) |
210 self.w(tags.div(value, klass='editableField', id=divid, |
225 w = self.w |
211 onclick=self._onclick % event_data)) |
226 w(u'<div class="field">') |
|
227 w(u'<div id="%s" style="display: inline">' % divid) |
|
228 w(tags.div(lzone, klass='editableField', |
|
229 onclick=self._onclick % event_data)) |
|
230 w(u'<div id="value-%s" style="display: inline">%s</div>' % |
|
231 (divid, value)) |
|
232 w(u'</div>') |
212 renderer = self._build_renderer(entity, rtype, role) |
233 renderer = self._build_renderer(entity, rtype, role) |
213 self.w(form.form_render(renderer=renderer)) |
234 w(form.form_render(renderer=renderer)) |
|
235 w(u'</div>') |
214 |
236 |
215 |
237 |
216 class EditionFormView(FormViewMixIn, EntityView): |
238 class EditionFormView(FormViewMixIn, EntityView): |
217 """display primary entity edition form""" |
239 """display primary entity edition form""" |
218 id = 'edition' |
240 id = 'edition' |