Le lien 'onActionView' ne fonctionne pas sur le dataList

cancel
Showing results for 
Search instead for 
Did you mean: 
3snet
Member II

Le lien 'onActionView' ne fonctionne pas sur le dataList

Bonjour à tous,

Je travaille actuellement sur la personnalisation du module "DataList" et je veux changer le "actionSet" situé dans le formulaire "DataGrid" pour afficher l'action "Lire" en plus des actions par défaut: "Modifier", "Supprimer" et "Dupliquer ".

Pour cela j'ai modifier le fichier "datagrid.get.config.xml" pour ajouter la ligne :
"<action type="action-link" id="onActionView" label="actions.view" />" 

Le lien a bien été ajouté, mais en cliquant sur ce lien rien ne se passe.

Plus concrètement, mon souhait est de permettre aux utilisateurs avec un rôle «Editeur» de créer des fiches (bouton « crayon ») et d'autoriser les utilisateurs avec un rôle "Lecteur" d'ouvrir une fiche pour la lire (sans pouvoir faire des modifications).

Par défaut, un utilisateur avec un rôle "Lecteur" n’a aucun moyen d’ouvrir une fiche  afin de lire les données qui ne sont pas affichées dans le "DataGrid".

Avez-vous une idée de pourquoi ça ne marche pas et si oui, merci de me dire comment et où faire les changements nécessaires. Donner un exemple me serait d’une grande utilité.

NB. : j'ai déjà posé la question sur le forum anglais (lire le post : http://forums.alfresco.com/en/viewtopic.php?f=13&t=37153&sid=80c9fba38f37261f5ee262e1dfcccb8b) mais je n'ai pas eu de réponse claire.

Merci d’avance.

Cordialement.
9 Replies
jayjayecl
Active Member II

Re: Le lien 'onActionView' ne fonctionne pas sur le dataList

Avez-vous essayé, comme précisé sur le forum anglais, d'implémenter cette nouvelle méthode onActionView ?
Si oui, peut-on voir le code ?
Peut-on également savoir alors ce qui se produit ? Avez-vous des logs ?

MErci
3snet
Member II

Re: Le lien 'onActionView' ne fonctionne pas sur le dataList

J'ai essayé de suivre la procédure indiquée sur le forum anglais en créant la fonction "OnActionView" par duplication de la fonction "OnActionEdit" et en passant le mode en "view" (mode: "view"). Voici le code :

      
onActionView: function DataGrid_onActionView(item)
      {
         var scope = this;
        
         // Intercept before dialog show
         var doBeforeDialogShow = function DataGrid_onActionView_doBeforeDialogShow(p_form, p_dialog)
         {
            Alfresco.util.populateHTML(
               [ p_dialog.id + "-dialogTitle", this.msg("label.view-row.title") ]
            );

            /**
             * No full-page edit view for v3.3
             *
            // Data Item Edit Page link button
            Alfresco.util.createYUIButton(p_dialog, "editDataItem", null,
            {
               type: "link",
               label: scope.msg("label.edit-row.edit-dataitem"),
               href: scope.getActionUrls(item).editMetadataUrl
            });
             */
         };

         var templateUrl = YAHOO.lang.substitute(Alfresco.constants.URL_SERVICECONTEXT + "components/form?itemKind={itemKind}&itemId={itemId}&mode={mode}&submitType={submitType}&showCancelButton=true",
         {
            itemKind: "node",
            itemId: item.nodeRef,
            mode: "view",
            submitType: "json"
         });

         // Using Forms Service, so always create new instance
         var viewDetails = new Alfresco.module.SimpleDialog(this.id + "-viewDetails");
         viewDetails.setOptions(
         {
            width: "34em",
            templateUrl: templateUrl,
            actionUrl: null,
            destroyOnHide: true,
            doBeforeDialogShow:
            {
               fn: doBeforeDialogShow,
               scope: this
            },
            onSuccess:
            {
               fn: function DataGrid_onActionView_success(response)
               {
                  // Reload the node's metadata
                  Alfresco.util.Ajax.jsonPost(
                  {
                     url: Alfresco.constants.PROXY_URI + "slingshot/datalists/item/node/" + new Alfresco.util.NodeRef(item.nodeRef).uri,
                     dataObj: this._buildDataGridParams(),
                     successCallback:
                     {
                        fn: function DataGrid_onActionView_refreshSuccess(response)
                        {
                           // Fire "itemUpdated" event
                           Bubbling.fire("dataItemUpdated",
                           {
                              item: response.json.item
                           });
                           // Display success message
                           Alfresco.util.PopupManager.displayMessage(
                           {
                              text: this.msg("message.details.success")
                           });
                        },
                        scope: this
                     },
                     failureCallback:
                     {
                        fn: function DataGrid_onActionView_refreshFailure(response)
                        {
                           Alfresco.util.PopupManager.displayMessage(
                           {
                              text: this.msg("message.details.failure")
                           });
                        },
                        scope: this
                     }
                  });
               },
               scope: this
            },
            onFailure:
            {
               fn: function DataGrid_onActionView_failure(response)
               {
                  Alfresco.util.PopupManager.displayMessage(
                  {
                     text: this.msg("message.details.failure")
                  });
               },
               scope: this
            }
         }).show();
      },

Merci pour votre aide.
3snet
Member II

Re: Le lien 'onActionView' ne fonctionne pas sur le dataList

Bonjour à tous,

Je me permets de relancer ce sujet car je suis bloqué sur ce point pour la mise en production de mon site.
Merci pour ceux qui peuvent/veulent bien m'aider à régler ce problème.

Bien cordialement.
jayjayecl
Active Member II

Re: Le lien 'onActionView' ne fonctionne pas sur le dataList

Vous pouvez faire un peu de debugging Javascript pour voir ce qu'il se passe lorsque vous cliquer sur le bouton onActionView ?
3snet
Member II

Re: Le lien 'onActionView' ne fonctionne pas sur le dataList

Bonjour à tous,

J'obtiens le message suivant:

Internal Form Error: form with id of 'template_x002e_datagrid_x002e_data-lists-viewDetails-form' could not be located, ensure the form is created after the form element is available.

testé sur IE8 FF4.0 Chrome 10
jayjayecl
Active Member II

Re: Le lien 'onActionView' ne fonctionne pas sur le dataList

Pouvez-vous essayer, dans la configuration des formulaires, d'implémenter un "view-form", et de retester :
http://wiki.alfresco.com/wiki/Forms#view-form

N'oubliez pas de poster les logs (et les erreurs javascript) si la tentative s'avère infructueuse.
3snet
Member II

Re: Le lien 'onActionView' ne fonctionne pas sur le dataList

Bonjour,

J'ai déjà essayer d'implémenter un view-form  comme préciser dans le message. Cependant, cela n'a pas résolu mon problème.
Voici les log javascript que j’obtiens

[11:54:16,138] GET http://127.0.0.1:8080/share/res/yui/datatable/datatable-min.js [HTTP/1.1 200 OK 47ms]
[11:58:31,314] GET http://127.0.0.1:8080/share/service/components/form?itemKind=node&itemId=workspace://SpacesStore/4c4... [HTTP/1.1 200 OK 47ms]

[11:58:37,343] this.widgets.okButton is null @ http://127.0.0.1:8080/share/res/modules/simple-dialog-min.js:377

J'obtient le message d'erreur

    Internal Form Error: form with id of 'template_x002e_datagrid_x002e_data-lists-viewDetails-form' could not be located, ensure the form is created after the form element is available.

juste avant l'erreur javascript. Je n'ai pas d'erreur particulière dans les log (log de tomcat, alfresco.log) malgrés le fait que j'ai passé toutes les log au niveau info

voici mes fichiers de config:

<dataGrid>
   <actionSet>
      <action type="action-link" id="onActionView" label="actions.view" />
      <action type="action-link" id="onActionEdit" permission="edit" label="actions.edit" />
      <action type="action-link" id="onActionDuplicate" permission="create" label="actions.duplicate-row" />
      <action type="action-link" id="onActionDelete" permission="delete" label="actions.delete-row" />
   </actionSet>
</dataGrid>

extrait de la config du formulaire

   <config evaluator="node-type" condition="dl:embauche">
      <forms>
         <!– Create item form –>
         <form>
            <field-visibility>
               <!– dl:intermission type–>
               <show id="dl:nomembauche"/>
               <show id="dl:profileembauche"/>
               <show id="dl:dateentree"/>
               <show id="dl:motifembauche"/>
               <show id="dl:prxrevembauche"/>
               <!– cm:attachable aspect –>
               <show id="cm:attachments"/>
            </field-visibility>
            <edit-form template="../data-lists/forms/dl_ficheembauche.ftl"/>
            <appearance>
               <field id="dl:nomembauche">
                  <control template="/org/alfresco/components/form/controls/textfield.ftl"/>
               </field>
               <field id="dl:profileembauche">
                  <control template="/org/alfresco/components/form/controls/textfield.ftl"/>
               </field>
               <field id="dl:dateentree">
                  <control template="/org/alfresco/components/form/controls/date.ftl"/>
               </field>
               <field id="dl:motifembauche">
                  <control template="/org/alfresco/components/form/controls/textfield.ftl"/>
               </field>
               <field id="dl:prxrevembauche">
                  <control template="/org/alfresco/components/form/controls/textfield.ftl"/>
               </field>
               <field id="cm:attachments">
                  <control>
                     <control-param name="startLocation">{doclib}</control-param>
                  </control>
               </field>
            </appearance>
         </form>
      </forms>
   </config> 
   <config evaluator="node-type" condition="dl:embauche">
      <forms>
         <!– Create item form –>
         <form>
            <field-visibility>
               <!– dl:intermission type–>
               <show id="dl:nomembauche"/>
               <show id="dl:profileembauche"/>
               <show id="dl:dateentree"/>
               <show id="dl:motifembauche"/>
               <show id="dl:prxrevembauche"/>
               <!– cm:attachable aspect –>
               <show id="cm:attachments"/>
            </field-visibility>
            <view-form template="../data-lists/forms/dl_ficheembauche.ftl"/>
            <appearance>
               <field id="dl:nomembauche">
                  <control template="/org/alfresco/components/form/controls/textfield.ftl"/>
               </field>
               <field id="dl:profileembauche">
                  <control template="/org/alfresco/components/form/controls/textfield.ftl"/>
               </field>
               <field id="dl:dateentree">
                  <control template="/org/alfresco/components/form/controls/date.ftl"/>
               </field>
               <field id="dl:motifembauche">
                  <control template="/org/alfresco/components/form/controls/textfield.ftl"/>
               </field>
               <field id="dl:prxrevembauche">
                  <control template="/org/alfresco/components/form/controls/textfield.ftl"/>
               </field>
               <field id="cm:attachments">
                  <control>
                     <control-param name="startLocation">{doclib}</control-param>
                  </control>
               </field>
            </appearance>
         </form>
      </forms>
   </config> 
   <config evaluator="node-type" condition="dl:embauche">
      <forms>
         <!– Create item form –>
         <form>
            <field-visibility>
               <!– dl:intermission type–>
               <show id="dl:nomembauche"/>
               <show id="dl:profileembauche"/>
               <show id="dl:dateentree"/>
               <show id="dl:motifembauche"/>
               <show id="dl:prxrevembauche"/>
               <!– cm:attachable aspect –>
               <show id="cm:attachments"/>
            </field-visibility>
            <create-form template="../data-lists/forms/dl_ficheembauche.ftl"/>
            <appearance>
               <field id="dl:nomembauche">
                  <control template="/org/alfresco/components/form/controls/textfield.ftl"/>
               </field>
               <field id="dl:profileembauche">
                  <control template="/org/alfresco/components/form/controls/textfield.ftl"/>
               </field>
               <field id="dl:dateentree">
                  <control template="/org/alfresco/components/form/controls/date.ftl"/>
               </field>
               <field id="dl:motifembauche">
                  <control template="/org/alfresco/components/form/controls/textfield.ftl"/>
               </field>
               <field id="dl:prxrevembauche">
                  <control template="/org/alfresco/components/form/controls/textfield.ftl"/>
               </field>
               <field id="cm:attachments">
                  <control>
                     <control-param name="startLocation">{doclib}</control-param>
                  </control>
               </field>
            </appearance>
         </form>
      </forms>
   </config> 
dl_ficheembauche.ftl

<#assign id=args.htmlid>
<#if formUI == "true">
   <@formLib.renderFormsRuntime formId=formId />
</#if>

<div id="${id}-dialog">
   <div id="${id}-dialogTitle" class="hd">${msg("title")}</div>
   <div class="bd">

      <div id="${formId}-container" class="form-container">

<#– No full-page edit view for v3.3-
   <#if form.mode == "edit">
         <div class="yui-u first edit-dataitem flat-button">
            <button id="${args.htmlid}-editDataItem" tabindex="0"></button>
         </div>
   </#if>
–>
         <#if form.showCaption?exists && form.showCaption>
            <div id="${formId}-caption" class="caption"><span class="mandatory-indicator">*</span>${msg("form.required.fields")}</div>
         </#if>
     
         <form id="${formId}" method="${form.method}" accept-charset="utf-8" enctype="${form.enctype}" action="${form.submissionUrl}">
  
         <#if form.destination??>
            <input id="${formId}-destination" name="alf_destination" type="hidden" value="${form.destination}" />
         </#if>
  
            <div id="${formId}-fields" class="form-fields">
               <div class="yui-g">
                <@formLib.renderField field=form.fields["prop_dl_nomembauche"] />
                     <@formLib.renderField field=form.fields["prop_dl_profileembauche"] />
                     <@formLib.renderField field=form.fields["prop_dl_dateentree"] />
                     <@formLib.renderField field=form.fields["prop_dl_motifembauche"] />
                     <@formLib.renderField field=form.fields["prop_dl_prxrevembauche"] />
                <!–attachement–>
                <@formLib.renderField field=form.fields["assoc_cm_attachments"] />
               </div>
            </div>

            <div class="bdft">
               <input id="${formId}-submit" type="submit" value="${msg("form.button.submit.label")}" />
                <input id="${formId}-cancel" type="button" value="${msg("form.button.cancel.label")}" />
            </div>
     
         </form>

      </div>
   </div>
</div>
3snet
Member II

Re: Le lien 'onActionView' ne fonctionne pas sur le dataList

Après un débogage javascript plus fin, il s'avère que le bouton "template_x002e_datagrid_x002e_data-lists-viewDetails-ok" de type submit est recherché dans la fonction Alfresco.util.createYUIButton. J'ai donc modifié le ftl de deux manières:
remplacement de

<input id="${formId}-submit" type="button" value="${msg("form.button.submit.label")}" />
par

<input id="${formId}-ok" type="submit" value="${msg("form.button.submit.label")}" />
puis

<input id="template_x002e_datagrid_x002e_data-lists-viewDetails-ok" type="submit" value="${msg("form.button.submit.label")}" />
Cependant, cela n'a pas donnée plus de résultat. J'obtient toujours

        Internal Form Error: form with id of 'template_x002e_datagrid_x002e_data-lists-viewDetails-form' could not be located, ensure the form is created after the form element is available.
3snet
Member II

Re: Le lien 'onActionView' ne fonctionne pas sur le dataList

Bonjour,

Voilà la fonction dans laquelle j'ai le message d'erreur. Le problème est qu'il ne retrouve pas la form dans le Dom (l202 du fichier forms-runtime.js).

La cause du problème ne semble pas venir de la configuration de la datalist. En effet, j'ai mis en commentaire toutes la parties de la configuration concernant ce formulaire et lorsque je clique sur view, j’obtiens le même message. En revanche, lorsque j’appuie sur edit, le formulaire apparaît.

En revanche, je n'ai pas réussit à comprendre le lien entre la clé du formulaire et le datalistmodel du serveur.

Voici l'extrait du fichier forms-runtime.js concerné:

init: function()
{
var form = Dom.get(this.formId);
if (form !== null)
{
if (form.getAttribute("forms-runtime") != "listening")
{
// add the event to the form and make the scope of the handler this form.
Event.addListener(form, "submit", this._submitInvoked, this, true);
form.setAttribute("forms-runtime", "listening");
if (this.ajaxSubmit)
{
form.setAttribute("onsubmit", "return false;");
}
var me = this;
/**
* Prevent the Enter key from causing a double form submission
*/
var fnStopEvent = function(id, keyEvent)
{
var event = keyEvent[1],
target = event.target ? event.target : event.srcElement;
if (target.tagName == "TEXTAREA")
{
// Allow linefeeds in textareas
return false;
}
else if (target.tagName == "BUTTON" || Dom.hasClass(target, "yuimenuitemlabel"))
{
// Eventlisteners for buttons and menus must be notified that the enter key was entered
}
else
{
var targetName = target.name;
if (targetName && (targetName != "-"))
{
me._submitInvoked(event);
}
Event.stopEvent(event);
return false;
}
};
var enterListener = new KeyListener(form,
{
keys: KeyListener.KEY.ENTER
}, fnStopEvent, YAHOO.env.ua.ie > 0 ? KeyListener.KEYDOWN : "keypress");
enterListener.enable();
}
// determine if the AJAX and JSON submission should be enabled
if (form.getAttribute("enctype") && form.getAttribute("enctype") == "application/json")
{
this.ajaxSubmit = true;
this.submitAsJSON = true;
}
// setup the submit elements if the feature is enabled
if (this.showSubmitStateDynamically)
{
// find the default submit elements if there are no submitIds set
if (this.submitElements.length == 0)
{
// use a selector to find any submit elements for the form
var nodes = Selector.query('#' + this.formId + ' > input[type="submit"]');
for (var x = 0, xx = nodes.length; x < xx; x++)
{
var elem = nodes[x];
this.submitElements.push(elem.id);
}
}
// make sure the submit elements start in the correct state
this.updateSubmitElements();
}
}
else
{
this._showInternalError("form with id of '" + this.formId +
"' could not be located, ensure the form is created after the form element is available.");
}
}