102 entity.schema.rschema(rtype), |
102 entity.schema.rschema(rtype), |
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): |
|
108 return lzone or self._defaultlandingzone % {'msg' : self.req._(self._landingzonemsg)} |
|
109 |
|
110 def _build_renderer(self, entity, rtype, role): |
|
111 return self.vreg.select_object('formrenderers', 'base', self.req, |
|
112 entity=entity, |
|
113 display_label=False, display_help=False, |
|
114 display_fields=[(rtype, role)], |
|
115 table_class='', button_bar_class='buttonbar', |
|
116 display_progress_div=False) |
|
117 |
107 def cell_call(self, row, col, rtype=None, role='subject', |
118 def cell_call(self, row, col, rtype=None, role='subject', |
108 reload=False, # controls reloading the whole page after change |
119 reload=False, # controls reloading the whole page after change |
109 rvid=None, # vid to be applied to other side of rtype |
120 rvid=None, # vid to be applied to other side of rtype |
110 default=None, # default value |
121 default=None, # default value |
111 landing_zone=None # prepend value with a separate html element to click onto |
122 landing_zone=None # prepend value with a separate html element to click onto |
112 # (esp. needed when values are links) |
123 # (esp. needed when values are links) |
113 ): |
124 ): |
114 """display field to edit entity's `rtype` relation on double-click""" |
125 """display field to edit entity's `rtype` relation on click""" |
115 assert rtype |
126 assert rtype |
|
127 assert role in ('subject', 'object') |
|
128 if default is None: |
|
129 default = xml_escape(self.req._('<no value>')) |
116 entity = self.entity(row, col) |
130 entity = self.entity(row, col) |
117 rschema = entity.schema.rschema(rtype) |
131 rschema = entity.schema.rschema(rtype) |
118 if not default: |
|
119 default = xml_escape(self.req._('<no value>')) |
|
120 # compute value, checking perms, build form |
132 # compute value, checking perms, build form |
121 if rschema.is_final(): |
133 if rschema.is_final(): |
122 value = entity.printable_value(rtype) or default |
134 value = entity.printable_value(rtype) or default |
123 if not entity.has_perm('update'): |
135 if not entity.has_perm('update'): |
124 self.w(value) |
136 self.w(value) |
125 return |
137 return |
126 form = self._build_attribute_form(entity, value, rtype, role, reload, |
138 self._attribute_form(entity, value, rtype, role, reload, |
127 row, col, default, landing_zone) |
139 row, col, default, landing_zone) |
128 else: |
140 else: |
129 if rvid is None: |
141 if rvid is None: |
130 rvid = self._compute_best_vid(entity, rtype, role) |
142 rvid = self._compute_best_vid(entity, rtype, role) |
131 rset = entity.related(rtype, role) |
143 rset = entity.related(rtype, role) |
132 candidate = self.view(rvid, rset, 'null') |
144 candidate = self.view(rvid, rset, 'null') |
133 value = candidate or default |
145 value = candidate or default |
134 if role == 'subject'and not rschema.has_perm(self.req, 'add', |
146 if role == 'subject' and not rschema.has_perm(self.req, 'add', |
135 fromeid=entity.eid): |
147 fromeid=entity.eid): |
136 return self.w(value) |
148 return self.w(value) |
137 elif role == 'object' and not rschema.has_perm(self.req, 'add', |
149 elif role == 'object' and not rschema.has_perm(self.req, 'add', |
138 toeid=entity.eid): |
150 toeid=entity.eid): |
139 return self.w(value) |
151 return self.w(value) |
140 elif get_schema_property(entity.e_schema, |
152 elif get_schema_property(entity.e_schema, rschema, |
141 entity.schema.rschema(rtype), |
|
142 role, 'composite') == role: |
153 role, 'composite') == role: |
143 return self.w(value) |
154 return self.w(value) |
144 form = self._build_relation_form(entity, value, rtype, role, reload, row, col, |
155 self._relation_form(entity, value, rtype, role, reload, row, col, |
145 rvid, default, landing_zone) |
156 rvid, default, landing_zone) |
146 renderer = self.vreg.select_object('formrenderers', 'base', self.req, |
157 |
147 entity=entity, |
158 |
148 display_label=False, display_help=False, |
159 def _relation_form(self, entity, value, rtype, role, row, col, reload, rvid, default, lzone): |
149 display_fields=[(rtype, role)], |
|
150 table_class='', button_bar_class='buttonbar', |
|
151 display_progress_div=False) |
|
152 self.w(form.form_render(renderer=renderer)) |
|
153 |
|
154 def _build_landing_zone(self, lzone): |
|
155 return lzone or self._defaultlandingzone % {'msg' : self.req._(self._landingzonemsg)} |
|
156 |
|
157 def _build_relation_form(self, entity, value, rtype, role, row, col, reload, rvid, |
|
158 default, lzone): |
|
159 lzone = self._build_landing_zone(lzone) |
160 lzone = self._build_landing_zone(lzone) |
160 value = lzone + value |
161 value = lzone + value |
161 divid = 'd%s' % make_uid('%s-%s' % (rtype, entity.eid)) |
162 divid = 'd%s' % make_uid('%s-%s' % (rtype, entity.eid)) |
162 event_data = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, 'vid' : rvid, |
163 event_data = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, 'vid' : rvid, |
163 'reload' : reload, 'default' : default, 'role' : role, |
164 'reload' : reload, 'default' : default, 'role' : role, |
164 'lzone' : lzone} |
165 'lzone' : lzone} |
165 onsubmit = ("return inlineValidateRelationForm('%(divid)s-form', '%(rtype)s', " |
166 onsubmit = ("return inlineValidateRelationForm('%(rtype)s', '%(role)s', '%(eid)s', " |
166 "'%(role)s', '%(eid)s', '%(divid)s', %(reload)s, '%(vid)s', " |
167 "'%(divid)s', %(reload)s, '%(vid)s', '%(default)s', '%(lzone)s');" |
167 "'%(default)s', '%(lzone)s');" |
|
168 % event_data) |
168 % event_data) |
169 cancelclick = "cancelInlineEdit(%s,\'%s\',\'%s\')" % ( |
169 cancelclick = "hideInlineEdit(%s,\'%s\',\'%s\')" % ( |
170 entity.eid, rtype, divid) |
170 entity.eid, rtype, divid) |
171 form = self.vreg.select_object('forms', 'base', self.req, entity=entity, |
171 form = self.vreg.select_object('forms', 'base', self.req, entity=entity, |
172 domid='%s-form' % divid, cssstyle='display: none', |
172 domid='%s-form' % divid, cssstyle='display: none', |
173 onsubmit=onsubmit, action='#', |
173 onsubmit=onsubmit, action='#', |
174 form_buttons=[SubmitButton(), |
174 form_buttons=[SubmitButton(), |
175 Button(stdmsgs.BUTTON_CANCEL, |
175 Button(stdmsgs.BUTTON_CANCEL, |
176 onclick=cancelclick)]) |
176 onclick=cancelclick)]) |
177 field = guess_field(entity.e_schema, entity.schema.rschema(rtype), role) |
177 field = guess_field(entity.e_schema, entity.schema.rschema(rtype), role) |
178 form.append_field(field) |
178 form.append_field(field) |
|
179 self.w(u'<div id="%s-reledit" class="field">' % divid) |
179 self.w(tags.div(value, klass='editableField', id=divid, |
180 self.w(tags.div(value, klass='editableField', id=divid, |
180 onclick=self._onclick % event_data)) |
181 onclick=self._onclick % event_data)) |
181 return form |
182 renderer = self._build_renderer(entity, rtype, role) |
182 |
183 self.w(form.form_render(renderer=renderer)) |
183 def _build_attribute_form(self, entity, value, rtype, role, reload, row, col, default, lzone): |
184 self.w(u'</div>') |
|
185 |
|
186 def _attribute_form(self, entity, value, rtype, role, reload, row, col, default, lzone): |
184 eid = entity.eid |
187 eid = entity.eid |
185 divid = 'd%s' % make_uid('%s-%s' % (rtype, eid)) |
188 divid = 'd%s' % make_uid('%s-%s' % (rtype, eid)) |
186 event_data = {'divid' : divid, 'eid' : eid, 'rtype' : rtype, |
189 event_data = {'divid' : divid, 'eid' : eid, 'rtype' : rtype, |
187 'reload' : dumps(reload), 'default' : default, 'lzone' : lzone} |
190 'reload' : dumps(reload), 'default' : default, 'lzone' : lzone} |
188 onsubmit = ("return inlineValidateAttributeForm('%(divid)s-form', '%(rtype)s', " |
191 onsubmit = ("return inlineValidateAttributeForm('%(rtype)s', '%(eid)s', '%(divid)s', " |
189 "'%(eid)s', '%(divid)s', %(reload)s, '%(default)s', '%(lzone)s');") |
192 "%(reload)s, '%(default)s', '%(lzone)s');") |
190 buttons = [SubmitButton(stdmsgs.BUTTON_OK), |
193 buttons = [SubmitButton(stdmsgs.BUTTON_OK), |
191 Button(stdmsgs.BUTTON_CANCEL, |
194 Button(stdmsgs.BUTTON_CANCEL, |
192 onclick="cancelInlineEdit(%s,\'%s\',\'%s\')" % ( |
195 onclick="hideInlineEdit(%s,\'%s\',\'%s\')" % ( |
193 eid, rtype, divid))] |
196 eid, rtype, divid))] |
194 form = self.vreg.select_object('forms', 'edition', self.req, self.rset, |
197 form = self.vreg.select_object('forms', 'edition', self.req, self.rset, |
195 row=row, col=col, form_buttons=buttons, |
198 row=row, col=col, form_buttons=buttons, |
196 domid='%s-form' % divid, action='#', |
199 domid='%s-form' % divid, action='#', |
197 cssstyle='display: none', |
200 cssstyle='display: none', |
198 onsubmit=onsubmit % event_data) |
201 onsubmit=onsubmit % event_data) |
199 self.w(tags.div(value, klass='editableField', id=divid, |
202 self.w(tags.div(value, klass='editableField', id=divid, |
200 onclick=self._onclick % event_data)) |
203 onclick=self._onclick % event_data)) |
201 return form |
204 renderer = self._build_renderer(entity, rtype, role) |
|
205 self.w(form.form_render(renderer=renderer)) |
202 |
206 |
203 |
207 |
204 class EditionFormView(FormViewMixIn, EntityView): |
208 class EditionFormView(FormViewMixIn, EntityView): |
205 """display primary entity edition form""" |
209 """display primary entity edition form""" |
206 id = 'edition' |
210 id = 'edition' |