mirror of
https://github.com/gristlabs/grist-core.git
synced 2026-03-02 04:09:24 +00:00
(core) updates from grist-core
This commit is contained in:
@@ -17,7 +17,7 @@ import {TableData} from 'app/client/models/TableData';
|
||||
import {ColumnFilterCalendarView} from 'app/client/ui/ColumnFilterCalendarView';
|
||||
import {relativeDatesControl} from 'app/client/ui/ColumnFilterMenuUtils';
|
||||
import {cssInput} from 'app/client/ui/cssInput';
|
||||
import {DateRangeOptions, IDateRangeOption} from 'app/client/ui/DateRangeOptions';
|
||||
import {getDateRangeOptions, IDateRangeOption} from 'app/client/ui/DateRangeOptions';
|
||||
import {cssPinButton} from 'app/client/ui/RightPanelStyles';
|
||||
import {basicButton, primaryButton, textButton} from 'app/client/ui2018/buttons';
|
||||
import {cssLabel as cssCheckboxLabel, cssCheckboxSquare,
|
||||
@@ -176,16 +176,16 @@ export function columnFilterMenu(owner: IDisposableOwner, opts: IFilterMenuOptio
|
||||
cssLinkRow(
|
||||
testId('presets-links'),
|
||||
cssLink(
|
||||
DateRangeOptions[0].label,
|
||||
dom.on('click', () => action(DateRangeOptions[0]))
|
||||
getDateRangeOptions()[0].label,
|
||||
dom.on('click', () => action(getDateRangeOptions()[0]))
|
||||
),
|
||||
cssLink(
|
||||
DateRangeOptions[1].label,
|
||||
dom.on('click', () => action(DateRangeOptions[1]))
|
||||
getDateRangeOptions()[1].label,
|
||||
dom.on('click', () => action(getDateRangeOptions()[1]))
|
||||
),
|
||||
cssLink(
|
||||
'More ', icon('Dropdown'),
|
||||
menu(() => DateRangeOptions.map(
|
||||
menu(() => getDateRangeOptions().map(
|
||||
(option) => menuItem(() => action(option), option.label)
|
||||
), {attach: '.' + cssMenu.className})
|
||||
),
|
||||
|
||||
@@ -1,41 +1,55 @@
|
||||
import {makeT} from 'app/client/lib/localization';
|
||||
import { CURRENT_DATE, IRelativeDateSpec } from "app/common/RelativeDates";
|
||||
|
||||
const t = makeT('DateRangeOptions');
|
||||
|
||||
export interface IDateRangeOption {
|
||||
label: string;
|
||||
min: IRelativeDateSpec;
|
||||
max: IRelativeDateSpec;
|
||||
}
|
||||
|
||||
export const DateRangeOptions: IDateRangeOption[] = [{
|
||||
label: 'Today',
|
||||
min: CURRENT_DATE,
|
||||
max: CURRENT_DATE,
|
||||
}, {
|
||||
label: 'Last 7 days',
|
||||
min: [{quantity: -7, unit: 'day'}],
|
||||
max: [{quantity: -1, unit: 'day'}],
|
||||
}, {
|
||||
label: 'Next 7 days',
|
||||
min: [{quantity: 1, unit: 'day'}],
|
||||
max: [{quantity: 7, unit: 'day'}],
|
||||
}, {
|
||||
label: 'Last Week',
|
||||
min: [{quantity: -1, unit: 'week'}],
|
||||
max: [{quantity: -1, unit: 'week', endOf: true}],
|
||||
}, {
|
||||
label: 'Last 30 days',
|
||||
min: [{quantity: -30, unit: 'day'}],
|
||||
max: [{quantity: -1, unit: 'day'}],
|
||||
}, {
|
||||
label: 'This week',
|
||||
min: [{quantity: 0, unit: 'week'}],
|
||||
max: [{quantity: 0, unit: 'week', endOf: true}],
|
||||
}, {
|
||||
label: 'This month',
|
||||
min: [{quantity: 0, unit: 'month'}],
|
||||
max: [{quantity: 0, unit: 'month', endOf: true}],
|
||||
}, {
|
||||
label: 'This year',
|
||||
min: [{quantity: 0, unit: 'year'}],
|
||||
max: [{quantity: 0, unit: 'year', endOf: true}],
|
||||
}];
|
||||
export function getDateRangeOptions(): IDateRangeOption[] {
|
||||
return [
|
||||
{
|
||||
label: t('Today'),
|
||||
min: CURRENT_DATE,
|
||||
max: CURRENT_DATE,
|
||||
},
|
||||
{
|
||||
label: t('Last 7 days'),
|
||||
min: [{quantity: -7, unit: 'day'}],
|
||||
max: [{quantity: -1, unit: 'day'}],
|
||||
},
|
||||
{
|
||||
label: t('Next 7 days'),
|
||||
min: [{quantity: 1, unit: 'day'}],
|
||||
max: [{quantity: 7, unit: 'day'}],
|
||||
},
|
||||
{
|
||||
label: t('Last Week'),
|
||||
min: [{quantity: -1, unit: 'week'}],
|
||||
max: [{quantity: -1, unit: 'week', endOf: true}],
|
||||
},
|
||||
{
|
||||
label: t('Last 30 days'),
|
||||
min: [{quantity: -30, unit: 'day'}],
|
||||
max: [{quantity: -1, unit: 'day'}],
|
||||
},
|
||||
{
|
||||
label: t('This week'),
|
||||
min: [{quantity: 0, unit: 'week'}],
|
||||
max: [{quantity: 0, unit: 'week', endOf: true}],
|
||||
},
|
||||
{
|
||||
label: t('This month'),
|
||||
min: [{quantity: 0, unit: 'month'}],
|
||||
max: [{quantity: 0, unit: 'month', endOf: true}],
|
||||
},
|
||||
{
|
||||
label: t('This year'),
|
||||
min: [{quantity: 0, unit: 'year'}],
|
||||
max: [{quantity: 0, unit: 'year', endOf: true}],
|
||||
},
|
||||
];
|
||||
}
|
||||
@@ -85,7 +85,7 @@ export const GristTooltips: Record<Tooltip, TooltipContentFunc> = {
|
||||
t('Try out changes in a copy, then decide whether to replace the original with your edits.')
|
||||
),
|
||||
dom('div',
|
||||
cssLink({href: commonUrls.helpTryingOutChanges, target: '_blank'}, 'Learn more.'),
|
||||
cssLink({href: commonUrls.helpTryingOutChanges, target: '_blank'}, t('Learn more.')),
|
||||
),
|
||||
...args,
|
||||
),
|
||||
|
||||
@@ -303,7 +303,7 @@ export function downloadDocModal(doc: Document, pageModel: DocPageModel) {
|
||||
const selected = Observable.create<DownloadOption>(owner, 'full');
|
||||
|
||||
return [
|
||||
cssModalTitle(`Download document`),
|
||||
cssModalTitle(t(`Download document`)),
|
||||
cssRadioCheckboxOptions(
|
||||
radioCheckboxOption(selected, 'full', t("Download full document and history")),
|
||||
radioCheckboxOption(selected, 'nohistory', t("Remove document history (can significantly reduce file size)")),
|
||||
@@ -311,7 +311,7 @@ export function downloadDocModal(doc: Document, pageModel: DocPageModel) {
|
||||
),
|
||||
cssModalButtons(
|
||||
dom.domComputed(use =>
|
||||
bigPrimaryButtonLink(`Download`, hooks.maybeModifyLinkAttrs({
|
||||
bigPrimaryButtonLink(t(`Download`), hooks.maybeModifyLinkAttrs({
|
||||
href: pageModel.appModel.api.getDocAPI(doc.id).getDownloadUrl({
|
||||
template: use(selected) === "template",
|
||||
removeHistory: use(selected) === "nohistory" || use(selected) === "template",
|
||||
@@ -325,7 +325,7 @@ export function downloadDocModal(doc: Document, pageModel: DocPageModel) {
|
||||
testId('download-button-link'),
|
||||
),
|
||||
),
|
||||
bigBasicButton('Cancel', dom.on('click', () => {
|
||||
bigBasicButton(t('Cancel'), dom.on('click', () => {
|
||||
ctl.close();
|
||||
}))
|
||||
)
|
||||
|
||||
@@ -8,6 +8,7 @@ import {cardPopup, cssPopupBody, cssPopupButtons, cssPopupCloseButton,
|
||||
import {icon} from 'app/client/ui2018/icons';
|
||||
import {getGristConfig} from 'app/common/urlUtils';
|
||||
import {dom, styled} from 'grainjs';
|
||||
import { commonUrls } from 'app/common/gristUrls';
|
||||
|
||||
const t = makeT('WelcomeCoachingCall');
|
||||
|
||||
@@ -103,7 +104,7 @@ We can show you the Grist basics, or start working with your data right away to
|
||||
logTelemetryEvent('clickedScheduleCoachingCall');
|
||||
}),
|
||||
{
|
||||
href: getGristConfig().freeCoachingCallUrl,
|
||||
href: commonUrls.freeCoachingCall,
|
||||
target: '_blank',
|
||||
},
|
||||
testId('popup-primary-button'),
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import {get as getBrowserGlobals} from 'app/client/lib/browserGlobals';
|
||||
import {setupLocale} from 'app/client/lib/localization';
|
||||
import {AppModel, TopAppModelImpl} from 'app/client/models/AppModel';
|
||||
import {AppModel, TopAppModelImpl, TopAppModelOptions} from 'app/client/models/AppModel';
|
||||
import {reportError, setUpErrorHandling} from 'app/client/models/errors';
|
||||
import {buildSnackbarDom} from 'app/client/ui/NotifyUI';
|
||||
import {addViewportTag} from 'app/client/ui/viewport';
|
||||
@@ -14,10 +14,12 @@ const G = getBrowserGlobals('document', 'window');
|
||||
* Sets up the application model, error handling, and global styles, and replaces
|
||||
* the DOM body with the result of calling `buildAppPage`.
|
||||
*/
|
||||
export function createAppPage(buildAppPage: (appModel: AppModel) => DomContents) {
|
||||
export function createAppPage(
|
||||
buildAppPage: (appModel: AppModel) => DomContents,
|
||||
modelOptions: TopAppModelOptions = {}) {
|
||||
setUpErrorHandling();
|
||||
|
||||
const topAppModel = TopAppModelImpl.create(null, {});
|
||||
const topAppModel = TopAppModelImpl.create(null, {}, undefined, modelOptions);
|
||||
|
||||
addViewportTag();
|
||||
attachCssRootVars(topAppModel.productFlavor);
|
||||
|
||||
@@ -7,7 +7,7 @@ import {pagePanels} from 'app/client/ui/PagePanels';
|
||||
import {createTopBarHome} from 'app/client/ui/TopBar';
|
||||
import {bigBasicButtonLink, bigPrimaryButtonLink} from 'app/client/ui2018/buttons';
|
||||
import {theme, vars} from 'app/client/ui2018/cssVars';
|
||||
import {getPageTitleSuffix} from 'app/common/gristUrls';
|
||||
import {commonUrls, getPageTitleSuffix} from 'app/common/gristUrls';
|
||||
import {getGristConfig} from 'app/common/urlUtils';
|
||||
import {dom, DomElementArg, makeTestId, observable, styled} from 'grainjs';
|
||||
|
||||
@@ -94,7 +94,7 @@ export function createNotFoundPage(appModel: AppModel, message?: string) {
|
||||
})),
|
||||
cssButtonWrap(bigPrimaryButtonLink(t("Go to main page"), testId('error-primary-btn'),
|
||||
urlState().setLinkUrl({}))),
|
||||
cssButtonWrap(bigBasicButtonLink(t("Contact support"), {href: 'https://getgrist.com/contact'})),
|
||||
cssButtonWrap(bigBasicButtonLink(t("Contact support"), {href: commonUrls.contactSupport})),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ export function createOtherErrorPage(appModel: AppModel, message?: string) {
|
||||
t('There was an unknown error.')),
|
||||
cssButtonWrap(bigPrimaryButtonLink(t("Go to main page"), testId('error-primary-btn'),
|
||||
urlState().setLinkUrl({}))),
|
||||
cssButtonWrap(bigBasicButtonLink(t("Contact support"), {href: 'https://getgrist.com/contact'})),
|
||||
cssButtonWrap(bigBasicButtonLink(t("Contact support"), {href: commonUrls.contactSupport})),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user