(core) updates from grist-core

This commit is contained in:
Paul Fitzpatrick 2024-02-12 08:15:38 -05:00
commit d008a32eb3
12 changed files with 235 additions and 32 deletions

View File

@ -263,6 +263,7 @@ GRIST_FORCE_LOGIN | Much like GRIST_ANON_PLAYGROUND but don't support anonymo
GRIST_SINGLE_ORG | set to an org "domain" to pin client to that org
GRIST_TEMPLATE_ORG | set to an org "domain" to show public docs from that org
GRIST_HELP_CENTER | set the help center link ref
FREE_COACHING_CALL_URL | set the link to the human help (example: email or meeting scheduling tool)
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_TELEMETRY_LEVEL | the telemetry level. Can be set to: `off` (default), `limited`, or `full`.
@ -297,7 +298,7 @@ It can also function against the chat completion endpoint provided by <a href="h
Variable | Purpose
-------- | -------
GRIST_SANDBOX_FLAVOR | can be pynbox, unsandboxed, docker, or macSandboxExec. If set, forces Grist to use the specified kind of sandbox.
GRIST_SANDBOX_FLAVOR | can be gvisor, pynbox, unsandboxed, docker, or macSandboxExec. If set, forces Grist to use the specified kind of sandbox.
GRIST_SANDBOX | a program or image name to run as the sandbox. See NSandbox.ts for nerdy details.
PYTHON_VERSION | can be 2 or 3. If set, documents without an engine setting are assumed to use the specified version of python. Not all sandboxes support all versions.
PYTHON_VERSION_ON_CREATION | can be 2 or 3. If set, newly created documents have an engine setting set to python2 or python3. Not all sandboxes support all versions.

View File

@ -45,6 +45,7 @@ interface SpecActions {
function applySpecActions(cb: (specActions: SpecActions, jsonSpec: JsonSpec) => void) {
// Don't call actions directly within `wrapActions`, react/redux doesn't like it.
setTimeout(() => {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
const system = (swaggerUI as any).getSystem();
const jsonSpec = system.getState().getIn(["spec", "json"]);
cb(system.specActions, jsonSpec);
@ -253,6 +254,7 @@ function initialize(appModel: AppModel) {
// showing it in cleartext makes it riskier to ask for help with screenshots and the like.
// We set a fake key anyway to be clear that it's needed in the curl command.
const key = 'XXXXXXXXXXX';
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
swaggerUI!.preauthorizeApiKey('ApiKey', key);
// Set examples for orgs, workspaces, and docs.

View File

@ -7,8 +7,9 @@ import {cardPopup, cssPopupBody, cssPopupButtons, cssPopupCloseButton,
import {icon} from 'app/client/ui2018/icons';
import {getGristConfig} from 'app/common/urlUtils';
import {dom, styled} from 'grainjs';
import { makeT } from '../lib/localization';
const FREE_COACHING_CALL_URL = 'https://calendly.com/grist-team/grist-free-coaching-call';
const t = makeT('WelcomeCoachingCall');
export function shouldShowWelcomeCoachingCall(appModel: AppModel) {
const {deploymentType} = getGristConfig();
@ -63,7 +64,6 @@ export function showWelcomeCoachingCall(triggerElement: Element, appModel: AppMo
ctl.close();
};
// TODO: i18n
return [
cssPopup.cls(''),
cssPopupHeader(
@ -77,35 +77,39 @@ export function showWelcomeCoachingCall(triggerElement: Element, appModel: AppMo
testId('popup-close-button'),
),
),
cssPopupTitle('Free Coaching Call', testId('popup-title')),
cssPopupTitle(t('free coaching call'),
dom.style('text-transform', 'capitalize'),
testId('popup-title')
),
cssPopupBody(
cssBody(
dom('div',
'Schedule your ', cssBoldText('free coaching call'), ' with a member of our team.'
t('Schedule your {{freeCoachingCall}} with a member of our team.',
{freeCoachingCall: cssBoldText(t('free coaching call'))}
)
),
dom('div',
"On the call, we'll take the time to understand your needs and "
+ 'tailor the call to you. We can show you the Grist basics, or start '
+ 'working with your data right away to build the dashboards you need.'
t("On the call, we'll take the time to understand your needs and tailor the call to you. \
We can show you the Grist basics, or start working with your data right away to build the dashboards you need.")
),
),
testId('popup-body'),
),
cssPopupButtons(
bigPrimaryButtonLink(
'Schedule Call',
t('Schedule Call'),
dom.on('click', () => {
dismissPopup(false);
logTelemetryEvent('clickedScheduleCoachingCall');
}),
{
href: FREE_COACHING_CALL_URL,
href: getGristConfig().freeCoachingCallUrl,
target: '_blank',
},
testId('popup-primary-button'),
),
bigBasicButton(
'Maybe Later',
t('Maybe Later'),
dom.on('click', () => dismissPopup(true)),
testId('popup-basic-button'),
),

View File

@ -675,6 +675,9 @@ export interface GristLoadConfig {
// Url for support for the browser client to use.
helpCenterUrl?: string;
// Url for free coaching call scheduling for the browser client to use.
freeCoachingCallUrl?: string;
// When set, this directs the client to encode org information in path, not in domain.
pathOnly?: boolean;
@ -879,6 +882,15 @@ export function getHelpCenterUrl(): string|null {
}
}
export function getFreeCoachingCallUrl(): string|null {
if(isClient()) {
const gristConfig: GristLoadConfig = (window as any).gristConfig;
return gristConfig && gristConfig.freeCoachingCallUrl || null;
} else {
return process.env.FREE_COACHING_CALL_URL || null;
}
}
/**
* Like getKnownOrg, but respects singleOrg/GRIST_SINGLE_ORG strictly.
* The main difference in behavior would be for orgs with custom domains

View File

@ -430,6 +430,7 @@ export class ActiveDocImport {
const columnData: BulkColValues = {};
const srcCols = await this._activeDoc.getTableCols(docSession, hiddenTableId);
// eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
const srcColIds = srcCols.map(c => c.id as string);
// Only include destination columns that weren't skipped.

View File

@ -54,6 +54,7 @@ export function makeGristConfig(options: MakeGristConfigOptions): GristLoadConfi
baseDomain,
singleOrg: process.env.GRIST_SINGLE_ORG,
helpCenterUrl: process.env.GRIST_HELP_CENTER || "https://support.getgrist.com",
freeCoachingCallUrl: process.env.FREE_COACHING_CALL_URL || "https://calendly.com/grist-team/grist-free-coaching-call",
pathOnly,
supportAnon: shouldSupportAnon(),
enableAnonPlayground: isAffirmative(process.env.GRIST_ANON_PLAYGROUND ?? true),

View File

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

View File

@ -297,7 +297,8 @@
"Document ID copied to clipboard": "Document ID copied to clipboard",
"Ok": "OK",
"Manage Webhooks": "Manage Webhooks",
"Webhooks": "Webhooks"
"Webhooks": "Webhooks",
"API Console": "API Console"
},
"DocumentUsage": {
"Attachments Size": "Size of Attachments",
@ -1305,6 +1306,13 @@
"HiddenQuestionConfig": {
"Hidden fields": "Hidden fields"
},
"WelcomeCoachingCall": {
"free coaching call": "free coaching call",
"Maybe Later": "Maybe Later",
"On the call, we'll take the time to understand your needs and tailor the call to you. We can show you the Grist basics, or start working with your data right away to build the dashboards you need.": "On the call, we'll take the time to understand your needs and tailor the call to you. We can show you the Grist basics, or start working with your data right away to build the dashboards you need.",
"Schedule Call": "Schedule Call",
"Schedule your {{freeCoachingCall}} with a member of our team.": "Schedule your {{freeCoachingCall}} with a member of our team."
},
"FormView": {
"Publish": "Publish",
"Publish your form?": "Publish your form?",

View File

@ -247,7 +247,8 @@
"Document ID copied to clipboard": "ID de documento copiado al portapapeles",
"API": "API",
"Webhooks": "Ganchos Web",
"Manage Webhooks": "Administrar los ganchos web"
"Manage Webhooks": "Administrar los ganchos web",
"API Console": "Consola de la API"
},
"DuplicateTable": {
"Copy all data in addition to the table structure.": "Copiar todos los datos además de la estructura de la tabla.",
@ -386,7 +387,19 @@
"Add column": "Añadir una columna",
"Last updated by": "Última actualización",
"Detect duplicates in...": "Detectar duplicados en...",
"Last updated at": "Última actualización en"
"Last updated at": "Última actualización en",
"Reference": "Referencia",
"Reference List": "Lista de referencias",
"Attachment": "Adjuntar",
"Numeric": "Numérico",
"Any": "Cualquiera",
"Text": "Texto",
"Choice": "Seleccione",
"Integer": "Entero",
"Date": "Fecha",
"Toggle": "Alternar",
"DateTime": "Fecha y hora",
"Choice List": "Lista de opciones"
},
"HomeIntro": {
", or find an expert via our ": ", o encontrar un experto a través de nuestro",
@ -541,7 +554,24 @@
"Fields_one": "Campo",
"Fields_other": "Campos",
"Add referenced columns": "Añadir columnas referenciadas",
"Reset form": "Restablecer el formulario"
"Reset form": "Restablecer el formulario",
"Default field value": "Valor predeterminado del campo",
"Configuration": "Configuración",
"Display button": "Botón de visualización",
"Field rules": "Reglas del campo",
"Submission": "Presentación",
"Submit button label": "Etiqueta del botón de enviar",
"Success text": "Texto exitoso",
"Submit another response": "Enviar otra respuesta",
"Table column name": "Nombre de la columna de la tabla",
"Enter redirect URL": "Introduzca la URL de redirección",
"Enter text": "Introduzca el texto",
"Field title": "Título del campo",
"Layout": "Diseño",
"Redirection": "Redirección",
"Required field": "Campo requerido",
"Hidden field": "Campo oculto",
"Redirect automatically after submission": "Redirigir automáticamente después del envío"
},
"RowContextMenu": {
"Copy anchor link": "Copiar enlace de anclaje",
@ -647,7 +677,8 @@
"Show raw data": "Mostrar datos brutos",
"Widget options": "Opciones de Widget",
"Collapse widget": "Ocultar el widget",
"Add to page": "Añadir a la página"
"Add to page": "Añadir a la página",
"Create a form": "Crear un formulario"
},
"ViewSectionMenu": {
"(customized)": "(personalizado)",
@ -718,7 +749,11 @@
"You do not have access to this organization's documents.": "No tiene acceso a los documentos de esta organización.",
"Account deleted{{suffix}}": "Cuenta borrada{{suffix}}",
"Your account has been deleted.": "Tu cuenta ha sido eliminada.",
"Sign up": "Inscribirse"
"Sign up": "Inscribirse",
"Form not found": "Formulario no encontrado",
"Powered by": "Desarrollado por",
"An unknown error occurred.": "Ha ocurrido un error desconocido.",
"Build your own form": "Cree su propio formulario"
},
"sendToDrive": {
"Sending file to Google Drive": "Enviar archivo a Google Drive"
@ -924,7 +959,17 @@
"modals": {
"Cancel": "Cancelar",
"Ok": "OK",
"Save": "Guardar"
"Save": "Guardar",
"Are you sure you want to delete this record?": "¿Seguro que quieres borrar este registro?",
"Delete": "Borrar",
"Don't show tips": "No muestres consejos",
"Undo to restore": "Deshacer para restaurar",
"Got it": "Entendido",
"Dismiss": "Descartar",
"Don't ask again.": "No preguntes de nuevo.",
"Don't show again.": "No vuelvas a mostrarlo.",
"Don't show again": "No volver a mostrar",
"Are you sure you want to delete these records?": "¿Seguro que quieres borrar estos registros?"
},
"pages": {
"Duplicate Page": "Duplicar página",
@ -1314,5 +1359,42 @@
},
"HiddenQuestionConfig": {
"Hidden fields": "Campos ocultos"
},
"Menu": {
"Building blocks": "Partes",
"Columns": "Columnas",
"Copy": "Copiar",
"Cut": "Cortar",
"Insert question below": "Insertar la pregunta siguiente",
"Paragraph": "Párrafo",
"Insert question above": "Insertar la pregunta anterior",
"Header": "Encabezado",
"Paste": "Pegar",
"Separator": "Separador",
"Unmapped fields": "Campos sin asignar"
},
"Editor": {
"Delete": "Borrar"
},
"UnmappedFieldsConfig": {
"Unmap fields": "Anular asignación de campos",
"Mapped": "Asignado",
"Clear": "Limpiar",
"Map fields": "Campos del mapa",
"Select All": "Seleccionar todo",
"Unmapped": "Sin asignar"
},
"FormView": {
"Publish": "Publicar",
"Publish your form?": "¿Publicar su formulario?",
"Unpublish your form?": "¿Anular la publicación de su formulario?",
"Unpublish": "Anular la publicación"
},
"WelcomeCoachingCall": {
"free coaching call": "llamada gratuita de asesoramiento",
"Schedule Call": "Programar una llamada",
"Schedule your {{freeCoachingCall}} with a member of our team.": "Programe su {{freeCoachingCall}} con un miembro de nuestro equipo.",
"Maybe Later": "Quizás más tarde",
"On the call, we'll take the time to understand your needs and tailor the call to you. We can show you the Grist basics, or start working with your data right away to build the dashboards you need.": "En la llamada, nos tomaremos el tiempo necesario para entender sus necesidades y adaptar la llamada a usted. Podemos mostrarle los conceptos básicos de Grist o empezar a trabajar con sus datos de inmediato para crear los cuadros de mando que necesita."
}
}

View File

@ -146,7 +146,24 @@
"Series_other": "Serie",
"Sort & Filter": "Ordina e filtra",
"Add referenced columns": "Aggiungi colonne referenziate",
"Reset form": "Resetta modulo"
"Reset form": "Resetta modulo",
"Submit button label": "Etichetta del pulsante di invio",
"Submit another response": "Invia un'altra risposta",
"Display button": "Mostra pulsante",
"Enter text": "Inserisci testo",
"Field title": "Titolo del campo",
"Hidden field": "Campo nascosto",
"Layout": "Layout",
"Redirect automatically after submission": "Re-indirizza automaticamente dopo l'invio",
"Redirection": "Re-indirizzamento",
"Required field": "Campo richiesto",
"Submission": "Invio",
"Success text": "Messaggio di successo",
"Table column name": "Nome della colonna della tabella",
"Enter redirect URL": "Inserisci URL di re-indirizzamento",
"Configuration": "Configurazione",
"Default field value": "Valore di default del campo",
"Field rules": "Regole per il campo"
},
"RowContextMenu": {
"Copy anchor link": "Copia link",
@ -195,7 +212,8 @@
"Raw Data": "Dati grezzi",
"Return to viewing as yourself": "Torna alla vista come te stesso",
"TOOLS": "STRUMENTI",
"Tour of this Document": "Tour di questo documento"
"Tour of this Document": "Tour di questo documento",
"API Console": "Tavola delle API"
},
"ViewConfigTab": {
"Form": "Modulo",
@ -244,7 +262,11 @@
"You do not have access to this organization's documents.": "Non hai accesso ai documenti di questa organizzazione.",
"Account deleted{{suffix}}": "Account eliminato {{suffix}}",
"Your account has been deleted.": "Il tuo account è stato cancellato.",
"Sign up": "Iscriviti"
"Sign up": "Iscriviti",
"Form not found": "Modulo non trovato",
"Build your own form": "Costruisci il tuo modulo",
"Powered by": "Creato con",
"An unknown error occurred.": "Ho incontrato un errore sconosciuto."
},
"duplicatePage": {
"Note that this does not copy data, but creates another view of the same data.": "Notare che questo non copia i dati ma crea un'altra vista dagli stessi dati.",
@ -663,7 +685,8 @@
"Document ID copied to clipboard": "ID del documento copiato",
"Ok": "OK",
"Manage Webhooks": "Gestisci web hook",
"Webhooks": "Web hook"
"Webhooks": "Web hook",
"API Console": "Tavola delle API"
},
"DocumentUsage": {
"Data Size": "Dimensione dei dati",
@ -799,7 +822,19 @@
"Add column": "Aggiungi colonna",
"Last updated by": "Ultimo aggiornamento di",
"Detect duplicates in...": "Rileva duplicati in...",
"Last updated at": "Ultimo aggiornamento alle"
"Last updated at": "Ultimo aggiornamento alle",
"Any": "Qualsiasi",
"Numeric": "Numerico",
"Text": "Testo",
"Integer": "Intero",
"Toggle": "Alterna",
"Date": "Data",
"DateTime": "Data e ora",
"Choice": "Scelta",
"Choice List": "Lista di scelte",
"Reference": "Riferimento",
"Reference List": "Lista di riferimenti",
"Attachment": "Allegato"
},
"GristDoc": {
"Import from file": "Importa da file",
@ -916,7 +951,8 @@
"Show raw data": "Mostra dati grezzi",
"Widget options": "Opzioni widget",
"Add to page": "Aggiungi a pagina",
"Collapse widget": "Compatta widget"
"Collapse widget": "Compatta widget",
"Create a form": "Crea un modulo"
},
"ViewSectionMenu": {
"(customized)": "(personalizzato)",
@ -977,7 +1013,17 @@
"modals": {
"Cancel": "Annulla",
"Ok": "OK",
"Save": "Salva"
"Save": "Salva",
"Don't show again": "Non mostrare più",
"Undo to restore": "Annulla per ripristinare",
"Got it": "Capito",
"Are you sure you want to delete this record?": "Sei sicuro di voler eliminare questo record?",
"Are you sure you want to delete these records?": "Sei sicuro di voler eliminare questi record?",
"Delete": "Elimina",
"Dismiss": "Ignora",
"Don't ask again.": "Non chiedere più.",
"Don't show again.": "Non mostrare più.",
"Don't show tips": "Non mostrare i suggerimenti"
},
"pages": {
"Duplicate Page": "Duplica pagina",
@ -1259,5 +1305,35 @@
},
"HiddenQuestionConfig": {
"Hidden fields": "Campi nascosti"
},
"Menu": {
"Insert question below": "Inserisci domanda sotto",
"Building blocks": "Componenti",
"Columns": "Colonne",
"Cut": "Taglia",
"Insert question above": "Inserisci domanda sopra",
"Paragraph": "Paragrafo",
"Paste": "Incolla",
"Separator": "Separatore",
"Unmapped fields": "Campi non mappati",
"Header": "Intestazione",
"Copy": "Copia"
},
"FormView": {
"Unpublish": "Non pubblicare",
"Publish": "Pubblica",
"Publish your form?": "Pubblicare il modulo?",
"Unpublish your form?": "Ritirare la pubblicazione del modulo?"
},
"UnmappedFieldsConfig": {
"Clear": "Pulisci",
"Map fields": "Mappa i campi",
"Mapped": "Mappato",
"Select All": "Seleziona tutto",
"Unmap fields": "Non mappare il campo",
"Unmapped": "Non mappato"
},
"Editor": {
"Delete": "Elimina"
}
}

View File

@ -5,7 +5,9 @@
"You're about to delete an API key. This will cause all future requests using this API key to be rejected. Do you still want to delete?": "APIキーを削除しようとしています。これにより、今後このAPIキーを使用したリクエストはすべて拒否されます。それでも削除しますか",
"Create": "生成",
"Remove": "削除",
"By generating an API key, you will be able to make API calls for your own account.": "APIキーを生成することで、自分のアカウントでAPIコールを行うことができるようになります。"
"By generating an API key, you will be able to make API calls for your own account.": "APIキーを生成することで、自分のアカウントでAPIコールを行うことができるようになります。",
"This API key can be used to access this account anonymously via the API.": "この API キーでAPI 経由でこのアカウントに匿名でアクセスできます。",
"This API key can be used to access your account via the API. Dont share your API key with anyone.": "この API キーはAPI 経由であなたのアカウントにアクセスするために使用できます。 API キーを誰とも共有しないでください。"
},
"breadcrumbs": {
"override": "上書き",
@ -371,7 +373,10 @@
"Save": "保存する",
"Rules for table ": "テーブルのルール ",
"Checking...": "チェック中…",
"Special Rules": "特別ルール"
"Special Rules": "特別ルール",
"View As": "として表示",
"Seed rules": "シード・ルール",
"Allow editors to edit structure (e.g. modify and delete tables, columns, layouts), and to write formulas, which give access to all data regardless of read restrictions.": "編集者による構造の編集(例:テーブル、列、レイアウトの変更や削除)、および数式の書き込みを許可し、読み取り制限に関係なくすべてのデータにアクセスできるようにする。"
},
"FieldEditor": {
"It should be impossible to save a plain data value into a formula column": "単純なデータ値を数式列に保存することは不可能なはずです",
@ -788,7 +793,8 @@
"Column {{colId}} was subsequently removed in action #{{action.actionNum}}": "列 {{colId}} がアクション #{{action.actionNum}} で削除されました",
"This row was subsequently removed in action {{action.actionNum}}": "この行はアクション #{{action.actionNum}} で削除されました",
"Table {{tableId}} was subsequently removed in action #{{actionNum}}": "テーブル {{tableId}}がアクション #{{actionNum}}で削除されました",
"All tables": "すべてのテーブル"
"All tables": "すべてのテーブル",
"Action Log failed to load": "ログファイルの読み込みに失敗しました"
},
"errorPages": {
"Account deleted{{suffix}}": "削除されたアカウント{{suffix}}",
@ -948,7 +954,8 @@
"App": {
"Description": "説明",
"Memory Error": "メモリーエラー",
"Key": "キー"
"Key": "キー",
"Translators: please translate this only when your language is ready to be offered to users": "翻訳者へ:あなたの言語がユーザーに提供できる準備が整った場合にのみ翻訳してください"
},
"OnBoardingPopups": {
"Finish": "終了",
@ -999,7 +1006,8 @@
},
"ViewAsDropdown": {
"Example Users": "ユーザー例",
"Users from table": "テーブルからユーザー"
"Users from table": "テーブルからユーザー",
"View As": "として表示"
},
"DuplicateTable": {
"Copy all data in addition to the table structure.": "テーブル構造に加えてすべてのデータをコピーします。",

View File

@ -493,7 +493,8 @@
"This document's ID (for API use):": "ID tega dokumenta (za uporabo API):",
"Manage Webhooks": "Upravljanje spletnih kljuk",
"Webhooks": "Spletne kljuke",
"Engine (experimental {{span}} change at own risk):": "Pogon (eksperimentalno {{span}} spreminjanje na lastno odgovornost):"
"Engine (experimental {{span}} change at own risk):": "Pogon (eksperimentalno {{span}} spreminjanje na lastno odgovornost):",
"API Console": "API Konzola"
},
"GridOptions": {
"Horizontal Gridlines": "Vodoravne linije",
@ -1334,5 +1335,12 @@
},
"Editor": {
"Delete": "Briši"
},
"WelcomeCoachingCall": {
"free coaching call": "brezplačen trenerski klic",
"Schedule Call": "Načrtuj klic",
"Schedule your {{freeCoachingCall}} with a member of our team.": "Dogovori se za {{freeCoachingCall}} s članom naše ekipe.",
"Maybe Later": "Mogoče kasneje",
"On the call, we'll take the time to understand your needs and tailor the call to you. We can show you the Grist basics, or start working with your data right away to build the dashboards you need.": "Med klicem si bomo vzeli čas, da bomo razumeli vaše potrebe in vam klic prilagodili. Lahko vam pokažemo osnove Grista ali pa takoj začnemo delati z vašimi podatki, da zgradimo nadzorne plošče, ki jih potrebujete."
}
}