mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2025-03-13 05:15:30 +00:00
* Initial implementation of saving split value to local storage * Make table columns generic (no more id and partition keys) * Save column width * Add column selection from right-click * Implement new menu for column selection with search. * Switch icons and search compare with lowercase. * Search uses string includes instead of startsWith * Only allow data fields that can be rendered (string and numbers) in column selection * Accumulate properties rather than replace for column definitions * Do not allow deselecting all columns * Move table values under its own property * Update choices of column when creating new or updating document * Rework column selection UI * Fix table size issue with some heuristics * Fix heuristic for size update * Don't allow unselecting last column * Implement column sorting * Fix format * Fix format, update snapshots * Add reset button to column selection and fix naming of openUploadItemsPanePane() * Fix unit tests * Fix unit test * Persist column selection * Persist column sorting * Save columns definition (schema) along with selected columns. * Merge branch 'master' into users/languy/save-documentstab-prefs * Revert "Merge branch 'master' into users/languy/save-documentstab-prefs" This reverts commit e5a82fd356666011397db96ea35c2e0abc178c4e. * Disable column selection for Mongo. Remove extra refresh button * Update test snapshots * Remove unused function * Fix table width * Add background color to "..." button for column selection * Label to indicate which field is a partition key in Column Selection Pane * Update unit test snapshot * Move column selection and sorting behind feature flag enableDocumentsTableColumnSelection * Cleanup checkbox styles
107 lines
3.4 KiB
TypeScript
107 lines
3.4 KiB
TypeScript
// Definitions of State data
|
|
|
|
import { ColumnDefinition } from "Explorer/Tabs/DocumentsTabV2/DocumentsTableComponent";
|
|
import { deleteState, loadState, saveState, saveStateDebounced } from "Shared/AppStatePersistenceUtility";
|
|
import { userContext } from "UserContext";
|
|
import * as ViewModels from "../../../Contracts/ViewModels";
|
|
import { Action } from "../../../Shared/Telemetry/TelemetryConstants";
|
|
import * as TelemetryProcessor from "../../../Shared/Telemetry/TelemetryProcessor";
|
|
|
|
const componentName = "DocumentsTab";
|
|
export enum SubComponentName {
|
|
ColumnSizes = "ColumnSizes",
|
|
FilterHistory = "FilterHistory",
|
|
MainTabDivider = "MainTabDivider",
|
|
ColumnsSelection = "ColumnsSelection",
|
|
ColumnSort = "ColumnSort",
|
|
}
|
|
|
|
export type ColumnSizesMap = { [columnId: string]: WidthDefinition };
|
|
export type FilterHistory = string[];
|
|
export type WidthDefinition = { widthPx: number };
|
|
export type TabDivider = { leftPaneWidthPercent: number };
|
|
export type ColumnsSelection = { selectedColumnIds: string[]; columnDefinitions: ColumnDefinition[] };
|
|
export type ColumnSort = { columnId: string; direction: "ascending" | "descending" };
|
|
|
|
/**
|
|
*
|
|
* @param subComponentName
|
|
* @param collection
|
|
* @param defaultValue Will be returned if persisted state is not found
|
|
* @returns
|
|
*/
|
|
export const readSubComponentState = <T>(
|
|
subComponentName: SubComponentName,
|
|
collection: ViewModels.CollectionBase,
|
|
defaultValue: T,
|
|
): T => {
|
|
const globalAccountName = userContext.databaseAccount?.name;
|
|
if (!globalAccountName) {
|
|
const message = "Database account name not found in userContext";
|
|
console.error(message);
|
|
TelemetryProcessor.traceFailure(Action.ReadPersistedTabState, { message, componentName });
|
|
return defaultValue;
|
|
}
|
|
|
|
const state = loadState({
|
|
componentName: componentName,
|
|
subComponentName,
|
|
globalAccountName,
|
|
databaseName: collection.databaseId,
|
|
containerName: collection.id(),
|
|
}) as T;
|
|
|
|
return state || defaultValue;
|
|
};
|
|
|
|
/**
|
|
*
|
|
* @param subComponentName
|
|
* @param collection
|
|
* @param state State to save
|
|
* @param debounce true for high-frequency calls (e.g mouse drag events)
|
|
*/
|
|
export const saveSubComponentState = <T>(
|
|
subComponentName: SubComponentName,
|
|
collection: ViewModels.CollectionBase,
|
|
state: T,
|
|
debounce?: boolean,
|
|
): void => {
|
|
const globalAccountName = userContext.databaseAccount?.name;
|
|
if (!globalAccountName) {
|
|
const message = "Database account name not found in userContext";
|
|
console.error(message);
|
|
TelemetryProcessor.traceFailure(Action.SavePersistedTabState, { message, componentName });
|
|
return;
|
|
}
|
|
|
|
(debounce ? saveStateDebounced : saveState)(
|
|
{
|
|
componentName: componentName,
|
|
subComponentName,
|
|
globalAccountName,
|
|
databaseName: collection.databaseId,
|
|
containerName: collection.id(),
|
|
},
|
|
state,
|
|
);
|
|
};
|
|
|
|
export const deleteSubComponentState = (subComponentName: SubComponentName, collection: ViewModels.CollectionBase) => {
|
|
const globalAccountName = userContext.databaseAccount?.name;
|
|
if (!globalAccountName) {
|
|
const message = "Database account name not found in userContext";
|
|
console.error(message);
|
|
TelemetryProcessor.traceFailure(Action.DeletePersistedTabState, { message, componentName });
|
|
return;
|
|
}
|
|
|
|
deleteState({
|
|
componentName: componentName,
|
|
subComponentName,
|
|
globalAccountName,
|
|
databaseName: collection.databaseId,
|
|
containerName: collection.id(),
|
|
});
|
|
};
|