Aikauの紹介

こんにちは、今回はAlfrescoのUIフレームワークであるAikauについてご紹介します。

Aikauとは?

AikauDojoをベースにしたUIフレームワークです。
主にレポジトリにアクセスするためのウェブアプリを簡単に組み立てられるウィジェットのライブラリを提供することを目的としています。
そして開発とカスタマイズを単純化し、効率よく開発できるようにするためのUIフレームワークです。
特にUIを個別単位でカスタマイズできるようにし、作業の手間を減らしてくれます。

AikauがAlfresco内で使われているところ

ACS23.2系のShareでは以下の箇所でAikauのウィジェットが使われています。

  • Header
  • Live Search
  • Filtered Search Page
  • Search Management Page
  • Site Management Page
  • Analytics and Reporting Widgets
  • Page Creator
  • Document List Prototype

参照

Aikauウィジェットの構成

Aikauのウィジェットはjs、html、cssで構成されます。
jsにはそのウィジェットの操作を記述し、htmlにはウィジェットの構造、cssにはウィジェットの外見を記述します。

Aikauウィジェットの一例

alfresco/layout/LeftAndRight.js

define(["dojo/_base/declare",
        "alfresco/core/ProcessWidgets",
        "alfresco/accessibility/_SemanticWrapperMixin",
        "dojo/text!./templates/LeftAndRight.html",
        "dojo/dom-construct",
        "dojo/dom-class",
        "dojo/_base/array"],
        function(declare, ProcessWidgets, _SemanticWrapperMixin, template, domConstruct, domClass, array) {
   return declare([ProcessWidgets, _SemanticWrapperMixin], {
      cssRequirements: [{cssFile:"./css/LeftAndRight.css"},
                        {cssFile:"./css/HorizontalWidgets.css"}],
      templateString: template,
      widgetsRight: null,
      widgetsLeft: null,
      postCreate: function alfresco_layout_LeftAndRight__postCreate() {
         domClass.add(this.domNode, this.additionalCssClasses || "");
         if (!this.widgetsRight &&
             !this.widgetsLeft &&
              this.widgets)
         {
            this.widgetsRight = array.filter(this.widgets, function(widget) {
               return widget.align === "right";
            });
            this.widgetsLeft = array.filter(this.widgets, function(widget) {
               return widget.align !== "right";
            });
         }
         this.widgetsRight && this.widgetsRight.reverse();
         this.widgetsRight && this.processWidgets(this.widgetsRight, this.rightWidgets, "RIGHT");
         this.widgetsLeft && this.processWidgets(this.widgetsLeft, this.leftWidgets, "LEFT");

         if(this.semanticWrapper)
         {
            this.generateSemanticWrapper(this.parentNode, this.containerNode);
         }
      }
   });
});

alfresco/layout/templates/LeftAndRight.html

<div class="alfresco-layout-LeftAndRight" data-dojo-attach-point="parentNode">
   <div data-dojo-attach-point="containerNode" class="">
      <div class="alfresco-layout-LeftAndRight__left" data-dojo-attach-point="leftWidgets"></div>
      <div class="alfresco-layout-LeftAndRight__right" data-dojo-attach-point="rightWidgets"></div>
      <div class="clear-both"></div>
   </div>
</div>

alfresco/layout/css/LeftAndRight.css

.alfresco-layout-LeftAndRight {
   width: 100%;

   &__left {
      float: left;
      > * {
         float: left;
      }
   }

   &__right {
      float: right;
      > * {
         float: right;
      }
   }
}

上記のLeftAndRightウィジェットを見ると、ウィジェットの操作はJavaScriptで書かれ、構造はhtmlに書かれ、cssファイルで外見を記述していることがわかります。
このようにAikauのウィジェットはjs, html, cssがウィジェット別に管理されカスタマイズしやすくなっています。

Aikauウィジェットの継承

Aikauではウィジェットを継承することができます。
上で紹介したLeftAndRightウィジェットはalfresco/core/ProcessWidgets_SemanticWrapperMixinを継承して作られたものです。
どのウィジェットを継承してるかはdeclareの引数として与えられる配列から確認できます。

return declare([ProcessWidgets, _SemanticWrapperMixin], {...})

このような継承を行うことで、継承したウィジェットのメソッドを自由に使うことができます。
その一例がthis.processWidgetsthis.generateSemanticWrapperです。
両メソッドともLeftAndRightで定義されていないですが、 processWidgetsはalfresco/core/ProcessWidgetsで定義されていて、 generateSemanticWrapperは_SemanticWrapperMixinで定義されているので、 LeftAndRight内で自由に使うことができます。

Aikauウィジェットの配置

share/imports/share-header.lib.js

...,
   {
      id: "HEADER_TITLE_BAR",
      name: "alfresco/layout/LeftAndRight",
      className: "share-header-title",
      config:
      {
         semanticWrapper: "header",
         widgets:
         [
            {
               id: "HEADER_LOGO",
               name: "alfresco/logo/Logo",
               align: "left",
               config:
               {
                  logoClasses: "alfresco-logo-only",
                  currentTheme: theme,
                  logoSrc: getHeaderLogoUrl()
               }
            },
            {
               id: "HEADER_TITLE",
               name: "alfresco/header/Title",
               align: "left",
               config: {
                  targetUrl: page.url.templateArgs.site != null ? "site/" + page.url.templateArgs.site : null,
                  label: (pageTitle != null) ? pageTitle : getPageTitle(),
                  setBrowserTitle: (pageTitle != null),
                  maxWidth: "500px"
               }
            },
            {
               id: "HEADER_NAVIGATION_MENU_BAR",
               name: "alfresco/header/AlfMenuBar",
               align: "right",
               className: "navigation-menu",
               config: {
                  widgets: getSubNavigationWidgets()
               }
            },
            {
               id: "HEADER_TITLE_MENU",
               name: "alfresco/menus/AlfMenuBar",
               align: "right",
               className: "title-menu",
               config: {
                  widgets: getTitleBarModel()
               }
            }
         ]
      }
   },
...

上記のようにウィジェットのnameを登録したパス名に指定するだけでAikauウィジェットをページ内に配置できます。configのwidgetsに子になるウィジェットを入れるとウィジェットのjsのthis.widgetsで利用することもできます。

実際の画面で上記のLeftAndRightウィジェットは以下のように表現されます。

画像を見るとconfigのwidgetsに入っているロゴとタイトルが左寄せになって詰め込まれていることがわかります。あと右には検索マネージャというナビゲーションメニューが配置されていることがわかります。

このようにLeftAndRightウィジェットは左と右にウィジェットを寄せる役割を持つウィジェットであることがわかります。

結論

Alfresco Shareの開発の場合、Aikauで作られたページが多少存在するので構造を理解しておくとカスタマイズする際に役に立つと思います。
以上、AlfrescoのUIフレームワークAikauの紹介でした。
以降Aikauウィジェットのカスタマイズ方法などについても記事を書いていきますので目を通していただけると幸いです。


関連記事
customize

RANKING
2020.10月.12
2020.11月.19
2020.10月.05
2020.12月.23
2020.11月.25