'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', [ Portfolio – Joint Rise Trading
Our Exclusive

Projects






Steel structures

Our Steel Structures can be designed for a number of different applications, from Industrial to domestic uses.

Steel Structures are designed to incorporate different roofing options for ventilation,insulation and natural light. The structures can also be designed to accommodate Crane Rails , Staircases and extra floor levels as per the client’s needs.

Gates

Our Gates can be manufactured from stainless steel , mild steel or wrought iron. All the gates can be custom designed to the specific application and style of the clients needs.














































Palisades

Palisade fencing are available in a variety of heights and spike designs with additional security applications that can be added to improve the security of the fence.

Balustrades

Balustrades are manufactured from stainless steel , mild steel or glass to the sight specific lay out and in the clients choice of material.


























































































Staircases

Staircases are designed to our clients requirements. All staircases come in a range of materials such as stainless steel and mild steel. We do all types of staircases such as
spiral and floating.

Custom Clothing Rails

We Manufacture Custom Clothing Rails designed according to clients requests. Give us a try & see what we can create for you to give your store the extra vibe you looking for.