@adminide-stack/yantra-mobile 12.0.141-alpha.1 → 12.0.141
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/features/agent-chat/NativeAgentChat.js +21 -4
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/chat/ApprovalCard.js +353 -0
- package/lib/features/chat/ApprovalCard.js.map +1 -0
- package/lib/features/chat/AskUserCard.js +9 -2
- package/lib/features/chat/AskUserCard.js.map +1 -1
- package/lib/features/chat/askUser.js +25 -3
- package/lib/features/chat/askUser.js.map +1 -1
- package/lib/features/chat/queuedFollowUpRows.js +13 -0
- package/lib/features/chat/queuedFollowUpRows.js.map +1 -0
- package/lib/features/devices/bodyComposition.js +116 -0
- package/lib/features/devices/bodyComposition.js.map +1 -0
- package/lib/features/devices/readings.js.map +1 -1
- package/lib/features/devices/session.js +22 -2
- package/lib/features/devices/session.js.map +1 -1
- package/lib/features/discover/DiscoverArticle.js +105 -92
- package/lib/features/discover/DiscoverArticle.js.map +1 -1
- package/lib/features/discover/DiscoverFeed.js +97 -48
- package/lib/features/discover/DiscoverFeed.js.map +1 -1
- package/lib/features/discover/DiscoverFollowUp.js +135 -0
- package/lib/features/discover/DiscoverFollowUp.js.map +1 -0
- package/lib/features/discover/DiscoverSidebar.js +555 -0
- package/lib/features/discover/DiscoverSidebar.js.map +1 -0
- package/lib/features/discover/DiscoverSkeletons.js +123 -0
- package/lib/features/discover/DiscoverSkeletons.js.map +1 -0
- package/lib/features/discover/DiscoverStoryCards.js +193 -87
- package/lib/features/discover/DiscoverStoryCards.js.map +1 -1
- package/lib/features/discover/followUpQuery.js +42 -0
- package/lib/features/discover/followUpQuery.js.map +1 -0
- package/lib/features/discover/markets.js +37 -0
- package/lib/features/discover/markets.js.map +1 -0
- package/lib/features/discover/useDiscoverSidebar.js +148 -0
- package/lib/features/discover/useDiscoverSidebar.js.map +1 -0
- package/lib/features/discover/weather.js +42 -0
- package/lib/features/discover/weather.js.map +1 -0
- package/lib/features/expenses/ExpensesAgentChatPane.js +1 -1
- package/lib/features/expenses/ExpensesAgentChatPane.js.map +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js +1 -1
- package/lib/features/inbox/InboxAgentChatPane.js.map +1 -1
- package/lib/features/job-search/JobSearchAgentChatPane.js +1 -0
- package/lib/features/job-search/JobSearchAgentChatPane.js.map +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js +1 -1
- package/lib/features/local-services/LocalServicesAgentChatPane.js.map +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js +1 -1
- package/lib/features/movies/MoviesAgentChatPane.js.map +1 -1
- package/lib/features/notion/NotionBlockSheets.js +206 -0
- package/lib/features/notion/NotionBlockSheets.js.map +1 -0
- package/lib/features/notion/NotionBlockView.js +36 -0
- package/lib/features/notion/NotionBlockView.js.map +1 -0
- package/lib/features/notion/NotionCommentsSheet.js +461 -0
- package/lib/features/notion/NotionCommentsSheet.js.map +1 -0
- package/lib/features/notion/NotionConnectionsSheet.js +244 -0
- package/lib/features/notion/NotionConnectionsSheet.js.map +1 -0
- package/lib/features/notion/NotionHistorySheet.js +439 -0
- package/lib/features/notion/NotionHistorySheet.js.map +1 -0
- package/lib/features/notion/NotionMediaBlocks.js +803 -0
- package/lib/features/notion/NotionMediaBlocks.js.map +1 -0
- package/lib/features/notion/NotionMentionSheet.js +279 -0
- package/lib/features/notion/NotionMentionSheet.js.map +1 -0
- package/lib/features/notion/NotionPageMenu.js +585 -0
- package/lib/features/notion/NotionPageMenu.js.map +1 -0
- package/lib/features/notion/NotionPageTree.js +220 -0
- package/lib/features/notion/NotionPageTree.js.map +1 -0
- package/lib/features/notion/NotionPageView.js +1253 -152
- package/lib/features/notion/NotionPageView.js.map +1 -1
- package/lib/features/notion/NotionShareSheet.js +606 -0
- package/lib/features/notion/NotionShareSheet.js.map +1 -0
- package/lib/features/notion/NotionSheets.js +87 -15
- package/lib/features/notion/NotionSheets.js.map +1 -1
- package/lib/features/notion/NotionSidebarSections.js +492 -0
- package/lib/features/notion/NotionSidebarSections.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js +659 -0
- package/lib/features/notion/NotionWorkspaceAdmin.js.map +1 -0
- package/lib/features/notion/NotionWorkspaceView.js +257 -45
- package/lib/features/notion/NotionWorkspaceView.js.map +1 -1
- package/lib/features/notion/database/DatabaseCells.js +554 -0
- package/lib/features/notion/database/DatabaseCells.js.map +1 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js +792 -0
- package/lib/features/notion/database/DatabaseDateLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseLayouts.js +461 -0
- package/lib/features/notion/database/DatabaseLayouts.js.map +1 -0
- package/lib/features/notion/database/DatabaseSheets.js +791 -0
- package/lib/features/notion/database/DatabaseSheets.js.map +1 -0
- package/lib/features/notion/database/NotionDatabaseView.js +817 -0
- package/lib/features/notion/database/NotionDatabaseView.js.map +1 -0
- package/lib/features/notion/database/RowPropertiesPanel.js +162 -0
- package/lib/features/notion/database/RowPropertiesPanel.js.map +1 -0
- package/lib/features/notion/database/chartData.js +89 -0
- package/lib/features/notion/database/chartData.js.map +1 -0
- package/lib/features/notion/database/chartView.js +112 -0
- package/lib/features/notion/database/chartView.js.map +1 -0
- package/lib/features/notion/database/connectorButton.js +33 -0
- package/lib/features/notion/database/connectorButton.js.map +1 -0
- package/lib/features/notion/database/databaseCalc.js +208 -0
- package/lib/features/notion/database/databaseCalc.js.map +1 -0
- package/lib/features/notion/database/databaseCalendar.js +157 -0
- package/lib/features/notion/database/databaseCalendar.js.map +1 -0
- package/lib/features/notion/database/databaseCsv.js +98 -0
- package/lib/features/notion/database/databaseCsv.js.map +1 -0
- package/lib/features/notion/database/databaseCsvActions.js +58 -0
- package/lib/features/notion/database/databaseCsvActions.js.map +1 -0
- package/lib/features/notion/database/databaseFilter.js +473 -0
- package/lib/features/notion/database/databaseFilter.js.map +1 -0
- package/lib/features/notion/database/databaseFormula.js +1072 -0
- package/lib/features/notion/database/databaseFormula.js.map +1 -0
- package/lib/features/notion/database/databaseGroup.js +151 -0
- package/lib/features/notion/database/databaseGroup.js.map +1 -0
- package/lib/features/notion/database/databaseRollup.js +58 -0
- package/lib/features/notion/database/databaseRollup.js.map +1 -0
- package/lib/features/notion/database/databaseTimeline.js +156 -0
- package/lib/features/notion/database/databaseTimeline.js.map +1 -0
- package/lib/features/notion/database/databaseView.js +1188 -0
- package/lib/features/notion/database/databaseView.js.map +1 -0
- package/lib/features/notion/database/databaseViews.js +310 -0
- package/lib/features/notion/database/databaseViews.js.map +1 -0
- package/lib/features/notion/database/relationSource.js +92 -0
- package/lib/features/notion/database/relationSource.js.map +1 -0
- package/lib/features/notion/database/uniqueId.js +17 -0
- package/lib/features/notion/database/uniqueId.js.map +1 -0
- package/lib/features/notion/database/useNotionDatabase.js +617 -0
- package/lib/features/notion/database/useNotionDatabase.js.map +1 -0
- package/lib/features/notion/notionAgentRunStatus.js +39 -0
- package/lib/features/notion/notionAgentRunStatus.js.map +1 -0
- package/lib/features/notion/notionCodeLanguages.js +112 -0
- package/lib/features/notion/notionCodeLanguages.js.map +1 -0
- package/lib/features/notion/notionComments.js +86 -0
- package/lib/features/notion/notionComments.js.map +1 -0
- package/lib/features/notion/notionConnections.js +74 -0
- package/lib/features/notion/notionConnections.js.map +1 -0
- package/lib/features/notion/notionDocuments.js +453 -1
- package/lib/features/notion/notionDocuments.js.map +1 -1
- package/lib/features/notion/notionEditorModel.js +142 -7
- package/lib/features/notion/notionEditorModel.js.map +1 -1
- package/lib/features/notion/notionMarkdownShortcuts.js +51 -0
- package/lib/features/notion/notionMarkdownShortcuts.js.map +1 -0
- package/lib/features/notion/notionMedia.js +119 -0
- package/lib/features/notion/notionMedia.js.map +1 -0
- package/lib/features/notion/notionMentionDate.js +32 -0
- package/lib/features/notion/notionMentionDate.js.map +1 -0
- package/lib/features/notion/notionMentionOptions.js +162 -0
- package/lib/features/notion/notionMentionOptions.js.map +1 -0
- package/lib/features/notion/notionNotesAgent.js +445 -0
- package/lib/features/notion/notionNotesAgent.js.map +1 -0
- package/lib/features/notion/notionPageAccess.js +168 -0
- package/lib/features/notion/notionPageAccess.js.map +1 -0
- package/lib/features/notion/notionPageActions.js +138 -0
- package/lib/features/notion/notionPageActions.js.map +1 -0
- package/lib/features/notion/notionPageHistory.js +154 -0
- package/lib/features/notion/notionPageHistory.js.map +1 -0
- package/lib/features/notion/notionPageKinds.js +200 -0
- package/lib/features/notion/notionPageKinds.js.map +1 -0
- package/lib/features/notion/notionRecents.js +48 -0
- package/lib/features/notion/notionRecents.js.map +1 -0
- package/lib/features/notion/notionRichText.js +177 -0
- package/lib/features/notion/notionRichText.js.map +1 -0
- package/lib/features/notion/notionRichTitle.js +336 -0
- package/lib/features/notion/notionRichTitle.js.map +1 -0
- package/lib/features/notion/useNotionWorkspace.js +272 -13
- package/lib/features/notion/useNotionWorkspace.js.map +1 -1
- package/lib/features/notion/usePageActions.js +155 -0
- package/lib/features/notion/usePageActions.js.map +1 -0
- package/lib/features/resume/ResumeAgentChatPane.js +1 -1
- package/lib/features/resume/ResumeAgentChatPane.js.map +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js +1 -1
- package/lib/features/shopping/ShoppingAgentChatPane.js.map +1 -1
- package/lib/features/study/StudyAgentChatPane.js +1 -1
- package/lib/features/study/StudyAgentChatPane.js.map +1 -1
- package/lib/features/travel/TravelAgentChatPane.js +1 -1
- package/lib/features/travel/TravelAgentChatPane.js.map +1 -1
- package/lib/features/webbuilder/WebBuilderExperience.js +40 -8
- package/lib/features/webbuilder/WebBuilderExperience.js.map +1 -1
- package/lib/features/webbuilder/buildFragments.js +1 -1
- package/lib/features/webbuilder/buildFragments.js.map +1 -1
- package/lib/features/webbuilder/codeFiles.js +302 -0
- package/lib/features/webbuilder/codeFiles.js.map +1 -0
- package/lib/features/webbuilder/codeHighlight.js +209 -0
- package/lib/features/webbuilder/codeHighlight.js.map +1 -0
- package/lib/features/webbuilder/components/CodeView.js +682 -52
- package/lib/features/webbuilder/components/CodeView.js.map +1 -1
- package/lib/features/webbuilder/components/PreviewScreen.js +59 -38
- package/lib/features/webbuilder/components/PreviewScreen.js.map +1 -1
- package/lib/features/webbuilder/components/ProjectChat.js +3 -3
- package/lib/features/webbuilder/components/ProjectChat.js.map +1 -1
- package/lib/features/webbuilder/stepLabels.js +68 -0
- package/lib/features/webbuilder/stepLabels.js.map +1 -0
- package/lib/hooks/useHostChatSteering.js +45 -0
- package/lib/hooks/useHostChatSteering.js.map +1 -0
- package/lib/screens/Chat/index.js +2 -12
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/Devices/index.js +205 -3
- package/lib/screens/Devices/index.js.map +1 -1
- package/lib/screens/ExpensesNative/useExpensesHostChat.js +25 -5
- package/lib/screens/ExpensesNative/useExpensesHostChat.js.map +1 -1
- package/lib/screens/InboxNative/useInboxHostChat.js +25 -5
- package/lib/screens/InboxNative/useInboxHostChat.js.map +1 -1
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js +25 -5
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js +25 -5
- package/lib/screens/LocalServicesNative/useLocalServicesHostChat.js.map +1 -1
- package/lib/screens/MoviesNative/useMoviesHostChat.js +25 -5
- package/lib/screens/MoviesNative/useMoviesHostChat.js.map +1 -1
- package/lib/screens/NotionPage/index.js +2 -2
- package/lib/screens/NotionPage/index.js.map +1 -1
- package/lib/screens/ResumeNative/useResumeHostChat.js +25 -5
- package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
- package/lib/screens/ShoppingNative/useShoppingHostChat.js +25 -5
- package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
- package/lib/screens/StudyNative/useStudyHostChat.js +25 -5
- package/lib/screens/StudyNative/useStudyHostChat.js.map +1 -1
- package/lib/screens/TravelNative/useTravelHostChat.js +25 -5
- package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js +222 -0
- package/lib/screens/WebBuilderNative/codeWorkspaceApi.js.map +1 -0
- package/lib/screens/WebBuilderNative/index.js +1 -1
- package/lib/screens/WebBuilderNative/index.js.map +1 -1
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js +126 -4
- package/lib/screens/WebBuilderNative/sandboxProxyApi.js.map +1 -1
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js +120 -11
- package/lib/screens/WebBuilderNative/useWebBuilderHost.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NotionDatabaseView.js","sources":["../../../../src/features/notion/database/NotionDatabaseView.tsx"],"sourcesContent":["/**\n * Native database page - the web containers/DatabasePage on a phone: the database title, its\n * views as tabs (+ New view; long-press a tab to rename, duplicate or delete it), the toolbar\n * (search, filter, sort, properties, view options, select, New) and the active view's layout.\n *\n * Rows open as pages (`database_row` blocks open in the page editor). Cell edits, schema edits and\n * deletes are optimistic (useNotionDatabase); deletes offer Undo. Property renames / type changes\n * page in every row first and migrate each row's value, and every view that names the property is\n * updated too - like the web.\n */\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { ActivityIndicator, Pressable, ScrollView, Share, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { Ionicons } from '@expo/vector-icons';\nimport { useMutation } from '@apollo/client';\nimport { StackActions, useNavigation } from '@react-navigation/native';\nimport { useSafeAreaInsets } from 'react-native-safe-area-context';\nimport { NATIVE_NOTION_DUPLICATE_BLOCK } from '../notionDocuments';\nimport { NotionToast, TextPromptDialog, useNotionToast } from '../NotionPageMenu';\nimport { notionPalette } from '../notionTheme';\nimport { EmptyState, ui } from '../notionUi';\nimport { recordRecent } from '../notionRecents';\nimport { CellEditorSheet, rowTitle } from './DatabaseCells';\nimport { BoardLayout, GalleryLayout, ListLayout, TableLayout, type LayoutProps } from './DatabaseLayouts';\nimport { CalendarLayout, ChartLayout, TimelineLayout } from './DatabaseDateLayouts';\nimport {\n ChoiceSheet,\n FilterSheet,\n NewViewSheet,\n PropertiesSheet,\n PropertyEditorSheet,\n SortSheet,\n ViewOptionsSheet,\n} from './DatabaseSheets';\nimport { applyRowFilter, activeConditions, dropConditionProperty, renameConditionProperty } from './databaseFilter';\nimport { databaseCsv, planDatabaseCsvImport } from './databaseCsvActions';\nimport { makeCellGetter } from './databaseFormula';\nimport { rollupResolver } from './databaseRollup';\nimport { RelationProvider, useRelationSource } from './relationSource';\nimport { prefillForGroup } from './databaseGroup';\nimport {\n addSchemaProperty,\n changeSchemaPropertyType,\n convertCellValue,\n dropSortProperty,\n groupRows,\n normalizeStatusOptions,\n removeSchemaProperty,\n renameRowPatch,\n renameSchemaProperty,\n renameSortProperty,\n selectValueToCell,\n sortRows,\n uniquePropertyName,\n type SortSpec,\n} from './databaseView';\nimport {\n DEFAULT_VIEW_ID,\n mergeViewSettings,\n parseHiddenProperties,\n parseViewWidths,\n parseVisibleProperties,\n remapSettingsProperty,\n renameViewProperty,\n serializeVisibleProperties,\n shownProperties,\n tableDisplayColumns,\n uniqueViewName,\n type ViewSettings,\n type ViewType,\n} from './databaseViews';\nimport { useNotionDatabase, type DatabaseColumn, type DatabaseRow, type DatabaseViewModel } from './useNotionDatabase';\n\ntype PickDocument = (opts: {\n type?: string | string[];\n copyToCacheDirectory?: boolean;\n}) => Promise<{ canceled?: boolean; assets?: Array<{ uri: string; name?: string }> | null }>;\n\nlet pickDocument: PickDocument | null = null;\ntry {\n // eslint-disable-next-line @typescript-eslint/no-var-requires, global-require\n pickDocument = require('expo-document-picker').getDocumentAsync ?? null;\n} catch {\n pickDocument = null;\n}\n\ntype Sheet =\n | 'filter'\n | 'sort'\n | 'properties'\n | 'options'\n | 'newView'\n | 'viewMenu'\n | 'rowMenu'\n | 'moveTo'\n | 'renameView'\n | 'renameDb'\n | 'dbMenu'\n | 'pasteCsv'\n | null;\n\nconst VIEW_ICONS: Record<ViewType, React.ComponentProps<typeof Ionicons>['name']> = {\n table: 'grid-outline',\n board: 'albums-outline',\n calendar: 'calendar-outline',\n timeline: 'git-commit-outline',\n gallery: 'images-outline',\n list: 'list-outline',\n chart: 'bar-chart-outline',\n};\n\nexport function NotionDatabaseView({\n orgName,\n blockId,\n isDark,\n}: {\n orgName: string | null;\n blockId: string;\n isDark: boolean;\n}) {\n const palette = notionPalette(isDark);\n const navigation = useNavigation<any>();\n const insets = useSafeAreaInsets();\n const db = useNotionDatabase(blockId);\n const { toast, show: showToast, hide: hideToast } = useNotionToast();\n const [duplicateBlock] = useMutation(NATIVE_NOTION_DUPLICATE_BLOCK);\n\n const [sheet, setSheet] = useState<Sheet>(null);\n const [search, setSearch] = useState('');\n const [searching, setSearching] = useState(false);\n const [selecting, setSelecting] = useState(false);\n const [selected, setSelected] = useState<Set<string>>(new Set());\n const [menuRow, setMenuRow] = useState<DatabaseRow | null>(null);\n const [menuView, setMenuView] = useState<DatabaseViewModel | null>(null);\n const [editing, setEditing] = useState<{ rowId: string; column: string } | null>(null);\n const [editProperty, setEditProperty] = useState<{ name: string | null } | null>(null);\n const [refreshing, setRefreshing] = useState(false);\n\n const view = db.activeView;\n const columns = db.columns;\n const relations = useRelationSource(columns, blockId, db.rows, db.schema);\n const getValue = useMemo(\n () => makeCellGetter(columns, new Date(), rollupResolver(columns, relations)),\n [columns, relations],\n );\n\n const workspaceId = db.block?.workspaceId ?? null;\n useEffect(() => {\n if (workspaceId) recordRecent(workspaceId, { id: blockId, title: db.title, icon: db.icon });\n }, [blockId, db.icon, db.title, workspaceId]);\n\n // ---- Rows on screen: filter, search, sort ----\n const shownRows = useMemo(() => {\n const filtered = applyRowFilter(db.rows, columns, { search }, view.conditions, { getValue });\n return sortRows(filtered, view.sorts, columns, getValue);\n }, [columns, db.rows, getValue, search, view.conditions, view.sorts]);\n\n // ---- Properties shown by the view ----\n const visible = useMemo(() => parseVisibleProperties(view.properties, columns), [columns, view.properties]);\n const hidden = useMemo(() => parseHiddenProperties(view.properties), [view.properties]);\n const widths = useMemo(() => parseViewWidths(view.properties), [view.properties]);\n const tableColumns = useMemo(\n () => tableDisplayColumns(columns, visible, widths, hidden),\n [columns, hidden, visible, widths],\n );\n const visibleNames = useMemo(\n () => tableColumns.filter((c) => c.type !== 'title').map((c) => c.name),\n [tableColumns],\n );\n const cardProps = useMemo(\n () => shownProperties(columns, visible, { exclude: view.groupBy ? [view.groupBy] : [] }),\n [columns, view.groupBy, visible],\n );\n const nonTitleNames = useMemo(() => columns.filter((c) => c.type !== 'title').map((c) => c.name), [columns]);\n\n /** Open `next` once the current sheet has closed (iOS can't present a modal while one is dismissing). */\n const thenOpen = useCallback((next: Sheet) => {\n setSheet(null);\n setTimeout(() => setSheet(next), 450);\n }, []);\n\n const report = useCallback((err: string | null) => err && showToast({ message: err }), [showToast]);\n\n const changeView = useCallback(\n (change: Parameters<typeof db.changeView>[1]) => db.changeView(view.id, change).then(report),\n [db, report, view.id],\n );\n const changeSettings = (patch: Partial<ViewSettings>) =>\n changeView({ settings: mergeViewSettings(view.settings, patch) });\n const setVisibleNames = (names: string[]) =>\n changeView({ properties: serializeVisibleProperties(names, widths, nonTitleNames) });\n\n // ---- Navigation ----\n const openRow = useCallback(\n (row: DatabaseRow) =>\n navigation.dispatch(StackActions.push('MainStack.NotionPage', { orgName, blockId: row.id })),\n [navigation, orgName],\n );\n\n // ---- Rows ----\n const addRow = useCallback(\n async (group?: { column: DatabaseColumn; value: string | null }, values?: Record<string, unknown>) => {\n const initial: Record<string, unknown> = { ...values };\n if (group) {\n const v = prefillForGroup(group.column, group.value);\n if (v !== undefined) initial[group.column.name] = v;\n }\n const res = await db.addRow(initial);\n if (res.error) showToast({ message: `Couldn't add a row. ${res.error}` });\n else if (res.id) {\n const created = { id: res.id, properties: initial } as DatabaseRow;\n const title = columns.find((c) => c.type === 'title');\n if (title) setEditing({ rowId: created.id, column: title.name });\n }\n },\n [columns, db, showToast],\n );\n\n const deleteRows = useCallback(\n async (ids: string[]) => {\n if (!ids.length) return;\n const { deleted, error } = await db.deleteRows(ids);\n setSelected(new Set());\n setSelecting(false);\n if (error) showToast({ message: `Couldn't delete ${ids.length - deleted.length} row(s). ${error}` });\n else\n showToast({\n message: deleted.length === 1 ? 'Row deleted' : `${deleted.length} rows deleted`,\n actionLabel: 'Undo',\n onAction: () => db.restoreRows(deleted),\n });\n },\n [db, showToast],\n );\n\n const duplicateRow = useCallback(\n async (row: DatabaseRow) => {\n try {\n await duplicateBlock({ variables: { blockId: row.id, includeChildren: true }, errorPolicy: 'none' });\n await db.reloadRows();\n showToast({ message: 'Row duplicated' });\n } catch (err) {\n showToast({ message: `Couldn't duplicate. ${(err as Error)?.message ?? ''}` });\n }\n },\n [db, duplicateBlock, showToast],\n );\n\n const toggleCheckbox = useCallback(\n (row: DatabaseRow, column: DatabaseColumn) =>\n db.updateCell(row.id, column.name, !(row.properties?.[column.name] === true)).then(report),\n [db, report],\n );\n\n // ---- Schema edits (web DatabasePage rename / type change / delete) ----\n const forEachView = useCallback(\n async (fn: (v: DatabaseViewModel) => Parameters<typeof db.changeView>[1] | null) => {\n for (const v of db.views) {\n const change = fn(v);\n if (change) await db.changeView(v.id, change);\n }\n },\n [db],\n );\n\n const renameProperty = useCallback(\n async (from: string, to: string): Promise<string | null> => {\n const result = renameSchemaProperty(db.schema, from, to);\n if (!result.ok) return result.error;\n const all = await db.loadAll();\n const err = await db.saveSchema(result.schema);\n if (err) return err;\n await Promise.allSettled(\n all.map((r) => {\n const patch = renameRowPatch(r.properties, from, to);\n return patch ? db.patchRow(r.id, patch) : null;\n }),\n );\n await forEachView((v) => {\n const layout = renameViewProperty(v, from, to) ?? {};\n const sorts = renameSortProperty(v.sorts, from, to);\n const conditions = renameConditionProperty(v.conditions, from, to);\n const change = {\n ...(layout as object),\n ...(JSON.stringify(sorts) !== JSON.stringify(v.sorts) ? { sorts } : {}),\n ...(JSON.stringify(conditions) !== JSON.stringify(v.conditions) ? { conditions } : {}),\n };\n return Object.keys(change).length ? change : null;\n });\n setEditProperty({ name: to });\n return null;\n },\n [db, forEachView],\n );\n\n const changePropertyType = useCallback(\n async (name: string, type: string): Promise<string | null> => {\n const before = db.schema[name];\n const result = changeSchemaPropertyType(db.schema, name, type);\n if (!result.ok) return result.error;\n const all = await db.loadAll();\n const err = await db.saveSchema(result.schema);\n if (err) return err;\n const fromType = String(before?.type ?? 'text');\n await Promise.allSettled(\n all.map((r) => {\n const value = r.properties?.[name];\n if (value === undefined) return null;\n const next = convertCellValue(value, fromType, type);\n return JSON.stringify(next) === JSON.stringify(value) ? null : db.patchRow(r.id, { [name]: next });\n }),\n );\n return null;\n },\n [db],\n );\n\n const deleteProperty = useCallback(\n async (name: string) => {\n const result = removeSchemaProperty(db.schema, name);\n if (!result.ok) {\n showToast({ message: result.error });\n return;\n }\n const err = await db.saveSchema(result.schema);\n if (err) {\n showToast({ message: err });\n return;\n }\n setEditProperty(null);\n await forEachView((v) => {\n const sorts = dropSortProperty(v.sorts, name);\n const conditions = dropConditionProperty(v.conditions, name);\n const settings = remapSettingsProperty(v.settings, name, null);\n const change: Parameters<typeof db.changeView>[1] = {};\n if (sorts.length !== v.sorts.length) change.sorts = sorts;\n if (conditions.length !== v.conditions.length) change.conditions = conditions;\n if (settings) change.settings = settings;\n if (v.groupBy === name) change.groupBy = null;\n return Object.keys(change).length ? change : null;\n });\n showToast({ message: `Deleted “${name}”` });\n },\n [db, forEachView, showToast],\n );\n\n const createProperty = useCallback(\n async (name: string, type: string): Promise<string | null> => {\n const finalName = name || uniquePropertyName(db.schema);\n const result = addSchemaProperty(db.schema, finalName, type);\n if (!result.ok) return result.error;\n const err = await db.saveSchema(result.schema);\n if (err) return err;\n if (visible) setVisibleNames([...visibleNames, finalName]);\n return null;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [db, visible, visibleNames],\n );\n\n // ---- CSV (web \"Export → CSV\" / \"Merge with CSV\") ----\n const exportCsv = useCallback(async () => {\n const all = db.hasMore ? await db.loadAll() : db.rows;\n const rows = sortRows(\n applyRowFilter(all, columns, { search }, view.conditions, { getValue }),\n view.sorts,\n columns,\n getValue,\n );\n const csv = databaseCsv(rows, tableColumns, getValue);\n try {\n await Share.share({ title: `${db.title || 'Database'}.csv`, message: csv });\n } catch {\n /* dismissed */\n }\n }, [columns, db, getValue, search, tableColumns, view.conditions, view.sorts]);\n\n const importCsv = useCallback(\n async (text: string) => {\n const plan = planDatabaseCsvImport(text, db.schema);\n if (!plan.ok) {\n showToast({ message: plan.error });\n return;\n }\n if (plan.schemaChanged) {\n const err = await db.saveSchema(plan.schema);\n if (err) {\n showToast({ message: `Couldn't add the CSV columns. ${err}` });\n return;\n }\n }\n showToast({ message: `Importing ${plan.rows.length} rows…` });\n let created = 0;\n for (const properties of plan.rows) {\n const res = await db.addRow(properties);\n if (res.id) created += 1;\n }\n showToast({\n message:\n created === plan.rows.length\n ? `Imported ${created} ${created === 1 ? 'row' : 'rows'}`\n : `Imported ${created} of ${plan.rows.length} rows`,\n });\n },\n [db, showToast],\n );\n\n const importCsvFile = useCallback(async () => {\n if (!pickDocument) {\n setSheet('pasteCsv');\n return;\n }\n try {\n const picked = await pickDocument({\n type: ['text/csv', 'text/comma-separated-values', 'text/plain', 'public.comma-separated-values-text'],\n copyToCacheDirectory: true,\n });\n const asset = picked.canceled ? null : picked.assets?.[0];\n if (!asset) return;\n const text = await (await fetch(asset.uri)).text();\n await importCsv(text);\n } catch (err) {\n showToast({ message: `Couldn't read that file. ${(err as Error)?.message ?? ''}`.trim() });\n }\n }, [importCsv, showToast]);\n\n // ---- Board \"Move to\" ----\n const groupColumn = view.groupBy ? columns.find((c) => c.name === view.groupBy) : undefined;\n const moveTargets = useMemo(() => {\n if (!groupColumn || (groupColumn.type !== 'select' && groupColumn.type !== 'status')) return [];\n const options =\n groupColumn.type === 'status' ? normalizeStatusOptions(groupColumn.options) : (groupColumn.options ?? []);\n return groupRows([], groupColumn.name, options);\n }, [groupColumn]);\n\n const refresh = useCallback(async () => {\n setRefreshing(true);\n await db.refresh();\n setRefreshing(false);\n }, [db]);\n\n const editingRow = editing ? (db.rows.find((r) => r.id === editing.rowId) ?? null) : null;\n const editingColumn = editing ? (columns.find((c) => c.name === editing.column) ?? null) : null;\n const propertyColumn = editProperty?.name ? (columns.find((c) => c.name === editProperty.name) ?? null) : null;\n const activeFilterCount = activeConditions(view.conditions, columns).length;\n\n if (db.loading && !db.rows.length && !db.block) {\n return (\n <View style={[styles.center, { backgroundColor: palette.bg }]}>\n <ActivityIndicator color={palette.textMuted} />\n </View>\n );\n }\n if (db.error && !db.block) {\n return (\n <View style={[ui.flex, { backgroundColor: palette.bg }]}>\n <EmptyState\n palette={palette}\n icon=\"cloud-offline-outline\"\n title=\"Couldn't open this database\"\n text={db.error}\n action={{ label: 'Try again', onPress: refresh }}\n />\n </View>\n );\n }\n\n const layoutProps: LayoutProps = {\n rows: shownRows,\n columns: tableColumns,\n allColumns: columns,\n getValue,\n groupBy: view.groupBy,\n settings: view.settings,\n isDark,\n palette,\n selecting,\n selected,\n onToggleSelect: (row) =>\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(row.id)) next.delete(row.id);\n else next.add(row.id);\n return next;\n }),\n onOpenRow: openRow,\n onRowMenu: (row) => {\n setMenuRow(row);\n setSheet('rowMenu');\n },\n onEditCell: (row, column) => setEditing({ rowId: row.id, column: column.name }),\n onToggleCheckbox: toggleCheckbox,\n onAddRow: addRow,\n hasMore: db.hasMore,\n loadingMore: db.loadingMore,\n onLoadMore: db.loadMore,\n refreshing,\n onRefresh: refresh,\n };\n\n const dateProps = {\n ...layoutProps,\n rowProps: cardProps,\n onChangeSettings: changeSettings,\n onAddRowWith: (values: Record<string, unknown>) => addRow(undefined, values),\n };\n\n const body = () => {\n switch (view.type) {\n case 'board':\n return <BoardLayout {...layoutProps} cardProps={cardProps} />;\n case 'gallery':\n return <GalleryLayout {...layoutProps} cardProps={cardProps} />;\n case 'list':\n return <ListLayout {...layoutProps} rowProps={cardProps} />;\n case 'table':\n return <TableLayout {...layoutProps} />;\n case 'calendar':\n return <CalendarLayout {...dateProps} />;\n case 'timeline':\n return <TimelineLayout {...dateProps} />;\n case 'chart':\n return <ChartLayout {...dateProps} />;\n default:\n return <TableLayout {...layoutProps} />;\n }\n };\n\n const total = db.totalCount ?? db.rows.length;\n\n return (\n <RelationProvider source={relations}>\n <View style={[ui.flex, { backgroundColor: palette.bg }]}>\n {/* Title */}\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Rename database\"\n onPress={() => setSheet('renameDb')}\n style={styles.titleRow}\n >\n <Text style={styles.icon}>{db.icon || '🗂️'}</Text>\n <View style={ui.flex}>\n <Text\n numberOfLines={2}\n style={[styles.title, { color: db.title ? palette.text : palette.textFaint }]}\n >\n {db.title || 'Untitled database'}\n </Text>\n <Text style={[styles.meta, { color: palette.textMuted }]}>\n {`${total} ${total === 1 ? 'row' : 'rows'}${\n shownRows.length !== db.rows.length ? ` · ${shownRows.length} shown` : ''\n }`}\n </Text>\n </View>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Database actions\"\n onPress={() => setSheet('dbMenu')}\n hitSlop={8}\n style={[styles.more, { backgroundColor: palette.fill }]}\n >\n <Ionicons name=\"ellipsis-horizontal\" size={18} color={palette.text} />\n </Pressable>\n </Pressable>\n\n {/* View tabs */}\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.tabs}\n style={styles.tabsBar}\n >\n {db.views.map((v) => {\n const on = v.id === view.id;\n return (\n <Pressable\n key={v.id}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: on }}\n onPress={() => db.setActiveViewId(v.id)}\n onLongPress={() => {\n setMenuView(v);\n setSheet('viewMenu');\n }}\n style={[\n styles.tab,\n { backgroundColor: on ? palette.card : 'transparent' },\n on && styles.tabOn,\n ]}\n >\n <Ionicons\n name={VIEW_ICONS[v.type]}\n size={15}\n color={on ? palette.text : palette.textMuted}\n />\n <Text style={[styles.tabText, { color: on ? palette.text : palette.textMuted }]}>\n {v.name}\n </Text>\n </Pressable>\n );\n })}\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"New view\"\n onPress={() => setSheet('newView')}\n style={styles.tab}\n >\n <Ionicons name=\"add\" size={18} color={palette.textMuted} />\n </Pressable>\n </ScrollView>\n\n {/* Toolbar */}\n {selecting ? (\n <View style={[styles.toolbar, { borderBottomColor: palette.hairline }]}>\n <Text style={[styles.selCount, { color: palette.text }]}>{`${selected.size} selected`}</Text>\n <View style={ui.flex} />\n <Pressable\n accessibilityRole=\"button\"\n onPress={() =>\n setSelected(\n selected.size === shownRows.length\n ? new Set()\n : new Set(shownRows.map((r) => r.id)),\n )\n }\n style={[styles.tool, { backgroundColor: palette.fill }]}\n >\n <Text style={[styles.toolText, { color: palette.text }]}>\n {selected.size === shownRows.length ? 'None' : 'All'}\n </Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n disabled={!selected.size}\n onPress={() => deleteRows([...selected])}\n style={[\n styles.tool,\n { backgroundColor: palette.dangerSoft, opacity: selected.size ? 1 : 0.5 },\n ]}\n >\n <Ionicons name=\"trash-outline\" size={16} color={palette.danger} />\n <Text style={[styles.toolText, { color: palette.danger }]}>Delete</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n onPress={() => {\n setSelecting(false);\n setSelected(new Set());\n }}\n style={styles.tool}\n >\n <Text style={[styles.toolText, { color: palette.primary }]}>Done</Text>\n </Pressable>\n </View>\n ) : (\n <View style={[styles.toolbarWrap, { borderBottomColor: palette.hairline }]}>\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.toolbar}\n >\n <ToolButton\n palette={palette}\n icon=\"search\"\n active={searching || Boolean(search)}\n onPress={() => setSearching((s) => !s)}\n />\n <ToolButton\n palette={palette}\n icon=\"filter\"\n label={activeFilterCount ? `Filter · ${activeFilterCount}` : 'Filter'}\n active={activeFilterCount > 0}\n onPress={() => setSheet('filter')}\n />\n <ToolButton\n palette={palette}\n icon=\"swap-vertical\"\n label={view.sorts.length ? `Sort · ${view.sorts.length}` : 'Sort'}\n active={view.sorts.length > 0}\n onPress={() => setSheet('sort')}\n />\n <ToolButton\n palette={palette}\n icon=\"eye-outline\"\n label=\"Properties\"\n onPress={() => setSheet('properties')}\n />\n <ToolButton\n palette={palette}\n icon=\"options-outline\"\n label=\"View\"\n onPress={() => setSheet('options')}\n />\n <ToolButton\n palette={palette}\n icon=\"checkmark-circle-outline\"\n label=\"Select\"\n onPress={() => setSelecting(true)}\n />\n </ScrollView>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"New row\"\n onPress={() => addRow()}\n style={[styles.newButton, { backgroundColor: palette.primary }]}\n >\n <Ionicons name=\"add\" size={18} color={palette.onPrimary} />\n <Text style={[styles.newText, { color: palette.onPrimary }]}>New</Text>\n </Pressable>\n </View>\n )}\n {searching ? (\n <View style={[styles.search, { backgroundColor: palette.fill }]}>\n <Ionicons name=\"search\" size={16} color={palette.textMuted} />\n <TextInput\n value={search}\n onChangeText={setSearch}\n autoFocus\n placeholder=\"Search rows\"\n placeholderTextColor={palette.textFaint}\n clearButtonMode=\"while-editing\"\n style={[styles.searchInput, { color: palette.text }]}\n />\n </View>\n ) : null}\n\n <View style={[ui.flex, { paddingBottom: insets.bottom }]}>\n {db.rows.length || db.loading ? (\n body()\n ) : (\n <EmptyState\n palette={palette}\n icon=\"grid-outline\"\n title=\"No rows yet\"\n text=\"Add the first row to this database.\"\n action={{ label: 'New row', onPress: () => addRow() }}\n />\n )}\n </View>\n\n {/* Sheets */}\n <FilterSheet\n visible={sheet === 'filter'}\n palette={palette}\n columns={columns}\n conditions={view.conditions}\n onChange={(conditions) => changeView({ conditions })}\n onClose={() => setSheet(null)}\n />\n <SortSheet\n visible={sheet === 'sort'}\n palette={palette}\n columns={columns}\n sorts={view.sorts}\n onChange={(sorts: SortSpec[]) => changeView({ sorts })}\n onClose={() => setSheet(null)}\n />\n <PropertiesSheet\n visible={sheet === 'properties'}\n palette={palette}\n columns={columns}\n visibleNames={visibleNames}\n onChangeVisible={setVisibleNames}\n onEdit={(c) => setEditProperty({ name: c.name })}\n onAdd={() => setEditProperty({ name: null })}\n onClose={() => {\n setEditProperty(null);\n setSheet(null);\n }}\n >\n <PropertyEditorSheet\n visible={editProperty !== null}\n palette={palette}\n column={propertyColumn}\n isNew={editProperty?.name === null}\n calculation={\n propertyColumn\n ? (view.settings.calculations as Record<string, string> | undefined)?.[\n propertyColumn.name\n ]\n : undefined\n }\n onClose={() => setEditProperty(null)}\n onRename={(to) =>\n propertyColumn ? renameProperty(propertyColumn.name, to) : Promise.resolve(null)\n }\n onChangeType={(type) =>\n propertyColumn ? changePropertyType(propertyColumn.name, type) : Promise.resolve(null)\n }\n onDelete={() => propertyColumn && deleteProperty(propertyColumn.name)}\n onCalculation={(kind) => {\n if (!propertyColumn) return;\n const calcs = { ...((view.settings.calculations as Record<string, string>) ?? {}) };\n if (kind === 'none') delete calcs[propertyColumn.name];\n else calcs[propertyColumn.name] = kind;\n changeSettings({ calculations: Object.keys(calcs).length ? calcs : undefined });\n }}\n onCreate={createProperty}\n />\n </PropertiesSheet>\n <ViewOptionsSheet\n visible={sheet === 'options'}\n palette={palette}\n type={view.type}\n groupBy={view.groupBy}\n settings={view.settings}\n columns={columns}\n onChangeType={(type) => changeView({ type })}\n onChangeGroupBy={(groupBy) => changeView({ groupBy })}\n onChangeSettings={changeSettings}\n onClose={() => setSheet(null)}\n />\n <NewViewSheet\n visible={sheet === 'newView'}\n palette={palette}\n columns={columns}\n onCreate={(input) =>\n db.addView({ name: input.name, type: input.type, groupBy: input.groupBy ?? null })\n }\n onClose={() => setSheet(null)}\n />\n <ChoiceSheet\n visible={sheet === 'viewMenu'}\n title={menuView?.name ?? 'View'}\n palette={palette}\n choices={[\n { value: 'rename', label: 'Rename', icon: 'pencil-outline' as const },\n { value: 'duplicate', label: 'Duplicate', icon: 'copy-outline' as const },\n ...(menuView && menuView.id !== DEFAULT_VIEW_ID && db.views.length > 1\n ? [{ value: 'delete', label: 'Delete view', icon: 'trash-outline' as const }]\n : []),\n ]}\n onClose={() => setSheet(null)}\n onPick={async (action) => {\n const target = menuView;\n if (!target) return;\n if (action === 'rename') {\n thenOpen('renameView');\n return;\n }\n setSheet(null);\n if (action === 'duplicate') {\n report(await db.duplicateView(target, uniqueViewName(db.views, target.name)));\n } else if (action === 'delete') {\n report(await db.removeView(target.id));\n }\n }}\n />\n <ChoiceSheet\n visible={sheet === 'rowMenu'}\n title={menuRow ? rowTitle(menuRow) || 'Untitled' : 'Row'}\n palette={palette}\n choices={[\n { value: 'open', label: 'Open', icon: 'open-outline' as const },\n { value: 'rename', label: 'Rename', icon: 'pencil-outline' as const },\n ...(moveTargets.length\n ? [{ value: 'move', label: `Move to…`, icon: 'swap-horizontal-outline' as const }]\n : []),\n { value: 'duplicate', label: 'Duplicate', icon: 'copy-outline' as const },\n { value: 'select', label: 'Select', icon: 'checkmark-circle-outline' as const },\n { value: 'delete', label: 'Delete', icon: 'trash-outline' as const },\n ]}\n onClose={() => setSheet(null)}\n onPick={(action) => {\n const row = menuRow;\n if (!row) return;\n if (action === 'move') {\n thenOpen('moveTo');\n return;\n }\n setSheet(null);\n if (action === 'open') openRow(row);\n else if (action === 'rename') {\n const title = columns.find((c) => c.type === 'title');\n if (title) setTimeout(() => setEditing({ rowId: row.id, column: title.name }), 350);\n } else if (action === 'duplicate') duplicateRow(row);\n else if (action === 'select') {\n setSelecting(true);\n setSelected(new Set([row.id]));\n } else if (action === 'delete') deleteRows([row.id]);\n }}\n />\n <ChoiceSheet\n visible={sheet === 'moveTo'}\n title=\"Move to\"\n palette={palette}\n value={menuRow && groupColumn ? (menuRow.properties?.[groupColumn.name]?.name ?? null) : null}\n choices={moveTargets.map((g) => ({ value: g.value ?? '__none', label: g.name }))}\n onClose={() => setSheet(null)}\n onPick={(value) => {\n setSheet(null);\n if (!menuRow || !groupColumn) return;\n db.updateCell(\n menuRow.id,\n groupColumn.name,\n value === '__none' ? null : selectValueToCell(value),\n ).then(report);\n }}\n />\n <TextPromptDialog\n visible={sheet === 'renameView'}\n palette={palette}\n title=\"Rename view\"\n initial={menuView?.name ?? ''}\n confirmLabel=\"Rename\"\n onClose={() => setSheet(null)}\n onConfirm={async (name) => {\n if (!menuView) return;\n const err = await db.changeView(menuView.id, { name: name.trim() });\n if (err) throw new Error(err);\n }}\n />\n <TextPromptDialog\n visible={sheet === 'renameDb'}\n palette={palette}\n title=\"Rename database\"\n initial={db.title}\n placeholder=\"Untitled database\"\n confirmLabel=\"Rename\"\n onClose={() => setSheet(null)}\n onConfirm={async (name) => {\n const err = await db.renameDatabase(name.trim());\n if (err) throw new Error(err);\n await db.refresh();\n }}\n />\n <ChoiceSheet\n visible={sheet === 'dbMenu'}\n title={db.title || 'Database'}\n palette={palette}\n choices={[\n { value: 'rename', label: 'Rename', icon: 'pencil-outline' as const },\n { value: 'export', label: 'Export CSV', icon: 'share-outline' as const },\n ...(pickDocument\n ? [\n {\n value: 'importFile',\n label: 'Import CSV file',\n icon: 'document-attach-outline' as const,\n },\n ]\n : []),\n { value: 'paste', label: 'Paste CSV', icon: 'clipboard-outline' as const },\n ]}\n onClose={() => setSheet(null)}\n onPick={(action) => {\n if (action === 'rename' || action === 'paste') {\n thenOpen(action === 'rename' ? 'renameDb' : 'pasteCsv');\n return;\n }\n setSheet(null);\n // Let the sheet finish closing before the share sheet / file picker opens.\n setTimeout(() => (action === 'export' ? exportCsv() : importCsvFile()), 450);\n }}\n />\n <TextPromptDialog\n visible={sheet === 'pasteCsv'}\n palette={palette}\n title=\"Import CSV\"\n message=\"Paste CSV with a header row. Columns that match a property fill it; new ones become properties.\"\n placeholder={'Name,Status\\nFirst task,Done'}\n multiline\n confirmLabel=\"Import\"\n onClose={() => setSheet(null)}\n onConfirm={(text) => {\n setSheet(null);\n importCsv(text);\n }}\n />\n <CellEditorSheet\n visible={Boolean(editingRow && editingColumn)}\n row={editingRow}\n column={editingColumn}\n schema={db.schema}\n getValue={getValue}\n isDark={isDark}\n palette={palette}\n onClose={() => setEditing(null)}\n onSave={(value) =>\n editingRow && editingColumn\n ? db.updateCell(editingRow.id, editingColumn.name, value)\n : Promise.resolve(null)\n }\n onSaveSchema={db.saveSchema}\n />\n <NotionToast toast={toast} palette={palette} onHide={hideToast} />\n </View>\n </RelationProvider>\n );\n}\n\nfunction ToolButton({\n palette,\n icon,\n label,\n active,\n onPress,\n}: {\n palette: ReturnType<typeof notionPalette>;\n icon: React.ComponentProps<typeof Ionicons>['name'];\n label?: string;\n active?: boolean;\n onPress: () => void;\n}) {\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={label ?? icon}\n onPress={onPress}\n style={[styles.tool, { backgroundColor: active ? palette.primarySoft : palette.fill }]}\n >\n <Ionicons name={icon} size={16} color={active ? palette.primary : palette.text} />\n {label ? (\n <Text style={[styles.toolText, { color: active ? palette.primary : palette.text }]}>{label}</Text>\n ) : null}\n </Pressable>\n );\n}\n\nconst styles = StyleSheet.create({\n center: { flex: 1, alignItems: 'center', justifyContent: 'center' },\n titleRow: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 12,\n paddingHorizontal: 16,\n paddingTop: 14,\n paddingBottom: 8,\n },\n icon: { fontSize: 30 },\n more: { width: 34, height: 34, borderRadius: 10, alignItems: 'center', justifyContent: 'center' },\n title: { fontSize: 24, fontWeight: '800', letterSpacing: -0.3 },\n meta: { fontSize: 13, marginTop: 2 },\n tabsBar: { flexGrow: 0 },\n tabs: { paddingHorizontal: 12, gap: 4, alignItems: 'center', paddingVertical: 4 },\n tab: { flexDirection: 'row', alignItems: 'center', gap: 6, paddingHorizontal: 12, height: 34, borderRadius: 10 },\n tabOn: {\n shadowColor: '#000',\n shadowOpacity: 0.06,\n shadowRadius: 4,\n shadowOffset: { width: 0, height: 1 },\n elevation: 1,\n },\n tabText: { fontSize: 14, fontWeight: '600' },\n toolbarWrap: {\n flexDirection: 'row',\n alignItems: 'center',\n borderBottomWidth: StyleSheet.hairlineWidth,\n paddingRight: 12,\n },\n toolbar: { flexDirection: 'row', alignItems: 'center', gap: 8, paddingHorizontal: 12, paddingVertical: 8 },\n tool: { flexDirection: 'row', alignItems: 'center', gap: 5, paddingHorizontal: 11, height: 34, borderRadius: 10 },\n toolText: { fontSize: 14, fontWeight: '600' },\n newButton: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 4,\n paddingHorizontal: 12,\n height: 34,\n borderRadius: 10,\n },\n newText: { fontSize: 14, fontWeight: '700' },\n selCount: { fontSize: 15, fontWeight: '700' },\n search: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: 8,\n marginHorizontal: 12,\n marginTop: 8,\n paddingHorizontal: 12,\n height: 40,\n borderRadius: 12,\n },\n searchInput: { flex: 1, fontSize: 16, paddingVertical: 0 },\n});\n"],"names":["_a","_b"],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import {jsx,jsxs}from'react/jsx-runtime';import {useState,useMemo,useEffect}from'react';import {View,StyleSheet,Pressable,Text}from'react-native';import {Ionicons}from'@expo/vector-icons';import {useQuery,useMutation}from'@apollo/client/index.js';import {NATIVE_NOTION_BLOCK,NATIVE_NOTION_UPDATE_BLOCK}from'../notionDocuments.js';import {serverErrorText}from'../notionPageActions.js';import {CellValue,CellEditorSheet}from'./DatabaseCells.js';import {propertyIcon}from'./DatabaseSheets.js';import {makeCellGetter}from'./databaseFormula.js';import {rollupResolver}from'./databaseRollup.js';import {useRelationSource,RelationProvider}from'./relationSource.js';import {isEmptyCell}from'./databaseView.js';import {columnsFromSchema}from'./useNotionDatabase.js';var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b || (b = {}))
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
function RowPropertiesPanel({
|
|
21
|
+
rowId,
|
|
22
|
+
databaseId,
|
|
23
|
+
properties,
|
|
24
|
+
meta,
|
|
25
|
+
isDark,
|
|
26
|
+
palette,
|
|
27
|
+
onError
|
|
28
|
+
}) {
|
|
29
|
+
var _a, _b, _c, _d, _e, _f;
|
|
30
|
+
const dbQuery = useQuery(NATIVE_NOTION_BLOCK, {
|
|
31
|
+
variables: {
|
|
32
|
+
input: {
|
|
33
|
+
blockId: databaseId
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
fetchPolicy: "cache-and-network"
|
|
37
|
+
});
|
|
38
|
+
const [updateBlock] = useMutation(NATIVE_NOTION_UPDATE_BLOCK);
|
|
39
|
+
const [schemaOverride, setSchemaOverride] = useState(null);
|
|
40
|
+
const schema = (_d = schemaOverride != null ? schemaOverride : (_c = (_b = (_a = dbQuery.data) == null ? void 0 : _a.getBlock) == null ? void 0 : _b.properties) == null ? void 0 : _c.schema) != null ? _d : {};
|
|
41
|
+
const columns = useMemo(() => columnsFromSchema(schema).filter((c) => c.type !== "title"), [schema]);
|
|
42
|
+
const [local, setLocal] = useState(properties);
|
|
43
|
+
useEffect(() => setLocal(properties), [properties]);
|
|
44
|
+
const row = {
|
|
45
|
+
id: rowId,
|
|
46
|
+
properties: local,
|
|
47
|
+
createdTime: (_e = meta == null ? void 0 : meta.createdTime) != null ? _e : void 0,
|
|
48
|
+
lastEditedTime: (_f = meta == null ? void 0 : meta.lastEditedTime) != null ? _f : void 0
|
|
49
|
+
};
|
|
50
|
+
const allColumns = useMemo(() => columnsFromSchema(schema), [schema]);
|
|
51
|
+
const selfRows = useMemo(() => [{
|
|
52
|
+
id: rowId,
|
|
53
|
+
properties: local
|
|
54
|
+
}], [local, rowId]);
|
|
55
|
+
const relations = useRelationSource(allColumns, databaseId, selfRows, schema);
|
|
56
|
+
const getValue = useMemo(() => makeCellGetter(allColumns, /* @__PURE__ */ new Date(), rollupResolver(allColumns, relations)), [allColumns, relations]);
|
|
57
|
+
const [editing, setEditing] = useState(null);
|
|
58
|
+
const save = async (name, value) => {
|
|
59
|
+
const previous = local[name];
|
|
60
|
+
setLocal((p) => __spreadProps(__spreadValues({}, p), {
|
|
61
|
+
[name]: value
|
|
62
|
+
}));
|
|
63
|
+
try {
|
|
64
|
+
await updateBlock({
|
|
65
|
+
variables: {
|
|
66
|
+
input: {
|
|
67
|
+
id: rowId,
|
|
68
|
+
properties: {
|
|
69
|
+
[name]: value
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
errorPolicy: "none"
|
|
74
|
+
});
|
|
75
|
+
return null;
|
|
76
|
+
} catch (err) {
|
|
77
|
+
setLocal((p) => __spreadProps(__spreadValues({}, p), {
|
|
78
|
+
[name]: previous
|
|
79
|
+
}));
|
|
80
|
+
const msg = serverErrorText(err);
|
|
81
|
+
onError == null ? void 0 : onError(msg);
|
|
82
|
+
return msg;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const saveSchema = async (next) => {
|
|
86
|
+
setSchemaOverride(next);
|
|
87
|
+
try {
|
|
88
|
+
await updateBlock({
|
|
89
|
+
variables: {
|
|
90
|
+
input: {
|
|
91
|
+
id: databaseId,
|
|
92
|
+
properties: {
|
|
93
|
+
schema: next
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
errorPolicy: "none"
|
|
98
|
+
});
|
|
99
|
+
return null;
|
|
100
|
+
} catch (err) {
|
|
101
|
+
setSchemaOverride(null);
|
|
102
|
+
return serverErrorText(err);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
if (!columns.length) return null;
|
|
106
|
+
return /* @__PURE__ */ jsx(RelationProvider, { source: relations, children: /* @__PURE__ */ jsxs(View, { style: [styles.panel, {
|
|
107
|
+
borderBottomColor: palette.hairline
|
|
108
|
+
}], children: [
|
|
109
|
+
columns.map((c) => /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "button", accessibilityLabel: `Edit ${c.name}`, onPress: () => c.type === "checkbox" ? save(c.name, !(local[c.name] === true)) : setEditing(c), style: ({
|
|
110
|
+
pressed
|
|
111
|
+
}) => [styles.row, pressed && {
|
|
112
|
+
backgroundColor: palette.pressed
|
|
113
|
+
}], children: [
|
|
114
|
+
/* @__PURE__ */ jsxs(View, { style: styles.name, children: [
|
|
115
|
+
/* @__PURE__ */ jsx(Ionicons, { name: propertyIcon(c.type), size: 15, color: palette.textMuted }),
|
|
116
|
+
/* @__PURE__ */ jsx(Text, { numberOfLines: 1, style: [styles.nameText, {
|
|
117
|
+
color: palette.textMuted
|
|
118
|
+
}], children: c.name })
|
|
119
|
+
] }),
|
|
120
|
+
/* @__PURE__ */ jsxs(View, { style: styles.value, children: [
|
|
121
|
+
/* @__PURE__ */ jsx(CellValue, { row, column: c, getValue, isDark, palette, wrap: true, onToggleCheckbox: c.type === "checkbox" ? () => save(c.name, !(local[c.name] === true)) : void 0 }),
|
|
122
|
+
c.type !== "checkbox" && isEmptyCell(getValue(row, c), c.type) ? /* @__PURE__ */ jsx(Text, { style: [styles.empty, {
|
|
123
|
+
color: palette.textFaint
|
|
124
|
+
}], children: "Empty" }) : null
|
|
125
|
+
] })
|
|
126
|
+
] }, c.name)),
|
|
127
|
+
/* @__PURE__ */ jsx(CellEditorSheet, { visible: Boolean(editing), row, column: editing, schema, getValue, isDark, palette, onClose: () => setEditing(null), onSave: (value) => editing ? save(editing.name, value) : Promise.resolve(null), onSaveSchema: saveSchema })
|
|
128
|
+
] }) });
|
|
129
|
+
}
|
|
130
|
+
const styles = StyleSheet.create({
|
|
131
|
+
panel: {
|
|
132
|
+
paddingVertical: 6,
|
|
133
|
+
marginBottom: 8,
|
|
134
|
+
borderBottomWidth: StyleSheet.hairlineWidth
|
|
135
|
+
},
|
|
136
|
+
row: {
|
|
137
|
+
flexDirection: "row",
|
|
138
|
+
alignItems: "flex-start",
|
|
139
|
+
minHeight: 38,
|
|
140
|
+
paddingVertical: 8,
|
|
141
|
+
borderRadius: 8
|
|
142
|
+
},
|
|
143
|
+
name: {
|
|
144
|
+
width: "38%",
|
|
145
|
+
flexDirection: "row",
|
|
146
|
+
alignItems: "center",
|
|
147
|
+
gap: 6,
|
|
148
|
+
paddingRight: 8
|
|
149
|
+
},
|
|
150
|
+
nameText: {
|
|
151
|
+
fontSize: 14,
|
|
152
|
+
flexShrink: 1
|
|
153
|
+
},
|
|
154
|
+
value: {
|
|
155
|
+
flex: 1,
|
|
156
|
+
minHeight: 20,
|
|
157
|
+
justifyContent: "center"
|
|
158
|
+
},
|
|
159
|
+
empty: {
|
|
160
|
+
fontSize: 14
|
|
161
|
+
}
|
|
162
|
+
});export{RowPropertiesPanel};//# sourceMappingURL=RowPropertiesPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RowPropertiesPanel.js","sources":["../../../../src/features/notion/database/RowPropertiesPanel.tsx"],"sourcesContent":["/**\n * The property list at the top of a database row's page - the web RowPropertiesHeader on a phone\n * (\"Assignee Olivia / Due Jan 26 / Status ● In progress\"). Reads the parent database's schema and\n * lists every property except the title: type icon + name, then the value. Tap edits it with the\n * same cell editor as the database views; checkboxes toggle; computed properties are read-only.\n * Writes are optimistic (`updateBlock` with only the changed property, reverted on failure); new\n * select options go into the database schema.\n */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport { Pressable, StyleSheet, Text, View } from 'react-native';\nimport { Ionicons } from '@expo/vector-icons';\nimport { useMutation, useQuery } from '@apollo/client';\nimport { NATIVE_NOTION_BLOCK, NATIVE_NOTION_UPDATE_BLOCK } from '../notionDocuments';\nimport { serverErrorText } from '../notionPageActions';\nimport type { NotionPalette } from '../notionTheme';\nimport { CellEditorSheet, CellValue } from './DatabaseCells';\nimport { propertyIcon } from './DatabaseSheets';\nimport { makeCellGetter } from './databaseFormula';\nimport { rollupResolver } from './databaseRollup';\nimport { RelationProvider, useRelationSource } from './relationSource';\nimport { isEmptyCell, type DatabaseSchema } from './databaseView';\nimport { columnsFromSchema, type DatabaseColumn, type DatabaseRow } from './useNotionDatabase';\n\nexport function RowPropertiesPanel({\n rowId,\n databaseId,\n properties,\n meta,\n isDark,\n palette,\n onError,\n}: {\n rowId: string;\n databaseId: string;\n properties: Record<string, unknown>;\n meta?: { createdTime?: string | null; lastEditedTime?: string | null };\n isDark: boolean;\n palette: NotionPalette;\n onError?: (message: string) => void;\n}) {\n const dbQuery = useQuery<{ getBlock?: { id: string; properties?: Record<string, any> | null } | null }>(\n NATIVE_NOTION_BLOCK,\n { variables: { input: { blockId: databaseId } }, fetchPolicy: 'cache-and-network' },\n );\n const [updateBlock] = useMutation(NATIVE_NOTION_UPDATE_BLOCK);\n const [schemaOverride, setSchemaOverride] = useState<DatabaseSchema | null>(null);\n const schema: DatabaseSchema =\n schemaOverride ?? (dbQuery.data?.getBlock?.properties?.schema as DatabaseSchema | undefined) ?? {};\n const columns = useMemo(() => columnsFromSchema(schema).filter((c) => c.type !== 'title'), [schema]);\n const [local, setLocal] = useState<Record<string, unknown>>(properties);\n useEffect(() => setLocal(properties), [properties]);\n const row: DatabaseRow = {\n id: rowId,\n properties: local as Record<string, any>,\n createdTime: meta?.createdTime ?? undefined,\n lastEditedTime: meta?.lastEditedTime ?? undefined,\n };\n const allColumns = useMemo(() => columnsFromSchema(schema), [schema]);\n const selfRows = useMemo(() => [{ id: rowId, properties: local as Record<string, any> }], [local, rowId]);\n const relations = useRelationSource(allColumns, databaseId, selfRows, schema);\n const getValue = useMemo(\n () => makeCellGetter(allColumns, new Date(), rollupResolver(allColumns, relations)),\n [allColumns, relations],\n );\n const [editing, setEditing] = useState<DatabaseColumn | null>(null);\n\n const save = async (name: string, value: unknown): Promise<string | null> => {\n const previous = local[name];\n setLocal((p) => ({ ...p, [name]: value }));\n try {\n await updateBlock({\n variables: { input: { id: rowId, properties: { [name]: value } } },\n errorPolicy: 'none',\n });\n return null;\n } catch (err) {\n setLocal((p) => ({ ...p, [name]: previous }));\n const msg = serverErrorText(err);\n onError?.(msg);\n return msg;\n }\n };\n\n const saveSchema = async (next: DatabaseSchema): Promise<string | null> => {\n setSchemaOverride(next);\n try {\n await updateBlock({\n variables: { input: { id: databaseId, properties: { schema: next } } },\n errorPolicy: 'none',\n });\n return null;\n } catch (err) {\n setSchemaOverride(null);\n return serverErrorText(err);\n }\n };\n\n if (!columns.length) return null;\n\n return (\n <RelationProvider source={relations}>\n <View style={[styles.panel, { borderBottomColor: palette.hairline }]}>\n {columns.map((c) => (\n <Pressable\n key={c.name}\n accessibilityRole=\"button\"\n accessibilityLabel={`Edit ${c.name}`}\n onPress={() =>\n c.type === 'checkbox' ? save(c.name, !(local[c.name] === true)) : setEditing(c)\n }\n style={({ pressed }) => [styles.row, pressed && { backgroundColor: palette.pressed }]}\n >\n <View style={styles.name}>\n <Ionicons name={propertyIcon(c.type)} size={15} color={palette.textMuted} />\n <Text numberOfLines={1} style={[styles.nameText, { color: palette.textMuted }]}>\n {c.name}\n </Text>\n </View>\n <View style={styles.value}>\n <CellValue\n row={row}\n column={c}\n getValue={getValue}\n isDark={isDark}\n palette={palette}\n wrap\n onToggleCheckbox={\n c.type === 'checkbox' ? () => save(c.name, !(local[c.name] === true)) : undefined\n }\n />\n {c.type !== 'checkbox' && isEmptyCell(getValue(row, c), c.type) ? (\n <Text style={[styles.empty, { color: palette.textFaint }]}>Empty</Text>\n ) : null}\n </View>\n </Pressable>\n ))}\n <CellEditorSheet\n visible={Boolean(editing)}\n row={row}\n column={editing}\n schema={schema}\n getValue={getValue}\n isDark={isDark}\n palette={palette}\n onClose={() => setEditing(null)}\n onSave={(value) => (editing ? save(editing.name, value) : Promise.resolve(null))}\n onSaveSchema={saveSchema}\n />\n </View>\n </RelationProvider>\n );\n}\n\nconst styles = StyleSheet.create({\n panel: { paddingVertical: 6, marginBottom: 8, borderBottomWidth: StyleSheet.hairlineWidth },\n row: { flexDirection: 'row', alignItems: 'flex-start', minHeight: 38, paddingVertical: 8, borderRadius: 8 },\n name: { width: '38%', flexDirection: 'row', alignItems: 'center', gap: 6, paddingRight: 8 },\n nameText: { fontSize: 14, flexShrink: 1 },\n value: { flex: 1, minHeight: 20, justifyContent: 'center' },\n empty: { fontSize: 14 },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import {numberValue,OPTION_COLORS,cellDisplayText,multiSelectNames,selectName}from'./databaseView.js';const NO_VALUE = "No value";
|
|
2
|
+
const finite = (n) => typeof n === "number" && Number.isFinite(n) ? n : 0;
|
|
3
|
+
const fmt = (n) => Number.isInteger(n) ? String(n) : n.toFixed(1).replace(/\.0$/, "");
|
|
4
|
+
function defaultChartColor(index) {
|
|
5
|
+
const palette = OPTION_COLORS.filter((c) => c !== "gray");
|
|
6
|
+
return palette[index % palette.length];
|
|
7
|
+
}
|
|
8
|
+
function groupKeysOf(value, type) {
|
|
9
|
+
var _a;
|
|
10
|
+
switch (type) {
|
|
11
|
+
case "select":
|
|
12
|
+
case "status":
|
|
13
|
+
return [(_a = selectName(value)) != null ? _a : NO_VALUE];
|
|
14
|
+
case "multi_select":
|
|
15
|
+
case "person": {
|
|
16
|
+
const names = multiSelectNames(value);
|
|
17
|
+
return names.length ? names : [NO_VALUE];
|
|
18
|
+
}
|
|
19
|
+
case "checkbox":
|
|
20
|
+
return [value === true || value === "true" ? "Checked" : "Unchecked"];
|
|
21
|
+
default: {
|
|
22
|
+
const text = cellDisplayText(value, type != null ? type : "text").trim();
|
|
23
|
+
return [text || NO_VALUE];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function aggregateRows(rows, schema, source) {
|
|
28
|
+
var _a, _b, _c, _d;
|
|
29
|
+
const groupDef = schema[source.groupByProperty];
|
|
30
|
+
const segDef = source.segmentByProperty ? schema[source.segmentByProperty] : void 0;
|
|
31
|
+
const order = (def) => {
|
|
32
|
+
var _a2;
|
|
33
|
+
return ((_a2 = def == null ? void 0 : def.options) != null ? _a2 : []).map((o) => o.name);
|
|
34
|
+
};
|
|
35
|
+
const colorOf = (def, name, idx) => {
|
|
36
|
+
var _a2, _b2;
|
|
37
|
+
return ((_b2 = (_a2 = def == null ? void 0 : def.options) == null ? void 0 : _a2.find((o) => o.name === name)) == null ? void 0 : _b2.color) || (name === NO_VALUE ? "gray" : defaultChartColor(idx));
|
|
38
|
+
};
|
|
39
|
+
const totals = /* @__PURE__ */ new Map();
|
|
40
|
+
const groupSeen = [];
|
|
41
|
+
const segSeen = [];
|
|
42
|
+
for (const row of rows) {
|
|
43
|
+
const props = (_a = row == null ? void 0 : row.properties) != null ? _a : {};
|
|
44
|
+
const amount = source.aggregate === "sum" ? finite(numberValue(props[(_b = source.valueProperty) != null ? _b : ""])) : 1;
|
|
45
|
+
const groups2 = groupKeysOf(props[source.groupByProperty], groupDef == null ? void 0 : groupDef.type);
|
|
46
|
+
const segs2 = source.segmentByProperty ? groupKeysOf(props[source.segmentByProperty], segDef == null ? void 0 : segDef.type) : [""];
|
|
47
|
+
for (const g of groups2) {
|
|
48
|
+
if (!groupSeen.includes(g)) groupSeen.push(g);
|
|
49
|
+
const m = (_c = totals.get(g)) != null ? _c : /* @__PURE__ */ new Map();
|
|
50
|
+
for (const s of segs2) {
|
|
51
|
+
if (s && !segSeen.includes(s)) segSeen.push(s);
|
|
52
|
+
m.set(s, ((_d = m.get(s)) != null ? _d : 0) + amount);
|
|
53
|
+
}
|
|
54
|
+
totals.set(g, m);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const sortBy = (names, def) => {
|
|
58
|
+
const o = order(def);
|
|
59
|
+
const rank = (n) => n === NO_VALUE ? 1e6 : o.includes(n) ? o.indexOf(n) : 1e3 + names.indexOf(n);
|
|
60
|
+
return names.slice().sort((a, b) => rank(a) - rank(b));
|
|
61
|
+
};
|
|
62
|
+
const groups = sortBy(groupSeen, groupDef);
|
|
63
|
+
const segs = sortBy(segSeen, segDef);
|
|
64
|
+
const out = [];
|
|
65
|
+
groups.forEach((g, gi) => {
|
|
66
|
+
var _a2;
|
|
67
|
+
const m = totals.get(g);
|
|
68
|
+
if (!source.segmentByProperty) {
|
|
69
|
+
out.push({
|
|
70
|
+
label: g,
|
|
71
|
+
value: (_a2 = m.get("")) != null ? _a2 : 0,
|
|
72
|
+
color: colorOf(groupDef, g, gi),
|
|
73
|
+
group: g
|
|
74
|
+
});
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
for (const s of segs) {
|
|
78
|
+
const v = m.get(s);
|
|
79
|
+
if (!v) continue;
|
|
80
|
+
out.push({
|
|
81
|
+
label: s,
|
|
82
|
+
value: v,
|
|
83
|
+
color: colorOf(segDef, s, segs.indexOf(s)),
|
|
84
|
+
group: g
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
return out;
|
|
89
|
+
}export{NO_VALUE,aggregateRows,defaultChartColor,fmt as formatChartValue,groupKeysOf};//# sourceMappingURL=chartData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chartData.js","sources":["../../../../src/features/notion/database/chartData.ts"],"sourcesContent":["/**\n * Chart / progress block maths (pure). The block is an `embed` with `embedType: 'chart'`:\n *\n * ```ts\n * { embedType: 'chart', chartKind: 'progress' | 'stacked' | 'bar', title?: string,\n * items?: ChartItem[], // static data (edited in the block's popover)\n * source?: ChartSource, // or: aggregated from a database's rows\n * max?: number } // progress: 100 by default; others: auto\n * ```\n *\n * - `progress` — one bar with a percentage (static: `items[0].value / max`; from a database:\n * rows whose group is in `source.doneValues` over all rows).\n * - `stacked` — one row per group, each a segmented bar (the demo's \"Key results\":\n * Accomplished / On track / At risk). Static items name their row with `group`.\n * - `bar` — one bar per item / group.\n */\nimport { OPTION_COLORS, cellDisplayText, multiSelectNames, numberValue, selectName } from './databaseView';\n\nexport type ChartKind = 'progress' | 'stacked' | 'bar';\nexport type ChartAggregate = 'count' | 'sum';\n\nexport interface ChartItem {\n label: string;\n value: number;\n color?: string;\n /** stacked: the row this segment belongs to. */\n group?: string;\n}\n\nexport interface ChartSource {\n databaseId: string;\n /** Rows (stacked / bar) or the done test (progress) come from this property. */\n groupByProperty: string;\n aggregate: ChartAggregate;\n /** sum: the number property added up. */\n valueProperty?: string;\n /** stacked: split each row into segments by this property (else one segment per row). */\n segmentByProperty?: string;\n /** progress: group values that count as done (default \"Done\" / \"Complete\" / checked). */\n doneValues?: string[];\n}\n\nexport interface ChartBlockProps {\n embedType: 'chart';\n chartKind: ChartKind;\n title?: string;\n items?: ChartItem[];\n source?: ChartSource;\n max?: number;\n}\n\nexport interface ChartSegment {\n label: string;\n value: number;\n color: string;\n /** Width as a fraction (0–1) of the chart's scale. */\n fraction: number;\n}\n\nexport interface ChartRow {\n label: string;\n total: number;\n segments: ChartSegment[];\n}\n\nexport interface ChartModel {\n kind: ChartKind;\n title: string;\n rows: ChartRow[];\n /** Value of a full-width bar. */\n scaleMax: number;\n /** Segment identities (stacked) — legend entries, colour per entity. */\n legend: Array<{ label: string; color: string }>;\n /** progress: 0–100. */\n percent?: number;\n /** One-sentence description for `aria-label`. */\n summary: string;\n empty: boolean;\n}\n\nexport const CHART_KINDS: Array<{ kind: ChartKind; label: string }> = [\n { kind: 'progress', label: 'Progress bar' },\n { kind: 'stacked', label: 'Stacked bars' },\n { kind: 'bar', label: 'Bar chart' },\n];\n\nexport const NO_VALUE = 'No value';\nconst DEFAULT_DONE = ['done', 'complete', 'completed', 'accomplished', 'shipped', 'checked', 'merged'];\n\nconst finite = (n: unknown): number => (typeof n === 'number' && Number.isFinite(n) ? n : 0);\nconst fmt = (n: number) => (Number.isInteger(n) ? String(n) : n.toFixed(1).replace(/\\.0$/, ''));\n\n/** Colour for the i-th entity when none is stored: option colours in fixed order (never cycled\n * by rank — the caller passes the entity's stable index). */\nexport function defaultChartColor(index: number): string {\n const palette = OPTION_COLORS.filter((c) => c !== 'gray');\n return palette[index % palette.length];\n}\n\n/** Read the block's chart props, tolerating partial / legacy shapes. */\nexport function readChartProps(props: Record<string, unknown> | undefined): ChartBlockProps {\n const p = props ?? {};\n const kind = (['progress', 'stacked', 'bar'] as const).includes(p.chartKind as ChartKind)\n ? (p.chartKind as ChartKind)\n : 'progress';\n const items = Array.isArray(p.items)\n ? (p.items as any[])\n .filter((it) => it && typeof it === 'object')\n .map((it) => ({\n label: typeof it.label === 'string' ? it.label : '',\n value: Number.isFinite(Number(it.value)) ? Number(it.value) : 0,\n ...(typeof it.color === 'string' && it.color ? { color: it.color } : {}),\n ...(typeof it.group === 'string' && it.group ? { group: it.group } : {}),\n }))\n : undefined;\n const src = p.source as Record<string, unknown> | undefined;\n const source =\n src && typeof src.databaseId === 'string' && src.databaseId && typeof src.groupByProperty === 'string'\n ? ({\n databaseId: src.databaseId,\n groupByProperty: src.groupByProperty,\n aggregate: src.aggregate === 'sum' ? 'sum' : 'count',\n ...(typeof src.valueProperty === 'string' && src.valueProperty\n ? { valueProperty: src.valueProperty }\n : {}),\n ...(typeof src.segmentByProperty === 'string' && src.segmentByProperty\n ? { segmentByProperty: src.segmentByProperty }\n : {}),\n ...(Array.isArray(src.doneValues) ? { doneValues: (src.doneValues as unknown[]).map(String) } : {}),\n } as ChartSource)\n : undefined;\n const max = typeof p.max === 'number' && Number.isFinite(p.max) && p.max > 0 ? p.max : undefined;\n return {\n embedType: 'chart',\n chartKind: kind,\n ...(typeof p.title === 'string' ? { title: p.title } : {}),\n ...(items ? { items } : {}),\n ...(source ? { source } : {}),\n ...(max ? { max } : {}),\n };\n}\n\n/** Default data for a freshly inserted block. */\nexport function defaultChartProps(kind: ChartKind): ChartBlockProps {\n if (kind === 'progress')\n return {\n embedType: 'chart',\n chartKind: 'progress',\n title: 'Progress',\n items: [{ label: 'Done', value: 40, color: 'green' }],\n max: 100,\n };\n if (kind === 'stacked')\n return {\n embedType: 'chart',\n chartKind: 'stacked',\n title: 'Key results',\n items: [\n { group: 'Accomplished', label: 'Product', value: 3, color: 'yellow' },\n { group: 'Accomplished', label: 'Sales', value: 2, color: 'red' },\n { group: 'Accomplished', label: 'Engineering', value: 3, color: 'green' },\n { group: 'Accomplished', label: 'Marketing', value: 2, color: 'blue' },\n { group: 'On track', label: 'Engineering', value: 2, color: 'green' },\n { group: 'On track', label: 'Marketing', value: 1.5, color: 'blue' },\n { group: 'At risk', label: 'Product', value: 1, color: 'yellow' },\n ],\n };\n return {\n embedType: 'chart',\n chartKind: 'bar',\n title: 'Chart',\n items: [\n { label: 'To do', value: 4, color: 'gray' },\n { label: 'In progress', value: 3, color: 'blue' },\n { label: 'Done', value: 6, color: 'green' },\n ],\n };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Database aggregation\n// ---------------------------------------------------------------------------------------------\n\nexport interface ChartSchemaProp {\n type?: string;\n options?: Array<{ name: string; color?: string }>;\n}\n\n/** Group names a row falls into for `property` (multi-select / person: several; empty: \"No value\"). */\nexport function groupKeysOf(value: unknown, type: string | undefined): string[] {\n switch (type) {\n case 'select':\n case 'status':\n return [selectName(value) ?? NO_VALUE];\n case 'multi_select':\n case 'person': {\n const names = multiSelectNames(value);\n return names.length ? names : [NO_VALUE];\n }\n case 'checkbox':\n return [value === true || value === 'true' ? 'Checked' : 'Unchecked'];\n default: {\n const text = cellDisplayText(value, type ?? 'text').trim();\n return [text || NO_VALUE];\n }\n }\n}\n\n/**\n * Database rows → chart items (`group` = row label for stacked charts). Order follows the\n * property's options, then first appearance; colours come from the options.\n */\nexport function aggregateRows(\n rows: Array<{ properties?: Record<string, unknown> } | null | undefined>,\n schema: Record<string, ChartSchemaProp | undefined>,\n source: Pick<ChartSource, 'groupByProperty' | 'aggregate' | 'valueProperty' | 'segmentByProperty'>,\n): ChartItem[] {\n const groupDef = schema[source.groupByProperty];\n const segDef = source.segmentByProperty ? schema[source.segmentByProperty] : undefined;\n const order = (def: ChartSchemaProp | undefined) => (def?.options ?? []).map((o) => o.name);\n const colorOf = (def: ChartSchemaProp | undefined, name: string, idx: number) =>\n def?.options?.find((o) => o.name === name)?.color || (name === NO_VALUE ? 'gray' : defaultChartColor(idx));\n\n const totals = new Map<string, Map<string, number>>();\n const groupSeen: string[] = [];\n const segSeen: string[] = [];\n for (const row of rows) {\n const props = row?.properties ?? {};\n const amount = source.aggregate === 'sum' ? finite(numberValue(props[source.valueProperty ?? ''])) : 1;\n const groups = groupKeysOf(props[source.groupByProperty], groupDef?.type);\n const segs = source.segmentByProperty ? groupKeysOf(props[source.segmentByProperty], segDef?.type) : [''];\n for (const g of groups) {\n if (!groupSeen.includes(g)) groupSeen.push(g);\n const m = totals.get(g) ?? new Map<string, number>();\n for (const s of segs) {\n if (s && !segSeen.includes(s)) segSeen.push(s);\n m.set(s, (m.get(s) ?? 0) + amount);\n }\n totals.set(g, m);\n }\n }\n const sortBy = (names: string[], def: ChartSchemaProp | undefined) => {\n const o = order(def);\n const rank = (n: string) => (n === NO_VALUE ? 1e6 : o.includes(n) ? o.indexOf(n) : 1000 + names.indexOf(n));\n return names.slice().sort((a, b) => rank(a) - rank(b));\n };\n const groups = sortBy(groupSeen, groupDef);\n const segs = sortBy(segSeen, segDef);\n const out: ChartItem[] = [];\n groups.forEach((g, gi) => {\n const m = totals.get(g)!;\n if (!source.segmentByProperty) {\n out.push({ label: g, value: m.get('') ?? 0, color: colorOf(groupDef, g, gi), group: g });\n return;\n }\n for (const s of segs) {\n const v = m.get(s);\n if (!v) continue;\n out.push({ label: s, value: v, color: colorOf(segDef, s, segs.indexOf(s)), group: g });\n }\n });\n return out;\n}\n\n/** Done / total for a database-backed progress bar. */\nexport function progressFromRows(\n rows: Array<{ properties?: Record<string, unknown> } | null | undefined>,\n schema: Record<string, ChartSchemaProp | undefined>,\n source: Pick<ChartSource, 'groupByProperty' | 'aggregate' | 'valueProperty' | 'doneValues'>,\n): { done: number; total: number } {\n const def = schema[source.groupByProperty];\n const done = (source.doneValues?.length ? source.doneValues : DEFAULT_DONE).map((v) => v.toLowerCase());\n let d = 0;\n let t = 0;\n for (const row of rows) {\n const props = row?.properties ?? {};\n const amount = source.aggregate === 'sum' ? finite(numberValue(props[source.valueProperty ?? ''])) : 1;\n t += amount;\n if (groupKeysOf(props[source.groupByProperty], def?.type).some((k) => done.includes(k.toLowerCase())))\n d += amount;\n }\n return { done: d, total: t };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Model\n// ---------------------------------------------------------------------------------------------\n\nexport function clampPercent(n: number): number {\n if (!Number.isFinite(n)) return 0;\n return Math.min(100, Math.max(0, n));\n}\n\n/**\n * Items → what to draw. `progress` overrides the static value with a database done/total.\n */\nexport function buildChartModel(\n props: ChartBlockProps,\n items: ChartItem[] = props.items ?? [],\n progress?: { done: number; total: number },\n): ChartModel {\n const title = (props.title ?? '').trim();\n const name = title || CHART_KINDS.find((k) => k.kind === props.chartKind)?.label || 'Chart';\n\n if (props.chartKind === 'progress') {\n const first = items[0];\n const max = progress ? progress.total : (props.max ?? 100);\n const value = progress ? progress.done : finite(first?.value);\n const percent = max > 0 ? clampPercent((value / max) * 100) : 0;\n const label = first?.label || (progress ? 'Done' : '');\n const color = first?.color || 'green';\n const detail = progress ? ` (${fmt(value)} of ${fmt(max)})` : '';\n return {\n kind: 'progress',\n title,\n rows: [\n {\n label,\n total: value,\n segments: [{ label, value, color, fraction: percent / 100 }],\n },\n ],\n scaleMax: max,\n legend: [],\n percent: Math.round(percent),\n summary: `${name}: ${Math.round(percent)}%${detail}`,\n empty: progress ? progress.total === 0 : !first,\n };\n }\n\n const clean = items.filter((it) => finite(it.value) > 0 || props.chartKind === 'bar');\n const rows: ChartRow[] = [];\n const legend: Array<{ label: string; color: string }> = [];\n const entityColor = new Map<string, string>();\n const colorFor = (label: string, explicit: string | undefined) => {\n if (explicit) {\n if (!entityColor.has(label)) entityColor.set(label, explicit);\n return explicit;\n }\n if (!entityColor.has(label)) entityColor.set(label, defaultChartColor(entityColor.size));\n return entityColor.get(label)!;\n };\n\n if (props.chartKind === 'stacked') {\n for (const it of clean) {\n const rowLabel = it.group || it.label;\n let row = rows.find((r) => r.label === rowLabel);\n if (!row) {\n row = { label: rowLabel, total: 0, segments: [] };\n rows.push(row);\n }\n const v = Math.max(0, finite(it.value));\n const color = colorFor(it.label, it.color);\n row.segments.push({ label: it.label, value: v, color, fraction: 0 });\n row.total += v;\n if (it.group && !legend.some((l) => l.label === it.label)) legend.push({ label: it.label, color });\n }\n } else {\n for (const it of clean) {\n const v = Math.max(0, finite(it.value));\n const color = colorFor(it.label, it.color);\n rows.push({ label: it.label, total: v, segments: [{ label: it.label, value: v, color, fraction: 0 }] });\n }\n }\n const scaleMax = props.max ?? Math.max(0, ...rows.map((r) => r.total));\n for (const r of rows) for (const s of r.segments) s.fraction = scaleMax > 0 ? Math.min(1, s.value / scaleMax) : 0;\n\n const parts = rows.map((r) =>\n props.chartKind === 'stacked' && r.segments.length > 1\n ? `${r.label}: ${fmt(r.total)} (${r.segments.map((s) => `${s.label} ${fmt(s.value)}`).join(', ')})`\n : `${r.label}: ${fmt(r.total)}`,\n );\n const kindLabel = props.chartKind === 'stacked' ? 'stacked bar chart' : 'bar chart';\n return {\n kind: props.chartKind,\n title,\n rows,\n scaleMax,\n legend: legend.length >= 2 ? legend : [],\n summary: `${title ? `${title}, ${kindLabel}` : kindLabel[0].toUpperCase() + kindLabel.slice(1)}. ${\n rows.length ? `${parts.join('; ')}.` : 'No data.'\n }`,\n empty: rows.length === 0,\n };\n}\n\nexport { fmt as formatChartValue };\n"],"names":["_a","_b","groups","segs"],"mappings":"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"}
|