'name' => 'Admin\Settings\Email', 'hook' => 'admin_init', ], [ 'name' => 'Admin\Settings\Captcha\Page', 'hook' => 'admin_init', ], [ 'name' => 'Admin\Settings\Payments', 'hook' => 'admin_init', ], [ 'name' => 'Admin\Tools\Tools', 'hook' => 'current_screen', ], [ 'name' => 'Admin\Payments\Payments', 'hook' => 'init', ], [ 'name' => 'Admin\Payments\Views\Overview\Ajax', 'hook' => 'admin_init', 'run' => 'hooks', 'condition' => wpforms_is_admin_ajax(), ], [ 'name' => 'Admin\Tools\Importers', 'hook' => 'admin_init', 'run' => 'load', 'condition' => wp_doing_ajax(), ], [ 'name' => 'Admin\Pages\Addons', 'id' => 'addons_page', ], [ 'name' => 'Admin\Pages\ConstantContact', 'hook' => 'admin_init', ], [ 'name' => 'Forms\Fields\Richtext\EntryViewContent', ], [ 'name' => 'Admin\DashboardWidget', 'hook' => wpforms()->is_pro() ? 'admin_init' : 'init', ], [ 'name' => 'Emails\Preview', 'hook' => 'admin_init', ], [ 'name' => 'Admin\Addons\GoogleSheets', 'hook' => 'admin_init', ], [ 'name' => 'Admin\PluginList', 'id' => 'plugin_list', 'hook' => 'admin_init', ], [ 'name' => 'Admin\Splash\SplashScreen', 'id' => 'splash_screen', 'hook' => 'admin_init', ], [ 'name' => 'Admin\Splash\SplashCache', 'id' => 'splash_cache', 'hook' => 'plugins_loaded', ], [ 'name' => 'Admin\Splash\SplashUpgrader', 'id' => 'splash_upgrader', 'hook' => 'plugins_loaded', ] ); } /** * Populate Caches related classes. * * @since 1.8.7 */ private function populate_caches() { array_push( $this->classes, [ 'name' => 'LicenseApi\PluginUpdateCache', 'id' => 'license_api_plugin_update_cache', ], [ 'name' => 'LicenseApi\PluginInfoCache', 'id' => 'license_api_plugin_info_cache', ], [ 'name' => 'LicenseApi\ValidateKeyCache', 'id' => 'license_api_validate_key_cache', ] ); } /** * Populate Fields related classes. * * @since 1.8.2 */ private function populate_fields() { $this->classes[] = [ 'name' => 'Forms\Fields\PaymentCheckbox\Field', 'hook' => 'init', ]; $this->classes[] = [ 'name' => 'Forms\Fields\PaymentMultiple\Field', 'hook' => 'init', ]; $this->classes[] = [ 'name' => 'Forms\Fields\PaymentSelect\Field', 'hook' => 'init', ]; $this->classes[] = [ 'name' => 'Forms\Fields\PaymentSingle\Field', 'hook' => 'init', ]; $this->classes[] = [ 'name' => 'Forms\Fields\PaymentTotal\Field', 'hook' => 'init', ]; // Load custom captcha field class. $this->classes[] = [ 'name' => 'Forms\Fields\CustomCaptcha\Field', ]; $this->classes[] = [ 'name' => 'Forms\Fields\Layout\Field', 'hook' => 'init', ]; $this->classes[] = [ 'name' => 'Forms\Fields\Layout\Process', 'hook' => 'init', ]; $this->classes[] = [ 'name' => 'Forms\Fields\Layout\Notifications', 'hook' => 'init', ]; $this->classes[] = [ 'name' => 'Forms\Fields\Repeater\Field', 'hook' => 'init', ]; $this->classes[] = [ 'name' => 'Forms\Fields\Repeater\Process', 'id' => 'repeater_process', 'hook' => 'init', ]; $this->classes[] = [ 'name' => 'Forms\Fields\Repeater\Notification [ 'label' => esc_html__( 'Page Title Selector', 'elementor' ), 'type' => Controls_Manager::TEXT, 'default' => 'h1.entry-title', 'placeholder' => 'h1.entry-title', 'description' => esc_html__( 'Elementor lets you hide the page title. This works for themes that have "h1.entry-title" selector. If your theme\'s selector is different, please enter it above.', 'elementor' ), 'label_block' => true, 'ai' => [ 'active' => false, ], 'selectors' => [ // Hack to convert the value into a CSS selector. '' => '}{{VALUE}}{display: var(--page-title-display)', ], ] ); $this->add_control( 'stretched_section_container', [ 'label' => esc_html__( 'Stretched Section Fit To', 'elementor' ), 'type' => Controls_Manager::TEXT, 'placeholder' => 'body', 'description' => esc_html__( 'Enter parent element selector to which stretched sections will fit to (e.g. #primary / .wrapper / main etc). Leave blank to fit to page width.', 'elementor' ), 'label_block' => true, 'frontend_available' => true, 'ai' => [ 'active' => false, ], ] ); /** * @var PageTemplatesModule $page_templates_module */ $page_templates_module = Plugin::$instance->modules_manager->get_modules( 'page-templates' ); $page_templates = $page_templates_module->add_page_templates( [], null, null ); // Removes the Theme option from the templates because 'default' is already handled. unset( $page_templates[ PageTemplatesModule::TEMPLATE_THEME ] ); $page_template_control_options = [ 'label' => esc_html__( 'Default Page Layout', 'elementor' ), 'options' => [ // This is here because the "Theme" string is different than the default option's string. 'default' => esc_html__( 'Theme', 'elementor' ), ] + $page_templates, ]; $page_templates_module->add_template_controls( $this->parent, 'default_page_template', $page_template_control_options ); $this->end_controls_section(); $this->start_controls_section( 'section_breakpoints', [ 'label' => esc_html__( 'Breakpoints', 'elementor' ), 'tab' => $this->get_id(), ] ); $prefix = Breakpoints_Manager::BREAKPOINT_SETTING_PREFIX; $options = []; foreach ( $breakpoints_default_config as $breakpoint_key => $breakpoint ) { $options[ $prefix . $breakpoint_key ] = $breakpoint['label']; } if ( Plugin::$instance->experiments->is_feature_active( 'additional_custom_breakpoints' ) ) { $active_breakpoints_control_type = Controls_Manager::SELECT2; } else { $active_breakpoints_control_type = Controls_Manager::HIDDEN; } $this->add_control( self::ACTIVE_BREAKPOINTS_CONTROL_ID, [ 'label' => esc_html__( 'Active Breakpoints', 'elementor' ), 'type' => $active_breakpoints_control_type, 'description' => esc_html__( 'Mobile and Tablet options cannot be deleted.', 'elementor' ), 'options' => $options, 'default' => [ $prefix . $breakpoint_key_mobile, $prefix . $breakpoint_key_tablet, ], 'select2options' => [ 'allowClear' => false, ], 'lockedOptions' => [ $prefix . $breakpoint_key_mobile, $prefix . $breakpoint_key_tablet, ], 'label_block' => true, 'render_type' => 'none', 'frontend_available' => true, 'multiple' => true, ] ); $this->add_breakpoints_controls(); // Include the old mobile and tablet breakpoint controls as hidden for backwards compatibility. $this->add_control( 'viewport_md', [ 'type' => Controls_Manager::HIDDEN ] ); $this->add_control( 'viewport_lg', [ 'type' => Controls_Manager::HIDDEN ] ); $this->end_controls_section(); } /** * Before Save * * Runs Before the Kit document is saved. * * For backwards compatibility, when the mobile and tablet breakpoints are updated, we also update the * old breakpoint settings ('viewport_md', 'viewport_lg' ) with the saved values + 1px. The reason 1px * is added is because the old breakpoints system was min-width based, and the new system introduced in * Elementor v3.2.0 is max-width based. * * @since 3.2.0 * * @param array $data * @return array $data */ public function before_save( array $data ) { // When creating a default kit, $data['settings'] is empty and should remain empty, so settings. if ( empty( $data['settings'] ) ) { return $data; } $prefix = Breakpoints_Manager::BREAKPOINT_SETTING_PREFIX; $mobile_breakpoint_key = $prefix . Breakpoints_Manager::BREAKPOINT_KEY_MOBILE; $tablet_breakpoint_key = $prefix . Breakpoints_Manager::BREAKPOINT_KEY_TABLET; $default_breakpoint_config = Breakpoints_Manager::get_default_config(); // Update the old mobile breakpoint. If the setting is empty, use the default value. $data['settings'][ $prefix . 'md' ] = empty( $data['settings'][ $mobile_breakpoint_key ] ) ? $default_breakpoint_config[ Breakpoints_Manager::BREAKPOINT_KEY_MOBILE ]['default_value'] + 1 : $data['settings'][ $mobile_breakpoint_key ] + 1; // Update the old tablet breakpoint. If the setting is empty, use the default value. $data['settings'][ $prefix . 'lg' ] = empty( $data['settings'][ $tablet_breakpoint_key ] ) ? $default_breakpoint_config[ Breakpoints_Manager::BREAKPOINT_KEY_TABLET ]['default_value'] + 1 : $data['settings'][ $tablet_breakpoint_key ] + 1; return $data; } public function on_save( $data ) { if ( ! isset( $data['settings'] ) || ( isset( $data['settings']['post_status'] ) && Document::STATUS_PUBLISH !== $data['settings']['post_status'] ) ) { return; } $should_compile_css = false; $breakpoints_default_config = Breakpoints_Manager::get_default_config(); foreach ( $breakpoints_default_config as $breakpoint_key => $default_config ) { $breakpoint_setting_key = Breakpoints_Manager::BREAKPOINT_SETTING_PREFIX . $breakpoint_key; if ( isset( $data['settings'][ $breakpoint_setting_key ] ) ) { $should_compile_css = true; } } if ( $should_compile_css ) { Breakpoints_Manager::compile_stylesheet_templates(); } } private function add_breakpoints_controls() { $default_breakpoints_config = Breakpoints_Manager::get_default_config(); $prefix = Breakpoints_Manager::BREAKPOINT_SETTING_PREFIX; // If the ACB experiment is inactive, only add the mobile and tablet controls. if ( ! Plugin::$instance->experiments->is_feature_active( 'additional_custom_breakpoints' ) ) { $default_breakpoints_config = array_intersect_key( $default_breakpoints_config, array_flip( [ Breakpoints_Manager::BREAKPOINT_KEY_MOBILE, Breakpoints_Manager::BREAKPOINT_KEY_TABLET ] ) ); } // Add a control for each of the **default** breakpoints. foreach ( $default_breakpoints_config as $breakpoint_key => $default_breakpoint_config ) { $this->add_control( 'breakpoint_' . $breakpoint_key . '_heading', [ Joint Rise Trading – Steel Fabrication & General Engineering
An Award Winning

Steel Fabrication & General Engineering Company

Joint Rise Trading is a fully functional Steel Fabrication Company. Serving the needs of a broad spectrum clients in different industries.

We Manufacture, Supply, erect and install the following to our clients specific needs

Give us a Call Today to see how we can assist


016 362 0074

A BRIEF

HISTORY OF CREATION

Our vision is to create a work place where people are inspired, want to work hard and enjoy coming to work.

We have a very productive system whereby we stick to a highly efficient and effective work ethic as well as comply with excellent standards and quick delivery.


View All Projects

Every Space Count

We Manufacture, Supply, Erect and Install:

Steel Structures

Stair Cases

Palisades

Balconies

Balustrades

Gates

Custom Clothing Rails

Follow Us on Social Media


Facebook-f