gristlabs_grist-core/app/common/User.ts
George Gevoian 72066bf0e4 (core) Support user variable in dropdown conditions
Summary:
Dropdown conditions can now reference a `user` variable, similar to the
one available in Access Rules.

Test Plan: Browser test.

Reviewers: jarek, paulfitz

Reviewed By: jarek, paulfitz

Differential Revision: https://phab.getgrist.com/D4255
2024-06-04 06:56:55 -07:00

90 lines
2.6 KiB
TypeScript

import {getTableId} from 'app/common/DocActions';
import {EmptyRecordView, RecordView} from 'app/common/RecordView';
import {Role} from 'app/common/roles';
/**
* Information about a user, including any user attributes.
*/
export interface UserInfo {
Name: string | null;
Email: string | null;
Access: Role | null;
Origin: string | null;
LinkKey: Record<string, string | undefined>;
UserID: number | null;
UserRef: string | null;
SessionID: string | null;
/**
* This is a rowId in the _grist_Shares table, if the user is accessing a document
* via a share. Otherwise null.
*/
ShareRef: number | null;
[attributes: string]: unknown;
}
/**
* Wrapper class for `UserInfo`.
*
* Contains methods for converting itself to different representations.
*/
export class User implements UserInfo {
public Name: string | null = null;
public UserID: number | null = null;
public Access: Role | null = null;
public Origin: string | null = null;
public LinkKey: Record<string, string | undefined> = {};
public Email: string | null = null;
public SessionID: string | null = null;
public UserRef: string | null = null;
public ShareRef: number | null = null;
[attribute: string]: any;
constructor(info: Record<string, unknown> = {}) {
Object.assign(this, info);
}
/**
* Returns a JSON representation of this class that excludes full row data,
* only keeping user info and table/row ids for any user attributes.
*
* Used by the sandbox to support `user` variables in formulas (see `user.py`).
*/
public toJSON() {
return this._toObject((value) => {
if (value instanceof RecordView) {
return [getTableId(value.data), value.get('id')];
} else if (value instanceof EmptyRecordView) {
return null;
} else {
return value;
}
});
}
/**
* Returns a record representation of this class, with all user attributes
* converted from `RecordView` instances to their JSON representations.
*
* Used by the client to support `user` variables in dropdown conditions.
*/
public toUserInfo(): UserInfo {
return this._toObject((value) => {
if (value instanceof RecordView) {
return value.toJSON();
} else if (value instanceof EmptyRecordView) {
return null;
} else {
return value;
}
}) as UserInfo;
}
private _toObject(mapValue: (value: unknown) => unknown) {
const results: {[key: string]: any} = {};
for (const [key, value] of Object.entries(this)) {
results[key] = mapValue(value);
}
return results;
}
}