Bivio::UI::View::ThreePartPage
# Copyright (c) 2007-2009 bivio Software, Inc. All Rights Reserved. # $Id$ package Bivio::UI::View::ThreePartPage; use strict; use Bivio::Base 'Bivio::UI::View::Base'; use Bivio::UI::ViewLanguageAUTOLOAD; my($_TI) = b_use('Agent.TaskId'); my($_WANT_USER_AUTH) = $_TI->is_component_included('user_auth'); my($_C) = b_use('IO.Config'); b_use('IO.Config')->register(my $_CFG = { center_replaces_middle => 0, }); my($_F) = b_use('UI.Facade'); sub handle_config { my(undef, $cfg) = @_; $_CFG = $cfg; return; } sub internal_2014style_search_form { return SearchForm({ value => DIV( DIV( Join([ FormField('SearchForm.search', { class => 'form-control', PLACEHOLDER => 'Search', ID => 'bivio_search_field', }), DIV( BUTTON( LinkIcon('SEARCH'), 'btn btn-default', { TYPE => 'submit', }), 'input-group-btn', ), ]), 'input-group', ), 'form-group', ), })->put(class => 'navbar-form navbar-right'); } sub internal_xhtml_adorned { my($self) = @_; $self->internal_xhtml_adorned_attrs; return Page({ style => view_widget_value('xhtml_style'), head => Join([ view_widget_value('xhtml_adorned_title'), view_widget_value('xhtml_favicon_tag'), view_widget_value('xhtml_head_tags'), view_widget_value('xhtml_seo_head_links'), OpenGraphHead(), vs_rss_task_in_head(), ]), html_tag_attrs => view_widget_value('xhtml_tag_attrs'), body => $self->internal_xhtml_adorned_body, body_class => view_widget_value('xhtml_body_class'), xhtml => 1, want_page_print => view_widget_value('xhtml_want_page_print'), }); } sub internal_xhtml_adorned_attrs { my($self) = @_; view_pre_execute(sub { my($req) = shift->get_request; Bivio::Biz::Model->new($req, 'SearchForm')->process unless $req->unsafe_get('Model.SearchForm'); return; }) if $_TI->unsafe_from_name('SEARCH_LIST') && !$self->unsafe_get('view_pre_execute'); view_put( xhtml_title => vs_xhtml_title(), vs_pager => '', xhtml_adorned_title => vs_text_as_prose('xhtml_head_title'), xhtml_seo_head_links => '', xhtml_body_class => '', xhtml_tag_attrs => '', bootstrap_tab_heading => ForumDropDown()->put( drop_down_attrs => { tag => 'div', toggle_class => 'b_forum_name btn btn-info dropdown-toggle', }, single_row_class => 'b_forum_name btn btn-info disabled', ), xhtml_head_tags => $_F->is_2014style ? Join([ META({ 'HTTP-EQUIV' => 'X-UA-Compatible', CONTENT => 'IE=edge', }), META({ NAME => 'viewport', CONTENT => 'width=device-width,initial-scale=1.0', }), LocalFileAggregator({ base_values => [ 'bootstrap.min.css', 'fontello/css/b_icon.min.css', InlineCSS([ sub { #TODO: Widget.RenderView my($source) = @_; my($res) = UI_View()->render( 'CSS->render_2014style_css', $source->req, ); #TODO: Need to add this to InlineCSS from RealmCSS $$res =~ s/^\!.*\n//mg; return $$res; }, ]), ], }), #TODO: need to be in separate aggregator - other InlineCSS() does not render? LocalFileAggregator({ base_values => [ IfUserAgent('is_msie_8_or_before', 'msie8shim/msie8shim.min.js'), ], }), ]) : '', xhtml_favicon_tag => LINK({ REL => 'shortcut icon', TYPE => 'image/x-icon', HREF => [sub {FacadeComponent_Icon()->get_favicon_uri(shift->req)}], }), xhtml_rss_task => '', xhtml_tools => '', xhtml_nav => '', xhtml_topic => '', xhtml_byline => '', xhtml_selector => '', xhtml_dock_left => $_F->is_2014style ? NavContainer( Link(vs_text('site_name'), 'SITE_ROOT'), Join([ TaskMenu([ vs_text_as_prose('xhtml_site_admin_drop_down_standard') ->put(task_menu_no_wrap => 1), ], { class => 'nav navbar-nav', selected_class => 'active', }), TaskMenu([ 'USER_SETTINGS_FORM', UserState(), ], { class => 'nav navbar-nav navbar-right', }), $self->internal_2014style_search_form, ]), ) : _if_want( 'dock_left_standard', undef, vs_text_as_prose('xhtml_dock_left_standard'), ), _center_replaces_middle('xhtml_dock_middle') => '', xhtml_dock_right => JoinMenu([ $_C->if_version(8 => sub {_if_want('ForumDropDown')}), _if_want(qw(HelpWiki HELP)), $_WANT_USER_AUTH ? ( _if_want(qw(UserSettingsForm USER_SETTINGS_FORM)), _if_want(qw(UserState LOGIN)), ) : (), ]), xhtml_header_left => vs_text_as_prose('xhtml_logo'), xhtml_want_page_print => 0, xhtml_main_left => '', xhtml_main_right => '', xhtml_footer_left => $_F->is_2014style ? '' : XLink('back_to_top'), _center_replaces_middle('xhtml_footer_middle') => '', xhtml_footer_right => vs_text_as_prose('xhtml_copyright'), xhtml_want_first_focus => 1, xhtml_body_last => $_F->is_2014style ? LocalFileAggregator({ base_values => [ 'jquery/jquery.min.js', 'bootstrap/dist/js/bootstrap.min.js', SearchSuggestAddon('bivio_search_field'), ], }) : '', ); view_put( xhtml_body_first => Join([ $_F->is_2014style ? '' : EmptyTag(a => {html_attrs => ['name'], name => 'top'}), vs_first_focus(view_widget_value('xhtml_want_first_focus')), Script('b_log_errors'), ]), xhtml_header_right => $_C->if_version( 7 => sub {_if_want(qw(SearchForm SEARCH_LIST))}, sub { return Join([ DIV_user_state(view_widget_value('xhtml_dock_right')), _if_want(qw(SearchForm SEARCH_LIST)), ]); }, ), _center_replaces_middle('xhtml_header_middle') => DIV_nav(view_widget_value('xhtml_nav')), xhtml_style => RealmCSS(), _center_replaces_middle('xhtml_main_middle') => Join([ Acknowledgement(), MainErrors(), DIV_main_top(Join([ $self->internal_xhtml_tools(1), DIV_title(OpenGraphProperty(view_widget_value('xhtml_title'), 'title')), DIV_selector( view_widget_value('xhtml_selector')), DIV_topic(view_widget_value('xhtml_topic')), DIV_byline(view_widget_value('xhtml_byline')), ])), DIV_main_body(view_widget_value('xhtml_body')), DIV_main_bottom( $self->internal_xhtml_tools(0), ), ]), ); return; } sub internal_xhtml_adorned_body { my($self) = @_; return $_F->is_2014style ? Join([ DIV_b_nav_and_content(Join([ view_widget_value('xhtml_body_first'), Join([ view_widget_value('xhtml_dock_left'), ])->b_widget_label('dock_left'), DIV_main_middle(DIV_container(Join([ _realm_tabs($self), view_widget_value( _center_replaces_middle('xhtml_main_middle')), ])->b_widget_label('main_middle'))), ])), DIV_b_nav_and_footer( DIV_container(DIV_row(DIV(Join([ $self->internal_xhtml_tools(1), DIV( view_widget_value('xhtml_footer_right'), 'b_footer pull-right', ), ]), 'col-xs-12'))), ), view_widget_value('xhtml_body_last'), ]) # not 2014 style : Join([ view_widget_value('xhtml_body_first'), $_C->if_version(7 => sub {$self->internal_xhtml_grid3('dock')}), $self->internal_xhtml_grid3('header'), $self->internal_xhtml_grid3('main'), $self->internal_xhtml_grid3('footer'), view_widget_value('xhtml_body_last'), ]); } sub internal_xhtml_grid3 { my(undef, $name) = @_; return Grid( [[map( { my($n) = "${name}_$_"; Join( [view_widget_value("xhtml_$n")], {cell_class => $n}, )->b_widget_label($n); } 'left', _center_replaces_middle('middle'), 'right', )]], { class => $name, hide_empty_cells => 1, }, )->b_widget_label($name); } sub internal_xhtml_tools { my($self, $is_header) = @_; return $_F->is_2014style ? ($is_header ? Join([ TaskMenuOverride( view_widget_value('xhtml_tools'), { class => 'pagination', }, ), view_widget_value('vs_pager'), ]) : '') : DIV_tools(Join([ view_widget_value('xhtml_tools'), view_widget_value('vs_pager'), ], { join_separator => $is_header ? DIV_sep('') : EmptyTag(DIV => 'sep'), })); } sub _center_replaces_middle { my($name) = @_; $name =~ s/middle/center/ if $_CFG->{center_replaces_middle}; return $name; } sub _if_want { my($name, $task, $widget) = @_; return '' if $task && !$_TI->unsafe_from_name($task); $widget ||= $name; return If( vs_constant("ThreePartPage_want_$name"), ref($widget) ? $widget : vs_call($widget), ); } sub _realm_tabs { my($self) = @_; my($task_list, $task_select) = ForumTaskMenu()->get_select_widget; my($heading) = view_widget_value('bootstrap_tab_heading'); return If( And( ['auth_user_id'], [qw(auth_realm type ->eq_forum)], ), Join([ DIV( Grid([[ $heading, $task_list, ]]), 'row b_forum_tabs hidden-xs', ), DIV( Grid([[ $heading, $task_select, ]]), 'row b_forum_tabs visible-xs', ), ]), ); } 1;