* migration from organization to workspace on code level * updated a few more files * fixed runtime errors * update org settings URL * Renamed organizationId in domain objects * changed field named from organization to workspace * Reverted AppsmithRole changes * fixed migrations * recreating indexes * migration update * seed data runs before migration, undo changes * mock commit * seedmongo to populate upgraded data, datasource upgrade * fixed two test cases * updated migrations * updated prop name * Upgraded AclPermission * comment * migrated AppsmithRole * more changes * final set of changes * variable name changes * update cypress variable name * Update app/server/appsmith-server/src/main/java/com/appsmith/server/controllers/ce/ApplicationControllerCE.java * Update app/server/appsmith-interfaces/src/main/java/com/appsmith/external/models/Datasource.java Co-authored-by: Trisha Anand <trisha@appsmith.com> * reverting encryption handler change * migrated a few missed out org to workspace * migrated a few missed out org to workspace * migration changes * Removed Permission import * fixed AppsmithRole * mongodb version update * fixed compile error * fixed compile issue * fixed some tests * simplified embedded mongodb config * updated a cypress test Co-authored-by: Sidhant Goel <sidhant@appsmith.com> Co-authored-by: Trisha Anand <trisha@appsmith.com> Co-authored-by: Sidhant Goel <sidhant@hexcod.in>
326 lines
9.3 KiB
TypeScript
326 lines
9.3 KiB
TypeScript
import {
|
|
isPermitted,
|
|
PERMISSION_TYPE,
|
|
} from "pages/Applications/permissionHelpers";
|
|
import { AppState } from "reducers";
|
|
import { createSelector } from "reselect";
|
|
import { getUserApplicationsWorkspaces } from "./applicationSelectors";
|
|
import { getWidgets } from "sagas/selectors";
|
|
import { getActionResponses, getActions } from "./entitiesSelector";
|
|
import { getSelectedWidget } from "./ui";
|
|
import { GuidedTourEntityNames } from "pages/Editor/GuidedTour/constants";
|
|
|
|
// Signposting selectors
|
|
export const getEnableFirstTimeUserOnboarding = (state: AppState) => {
|
|
return state.ui.onBoarding.enableFirstTimeUserOnboarding;
|
|
};
|
|
|
|
export const getFirstTimeUserOnboardingApplicationId = (state: AppState) => {
|
|
return state.ui.onBoarding.firstTimeUserOnboardingApplicationId;
|
|
};
|
|
|
|
export const getFirstTimeUserOnboardingComplete = (state: AppState) => {
|
|
return state.ui.onBoarding.firstTimeUserOnboardingComplete;
|
|
};
|
|
|
|
export const getFirstTimeUserOnboardingModal = (state: AppState) =>
|
|
state.ui.onBoarding.showFirstTimeUserOnboardingModal;
|
|
|
|
export const getIsFirstTimeUserOnboardingEnabled = createSelector(
|
|
(state: AppState) => state.entities.pageList.applicationId,
|
|
getEnableFirstTimeUserOnboarding,
|
|
getFirstTimeUserOnboardingApplicationId,
|
|
(currentApplicationId, enabled, applicationId) => {
|
|
return enabled && currentApplicationId === applicationId;
|
|
},
|
|
);
|
|
|
|
export const getInOnboardingWidgetSelection = (state: AppState) =>
|
|
state.ui.onBoarding.inOnboardingWidgetSelection;
|
|
|
|
// Guided Tour selectors
|
|
export const isExploringSelector = (state: AppState) =>
|
|
state.ui.onBoarding.exploring;
|
|
export const inGuidedTour = (state: AppState) => state.ui.onBoarding.guidedTour;
|
|
export const getCurrentStep = (state: AppState) =>
|
|
state.ui.onBoarding.currentStep;
|
|
export const wasTableWidgetSelected = (state: AppState) =>
|
|
state.ui.onBoarding.tableWidgetWasSelected;
|
|
export const showEndTourDialogSelector = (state: AppState) =>
|
|
state.ui.onBoarding.showEndTourDialog;
|
|
export const showDeviatingDialogSelector = (state: AppState) =>
|
|
state.ui.onBoarding.showDeviatingDialog;
|
|
export const showPostCompletionMessage = (state: AppState) =>
|
|
state.ui.onBoarding.showPostCompletionMessage;
|
|
export const forceShowContentSelector = (state: AppState) =>
|
|
state.ui.onBoarding.forceShowContent;
|
|
|
|
export const getTableWidget = createSelector(getWidgets, (widgets) => {
|
|
return Object.values(widgets).find(
|
|
(widget) => widget.widgetName === "CustomersTable",
|
|
);
|
|
});
|
|
|
|
export const getQueryAction = createSelector(getActions, (actions) => {
|
|
return actions.find((action) => {
|
|
return action.config.name === "getCustomers";
|
|
});
|
|
});
|
|
|
|
export const isQueryLimitUpdated = createSelector(getQueryAction, (query) => {
|
|
if (query) {
|
|
let body = query.config.actionConfiguration.body;
|
|
if (body) {
|
|
// eslint-disable-next-line no-console
|
|
const regex = /SELECT \* FROM user_data ORDER BY id LIMIT 10;/gi;
|
|
// Replacing new line characters
|
|
body = body.replace(/(?:\r\n|\r|\n)/g, "");
|
|
// Replace sql comments
|
|
body = body.replace(/(\/\*[^*]*\*\/)|(\/\/[^*]*)|(--[^.].*)/gm, "");
|
|
return regex.test(body);
|
|
}
|
|
}
|
|
return false;
|
|
});
|
|
|
|
export const isQueryExecutionSuccessful = createSelector(
|
|
getActionResponses,
|
|
getQueryAction,
|
|
(responses, query) => {
|
|
if (query?.config.id && responses[query.config.id]) {
|
|
return responses[query.config.id]?.isExecutionSuccess;
|
|
}
|
|
},
|
|
);
|
|
|
|
export const isTableWidgetSelected = createSelector(
|
|
getTableWidget,
|
|
getSelectedWidget,
|
|
wasTableWidgetSelected,
|
|
(tableWidget, selectedWidgetId, tableWidgetWasSelected) => {
|
|
if (!tableWidgetWasSelected) {
|
|
return tableWidget?.widgetId === selectedWidgetId;
|
|
}
|
|
|
|
return true;
|
|
},
|
|
);
|
|
|
|
export const tableWidgetHasBinding = createSelector(
|
|
getTableWidget,
|
|
(tableWidget) => {
|
|
if (tableWidget) {
|
|
if (tableWidget.tableData === `{{getCustomers.data}}`) {
|
|
return tableWidget.widgetId;
|
|
}
|
|
}
|
|
|
|
return "";
|
|
},
|
|
);
|
|
|
|
export const containerWidgetAdded = createSelector(getWidgets, (widgets) => {
|
|
return !!Object.values(widgets).find(
|
|
(widget) => widget.type === "CONTAINER_WIDGET",
|
|
);
|
|
});
|
|
|
|
export const getHadReachedStep = (state: AppState) =>
|
|
state.ui.onBoarding.hadReachedStep;
|
|
|
|
export const isNameInputBoundSelector = createSelector(
|
|
getTableWidget,
|
|
getWidgets,
|
|
(tableWidget, widgets) => {
|
|
if (tableWidget) {
|
|
const widgetValues = Object.values(widgets);
|
|
const countryInput = widgetValues.find((widget) => {
|
|
if (widget.type === "INPUT_WIDGET_V2") {
|
|
return (
|
|
widget.defaultText ===
|
|
`{{${tableWidget.widgetName}.selectedRow.name}}`
|
|
);
|
|
}
|
|
return false;
|
|
});
|
|
|
|
if (countryInput) return true;
|
|
}
|
|
|
|
return false;
|
|
},
|
|
);
|
|
|
|
// Get the id of NameInput
|
|
export const nameInputSelector = createSelector(getWidgets, (widgets) => {
|
|
const widgetValues = Object.values(widgets);
|
|
const nameInput = widgetValues.find((widget) => {
|
|
if (widget.type === "INPUT_WIDGET_V2") {
|
|
return widget.widgetName === "NameInput";
|
|
}
|
|
});
|
|
|
|
return nameInput ? nameInput.widgetId : "";
|
|
});
|
|
// Check if CountryInput is selected
|
|
export const countryInputSelector = createSelector(
|
|
getWidgets,
|
|
getSelectedWidget,
|
|
(widgets, selectedWidgetId) => {
|
|
const widgetValues = Object.values(widgets);
|
|
const countryInput = widgetValues.find((widget) => {
|
|
if (widget.type === "INPUT_WIDGET_V2") {
|
|
return widget.widgetName === "CountryInput";
|
|
}
|
|
});
|
|
|
|
return countryInput ? countryInput.widgetId === selectedWidgetId : false;
|
|
},
|
|
);
|
|
// Check if ImageWidget is selected
|
|
export const imageWidgetSelector = createSelector(
|
|
getWidgets,
|
|
getSelectedWidget,
|
|
(widgets, selectedWidgetId) => {
|
|
const widgetValues = Object.values(widgets);
|
|
const imageWidget = widgetValues.find((widget) => {
|
|
return widget.widgetName === GuidedTourEntityNames.DISPLAY_IMAGE;
|
|
});
|
|
|
|
return imageWidget ? imageWidget.widgetId === selectedWidgetId : false;
|
|
},
|
|
);
|
|
|
|
export const isCountryInputBound = createSelector(
|
|
getTableWidget,
|
|
getWidgets,
|
|
(tableWidget, widgets) => {
|
|
if (tableWidget) {
|
|
const widgetValues = Object.values(widgets);
|
|
const countryInput = widgetValues.find((widget) => {
|
|
if (widget.widgetName === GuidedTourEntityNames.COUNTRY_INPUT) {
|
|
return (
|
|
widget.defaultText ===
|
|
`{{${tableWidget.widgetName}.selectedRow.country}}`
|
|
);
|
|
}
|
|
return false;
|
|
});
|
|
|
|
if (countryInput) return true;
|
|
}
|
|
|
|
return false;
|
|
},
|
|
);
|
|
|
|
export const isEmailInputBound = createSelector(
|
|
getTableWidget,
|
|
getWidgets,
|
|
(tableWidget, widgets) => {
|
|
if (tableWidget) {
|
|
const widgetValues = Object.values(widgets);
|
|
const countryInput = widgetValues.find((widget) => {
|
|
if (widget.widgetName === GuidedTourEntityNames.EMAIL_INPUT) {
|
|
return (
|
|
widget.defaultText ===
|
|
`{{${tableWidget.widgetName}.selectedRow.email}}`
|
|
);
|
|
}
|
|
|
|
return false;
|
|
});
|
|
|
|
if (countryInput) return true;
|
|
}
|
|
|
|
return false;
|
|
},
|
|
);
|
|
|
|
export const isImageWidgetBound = createSelector(
|
|
getTableWidget,
|
|
getWidgets,
|
|
(tableWidget, widgets) => {
|
|
if (tableWidget) {
|
|
const widgetValues = Object.values(widgets);
|
|
const imageWidget = widgetValues.find((widget) => {
|
|
if (widget.widgetName === GuidedTourEntityNames.DISPLAY_IMAGE) {
|
|
return (
|
|
widget.image === `{{${tableWidget.widgetName}.selectedRow.image}}`
|
|
);
|
|
}
|
|
|
|
return false;
|
|
});
|
|
|
|
if (imageWidget) return true;
|
|
}
|
|
|
|
return false;
|
|
},
|
|
);
|
|
export const isButtonWidgetPresent = createSelector(getWidgets, (widgets) => {
|
|
const widgetValues = Object.values(widgets);
|
|
const buttonWidget = widgetValues.find((widget) => {
|
|
return widget.type === "BUTTON_WIDGET";
|
|
});
|
|
|
|
return !!buttonWidget;
|
|
});
|
|
|
|
export const buttonWidgetHasOnClickBinding = createSelector(
|
|
getWidgets,
|
|
(widgets) => {
|
|
const widgetValues = Object.values(widgets);
|
|
const buttonWidget = widgetValues.find((widget) => {
|
|
return (
|
|
widget.type === "BUTTON_WIDGET" &&
|
|
widget.onClick &&
|
|
widget.onClick.includes("{{updateCustomerInfo.run(")
|
|
);
|
|
});
|
|
|
|
return !!buttonWidget;
|
|
},
|
|
);
|
|
|
|
export const buttonWidgetHasOnSuccessBinding = createSelector(
|
|
getWidgets,
|
|
(widgets) => {
|
|
const widgetValues = Object.values(widgets);
|
|
const buttonWidget = widgetValues.find((widget) => {
|
|
return (
|
|
widget.type === "BUTTON_WIDGET" &&
|
|
widget.onClick &&
|
|
widget.onClick.includes(
|
|
"{{updateCustomerInfo.run(() => getCustomers.run(), () => {})}}",
|
|
)
|
|
);
|
|
});
|
|
|
|
return !!buttonWidget;
|
|
},
|
|
);
|
|
|
|
export const showSuccessMessage = (state: AppState) =>
|
|
state.ui.onBoarding.showSuccessMessage;
|
|
export const showInfoMessageSelector = (state: AppState) =>
|
|
state.ui.onBoarding.showInfoMessage;
|
|
|
|
export const loading = (state: AppState) => state.ui.onBoarding.loading;
|
|
|
|
// To find an workspace where the user has permission to create an
|
|
// application
|
|
export const getOnboardingWorkspaces = createSelector(
|
|
getUserApplicationsWorkspaces,
|
|
(userWorkspaces) => {
|
|
return userWorkspaces.filter((userWorkspace) =>
|
|
isPermitted(
|
|
userWorkspace.workspace.userPermissions || [],
|
|
PERMISSION_TYPE.CREATE_APPLICATION,
|
|
),
|
|
);
|
|
},
|
|
);
|