/*! elementor - v3.19.0 - 07-02-2024 */
(self["webpackChunkelementor"] = self["webpackChunkelementor"] || []).push([["modules_nested-elements_assets_js_editor_nested-element-types-base_js"],{
/***/ "../modules/nested-elements/assets/js/editor/nested-element-types-base.js":
/*!********************************************************************************!*\
!*** ../modules/nested-elements/assets/js/editor/nested-element-types-base.js ***!
\********************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = exports.NestedElementTypesBase = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"));
var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"));
var _inherits2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"));
var _view = _interopRequireDefault(__webpack_require__(/*! ./views/view */ "../modules/nested-elements/assets/js/editor/views/view.js"));
var _empty = _interopRequireDefault(__webpack_require__(/*! ./views/empty */ "../modules/nested-elements/assets/js/editor/views/empty.js"));
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
/**
* @typedef {import('../../../../../assets/dev/js/editor/elements/types/base/element-base')} ElementBase
*/
var NestedElementTypesBase = /*#__PURE__*/function (_elementor$modules$el) {
(0, _inherits2.default)(NestedElementTypesBase, _elementor$modules$el);
var _super = _createSuper(NestedElementTypesBase);
function NestedElementTypesBase() {
(0, _classCallCheck2.default)(this, NestedElementTypesBase);
return _super.apply(this, arguments);
}
(0, _createClass2.default)(NestedElementTypesBase, [{
key: "getType",
value: function getType() {
elementorModules.ForceMethodImplementation();
}
}, {
key: "getView",
value: function getView() {
return _view.default;
}
}, {
key: "getEmptyView",
value: function getEmptyView() {
return _empty.default;
}
}, {
key: "getModel",
value: function getModel() {
return $e.components.get('nested-elements/nested-repeater').exports.NestedModelBase;
}
}]);
return NestedElementTypesBase;
}(elementor.modules.elements.types.Base);
exports.NestedElementTypesBase = NestedElementTypesBase;
var _default = NestedElementTypesBase;
exports["default"] = _default;
/***/ }),
/***/ "../modules/nested-elements/assets/js/editor/views/add-section-area.js":
/*!*****************************************************************************!*\
!*** ../modules/nested-elements/assets/js/editor/views/add-section-area.js ***!
\*****************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
/* provided dependency */ var __ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n")["__"];
/* provided dependency */ var PropTypes = __webpack_require__(/*! prop-types */ "../node_modules/prop-types/index.js");
var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = AddSectionArea;
var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "react"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
/* eslint-disable jsx-a11y/click-events-have-key-events */
function AddSectionArea(props) {
var addAreaElementRef = (0, _react.useRef)(),
containerHelper = elementor.helpers.container;
// Make droppable area.
(0, _react.useEffect)(function () {
var $addAreaElementRef = jQuery(addAreaElementRef.current),
defaultDroppableOptions = props.container.view.getDroppableOptions();
// Make some adjustments to behave like 'AddSectionArea', use default droppable options from container element.
defaultDroppableOptions.placeholder = false;
defaultDroppableOptions.items = '> .elementor-add-section-inner';
defaultDroppableOptions.hasDraggingOnChildClass = 'elementor-dragging-on-child';
// Make element drop-able.
$addAreaElementRef.html5Droppable(defaultDroppableOptions);
// Cleanup.
return function () {
$addAreaElementRef.html5Droppable('destroy');
};
}, []);
return /*#__PURE__*/_react.default.createElement("div", {
className: "elementor-add-section",
onClick: function onClick() {
return containerHelper.openEditMode(props.container);
},
ref: addAreaElementRef,
role: "button",
tabIndex: "0"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "elementor-add-section-inner"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "e-view elementor-add-new-section"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "elementor-add-section-area-button elementor-add-section-button",
onClick: function onClick() {
return props.setIsRenderPresets(true);
},
title: __('Add new container', 'elementor'),
role: "button",
tabIndex: "0"
}, /*#__PURE__*/_react.default.createElement("i", {
className: "eicon-plus"
})), /*#__PURE__*/_react.default.createElement("div", {
className: "elementor-add-section-drag-title"
}, __('Drag widgets here.', 'elementor')))));
}
AddSectionArea.propTypes = {
container: PropTypes.object.isRequired,
setIsRenderPresets: PropTypes.func.isRequired
};
/***/ }),
/***/ "../modules/nested-elements/assets/js/editor/views/empty.js":
/*!******************************************************************!*\
!*** ../modules/nested-elements/assets/js/editor/views/empty.js ***!
\******************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
/* provided dependency */ var PropTypes = __webpack_require__(/*! prop-types */ "../node_modules/prop-types/index.js");
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = Empty;
var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "react"));
var _defineProperty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/defineProperty */ "../node_modules/@babel/runtime/helpers/defineProperty.js"));
var _slicedToArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "../node_modules/@babel/runtime/helpers/slicedToArray.js"));
var _addSectionArea = _interopRequireDefault(__webpack_require__(/*! ./add-section-area */ "../modules/nested-elements/assets/js/editor/views/add-section-area.js"));
var _selectPreset = _interopRequireDefault(__webpack_require__(/*! ./select-preset */ "../modules/nested-elements/assets/js/editor/views/select-preset.js"));
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function Empty(props) {
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
isRenderPresets = _useState2[0],
setIsRenderPresets = _useState2[1];
props = _objectSpread(_objectSpread({}, props), {}, {
setIsRenderPresets: setIsRenderPresets
});
return isRenderPresets ? /*#__PURE__*/_react.default.createElement(_selectPreset.default, props) : /*#__PURE__*/_react.default.createElement(_addSectionArea.default, props);
}
Empty.propTypes = {
container: PropTypes.object.isRequired
};
/***/ }),
/***/ "../modules/nested-elements/assets/js/editor/views/select-preset.js":
/*!**************************************************************************!*\
!*** ../modules/nested-elements/assets/js/editor/views/select-preset.js ***!
\**************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
/* provided dependency */ var __ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n")["__"];
/* provided dependency */ var PropTypes = __webpack_require__(/*! prop-types */ "../node_modules/prop-types/index.js");
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = SelectPreset;
var _react = _interopRequireDefault(__webpack_require__(/*! react */ "react"));
/* eslint-disable jsx-a11y/click-events-have-key-events */
function SelectPreset(props) {
var containerHelper = elementor.helpers.container,
onPresetSelected = function onPresetSelected(preset, container) {
var options = {
createWrapper: false
};
// Create new one by selected preset.
containerHelper.createContainerFromPreset(preset, container, options);
};
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
className: "elementor-add-section-close"
}, /*#__PURE__*/_react.default.createElement("i", {
onClick: function onClick() {
return props.setIsRenderPresets(false);
},
className: "eicon-close",
"aria-hidden": "true"
}), /*#__PURE__*/_react.default.createElement("span", {
className: "elementor-screen-only"
}, __('Close', 'elementor'))), /*#__PURE__*/_react.default.createElement("div", {
className: "e-view e-con-select-preset"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "e-con-select-preset__title"
}, __('Select your Structure', 'elementor')), /*#__PURE__*/_react.default.createElement("div", {
className: "e-con-select-preset__list"
}, elementor.presetsFactory.getContainerPresets().map(function (preset) {
return /*#__PURE__*/_react.default.createElement("div", {
onClick: function onClick() {
return onPresetSelected(preset, props.container);
},
key: preset,
className: "e-con-preset",
"data-preset": preset,
dangerouslySetInnerHTML: {
__html: elementor.presetsFactory.generateContainerPreset(preset)
},
role: "button",
tabIndex: "0"
});
}))));
}
SelectPreset.propTypes = {
container: PropTypes.object.isRequired,
setIsRenderPresets: PropTypes.func.isRequired
};
/***/ }),
/***/ "../modules/nested-elements/assets/js/editor/views/view.js":
/*!*****************************************************************!*\
!*** ../modules/nested-elements/assets/js/editor/views/view.js ***!
\*****************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = exports.View = void 0;
var _classCallCheck2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"));
var _createClass2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"));
var _get2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/get */ "../node_modules/@babel/runtime/helpers/get.js"));
var _inherits2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"));
var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"));
var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"));
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
var View = /*#__PURE__*/function (_$e$components$get$ex) {
(0, _inherits2.default)(View, _$e$components$get$ex);
var _super = _createSuper(View);
function View() {
(0, _classCallCheck2.default)(this, View);
return _super.apply(this, arguments);
}
(0, _createClass2.default)(View, [{
key: "events",
value: function events() {
var _this = this;
var events = (0, _get2.default)((0, _getPrototypeOf2.default)(View.prototype), "events", this).call(this);
events.click = function (e) {
// If the clicked Nested Element is not within the currently edited document, don't do anything with it.
if (elementor.documents.currentDocument.id.toString() !== e.target.closest('.elementor').dataset.elementorId) {
return;
}
var closest = e.target.closest('.elementor-element');
var model = _this.options.model,
view = _this;
// For clicks on container/widget.
if (['container', 'widget'].includes(closest === null || closest === void 0 ? void 0 : closest.dataset.element_type)) {
// eslint-disable-line camelcase
// In case the container empty, click should be handled by the EmptyView.
var container = elementor.getContainer(closest.dataset.id);
if (container.view.isEmpty()) {
return true;
}
// If not empty, open it.
model = container.model;
view = container.view;
}
e.stopPropagation();
$e.run('panel/editor/open', {
model: model,
view: view
});
};
return events;
}
/**
* Function renderHTML().
*
* The `renderHTML()` method is overridden as it causes redundant renders when removing focus from any nested element.
* This is because the original `renderHTML()` method sets `editModel.renderOnLeave = true;`.
*/
}, {
key: "renderHTML",
value: function renderHTML() {
var templateType = this.getTemplateType(),
editModel = this.getEditModel();
if ('js' === templateType) {
editModel.setHtmlCache();
this.render();
} else {
editModel.renderRemoteServer();
}
}
}]);
return View;
}($e.components.get('nested-elements/nested-repeater').exports.NestedViewBase);
exports.View = View;
var _default = View;
exports["default"] = _default;
/***/ }),
/***/ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js":
/*!***********************************************************************!*\
!*** ../node_modules/@babel/runtime/helpers/assertThisInitialized.js ***!
\***********************************************************************/
/***/ ((module) => {
function _assertThisInitialized(self) {
if (self === void 0) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return self;
}
module.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ "../node_modules/@babel/runtime/helpers/defineProperty.js":
/*!****************************************************************!*\
!*** ../node_modules/@babel/runtime/helpers/defineProperty.js ***!
\****************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
var toPropertyKey = __webpack_require__(/*! ./toPropertyKey.js */ "../node_modules/@babel/runtime/helpers/toPropertyKey.js");
function _defineProperty(obj, key, value) {
key = toPropertyKey(key);
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
module.exports = _defineProperty, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ "../node_modules/@babel/runtime/helpers/get.js":
/*!*****************************************************!*\
!*** ../node_modules/@babel/runtime/helpers/get.js ***!
\*****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
var superPropBase = __webpack_require__(/*! ./superPropBase.js */ "../node_modules/@babel/runtime/helpers/superPropBase.js");
function _get() {
if (typeof Reflect !== "undefined" && Reflect.get) {
module.exports = _get = Reflect.get.bind(), module.exports.__esModule = true, module.exports["default"] = module.exports;
} else {
module.exports = _get = function _get(target, property, receiver) {
var base = superPropBase(target, property);
if (!base) return;
var desc = Object.getOwnPropertyDescriptor(base, property);
if (desc.get) {
return desc.get.call(arguments.length < 3 ? target : receiver);
}
return desc.value;
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
}
return _get.apply(this, arguments);
}
module.exports = _get, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js":
/*!****************************************************************!*\
!*** ../node_modules/@babel/runtime/helpers/getPrototypeOf.js ***!
\****************************************************************/
/***/ ((module) => {
function _getPrototypeOf(o) {
module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {
return o.__proto__ || Object.getPrototypeOf(o);
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
return _getPrototypeOf(o);
}
module.exports = _getPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ "../node_modules/@babel/runtime/helpers/inherits.js":
/*!**********************************************************!*\
!*** ../node_modules/@babel/runtime/helpers/inherits.js ***!
\**********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf.js */ "../node_modules/@babel/runtime/helpers/setPrototypeOf.js");
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function");
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
writable: true,
configurable: true
}
});
Object.defineProperty(subClass, "prototype", {
writable: false
});
if (superClass) setPrototypeOf(subClass, superClass);
}
module.exports = _inherits, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js":
/*!***************************************************************************!*\
!*** ../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js ***!
\***************************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
var _typeof = (__webpack_require__(/*! ./typeof.js */ "../node_modules/@babel/runtime/helpers/typeof.js")["default"]);
var assertThisInitialized = __webpack_require__(/*! ./assertThisInitialized.js */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js");
function _possibleConstructorReturn(self, call) {
if (call && (_typeof(call) === "object" || typeof call === "function")) {
return call;
} else if (call !== void 0) {
throw new TypeError("Derived constructors may only return object or undefined");
}
return assertThisInitialized(self);
}
module.exports = _possibleConstructorReturn, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ "../node_modules/@babel/runtime/helpers/setPrototypeOf.js":
/*!****************************************************************!*\
!*** ../node_modules/@babel/runtime/helpers/setPrototypeOf.js ***!
\****************************************************************/
/***/ ((module) => {
function _setPrototypeOf(o, p) {
module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
}, module.exports.__esModule = true, module.exports["default"] = module.exports;
return _setPrototypeOf(o, p);
}
module.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ }),
/***/ "../node_modules/@babel/runtime/helpers/superPropBase.js":
/*!***************************************************************!*\
!*** ../node_modules/@babel/runtime/helpers/superPropBase.js ***!
\***************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
var getPrototypeOf = __webpack_require__(/*! ./getPrototypeOf.js */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js");
function _superPropBase(object, property) {
while (!Object.prototype.hasOwnProperty.call(object, property)) {
object = getPrototypeOf(object);
if (object === null) break;
}
return object;
}
module.exports = _superPropBase, module.exports.__esModule = true, module.exports["default"] = module.exports;
/***/ })
}]);
//# sourceMappingURL=e8a7573e654d921656ab.bundle.js.map Содержание Прежде чем вы сможете проверить результаты A/B теста, вы должны убедиться, что он достиг статистической значимости. Во многих сервисах есть специальный калькулятор. Например, если вы только что протестировали заголовок на целевой странице, почему бы не сделать новый тест для основного текста? Когда один из вариантов теста выигрывает, сервис автоматически начинает демонстрировать его пользователям. Навигация вашего сайта начинается с главной страницы. Она связывает все основные разделы и часто выступает ориентиром для пользователя. Убедитесь, что ваша структура такова, что посетители могут легко ориентироваться в разделах, когда ищут нужную услугу или товар. Давайте теперь перейдем к другим типам тестирования. Если вы тестируете формы захвата, варианты могут затрагивать формулировки CTA, размер самой формы, количество полей, информацию, которую должен ввести пользователь и т. Качественные и количественные инструменты исследования помогли вам в сборе данных о поведении посетителей. Чтобы рассчитать статистическую значимость, можно использовать онлайн-инструменты — они проделают всю работу за вас и выдадут результаты в упрощенном виде. Но как узнать, на что ваша аудитория лучше всего откликается? Самое очевидное — просто внести нужные изменения и посмотреть, что произойдет. Но это — время и деньги, которые не хочется тратить впустую. В каждом онлайн-калькуляторе заложены свои критерии и алгоритмы, которые могут не учитывать всех особенностей эксперимента. То, что работает для одной компании, может не обязательно работать для другой. Фактически, эксперты по оптимизации коэффициента конверсии ненавидят термин «лучшие практики», потому что они на самом деле не всегда могут быть лучшими для вас. После отмены рассылки на тестовые группы редактировать рассылку или копировать в новую вы уже не можете. На третьем этапе создания рассылки — «Настройка рассылки» — с помощью ползунка вы можете определить количество тестовых групп и итоговой рассылки в процентном соотношении. Хорошо то, что Google Optimize сам определяет, когда пора завершить тестирование для получения достоверных сведений. Этот эксперимент проходил на сайте Highrise. Как видите, на правую страницу вместо обычного белого фона была добавлена эмоциональная фотография. Глядя на девушку с улыбкой, у пользователя подсознательно менялось отношение к странице и кликабельность кнопки увеличилась на 102%. Например, у вас в меню есть элементы, на которые часто переходят пользователи, но при этом они не играют никакой роли в воронке продаж. Соответственно, она может исказить статистику и повлиять на результаты АБ теста. Сложно найти что-то максимально универсальное, более эффективно комбинировать для разных целей разные инструменты. Есть бесплатная версия с ограничением до 5000 показов в месяц, чего в принципе достаточно, чтобы понять нужен ли вам этот сервис. https://deveducation.com/ Также там нет никаких дополнительных функций, в частности, таргетинга. Отсутствует и поддержка, которая поможет правильно настроить и запустить тест. Еще одна проблема — отсутствие русской локализации в большинстве этих сервисов. Split testing означает «раздельное тестирование», объясняя, что такое сплит-тестирование заключается в разделении потока пользователей на две группы «подопытных». Одна группа пользователей попадает на текущую версию страницы (страница A), вторая — на страницу с изменённым элементом (страница B). A/B-тестирование позволяет узнать, какие слова, фразы, изображения, видео, отзывы и другие элементы сайта работают лучше всего. Слишком длительное проведение кампании также является распространенной ошибкой бизнеса. Продолжительность выполнения теста зависит от различных факторов, таких как существующий трафик, коэффициент конверсии, ожидаемое улучшение и т. A/B-тестирование – это процесс одновременного показа двух вариантов одной и той же веб-страницы двум тестовым группам посетителей сайта. На основе поведенческой активности каждой группы можно судить об эффективности тестируемых изменений на странице. Сравнивая полученные результаты, нужно решить, как поступить дальше. Это тестирование проводила компания «Экспидия». У них была вот такая форма для отправки счета в оригинальном варианте, в котором нужно было ввести имя, фамилию, название компании и адрес. Следующий кейс компании «Сильвер», которая экспериментирует с невероятной скоростью. Во-первых, оно помогает настроить сайт под потребности и пожелания клиента. Например, можно запустить AB тест, в котором поменять кнопку призыва к действию с «Купить» на «Получить», и посмотреть, как пользователи будут с ней взаимодействовать. ✓ Как создать свой первый A/B тест с помощью платных и бесплатных сервисов. В документации указано, что при проведении тестирования аудитория случайным образом делится на непересекающиеся группы. Для следующей проверки бизнес заменил свой ползунок на заметную строку поиска. Идея заключалась в том, что клиенты будут более склонны к поиску товаров, которые им особенно интересны. Если вы не знакомы с WallMonkeys, это компания, которая продает невероятно разнообразные настенные наклейки для дома и бизнеса. Три из лучших примеров A/B тестирования, чтобы вдохновить вас. За прошедшие годы я провел тысячи A/B тестов. Каждый из них был разработан, чтобы помочь мне найти лучший дизайн и сделать маркетинговую кампанию действительно эффективной. Для анализа релевантной информации необходимо, чтобы объявления набрали адекватное (не менее 100) количество переходов. Но как быть, когда по запросу всего 5-10 показов в неделю? a/b тестирование К сожалению, не остаётся ничего другого, как увеличивать период тестирования до нескольких месяцев. Безусловно, можно сделать выводы, основываясь на небольшом объёме данных. Поэтому, в один момент лучше тестировать только одну гипотезу. Можно придумать большое количество идей для проверки путем сплит-тестирования, но вряд ли у вас хватит ресурсов реализовать все и сразу. Поэтому, сформируйте список исходя из важности конкретного пункта для бизнеса. A/B тест проверит некоторые изменения в копии, изображениях и других элементах. Это не означает, что A/B тестирование бесполезно для нового бизнеса. Это просто означает, что вы можете получить менее точные результаты. Увеличить показатели эффективности помогает проведение сплит-тестов в контекстной рекламе. Выбираем бизнес страницу, регион и вертикаль кампании. За основу мы можем взять существующие группы, кампании или создать копию. После создания гипотезы по улучшению сайта, нужно запустить A/B тест. Изучите ключевые особенности нескольких сервисов и выбирайте подходящий. Но это долго, данные скорее всего будут неточные и вероятность ошибиться в интерпретации результатов – довольно высокая. Кроме того, опустились 4 блока с описанием примера работ, которые в оригинальном варианте находятся на первом экране. В тестовом варианте изображение опущено вниз. И это также повлияло на количество регистраций на сайте, которое увеличилось на 57%. Можно также тестировать социальные кнопки, страницы с ценами и делать радикальный редизайн.
Warning: Cannot modify header information - headers already sent by (output started at /autoinstalator/wordpress/wp-content/themes/prioris/cherry-framework/modules/cherry-breadcrumbs/cherry-breadcrumbs.php:509) in /autoinstalator/wordpress/wp-includes/feed-rss2.php on line 8
С чего начать А/В тест?
Шаг 2. Создать варианты страницы
Недостатки Google Analytics и самописных скриптов
Как тестировать варианты страниц
✓ Что такое A/B тестирование сайтов?
Получите лучшую рентабельность инвестиций от существующего трафика
С чего начать А/В тест?
Выдвижение гипотезы
Время выполнения операций может играть в данном виде тестирования второстепенную роль. При этом на первое место выходит отсутствие утечек памяти, перезапусков серверов под нагрузкой и другие аспекты влияющие именно на стабильность работы. Как я упоминал выше, в основе тестирования нашего проекта лежат unit-тесты. Однако количество никогда не свидетельствует о качестве. Нельзя сказать, что на проекте используется метод разработки через тестирование (TDD), однако вся функциональность — как существующая, так и новая — покрыта тестами.
Мануальное тестирование» рассчитан на тех, кто вообще не занимался программированием/тестированием или имеет начальные знания, которые хочет упорядочить и углубить. В течение двенадцати логически взаимосвязанных уроков учащиеся изучат процесс тестирования приложений, эффективные современные подходы и инструменты. Научатся создавать все необходимые документы и на практике закрепят свои знания. Очень часто на собеседованиях по тестированию дают подобное задание - протестировать какой-либо предмет. Оно показывает насколько гибок ум тестировщика в плане видов и объекта тестирования. Ведь не важно что перед вами, а важно понимать логическую концепцию видов тестирования.
Вот, пожалуй, основные виды, которые используют для тестирования сайта. Сейчас мы запускаем весь набор тестов на каждый коммит, который был запущен. Общий тестовый прогон включает все уровни тестирования и занимает один час, из которых 1500 UI-тестов выполняются 25 минут.
Задача проведения пользовательского тестирования – оказать помощь конечным пользователям системы в подготовке и проведении испытаний. Если автора фейлят на «видах и типах» тестирования, то он попал на собес на проект связанный с медициной или чем то подобным. Мне, например, не нужна классификация в виде дерева. Нужен набор разных групп классификации, но внутри каждой группы равноправные ветви должны быть ортогональны и минимизированы. Правильный ответ в том, что тестировать можно вообще всё.
В этом нет ничего плохого — если человек компетентен и может выполнять подобную работу качественно, то ему стоит это делать. Такие ошибки — когда после внесения изменений в программу перестаёт работать то, что должно было продолжать работать, — называют регрессионными ошибками (regression bugs). В области же программного обеспечения, дымовое тестирование – короткий цикл тестов, выполняемый для подтверждения того, что приложение выполняет основные функции. Иногда бета-тестирование выполняется для того, чтобы получить обратную связь о продукте от его будущих пользователей.
Модульное тестирование применяется для исследования каждого отдельного элемента или объекта системы. Чтобы найти баги, применяя модульное тестирование, нужно знать, как устроена программа в целом и какой функционал каждого отдельного модуля. Этот уровень тестирования используется больше программистами, нежели тестировщиками. Они создают специальные тест-коды, с помощью которых можно проверить, выполняет ли программное обеспечение свое предназначение.
Он полностью закрывает наши потребности, так как имеет внушительный набор функционала. В Jiji мы стараемся, так сказать, придерживаться традиций. Поэтому используем пирамиду тестирования и пытаемся следовать всем советам, которые она дает.
Тестирование интерфейсов (частично) и тестирование API являются примерами интеграционного компонентного тестирования. Уровень тестирования — активности тестирования, объединенные в группу исходя из общих характеристик, связанных с SDLC. В этой статье разберемся что такое уровни тестирования, зачем они нужны и что собой представляет каждый из них. Тест состоит из 15 вопросов по одному баллу, для прохождения теста необходимо набрать 8 баллов. Мы подготовили материалы и тесты, которые помогут вам в выборе вашей будущей профессии. В благодарность за это мы дарим скидку на любой курс, который вы выберете в процессе консультации.
Тестирование сайта — один из важных жизненных этапов, после которого, предоставляется заказчику готовый проект без ошибок, с хорошей читабельностью, воспринимаемой легкостью, удобством и надежностью. Мы хотели бы рассказать о том какие этапы проходит сайт перед выходом в продакшн. Мы автоматизировали тестирование XSS-уязвимостей, чтобы всегда быть уверенными, что наши пользователи защищены. Для этого обзавелись простыми тестами, которые присылают нам вредоносный код.
Вы можете задать вопросы, возникающие во время выполнения домашнего задания, преподаватель и сокурсники дадут на них ответы. Продолжительность курсаВсего в курсе 57 академических часов.Занятия будуть проводиться два – два с половиной месяца. W3School, Составление XSD схемы, программы для работы со XML. Для тех, кто уже имеет небольшой опыт в данной сфере, но желающих систематизировать и приумножить свои знания, а также получить исчерпывающую консультацию о трудоустройстве на вакансию QA Junior. Курсы тестирования подойдут вам, если вы хотите получить новую, востребованную на рынке ИТ профессию, но у вас нет времени на второе высшее образование.
Также мы можем проверить, как программа справляется с большими объемами данных или одновременными запросами. Это позволяет нам оптимизировать нашу программу и сделать ее более надежной и стабильной. А завершает тестирование — заказчик, выполняя приемочное тестирование. После завершения тестирования всей системы нас ждет последняя проверка перед сдачей работы. На этом уровне тестирования создаются end-to-end тесты, имитирующие бизнес процессы, Use Cases и Use Stories от начала до конца.
IT курсы онлайн от лучших специалистов в своей отросли https://deveducation.com/ here.
]]>Очень важно, чтобы проджект-менеджер стартапа мог оперативно перестраивать работу, спокойно относиться к форс-мажорам и легко вносить корректировки в планирование. Например, если запущена масштабная маркетинговая кампания, или выход продукта ждут к определенной дате. Грамотный тайм-менеджмент и правильное планирование позволяют вовремя закрывать сроки. Но иногда допустимо вовремя выяснить, что для лучшего результата следует сдвинуть сроки, и исходя из этого подкорректировать время завершения проекта. Менеджер проекта несет ответственность за достижение целей проекта в рамках бюджета, за реализацию в указанный срок и за требуемый уровень качества. Ключевыми здесь являются понятия «цели», «бюджет», «срок» и «уровень качества».
Да, он может и порой даже обязан интересоваться смежными областями, которые связаны с проектом. «В моей карьере проджект-менеджера самой большой проблемой было то, как справиться с тревогой, чтобы делать то, что делается в ситуации, когда мы не можем контролировать других. Опыт реализации проектов, взаимодействия (слушания) с другими людьми в качестве клиента, партнера или той же компании, изучения техники и, что не менее важно, всегда стремиться понять себя. Помимо общих правил управления проектами (разработка, планирование, исполнение, мониторинг и контроль, закрытие) — я советую проявлять сострадание и сдержанность. Люди будут расстроены, всё пойдет не так, как вы хотите, но как руководитель проекта вы — то связующее звено, которое должно держать всё вместе и двигаться вперед. Я верю, что смог достичь этого в своем проекте, и в результате мы смогли создать команду».
Следуйте рекомендациям ниже, сохраняйте уверенность в себе и верьте в успех проекта. Менеджер должен уметь создавать прочную связь между клиентом и своей командой. И будучи связующим звеном между ними, он полностью отвечает за качество этой связи.
С другой стороны, у вас может не получиться подобрать проект, над которым вы будете работать. Это означает, что вы получите небольшие проекты, с которыми будете тратить время впустую. Если вы только начинаете свою карьеру, это может оказаться для вас неразрешимой проблемой, поскольку у вас еще нет необходимых знаний, чтобы соответствующим образом управлять своим временем.
Жизнь менеджера сплошная печаль сдобренная плюшками. И это самая неблагодарная работа в команде разработки. Успех любого проекта, не важно это создание веб-сайта, подготовка и запуск новой рекламной кампании и т.д.
Не только надеятся, что клиент знает, что происходит, но и следить за тем, чтобы всё было правильно задокументировано. Вы поняли — это намного больше усилий, но это то, что дает результаты». Если вы только начинаете свою карьеру, ты должны найти такую рабочую среду, которая позволит расти и учиться у коллег.
Менеджер начинается, когда есть требование клиента с одной стороны, мнение архитектора — с другой. Ко всем переговорам стоит готовиться и подбирать аргументы заранее. Например, клиент эскалирует, что Иванова нужно уволить, потому что он пишет неграмотные письма.
Этот специалист ответственен за планирование, организацию и успешное выполнение проектов. Проджект-менеджер обеспечивает, чтобы проект соответствовал как временным рамкам, так и бюджету, а также отвечает за качество конечного продукта. Product Manager играет критическую роль в успехе продукта, обладая комплексным пониманием бизнеса, технологий и пользовательского опыта. Это профессия, требующая глубоких знаний в области продуктового менеджмента и навыков работы с различными командами и рыночными данными.
Project Manager играет критическую роль в достижении целей проекта, обеспечивая эффективное управление ресурсами, временем и бюджетом. Эта профессия требует высокого уровня организационных способностей, умения работать с людьми и владения методиками управления проектами. Проджект-менеджеры востребованы во многих отраслях, особенно в IT, строительстве, маркетинге, и многих других. Их универсальные навыки управления проектами позволяют успешно реализовывать проекты в различных секторах экономики. Проектный менеджер — фильтр правок между клиентом и командой.
Для подтверждения эффективной работы по управлению проектом не забывайте обновлять статус при каждой выполненной задаче. Руководству важно видеть на общедоступном плане, что проект двигается вперед. Это означает, чтобы вы успешно справляетесь со своей ролью и вам можно доверять в дальнейшей работе. Гибкость к планированию и реализации проекта поможет PM всегда оставаться с холодной головой, не впадать в панику и быть эффективным лидером команды в любой ситуации.
Всё-таки я придерживаюсь мысли, что должность PM в чистом виде — это стратегическая ошибка и гораздо полезнее иметь роль, которая в этой серии статей обозначена как Team Lead. Работать с PM-ами, которые не имеют технического опыта и не участвуют в разработке меня всегда раздражает. Конечно, при конвеерном производстве сайтов это может быть уместно, но если работа идёт над несколькими продуктами или сервисами — лучше иметь нормального лидера команды. Он не обязан быть лучшим технарём, но обязан разбираться во всем, что происходит в проекте, и уметь находить решения нетривиальных проблем. Большинство менеджеров имеют бакалаврский или магистерский диплом, связанный с менеджментом или управлением бизнесом.
Фасилитация инноваций требует сильных межличностных навыков у проектного менеджера. Он должен быть эффективным слушателем, уметь эмпатизировать и создавать доверие в команде. Только таким образом можно достичь открытого обмена идеями и поддержки в команде.
IT курсы онлайн от лучших специалистов в своей отросли https://deveducation.com/ here.
]]>