2022-08-24 12:16:32 +00:00
import { AppState } from "@appsmith/reducers" ;
2020-05-05 07:50:30 +00:00
import {
ActionData ,
2020-07-03 08:58:58 +00:00
ActionDataState ,
2020-05-05 07:50:30 +00:00
} from "reducers/entityReducers/actionsReducer" ;
2020-01-30 13:23:04 +00:00
import { ActionResponse } from "api/ActionAPI" ;
2020-03-19 03:25:52 +00:00
import { createSelector } from "reselect" ;
2021-07-29 08:13:10 +00:00
import {
Datasource ,
MockDatasource ,
DatasourceStructure ,
2022-01-29 07:26:19 +00:00
isEmbeddedRestDatasource ,
2021-07-29 08:13:10 +00:00
} from "entities/Datasource" ;
2021-03-30 05:29:03 +00:00
import { Action , PluginType } from "entities/Action" ;
2022-04-28 16:51:02 +00:00
import { find , get , sortBy } from "lodash" ;
2020-07-21 10:36:53 +00:00
import ImageAlt from "assets/images/placeholder-image.svg" ;
2022-04-12 10:50:01 +00:00
import { CanvasWidgetsReduxState } from "reducers/entityReducers/canvasWidgetsReducer" ;
2021-03-08 08:24:12 +00:00
import { MAIN_CONTAINER_WIDGET_ID } from "constants/WidgetConstants" ;
2021-03-24 05:09:47 +00:00
import { AppStoreState } from "reducers/entityReducers/appReducer" ;
2021-09-08 17:32:22 +00:00
import { JSCollectionDataState } from "reducers/entityReducers/jsActionsReducer" ;
2022-04-12 10:50:01 +00:00
import { DefaultPlugin , GenerateCRUDEnabledPluginMap } from "api/PluginApi" ;
2022-04-28 16:51:02 +00:00
import { JSAction , JSCollection } from "entities/JSCollection" ;
2021-08-06 09:17:56 +00:00
import { APP_MODE } from "entities/App" ;
2022-01-29 07:26:19 +00:00
import { ExplorerFileEntity } from "pages/Editor/Explorer/helpers" ;
2022-01-27 09:50:05 +00:00
import { ActionValidationConfigMap } from "constants/PropertyControlConstants" ;
2022-04-07 17:57:32 +00:00
import { selectFeatureFlags } from "./usersSelectors" ;
2022-05-11 10:20:33 +00:00
import {
EvaluationError ,
EVAL_ERROR_PATH ,
PropertyEvaluationErrorType ,
} from "utils/DynamicBindingUtils" ;
2021-08-06 09:17:56 +00:00
2020-02-18 10:41:52 +00:00
export const getEntities = ( state : AppState ) : AppState [ "entities" ] = >
state . entities ;
2019-11-29 05:22:49 +00:00
2020-12-30 07:31:20 +00:00
export const getDatasources = ( state : AppState ) : Datasource [ ] = > {
return state . entities . datasources . list ;
} ;
2021-07-29 08:13:10 +00:00
export const getDatasourcesStructure = (
state : AppState ,
) : Record < string , DatasourceStructure > = > {
return state . entities . datasources . structure ;
} ;
export const getIsFetchingDatasourceStructure = ( state : AppState ) : boolean = > {
return state . entities . datasources . fetchingDatasourceStructure ;
} ;
2021-07-07 03:46:16 +00:00
export const getMockDatasources = ( state : AppState ) : MockDatasource [ ] = > {
return state . entities . datasources . mockDatasourceList ;
} ;
2022-03-03 10:56:53 +00:00
export const getDefaultPlugins = ( state : AppState ) : DefaultPlugin [ ] = >
state . entities . plugins . defaultPluginList ;
2022-09-02 13:17:17 +00:00
// Get plugin by id or package name
export const getDefaultPlugin = (
2022-03-03 10:56:53 +00:00
state : AppState ,
2022-09-02 13:17:17 +00:00
pluginIdentifier : string ,
) : DefaultPlugin | undefined = > {
return state . entities . plugins . defaultPluginList . find (
( plugin ) = >
plugin . packageName === pluginIdentifier || plugin . id === pluginIdentifier ,
2022-03-03 10:56:53 +00:00
) ;
2022-09-02 13:17:17 +00:00
} ;
2022-03-03 10:56:53 +00:00
2020-04-28 06:52:53 +00:00
export const getPluginIdsOfNames = (
state : AppState ,
names : Array < string > ,
) : Array < string > | undefined = > {
2020-12-24 04:32:25 +00:00
const plugins = state . entities . plugins . list . filter ( ( plugin ) = >
2020-04-28 06:52:53 +00:00
names . includes ( plugin . name ) ,
) ;
2020-12-24 04:32:25 +00:00
const pluginIds = plugins . map ( ( plugin ) = > plugin . id ) ;
2020-04-28 06:52:53 +00:00
if ( ! pluginIds . length ) return undefined ;
return pluginIds ;
} ;
2020-05-05 07:50:30 +00:00
export const getPluginIdsOfPackageNames = (
state : AppState ,
names : Array < string > ,
) : Array < string > | undefined = > {
2020-12-24 04:32:25 +00:00
const plugins = state . entities . plugins . list . filter ( ( plugin ) = >
2020-05-05 07:50:30 +00:00
names . includes ( plugin . packageName ) ,
) ;
2020-12-24 04:32:25 +00:00
const pluginIds = plugins . map ( ( plugin ) = > plugin . id ) ;
2020-05-05 07:50:30 +00:00
if ( ! pluginIds . length ) return undefined ;
return pluginIds ;
} ;
2020-04-28 06:52:53 +00:00
export const getPluginNameFromDatasourceId = (
state : AppState ,
datasourceId : string ,
) : string | undefined = > {
const datasource = state . entities . datasources . list . find (
2020-12-24 04:32:25 +00:00
( datasource ) = > datasource . id === datasourceId ,
2020-04-28 06:52:53 +00:00
) ;
const plugin = state . entities . plugins . list . find (
2020-12-24 04:32:25 +00:00
( plugin ) = > plugin . id === datasource ? . pluginId ,
2020-04-28 06:52:53 +00:00
) ;
if ( ! plugin ) return undefined ;
return plugin . name ;
} ;
export const getPluginPackageFromDatasourceId = (
state : AppState ,
datasourceId : string ,
) : string | undefined = > {
const datasource = state . entities . datasources . list . find (
2020-12-24 04:32:25 +00:00
( datasource ) = > datasource . id === datasourceId ,
2020-04-28 06:52:53 +00:00
) ;
const plugin = state . entities . plugins . list . find (
2020-12-24 04:32:25 +00:00
( plugin ) = > plugin . id === datasource ? . pluginId ,
2020-04-28 06:52:53 +00:00
) ;
if ( ! plugin ) return undefined ;
return plugin . packageName ;
} ;
2021-07-15 07:14:42 +00:00
export const getPluginNameFromId = (
state : AppState ,
pluginId : string ,
) : string = > {
2020-05-05 07:50:30 +00:00
const plugin = state . entities . plugins . list . find (
2020-12-24 04:32:25 +00:00
( plugin ) = > plugin . id === pluginId ,
2020-05-05 07:50:30 +00:00
) ;
if ( ! plugin ) return "" ;
return plugin . name ;
} ;
2022-01-14 06:31:54 +00:00
export const getPluginTypeFromDatasourceId = (
state : AppState ,
datasourceId : string ,
) : PluginType | 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 . type ;
} ;
2020-10-12 13:06:05 +00:00
export const getPluginForm = ( state : AppState , pluginId : string ) : any [ ] = > {
2020-04-29 09:23:23 +00:00
return state . entities . plugins . formConfigs [ pluginId ] ;
} ;
2021-07-29 08:13:10 +00:00
export const getIsFetchingSinglePluginForm = (
state : AppState ,
pluginId : string ,
) : boolean = > {
return ! ! state . entities . plugins . fetchingSinglePluginForm [ pluginId ] ;
} ;
2020-04-29 09:23:23 +00:00
2021-08-20 06:57:01 +00:00
export const getIsExecutingDatasourceQuery = ( state : AppState ) : boolean = > {
return state . entities . datasources . executingDatasourceQuery ;
} ;
2022-03-29 11:56:29 +00:00
export const getIsDatasourceTesting = ( state : AppState ) : boolean = > {
return state . entities . datasources . isTesting ;
} ;
2021-02-11 11:47:21 +00:00
export const getEditorConfig = ( state : AppState , pluginId : string ) : any [ ] = > {
return state . entities . plugins . editorConfigs [ pluginId ] ;
} ;
2021-02-23 08:27:37 +00:00
export const getSettingConfig = ( state : AppState , pluginId : string ) : any [ ] = > {
return state . entities . plugins . settingConfigs [ pluginId ] ;
} ;
2022-03-30 13:11:25 +00:00
export const getDatasourceFormButtonConfig = (
state : AppState ,
pluginId : string ,
) : string [ ] = > {
return state . entities . plugins . datasourceFormButtonConfigs [ pluginId ] ;
} ;
2020-01-30 13:23:04 +00:00
export const getActions = ( state : AppState ) : ActionDataState = >
state . entities . actions ;
2021-09-08 17:32:22 +00:00
export const getJSCollections = ( state : AppState ) : JSCollectionDataState = >
state . entities . jsActions ;
2020-05-19 06:10:59 +00:00
export const getDatasource = (
state : AppState ,
datasourceId : string ,
2020-08-26 05:24:44 +00:00
) : Datasource | undefined = >
2020-05-19 06:10:59 +00:00
state . entities . datasources . list . find (
2020-12-24 04:32:25 +00:00
( datasource ) = > datasource . id === datasourceId ,
2020-05-19 06:10:59 +00:00
) ;
2022-03-17 10:28:54 +00:00
export const getDatasourceDrafts = ( state : AppState ) = > {
return state . ui . datasourcePane . drafts ;
} ;
2020-05-19 06:10:59 +00:00
export const getDatasourceDraft = ( state : AppState , id : string ) = > {
const drafts = state . ui . datasourcePane . drafts ;
if ( id in drafts ) return drafts [ id ] ;
return { } ;
} ;
2022-11-30 05:59:45 +00:00
export const getDatasourceActionRouteInfo = ( state : AppState ) = > {
return state . ui . datasourcePane . actionRouteInfo ;
} ;
2021-04-22 03:30:09 +00:00
export const getDatasourcesByPluginId = (
state : AppState ,
id : string ,
) : Datasource [ ] = > {
return state . entities . datasources . list . filter ( ( d ) = > d . pluginId === id ) ;
} ;
2020-04-28 06:52:53 +00:00
export const getPlugins = ( state : AppState ) = > state . entities . plugins . list ;
2021-04-22 03:30:09 +00:00
export const getPluginByPackageName = ( state : AppState , name : string ) = >
state . entities . plugins . list . find ( ( p ) = > p . packageName === name ) ;
2020-08-12 06:27:35 +00:00
export const getPluginEditorConfigs = ( state : AppState ) = >
state . entities . plugins . editorConfigs ;
2020-05-05 07:50:30 +00:00
2021-04-26 05:41:32 +00:00
export const getPluginDependencyConfig = ( state : AppState ) = >
state . entities . plugins . dependencies ;
2021-03-30 05:29:03 +00:00
export const getPluginSettingConfigs = ( state : AppState , pluginId : string ) = >
state . entities . plugins . settingConfigs [ pluginId ] ;
2020-12-24 04:32:25 +00:00
export const getDBPlugins = createSelector ( getPlugins , ( plugins ) = >
2021-03-30 05:29:03 +00:00
plugins . filter ( ( plugin ) = > plugin . type === PluginType . DB ) ,
2020-07-21 12:12:35 +00:00
) ;
2021-09-21 12:05:29 +00:00
export const getDBAndRemotePlugins = createSelector ( getPlugins , ( plugins ) = >
plugins . filter (
( plugin ) = >
plugin . type === PluginType . DB || plugin . type === PluginType . REMOTE ,
) ,
) ;
2022-03-17 10:28:54 +00:00
export const getUnconfiguredDatasources = ( state : AppState ) = >
state . entities . datasources . unconfiguredList ? ? [ ] ;
2021-04-22 03:30:09 +00:00
export const getDatasourceByPluginId = ( state : AppState , pluginId : string ) = >
state . entities . datasources . list . filter ( ( d ) = > d . pluginId === pluginId ) ;
2020-07-21 12:12:35 +00:00
export const getDBDatasources = createSelector (
getDBPlugins ,
getEntities ,
( dbPlugins , entities ) = > {
const datasources = entities . datasources . list ;
2020-12-24 04:32:25 +00:00
const dbPluginIds = dbPlugins . map ( ( plugin ) = > plugin . id ) ;
2020-07-21 12:12:35 +00:00
2020-12-24 04:32:25 +00:00
return datasources . filter ( ( datasource ) = >
2020-07-21 12:12:35 +00:00
dbPluginIds . includes ( datasource . pluginId ) ,
) ;
} ,
) ;
2021-09-21 12:05:29 +00:00
export const getDBAndRemoteDatasources = createSelector (
getDBAndRemotePlugins ,
getEntities ,
( plugins , entities ) = > {
const datasources = entities . datasources . list ;
const pluginIds = plugins . map ( ( plugin ) = > plugin . id ) ;
return datasources . filter ( ( datasource ) = >
pluginIds . includes ( datasource . pluginId ) ,
) ;
} ,
) ;
2020-05-05 07:50:30 +00:00
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 ? ? "" ;
} ;
2020-03-19 03:25:52 +00:00
const getCurrentPageId = ( state : AppState ) = >
state . entities . pageList . currentPageId ;
2020-12-24 04:32:25 +00:00
export const getDatasourcePlugins = createSelector ( getPlugins , ( plugins ) = > {
return plugins . filter ( ( plugin ) = > plugin ? . allowUserDatasources ? ? true ) ;
2020-06-03 05:40:48 +00:00
} ) ;
2020-05-05 09:03:03 +00:00
2020-12-24 04:32:25 +00:00
export const getPluginImages = createSelector ( getPlugins , ( plugins ) = > {
2020-07-21 10:36:53 +00:00
const pluginImages : Record < string , string > = { } ;
2020-12-24 04:32:25 +00:00
plugins . forEach ( ( plugin ) = > {
2020-07-21 10:36:53 +00:00
pluginImages [ plugin . id ] = plugin ? . iconLocation ? ? ImageAlt ;
} ) ;
return pluginImages ;
} ) ;
2022-03-17 10:28:54 +00:00
export const getPluginNames = createSelector ( getPlugins , ( plugins ) = > {
const pluginNames : Record < string , string > = { } ;
plugins . forEach ( ( plugin ) = > {
pluginNames [ plugin . id ] = plugin ? . name ;
} ) ;
return pluginNames ;
} ) ;
2020-12-24 04:32:25 +00:00
export const getPluginTemplates = createSelector ( getPlugins , ( plugins ) = > {
2020-07-21 10:36:53 +00:00
const pluginTemplates : Record < string , any > = { } ;
2020-12-24 04:32:25 +00:00
plugins . forEach ( ( plugin ) = > {
2020-07-21 10:36:53 +00:00
pluginTemplates [ plugin . id ] = plugin . templates ;
} ) ;
return pluginTemplates ;
} ) ;
2020-12-24 04:32:25 +00:00
export const getPluginResponseTypes = createSelector ( getPlugins , ( plugins ) = > {
2020-07-21 10:36:53 +00:00
const pluginResponseTypes : Record < string , any > = { } ;
2020-12-24 04:32:25 +00:00
plugins . forEach ( ( plugin ) = > {
2020-07-21 10:36:53 +00:00
pluginResponseTypes [ plugin . id ] = plugin . responseType ;
} ) ;
return pluginResponseTypes ;
} ) ;
export const getPluginDocumentationLinks = createSelector (
getPlugins ,
2020-12-24 04:32:25 +00:00
( plugins ) = > {
2020-07-21 10:36:53 +00:00
const pluginDocumentationLinks : Record < string , string | undefined > = { } ;
2020-12-24 04:32:25 +00:00
plugins . forEach ( ( plugin ) = > {
2020-07-21 10:36:53 +00:00
pluginDocumentationLinks [ plugin . id ] = plugin . documentationLink ;
} ) ;
return pluginDocumentationLinks ;
} ,
) ;
2021-07-29 08:13:10 +00:00
export const getGenerateCRUDEnabledPluginMap = createSelector (
getPlugins ,
( plugins ) = > {
const pluginIdGenerateCRUDPageEnabled : GenerateCRUDEnabledPluginMap = { } ;
plugins . map ( ( plugin ) = > {
2021-08-20 09:55:59 +00:00
if ( plugin . generateCRUDPageComponent ) {
2021-07-29 08:13:10 +00:00
pluginIdGenerateCRUDPageEnabled [ plugin . id ] = plugin . packageName ;
}
} ) ;
return pluginIdGenerateCRUDPageEnabled ;
} ,
) ;
2020-07-21 10:36:53 +00:00
2020-03-19 03:25:52 +00:00
export const getActionsForCurrentPage = createSelector (
getCurrentPageId ,
getActions ,
( pageId , actions ) = > {
if ( ! pageId ) return [ ] ;
2020-12-24 04:32:25 +00:00
return actions . filter ( ( a ) = > a . config . pageId === pageId ) ;
2020-03-19 03:25:52 +00:00
} ,
) ;
2021-09-08 17:32:22 +00:00
export const getJSCollectionsForCurrentPage = createSelector (
getCurrentPageId ,
getJSCollections ,
( pageId , actions ) = > {
if ( ! pageId ) return [ ] ;
return actions . filter ( ( a ) = > a . config . pageId === pageId ) ;
} ,
) ;
2020-10-12 13:37:18 +00:00
export const getPlugin = ( state : AppState , pluginId : string ) = > {
2020-12-24 04:32:25 +00:00
return state . entities . plugins . list . find ( ( plugin ) = > plugin . id === pluginId ) ;
2020-10-12 13:37:18 +00:00
} ;
2020-12-24 04:32:25 +00:00
export const getActionResponses = createSelector ( getActions , ( actions ) = > {
2020-01-30 13:23:04 +00:00
const responses : Record < string , ActionResponse | undefined > = { } ;
2020-06-03 05:40:48 +00:00
2020-12-24 04:32:25 +00:00
actions . forEach ( ( a ) = > {
2020-01-30 13:23:04 +00:00
responses [ a . config . id ] = a . data ;
} ) ;
return responses ;
2020-06-03 05:40:48 +00:00
} ) ;
2020-07-21 10:36:53 +00:00
2020-07-03 08:58:58 +00:00
export const getAction = (
state : AppState ,
actionId : string ,
) : Action | undefined = > {
2020-12-24 04:32:25 +00:00
const action = find ( state . entities . actions , ( a ) = > a . config . id === actionId ) ;
2020-07-03 08:58:58 +00:00
return action ? action.config : undefined ;
} ;
2022-04-08 16:32:34 +00:00
export const getActionData = (
state : AppState ,
actionId : string ,
) : ActionResponse | undefined = > {
const action = find ( state . entities . actions , ( a ) = > a . config . id === actionId ) ;
return action ? action.data : undefined ;
} ;
2021-09-08 17:32:22 +00:00
export const getJSCollection = (
state : AppState ,
actionId : string ,
) : JSCollection | undefined = > {
const jsaction = find (
state . entities . jsActions ,
( a ) = > a . config . id === actionId ,
) ;
return jsaction ? jsaction.config : undefined ;
} ;
2020-07-03 08:58:58 +00:00
export function getCurrentPageNameByActionId (
state : AppState ,
actionId : string ,
) : string {
2020-12-24 04:32:25 +00:00
const action = state . entities . actions . find ( ( action ) = > {
2020-07-03 08:58:58 +00:00
return action . config . id === actionId ;
} ) ;
const pageId = action ? action . config . pageId : "" ;
return getPageNameByPageId ( state , pageId ) ;
}
2021-09-08 17:32:22 +00:00
export function getCurrentPageNameByJSCollectionId (
state : AppState ,
actionId : string ,
) : string {
const action = state . entities . jsActions . find ( ( action ) = > {
return action . config . id === actionId ;
} ) ;
const pageId = action ? action . config . pageId : "" ;
return getPageNameByPageId ( state , pageId ) ;
}
2020-07-03 08:58:58 +00:00
export function getPageNameByPageId ( state : AppState , pageId : string ) : string {
const page = state . entities . pageList . pages . find (
2020-12-24 04:32:25 +00:00
( page ) = > page . pageId === pageId ,
2020-07-03 08:58:58 +00:00
) ;
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 ) = >
2020-12-24 04:32:25 +00:00
createSelector ( [ getActionDirtyState ] , ( actionDirtyMap ) = > {
2020-07-03 08:58:58 +00:00
return id in actionDirtyMap && actionDirtyMap [ id ] ;
} ) ;
2020-08-07 14:24:26 +00:00
2020-08-14 07:43:01 +00:00
export const getAppData = ( state : AppState ) = > state . entities . app ;
2020-10-21 04:25:32 +00:00
2021-03-24 05:09:47 +00:00
export const getAppStoreData = ( state : AppState ) : AppStoreState = >
state . entities . app . store ;
2020-10-21 04:25:32 +00:00
export const getCanvasWidgets = ( state : AppState ) : CanvasWidgetsReduxState = >
state . entities . canvasWidgets ;
2021-03-08 08:24:12 +00:00
2022-08-19 10:10:36 +00:00
export const getCanvasWidgetsStructure = ( state : AppState ) = >
state . entities . canvasWidgetsStructure ;
2021-03-08 08:24:12 +00:00
const getPageWidgets = ( state : AppState ) = > state . ui . pageWidgets ;
2021-06-17 13:26:54 +00:00
export const getCurrentPageWidgets = createSelector (
getPageWidgets ,
getCurrentPageId ,
( widgetsByPage , currentPageId ) = >
currentPageId ? widgetsByPage [ currentPageId ] : { } ,
) ;
2021-08-06 09:17:56 +00:00
const getParentModalId = ( widget : any , pageWidgets : Record < string , 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 parentModalId ;
} ;
export const getCanvasWidgetsWithParentId = createSelector (
getCanvasWidgets ,
( canvasWidgets : CanvasWidgetsReduxState ) = > {
return Object . entries ( canvasWidgets ) . reduce (
( res , [ widgetId , widget ] : any ) = > {
const parentModalId = getParentModalId ( widget , canvasWidgets ) ;
return {
. . . res ,
[ widgetId ] : { . . . widget , parentModalId } ,
} ;
} ,
{ } ,
) ;
} ,
) ;
2021-03-08 08:24:12 +00:00
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 ) = > {
2021-08-06 09:17:56 +00:00
const parentModalId = getParentModalId ( widget , pageWidgets ) ;
2021-03-08 08:24:12 +00:00
return {
. . . res ,
[ widgetId ] : { . . . widget , pageId , parentModalId } ,
} ;
} ,
{ } ,
) ;
return {
. . . res ,
. . . widgetsMap ,
} ;
} ,
{ } ,
) ;
} ,
) ;
export const getAllPageWidgets = createSelector (
getAllWidgetsMap ,
( widgetsMap ) = > {
2022-06-21 13:57:34 +00:00
return Object . entries ( widgetsMap ) . reduce ( ( res : any [ ] , [ , widget ] : any ) = > {
res . push ( widget ) ;
return res ;
} , [ ] ) ;
2021-03-08 08:24:12 +00:00
} ,
) ;
2021-07-16 08:31:26 +00:00
2022-02-11 11:02:47 +00:00
export const getPageList = createSelector (
( state : AppState ) = > state . entities . pageList . pages ,
( pages ) = > pages ,
) ;
2021-08-02 16:06:33 +00:00
export const getPageListAsOptions = createSelector (
( state : AppState ) = > state . entities . pageList . pages ,
( pages ) = >
pages . map ( ( page ) = > ( {
label : page.pageName ,
id : page.pageId ,
value : ` ' ${ page . pageName } ' ` ,
} ) ) ,
) ;
export const getExistingPageNames = createSelector (
( state : AppState ) = > state . entities . pageList . pages ,
( pages ) = > pages . map ( ( page ) = > page . pageName ) ,
) ;
export const getExistingWidgetNames = createSelector (
( state : AppState ) = > state . entities . canvasWidgets ,
2021-12-17 13:51:06 +00:00
( widgets ) = > Object . values ( widgets ) . map ( ( widget ) = > widget . widgetName ) ,
2021-08-02 16:06:33 +00:00
) ;
export const getExistingActionNames = createSelector (
( state : AppState ) = > state . entities . actions ,
2021-12-16 12:40:53 +00:00
getCurrentPageId ,
// editingEntityName is actually an id and not a name per say and it points to the id of an action being edited through the explorer.
( state : AppState ) = > state . ui . explorer . entity . editingEntityName ,
( actions , currentPageId , editingEntityId ) = > {
// get the current action being edited
const editingAction =
editingEntityId &&
actions . filter (
( action : { config : { id : string } } ) = >
action . config . id === editingEntityId ,
) ;
// if the current action being edited is on the same page, filter the actions on the page and return their names.
2021-12-17 13:51:06 +00:00
// or if the there is no current action being edited (this happens when a widget, or any other entity is being edited), return the actions on the page.
if (
( editingAction &&
editingAction . length > 0 &&
editingAction [ 0 ] . config . pageId === currentPageId ) ||
( editingAction && editingAction . length < 1 )
) {
2021-12-16 12:40:53 +00:00
return actions . map (
( actionItem : { config : { name : string ; pageId : string } } ) = > {
if ( actionItem . config . pageId === currentPageId ) {
return actionItem . config . name ;
}
return undefined ;
} ,
) ;
} else {
// if current action being edited is on another page, filter the actions not on the page and return their names.
return actions . map (
( actionItem : { config : { name : string ; pageId : string } } ) = > {
if ( actionItem . config . pageId !== currentPageId ) {
return actionItem . config . name ;
}
return undefined ;
} ,
) ;
}
} ,
2021-08-02 16:06:33 +00:00
) ;
2021-12-15 08:23:24 +00:00
export const getExistingJSCollectionNames = createSelector (
getJSCollections ,
( jsActions ) = >
jsActions . map ( ( action : { config : { name : string } } ) = > action . config . name ) ,
) ;
2021-07-16 08:31:26 +00:00
export const getAppMode = ( state : AppState ) = > state . entities . app . mode ;
2021-08-06 09:17:56 +00:00
export const widgetsMapWithParentModalId = ( state : AppState ) = > {
const appMode = getAppMode ( state ) ;
return appMode === APP_MODE . EDIT
? getAllWidgetsMap ( state )
: getCanvasWidgetsWithParentId ( state ) ;
} ;
2021-09-13 07:22:51 +00:00
2022-03-17 10:28:54 +00:00
export const getIsReconnectingDatasourcesModalOpen = ( state : AppState ) = >
state . entities . datasources . isReconnectingModalOpen ;
2021-09-13 07:22:51 +00:00
export const getPageActions = ( pageId = "" ) = > {
return ( state : AppState ) = > {
return state . entities . actions . filter ( ( action ) = > {
return action . config . pageId == pageId ;
} ) ;
} ;
} ;
2022-01-27 09:50:05 +00:00
2022-01-29 07:26:19 +00:00
export const selectDatasourceIdToNameMap = createSelector (
getDatasources ,
( datasources ) = > {
return datasources . reduce ( ( acc , datasource ) = > {
acc [ datasource . id ] = datasource . name ;
return acc ;
} , { } as Record < string , string > ) ;
} ,
) ;
export const selectWidgetsForCurrentPage = createSelector (
( state : AppState ) = > state . ui . pageCanvasStructure ,
getCurrentPageId ,
( canvasStructure , pageId ) = > ( pageId ? canvasStructure [ pageId ] : null ) ,
) ;
export const selectAllPages = ( state : AppState ) = > {
return state . entities . pageList . pages ;
} ;
2022-03-17 10:28:54 +00:00
export const getIsListing = ( state : AppState ) = > {
return state . entities . datasources . isListing ;
} ;
2022-04-11 17:30:29 +00:00
export const getDatasourceLoading = ( state : AppState ) = > {
return state . entities . datasources . loading ;
} ;
2022-01-29 07:26:19 +00:00
export const selectFilesForExplorer = createSelector (
getActionsForCurrentPage ,
getJSCollectionsForCurrentPage ,
selectDatasourceIdToNameMap ,
2022-04-07 17:57:32 +00:00
selectFeatureFlags ,
( actions , jsActions , datasourceIdToNameMap , featureFlags ) = > {
const { JS_EDITOR : isJSEditorEnabled } = featureFlags ;
2022-01-29 07:26:19 +00:00
const files = [ . . . actions , . . . ( isJSEditorEnabled ? jsActions : [ ] ) ] . reduce (
( acc , file ) = > {
let group = "" ;
if ( file . config . pluginType === PluginType . JS ) {
group = "JS Objects" ;
} else if ( file . config . pluginType === PluginType . API ) {
group = isEmbeddedRestDatasource ( file . config . datasource )
? "APIs"
: datasourceIdToNameMap [ file . config . datasource . id ] ? ? "APIs" ;
} else {
group = datasourceIdToNameMap [ file . config . datasource . id ] ;
}
acc = acc . concat ( {
type : file . config . pluginType ,
entity : file ,
group ,
} ) ;
return acc ;
} ,
[ ] as Array < ExplorerFileEntity > ,
) ;
2022-02-11 07:30:30 +00:00
const filesSortedByGroupName = sortBy ( files , [
( file ) = > file . group ? . toLowerCase ( ) ,
( file ) = > file . entity . config ? . name ? . toLowerCase ( ) ,
] ) ;
2022-01-29 07:26:19 +00:00
const groupedFiles = filesSortedByGroupName . reduce (
( acc , file ) = > {
if ( acc . group !== file . group ) {
acc . files = acc . files . concat ( {
type : "group" ,
entity : {
name : file.group ,
} ,
} ) ;
acc . group = file . group ;
}
acc . files = acc . files . concat ( {
. . . file ,
entity : { id : file.entity.config.id , name : file.entity.config.name } ,
} ) ;
return acc ;
} ,
{
group : "" as any ,
files : [ ] as any ,
} ,
) ;
return groupedFiles . files ;
} ,
) ;
2022-01-27 09:50:05 +00:00
export const getActionValidationConfig = ( state : AppState , action : any ) = > {
const pluginId = action . pluginId ;
return getActionValidationConfigFromPlugin (
state . entities . plugins . editorConfigs [ pluginId ] ,
{ } ,
) ;
} ;
export const getAllActionValidationConfig = ( state : AppState ) = > {
const allActions = state . entities . actions ;
const allValidationConfigs : {
[ actionId : string ] : ActionValidationConfigMap ;
} = { } ;
2022-11-03 09:23:15 +00:00
for ( const action of allActions ) {
const pluginId = action . config . pluginId ;
2022-01-27 09:50:05 +00:00
let validationConfigs : ActionValidationConfigMap = { } ;
validationConfigs = getActionValidationConfigFromPlugin (
state . entities . plugins . editorConfigs [ pluginId ] ,
{ } ,
) ;
2022-11-03 09:23:15 +00:00
allValidationConfigs [ action . config . id ] = validationConfigs ;
2022-01-27 09:50:05 +00:00
}
return allValidationConfigs ;
} ;
function getActionValidationConfigFromPlugin (
2022-11-03 09:23:15 +00:00
editorConfigs : any ,
2022-01-27 09:50:05 +00:00
validationConfig : ActionValidationConfigMap ,
) : ActionValidationConfigMap {
let newValidationConfig : ActionValidationConfigMap = {
. . . validationConfig ,
} ;
2022-11-03 09:23:15 +00:00
if ( ! editorConfigs || ! editorConfigs . length ) return { } ;
for ( const editorConfig of editorConfigs ) {
if ( editorConfig . validationConfig ) {
const configProperty = editorConfig . configProperty ;
newValidationConfig [ configProperty ] = editorConfig . validationConfig ;
2022-01-27 09:50:05 +00:00
}
2022-11-03 09:23:15 +00:00
if ( editorConfig . children ) {
2022-01-27 09:50:05 +00:00
const childrenValidationConfig = getActionValidationConfigFromPlugin (
2022-11-03 09:23:15 +00:00
editorConfig . children ,
2022-01-27 09:50:05 +00:00
validationConfig ,
) ;
newValidationConfig = Object . assign (
newValidationConfig ,
childrenValidationConfig ,
) ;
}
}
return newValidationConfig ;
}
2022-04-28 16:51:02 +00:00
export const getJSActions = (
state : AppState ,
JSCollectionId : string ,
) : JSAction [ ] = > {
const jsCollection = state . entities . jsActions . find (
( jsCollectionData ) = > jsCollectionData . config . id === JSCollectionId ,
) ;
2022-06-15 07:16:53 +00:00
return jsCollection ? . config . actions
? sortBy ( jsCollection ? . config . actions , [ "name" ] )
: [ ] ;
2022-04-28 16:51:02 +00:00
} ;
export const getActiveJSActionId = (
state : AppState ,
jsCollectionId : string ,
) : string | null = > {
const jsCollection = state . entities . jsActions . find (
( jsCollectionData ) = > jsCollectionData . config . id === jsCollectionId ,
) ;
return jsCollection ? . activeJSActionId ? ? null ;
} ;
export const getIsExecutingJSAction = (
state : AppState ,
jsCollectionId : string ,
actionId : string ,
) : boolean = > {
const jsCollection = state . entities . jsActions . find (
( jsCollectionData ) = > jsCollectionData . config . id === jsCollectionId ,
) ;
if ( jsCollection ? . isExecuting && jsCollection . isExecuting [ actionId ] ) {
return jsCollection . isExecuting [ actionId ] ;
}
return false ;
} ;
export const getJSCollectionParseErrors = (
state : AppState ,
jsCollectionName : string ,
) = > {
const dataTree = state . evaluations . tree ;
const allErrors = get (
dataTree ,
` ${ jsCollectionName } . ${ EVAL_ERROR_PATH } .body ` ,
[ ] ,
) as EvaluationError [ ] ;
return allErrors . filter ( ( error ) = > {
2022-05-11 10:20:33 +00:00
return error . errorType === PropertyEvaluationErrorType . PARSE ;
2022-04-28 16:51:02 +00:00
} ) ;
} ;
2022-09-30 13:41:04 +00:00
export const getNumberOfEntitiesInCurrentPage = createSelector (
getCanvasWidgets ,
getActionsForCurrentPage ,
getJSCollectionsForCurrentPage ,
( widgets , actions , jsCollections ) = > {
return (
Object . keys ( widgets ) . length - 1 + actions . length + jsCollections . length
) ;
} ,
) ;