/*! elementor-pro - v3.28.0 - 05-05-2025 */ "use strict"; (self["webpackChunkelementor_pro"] = self["webpackChunkelementor_pro"] || []).push([["mega-menu-editor"],{ /***/ "../modules/mega-menu/assets/js/editor/editor-module.js": /*!**************************************************************!*\ !*** ../modules/mega-menu/assets/js/editor/editor-module.js ***! \**************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { __webpack_require__(/*! core-js/modules/es.array.includes.js */ "../node_modules/core-js/modules/es.array.includes.js"); /* * This file can be seen as an "upgrade script" for an issue caused by this PR: * https://github.com/elementor/elementor/pull/25755/files * * The issue was fixed in Core by this PR: * https://github.com/elementor/elementor/pull/29029 * * But this file will handle existing Mega Menu's that were already broken and could possibly be removed in future versions. */ const ElementEditorModule = __webpack_require__(/*! elementor-pro/editor/element-editor-module */ "../assets/dev/js/editor/element-editor-module.js"); module.exports = ElementEditorModule.extend({ __construct() { this.cache = {}; ElementEditorModule.prototype.__construct.apply(this, arguments); }, onInit() { elementor.channels.editor.on('editor:widget:mega-menu:section_layout:activated', this.maybeSetContentWidthValue); }, maybeSetContentWidthValue() { const contentWidthControlView = this.getEditorControlView('content_width'); const contentWidthControlValue = contentWidthControlView.getControlValue(); const disallowedValues = ['', 'full', 'boxed']; if (disallowedValues.includes(contentWidthControlValue)) { contentWidthControlView.setValue('full_width'); contentWidthControlView.applySavedValue(); } } }); /***/ }), /***/ "../modules/mega-menu/assets/js/editor/module.js": /*!*******************************************************!*\ !*** ../modules/mega-menu/assets/js/editor/module.js ***! \*******************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _nestedModule = _interopRequireDefault(__webpack_require__(/*! ./nested-module */ "../modules/mega-menu/assets/js/editor/nested-module.js")); var _editorModule = _interopRequireDefault(__webpack_require__(/*! ./editor-module */ "../modules/mega-menu/assets/js/editor/editor-module.js")); var _urlHelper = _interopRequireDefault(__webpack_require__(/*! ./utils/url-helper */ "../modules/mega-menu/assets/js/editor/utils/url-helper.js")); class Module extends elementorModules.editor.utils.Module { constructor() { super(); elementor.elementsManager.registerElementType(new _nestedModule.default()); new _editorModule.default(); this.urlHelper = new _urlHelper.default(); } getCurrentMenuItemClass(menuLinkUrl, permalinkUrl) { menuLinkUrl = menuLinkUrl?.trim(menuLinkUrl); if (!menuLinkUrl || !permalinkUrl) { return ''; } const permalinkArray = this.urlHelper.parse_url(permalinkUrl), menuItemUrlArray = this.urlHelper.parse_url(menuLinkUrl), hasEqualUrls = _.isEqual(permalinkArray, menuItemUrlArray); return hasEqualUrls ? 'e-current' : ''; } onElementorFrontendInit() { elementor.on('document:loaded', this.closeAllMegaMenus.bind(this)); } closeAllMegaMenus() { const megaMenus = elementor.$previewContents[0].querySelectorAll('.elementor-widget-n-menu'); if (megaMenus.length) { Array.from(megaMenus).forEach(node => { const id = node.getAttribute('data-id'); window.jQuery(window).trigger('elementor/mega-menu/dropdown-toggle-by-keyboard', { widgetId: id, show: false }); }); } } } exports["default"] = Module; /***/ }), /***/ "../modules/mega-menu/assets/js/editor/nested-module.js": /*!**************************************************************!*\ !*** ../modules/mega-menu/assets/js/editor/nested-module.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = exports.NestedModule = void 0; var _view = _interopRequireDefault(__webpack_require__(/*! ./views/view */ "../modules/mega-menu/assets/js/editor/views/view.js")); class NestedModule extends elementor.modules.elements.types.NestedElementBase { getType() { return 'mega-menu'; } getView() { return _view.default; } } exports.NestedModule = NestedModule; var _default = exports["default"] = NestedModule; /***/ }), /***/ "../modules/mega-menu/assets/js/editor/utils/url-helper.js": /*!*****************************************************************!*\ !*** ../modules/mega-menu/assets/js/editor/utils/url-helper.js ***! \*****************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = exports.UrlHelper = void 0; class UrlHelper { parse_url(url) { try { const { hostname, pathname, search } = new URL(url), host = hostname.replace('www.', ''), trailingSlashesRegex = /^\/+|\/+$/g, path = pathname.replace(trailingSlashesRegex, ''); return [host, path, search]; } catch (err) { return false; } } } exports.UrlHelper = UrlHelper; var _default = exports["default"] = UrlHelper; /***/ }), /***/ "../modules/mega-menu/assets/js/editor/views/view.js": /*!***********************************************************!*\ !*** ../modules/mega-menu/assets/js/editor/views/view.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; class View extends $e.components.get('nested-elements').exports.NestedView { constructor() { super(...arguments); this.isRendering = false; this.itemTitle = 'item_title'; this.itemLink = 'item_link'; this.internalUrl = 'internal-url'; this.itemLinkSelector = '.elementor-control-item_link'; } filter(child, index) { child.attributes.dataIndex = index + 1; child.attributes.widgetId = child.id; return true; } onAddChild(childView) { const widgetNumber = childView._parent.$el.find('.e-n-menu')[0]?.dataset.widgetNumber || childView.model.attributes.widgetId, index = childView.model.attributes.dataIndex, tabId = childView._parent.$el.find(`.e-n-menu-item-title[data-tab-index="${index}"]`)?.attr('id') || childView.model.attributes.widgetId + ' ' + index; childView.$el.attr({ id: 'e-n-menu-content-' + widgetNumber + '' + index, role: 'menu', 'aria-labelledby': tabId, 'data-tab-index': index }); } getChildViewContainer(containerView, childView) { const { elements_placeholder_selector: customSelector, child_container_placeholder_selector: childContainerSelector } = this.model.config.defaults; if (childView !== undefined && childView._index !== undefined && childContainerSelector) { return containerView.$el.find(`${childContainerSelector}`)[childView._index]; } if (customSelector) { return containerView.$el.find(this.model.config.defaults.elements_placeholder_selector); } return super.getChildViewContainer(containerView, childView); } attachBuffer(compositeView, buffer) { const $container = this.getChildViewContainer(compositeView); if (this.model?.config?.support_improved_repeaters && this.model?.config?.is_interlaced) { const childContainerSelector = this.model?.config?.defaults?.child_container_placeholder_selector || '', childContainerClass = childContainerSelector.replace('.', ''); this._updateChildContainers($container[0], childContainerClass, buffer); } else { $container.append(buffer); } } _updateChildContainers(wrapper, childContainerClass, buffer) { let index = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; _.each(wrapper.children, childContainer => { if (childContainer.classList?.contains(childContainerClass)) { const numberOfItems = buffer.childNodes.length; childContainer.appendChild(buffer.childNodes[0]); buffer.appendChild(childContainer); wrapper.append(buffer.childNodes[numberOfItems - 1]); index++; } else { this._updateChildContainers(childContainer, childContainerClass, buffer, index); } }); } /** * Function renderOnChange(). * * Render the changes in the settings according to the current situation. * * @param {Object} settings * @param {Array} widget */ renderOnChange(settings) { let widget = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; if (!this.allowRender) { return; } // TODO: delete in 3.27.0 if (this.isRendering) { this.isRendering = false; return; } const renderResult = this.renderDataBindings(settings, this.dataBindings, widget); if (renderResult instanceof Promise) { renderResult.then(result => { if (!result) { this.renderChanges(settings); } }); } if (!renderResult) { this.renderChanges(settings); } } /** * Function renderDataBindings(). * * Render linked data. * * @param {Object} settings * @param {Array} dataBindings * @param {Array} widget * * @return {boolean} - false on fail. */ renderDataBindings(settings, dataBindings) { let widget = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; if (!this.dataBindings?.length) { return false; } let changed = false; const renderDataBinding = async dataBinding => { if (undefined !== settings.changed[dataBinding.dataset.bindingSetting]) { dataBinding.el.innerHTML = settings.changed[dataBinding.dataset.bindingSetting]; return true; } if (!settings?.changed.__dynamic__ || !widget.length) { return false; } if (!this.isTitleOrLinkChanged(settings)) { return true; } const { bindingSetting } = dataBinding.dataset, changedControl = this.getChangedDynamicControlKey(settings); let change = settings.changed[bindingSetting]; if (this.isInternalUrl(settings?.changed?.__dynamic__?.item_link) && this.isSettingChanged(settings, this.itemLink)) { return await this.getDynamicValue(settings, changedControl, bindingSetting, dataBinding, widget); } if (this.isAtomicDynamic(settings.changed, dataBinding, changedControl)) { const dynamicValue = await this.getDynamicValue(settings, changedControl, bindingSetting, dataBinding, widget); if (this.itemLink === changedControl) { return true; } if (dynamicValue) { change = dynamicValue; } } if (change !== undefined) { dataBinding.el.innerHTML = change; return true; } return false; }; for (const dataBinding of dataBindings) { switch (dataBinding.dataset.bindingType) { case 'repeater-item': { const repeater = this.container.repeaters[dataBinding.dataset.bindingRepeaterName]; if (!repeater) { break; } const container = repeater.children.find(i => i.id === settings.attributes._id); if (container?.parent?.children.indexOf(container) + 1 === parseInt(dataBinding.dataset.bindingIndex)) { changed = renderDataBinding(dataBinding); } else if (dataBindings.indexOf(dataBinding) + 1 === this.getRepeaterItemActiveIndex()) { if (this.isItemLinkChild(widget)) { return true; } changed = this.tryHandleDynamicCoverSettings(dataBinding, settings); } } break; case 'content': { changed = renderDataBinding(dataBinding); } break; } if (changed) { break; } } return changed; } isAtomicDynamic(changedSettings, dataBinding, changedControl) { return dataBinding.el.hasAttribute('data-binding-dynamic') && (this.itemTitle === changedControl || this.itemLink === changedControl); } async getDynamicValue(settings, changedControlKey, bindingSetting, dataBinding, widget) { const dynamicSettings = { active: true }, valueToParse = this.extractValueToParse(this.getChangedData(settings, changedControlKey, bindingSetting)); if (undefined === valueToParse) { return settings.attributes[changedControlKey]; } const data = await this.getDataFromCacheOrBackend(valueToParse, dynamicSettings); if (this.itemTitle === changedControlKey) { return data; } if (undefined !== data) { this.tryFormatDynamicMegaMenuUrl(valueToParse, dataBinding, widget, changedControlKey, dynamicSettings); } return settings.attributes[changedControlKey]; } extractValueToParse(valueToParse) { let keyToExtract = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'url'; if ('object' === typeof valueToParse) { return valueToParse[keyToExtract]; } return valueToParse; } // TODO: delete in 3.27.0 getChangedDynamicControlKey(settings) { if (!settings?.changed?.__dynamic__) { return Object.keys(settings.changed)[0]; } const changedControlKey = this.findUniqueKey(settings?.changed?.__dynamic__, settings?._previousAttributes?.__dynamic__)[0]; if (changedControlKey) { return changedControlKey; } return this.isSettingChanged(settings, this.itemLink) ? this.itemLink : this.itemTitle; } tryFormatDynamicMegaMenuUrl(valueToParse, dataBinding, widget, changedControl, dynamicSettings) { const dynamicTagName = this.getDynamicTagName(valueToParse); if (this.itemLink !== changedControl || 'internal_link' === dynamicTagName) { return false; } const value = elementor.dynamicTags.parseTagsText(valueToParse, dynamicSettings, elementor.dynamicTags.getTagDataContent); elementor.$preview[0].contentWindow.dispatchEvent(new CustomEvent('elementor/dynamic/url_change', { detail: { element: dataBinding.el, actionName: valueToParse && dynamicTagName, value } })); dataBinding.el = Array.from(widget)[0].querySelectorAll('.e-n-menu-title-text')[dataBinding.dataset.bindingIndex - 1]; } getDynamicTagName(changedDataForAddedItem) { const regex = /name="([^"]*)"/; const match = changedDataForAddedItem.match(regex); return match ? match[1] : null; } isInternalUrl(dynamicData) { if (!dynamicData) { return false; } return this.internalUrl === this.getDynamicTagName(dynamicData); } isItemLinkChild(widget) { return widget[0].closest(this.itemLinkSelector); } // TODO: delete in 3.27.0 async getDataFromCacheOrBackend(valueToParse, dynamicSettings) { try { return elementor.dynamicTags.parseTagsText(valueToParse, dynamicSettings, elementor.dynamicTags.getTagDataContent); } catch { await new Promise(resolve => { elementor.dynamicTags.refreshCacheFromServer(() => { resolve(); }); }); return !_.isEmpty(elementor.dynamicTags.cache) ? elementor.dynamicTags.parseTagsText(valueToParse, dynamicSettings, elementor.dynamicTags.getTagDataContent) : false; } } // TODO: delete in 3.27.0 getChangedDataForRemovedItem(settings, changedControlKey, bindingSetting) { return settings.attributes?.[changedControlKey]?.[bindingSetting] || settings.attributes?.[changedControlKey]; } // TODO: delete in 3.27.0 getChangedDataForAddedItem(settings, changedControlKey, bindingSetting) { return settings.attributes?.__dynamic__?.[changedControlKey]?.[bindingSetting] || settings.attributes?.__dynamic__?.[changedControlKey]; } // TODO: delete in 3.27.0 getChangedData(settings, changedControlKey, bindingSetting) { const changedDataForRemovedItem = this.getChangedDataForRemovedItem(settings, changedControlKey, bindingSetting), changedDataForAddedItem = this.getChangedDataForAddedItem(settings, changedControlKey, bindingSetting); return changedDataForAddedItem || changedDataForRemovedItem; } /** * Function getTitleWithAdvancedValues(). * * Renders before / after / fallback for dynamic item titles. * * @param {Object} settings * @param {string} text */ // TODO: delete in 3.27.0 getTitleWithAdvancedValues(settings, text) { const { attributes, _previousAttributes: previousAttributes } = settings; if (this.compareSettings(attributes, previousAttributes, 'fallback')) { text = text.replace(new RegExp(previousAttributes.fallback), ''); } if (!text || attributes.fallback === text) { return attributes.fallback || ''; } if (this.compareSettings(attributes, previousAttributes, 'before')) { text = text.replace(previousAttributes.before, ''); } if (this.compareSettings(attributes, previousAttributes, 'after')) { text = text.replace(new RegExp(previousAttributes.after + '$'), ''); } if (!text) { return attributes.fallback || ''; } const newBefore = this.getNewSettingsValue(attributes, previousAttributes, 'before'), newAfter = this.getNewSettingsValue(attributes, previousAttributes, 'after'); text = newBefore + text; text += newAfter; return text; } // TODO: delete in 3.27.0 compareSettings(attributes, previousAttributes, key) { return previousAttributes[key] && previousAttributes[key] !== attributes[key]; } // TODO: delete in 3.27.0 getNewSettingsValue(attributes, previousAttributes, key) { return previousAttributes[key] !== attributes[key] ? attributes[key] || '' : ''; } // TODO: delete in 3.27.0 getRepeaterItemActiveIndex() { return this.getContainer().renderer.view.model.changed.editSettings.changed.activeItemIndex || this.getContainer().renderer.view.model.changed.editSettings.attributes.activeItemIndex; } // TODO: delete in 3.27.0 tryHandleDynamicCoverSettings(dataBinding, settings) { if (!this.isAdvancedDynamicSettings(settings.attributes)) { return false; } this.isRendering = true; dataBinding.el.textContent = this.getTitleWithAdvancedValues(settings, dataBinding.el.textContent); return true; } // TODO: delete in 3.27.0 isAdvancedDynamicSettings(attributes) { return 'before' in attributes && 'after' in attributes && 'fallback' in attributes; } isSettingChanged(settings, bindingSettings) { return settings.attributes.__dynamic__?.[bindingSettings] !== settings._previousAttributes.__dynamic__?.[bindingSettings]; } isTitleOrLinkChanged(settings) { return this.isSettingChanged(settings, this.itemTitle) || this.isSettingChanged(settings, this.itemLink); } } exports["default"] = View; /***/ }) }]); //# sourceMappingURL=mega-menu-editor.a0c405b93f24b0011f86.bundle.js.map REB School – Real Estate Edutech Company

Building Top Real Estate Talents And Businesses For The World!

Learn premium real estate skills that will help you build the financial freedom you deserve.


Start Here


All Courses

WhatsApp Image 2024-03-29 at 14.56.46

WhatsApp Image 2024-03-29 at 14.53.14 (1)

WhatsApp Image 2024-03-29 at 14.53.14


Previous
Next

Top Categories

Popular Courses


Take Course

We Provide World-Class Learning

Get professional training and development programs developed by industry leaders that are highly knowledgeable with over a decade of experience in their fields. 

How To Begin

Follow the simple steps below to start learning a premium skill



Select A Course

We have a compilation of well structured courses. Pick a course to get started



Create An Account

Create an account to start learning at your own pace



Learn At Your Own Pace

You are in total control of your time when you learn. Use your most favorable time to build highly profitable skills



Become A Professional

Earn a globally recognized certificate

Experience

Our faculty comprises of instructors who are not just knowledgeable but are over a decade experience and industry leaders in their fields and able to teach industry best practices.

Education

REBSchool takes a non-traditional approach to learning by teaching courses currently relevant to demand, context, time and season.

Certificate

Earn a globally recognized certificate upon completion of your program

Study at Your Own Pace

Boost Your Career by Learning Real Estate Skills in High Demand


Get Started

Features of Our Courses

Why Choose Us?

We Help Individuals Learn Premium Real Estate Skills and Enables Companies Hire Trained Real Estate Talents, Build or Grow Fast – 1000X Better

Paradigm Shift For Individuals And Businesses

We are a human capacity development company that helps people learn premium real estate skills mostly virtually and make them hirable by companies globally

We Are Not All Talk

Our programs are a perfect blend of theory and practice, providing you with a well-rounded education

Whatever Your Style Of Learning, We’Ve Got You Covered

Our blended and hybrid learning approach allows for self-paced learning as well as instructor-led, real-time sessions

Experienced And Expert Instructors

Our faculty comprises of instructors who are not just knowledgeable but are over a decade experience and industry leaders in their fields and able to teach industry best practices

Market Fit Courses

Our courses are research based to fit the current in-demand skills and marketplace productivity

Affiliate Marketing And Referrals Program

Our affiliate marketing and referrals program gives you a source of support income whether as student, alumni or business

Testimonials

Trusted by Thousand of
Students and Companies

0

5/5
2,394 Ratings

“Massa amet, at dolor tellus pellentesque aenean in eget massa tincidunt habitasse volutpat adipiscing sed id sit auctor eu vivamus nulla.”
5/5

Emma Hart


“Ut morbi felis, felis massa quam sit massa, amet, bibendum pulvinar elit in adipiscing amet imperdiet ac felis congue enim, elementum orci.”
5/5

Eddie Johnson


“Donec in varius facilisis justo, curabitur aliquet sit justo sed sit interdum diam dolor ornare quis a felis adipiscing hendrerit quisque enim.”
5/5

Jonathan Doe


“Pulvinar dui vitae enim, diam et nulla elit nam leo lacinia et, a, pulvinar gravida enim in blandit mauris vitae volutpat urna, sed justo hendrerit.”

Mike Edward

5/5

Have Any Questions?

FAQ’s

Get answers from our frequently asked questions

Realtors, CEO’s, Entrepreneurs, anyone interested in developing or growing a career in real estate.

Yes. But for maximum concentration, it is advisable you take a course per time.

Yes. You and your organisation, group or team can enrol in a course in a cohort and even get a discount.

Yes. You can refer or recommend your friends and family to take any of our courses through your student referral link and earn an income.

Today, training opportunities are practically unlimited – especially when it comes to fields that offer great prospects. For example, the REBSCHOOL platform offers to learn the skills necessary for a successful career in premium real estate, allowing talented professionals to develop quickly and be in demand in the market. However, in pursuit of high earnings, some people prefer alternative sources of income, opting for entertainment that can generate real profits. One of such niches became the best online casinos in Austria, where exciting leisure time is harmoniously combined with real chances to win. Visiting the page https://habgusta.at/online-casinos/, it is easy to make sure: there are the most reliable and trusted sites, where you can find the latest reviews and ratings of casinos for 2025.On the resource you can check the ratings of the best platforms, study their games, bonuses and much more. Combining solid skills in real estate, gained through the REBSCHOOL platform, and a thoughtful approach to entertainment, it is quite realistic to provide yourself not only a high standard of living, but also bright emotions from new experiences. Ultimately, success comes to those who are not afraid to expand their horizons and try themselves in a variety of directions.