[Scodoc-devel] [SVN] Scolar : [1513] - amelioration export Apogee;

eviennet at lipn.univ-paris13.fr eviennet at lipn.univ-paris13.fr
Sam 9 Juil 18:04:24 CEST 2016


Une pièce jointe HTML a été nettoyée...
URL: <https://www-rt.iutv.univ-paris13.fr/pipermail/scodoc-devel/attachments/20160709/1e1d7995/attachment.html>
-------------- section suivante --------------
Modified: branches/ScoDoc7/ZNotes.py
===================================================================
--- branches/ScoDoc7/ZNotes.py	2016-07-08 12:07:14 UTC (rev 1512)
+++ branches/ScoDoc7/ZNotes.py	2016-07-09 16:04:24 UTC (rev 1513)
@@ -271,6 +271,8 @@
     ue_list = sco_edit_ue.ue_list
     security.declareProtected(ScoView, 'ue_sharing_code')
     ue_sharing_code = sco_edit_ue.ue_sharing_code
+    security.declareProtected(ScoChangeFormation, 'edit_ue_set_code_apogee')
+    edit_ue_set_code_apogee = sco_edit_ue.edit_ue_set_code_apogee
     security.declareProtected(ScoView, 'formation_table_recap')
     formation_table_recap = sco_edit_ue.formation_table_recap
     

Modified: branches/ScoDoc7/ZScolar.py
===================================================================
--- branches/ScoDoc7/ZScolar.py	2016-07-08 12:07:14 UTC (rev 1512)
+++ branches/ScoDoc7/ZScolar.py	2016-07-09 16:04:24 UTC (rev 1513)
@@ -263,6 +263,30 @@
     security.declareProtected(ScoView, 'essai')
     def essai(self, x='', REQUEST=None):
         """essai: header / body / footer"""
+        return """<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Programme DUT R&T</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta http-equiv="Content-Style-Type" content="text/css" />
+<meta name="LANG" content="fr" />
+<meta name="DESCRIPTION" content="ScoDoc" />
+
+<script language="javascript" type="text/javascript" src="/ScoDoc/static/jQuery/jquery.js"></script>
+
+
+<script language="javascript" type="text/javascript" src="/ScoDoc/static/libjs/jquery.jeditable.mini.js"></script>
+<script language="javascript" type="text/javascript" src="/ScoDoc/static/js/ue_list.js"></script>
+
+</head>
+<body>
+<p>
+UE11 Découverte métiers <span class="ue_code">(code UCOD46, 16 ECTS, Apo <span class="span_ue_apo" style="display: inline" id="toto">VRTU11</span>)</span>
+<span class="locked">[verrouillé]</span>
+</p>
+</body>
+        """
         return self.sco_header(REQUEST)+ """<div class="xp">%s</div>""" %x + self.sco_footer(REQUEST)
         b = '<p>Hello, World !</p><br/>'
         raise ValueError('essai exception')
@@ -633,8 +657,7 @@
             H.append("""<hr>
             <h3>Exports Apogée</h3>
             <ul>
-            <li><a class="stdlink" href="Notes/semset_page">Années scolaires / ensembles de semestres</a></li>
-            <li><a  class="stdlink" href="XXX">Charger maquettes Apogée</a></li>
+            <li><a class="stdlink" href="Notes/semset_page">Années scolaires / exports Apogée</a></li>
             </ul>
             """)
         #

Modified: branches/ScoDoc7/sco_apogee_csv.py
===================================================================
--- branches/ScoDoc7/sco_apogee_csv.py	2016-07-08 12:07:14 UTC (rev 1512)
+++ branches/ScoDoc7/sco_apogee_csv.py	2016-07-09 16:04:24 UTC (rev 1513)
@@ -237,6 +237,7 @@
         decision = nt.get_etud_decision_sem(self.etud['etudid'])
         if not decision:
             # pas de decision de jury, on n'enregistre rien
+            # (meme si démissionnaire)
             if not self.has_logged_no_decision:
                 self.log.append( "Pas de decision" )
                 self.has_logged_no_decision = True

Modified: branches/ScoDoc7/sco_edit_ue.py
===================================================================
--- branches/ScoDoc7/sco_edit_ue.py	2016-07-08 12:07:14 UTC (rev 1512)
+++ branches/ScoDoc7/sco_edit_ue.py	2016-07-09 16:04:24 UTC (rev 1513)
@@ -38,6 +38,8 @@
 import sco_formsemestre_validation
 import sco_codes_parcours
 
+APO_MISSING_CODE_STR = '----' # shown in HTML pages in place of missing code Apogée
+
 def ue_create(context, formation_id=None, REQUEST=None):
     """Creation d'une UE
     """
@@ -223,9 +225,13 @@
     arrow_up, arrow_down, arrow_none = sco_groups.getArrowIconsTags(context, REQUEST)
     delete_icon = icontag('delete_small_img', title="Supprimer (module inutilisé)", alt="supprimer")
     delete_disabled_icon = icontag('delete_small_dis_img', title="Suppression impossible (module utilisé)")
-    H = [ context.sco_header(REQUEST, page_title="Programme %s" % F['acronyme']),
-          """<h2>Formation %(titre)s (%(acronyme)s) [version %(version)s] code %(formation_code)s""" % F,
-          lockicon, '</h2>' ]
+    H = [ context.sco_header(
+        REQUEST, 
+        javascripts=[ 'libjs/jinplace-1.2.1.min.js', 'js/ue_list.js' ],
+        page_title="Programme %s" % F['acronyme']),
+        """<h2>Formation %(titre)s (%(acronyme)s) [version %(version)s] code %(formation_code)s""" % F,
+        lockicon, '</h2>' 
+        ]
     if locked:
         H.append( """<p class="help">Cette formation est verrouillée car %d semestres verrouillés s'y réferent.
 Si vous souhaitez modifier cette formation (par exemple pour y ajouter un module), vous devez:
@@ -265,10 +271,8 @@
             UE['ects_str'] = ', %g ECTS' %  UE['ects']
         else:
             UE['ects_str'] = ''
-        if UE['code_apogee']:
-            UE['code_apogee_str'] = ', Apo ' + UE['code_apogee']
-        else:
-            UE['code_apogee_str'] = ''
+        UE['code_apogee_str'] = ', Apo: <span class="span_ue_apo" data-url="edit_ue_set_code_apogee" id="%s">' % UE['ue_id'] + (UE['code_apogee'] or APO_MISSING_CODE_STR) + '</span>'
+        
         if cur_ue_semestre_id != UE['semestre_id']:
             cur_ue_semestre_id = UE['semestre_id']
             if iue > 0:
@@ -448,12 +452,12 @@
     H.append('</ul>')
     return '\n'.join(H)
 
-def do_ue_edit(context, args):
+def do_ue_edit(context, args, bypass_lock=False):
     "edit an UE"
     # check
     ue_id = args['ue_id']
     ue = context.do_ue_list({ 'ue_id' : ue_id })[0]
-    if context.ue_is_locked(ue['ue_id']):
+    if (not bypass_lock) and context.ue_is_locked(ue['ue_id']):
         raise ScoLockedFormError()        
     # check: acronyme unique dans cette formation
     if args.has_key('acronyme'):
@@ -473,7 +477,23 @@
     for sem in sco_formsemestre.do_formsemestre_list(context, args={ 'formation_id' : ue['formation_id'] } ):
         context._inval_cache(formsemestre_id=sem['formsemestre_id']) #> formation (ue) modif.  
 
+# essai edition en ligne:
+def edit_ue_set_code_apogee(context, id=None, value=None, REQUEST=None):
+    "set UE code apogee"
+    ue_id = id
+    value = value.strip('-_ \t')
+    log('edit_ue_set_code_apogee: ue_id=%s code_apogee=%s' % (ue_id, value))
 
+    ues = context.do_ue_list( args={ 'ue_id' : ue_id } )
+    if not ues:
+        return 'ue invalide'
+    ue = ues[0]
+
+    do_ue_edit(context, {'ue_id' : ue_id, 'code_apogee' : value }, bypass_lock=True )
+    if not value:
+        value = APO_MISSING_CODE_STR
+    return value
+
 # ---- Table recap formation
 def formation_table_recap(context, formation_id, format='html', REQUEST=None):
     """

Modified: branches/ScoDoc7/sco_etape_apogee.py
===================================================================
--- branches/ScoDoc7/sco_etape_apogee.py	2016-07-08 12:07:14 UTC (rev 1512)
+++ branches/ScoDoc7/sco_etape_apogee.py	2016-07-09 16:04:24 UTC (rev 1513)
@@ -44,7 +44,7 @@
 
    apo_csv_delete(context, etape_apo, annee_scolaire, sem_id)
 
-   apo_csv_list_stored_etapes(context, annee_scolaire=None, sem_id=None) 
+   apo_csv_list_stored_etapes(context, annee_scolaire=None, sem_id=None, etapes=None) 
        returns: liste des codes etapes stockés (et annee_scolaire, sem_id)
 
    apo_csv_semset_check(context, semset)
@@ -105,7 +105,7 @@
     filename = etape_apogee + '.csv'
     
     if etape_apogee in apo_csv_list_stored_etapes(context, annee_scolaire, sem_id=sem_id):
-        raise ScoValueError('Etape %s déjà stockée !' % etape_apogee)
+        raise ScoValueError('Etape %s déjà stockée pour cette année scolaire !' % etape_apogee)
     
     oid = '%d-%d' % (annee_scolaire, sem_id)
     description = '%s;%s;%s' % (etape_apogee,annee_scolaire,sem_id)
@@ -115,7 +115,7 @@
     return etape_apogee
 
 
-def apo_csv_list_stored_archives(context, annee_scolaire=None, sem_id=None):
+def apo_csv_list_stored_archives(context, annee_scolaire=None, sem_id=None, etapes=None):
     """
     :return: list of informations about stored CSV
     [ { } ]
@@ -133,23 +133,25 @@
     for oid in oids:
         archive_ids = ApoCSVArchive.list_obj_archives(context, oid)
         for archive_id in archive_ids:
-            description = ApoCSVArchive.get_archive_description(archive_id)
-            etape_apo, annee_scolaire, sem_id = description.split(';')
-            infos.append( {
-                'archive_id' : archive_id,
-                'annee_scolaire' : int(annee_scolaire),
-                'sem_id' : int(sem_id),
-                'etape_apo' : etape_apo,
-                'date' : ApoCSVArchive.get_archive_date(archive_id)
-                } ) 
+            description = ApoCSVArchive.get_archive_description(archive_id)            
+            arch_etape_apo, arch_annee_scolaire, arch_sem_id = description.split(';')
+            if (etapes == None) or (arch_etape_apo in etapes):
+                infos.append( {
+                    'archive_id' : archive_id,
+                    'annee_scolaire' : int(arch_annee_scolaire),
+                    'sem_id' : int(arch_sem_id),
+                    'etape_apo' : arch_etape_apo,
+                    'date' : ApoCSVArchive.get_archive_date(archive_id)
+                    } ) 
     infos.sort(key=lambda x: x['etape_apo'])
     return infos
     
-def apo_csv_list_stored_etapes(context, annee_scolaire, sem_id=None):
+def apo_csv_list_stored_etapes(context, annee_scolaire, sem_id=None, etapes=None):
     """
     :return: list of stored etapes [ 'V1RT', ... ]
     """
-    infos = apo_csv_list_stored_archives(context, annee_scolaire=annee_scolaire, sem_id=sem_id)
+    infos = apo_csv_list_stored_archives(
+        context, annee_scolaire=annee_scolaire, sem_id=sem_id, etapes=etapes)
     return [ info['etape_apo'] for info in infos ]
 
 def apo_csv_delete(context, archive_id):
@@ -220,7 +222,8 @@
     """
     # Etapes du semestre sans maquette CSV:
     etapes_set = set(semset.list_etapes())
-    etapes_apo = set(apo_csv_list_stored_etapes(context, semset['annee_scolaire'], semset['sem_id']))
+    etapes_apo = set(apo_csv_list_stored_etapes(
+        context, semset['annee_scolaire'], semset['sem_id'], etapes=etapes_set))
     etapes_missing_csv = etapes_set - etapes_apo
 
     # Etudiants inscrits dans ce semset:
@@ -268,7 +271,7 @@
         apo_data = sco_apogee_csv.ApoData(csv_data)
         etape_apo = apo_data.etape_apogee
         for e in apo_data.etuds:
-            e.etape_apo = etape_apo
+            e['etape_apo'] = etape_apo
         apo_etuds_by_nips.update( dict( [ (e['nip'], e) for e in apo_data.etuds ] ) )
     
     etuds = {} # { nip : etud or None }
@@ -290,8 +293,6 @@
 from sco_semset import *
 
 context = go_dept(app, 'RT').Notes
-#sem = sco_formsemestre.get_formsemestre(context, formsemestre_id)
-
 csv_data = open('/opt/misc/VDTRT_V1RT.TXT').read()
 annee_scolaire=2015
 sem_id=1
@@ -319,10 +320,15 @@
 s = SemSet(context, 'NSS29245')
 
 
-# cas Tiziri KADDOUR (inscrite en S1, démission en fin de S1, pas inscrite en S2)
-#   export de S2: on voudrait DEF sur VRTW1, VRTW2 et sur V1RT
+# cas Tiziri K. (inscrite en S1, démission en fin de S1, pas inscrite en S2)
+# => pas de décision, ce qui est voulu (?)
+#
 
 apo_data.setup(context)
-e = apo_data.etuds[0]
+e = [ e for e in apo_data.etuds if e['nom'] == 'KADDOUR' ][0]
+e.lookup_scodoc(context, apo_data.etape_formsemestre_ids)
+e.associate_sco(context, apo_data)
 
+self=e
+col_id='apoL_c0129'
 """

Modified: branches/ScoDoc7/sco_etape_apogee_view.py
===================================================================
--- branches/ScoDoc7/sco_etape_apogee_view.py	2016-07-08 12:07:14 UTC (rev 1512)
+++ branches/ScoDoc7/sco_etape_apogee_view.py	2016-07-09 16:04:24 UTC (rev 1513)
@@ -108,7 +108,7 @@
     if ok_for_export:
         H.append('<ul>')
         if nips_no_sco: # seulement un warning
-            url_list = 'view_apo_etuds?semset_id=%s&title=Etudiants%%20presents%%20dans%%20maquettes%%20Apogee%%20mais%%20pas%%20dans%%20ScoDoc:&nips=%s' % (semset_id, '&nips='.join(nips_no_sco) )
+            url_list = 'view_apo_etuds?semset_id=%s&title=Etudiants%%20presents%%20dans%%20maquettes%%20Apogee%%20mais%%20pas%%20dans%%20les%%20semestres%%20ScoDoc:&nips=%s' % (semset_id, '&nips='.join(nips_no_sco) )
             H.append('<li class="apo_csv_warning">Attention: il y a <a href="%s">%d étudiant(s)</a> dans les maquettes Apogée chargées non inscrit(s) dans ce semestre ScoDoc;</li>' % (url_list, len(nips_no_sco)) )
         
         H.append('''<li>%d étudiants, prêt pour l'export.</li>'''%len(nips_ok))
@@ -128,7 +128,7 @@
             H.append('<li><a href="%s">%d étudiants</a> dans ce semestre non présents dans les maquettes Apogée chargées</li>' % (url_list, len(nips_no_apo)) )
         
         if nips_no_sco: # seulement un warning
-            url_list = 'view_apo_etuds?semset_id=%s&title=Etudiants%%20presents%%20dans%%20maquettes%%20Apogee%%20mais%%20pas%%20dans%%20ScoDoc:&nips=%s' % (semset_id, '&nips='.join(nips_no_sco) )
+            url_list = 'view_apo_etuds?semset_id=%s&title=Etudiants%%20presents%%20dans%%20maquettes%%20Apogee%%20mais%%20pas%%20dans%%20les%%20semestres%%20ScoDoc:&nips=%s' % (semset_id, '&nips='.join(nips_no_sco) )
             H.append('<li class="apo_csv_warning">Attention: il reste <a href="%s">%d étudiants</a> dans les maquettes Apogée chargées mais pas inscrits dans ce semestre ScoDoc</li>' % (url_list, len(nips_no_sco)) )
 
         if apo_dups:
@@ -219,7 +219,7 @@
     annee_scolaire = semset['annee_scolaire']
     sem_id = semset['sem_id']
     
-    T = sco_etape_apogee.apo_csv_list_stored_archives(context, annee_scolaire, sem_id)
+    T = sco_etape_apogee.apo_csv_list_stored_archives(context, annee_scolaire, sem_id, etapes=semset.list_etapes())
     
     for t in T:
         # Ajoute qq infos pour affichage:
@@ -269,9 +269,16 @@
     if nips and type(nips) != type([]):
         nips = [nips]
     etuds = sco_etape_apogee.apo_csv_retreive_etuds_by_nip(context, semset, nips)
+    # Ils sont parfois dans ScoDoc même si pas dans le semestre: essaie de les retrouver
+    for etud in etuds.values():
+        etud_sco = context.getEtudInfo(code_nip=etud['nip'], filled=True)
+        if etud_sco:
+            e = etud_sco[0]
+            etud['inscriptions_scodoc'] = ', '.join( [  '<a href="formsemestre_bulletinetud?formsemestre_id={s[formsemestre_id]}&etudid={e[etudid]}">{s[etapes_apo_str]} (S{s[semestre_id]})</a>'.format(s=sem,e=e) for sem in  e['sems'] ] )
+        
     
     return _view_etuds_page(context, semset_id, title=title, etuds=etuds.values(), 
-                            keys = ('nip', 'etape_apo', 'nom', 'prenom'),
+                            keys = ('nip', 'etape_apo', 'nom', 'prenom', 'inscriptions_scodoc'),
                             format=format, REQUEST=REQUEST)
 
 def view_scodoc_etuds(context, semset_id, title='', etudids=None, nips=None,
@@ -322,6 +329,7 @@
             'etape_apo' : 'Etape',
             'nom' : 'Nom',
             'prenom' : 'Prénom',
+            'inscriptions_scodoc' : 'Inscriptions ScoDoc'
         },
         columns_ids=keys, 
         rows = etuds,
@@ -334,6 +342,9 @@
         return tab.make_page(context, format=format, REQUEST=REQUEST)
 
     H.append( tab.html() )
+
+    H.append('''<p><a href="apo_semset_maq_status?semset_id=%s">Retour à la page d'export Apogée</a>'''
+             % semset_id)
     
     return '\n'.join(H) + context.sco_footer(REQUEST) 
 
@@ -406,17 +417,15 @@
                              init_qtip = True,
                              javascripts=['js/etud_info.js'] ),
           '''<h2>Etudiants dans la maquette Apogée %s</h2>''' % etape_apo,
-          '''<p>Pour l'ensemble <a class="stdlink" href="semset_status?semset_id=%(semset_id)s">%(title)s</a></p>''' % semset
+          '''<p>Pour l'ensemble <a class="stdlink" href="semset_status?semset_id=%(semset_id)s">%(title)s</a> (indice semestre: %(sem_id)s)</p>''' % semset
           ]
     # Infos générales
     H.append("""
     <div class="apo_csv_infos">
     <div class="apo_csv_etape"><span>Code étape:</span><span><tt>{0.etape_apogee}</tt> (année {0.annee_scolaire})</span></div>
-    <div class="apo_csv_etape"><span>Indice semestre:</span><span>{0.sem_id}</span></div>
-    
     </div>
     """.format(apo_data) )
-    
+
     # Liste des étudiants (sans les résultats pour le moment): TODO
     etuds = apo_data.etuds
     if not etuds:
@@ -484,7 +493,7 @@
     data = StringIO()
     dest_zip = ZipFile( data, 'w' )
 
-    etapes_apo = sco_etape_apogee.apo_csv_list_stored_etapes(context, annee_scolaire, sem_id)
+    etapes_apo = sco_etape_apogee.apo_csv_list_stored_etapes(context, annee_scolaire, sem_id, etapes=semset.list_etapes())
     for etape_apo in etapes_apo:
         apo_csv = sco_etape_apogee.apo_csv_get(context, etape_apo, annee_scolaire, sem_id)
         sco_apogee_csv.export_csv_to_apogee( context, apo_csv,

Modified: branches/ScoDoc7/sco_semset.py
===================================================================
--- branches/ScoDoc7/sco_semset.py	2016-07-08 12:07:14 UTC (rev 1512)
+++ branches/ScoDoc7/sco_semset.py	2016-07-09 16:04:24 UTC (rev 1513)
@@ -150,7 +150,7 @@
         return annees
     
     def list_etapes(self):
-        """listes des étapes apogee des semestres. e.g.  ['V1RT', 'V2RT' ]
+        """listes des étapes Apogée des semestres. e.g.  ['V1RT', 'V2RT' ]
         """
         ets = set()
         for s in self.sems:

Modified: branches/ScoDoc7/static/css/scodoc.css
===================================================================
--- branches/ScoDoc7/static/css/scodoc.css	2016-07-08 12:07:14 UTC (rev 1512)
+++ branches/ScoDoc7/static/css/scodoc.css	2016-07-09 16:04:24 UTC (rev 1513)
@@ -1165,6 +1165,10 @@
   margin-right: 1.5em;
 }
 
+li.notes_matiere_list {
+  margin-top: 2px;
+}
+
 ul.notes_matiere_list {
   background-color: rgb(220,220,220);
   font-weight: normal;
@@ -2353,3 +2357,7 @@
  text-align: left;
 }
 
+/* Editable */
+span.span_ue_apo {
+  border-bottom: 1px dashed #84ae84;
+}
\ No newline at end of file

Added: branches/ScoDoc7/static/js/ue_list.js
===================================================================
--- branches/ScoDoc7/static/js/ue_list.js	                        (rev 0)
+++ branches/ScoDoc7/static/js/ue_list.js	2016-07-09 16:04:24 UTC (rev 1513)
@@ -0,0 +1,5 @@
+// Edition elements programme "en place"
+
+$(function() {
+    $('.span_ue_apo').jinplace();
+});
\ No newline at end of file

Added: branches/ScoDoc7/static/libjs/jinplace-1.2.1.min.js
===================================================================
--- branches/ScoDoc7/static/libjs/jinplace-1.2.1.min.js	                        (rev 0)
+++ branches/ScoDoc7/static/libjs/jinplace-1.2.1.min.js	2016-07-09 16:04:24 UTC (rev 1513)
@@ -0,0 +1,12 @@
+/*
+ Copyright ? 2013, 2014 the jinplace team and contributors.
+ MIT Licence */
+(function(d,s,n,g){function k(b,a){var c=this.element=d(b),c=this.elementOptions(c);c.activator=d(c.activator||b);this.opts=c=d.extend({},d.fn.jinplace.defaults,a,c);this.bindElement(c)}var p="type url data loadurl elementId object attribute okButton cancelButton inputClass activator textOnly placeholder submitFunction".split(" ");k.prototype={elementOptions:function(b){function a(a){return"-"+a.toLowerCase()}var c={};d.each(p,function(d,f){c[f]=b.attr("data-"+f.replace(/[A-Z]/g,a))});c.elementId=
+b.attr("id");c.textOnly&&(c.textOnly="false"!==c.textOnly);return c},bindElement:function(b){b.activator.off("click.jip").on("click.jip",d.proxy(this.clickHandler,this));var a=this.element;""==d.trim(a.html())&&(a.html(b.placeholder),b.placeholder=a.html())},clickHandler:function(b){b.preventDefault();b.stopPropagation();d(b.currentTarget).off("click.jip").on("click.jip",function(a){a.preventDefault()});var a=this,c=a.opts,e=d.extend({},l,d.fn.jinplace.editors[c.type]);a.origValue=a.element.html();
+a.fetchData(c).done(function(b){b=e.makeField(a.element,b);e.inputField||(e.inputField=b);b.addClass(c.inputClass);var d=q(c,b,e.buttonsAllowed);a.element.html(d);d.on("jip:submit submit",function(b){a.submit(e,c);return!1}).on("jip:cancel",function(b){a.cancel(e);return!1}).on("keyup",function(b){27==b.keyCode&&a.cancel(e)});e.activate(d,b);e.blurEvent(b,d,e.blurAction||(c.okButton?c.cancelButton?g:"jip:cancel":"submit"))})},fetchData:function(b){var a;a=b.data?b.data:b.loadurl?b.loadFunction(b):
+b.textOnly?d.trim(this.element.text()):d.trim(this.element.html().replace(/&/gi,"&"));var c=function(a){return a==b.placeholder?"":a};a=d.when(a);return a.pipe?a.pipe(c):a.then(c)},cancel:function(b){this.element.html(this.origValue);b.finish();this.bindElement(this.opts)},submit:function(b,a){var c=this,e,f=d.Deferred().reject();try{e=a.submitFunction.call(g,a,b.value()),e===g&&(e=f)}catch(t){e=f}d.when(e).done(function(d,e,f){c.element.trigger("jinplace:done",[d,e,f]);c.onUpdate(b,a,d)}).fail(function(a,
+d,e){c.element.trigger("jinplace:fail",[a,d,e]);c.cancel(b)}).always(function(a,b,d){c.element.trigger("jinplace:always",[a,b,d])})},onUpdate:function(b,a,c){this.setContent(c);b.finish();this.bindElement(a)},setContent:function(b){var a=this.element;b?this.opts.textOnly?a.text(b):a.html(b):a.html(this.opts.placeholder)}};var m=function(b,a){var c={id:b.elementId,object:b.object,attribute:b.attribute};d.isPlainObject(a)?d.extend(c,a):a!==g&&(c.value=a);return c};d.fn.jinplace=function(b){return this.each(function(){d.data(this,
+"plugin_jinplace")||d.data(this,"plugin_jinplace",new k(this,b))})};d.fn.jinplace.defaults={url:n.location.pathname,type:"input",textOnly:!0,placeholder:"[ --- ]",submitFunction:function(b,a){return d.ajax(b.url,{type:"post",data:m(b,a),dataType:"text",headers:{"Cache-Control":"no-cache"}})},loadFunction:function(b){return d.ajax(b.loadurl,{data:m(b)})}};var q=function(b,a,c){a=d("<form>").attr("style","display: inline;").attr("action","javascript:void(0);").append(a);c&&r(a,b);return a},r=function(b,
+a){var c=function(a,c){b.append(a);a.one("click",function(a){a.stopPropagation();b.trigger(c)})},e=a.okButton;e&&(e=d("<input>").attr("type","button").attr("value",e).addClass("jip-button jip-ok-button"),c(e,"submit"));if(e=a.cancelButton)e=d("<input>").attr("type","button").attr("value",e).addClass("jip-button jip-cancel-button"),c(e,"jip:cancel")},l={makeField:function(b,a){return d("<input>").attr("type","text").val(a)},activate:function(b,a){a.focus()},value:function(){return this.inputField.val()},
+blurEvent:function(b,a,c){if(c&&"ignore"!=c)b.on("blur",function(d){var f=setTimeout(function(){b.trigger(c)},300);a.on("click",function(){clearTimeout(f)})})},finish:function(){}};d.fn.jinplace.editorBase=l;d.fn.jinplace.editors={input:{buttonsAllowed:!0},textarea:{buttonsAllowed:!0,makeField:function(b,a){return d("<textarea>").css({"min-width":b.width(),"min-height":b.height()}).val(a)},activate:function(b,a){a.focus();a.elastic&&a.elastic()}},select:{makeField:function(b,a){var c=d("<select>"),
+e=d.parseJSON(a),f=!1,g=null;d.each(e,function(a,e){var h=d("<option>").val(e[0]).html(e[1]);e[2]&&(h.attr("selected","1"),f=!0);e[1]==b.text()&&(g=h);c.append(h)});!f&&g&&g.attr("selected","1");return c},activate:function(b,a){a.focus();a.on("change",function(){a.trigger("jip:submit")})}}}})(jQuery,window,document);


Plus d'informations sur la liste de diffusion Scodoc-devel