権限は与える状態でのアプリ非表示

お世話になります。

レコード復元用のアプリを作成しました。

そのアプリに対して全てのユーザーに権限を与えておかないと、別アプリでレコードを削除した際に権限がなく復元アプリに情報が追記できません。

権限を与えるのはいいのですが、アプリ一覧に表示させたくないです。

何か方法はありますでしょうか。

よろしくお願いします。

ADMさん

こんにちは。

 

レコード削除時の復元アプリへの登録は、APIを使ってカスタマイズされていますか?

APIトークンを使えば、アプリの閲覧権限を一般ユーザーに渡さずにPOSTできます。

 

もしくは、ポータル画面上であれば、CSS等で無理やり非表示にするということも可能です。

ただ、こちらは閲覧権限は渡した状態ですので、右上の全体検索からヒットする可能性はあると思います。

koichi様

回答いただきありがとうございます。

今はTISさんのプラグインを使用しておりAPI等使用していないはずです。

私でもできる内容であればいいのですが・・・

ちなみにポータル画面上で非表示になれば検索でヒットするのは問題ないので、そちらでもいいのかなと考えています。

ご確認ありがとうございます。

以下のようなCSSをkintoneシステム管理のCSSに適用すれば、ポータル画面右下のアプリ一覧からは消せます。

/* 999は該当のアプリID */
.gaia-argoui-appscrollinglist-item-outer-999 {
    display: none;
}

koichi

ありがとうございます。

反映してみたのですが、相変わらず居座っているようです。

/* 131は該当のアプリID */
(function () {
.gaia-argoui-appscrollinglist-item-outer-131 {
    display: none;
})();

ご確認ありがとうございます。

CSSになりますので、function() { } は不要です。

以下だけを.css形式で保存し、「PC用のCSSファイル」に設定してみてください。

.gaia-argoui-appscrollinglist-item-outer-131 {
    display: none;
}

koichi

恥ずかしながらjsに設定していました。

上手く動作しました。

こちらのCSSはモバイルには適用できないのでしょうか?

モバイルは、CSSではできなさそうです。

PCの方も改めて、JavsScriptで処理するように変えてみました。

CSSの削除いただき、以下JavaScriptをPC・モバイル双方の設定に適用してみてください。

appIdは、非表示にしたいアプリIDをカンマ区切りで設定してください。

(function() {

    'use strict';

    kintone.events.on(['portal.show', 'mobile.portal.show'], function(event) {

// アプリID
      const appId = [2, 3, 5, 8, 13];

        appId.forEach(function(id) {
            const el = document.querySelectorAll('a[href*="/' + id + '/"]');
            for (let i = 0; i < el.length; i++) {
                if (event.type.indexOf('mobile') == -1) {
                    // PC版
                    el[i].parentNode.style.display = 'none';
                } else {
                    // モバイル版
                    el[i].parentNode.parentNode.style.display = 'none';
                }
            }
        });

    });

})();

koichi様

わざわざ対応いただきましてありがとうございます。

モバイルの方でも非表示にできました!すごいです。

色々と活用できそうですね。感謝申し上げます。

1つ気づいたのは一度お気に入りアプリのみ表示に切り替えてから、すべてのアプリを表示に再度切り替えると、隠していたアプリが表示されるんですね。

ポータルを開いたタイミングでしか実行しないため、アプリ一覧を切り替えると再生成されますね。

ということで、setIntervalを使い、定期的に実行することができます。

以下では100ミリ秒ごとに実行するようにしています。

100ミリ秒の間にラグがあると、一瞬画面がちらつくことがあるかもしれません。

ちなみに、左上のハンバーガーメニュー内のアプリ一覧と、右上の全体検索の候補からも消えます。

全体検索した後の検索結果画面では表示されますので、ご注意ください。

(function() {

    'use strict';

    kintone.events.on(['portal.show', 'mobile.portal.show'], function(event) {

      const appId = [2, 3, 5, 8, 13];

        var intervalId = setInterval(function() {

            appId.forEach(function(id) {
                const el = document.querySelectorAll('a[href*="/' + id + '/"]');
                for (let i = 0; i < el.length; i++) {
                    if (event.type.indexOf('mobile') == -1) {
                        // PC版
                        el[i].style.display = 'none';
                    } else {
                        // モバイル版
                        el[i].parentNode.parentNode.style.display = 'none';
                    }
                }
            });

        }, 100);

    });

})();

>koichi様

お世話になります。

こちらに追加で情報書かれていたことに気づかず、関わらず新しく別の質問をあげてしまいました。申し訳ございません。

ちなみに100ミリ秒ごとにこれを実行しても特に影響はないのでしょうか。

ADMさん

100ミリ秒ごとに実行しても問題はありません。もちろん、これ以上でも以下でも問題ありません。

但し、setIntervalを多用してしまうと、動作が遅くなるかもしれません。

>koichi様

ありがとうございます。

適用してみたところ違和感なく使用できています。

ありがとうございます。少し様子を見てみたいと思います。

 

>koichi様

こちらの件をいくつか試しているのですが、例えば特定のメンバーのみ、このアプリは表示するなどのイレギュラーパターンはできるのでしょうか。要するに書き込み権限は与えたいけれどアプリやレコードは見せたくないというパターンがあったので・・・

ADMさん

 

可能です。

ユーザーを例にすると、ユーザーコードの配列を作っておき

その配列内に「kintone.getLoginUser().code」が含まれるか否かで処理を分岐すれば実装できます。

 

組織・グループであれば、APIでログインユーザーの組織・グループを取得した上で

配列に含まれるか否か(あるいは特定の組織・グループコード文字列との一致不一致)で処理を分岐する方法になります。

ありがとうございます。

APIの取得は以下のような感じでしょうか

(function() {
    'use strict';
    kintone.events.on(['portal.show', 'mobile.portal.show'], function(event) {
      var loginUserCode = kintone.getLoginUser()['code']; // ログイン名を取得
    var path = '/v1/user/organizations';
    var data = {
      code: loginUserCode // ログインユーザーを指定
    };
       kintone.api(path, 'GET', data, function(resp){
      var soshiki = resp['organizationTitles'][0]['organization']['name']; // 取得した組織名をセット
      if (soshiki == '営業三課'){
        const appId = [131];
        } else {
        const appId = [131,34];
        }
        var intervalId = setInterval(function() {
            appId.forEach(function(id) {
                const el = document.querySelectorAll('a[href*="/' + id + '/"]');
                for (let i = 0; i < el.length; i++) {
                    if (event.type.indexOf('mobile') == -1) {
                        // PC版
                        el[i].style.display = 'none';
                    } else {
                        // モバイル版
                        el[i].parentNode.parentNode.style.display = 'none';
                    }
                }
            });
        }, 100);
    });
})();

ご認識の通りです。

そちらの記述で正常に動作すれば問題ございません。

ありがとうございます。

上手く動作しませんでしたが見直してみます。