お世話になります。
レコード復元用のアプリを作成しました。
そのアプリに対して全てのユーザーに権限を与えておかないと、別アプリでレコードを削除した際に権限がなく復元アプリに情報が追記できません。
権限を与えるのはいいのですが、アプリ一覧に表示させたくないです。
何か方法はありますでしょうか。
よろしくお願いします。
お世話になります。
レコード復元用のアプリを作成しました。
そのアプリに対して全てのユーザーに権限を与えておかないと、別アプリでレコードを削除した際に権限がなく復元アプリに情報が追記できません。
権限を与えるのはいいのですが、アプリ一覧に表示させたくないです。
何か方法はありますでしょうか。
よろしくお願いします。
ADMさん
こんにちは。
レコード削除時の復元アプリへの登録は、APIを使ってカスタマイズされていますか?
APIトークンを使えば、アプリの閲覧権限を一般ユーザーに渡さずにPOSTできます。
もしくは、ポータル画面上であれば、CSS等で無理やり非表示にするということも可能です。
ただ、こちらは閲覧権限は渡した状態ですので、右上の全体検索からヒットする可能性はあると思います。
回答いただきありがとうございます。
今はTISさんのプラグインを使用しておりAPI等使用していないはずです。
私でもできる内容であればいいのですが・・・
ちなみにポータル画面上で非表示になれば検索でヒットするのは問題ないので、そちらでもいいのかなと考えています。
ご確認ありがとうございます。
以下のようなCSSをkintoneシステム管理のCSSに適用すれば、ポータル画面右下のアプリ一覧からは消せます。
/* 999は該当のアプリID */
.gaia-argoui-appscrollinglist-item-outer-999 {
display: none;
}
ありがとうございます。
反映してみたのですが、相変わらず居座っているようです。
/* 131は該当のアプリID */
(function () {
.gaia-argoui-appscrollinglist-item-outer-131 {
display: none;
})();
ご確認ありがとうございます。
CSSになりますので、function() { } は不要です。
以下だけを.css形式で保存し、「PC用のCSSファイル」に設定してみてください。
.gaia-argoui-appscrollinglist-item-outer-131 {
display: none;
}
モバイルは、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';
}
}
});
});
})();
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);
});
})();
ご認識の通りです。
そちらの記述で正常に動作すれば問題ございません。
ありがとうございます。
上手く動作しませんでしたが見直してみます。