gristlabs_grist-core/app/client/ui/AddNewTip.ts
George Gevoian cd339ce7cb (core) Forms post-release fixes and improvements
Summary:
Fixes misc. bugs with forms, updates Grist URLs on static form pages to link
to the new forms marketing page, and adds a forms announcement popup that's
shown next to the Add New button within a document.

Test Plan: Browser tests.

Reviewers: jarek

Reviewed By: jarek

Differential Revision: https://phab.getgrist.com/D4185
2024-02-14 16:38:16 -05:00

54 lines
1.6 KiB
TypeScript

import {HomeModel} from 'app/client/models/HomeModel';
import {shouldShowWelcomeQuestions} from 'app/client/ui/WelcomeQuestions';
export function attachAddNewTip(home: HomeModel): (el: Element) => void {
return () => {
const {app: {userPrefsObs}} = home;
if (shouldShowWelcomeQuestions(userPrefsObs)) {
return;
}
if (shouldShowAddNewTip(home)) {
showAddNewTip(home);
}
};
}
function shouldShowAddNewTip(home: HomeModel): boolean {
return (
// Only show if the user is an owner or editor.
home.app.isOwnerOrEditor() &&
// And the tip hasn't been shown before.
home.shouldShowAddNewTip.get() &&
// And the intro isn't being shown.
!home.showIntro.get() &&
// And the workspace loaded correctly.
home.available.get() &&
// And the current page isn't /p/trash; the Add New button is limited there.
home.currentPage.get() !== 'trash'
);
}
function showAddNewTip(home: HomeModel): void {
const addNewButton = document.querySelector('.behavioral-prompt-add-new');
if (!addNewButton) {
console.warn('AddNewTip failed to find Add New button');
return;
}
if (!isVisible(addNewButton as HTMLElement)) {
return;
}
home.app.behavioralPromptsManager.showPopup(addNewButton, 'addNew', {
popupOptions: {
placement: 'right-start',
},
onDispose: () => home.shouldShowAddNewTip.set(false),
});
}
function isVisible(element: HTMLElement): boolean {
// From https://github.com/jquery/jquery/blob/c66d4700dcf98efccb04061d575e242d28741223/src/css/hiddenVisibleSelectors.js.
return Boolean(element.offsetWidth || element.offsetHeight || element.getClientRects().length);
}