Jump to content

V0RT3X

Administrators
  • Posts

    58
  • Joined

  • Days Won

    21

Everything posted by V0RT3X

  1. We are using the default IPS download application, but in Clubs. Join a Club and you should be able to download it's files.
  2. I'll PM you when I'm back home in about 4hrs.
  3. The Marketplace still shows Heosforo as the owner of the Mind and Chocolate themes, so I don't even know if we are allowed to offer it here.
  4. V0RT3X

    Back To Top

    Version 1.1.0

    20 downloads

    This plugin adds a button to scroll back to the top of the site to longer pages. Make sure to enable and configure the settings after installation! Supportthread
    Free
  5. Version 1.1.0

    11 downloads

    With this plugin you can display a message to new members when they are creating an account. You can use blank text or the default IPS info formatting, see screenshots. Supportthread
    Free
  6. Version 1.1.0

    7 downloads

    With this plugin you can create widgets for pure text or PHP code. Supportthread
    Free
  7. V0RT3X

    Final

    That's all for it now, your bugtracker is finished and we hope that your users won't have to use it too often 😉 You could of course add a filter function to the overview page, the status field is prepared accordingly and how this works has already been explained in the recipe database. If something doesn'twork, or you have any other questions, we are happy to help you in the support forum.
  8. V0RT3X

    The CSS

    For the status field we have already defined several different values, but they all look the same at the moment. Especially with a bug tracker, the status of an error message should be immediately visible, for example with an alarm red for critical errors, green for fixed errors, and so on. Now we do all this in one washup with CSS. This is not only much easier and more elegant, the old font color tag is also no longer supported under modern HTML5. Now I have to say that it's actually the idea of IPS that you create your own CSS files for your pages (the Release Notes Tutorial explains exactly how this works). In this example I use the code directly in the templates. This has several advantages, among others I can be more individual. In the recordRow template you simply copy the code from above over the actual template code ... <style> .ipsBadge_style1 { --badge--background: #ff0000; --badge--color: #fff; border-radius: 2px; } .ipsBadge_style2 { --badge--background: #49bd5b; --badge--color: #fff; border-radius: 2px; } .ipsBadge_style3 { --badge--background: #606060; --badge--color: #fff; border-radius: 2px; } .ipsBadge_style4 { --badge--background: #ff9900; --badge--color: #fff; border-radius: 2px; } .ipsBadge_style5 { --badge--background: #3A8BC4; --badge--color: #fff; border-radius: 2px; } .ipsBadge_style6 { --badge--background: #FF69B4; --badge--color: #fff; border-radius: 2px; } </style> In the record Template exactly the same, only that I added this in the Style-Tag (just for the look) ... .ipsTabs { display: none; } This removes the Tabs menu that is superfluous in this case.
  9. Since we want to use our own view, we naturally need our own templates. You can also simply display the user-defined fields automatically at fixed positions, but that is exactly what we are NOT doing here. So now we create our own set for the listing and the record, we already prepared the field on the last page. To do this, go to AdminCP and select Pages -> Page Management -> Templates -> New. Now we add two new database templates: Name: bugtracker_display -> Record Name: bugtracker_listing -> Record Listing Now you should see two new template groups ... In the Bugtracker Display group replace the content of the record template with this code ... <div class='ipsPageHeader ipsBox ipsResponsive_pull ipsPadding ipsClearfix'> <div class='ipsFlex ipsFlex-ai:center ipsFlex-fw:wrap ipsGap:4'> <div class='ipsFlex-flex:11'> <h1 class='ipsType_pageTitle ipsContained_container'> {{if $record->locked()}}<span><i class='fa fa-lock'></i></span> {{endif}} {{if $record->isFutureDate() || $record->mapped('pinned') || $record->mapped('featured') || $record->hidden() === -1 || $record->hidden() === 1 || $record->hidden() === -2}} {{if $record->isFutureDate()}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{$record->futureDateBlurb()}'><i class='fa fa-clock-o'></i></span></span> {{elseif $record->hidden() === -1}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{$record->hiddenBlurb()}'><i class='fa fa-eye-slash'></i></span></span> {{elseif $record->hidden() === -2}} <span><span class="ipsbadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{$record->deletedBlurb()}'><i class='fa fa-trash'></i></span></span> {{elseif $record->hidden() === 1}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{lang="pending_approval"}'><i class='fa fa-warning'></i></span></span> {{endif}} {{if $record->mapped('pinned')}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_positive" data-ipsTooltip title='{lang="pinned"}'><i class='fa fa-thumb-tack'></i></span></span> {{endif}} {{if $record->mapped('featured')}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_positive" data-ipsTooltip title='{lang="featured"}'><i class='fa fa-star'></i></span></span> {{endif}} {{endif}} {{if $record->prefix() OR ( $record->canEdit() AND $record::canTag( NULL, $record->container() ) AND $record::canPrefix( NULL, $record->container() ) )}} <span {{if !$record->prefix()}}class='ipsHide'{{endif}} {{if ( $record->canEdit() AND $record::canTag( NULL, $record->container() ) AND $record::canPrefix( NULL, $record->container() ) )}}data-editablePrefix{{endif}}> {template="prefix" group="global" app="core" params="$record->prefix( TRUE ), $record->prefix()"} </span> {{endif}} {{if $record->canEditTitle()}} <span class='ipsType_break ipsContained' data-controller="core.front.core.moderation"> <span data-role="editableTitle" title='{lang="click_hold_edit"}'>{$record->_title}</span> </span> {{else}} <span class='ipsType_break ipsContained'>{$record->_title}</span> {{endif}} </h1> {{if \count( $record->tags() ) OR ( $record->canEdit() AND $record::canTag( NULL, $record->container() ) )}} {template="tags" group="global" app="core" params="$record->tags(), FALSE, FALSE, ( $record->canEdit() AND $record::canTag( NULL, $record->container() ) ) ? $record->url() : NULL"} {{endif}} </div> <div class='ipsPos_right'> {$record->customFieldDisplayByKey('bugtracker_status', 'display')|raw} </div> <div class='ipsFlex-flex:00'> {{if $record::database()->options['reviews']}} <div> {template="rating" group="global" location="front" app="core" params="'large', $record->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $record->memberReviewRating()"}&nbsp;&nbsp; <span class='ipsType_normal ipsType_light'>({lang="num_reviews" pluralize="$record->record_reviews"})</span> </div> {{elseif $record->container()->allow_rating}} <div>{$record->rating()|raw}</div> {{endif}} </div> </div> <hr class='ipsHr'> <div class='ipsPageHeader__meta ipsFlex ipsFlex-jc:between ipsFlex-ai:center ipsFlex-fw:wrap ipsGap:3'> <div class='ipsFlex-flex:11'> <div class='ipsPhotoPanel ipsPhotoPanel_tiny ipsClearfix'> {template="userPhoto" app="core" group="global" params="$record->author(), 'tiny', $record->warningRef()"} <div> <p class='ipsType_reset ipsType_large ipsType_blendLinks'> {lang="content_record_started_by" htmlsprintf="$record->author()->link()"} {{if $record->editLine()}} <span class='ipsType_light ipsType_medium ipsType_reset'> ({lang="edited_lc"}) </span> {{endif}} </p> <ul class='ipsList_inline'> <li>{datetime="$record->record_publish_date"}</li> </ul> </div> </div> </div> <div class='ipsFlex-flex:00 ipsResponsive_hidePhone'> <div class='ipsFlex ipsFlex-ai:center ipsGap:3 ipsGap_row:0'> {{if !$record->container()->disable_sharelinks}} {template="shareButton" app="core" group="sharelinks" params="$record"} {{endif}} {template="promote" app="core" group="global" params="$record"} {template="follow" app="core" group="global" params="'cms', 'records'.$record::$customDatabaseId, $record->primary_id_field, $record->followersCount()"} </div> </div> </div> </div> {{if \count($record->getMessages())}} <div class='ipsSpacer ipsSpacer_top'> {template="contentItemMessages" group="global" app="core" params="$record->getMessages(), $record"} </div> {{endif}} <article class='ipsContained ipsSpacer_top ipsBox ipsResponsive_pull'> <div class='ipsClearfix ipsPadding '> {{if $record->record_image}} <div class="cCmsRecord_image"> <img class="ipsImage" src="{file="$record->_record_image_thumb" extension="cms_Records"}"> </div> {{endif}} <section class="ipsType_richText ipsType_normal" data-controller='core.front.core.lightboxedImages'>{$record->_content|raw}</section> {{if $record->editLine()}} {$record->editLine()|raw} {{endif}} {{if $records = $record->getReciprocalItems()}} <br> {{foreach $records as $fieldId => $items}} {{$infoLineShown = FALSE;}} <ul class="ipsList_inline ipsList_csv ipsList_noSpacing"> {{foreach $items as $item}} <li>{{if ! $infoLineShown}}{{$infoLineShown=TRUE;}}{lang="records_linking_to_me" sprintf="$item::database()->recordWord(0,TRUE), $record::database()->recordWord(1)"}: {{endif}}<a href="{$item->url()}">{$item->_title}</a></li> {{endforeach}} </ul> {{endforeach}} {{endif}} </div> {{if $bottomFields = $record->customFieldsForDisplay('display_bottom')}} <hr class='ipsHr ipsClear ipsClearfix'> <div class="ipsType_richText ipsPadding ipsType_normal" data-controller='core.front.core.lightboxedImages'> {{foreach $bottomFields as $fieldId => $fieldValue}} {{if $fieldValue}} {$fieldValue|raw} {{endif}} {{endforeach}} </div> {{endif}} <div class='ipsItemControls'> {{if \IPS\IPS::classUsesTrait( $record, 'IPS\Content\Reactable' ) and settings.reputation_enabled}} {template="reputation" app="core" group="global" params="$record"} {{endif}} <ul class='ipsComment_controls ipsClearfix ipsItemControls_left'> {{if ( $record->canEdit() or $record->isFutureDate() or $record->canPin() or $record->canUnpin() or $record->canFeature() or $record->canUnfeature() or $record->canHide() or $record->canUnhide() or $record->canMove() or $record->canLock() or $record->canUnlock() or $record->canDelete() ) or ( $record->hidden() == -2 AND \IPS\Member::loggedIn()->modPermission('can_manage_deleted_content'))}} <li> <a href='#elentryActions_menu' id='elentryActions' class='ipsButton ipsButton_light ipsButton_verySmall ipsButton_fullWidth' data-ipsMenu>{lang="content_record_actions" sprintf="$record::database()->recordWord( 1, TRUE )"} <i class='fa fa-caret-down'></i></a> <ul id='elentryActions_menu' class='ipsMenu ipsMenu_auto ipsHide'> {{if $record->canEdit()}} <li class='ipsMenu_item'><a href='{$record->url('edit')}' title='{lang="edit"}'>{lang="edit"}</a></li> {{endif}} {{if $record->canReportOrRevoke() === TRUE}} <li class='ipsMenu_item'><a href='{$record->url('report')}' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title="{lang="content_record_report" sprintf="$record::database()->recordWord( 1, TRUE )"}" data-ipsDialog-remoteSubmit data-ipsDialog-flashMessage="{lang="report_submit_success"}" title="{lang="content_record_report" sprintf="$record::database()->recordWord( 1, TRUE )"}">{lang="content_record_report" sprintf="$record::database()->recordWord( 1, TRUE )"}</a></li> {{endif}} {{if ( $record->canEdit() || $record->canReportOrRevoke() === TRUE ) AND ( (\IPS\Member::loggedIn()->modPermission('can_manage_deleted_content') AND $record->hidden() == -2 ) OR ( $record->isFutureDate() and $record::canFuturePublish( NULL, $record->container() ) ) OR $record->canFeature() OR $record->canUnfeature() OR $record->canPin() OR $record->canUnpin() OR $record->canHide() OR $record->canUnhide() OR $record->canLock() OR $record->canUnlock() OR $record->canMove() OR $record->canDelete() OR $record->canOnMessage( 'add' ) OR \IPS\Member::loggedIn()->modPermission('can_view_moderation_log') )}} <li class='ipsMenu_sep'><hr></li> {{endif}} {{if \IPS\Member::loggedIn()->modPermission('can_manage_deleted_content') AND $record->hidden() == -2}} <li class='ipsMenu_item'><a href='{$record->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'restore' ) )}' data-confirm data-confirmSubMessage='{lang="restore_as_visible_desc"}'>{lang="restore_as_visible"}</a></li> <li class='ipsMenu_item'><a href='{$record->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'restoreAsHidden' ) )}' data-confirm data-confirmSubMessage='{lang="restore_as_hidden_desc"}'>{lang="restore_as_hidden"}</a></li> <li class='ipsMenu_item'><a href='{$record->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'delete', 'immediate' => 1 ) )}' data-confirm data-confirmSubMessage='{lang="delete_immediately_desc"}'>{lang="delete_immediately"}</a></li> {{else}} {{if $record->isFutureDate() and $record::canFuturePublish( NULL, $record->container() )}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'publish' ) )}' data-confirm title='{lang="publish_now"}'>{lang="publish"}</a></li> {{endif}} {{if $record->canFeature()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'feature' ) )}' title='{lang="feature_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="feature"}</a></li> {{endif}} {{if $record->canUnfeature()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'unfeature' ) )}' title='{lang="unfeature_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="unfeature"}</a></li> {{endif}} {{if $record->canPin()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'pin' ) )}' title='{lang="pin_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="pin"}</a></li> {{endif}} {{if $record->canUnpin()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'unpin' ) )}' title='{lang="unpin_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="unpin"}</a></li> {{endif}} {{if $record->canHide()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'hide' ) )}' title='{lang="hide_title_record" sprintf="$record::database()->recordWord(1)"}' data-ipsDialog data-ipsDialog-title="{lang="hide"}">{lang="hide"}</a></li> {{endif}} {{if $record->canUnhide()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'unhide' ) )}' title='{{if $record->hidden() === 1}}{lang="approve_title_record" sprintf="$record::database()->recordWord(1)"}{{else}}{lang="unhide_title_record" sprintf="$record::database()->recordWord(1)"}{{endif}}'>{{if $record->hidden() === 1}}{lang="approve"}{{else}}{lang="unhide"}{{endif}}</a></li> {{endif}} {{if $record->canLock()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'lock' ) )}' title='{lang="lock_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="lock"}</a></li> {{endif}} {{if $record->canUnlock()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'unlock' ) )}' title='{lang="unlock_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="unlock"}</a></li> {{endif}} {{if $record->canMove()}} <li class='ipsMenu_item'><a href='{$record->url('move')->csrf()}' data-ipsDialog data-ipsDialog-title="{lang="move"}" title='{lang="move_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="move"}</a></li> {{endif}} {{if $record->canDelete()}} <li class='ipsMenu_item'><a href='{$record->url('moderate')->csrf()->setQueryString( array( 'action' => 'delete' ) )}' data-confirm title='{lang="delete_title_record" sprintf="$record::database()->recordWord(1)"}'>{lang="delete"}</a></li> {{endif}} {{if $record->canOnMessage( 'add' )}} <li class='ipsMenu_item'><a href='{$record->url('messageForm')->csrf()}' data-ipsDialog data-ipsDialog-title='{lang="add_message"}'>{lang="add_message"}</a></li> {{endif}} {{if \IPS\Member::loggedIn()->modPermission('can_view_moderation_log')}} <li class='ipsMenu_sep'><hr></li> <li class="ipsMenu_item"><a href='{$record->url()->csrf()->setQueryString( array( 'do' => 'modLog' ) )}' data-ipsDialog data-ipsDialog-title='{lang="moderation_history"}'>{lang="moderation_history"}</a></li> {{endif}} {{endif}} </ul> </li> {{elseif $record->canReportOrRevoke() === TRUE}} <li><a href='{$record->url('report')}' class='ipsButton ipsButton_link ipsButton_verySmall ipsButton_fullWidth' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title="{lang="content_record_report" sprintf="$record::database()->recordWord( 1, TRUE )"}" data-ipsDialog-remoteSubmit data-ipsDialog-flashMessage="{lang="report_submit_success"}" title="{lang="content_record_report" sprintf="$record::database()->recordWord( 1, TRUE )"}">{lang="content_record_report" sprintf="$record::database()->recordWord( 1, TRUE )"}</a></li> {{endif}} {{if $record->canManageRevisions()}} <li><a href='{$record->url('revisions')}' class='ipsButton ipsButton_verySmall ipsButton_link ipsButton_fullWidth' title="{lang="content_view_revisions"}">{lang="content_view_revisions"}</a></li> {{endif}} </ul> </div> </article> <div class='ipsBox ipsPadding ipsResponsive_pull ipsResponsive_showPhone ipsMargin_top'> {{if !$record->container()->disable_sharelinks}} <div class='ipsResponsive_noFloat ipsResponsive_block ipsMargin_bottom:half'> {template="shareButton" app="core" group="sharelinks" params="$record, 'verySmall', 'light'"} </div> {{endif}} <div class='ipsResponsive_noFloat ipsResponsive_block'> {template="follow" app="core" group="global" params="'cms', 'records'.$record::$customDatabaseId, $record->primary_id_field, $record->followersCount()"} </div> {{if $record->canPromoteToSocialMedia() and ( $record instanceof \IPS\Content or $record instanceof \IPS\Node\Model )}} <div class='ipsResponsive_noFloat ipsResponsive_block ipsMargin_top:half'> {template="promote" app="core" group="global" params="$record"} </div> {{endif}} </div> <div class='ipsPager ipsSpacer_top'> <div class="ipsPager_prev"> {{if $record::database()->use_categories}} <a href="{$record->container()->url()}" title="{lang="cms_back_to_category_with_title" sprintf="$record->container()->_title"}" rel="up"> <span class="ipsPager_type">{lang="cms_back_to_category" sprintf="$record::database()->recordWord( 2 )"}</span> </a> {{else}} {{$page = \IPS\cms\Pages\Page::$currentPage;}} <a href="{$page->url()}" title="{lang="cms_back_to_category_with_title" sprintf="$page->_title"}" rel="up"> <span class="ipsPager_type">{lang="cms_back_to_category" sprintf="$record::database()->recordWord( 2 )"}</span> </a> {{endif}} </div> {{if $nextUnread !== NULL}} <div class='ipsPager_next'> <a href="{$record->url()->setQueryString( array( 'do' => 'nextUnread' ) )}" title='{lang="cms_view_next_unread_title" sprintf="$record::database()->recordWord( 1 )"}'> <span class="ipsPager_type">{lang="cms_next_unread_title" sprintf="$record::database()->recordWord( 1 )"}</span> </a> </div> {{endif}} </div> <br> {{if $commentsAndReviews}} <a id="replies"></a> <h2 class='ipsHide'>{lang="user_feedback"}</h2> <div class='ipsResponsive_pull'> {$commentsAndReviews|raw} </div> {{endif}} <br> {{if $updateForm}} <div class='ipsAreaBackground_light ipsPad'> <h2 class='ipsType_sectionHead'>{lang="cms_front_update_fields" sprintf="$record::database()->recordWord( 1 )"}</h2> <ul class='ipsForm ipsForm_vertical'> {$updateForm|raw} </ul> </div> {{endif}} In the Bugtracker Listing group replace the content of the recordRow template with this code ... {{$rowIds = array();}} {{foreach $rows as $row}} {{$idField = $row::$databaseColumnId;}} {{$rowIds[] = $row->$idField;}} {{endforeach}} {{$iposted = $table ? $table->contentPostedIn : array();}} {{foreach $rows as $row}} {{$idField = $row::$databaseColumnId;}} <li class="cCmsRecord_row ipsDataItem ipsDataItem_responsivePhoto {{if $row->unread()}}ipsDataItem_unread{{endif}} {{if method_exists( $row, 'tableClass' ) && $row->tableClass()}}ipsDataItem_{$row->tableClass()}{{endif}} {{if $row->hidden()}}ipsModerated{{endif}}" data-rowID='{$row->$idField}'> {{if member.member_id}} <div class='ipsDataItem_icon ipsPos_top'> {{if $row->unread()}} <a href='{$row->url( 'getNewComment' )}' title='{lang="first_unread_post"}' data-ipsTooltip> <span class='ipsItemStatus'><i class="fa {{if \in_array( $row->$idField, $iposted )}}fa-star{{else}}fa-circle{{endif}}"></i></span> </a> {{else}} {{if \in_array( $row->$idField, $iposted )}} <span class='ipsItemStatus ipsItemStatus_read ipsItemStatus_posted'><i class="fa fa-star"></i></span> {{else}} {{endif}} {{endif}} </div> {{endif}} <div class='ipsDataItem_main'> <h4 class='ipsDataItem_title ipsContained_container'> {{if $row->locked()}} <span><i class='fa fa-lock' data-ipsTooltip title='{lang="content_locked_record"}'></i></span> {{endif}} {{if $row->isFutureDate() || $row->mapped('pinned') || $row->mapped('featured') || $row->hidden() === -1 || $row->hidden() === 1}} {{if $row->isFutureDate()}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_small ipsBadge_warning" data-ipsTooltip title='{$row->futureDateBlurb()}'><i class='fa fa-clock-o'></i></span></span> {{elseif $row->hidden() === -1}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_small ipsBadge_warning" data-ipsTooltip title='{$row->hiddenBlurb()}'><i class='fa fa-eye-slash'></i></span></span> {{elseif $row->hidden() === 1}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_small ipsBadge_warning" data-ipsTooltip title='{lang="pending_approval"}'><i class='fa fa-warning'></i></span></span> {{endif}} {{if $row->mapped('pinned')}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_small ipsBadge_positive" data-ipsTooltip title='{lang="pinned"}'><i class='fa fa-thumb-tack'></i></span></span> {{endif}} {{if $row->mapped('featured')}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_small ipsBadge_positive" data-ipsTooltip title='{lang="featured"}'><i class='fa fa-star'></i></span></span> {{endif}} {{endif}} {{if $row->prefix()}} <span>{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}</span> {{endif}} <span class='ipsContained ipsType_break'> <a href='{$row->url( "getPrefComment" )}'> {{if $row->_title or $row->_title == 0}}{$row->_title}{{else}}<em class="ipsType_light">{lang="content_deleted"}</em>{{endif}} </a> </span> {{if $row->commentPageCount() > 1}} {$row->commentPagination( array(), 'miniPagination' )|raw} {{endif}} </h4> <div class='ipsDataItem_meta ipsType_reset ipsType_light ipsType_blendLinks'> <span>{lang="bugtracker_reported"} {datetime="$row->_publishDate"}</span> {{if \count( $row->tags() )}} {template="tags" group="global" app="core" params="$row->tags(), true"} {{endif}} <br />{lang="content_record_last_updated"} <a href='{$row->url( 'getLastComment' )}' title='{lang="get_last_post"}'> {{if $row->database()->_comment_bump & \IPS\cms\Databases::BUMP_ON_COMMENT}} {{if $row->mapped('num_comments')}}{datetime="$row->mapped('last_comment')"}{{else}}{datetime="$row->mapped('date')"}{{endif}} {{else}} {{if $row->record_edit_time > 0}}{datetime="$row->record_edit_time"}{{else}}{datetime="$row->mapped('date')"}{{endif}} {{endif}} </a> </div> </div> <ul class='ipsDataItem_lastPoster ipsDataItem_withPhoto ipsType_blendLinks'> {$row->customFieldDisplayByKey('bugtracker_status', 'listing')|raw} </ul> <ul class='ipsDataItem_stats'> <div class='ipsResponsive_hidePhone ipsResponsive_hideTablet'> {{foreach $row->stats(TRUE) as $k => $v}} <li {{if \in_array( $k, $row->hotStats )}}class="ipsDataItem_stats_hot" data-text='{lang="hot_item"}' data-ipsTooltip title='{lang="hot_item_desc"}'{{endif}}> <span class='ipsDataItem_stats_number'>{number="$v"}</span> <span class='ipsDataItem_stats_type'>{lang="content_records_stat_{$k}" pluralize="$v"}</span> </li> {{endforeach}} {{if $row::database()->options['reviews']}} <li> <ul class='ipsList_inline ipsList_noSpacing_left ipsClearfix ipsRating ipsRating_{{if \IPS\Settings::i()->reviews_rating_out_of > 5}}small{{else}}large{{endif}}'> {{foreach range( 1, \IPS\Settings::i()->reviews_rating_out_of ) as $i}} <li class='{{if $row->averageReviewRating() >= $i}}ipsRating_on{{else}}ipsRating_off{{endif}}'> <i class='fa fa-star'></i> </li> {{endforeach}} </ul> </li> {{elseif $row->container()->allow_rating}} {template="rating" group="global" location="front" app="core" params="'large', $row->rating_value, \IPS\Settings::i()->reviews_rating_out_of"} {{endif}} </div> </ul> {{if $table and $table->canModerate()}} <div class='ipsDataItem_modCheck'> <span class='ipsCustomInput'> <input type='checkbox' data-role='moderation' name="moderate[{$row->$idField}]" data-actions="{expression="implode( ' ', $table->multimodActions( $row ) )"}" data-state='{{if $row->tableStates()}}{$row->tableStates()}{{endif}}'> <span></span> </span> </div> {{endif}} </li> {{endforeach}} The easiest way to see what exactly happened here is to compare these two templates with the originals. You don't have to do this line by line, of course, but there are programs like WinMerge that will show you this automatically. You can see exactly what was removed and what was added. What exactly is explained by the code itself. And because you can follow it by yourself, the learning effect is much bigger than if we would list a step-by-step changelog here 😉
  10. After you have specified the selection options on the last page, we only need to define how we want them to appear in the listing and detail view of the bugs. This is done via the Display options tab and looks like this ... Show in listing template = Yes Listing View Format = Custom Listing Custom Format {{if $formValue}} {{$items=explode(',',$formValue);}} {{foreach $items as $item}} {{if $item=="bugtracker_found"}} <span class='ipsBadge_large ipsBadge ipsBadge_style1'>{lang="$item"}</span> {{elseif $item=="bugtracker_fixed"}} <span class='ipsBadge_large ipsBadge ipsBadge_style2'>{lang="$item"}</span> {{elseif $item=="bugtracker_cant_reproduce"}} <span class='ipsBadge_large ipsBadge ipsBadge_style3'>{lang="$item"}</span> {{elseif $item=="bugtracker_in_progress"}} <span class='ipsBadge_large ipsBadge ipsBadge_style4'>{lang="$item"}</span> {{elseif $item=="bugtracker_answer"}} <span class='ipsBadge_large ipsBadge ipsBadge_style5'>{lang="$item"}</span> {{elseif $item=="bugtracker_no_bug"}} <span class='ipsBadge_large ipsBadge ipsBadge_style6'>{lang="$item"}</span> {{endif}} {{endforeach}} {{endif}} Show in display template = Yes Display View Format = Custom Display Custom Format {{if $formValue}} {{$items=explode(',',$formValue);}} {{foreach $items as $item}} {{if $item=="bugtracker_found"}} <span class='ipsBadge_large ipsBadge ipsBadge_style1'>{lang="$item"}</span> {{elseif $item=="bugtracker_fixed"}} <span class='ipsBadge_large ipsBadge ipsBadge_style2'>{lang="$item"}</span> {{elseif $item=="bugtracker_cant_reproduce"}} <span class='ipsBadge_large ipsBadge ipsBadge_style3'>{lang="$item"}</span> {{elseif $item=="bugtracker_in_progress"}} <span class='ipsBadge_large ipsBadge ipsBadge_style4'>{lang="$item"}</span> {{elseif $item=="bugtracker_answer"}} <span class='ipsBadge_large ipsBadge ipsBadge_style5'>{lang="$item"}</span> {{elseif $item=="bugtracker_no_bug"}} <span class='ipsBadge_large ipsBadge ipsBadge_style6'>{lang="$item"}</span> {{endif}} {{endforeach}} {{endif}} As Display setting we choose Above the item content and as a small goodie we set Editable when viewing a record to yes. Right now you are finished with the field, please check the steps on this and the last two pages again to check if everything's fine.
  11. The user, or later the staff member, should be able to assign a processing status to each error and to change it. For this purpose, we have created a select box on the last page, which we will now fill with information, which looks like this in the AdminCP ... Now it is important that you insert all keys and values exactly as I list them here ... bugtracker_found Bug bugtracker_fixed Fixed bugtracker_cant_reproduce Can't reproduce bugtracker_in_progress In progress bugtracker_answer Waiting for reply bugtracker_no_bug Not a bug Of course you can work with your own values later, but for this tutorial you should use them. In the settings at the bottom of the page you choose Allow filtering and Field Required.
  12. For this database we actually only need 3 fields. The title for the message, the content and the status. How to add custom fields has already been explained in the Documentation database. So let's go directly to the settings ... 1. Title Title = Title Type = Text Template Key: bugtracker_title Leave the rest as it is. 2. Content Titel = Content Type = Editor Template Key: bugtracker_content The other settings are fine too. But you can adjust them a bit, for example by disabling attachments. 3. Status Title = Status Type = Select Box Template Key = bugtracker_status Now it's getting a bit more complicated, so we'll go into more details on the following pages.
  13. V0RT3X

    The Basics

    For this bug tracker you need a database for the bugs reported by the users and a page where this database is included. The steps you have to do can be found HERE ... Create a page Create database Add database to page These steps are identical, except that you simply use bug tracker etc. instead of documentation. We don't use categories this time, but work more with fields and content filtering. We will also modify the included templates for the look and add our own CSS.
  14. We are going to create a database that contains categories and assign the key doc for the database. In your AdminCP go to Pages -> Contents -> Databases and click on Create new. On the tab Details check that the database use categories, otherwise you will not be able to create a menu block. The key of the database should be set to docs. Use default templates as shown in the screenshot below, we will change them later where necessary. On the next tab you set the language. This documentation consists of guides / pages, so we will use the word "guide" here, instead of entry or record. On the next tab Options we change some settings as we do not need some features in this database. We will not allow comments or reviews. The record image is not important in this database as well. We skip the tabs Forums and SEO, there is nothing to change here. On the last tab Page we will create a new page so that we can access the database to test it during this tutorial. You cannot use a database in IPS if you do not assign it to a page! We do not create the page with Page Builder, but with manual HTML. The reason is that we want to "reverse" the page structure, so that the sidebar with navigation will be displayed on the left side. You can't do it with Page Builder unless you create a new page template first. This would be useful if you want to build several pages like this. For example, if you have several databases that use this structure. But for our purposes manual HTML is enough. Remember to turn off the standard community sidebar. Otherwise, your documentation would have three columns (navigation, main content and community sidebar on the right). There will be not enough space for the main content if you have three columns. In the permissions' matrix you can set what group should get what permissions for the documentation. Remember that we have disabled comments and reviews for the database, so you can safely omit these permissions for all groups. Add page to menu After the database and page have been created, you add this page to the main menu of your community so that you can access it quickly. Or you have to call the database via https://example.com/docs and that is a bit awkward. In AdminCP go to System -> Site Features -> Menu Manager and click on Add Item. On the right side in the Menu Item Type area choose Page. Then in the Configuration section below select the page with the documentation from the drop down list. Save the menu item and do not forget to Publish this menu. Switch to your community and view the page. If you do not see the menu item, then most likely the permissions for the page are not set. In AdminCP go to Pages -> Page management -> Pages, click on the arrow down in the line containing the page docs and select Permissions. Now you should be able to see the page in the main menu of your community.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Further information can be found in our Privacy Policy.