89 __select__ = non_final_entity() & match_kwargs('rtype') |
89 __select__ = non_final_entity() & match_kwargs('rtype') |
90 |
90 |
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"/>' |
|
95 _landingzonemsg = _('double click to edit this field') |
94 |
96 |
95 def cell_call(self, row, col, rtype=None, role='subject', |
97 def cell_call(self, row, col, rtype=None, role='subject', |
96 reload=False, # controls reloading the whole page after change |
98 reload=False, # controls reloading the whole page after change |
97 rvid='textoutofcontext', # vid to be applied to other side of rtype |
99 rvid='textoutofcontext', # vid to be applied to other side of rtype |
98 escape=True, # depending on the vid, will xml_escape or not |
100 escape=True, # depending on the vid, will xml_escape or not |
99 default=None # default value |
101 default=None, # default value |
|
102 landing_zone=None # prepend value with a separate html element to click onto |
|
103 # (esp. needed when values are links) |
100 ): |
104 ): |
101 """display field to edit entity's `rtype` relation on double-click""" |
105 """display field to edit entity's `rtype` relation on double-click""" |
102 assert rtype |
106 assert rtype |
103 rschema = self.schema.rschema(rtype) |
107 rschema = self.schema.rschema(rtype) |
104 entity = self.entity(row, col) |
108 entity = self.entity(row, col) |
105 if not default: |
109 if not default: |
106 default = xml_escape(self.req._('not specified')) |
110 default = xml_escape(self.req._('<no value>')) |
107 if rschema.is_final(): |
111 if rschema.is_final(): |
108 value = entity.printable_value(rtype) |
112 value = entity.printable_value(rtype) |
|
113 value = value.strip() or default |
109 if not entity.has_perm('update'): |
114 if not entity.has_perm('update'): |
110 self.w(value) |
115 self.w(value) |
111 return |
116 return |
112 else: |
117 else: |
113 rset = entity.related(rtype, role) |
118 rset = entity.related(rtype, role) |
122 return |
127 return |
123 elif role == 'object' and not rschema.has_perm(self.req, 'add', |
128 elif role == 'object' and not rschema.has_perm(self.req, 'add', |
124 toeid=entity.eid): |
129 toeid=entity.eid): |
125 self.w(value) |
130 self.w(value) |
126 return |
131 return |
127 if not value.strip(): |
|
128 value = default |
|
129 # build form. |
132 # build form. |
|
133 landing_zone = landing_zone or self._defaultlandingzone % self.req._(self._landingzonemsg) |
|
134 value = landing_zone + value |
130 if rschema.is_final(): |
135 if rschema.is_final(): |
131 form = self._build_attribute_form(entity, value, rtype, role, |
136 form = self._build_attribute_form(entity, value, rtype, role, reload, |
132 reload, row, col, default) |
137 row, col, default, landing_zone) |
133 else: |
138 else: |
134 form = self._build_relation_form(entity, value, rtype, role, |
139 form = self._build_relation_form(entity, value, rtype, role, row, col, |
135 row, col, rvid, default) |
140 rvid, default, escape, landing_zone) |
136 renderer = self.vreg.select_object('formrenderers', 'base', self.req, |
141 renderer = self.vreg.select_object('formrenderers', 'base', self.req, |
137 entity=entity, |
142 entity=entity, |
138 display_label=False, display_help=False, |
143 display_label=False, display_help=False, |
139 display_fields=[(rtype, role)], |
144 display_fields=[(rtype, role)], |
140 table_class='', button_bar_class='buttonbar', |
145 table_class='', button_bar_class='buttonbar', |
141 display_progress_div=False) |
146 display_progress_div=False) |
142 self.w(form.form_render(renderer=renderer)) |
147 self.w(form.form_render(renderer=renderer)) |
143 |
148 |
144 def _build_relation_form(self, entity, value, rtype, role, row, col, vid, default): |
149 def _build_relation_form(self, entity, value, rtype, role, row, col, rvid, default, escape, lzone): |
|
150 print rvid, escape |
145 divid = 'd%s' % make_uid('%s-%s' % (rtype, entity.eid)) |
151 divid = 'd%s' % make_uid('%s-%s' % (rtype, entity.eid)) |
146 event_data = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, 'vid' : vid, |
152 event_data = {'divid' : divid, 'eid' : entity.eid, 'rtype' : rtype, 'vid' : rvid, |
147 'default' : default, 'role' : role} |
153 'default' : default, 'role' : role, 'escape' : escape, 'lzone' : lzone} |
148 onsubmit = ("return inlineValidateRelationForm('%(divid)s-form', '%(rtype)s', " |
154 onsubmit = ("return inlineValidateRelationForm('%(divid)s-form', '%(rtype)s', " |
149 "'%(role)s', '%(eid)s', '%(divid)s', '%(vid)s', '%(default)s');" |
155 "'%(role)s', '%(eid)s', '%(divid)s', '%(vid)s', '%(default)s', '%(escape)s', '%(lzone)s');" |
150 % event_data) |
156 % event_data) |
151 cancelclick = "cancelInlineEdit(%s,\'%s\',\'%s\')" % ( |
157 cancelclick = "cancelInlineEdit(%s,\'%s\',\'%s\')" % ( |
152 entity.eid, rtype, divid) |
158 entity.eid, rtype, divid) |
153 form = self.vreg.select_object('forms', 'base', self.req, entity=entity, |
159 form = self.vreg.select_object('forms', 'base', self.req, entity=entity, |
154 domid='%s-form' % divid, cssstyle='display: none', |
160 domid='%s-form' % divid, cssstyle='display: none', |
160 form.append_field(field) |
166 form.append_field(field) |
161 self.w(tags.div(value, klass='editableField', id=divid, |
167 self.w(tags.div(value, klass='editableField', id=divid, |
162 ondblclick=self._ondblclick % event_data)) |
168 ondblclick=self._ondblclick % event_data)) |
163 return form |
169 return form |
164 |
170 |
165 def _build_attribute_form(self, entity, value, rtype, role, reload, row, col, default): |
171 def _build_attribute_form(self, entity, value, rtype, role, reload, row, col, default, lzone): |
166 eid = entity.eid |
172 eid = entity.eid |
167 divid = 'd%s' % make_uid('%s-%s' % (rtype, eid)) |
173 divid = 'd%s' % make_uid('%s-%s' % (rtype, eid)) |
168 event_data = {'divid' : divid, 'eid' : eid, 'rtype' : rtype, |
174 event_data = {'divid' : divid, 'eid' : eid, 'rtype' : rtype, |
169 'reload' : dumps(reload), 'default' : default} |
175 'reload' : dumps(reload), 'default' : default, 'lzone' : lzone} |
170 onsubmit = ("return inlineValidateAttributeForm('%(divid)s-form', '%(rtype)s', " |
176 onsubmit = ("return inlineValidateAttributeForm('%(divid)s-form', '%(rtype)s', " |
171 "'%(eid)s', '%(divid)s', %(reload)s, '%(default)s');") |
177 "'%(eid)s', '%(divid)s', %(reload)s, '%(default)s', '%(lzone)s');") |
172 buttons = [SubmitButton(stdmsgs.BUTTON_OK), |
178 buttons = [SubmitButton(stdmsgs.BUTTON_OK), |
173 Button(stdmsgs.BUTTON_CANCEL, |
179 Button(stdmsgs.BUTTON_CANCEL, |
174 onclick="cancelInlineEdit(%s,\'%s\',\'%s\')" % ( |
180 onclick="cancelInlineEdit(%s,\'%s\',\'%s\')" % ( |
175 eid, rtype, divid))] |
181 eid, rtype, divid))] |
176 form = self.vreg.select_object('forms', 'edition', self.req, self.rset, |
182 form = self.vreg.select_object('forms', 'edition', self.req, self.rset, |