Filemanager: Add push support

This commit is contained in:
nathan 2022-10-24 09:57:35 -06:00
parent e95943f812
commit 24fb01d190
2 changed files with 59 additions and 8 deletions

View File

@ -95,7 +95,7 @@ export abstract class EgwApp
* *
* *
* @example <caption>Access via etemplate2 object</caption> * @example <caption>Access via etemplate2 object</caption>
* // Instead of this.et2, using it's unique ID * // Instead of this.et2, using its unique ID
* var et2 = etemplate2.getById("myapp-index") * var et2 = etemplate2.getById("myapp-index")
* if(et2) * if(et2)
* { * {
@ -255,8 +255,8 @@ export abstract class EgwApp
/** /**
* Handle a push notification about entry changes from the websocket * Handle a push notification about entry changes from the websocket
* *
* Get's called for data of all apps, but should only handle data of apps it displays, * Gets called for data of all apps, but should only handle data of apps it displays,
* which is by default only it's own, but can be for multiple apps eg. for calendar. * which is by default only its own, but can be for multiple apps eg. for calendar.
* *
* @param pushData * @param pushData
* @param {string} pushData.app application name * @param {string} pushData.app application name
@ -1290,7 +1290,7 @@ export abstract class EgwApp
* the filemanager to link it since we can't link directly. * the filemanager to link it since we can't link directly.
* *
* This doesn't happen automatically. Each application must indicate that * This doesn't happen automatically. Each application must indicate that
* it will accept dropped mail by it's nextmatch actions: * it will accept dropped mail by its nextmatch actions:
* *
* $actions['info_drop_mail'] = array( * $actions['info_drop_mail'] = array(
* 'type' => 'drop', * 'type' => 'drop',
@ -1512,7 +1512,7 @@ export abstract class EgwApp
/** /**
* Create backup dialog * Create backup dialog
* @param {string} _selector DOM selector to attach backupDialog * @param {string} _selector DOM selector to attach backupDialog
* @param {boolean} _initSetup determine wheter it's an initialization backup or restore backup * @param {boolean} _initSetup determine whether it's an initialization backup or restore backup
* *
* @returns {Promise.<backupPopupId, Error>} * @returns {Promise.<backupPopupId, Error>}
*/ */

View File

@ -11,7 +11,7 @@
/*egw:uses /*egw:uses
/api/js/jsapi/egw_app.js; /api/js/jsapi/egw_app.js;
*/ */
import {EgwApp} from "../../api/js/jsapi/egw_app"; import {EgwApp, PushData} from "../../api/js/jsapi/egw_app";
import {et2_nextmatch} from "../../api/js/etemplate/et2_extension_nextmatch"; import {et2_nextmatch} from "../../api/js/etemplate/et2_extension_nextmatch";
import {etemplate2} from "../../api/js/etemplate/etemplate2"; import {etemplate2} from "../../api/js/etemplate/etemplate2";
import {Et2Dialog} from "../../api/js/etemplate/Et2Dialog/Et2Dialog"; import {Et2Dialog} from "../../api/js/etemplate/Et2Dialog/Et2Dialog";
@ -28,6 +28,23 @@ import {et2_textbox} from "../../api/js/etemplate/et2_widget_textbox";
*/ */
export class filemanagerAPP extends EgwApp export class filemanagerAPP extends EgwApp
{ {
/**
* If pushData.acl has fields that can help filter based on ACL grants, list them
* here and we can check them and ignore push messages if there is no ACL for that entry.
* We don't use fields, but setting this allows our custom check to run.
* @protected
*/
protected push_grant_fields : string[] = ['acl'];
/**
* If pushData.acl has fields that can help filter based on current nextmatch filters,
* list them here and we can check and ignore push messages if the nextmatch filters do not exclude them.
* We only check path, which is the ID, but setting this allows our custom check to run.
*
* @protected
*/
protected push_filter_fields : string[] = ['id'];
/** /**
* path widget, by template * path widget, by template
*/ */
@ -200,6 +217,40 @@ export class filemanagerAPP extends EgwApp
return state; return state;
} }
/**
* Check grants to see if we can quickly tell if this entry is not for us
*
* Overridden to check current user and their memberships against pushData.acl, which is a list of account IDs
* that should have at least read access.
*
* @param pushData
* @param grant_fields List of fields in pushData.acl with account IDs that might grant access eg: info_responsible
* @param appname Optional, to check against the grants for a different application. Defaults to this.appname.
*
* @return boolean Entry has ACL access
*/
_push_grant_check(pushData : PushData, grant_fields : string[], appname? : string) : boolean
{
let grants = [this.egw.user("account_id"), ...this.egw.user("memberships")];
// check user has a something in the pushData ACL list
return grants.filter(value => pushData.acl.includes(value)).length > 0;
}
/**
* Check pushData path to see if we care about this entry based on current nextmatch path.
* This is not a definitive yes or no (the server will tell us when we ask), we just want to cheaply
* avoid a server call if we know it won't be in the list.
*
* @param pushData
* @param filter_fields List of filter field names eg: [owner, cat_id]
* @return boolean True if the nextmatch filters might include the entry, false if not
*/
_push_field_filter(pushData : PushData, nm : et2_nextmatch, filter_fields : string[]) : boolean
{
return pushData.id && (<string>pushData.id).startsWith(this.get_path());
}
/** /**
* Convert id to path (remove "filemanager::" prefix) * Convert id to path (remove "filemanager::" prefix)
*/ */