web/views/editforms.py
branchstable
changeset 2330 8c70ca715fe9
parent 2329 8b5a1af6dc35
child 2331 4c02a761d879
equal deleted inserted replaced
2329:8b5a1af6dc35 2330:8c70ca715fe9
    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,