(core) updates from grist-core

This commit is contained in:
Paul Fitzpatrick 2022-12-05 09:24:06 -05:00
commit 8c610dcb33
8 changed files with 41 additions and 7 deletions

View File

@ -231,6 +231,7 @@ GRIST_SESSION_DOMAIN | if set, associates the cookie with the given domain - oth
GRIST_SESSION_SECRET | a key used to encode sessions GRIST_SESSION_SECRET | a key used to encode sessions
GRIST_FORCE_LOGIN | when set to 'true' disables anonymous access GRIST_FORCE_LOGIN | when set to 'true' disables anonymous access
GRIST_SINGLE_ORG | set to an org "domain" to pin client to that org GRIST_SINGLE_ORG | set to an org "domain" to pin client to that org
GRIST_HELP_CENTER | set the help center link ref
GRIST_SUPPORT_ANON | if set to 'true', show UI for anonymous access (not shown by default) GRIST_SUPPORT_ANON | if set to 'true', show UI for anonymous access (not shown by default)
GRIST_SUPPORT_EMAIL | if set, give a user with the specified email support powers. The main extra power is the ability to share sites, workspaces, and docs with all users in a listed way. GRIST_SUPPORT_EMAIL | if set, give a user with the specified email support powers. The main extra power is the ability to share sites, workspaces, and docs with all users in a listed way.
GRIST_THROTTLE_CPU | if set, CPU throttling is enabled GRIST_THROTTLE_CPU | if set, CPU throttling is enabled

View File

@ -9,6 +9,9 @@ import { cssIconBackground, icon } from 'app/client/ui2018/icons';
import { gristLink } from 'app/client/ui2018/links'; import { gristLink } from 'app/client/ui2018/links';
import { NewAbstractWidget, Options } from 'app/client/widgets/NewAbstractWidget'; import { NewAbstractWidget, Options } from 'app/client/widgets/NewAbstractWidget';
import { Computed, dom, DomArg, DomContents, fromKo, Observable, styled } from 'grainjs'; import { Computed, dom, DomArg, DomContents, fromKo, Observable, styled } from 'grainjs';
import {makeT} from 'app/client/lib/localization';
const t = makeT('NTextBox');
/** /**
* TextBox - The most basic widget for displaying text information. * TextBox - The most basic widget for displaying text information.
@ -62,7 +65,7 @@ export class NTextBox extends NewAbstractWidget {
return dom('div.field_clip', return dom('div.field_clip',
dom.style('text-align', this.alignment), dom.style('text-align', this.alignment),
dom.cls('text_wrapping', this.wrapping), dom.cls('text_wrapping', this.wrapping),
dom.domComputed((use) => use(row._isAddRow) ? null : makeLinks(use(this.valueFormatter).formatAny(use(value)))) dom.domComputed((use) => use(row._isAddRow) ? null : makeLinks(use(this.valueFormatter).formatAny(use(value), t)))
); );
} }
} }

View File

@ -79,19 +79,28 @@ export class BaseFormatter {
* Formats using this.format() if a value is of the right type for this formatter, or using * Formats using this.format() if a value is of the right type for this formatter, or using
* AnyFormatter otherwise. This method the recommended API. There is no need to override it. * AnyFormatter otherwise. This method the recommended API. There is no need to override it.
*/ */
public formatAny(value: any): string { public formatAny(value: any, translate?: (val: string) => string): string {
return this.isRightType(value) ? this.format(value) : formatUnknown(value); return this.isRightType(value) ? this.format(value, translate) : formatUnknown(value);
} }
/** /**
* Formats a value that matches the type of this formatter. This should be overridden by derived * Formats a value that matches the type of this formatter. This should be overridden by derived
* classes to handle values in formatter-specific ways. * classes to handle values in formatter-specific ways.
*/ */
protected format(value: any): string { protected format(value: any, _translate?: (val: string) => string): string {
return String(value); return String(value);
} }
} }
export class BoolFormatter extends BaseFormatter {
public format(value: boolean | 0 | 1, translate?: (val: string) => string): string {
if (typeof value === 'boolean' && translate) {
return translate(String(value));
}
return super.format(value, translate);
}
}
class AnyFormatter extends BaseFormatter { class AnyFormatter extends BaseFormatter {
public format(value: any): string { public format(value: any): string {
return formatUnknown(value); return formatUnknown(value);
@ -265,7 +274,7 @@ class ReferenceListFormatter extends ReferenceFormatter {
const formatters: { [name: string]: typeof BaseFormatter } = { const formatters: { [name: string]: typeof BaseFormatter } = {
Numeric: NumericFormatter, Numeric: NumericFormatter,
Int: IntFormatter, Int: IntFormatter,
Bool: BaseFormatter, Bool: BoolFormatter,
Date: DateFormatter, Date: DateFormatter,
DateTime: DateTimeFormatter, DateTime: DateTimeFormatter,
Ref: ReferenceFormatter, Ref: ReferenceFormatter,

View File

@ -60,7 +60,7 @@ export const MIN_URLID_PREFIX_LENGTH = 12;
*/ */
export const commonUrls = { export const commonUrls = {
help: "https://support.getgrist.com", help: getHelpCenterUrl(),
helpAccessRules: "https://support.getgrist.com/access-rules", helpAccessRules: "https://support.getgrist.com/access-rules",
helpConditionalFormatting: "https://support.getgrist.com/conditional-formatting", helpConditionalFormatting: "https://support.getgrist.com/conditional-formatting",
helpLinkingWidgets: "https://support.getgrist.com/linking-widgets", helpLinkingWidgets: "https://support.getgrist.com/linking-widgets",
@ -494,6 +494,9 @@ export interface GristLoadConfig {
// In single-org mode, this is the single well-known org. Suppress any org selection UI. // In single-org mode, this is the single well-known org. Suppress any org selection UI.
singleOrg?: string; singleOrg?: string;
// Url for support for the browser client to use.
helpCenterUrl?: string;
// When set, this directs the client to encode org information in path, not in domain. // When set, this directs the client to encode org information in path, not in domain.
pathOnly?: boolean; pathOnly?: boolean;
@ -641,6 +644,15 @@ export function getKnownOrg(): string|null {
} }
} }
export function getHelpCenterUrl(): string|null {
if(isClient()) {
const gristConfig: GristLoadConfig = (window as any).gristConfig;
return gristConfig && gristConfig.helpCenterUrl || null;
} else {
return process.env.GRIST_HELP_CENTER || null;
}
}
/** /**
* Like getKnownOrg, but respects singleOrg/GRIST_SINGLE_ORG strictly. * Like getKnownOrg, but respects singleOrg/GRIST_SINGLE_ORG strictly.
* The main difference in behavior would be for orgs with custom domains * The main difference in behavior would be for orgs with custom domains

View File

@ -41,6 +41,7 @@ export function makeGristConfig(homeUrl: string|null, extra: Partial<GristLoadCo
org: process.env.GRIST_SINGLE_ORG || (mreq && mreq.org), org: process.env.GRIST_SINGLE_ORG || (mreq && mreq.org),
baseDomain, baseDomain,
singleOrg: process.env.GRIST_SINGLE_ORG, singleOrg: process.env.GRIST_SINGLE_ORG,
helpCenterUrl: process.env.GRIST_HELP_CENTER || "https://support.getgrist.com",
pathOnly, pathOnly,
supportAnon: shouldSupportAnon(), supportAnon: shouldSupportAnon(),
supportEngines: getSupportedEngineChoices(), supportEngines: getSupportedEngineChoices(),

View File

@ -1,6 +1,6 @@
{ {
"name": "grist-core", "name": "grist-core",
"version": "1.0.4", "version": "1.0.5",
"license": "Apache-2.0", "license": "Apache-2.0",
"description": "Grist is the evolution of spreadsheets", "description": "Grist is the evolution of spreadsheets",
"homepage": "https://github.com/gristlabs/grist-core", "homepage": "https://github.com/gristlabs/grist-core",

View File

@ -354,6 +354,10 @@
"GiveFeedback": "Give feedback", "GiveFeedback": "Give feedback",
"NoNotifications": "No notifications" "NoNotifications": "No notifications"
}, },
"NTextBox": {
"false": "false",
"true": "true"
},
"OnBoardingPopups": { "OnBoardingPopups": {
"Finish": "Finish", "Finish": "Finish",
"Next": "Next" "Next": "Next"

View File

@ -351,6 +351,10 @@
"GiveFeedback": "Donnez votre avis", "GiveFeedback": "Donnez votre avis",
"NoNotifications": "Aucune notification" "NoNotifications": "Aucune notification"
}, },
"NTextBox": {
"false": "faux",
"true": "vrai"
},
"OnBoardingPopups": { "OnBoardingPopups": {
"Finish": "Terminer", "Finish": "Terminer",
"Next": "Suivant" "Next": "Suivant"