From 1e86690b524ff796020f68d0c16c2b96ba72ac3d Mon Sep 17 00:00:00 2001 From: Hetu Nandu Date: Thu, 19 Mar 2020 08:55:52 +0530 Subject: [PATCH 1/6] data tree only contains current page actions --- app/client/src/actions/pageActions.tsx | 55 ++++++------------- .../src/constants/ReduxActionConstants.tsx | 1 + .../src/entities/DataTree/dataTreeFactory.ts | 24 +++++--- .../entityReducers/pageListReducer.tsx | 8 +++ .../reducers/uiReducers/appViewReducer.tsx | 9 +-- .../src/reducers/uiReducers/editorReducer.tsx | 3 - app/client/src/sagas/PageSagas.tsx | 15 +++-- app/client/src/sagas/selectors.tsx | 13 ++--- app/client/src/selectors/appViewSelectors.tsx | 4 +- app/client/src/selectors/dataTreeSelectors.ts | 16 ++++-- app/client/src/selectors/editorSelectors.tsx | 4 +- app/client/src/selectors/entitiesSelector.ts | 13 +++++ 12 files changed, 89 insertions(+), 76 deletions(-) diff --git a/app/client/src/actions/pageActions.tsx b/app/client/src/actions/pageActions.tsx index 77e18984c2..d086b6c003 100644 --- a/app/client/src/actions/pageActions.tsx +++ b/app/client/src/actions/pageActions.tsx @@ -1,16 +1,15 @@ import { FetchPageRequest } from "api/PageApi"; -import { WidgetProps, WidgetOperation } from "widgets/BaseWidget"; +import { WidgetOperation, WidgetProps } from "widgets/BaseWidget"; import { WidgetType } from "constants/WidgetConstants"; import { ReduxActionTypes, ReduxAction, UpdateCanvasPayload, - SavePagePayload, SavePageSuccessPayload, FetchPageListPayload, } from "constants/ReduxActionConstants"; -import { ContainerWidgetProps } from "widgets/ContainerWidget"; import { FlattenedWidgetProps } from "reducers/entityReducers/canvasWidgetsReducer"; +import { ContainerWidgetProps } from "widgets/ContainerWidget"; export const fetchPageList = ( applicationId: string, @@ -31,37 +30,30 @@ export const fetchPage = (pageId: string): ReduxAction => { }, }; }; + export const fetchPageSuccess = () => { return { type: ReduxActionTypes.FETCH_PAGE_SUCCESS, }; }; -export const addWidget = ( - pageId: string, - widget: WidgetProps, -): ReduxAction<{ pageId: string; widget: WidgetProps }> => { - return { - type: ReduxActionTypes.ADD_PAGE_WIDGET, - payload: { - pageId, - widget, - }, - }; +export type FetchPublishedPageSuccessPayload = { + pageId: string; + dsl: ContainerWidgetProps; + pageWidgetId: string; }; -export const removeWidget = ( - pageId: string, - widgetId: string, -): ReduxAction<{ pageId: string; widgetId: string }> => { - return { - type: ReduxActionTypes.REMOVE_PAGE_WIDGET, - payload: { - pageId, - widgetId, - }, - }; -}; +export const fetchPublishedPageSuccess = ( + payload: FetchPublishedPageSuccessPayload, +) => ({ + type: ReduxActionTypes.FETCH_PUBLISHED_PAGE_SUCCESS, + payload, +}); + +export const updateCurrentPage = (id: string) => ({ + type: ReduxActionTypes.UPDATE_CURRENT_PAGE, + payload: { id }, +}); export const updateCanvas = ( payload: UpdateCanvasPayload, @@ -72,17 +64,6 @@ export const updateCanvas = ( }; }; -export const savePage = ( - pageId: string, - layoutId: string, - dsl: ContainerWidgetProps, -): ReduxAction => { - return { - type: ReduxActionTypes.SAVE_PAGE_INIT, - payload: { pageId, layoutId, dsl }, - }; -}; - export const savePageSuccess = (payload: SavePageSuccessPayload) => { return { type: ReduxActionTypes.SAVE_PAGE_SUCCESS, diff --git a/app/client/src/constants/ReduxActionConstants.tsx b/app/client/src/constants/ReduxActionConstants.tsx index 7bb8d0ffd2..7fac09e78a 100644 --- a/app/client/src/constants/ReduxActionConstants.tsx +++ b/app/client/src/constants/ReduxActionConstants.tsx @@ -151,6 +151,7 @@ export const ReduxActionTypes: { [key: string]: string } = { EXECUTE_API_ACTION_REQUEST: "EXECUTE_API_ACTION_REQUEST", EXECUTE_API_ACTION_SUCCESS: "EXECUTE_API_ACTION_SUCCESS", SET_WIDGET_DYNAMIC_PROPERTY: "SET_WIDGET_DYNAMIC_PROPERTY", + UPDATE_CURRENT_PAGE: "UPDATE_CURRENT_PAGE", }; export type ReduxActionType = typeof ReduxActionTypes[keyof typeof ReduxActionTypes]; diff --git a/app/client/src/entities/DataTree/dataTreeFactory.ts b/app/client/src/entities/DataTree/dataTreeFactory.ts index fdcb1a856e..fa47516b72 100644 --- a/app/client/src/entities/DataTree/dataTreeFactory.ts +++ b/app/client/src/entities/DataTree/dataTreeFactory.ts @@ -1,7 +1,11 @@ -import { ActionData } from "reducers/entityReducers/actionsReducer"; +import { + ActionData, + ActionDataState, +} from "reducers/entityReducers/actionsReducer"; import { WidgetProps } from "widgets/BaseWidget"; -import { AppState } from "reducers"; import { ActionResponse } from "api/ActionAPI"; +import { CanvasWidgetsReduxState } from "reducers/entityReducers/canvasWidgetsReducer"; +import { MetaState } from "reducers/entityReducers/metaReducer"; export type ActionDescription = { type: string; @@ -42,11 +46,17 @@ export type DataTree = { [entityName: string]: DataTreeEntity; } & { actionPaths?: string[] }; +type DataTreeSeed = { + actions: ActionDataState; + widgets: CanvasWidgetsReduxState; + widgetsMeta: MetaState; +}; + export class DataTreeFactory { - static create(state: AppState["entities"]): DataTree { + static create({ actions, widgets, widgetsMeta }: DataTreeSeed): DataTree { const dataTree: DataTree = {}; dataTree.actionPaths = ["navigateTo", "navigateToUrl", "showAlert"]; - state.actions.forEach(a => { + actions.forEach(a => { dataTree[a.config.name] = { ...a, data: a.data ? a.data.body : {}, @@ -64,9 +74,9 @@ export class DataTreeFactory { }; dataTree.actionPaths && dataTree.actionPaths.push(`${a.config.name}.run`); }); - Object.keys(state.canvasWidgets).forEach(w => { - const widget = state.canvasWidgets[w]; - const widgetMetaProps = state.meta[w]; + Object.keys(widgets).forEach(w => { + const widget = widgets[w]; + const widgetMetaProps = widgetsMeta[w]; dataTree[widget.widgetName] = { ...widget, ...widgetMetaProps, diff --git a/app/client/src/reducers/entityReducers/pageListReducer.tsx b/app/client/src/reducers/entityReducers/pageListReducer.tsx index ed101cbdfa..78f4557de8 100644 --- a/app/client/src/reducers/entityReducers/pageListReducer.tsx +++ b/app/client/src/reducers/entityReducers/pageListReducer.tsx @@ -64,12 +64,20 @@ const pageListReducer = createReducer(initialState, { } return state; }, + [ReduxActionTypes.UPDATE_CURRENT_PAGE]: ( + state: PageListReduxState, + action: ReduxAction<{ id: string }>, + ) => ({ + ...state, + currentPageId: action.payload.id, + }), }); export interface PageListReduxState { pages: PageListPayload; applicationId?: string; defaultPageId?: string; + currentPageId?: string; } export default pageListReducer; diff --git a/app/client/src/reducers/uiReducers/appViewReducer.tsx b/app/client/src/reducers/uiReducers/appViewReducer.tsx index 6330cc75a1..5fc46771c2 100644 --- a/app/client/src/reducers/uiReducers/appViewReducer.tsx +++ b/app/client/src/reducers/uiReducers/appViewReducer.tsx @@ -6,6 +6,7 @@ import { ReduxActionTypes, PageListPayload, } from "constants/ReduxActionConstants"; +import { FetchPublishedPageSuccessPayload } from "actions/pageActions"; const initialState: AppViewReduxState = { isFetchingPage: false, @@ -31,16 +32,11 @@ const appViewReducer = createReducer(initialState, { }, [ReduxActionTypes.FETCH_PUBLISHED_PAGE_SUCCESS]: ( state: AppViewReduxState, - action: ReduxAction<{ - pageId: string; - dsl: ContainerWidgetProps; - pageWidgetId: string; - }>, + action: ReduxAction, ) => { return { ...state, dsl: action.payload.dsl, - currentPageId: action.payload.pageId, isFetchingPage: false, pageWidgetId: action.payload.pageWidgetId, }; @@ -51,7 +47,6 @@ export interface AppViewReduxState { initialized: boolean; dsl?: ContainerWidgetProps; isFetchingPage: boolean; - currentPageId?: string; currentLayoutId?: string; pages: PageListPayload; pageWidgetId: string; diff --git a/app/client/src/reducers/uiReducers/editorReducer.tsx b/app/client/src/reducers/uiReducers/editorReducer.tsx index 546d1a9d9a..d0b029ebe8 100644 --- a/app/client/src/reducers/uiReducers/editorReducer.tsx +++ b/app/client/src/reducers/uiReducers/editorReducer.tsx @@ -89,7 +89,6 @@ const editorReducer = createReducer(initialState, { action: ReduxAction, ) => { const { - currentPageId, currentPageName, currentLayoutId, pageWidgetId, @@ -99,7 +98,6 @@ const editorReducer = createReducer(initialState, { state.loadingStates.publishingError = false; return { ...state, - currentPageId, currentPageName, currentLayoutId, pageWidgetId, @@ -155,7 +153,6 @@ export interface EditorReduxState { initialized: boolean; dsl?: ContainerWidgetProps; pageWidgetId?: string; - currentPageId?: string; currentLayoutId?: string; currentPageName?: string; selectedWidget?: string; diff --git a/app/client/src/sagas/PageSagas.tsx b/app/client/src/sagas/PageSagas.tsx index abb254f15e..3a8e191560 100644 --- a/app/client/src/sagas/PageSagas.tsx +++ b/app/client/src/sagas/PageSagas.tsx @@ -14,6 +14,8 @@ import { fetchPageSuccess, updateWidgetNameSuccess, deletePageSuccess, + updateCurrentPage, + fetchPublishedPageSuccess, } from "actions/pageActions"; import PageApi, { FetchPageResponse, @@ -125,6 +127,8 @@ export function* fetchPageSaga( const canvasWidgetsPayload = getCanvasWidgetsPayload(fetchPageResponse); // Update the canvas yield put(updateCanvas(canvasWidgetsPayload)); + // set current page + yield put(updateCurrentPage(pageId)); // dispatch fetch page success yield put(fetchPageSuccess()); // Execute page load actions @@ -156,15 +160,14 @@ export function* fetchPublishedPageSaga( if (isValidResponse) { const canvasWidgetsPayload = getCanvasWidgetsPayload(response); yield put(updateCanvas(canvasWidgetsPayload)); - yield put({ - type: ReduxActionTypes.FETCH_PUBLISHED_PAGE_SUCCESS, - payload: { + yield put(updateCurrentPage(pageId)); + yield put( + fetchPublishedPageSuccess({ dsl: response.data.layouts[0].dsl, - layoutId: response.data.layouts[0].id, pageId: request.pageId, pageWidgetId: canvasWidgetsPayload.pageWidgetId, - }, - }); + }), + ); // Execute page load actions yield put(executePageLoadActions(canvasWidgetsPayload.pageActions)); } diff --git a/app/client/src/sagas/selectors.tsx b/app/client/src/sagas/selectors.tsx index f410de41c7..0649bb81d8 100644 --- a/app/client/src/sagas/selectors.tsx +++ b/app/client/src/sagas/selectors.tsx @@ -9,6 +9,8 @@ export const getWidgets = ( return state.entities.canvasWidgets; }; +export const getWidgetsMeta = (state: AppState) => state.entities.meta; + export const getWidget = (state: AppState, widgetId: string): WidgetProps => { return state.entities.canvasWidgets[widgetId]; }; @@ -16,13 +18,10 @@ export const getWidget = (state: AppState, widgetId: string): WidgetProps => { export const getEditorConfigs = ( state: AppState, ): { pageId: string; layoutId: string } | undefined => { - const { currentLayoutId, currentPageId } = state.ui.editor; - return currentLayoutId && currentPageId - ? { - pageId: currentPageId, - layoutId: currentLayoutId, - } - : undefined; + const pageId = state.entities.pageList.currentPageId; + const layoutId = state.ui.editor.currentLayoutId; + if (!pageId || !layoutId) return undefined; + return { pageId, layoutId }; }; export const getDefaultWidgetConfig = ( diff --git a/app/client/src/selectors/appViewSelectors.tsx b/app/client/src/selectors/appViewSelectors.tsx index d19b68a8d1..20543ffcb7 100644 --- a/app/client/src/selectors/appViewSelectors.tsx +++ b/app/client/src/selectors/appViewSelectors.tsx @@ -32,6 +32,6 @@ export const getIsInitialized = createSelector( ); export const getCurrentDSLPageId = createSelector( - getAppViewState, - (view: AppViewReduxState) => view.currentPageId, + getPageListState, + (pageList: PageListReduxState) => pageList.currentPageId, ); diff --git a/app/client/src/selectors/dataTreeSelectors.ts b/app/client/src/selectors/dataTreeSelectors.ts index 2580b8836c..793414b8ca 100644 --- a/app/client/src/selectors/dataTreeSelectors.ts +++ b/app/client/src/selectors/dataTreeSelectors.ts @@ -1,14 +1,20 @@ -import { AppState } from "reducers"; import { createSelector } from "reselect"; -import { getActions } from "./entitiesSelector"; +import { getActionsForCurrentPage } from "./entitiesSelector"; import { ActionDataState } from "reducers/entityReducers/actionsReducer"; import { getEvaluatedDataTree } from "utils/DynamicBindingUtils"; import { extraLibraries } from "jsExecution/JSExecutionManagerSingleton"; import { DataTree, DataTreeFactory } from "entities/DataTree/dataTreeFactory"; import _ from "lodash"; +import { getWidgets, getWidgetsMeta } from "sagas/selectors"; -export const getUnevaluatedDataTree = (state: AppState): DataTree => - DataTreeFactory.create(state.entities); +export const getUnevaluatedDataTree = createSelector( + getActionsForCurrentPage, + getWidgets, + getWidgetsMeta, + (actions, widgets, widgetsMeta) => { + return DataTreeFactory.create({ actions, widgets, widgetsMeta }); + }, +); export const evaluateDataTree = createSelector( getUnevaluatedDataTree, @@ -21,7 +27,7 @@ export const evaluateDataTree = createSelector( // there isn't a response already export const getDataTreeForAutocomplete = createSelector( evaluateDataTree, - getActions, + getActionsForCurrentPage, (tree: DataTree, actions: ActionDataState) => { const cachedResponses: Record = {}; if (actions && actions.length) { diff --git a/app/client/src/selectors/editorSelectors.tsx b/app/client/src/selectors/editorSelectors.tsx index a0d8e18a70..7bce32a0c3 100644 --- a/app/client/src/selectors/editorSelectors.tsx +++ b/app/client/src/selectors/editorSelectors.tsx @@ -59,8 +59,8 @@ export const getPageList = createSelector( ); export const getCurrentPageId = createSelector( - getEditorState, - (editor: EditorReduxState) => editor.currentPageId, + getPageListState, + (pageList: PageListReduxState) => pageList.currentPageId, ); export const getCurrentLayoutId = createSelector( diff --git a/app/client/src/selectors/entitiesSelector.ts b/app/client/src/selectors/entitiesSelector.ts index 4afbce30ea..3c8afa7302 100644 --- a/app/client/src/selectors/entitiesSelector.ts +++ b/app/client/src/selectors/entitiesSelector.ts @@ -1,6 +1,7 @@ import { AppState } from "reducers"; import { ActionDataState } from "reducers/entityReducers/actionsReducer"; import { ActionResponse } from "api/ActionAPI"; +import { createSelector } from "reselect"; export const getEntities = (state: AppState): AppState["entities"] => state.entities; @@ -19,6 +20,18 @@ export const getPluginIdOfName = ( export const getActions = (state: AppState): ActionDataState => state.entities.actions; +const getCurrentPageId = (state: AppState) => + state.entities.pageList.currentPageId; + +export const getActionsForCurrentPage = createSelector( + getCurrentPageId, + getActions, + (pageId, actions) => { + if (!pageId) return []; + return actions.filter(a => a.config.pageId === pageId); + }, +); + export const getActionResponses = ( state: AppState, ): Record => { From 546b0b7b3aaa5529079fd4ec68a2ab8254f499d8 Mon Sep 17 00:00:00 2001 From: Hetu Nandu Date: Thu, 19 Mar 2020 10:29:06 +0530 Subject: [PATCH 2/6] store parsed state --- app/client/src/sagas/WidgetOperationSagas.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/client/src/sagas/WidgetOperationSagas.tsx b/app/client/src/sagas/WidgetOperationSagas.tsx index 568c740d22..e1df56f3ca 100644 --- a/app/client/src/sagas/WidgetOperationSagas.tsx +++ b/app/client/src/sagas/WidgetOperationSagas.tsx @@ -37,6 +37,7 @@ import { WidgetTypes } from "constants/WidgetConstants"; import WidgetFactory from "utils/WidgetFactory"; import { buildWidgetBlueprint } from "sagas/WidgetBlueprintSagas"; import { resetWidgetMetaProperty } from "actions/metaActions"; +import ValidationFactory from "utils/ValidationFactory"; export function* addChildSaga(addChildAction: ReduxAction) { try { @@ -257,16 +258,22 @@ function* setWidgetDynamicPropertySaga( ) { const { isDynamic, propertyName, widgetId } = action.payload; const widget: WidgetProps = yield select(getWidget, widgetId); + const propertyValue = widget[propertyName]; const dynamicProperties: Record = { ...widget.dynamicProperties, }; if (isDynamic) { dynamicProperties[propertyName] = true; - const value = convertToString(widget[propertyName]); + const value = convertToString(propertyValue); yield put(updateWidgetProperty(widgetId, propertyName, value)); } else { delete dynamicProperties[propertyName]; - yield put(updateWidgetProperty(widgetId, propertyName, undefined)); + const { parsed } = ValidationFactory.validateWidgetProperty( + widget.type, + propertyName, + propertyValue, + ); + yield put(updateWidgetProperty(widgetId, propertyName, parsed)); } yield put( updateWidgetProperty(widgetId, "dynamicProperties", dynamicProperties), From 9f6621231fbe5b202f9eac17fa4578a9ece5dec6 Mon Sep 17 00:00:00 2001 From: Satbir Singh Date: Fri, 20 Mar 2020 09:45:44 +0000 Subject: [PATCH 3/6] Tooltip css fixes. --- .../propertyControls/StyledControls.tsx | 7 +++- app/client/src/constants/Colors.tsx | 1 + app/client/src/constants/DefaultTheme.tsx | 1 + .../Editor/PropertyPane/PropertyControl.tsx | 35 ++++++++++++------- 4 files changed, 30 insertions(+), 14 deletions(-) diff --git a/app/client/src/components/propertyControls/StyledControls.tsx b/app/client/src/components/propertyControls/StyledControls.tsx index 13b94d361c..e1f54f2118 100644 --- a/app/client/src/components/propertyControls/StyledControls.tsx +++ b/app/client/src/components/propertyControls/StyledControls.tsx @@ -41,17 +41,22 @@ export const ControlWrapper = styled.div` export const ControlPropertyLabelContainer = styled.div` display: flex; align-items: center; - & > label { + label { color: ${props => props.theme.colors.paneText}; margin-bottom: ${props => props.theme.spaces[1]}px; font-size: ${props => props.theme.fontSizes[3]}px; } + .underline { + color: ${props => props.theme.colors.paneTextUnderline}; + } `; export const JSToggleButton = styled.span<{ active: boolean }>` margin: 0 3px; cursor: pointer; + height: 24px; svg { + height: 24px; rect { fill: ${props => props.active diff --git a/app/client/src/constants/Colors.tsx b/app/client/src/constants/Colors.tsx index b635d401b5..7688ba6ff2 100644 --- a/app/client/src/constants/Colors.tsx +++ b/app/client/src/constants/Colors.tsx @@ -10,6 +10,7 @@ export const Colors: Record = { MYSTIC: "#E1E8ED", AQUA_HAZE: "#EEF2F5", GRAY_CHATEAU: "#A2A6A8", + LIGHT_GREYISH_BLUE: "#B0BFCB", SUNGLOW: "#FFCB33", BLACK: "#000000", diff --git a/app/client/src/constants/DefaultTheme.tsx b/app/client/src/constants/DefaultTheme.tsx index 768253cee7..efadb8feb9 100644 --- a/app/client/src/constants/DefaultTheme.tsx +++ b/app/client/src/constants/DefaultTheme.tsx @@ -332,6 +332,7 @@ export const theme: Theme = { paneInputBG: Colors.SHARK, paneBG: Colors.OUTER_SPACE, paneText: Colors.GRAY_CHATEAU, + paneTextUnderline: Colors.LIGHT_GREYISH_BLUE, paneSectionLabel: Colors.CADET_BLUE, navBG: Colors.SHARK, grid: Colors.GEYSER_LIGHT, diff --git a/app/client/src/pages/Editor/PropertyPane/PropertyControl.tsx b/app/client/src/pages/Editor/PropertyPane/PropertyControl.tsx index d778f1eae2..673689d4b8 100644 --- a/app/client/src/pages/Editor/PropertyPane/PropertyControl.tsx +++ b/app/client/src/pages/Editor/PropertyPane/PropertyControl.tsx @@ -9,7 +9,7 @@ import { ControlIcons } from "icons/ControlIcons"; import PropertyControlFactory from "utils/PropertyControlFactory"; import { WidgetProps } from "widgets/BaseWidget"; import { ControlConfig } from "reducers/entityReducers/propertyPaneConfigReducer"; -import { Tooltip } from "@blueprintjs/core"; +import { Tooltip, Position } from "@blueprintjs/core"; type Props = { widgetProperties: WidgetProps; @@ -27,21 +27,30 @@ function UnderlinedLabel({ }) { const toolTipDefined = tooltip !== undefined; return ( - +
- {label} + Date: Fri, 20 Mar 2020 11:03:50 +0000 Subject: [PATCH 4/6] Fix/date picker --- .../blueprint/DatePickerComponent.tsx | 19 +++++++++++++++++-- .../propertyControls/DatePickerControl.tsx | 5 +++-- .../propertyControls/StyledControls.tsx | 11 +++++++---- .../mockResponses/WidgetConfigResponse.tsx | 1 + app/client/src/widgets/DatePickerWidget.tsx | 3 +++ 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/app/client/src/components/designSystems/blueprint/DatePickerComponent.tsx b/app/client/src/components/designSystems/blueprint/DatePickerComponent.tsx index 0646480710..40d4f1ceaf 100644 --- a/app/client/src/components/designSystems/blueprint/DatePickerComponent.tsx +++ b/app/client/src/components/designSystems/blueprint/DatePickerComponent.tsx @@ -43,7 +43,17 @@ const StyledControlGroup = styled(ControlGroup)` max-width: calc(30% - ${WIDGET_PADDING}px); } } + &&& { + input { + border: 1px solid #a1acb3; + border-radius: 4px; + box-shadow: none; + color: #2e3d49; + font-size: 14px; + } + } `; + class DatePickerComponent extends React.Component { render() { return ( @@ -97,12 +107,16 @@ class DatePickerComponent extends React.Component { } formatDate = (date: Date): string => { + let dateFormat = "DD/MM/YYYY"; + if (this.props.enableTimePicker) { + dateFormat = "DD/MM/YYYY HH:mm"; + } if (this.props.timezone) { return moment(date) .tz(this.props.timezone) - .format(this.props.dateFormat); + .format(dateFormat); } - return moment(date).format(this.props.dateFormat); + return moment(date).format(dateFormat); }; parseDate = (dateStr: string): Date => { @@ -128,6 +142,7 @@ export interface DatePickerComponentProps extends ComponentProps { maxDate?: Date; timezone?: string; datePickerType: DatePickerType; + isDisabled: boolean; onDateSelected: (date: Date) => void; isLoading: boolean; } diff --git a/app/client/src/components/propertyControls/DatePickerControl.tsx b/app/client/src/components/propertyControls/DatePickerControl.tsx index cdc1f16bce..79321bce7a 100644 --- a/app/client/src/components/propertyControls/DatePickerControl.tsx +++ b/app/client/src/components/propertyControls/DatePickerControl.tsx @@ -14,11 +14,11 @@ class DatePickerControl extends BaseControl { showActionsBar={true} timePickerProps={{ useAmPm: true, - value: this.props.propertyValue || new Date(), + value: new Date(this.props.propertyValue), showArrowButtons: true, }} onChange={this.onDateSelected} - value={this.props.propertyValue || new Date()} + value={new Date(this.props.propertyValue)} /> ); } @@ -43,6 +43,7 @@ class DatePickerControl extends BaseControl { export interface DatePickerControlProps extends ControlProps { placeholderText: string; propertyValue: Date; + enableTimePicker: boolean; } export default DatePickerControl; diff --git a/app/client/src/components/propertyControls/StyledControls.tsx b/app/client/src/components/propertyControls/StyledControls.tsx index 13b94d361c..034ba20bc2 100644 --- a/app/client/src/components/propertyControls/StyledControls.tsx +++ b/app/client/src/components/propertyControls/StyledControls.tsx @@ -243,10 +243,13 @@ export const StyledInputGroup = styled(InputGroup)` `; export const StyledDatePicker = styled(DateInput)` -& > input { - placeholderText: ${props => props.placeholder} - color: ${props => props.theme.colors.textOnDarkBG}; - background: ${props => props.theme.colors.paneInputBG}; + & { + input { + placeholderText: ${props => props.placeholder}; + color: ${props => props.theme.colors.textOnDarkBG}; + background: ${props => props.theme.colors.paneInputBG}; + } + } } `; diff --git a/app/client/src/mockResponses/WidgetConfigResponse.tsx b/app/client/src/mockResponses/WidgetConfigResponse.tsx index 64424a6627..a97203f72c 100644 --- a/app/client/src/mockResponses/WidgetConfigResponse.tsx +++ b/app/client/src/mockResponses/WidgetConfigResponse.tsx @@ -55,6 +55,7 @@ const WidgetConfigResponse: WidgetConfigReducerState = { }, DATE_PICKER_WIDGET: { enableTimePicker: true, + isDisabled: false, datePickerType: "DATE_PICKER", rows: 1, dateFormat: "DD/MM/YYYY", diff --git a/app/client/src/widgets/DatePickerWidget.tsx b/app/client/src/widgets/DatePickerWidget.tsx index be64785973..7b7b3529bb 100644 --- a/app/client/src/widgets/DatePickerWidget.tsx +++ b/app/client/src/widgets/DatePickerWidget.tsx @@ -47,6 +47,7 @@ class DatePickerWidget extends BaseWidget { if ( (this.props.selectedDate !== prevProps.selectedDate && this.props.selectedDate === undefined) || + prevProps.defaultDate === undefined || this.props.defaultDate.toDateString() !== prevProps.defaultDate.toDateString() ) { @@ -63,6 +64,7 @@ class DatePickerWidget extends BaseWidget { widgetId={this.props.widgetId} timezone={this.props.timezone} enableTimePicker={this.props.enableTimePicker} + isDisabled={this.props.isDisabled} datePickerType={"DATE_PICKER"} onDateSelected={this.onDateSelected} selectedDate={this.props.selectedDate} @@ -95,6 +97,7 @@ export interface DatePickerWidgetProps extends WidgetProps { selectedDate: Date; timezone?: string; enableTimePicker: boolean; + isDisabled: boolean; dateFormat: string; label: string; datePickerType: DatePickerType; From 45e20b659e70a347d816ee4281e73f262bba2cad Mon Sep 17 00:00:00 2001 From: Vicky Bansal Date: Fri, 20 Mar 2020 11:17:30 +0000 Subject: [PATCH 5/6] Feature/rich text editor --- app/client/package.json | 2 + app/client/public/index.html | 5 +- app/client/public/tinymce/tinymce.min.js | 32 +++++++ .../appsmith/FilePickerComponent.tsx | 2 +- .../appsmith/RichTextEditorComponent.tsx | 39 ++++++++ .../constants/PropertyControlConstants.tsx | 1 + app/client/src/constants/WidgetConstants.tsx | 2 + app/client/src/icons/WidgetIcons.tsx | 6 ++ app/client/src/index.tsx | 1 - .../PropertyPaneConfigResponse.tsx | 11 +-- .../mockResponses/WidgetConfigResponse.tsx | 8 ++ .../mockResponses/WidgetSidebarResponse.tsx | 5 ++ .../entityReducers/widgetConfigReducer.tsx | 3 + app/client/src/resizable/index.tsx | 17 +++- app/client/src/utils/WidgetRegistry.tsx | 14 +++ .../src/widgets/RichTextEditorWidget.tsx | 90 +++++++++++++++++++ app/client/yarn.lock | 57 +++--------- 17 files changed, 230 insertions(+), 65 deletions(-) create mode 100644 app/client/public/tinymce/tinymce.min.js create mode 100644 app/client/src/components/designSystems/appsmith/RichTextEditorComponent.tsx create mode 100644 app/client/src/widgets/RichTextEditorWidget.tsx diff --git a/app/client/package.json b/app/client/package.json index 839f09de1d..cac338ee4d 100644 --- a/app/client/package.json +++ b/app/client/package.json @@ -17,6 +17,7 @@ "@sentry/browser": "^5.6.3", "@sentry/webpack-plugin": "^1.10.0", "@syncfusion/ej2-react-grids": "^17.4.40", + "@tinymce/tinymce-react": "^3.5.0", "@types/chance": "^1.0.7", "@types/fontfaceobserver": "^0.0.6", "@types/lodash": "^4.14.120", @@ -89,6 +90,7 @@ "source-map-explorer": "^2.1.1", "styled-components": "^4.1.3", "tinycolor2": "^1.4.1", + "tinymce": "^5.2.0", "toposort": "^2.0.2", "ts-loader": "^6.0.4", "typescript": "^3.6.3", diff --git a/app/client/public/index.html b/app/client/public/index.html index 59eb2affff..8e809a7c22 100755 --- a/app/client/public/index.html +++ b/app/client/public/index.html @@ -3,13 +3,12 @@ - + - - + Appsmith diff --git a/app/client/public/tinymce/tinymce.min.js b/app/client/public/tinymce/tinymce.min.js new file mode 100644 index 0000000000..43526e4c0a --- /dev/null +++ b/app/client/public/tinymce/tinymce.min.js @@ -0,0 +1,32 @@ +/** + * Copyright (c) Tiny Technologies, Inc. All rights reserved. + * Licensed under the LGPL or a commercial license. + * For LGPL see License.txt in the project root for license information. + * For commercial licenses see https://www.tiny.cloud/ + * + * Version: 5.1.6 (2020-01-28) + */ +!function(j){"use strict";function i(){}var q=function(n,r){return function(){for(var e=[],t=0;t=i.length&&n(r)}}(t))})})}var Ut,jt,qt,$t=Vt.exports.boltExport,Wt=function(e){var n=k.none(),t=[],r=function(e){o()?a(e):t.push(e)},o=function(){return n.isSome()},i=function(e){z(e,a)},a=function(t){n.each(function(e){j.setTimeout(function(){t(e)},0)})};return e(function(e){n=k.some(e),i(t),t=[]}),{get:r,map:function(n){return Wt(function(t){r(function(e){t(n(e))})})},isReady:o}},Kt={nu:Wt,pure:function(t){return Wt(function(e){e(t)})}},Xt=function(n){function e(e){n().then(e,It)}return{map:function(e){return Xt(function(){return n().then(e)})},bind:function(t){return Xt(function(){return n().then(function(e){return t(e).toPromise()})})},anonBind:function(e){return Xt(function(){return n().then(function(){return e.toPromise()})})},toLazy:function(){return Kt.nu(e)},toCached:function(){var e=null;return Xt(function(){return null===e&&(e=n()),e})},toPromise:n,get:e}},Yt={nu:function(e){return Xt(function(){return new $t(e)})},pure:function(e){return Xt(function(){return $t.resolve(e)})}},Gt=function(e){return Ft(e,Yt.nu)},Jt=function(n){return{is:function(e){return n===e},isValue:a,isError:c,getOr:$(n),getOrThunk:$(n),getOrDie:$(n),or:function(e){return Jt(n)},orThunk:function(e){return Jt(n)},fold:function(e,t){return t(n)},map:function(e){return Jt(e(n))},mapError:function(e){return Jt(n)},each:function(e){e(n)},bind:function(e){return e(n)},exists:function(e){return e(n)},forall:function(e){return e(n)},toOption:function(){return k.some(n)}}},Qt=function(n){return{is:c,isValue:c,isError:a,getOr:W,getOrThunk:function(e){return e()},getOrDie:function(){return function(e){return function(){throw new Error(e)}}(String(n))()},or:function(e){return e},orThunk:function(e){return e()},fold:function(e,t){return e(n)},map:function(e){return Qt(n)},mapError:function(e){return Qt(e(n))},each:i,bind:function(e){return Qt(n)},exists:c,forall:a,toOption:k.none}},Zt={value:Jt,error:Qt,fromOption:function(e,t){return e.fold(function(){return Qt(t)},Jt)}},en=window.Promise?window.Promise:(Ut=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},jt=nn.immediateFn||"function"==typeof j.setImmediate&&j.setImmediate||function(e){j.setTimeout(e,1)},nn.prototype["catch"]=function(e){return this.then(null,e)},nn.prototype.then=function(n,r){var o=this;return new nn(function(e,t){rn.call(o,new sn(n,r,e,t))})},nn.all=function(){var s=Array.prototype.slice.call(1===arguments.length&&Ut(arguments[0])?arguments[0]:arguments);return new nn(function(o,i){if(0===s.length)return o([]);var a=s.length;function u(t,e){try{if(e&&("object"==typeof e||"function"==typeof e)){var n=e.then;if("function"==typeof n)return void n.call(e,function(e){u(t,e)},i)}s[t]=e,0==--a&&o(s)}catch(r){i(r)}}for(var e=0;e\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Qn=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,Zn=/[<>&\"\']/g,er=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,tr={128:"\u20ac",130:"\u201a",131:"\u0192",132:"\u201e",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02c6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017d",145:"\u2018",146:"\u2019",147:"\u201c",148:"\u201d",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02dc",153:"\u2122",154:"\u0161",155:"\u203a",156:"\u0153",158:"\u017e",159:"\u0178"};Pn={'"':""","'":"'","<":"<",">":">","&":"&","`":"`"},Ln={"<":"<",">":">","&":"&",""":'"',"'":"'"};function nr(e,t){var n,r,o,i={};if(e){for(e=e.split(","),t=t||10,n=0;n>10),56320+(1023&t))):tr[t]||String.fromCharCode(t):Ln[e]||Hn[e]||function(e){var t;return(t=bt.fromTag("div").dom()).innerHTML=e,t.textContent||t.innerText||e}(e)})}},ur={},sr={},cr=Rn.makeMap,lr=Rn.each,fr=Rn.extend,dr=Rn.explode,hr=Rn.inArray,mr=function(e,t){return(e=Rn.trim(e))?e.split(t||" "):[]},gr=function(e){function t(e,t,n){function r(e,t){var n,r,o={};for(n=0,r=e.length;n
').css(n).appendTo(i)[0];return s.set(k.some({caret:o,element:e,before:t})),s.get().each(function(e){t&&yi(e.caret).addClass("mce-visual-caret-before")}),l(),(r=e.ownerDocument.createRange()).setStart(u,0),r.setEnd(u,0),r},hide:c,getCss:function(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"},reposition:function(){s.get().each(function(e){var t=ds(i,e.element,e.before);yi(e.caret).css(G({},t))})},destroy:function(){return vn.clearInterval(t)}}}function ms(){return Ws.isIE()||Ws.isEdge()||Ws.isFirefox()}function gs(e){return Ks(e)||Ge.isTable(e)&&ms()}function ps(e){return 0=o.data.length-1)return 1===e&&(r=s(o))?ec(r):n;if(mu(o)&&i<=1)return-1===e&&(r=u(o))?tc(r):n;if(i===o.data.length)return(r=s(o))?ec(r):n;if(0===i)return(r=u(o))?tc(r):n}return n}function Ss(e,t){return k.from(xs(e?0:-1,t)).filter(Xs)}function ks(e,t,n){var r=Ns(e,t,n);return-1===e?ju.fromRangeStart(r):ju.fromRangeEnd(r)}function Ts(e){return k.from(e.getNode()).map(bt.fromDom)}function As(e,t){for(;t=e(t);)if(t.isVisible())return t;return t}function Ms(e,t){var n=ws(e,t);return!(n||!Ge.isBr(e.getNode()))||n}var Rs,Ds,_s=ju,Os=Ge.isText,Bs=Ge.isBogus,Hs=Yi.nodeIndex,Ps=function(e){var t=e.parentNode;return Bs(t)?Ps(t):t},Ls=function(e){return e?Tn.reduce(e.childNodes,function(e,t){return Bs(t)&&"BR"!==t.nodeName?e=e.concat(Ls(t)):e.push(t),e},[]):[]},Vs=Ge.isContentEditableFalse,Is={getBookmark:function(e,t,n){return 2===t?ts(fu,n,e):3===t?function(e){var t=e.getRng();return{start:Wu(e.dom.getRoot(),_s.fromRangeStart(t)),end:Wu(e.dom.getRoot(),_s.fromRangeEnd(t))}}(e):t?function(e){return{rng:e.getRng()}}(e):rs(e,!1)},getUndoBookmark:d(ts,W,!0),getPersistentBookmark:rs},Fs="_mce_caret",Us=Ge.isElement,js=Ge.isText,qs=function(e){if(Us(e)&&_a(e)&&(Oa(e)?e.removeAttribute("data-mce-caret"):as(e)),js(e)){var t=fu(function(e){try{return e.nodeValue}catch(t){return""}}(e));us(e,t)}},$s={removeAndReposition:function(e,t){return _s.isTextPosition(t)?fs(e,t):function(e,t){return t.container()===e.parentNode?ls(e,t):cs(e,t)}(e,t)},remove:qs},Ws=oe().browser,Ks=Ge.isContentEditableFalse,Xs=Ge.isContentEditableFalse,Ys=Ge.matchStyleValues("display","block table table-cell table-caption list-item"),Gs=_a,Js=Ra,Qs=Ge.isElement,Zs=Va,ec=d(zs,!0),tc=d(zs,!1);(Ds=Rs=Rs||{})[Ds.Backwards=-1]="Backwards",Ds[Ds.Forwards=1]="Forwards";function nc(e,t){return e.hasChildNodes()&&tu.length-1)return!!hc(c,i,r)||dc(i,r);i=u[s[o]]}3===i.nodeType&&(a=Math.min(s[0],i.nodeValue.length)),1===i.nodeType&&(a=Math.min(s[0],i.childNodes.length)),t?r.setStart(i,a):r.setEnd(i,a)}return!0}function gc(e){return Ge.isText(e)&&0=t.nodeValue.length&&e.splice(0,1),t=e[e.length-1],0===h&&0n.length-1?t=n.length-1:t<0&&(t=0),n[t]||e}(d,h)),l===d)return o(m([l]));for(n=e.findCommonAncestor(l,d),a=l;a;a=a.parentNode){if(a===d)return v(l,n,!0);if(a===n)break}for(a=d;a;a=a.parentNode){if(a===l)return v(d,n);if(a===n)break}r=p(l,n)||l,i=p(d,n)||d,v(l,r,!0),(s=g(r===l?r:r.nextSibling,"nextSibling",i===d?i.nextSibling:i)).length&&o(m(s)),v(d,i)}};function Qc(e){return il.get(e)}function Zc(t,n,r,o){return Se(n).fold(function(){return"skipping"},function(e){return"br"===o||function(e){return Et(e)&&"\ufeff"===Qc(e)}(n)?"valid":function(e){return zt(e)&&ma(e,ru())}(n)?"existing":os(n)?"caret":qc.isValid(t,r,o)&&qc.isValid(t,ie(e),r)?"valid":"invalid-child"})}function el(e,t,n,r){var o=t.uid,i=void 0===o?function(e){var t=(new Date).getTime();return e+"_"+Math.floor(1e9*Math.random())+ ++uu+String(t)}("mce-annotation"):o,a=function h(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o=e.startOffset&&"\xa0"===e.startContainer.nodeValue[e.startOffset]}(t));t.setStart(n.startContainer,n.startOffset),t.setEnd(n.endContainer,n.endOffset),e.selection.setRng(t)}(o,e),o.selection.getRng().collapsed){var t=el(o.getDoc(),u,i,a.decorate);Ma(t,"\xa0"),o.selection.getRng().insertNode(t.dom()),o.selection.select(t.dom())}else{var n=Is.getPersistentBookmark(o.selection,!1),r=o.selection.getRng();tl(o,r,i,a.decorate,u),o.selection.moveToBookmark(n)}})}function rl(r){var o=function(){var n={};return{register:function(e,t){n[e]={name:e,settings:t}},lookup:function(e){return n.hasOwnProperty(e)?k.from(n[e]).map(function(e){return e.settings}):k.none()}}}();Sa(r,o);var n=Na(r);return{register:function(e,t){o.register(e,t)},annotate:function(t,n){o.lookup(t).each(function(e){nl(r,t,e,n)})},annotationChanged:function(e,t){n.addListener(e,t)},remove:function(e){Ea(r,k.some(e)).each(function(e){var t=e.elements;z(t,Si)})},getAll:function(e){var t=function(e,t){var n=bt.fromDom(e.getBody()),r=ga(n,"["+ou()+'="'+t+'"]'),o={};return z(r,function(e){var t=ge(e,iu()),n=o.hasOwnProperty(t)?o[t]:[];o[t]=n.concat([e])}),o}(r,e);return se(t,function(e){return X(e,function(e){return e.dom()})})}}}function ol(e,t,n){var r=n?"lastChild":"firstChild",o=n?"prev":"next";if(e[r])return e[r];if(e!==t){var i=e[o];if(i)return i;for(var a=e.parent;a&&a!==t;a=a.parent)if(i=a[o])return i}}var il=function zN(n,r){var t=function(e){return n(e)?k.from(e.dom().nodeValue):k.none()};return{get:function(e){if(!n(e))throw new Error("Can only get "+r+" value of a "+r+" node");return t(e).getOr("")},getOption:t,set:function(e,t){if(!n(e))throw new Error("Can only set raw "+r+" value of a "+r+" node");e.dom().nodeValue=t}}}(Et,"text"),al=/^[ \t\r\n]*$/,ul={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11},sl=(cl.create=function(e,t){var n=new cl(e,ul[e]||1);if(t)for(var r in t)n.attr(r,t[r]);return n},cl.prototype.replace=function(e){return e.parent&&e.remove(),this.insert(e,this),this.remove(),this},cl.prototype.attr=function(e,t){var n;if("string"!=typeof e){for(var r in e)this.attr(r,e[r]);return this}if(n=this.attributes){if(t===undefined)return n.map[e];if(null===t){if(e in n.map){delete n.map[e];for(var o=n.length;o--;)if(n[o].name===e)return n.splice(o,1),this}return this}if(e in n.map){for(o=n.length;o--;)if(n[o].name===e){n[o].value=t;break}}else n.push({name:e,value:t});return n.map[e]=t,this}},cl.prototype.clone=function(){var e,t=new cl(this.name,this.type);if(e=this.attributes){var n=[];n.map={};for(var r=0,o=e.length;r]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*|\/|\s+)>/g).lastIndex=r=n;o=i.exec(t);){if(r=i.lastIndex,"/"===o[1])u--;else if(!o[1]){if(o[2]in a)continue;u++}if(0===u)break}return r}function fl(e,t){var n=e.exec(t);if(n){var r=n[1],o=n[2];return"string"==typeof r&&"data-mce-bogus"===r.toLowerCase()?o:null}return null}function dl(V,I){void 0===I&&(I=vr());function e(){}!1!==(V=V||{}).fix_self_closing&&(V.fix_self_closing=!0);var F=V.comment?V.comment:e,U=V.cdata?V.cdata:e,j=V.text?V.text:e,q=V.start?V.start:e,$=V.end?V.end:e,W=V.pi?V.pi:e,K=V.doctype?V.doctype:e;return{parse:function(e){function t(e){var t,n;for(t=_.length;t--&&_[t].name!==e;);if(0<=t){for(n=_.length-1;t<=n;n--)(e=_[n]).valid&&$(e.name);_.length=t}}function n(e,t,n,r,o){var i,a;if(n=(t=t.toLowerCase())in h?t:B(n||r||o||""),g&&!l&&!1===function(e){return 0===e.indexOf("data-")||0===e.indexOf("aria-")}(t)){if(!(i=C[t])&&w){for(a=w.length;a--&&!(i=w[a]).pattern.test(t););-1===a&&(i=null)}if(!i)return;if(i.validValues&&!(n in i.validValues))return}if(H[t]&&!V.allow_script_urls){var u=n.replace(/[\s\u0000-\u001F]+/g,"");try{u=decodeURIComponent(u)}catch(s){u=unescape(u)}if(P.test(u))return;if(function(e,t){return!e.allow_html_data_urls&&(/^data:image\//i.test(t)?!1===e.allow_svg_data_urls&&/^data:image\/svg\+xml/i.test(t):/^data:/i.test(t))}(V,u))return}l&&(t in H||0===t.indexOf("on"))||(c.map[t]=n,c.push({name:t,value:n}))}var r,o,i,c,a,u,s,l,f,d,h,m,g,p,v,y,b,C,w,x,z,E,N,S,k,T,A,M,R,D=0,_=[],O=0,B=ar.decode,H=Rn.makeMap("src,href,data,background,formaction,poster,xlink:href"),P=/((java|vb)script|mhtml):/i;for(k=new RegExp("<(?:(?:!--([\\w\\W]*?)--!?>)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)>)|(?:([A-Za-z][A-Za-z0-9\\-_\\:\\.]*)((?:\\s+[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*|\\/|\\s+)>))","g"),T=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g,d=I.getShortEndedElements(),S=V.self_closing_elements||I.getSelfClosingElements(),h=I.getBoolAttrs(),g=V.validate,f=V.remove_internals,R=V.fix_self_closing,A=I.getSpecialElements(),N=e+">";r=k.exec(N);){if(De.length){j(B(e.substr(r.index))),D=r.index+r[0].length;continue}":"===(o=o.toLowerCase()).charAt(0)&&(o=o.substr(1)),m=o in d,R&&S[o]&&0<_.length&&_[_.length-1].name===o&&t(o);var L=fl(T,r[8]);if(null!==L){if("all"===L){D=ll(I,e,k.lastIndex),k.lastIndex=D;continue}v=!1}if(!g||(p=I.getElementRule(o))){if(v=!0,g&&(C=p.attributes,w=p.attributePatterns),(b=r[8])?((l=-1!==b.indexOf("data-mce-type"))&&f&&(v=!1),(c=[]).map={},b.replace(T,n)):(c=[]).map={},g&&!l){if(x=p.attributesRequired,z=p.attributesDefault,E=p.attributesForced,p.removeEmptyAttrs&&!c.length&&(v=!1),E)for(a=E.length;a--;)s=(y=E[a]).name,"{$uid}"===(M=y.value)&&(M="mce_"+O++),c.map[s]=M,c.push({name:s,value:M});if(z)for(a=z.length;a--;)(s=(y=z[a]).name)in c.map||("{$uid}"===(M=y.value)&&(M="mce_"+O++),c.map[s]=M,c.push({name:s,value:M}));if(x){for(a=x.length;a--&&!(x[a]in c.map););-1===a&&(v=!1)}if(y=c.map["data-mce-bogus"]){if("all"===y){D=ll(I,e,k.lastIndex),k.lastIndex=D;continue}v=!1}}v&&q(o,c,m)}else v=!1;if(i=A[o]){i.lastIndex=D=r.index+r[0].length,D=(r=i.exec(e))?(v&&(u=e.substr(D,r.index-D)),r.index+r[0].length):(u=e.substr(D),e.length),v&&(0"===o.charAt(0)&&(o=" "+o),V.allow_conditional_comments||"[if"!==o.substr(0,3).toLowerCase()||(o=" "+o),F(o)):(o=r[2])?U(o.replace(/)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")};i--;)r=(n=e[i]).firstChild?n.firstChild.value:"","script"===t?((o=n.attr("type"))&&n.attr("type","mce-no/type"===o?null:o.replace(/^mce\-/,"")),"xhtml"===s.element_format&&0")):"xhtml"===s.element_format&&0k(n)?(C=T(b*y),b=T(C/y)):(b=T(C/y),C=T(b*y))),z.setStyles(R(s),{width:b,height:C}),r=0<(r=f.startPos.x+t)?r:0,o=0<(o=f.startPos.y+n)?o:0,z.setStyles(c,{left:r,top:o,display:"block"}),c.innerHTML=b+" × "+C,f[2]<0&&s.clientWidth<=b&&z.setStyle(s,"left",m+(p-b)),f[3]<0&&s.clientHeight<=C&&z.setStyle(s,"top",g+(v-C)),(t=A.scrollWidth-w)+(n=A.scrollHeight-x)!==0&&z.setStyles(c,{left:r-t,top:o-n}),i||(gd(a,u,p,v),i=!0)}function n(e){function t(e,t){if(e)do{if(e===t)return!0}while(e=e.parentNode)}var n;i||a.removed||(E(z.select("img[data-mce-selected],hr[data-mce-selected]"),function(e){e.removeAttribute("data-mce-selected")}),n="mousedown"===e.type?e.target:r.getNode(),t(n=z.$(n).closest("table,img,figure.image,hr")[0],A)&&(L(),t(r.getStart(!0),n)&&t(r.getEnd(!0),n))?B(n):H())}function o(e){return Yp(function(e,t){for(;t&&t!==e;){if(Gp(t)||Yp(t))return t;t=t.parentNode}return null}(a.getBody(),e))}l={nw:[0,0,-1,-1],ne:[1,0,1,-1],se:[1,1,1,1],sw:[0,1,-1,1]};var O=function(){i=!1;function e(e,t){t&&(u.style[e]||!a.schema.isValid(u.nodeName.toLowerCase(),e)?z.setStyle(R(u),e,t):z.setAttrib(R(u),e,t))}e("width",b),e("height",C),z.unbind(N,"mousemove",_),z.unbind(N,"mouseup",O),S!==N&&(z.unbind(S,"mousemove",_),z.unbind(S,"mouseup",O)),z.remove(s),z.remove(c),B(u),pd(a,u,b,C),z.setAttrib(u,"style",z.getAttrib(u,"style")),a.nodeChanged()},B=function(e){var t,r,o,n,i;H(),P(),t=z.getPos(e,A),m=t.x,g=t.y,i=e.getBoundingClientRect(),r=i.width||i.right-i.left,o=i.height||i.bottom-i.top,u!==e&&(u=e,b=C=0),n=a.fire("ObjectSelected",{target:e}),D(e)&&!n.isDefaultPrevented()?E(l,function(t,e){var n;(n=z.get("mceResizeHandle"+e))&&z.remove(n),n=z.add(A,"div",{id:"mceResizeHandle"+e,"data-mce-bogus":"all","class":"mce-resizehandle",unselectable:!0,style:"cursor:"+e+"-resize; margin:0; padding:0"}),11===Sn.ie&&(n.contentEditable=!1),z.bind(n,"mousedown",function(e){e.stopImmediatePropagation(),e.preventDefault(),function(e){d=e.screenX,h=e.screenY,p=R(u).clientWidth,v=R(u).clientHeight,y=v/p,(f=t).startPos={x:r*t[0]+m,y:o*t[1]+g},w=A.scrollWidth,x=A.scrollHeight,s=u.cloneNode(!0),z.addClass(s,"mce-clonedresizable"),z.setAttrib(s,"data-mce-bogus","all"),s.contentEditable=!1,s.unSelectabe=!0,z.setStyles(s,{left:m,top:g,margin:0}),s.removeAttribute("data-mce-selected"),A.appendChild(s),z.bind(N,"mousemove",_),z.bind(N,"mouseup",O),S!==N&&(z.bind(S,"mousemove",_),z.bind(S,"mouseup",O)),c=z.add(A,"div",{"class":"mce-resize-helper","data-mce-bogus":"all"},p+" × "+v)}(e)}),t.elm=n,z.setStyles(n,{left:r*t[0]+m-n.offsetWidth/2,top:o*t[1]+g-n.offsetHeight/2})}):H(),u.setAttribute("data-mce-selected","1")},H=function(){var e,t;for(e in P(),u&&u.removeAttribute("data-mce-selected"),l)(t=z.get("mceResizeHandle"+e))&&(z.unbind(t),z.remove(t))},P=function(){for(var e in l){var t=l[e];t.elm&&(z.unbind(t.elm),delete t.elm)}},L=function(){try{a.getDoc().execCommand("enableObjectResizing",!1,!1)}catch(e){}};return a.on("init",function(){L(),(Sn.browser.isIE()||Sn.browser.isEdge())&&(a.on("mousedown click",function(e){var t=e.target,n=t.nodeName;i||!/^(TABLE|IMG|HR)$/.test(n)||o(t)||(2!==e.button&&a.selection.select(t,"TABLE"===n),"mousedown"===e.type&&a.nodeChanged())}),a.dom.bind(A,"mscontrolselect",function(e){function t(e){vn.setEditorTimeout(a,function(){a.selection.select(e)})}if(o(e.target))return e.preventDefault(),void t(e.target);/^(TABLE|IMG|HR)$/.test(e.target.nodeName)&&(e.preventDefault(),"IMG"===e.target.tagName&&t(e.target))}));var t=vn.throttle(function(e){a.composing||n(e)});a.on("nodechange ResizeEditor ResizeWindow drop FullscreenStateChanged",t),a.on("keyup compositionend",function(e){u&&"TABLE"===u.nodeName&&t(e)}),a.on("hide blur",H),a.on("contextmenu longpress",e,!0)}),a.on("remove",P),{isResizable:D,showResizeRect:B,hideResizeRect:H,updateResizeRect:n,destroy:function(){u=s=null}}}var Xp=Wp,Yp=Ge.isContentEditableFalse,Gp=Ge.isContentEditableTrue;function Jp(e){var t=bt.fromDom(j.document),n=Ti(t),r=function(e,t){var n=t.owner(e);return Iv(t,n)}(e,Fv),o=Pi(e),i=m(r,function(e,t){var n=Pi(t);return{left:e.left+n.left(),top:e.top+n.top()}},{left:0,top:0});return Hi(i.left+o.left()+n.left(),i.top+o.top()+n.top())}function Qp(e){return"textarea"===ie(e)}function Zp(e,t){var n=function(e){var t=e.dom().ownerDocument,n=t.body,r=t.defaultView,o=t.documentElement;if(n===e.dom())return Hi(n.offsetLeft,n.offsetTop);var i=ki(r.pageYOffset,o.scrollTop),a=ki(r.pageXOffset,o.scrollLeft),u=ki(o.clientTop,n.clientTop),s=ki(o.clientLeft,n.clientLeft);return Pi(e).translate(a-s,i-u)}(e),r=function(e){return Vv.get(e)}(e);return{element:e,bottom:n.top()+r,pos:n,cleanup:t}}function ev(e,t){var n=function(e,t){var n=Re(e);if(0===n.length||Qp(e))return{element:e,offset:t};if(t'+lu+"");return wi(n.element,r),Zp(r,function(){return Oi(r)})}function tv(e){return Zp(bt.fromDom(e),i)}function nv(n,r,o,i){jv(n,function(e,t){return Uv(n,r,o,i)},o)}function rv(e,t,n,r){var o=bt.fromDom(e.getDoc());n(o,Ti(o).top(),t,r)}function ov(e,t,n,r){var o=e.pos;if(n)Ai(o.left(),o.top(),r);else{var i=o.top()-t+(e.bottom-o.top());Ai(o.left(),i,r)}}function iv(e,t,n,r,o){r.pos.top()n+t&&ov(r,n,!0===o,e)}function av(e,t,n,r){var o=e.dom().defaultView.innerHeight;iv(e,t,o,n,r)}function uv(e,t,n,r,o){var i=t.dom().defaultView.innerHeight;iv(t,n,i,r,o);var a=Jp(r.element),u=Vi(j.window);a.top()u.bottom()&&Mi(r.element,!0===o)}function sv(e,t,n){return nv(e,d(av),t,n)}function cv(e,t,n){return rv(e,tv(t),d(av),n)}function lv(e,t,n){return nv(e,d(uv,e),t,n)}function fv(e,t,n){return rv(e,tv(t),d(uv,e),n)}function dv(e){return Ge.isContentEditableTrue(e)||Ge.isContentEditableFalse(e)}function hv(e,t){var n=(t||j.document).createDocumentFragment();return z(e,function(e){n.appendChild(e.dom())}),bt.fromDom(n)}function mv(e,t){var n=parseInt(ge(e,t),10);return isNaN(n)?1:n}function gv(e){return b(e,function(e,t){return t.cells().length>e?t.cells().length:e},0)}function pv(e,t){for(var n=e.rows(),r=0;ro.childNodes.length-1&&(s=!1),Ge.isDocument(o)&&(o=f,i=0),o===f){if(s&&(a=o.childNodes[0t.clientHeight){e=t;break}t=t.parentNode}return e},scrollIntoView:function(e,t){return qv(c,e,t)},placeCaretAt:function(e,t){return m(Wv(e,t,c.getDoc()))},getBoundingClientRect:function(){var e=h();return e.collapsed?_s.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:function(){s=l=f=null,o.destroy()}};return n=Xp(g),o=Kp(g,c),g.bookmarkManager=n,g.controlSelection=o,g}function dy(e){return jy(e)&&e.data[0]===lu}function hy(e){return jy(e)&&e.data[e.data.length-1]===lu}function my(e){return e.ownerDocument.createTextNode(lu)}function gy(e,t){return e?function(e){if(jy(e.previousSibling))return hy(e.previousSibling)||e.previousSibling.appendData(lu),e.previousSibling;if(jy(e))return dy(e)||e.insertData(0,lu),e;var t=my(e);return e.parentNode.insertBefore(t,e),t}(t):function(e){if(jy(e.nextSibling))return dy(e.nextSibling)||e.nextSibling.insertData(0,lu),e.nextSibling;if(jy(e))return hy(e)||e.appendData(lu),e;var t=my(e);return e.nextSibling?e.parentNode.insertBefore(t,e.nextSibling):e.parentNode.appendChild(t),t}(t)}function py(e,t){return Ge.isText(e.container())?gy(t,e.container()):gy(t,e.getNode())}function vy(e,t){var n=t.get();return n&&e.container()===n&&Da(n)}function yy(e,t){if(!t)return t;var n=t.container(),r=t.offset();return e?Da(n)?Ge.isText(n.nextSibling)?_s(n.nextSibling,0):_s.after(n):Ba(t)?_s(n,r+1):t:Da(n)?Ge.isText(n.previousSibling)?_s(n.previousSibling,n.previousSibling.data.length):_s.before(n):Ha(t)?_s(n,r-1):t}function by(e,t){var n=Cs(t,e);return n||e}function Cy(e,t,n){var r=Xy.normalizeForwards(n),o=by(t,r.container());return Xy.findRootInline(e,o,r).fold(function(){return Lc.nextPosition(o,r).bind(d(Xy.findRootInline,e,o)).map(function(e){return Gy.before(e)})},k.none)}function wy(e,t){return null===is(e,t)}function xy(e,t,n){return Xy.findRootInline(e,t,n).filter(d(wy,t))}function zy(e,t,n){var r=Xy.normalizeBackwards(n);return xy(e,t,r).bind(function(e){return Lc.prevPosition(e,r).isNone()?k.some(Gy.start(e)):k.none()})}function Ey(e,t,n){var r=Xy.normalizeForwards(n);return xy(e,t,r).bind(function(e){return Lc.nextPosition(e,r).isNone()?k.some(Gy.end(e)):k.none()})}function Ny(e,t,n){var r=Xy.normalizeBackwards(n),o=by(t,r.container());return Xy.findRootInline(e,o,r).fold(function(){return Lc.prevPosition(o,r).bind(d(Xy.findRootInline,e,o)).map(function(e){return Gy.after(e)})},k.none)}function Sy(e){return!1===Xy.isRtl(Jy(e))}function ky(e,t,n){return Yy([Cy,zy,Ey,Ny],[e,t,n]).filter(Sy)}function Ty(e){return e.fold($("before"),$("start"),$("end"),$("after"))}function Ay(e){return e.fold(Gy.before,Gy.before,Gy.after,Gy.after)}function My(n,e,r,t,o,i){return Ga(Xy.findRootInline(e,r,t),Xy.findRootInline(e,r,o),function(e,t){return e!==t&&Xy.hasSameParentBlock(r,e,t)?Gy.after(n?e:t):i}).getOr(i)}function Ry(e,t){return e.fold($(!0),function(e){return!function(e,t){return Ty(e)===Ty(t)&&Jy(e)===Jy(t)}(e,t)})}function Dy(e,t){return e?t.fold(q(k.some,Gy.start),k.none,q(k.some,Gy.after),k.none):t.fold(k.none,q(k.some,Gy.before),k.none,q(k.some,Gy.end))}function _y(e,t,n,r){var o=Xy.normalizePosition(e,r),i=ky(t,n,o);return ky(t,n,o).bind(d(Dy,e)).orThunk(function(){return function(t,n,r,o,e){var i=Xy.normalizePosition(t,e);return Lc.fromPosition(t,r,i).map(d(Xy.normalizePosition,t)).fold(function(){return o.map(Ay)},function(e){return ky(n,r,e).map(d(My,t,n,r,i,e)).filter(d(Ry,o))}).filter(Sy)}(e,t,n,i,r)})}function Oy(e){return D(e.selection.getSel().modify)}function By(e,t,n){var r=e?1:-1;return t.setRng(_s(n.container(),n.offset()+r).toRange()),t.getSel().modify("move",e?"forward":"backward","word"),!0}function Hy(e,t){var n=e.dom.createRng();n.setStart(t.container(),t.offset()),n.setEnd(t.container(),t.offset()),e.selection.setRng(n)}function Py(e){return!1!==e.settings.inline_boundaries}function Ly(e,t){e?t.setAttribute("data-mce-selected","inline-boundary"):t.removeAttribute("data-mce-selected")}function Vy(t,e,n){return Wy(e,n).map(function(e){return Hy(t,e),n})}function Iy(e,t,n){return function(){return!!Py(t)&&nb(e,t)}}var Fy,Uy,jy=Ge.isText,qy=d(gy,!0),$y=d(gy,!1),Wy=function(n,e){return e.fold(function(e){$s.remove(n.get());var t=qy(e);return n.set(t),k.some(_s(t,t.length-1))},function(e){return Lc.firstPositionIn(e).map(function(e){if(vy(e,n))return _s(n.get(),1);$s.remove(n.get());var t=py(e,!0);return n.set(t),_s(t,1)})},function(e){return Lc.lastPositionIn(e).map(function(e){if(vy(e,n))return _s(n.get(),n.get().length-1);$s.remove(n.get());var t=py(e,!1);return n.set(t),_s(t,t.length-1)})},function(e){$s.remove(n.get());var t=$y(e);return n.set(t),k.some(_s(t,1))})},Ky=/[\u0591-\u07FF\uFB1D-\uFDFF\uFE70-\uFEFC]/,Xy={isInlineTarget:function(e,t){return we(bt.fromDom(t),Ff(e))},findRootInline:function(e,t,n){var r=function(e,t,n){return y(Yi.DOM.getParents(n.container(),"*",t),e)}(e,t,n);return k.from(r[r.length-1])},isRtl:function(e){return"rtl"===Yi.DOM.getStyle(e,"direction",!0)||function(e){return Ky.test(e)}(e.textContent)},isAtZwsp:function(e){return Ba(e)||Ha(e)},normalizePosition:yy,normalizeForwards:d(yy,!0),normalizeBackwards:d(yy,!1),hasSameParentBlock:function(e,t,n){var r=Cs(t,e),o=Cs(n,e);return r&&r===o}},Yy=function(e,t){for(var n=0;n'),t}(e),1===t?e.$(r).after(o):e.$(r).before(o),e.selection.select(o,!0),e.selection.collapse())}}function db(t,n){return function(){var e=function(e,t){var n,r=oc(e.getBody()),o=d(As,r.next),i=d(As,r.prev),a=t?Rs.Forwards:Rs.Backwards,u=t?o:i,s=e.selection.getRng();return(n=cb(a,e,u,s))?n:(n=fb(e,a,s))||null}(t,n);return!!e&&(t.selection.setRng(e),!0)}}function hb(t,n){return function(){var e=function(e,t){var n,r=t?1:-1,o=t?Ym:Xm,i=e.selection.getRng();return(n=lb(r,e,o,i))?n:(n=fb(e,r,i))||null}(t,n);return!!e&&(t.selection.setRng(e),!0)}}function mb(n,r){return function(){var e=r?_s.fromRangeEnd(n.selection.getRng()):_s.fromRangeStart(n.selection.getRng()),t=r?lx(n.getBody(),e):cx(n.getBody(),e);return(r?N(t.positions):E(t.positions)).filter(function(t){return function(e){return t?Vh(e):Lh(e)}}(r)).fold($(!1),function(e){return n.selection.setRng(e.toRange()),!0})}}function gb(e,t,n,r,o){var i=ga(bt.fromDom(n),"td,th,caption").map(function(e){return e.dom()});return function(e,o,i){return b(e,function(e,r){return e.fold(function(){return k.some(r)},function(e){var t=Math.sqrt(Math.abs(e.x-o)+Math.abs(e.y-i)),n=Math.sqrt(Math.abs(r.x-o)+Math.abs(r.y-i));return k.some(ns.childNodes.length-1;s=s.childNodes[Math.min(u,s.childNodes.length-1)]||s,u=c&&3===s.nodeType?s.nodeValue.length:0}var l=i.getParent(s,i.isBlock),f=l?i.getParent(l.parentNode,i.isBlock):null,d=f?f.nodeName.toUpperCase():"",h=!(!t||!t.ctrlKey);"LI"!==d||h||(l=f),s&&3===s.nodeType&&u>=s.nodeValue.length&&!function(e,t,n){for(var r,o=new bi(t,n),i=e.getNonEmptyElements();r=o.next();)if(i[r.nodeName.toLowerCase()]||0",lf(e)!==e.documentBaseUrl&&(r+=''),r+='',t=ff(e),n=df(e),hf(e)&&(r+=''),r+='
'}(e),wz.add(t.iframeContainer,r),o}function Iw(e){e.contentCSS=e.contentCSS.concat(function(t){var e=Vf(t),n=t.editorManager.baseURL+"/skins/content",r="content"+t.editorManager.suffix+".css",o=!0===t.inline;return X(e,function(e){return function(e){return/^[a-z0-9\-]+$/i.test(e)}(e)&&!o?n+"/"+e+"/"+r:t.documentBaseURI.toAbsolute(e)})}(e))}function Fw(e){return e.replace(/^\-/,"")}function Uw(e){return{editorContainer:e,iframeContainer:e}}function jw(e){var t=e.getElement();return e.inline?Uw(null):function(e){var t=zz.create("div");return zz.insertAfter(t,e),Uw(t)}(t)}function qw(e){return"-"===e.charAt(0)}function $w(t,e){(function(e){return k.from(Ef(e)).filter(function(e){return 0|)$/," "):o("nextSibling")||(t=t.replace(/( | )(
|)$/," "))),t}(m.getRng(),t)),r=e.parser,h=n.merge,o=vl({validate:e.settings.validate},e.schema),d='​',s={content:t,format:"html",selection:!0,paste:n.paste},(s=e.fire("BeforeSetContent",s)).isDefaultPrevented())e.fire("SetContent",{content:s.content,format:"html",selection:!0,paste:n.paste});else{-1===(t=s.content).indexOf("{$caret}")&&(t+="{$caret}"),t=t.replace(/\{\$caret\}/,d);var p=(l=m.getRng()).startContainer||(l.parentElement?l.parentElement():null),v=e.getBody();p===v&&m.isCollapsed()&&g.isBlock(v.firstChild)&&function(e,t){return t&&!e.schema.getShortEndedElements()[t.nodeName]}(e,v.firstChild)&&g.isEmpty(v.firstChild)&&((l=g.createRng()).setStart(v.firstChild,0),l.setEnd(v.firstChild,0),m.setRng(l)),m.isCollapsed()||(e.selection.setRng(dp(e.selection.getRng())),e.getDoc().execCommand("Delete",!1,null),t=function(e,t){var n,r;return n=e.startContainer,r=e.startOffset,3===n.nodeType&&e.collapsed&&("\xa0"===n.data[r]?(n.deleteData(r,1),/[\u00a0| ]$/.test(t)||(t+=" ")):"\xa0"===n.data[r-1]&&(n.deleteData(r-1,1),/[\u00a0| ]$/.test(t)||(t=" "+t))),t}(e.selection.getRng(),t));var y={context:(i=m.getNode()).nodeName.toLowerCase(),data:n.data,insert:!0};if(u=r.parse(t,y),!0===n.paste&&Tz(e.schema,u)&&Mz(g,i))return l=Az(o,g,e.selection.getRng(),u),e.selection.setRng(l),void e.fire("SetContent",s);if(function(e){for(var t=e;t=t.walk();)1===t.type&&t.attr("data-mce-fragment","1")}(u),"mce_marker"===(f=u.lastChild).attr("id"))for(f=(c=f).prev;f;f=f.walk(!0))if(3===f.type||!g.isBlock(f.name)){e.schema.isValidChild(f.parent.name,"span")&&f.parent.insert(c,f,"br"===f.name);break}if(e._selectionOverrides.showBlockCaretContainer(i),y.invalid){for(Zw(e,d),i=m.getNode(),a=e.getBody(),9===i.nodeType?i=f=a:f=i;f!==a;)f=(i=f).parentNode;t=i===a?a.innerHTML:g.getOuterHTML(i),t=o.serialize(r.parse(t.replace(//i,function(){return o.serialize(u)}))),i===a?g.setHTML(a,t):g.setOuterHTML(i,t)}else!function(e,t,n){if("all"===n.getAttribute("data-mce-bogus"))n.parentNode.insertBefore(e.dom.createFragment(t),n);else{var r=n.firstChild,o=n.lastChild;!r||r===o&&"BR"===r.nodeName?e.dom.setHTML(n,t):Zw(e,t)}}(e,t=o.serialize(u),i);!function(e,t){var n=e.schema.getTextInlineElements(),r=e.dom;if(t){var o=e.getBody(),i=new Bg(r);Rn.each(r.select("*[data-mce-fragment]"),function(e){for(var t=e.parentNode;t&&t!==o;t=t.parentNode)n[e.nodeName.toLowerCase()]&&i.compare(t,e)&&r.remove(e,!0)})}}(e,h),function(n,e){var t,r,o,i,a,u=n.dom,s=n.selection;if(e){if(n.selection.scrollIntoView(e),t=function(e){for(var t=n.getBody();e&&e!==t;e=e.parentNode)if("false"===n.dom.getContentEditable(e))return e;return null}(e))return u.remove(e),s.select(t);var c=u.createRng();(i=e.previousSibling)&&3===i.nodeType?(c.setStart(i,i.nodeValue.length),Sn.ie||(a=e.nextSibling)&&3===a.nodeType&&(i.appendData(a.data),a.parentNode.removeChild(a))):(c.setStartBefore(e),c.setEndBefore(e));r=u.getParent(e,u.isBlock),u.remove(e),r&&u.isEmpty(r)&&(n.$(r).empty(),c.setStart(r,0),c.setEnd(r,0),Rz(r)||function(e){return!!e.getAttribute("data-mce-fragment")}(r)||!(o=function(e){var t=_s.fromRangeStart(e);if(t=oc(n.getBody()).next(t))return t.toRange()}(c))?u.add(r,u.create("br",{"data-mce-bogus":"1"})):(c=o,u.remove(r))),s.setRng(c)}}(e,g.get("mce_marker")),function(e){Rn.each(e.getElementsByTagName("*"),function(e){e.removeAttribute("data-mce-fragment")})}(e.getBody()),function(e,t){k.from(e.getParent(t,"td,th")).map(bt.fromDom).each(wg)}(e.dom,e.selection.getStart()),e.fire("SetContent",s),e.addVisual()}}function tx(e,t){e.getDoc().execCommand(t,!1,null)}function nx(e,t,n){return t(e).orThunk(function(){return n(e)?k.none():function(e,t,n){for(var r=e.dom(),o=D(n)?n:$(!1);r.parentNode;){r=r.parentNode;var i=bt.fromDom(r),a=t(i);if(a.isSome())return a;if(o(i))break}return k.none()}(e,t,n)})}function rx(e,t,n){function r(t){return ye(t,e).orThunk(function(){return"font"===ie(t)?le(Bz,e).bind(function(e){return function(e,t){return k.from(ge(e,t))}(t,e)}):k.none()})}return nx(bt.fromDom(n),function(e){return r(e)},function(e){return ze(bt.fromDom(t),e)})}function ox(n){return function(t,e){return k.from(e).map(bt.fromDom).filter(zt).bind(function(e){return rx(n,t,e.dom()).or(function(e,t){return k.from(Yi.DOM.getStyle(t,e,!0))}(n,e.dom()))}).getOr("")}}function ix(e){return Lc.firstPositionIn(e.getBody()).map(function(e){var t=e.container();return Ge.isText(t)?t.parentNode:t})}function ax(t){return k.from(t.selection.getRng()).bind(function(e){return function(e,t){return e.startContainer===t&&0===e.startOffset}(e,t.getBody())?k.none():k.from(t.selection.getStart(!0))})}function ux(e,t){if(/^[0-9\.]+$/.test(t)){var n=parseInt(t,10);if(1<=n&&n<=7){var r=wf(e),o=xf(e);return o?o[n-1]||t:r[n-1]||t}return t}return t}function sx(e,t){var n=ux(e,t);e.formatter.toggle("fontname",{value:function(e){var t=e.split(/\s*,\s*/);return X(t,function(e){return-1===e.indexOf(" ")||ee(e,'"')||ee(e,"'")?e:"'"+e+"'"}).join(",")}(n)}),e.nodeChanged()}var cx=d(ib,ju.isAbove,-1),lx=d(ib,ju.isBelow,1),fx=d(ab,-1,cx),dx=d(ab,1,lx),hx=Ge.isContentEditableFalse,mx=Ka,gx=d(gb,function(e){return e.bottom},function(e,t){return e.yt}),vx=d(bb,cx),yx=d(bb,lx),bx=function(e){for(var t=[],n=1;ns.childNodes.length-1,s=s.childNodes[Math.min(i,s.childNodes.length-1)]||s,i=v&&Ge.isText(s)?s.nodeValue.length:0),(u=XC(y,s))&&((p&&!l||!p&&l)&&(s=function(e,t,n,r,o){var i,a,u,s,c,l,f=t||"P",d=e.dom,h=XC(d,r);if(!(a=d.getParent(r,d.isBlock))||!WC(d,a)){if(l=(a=a||h)===e.getBody()||function(e){return e&&/^(TD|TH|CAPTION)$/.test(e.nodeName)}(a)?a.nodeName.toLowerCase():a.parentNode.nodeName.toLowerCase(),!a.hasChildNodes())return i=d.create(f),YC(e,i),a.appendChild(i),n.setStart(i,0),n.setEnd(i,0),i;for(s=r;s.parentNode!==a;)s=s.parentNode;for(;s&&!d.isBlock(s);)s=(u=s).previousSibling;if(u&&e.schema.isValidChild(l,f.toLowerCase())){for(i=d.create(f),YC(e,i),u.parentNode.insertBefore(i,u),s=u;s&&!d.isBlock(s);)c=s.nextSibling,i.appendChild(s),s=c;n.setStart(r,o),n.setEnd(r,o)}}return r}(a,p,w,s,i)),c=y.getParent(s,y.isBlock),h=c?y.getParent(c.parentNode,y.isBlock):null,m=c?c.nodeName.toUpperCase():"","LI"!==(g=h?h.nodeName.toUpperCase():"")||x||(h=(c=h).parentNode,m=g),/^(LI|DT|DD)$/.test(m)&&y.isEmpty(c)?nz(a,t,h,c,p):p&&c===a.getBody()||(p=p||"P",Ra(c)?(f=La(c),y.isEmpty(c)&&qC(c),Jx(a,f)):n()?r():n(!0)?(f=c.parentNode.insertBefore(t(),c),Jx(a,$C(c,"HR")?f:c)):((o=function(e){var t=e.cloneRange();return t.setStart(e.startContainer,KC(!0,e.startContainer,e.startOffset)),t.setEnd(e.endContainer,KC(!1,e.endContainer,e.endOffset)),t}(w).cloneRange()).setEndAfter(c),function(e){z(va(bt.fromDom(e),Et),function(e){var t=e.dom();t.nodeValue=fu(t.nodeValue)})}(d=o.extractContents()),function(e){for(;Ge.isText(e)&&(e.nodeValue=e.nodeValue.replace(/^[\r\n]+/,"")),e=e.firstChild;);}(d),f=d.firstChild,y.insertAfter(d,c),function(e,t,n){var r,o=n,i=[];if(o){for(;o=o.firstChild;){if(e.isBlock(o))return;Ge.isElement(o)&&!t[o.nodeName.toLowerCase()]&&i.push(o)}for(r=i.length;r--;)!(o=i[r]).hasChildNodes()||o.firstChild===o.lastChild&&""===o.firstChild.nodeValue?e.remove(o):(a=e,(u=o)&&"A"===u.nodeName&&a.isEmpty(u)&&e.remove(o));var a,u}}(y,C,f),function(e,t){var n;t.normalize(),(n=t.lastChild)&&!/^(left|right)$/gi.test(e.getStyle(n,"float",!0))||e.add(t,"br")}(y,c),y.isEmpty(c)&&qC(c),f.normalize(),y.isEmpty(f)?(y.remove(f),r()):Jx(a,f)),y.setAttrib(f,"id",""),a.fire("NewBlock",{newBlock:f})))},oz=function(e,t){return!!function(e){return Ge.isBr(e.getNode())}(_s.after(t))||Lc.nextPosition(e,_s.after(t)).map(function(e){return Ge.isBr(e.getNode())}).getOr(!1)},iz=function(e,t){var n=function(e){var t=d(Xy.isInlineTarget,e),n=_s.fromRangeStart(e.selection.getRng());return Qy(t,e.getBody(),n).filter(nw)}(e);n.isSome()?n.each(d(rw,e)):QC(e,t)},az=function(e){return ow(e,vf(e))},uz=function(e){return ow(e,yf(e))},sz=qf([{br:[]},{block:[]},{none:[]}]),cz=function(e,t){return Yy([mw([iw],sz.none()),mw([sw("summary",!0)],sz.br()),mw([cw(!0),lw(!1),dw],sz.br()),mw([cw(!0),lw(!1)],sz.block()),mw([cw(!0),lw(!0),dw],sz.block()),mw([cw(!0),lw(!0)],sz.br()),mw([uw(!0),dw],sz.br()),mw([uw(!0)],sz.block()),mw([aw(!0),dw,hw],sz.block()),mw([aw(!0)],sz.br()),mw([fw],sz.br()),mw([aw(!1),dw],sz.br()),mw([hw],sz.block())],[e,!(!t||!t.shiftKey)]).getOr(sz.none())},lz=function(e,t){cz(e,t).fold(function(){iz(e,t)},function(){rz(e,t)},i)},fz=function(t){t.on("keydown",function(e){e.keyCode===Mh.ENTER&&function(e,t){t.isDefaultPrevented()||(t.preventDefault(),function(e){e.typing&&(e.typing=!1,e.add())}(e.undoManager),e.undoManager.transact(function(){!1===e.selection.isCollapsed()&&e.execCommand("Delete"),lz(e,t)}))}(t,e)})},dz=d(gw,"\xa0"),hz=d(gw," "),mz=function(t){t.on("keydown",function(e){!1===e.isDefaultPrevented()&&function(e,t){Cx([{keyCode:Mh.SPACEBAR,action:bx(Mw,e)}],t).each(function(e){t.preventDefault()})}(t,e)})},gz=function(e){e.on("keyup compositionstart",d(Dw,e))},pz=oe().browser,vz=function(t){t.on("keydown",function(e){!1===e.isDefaultPrevented()&&function(e,t){Cx([{keyCode:Mh.END,action:mb(e,!0)},{keyCode:Mh.HOME,action:mb(e,!1)}],t).each(function(e){t.preventDefault()})}(t,e)})},yz=function(e){var t=rb.setupSelectedState(e);gz(e),wx(e,t),Gx(e,t),fz(e),mz(e),_w(e),vz(e)},bz=Yi.DOM,Cz=function(t,e){var n,r,o=t.settings,i=t.getElement(),a=t.getDoc();o.inline||(t.getElement().style.visibility=t.orgVisibility),e||t.inline||(a.open(),a.write(t.iframeHTML),a.close()),t.inline&&(t.on("remove",function(){var e=this.getBody();bz.removeClass(e,"mce-content-body"),bz.removeClass(e,"mce-edit-focus"),bz.setAttrib(e,"contentEditable",null)}),bz.addClass(i,"mce-content-body"),t.contentDocument=a=j.document,t.contentWindow=j.window,t.bodyElement=i,t.contentAreaContainer=i,o.root_name=i.nodeName.toLowerCase()),(n=t.getBody()).disabled=!0,t.readonly=o.readonly,t.readonly||(t.inline&&"static"===bz.getStyle(n,"position",!0)&&(n.style.position="relative"),n.contentEditable=t.getParam("content_editable_state",!0)),n.disabled=!1,t.editorUpload=eh(t),t.schema=vr(o),t.dom=Yi(a,{keep_values:!0,url_converter:t.convertURL,url_converter_scope:t,hex_colors:o.force_hex_style_colors,update_styles:!0,root_element:t.inline?t.getBody():null,collect:function(){return t.inline},schema:t.schema,contentCssCors:_f(t),referrerPolicy:Of(t),onSetAttrib:function(e){t.fire("SetAttrib",e)}}),t.parser=function(u){var e=Sp(u.settings,u.schema);return e.addAttributeFilter("src,href,style,tabindex",function(e,t){for(var n,r,o,i=e.length,a=u.dom;i--;)if(r=(n=e[i]).attr(t),o="data-mce-"+t,!n.attr(o)){if(0===r.indexOf("data:")||0===r.indexOf("blob:"))continue;"style"===t?((r=a.serializeStyle(a.parseStyle(r),n.name)).length||(r=null),n.attr(o,r),n.attr(t,r)):"tabindex"===t?(n.attr(o,r),n.attr(t,null)):n.attr(o,u.convertURL(r,t,n.name))}}),e.addNodeFilter("script",function(e){for(var t,n,r=e.length;r--;)0!==(n=(t=e[r]).attr("type")||"no/type").indexOf("mce-")&&t.attr("type","mce-"+n)}),e.addNodeFilter("#cdata",function(e){for(var t,n=e.length;n--;)(t=e[n]).type=8,t.name="#comment",t.value="[CDATA["+t.value+"]]"}),e.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(e){for(var t,n=e.length,r=u.schema.getNonEmptyElements();n--;)(t=e[n]).isEmpty(r)&&0===t.getAll("br").length&&(t.append(new sl("br",1)).shortEnded=!0)}),e}(t),t.serializer=Mp(o,t),t.selection=fy(t.dom,t.getWin(),t.serializer,t),t.annotator=rl(t),t.formatter=wp(t),t.undoManager=gm(t),t._nodeChangeDispatcher=new vh(t),t._selectionOverrides=im(t),Pw(t),Hw(t),yz(t),hh(t),t.fire("PreInit"),o.browser_spellcheck||o.gecko_spellcheck||(a.body.spellcheck=!1,bz.setAttrib(n,"spellcheck","false")),t.quirks=Ow(t),t.fire("PostRender");var u=If(t);u!==undefined&&(n.dir=u),o.protect&&t.on("BeforeSetContent",function(t){Rn.each(o.protect,function(e){t.content=t.content.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})})}),t.on("SetContent",function(){t.addVisual(t.getBody())}),t.load({initial:!0,format:"html"}),t.startContent=t.getContent({format:"raw"}),t.on("compositionstart compositionend",function(e){t.composing="compositionstart"===e.type}),0',"action-next":'',"action-prev":'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"arrow-left":'',"arrow-right":'',bold:'',bookmark:'',"border-width":'',brightness:'',browse:'',cancel:'',"change-case":'',"character-count":'',"checklist-rtl":'',checklist:'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',close:'',"code-sample":'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',contrast:'',copy:'',crop:'',cut:'',"document-properties":'',drag:'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',fill:'',"flip-horizontally":'',"flip-vertically":'',"format-painter":'',fullscreen:'',gallery:'',gamma:'',help:'',"highlight-bg-color":'',home:'',"horizontal-rule":'',"image-options":'',image:'',indent:'',info:'',"insert-character":'',"insert-time":'',invert:'',italic:'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"more-drawer":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',outdent:'',"page-break":'',"paste-text":'',paste:'',"permanent-pen":'',plus:'',preferences:'',preview:'',print:'',quote:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"rotate-left":'',"rotate-right":'',rtl:'',save:'',search:'',"select-all":'',selected:'',settings:'',sharpen:'',sourcecode:'',"spell-check":'',"strike-through":'',subscript:'',superscript:'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',template:'',"temporary-placeholder":'',"text-color":'',toc:'',translate:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unselected:'',upload:'',user:'',visualblocks:'',visualchars:'',warning:'',"zoom-in":'',"zoom-out":''}),$d.get(e).icons);ue(t,function(e,t){Tt(r,t)||n.ui.registry.addIcon(t,e)})}(e),function(e){var t=e.settings.theme;if(K(t)){e.settings.theme=Fw(t);var n=Kd.get(t);e.theme=new n(e,Kd.urls[t]),e.theme.init&&e.theme.init(e,Kd.urls[t]||e.documentBaseUrl.replace(/\/$/,""),e.$)}else e.theme={}}(e),function(t){var n=[];Rn.each(t.settings.plugins.split(/[ ,]/),function(e){Ez(t,n,Fw(e))})}(e);var t=function(e){var t=e.getElement();return e.orgDisplay=t.style.display,K(e.settings.theme)?function(e){return e.theme.renderUI()}(e):D(e.settings.theme)?function(e){var t=e.getElement(),n=(0,e.settings.theme)(e,t);return n.editorContainer.nodeType&&(n.editorContainer.id=n.editorContainer.id||e.id+"_parent"),n.iframeContainer&&n.iframeContainer.nodeType&&(n.iframeContainer.id=n.iframeContainer.id||e.id+"_iframecontainer"),n.height=n.iframeHeight?n.iframeHeight:t.offsetHeight,n}(e):jw(e)}(e);return e.editorContainer=t.editorContainer?t.editorContainer:null,Iw(e),e.inline?Cz(e):xz(e,t)},Sz=Yi.DOM,kz=function(t){var e=t.settings,n=t.id;oa.setCode(Bf(t));var r=function(){Sz.unbind(j.window,"ready",r),t.render()};if(Tr.Event.domLoaded){if(t.getElement()&&Sn.contentEditable){e.inline?t.inline=!0:(t.orgVisibility=t.getElement().style.visibility,t.getElement().style.visibility="hidden");var o=t.getElement().form||Sz.getParent(n,"form");o&&(t.formElement=o,e.hidden_input&&!Ge.isTextareaOrInput(t.getElement())&&(Sz.insertAfter(Sz.create("input",{type:"hidden",name:n}),n),t.hasHiddenInput=!0),t.formEventDelegate=function(e){t.fire(e.type,e)},Sz.bind(o,"submit reset",t.formEventDelegate),t.on("reset",function(){t.resetContent()}),!e.submit_patch||o.submit.nodeType||o.submit.length||o._mceOldSubmit||(o._mceOldSubmit=o.submit,o.submit=function(){return t.editorManager.triggerSave(),t.setDirty(!1),o._mceOldSubmit(o)})),t.windowManager=Bd(t),t.notificationManager=Od(t),"xml"===e.encoding&&t.on("GetContent",function(e){e.save&&(e.content=Sz.encode(e.content))}),e.add_form_submit_trigger&&t.on("submit",function(){t.initialized&&t.save()}),e.add_unload_trigger&&(t._beforeUnload=function(){!t.initialized||t.destroyed||t.isHidden()||t.save({format:"raw",no_events:!0,set_dirty:!1})},t.editorManager.on("BeforeUnload",t._beforeUnload)),t.editorManager.add(t),Ww(t,t.suffix)}}else Sz.bind(j.window,"ready",r)},Tz=function(e,t){var n=t.firstChild,r=t.lastChild;return n&&"meta"===n.name&&(n=n.next),r&&"mce_marker"===r.attr("id")&&(r=r.prev),function(e,t){var n=e.getNonEmptyElements();return t&&(t.isEmpty(n)||function(e,t){return e.getBlockElements()[t.name]&&function(e){return e.firstChild&&e.firstChild===e.lastChild}(t)&&function(e){return"br"===e.name||"\xa0"===e.value}(t.firstChild)}(e,t))}(e,r)&&(r=r.prev),!(!n||n!==r)&&("ul"===n.name||"ol"===n.name)},Az=function(e,o,i,t){function n(e){var t=_s.fromRangeStart(i),n=oc(o.getRoot()),r=1===e?n.prev(t):n.next(t);return!r||Gw(o,r.getNode())!==a}var r=function(e,t,n){var r=t.serialize(n);return function(e){var t=e.firstChild,n=e.lastChild;return t&&"META"===t.nodeName&&t.parentNode.removeChild(t),n&&"mce_marker"===n.id&&n.parentNode.removeChild(n),e}(e.createFragment(r))}(o,e,t),a=Gw(o,i.startContainer),u=Yw(Kw(r.firstChild)),s=o.getRoot();return n(1)?Qw(a,u,s):n(2)?function(e,t,n,r){return r.insertAfter(t.reverse(),e),Jw(t[0],n)}(a,u,s,o):function(t,e,n,r){var o=function(e,t){var n=t.cloneRange(),r=t.cloneRange();return n.setStartBefore(e),r.setEndAfter(e),[n.cloneContents(),r.cloneContents()]}(t,r),i=t.parentNode;return i.insertBefore(o[0],t),Rn.each(e,function(e){i.insertBefore(e,t)}),i.insertBefore(o[1],t),i.removeChild(t),Jw(e[e.length-1],n)}(a,u,s,i)},Mz=function(e,t){return!!Gw(e,t)},Rz=Ge.matchNodeNames(["td","th"]),Dz=function(e,t){var n=function(e){var t;return"string"!=typeof e?(t=Rn.extend({paste:e.paste,data:{paste:e.paste}},e),{content:e.content,details:t}):{content:e,details:{}}}(t);ex(e,n.content,n.details)},_z=function(e){Yx(e,!1)||_x(e,!1)||Bx(e,!1)||Hx(e,!1)||kx(e,!1)||Ux(e)||Tx(e,!1)||Px(e,!1)||(tx(e,"Delete"),zx(e))},Oz=function(e){_x(e,!0)||Bx(e,!0)||Hx(e,!0)||kx(e,!0)||Ux(e)||Tx(e,!0)||Px(e,!0)||tx(e,"ForwardDelete")},Bz={"font-size":"size","font-family":"face"},Hz={getFontSize:ox("font-size"),getFontFamily:q(function(e){return e.replace(/[\'\"\\]/g,"").replace(/,\s+/g,",")},ox("font-family")),toPt:function(e,t){return/[0-9.]+px$/.test(e)?function(e,t){var n=Math.pow(10,t);return Math.round(e*n)/n}(72*parseInt(e,10)/96,t||0)+"pt":e}},Pz=Rn.each,Lz=Rn.map,Vz=Rn.inArray,Iz=(Fz.prototype.execCommand=function(t,n,r,e){var o,i,a=!1,u=this;if(!u.editor.removed){if(/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(t)||e&&e.skip_focus?Qf(u.editor):u.editor.focus(),(e=u.editor.fire("BeforeExecCommand",{command:t,ui:n,value:r})).isDefaultPrevented())return!1;if(i=t.toLowerCase(),o=u.commands.exec[i])return o(i,n,r),u.editor.fire("ExecCommand",{command:t,ui:n,value:r}),!0;if(Pz(this.editor.plugins,function(e){if(e.execCommand&&e.execCommand(t,n,r))return u.editor.fire("ExecCommand",{command:t,ui:n,value:r}),!(a=!0)}),a)return a;if(u.editor.theme&&u.editor.theme.execCommand&&u.editor.theme.execCommand(t,n,r))return u.editor.fire("ExecCommand",{command:t,ui:n,value:r}),!0;try{a=u.editor.getDoc().execCommand(t,n,r)}catch(s){}return!!a&&(u.editor.fire("ExecCommand",{command:t,ui:n,value:r}),!0)}},Fz.prototype.queryCommandState=function(e){var t;if(!this.editor.quirks.isHidden()&&!this.editor.removed){if(e=e.toLowerCase(),t=this.commands.state[e])return t(e);try{return this.editor.getDoc().queryCommandState(e)}catch(n){}return!1}},Fz.prototype.queryCommandValue=function(e){var t;if(!this.editor.quirks.isHidden()&&!this.editor.removed){if(e=e.toLowerCase(),t=this.commands.value[e])return t(e);try{return this.editor.getDoc().queryCommandValue(e)}catch(n){}}},Fz.prototype.addCommands=function(e,n){var r=this;n=n||"exec",Pz(e,function(t,e){Pz(e.toLowerCase().split(","),function(e){r.commands[n][e]=t})})},Fz.prototype.addCommand=function(e,o,i){var a=this;e=e.toLowerCase(),this.commands.exec[e]=function(e,t,n,r){return o.call(i||a.editor,t,n,r)}},Fz.prototype.queryCommandSupported=function(e){if(e=e.toLowerCase(),this.commands.exec[e])return!0;try{return this.editor.getDoc().queryCommandSupported(e)}catch(t){}return!1},Fz.prototype.addQueryStateHandler=function(e,t,n){var r=this;e=e.toLowerCase(),this.commands.state[e]=function(){return t.call(n||r.editor)}},Fz.prototype.addQueryValueHandler=function(e,t,n){var r=this;e=e.toLowerCase(),this.commands.value[e]=function(){return t.call(n||r.editor)}},Fz.prototype.hasCustomCommand=function(e){return e=e.toLowerCase(),!!this.commands.exec[e]},Fz.prototype.execNativeCommand=function(e,t,n){return t===undefined&&(t=!1),n===undefined&&(n=null),this.editor.getDoc().execCommand(e,t,n)},Fz.prototype.isFormatMatch=function(e){return this.editor.formatter.match(e)},Fz.prototype.toggleFormat=function(e,t){this.editor.formatter.toggle(e,t?{value:t}:undefined),this.editor.nodeChanged()},Fz.prototype.storeSelection=function(e){this.selectionBookmark=this.editor.selection.getBookmark(e)},Fz.prototype.restoreSelection=function(){this.editor.selection.moveToBookmark(this.selectionBookmark)},Fz.prototype.setupCommands=function(i){var a=this;function e(n){return function(){var e=i.selection.isCollapsed()?[i.dom.getParent(i.selection.getNode(),i.dom.isBlock)]:i.selection.getSelectedBlocks(),t=Lz(e,function(e){return!!i.formatter.matchNode(e,n)});return-1!==Vz(t,!0)}}this.addCommands({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){i.undoManager.add()},"Cut,Copy,Paste":function(e){var t,n=i.getDoc();try{a.execNativeCommand(e)}catch(o){t=!0}if("paste"!==e||n.queryCommandEnabled(e)||(t=!0),t||!n.queryCommandSupported(e)){var r=i.translate("Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.");Sn.mac&&(r=r.replace(/Ctrl\+/g,"\u2318+")),i.notificationManager.open({text:r,type:"error"})}},unlink:function(){if(i.selection.isCollapsed()){var e=i.dom.getParent(i.selection.getStart(),"a");e&&i.dom.remove(e,!0)}else i.formatter.remove("link")},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull,JustifyNone":function(e){var t=e.substring(7);"full"===t&&(t="justify"),Pz("left,center,right,justify".split(","),function(e){t!==e&&i.formatter.remove("align"+e)}),"none"!==t&&a.toggleFormat("align"+t)},"InsertUnorderedList,InsertOrderedList":function(e){var t,n;a.execNativeCommand(e),(t=i.dom.getParent(i.selection.getNode(),"ol,ul"))&&(n=t.parentNode,/^(H[1-6]|P|ADDRESS|PRE)$/.test(n.nodeName)&&(a.storeSelection(),i.dom.split(n,t),a.restoreSelection()))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){a.toggleFormat(e)},"ForeColor,HiliteColor":function(e,t,n){a.toggleFormat(e,n)},FontName:function(e,t,n){sx(i,n)},FontSize:function(e,t,n){!function(e,t){e.formatter.toggle("fontsize",{value:ux(e,t)}),e.nodeChanged()}(i,n)},RemoveFormat:function(e){i.formatter.remove(e)},mceBlockQuote:function(){a.toggleFormat("blockquote")},FormatBlock:function(e,t,n){return a.toggleFormat(n||"p")},mceCleanup:function(){var e=i.selection.getBookmark();i.setContent(i.getContent()),i.selection.moveToBookmark(e)},mceRemoveNode:function(e,t,n){var r=n||i.selection.getNode();r!==i.getBody()&&(a.storeSelection(),i.dom.remove(r,!0),a.restoreSelection())},mceSelectNodeDepth:function(e,t,n){var r=0;i.dom.getParent(i.selection.getNode(),function(e){if(1===e.nodeType&&r++===n)return i.selection.select(e),!1},i.getBody())},mceSelectNode:function(e,t,n){i.selection.select(n)},mceInsertContent:function(e,t,n){Dz(i,n)},mceInsertRawHTML:function(e,t,n){i.selection.setContent("tiny_mce_marker");var r=i.getContent();i.setContent(r.replace(/tiny_mce_marker/g,function(){return n}))},mceInsertNewLine:function(e,t,n){lz(i,n)},mceToggleFormat:function(e,t,n){a.toggleFormat(n)},mceSetContent:function(e,t,n){i.setContent(n)},"Indent,Outdent":function(e){OC(i,e)},mceRepaint:function(){},InsertHorizontalRule:function(){i.execCommand("mceInsertContent",!1,"
")},mceToggleVisualAid:function(){i.hasVisual=!i.hasVisual,i.addVisual()},mceReplaceContent:function(e,t,n){i.execCommand("mceInsertContent",!1,n.replace(/\{\$selection\}/g,i.selection.getContent({format:"text"})))},mceInsertLink:function(e,t,n){var r;"string"==typeof n&&(n={href:n}),r=i.dom.getParent(i.selection.getNode(),"a"),n.href=n.href.replace(/ /g,"%20"),r&&n.href||i.formatter.remove("link"),n.href&&i.formatter.apply("link",n,r)},selectAll:function(){var e=i.dom.getParent(i.selection.getStart(),Ge.isContentEditableTrue);if(e){var t=i.dom.createRng();t.selectNodeContents(e),i.selection.setRng(t)}},"delete":function(){_z(i)},forwardDelete:function(){Oz(i)},mceNewDocument:function(){i.setContent("")},InsertLineBreak:function(e,t,n){return iz(i,n),!0}}),a.addCommands({JustifyLeft:e("alignleft"),JustifyCenter:e("aligncenter"),JustifyRight:e("alignright"),JustifyFull:e("alignjustify"),"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){return a.isFormatMatch(e)},mceBlockQuote:function(){return a.isFormatMatch("blockquote")},Outdent:function(){return DC(i)},"InsertUnorderedList,InsertOrderedList":function(e){var t=i.dom.getParent(i.selection.getNode(),"ul,ol");return t&&("insertunorderedlist"===e&&"UL"===t.tagName||"insertorderedlist"===e&&"OL"===t.tagName)}},"state"),a.addCommands({Undo:function(){i.undoManager.undo()},Redo:function(){i.undoManager.redo()}}),a.addQueryValueHandler("FontName",function(){return function(t){return ax(t).fold(function(){return ix(t).map(function(e){return Hz.getFontFamily(t.getBody(),e)}).getOr("")},function(e){return Hz.getFontFamily(t.getBody(),e)})}(i)},this),a.addQueryValueHandler("FontSize",function(){return function(t){return ax(t).fold(function(){return ix(t).map(function(e){return Hz.getFontSize(t.getBody(),e)}).getOr("")},function(e){return Hz.getFontSize(t.getBody(),e)})}(i)},this)},Fz);function Fz(e){this.commands={state:{},exec:{},value:{}},this.editor=e,this.setupCommands(e)}var Uz=Rn.makeMap("focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange mouseout mouseenter mouseleave wheel keydown keypress keyup input beforeinput contextmenu dragstart dragend dragover draggesture dragdrop drop drag submit compositionstart compositionend compositionupdate touchstart touchmove touchend touchcancel"," "),jz=(qz.isNative=function(e){return!!Uz[e.toLowerCase()]},qz.prototype.fire=function(e,t){var n,r,o,i;if(e=e.toLowerCase(),(t=t||{}).type=e,t.target||(t.target=this.scope),t.preventDefault||(t.preventDefault=function(){t.isDefaultPrevented=a},t.stopPropagation=function(){t.isPropagationStopped=a},t.stopImmediatePropagation=function(){t.isImmediatePropagationStopped=a},t.isDefaultPrevented=c,t.isPropagationStopped=c,t.isImmediatePropagationStopped=c),this.settings.beforeFire&&this.settings.beforeFire(t),n=this.bindings[e])for(r=0,o=n.length;r"),this.parseShortcut))[o.length-1]=Rn.extend(o[o.length-1],{func:n,scope:r||this.editor}),Rn.extend(o[0],{desc:this.editor.translate(t),subpatterns:o.slice(1)})},mE.prototype.hasModifier=function(e){return e.altKey||e.ctrlKey||e.metaKey},mE.prototype.isFunctionKey=function(e){return"keydown"===e.type&&112<=e.keyCode&&e.keyCode<=123},mE.prototype.matchShortcut=function(e,t){return!!t&&t.ctrl===e.ctrlKey&&t.meta===e.metaKey&&t.alt===e.altKey&&t.shift===e.shiftKey&&!!(e.keyCode===t.keyCode||e.charCode&&e.charCode===t.charCode)&&(e.preventDefault(),!0)},mE.prototype.executeShortcutAction=function(e){return e.func?e.func.call(e.scope):null},mE);function mE(e){this.shortcuts={},this.pendingPatterns=[],this.editor=e;var n=this;e.on("keyup keypress keydown",function(t){!n.hasModifier(t)&&!n.isFunctionKey(t)||t.isDefaultPrevented()||(cE(n.shortcuts,function(e){if(n.matchShortcut(t,e))return n.pendingPatterns=e.subpatterns.slice(0),"keydown"===t.type&&n.executeShortcutAction(e),!0}),n.matchShortcut(t,n.pendingPatterns[0])&&(1===n.pendingPatterns.length&&"keydown"===t.type&&n.executeShortcutAction(n.pendingPatterns[0]),n.pendingPatterns.shift()))})}function gE(){var e=function(){function e(n,r){return function(e,t){return n[e.toLowerCase()]=G(G({},t),{type:r})}}var t={},n={},r={},o={},i={},a={},u={};return{addButton:e(t,"button"),addToggleButton:e(t,"togglebutton"),addMenuButton:e(t,"menubutton"),addSplitButton:e(t,"splitbutton"),addMenuItem:e(n,"menuitem"),addNestedMenuItem:e(n,"nestedmenuitem"),addToggleMenuItem:e(n,"togglemenuitem"),addAutocompleter:e(r,"autocompleter"),addContextMenu:e(i,"contextmenu"),addContextToolbar:e(a,"contexttoolbar"),addContextForm:e(a,"contextform"),addSidebar:e(u,"sidebar"),addIcon:function(e,t){return o[e.toLowerCase()]=t},getAll:function(){return{buttons:t,menuItems:n,icons:o,popups:r,contextMenus:i,contextToolbars:a,sidebars:u}}}}();return{addAutocompleter:e.addAutocompleter,addButton:e.addButton,addContextForm:e.addContextForm,addContextMenu:e.addContextMenu,addContextToolbar:e.addContextToolbar,addIcon:e.addIcon,addMenuButton:e.addMenuButton,addMenuItem:e.addMenuItem,addNestedMenuItem:e.addNestedMenuItem,addSidebar:e.addSidebar,addSplitButton:e.addSplitButton,addToggleButton:e.addToggleButton,addToggleMenuItem:e.addToggleMenuItem,getAll:e.getAll}}var pE=Rn.each,vE=Rn.trim,yE="source protocol authority userInfo user password host port relative path directory file query anchor".split(" "),bE={ftp:21,http:80,https:443,mailto:25},CE=(wE.parseDataUri=function(e){var t,n=decodeURIComponent(e).split(","),r=/data:([^;]+)/.exec(n[0]);return r&&(t=r[1]),{type:t,data:n[1]}},wE.getDocumentBaseUrl=function(e){var t;return t=0!==e.protocol.indexOf("http")&&"file:"!==e.protocol?e.href:e.protocol+"//"+e.host+e.pathname,/^[^:]+:\/\/\/?[^\/]+\//.test(t)&&(t=t.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(t)||(t+="/")),t},wE.prototype.setPath=function(e){var t=/^(.*?)\/?(\w+)?$/.exec(e);this.path=t[0],this.directory=t[1],this.file=t[2],this.source="",this.getURI()},wE.prototype.toRelative=function(e){var t;if("./"===e)return e;var n=new wE(e,{base_uri:this});if("mce_host"!==n.host&&this.host!==n.host&&n.host||this.port!==n.port||this.protocol!==n.protocol&&""!==n.protocol)return n.getURI();var r=this.getURI(),o=n.getURI();return r===o||"/"===r.charAt(r.length-1)&&r.substr(0,r.length-1)===o?r:(t=this.toRelPath(this.path,n.path),n.query&&(t+="?"+n.query),n.anchor&&(t+="#"+n.anchor),t)},wE.prototype.toAbsolute=function(e,t){var n=new wE(e,{base_uri:this});return n.getURI(t&&this.isSameOrigin(n))},wE.prototype.isSameOrigin=function(e){if(this.host==e.host&&this.protocol==e.protocol){if(this.port==e.port)return!0;var t=bE[this.protocol];if(t&&(this.port||t)==(e.port||t))return!0}return!1},wE.prototype.toRelPath=function(e,t){var n,r,o,i=0,a="",u=e.substring(0,e.lastIndexOf("/")).split("/");if(n=t.split("/"),u.length>=n.length)for(r=0,o=u.length;r=n.length||u[r]!==n[r]){i=r+1;break}if(u.length=u.length||u[r]!==n[r]){i=r+1;break}if(1===i)return t;for(r=0,o=u.length-(i-1);r=n.x&&o.x+o.w<=n.w+n.x&&o.y>=n.y&&o.y+o.h<=n.h+n.y)return r[i];return null},intersect:function(e,t){var n,r,o,i;return n=eN(e.x,t.x),r=eN(e.y,t.y),o=ZE(e.x+e.w,t.x+t.w),i=ZE(e.y+e.h,t.y+t.h),o-n<0||i-r<0?null:nN(n,r,o-n,i-r)},clamp:function(e,t,n){var r,o,i,a,u,s,c,l,f,d;return u=e.x,s=e.y,c=e.x+e.w,l=e.y+e.h,f=t.x+t.w,d=t.y+t.h,r=eN(0,t.x-u),o=eN(0,t.y-s),i=eN(0,c-f),a=eN(0,l-d),u+=r,s+=o,n&&(c+=r,l+=o,u-=i,s-=a),nN(u,s,(c-=i)-u,(l-=a)-s)},create:nN,fromClientRect:function(e){return nN(e.left,e.top,e.width,e.height)}},oN=Rn.each,iN=Rn.extend;WE.extend=YE=function(n){function r(){var e,t,n;if(!GE&&(this.init&&this.init.apply(this,arguments),t=this.Mixins))for(e=t.length;e--;)(n=t[e]).init&&n.init.apply(this,arguments)}function t(){return this}function e(n,r){return function(){var e,t=this._super;return this._super=u[n],e=r.apply(this,arguments),this._super=t,e}}var o,i,a,u=this.prototype;for(i in GE=!0,o=new this,GE=!1,n.Mixins&&(oN(n.Mixins,function(e){for(var t in e)"init"!==t&&(n[t]=e[t])}),u.Mixins&&(n.Mixins=u.Mixins.concat(n.Mixins))),n.Methods&&oN(n.Methods.split(","),function(e){n[e]=t}),n.Properties&&oN(n.Properties.split(","),function(e){var t="_"+e;n[e]=function(e){return e!==undefined?(this[t]=e,this):this[t]}}),n.Statics&&oN(n.Statics,function(e,t){r[t]=e}),n.Defaults&&u.Defaults&&(n.Defaults=iN({},u.Defaults,n.Defaults)),n)"function"==typeof(a=n[i])&&u[i]?o[i]=e(i,a):o[i]=a;return r.prototype=o,(r.constructor=r).extend=YE,r};var aN=Math.min,uN=Math.max,sN=Math.round,cN={serialize:function(e){var t=JSON.stringify(e);return K(t)?t.replace(/[\u0080-\uFFFF]/g,function(e){var t=e.charCodeAt(0).toString(16);return"\\u"+"0000".substring(t.length)+t}):t},parse:function(e){try{return JSON.parse(e)}catch(t){}}},lN={callbacks:{},count:0,send:function(t){var n=this,r=Yi.DOM,o=t.count!==undefined?t.count:n.count,i="tinymce_jsonp_"+o;n.callbacks[o]=function(e){r.remove(i),delete n.callbacks[o],t.callback(e)},r.add(r.doc.body,"script",{id:i,src:t.url,type:"text/javascript"}),n.count++}},fN=G(G({},oE),{send:function(e){var t,n=0,r=function(){!e.async||4===t.readyState||1e4i&&(a.clearInterval(o),r())},e)},K=function(i){return function(){var n,t,r,e=(n=i,t="position",r=n.currentStyle?n.currentStyle[t]:a.window.getComputedStyle(n,null)[t],r||"").toLowerCase();return"absolute"===e||"fixed"===e}},Q=function(n){n.parentNode.removeChild(n)},W=function(n,t){var r,e=((r=a.document.createElement("div")).style.display="none",r.className="mce-floatpanel",r);a.document.body.appendChild(e),J(K(e),function(){Q(e),n()},function(){Q(e),t()},10,5e3)},X=function(n,t){n.notificationManager?n.notificationManager.open({text:t,type:"warning",timeout:0,icon:""}):n.windowManager.alert(t)},Y=function(n){n.EditorManager.on("AddEditor",function(n){var t=n.editor,r=t.settings.service_message;r&&W(function(){X(t,t.settings.service_message)},function(){a.alert(r)})})},Z=function(n){var t,r,e=L("tinymce.util.URI",u);(t=n.base_url)&&(this.baseURL=new e(this.documentBaseURL).toAbsolute(t.replace(/\/+$/,"")),this.baseURI=new e(this.baseURL)),r=n.suffix,n.suffix&&(this.suffix=r),this.defaultSettings=n},nn=function(n){return[L("tinymce.util.Tools",u).extend({},this.defaultSettings,n)]},tn={patch:i(function(n){return"function"!=typeof n.overrideDefaults},function(n){Y(n),n.overrideDefaults=Z,n.EditorManager.init=c(n.EditorManager.init,nn)})},rn={patch:i(function(n){return $(n,"4.5.0")},function(n){var e;n.overrideDefaults=c(n.overrideDefaults,(e=n,function(n){var t=n.plugin_base_urls;for(var r in t)e.PluginManager.urls[r]=t[r]}))})},en=function(n){o(n,[tn.patch,rn.patch,G.patch,k.patch])};en(u.tinymce)}(window); + +(function(cloudSettings) { + tinymce.overrideDefaults(cloudSettings); +})({"imagetools_proxy":"https://imageproxy.tiny.cloud/2/image","suffix":".min","linkchecker_service_url":"https://hyperlinking.tiny.cloud","spellchecker_rpc_url":"https://spelling.tiny.cloud","spellchecker_api_key":"no-api-key","tinydrive_service_url":"https://catalog.tiny.cloud","api_key":"no-api-key","imagetools_api_key":"no-api-key","tinydrive_api_key":"no-api-key","forced_plugins":["chiffer"],"referrer_policy":"origin","content_css_cors":true,"custom_plugin_urls":{},"chiffer_snowplow_service_url":"https://sp.tinymce.com/i","mediaembed_api_key":"no-api-key","linkchecker_api_key":"no-api-key","mediaembed_service_url":"https://hyperlinking.tiny.cloud","service_message":"This domain is not registered with Tiny Cloud. \u003ca target=\"_blank\" href=\"https://www.tiny.cloud/auth/signup/\"\u003eStart a free trial\u003c/a\u003e to discover our premium cloud services and pro support."}); +tinymce.baseURL = "https://cdn.tiny.cloud/1/no-api-key/tinymce/5.1.6-68" + +/* Ephox chiffer plugin +* +* Copyright 2010-2019 Tiny Technologies Inc. All rights reserved. +* +* Version: 1.4.2-9 +*/ + +!function(u){"use strict";for(var t,a=function(){return(new Date).getTime()},c=(t="string",function(n){return function(n){if(null===n)return"null";var t=typeof n;return"object"===t&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"===t&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":t}(n)===t}),o=[],n=0;n<256;++n)o[n]=(n+256).toString(16).substr(1);var f=function(){var n,t,r,e=function(){for(var n=new Array(16),t=0,r=0;r<16;r++)0==(3&r)&&(t=4294967296*Math.random()),n[r]=t>>>((3&r)<<3)&255;return n}();return e[6]=15&e[6]|64,e[8]=63&e[8]|128,t=0,(r=o)[(n=e)[t++]]+r[n[t++]]+r[n[t++]]+r[n[t++]]+"-"+r[n[t++]]+r[n[t++]]+"-"+r[n[t++]]+r[n[t++]]+"-"+r[n[t++]]+r[n[t++]]+"-"+r[n[t++]]+r[n[t++]]+r[n[t++]]+r[n[t++]]+r[n[t++]]+r[n[t++]]},s=function(){},d=function(n,t){var i,c,r,e=(i=n,c=t,{send:function(n,t,r){var e="?aid="+c+"&tna=tinymce_cloud&p=web&dtm="+t+"&stm="+a()+"&tz="+("undefined"!=typeof Intl?encodeURIComponent(Intl.DateTimeFormat().resolvedOptions().timeZone):"N%2FA")+"&e=se&se_ca="+n+"&eid="+f()+"&fp=none&tv=js-2.6.1",o=u.document.createElement("img");o.src=i.chiffer_snowplow_service_url+e,o.onload=function(){r(!0)},o.onerror=function(){r(!1)}}});return r=e,{sendStat:function(n){return function(){r.send(n,a(),s)}}}};return function(){var n,t,r=tinymce.defaultSettings,e={load:function(n){return s}},o=(n=r.api_key,c(n)?n:void 0),i=void 0===o?e:((t=d(r,o)).sendStat("script_load")(),{load:function(n){n.once("init",t.sendStat("init")),n.once("focus",t.sendStat("focus"))}});tinymce.PluginManager.add("chiffer",i.load)}}(window)(); \ No newline at end of file diff --git a/app/client/src/components/designSystems/appsmith/FilePickerComponent.tsx b/app/client/src/components/designSystems/appsmith/FilePickerComponent.tsx index f46d59f5c2..ee451922a1 100644 --- a/app/client/src/components/designSystems/appsmith/FilePickerComponent.tsx +++ b/app/client/src/components/designSystems/appsmith/FilePickerComponent.tsx @@ -42,7 +42,7 @@ class FilePickerComponent extends React.Component< // plugins={["GoogleDrive", "Url", "OneDrive", "Webcam"]} onRequestClose={this.closeModal} uppy={this.props.uppy} - /> */} + />**/} ); } diff --git a/app/client/src/components/designSystems/appsmith/RichTextEditorComponent.tsx b/app/client/src/components/designSystems/appsmith/RichTextEditorComponent.tsx new file mode 100644 index 0000000000..a3624729fd --- /dev/null +++ b/app/client/src/components/designSystems/appsmith/RichTextEditorComponent.tsx @@ -0,0 +1,39 @@ +import React from "react"; +import { Editor } from "@tinymce/tinymce-react"; +require("tinymce/tinymce"); +require("tinymce/themes/silver"); + +export interface RichtextEditorComponentProps { + defaultValue?: string; + placeholder?: string; + widgetId: string; + isDisabled?: boolean; + isVisible?: boolean; + onValueChange: (valueAsString: string) => void; +} +export const RichtextEditorComponent = ( + props: RichtextEditorComponentProps, +) => { + return ( + props.onValueChange(content)} + /> + ); +}; + +export default RichtextEditorComponent; diff --git a/app/client/src/constants/PropertyControlConstants.tsx b/app/client/src/constants/PropertyControlConstants.tsx index 86a5fa3ae7..7fd1e3118d 100644 --- a/app/client/src/constants/PropertyControlConstants.tsx +++ b/app/client/src/constants/PropertyControlConstants.tsx @@ -1,5 +1,6 @@ export type ControlType = | "INPUT_TEXT" + | "RICH_TEXT_EDITOR" | "ICON_PICKER" | "SEGMENT_CONTROL" | "SWITCH" diff --git a/app/client/src/constants/WidgetConstants.tsx b/app/client/src/constants/WidgetConstants.tsx index fa5dbb6f07..55d8635a5e 100644 --- a/app/client/src/constants/WidgetConstants.tsx +++ b/app/client/src/constants/WidgetConstants.tsx @@ -1,5 +1,6 @@ export type WidgetType = | "TEXT_WIDGET" + | "RICH_TEXT_EDITOR_WIDGET" | "IMAGE_WIDGET" | "CONTAINER_WIDGET" | "SPINNER_WIDGET" @@ -29,6 +30,7 @@ export const WidgetTypes: { [id: string]: WidgetType } = { DROP_DOWN_WIDGET: "DROP_DOWN_WIDGET", CHECKBOX_WIDGET: "CHECKBOX_WIDGET", RADIO_GROUP_WIDGET: "RADIO_GROUP_WIDGET", + RICH_TEXT_EDITOR_WIDGET: "RICH_TEXT_EDITOR_WIDGET", CHART_WIDGET: "CHART_WIDGET", FORM_WIDGET: "FORM_WIDGET", FORM_BUTTON_WIDGET: "FORM_BUTTON_WIDGET", diff --git a/app/client/src/icons/WidgetIcons.tsx b/app/client/src/icons/WidgetIcons.tsx index 15366aa950..a1196de4cc 100644 --- a/app/client/src/icons/WidgetIcons.tsx +++ b/app/client/src/icons/WidgetIcons.tsx @@ -14,6 +14,7 @@ import { ReactComponent as SwitchIcon } from "assets/icons/widget/switch.svg"; import { ReactComponent as TextIcon } from "assets/icons/widget/text.svg"; import { ReactComponent as ImageIcon } from "assets/icons/widget/image.svg"; import { ReactComponent as FilePickerIcon } from "assets/icons/widget/filepicker.svg"; +import { ReactComponent as RichTextEditorIcon } from "assets/icons/widget/rich-text.svg"; import { ReactComponent as ChartIcon } from "assets/icons/widget/chart.svg"; import { ReactComponent as FormIcon } from "assets/icons/widget/form.svg"; @@ -72,6 +73,11 @@ export const WidgetIcons: { ), + RICH_TEXT_EDITOR_WIDGET: (props: IconProps) => ( + + + + ), SWITCH_WIDGET: (props: IconProps) => ( diff --git a/app/client/src/index.tsx b/app/client/src/index.tsx index e9dc7cd424..b0df30736d 100755 --- a/app/client/src/index.tsx +++ b/app/client/src/index.tsx @@ -38,7 +38,6 @@ const PageNotFound = lazy(() => import("./pages/common/PageNotFound")); const AppViewer = lazy(() => import("./pages/AppViewer")); const Organization = lazy(() => import("./pages/organization")); const Users = lazy(() => import("./pages/users")); - appInitializer(); ReactDOM.render( diff --git a/app/client/src/mockResponses/PropertyPaneConfigResponse.tsx b/app/client/src/mockResponses/PropertyPaneConfigResponse.tsx index 083f946e15..8534dfe390 100644 --- a/app/client/src/mockResponses/PropertyPaneConfigResponse.tsx +++ b/app/client/src/mockResponses/PropertyPaneConfigResponse.tsx @@ -702,26 +702,19 @@ const PropertyPaneConfigResponse = { children: [ { id: "19.1", - propertyName: "defaultValue", + propertyName: "text", label: "Text", controlType: "INPUT_TEXT", placeholderText: "Enter your HTML text", }, { id: "19.2", - propertyName: "placeholder", - label: "Placeholder", - controlType: "INPUT_TEXT", - placeholderText: "Enter your placeholder", - }, - { - id: "19.3", propertyName: "isVisible", label: "Visible", controlType: "SWITCH", }, { - id: "19.4", + id: "19.3", propertyName: "isDisabled", label: "Disable", controlType: "SWITCH", diff --git a/app/client/src/mockResponses/WidgetConfigResponse.tsx b/app/client/src/mockResponses/WidgetConfigResponse.tsx index 64424a6627..459cf74549 100644 --- a/app/client/src/mockResponses/WidgetConfigResponse.tsx +++ b/app/client/src/mockResponses/WidgetConfigResponse.tsx @@ -19,6 +19,14 @@ const WidgetConfigResponse: WidgetConfigReducerState = { columns: 3, widgetName: "Text", }, + RICH_TEXT_EDITOR_WIDGET: { + text: "This is the initial content of the editor", + rows: 5, + columns: 8, + isDisabled: false, + isVisible: true, + widgetName: "RichTextEditor", + }, IMAGE_WIDGET: { defaultImage: "https://www.cowgirlcontractcleaning.com/wp-content/uploads/sites/360/2018/05/placeholder-img-5.jpg", diff --git a/app/client/src/mockResponses/WidgetSidebarResponse.tsx b/app/client/src/mockResponses/WidgetSidebarResponse.tsx index 682d734046..6bbfcf90b5 100644 --- a/app/client/src/mockResponses/WidgetSidebarResponse.tsx +++ b/app/client/src/mockResponses/WidgetSidebarResponse.tsx @@ -79,6 +79,11 @@ const WidgetSidebarResponse: { widgetCardName: "Button", key: generateReactKey(), }, + { + type: "RICH_TEXT_EDITOR_WIDGET", + widgetCardName: "Rich Text Editor", + key: generateReactKey(), + }, ], ["View widgets"]: [ { diff --git a/app/client/src/reducers/entityReducers/widgetConfigReducer.tsx b/app/client/src/reducers/entityReducers/widgetConfigReducer.tsx index f2fb8e05a5..f967507a1b 100644 --- a/app/client/src/reducers/entityReducers/widgetConfigReducer.tsx +++ b/app/client/src/reducers/entityReducers/widgetConfigReducer.tsx @@ -7,6 +7,7 @@ import { TextWidgetProps } from "widgets/TextWidget"; import { ContainerWidgetProps } from "widgets/ContainerWidget"; import { ImageWidgetProps } from "widgets/ImageWidget"; import { InputWidgetProps } from "widgets/InputWidget"; +import { RichTextEditorWidgetProps } from "widgets/RichTextEditorWidget"; import { SwitchWidgetProps } from "widgets/SwitchWidget"; import { SpinnerWidgetProps } from "widgets/SpinnerWidget"; import { DatePickerWidgetProps } from "../../widgets/DatePickerWidget"; @@ -43,6 +44,8 @@ export interface WidgetConfigReducerState { TEXT_WIDGET: Partial & WidgetConfigProps; IMAGE_WIDGET: Partial & WidgetConfigProps; INPUT_WIDGET: Partial & WidgetConfigProps; + RICH_TEXT_EDITOR_WIDGET: Partial & + WidgetConfigProps; SWITCH_WIDGET: Partial & WidgetConfigProps; CONTAINER_WIDGET: Partial> & WidgetConfigProps; diff --git a/app/client/src/resizable/index.tsx b/app/client/src/resizable/index.tsx index 65e01d2d94..e5bb8facc3 100644 --- a/app/client/src/resizable/index.tsx +++ b/app/client/src/resizable/index.tsx @@ -3,9 +3,14 @@ import styled, { StyledComponent } from "styled-components"; import { useDrag } from "react-use-gesture"; import { Spring } from "react-spring/renderprops"; -const ResizeWrapper = styled.div` +const ResizeWrapper = styled.div<{ pevents: boolean }>` position: absolute; display: block; + & { + * { + pointer-events: ${props => !props.pevents && "none"}; + } + } `; const getSnappedValues = ( @@ -72,6 +77,7 @@ type ResizableProps = { }; export const Resizable = (props: ResizableProps) => { + const [pointerEvents, togglePointerEvents] = useState(true); const [newDimensions, set] = useState({ width: props.componentWidth, height: props.componentHeight, @@ -195,6 +201,7 @@ export const Resizable = (props: ResizableProps) => { ]; const onResizeStop = () => { + togglePointerEvents(true); props.onStop( { width: newDimensions.width, @@ -211,12 +218,14 @@ export const Resizable = (props: ResizableProps) => { { + togglePointerEvents(false); + props.onStart(); + }} onStop={onResizeStop} snapGrid={props.snapGrid} /> )); - return ( { immediate={newDimensions.reset ? true : false} > {_props => ( - + {props.children} {props.enable && renderHandles} diff --git a/app/client/src/utils/WidgetRegistry.tsx b/app/client/src/utils/WidgetRegistry.tsx index c9623ba572..eb310a100c 100644 --- a/app/client/src/utils/WidgetRegistry.tsx +++ b/app/client/src/utils/WidgetRegistry.tsx @@ -13,6 +13,9 @@ import ButtonWidget, { ButtonWidgetProps } from "widgets/ButtonWidget"; import DropdownWidget, { DropdownWidgetProps } from "widgets/DropdownWidget"; import ImageWidget, { ImageWidgetProps } from "widgets/ImageWidget"; import TableWidget, { TableWidgetProps } from "widgets/TableWidget"; +import RichTextEditorWidget, { + RichTextEditorWidgetProps, +} from "widgets/RichTextEditorWidget"; import ChartWidget, { ChartWidgetProps } from "widgets/ChartWidget"; import FilePickerWidget, { @@ -170,6 +173,17 @@ class WidgetBuilderRegistry { DatePickerWidget.getDerivedPropertiesMap(), DatePickerWidget.getTriggerPropertyMap(), ); + WidgetFactory.registerWidgetBuilder( + "RICH_TEXT_EDITOR_WIDGET", + { + buildWidget(widgetData: RichTextEditorWidgetProps): JSX.Element { + return ; + }, + }, + RichTextEditorWidget.getPropertyValidationMap(), + RichTextEditorWidget.getDerivedPropertiesMap(), + RichTextEditorWidget.getTriggerPropertyMap(), + ); WidgetFactory.registerWidgetBuilder( "CHART_WIDGET", { diff --git a/app/client/src/widgets/RichTextEditorWidget.tsx b/app/client/src/widgets/RichTextEditorWidget.tsx new file mode 100644 index 0000000000..7b2eea598f --- /dev/null +++ b/app/client/src/widgets/RichTextEditorWidget.tsx @@ -0,0 +1,90 @@ +import React from "react"; +import BaseWidget, { WidgetProps, WidgetState } from "./BaseWidget"; +import { WidgetType } from "constants/WidgetConstants"; +import { EventType } from "constants/ActionConstants"; +import RichtextEditorComponent from "components/designSystems/appsmith/RichTextEditorComponent"; +import { WidgetPropertyValidationType } from "utils/ValidationFactory"; +import { VALIDATION_TYPES } from "constants/WidgetValidation"; +import { TriggerPropertiesMap } from "utils/WidgetFactory"; + +class RichTextEditorWidget extends BaseWidget< + RichTextEditorWidgetProps, + WidgetState +> { + static getPropertyValidationMap(): WidgetPropertyValidationType { + return { + placeholder: VALIDATION_TYPES.TEXT, + defaultValue: VALIDATION_TYPES.TEXT, + isDisabled: VALIDATION_TYPES.BOOLEAN, + isVisible: VALIDATION_TYPES.BOOLEAN, + }; + } + + static getTriggerPropertyMap(): TriggerPropertiesMap { + return { + onTextChange: true, + }; + } + + componentDidMount() { + super.componentDidMount(); + if (this.props.text) { + this.updateWidgetMetaProperty("value", this.props.text); + } + } + + componentDidUpdate(prevProps: RichTextEditorWidgetProps) { + super.componentDidUpdate(prevProps); + if (this.props.text) { + if (this.props.text !== prevProps.text) { + this.updateWidgetMetaProperty("value", this.props.text); + } + } + } + + onValueChange = (value: string) => { + this.updateWidgetMetaProperty("value", value); + if (this.props.onTextChange) { + super.executeAction({ + dynamicString: this.props.onTextChange, + event: { + type: EventType.ON_TEXT_CHANGE, + }, + }); + } + }; + + getPageView() { + return ( + + ); + } + + getWidgetType(): WidgetType { + return "RICH_TEXT_EDITOR_WIDGET"; + } +} + +export interface InputValidator { + validationRegex: string; + errorMessage: string; +} + +export interface RichTextEditorWidgetProps extends WidgetProps { + text?: string; + value?: string; + placeholder?: string; + onTextChange?: string; + isDisabled?: boolean; + isVisible?: boolean; +} + +export default RichTextEditorWidget; diff --git a/app/client/yarn.lock b/app/client/yarn.lock index 5cb90639d4..fa47aaf497 100644 --- a/app/client/yarn.lock +++ b/app/client/yarn.lock @@ -1443,7 +1443,6 @@ "@sentry/cli@^1.49.0": version "1.51.1" resolved "https://registry.yarnpkg.com/@sentry/cli/-/cli-1.51.1.tgz#6ad6b0a74555a5e92e6bdc23e5814418d3287658" - integrity sha512-JKYdoE5Pz8AQaupVQW3XOFTuff1UyLtxhcFzQPwQXiZEyXabo00dosX3YkqPKUwMv7LgxTOH23SJU8HwStAmFw== dependencies: fs-copy-file-sync "^1.1.1" https-proxy-agent "^4.0.0" @@ -1492,7 +1491,6 @@ "@sentry/webpack-plugin@^1.10.0": version "1.10.0" resolved "https://registry.yarnpkg.com/@sentry/webpack-plugin/-/webpack-plugin-1.10.0.tgz#7f7727b18dbdd3eaeb0998102be89d8733ddbca5" - integrity sha512-keT6cH8732bFjdH/v+C/UwbJu6byZ5L8t7QRLjgj+fqDyc/RlVEw9VzIQSJGUtd2XgImpdduWzgxythLkwKJjg== dependencies: "@sentry/cli" "^1.49.0" @@ -2151,6 +2149,12 @@ "@syncfusion/ej2-base" "~17.4.47" "@syncfusion/ej2-popups" "~17.4.47" +"@tinymce/tinymce-react@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@tinymce/tinymce-react/-/tinymce-react-3.5.0.tgz#5017be56aeab1077f09d3f74a386883e5524a33f" + dependencies: + prop-types "^15.6.2" + "@types/anymatch@*": version "1.3.1" resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" @@ -2946,7 +2950,6 @@ adjust-sourcemap-loader@2.0.0: agent-base@5: version "5.1.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" - integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== aggregate-error@^3.0.0: version "3.0.1" @@ -3019,7 +3022,6 @@ ansi-align@^3.0.0: ansi-colors@3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== ansi-colors@^3.0.0: version "3.2.4" @@ -3870,7 +3872,6 @@ browser-resolve@^1.11.3: browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" @@ -4212,7 +4213,6 @@ chardet@^0.7.0: charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= check-more-types@2.24.0: version "2.24.0" @@ -4221,7 +4221,6 @@ check-more-types@2.24.0: chokidar@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -4763,7 +4762,6 @@ cross-spawn@^3.0.0: crypt@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= crypto-browserify@^3.11.0: version "3.12.0" @@ -5007,7 +5005,6 @@ cyclist@^1.0.1: cypress-multi-reporters@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/cypress-multi-reporters/-/cypress-multi-reporters-1.2.4.tgz#bf6c95f39f9d2ce210d83e096f452a306bcd49fc" - integrity sha512-JTsF02I2KH1HM+cUEKeJih8EtjFv6jWVrYlRlJAnomwE5UqRQ3M7cAuw+zqBfNSTIvhOzNHtN3LyxomfhycuAQ== dependencies: debug "^4.1.1" lodash "^4.17.11" @@ -5082,7 +5079,6 @@ date-fns@^1.27.2: dateformat@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" - integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== de-indent@^1.0.2: version "1.0.2" @@ -5103,7 +5099,6 @@ debug@3.2.6, debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: ms "^2.1.1" @@ -5269,12 +5264,10 @@ diff-sequences@^24.9.0: diff@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== diffie-hellman@^5.0.0: version "5.0.3" @@ -6320,7 +6313,6 @@ flat-cache@^2.0.1: flat@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" - integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== dependencies: is-buffer "~2.0.3" @@ -6447,7 +6439,6 @@ from2@^2.1.0: fs-copy-file-sync@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" - integrity sha512-2QY5eeqVv4m2PfyMiEuy9adxNP+ajf+8AR05cEi+OAzPcOj90hvFImeZhTmKLBgSd9EvG33jsD7ZRxsx9dThkQ== fs-extra@5.0.0: version "5.0.0" @@ -6533,7 +6524,6 @@ fstream@^1.0.0, fstream@^1.0.12: fsu@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/fsu/-/fsu-1.1.1.tgz#bd36d3579907c59d85b257a75b836aa9e0c31834" - integrity sha512-xQVsnjJ/5pQtcKh+KjUoZGzVWn4uNkchxTF6Lwjr4Gf7nQr8fmUfhKJ62zE77+xQg9xnxi5KUps7XGs+VC986A== function-bind@^1.1.1: version "1.1.1" @@ -6695,7 +6685,6 @@ glob-to-regexp@^0.3.0: glob@7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -6814,7 +6803,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== growly@^1.3.0: version "1.3.0" @@ -7167,7 +7155,6 @@ https-browserify@^1.0.0: https-proxy-agent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz#702b71fb5520a132a66de1f67541d9e62154d82b" - integrity sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg== dependencies: agent-base "5" debug "4" @@ -8760,22 +8747,18 @@ lodash.debounce@^4.0.8: lodash.isempty@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" - integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= lodash.isfunction@^3.0.8, lodash.isfunction@^3.0.9: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" - integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== lodash.isobject@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-3.0.2.tgz#3c8fb8d5b5bf4bf90ae06e14f2a530a4ed935e1d" - integrity sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0= lodash.isstring@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= lodash.memoize@^4.1.2: version "4.1.2" @@ -8827,7 +8810,6 @@ log-symbols@2.2.0, log-symbols@^2.1.0: log-symbols@3.0.0, log-symbols@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== dependencies: chalk "^2.4.2" @@ -8981,7 +8963,6 @@ md5.js@^1.3.4: md5@^2.1.0: version "2.2.1" resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" - integrity sha1-U6s41f48iJG6RlMp6iP6wFQBJvk= dependencies: charenc "~0.0.1" crypt "~0.0.1" @@ -9291,7 +9272,6 @@ mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: mocha-junit-reporter@^1.23.3: version "1.23.3" resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.23.3.tgz#941e219dd759ed732f8641e165918aa8b167c981" - integrity sha512-ed8LqbRj1RxZfjt/oC9t12sfrWsjZ3gNnbhV1nuj9R/Jb5/P3Xb4duv2eCfCDMYH+fEu0mqca7m4wsiVjsxsvA== dependencies: debug "^2.2.0" md5 "^2.1.0" @@ -9302,7 +9282,6 @@ mocha-junit-reporter@^1.23.3: mocha@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.0.tgz#c784f579ad0904d29229ad6cb1e2514e4db7d249" - integrity sha512-MymHK8UkU0K15Q/zX7uflZgVoRWiTjy0fXE/QjKts6mowUvGxOdPhZ2qj3b0iZdUrNZlW9LAIMFHB4IW+2b3EQ== dependencies: ansi-colors "3.2.3" browser-stdout "1.3.1" @@ -9332,7 +9311,6 @@ mocha@^7.1.0: mochawesome-report-generator@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/mochawesome-report-generator/-/mochawesome-report-generator-4.1.0.tgz#f303e6acb5b30fd900f2ed8a0ba2054a034c9c39" - integrity sha512-8diUnfzLqMPybIsq3aw3Zc4Npw9W2ZCx8/fMR0ShAXfDTtPH4t2mRykXEWBhsBA5+jM74mjWpwEqY6Pmz+pCsw== dependencies: chalk "^2.4.2" dateformat "^3.0.2" @@ -9351,7 +9329,6 @@ mochawesome-report-generator@^4.1.0: mochawesome@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/mochawesome/-/mochawesome-5.0.0.tgz#eb3d96e589ccdd30146bbde581fb3deec01bcbec" - integrity sha512-1Vb0G8rqURptOZUmU5xLkLUWKYlx97IoMF2/xW18tL08Z1CZaUbzLAGbgq/s3DCn/vOrb8Dy7swb/cszp3Ylpg== dependencies: chalk "^3.0.0" diff "^4.0.1" @@ -9487,7 +9464,6 @@ node-ensure@^0.0.0: node-environment-flags@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== dependencies: object.getownpropertydescriptors "^2.0.3" semver "^5.7.0" @@ -9827,7 +9803,6 @@ opencollective-postinstall@^2.0.2: opener@^1.4.2: version "1.5.1" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" - integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== opn@^5.5.0: version "5.5.0" @@ -10956,7 +10931,6 @@ process@^0.11.10: progress@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= progress@^2.0.0: version "2.0.3" @@ -11031,7 +11005,6 @@ proxy-addr@~2.0.5: proxy-from-env@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" - integrity sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4= prr@~1.0.1: version "1.0.1" @@ -11454,7 +11427,6 @@ react-dom@^16.7.0, react-dom@^16.8.3: react-dom@^16.8.5: version "16.13.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.0.tgz#cdde54b48eb9e8a0ca1b3dc9943d9bb409b81866" - integrity sha512-y09d2c4cG220DzdlFkPTnVvGTszVvNpC73v+AaLGLHbkpy3SSgvYq8x0rNwPJ/Rk/CicTNgk0hbHNw1gMEZAXg== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -11787,7 +11759,6 @@ react@^16.12.0, react@^16.8.3: react@^16.8.5: version "16.13.0" resolved "https://registry.yarnpkg.com/react/-/react-16.13.0.tgz#d046eabcdf64e457bbeed1e792e235e1b9934cf7" - integrity sha512-TSavZz2iSLkq5/oiE7gnFzmURKZMltmi193rm5HEoUDAXpzT9Kzw6oNZnGoai/4+fUnm7FqS5dwgUL34TujcWQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -11884,7 +11855,6 @@ readdirp@^2.2.1: readdirp@~3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== dependencies: picomatch "^2.0.4" @@ -12485,7 +12455,6 @@ scheduler@^0.18.0: scheduler@^0.19.0: version "0.19.0" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.0.tgz#a715d56302de403df742f4a9be11975b32f5698d" - integrity sha512-xowbVaTPe9r7y7RUejcK73/j8tt2jfiyTednOvHbA8JoClvMYCp+r8QegLwK/n8zWQAtZb1fFnER4XLBZXrCxA== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -13213,7 +13182,6 @@ strip-indent@^3.0.0: strip-json-comments@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= strip-json-comments@^3.0.1: version "3.0.1" @@ -13281,7 +13249,6 @@ supports-color@5.5.0, supports-color@^5.3.0, supports-color@^5.5.0: supports-color@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== dependencies: has-flag "^3.0.0" @@ -13366,14 +13333,12 @@ tar@^2.0.0: tcomb-validation@^3.3.0: version "3.4.1" resolved "https://registry.yarnpkg.com/tcomb-validation/-/tcomb-validation-3.4.1.tgz#a7696ec176ce56a081d9e019f8b732a5a8894b65" - integrity sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA== dependencies: tcomb "^3.0.0" tcomb@^3.0.0, tcomb@^3.2.17: version "3.2.29" resolved "https://registry.yarnpkg.com/tcomb/-/tcomb-3.2.29.tgz#32404fe9456d90c2cf4798682d37439f1ccc386c" - integrity sha512-di2Hd1DB2Zfw6StGv861JoAF5h/uQVu/QJp2g8KVbtfKnoHdBQl5M32YWq6mnSYBQ1vFFrns5B1haWJL7rKaOQ== telejson@^3.2.0: version "3.3.0" @@ -13506,6 +13471,10 @@ tinycolor2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" +tinymce@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/tinymce/-/tinymce-5.2.0.tgz#e838640f61c8a936317bc27a5d2e16c297df3418" + tmp@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.1.0.tgz#ee434a4e22543082e294ba6201dcc6eafefa2877" @@ -14015,7 +13984,6 @@ uuid@^3.0.1, uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2: uuid@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.1.tgz#95ed6ff3d8c881cbf85f0f05cc3915ef994818ef" - integrity sha512-yqjRXZzSJm9Dbl84H2VDHpM3zMjzSJQ+hn6C4zqd5ilW+7P4ZmLEEqwho9LjP+tGuZlF4xrHQXT0h9QZUS/pWA== v8-compile-cache@^2.0.3: version "2.1.0" @@ -14031,7 +13999,6 @@ validate-npm-package-license@^3.0.1: validator@^10.11.0: version "10.11.0" resolved "https://registry.yarnpkg.com/validator/-/validator-10.11.0.tgz#003108ea6e9a9874d31ccc9e5006856ccd76b228" - integrity sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw== value-equal@^1.0.1: version "1.0.1" @@ -14599,7 +14566,6 @@ xml-name-validator@^3.0.0: xml@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" - integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= xmlchars@^2.1.1: version "2.2.0" @@ -14638,7 +14604,6 @@ yaml@^1.7.2: yargs-parser@13.1.1, yargs-parser@^13.1.1: version "13.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -14646,7 +14611,6 @@ yargs-parser@13.1.1, yargs-parser@^13.1.1: yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" @@ -14667,7 +14631,6 @@ yargs-parser@^5.0.0: yargs-unparser@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== dependencies: flat "^4.1.0" lodash "^4.17.15" From 35e480d7e1528f20bf8fb46dff6ae77b4684443c Mon Sep 17 00:00:00 2001 From: Pushpa B Date: Fri, 20 Mar 2020 14:21:24 +0000 Subject: [PATCH 6/6] Feature/edit common widgets --- app/client/cypress.json | 6 +- app/client/cypress/fixtures/inputdata.json | 4 + app/client/cypress/fixtures/user.json | 2 +- .../integration/CommonWidgets/Button_spec.js | 15 + .../CommonWidgets/Container_spec.js | 17 ++ .../integration/CommonWidgets/Input_spec.js | 18 ++ .../integration/CommonWidgets/Table_spec.js | 15 + .../integration/CommonWidgets/Text_spec.js | 16 ++ .../integration/OnBoarding/Login_spec.js | 22 +- app/client/cypress/integration/test.js | 43 --- app/client/cypress/locators/HomePage.json | 7 + app/client/cypress/locators/LoginPage.json | 2 +- app/client/cypress/locators/Widgets.json | 13 + .../cypress/locators/commonlocators.json | 4 + app/client/cypress/support/commands.js | 26 +- app/client/cypress/support/index.js | 18 ++ app/client/cypress/test.sh | 2 +- app/client/package.json | 3 +- app/client/yarn.lock | 270 +++++------------- 19 files changed, 248 insertions(+), 255 deletions(-) create mode 100644 app/client/cypress/fixtures/inputdata.json create mode 100644 app/client/cypress/integration/CommonWidgets/Button_spec.js create mode 100644 app/client/cypress/integration/CommonWidgets/Container_spec.js create mode 100644 app/client/cypress/integration/CommonWidgets/Input_spec.js create mode 100644 app/client/cypress/integration/CommonWidgets/Table_spec.js create mode 100644 app/client/cypress/integration/CommonWidgets/Text_spec.js delete mode 100644 app/client/cypress/integration/test.js create mode 100644 app/client/cypress/locators/HomePage.json create mode 100644 app/client/cypress/locators/Widgets.json create mode 100644 app/client/cypress/locators/commonlocators.json diff --git a/app/client/cypress.json b/app/client/cypress.json index 3c75281b43..5f84ec8125 100644 --- a/app/client/cypress.json +++ b/app/client/cypress.json @@ -1,11 +1,13 @@ { "baseUrl":"http://dev.appsmith.com:3000/", + "defaultCommandTimeout": 5000, + "pageLoadTimeout": 30000, "reporter": "mochawesome", "reporterOptions": { "reportDir": "results", "overwrite": false, - "html": false, - "json": true + "html": true, + "json": false } } \ No newline at end of file diff --git a/app/client/cypress/fixtures/inputdata.json b/app/client/cypress/fixtures/inputdata.json new file mode 100644 index 0000000000..fee8bc9415 --- /dev/null +++ b/app/client/cypress/fixtures/inputdata.json @@ -0,0 +1,4 @@ +{ + "appname": "Test App", + +} \ No newline at end of file diff --git a/app/client/cypress/fixtures/user.json b/app/client/cypress/fixtures/user.json index 9d5a67368d..7d95e02603 100644 --- a/app/client/cypress/fixtures/user.json +++ b/app/client/cypress/fixtures/user.json @@ -1,6 +1,6 @@ { "username": "testowner@appsmith.com", - "password": "own3rT3st1ng", + "password": "own3rT3st1ng" } \ No newline at end of file diff --git a/app/client/cypress/integration/CommonWidgets/Button_spec.js b/app/client/cypress/integration/CommonWidgets/Button_spec.js new file mode 100644 index 0000000000..486f77ec52 --- /dev/null +++ b/app/client/cypress/integration/CommonWidgets/Button_spec.js @@ -0,0 +1,15 @@ +var widgetsPage= require('../../locators/Widgets.json') +var loginPage= require('../../locators/LoginPage.json') +const loginData=require('../../fixtures/user.json') +var commonlocators = require('../../locators/commonlocators.json') + +context('Cypress test',function() { + + it('Button Widget Functionality',function(){ + + cy.get(widgetsPage.buttonWidget).click({ force: true }) + //Checking the edit props for Button + cy.get('.CodeMirror textarea').focus().type("{meta}a").clear({ force: true }).type("{{Text4.text}}", {parseSpecialCharSequences: false}) + cy.get(commonlocators.editPropCrossButton).click() + }) +}) \ No newline at end of file diff --git a/app/client/cypress/integration/CommonWidgets/Container_spec.js b/app/client/cypress/integration/CommonWidgets/Container_spec.js new file mode 100644 index 0000000000..23ef0e1873 --- /dev/null +++ b/app/client/cypress/integration/CommonWidgets/Container_spec.js @@ -0,0 +1,17 @@ +var widgetsPage= require('../../locators/Widgets.json') +var loginPage= require('../../locators/LoginPage.json') +const loginData=require('../../fixtures/user.json') +var commonlocators = require('../../locators/commonlocators.json') + +context('Cypress test',function() { + + it('Container Widget Functionality',function(){ + + cy.get(widgetsPage.containerWidget).first().trigger('mouseover',{force:true}) + cy.get(widgetsPage.containerWidget).children(commonlocators.editIcon).first().click() + //Checking the edit props for container and also the properties of container + cy.get('.CodeMirror textarea').focus().type("{meta}a").clear({ force: true }).type('#C0C0C0') + cy.get('.CodeMirror textarea').should('have.value', '#C0C0C0') + cy.get(commonlocators.editPropCrossButton).click() + }) +}) \ No newline at end of file diff --git a/app/client/cypress/integration/CommonWidgets/Input_spec.js b/app/client/cypress/integration/CommonWidgets/Input_spec.js new file mode 100644 index 0000000000..126a46aac1 --- /dev/null +++ b/app/client/cypress/integration/CommonWidgets/Input_spec.js @@ -0,0 +1,18 @@ +var widgetsPage= require('../../locators/Widgets.json') +var loginPage= require('../../locators/LoginPage.json') +const loginData=require('../../fixtures/user.json') +var commonlocators = require('../../locators/commonlocators.json') + +context('Cypress test',function() { + + it('Input Widget Functionality',function(){ + + cy.get(widgetsPage.inputWidget).first().trigger('mouseover') + cy.get(widgetsPage.inputWidget).children(commonlocators.editicon).first().click() + //Checking the edit props for container and also the properties of container + cy.get('.CodeMirror textarea').first().focus().type("{meta}a").clear({ force: true }).type('Test Input Label') + cy.get('.CodeMirror textarea').first().should('have.value', 'Test Input Label') + cy.get(commonlocators.editPropCrossButton).click() + + }) +}) \ No newline at end of file diff --git a/app/client/cypress/integration/CommonWidgets/Table_spec.js b/app/client/cypress/integration/CommonWidgets/Table_spec.js new file mode 100644 index 0000000000..0ffbfe238c --- /dev/null +++ b/app/client/cypress/integration/CommonWidgets/Table_spec.js @@ -0,0 +1,15 @@ +var widgetsPage= require('../../locators/Widgets.json') +var loginPage= require('../../locators/LoginPage.json') +const loginData=require('../../fixtures/user.json') +var commonlocators = require('../../locators/commonlocators.json') + +context('Cypress test',function() { + + it('Table Widget Functionality',function(){ + + cy.get(widgetsPage.tableWidget).first().trigger('mouseover',{force:true}) + cy.get(widgetsPage.tableWidget).children(commonlocators.editicon).first().click() + cy.get('.CodeMirror textarea').focus().type("{meta}a").clear({ force: true }).type("{{MockUsersApi.data}}",{parseSpecialCharSequences: false}) + cy.get(commonlocators.editPropCrossButton).click() + }) +}) \ No newline at end of file diff --git a/app/client/cypress/integration/CommonWidgets/Text_spec.js b/app/client/cypress/integration/CommonWidgets/Text_spec.js new file mode 100644 index 0000000000..58a8992e96 --- /dev/null +++ b/app/client/cypress/integration/CommonWidgets/Text_spec.js @@ -0,0 +1,16 @@ +var widgetsPage= require('../../locators/Widgets.json') +var loginPage= require('../../locators/LoginPage.json') +const loginData=require('../../fixtures/user.json') +var commonlocators = require('../../locators/commonlocators.json') + +context('Cypress test',function() { + + it('Text Widget Functionality',function(){ + + cy.get(widgetsPage.textWidget).first().trigger('mouseover') + cy.get(widgetsPage.textWidget).children(commonlocators.editIcon).first().click() + cy.get('.CodeMirror textarea').first().focus().type("{meta}a").clear({ force: true }).type('Test text') + cy.get(commonlocators.editPropCrossButton).click() + + }) +}) \ No newline at end of file diff --git a/app/client/cypress/integration/OnBoarding/Login_spec.js b/app/client/cypress/integration/OnBoarding/Login_spec.js index ba0cb7ea2c..18558bfc2d 100644 --- a/app/client/cypress/integration/OnBoarding/Login_spec.js +++ b/app/client/cypress/integration/OnBoarding/Login_spec.js @@ -1,20 +1,16 @@ var loginPage= require('../../locators/LoginPage.json') -const loginData=require('../../fixtures/user.json') +var homePage = require('../../locators/HomePage.json') +var commonlocators = require('../../locators/commonlocators.json') +var widgetsPage= require('../../locators/Widgets.json') + + context('Cypress test',function() { it('Login functionality',function(){ - - cy.LogintoApp(loginData.username,loginData.password) - cy.get('input[type="text"]').type('Test app') - cy.wait(3000) - cy.get('.t--application-edit-link').click() - cy.wait(5000) - cy.get('.t--draggable-buttonwidget').click({ force: true }) - cy.wait(2000) - cy.get('textarea').first().click({ force: true }).clear({ force: true }).type('Test', { force: true }) - cy.wait(5000) - cy.get('.t--application-publish-btn').click() - + + cy.get(widgetsPage.buttonWidget).click({ force: true }) + cy.get('.CodeMirror textarea').focus().type("{meta}a").clear({ force: true }).type('Test', { force: true }) + cy.get(commonlocators.editPropCrossButton).click() }) }) \ No newline at end of file diff --git a/app/client/cypress/integration/test.js b/app/client/cypress/integration/test.js deleted file mode 100644 index 7ef2207c9e..0000000000 --- a/app/client/cypress/integration/test.js +++ /dev/null @@ -1,43 +0,0 @@ -describe("My First Test", function() { - it("Visits the Kitchen Sink", function() { - cy.visit( - "http://localhost:3000/applications/5d807e45795dc6000482bc74/pages/5df08f966ccd2400049dde1a/edit", - ); - // cy.contains("Enter your Netlify Site URL"); - // cy.get(); - // Main button pressed (usually the left button) - // cy.get(".TABLE_WIDGET") - // .first() - // .trigger("mousedown") - // .trigger("mousemove", { which: 1, clientX: 400, clientY: 100 }) - // .trigger("mouseup"); - - // cy.contains("Submit").click(); - // cy.contains("Barbra", { timeout: 1000000 }).click(); - // // cy.contains("{{fetchUsers2}}"); - // cy.get('input[value="{{fetchUsers2}}"]') - // // .first() - // .clear() - // .type( - // "{{}{{}fetchUsers2.map(user => {{}return {{}'name': user.name}})}}", - // { - // force: true, - // }, - // ); - - // .then(function($input) { - // $input[0].setAttribute( - // "value", - // "{{fetchUsers2.map(user => {return {'name': user.name}})}}", - // ); - // }); - - // .invoke( - // "attr", - // "value", - // "{{fetchUsers2.map(user => {return {'name': user.name}})}}", - // ); - - expect(true).to.eq(true); - }); -}); diff --git a/app/client/cypress/locators/HomePage.json b/app/client/cypress/locators/HomePage.json new file mode 100644 index 0000000000..2a51f315ca --- /dev/null +++ b/app/client/cypress/locators/HomePage.json @@ -0,0 +1,7 @@ +{ + "searchInput": "input[type='text']", + "appEditIcon": ".t--application-edit-link", + "publishButton":".t--application-publish-btn", + "publishCrossButton":"span[icon='small-cross']" + +} \ No newline at end of file diff --git a/app/client/cypress/locators/LoginPage.json b/app/client/cypress/locators/LoginPage.json index d212984269..18c060c394 100644 --- a/app/client/cypress/locators/LoginPage.json +++ b/app/client/cypress/locators/LoginPage.json @@ -2,4 +2,4 @@ "username":"input[name='username']", "password":"input[name='password']", "submitBtn":"button[type='submit']" -} \ No newline at end of file +} diff --git a/app/client/cypress/locators/Widgets.json b/app/client/cypress/locators/Widgets.json new file mode 100644 index 0000000000..5b461110b4 --- /dev/null +++ b/app/client/cypress/locators/Widgets.json @@ -0,0 +1,13 @@ +{ + "containerWidget":".t--draggable-containerwidget", + "inputWidget":".t--draggable-inputwidget", + "togglebutton":"input[type='checkbox']", + "inputPropsDataType":".t--property-control-datatype", + "inputdatatypedropdownicon": "./html/body/div[6]/div/div[3]/div[2]/div[2]/div[2]/span/span/div/button/span[2]", + "inputdatatypeplaceholder":".t--property-control-placeholder", + "buttonWidget":".t--draggable-buttonwidget", + "textWidget":".t--draggable-textwidget", + "tableWidget":".t--draggable-tablewidget" + + +} \ No newline at end of file diff --git a/app/client/cypress/locators/commonlocators.json b/app/client/cypress/locators/commonlocators.json new file mode 100644 index 0000000000..dca3ed8731 --- /dev/null +++ b/app/client/cypress/locators/commonlocators.json @@ -0,0 +1,4 @@ +{ + "editIcon":".t--widget-propertypane-toggle", + "editPropCrossButton":"span[icon='cross']" +} \ No newline at end of file diff --git a/app/client/cypress/support/commands.js b/app/client/cypress/support/commands.js index 3caea750bd..a48f9903c3 100644 --- a/app/client/cypress/support/commands.js +++ b/app/client/cypress/support/commands.js @@ -1,9 +1,31 @@ var loginPage= require('../locators/LoginPage.json') +var homePage = require('../locators/HomePage.json') Cypress.Commands.add("LogintoApp",(uname,pword)=>{ cy.visit('/') - cy.wait(6000) + cy.get(loginPage.username).should('be.visible') cy.get(loginPage.username).type(uname) cy.get(loginPage.password).type(pword) cy.get(loginPage.submitBtn).click() -}) \ No newline at end of file +}) +Cypress.Commands.add("SearchApp",(appname)=>{ + cy.get(homePage.searchInput).type(appname) + cy.get(homePage.appEditIcon).should('have.length', 1) + cy.get(homePage.appEditIcon).click() + cy.get('#loading').should('not.exist') +}) + + +Cypress.Commands.add("PublishtheApp",()=>{ + cy.wait(4000) + cy.get(homePage.publishButton).click() + cy.window() + .then((win) => { + cy.get(homePage.publishCrossButton).click() + + }) + +}) + + + diff --git a/app/client/cypress/support/index.js b/app/client/cypress/support/index.js index d68db96df2..7971e94231 100644 --- a/app/client/cypress/support/index.js +++ b/app/client/cypress/support/index.js @@ -13,8 +13,26 @@ // https://on.cypress.io/configuration // *********************************************************** +const loginData=require('../fixtures/user.json') +const inputData=require('../fixtures/inputdata.json') + // Import commands.js using ES2015 syntax: import './commands' +before(function () { + + cy.LogintoApp(loginData.username,loginData.password) + cy.SearchApp(inputData.appname) + }) + + beforeEach(function () { + + Cypress.Cookies.preserveOnce('session_id', 'remember_token') + + }) // Alternatively you can use CommonJS syntax: // require('./commands') +after(function() { + + cy.PublishtheApp() +}) diff --git a/app/client/cypress/test.sh b/app/client/cypress/test.sh index 4e6f4ad9af..5f8c5f44aa 100755 --- a/app/client/cypress/test.sh +++ b/app/client/cypress/test.sh @@ -1 +1 @@ -$(npm bin)/cypress run CYPRESS_BASE_URL='http://dev.appsmith.com:3000/' --spec "cypress/integration/OnBoarding/Login_spec.js" \ No newline at end of file +$(npm bin)/cypress run CYPRESS_BASE_URL='http://dev.appsmith.com:3000/' --spec "cypress/integration/*/*" \ No newline at end of file diff --git a/app/client/package.json b/app/client/package.json index cac338ee4d..f2c495950d 100644 --- a/app/client/package.json +++ b/app/client/package.json @@ -138,7 +138,7 @@ "@typescript-eslint/eslint-plugin": "^2.0.0", "@typescript-eslint/parser": "^2.0.0", "babel-loader": "^8.0.6", - "cypress": "^3.7.0", + "cypress": "^4.1.0", "cypress-multi-reporters": "^1.2.4", "dotenv": "^8.1.0", "eslint": "^6.4.0", @@ -162,6 +162,7 @@ "husky": { "hooks": { "pre-commit": "lint-staged" + } } } diff --git a/app/client/yarn.lock b/app/client/yarn.lock index fa47aaf497..2c7e101dd7 100644 --- a/app/client/yarn.lock +++ b/app/client/yarn.lock @@ -3027,10 +3027,6 @@ ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" -ansi-escapes@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" @@ -3291,18 +3287,17 @@ async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" -async@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - dependencies: - lodash "^4.17.10" - async@^2.1.4, async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" dependencies: lodash "^4.17.14" +async@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" + integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -3772,11 +3767,7 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.0.tgz#791420d7f551eea2897453a8a77653f96606d67c" - -bluebird@^3.3.5, bluebird@^3.5.5: +bluebird@3.7.2, bluebird@^3.3.5, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -4045,11 +4036,10 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" -cachedir@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-1.3.0.tgz#5e01928bf2d95b5edd94b0942188246740e0dbc4" - dependencies: - os-homedir "^1.0.1" +cachedir@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== call-me-maybe@^1.0.1: version "1.0.1" @@ -4274,10 +4264,6 @@ chrome-trace-event@^1.0.2: dependencies: tslib "^1.9.0" -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -4334,10 +4320,6 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" - cli-table3@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" @@ -4507,9 +4489,10 @@ comma-separated-tokens@^1.0.0: version "1.0.8" resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" +commander@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.0.tgz#545983a0603fe425bc672d66c9e3c89c42121a83" + integrity sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw== commander@^2.11.0, commander@^2.19.0, commander@^2.20.0: version "2.20.3" @@ -5009,41 +4992,44 @@ cypress-multi-reporters@^1.2.4: debug "^4.1.1" lodash "^4.17.11" -cypress@^3.7.0: - version "3.8.3" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-3.8.3.tgz#e921f5482f1cbe5814891c878f26e704bbffd8f4" +cypress@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-4.1.0.tgz#295f115d2e8a08fff2760ab49d94d876f5877aee" + integrity sha512-FFV8pS9iuriSX4M9rna6awJUhiqozZD1D5z5BprCUJoho1ctbcgpkEUIUnqxli2OwjQqVz07egO+iqoGL+tw7g== dependencies: "@cypress/listr-verbose-renderer" "0.4.1" "@cypress/xvfb" "1.2.4" "@types/sizzle" "2.3.2" arch "2.1.1" - bluebird "3.5.0" - cachedir "1.3.0" + bluebird "3.7.2" + cachedir "2.3.0" chalk "2.4.2" check-more-types "2.24.0" - commander "2.15.1" + commander "4.1.0" common-tags "1.8.0" - debug "3.2.6" + debug "4.1.1" eventemitter2 "4.1.2" - execa "0.10.0" + execa "1.0.0" executable "4.1.1" extract-zip "1.6.7" - fs-extra "5.0.0" - getos "3.1.1" - is-ci "1.2.1" + fs-extra "8.1.0" + getos "3.1.4" + is-ci "2.0.0" is-installed-globally "0.1.0" lazy-ass "1.6.0" - listr "0.12.0" + listr "0.14.3" lodash "4.17.15" - log-symbols "2.2.0" + log-symbols "3.0.0" minimist "1.2.0" moment "2.24.0" - ramda "0.24.1" + ospath "1.2.2" + pretty-bytes "5.3.0" + ramda "0.26.1" request "2.88.0" request-progress "3.0.0" - supports-color "5.5.0" + supports-color "7.1.0" tmp "0.1.0" - untildify "3.0.3" + untildify "4.0.0" url "0.11.0" yauzl "2.10.0" @@ -5096,7 +5082,7 @@ debug@3.2.6, debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: dependencies: ms "^2.1.1" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: +debug@4, debug@4.1.1, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" dependencies: @@ -5911,19 +5897,7 @@ exec-sh@^0.3.2: version "0.3.4" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" -execa@0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" - dependencies: - cross-spawn "^6.0.0" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^1.0.0: +execa@1.0.0, execa@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" dependencies: @@ -6440,11 +6414,11 @@ fs-copy-file-sync@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fs-copy-file-sync/-/fs-copy-file-sync-1.1.1.tgz#11bf32c096c10d126e5f6b36d06eece776062918" -fs-extra@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" +fs-extra@8.1.0, fs-extra@^8.0.1, fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" dependencies: - graceful-fs "^4.1.2" + graceful-fs "^4.2.0" jsonfile "^4.0.0" universalify "^0.1.0" @@ -6474,14 +6448,6 @@ fs-extra@^7.0.0: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^8.0.1, fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-minipass@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" @@ -6614,10 +6580,6 @@ get-stdin@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-7.0.0.tgz#8d5de98f15171a125c5e516643c7a6d0ea8a96f6" -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -6634,11 +6596,12 @@ get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" -getos@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/getos/-/getos-3.1.1.tgz#967a813cceafee0156b0483f7cffa5b3eff029c5" +getos@3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/getos/-/getos-3.1.4.tgz#29cdf240ed10a70c049add7b6f8cb08c81876faf" + integrity sha512-UORPzguEB/7UG5hqiZai8f0vQ7hzynMQyJLxStoQ8dPGAcmgsfXOPA4iE/fGtweHYkK+z4zc9V0g+CIFRf5HYw== dependencies: - async "2.6.1" + async "^3.1.0" getpass@^0.1.1: version "0.1.7" @@ -7490,13 +7453,7 @@ is-callable@^1.1.4, is-callable@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" -is-ci@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - dependencies: - ci-info "^1.5.0" - -is-ci@^2.0.0: +is-ci@2.0.0, is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" dependencies: @@ -8580,19 +8537,6 @@ listr-silent-renderer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" -listr-update-renderer@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz#ca80e1779b4e70266807e8eed1ad6abe398550f9" - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - elegant-spinner "^1.0.1" - figures "^1.7.0" - indent-string "^3.0.0" - log-symbols "^1.0.2" - log-update "^1.0.2" - strip-ansi "^3.0.1" - listr-update-renderer@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" @@ -8606,15 +8550,6 @@ listr-update-renderer@^0.5.0: log-update "^2.3.0" strip-ansi "^3.0.1" -listr-verbose-renderer@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" - dependencies: - chalk "^1.1.3" - cli-cursor "^1.0.2" - date-fns "^1.27.2" - figures "^1.7.0" - listr-verbose-renderer@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" @@ -8624,28 +8559,7 @@ listr-verbose-renderer@^0.5.0: date-fns "^1.27.2" figures "^2.0.0" -listr@0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a" - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - figures "^1.7.0" - indent-string "^2.1.0" - is-promise "^2.1.0" - is-stream "^1.1.0" - listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.2.0" - listr-verbose-renderer "^0.4.0" - log-symbols "^1.0.2" - log-update "^1.0.2" - ora "^0.2.3" - p-map "^1.1.1" - rxjs "^5.0.0-beta.11" - stream-to-observable "^0.1.0" - strip-ansi "^3.0.1" - -listr@^0.14.3: +listr@0.14.3, listr@^0.14.3: version "0.14.3" resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" dependencies: @@ -8797,16 +8711,10 @@ lodash.uniq@4.5.0, lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" -lodash@4.17.15, "lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.0.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@~4.17.10: +lodash@4.17.15, "lodash@>=3.5 <5", lodash@^4.0.0, lodash@^4.0.1, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@~4.17.10: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" -log-symbols@2.2.0, log-symbols@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - dependencies: - chalk "^2.0.1" - log-symbols@3.0.0, log-symbols@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" @@ -8819,12 +8727,11 @@ log-symbols@^1.0.2: dependencies: chalk "^1.0.0" -log-update@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" +log-symbols@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" dependencies: - ansi-escapes "^1.0.0" - cli-cursor "^1.0.2" + chalk "^2.0.1" log-update@^2.3.0: version "2.3.0" @@ -9828,15 +9735,6 @@ optionator@^0.8.1, optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" -ora@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" - dependencies: - chalk "^1.1.1" - cli-cursor "^1.0.2" - cli-spinners "^0.1.2" - object-assign "^4.0.1" - original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -9847,7 +9745,7 @@ os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" -os-homedir@^1.0.0, os-homedir@^1.0.1: +os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -9876,6 +9774,11 @@ osenv@0: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +ospath@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/ospath/-/ospath-1.2.2.tgz#1276639774a3f8ef2572f7fe4280e0ea4550c07b" + integrity sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs= + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -9928,10 +9831,6 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" - p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" @@ -10880,7 +10779,7 @@ prettier@^1.16.4, prettier@^1.18.2: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" -pretty-bytes@^5.1.0: +pretty-bytes@5.3.0, pretty-bytes@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2" @@ -11201,9 +11100,10 @@ raf@^3.4.1: dependencies: performance-now "^2.1.0" -ramda@0.24.1: - version "0.24.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" +ramda@0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" + integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== ramda@^0.21.0: version "0.21.0" @@ -12364,12 +12264,6 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^5.0.0-beta.11: - version "5.5.12" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" - dependencies: - symbol-observable "1.0.1" - rxjs@^6.3.3, rxjs@^6.4.0, rxjs@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c" @@ -12998,10 +12892,6 @@ stream-shift@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" -stream-to-observable@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe" - strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -13240,34 +13130,35 @@ stylis@^3.5.0: version "3.5.4" resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe" -supports-color@5.5.0, supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - dependencies: - has-flag "^3.0.0" - supports-color@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" dependencies: has-flag "^3.0.0" +supports-color@7.1.0, supports-color@^7.0.0, supports-color@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" + dependencies: + has-flag "^4.0.0" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + supports-color@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" dependencies: has-flag "^3.0.0" -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" - dependencies: - has-flag "^4.0.0" - svg-parser@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.3.tgz#a38f2e4e5442986f7ecb554c11f1411cfcf8c2b9" @@ -13290,10 +13181,6 @@ svgo@^1.0.0, svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" -symbol-observable@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" - symbol-observable@^1.0.2, symbol-observable@^1.1.0, symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -13874,9 +13761,10 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -untildify@3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" +untildify@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== upath@^1.1.1: version "1.2.0"