PromucFlow_constructor/app/client/src/selectors/entitiesSelector.ts
Nidhi 6b31aa333b
Introducing Google Sheets Plugin (#3517)
* cherry pick -make new

* revert to enable fix from release

* attempt to hook into existing datasource editor

* gSheets plugin skeleton from Rest API

* Changes for database migration

* fix for auth code

* separate it out

* action page loads!

* add to explorer

* create action from datasource

* Editor JSON WIP

* working query form

* Editor JSON WIP

* import to

* fix toast message

* redirect from datasource and editor pages

* fix onboarding

* fix imports and constants

* refactor form out

* refactor queryForm

* Merge branch 'release' into feature/google-sheets

* Merge branch 'release' into feature/google-sheets

* initial values from settings, editor and form

* Check

* remove dangling code around lightTheme

* Safety net

* remove class

* try mouseover solve

* force click

* changes from review

* fix action form name on import

* Merge branch 'release' into feature/google-sheets

* minor cleanup

* Merge branch 'release' into feature/google-sheets

* WIP

* Google sheets changes

* Merge conflicts

* Merging and fixes, needs refactoring

* Check

* Merge branch 'release' into feature/google-sheets

* Fixed tests

* Add cloud services env variable

* Clean up saga

* Clean up

* Refactoring

* Deleted svg file

* Minor fixes

* Modified design to allow behaviour in google sheets methods (#3486)

* Modified design to allow behaviour in google sheets methods

* Review changes

* Removed sysout

* Added handling of edge cases with table data

* Merge branch 'release' into feature/google-sheets

* Fixes

* Fixes

* Added validations

* Improved tests

* Removed extraneous injected bean

* Review changes

* Fixed bug with method

* Changes to Google sheets plugin's request and response structures (#3692)

* Method changes

* Removed logging

* Renaming options

* Reverting pom version

* Modified type of collection variables, fixed errors

* Converted row offset field to one that supports dynamic bindings

* Review changes

* List SAAS plugin type actions under lightning menu apis (#3820)

* list saas plugin type actions under lightning menu apis

* combine saas plugin type actions in the other sub menu of lightning menu

Co-authored-by: Hetu Nandu <hetunandu@gmail.com>

* Fix merge issues

* Prettified query editor and a few fixes w/ ux

* Test fixes

* Reformatting request

* code for REST added (#3876)


Co-authored-by: hetunandu <hetu@appsmith.com>

* Renamed body to row object

* Renamed placeholder for range

* Renamed range heading

* Modifications to handle range semantics

* Use spreadsheet Url instead of id

* Ordering of methods

* Removed logging

* Add tests for Dynamic text controls

* Add tests for url helpers

* Fix coverage config

* Nevermind

* Interface changes

* There is no body here

* Yay to hints

* Delete row field is separately handled as row index

* placeholder support (#4001)

* Fixed tests, typos and creating new sheets with random rows

* Switched to using 'rowIndex' throughout

* binding path added for query input field (#4016)

* - Fixed QA bugs (#4032)

- Split delete sheet into two
- Removed dynamic query input types from hidden keys

* Proper exceptions

* Removed extra logging

* Throw exception if update method does not match any of the columns

* Same for bulk update

* Zero-indexed delete row

* I'm a space bound rocket ship

* Logic to register installations with cs (#4062)

* Logic to register installations with cs

* Clean up

* Casting to string

* Checking to see if this makes the test pass

* Added an extra null check

Co-authored-by: Piyush <piyush@codeitout.com>
Co-authored-by: hetunandu <hetu@appsmith.com>
Co-authored-by: Hetu Nandu <hetunandu@gmail.com>
Co-authored-by: Apeksha Bhosale <7846888+ApekshaBhosale@users.noreply.github.com>
2021-04-22 09:00:09 +05:30

347 lines
9.9 KiB
TypeScript

import { AppState } from "reducers";
import {
ActionData,
ActionDataState,
} from "reducers/entityReducers/actionsReducer";
import { ActionResponse } from "api/ActionAPI";
import { createSelector } from "reselect";
import { Datasource } from "entities/Datasource";
import { Action, PluginType } from "entities/Action";
import { find } from "lodash";
import ImageAlt from "assets/images/placeholder-image.svg";
import { CanvasWidgetsReduxState } from "../reducers/entityReducers/canvasWidgetsReducer";
import { MAIN_CONTAINER_WIDGET_ID } from "constants/WidgetConstants";
import { AppStoreState } from "reducers/entityReducers/appReducer";
export const getEntities = (state: AppState): AppState["entities"] =>
state.entities;
export const getDatasources = (state: AppState): Datasource[] => {
return state.entities.datasources.list;
};
export const getPluginIdsOfNames = (
state: AppState,
names: Array<string>,
): Array<string> | undefined => {
const plugins = state.entities.plugins.list.filter((plugin) =>
names.includes(plugin.name),
);
const pluginIds = plugins.map((plugin) => plugin.id);
if (!pluginIds.length) return undefined;
return pluginIds;
};
export const getPluginIdsOfPackageNames = (
state: AppState,
names: Array<string>,
): Array<string> | undefined => {
const plugins = state.entities.plugins.list.filter((plugin) =>
names.includes(plugin.packageName),
);
const pluginIds = plugins.map((plugin) => plugin.id);
if (!pluginIds.length) return undefined;
return pluginIds;
};
export const getPluginNameFromDatasourceId = (
state: AppState,
datasourceId: string,
): string | undefined => {
const datasource = state.entities.datasources.list.find(
(datasource) => datasource.id === datasourceId,
);
const plugin = state.entities.plugins.list.find(
(plugin) => plugin.id === datasource?.pluginId,
);
if (!plugin) return undefined;
return plugin.name;
};
export const getPluginPackageFromDatasourceId = (
state: AppState,
datasourceId: string,
): string | undefined => {
const datasource = state.entities.datasources.list.find(
(datasource) => datasource.id === datasourceId,
);
const plugin = state.entities.plugins.list.find(
(plugin) => plugin.id === datasource?.pluginId,
);
if (!plugin) return undefined;
return plugin.packageName;
};
export const getPluginNameFromId = (state: AppState, pluginId: string) => {
const plugin = state.entities.plugins.list.find(
(plugin) => plugin.id === pluginId,
);
if (!plugin) return "";
return plugin.name;
};
export const getPluginForm = (state: AppState, pluginId: string): any[] => {
return state.entities.plugins.formConfigs[pluginId];
};
export const getEditorConfig = (state: AppState, pluginId: string): any[] => {
return state.entities.plugins.editorConfigs[pluginId];
};
export const getSettingConfig = (state: AppState, pluginId: string): any[] => {
return state.entities.plugins.settingConfigs[pluginId];
};
export const getActions = (state: AppState): ActionDataState =>
state.entities.actions;
export const getDatasource = (
state: AppState,
datasourceId: string,
): Datasource | undefined =>
state.entities.datasources.list.find(
(datasource) => datasource.id === datasourceId,
);
export const getDatasourceDraft = (state: AppState, id: string) => {
const drafts = state.ui.datasourcePane.drafts;
if (id in drafts) return drafts[id];
return {};
};
export const getDatasourcesByPluginId = (
state: AppState,
id: string,
): Datasource[] => {
return state.entities.datasources.list.filter((d) => d.pluginId === id);
};
export const getPlugins = (state: AppState) => state.entities.plugins.list;
export const getPluginByPackageName = (state: AppState, name: string) =>
state.entities.plugins.list.find((p) => p.packageName === name);
export const getPluginEditorConfigs = (state: AppState) =>
state.entities.plugins.editorConfigs;
export const getPluginSettingConfigs = (state: AppState, pluginId: string) =>
state.entities.plugins.settingConfigs[pluginId];
export const getDBPlugins = createSelector(getPlugins, (plugins) =>
plugins.filter((plugin) => plugin.type === PluginType.DB),
);
export const getDatasourceByPluginId = (state: AppState, pluginId: string) =>
state.entities.datasources.list.filter((d) => d.pluginId === pluginId);
export const getDBDatasources = createSelector(
getDBPlugins,
getEntities,
(dbPlugins, entities) => {
const datasources = entities.datasources.list;
const dbPluginIds = dbPlugins.map((plugin) => plugin.id);
return datasources.filter((datasource) =>
dbPluginIds.includes(datasource.pluginId),
);
},
);
export const getQueryName = (state: AppState, actionId: string): string => {
const action = state.entities.actions.find((action: ActionData) => {
return action.config.id === actionId;
});
return action?.config.name ?? "";
};
const getCurrentPageId = (state: AppState) =>
state.entities.pageList.currentPageId;
export const getDatasourcePlugins = createSelector(getPlugins, (plugins) => {
return plugins.filter((plugin) => plugin?.allowUserDatasources ?? true);
});
export const getPluginImages = createSelector(getPlugins, (plugins) => {
const pluginImages: Record<string, string> = {};
plugins.forEach((plugin) => {
pluginImages[plugin.id] = plugin?.iconLocation ?? ImageAlt;
});
return pluginImages;
});
export const getPluginTemplates = createSelector(getPlugins, (plugins) => {
const pluginTemplates: Record<string, any> = {};
plugins.forEach((plugin) => {
pluginTemplates[plugin.id] = plugin.templates;
});
return pluginTemplates;
});
export const getPluginResponseTypes = createSelector(getPlugins, (plugins) => {
const pluginResponseTypes: Record<string, any> = {};
plugins.forEach((plugin) => {
pluginResponseTypes[plugin.id] = plugin.responseType;
});
return pluginResponseTypes;
});
export const getPluginDocumentationLinks = createSelector(
getPlugins,
(plugins) => {
const pluginDocumentationLinks: Record<string, string | undefined> = {};
plugins.forEach((plugin) => {
pluginDocumentationLinks[plugin.id] = plugin.documentationLink;
});
return pluginDocumentationLinks;
},
);
export const getActionsForCurrentPage = createSelector(
getCurrentPageId,
getActions,
(pageId, actions) => {
if (!pageId) return [];
return actions.filter((a) => a.config.pageId === pageId);
},
);
export const getQueryActionsForCurrentPage = createSelector(
getActionsForCurrentPage,
(actions) => {
return actions.filter((action) => {
return action.config.pluginType === PluginType.DB;
});
},
);
export const getPlugin = (state: AppState, pluginId: string) => {
return state.entities.plugins.list.find((plugin) => plugin.id === pluginId);
};
export const getActionResponses = createSelector(getActions, (actions) => {
const responses: Record<string, ActionResponse | undefined> = {};
actions.forEach((a) => {
responses[a.config.id] = a.data;
});
return responses;
});
export const getAction = (
state: AppState,
actionId: string,
): Action | undefined => {
const action = find(state.entities.actions, (a) => a.config.id === actionId);
return action ? action.config : undefined;
};
export function getCurrentPageNameByActionId(
state: AppState,
actionId: string,
): string {
const action = state.entities.actions.find((action) => {
return action.config.id === actionId;
});
const pageId = action ? action.config.pageId : "";
return getPageNameByPageId(state, pageId);
}
export function getPageNameByPageId(state: AppState, pageId: string): string {
const page = state.entities.pageList.pages.find(
(page) => page.pageId === pageId,
);
return page ? page.pageName : "";
}
const getQueryPaneSavingMap = (state: AppState) => state.ui.queryPane.isSaving;
const getApiPaneSavingMap = (state: AppState) => state.ui.apiPane.isSaving;
const getActionDirtyState = (state: AppState) => state.ui.apiPane.isDirty;
export const isActionSaving = (id: string) =>
createSelector(
[getQueryPaneSavingMap, getApiPaneSavingMap],
(querySavingMap, apiSavingsMap) => {
return (
(id in querySavingMap && querySavingMap[id]) ||
(id in apiSavingsMap && apiSavingsMap[id])
);
},
);
export const isActionDirty = (id: string) =>
createSelector([getActionDirtyState], (actionDirtyMap) => {
return id in actionDirtyMap && actionDirtyMap[id];
});
export const getAppData = (state: AppState) => state.entities.app;
export const getAppStoreData = (state: AppState): AppStoreState =>
state.entities.app.store;
export const getCanvasWidgets = (state: AppState): CanvasWidgetsReduxState =>
state.entities.canvasWidgets;
const getPageWidgets = (state: AppState) => state.ui.pageWidgets;
export const getAllWidgetsMap = createSelector(
getPageWidgets,
(widgetsByPage) => {
return Object.entries(widgetsByPage).reduce(
(res: any, [pageId, pageWidgets]: any) => {
const widgetsMap = Object.entries(pageWidgets).reduce(
(res, [widgetId, widget]: any) => {
let parentModalId;
let { parentId } = widget;
let parentWidget = pageWidgets[parentId];
while (parentId && parentId !== MAIN_CONTAINER_WIDGET_ID) {
if (parentWidget?.type === "MODAL_WIDGET") {
parentModalId = parentId;
break;
}
parentId = parentWidget?.parentId;
parentWidget = pageWidgets[parentId];
}
return {
...res,
[widgetId]: { ...widget, pageId, parentModalId },
};
},
{},
);
return {
...res,
...widgetsMap,
};
},
{},
);
},
);
export const getAllPageWidgets = createSelector(
getAllWidgetsMap,
(widgetsMap) => {
return Object.entries(widgetsMap).reduce(
(res: any[], [, widget]: any) => [...res, widget],
[],
);
},
);