Kintone Portal Designerでカスタマイズしたポータル画面について

ログインユーザーの「優先する組織」に応じてポータルの表示を切り替えたく、developer networkの記事( ポータルに表示する内容を組織によって出し分けよう!〜kintoneのポータルカスタマイズ紹介 #2〜)のカスタマイズを本番環境に適用しました。
切り替えは実現できたのですが、困ったことが2点あります。

①console.logで優先する組織の値を確認しようとすると、undefinedになる
console.logで優先する組織の値を確認しようとすると、undefinedになっています。切り替えは実現できているので優先する組織の取得自体はできていると思うのですが、何故でしょうか?

②セキュアアクセス用のURL(「.s」付き)に自動変換されない
セキュアアクセスの証明書をインストールした端末からアクセスした場合、 ヘルプページの通り、URLが自動的に「.s」付きに変換されます。
しかし、今回のカスタマイズで表示させたリンクは変換がされません。

検証したところ、いずれもリッチエディターですが
・通常のポータル設定のリンク:自動変換される
・一般的なメッセージアプリなどのリンク:自動変換される
・カスタマイズした新ポータル:自動変換されずs無しのリンクのまま
となってしまいます。

コードは下記の通りで、
// ログインユーザーの情報を取得_課題1の該当箇所です
const loginUser = kintone.getLoginUser();

// 優先する組織の値をconsole.logで表示_課題1の該当箇所です
console.log(‘ログインユーザーの優先する組織:’, loginUser.preferredOrganization);
の部分以外は元記事のままです。

(function() {

  // 管理アプリの指定
  const MASTER_APPID = 3993;

  // 優先される組織が含まれるレコードがなかったときに表示するレコードの指定
  const DEFAULT_RECORD_NUMBER = 1;

  // お知らせ欄に表示されるリッチエディターのフィールドコード
  const RICH_TEXT_EDITOR_CODE = '表示する内容';

  // 表示させたい組織の入力
  const ORGANIZATION_CODE = '表示先組織';

  // 表示される場所のIDを指定
  const NOTI_AREA_ID = 'noti_area';

// ログインユーザーの情報を取得
  const loginUser = kintone.getLoginUser();

  // 優先する組織の値をconsole.logで表示_課題1の該当箇所です
  console.log('ログインユーザーの優先する組織:', loginUser.preferredOrganization);

  const notiElArea = document.getElementById(NOTI_AREA_ID);

  const renderNotiContent = function(content) {
    notiElArea.innerHTML = content;
  };

  const errorMessage = function(error) {
    const notiDate = error.message;
    alert('ポータルでの処理でエラーが発生しました。\n担当者にお問い合わせください。\n\nエラーの内容\n' + notiDate);
  };

  const fetchDefaultNoti = function() {
    const defaultParams = {
      'app': MASTER_APPID,
      'id': DEFAULT_RECORD_NUMBER
    };

    return kintone.api(kintone.api.url('/k/v1/record', true), 'GET', defaultParams).then(function(resp) {
      return resp.record[RICH_TEXT_EDITOR_CODE].value;
    });
  };

  const fetchNoti = function() {
    const params = {
      'app': MASTER_APPID,
      'query': ORGANIZATION_CODE + ' in (PRIMARY_ORGANIZATION()) limit 1',
      'fields': [RICH_TEXT_EDITOR_CODE]
    };

    return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params).then(function(resp) {
      if (resp.records.length === 0) {
        return fetchDefaultNoti();
      }
      return resp.records[0][RICH_TEXT_EDITOR_CODE].value;
    });
  };

  fetchNoti().then(renderNotiContent).catch(errorMessage);
})();

以上について、よろしくお願いいたします。

①優先する組織について

kintone.getLoginUser() では優先する組織を取得することはできません。
注意事項の通り User API を利用するしかないと思います。

②セキュアアクセスに変換されない

kintone 自体が表示しているリンクに関しては、 kintone 側で自動変換される処理が入っています。
カスタマイズで表示しているリンクには、自分で同様の処理を施す必要があります。

セキュアアクセス経由でアクセスしているかどうかは、…公式のAPIが存在するかどうかは分かりませんが、 window.location.host を見れば判定はできると思います。

const isSecureAccess = /\.s\.cybozu\.com$/.test(location.hostname);
2 Likes

補足として kintone.getLoginUser() で優先する組織が取得できないのに何故うまく動いているのか、というと…

この関数で投げているレコード取得の REST API の param.query

ORGANIZATION_CODE + ' in (PRIMARY_ORGANIZATION()) limit 1'

となっていますが、ここの PRIMARY_ORGANIZATION()レコードの絞り込み条件として 優先する組織を指定するクエリになっています。

なので、 JavaScript 上では優先する組織は取得できていないけれど、レコードの絞り込み条件としては使える、という感じだと思います。

1 Like

@wv-sumichan
ご教示いただきありがとうございます!分かりやすい解説で大変参考になりました。

セキュアアクセスの判定とそれに伴うURLの自動変換は、回答を基に下記の記述で実装できました。
細かい検証はしていないですが誰かの参考になればと思い、共有いたします。

    const renderNotiContent = function(content) {

// ホスト名が特定のパターンに一致するかどうかを判定
    const isSecureAccess = /\.s\.cybozu\.com$/.test(location.hostname);

    if (isSecureAccess) {
      // セキュアアクセスの場合、リンクのURLを置換
      content = content.replace(/https:\/\/サブドメイン\.cybozu\.com(\/.*)?/g, 'https://サブドメイン.s.cybozu.com$1');
    }

    notiElArea.innerHTML = content;
};
1 Like