than1234
than1234

Reputation: 53

How to customize the Document List in Alfresco?

In the repository there be will different document lists.i.e there will be Data dictionary, user homes,Guest homes etc. when I change the view to "detailed view", it displays Favorite, like, comments links. where will I have to modify if I dont want to show them. Can you tell in which file i have to comment the code for not displaying those links. Thank you in Advance.

Upvotes: 2

Views: 6748

Answers (5)

boumbh
boumbh

Reputation: 2080

I wanted a "modular" answer to this question, this answer is to show how I handled this issue.

Context: Alfresco 4.2.f, project Maven from the org.alfresco.maven.archetype:alfresco-amp-archetype:1.1.1 archetype, I put everything in the embedded JAR when possible.

Create a module extension for share (see this blog for more details). Here is my extension file:

src/main/resources/alfresco/site-data/extensions/my-custom-extension.xml

<extension>
  <modules>
    <module>
      <id>Main module of my custom extension</id>
      <version>${project.version}</version>
      <auto-deploy>true</auto-deploy>
      <customizations>
        <customization>
          <!-- Order matters here! target before source, always! -->
          <targetPackageRoot>org.alfresco</targetPackageRoot>
          <sourcePackageRoot>my-custom.main</sourcePackageRoot>
        </customization>
      </customizations>
    </module>
  </modules>
</extension>

In the documentlibrary component of your module package, create this FTL in order to declare a javascript:

src/main/resources/alfresco/site-webscripts/my-custom/main/components/documentlibrary/documentlist-v2.get.html.ftl

<#-- Add a Javascript declaration -->
<@markup id="my-custom-js"  target="js" action="after">
  <@script type="text/javascript" group="documentlibrary"
      src="${url.context}/res/my-custom/main/components/documentlibrary/documentlist.js"/>
</@>

In the resources (META-INF), under documentlibrary component, create the Javascript:

src/main/resources/META-INF/my-custom/main/components/documentlibrary/documentlist.js

YAHOO.lang.augmentObject(Alfresco.DocumentList.prototype, {

  // Possible values: i18nLabel, lockBanner, syncFailed, syncTransientError
  // date, size, name, version, description, tags, categories
  myCustomDisabledRenderers: ["description", "version", "tags"],

  // Possible values: favourites, likes, comments, quickShare
  myCustomDisabledSocials: ["favourites", "comments", "likes", "quickShare"],

  myCustomIsSocialDisabled: function(propertyName) {
    return Alfresco.util.arrayContains(
        this.myCustomDisabledSocials, propertyName);
  },

  myCustomIsRendererDisabled: function(propertyName) {
    if (Alfresco.util.arrayContains(
        this.myCustomDisabledRenderers, propertyName)) {
      return true;
    }
    // Disable the social renderer when all the social features are
    // disabled
    if (propertyName === "social" && this.myCustomDisabledSocials.length == 4) {
      return true;
    }
    return false;
  },

  /** Helper function to disable socials
   * propertyName must be one of "favourites", "comments", "likes", "quickShare"
   */
  myCustomDisableSocial: function(propertyName) {
    if (!Alfresco.util.arrayContains(
        this.myCustomDisabledSocials, propertyName)) {
      this.myCustomDisabledSocials.push(propertyName);
    }
  },

  // Custom registerRenderer for social features, originally defined in:
  // webapps/share/components/documentlibrary/documentlist.js:2134
  myCustomSocialRegisterRenderer: function(record) {
    var jsNode = record.jsNode;
    var html = "";
    // Current usage of the separator variable allow to change the order
    // of the different social features (the 'if' blocks below) without 
    // changing their content
    var separator = "";
    /* Favourite / Likes / Comments */
    if (!this.myCustomIsSocialDisabled("favourites")) {
      html += '<span class="item item-social' + separator + '">' + 
          Alfresco.DocumentList.generateFavourite(this, record) + 
          '</span>';
      separator = " item-separator";
    }
    if (!this.myCustomIsSocialDisabled("likes")) {
      html += '<span class="item item-social' + separator + '">' + 
          Alfresco.DocumentList.generateLikes(this, record) + 
          '</span>';
      separator = " item-separator";
    }
    if (!this.myCustomIsSocialDisabled("comments") && 
        jsNode.permissions.user.CreateChildren) {
      html += '<span class="item item-social' + separator + '">' + 
          Alfresco.DocumentList.generateComments(this, record) + 
          '</span>';
      separator = " item-separator";
    }
    if (!this.myCustomIsSocialDisabled("quickShare") && !record.node.isContainer && 
        Alfresco.constants.QUICKSHARE_URL) {
      html += '<span class="item' + separator + '">' + 
          Alfresco.DocumentList.generateQuickShare(this, record) + 
          '</span>';
      separator = " item-separator";
    }

    return html;
  },

  // Overwrite registerRenderer which was originally defined in:
  // webapps/share/components/documentlibrary/documentlist.js:1789
  registerRenderer: function DL_registerRenderer(propertyName, renderer) {
    if (Alfresco.util.isValueSet(propertyName) && 
        Alfresco.util.isValueSet(renderer) && 
        !this.myCustomIsRendererDisabled(propertyName)) {
      if (propertyName === "social") {
        this.renderers[propertyName] = this.myCustomSocialRegisterRenderer;
      } else {
        this.renderers[propertyName] = renderer;
      }
      return true;
    }
    return false;
  }


}, true);

Then you can disable the links by updating myCustomDisabledRenderers and/or mySocialDisabledRenderers.

This way also allows you to create a module that disable (for example) the "comments on documents" or "likes on document" feature independently in only 6 easy steps!

Example, how to make a module that only disable comments on documents in 6 steps

  1. Important: first remove the "comment disabling" from the documentlist.js of the main module.

    myCustomDisabledSocials: ["favourites", "likes", "quickShare"],
    
  2. Create a new module "my-custom.nocomment" with the same structure.

    <extension>
      <modules>
        <module>
          <id>Main module of my custom extension</id>
          [...]
        </module>
        <module>
          <id>No comment module of my custom extension</id>
          <version>${project.version}</version>
          <customizations>
            <customization>
              <targetPackageRoot>org.alfresco</targetPackageRoot>
              <sourcePackageRoot>my-custom.nocomment</sourcePackageRoot>
            </customization>
          </customizations>
        </module>
      </modules>
    </extension>
    
  3. Add the FTL...

    src/main/resources/alfresco/site-webscripts/my-custom/nocomment/components/documentlibrary/documentlist-v2.get.html.ftl

    <#-- Add a Javascript declaration -->
    <@markup id="my-custom-js"  target="js" action="after">
      <@script type="text/javascript" group="documentlibrary"
          src="${url.context}/res/my-custom/nocomment/components/documentlibrary/documentlist.js"/>
    </@>
    
  4. then the Javascript...

    src/main/resources/META-INF/my-custom/nocomment/components/documentlibrary/documentlist.js

    Alfresco.DocumentList.prototype.myCustomDisableSocial("comment");
    
  5. and then I'm happy, clap along if you feel like everything's just got smooth!

  6. Notes:

    • The nocomment module depends on the main module.
    • It is important for the nocomment module to be loaded after the main module (in http://localhost:8080/share/page/modules/deploy).
    • In order for the nocomment module to be complete, you also need to disable comments from the document details page, see below.

Disable comments from the document details page

Even if, this one is documented elsewhere, I spent so much time searching around these few days that I feel like I need to be as comprehensive as possible.

src/main/resources/alfresco/site-data/extensions/my-custom-extension.xml

Add this to your my-custom.nocomment module declaration and you will get rid of the comments form and list from the document details page.

[...]
<module>
  <id>No comment module of my custom extension</id>
  [...]
  <components>
    <component>
      <region-id>comments</region-id>
      <source-id>document-details</source-id>
      <scope>template</scope>
      <sub-components>
        <sub-component id="default">
          <evaluations>
            <evaluation id="guaranteedToHide">
              <render>false</render>
            </evaluation>
          </evaluations>
        </sub-component>
      </sub-components>
    </component>
  </components>
</module>
[...]

src/main/resources/alfresco/site-webscripts/my-custom/nocomment/components/node-details/node-header.get.js

This is for disabling the button on the header of the document details page.

// Disable comments
for (var i = 0; i < model.widgets.length; i++) {
  if (model.widgets[i].id == "NodeHeader") {
    model.widgets[i].options.showComments = false;
  }
}
// And since it does not work, disable comments this way too
model.showComments = "false";

Note: I did not test these snippets, they have been taken from my project after "anonymization" (basically renaming the module). Let me know if you find mistakes.

Upvotes: 4

Flexi Coder
Flexi Coder

Reputation: 46

I did it by commenting the {social} line in file share-documentlibrary-config.xml in share/src/alfresco/share-document-config

...
<metadata-templates>
   <!-- Default (fallback) -->
     <template id="default">
        <line index="10" id="date">{date}{size}</line>
        <line index="20" id="description" view="detailed">{description}</line>
        <line index="30" id="tags" view="detailed">{tags}</line>
        <line index="40" id="categories" view="detailed" evaluator="evaluator.doclib.metadata.hasCategories">{categories}</line> -->
   <!-- <line index="50" id="social" view="detailed">{social}</line> -->
     </template>
...

It works!

Upvotes: 1

dicart
dicart

Reputation: 1

It looks like all of it is in: \opt\alfresco-4.0.d\tomcat\webapps\share\components\documentlibrary\documentlist.js I think the trick is in this.registerRenderer("social"...) to return html before line 1981 (after favorites before likes) supposing you want to keep at least faorite

Upvotes: 0

Jeff Potts
Jeff Potts

Reputation: 10538

What you are looking for is more than likely generated by client-side JavaScript. You should use share-config-custom.xml to set Share to development mode, like this:

<alfresco-config>
    <!-- Put Share Client in debug mode -->
    <config replace="true">
        <flags>
            <client-debug>true</client-debug>
            <client-debug-autologging>false</client-debug-autologging>
        </flags>
    </config>
</alfresco-config>

Then, use firebug or your browser's developer console to step through the client-side JavaScript. You should be able to find the point where the document library elements are rendered.

You can override Alfresco's client-side JavaScript components with your own components. Please put them in your own namespace to avoid collisions with Alfresco's.

Upvotes: 3

shmoula
shmoula

Reputation: 1083

I'm not sure if I understand well your question - you're trying to hide some columns from particular view in alfresco explorer? If so, you need to edit /jsp/browse/browse.jsp file, but I think that's not a good idea. Maybe implementing your own NodePropertyResolver should be better way, have look at my older blogpost on this topic: http://www.shmoula.cz/adding-columns-to-custom-browse-jsp/

Upvotes: 0

Related Questions