Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Leaderboard

  1. Jimi Wikman

    Jimi Wikman

    Owner


    • Points

      178

    • Posts

      16,428


  2. Kryptera.se

    Kryptera.se

    Members


    • Points

      2

    • Posts

      6


  3. Alex Husar

    Alex Husar

    Members


    • Points

      1

    • Posts

      2


  4. Stas Ustimenko

    Stas Ustimenko

    Members


    • Points

      1

    • Posts

      2


Popular Content

Showing content with the highest reputation since 07/22/2019 in Articles

  1. This week I took a look at a plugin I had and decided to style it a bit to fit the image I had in my mind. As it turned out this was very easy and the only thing that stopped me for a while was how to use custom fields. Once that was done it was smooth sailing and quite fun to customize. This is how I did it, so you can do it yourself if you want. The app that we will be working with is the Movies & TV Shows by Adriano Faria. This is an amazing app that use the TMDB database to fetch data for the movies and TV shows, making adding movies and TV shows fast and fun. Adriano has several similar apps and I also have the Books version that I probably look at later as well. In order to modify the app we need to go to the themes (customization -> Apperance -> Themes) and click the Edit HTML & CSS button. This takes us to the templates for our theme. There you will have two tabs, one for templates and one for CSS. In both of those tabs we will have a section called "Movies". This is where we find the app templates and the CSS that the app use. Inside the templates we will focus on a few templates to make the design that we want to make. View -> View: This is the template that control the layout for when you look at a movie or tv show. Index -> indexBlock: This is the template that control the latest and random items block on the start page. Index -> featuredMovie: This is the template that control the featured movies block on the start page. front -> browse -> rows: This is the template that control the listing inside a category. We will also work with the CSS that is located in the CSS tab: movies -> front -> movies.css Changing the view The first thing I did was to change the View template. I had the idea that I wanted to have a big background image behind the content. This is a bit tricky since the content is trapped inside a div that have a fixed width. The second thing I wanted was to add more data and I especially wanted to add a custom rating icon for my rating since I will use this as my recommendation site of sorts. So first I needed to figure out how to add custom fields and decide what fields I wanted. I decided on the following fields: Official Trailer (ID:8) - The ID of the trailer, so I can add it to an embedded video player Certification (ID:6) - Just a text field to add the certification. TV Year (ID:4) - Just a text field here as well. My Review (ID:2) - An editor field, so I can write my review. My Rating (ID:5) - Just a number field, so I can add values between 1 and 100. Backdrop (ID:1) - An upload field, so I can add a big image behind the content. In order to show these fields I need to use this little piece of code: {{$fields = $movie->customFields();}}{$fields['field_1']} I then just change the field_1 to the field I want to display. You can see what the id of your field is by hovering over the edit button in the custom fields view. I also want to be able to add some conditions, so I only see things if the field is filled in and in order to do that I use this: {{if $movie->customFields('field_1')}} With that we can now add our custom fields to the template and start looking at how to style them. The Backdrop The backdrop is shown by displaying the file that we uploaded, but it will be constrained within the content and we want to break it out from that. This is where we use a little hack in CSS and I added a class to the div surrounding the backdrop and then added this CSS to it: .full-width { width: 100vw; position: relative; left: 50%; right: 50%; margin-left: -50vw; margin-right: -50vw; margin-top:-15px; min-height:800px; background-image:url(https:{media="528"}); background-color: #294459; background-position:top center; background-repeat:no-repeat; background-size:cover; } This now show the image in full width and I have this idea that I want to add a play button to the backdrop that show a trailer when I click it. There are several ways to do this, but I decided to use the built-in function in Invision Community called ips.ui.dialog. This nifty function allow me to open a modal and either populate it with a link or content inside the same page. As it does not work to refer directly to the url of the trailer, we use the embed code instead and place the content in a hidden div in the document. {{if $movie->customFields('field_1')}} <div class="full-width" style="background-image:url('https://jimiwikman.se/uploads/{{$fields = $movie->customFields();}}{$fields['field_1']}');"> <!-- Official Trailer --> {{if $fields['field_8']}} <a href='#dialogContent' data-ipsDialog data-ipsDialog-size="fullscreen" data-ipsDialog-content='#dialogContent'> <div class="JWSE_play"> <span class="JWSE_playBtn"><i class="far fa-play-circle"></i></span> <span class="JWSE_playTxt">Play Trailer</span> </div> </a> <div id="dialogContent" class="JWSE_video-container ipsHide"> <iframe src="https://www.youtube.com/embed/{$fields['field_8']}" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </div> {{endif}} In the code I refer to the custom field I created for the official trailer that hold the movie ID. I also wrap the code in an if query, so it only shows if a value is entered. I use FontAwesome to show the play icon and I define the modal to be full view using the data-ipsDialog-size attribute. Currently, narrow, medium, wide and full screen are supported as values for this option. I then style this with the following CSS: /*** Youtube Popup ***/ .JWSE_video-container { overflow: hidden; position: relative; width:100%; } .JWSE_video-container::after { padding-top: 56.25%; display: block; content: ''; } .JWSE_video-container iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .JWSE_play { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); text-align:center; height:170px; width:170px; background: rgb(41,68,89, 0.5); display:block; border-radius:100% } .JWSE_playBtn{ position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size:70px; opacity:0.9; color:white; display:block; } .JWSE_playTxt{ position: absolute; top: 80%; left: 50%; transform: translate(-50%, -50%); font-size:16px; color:white; display:block; } My Rating Adding a rating icon to make the rating number look cool is next, and I wanted a circle with numbers inside. This can be done in any number of ways, but I decided on a fairly simple version of a SVG circle using css keyframes for animation. <!-- JWSE Rating Circle --> {{if $fields['field_5']}} <div class="jwse_ratingCircle"> <svg viewBox="0 0 36 36" class="circular-chart orange"> <path class="circle-bg" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <path class="circle" stroke-dasharray="{{$fields = $movie->customFields();}}{$fields['field_5']|raw}, 100" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <text x="17" y="22.35" class="percentage">{{$fields = $movie->customFields();}}{$fields['field_5']|raw}</text> <text x="27" y="15.35" class="percentageSmall">%</text> </svg> </div> {{elseif $fields['field_5'] == 0}} <div class="jwse_ratingCircle"> <svg viewBox="0 0 36 36" class="circular-chart"> <path class="circle-bg" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <path class="circle" stroke-dasharray="0, 100" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <text x="18" y="19.35" class="percentage unrated">Unrated</text> </svg> </div> {{endif}} As you can see in the code I have two versions of the circle, one for when I have added a value and one for when I have not. I had to add a condition to the second version because as I have a number field it will always be 0, which means that it is never empty. This means that the first condition will always be true, even if I have not added anything to the field. To this I added the following CSS: /*** My Rating Circle ***/ .jwse_MyReviewText{ position:relative; } .jwse_ratingCircle { float: right; position: absolute; top: 0px; right: 0px; z-index:999; width:100px; } .jwse_ratingCircle-indexBlock { float: right; position: absolute; top: 0px; right: 0px; z-index:999; width:50px; } .jwse_ratingCircle-categoryList { float: left; position: absolute; top: -5px; left: 112px; z-index:999; width:50px; } .circular-chart{ display: block; margin: 10px auto; max-width: 80%; max-height: 100px; background-color: var(--color-baseblue); border-radius: 50%; } .circular-chart-indexBlock{ max-width:100%; max-height:50px; top:-6px; right: 3px; position:relative; } .circular-chart-Featured{ max-height:50px; top:-5px; right: 17px; position:relative; } .circular-chart_unrated{ background-color: var(--color-palegrey); } .circle-bg { fill: none; stroke: #eee; stroke-width: 3.8; opacity: 0.3; } .circle { fill: none; stroke-width: 3.8; stroke-linecap: round; animation: progress 1s ease-out forwards; } @keyframes progress { 0% { stroke-dasharray: 0 100; } } .circular-chart.orange .circle { stroke: var(--color-jwsecoral); } .percentage { fill: white; font-family: Montserrat; font-size: 13px; text-anchor: middle; } .percentageSmall{ fill: white; font-family: Montserrat; font-size: 5px; text-anchor: middle; } .unrated{ font-size:5px; } As you can see I have variants for the indexBlock and featuredBlock as well as adustment for the category list. This because the images are different for those areas and we need to adjust a bit. Let's put it all together With this I now have all the custom fields shown on the page, a backdrop that cover the full width of the page and I have a visual representation of the rating. All that is left is to put things together in the templates and add styles to it. We also need to adjust a bit for mobile view. With permission from Adriano, I will show you the code I use, and you can copy and paste it into your own movies theme files to get the layout I use here on this site. I have not cleaned these up, so there are some areas that need cleaning, but it works. View Rows indexBlock featuredMovie CSS <div class="ipsRichEmbed" style="max-width: 500px; border: 1px solid rgba(0,0,0,0.1); "> <div class="ipsRichEmbed_masthead ipsRichEmbed_mastheadBg ipsType_center"> <a href="https://www.vowel.com/" rel="external nofollow" style="background-image: url( 'https://s3.amazonaws.com/com.vowel.resources/social/vowel-share-thumb.jpg' ); background-position: center; background-repeat: no-repeat; background-size: cover; height: 120px; display: block;"><img alt="vowel-share-thumb.jpg" class="ipsHide" data-loaded="true" data-src="https://s3.amazonaws.com/com.vowel.resources/social/vowel-share-thumb.jpg" src="https://jimiwikman.se/applications/core/interface/js/spacer.png" style="height: auto;"></a> </div> <div style="padding: 10px;"> <h3 class="ipsRichEmbed_itemTitle ipsTruncate ipsTruncate_line ipsType_blendLinks"> <a href="https://www.vowel.com/" rel="external nofollow" style="text-decoration: none; margin-bottom: 5px;" title="Home - Vowel">Home - Vowel</a> </h3> <div class="ipsType_light"> WWW.VOWEL.COM </div> <hr class="ipsHr"> <div class="ipsSpacer_top ipsSpacer_half" data-ipstruncate="" data-ipstruncate-size="3 lines" data-ipstruncate-type="remove" style="overflow-wrap: break-word;"> <span>Vowel is a tool that captures your team&rsquo;s meetings. Use it to annotate meetings in real-time, tag action items, call back ideas verbatim&mdash;and a whole lot more.</span> </div> </div> </div> <div class="ipsTabs ipsTabs_contained ipsTabs_withIcons ipsTabs_large ipsTabs_stretch ipsClearfix" data-ipstabbar="" data-ipstabbar-contentarea="#" data-ipstabbar-defaulttab="1" data-ipstabbar-updateurl="false" id="elTabBar"> <ul role="tablist"> <li> <a aria-selected="true" class="ipsType_center ipsTabs_item ipsTabs_activeItem" href="" id="1" rel="" role="tab"> View </a> </li> <li> <a class="ipsType_center ipsTabs_item" href="" id="2" rel="" role="tab"> Rows </a> </li> <li> <a class="ipsType_center ipsTabs_item" href="" id="3" rel="" role="tab"> indexBlock </a> </li> <li> <a class="ipsType_center ipsTabs_item" href="" id="4" rel="" role="tab"> featuredMovie </a> </li> <li> <a class="ipsType_center ipsTabs_item" href="" id="5" rel="" role="tab"> CSS </a> </li> </ul> </div> <section class="ipsTabs_panels ipsTabs_contained"> <div class="ipsTabs_panel" id="ipsTabs_elTabBar_1_panel"> <pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9425_9" style=""> {{if $club = $movie->container()->club()}} {{if settings.clubs and settings.clubs_header == 'full'}} {template="header" app="core" group="clubs" params="$club, $movie->container()"} {{endif}} <div id='elClubContainer'> {{endif}} {{$fields = $movie->customFields();}} {{if $fields['field_1']}} <div class="full-width" style="background-image:url('https://jimiwikman.se/uploads/{$fields['field_1']|raw}');"> <!-- Official Trailer --> {{if $fields['field_8']}} <a href='#dialogContent' data-ipsDialog data-ipsDialog-size="fullscreen" data-ipsDialog-content='#dialogContent'> <div class="JWSE_play"> <span class="JWSE_playBtn"><i class="far fa-play-circle"></i></span> <span class="JWSE_playTxt">Play Trailer</span> </div> </a> <div id="dialogContent" class="JWSE_video-container ipsHide"> <iframe src="https://www.youtube.com/embed/{$fields['field_8']}" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> </div> {{endif}} </div> {{else}} <div class="full-width" style="background-image:url('{media="528"}')"></div> {{endif}} <div class=""> <div class="ipsPageHeader ipsClearfix ipsSpacer_bottom"> {template="contentItemMessages" group="global" app="core" params="$movie->getMessages(), $movie"} <div class='ipsBox ipsResponsive_pull'> <div class='ipsColumns ipsColumns_collapsePhone'> <aside class='ipsColumn ipsColumn_veryWide ipsPadding_right:none'> <div class='ipsPad lg:ipsPos_sticky'> <div> {{if $movie->cover_thumb}} <div class='ipsPos_center'> <div class="sosMovieCover"> <!-- JWSE Rating Circle --> {{if $fields['field_5']}} <div class="jwse_ratingCircle"> <svg viewBox="0 0 36 36" class="circular-chart orange"> <path class="circle-bg" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <path class="circle" stroke-dasharray="{{$fields = $movie->customFields();}}{$fields['field_5']|raw}, 100" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <text x="17" y="22.35" class="percentage">{{$fields = $movie->customFields();}}{$fields['field_5']|raw}</text> <text x="27" y="15.35" class="percentageSmall">%</text> </svg> </div> {{elseif $fields['field_5'] == 0}} <div class="jwse_ratingCircle"> <svg viewBox="0 0 36 36" class="circular-chart"> <path class="circle-bg" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <path class="circle" stroke-dasharray="0, 100" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <text x="18" y="19.35" class="percentage unrated">Unrated</text> </svg> </div> {{endif}} {template="coverPhoto" group="global" app="movies" params="$movie->cover_thumb, '', $movie->title, 'large'"} </div> <div class="jwse_MoviePhoto_Footer"> {template="rating" group="global" location="front" app="core" params="'large', $movie->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $movie->memberReviewRating()"}&nbsp;&nbsp; <span class='ipsType_normal ipsType_light'>({lang="num_reviews" pluralize="$movie->reviews"})</span> </div> </div> {{else}} <center><img src='{resource="movie.PNG" app="movies" location="front"}'></center> {{endif}} <hr class='ipsHr'> {{if $movie->imdb_id OR $movie->homepage OR $movie->wikipedia OR $movie->instagram OR $movie->facebook OR $movie->twitter OR $movie->justwatch}} <ul class='ipsList_inline ipsSpacer_both ipsType_center'> {{if $movie->homepage}} <li><a title="{lang="movies_homepage_visit"}" data-ipsTooltip target="_blank" href="{$movie->homepage}"> <i class="fa fa-link fa-2x" aria-hidden="true"></i></a></li> {{endif}} {{if $movie->imdb_id}} <li><a title="{lang="movies_imdb_page_visit"}" data-ipsTooltip target="_blank" href="https://www.imdb.com/title/{$movie->imdb_id}/"> <i class="fa fa-imdb fa-2x" aria-hidden="true"></i></a></li> {{endif}} {{if $movie->facebook}} <li><a title="{lang="movies_facebook_page"}" data-ipsTooltip target="_blank" href="{$movie->facebook}"> <i class="fa fa-facebook fa-2x" aria-hidden="true"></i></a></li> {{endif}} {{if $movie->instagram}} <li><a title="{lang="movies_instagram_page"}" data-ipsTooltip target="_blank" href="{$movie->instagram}"> <i class="fa fa-instagram fa-2x" aria-hidden="true"></i></a></li> {{endif}} {{if $movie->justwatch}} <li><a title="{lang="movies_justwatch_page"}" data-ipsTooltip target="_blank" href="{$movie->justwatch}"> <i class="fa fa-play fa-2x" aria-hidden="true"></i></a></li> {{endif}} {{if $movie->twitter}} <li><a title="{lang="movies_twitter_page"}" data-ipsTooltip target="_blank" href="{$movie->twitter}"> <i class="fa fa-twitter fa-2x" aria-hidden="true"></i></a></li> {{endif}} {{if $movie->wikipedia}} <li><a title="{lang="movies_wikipedia_page"}" data-ipsTooltip target="_blank" href="{$movie->wikipedia}"> <i class="fa fa-wikipedia-w fa-2x" aria-hidden="true"></i></a></li> {{endif}} {{if $movie->canEdit()}} <li> <a href="{$movie->url()->csrf()->setQueryString( array( 'do' => 'editUrls' ) )}" data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title="{lang="movie_edit_urls"}"> <i data-ipsTooltip title="{lang='movie_edit_urls'}" class="fa fa-pencil fa-fw" aria-hidden="true"></i> </a> </li> {{endif}} </ul> <hr class='ipsHr'> {{endif}} <ul class="ipsDataList ipsDataList_reducedSpacing ipsSpacer_top"> <li class="ipsDataItem"> <span class="ipsDataItem_generic ipsDataItem_size3"><strong>{lang="movie_type"}</strong></span> <span class="ipsDataItem_generic">{lang="movie_type_{$movie->type}"}</span> </li> <li class="ipsDataItem"> <span class="ipsDataItem_generic ipsDataItem_size3"><strong>{lang="movie_status"}</strong></span> <span class="ipsDataItem_generic">{$movie->status}</span> </li> {{if $movie->type=='tv'}} <li class="ipsDataItem"> <span class="ipsDataItem_generic ipsDataItem_size3"><strong>{lang="movie_seasons"}</strong></span> <span class="ipsDataItem_generic">{$movie->seasons}</span> </li> <li class="ipsDataItem"> <span class="ipsDataItem_generic ipsDataItem_size3"><strong>{lang="movie_episodes"}</strong></span> <span class="ipsDataItem_generic">{$movie->episodes}</span> </li> {{endif}} {{if $movie->type=='movie'}} <li class="ipsDataItem"> <span class="ipsDataItem_generic ipsDataItem_size3"><strong>{lang="movie_original_language"}</strong></span> {{$language = \IPS\movies\Movie::getLanguageName( $movie->original_language );}} <span class="ipsDataItem_generic">{$language}</span> </li> {{if $movie->budget}} <li class="ipsDataItem"> <span class="ipsDataItem_generic ipsDataItem_size3"><strong>{lang="movie_budget"}</strong></span> <span class="ipsDataItem_generic">{expression="\IPS\Member::loggedIn()->language()->formatNumber( $movie->budget, 2 )"}</span> </li> {{endif}} {{if $movie->revenue}} <li class="ipsDataItem"> <span class="ipsDataItem_generic ipsDataItem_size3"><strong>{lang="movie_revenue"}</strong></span> <span class="ipsDataItem_generic">{expression="\IPS\Member::loggedIn()->language()->formatNumber( $movie->revenue, 2 )"}</span> </li> {{endif}} {{endif}} </ul> {{if $movie->topic()}} <hr class='ipsHr'> <a href='{$movie->topic()->url()}' title='{lang="movie_discussion_topic"}' class='ipsButton ipsButton_primary ipsButton_fullWidth'>{lang="movie_discussion_topic"}</a> {{endif}} <div class='ipsResponsive_showPhone ipsResponsive_block ipsSpacer_top'> {template="follow" app="core" group="global" params="'movies', 'movie', $movie->id, $movie->followersCount()"} </div> </div> </div> </aside> <article class='ipsColumn ipsColumn_fluid ipsPadding_left:none'> <div class='ipsPad'> <section class='ipsType_normal whiteBack'> <div class='ipsPageHeader ipsResponsive_pull ipsBox ipsPadding ipsSpacer_bottom'> <div class='ipsFlex ipsFlex-ai:center ipsFlex-fw:wrap ipsGap:4'> <div class='ipsFlex-flex:11'> <h1 class='ipsType_pageTitle ipsContained_container'> {{if $movie->mapped('locked')}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{lang="movies_locked"}'><i class='fa fa-lock'></i></span></span> {{endif}} {{if $movie->hidden() === 1}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{lang="pending_approval"}'><i class='fa fa-warning'></i></span></span> {{elseif $movie->hidden() === -1}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{$movie->hiddenBlurb()}'><i class='fa fa-eye-slash'></i></span></span> {{elseif $movie->hidden() === -2}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{$movie->deletedBlurb()}'><i class='fa fa-trash'></i></span></span> {{endif}} {{if $movie->canToggleItemModeration() and $movie->itemModerationEnabled()}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{lang="topic_moderation_enabled"}'><i class='fa fa-user-times'></i></span></span> {{endif}} {{if $movie->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 $movie->mapped('featured')}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_positive" data-ipsTooltip title='{lang="featured"}'><i class='fa fa-star'></i></span></span> {{endif}} {{if $movie->canEdit()}} <span class='ipsType_break ipsContained' data-controller="core.front.core.moderation"> {{if $movie->locked()}}<i class='fa fa-lock'></i> {{endif}}<span data-role="editableTitle" title='{lang="click_hold_edit"}'>{$movie->title}</span> </span> {{else}} <span class='ipsType_break ipsContained'>{{if $movie->locked()}}<i class='fa fa-lock'></i> {{endif}}{$movie->title}</span> {{endif}} {{if $movie->status == 'Released'}} {{$date = \IPS\DateTime::ts( strtotime( $movie->release_date ) );}} <span class="jwse_movieYear">( {$date->format('Y')} )</span> {{endif}} {{if $fields['field_4']}} <span class="jwse_movieYear">( {{$fields = $movie->customFields();}}{$fields['field_4']} )</span> {{endif}} {{if $movie->prefix() OR ( $movie->canEdit() AND $movie::canTag( NULL, $movie->container() ) AND $movie::canPrefix( NULL, $movie->container() ) )}} <span {{if !$movie->prefix()}}class='ipsHide'{{endif}} {{if ( $movie->canEdit() AND $movie::canTag( NULL, $movie->container() ) AND $movie::canPrefix( NULL, $movie->container() ) )}}data-editablePrefix{{endif}}> {template="prefix" group="global" app="core" params="$movie->prefix( TRUE ), $movie->prefix()"} </span> {{endif}} </h1> <div class="jswe_movieMeta"> {{if $fields['field_6']}} <span class="ipsDataItem_generic certification">{{$fields = $movie->customFields();}}{$fields['field_6']|raw}</span> {{endif}} <!-- Movie Release Date --> {{if $movie->status == 'Released'}} {{$date = \IPS\DateTime::ts( strtotime( $movie->release_date ) );}} <span class="ipsDataItem_generic">{datetime="$date" dateonly="true"}</span> {{endif}} <!-- Movie Genres --> {{$genres = \IPS\movies\Movie::getGenreName( explode( ',', $movie->genres ) );}} <span class="ipsDataItem_generic">{$genres}</span> <!-- Movie Runtime --> {{if $movie->runtime}} {{$runtime = \IPS\movies\Movie::getRuntime( $movie->runtime );}} <span class="ipsDataItem_generic">{$runtime}</span> {{endif}} </div> {{if $movie->subtitle}} <span class="jwse_movieSubtitle">{$movie->subtitle}</span> {{endif}} <span class="jwse_movieDescription">{lang="meta_description"}</span> <p> {$movie->description|raw} </p> {{if \count( $movie->tags() ) OR ( $movie->canEdit() AND $movie::canTag( NULL, $movie->container() ) )}} {template="tags" group="global" app="core" params="$movie->tags(), FALSE, FALSE, ( $movie->canEdit() AND $movie::canTag( NULL, $movie->container() ) ) ? $movie->url() : NULL"} {{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> <div class='ipsFlex-flex:01 ipsResponsive_hidePhone'> <div class='ipsFlex ipsFlex-ai:center ipsFlex-jc:center ipsGap:3 ipsGap_row:0'> {{if \count( $movie->shareLinks() )}} {template="shareButton" app="core" group="sharelinks" params="$movie"} {{endif}} {template="promote" app="core" group="global" params="$movie"} {template="follow" app="core" group="global" params="'movies', 'movie', $movie->id, $movie->followersCount()"} </div> </div> </div> </div> {{if $movie->hidden() === 1 and $movie->canUnhide()}} <div class="ipsMessage ipsMessage_warning ipsSpacer_both"> <p class="ipsType_reset">{lang="movie_pending_approval"}</p> <br> <ul class='ipsList_inline'> <li><a href="{$movie->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'unhide' ) )}" class="ipsButton ipsButton_positive ipsButton_verySmall" title='{lang="approve_title_link"}'><i class="fa fa-check"></i> {lang="approve"}</a></li> {{if $movie->canDelete()}} <li><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'delete' ) )}' data-confirm title='{lang="movies_delete_title"}' class='ipsButton ipsButton_negative ipsButton_verySmall'><i class='fa fa-times'></i> {lang="delete"}</a></li> {{endif}} </ul> </div> {{endif}} <div class='ipsTabs ipsClearfix' id='elTabBar' data-ipsTabBar data-ipsTabBar-contentArea='#elTabContent' data-ipsTabBar-updateURL='false'> <a href='#elTabBar' data-action='expandTabs'><i class='fa fa-caret-down'></i></a> <ul role='tablist'> <li role='presentation'> <a href='{$movie->url()}' role='tab' id='elTabMovie' class='ipsTabs_item' aria-selected="true"> My Thoughts </a> </li> {{if \IPS\Settings::i()->movies_cast}} <li role='presentation'> <a href='{$movie->url()->setQueryString( array( 'do' => 'getMovieDataMovieView', 'type' => 'cast' ) )}' id='elTabCast' role='tab' class='ipsTabs_item'> {lang="movies_tab_cast"} </a> </li> {{endif}} {{if \IPS\Settings::i()->movies_crew}} <li role='presentation'> <a href='{$movie->url()->setQueryString( array( 'do' => 'getMovieDataMovieView', 'type' => 'crew' ) )}' id='elTabCrew' role='tab' class='ipsTabs_item'> {lang="movies_tab_crew"} </a> </li> {{endif}} {{if $movie->type == 'tv'}} <li role='presentation'> <a href='{$movie->url()->setQueryString( array( 'do' => 'getMovieDataMovieView', 'type' => 'seasons' ) )}' id='elTabEpisodes' role='tab' class='ipsTabs_item'> {lang="movies_tab_seasons"} </a> </li> {{endif}} {{if \IPS\Settings::i()->movies_videos}} <li role='presentation'> <a href='{$movie->url()->setQueryString( array( 'do' => 'getMovieDataMovieView', 'type' => 'videos' ) )}' id='elTabVideos' role='tab' class='ipsTabs_item'> {lang="movies_tab_videos"} </a> </li> {{endif}} {{if \IPS\Settings::i()->movies_posters}} <li role='presentation'> <a href='{$movie->url()->setQueryString( array( 'do' => 'getMovieDataMovieView', 'type' => 'posters' ) )}' id='elTabPosters' role='tab' class='ipsTabs_item'> {lang="movies_tab_posters"} </a> </li> {{endif}} {{if \IPS\Settings::i()->movies_images}} <li role='presentation'> <a href='{$movie->url()->setQueryString( array( 'do' => 'getMovieDataMovieView', 'type' => 'images' ) )}' id='elTabImages' role='tab' class='ipsTabs_item'> {lang="movies_tab_images"} </a> </li> {{endif}} {{if \IPS\Settings::i()->movies_similar}} <li role='presentation'> <a href='{$movie->url()->setQueryString( array( 'do' => 'getMovieDataMovieView', 'type' => 'similar' ) )}' id='elTabSimilar' role='tab' class='ipsTabs_item'> {{if $movie->type == 'movie'}} {lang="movies_tab_similar"} {{else}} {lang="movies_tab_similar_tv"} {{endif}} </a> </li> {{endif}} </ul> </div> <section id='elTabContent'> <div class="ipsBox ipsPad"> <div itemprop='text' data-controller='core.front.core.lightboxedImages'> <div class="jwse_MyReviewFace"></div> <div class="jwse_MyReviewText"> <span class="jwse_MyReviewTextRating"> <!-- JWSE Rating Circle --> {{if $fields['field_5']}} <div class="jwse_ratingCircle"> <svg viewBox="0 0 36 36" class="circular-chart orange"> <path class="circle-bg" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <path class="circle" stroke-dasharray="{{$fields = $movie->customFields();}}{$fields['field_5']|raw}, 100" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <text x="17" y="22.35" class="percentage">{{$fields = $movie->customFields();}}{$fields['field_5']|raw}</text> <text x="27" y="15.35" class="percentageSmall">%</text> </svg> </div> {{else}} <div class="jwse_ratingCircle"> <svg viewBox="0 0 36 36" class="circular-chart"> <path class="circle-bg" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <path class="circle" stroke-dasharray="0, 100" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <text x="18" y="19.35" class="percentage unrated">Unrated</text> </svg> </div> {{endif}} </span> {{if $fields['field_2']}} {{$fields = $movie->customFields();}}{$fields['field_2']|raw} {{else}} <p> <i>I have not written a review for this {{if $movie->type == 'movie'}}Movie{{else}}TV Show{{endif}} yet.<br /> Write a comment and remind me to write one!</i> </p> {{endif}} </div> <br style="clear:both;" /> </div> {{if $movie->container()->auto_content AND \IPS\Member::loggedIn()->language()->checkKeyExists( "movies_category_{$movie->container()->id}_append_content" )}} {{$lang = \IPS\Member::loggedIn()->language()->addToStack( "movies_category_{$movie->container()->id}_append_content" );}} {{\IPS\Member::loggedIn()->language()->parseOutputForDisplay( $lang );}} {{$content = str_replace( "%MOVIENAME%", $movie->title, $lang );}} {{\IPS\Member::loggedIn()->language()->parseOutputForDisplay( $content );}} {$content|raw} {{endif}} </div> </section> </section> </div> </article> </div> {{if ( $movie->canEdit() or $movie->canPin() or $movie->canUnpin() or $movie->canFeature() or $movie->canUnfeature() or $movie->canHide() or $movie->canUnhide() or $movie->canMove() or $movie->canLock() or $movie->canUnlock() or $movie->canDelete() ) or ( $movie->hidden() == -2 AND \IPS\Member::loggedIn()->modPermission('can_manage_deleted_content') ) or $movie->canReportOrRevoke() or ( \IPS\IPS::classUsesTrait( $movie, 'IPS\Content\Reactable' ) and settings.reputation_enabled )}} <div class='ipsItemControls'> {{if \IPS\IPS::classUsesTrait( $movie, 'IPS\Content\Reactable' ) and settings.reputation_enabled}} {template="reputation" app="core" group="global" params="$movie"} {{endif}} {{if ( $movie->canEdit() or $movie->canPin() or $movie->canUnpin() or $movie->canFeature() or $movie->canUnfeature() or $movie->canHide() or $movie->canUnhide() or $movie->canMove() or $movie->canLock() or $movie->canUnlock() or $movie->canDelete() ) or ( $movie->hidden() == -2 AND \IPS\Member::loggedIn()->modPermission('can_manage_deleted_content') ) or $movie->canReportOrRevoke()}} <ul class='ipsComment_controls ipsClearfix ipsItemControls_left'> {{if ( $movie->canEdit() or $movie->canPin() or $movie->canUnpin() or $movie->canFeature() or $movie->canUnfeature() or $movie->canHide() or $movie->canUnhide() or $movie->canMove() or $movie->canLock() or $movie->canUnlock() or $movie->canDelete() ) or ( $movie->hidden() == -2 AND \IPS\Member::loggedIn()->modPermission('can_manage_deleted_content') )}} <li> <a href='#elMovieActions_menu' id='elMovieActions' class='ipsButton ipsButton_light ipsButton_verySmall ipsButton_fullWidth' data-ipsMenu>{lang="{$movie->type}_actions"} <i class='fa fa-caret-down'></i></a> <ul id='elMovieActions_menu' class='ipsMenu ipsMenu_auto ipsHide'> {{if $movie->canReportOrRevoke() === TRUE}} <li class='ipsMenu_item'> <a href='{$movie->url('report')}' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title="{lang="report_movie"}" data-ipsDialog-remoteSubmit data-ipsDialog-flashMessage="{lang="report_submit_success"}" title="{lang="report_movie"}" >{lang="report"}</a> </li> <li class='ipsMenu_sep'><hr></li> {{endif}} {{if \IPS\Member::loggedIn()->modPermission('can_manage_deleted_content') AND $movie->hidden() == -2}} <li class='ipsMenu_item'><a href='{$movie->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='{$movie->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='{$movie->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 $movie->canEdit()}} <li class='ipsMenu_item'><a href='{$movie->url()->setQueryString( array( 'do' => 'edit' ) )}' title='{lang="edit"}'>{lang="edit"}</a></li> {{endif}} {{if $movie->canFeature()}} <li class='ipsMenu_item'><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'feature' ) )}'>{lang="feature"}</a></li> {{endif}} {{if $movie->canUnfeature()}} <li class='ipsMenu_item'><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'unfeature' ) )}'>{lang="unfeature"}</a></li> {{endif}} {{if $movie->canPin()}} <li class='ipsMenu_item'><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'pin' ) )}'>{lang="pin"}</a></li> {{endif}} {{if $movie->canUnpin()}} <li class='ipsMenu_item'><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'unpin' ) )}'>{lang="unpin"}</a></li> {{endif}} {{if $movie->canHide()}} <li class='ipsMenu_item'><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'hide' ) )}' data-ipsDialog data-ipsDialog-title="{lang="hide"}">{lang="hide"}</a></li> {{endif}} {{if $movie->canUnhide()}} <li class='ipsMenu_item'><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'unhide' ) )}'>{{if $movie->hidden() === 1}}{lang="approve"}{{else}}{lang="unhide"}{{endif}}</a></li> {{endif}} {{if $movie->canLock()}} <li class='ipsMenu_item'><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'lock' ) )}'>{lang="lock"}</a></li> {{endif}} {{if $movie->canUnlock()}} <li class='ipsMenu_item'><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'unlock' ) )}'>{lang="unlock"}</a></li> {{endif}} {{if $movie->canMove()}} <li class='ipsMenu_item'><a href='{$movie->url()->setQueryString( array( 'do' => 'move' ) )}' data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title="{lang="move"}">{lang="move"}</a></li> {{endif}} {{if $movie->canDelete()}} <li class='ipsMenu_item'><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'delete' ) )}' data-confirm>{lang="delete"}</a></li> {{endif}} {{if $movie->canOnMessage( 'add' )}} <li class='ipsMenu_item'><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'messageForm' ) )}' data-ipsDialog data-ipsDialog-title='{lang="add_message"}'>{lang='add_message'}</a></li> {{endif}} {{if $movie->canToggleItemModeration()}} <li class='ipsMenu_item'><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'toggleItemModeration' ) )}' data-confirm data-confirmMessage='{{if $movie->itemModerationEnabled()}}{lang="disable_movie_moderation_confirm"}{{else}}{lang="enable_movie_moderation_confirm"}{{endif}}'>{{if $movie->itemModerationEnabled()}}{lang="disable_topic_moderation"}{{else}}{lang="enable_topic_moderation"}{{endif}}</a></li> {{endif}} {{if \IPS\Member::loggedIn()->modPermission('can_reimport_data')}} <li class='ipsMenu_sep'><hr></li> <li class="ipsMenu_item"><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'reimport' ) )}' data-confirm>{lang="movies_reimport_{$movie->type}_data"}</a></li> {{endif}} {{if \IPS\Member::loggedIn()->modPermission('can_view_moderation_log')}} <li class='ipsMenu_sep'><hr></li> <li class="ipsMenu_item"><a href='{$movie->url()->csrf()->setQueryString( array( 'do' => 'modLog' ) )}' data-ipsDialog data-ipsDialog-title='{lang="moderation_history"}'>{lang="moderation_history"}</a></li> {{endif}} {{endif}} </ul> </li> {{elseif $movie->canReportOrRevoke() === TRUE}} <li> <a href='{$movie->url('report')}' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title="{lang="report_file"}" data-ipsDialog-remoteSubmit data-ipsDialog-flashMessage="{lang="report_submit_success"}" title="{lang="report_file"}" class='ipsButton ipsButton_link ipsButton_verySmall ipsButton_fullWidth'>{lang="report"}</a> </li> {{endif}} </ul> {{endif}} </div> {{endif}} </div> <div class='ipsBox ipsPadding ipsResponsive_pull ipsResponsive_showPhone ipsMargin_top'> <div class='ipsGap_row:3'> <div> {template="follow" app="core" group="global" params="'movies', 'movie', $movie->id, $movie->followersCount()"} </div> {{if \count( $movie->shareLinks() )}} <div> {template="shareButton" app="core" group="sharelinks" params="$movie, 'verySmall', 'light'"} </div> {{endif}} <div> {template="promote" app="core" group="global" params="$movie"} </div> </div> </div> {{if $prev || $next}} <div class='ipsGrid ipsGrid_collapsePhone ipsPager ipsSpacer_top'> {{if $prev !== NULL}} <div class="ipsGrid_span6 ipsType_left ipsPager_prev"> <a href="{$prev->url()}" title="{lang="prev_movie"}" rel="prev"> <span class="ipsPager_type">{lang="prev_movie"}</span> <span class="ipsPager_title ipsType_light ipsType_break">{wordbreak="$prev->mapped('title')"}</span> </a> </div> {{else}} <div class="ipsGrid_span6 ipsType_left ipsPager_prev"> <a href="{$movie->container()->url()}" title="{lang="go_to_category" sprintf="$movie->container()->_title"}" rel="up"> <span class="ipsPager_type">{lang="movie_back_to_category"}</span> <span class="ipsPager_title ipsType_light ipsType_break">{lang="$movie->container()->_title" wordbreak="true"}</span> </a> </div> {{endif}} {{if $next !== NULL}} <div class="ipsGrid_span6 ipsType_right ipsPager_next"> <a href="{$next->url()}" title="{lang="next_movie"}" rel="next"> <span class="ipsPager_type">{lang="next_movie"}</span> <span class="ipsPager_title ipsType_light ipsType_break">{wordbreak="$next->mapped('title')"}</span> </a> </div> {{else}} <div class="ipsGrid_span6 ipsType_right ipsPager_next"> <a href="{$movie->container()->url()}" title="{lang="go_to_category" sprintf="$movie->container()->_title"}" rel="up"> <span class="ipsPager_type">{lang="movie_back_to_category"}</span> <span class="ipsPager_title ipsType_light ipsType_break">{lang="$movie->container()->_title" wordbreak="true"}</span> </a> </div> {{endif}} </div> <hr class='ipsHr'> {{endif}} {{if $commentsAndReviews}} <a id="replies"></a> <h2 class='ipsHide'>{lang="user_feedback"}</h2> <div class='ipsMargin_top'>{$commentsAndReviews|raw}</div> {{endif}} </div> </div> {{if $movie->container()->club()}} </div> {{endif}} <div class="ipsClear ipsClearfix"></div> </pre> </div> <div class="ipsTabs_panel" id="ipsTabs_elTabBar_2_panel"> <pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9425_9" style=""> <span class="pln">Message</span></pre> </div> <div class="ipsTabs_panel" id="ipsTabs_elTabBar_3_panel"> <pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9425_9" style=""> <span class="pln">Message</span></pre> </div> <div class="ipsTabs_panel" id="ipsTabs_elTabBar_4_panel"> <pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9425_9" style=""> <span class="pln">Message </span></pre> </div> <div class="ipsTabs_panel" id="ipsTabs_elTabBar_5_panel"> <pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9425_9" style=""> <span class="pln">Message</span></pre> </div> </section> {{if \count( $movies )}} {{$rowCount=0;}} {{foreach $movies as $movie}} {{$rowCount++;}} <li class='ipsDataItem {{if $movie->unread()}}ipsDataItem_unread{{endif}} {{if method_exists( $movie, 'tableClass' ) && $movie->tableClass()}}ipsDataItem_{$movie->tableClass()}{{endif}} {{if $movie->hidden()}}ipsModerated{{endif}}' data-ipsLazyLoad> <div class='ipsDataItem_generic ipsDataItem_size3 ipsPos_top'> <!-- JWSE Rating Circle --> {{$fields = $movie->customFields();}} {{if $fields['field_5']}} <div class="jwse_ratingCircle jwse_ratingCircle-categoryList"> <svg viewBox="0 0 36 36" class="circular-chart circular-chart-categoryList orange" > <path class="circle-bg" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <path class="circle" stroke-dasharray="{{$fields = $movie->customFields();}}{$fields['field_5']|raw}, 100" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <text x="17" y="22.35" class="percentage">{{$fields = $movie->customFields();}}{$fields['field_5']|raw}</text> <text x="27" y="15.35" class="percentageSmall">%</text> </svg> </div> {{elseif $fields['field_5'] == 0}} <div class="jwse_ratingCircle jwse_ratingCircle-categoryList"> <svg viewBox="0 0 36 36" class="circular-chart circular-chart-categoryList"> <path class="circle-bg" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <path class="circle" stroke-dasharray="0, 100" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <text x="18" y="19.35" class="percentage unrated">Unrated</text> </svg> </div> {{endif}} {{if $movie->cover_thumb}} {template="coverPhoto" group="global" app="movies" params="$movie->cover_thumb, $movie->url(), $movie->title, 'medium'"} {{else}} <a class="sosMovieCover_medium" title='{lang="view_this" sprintf="$movie->title"}' href="{$movie->url()}"> <img src='{resource="movie.PNG" app="movies" location="front"}'> </a> {{endif}} </div> <div class='ipsDataItem_main'> <h3 class='ipsDataItem_title ipsType_center ipsType_sectionHead ipsContained_container'> {{if $movie->unread()}} <span><span class='ipsItemStatus ipsItemStatus_small' data-ipsTooltip title='{{if $movie->unread() === -1}}{lang="new"}{{else}}{lang="updated"}{{endif}}'><i class="fa fa-circle"></i></span>&nbsp;</span> {{endif}} {{if $movie->mapped('locked') || $movie->mapped('pinned') || $movie->affiliate || $movie->mapped('featured') || $movie->hidden() === -1 || $movie->hidden() === 1}} {{if $movie->mapped('locked')}} <span><span class="ipsBadge ipsBadge_small ipsBadge_icon ipsBadge_negative" data-ipsTooltip title='{lang="locked"}'><i class='fa fa-lock'></i></span></span> {{endif}} {{if $movie->hidden() === -1}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_small ipsBadge_warning" data-ipsTooltip title='{$movie->hiddenBlurb()}'><i class='fa fa-eye-slash'></i></span></span> {{elseif $movie->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 $movie->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 $movie->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 $movie->prefix()}} <span>{template="prefix" group="global" app="core" params="$movie->prefix( TRUE ), $movie->prefix()"}</span> {{endif}} <span class='ipsType_break ipsContained'> <a href='{$movie->url()}' class='' title='{{if $movie->mapped('title')}}{$movie->mapped('title')}{{else}}{lang="content_deleted"}{{endif}} {{if $movie->canEdit()}}{lang="click_hold_edit"}{{endif}}' {{if $movie->canEdit()}} data-role="editableTitle"{{endif}} {{if $movie->tableHoverUrl and $movie->canView()}} data-ipsHover data-ipsHover-target='{$movie->url()->setQueryString('preview', 1)}' data-ipsHover-timeout='1.5'{{endif}}> <span> {{if $movie->mapped('title') or $movie->mapped('title') == 0}}{$movie->mapped('title')}{{else}}<em class="ipsType_light">{lang="content_deleted"}</em>{{endif}} </span> </a> </span> </h3> <p class='ipsType_light'>{lang="byline_nodate" htmlsprintf="$movie->author()->link()"}</p> <div class='ipsType_richText ipsType_normal ipsSpacer_both' data-ipsTruncate data-ipsTruncate-type="remove" data-ipsTruncate-size="2 lines"> {$movie->truncated(TRUE)|raw} </div> <p class='ipsType_reset ipsType_light ipsType_blendLinks'> {{if \IPS\Request::i()->app != 'movies'}} {lang="in"} <a href="{$movie->container()->url()}">{$movie->container()->_title}</a> {{endif}} </p> {{if \count( $movie->tags() )}} <div class=" ipsSpacer_top"> {template="tags" group="global" app="core" params="$movie->tags()"} </div> {{endif}} <p class='ipsType_reset'> <ul class="ipsList_inline"> {{if $movie->runtime}} {{$runtime = \IPS\movies\Movie::getRuntime( $movie->runtime );}} <li class='ipsType_light ipsType_blendLinks'>{lang="movie_running_{$movie->type}"}: {$runtime}</li> {{endif}} {{$genres = \IPS\movies\Movie::getGenreName( explode( ',', $movie->genres ) );}} <li class='ipsType_light ipsType_blendLinks'>{$genres}</li> </ul> </p> </div> <div class='ipsDataItem_generic ipsDataItem_size8'> {{if $movie->container()->allowcomments}} <p class='ipsType_normal {{if !$movie->comments}}ipsType_light{{endif}}'> {{if $movie->comments}} <a href='{$movie->url()->setQueryString( 'tab', 'comments' )->setFragment('replies')}'> {{endif}} <i class='fa fa-comment'></i> {lang="num_comments" pluralize="$movie->comments"} {{if $movie->comments}} </a> {{endif}} </p> {{endif}} {{if $movie->container()->allowreviews}} {{if $movie->reviews}} <a href='{$movie->url()->setQueryString( 'tab', 'reviews' )->setFragment('reviews')}'> {{endif}} {template="rating" group="global" location="front" app="core" params="'large', $movie->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $movie->memberReviewRating()"}&nbsp;&nbsp; <span class='ipsType_normal ipsType_light'>({lang="num_reviews" pluralize="$movie->reviews"})</span> {{if $movie->reviews}} </a> {{endif}} {{endif}} <p class='ipsType_medium'><strong>{{if $movie->updated == $movie->submitted}}{lang="submitted"} {datetime="$movie->submitted"}{{else}}{lang="updated"} {datetime="$movie->updated"}{{endif}}</strong></p> </div> {{if method_exists( $table, 'canModerate' ) AND $table->canModerate()}} <div class='ipsDataItem_modCheck'> <span class='ipsCustomInput'> <input type='checkbox' data-role='moderation' name="moderate[{$movie->id}]" data-actions="{expression="implode( ' ', $table->multimodActions( $movie ) )"}" data-state='{{if $movie->tableStates()}}{$movie->tableStates()}{{endif}}'> <span></span> </span> </div> {{endif}} </li> {{endforeach}} {{endif}} <li class='ipsAreaBackground_reset ipsType_blendLinks ipsClearfix sosMovieIndexBlock sosMovieIndexBlockItem ipsPad_half ipsCarousel_item' data-ipsLazyLoad> <div class="indexBlock"> <div class='ipsPos_center'> <div class="sosMovieCover"> <!-- JWSE Rating Circle --> {{$fields = $movie->customFields();}} {{if $fields['field_5']}} <div class="jwse_ratingCircle jwse_ratingCircle-indexBlock"> <svg viewBox="0 0 36 36" class="circular-chart circular-chart-indexBlock orange" > <path class="circle-bg" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <path class="circle" stroke-dasharray="{{$fields = $movie->customFields();}}{$fields['field_5']|raw}, 100" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <text x="17" y="22.35" class="percentage">{{$fields = $movie->customFields();}}{$fields['field_5']|raw}</text> <text x="27" y="15.35" class="percentageSmall">%</text> </svg> </div> {{elseif $fields['field_5'] == 0}} <div class="jwse_ratingCircle jwse_ratingCircle-indexBlock"> <svg viewBox="0 0 36 36" class="circular-chart circular-chart-indexBlock"> <path class="circle-bg" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <path class="circle" stroke-dasharray="0, 100" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <text x="18" y="19.35" class="percentage unrated">Unrated</text> </svg> </div> {{endif}} <a href='{$movie->url()}' title='{lang="view_this_movie" sprintf="$movie->title"}'> <div class=""> {{if $movie->cover_thumb}} {template="bgCover" group="global" app="movies" params="$movie->cover_thumb, $movie->url(), $movie->title, 'big'"} {{else}} <a title='{lang="view_this" sprintf="$movie->title"}' href="{$movie->url()}"> <img class="bgMovieCover" src='{resource="movie.PNG" app="movies" location="front"}'> </a> {{endif}} </div> </a> <div class="jwse_MoviePhoto_Footer jwse_MoviePhoto_Footer-indexBlock"> {template="rating" group="global" location="front" app="core" params="'large', $movie->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $movie->memberReviewRating()"}&nbsp;&nbsp; </div> </div> </div> </div> </li> <li class='ipsCarousel_item ipsAreaBackground_reset ipsPad' data-ipsLazyLoad> <div class='ipsColumns ipsColumns_collapsePhone'> <div class='ipsColumn ipsColumn_medium ipsType_center'> <!-- JWSE Rating Circle --> {{$fields = $movie->customFields();}} {{if $fields['field_5']|raw}} <div class="jwse_ratingCircle jwse_ratingCircle-indexBlock jwse_ratingCircle-Featured"> <svg viewBox="0 0 36 36" class="circular-chart circular-chart-indexBlock circular-chart-Featured orange" > <path class="circle-bg" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <path class="circle" stroke-dasharray="{{$fields = $movie->customFields();}}{$fields['field_5']|raw}, 100" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <text x="17" y="22.35" class="percentage">{{$fields = $movie->customFields();}}{$fields['field_5']|raw}</text> <text x="27" y="15.35" class="percentageSmall">%</text> </svg> </div> {{else}} <div class="jwse_ratingCircle jwse_ratingCircle-indexBlock jwse_ratingCircle-Featured"> <svg viewBox="0 0 36 36" class="circular-chart circular-chart-indexBlock circular-chart-Featured"> <path class="circle-bg" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <path class="circle" stroke-dasharray="0, 100" d="M18 2.0845 a 15.9155 15.9155 0 0 1 0 31.831 a 15.9155 15.9155 0 0 1 0 -31.831" /> <text x="18" y="19.35" class="percentage unrated">Unrated</text> </svg> </div> {{endif}} {template="coverPhoto" group="global" app="movies" params="$movie->cover_thumb, $movie->url(), $movie->title, 'large'"} </div> <div class='ipsColumn ipsColumn_fluid'> <h1 class='ipsType_pageTitle ipsContained_container'> {{if $movie->mapped('locked')}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{lang="movies_locked"}'><i class='fa fa-lock'></i></span></span> {{endif}} {{if $movie->hidden() === 1}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{lang="pending_approval"}'><i class='fa fa-warning'></i></span></span> {{elseif $movie->hidden() === -1}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{$movie->hiddenBlurb()}'><i class='fa fa-eye-slash'></i></span></span> {{elseif $movie->hidden() === -2}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{$movie->deletedBlurb()}'><i class='fa fa-trash'></i></span></span> {{endif}} {{if $movie->canToggleItemModeration() and $movie->itemModerationEnabled()}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{lang="topic_moderation_enabled"}'><i class='fa fa-user-times'></i></span></span> {{endif}} {{if $movie->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 $movie->mapped('featured')}} <span><span class="ipsBadge ipsBadge_icon ipsBadge_positive" data-ipsTooltip title='{lang="featured"}'><i class='fa fa-star'></i></span></span> {{endif}} {{if $movie->canEdit()}} <span class='ipsType_break ipsContained' data-controller="core.front.core.moderation"> {{if $movie->locked()}}<i class='fa fa-lock'></i> {{endif}}<span data-role="editableTitle" title='{lang="click_hold_edit"}'><a href='{$movie->url()}'>{$movie->title}</a></span> </span> {{else}} <span class='ipsType_break ipsContained'>{{if $movie->locked()}}<i class='fa fa-lock'></i> {{endif}}<a href='{$movie->url()}'>{$movie->title}</a></span> {{endif}} {{if $movie->status == 'Released'}} {{$date = \IPS\DateTime::ts( strtotime( $movie->release_date ) );}} <span class="jwse_movieYear">( {$date->format('Y')} )</span> {{endif}} {{if $fields['field_4']}} <span class="jwse_movieYear">( {{$fields = $movie->customFields();}}{$fields['field_4']} )</span> {{endif}} {{if $movie->prefix() OR ( $movie->canEdit() AND $movie::canTag( NULL, $movie->container() ) AND $movie::canPrefix( NULL, $movie->container() ) )}} <span {{if !$movie->prefix()}}class='ipsHide'{{endif}} {{if ( $movie->canEdit() AND $movie::canTag( NULL, $movie->container() ) AND $movie::canPrefix( NULL, $movie->container() ) )}}data-editablePrefix{{endif}}> {template="prefix" group="global" app="core" params="$movie->prefix( TRUE ), $movie->prefix()"} </span> {{endif}} </h1> <div class="jswe_movieMeta"> {{$fields = $movie->customFields();}} {{if $fields['field_6']}} <span class="ipsDataItem_generic certification">{{$fields = $movie->customFields();}}{$fields['field_6']|raw}</span> {{endif}} <!-- Movie Release Date --> {{if $movie->status == 'Released'}} {{$date = \IPS\DateTime::ts( strtotime( $movie->release_date ) );}} <span class="ipsDataItem_generic">{datetime="$date" dateonly="true"}</span> {{endif}} <!-- Movie Genres --> {{$genres = \IPS\movies\Movie::getGenreName( explode( ',', $movie->genres ) );}} <span class="ipsDataItem_generic">{$genres}</span> <!-- Movie Runtime --> {{if $movie->runtime}} {{$runtime = \IPS\movies\Movie::getRuntime( $movie->runtime );}} <span class="ipsDataItem_generic">{$runtime}</span> {{endif}} </div> <div class='ipsType_richText ipsType_normal ipsSpacer_both' data-ipsTruncate data-ipsTruncate-type="remove" data-ipsTruncate-size="2 lines"> {$movie->truncated(TRUE)|raw} </div> <p class='ipsType_reset'> <ul class="ipsList_inline"> {{$runtime = \IPS\movies\Movie::getRuntime( $movie->runtime );}} <li class='ipsType_light ipsType_blendLinks'>{lang="movie_running_{$movie->type}"}: {$runtime} </li> {{$genres = \IPS\movies\Movie::getGenreName( explode( ',', $movie->genres ) );}} <li class='ipsType_light ipsType_blendLinks'>{$genres} </li> </ul> </p> <ul class='ipsToolList ipsToolList_horizontal ipsSpacer_top'> <li class='ipsPos_left'> <a href='{$movie->url()}' class='ipsButton ipsButton_light ipsButton_fullWidth ipsButton_small' title='{lang="view_this_movie" sprintf="$movie->title"}'>{lang="more_information"} <i class="far fa-play-circle"></i></a> </li> </ul> </div> </div> </li> /*** Custom Styles ***/ .jwse_note{ color: #294459 } .ipsBadge_positive{ --badge--background: var(--color-palegrey); --badge--color: var(--color-jwsecoral); } /*** Youtube Popup ***/ .JWSE_video-container { overflow: hidden; position: relative; width:100%; } .JWSE_video-container::after { padding-top: 56.25%; display: block; content: ''; } .JWSE_video-container iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .JWSE_play { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); text-align:center; height:170px; width:170px; background: rgb(41,68,89, 0.5); display:block; border-radius:100% } .JWSE_playBtn{ position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size:70px; opacity:0.9; color:white; display:block; } .JWSE_playTxt{ position: absolute; top: 80%; left: 50%; transform: translate(-50%, -50%); font-size:16px; color:white; display:block; } /*** My Rating Circle ***/ .jwse_MyReviewText{ position:relative; } .jwse_ratingCircle { float: right; position: absolute; top: 0px; right: 0px; z-index:999; width:100px; } .jwse_ratingCircle-indexBlock { float: right; position: absolute; top: 0px; right: 0px; z-index:999; width:50px; } .jwse_ratingCircle-categoryList { float: left; position: absolute; top: -5px; left: 112px; z-index:999; width:50px; } .circular-chart{ display: block; margin: 10px auto; max-width: 80%; max-height: 100px; background-color: var(--color-baseblue); border-radius: 50%; } .circular-chart-indexBlock{ max-width:100%; max-height:50px; top:-6px; right: 3px; position:relative; } .circular-chart-Featured{ max-height:50px; top:-5px; right: 17px; position:relative; } .circular-chart_unrated{ background-color: var(--color-palegrey); } .circle-bg { fill: none; stroke: #eee; stroke-width: 3.8; opacity: 0.3; } .circle { fill: none; stroke-width: 3.8; stroke-linecap: round; animation: progress 1s ease-out forwards; } @keyframes progress { 0% { stroke-dasharray: 0 100; } } .circular-chart.orange .circle { stroke: var(--color-jwsecoral); } .percentage { fill: white; font-family: Montserrat; font-size: 13px; text-anchor: middle; } .percentageSmall{ fill: white; font-family: Montserrat; font-size: 5px; text-anchor: middle; } .unrated{ font-size:5px; } /*** View CSS ***/ .full-width { width: 100vw; position: relative; left: 50%; right: 50%; margin-left: -50vw; margin-right: -50vw; margin-top:-15px; min-height:800px; background-image:url(https:{media="528"}); background-color: #294459; background-position:top center; background-repeat:no-repeat; background-size:cover; } .ipsPageHeader.ipsClearfix.ipsSpacer_bottom { margin-top: -200px; } .ipsColumn_veryWide { width: 300px; } .ipsBox.ipsResponsive_pull { background-color: rgba(255, 255, 255, 0.6); } .whiteBack { font-size: 18px; background-color: white; border-radius:7px; } .ipsCarousel_inner { height: 230px !important; } .sosMovieCover_large img { margin: 0px auto; width: 100%; width: -moz-available; width: -webkit-fill-available; width: stretch; max-width: 300px !important; max-height: auto; border-top-right-radius: 7px; border-top-left-radius: 7px; } .jwse_MoviePhoto_Footer{ background-color: var(--color-baseblue); text-align:center; padding:15px 0; border-bottom-right-radius:7px; border-bottom-left-radius:7px; color:white !important; } .jwse_MoviePhoto_Footer-indexBlock{ position:absolute; display:block; width:100%; bottom:0; z-index:999; padding: 3px 0; margin-bottom:-28px; } .jwse_MoviePhoto_Footer-indexBlock .ipsRating.ipsRating_large{ font-size:10px !important; } .ipsRating .ipsRating_mine .ipsRating_on .fa-star { color: var(--color-jwsecoral) !important; } .jwse_movieYear{ font-size:16px; } .ipsDataItem_generic{ display: table-cell; padding: 5px 15px 15px 0; vertical-align: center; } .ipsDataItem_generic.certification { border: 1px solid #666; padding: 0 5px; display: block; float: left; margin: 5px; } .jwse_movieSubtitle{ font-weight:600; font-style: italic; display:block; } .jwse_MyReviewFace{ background-image:url(https:{media="530"}); background-size:cover; width:100px; height:100px; float:left; display:block; } .jwse_MyReviewTextRating { float: right; margin: 45px; } .jwse_MyReviewText{ margin-left:130px; background-color: var(--color-baseblue); color: white; font-size: 16px; padding:10px 30px; position:relative; border-radius:7px; } .jwse_MyReviewText:after { content: ''; position: absolute; left: 0; top: 30px; width: 0; height: 0; border: 20px solid transparent; border-right-color: var(--color-baseblue); border-left: 0; margin-top: -20px; margin-left: -20px; opacity:0.4; } .jwse_movieDescription { margin-top: 20px; display: block; font-size: 16px; font-weight: bold; margin-bottom: -10px; } .jwseHeroContainer { position: relative; top: 0px !important; } .ipsCarousel .ipsCarousel_inner { height: 230px !important; } #elMoviesFeatured .ipsCarousel .ipsCarousel_inner { height: 322px !important; } #elMoviesFeatured .ipsCarousel_item{ background-color:#FFF2CC; } #elMoviesFeatured .ipsButton { background-color: var(--color-baseblue) !important; color: white; } I hope this will help get you started building your own Movie database. If you use this for your own website, please drop a link here, so we can see how it turned out. Also if you need help, just drop a comment here or in the forum and I will try my best to help you. Good luck and enjoy!
    3 points
  2. Back in December 2021 Atlassian announced that there would be some changes coming to Epics and in April we learned that Epics would see an update to how Jira manage Epic Name and Epic Summary. What does all this mean, and when can you expect to see the changes in your Jira instance? Let us dive into the information we have and see if we can answer those questions. Why is Epic changing? Having the ability to change, or rename rather, Epics have been requested for well over a decade and up until recently it has been ignored. It was only when SAFe started to become popular that Atlassian started to consider this, however: This is not the only change that SAFe have initiated and for everyone working in an enterprise company where small agile teams may not be the norm, this is a positive thing. I will talk more abut that in the future. So what is happening to Epics? The changes are pretty big from a technical point of view, but even from a consumer perspective, there are pretty big changes as well. The reason for this big change is that Atlassian is merging features from Advanced Roadmaps into the core Jira experience. In doing so, they change the old architecture quite a bit and things will certainly move round a bit as a result. Here is what will change: Move issue hierarchy in Advanced Roadmaps to your admin setting Rename Epics will reflect everywhere (no more language hacks) Change what Epic fields are shown in different areas New colors based on team based projects Epic link will become Add Parent and move to breadcrumbs Move issue hierarchy in Advanced Roadmaps to your admin setting The issue hierarchy that currently reside inside the settings for Advanced Roadmaps will move to the global Jira admin settings. You will find them under Issues by heading to: Settings > Issues > Issue hierarchy. This means that even if you do not have a Premium license, you will still be able to see these settings and when the Epic changes roll out you can edit the name of Epic from this area. Rename Epics will reflect everywhere (no more language hacks) This is a big one and the one that has been causing frustrations for many, many years. Once you rename the Epic in the Issue hierarchy, you need to rename the Epic issue type as well, and then all areas where Epic is referenced you will see the new name instead. So if you rename Epic to Feature, you will see Feature everywhere you see Epic today, including the Epic side panel in your backlog! Change what Epic fields are shown in different areas This is more of a technical change, but what it means is that what currently is shown in the backlog will see some changes. This could cause some issues that you might need to adjust when the change happen in your Jira instance. Epic name → Issue summary Currently, the board and your backlog show Epic Name and after the update it will instead show the Issue Summary. This make more sense, and I suspect that we will see the Epic Name removed in the future as Atlassian adjust Epics to be presented the same way as other issue types. If you have been putting different information in these two fields, then you need to update them to be the same before the changes happen. There are several solutions for this, but I think the solution Bogdan Gorka suggested in the Atlassian community using automation seems like a good way to do it. Epic status → Issue Status Category In the current solution you have Epic status, which is only available in the Epic panel, that define what Epics should be shown in the Epic Panel. In the new solution, the Epic panel will instead look at the Issue Status for each Epic to determine if it should be shown or not. If the Epic issue is in a green status (done), then it will not be shown, unless there are still open issues inside the Epic. Again, this makes sense as it shift Epics to behave the same way as other issue types, which align behavior in Jira. New colors based on team based projects This is something that comes from team managed boards, and I am guessing this is an architectural decision to have a uniform design that can be expanded later using the Parent Link feature from Advanced Roadmaps. In Theory, it would allow you to treat any parent link the same way, and you could set any story color to the issue. To make that useful, there would need to be a change to the Epic panel to show the levels above epic as well somehow. For now however this will just be a slight color shift when the upgrade comes as the upgrade will match the nearest color. Epic link will become Add Parent and move to breadcrumbs Perhaps the change that will confuse users the most is that the Epic link will become Add Parent and that this functionality will move from the standard locations to the breadcrumbs. This makes sense from several perspectives, but it will have a learning curve for many users. Changing the Epic Link to the Parent link from Advanced Roadmaps will once again align Epics with other issue types and allow for a uniform handling of the issues hierarchy. My Opinion This is a great change, not just because it will allow us to change Epics to Features (or whatever we want), but also from a technical perspective. It breaks down Epics unique behavior and replaces it with something that can scale, which is exactly what I have wanted for more than a decade. In the screenshot over the new issue view you also see that there is a pretty significant change to naming for subtasks as well where we now instead see "Child Issues". This is again a way to make way for a more flexible structure that is uniform regardless of level. This is absolutely a great step in the right direction from Atlassian and it makes me very happy to see.
    2 points
  3. Jira is a great tool, but it is often abused by trying to make it do more than it does. One such abuse I see a lot is excessively long workflows, which is usually introduced by management. This is problematic because the longer the workflow, the more you will need to go up in scope for each issue. This is because there is no 1-1 relation between the different areas. This is the most common cause for having huge stories with tons of subtasks. Before we go any further, let us first define what Jira is not. Jira is not a project management tool, but it can be extended using Advanced Roadmaps to provide some support for this. Jira is not a resource management tool, but it can be extended using Advanced Roadmaps to provide some support for this. Jira is not a deployment tool, but it can have features that can provide information about deploys. Jira is not a code repository tool, but it has features that can provide information about code. Now, let us take a look at a common process flow for a company. Based on this we can see that we can build something that support the Ideation where we make designs and prototypes. It would probably make more sense to just have a project with some tasks and then use Confluence, as much of what comes through ideation are never going to be realized. Definition is when we document more about the things that comes from ideation, and we would do that in Confluence most likely. Finance has nothing to do with Jira as we don't have connections to budgets, resources and so on. This is where Jira Align would be best suited. Specification is the requirement process and that happen in Confluence and then we create stories in Jira for things to prioritize based on cost vs value creation before we hand them off to Realization. Verification is usually a part of the realization flow, but more often than not you would use an add-on for it. Acceptance is either a separate activity that also use the same verification add-on as test, or it is just informally part of the workflow. Presentation is done completely separate and since we release groups of stories it rarely makes any sense to even have this in a workflow. This is what Releases/Versions are for in Jira. The whole maintenance bit where we deal with Incidents and problems is not connected to the realization flow, but it ties into the Specification. This, since the requirement, define what is an incident and what is not. So based on this, we see that there is a clear distinction for where Jira is designed to work, and that is between realization and acceptance. This is the optimal fit and then you can extend this using Advanced Roadmaps so you can connect Realization to Finance to get that full span all the way up to strategic level. What if I want to have a longer workflow? Nothings says you can't have more. Jira is very flexible and you can do pretty much whatever you want. Before you do, however, make sure you understand who you extend the workflow for and what it means. Extend with Deploy This is probably the most common extension as a lot of people are used to having deploy, or rather release, as a part of their physical boards. Adding this to the workflow will add a blanket step. By this I meant that this step has no real purpose other than to inform people outside the deployment process where particular code has been placed. Using the version field will actually give this information in a much more organized way. You can also connect your CI/CD tool to automatically connect release information to your stories, which is probably the best solution if you work with continuous deploys. If you add this in the workflow instead, then someone in the team will have to manually go over what stories are part of a package and then transition them one by one to next status at the time of the release. Considering that this step often happen well after the development, test and acceptance has been closed, it often happens that this is missed, leaving stories open long after they have been completed. Even if you remember it, you will still have multiple stories open in your boards, which will be a problem if you for example release infrequent or need to delay a release. If release is not done by the team, you will also have actions from another team in your board, which is a bit weird. If you must have a way to visualize where different code is, then you should always use version. This will clearly show what code package a story belong to and you can filter it and also have a dedicated section for managing versions that you should tie to release notes and so on. If you absolutely can not communicate where a story has been released without having an issue on your board for it, then I suggest you connect all the issues to a release ticket. That way, you can manage the release just like any other task. Adding this to your workflow means that you skip the version feature completely and since it is a blanket step it is prone to mistakes and lingering stories that very likely will mess up your statistics. If you have problem communicating releases to management and stakeholders, then I think you have bigger issues than your workflow... Extend with requirements Another common way to go is to use Jira as a requirement tool and by doing that extend the workflow to add more steps before realization. There are three major drawbacks to this, however: you need to have more fields added, requirements are not 1-1 with development, and Jira does not have version control or documentation capabilities. As the requirement process have a different ritual and workflow than development, we need to add more fields. While this is usually not a big issue, it will clutter the backlog, as well as the content of each story. Each Jira project would need multiple boards to handle the two processes so it does not add confusion for the people working in each of the two processes. Overall, it will add more clutter and add complexity to the work in Jira. In order to fix the second problem with requirements not being 1-1 with development, you would need to lift the abstraction level of the requirements. If you don't then you would make the user story 1-1 with development and that would mean that each development would have to be a subtask instead of a story. That makes it impossible for the developers to break out their own work further. This, however, often make each story an epic, which then means you no longer have any way to group several stories into a feature. Each story will also have quite a few development tasks compared to having multiple stories created for each user story. The first two issues you can probably deal with, but the fact that Jira does not have documentation capabilities or version control should be a dealbreaker for any real requirement analyst. Not having a way to structure your requirements so you can find them and maintain them is a big issue, and it is why most people choose Confluence or an add-on to manage requirements. Not having documentation capabilities is also a big issue since you will be limited in what information you can add to your story, and you will most likely feel that this is claustrophobic and difficult to get a good overview of since there are so many other things displayed in the story. Version control is a must for any requirement tool. This is for two reasons: you need to know what was agreed upon, and you must have a way to continue working. With version control, you can set points in time that you can restore to if needed. If you have worked with IT development for a while, then you probably have had a situation, or two, where unlocked requirements caused a lot of problems. This is especially true for design documents that are supporting requirements. While it is certainly not impossible to add the requirements part to your workflow, you are again adding steps from a completely different process that have little to no relation to development stories in many cases. This is because requirements can, and will, become obsolete or too costly to be picked up for development during the requirement process. Just like with deploy, you will add complexity to the workflow and the boards, and the team will have information in the stories that are irrelevant for their area of responsibility. The most common effect of adding requirement steps to a workflow is that there will be (at least) two boards. One for working with requirements and one for development. It is also very common that the stories will be larger to the point where work will mostly be done through sub-tasks to compensate for the lack of 1-1 relation. Extend with business processes This is not as common, but I see it from time to time. This is not a very good thing because the abstraction level goes way up and even the subtasks will be very large as the workflow starts on a project, or even program level. Even at the smallest amount of statuses for each step you will have a minimum of 14 statuses and I have seen workflows with up to 27 statuses. I do not think I need to tell you how painfull that was for everyone involved... The problem with having business workflows included in the build workflows is that the business workflow and the build workflow are completely different. The business workflow is all about financing value creation and the build workflow is about realizing the need that has been approved in the business workflow. This means that there are three hard decision points that can stop the progress of the issues: Ideation - Do we think the theory of value creation is motivated by the value the idea creates? This happens before we even consider looking into the issue further. Financing - What budget will the feature fit into? If it exist, do we want to prioritize it over other features and if it does not, how do we fund it? Specification - When we have broken down the feature so we know better how to realize it, is it still worth doing and if so should we prioritize it? While you certainly can extend the workflow and make a behemoth that will plague everyone in all aspects of your organization, you should consider the next aspects of mega workflows: Complexity and bloating. In order to support multiple processes in one workflow you need to extend the information in Jira as it is built for the built process. That means that you will need to add a lot of additional custom fields. This is bad because not only will it be much harder to work with a bloated issue where the majority of information will not be related to th work you do, it will also slow down the project a lot. This problem will be even worse when you consider the amount of people that will need to have access to the project. Since you involve everyone up to a strategic level it means that everyone from business level down to realization will need to be included and working in the same projekt. I have seen Jira projects where thousands of people have worked in multiple teams, all with cusomizations to the workflow and content leading to hundreds of custom fields. Loading times could be as high as 3-4 seconds in a DC setup with load balancing and anytime you tried to look at the workflow the browser would crash. Having the business processes in Jira is not a bad thing, but you should divide between business and build processes, preferably with Confluence as the middle layer to document requirements and tecnical solutions. Tools like Advanced Roadmaps or BigPicture can help extend the capabilities towards the business side as well. Will it stand on its own? One thing I always ask is if you can take the extended parts of your workflow and let it stand on its own, or is it actually a part of a singular process? I do this to see where people are in their mind so I understand how they think about the work. On one hand, I do understand the need to have an overview of the work from strategic level down to the smallest task in the operative level. I just don't think that Jira is the tool for that, because it is a task management system, not a program, or even project management tool. This is where Advanced Roadmaps and Jira Align comes in. These are the tools that should give you the overview (Advanced Roadmaps on Operations level and Jira Align on Strategic level). When the users understand that having multiple steps in a process, where the outcome is not 1-1 with the next step, might not be the best solution, then you can show them what a board will look like with all those steps. The number of columns alone should be enough to see that a long workflow like that is not very useful. I have seen a workflow that required 27 columns, which of course is not something you can actually work with. Use the correct tool instead The solution in most cases is to not add more steps to a single workflow, but to extend the hierarchy and use something like Advanced Roadmaps, or split the work into two, or more workflows that can exist independently in different Jira Project. In the series Setup Jira and Confluence - Introduction to setting up Jira & Confluence for success, that I will rewrite and make videos of in 2022, I will go over the tools and the setup in more detail. I hope you found this usesful, and as always if you have any questions feel free to ask. No questions are stupid and if there is one lingering in your head, you can be sure others have the same questios, so you would make them, and me, a favor by asking it
    2 points
  4. Today on January 15 Microsoft will start pushing the new Edge browser based on Chromium to Windows 10 users. It will be released to both home and pro windows 10 users. With this we will see a more dominant position for Chromium for web browsers, but we will also get a less cluttered and frustrating browser landscape. While reports of the new Chromium based Edge browser have been positive it remain to see what the actual response will be once it become available to the general public. I have a feeling it will be a positive response, especially with the possibility to use Chrome extensions now that the two browser share the same base. From a developer and test perspective this should be a great thing as it is most likely one less browser to worry about. It should be easier to develop with out the curse of IE that has plagued us since early 2000. It should also lead to faster support for new development features with less code bases to wait for full support. Since Edge now is downloadable also for macOS I will download it later and give it a go. If you want to download it and test it you can do so for Windows, macOS, iOS and Android. If you are on Windows 10 then you can just wait for the windows update to push it to your system, Just be aware that there are some key features still missing, like the browser history and extension sync between devices and the new feature Microsoft call Collections. It seems only Business customers can block this update. Microsoft posted about this ina blog post and have released a "blocker toolkit" that is intended for organizations who would like to block the automatic delivery of the Chromium-based Microsoft Edge. Overall I think this is a great thing and I keep getting impressed by the way Microsoft has reinvented themselves in a positive way since the "Steve Ballmer Era". I will get back to this once I have had the chance to test the new Chromium based Edge browser from Microsoft.
    2 points
  5. I often get questions on how I think the best setup for Jira and Confluence should look when I meet organizations. Because of that I will make a series of posts about this where I setup Jira and Confluence from scratch. This will include not just how I do things, but also the thought behind it. I hope you will find this useful for setting up your own setup in Jira and Confluence. This series will be divided into several parts. This is because adding every step in a single post would make for a very long blog post. Dividing into a series also make it easier for you to look at specific parts that is most interesting for you at the moment. The parts that I have in mind could change as I write the series, but at the moment the plan is this: Part 1: Defining the tools Part 2: Defining Jira Issue Types Part 3: Defining Jira Issue workflows Part 4: Defining Jira Screens & Custom fields Part 5: Defining Jira security & access Part 6: Defining Confluence Information Structure Part 7: Defining Confluence Requirement Templates Part 8: Defining Confluence Design Templates With the setup completed in Jira and Confluence, I will probably add a second series called "Work processes in Confluence & Jira - From Need to Deploy" where we go through how to use the setup from a practical point of view. It will be a more generic process, so it can be used in any methodology with some minor tweaks. If anyone wants, I could also add a post about how to use the power of Jira and Confluence for programmers without ever leaving your IDE. Is there anything you miss from this series that you feel I should add?
    2 points
  6. The first thing we need to do before we can actually build the setup in Jira and Confluence is to define the tools. What should be done in what tool. We also need to define how we will use the tools based on what need we have. This may sound easy, but it is actually a bit trickier than it sounds and it's the source of many failures when using Jira especially. Who are we building for? In our example, we will build a setup based on a development team. It is a traditional team that tries to adopt some agile methodologies. The company is medium-sized with dozens of teams distributed in several countries where waterfall methodologies are still the norm. Most development happen in projects, which cause some overlap, but overall this get done even if it is not always easy. Requirements have decent quality, but varies greatly between teams, and most work process related changes are driven by management and test. In short, it is a pretty common situation for many companies. There are some challenges, but the organization is moving towards a more agile and uniform way of working. There is a struggle over control and visibility because the teams want more freedom and the managers still want to feel that they have the control because they are still a bit too far away from the teams. The Areas of Responsibility In order to see what tool is best suited for what task, then we need to identify who do what. We start this by breaking down areas of responsibility so we know what areas we hand over responsibility to. In our setup, we identify the following areas: Business - This is where the need originates from. This is actually a whole process in itself, but we just consider the output as a responsibility area. This is represented by the Product Owner. Requirement - This is where the need is defined and translated to actionable information for the development team. We include design (UI/UX), technical design and non-functional requirements such as legal as part of this area as well. This is because they are supporting the requirement process. Development - This is where the need is realized in the form of code. Test - This is where we ensure the development have good quality. Acceptance - This is where business ensure that the need has been fulfilled. Doing so also conclude the legal agreement between business and development. Deployment - This is where the need is made available to the end users. Support - This is where feedback related to the need is managed. Since we are building in Jira and Confluence, all of these areas are not going to be represented due to the limitations and capabilities in those tools. In order to identify the best tool for the job, we identify the need for each area. Business - Jira Align This is a big area that are actually made up of multiple processes. In this area we need to be able to organize people, money and resources into initiatives that span the whole company. We need to follow up and see when cross initiatives have issues in order to mitigate. This area do not just deal with IT, but include things like marketing, product development, human resources and so on. Jira and Confluence are not a good match for this area. Instead, portfolio tools such as Jira Align or Portfolio for Jira are better choices. Requirement - Confluence This area work with documentation to break down a need into actionable items. Design is delivered in multiple versions and file formats. Technical design include flow charts and tabled specification of data. Legal and non-functional requirements are usually global, so we need to be able to link in from other locations. We also want to prioritize work, add estimations on multiple levels and eventually create work orders that can be traced back to the original need. Since a requirement is both a translation of a need to an actionable task and a legal agreement on what need to be done, we need to be able to control the requirement. This means that we need both version control to identify changes and the possibility to restrict editing when agreed upon. We will use Confluence for this area for the final documentation. We will also use Jira as an optional tool to drive the requirement forward until it is ready to be locked down in Confluence. Development - Jira Software This area work with code where they need to have tasks on what to do. This task is actually the work order, and as such it must be connected all the way to the need. This area also need to connect the work with the code in order to trace work to code packages. We need the ability to assign work, so someone is responsible to fulfill the need. We want to see what is ready to be worked on and if the code package is ready to be deployed. This means that we need to be able to see other areas as well in a workflow. For this purpose we use Jira and connect to the requirements in Confluence. The Development team will also use Bitbucket to manage their code. Test - Jira Add-On This area work with making sure that the code we produce are in accordance with the requirement and that it has good quality. We need to be able to create test cases for what to test and then a way to connect to series of test. These must be reusable so we can use them to make the same tests multiple times. We need a good way to report when something is not working so we can bring that back to the development team to be fixed. We need a way to get reports on progress and result of the tests. Jira and Confluence does not support this fully, so we will add an Add-On for this to extend that capability and connect it to the development tasks. Acceptance - Jira Add-On This area work with making sure that the need is fulfilled. It is testing in the same manner that the test area, but on a different level and with a different responsible group. We will use the same setup as for Test with the same Jira Add-On, but connect to the requirements instead of the development tasks. Deployment - Bitbucket Pipelines / Bamboo This area work with making sure that the code packages created by Development are moved to the different environments. In order to do this they need a way to deliver code between the environments. This in not something that we can do in Jira or Confluence. Instead, a tool like Bamboo or Bitbucket Pipelines will be used. We will however use the Release feature in Jira to connect the code base with the deploys for traceability. We will also use Confluence to document deployments to production for traceability. Support - Jira Service Management This area work with supporting the code that is available in production. This requires the ability to manage incoming support requests, identifying resolutions and when needed to create work tasks for different teams. Continuous communication with the reporter is a must, and there should also be a way to resolve repeating requests to reduce duplicated requests. For this Jira and Confluence is not fully what we need. Jira Service Management is a better option for this. As we can see from this our setup for Confluence and Jira will support Requirement, Development, Test and Acceptance. We will connect with Deployment as well, but the full capability will not be in our setup. Now that we know what we are going to support, then it is time to start looking at what work we actually do in each area so we can define the issue types. This we will go over in our next article: Setup Jira and Confluence for success - Part 2: Defining Jira Issue Types
    2 points
  7. In the previous article we discussed what tools we should use for what purpose. Now it's time to define the work we want to do in the different Areas of Responsibility. We do that by defining what different type of work we do in each so we can create a separate issue type for each type of work. This way we can separate work and can evolve the way we work in each through fields and workflows for example. Before we dig into that however we should first identify what issue types really are and how we should use them properly. The three levels of issues in Jira In Jira we have 3 levels of issue types. Each level is used for different purposes so it is important to understand what that purpose is so we can map our issue types to the right level. Epic - This is the highest level in Jira and it's purpose is to group and categorize the lower levels. In itself an Epic has no value and you can see it as a box or a rubber band that simply is used to group other items. The term epic means a story that extends over a long period of time or that it is something grand and impressive. This is also how it is meant to be used in Jira as a way to mark stories that are connected and span over two or more time periods. Standard Issue Type - This is the middle level in Jira and it's purpose if to act as the transitional item to indicate what responsibility area currently own the responsibility to do something. This type is the one that we design workflows for that are flow chart based and not in the form of state diagrams. We will cover this when going over workflows in a later article. Sub-Tasks - Within each responsibility area we have a need to break down the work so we can mark them as complete. These are referred to as producing items and unlike the Standard Issue Type we do not always use a tranistional workflow, but more of a task management flow of open, in progress, done .We will cover this when going over workflows in a later article. The majority of our issue types will fall into this category. Identifying the work that need to be done With the issue types identified we can now begin to define what issue types we need for our setup. We previously identified Requirement, Development, Test and Acceptance as our areas that use Confluence and Jira, so we will break down the work in those areas and see what we can come up with. Requirement Requirement: Standard Issue Type (optional) - If we want, we can use a separate issue type to act as the object which we work through the requirement process. This should be done in a separate project as it will contain a large number of unprocessed need. This would make managing the development projects less efficient, but we will discuss that in another article. Story: Standard Issue Type - This is the output from the Requirement process and while the name might make you think it comes from the fact that many requirements are written in the form or user stories. This is not accurate however as requirements can come in many forms and shapes. Story refer to the fact that we get the need explained to us as a story, which is because as humans we communicate in the form of stories. Design: Standard Issue Type & Sub-task - Design (UX/UI) can be done separate, which is why we have a Standard Issue Type for it. It can also be done as part of a requirement which is why we have a sub-task for it as well. In some cases we need to make adjustments in existing requirements and there we also use a sub-task connected to a Story for that purpose. Technical Design: Standard Issue Type & Sub-task - Just like with Design we have both a standard issue type and a sub-task. Technical Debt: Standard Issue Type - This is a rare issue type in many companies, but it is used when decisions are made that create technical debt or when clean up need to be done to optimize systems and data. These are IT driven stories in nature with the intent to make sure IT driven concerns are logged and prioritized alongside business need. It is also used to highlight decisions that will have a cost in the future. Development Development: Sub-Task - It may seem strange that Development only exist as sub-task, but the reason for that is that development only happen when there is a need for it. This need is in the form of a Story or Technical debt. That is why development only exist as a sub-task and it is used for writing code. Build & Configure: Sub-task - Again this is only available as a sub-task for the same reason as for Development. This issue type is used when there is no code related to the task, just configuration. It is also used to build systems such as servers that are again configurations or physical assembly tasks. Common tasks are upgrades or adding new subset of a system through configuration. Defect: Standard Issue Type & Sub-task - The default way to create defects is as sub-tasks connected to a story. This block the story from deployment as it can never be closed with open sub-tasks. The standard issue type is used when defects are found without direct connection to a development or when you want to break out a defect as a known defect, but still close the story for deploy. Defect can only happen before code is put into production. I usually rename the standard Bug issue type to Defect if possible, otherwise I create a new issue type for it. Incident: Standard Issue Type - Incident is used for defects that are found after the code is put into production. It is separate from defect in order to properly identify where a defect has been discovered as that can affect legal aspects. It is also used to allow proper focus and prioritization as production defects usually need high attention. All incidents are standard issue types as the stories they comes from have already been closed. Feature Toggle: Sub-Task (optional) - This is a bit of an odd addition lately and it act as a way to determine what code is in what code based, even if it is not activated. We will not dig to much into this one as it's an article in itself. It is just added in case you work with feature toggle in your project. Test & Acceptance Test / Acceptance: Standard Issue Type & Sub-task (optional) - This is again an optional issue type due to the fact that most test add-ons have the functionality needed to keep track of time and effort. In the event that you need a way to add time and effort outside the add-on, then you can create an issue type for this as placeholder for that information. Generic Epic: Epic - This is standard in Jira and it is used, as described above, to group standard issue types. Task: Standard Issue Type & Sub-task - Tasks and Sub-tasks are standard in Jira and they can be used for any task not defined in other issue types. This can be things like scheduling meetings, organize workshop or buy cake for the team. Color coding for visual guidance In order to make it even easier to identify what the different issue types will be used for I always create custom icons and color code them. This visualize the area of responsibility as well as the purpose of the issue types. My way to color code is based on color theories and my own preferences, so feel free to adjust if needed. Requirements - This is an interpretation of the business need to Development. I tend to color Business in blue/teal as corporate colors and Development as red. The combination of those two is purple, so I make the Issue types related to Requirements as purple. Development - This is the heart of the work flow. We tend to want incidents and defects highly visible as well, so we pick the color that match those requirements. We tie this into the traffic sign colors used in test and acceptance as well. This is why everything related to development is red. Test - This is where code is either allowed to pass to acceptance, or pushed back to development for further adjustment. It is something we want to make sure it has good attention and we also follow the traffic sign color schemes used in development and acceptance. this is why test is yellow, sometimes with a orange tint to tie it closer to development. Acceptance - This is where a need is given the thumbs up or the big GO. We use the traffic sign color scheme to signal this and for that reason Acceptance is green. I use icons that I feel is matching the issue type itself to further clarify purpose. I also use en inverted design to distinguish between standard issue types and sub-tasks. You can see some of the icons in the download section. You are free to use the icons in your Jira instance as they are created by me using the free version of fontawesome. Setting up Issue Types in Jira Now that we have defined the issue types and designed the icons it's time to set this up in Jira. I will set this up in my Demo Jira which is cloud based. If you use Server or Data Center version the way you set this up will look a little different, but the functionality will be the same. In order to get the new issue types into our project we will need to do three things: Create the new Issue Types Create a new Issue Type Schema and add the Issue Types to that Schema Assign the Issue Type Schema to our project. Create Issue Types In Jira Cloud we do this under Jira Settings -> Issues -> Issue Types. Please note that you need admin access for this step. Here you will see a list of the current Issue Types and in the top right corner you will have a button that say "Add issue type". Clicking on that will give you a popup where you can create a new issue type. Once you add the name and description of the new issue type, then you select what type of issue type you want it to be. You can not add an image at the time I am writing this, so you will get a generic icon for it when you click add. Once created you simply find it in the list and click edit to change the icon by uploading a new one. Next to the icon click "Select Image" and then "upload avatar" in the popup. Select a new image, close the poup and then click on update to save the new image. Create a new Issue Type Schema Under Jira Settings -> Issues -> Issue Type Schemes you find a list of the different issue type schemes you currently have in your Jira. In the top right corner you find a button with the text "Add Issue Type Scheme". Click that to create a new scheme. Please note that you need admin access for this step. When you create the scheme you add a name for the scheme, a description and then you drag the issue types you want to add to the scheme from the list on the right to the list on the left. Once you have done that you can select "Story" as the default issue type. This will make Story the pre-selected issue type when we click on Create in a project using this Scheme. Once done, click save. Add Issue Type Scheme to your project Go to your project and then click on project setting in the left menu. It should be at the bottom of the list of areas for your project, but if you can not see it then you may not have admin rights for your project and you need to get some help with this step. If you have access then in the project settings go to Issue Types. This view will show you the current issue type scheme and the issues included in that scheme. In the top right corner you will see a drop list with a cog wheel that say "Actions". Clicking this will allow you to edit the issues in the scheme, but we want the other function called "Use a different scheme". Simply select the Issue Type Scheme created earlier by first making sure you select "Choose an existing issue type scheme" and then the correct issue type scheme in the list below. Click OK and your project will now be associated with the new issue type scheme we created and with that we now have our new issue types. We now have the proper issue types we need to work, but in order for them to really useful we need to make sure we have workflows that match the work we do. This is what we will focus on in our next article: Setup Jira & Confluence for success - Part 3: Defining Jira Issue workflows.
    2 points
  8. We have all been in those interviews where the interviewer completely botch the interview. Weird IQ tests, being asked to do design or code on the fly or questions that are irrelevant to the work at hand. Sometimes it may even be that the interviewer is completely the wrong type for the interview and so on. In this article I will list my five top interviewer tips for interviewers to land that awesome employee contract for a senior IT or design person. Tip #1 - You are the one that have to sell the position Surprisingly many interviewers have the attitude that they are doing the potential employee a favor by letting them come to an interview. This may be true for other types of work, but professional IT people are in very high demand and for a senior person it really is their market, not yours. So if you come from another field where there are more people to hire than there are positions, you need to adjust that mindset. Otherwise, you will have a very hard time attracting people or worse, keeping them. People that are junior or new to the field often bend over backwards to land a job at a prestige filled company, but most seniors have already filled their CV/Portfolio and are done with the backfilling process where you endure crappy jobs just to build a CV/portfolio. These people know that they can afford to be picky, both in terms of job descriptions, workplace satisfaction and of course salary. You often compete with a dozen or more other companies for a senior employee. So rather than asking them to prove to you that they have what it takes, you need to prove to them that you are worthy of their time. That is quite different compared to dealing with junior employees or recruitment in other fields. Tip #2 Don't waste their time Unless you are offering someone's dream job that you know they will do anything to secure, don't waste their time. Asking a senior employee to do code tasks or design tasks to "prove" their worth is a sure way to turn many applicants away. The only people that will put up with that kind of nonsense are people that are unemployed or are still building up a CV/Portfolio. If you are looking for a senior employee, they will rarely put in extra work just to get to an interview. They have other options that don't require them to work for free anymore. Besides, they can easily pay someone a few bucks to do that assignment for them anyway, so it is kind of pointless from a validation perspective anyway. If you want to verify someone's skill, then just have another senior developer in the interview and have them go over some code or design together in a think aloud fashion. The other senior employee will pretty easily spot if the person know what they are talking about or not. Just be mindful that a lot of people get brain freeze during interviews, so this should not be your only interview point. IQ tests and personality tests are not uncommon either and I would strongly advise you not to use those. Most people don't like these kinds of test and they are likely to drop you as a potential employer because of that. They also do not really give you any information that is beneficial for your decision to employ or not. I kind of enjoy doing these, but that is because I already know my IQ is high and I have done a lot of personality tests so I know what to expect from them. Others don't like this kind of surprises as much though... If you want to have a psychological test that is actually beneficial, then you should look into the dark trinity traits, but then you are diving into a whole different set of pitfalls and problems. Tip #3 - Do your homework Just as the person you interview will do their homework to look up your company and it's values, you should also do your homework. I don't mean that standard homework to make sure the person you employ is not a hateful bigot or a criminal, you should also try to find out as much as you can about the person. Introverts and extroverts are quite different in terms of what they need and how the information you present should be done. Introverts often prefer more structure and information as bullet points with clear decisions and distinctions. Extroverts often like conversation and more visual information and so on. Some people are social hotspots and can chat up rocks, while others are less comfortable and prefer others to lead the conversation. Knowing what type you are meeting allow you to design the meetings accordingly. Knowing things like hobbies, passions and peeves can help you connect far easier, even with more closed people. It also offers a way to make the person you are interviewing to feel more familiar and comfortable. If you have someone close to you that know the person you are about to interview, talk to them and ask them about the person beforehand. This will help you tremendously in your interview. Tip #4 - Represent your culture I have seen this a few times when the person doing the interview is not a good representative of the company culture. It can be that you have a company that is all about the people in the company and making a difference in the world that has a recruiter that look and behave like a sneaky car salesman. Or it can be a sales oriented company that is all about winning and celebrating victories where the recruiter is all about caring and making the world a better place. The problem you face if your style does not match the company culture will most likely happen later in the process where the potential employee will meet other people in the organization. Or it will happen after employment which often lead to that person leaving very soon, or become a source of negativity in the work place. So make sure you adjust your interview technique and your look to fit the culture and values of the company you represent. As you are often the first point of contact, your impression will be crucial in landing the right kind of employees that will fit into the company's values and culture. Tip #5 - Don't brag about hiring people to fill a quota It's not that common for people like me that are white males, but I have seen it and heard about this way too many times. No one want to be told that the reason you are called to an interview is because of your age, gender, race or your sexuality. Also, no one like to hear that they did not get a job because another applicant was of the preferred "type" and you were not. I know that it is generally a good idea to make sure you have many types of people in a company and I love working with people from all walks of life, but never, ever, discuss this during interviews! It is offensive and in many countries even illegal to discriminate in such way. If you have two applicants that are equal in qualifications and you like both, then it is up to you which one you want to hire and adding more diversity is almost always a good idea. If however one applicant have better qualifications and you still hire someone else based on other things than their qualifications, then you are digging your own grave. Not only are you discriminating people, but you are also making the life of the person you hire difficult as other employees will notice that that person is less qualified than her role demands. This leads to friction and envy from other employees and the person you hired will suffer more from that feeling of being a fraud and not good enough. Be fair and hire the best applicant, regardless of other qualifications not related to work. There are plenty of amazing people of all "types" out there, if that is your goal. Don't be a bigot. This is not a tip, it's common sense. Or at least it should be. I know a lot of people that feel that they must change their name to get work due to bigotry. So if you discard applicants based on name or how they appear in a photo, then you are an idiot. And a bigot. Not only will you must definitely miss out on some amazing employees, you also put constraints on your business because you will miss so many amazing points of views and experiences. I have worked with people from all over the world and it has been the best experience you can imagine. I have worked with Jews, Muslims, Christians, Buddhists and other religions. I have worked with people from all political affiliations as well as people from the whole rainbow of sexuality (almost). I have worked with disabled people that have taught me more about my work than I could ever have imagined. I have worked with people from simple and poor backgrounds and people from rich backgrounds. I have worked with people that could not read a book if their life depended on it, but they can build anything with their hands. I have worked with people that could not handle a tool if their life depended on it, but who could solve any problem with their mind. Some of the most amazing people I have worked with have been from other countries such as Lebanon, Morocco, Vietnam, Syria, Germany, Croatia and India to mention a few. I have learned so much from these people that goes beyond work and as someone as work in a male dominated field I constantly have my mind blown by amazing women that can see things differently than I can. I can tell you from experience that being afraid to the point where you get prejudiced is normal. We all fear what we don't know or understand. The best way to break that is to take a leap of faith and get to know the things you fear and more often than not you will find that the prejudice you have are wrong. So don't be a bigot. Be Awesome.
    2 points
  9. In the coming months we will see some changes to the navigation in Jira and Confluence for the cloud versions. This after a round of feedback was done in July this year on the new experience. This change will roll out slowly and you can delay the change if you need time to prepare the users for the change. There has been some negative feedback regarding the current navigation in Jira and Confluence cloud as it is a bit difficult to use. This is why a new experience was designed and tested during the summer by 350+ users. The feedback on the new navigation was positive and so now it is going live to cloud users in a slow rollout. This is a rollback to the old navigation experience which is good as it will make the transition from Server and DC versions easier. I like the new apps and people sections in the navigation as well. That should make it easier to group things to keep navigation organized. The fact that Jira and Confluence now get a uniform navigation is also excellent. On the documentation page for the new Confluence navigation we find more details on the new navigation and it's design. App switcher - Switch to other Atlassian Cloud apps, like Jira, and go to recent Confluence spaces and Jira projects. Confluence logo and name - Click this to go to the Confluence Home page. Home - Begin your Confluence journey and reorient yourself when you’re moving on to a new piece of work by easily accessing the spaces, pages, and updates that are important to you. Recent - Access pages you’ve recently visited and worked on as well as pages saved as draft or starred. Spaces - Get to spaces you’ve recently visited and starred. People - Search for people on your site by visiting the people directory. Apps - Access content from apps like Analytics, Calendars for Confluence, or Questions for Confluence. Create - Click to create a new page, either blank or from a template. Search - Find pages, spaces, and other content. Notifications - Find out what's happening in Confluence and other Atlassian apps, like Jira. Help - Get online help, and find out what's new in your Atlassian Cloud apps. Your profile and settings - Go to or create your personal space, find out about the new Confluence experience, and adjust your Confluence settings. New Homepage In addition to the new navigation we will also get a new start page, or home page as it is called. This will appear in both Jira and Confluence cloud at the same time as we will see the new navigation. For Confluence it will give an overview over: Spaces - Get back to the spaces you care about, starred or recently visited Recent pages - Find pages you’ve drafted, recently published, visited, or starred All updates - View the updates across your site The Home page for Jira follow that principle, but is a bit slimmed down. I think there are more things that can go in this view and I hope we will see the same structure as for Confluence in the future. So instead of spaces we would have projects and then I would like to have a list of favorite boards somewhere.
    2 points
  10. In the last article we talked about defining workflows, so now it's time to talk about defining custom fields and screens. The custom fields is where most companies make many mistakes by trying to build new ways for Jira to work and screens almost no one seem to use. Let us change that, but first let us go over what these things are. We start with custom fields. Custom fields explained Custom fields are extensions of the data built in to Jira by default. This allow you to make adjustments to your Jira instance in the event that you need it. Custom fields comes in many pre-defined formats such as date fields, droplists, labels and even cascading select lists. In short you can model the data you work with pretty much any way you want. That is usually also the big problem with custom fields... Custom fields are defined just like most things in Jira using attaching the custom fields to a scheme. For custom fields this is called Field Configuration Schemes. These schemes connect a custom field configuration with the custom fields. This field configuration is what defines how each custom field should be used in a specific context. This allow you to have different behavior and configuration for the same fields. Custom fields - new data objects that extend the database model. Field configuration - Definition of configuration and behavior for custom fields. Field configuration schemes - map fields with field configurations. This is attached to a project to define that projects field configuration. Impact on performance Custom fields have an impact on performance. Period. Anyone who think otherwise do not understand how custom fields work or what impact they have on the system. Jira uses an indexing system that cache data in order to quickly find the relevant data you search for. For this Jira uses Apache Lucene, an open source high-performance, full-featured text search engine library written entirely in Java. Whenever you use a board, filter, dashboard or search in Jira you will use Lucene. Every custom field you add will grow the data exponentially in the index as it will be added to every single issue in Jira, even if that issue does not have any data in the field. Just by adding custom fields you will see an impact on performance and if you are careless about the size of your projects or do not manage your releases properly, then you can render the Jira instance almost unusable dye to loading time. Use custom fields with care! Mandatory fields impact Mandatory fields can be set in the field configuration. This will make a certain field mandatory that you have to fill in. This may sound like a great way to force the users to fill in the data you want them to, but in reality it is causing serious issues, especially when working with any form of integration. When you have integrations that send data to Jira, then do not use mandatory fields, or make sure that it is mandatory for all projects. Having multiple versions of what data is mandatory is a sure way to make integrations fail. This is because we set up a condition that say that unless this data is part of the data you want to submit, it will fail. The most common reason for using mandatory fields is because the teams do not understand why they should fill in the data. This is because of poor education on how the workflow should be done or because the way it is designed makes no sense to the people actually doing the work. This should be solved on a method and process level and not in the tool. Building new systems in Jira with Custom fields The biggest failure I see in Jira is when custom fields are used to extend the capability of Jira to something it is not built for. The most common thing I see is that a story is used as a business need and then kept all the way though deployment. I understand the thought behind it, but the execution will require dozens if not hundreds of new fields and it will just become a mass of data that is almost impossible to work with. Jira is first and foremost a development tool. It starts with a need that has been transformed into a work order for the development team. In many cases you also have test included in Jira. Often as a plugin or just in the workflow itself. That is all Jira should do as there are other tools that should handle business need, requirements as well as build and deployment. In large organizations this behavior is very dangerous. I often see people getting burned out or just give up an aspiration of coherent and logical way of working as the systems evolve to grotesque monsters no one really understand or want. Do not build new ways of working, stick to the standards that exists and you will be much happier. If you are going to extend the capabilities of Jira, then always use a Jira designer that can design the system globally for all users. NEVER allow teams and groups within the organization to design on their own, unless they are an isolated group that never need to work with outer teams or systems. That lead to a fragmented way of working that will cost millions to repair in the future. One field to "always" use Despite all the issues that comes with custom fields there is one field I always think makes sense. There are others of course because in all organizations there are a few fields that makes perfect sense and that really improve the way of working. One such field is "Team", but only if you are not using a plugin like Portfolio for Jira as that already have teams built in. The reason why team is useful in almost any scenario is because it allow you to work across Jira Projects in a standardized setup. This way we can avoid Jira projects with hundreds of people and instead work with boards. Using this field you can assign issues to teams rather than people allow for cross project assignments. We will discuss this more in future articles. Screens and why they matter Where custom fields are abused to the point of absurdity in many organizations, screens are barely used at all in my experience. This is strange as screens are very useful for making sure you are working with the right data at the right time. This will make things much easier when creating new issues or allow you to have certain data filled in during transitions in the workflow. Screens are divided into 3 views: View screen - The view used when you look at an issue i Jira. Edit view - The view showed when you edit the issue. Create View - the view when you create an issue. This allow us to focus the information in creation view for example to make sure that we only see the fields that we actually need, and then have all information in view and edit. When defining screens we have three parts to do so: Screens - Where we define what data should be available in the screen. Screen Schemes - Where we define what screens should be used for the View/Edit/Create views Issue Type Screen Schemes - Where we define what screen schemes should be used for the different issue types. One common use of defining screens is to define the create view for defects. This allow for a more focused defect report process where only the fields we really need is shown when creating the defect. Once created it will allow for all the same fields as a story since it is actually a story that describes a need that has yet to be addressed. Defining fields in a screen So, first we start by defining the screens. First we want to create a new screen for defects so we can define the fields we want when creating new defects. We go to Jira Settings ->Issues -> Screens where we find all our current screens. Then on the top right we can click the button to create a new screen. Add a name and a description and then click add. This will take us to the screen configuration page where we can define the data we want. Since this is a defect we want to capture the problem, where the problem occurred and also who should get the defect to look at. We define the fields like this: Issue Type* - Needed to we can set this as a defect. Reporter* - So we know who reported the defect for follow up. Summary* - The headline that summarize what the problem is. Environment* - Where was the defect found (test, pre-prod, dev and so on). This is needed for defects, but if this had been for production incidents we would not need this field as it is always in production. Affects version* - what code base or release is this related to so we know in what code we should look for it. Description* - This is where the defect is described. It should be steps to reproduce and expected results. Attachments - Pictures or videos that help describe the defect. NEVER upload office files here as you need to download them, which is a horrible way to work. Assignee - Sometimes used to assign a defect to a QA lead for example or a Project manager for attention. Responsible team - When the responsible team in known it can be added to the defect as well. Priority / Severity - How bad the defect is and not how soon it should be fixed. Components - what area of the system the defect affects. Labels - for labeling. Linked issues - If there are other issues that are relevant to the defect. Epic Link - If you use epics to group things. * These fields are mandatory. The rest can vary depending on your work process. It is important that these fields are also available in the default screen. If they are not present there they will not show as we do not have custom screens for the view or edit screens in this example. If you forget to add them, then do not worry. The data will still be there, but it will not show until you have added the fields to the screen. Defining views for Defects With this done our next step is to define the three views for defects so we later can attach it to the right issue type. We do this by going to Jira Settings ->Issues -> Screen Schemes and click on the button saying Add Screen Scheme. Add a name and a description, then set the default screen. This should not be the new screen we created as that one will only be used for the create action. You can change this later if you want. With that in place we come to the configuration page where we assign screens to the three actions we have (Create, View, Edit). By default you have one screen defined for all actions here, which is the one selected when creating the screen scheme. Now we will add our new screen to the create action and we do that by clicking the top right button that says "Associate an issue operation with a screen". Now you can select one of the three actions and a screen. We select the create action and connect that to our new defect screen and click add. Defining screen schemes to defects Now that we have the screen configured we need to add it to the correct issue and to do that we first need to create a issue Type Screen Scheme. We do this by going to Jira Settings ->Issues -> Issue Type Screen Schemes. Again we click the add button in the top right and add a name and description. This time we also can select a default screen scheme so we add the default screen sheme that will be used for all actions rather than the custom field we created for creating new defects. This can be changed later if you want. Once we have this created we get into the configuration screen. Here we will have a default screen scheme set for all issue types. Now we will need to add the new screen scheme we created for defects here. We do that by clicking the button in the top right that says "Associate an issue type with a screen scheme". Select the issue type Defect and then the screen scheme we created earlier and click add. ...and we are done. From now on we will always see the fields we have defined in the Defect screen when we create new defects. We can edit the fields as we see fit and it will not affect any other screens. Since we did not create custom screens for edit or view it means that we will see the same fields as for all other issues once the defect has been created. Focus information when needed As you can see it is not very complicated to add new screens, but they can add quite a bit of focus to your workflow. For this example we created a focused screen for reporting defects, but you will most likely want additional screens. One such screen that I almost always add is the Resolve screen that shows up when you resolve an issue. This is done by adding a trigger in the workflow that add a screen on an action as a popup. We will cover that setup in another post. I hope this was useful for you and in our next article we will discuss Jira security & access. In case you have missed any of the previous articles you can find them all here.
    2 points
  11. Almost every day I see someone posting about stress related illness. I meet people who I see are close to hitting the wall and burning themselves out on a regular basis and it makes me sad. Why do we struggle with this and for what purpose? How can you come back once you hit the wall and what do you do to come back? 25 years ago I hit the wall. I burned myself out and spent a year in rehab. It was so bad that I once went to the store to buy milk, but had to stop halfway home and call a friend to drive me home. I lived 10 minutes from the store. This experience is one of the worst I have ever experienced and the effect of it will never go away. This is why I react when I see people do the same stupid thing as I did and work yourself to the brink of exhaustion. No one will ever thank you for getting burned out and the road back is very long indeed. The worst part is that it is almost impossible for anyone to understand the way getting burnt out feel, so it is hard to find someone to talk to. How to burn yourself out Working hard is not the same as burning yourself out. Working hard is for me how you should work. It is when working hard under constant negative stress happen you risk burning yourself getting burned out. The tricky part with this however is that everyone have different things we respond to with negative stress. This makes it hard to know when you are risking your health and when you are just working hard. Stress is when we trigger our natural defense mechanism called "fight-or-flight" or stress response. This is one of our strongest subconscious mental responses and as such it is often something we are not even aware of. In short it is the way our mind defend itself from harm. What we protect ourselves from varies from person to person and it is triggered differently in different people. You can for example be a person that handle chaotic environments such as restaurants well, but get stressed over meetings with authorities or economic problems. Other people can be very sensitive to uncertainties and require structure and order to avoid stress. Since this is individual it is very hard to know when you are hurting yourself from stress, or even what type of stress that is harmful. There are symptoms however that you can look out for to help you identify these types of issues These symptoms are borrowed from WebMD. Emotional symptoms of stress include: Becoming easily agitated, frustrated, and moody Feeling overwhelmed, like you are losing control or need to take control Having difficulty relaxing and quieting your mind Feeling bad about yourself (low self-esteem), lonely, worthless, and depressed Avoiding others Physical symptoms of stress include: Low energy Headaches Upset stomach, including diarrhea, constipation, and nausea Aches, pains, and tense muscles Chest pain and rapid heartbeat Insomnia Frequent colds and infections Loss of sexual desire and/or ability Nervousness and shaking, ringing in the ear, cold or sweaty hands and feet Dry mouth and difficulty swallowing Clenched jaw and grinding teeth Cognitive symptoms of stress include: Constant worrying Racing thoughts Forgetfulness and disorganization Inability to focus Poor judgment Being pessimistic or seeing only the negative side For me the most common symptom is low energy. I call this "the hole" as it feels like you are trapped in a dark hole mentally. I get this quite often and that is because of my duality in personality where I am both extrovert and introvert. That means that I spend a lot of energy being extrovert at work, but then I need time for reflection for my introvert side to balance that out. Not having enough time for reflection at work is one of the most damaging things you can have. This is why the word NO is so important as well as the ability to dedicate time for reflection. Many organizations adapt a policy called No Meetings Day, which basically locks time from being used for meetings. This is so time can be spent on work and focused reflection. I have a theory that the reason why so many poor decisions are made in organizations is because everyone is constantly running. With no time to reflect decisions are made in the fight or flight mode. The problem with that is that when you are in that mode you suppress your prefrontal cortex. This area of the brain is often referred to the "modern brain" since this is where our ability to plan and take long term decision. This area is also responsible for empathy, which is why some managers appear to be assholes. How to avoid getting burned out Balance you energy The first thing I suggest you do right now is to make a list of things that give you energy and what drain you of energy. This is your balance list. This list will help you understand how you are doing mentally and you should update this often in the beginning. For me for example it cost energy to go to parties and I gain energy from writing or watching movies. For you it can be that it give you energy to go to parties and it cost energy to write reports. It all depend on your personality and there are no right or wrong answers. Do you have time to do your work? The second thing you should do is to look at your work. Do you have enough time to do your job? If the answer is no, then you will burn yourself out sooner or later. This is why many people in stressful jobs jump between employers as the time constraint trigger the fight or flight response. You either get into conflict with your employer or you leave if the stress get to much. So if you are in a situation when time is not enough, then you should talk to your employer to reduce the workload. If that is not possible, then find new employment if possible. Do not forsake reflection due to social demands Thirdly, and this is mostly for my introvert peers out there, make sure you do not forsake reflection in order to be socially accepted. I know many introverts who feel obligated to go to parties or be social when they should spend time reflecting. This is especially problematic when you are young or when you invest heavily into social media. Do not be afraid to shut down, even if you feel that people think you are weird. You are not weird and everyone that actually matter will not only understand, they will support you in that decision. Reflect and listen This is important, because it is when you stop to reflect that you can see the signs of you being in danger of burning yourself out. For me I write things like this and as I write I reflect on my own state of mind. For you it can be a walk in nature, mindfulness or just having a cup of tea on the terrace. Also listen to what others are saying. If people ask if you are ok, then stop and reflect instead of instantly respond that you are ok. I actually had members of my team ask me this a coupe of years ago and it led to me taking a few days off as I was getting burned out What do I do if I burn myself out? Ask for help! This one is the most difficult one for many. Asking for help is for some strange reason considered to be a weakness, but it is in fact a strength. The ability to ask for help prevent many, many issues in life and I think it is also a prerequisite for personal growth. So do not be afraid to ask for help if you start to feel some of the symptoms above. Go talk to a doctor and also consider talking to a therapist as the injury you have sustained is a mental one. Only the symptoms are physical. Accept that you are injured Being burned out is not something you can "get over" or "snap out of". It is not you being lazy or weak. It is a mental injury as well as a physical one as your long term exposure of stress hormones have damaged your central nervous system. You need to treat this as a physical injury and by this I mean that you need to give it time to heal. Just as you would not keep running on a fractured leg you should not continue working in the same stressful way with a stress related injury. Let it take the time it need for you to heal. Talk to someone who understand This is extremely difficult to do, not just for you, but also for the people around you. Many who get burned out are people that naturally work very hard. To these people it is difficult to handle the situation as it conflict with their self image. As people around you do not understand and tell you to "get over it", that affect your self image even more. For this reason you should find someone to talk to who has been in the same situation as you have. Understanding that you are not alone and that this is not something you can just get over will help with those feelings. Fill up on positives and cut away all demands Nothings feels as heavy as having things that you must do. It can become paralyzing to the point of giving you panic attacks just to meet someone for coffee. So try to cut away on all things that you feel must be done and focus on things that fill you with energy. If you feel like meeting someone or doing something social, make sure that you give yourself a way out if needed. When I meet with people who have suffered a stress related injury I always tell them that if they need to cancel they just send a text. No explanations or excuses are needed. I also advice them to tell others that they are meeting that if they can not make it they will send a text and that they don't need a text back. Most people will understand that and it reduce a lot of the stress. Drugs is not the answer! When stress related injuries happen your instinct is to avoid the pain it brings. Most turn inwards naturally and avoid people to protect themselves. For some this is either not enough, or they can not handle the social demands. So they turn to drugs to take the edge of the pain and to hide from the world in a sense. An increase of substance abuse, regardless if it is alcohol or drugs is not actually helping however. In fact since your mind is already experiencing depression and low self esteem combined with a reduced capacity of your rational thinking adding drugs and alcohol will only increase the risk of self damage such as suicide. Know that you will be ok Depression often comes with stress related injuries. Self doubt and the sense of being worthless is common. These things can lead to thoughts of suicide as you see no way out of your situation. This is why it is important to get help early because no matter how bad your situation is and how deep into the darkest corners you find yourself I promise you that you will be ok. Just like all injuries they will heal in time and just like all pain it can become unbearable if you carry it alone. So ask for help and know that the pain you go through is temporary and will eventually fade. You will be ok. Take care of yourself out there Getting burned out is becoming more common these days as we sacrifice empathy on the altar of efficiency. So take care of yourself and balance those energy levels. Talk about it often with friends and family and reflect on your current state of mind regularly. No one will ever thank you for working yourself into the wall. Surprisingly enough most people will appreciate you for saying no if you have to much to do. Saying no takes courage and it has nothing to do with weakness. You are an amazing person and you deserve a wonderful life. So take care of yourself and make sure you never hit that wall.
    2 points
  12. As I posted earlier I have been working on a section for people. It has been a fun experience to build this section and now I am ready to add this to the resources section. I have added a handful people that I think is amazing and I will continue doing this of course to present some of the most amazing people I know. Building this section was fun, but also quite educational as to how Pages from Invisioncommunity works. There are a few areas where it was a bit tricky to get the fields to work the way I wanted. For example I wanted the Personality types to be in a list, but I also wanted to link the types to a website where you can read more about them. This turned out to be easier than first expected, but it took some experimenting to figure out. The form for adding new people is still not very pretty, but I have not put any effort into changing that yet. Pages can have custom forms that you can assign to databases so I can make this much better in the future if I want. This is what I love about Pages and all other parts of the Invisioncommunity suite. It is so versatile and there is always new things to learn. So enjoy this new section on the site where I will continuously add amazing people. Some will have interviews and some will not, but you can rest assured that there will be new people added almost weekly. For me it bring in some of the most amazing people to my site and for the people I add I will do my very best to promote them and show the world what I see in them. As I know a lot of people this will be an endless work and I can not possibly add everyone I know due to time constraints. Me not adding you here does not mean I do not think you are amazing, only that time has not allowed me to add you here yet. I will add you as soon as time permits however, so please just be patient. Because you are amazing.
    2 points
  13. SAFe 5.0 can be previewed on a preview section of the Scaled Agile For Enterprise website. The suggested changes takes several steps forward towards a lean organization type of frame work. With that comes challenges for companies who see SAFe as a development framework and not an organization one. Will this make it easier or harder to have organizations adapt to SAFe? In SAFe for Lean Enterprises 5.0 comes with two new competencies and updated to five competencies. It also pushes pretty hard towards the business side with new business agility and SAFe for business teams. The biggest change is probably the merge of the teams level and the program level into one single level called Essential. While it is good to involve business more and I agree with the arguments for merging team and program levels I fear that this will make SAFe less attractive. That is because now it require a complete transformation of the company, while before you could have it living along side other frameworks. New Focus on Business Agility "Business Agility is the ability to compete and thrive in the digital age by quickly responding to market changes and emerging opportunities with innovative business solutions. It requires that everyone involved in delivering solutions—business and technology leaders, development, IT operations, legal, marketing, finance, support, compliance, security, and others—use Lean and Agile practices to continually deliver innovative, high-quality products and services faster than the competition." This sounds amazing, but I would say that less than 1% of all enterprise companies are even close to having a lean approach to their organization. Almost all companies have some areas, but as a whole I would say almost every enterprise company still have a waterfall and project based approach to their organization. Continuous Learning Culture New "The Continuous Learning Culture competency describes a set of values and practices that encourage individuals—and the enterprise as a whole—to continually increase knowledge, competence, performance, and innovation. This culture is achieved by becoming a learning organization, committing to relentless improvement, and promoting a culture of innovation." This is where I think many organizations dedicated to implement SAFe will get uncomfortable. Continuous learning cost a lot of money. We are talking several millions a year and a dedicated workforce for coaching and educating the organization. In most of the companies I have see this is very uncommon. Most if the time there is a small central team and then a multitude of initiatives throughout the organization that is not very structured or large enough to support everyone. I would love to see this implemented, but the cost for it will surely give a lot of resistance. Organizational Agility New "The Organizational Agility competency describes how Lean-thinking people and Agile teams optimize their business processes, evolve strategy with clear and decisive new commitments, and quickly adapt the organization as needed to capitalize on new opportunities." This makes sense, unless you consider that most enterprise companies are not Lean-thinking in their mindset and the sheer complexity of their operations makes Lean-thinking difficult. Again most companies still struggle with Agile where it mostly become an Ad-hoc stress trap due to poor adaptation and support. Again this require a huge commitment with an almost total organization transformation. The cost alone is monumental and the effort to move your entire organization, as well as changing the tool set, towards this goal makes it a big obstacle towards a SAFe implementation for many companies. If they can afford the cost and can see the change management through however this would be very interesting indeed. I know of no company today that works this way on an organization level and I am not sure it is even possible at an enterprise company. Team and Technical Agility Restructured "The Team and Technical Agility competency describes the critical skills and Lean-Agile principles and practices that high-performing Agile teams and Teams of Agile teams use to create high-quality solutions for their customers. The result is increased productivity, better quality, faster time-to-market, and predictable delivery of value." This description has been updated, but unfortunately it still does not define teams as product based. It also does not give any focus towards work satisfaction or team health, which is important factors to consider as some teams should not use an Agile methodology as it is damaging to their health. Not really much news here other than some updates to to the merge of team and program level. Agile Product Delivery Restructured "The Agile Product Delivery competency is a customer-centric approach to defining, building, and releasing a continuous flow of valuable products and services to customers and users. This competency enables the organization to provide solutions that delight customers, lower development costs, reduce risk, and outmaneuver the competition. The DevOps and Release on Demand competency has been renamed to Agile Product Delivery." Again not much news here. Some additional emphasis on customer centric design thinking, which is a bit amusing as most organizations are very far from customer centric in general and still very new to the concept of design thinking. Hopefully this will increase the demand for UX and CRO as user testing and A/B testing is a rather rare occurrence in today's enterprises. On the DevOps side I still do not see this working, even after 10 years of "implementation" on many organizations. In fact the trend is to separate dev and ops more than uniting them... Lean Portfolio Management Restructured "The Lean Portfolio Management competency aligns strategy and execution by applying Lean and systems thinking approaches to strategy and investment funding, Agile portfolio operations, and governance. These collaborations give the enterprise the ability to align strategy to execution, to meet existing commitments reliably, and to better enable innovation." This is the one thing I wish every enterprise organization would focus on right now. In to many organizations there are barely any strategic portfolios and contracts are all written as fixed price engagements that kill any chance of agility. There are few, if any, enterprise architects and overall the structure and control on portfolio levels are pretty bad. Not much news here, but an improved description and a slight alignment towards organization agility. Enterprise Solution Delivery Restructured "The Enterprise Solution Delivery competency describes how to apply Lean-Agile principles and practices to the specification, development, deployment, operation, and evolution of the world’s largest and most sophisticated software applications, networks, and cyber-physical systems. The Business Solutions and Lean Systems Engineering competency has been renamed to Agile Product Delivery" This section has been rewritten and again aligned a bit with the merge of teams and program. It still promote a microservices solution and continuous deliver system that is not really aligned with the complexity of large scale system development with multiple teams of different cadence. Despite that this is a good section with many good descriptions that would make life easier if followed. Lean-Agile Leadership Restructured "The Lean-Agile Leadership competency describes how Lean-Agile Leaders drive and sustain organizational change by empowering individuals and teams to reach their highest potential. They do this through leading by example, adopting a Lean-Agile mindset, and lead the change to a new way of working. The result is more engaged employees, increased productivity and innovation, and successful organizational change." This section is updated and rewritten a bit. The SAFe implementation roadmap has been updated a bit as well with 2 new courses. One for Lean Portfolio Management and one for Agile Product and Solution Management (APSM) Overall these are good changes, but I fear that the extent of the new changes can make organizations feel that SAFe is becoming increasingly difficult to implement. On the other hand it can also be the leverage certain part of the organization need to push the change that they see is necessary. It also makes it more attractive from a strategic perspective to have a framework that will actually transform all aspects of the organization. So there are some good things and some, potentially, bad things in SAFe 5.0. I like it, how about you?
    2 points
  14. Apple hosted it's special event on September 10th at the Steve Jobs theater at Apple Park in Cupertino, California. As expected it announced some new products, but as so often lately the presentation was dull and not very innovative. The iPhone 11 and it's iPhone 11 pro version quickly became a meme with the 3 lenses that I have to say I think look ugly. We had the same hardware improvements as always, but nothing really worth upgrading for. Especially if you prefer a system camera anyway. The new iPad is nice of course, but the big reason why it is interesting is because of the iPadOS coming at the end of September. Apple watch series 5 got it's always on functionality and we saw some new designs, but other than that it was not really anything I was excited about. With Apple Arcade and AppleTv+ we see Apple moving towards the game and movie industry. This could be nice, but the question is how they will fight giants like Steam and Netflix for example. For me I don't care about Apple Arcade as I don't play much these days. AppleTv+ I will get for sure, if nothing else to test out and see how it stacks against other newcomers like Disney+. Overall this special event was flat and boring. No new innovations and just the same old same of upgraded hardware. For me, even though I am a huge Apple fan, there is absolutely nothing in this event that i want to get my hands on. AppleTv+ would be the exception, but then again it is a service and not a device. this has been the case for quite a while now to be honest. While I did get myself an iPad Pro and the new apple pencil, the only things I look forward to lately are the software upgrades. I feel that you can really tell how Apple is slowing down it's innovation pace and I hope that will change soon. Here is the keynote in case you missed it.
    2 points
  15. Procreate 5 has been announced and with it comes some cool new features such as brand new cutting edge graphics engine and the new brush studio. I will try to tell you about five of them that I think is pretty cool and that i think will really make this upgrade worth while. Procreate 5 is built on a new graphics engine called Valkyrie. This will not only improve performance, but will also allow new features such as importing Photoshop brushes and customizable brush options. "the new cutting-edge graphics engine designed to elevate Apple Pencil and iPad Pro to new heights." Brush studio is a brush editing tool that will let users combine two brushes to create custom Dual Brushes, and features over 150 different brush settings. Users will be able to manually adjust the Apple Pencil’s pressure and tilt settings, and use the built-in texture generator to create their own brushes. This will give you get hundreds of different brush variables to play with. "Seeking the perfect brush to suit your style? Craft your own from the ground up. Using the built-in graphically accelerated texture generator, you'll be able to make the brush you need in seconds." Animations, which was introduced back in April is given an upgrade as well. Animation Assist has features like onion skinning, (which shows a faint outline of the previous layer, and instant playback. Colors are given some new dynamics options which will allow multiple colors in one brush stroke based on how much tilt and pressure is applied. We will also see support for CMYK, which is great for users working with print, and RGB ICC profiles. "Enjoy a level of control unmatched by any other platform. Transform colors on the fly with complete control using Color Dynamics and Apple Pencil's pressure and tilt technology." We will also see a new interface where the users will be able to move around the floating Color Picker and the transform and selection modes have been redesigned for better visibility on the canvas. There's also a new Clone Tool so you can duplicate textures. "Working in harmony with the entire suite of Procreate brushes, the new Clone Tool and CMYK support will change the game for concept artists and digital painters. There’s something here for everyone."
    2 points
  16. User Story Mapping is something that you probably have heard about if you work as product owner, business analyst or requirement analyst. It is a great tool for quickly break down customer journeys into system areas to map out work. The trick however is to use it where it is useful, which is in the business process when working with business analysis. I often see people presenting User Story Mapping as a requirement tool, or even something that is useful for development as a backlog tool. This is usually suggested by business analysts and managers such as product owners, which makes sense because it is for them User Story Mapping is actually useful. Unfortunately it makes no sense for a developer since code are not following a customer journey. For development, it is often very difficult to map things into a User Story Map. This is especially difficult for backend development where a lot of the work never even is seen by the end user. This causes some issues, not because User Story Mapping is bad in any way, but because it is defined on a user story level, when it is actually a process above the user story level. For me this process is best used on the business side to map out features by the product owner and the Business Analyst. This is where the User Story Map truly shines, making it easy to understand where in the customer journey certain features live in a visual way. That is not to say that it has no value to a developer, quite the opposite. It is very useful to understand what feature you are working on and where it fit in the flow of things. It is just not what is important for the development itself. When it comes to the development itself you still want to have well-defined user stories in the form of work orders and acceptance criteria. Each user story also need to be small enough to be possible to complete within one increment (one sprint) and in most cases you will find that the user stories presented in the User Story Map are way too big for that. I would actually suggest to not use the term user story mapping since that to me is misleading. I would instead call it User Feature Mapping to avoid confusion. Try it! You can use this purely analog by mapping up a customer journey on a white board and then use that with stickies, or you can take advantage of apps in Jira for example. My two favorites are Easy Agile User Story Maps for Jira by Easy Agile and Agile User Story Mapping Board for Jira by DevSamurai. Both are great tools that will give you the tools you need to get started with User Story Mapping.
    2 points
  17. Database relations in Pages is a very powerful way to bring content from different databases into entries of ther databases. In this example I will show you how I added the People in project area in My Projects. Creating the Database I started by creating a new database called "People Profiles". It will be a database just to hold the data as it will not be publicly presented anywhere outside of the My Projects area. just to make it easier to work with I created a page and added the database to it. I also made the page available only to me so I can use it, but it will not be visible to anyone else. Then I decided on the fields that I wanted to use. I want to use an image, so I activated the record image. Then I went through the data I wanted to add: Name Title Awesome URL Linkedin URL Instagram URL Twitter URL Homepage URL Working area These are the basic fields. I realized thad I will probably have multiple versions of the profiles depending on when in time I worked with them. To search for the correct profile I would need more information, so I also added a Long Title that i se as the title field. I also added a Notes field to act as the Content field in case I wanted to scribble something down for myself. Setting up a Database Relationship After I added a few profiles it was time to bring them from the People Profiles database into the My Projects database. The first step was to add a new field into the My Projects database of the type "Database Relationship". When creating that I have to choose what database I want to create the relationship to, so I selected People Profiles. In the settings for display options I set a template key so I can reference it later and I unchecked the show in listing template and show in display tempate. Adding the database relationship in the template As I have selected not to display anything in the listing or display templates nothing will happen yet. So new we have to add this to our template for My Projects so we can show the data where we want it. So we head over to Templates in Pages where I have created my own template set for My Projects. Adding custom fields are done by adding a code line. There are some variations on this, but I will not into it in this post. This is the code: {$record->customFieldDisplayByKey('your custom field key', 'display')|raw} As you only want to show this field if it is actually not blank, then we wrap that in a condition to only show if it is not blank: {{if $record->customFieldDisplayByKey('your custom field key')}} {$record->customFieldDisplayByKey('your custom field key', 'display')|raw} {{endif}} In my case I also wanted to add some styling and a header. So my code looks like this: <!- People in Footer --> {{if $record->customFieldDisplayByKey('project_people')}} <div class="project_people_footer"> <h3>People in the Project</h3> <div class='ipsGrid ipsGrid_collapseTablet'> {$record->customFieldDisplayByKey('project_people', 'display')|raw} </div> </div> {{endif}} Defining the output in basicRelationship Now that we have included the data from the People Profiles database you will see that it is just a link. We want to have more data than that so now we must define what data we want to pull from that database and how we want that to be displayed. We have to do that be editing a theme file called basicRelationship. So we head over to our Theme folder and click the "Edit HTML and CSS" icon to get into the templates. Then under CMS->Global you will find the basicRelationship file. This file is a bit tricky because it defines all database relations. In order for us to target specifically the data coming from People Profiles we need to figure out what ID that database has. We can do that from Pages under Content->Databases which will list all database. If you hover over the edit button over your selected database, then you can see the URL at the bottom of your screen with the ID of the database at the very end. With the ID defined we can add a bit of code to make sure we only target specific databases with our changes: {{foreach $items as $id => $item}} {{if $item::$customDatabaseId == 19}} <!-- People database --> {template="BasicRelationship_PeopleProfiles" app="cms" group="basic_relationship_templates" params="$item"} {{elseif $item::$customDatabaseId == 16}} <!-- Author database --> {template="BasicRelationship_author" app="cms" group="basic_relationship_templates" params="$item"} {{else}} <!-- all other databases --> <a class="ipsPages_csv" href="{$item->url()}">{$item->_title}</a> {{endif}} {{endforeach}} Creating Theme Templates instead of just using basicRelationship In this code I have added 2 databases (19 and 16) and then I have a fallback for all others at the end that will show the default link. While it is very possible to add the code directly into this template I have used a different approach and instead created separate templates outside and then referenced them in the basicRelationship. This way I can work on the content for each database in a more focused way and the basicRelationship becomes a bit easier to overlook. In order to create a new template you go to Create New at the bottom of the template listings. Select HTML template and then fill out the form accordingly. Name - the name of the template. Variables - We add $items here since that is what is defined in the foreach loop in basicRelations. Location - Here we select front to place the template in the correct section. Group - I suggest you create your own group here so it is easier for you to find later. Application - Here we select Pages If you have done this as I have then you will have your new template located under CMS->Front->basic_relationship_templates. If you have selcted another group, then that is where you will find it instead. Adding data to the theme template Now that we have a template for our connection between the databases, then we can start adding the data to it that we want to show in My Projects. This is done in a very similar way as when we add the data to the entry templates. Instead of using $record however we use $item: {{if $item->customFieldDisplayByKey('your custom field key')}} {$item->customFieldDisplayByKey('your custom field key', 'raw')} {{endif}} As I added the default record image that is called a bit differently: {file="$item->_record_image_thumb" extension="cms_Records"} You can also reference the title field and the content field with a shorter tag: {$item->_title} {$item->_content|raw} In my current code I have nested the fields a bit and I have used the field for working area pretty sloppy, but I think you get the general idea. <div class='ipsGrid_span2 people-profiles_card'> <div class="people-profiles_image {{if $item->customFieldDisplayByKey('working-area')}}{$item->customFieldDisplayByKey('working-area', 'raw')}{{endif}}_image"> <img class="ipsImage {{if $item->customFieldDisplayByKey('working-area')}}{$item->customFieldDisplayByKey('working-area', 'raw')}{{endif}}" src="{file="$item->_record_image_thumb" extension="cms_Records"}" class=" {{if $item->customFieldDisplayByKey('working-area')}} {$item->customFieldDisplayByKey('working-area', 'raw')} {{endif}} " /> </div> <div class="people-profiles_Name"> {{if $item->customFieldDisplayByKey('people-profiles_Name')}} {$item->customFieldDisplayByKey('people-profiles_Name', 'raw')} {{endif}} </div> <div class="people-profiles_Title"> {{if $item->customFieldDisplayByKey('people-profiles_Title')}} <span class="{{if $item->customFieldDisplayByKey('working-area')}}{$item->customFieldDisplayByKey('working-area', 'raw')}{{endif}}">{$item->customFieldDisplayByKey('people-profiles_Title', 'raw')}</span> {{endif}} </div> <div class="people-profiles_links"> {{if $item->customFieldDisplayByKey('people-profiles_Awesome')}} <a href="{$item->customFieldDisplayByKey('people-profiles_Awesome', 'raw')}" class="people-profiles_Awesome"><i class="fas fa-id-card"></i></a> {{else}} <i class="fas fa-id-card"></i> {{endif}} {{if $item->customFieldDisplayByKey('people-profiles_Linkedin')}} <a href="{$item->customFieldDisplayByKey('people-profiles_Linkedin', 'raw')}" class="people-profiles_Linkedin"><i class="fab fa-linkedin"></i></a> {{else}} <i class="fab fa-linkedin"></i> {{endif}} {{if $item->customFieldDisplayByKey('people-profiles_Instagram')}} <a href="{$item->customFieldDisplayByKey('people-profiles_Instagram', 'raw')}" class="people-profiles_Instagram"><i class="fab fa-instagram-square"></i></a> {{else}} <i class="fab fa-instagram-square"></i> {{endif}} {{if $item->customFieldDisplayByKey('people-profiles_Twitter')}} <a href="{$item->customFieldDisplayByKey('people-profiles_Twitter', 'raw')}" class="people-profiles_Twitter"><i class="fab fa-twitter-square"></i></a> {{else}} <i class="fab fa-twitter-square"></i> {{endif}} {{if $item->customFieldDisplayByKey('people-profiles_Homepage')}} <a href="{$item->customFieldDisplayByKey('people-profiles_Homepage', 'raw')}" class="people-profiles_Homepage"><i class="fas fa-home"></i></a> {{else}} <i class="fas fa-home"></i> {{endif}} </div> </div> This guide should help you to bring in the data from any database into another database with the styling of your choice. I know this is a pretty short and not very detailed guide, but I hope it was useful anyway. Please add questions and I will improve upon the guide where I am jumping a bit to fast. Happy coding!
    2 points
  18. Requirements in Jira has long been a wish for many Jira users. Many have tried it and many have failed because Jira is not designed to work with controlled requirements. Because of this I have always suggested to work with requirements in Confluence, but with RTM from Deviniti, I might change my mind about that. I am a certified requirements analyst and as someone who works in all positions in a development process I know the importance of good requirements. While good communication is key for a good workforce it does not remove the need for controlled requirements. In Jira you can setup requirements as part of a workflow or as a separate issue type, but the experience is far from controlled. When I saw RTM from Deviniti for the the first time I was intrigued. It looked very similar to older systems like HP QC (now Micro Focus Quality Center) in it's structure. I installed it on my Jira instance and have played around with it for a while now. So far I am very impressed, especially since Deviniti have confirmed that some of the things I miss are in their roadmap. Requirements & test management in Jira RTM comes with five main modules, plus a bunch of reports. The modules are all customizable so you can define what issue types you want to map with what module. This is great because that way I can map towards already existing issue types, or custom make new ones if needed. For Defects I can even map multiple issue types, which is great if you like me use both Defect and Incident. This is also possible for Requirements which is necessary for working with multiple types. In my setup I only have functional and non-functional requirements, but you can add more if you like. The RTM Requirements module This is the exciting part of RTM! Working with requirements in RTM feels just like in ALM or other older systems, but with the ease and great usability of Jira. You can quickly create a tree structure and rearrange the tree is easy and fast with drag and drop. Existing requirements can be imported using the import function that is located in the left column where the tree is under the three dots. You can customize the tree structure in the RTM configuration that is located under project settings. There you can select if you want auto numbering and if you want the issue number to be written out or not. While we still miss a few things (see below) this is really a great start. It is by far the best requirements app for Jira I have seen so far. The RTM Test Cases Module Test cases are reusable tests with test steps that you use in the test plans to perform tests. RTM is competing with some big shoes in the test department, but they hold up pretty good here. I like the configuration for the test steps that you have in the RTM configuration under project settings where you can modify the columns for the test steps. This allow me to define what columns I want with ease. You can also select what the starting status is, but right now you can not add or edit the standard statuses. As with all modules you can import existing test cases using the import function above the tree structure where you see the three dots. The RTM Test Plans Module Test plans are equally easy to create and manage. In the test plan you connect test cases and test executions to get the full overview of the test scope and result. In the overview of the test cases connected to the test plan you can change the order, create new test cases or add test cases. To me this gave a very good overview of the scope, what was actually tested and I have plenty of room to describe the test plan without cluttering things up. The RTM Test Executions Module The test executions module allow you to quickly execute test plans and you can structure them the same way as all the modules. You can re-execute test executions, which then create a new test execution that you can place in a folder directly. This is great for example smoke test that you want to run frequently. There are some things I think can be improved visually, but overall this works pretty well. The RTM Defects Module The Defects module give you an overview of the defects in the projects. If you are adding RTM to an existing project where you already have defects, then you can easily import them using the import function. It is a bit hidden, but you find it in the left column under the three dots. The Good and The Bad There is not a whole lot to say on the negative side of this because it works very well. I tested this with Portfolio for Jira and the result is amazing. You easily get the structure you need for a full parent-child tree structure and the modules in RTM provides a great focus area for requirements and test. Version management What I miss are the version management that absolutely must be there. This is one of the things that are on the roadmap for the future. Hopefully this can tie into some form of approval process to better control changes. This is important for large organizations, but also for non-functional requirements that usually are global. Acceptance Criteria This is also a thing that is currently missing and also on the road map for future updates. If these could work the same way as the test steps work today, or maybe even having them as separate entities like test cases, then this would be amazing. This would allow for really powerful connectivity between not just requirements and test, but also defects and requirements. Import from other projects One of the things I miss is the ability to import from other projects. This is especially useful for non-functional requirements that are often shared between many projects. I would like to be able to import these as read only so I can have them as part of the requirement structure, but not be able to edit for example legal requirements. I can make a requirement in the existing project and link for now, but I think import as read only would be a better solution. Quickfilters in Defects module The only thing I miss here is the possibility to add quick filters, just like in boards. This would allow me to better use this view based on my need. I found myself jumping to filters a few times to get a more focused view and with quick filters that would not be necessary. The Module Templates While the modules are not terrible in terms of visual they could improve a bit. Things are a bit cluttered and the tabs are not super obvious at first glance. Here I would like to see a slight update using Jira standards, but we also need templates to add custom data for example. Based of the structure with tabs I think it would be possible to use the standard view design and just split it in the different tabs for starters. Better integration with Confluence If I add a Confluence link directly into the issue itself, then it show up as just Wiki page. This is not very good as I want to see the name of the page so I know what page it is referring to. Other Apps support Right now I can't add other apps to the modules view, which is a bit of a problem for the requirements part especially. I often add designs using Invision prototypes and if that is not shown in the modules view, then I have to jump back and forth between the issue view and the module view. That is not good and I think this need to be added to the modules template designs. Test Executions UX and Visuals The test executions are a bit clunky when it comes to the UX. I find myself getting a bit lost as things happen without me being in control and I sometimes end up in the test issue view instead of the execution view. I would like to keep the execution summary in the header so it remain consistent and so I can come back to the execution overview instead of the issue view. The statuses are not tied into a workflow, which means that you need to skip back and forth to manage your test executions. A mapping in the settings would be nice so I can map execution statuses to workflow statuses. Also, there might be a good idea to separate statuses from resolutions to keep in line with Jira standard. Colorful folders This is just a cosmetic thing, but I like to be able to differentiate folders using colors and icons. This makes it a whole lot easier to quickly find the correct are, especially for large trees that often occur in requirements for larger systems. it would be very nice to have the option of selecting colors of the folders and special icing on the cake if I can select an icon as well. It would be easy to just use FontAwesome for example and allow the user to pick the icon from the font set. My opinion on RTM from Deviniti This is by far the most complete solution for a functional way of working with requirements and test in a controlled way. It still need some work here and there, but I will recommend this to all my clients as it stands today. Even without version management or dedicated sections for acceptance criteria it is still far, far better than what most people have today. When this product get more polished I think this will be one of the must have apps in pretty much every Jira instance. I like it. A lot.
    2 points
  19. Adding content using tabs in Invision Community Pages is one of the most common questions I get about this website. It is something that is really not that complicated, but it is a bit tricky to find the information. In this article I will show you how I created my tabbed blocks so you can use it on your own page. While you can add this directly into a template if you want, I prefer to build this using blocks. This way I can control the content in more detail and it makes my life easier since I have different blocks for each content. So I first start with creating a block that will hold the tabs themselves. In this block I will reference in other blocks to display the content for each tabbed content. To create a new block you go to Pages -> Page Management -> Blocks. There we create a custom block with manual HTML as the content editor. Give the block a name and a template key. I also have organized my templates so that my Tabs are in a separate category, which help making things a little easier to find when you have a lot of blocks like I do. In the content section you can now add the HTML and template logic to create the tabs section. The information on how tabs work can be found in the documentation here: https://invisioncommunity.com/4guides/themes-and-customizations/javascript-framework/using-ui-widgets/ipsuitabbar-r66/ <div class="ipsTabs ipsTabs_contained ipsTabs_withIcons ipsTabs_large ipsTabs_stretch ipsClearfix" id="elTabBar" data-ipstabbar="" data-ipstabbar-defaulttab="1" data-ipstabbar-contentarea="#" data-ipstabbar-updateurl="false"> <a href="" data-action="expandTabs"><i class="fa fa-caret-down"></i></a> <ul role="tablist"> <li> <a href="" role="tab" id="1" class="ipsType_center ipsTabs_item ipsTabs_activeItem" aria-selected="true"> <i class="far fa-newspaper"></i> Management Articles </a> </li> <li> <a href="" role="tab" id="2" class="ipsType_center ipsTabs_item"> <i class="fas fa-comment-alt"></i> Management Discussions </a> </li> <li> <a href="" role="tab" id="3" class="ipsType_center ipsTabs_item"> <i class="fas fa-id-card"></i>Management People </a> </li> <li> <a href="" role="tab" id="4" class="ipsType_center ipsTabs_item"> <i class="fas fa-cloud-download-alt"></i>Management Downloads </a> </li> <li> <a href="" role="tab" id="5" class="ipsType_center ipsTabs_item"> <i class="fas fa-play-circle"></i>Management Videos </a> </li> <li> <a href="" role="tab" id="6" class="ipsType_center ipsTabs_item"> <i class="fas fa-link"></i>Management Links </a> </li> </ul> </div> <section class="ipsTabs_panels ipsTabs_contained"> <div id="ipsTabs_elTabBar_1_panel" class='ipsTabs_panel'> {block="latest_management_articles"} <a href="https://jimiwikman.se/blog-articles/blog/professional/management/">Read All Articles</a> </div> <div id="ipsTabs_elTabBar_2_panel" class='ipsTabs_panel'> {block="management_forum_topics"} </div> <div id="ipsTabs_elTabBar_3_panel" class='ipsTabs_panel'> {block="awesome_management"} </div> <div id="ipsTabs_elTabBar_4_panel" class='ipsTabs_panel'> {block="latest_management_downloads"} </div> <div id="ipsTabs_elTabBar_5_panel" class='ipsTabs_panel'> {block="latest_management_videos"} </div> <div id="ipsTabs_elTabBar_6_panel" class='ipsTabs_panel'> {block="latest_management_links"} </div> </section> In this code we have the top section defining the tabs themselves. Each tab has an ID that we use in the bottom section to determine what content we show in each tab. This is done in the bottom section by adding the ID to the div ID "ipsTabs_elTabBar_HERE_panel". So for example we can add the ID of 1 to show the content for the first tab by adding the number 1 to that ID: "ipsTabs_elTabBar_1_panel". What I have done for my setup is to add blocks rather than content directly into the bottom section. For me that make things easier to manage, but you can add it directly to your block if you prefer that. In my code here I am using FontAwesome to create the icons for the tabs. You can just take those out if you prefer not to have icons in your tabs. Once this has been done, then you have a block that you can add to any page, just like other blocks. You can see this example live here: https://jimiwikman.se/management/ I hope this is helpful and if you have any questions on how this works or how to modify it, feel free to add a comment. I will do my best to answer as always. If you have other questions on Invision Community, please use the discussion forum.
    2 points
  20. The requests to get Portfolio for Jira for Cloud users have been loud and finally Atlassian released a Cloud version. They also made a very odd choice to rename Portfolio for Jira to Advanced Roadmaps and place it behind the Cloud Premium barrier. Portfolio for Jira has long been the better choice for Jira Server and Jira DC users. The features have been perfectly suited for managers to keep an overview over large programs and initiatives with relative ease. As such it has been the envy of Cloud users for years and it comes as no surprise that Atlassian would port this to Cloud given their focus on the cloud platform lately. Renaming Portfolio for Jira is also no surprise as it confuse managers with two portfolio products where the high level Portfolio tool Jira Align is the product Atlassian seem to want to focus on. Renaming it to Advanced Roadmaps is however a very strange choice as it is not a simple roadmap tool. It also make the naming confusion shift from Portfolio to Roadmaps as Cloud users have been using the limited Roadmaps feature for quite some time. The new Advanced Roadmaps is only available for Cloud Premium users. This makes sense as Atlassian want to push users into their new price model. Currently there is not much that would warrant double the price for Cloud Premium so Atlassian need something that is enticing enough for users to make the shift. Advanced Roadmaps could be one of those features, but they need more as Advanced Roadmaps cost $2.3/user and month at it's lowest level and Cloud Premium cost an additional $7/user and month. Feature wise Advanced Roadmaps is still great with the two main selling points of great overview and the ability to scale the issues with more levels. Here are some of the selling points from Atlassian: With the changes coming to Roadmaps where all projects will get them, and not just Next-Gen projects, combined with the promise that Advanced Roadmaps will somehow be connected to a more comprehensive whole this could be a pretty good thing for Cloud Premium users. Adding Advanced Roadmaps to Cloud Premium will now add the ability to scale issue types beyond the standard 3 levels, which is something people have asked for for a very long time. Will it be enough to warrant the high price tag for Cloud Premium? I doubt that as Advanced Roadmaps is only really useful when you pass a certain number of teams. Doubling the price tag will probably discourage most low to mid-range clients. The fact that you can only have a 7 day test version and that you need to setup a new cloud instance to even test this if you are on a regular cloud plan is also a problem. With more features added into Cloud Premium however I think more and more will make the shift over to that. Overall this is a good new addition and package it with the Cloud Premium offer will make it more accessible and therefore used, which is a good thing. It's a bit sad to see Atlassian being so aggressive in their way of forcing cloud users into their Premium tier that is making some old customers a bit annoyed, but I think it will be good in the long run.
    2 points
  21. For users that have Atlassian Access or a Premium plan of Jira Software, Jira Service Desk, Jira Core, and Confluence a new feature have been released called Organization insights. In it's first iteration we get two charts that help us understand and predict product usage. The new feature called Organization insights is starting out with two charts, but more are coming. The idea behind Organization insights is to give insight into the usage of your products. These two charts can be used to: Identify adoption trends of specific products throughout your organization Understand and forecast product usage in the future Make data-driven decisions to increase usage in certain departments or use cases. Understand whether your license should be adjusted based on user activity Compare spending on various products against each other Quickly understand which users are inactive and should be deactivated. Organization Insights is available for Jira Software, Jira Service Desk, Jira Core, and Confluence for anyone with a Premium plan or have Atlassian Access. To access your organization's insights, you must be an organization admin. From your organization at admin.atlassian.com, select Security > Insights.
    2 points
  22. In the last 3-4 years I have noticed an increase in the speed of which things are done within companies. By that I do not mean that we produce things faster, I mean that we take decisions or share information faster. That may sound like a good thing, but as always when things are done fast the quality drops. What I see however is even worse and that is that people, often young people, are getting hurt. Management is not an easy profession, regardless of position in an organization. There are important decisions to make, ton of information to absorb and people that need to be cared for. This is nothing new, but what is relatively new is a sense of urgency, that seem to spread to an almost frantic pace these days. In some cases it's more like full panic mode even. I have seen organizations that spend more time in meetings than actually do anything on a management level. Some organization even take this to a whole new level. The lack of proper communication and a complete lack of trust within the organization lead to hundreds or even thousands of people who spend most of their days shuffling information back and forth in meetings. This is a very, very dangerous situation because when managers process information with no context and little to no actual knowledge of the topic they process then poor decisions are taken. If you add a constant stress to that situation where managers spend 30+ hours in meetings with other managers then the decisions quickly become erratic and irrational. I see this in many large organizations these days and I hear it from friends and colleagues in other organizations as well. Most agree that while this has always been the case in management to certain extent, it has never been as bad as it is today. No one seem to think that this is something that will change anytime soon either. Quite the opposite as we have seen this slowly escalate over the years and it has come to the point where people are getting hurt mentally and physically. I have seen people pass out in meetings and more than one person that leave mid day to never come back to their work again. I see daily people in the development areas with dark rings below their eyes and tired eyes. I hear people almost weekly that ask to leave their assignment due to health issues or mental fatigue. Everywhere I see the same tragic trend and that is that management is running frantically making poor decisions with little to no communication. People are frustrated, confused and more often than not they are becoming defensive as their managers mistrust everything they do. More often than not there will be control mechanisms that are implemented to control rather than improve the work. This will make people feel like they are constantly being judged and mistrusted. With an increased pace from the managers demands that comes with unclear information and little to no access to clarification there is no wonder people are breaking down. In some companies there are even activity based offices as icing on the cake to make things even more stressful for the already battered employees. People are getting hurt from this and you have most likely seen more than one employee cringe when you mention the Agile word or the Activity based Office. That is not because they are against these things, it's just that they are so abused by managers to avoid taking proper responsibility for making sure that communication and interaction are working. There is still hope! It is easy to blame the managers for the situation, but the fact is that most managers are really, really great people. They are also suffering from the situation of an increased pace and stress. I know more than one manager that have taken a time out in the bathroom where they silently cried over their hopeless situation. So the managers are not the problem, it is the collective sense of urgency and lack of control. Step 1 - Reduce the meetings. Meetings are the cause of many issues today. We have meetings for almost everything with little to no thought of why we have them. Many managers are easily in 20-30+ hours every week and most meetings include 10+ people where half is just there to make sure they do not miss information. If you want to measure something, then this is something to measure to reduce waste of resources and cost. Make it mandatory with one full day with no meetings. This allow managers to process the information and make educated decisions what to do next. For best effect, make it the same day for everyone. Also follow up on meeting statistics to make sure that no more than 15 hours each week can be allocated to meetings. That is 3 hours each day, which should be more than enough if you have the communication and information strategies in place. Step 2 - Establish trust. Control is a big problem if there is no trust in the organization. The reason for that is that no matter how well the development teams are doing it will not matter of the management chain can not feel sure about that. If all managers are always sitting in meetings, then how will they get the information they need and how will they have time to forward this information up the management chain? The first step is of course to free up time by reducing the time spent in meetings. The second thing is to clarify responsibility. It is very difficult to provide the right information if you do not know what is expected from you. Once you know what information you need to provide, then the flow of information will improve with relevant information. Once you clarify responsibility and expectations you will reduce confusion, which in turn will reduce frustration. Clarity also will make it possible to provide accurate information from the development teams when it comes to estimations. This will make it easier for manages to feel that they can trust the information from the development teams. This is done by having clear role definitions and a proper process for clarifying requirements for the development teams. Step 3 - Establish proper communication channels. The last "easy" fix is to make sure you have communication channels. One thing that I see often is that just to implement a documented decision process will improve the understanding in the organization a lot. If you can understand what a decision mean, why it was taken and who took the decision, then it is much, much easier to understand. Verbal decisions are easily misunderstand, easy to override and easy to ignore. So make sure that important decisions are clearly documented and easily accessed. No common way of working is also a big problem. You should define a baseline for everyone to avoid that everyone in your organization create their own way of working. This is especially important in the handover points where you handover information between different groups. If this handover is done in dozens or hundreds of different ways, then that will not only cause confusion and frustration, it will cost thousands upon thousands of dollars. Having a common way of working does not mean that you can not have different ways of working. It just mean that you can understand the reason for having a different process as there is some need that the common way of working can not fulfill. The changes are not arbitrary as they are when there are no common way of working. Step 4 - Take care of your people No matter where you are in the organization you have people around you that you work with every day. Make sure you take a moment on a regular basis and look at the people around you. If you see someone that does not seem to feel well, then make sure you act on that. You can support the person by talking to them and listen to their problems, you can tell your manager or your managers manager and you can contact HR. If we fail to see the people around us that are slowly being broken down from stress, then that person could end up being sick. Some refer to this as "hitting the wall", others being "burned out". This is one of the most devastating events in a persons life and it is something that you never really get over. So take care of yourself, the people around you and please, please.... stop running, because people are getting hurt.
    2 points
  23. GitHub is an amazing service, but up until now you had to pay a fee to have private repositories. That has now changed and GitHub just announced that making private repositories with unlimited collaborators available to all GitHub accounts. All of the core GitHub features are now free for everyone. Not only are GitHub providing private repositories with unlimited collaborators at no cost, they also lower the cost for their pro plans with more than half. It has never been a better time to get into GitHub, so if you are not already there now may be a good time to try it out. This is great for smaller companies that want to use GitHub for project work, but don't want to pay for the private repositories function. Smaller teams can now also start using GitHub as it is far more affordable with the new pricing that is almost 50% lower. Overall I think this is a great update from gitHub and it's probably the one I have been waiting for since I joined back in 2011.
    2 points
  24. Automation in Jira have long been requested by the customers and now it is finally here for all Jira Cloud customers. This new feature is actually not new, but it is the popular Automation for Jira app that was purchased by Atlassian in 2019. Not only is this an amazing addition, it is also completely free for all Jira Cloud users. Automation for Jira was purchased by Atlassian back in October 2019 and in March 2020 the automation functionality was made available natively to every single Jira Cloud instance at every tier. In late March the first DevOps triggers was released with the promise of new functionality coming soon. For server users there is still the old app for now. With the new automation feature that is built into Jira Cloud you can now automate a lot of actions. Not only will this free up time for you and your team, it is also super easy to setup with no coding what so ever! This is pretty impressive of course, but when you extend this across other products like Bitbucket and Github, then you get something very nice indeed. I have used the Automation for Jira app before and really liked it's simple, yet powerful features. It is really, really good that this now comes as a standard feature for all Jira Cloud customers.
    2 points
  25. Confluence cloud get some new features for the comments in the coming weeks. It includes quick commands and access to more macros. My question however is if we actually need this or if comments in general need a different approach? "Comments are where important discussions happen inside Confluence. Feedback and questions in page comments shape ideas and keep work moving forward. We've dedicated a lot of time to improving the experience, because we know comments are important to our customers and their team collaboration. The new experience is meant to help your teams better express themselves and have meaningful conversations." In my experience comments in Confluence is not really used as much as I think Atlassian believe. Mostly this is because inline commenting is often more efficient or because commenting is used less due to direct communication. So adding more features to the commenting part of the Confluence experience does seem a bit unnecessary. One concern I have about bloating the comment section is that we will see it used instead of editing the pages properly. I have seen in in other areas where it become easier to just add comments than actually use the proper way to document. Adding more functions also have the risk of making the comment section harder to use. Just adding large images and tables with data makes this area quite messy. Still, I like the "/" command that is very similar to the one used by Notion and having the option to use comments in a more powerful way is not necessarily a bad thing. Interestingly enough the news met with several questions on when comments will be available in edit mode, which seem to be a more requested feature at the moment...
    2 points
  26. In the previous articles we have defined what tool to use for what and what issue types we need. New it's time to define the workflows for those issue types. Before we can do that however we should first define what workflows are and how we should use them in Jira. Three types of workflows In short we can narrow down workflows to three types: sequential, state machine and rules driven workflows. Sequential workflow This workflow is usually chart based from one step to the next, always moving forward without ever going back. Each step depends on the completion of the activities on the previous step. You can think of this workflow as a connect the dots system: you have to follow the numbers correctly, one after the other, to complete the big picture. State Machine Workflow This type of workflow can be considered like puzzle solving, in which you’re constantly putting important pieces in place to complete a project. State machine workflow are frequently used when there are creative elements in the process, or products and services that require extra review or input from clients and management. Rules-driven Workflow This workflow is executed based on a sequential workflow with rules that dictate the progress of the workflow. This can be compared to following a blueprint to make one complete structure. Rules driven workflows are very useful when working on a variety of projects with clear goals but varying levels of specifications. We should also define what a workflow is NOT: A workflows is NOT a process - A process is more then just a workflow as it includes data, forms, reports, actors and more. A workflow usually span over multiple processes as we hand over responsibility between different capabilities (requirement, development, test, acceptance). A workflow is NOT a list of unconnected tasks - Unconnected tasks are task management and not a workflow. A workflow is NOT a checklist - Checklists are binary. It's either done or not done. That is not a workflow. A workflow is NOT a state diagram - This is probably the biggest issue I see when people try to design workflows. The idea that you need to track every single state in a workflow comes from a misunderstanding of who we actually build workflows for and what they actually need. "A state machine (panel (a)) performs actions in response to explicit events. In contrast, the flowchart (panel (b)) does not need explicit events but rather transitions from node to node in its graph automatically upon completion of activities." - Wikipedia Who do we build workflows for? In order to understand why state diagrams are not the best choice to design workflows in Jira we should understand who we build workflows for and what purpose they serve. The reason we use Jira is because we want a good way to define and assign work. We also need a way to oversee, or manage, the work. This means that we want a way to track what work we are doing, what the current status is on that work and who is responsible for completing the work at the moment. So for developers and testers we want en easy way to see what is ready to be worked on, what is being worked on and and what have we completed. For managers we need the same, but over the whole chain of responsibility. We also want to connect the work to the need so we can follow up when the need is being fulfilled. So we have two basic need to fulfill: What is ready for me to work on? Are we on track to fulfill the need or do I need to take action? In the previous article we mentioned transitional and producing items when defining what issue types we need. We can match these theories with these two need as well. #1 is producing as we just need to track the actual work in a fetch and release process. For #2 we use transitional as we want to track all areas of responsibility. Based on this we can see that there is no need to see everything that happen in the work we do. We need to see who is doing what and if there are any impediments that could prevent us from completing the need in time. This is why we choose to work with flow charts and not state diagrams. "Design for collaboration, not control" If you feel that you must track every single step in the work, then I suggest you take a look at why you need that. Usually it is because you lack trust in your organization due to poor communication or that someone in the chain of management suffer from an unhealthy need for control. Either way you should fix that outside of Jira as we should design for collaboration, not control. What statuses do we need? So now that we know what types of workflows we have to work with and what the need is we need to fulfill, then it's time to break down what statuses we actually need. We start by defining the different areas of responsibility that we need to track in our workflows. Development Test Acceptance First we start with adding a waiting status in each so we can fulfill the need of knowing what is ready for us to work on. This will also allow us to get statistics on waiting periods to see where we have resource issues. We name them the same to keep a proper naming convention: "Ready for <area of responsibility>". Secondly we add a status for when someone is working on something. Again we can track this for statistics, but most importantly we can quickly see what is being worked on and by whom. We name this the same as well: "In <area of responsibility>. We end the basics with setting a Closed status as the last status. This will allow us to set a resolution and indicate that the development work has been completed and is ready to be deployed. I often see people adding things like resolved or done, but in a workflow you should not have partial closure and there is actually no need for it. We now have the basics for a fetch and release process and we have fulfilled the first need. In order to fulfill the next need we need to add a few additional statuses, but first we should change the starting status. In Jira we have Open as the first status when a new issue is created. This is a bad status as it is not clear what Open really mean and I have seen whole organizations failing due to this misunderstanding. So we will rename this status to New if we can do that for the whole organization. If not, then we create a new status and use that as our first status. In order to track when something is blocked or waiting for something we add a status called Waiting/On Hold. Even though we can use the flag function to visualize this I have found that a dedicated status usually make this far more visible in the boards. We will also add a Reopened status in the event that we need to open a closed status for some reason. This either happen because we close by mistake, but in the event that someone actually revoke a closed issue we want to track that. Adding this is a status allow us to define how we want to handle this situation later. Finally we will add a status mostly used for defect management, but it can be used in any development workflow. That status is Rejected. While this can sound like a very harsh status it's purpose is to revert something back to the reporter for clarification rather than using the Close status and then Reopen. With just these few statuses we can manage both need to see what is ready for me to work on (ready for <area of responsibility>), who is working on what (In <area of responsibility>)and if there are any issues that need attention (waiting/on hold). We can not take any issue type and look at what area of responsibility is involved in fulfilling that task and then map the statuses we have defined to that. All generic workflows will have the same statuses. This makes it very easy to work with boards and no matter what capability you work with you always have only 3 statuses to keep track of: ready for me to work on, I am working on this, ready for someone else. What about release management?! Another common question is how I handle release management since there is no statuses for release. The answer to that is that we do not need that since Jira has that built into the core system in the form or versions. Every development should be closed with at least one version in the Fix Version field to indicate what code package the code is placed in. Every defect should also have an Affect Version that indicate what version of the code the defect was found in. By doing this we can map what code is in what package, but Jira should never be master for this information. This information should come from Bitbucket, or similar code versioning tool. This is also the same for deploys, which we do not manage in Jira at all since that is a completely different process. This comes from Bamboo or similar tools. The idea of managing deploys as a status in Jira quickly become silly as you would have a separate step that happen long after development, test and acceptance has been completed. This task is unconnected to the areas of responsibility. It is not a producing step, just a transportation step that is done not on story level, but on code package level. Like we established above this is not a part of a workflow since it is an unconnected task. We will however keep track of deployment in Confluence, but we will get to that in later articles. Let's build the default workflow Let us take all the theories above and make it real by designing the workflow in Jira and see if it hold up for real work. Requirement & business processes happen outside of this workflow. The expectation is that the beginning of the workflow comes in the form of a clarified need as a story. Even in Agile way of working the story is clear enough to be worked on once put into the ”Ready for Development” status. Once a story is clear enough to be worked on and we have acceptance from Development and Test, then we move the story to the status "Ready for Development". Producing items are created for development and we start working on the issue by transition the store to In Development. Once done we transition the story to Ready for development to complete the fetch and release process. This is repeated in the test and acceptance steps. In the event that we get a defect, then we create a defect sub-task and block the story from completion. We can use this for all development tasks as they all follow the same path. Let's see how we set this up in Jira. Building workflows in Jira In order to build global workflows in Jira you need Admin access to Jira. Go to Jira Settings -> Issues. Here you will find the two sections we need to configure to build a new workflow and to assign it to a project. Under Workflows you will see the current active and inactive workflows. In the top right corner you will see a button with the text "Add Workflow" Click that and you will get a popup to enter a name for the workflow and a description. Once you have added a name and description you will come to the design view. Here you use the "Add Status" to add the statuses we want. We create them with global transitions to make the workflow as open and flexible as possible by checking the box "Allow all statuses to transition to this one". I usually have transitions between rejected and new, as well as for Closed to Reopen, just to make it more clear that the rejection is used in a certain part of the workflow. This way you can't go to rejected or reopened from other statuses than the intended ones. In a proper workforce where the users get education on how to use Jira this is not really needed however so you can skip that if you do not feel it is necessary. Add Workflows to a workflow schema Now we can go to workflow schemes where you find all your active and inactive workflow schemes. in the top right corner you have a button with the text "Add workflow scheme". Click that and in the popup you add the name and description of your scheme. You will then be taken to the screen where you add workflows to the scheme and map it to specific issue types. Click the add workflow button and select the workflow we created earlier. In the next screen you get to select which issue types you want to map to this workflow. Select the ones you like, which should be all of our development issue types and then click finish. Your scheme is now configured with a workflow that is mapped to the issue types you want. You can edit this scheme at any time should you add workflows and/or issue types. Add Issue Type Scheme to your project Go to your project and then click on project setting in the left menu. It should be at the bottom of the list of areas for your project, but if you can not see it then you may not have admin rights for your project and you need to get some help with this step. If you have access then in the project settings go to Workflows. Here you see your current workflow schema and the workflows attached to it. To change click on "Switch Scheme" and select the new scheme that we created above. Click associate and if needed map statuses on the next screen and wait for all statuses to resolve. Once done you have your new workflow scheme mapped and you can start using your new workflow. We now have workflows setup for our issue types, but we still have a few things to do before they are completely ready to be used. That is to define the screens and custom fields we will use in our setup. That will all be explained in Part 4: Defining Jira Screens & Custom fields that we will look at next.
    2 points
  27. The roadmap feature in Jira Software Cloud's NextGen templates is getting a bit of an upgrade. In the new version we have two new features and soon we will get one of the features I am waiting for most. In this new update for Jira Software Cloud we get two new features. Dependencies allow you to quickly link two epics together to indicate that they are dependent on each other. This is a great feature that allow you to visualize dependencies in your timeline. The second feature is to indicate progress for child issues. This is shown below the epic name in the different status colors: grey, blue and green. This is not really as useful as if you could drill down on the items themselves in a hierarchy as you can in Portfolio for Jira. Still it is useful to quickly get a glance of the current status of things. In the next version we will see the addition of roadmap hierarchies. This will allow us to open up the child issues so we can see them in the tree. Unfortunately the child issues does not seem to be shown in the same way and in the first iteration we only seem to get this for one level of the tree. Sub-tasks will not be seen in the hierarchy as it looks right now. I feel that this is a step in the right direction, but I am concerned about the fact that the road map feature only exist for Cloud users and even more so that it is only available for NextGen projects. The features are much wanted and if we can get a good transition of Portfolio for Jira to a simpler and more useful tool, then I think that will be a great selling point. For this to to be a replacement for Portfolio for Jira, which is positioned a bit between Jira Align and Roadmaps, then we need to be able to select what level we want to use and we need to be able to extend the parent child hierarchy with new levels. Using Epics in this way kind of annoy me since we are clearly working with features here rather than epics. It will be interesting to see if Roadmaps will remain a cloud only feature and how it will fit next to Jira Align and Portfolio for Jira in the future. For now I am enjoying the new feature and look forward to the next upgrade.
    2 points
  28. Jenkins is used by many teams around the world and for a while now the plug-in integrating Jenkins with Jira Software has been unsupported. However now Atlassian have announced an official integration with Jenkins. The integration itself allow build information from Jenkins to be posted throughout Jira Software Cloud. This is similar to other CI/CD tools where you can automatically send build and deployment information from Jenkins and display it across Jira issues, boards and query it via JQL. In addition to this Atlassian also have built in a new way to integrate using OAuth Credentials. "In addition to the Jenkins integration we also build a brand new way to integrate your behind-the-firewall apps with Jira Software Cloud. You can now generate OAuth Credentials (2LO) to securely connect these tools without having to open any holes in your firewall. The credential is tied to a specific Jira site, can be generated by Jira admins, and is used to communicate between a self-hosted application (e.g. a Jenkins server) and your Jira Software Cloud site." Using OAuth Credentials is interesting since it will allow for secure connections even through firewalls to connect to Jira Software Cloud. "You can now generate OAuth Credentials (2LO) to securely connect these tools without having to open any holes in your firewall. The credential is tied to a specific Jira site, can be generated by Jira admins, and is used to communicate between a self-hosted application (e.g. a Jenkins server) and your Jira Software Cloud site. The OAuth credential is currently scoped to only send build and deployment information via the Jira APIs." This is great news for all Jenkins users and good news for all Jira Software Cloud users.
    2 points
  29. Atlassian has announced that a free tier for all of the company’s services that didn’t already offer one is coming. Atlassian now also offers discounted cloud pricing for academic institutions and nonprofit organizations. This is great for smaller companies that want to upgrade from the popular Trello platform, which is also owned by Atlassian. Jira Software, Confluence, Jira Service Desk and Jira Core will get free tiers in the coming months. Exactly what the limits will be on these free tiers is yet to be seen, but it is safe to assume that the current 10 user tier that is the entry level will probably be free. In addition to this we will also see an extension of the trial version which is very short today. This allow companies to better evaluate before committing to a purchase. "We’re announcing free plans of Jira Software, Confluence, Jira Service Desk, and Jira Core – available in the coming months. This adds to the existing free offerings already in place for Trello, Bitbucket, and Opsgenie to give teams of all sizes, even small ones, a set of fundamental capabilities for team collaboration." - Reaching new heights in the cloud For me this is great news as it allow many smaller companies to get introduced to Jira. This allow Jira to organically become a foundation of the workflow as the companies grow. This should multiply the use of Jira quite a bit, especially with the new next-gen features that are very similar to Trello. I like this move quite a bit and I look forward to hearing more about this as the new tiers are published. In addition to this they also talk about their Cloud Premium offer and the new discount offer for academic and non-profit organizations.
    2 points
  30. This site is built on Invision Power services and out of the box it is a very competent solution. As I dig deeper into the CMS however things quickly becomes a bit difficult. At the same time I continue to be amazed on just how powerful this system is. When you dive into IPS then you quickly start to find areas where you need some guidance. This is when you try to figure out how to adjust a certain piece of data or how IPS template systems work. This is where things get a bit difficult because very little effort is made to support this kind of questions from IPS. They rely on the community to support each other, but unfortunately this works very poorly. IPS used to have specific areas for each of their modules, but now that is gone and instead there is a generic area. For me who mostly need help with the CMS this is a pain because the CMS barely register as most still only use the forum. So finding the right information is difficult at best and if you ask, then you rarely get any help because so few actually know anything about the CMS. I think that 90% of all my questions are answered by OpenType, one of the few Pages experts on IPS. There are some documentation, but it is rudimentary and is more a base than actual documentation, so you really need someone to help you with the more specific areas. Once you get through that obstacle then magic start to appear. I do not think i have used a software this powerful...ever. Just out of the box you can do pretty much anything you want. Then there are plugins and addons built by the community to further extent the capabilities. Once you start to understand how things are connected, then you almost get immobilized because there is just so much potential so it's hard to know where to start! It is annoying ass hell sometimes, but at the same time it's just awesome when you figure out how things actually work and what you can do with it.
    2 points
  31. The Roadmap feature in Jira Cloud's NextGen projects is getting three new features. While all good additions, the question still remain who these new features are for and to what extent these new features will make people move over to NextGen projects. NextGen for Jira Cloud is in a strange place as it is not really defined what is can and should be used for. The Roadmap feature is in a similar place as it fall somewhere between Portfolio for Jira and the Roadmap planner macro in Confluence. These 3 new features are an improvement and a good indication on where Atlassian are going. The question is just how fast these new features are coming out and if it appeal to the target audience. Drill down into the details The first feature is the ability to open up the Epic and see the underlying tasks. This is a much needed feature that was heavily requested and also one I spoke with Atlassian about earlier this fall. This is a good feature and a good step to improve the roadmap, but is still in need of further refinement. We still only have Epics as the starting point, which will limit the use of Roadmaps. Opening up the subtasks will only show their status at the moment, which is useful, but not what many want. Many still want a Gant view where the sum of the subtasks should make up the time in the Epic. This is not possible at the moment and I find it interesting that Atlassian has chosen to follow an Agile first approach to the Roadmaps, which means it will not be very useful for the majority of the companies using Atlassian's products today. Add new tasks directly in the Roadmap Another great feature that was much requested is the ability to create new sub tasks directly in the Roadmap. This way we can build up a full stack of tasks for a project in one view, which is excellent for portfolio and project planning purposes. The fact that we do not get full Gantt view for the sub tasks makes this a little less useful for time and resource planning however. Filter your Epics and Tasks The ability to use different filters is a must for any Portfolio, but even roadmaps benefit from filtering options. In this release we get the filters for issue status and assignee, which is a good start. I would like to see some more filters like dependencies and of course issues that are behind the time schedule. The question is just who this Roadmap feature is for though as then we are moving more into project management and Portfolio management and Atlassian has previously stated that the Roadmap is for teams. It's a good start, but... I am still not sure where NextGen projects are heading, which means it's hard to say if the features are great or poor. We know that Roadmaps will be ported over to the Classic project types as well, but that will make things even more confusing. This is unfortunately a common issue with Atlassian as they are getting more and more fractured with no clear indication on structure or strategy. Roadmaps for me is something that should stay as a team tool for small teams to give an overview of the current work. To cater to that need Roadmaps could benefit from a few changes. The first would be to change the basic structure and allow the view to be in any level. That means that I should be able to use Stories rather than Epics as Epics are just containers and not work tasks. The majority of issues are not connected to Epics in most teams, especially if you work in a Kanban setting for continuous improvements for example. The second would be to go full gantt, or rather to give the option to go full gantt. Not every team need or will use estimation in issues, but most do. Without a full gantt the view of issues will not be as useful as a progress overview tool. It's like saying that I have a container of a certain size and in that container I have put five items. On the question if the items will fit my only answerr will be "I don't know", which is in many organizations not an acceptable answer. The third would be to add dependencies on issues and not just on Epics and extend the data to also show data from other projects. In most organizations dependencies are not within the team itself, but to surrounding teams. Even if the view is for the team it makes sense that I should be able to see what other teams could be affected. The fourth would be to ensure that Roadmaps becomes a granular part of a larger view. Right now it is an isolated feature, which means that we will have different data for different levels of the organization. This will lead to miscommunication within the organization as teams will say Epics, which will mean something very different to Program managers and Portfolio managers and so on. As more and more organization add SAFe to their processes it is important that the team view is part of the greater whole. I am sure we will so many great additions to Roadmaps in 2020 and hopefully many of the questions we have regarding Roadmaps and NextGen projects will get answers then. Until then these three new features are welcome additions that I am sure will help many teams improve their work processes.
    1 point
  32. Earlier in 2019 Atlassian presented their new cloud development platform FORGE at the Atlassian Summit. The idea is to have a tool that makes it easier and faster to develop apps for the Atlassian cloud suite using a serverless FaaS hosting platform, powered by AWS Lambda. This new cloud development platform will probably be a welcome tool for new app developers and if received well it will push development for cloud to the front lines. All in accordance with the business strategies Atlassian seem to push towards cloud in general. According to the article by Atlassian, Forge comes with three core components: A serverless Functions-as-a-Service (FaaS) hosted platform with Atlassian-operated compute and storage for app developers A flexible declarative UI language (Forge UI) that enables developers to build interactive user experiences across web and devices with just a few lines of code A state-of-the-art DevOps toolchain, powered by the intuitive Forge Command Line Interface (CLI). A serverless Functions-as-a-Service The first component with the FaaS I think sounds excellent as one of the big hurdles with app development for Atlassian (and other systems) is hosting and develop the app as a separate web service. Having FORGE do the heavy lifting should make that threshold a bit lower (depending on the cost of course). Atlassian list 3 specific areas that they hope that FORGE will help with: Trust: As personal information goes digital, privacy, transparency, and security are more important than ever before. With Forge UI, developers and app consumers benefit from built-in, best-in-class security for apps, by default. Plus, thanks to Atlaskit, when Atlassian makes an update, your apps won’t break. Running anywhere: Atlassian customers want experiences that are consistent across their products and apps, and across their devices and web. Forge’s UI enables users to build once for both web and mobile. Moving up the stack: In general, developers aren’t concerned with where their code is running – they simply want to spend less time on implementation details of the code, and more time on providing customer value. Forge’s serverless FaaS model enables developers to write single functions rather than building entire web applications. There are also other areas where FORGE can help reduce pain points and increase security. A flexible declarative UI language The second part I am not sure if it's a good thing or not. For anyone developing only towards cloud based Atlassian systems it is of course awesome as it makes things easier and we get a more unified design across apps as well as systems. It is when dealing with multiple ecosystems such as Server or Data Center this can become a bit complicated. On one hand it forces even server based apps to follow the design specifications of Forge UI, but on the other hand it can limit the app developers. Overall it should still be a good thing and as it is based on Atlaskit it should be pretty well aligned with the overall UI design for cloud. A state-of-the-art DevOps toolchain For the DevOps toolchain I would like to know more before making any assumptions as it seem to be based on Bitbucket pipelines that are still quite new. I like Bitbucket Pipelines, but I would like to see if this is just a built in version of it into FORGE or if it has some changes. Things like defining environments within AWS Lambda and what the UI for this will look like. Is it "just" a CLI and if so, what capabilities can I expect within the CLI itself. Will this be connected to Bamboo for the build or can I choose other build tools such as TeamCity for example? The fact that this part is barely mentioned in the article of the presentation is a bit of warning flag for me. If it is state-of-the-art, then please show me the tool chain and give me an example of a simple code update from development to production. Still, this is just me being a bit nit-picky as I am sure there are already videos out there for this or they will come soon enough. Overall I think this will be a bit of change for many app developers today, but a good change. Welcome to the Forge - Presentation at Atlassian Summit 2019 Personally I think this is a great thing that will help app developers a lot. Old app developers might need a while to adjust, but in the long run I think it is a good thing. Adding this service not only ensure that things get more uniform in terms of design and coding, but it also will provide great insight into how a controlled DevOps toolchain is perceived outside of their own company. I look forward to learn more about Atlassian Forge that is currently in Closed Beta that you can sign up for here. What do you think of Atlassian Forge so far?
    1 point
  33. Another week has past and as usual I will bring you some of the happenings of the week. This is a weekly newsletter that focuses on the development chain that I am most passionate about: Management, Design, Requirement, Development, Test and special interests such as Atlassian and Security. If you have news that you think should be included in this newsletter, please let me know. You are also welcome to guest blog if you like. Management The Best Risk Management Software For Enterprises and Midsize Businesses - Top 10 tools for risk management. Agile vs Waterfall: What’s the Difference? - Still wonder what the difference is? Here the differences are broken down so it makes more sense. What Is Scrumban? How It Differs from Scrum & Kanban - For some reason this is always confusing people, so here is a guide. Estimation in the Era of Continuous Change - How do you work with estimations in a more agile way of working? Create Faster and More Accurate Forecasts using Probabilities - Another approach to estimations. Sprint Planning 101: How to Plan Great Sprints - Some good advice on how to get those sprints planned and executed properly. Exploring the Philosophies and Principles of Planning Approaches - Amazing article on planning approaches by Lynda Bourne Why Agile Is a Humane Way to Work - An interesting take on the Agile way of working. A new video about Productive is added to the Video section. "A complete project lifecycle – in one app. Stop juggling multiple tools. Handle your entire workflow in one place." Requirement Requirements management in Jira 101: the basics - An interesting take on requirements in Jira. Requirements Management: A Quick Guide - Good run through of what requirements actually are. Pentagon Wars - Bradley Fighting Vehicle Evolution (the best example of scope creep ever!) Design UX Design Trends for 2020 - You know this was coming, but do you agree with them? 20 Most Inspirational Interactive Prototypes for 2020 - For all your prototype lovers out there! UX For Enterprise: 3 Biggest Challenges (and How to Tackle Them) - Some great advice here. Storybook 5.3: Build production design systems faster - It's not bad really! New GoDaddy logo is a massive improvement - The iconic GoDaddy logo is renewed and it's pretty neat. ActiveCollab redesign deconstruction - A walkthough of the design process redesigning this tool I used a long time ago. Introducing Wacom One - Yes please! Why Ethical Design Is Critical for Mobile App Designers - I like the reasoning and the topic. Baseline Material Design Components for Sketch - Some good resources here. What Star Wars can teach us about the UX? - Did not see that one coming! 100 Cartoon Characters - Great resource for all your character need. The Professional Golden Shine Effect in Photoshop Development Node.js and JavaScript conferences you should attend in 2020 10 Interesting JavaScript and CSS Libraries for January 2020 How To Protect Your Vue.js Application With Jscrambler How To Not Have A Mess with React Hooks & Redux Darken - A javascript library that makes darkmode easy 10 Ways to Optimize Your React App’s Performance An Introduction To React’s Context API The Deal with the Section Element MassCode – a code snippets manager for developers released to v0.4.0 Understanding CSS Grid: Creating A Grid Container Understanding CSS Grid: Grid Lines Babel 7.7 Released With Improved TypeScript Support, Top-Level Await and More Vue Composition API—What Is it and How Do I Use It? Understanding Async Await | CSS-Tricks The JS based polished markdown editor called Boost Note has been officially launched Multi-Thumb Sliders: Particular Two-Thumb Case Test / QA Continuous Testing at scale: The new mabl and Bitbucket Pipelines CI/CD integration - A bit techy, but good. 5 software testing books QA professionals should dig into - pretty neat list here. Learn End-to-end Testing with Puppeteer - looks pretty good I must say. Manual mainframe testing persists in the age of automation - yeah, manual testing is still a thing pretty much everywhere. JUnit 5 - Evolution and Innovation Operations Cloudflare acquires stealthy startup S2 Systems, announces Cloudflare for Teams - Sounds interesting indeed! cPanel Announces Collaboration with Google Cloud to Bring cPanel & WHM to Google Cloud Platform Marketplace WHMCS 7.9 Now Available - New features for WHMCS CloudLinux 6 kernel updated - A rather small update to CloudLinux 6. OpenSSL 1.1.1 and TLSv1.3 Beta Testing Open Call - test drive TLSv1.3 and OpenSSL 1.1.1 with EasyApache 4 and cPanel. Beta: CloudLinux 8 with 4.18 kernel is here - If you want to beta test CloudLinux 8, then a new version is out. Atlassian Atlassian scrambles to fix zero-day security hole accidentally disclosed on Twitter - A nasty one, so make sure you are updated. One company’s transformative journey to Jira Cloud - Canada-based Igloo Software go through their experiences with moving to Jira Cloud. Want to see your app in Jira Cloud mobile? Glances have arrived! - Now you can get more visibility for your app, which is great for the users as well. Ship faster using Slack and Jira - Demo Den January Security Unprotected Medical Systems Expose Data on Millions of Patients - This is soo bad! One More Threat For Organizations – The Ako Ransomware - Nasty ransomware that can cripple your organization. SNAKE Ransomware – A New Threat For Businesses In Town - Another nasty ransomeware Hackers use system weakness to rattle doors on Citrix systems - This one caused some headache for IT this week. Multiple TikTok Vulnerabilities Could Exploit Or Delete Users’ Personal Data - Good thing kids these days are secure online... Threat From Pre-Installed Malware on Android Phones is Growing - I am not surprised really. Amazon calls PayPal's $4 billion Honey browser add-on a 'security risk' - that's a bit fishy Amazon! PayPal Patches Vulnerability That Exposed User Passwords - Sloppy mistake fixed by PayPal Ship faster using Slack and Jira - Demo Den January Interesting LinkedIn Brings 3 New Features to LinkedIn Pages - Stream live or invite people to your page. Google January 2020 core update almost done rolling out - SEO changes coming your way. Google Chrome: Third-party cookies will be gone by 2022 - Hardcore approach by Google Chrome. Facebook's Updated Desktop Layout is Now Appearing for More Users - Not for me yet though... Social shorts: Twitter gets rid of Audience Insights, Facebook updates Instant Articles, YouTube enforces policy on kids’ content - The world is changing fast. Twitter Adds New Ad Unit and Alters Core Features - Do we need more ads really? New Edge browser from Microsoft is rolling out today to windows 10 usersE-commerce E-commerce Bose is closing all of its retail stores in North America, Europe, Japan, and Australia - It's a trend these days it seems to close down stores and shift to online instead. Google Introduces a New Shopping Section in Search Results - Good or bad? Decide for yourself. Teknik Magasinet file for bankrupcy - Another swedish company goes down
    1 point
  34. My favorite E-commerce profile Katrin have purchased a competitor called SiteDirect and by doing so she now will be in charge of two popular platforms and 14 people in 3 locations. This is great news, and I am very happy that things are going well for Katrin and her husband Erik. While I do not know much about SiteDirect I know it is an "old" and experienced company with a platform that has been popular for a long time. If Katrin is investing in SiteDirect, then you can bet she has looked at it from all angles and that means that the platform and the people are top of the line. This is something I think is really good for both platforms as there are synergies that will benefit from this acquisition. Kodmyran are well known in Sweden for their excellent platform, the amazing technical skill from Erik and the development team and a ton of e-commerce knowledge and skill from Katrin and the whole team. I look forward to seeing what this acquisition will mean for both platforms and what synergies we will see in the future.
    1 point
  35. Estimations for software development seem to be the bane of almost every company, but why is that really? Why is it so difficult to approximate the time and effort required when we do this all the time? There are a few reasons and in this article I will go over how I do my estimations and give you some of my experience on how you can maintain a 90% accuracy in any project. For a good estimate you need to start with one very important thing: define if you estimate based on time to complete or time to deliver. These are very different because the time to deliver will be substantially higher and much more prone to variations. This is because in the daily work you will be dragged into meetings, have people distracting you and so on. For good estimations we always estimate on time to complete as our basis. Stop doing happy estimates The worst thing you can do is making happy estimates. These are estimates based on the utopia that everything will work smoothly and you will be left in total isolation to focus. It never happens and Murphy is always present. Happy estimates may seem good because the product owner love low estimates, but they hate when you fail to deliver. Happy estimates usually happen when an architect is stressed and throw out a guesstimate on the fly. It will almost always bite you in the butt because not only will everything seem easy to the architect, so they will underestimate it, they also never consider Murphy. You do not estimate to be nice, you estimate to give a realistic view on when something can be available in production. If you have a hard time to stop making happy estimates, then implement this very simple rule: "Any time that is needed beyond the time you have estimated you will do in your own time without payment" Take your time doing estimates An estimate is not a guesstimate that you throw out on a high level requirement. An estimate is your promise on when you can deliver and as such you should take your time and think that through. Don't sit around doing arbitrary guess work in a planning poker or play with t-shirt sizes unless you want to avoid doing any estimates at all. That type of guesstimating is for high level requirements, so make sure they stay there. Break down the requirement and use your experience to guide you to a first number in your estimation. This estimate is how long it will actually take to sit down and build based on the requirement. Make sure that you ask questions to clarify where needed so have the information you need. This is also a good time to start working on a solution design to make sure you have considered things that may not always be apparent. For example validation of data in integrations or extending a JavaScript validation for a new form. When we have done this, the number is still wrong, but we need it as a starting point. Add the things you forgot Now that you have done your estimate, many think they are done. That is rarely the case, so let us add the things that is not included yet. The most obvious problem that I see a lot is that the estimates is usually done by the most experience person, which also usually is the one that work fastest of everyone in the team. So what we do is to look at the estimate and the team, then we adjust based on what the slowest person in the team think is appropriate. This way we know that the base estimate is reasonable for everyone on the team. The second thing we do is to consider Murphy. Things always happen and based on the complexity we increase the estimate with 20-100%. Not having room for mistakes is in itself a very big mistake. It will almost always happen and if it does not happen for this particular task we will either be able to resolve things faster than expected, or we have more time for other tasks. Either way that is a positive thing. The third thing to look at are testing. All code should have unit tests and it is often forgotten in the estimate. You also have non-functional requirements such as loading times and browser support that you must consider. As a developer you are also responsible for testing the code and this should be added as a second estimate. For many estimates this alone will add 20-200% or even more to the estimate. This is especially true for frontend development where you often have 18+ variations just for devices and browsers. These three very simple things easily multiply the original estimate two to three times. Now let us consider your efficiency! A factor that is very often overlooked is efficiency. No person in any team will ever have 100% efficiency in the sprint. I do not mean your focus level during the day, even if that also is a factor, I am talking about those pesky things that break your concentration. Things like meetings, stand-ups, code reviews and all those "I just want to ask a quick question", cost a lot of your time during the day. In my experience most teams will have an efficiency of around 40-60% depending on how often they are disturbed. Depending on if your product owner understand estimation or not you can choose if you add the efficiency in the estimate, or if you have that as an external factor in the sprint itself. If you are new to this part of the estimation I suggest that you start with 50% efficiency and then adjust over time as you get better at estimating your efficiency. With this step we now add a second two time multiplier and you are now close to a realistic estimate. This may seem like a lot This may sound like the estimates always will be very high compared to how you are working today, and you are right. This is why you always feel stressed and why you fail to deliver on promise in every sprint. It is why we invent things like story points to mitigate our inability to take responsibility for things we can't estimate properly. Realistic estimates are just that and if your estimates are far lower than what you get doing estimates this way, then remember this very simple rule: It is always better to overestimate and over deliver than to underestimate and under deliver. The Quick Summary Make estimations in actual time to complete, not arbitrary measurements. Take your time to understand the task at hand and stop guesstimating. Adjust the estimate to fit the slowest person on your team. Add task for testing and make estimation separate for that. Remember that things always go wrong, so make room for that. Make sure that your efficiency is considered and calculated into the time to deliver. Making good estimates is based on experience and knowledge. This means that like other skills you can get better at it. If you constantly work with arbitrary measurements like story points and you constantly fail with no change to your estimation process, then you should stop doing that. Not only will you fail at a crucial part of your work, your inability to provide accurate estimates actually cause harm in the form of stress and frustration. It is up to you if you want to spend your time in constant failure or constantly provide estimates that are realistic and dependable. Learning to make good estimates is not rocket science, just common sense and experience. So start doing it today.
    1 point
  36. This is a guide series that will go through everything you need to know to set up and customize your own blog using Invision Community from Invision Power Services. This guide will be updated with new articles or new information when new releases are made that affect the guides. This guide contains the following articles: Introduction (this page) Databases & Custom fields Adding Databases to Pages Adding CSS and JS to Pages Article View Template design Article Listing Template Design Article Category Listing Template Design Article Form Design Article Block Design Database Relationships This guide should give you all the information you need to get a good start with creating your own designs with Invision Community and its Pages application. If you want a quick start however and get a great looking design up and running in 10 minutes, then you can purchase a license for Invision Community and buy the plugin Pages SuperGrid by opentype. For this guide you will need a license for Pages, which is the application that allow you to work with Pages and Databases. I will make references to the Forum application as well, but you do not need that if you do not want to. The information in the articles will not go deep into how to make your blog compatible by using standard classes as that is a pretty big topic and I usually just build for myself, so I do not have to worry too much about that. If you have any questions or see a topic not yet added here, please drop by the forum and let me know.
    1 point
  37. Color psychology is a topic often brought up when discussing conversion rate optimization. It often comes up as a sort of law of what colors to use, which is based on an article online or some generic description in a book. Color psychology however is far more complex than that and a recent article by Talia Wolf at GetUplift is the best introduction to that complexity I think. The fact that colors can affect us should come as no surprise to anyone. There are a lot of studies that show that this is true. How they affect us however is still a bit vague and seem less important to a lot of people working with it. This is a big mistake because just like music has an impact on our minds, colors also affect us based on association and everyone has different associations. Just as Talia brings up the different association differences in her excellent article, like the fact that white is both purity and death, there is also associations based on age and even personal preferences. You also have a whole science behind the different versions and shades of the colors where for example one shade of green can be seen as healthy and full of life and another will associate with pestilence and death. Talia also briefly touch on the fact that color psychology should not be used alone. It should be considered together with other association factors like typography, iconography and overall tonality. In conversion rate optimization it should also be accompanied by other CRO tools like direction of movement, familiarity and the gestalt laws to direct and highlight the actions we want the users to take. If you want to know more, then head over to GetUplift and read the full article "Color psychology: The complete step-by-step guide" by Talia Wolf. You will not regret it.
    1 point
  38. Magento is one of the most popular e-commerce platforms that are out there, famed for providing no limits when it comes to customizing your online store. Whether you’ve decided to build your store from scratch, wish to optimize or migrate the one that you have, you won’t make it without some professional help of specialists. In this article, we give you tips on how to hire expert Magento developers and which questions to ask them. Tips on Hiring Magento Developers Before stepping to the questions, it’ll be helpful to know a couple of things about the process. There are many specialists all around the globe, and you need to know who you’re looking for as the developer services can differ based on what you need: migrating the store, building it, optimizing it, etc. Having a clear vision of what you need specifically makes up almost half of the deal. Make emphasis on experience with similar projects to the one that you’re planning, this can eliminate some unneeded questions or blind spots. Keep in mind the time-lag if you’re hiring someone on the other side of the world. Which Questions to Ask a Magento Developer Now that we’ve given some general recommendations of where to look for Magento developers and what to keep in mind as you’re searching, let’s move on to the actual questions you can ask and why you should do so. 1. How many years of working with Magento do you have? Speaking about Magento development, the experience of actual work on the platform is the key factor to pay attention to. Because Magento isn’t easy to get in the hang of, it can be challenging to understand and master even to those who have many years of general development behind their shoulders or to those who are good at PHP. The more years of hands-on work that the developer (or team) has with Magento the better. The reasons for that include the quality of code that is produced as well as the wider range of tasks and issues that could be taken care of. Importantly, make sure those who you’re considering to hire have plenty of experience with the Magento 2 platform, as Magento 1 (the previous version) differs from it big time. That said, you’d surely want your developer to know how to sidestep a problem, avoiding it before it even arises, as well as to have the necessary knowledge to fix things quickly and efficiently in case something goes wrong. 2. Are you Magento certified? To be fair, having Magento certification is not an obligatory requirement. Yes, on the whole, certification is a big plus since it somewhat proves that the candidate has the needed knowledge, and that he/she took the time to confirm having it. Nevertheless, although there are many types of Magento certificates out there, some of the questions that the tests include to get the certificate are outdated and don’t cover the recent turns such as PWAs (Progressive web applications). So, if the person in front of you is officially Magento certified, that’s wonderful. If not, that shouldn’t become a ground-breaking reason not to consider them for the job, especially if they could boast having plenty of Magento 2 experience under their belt. 3. How well do you know Magento 2 architecture? As mentioned earlier, Magento isn’t a piece of cake. This question is especially relevant if you don’t understand which Magento (1 or 2) the person who’s before you has worked with. Magento 1is becoming outdated, and everyone is either making the move to Magento 2 or building ground-up on it. Consequently, it is vital to dot the “I’s” regarding where the candidate stands in terms of Magento 2 architecture knowledge. Like already stated, Magento 2 architecture is radically different from Magento 1. It’s quite hard and time-consuming to figure it out too if you’re just getting acquainted with it (roughly, you need about a year to hold up well). This is why you should definitely be on the lookout regarding this. 4. Have you ever migrated a Magento 1 store to Magento 2? As you’ve probably guessed by now, moving a store that was created on Magento 1 to Magento 2 is a very complicated problem to solve. The thing is that in order to cope with the task successfully and within adequate time frames, the developer (or team of developers) should be equally witty in both of the platforms. They need to know M1 and M2 like the back of their hands, keeping in mind all the features and elements that the two differ in. They have to be able to carry out loss-free data moves, come up with custom solutions, deal with the compatibility of modules, among other things. Thus, if the candidate has migrated Magento previously, that could be a good sign. You may ask about what was challenging, how long the process took, and look at the website. 5. Which progressive JavaScript frameworks do you know? What’s for progressive JavaScript frameworks, knowing React.js or Vue.js, for example, is noteworthy. Having such skills, developers are able to make UI components that’ll be reusable for sites and applications. 6. Do you have experience with Magento’s PWA Studio? Progressive web applications are a highly popular and promising trend in e-commerce. Because the solution offers an affordable replacement for native apps and allows your website to work like an app (even offline), at the same time being fast, responsive, and accessible by search engines, it’s a solution that many store owners want to get ahold of. Ask your developer whether they’ve built PWAs and their thoughts on the subject. 7. Which of your former Magento projects was the toughest/are you most proud of? Browsing real examples of work is yet another great option. CVs and portfolios might be packed with information, so fishing out some specific highlights can do you good. You can ask which aims were set, how were they handled. Pay additional attention to the points that are connected with custom solutions and configuration. On another note, make certain that the portfolio in front of you actually reflects the work of the specific candidate and that it’s authentic, you don’t want to waste your time on something that’s claimed to be theirs but really isn’t. You can attempt in contacting the company and ask them a few questions. 8. If you were to give advice on Magento optimization what would it be? Let’s face it, if you’re running a business in the sphere of e-commerce, you want your online store to be performing at its best. Time is moving forward, technology is evolving, new trends are established. This means that you’ll need optimization so that your store is viable, fast, findable via search engines, provides a great user experience, etc. Some replies that can count here would surely include recommendations on optimizing website speed, improving the product search, and reworking the checkout. At times just several touch-ups can already make a change for the better. 9. Do you provide support after the site’s release? Knowing that your developers will have your back after the release also helps. After all, if there will be a situation when you’ll need urgent assistance, having a service level agreement with your developers wouldn’t hurt. For this reason, settling from the very start the “what happens after the release” matter is in your interests. 10. Do you mind preparing a test assignment? It is considered good practice to offer a test task to the specialist who you’re planning to hire. After all, it’s your chance to see the person in action. One of the ways to do that is to request to solve an actual issue that you have or to turn to specialized platforms that were created for test assignment purposes, for example, Devskiller. All in all, approaching the matter of hiring a Magento specialist for your project is very important. Ultimately, these people will be entrusted to deliver a product that’ll influence your business. We hope that this guide will help you when searching for your perfect match!
    1 point
  39. I have been meaning to write this for a while now and as my energy start to come back I feel it's time to express my admiration for the amazing Fjord Stockholm office and the people working there. I have had the pleasure of working not just with Fjord, but also sit with them in their Stockholm office for close to a year. In that time I have observed and learned a lot from how Fjord build their culture within the office and how it affect their work. A workplace can be many things and how it is structured and decorated have a great impact on how the people working there feel. Not just about themselves and the workplace, but also how the company itself are perceived. So if you want to know what kind of company you are dealing with you can just take a stroll through their office. As you probably know Fjord is a part of Accenture and for me that made things very interesting because Accenture is very strict as a company. A strict environment almost never fit a creative mind and Fjord is a melting pot of creativity, so how does that work for Fjord? Well, Fjord have solved this by taking the best parts of Accentures high standards for security and their values and built it as a core of their work. This core is then surrounded by a setting for creativity that is just amazing! Every where you go you will find places to sit or interact with. It can be a swing next to a window, a huge teddy bear that you can actually curl up in its lap. A VR set in the coffee area and kitchens that make for perfect work areas or places to chat for a while. Everything is carefully selected to be stylish and playful, but also as ways to trigger your minds creative processes even more. There are always things to look at with an odd shape, creations made from strange materials and you can find places to sit and work all over the place and not just around the working areas. In short it is amazing! On top of this very creative scenery you have people. People that are friendly, curious and oh so full of creativity and talent from all over the world. These people combined with the decoration of the office create an atmosphere that is very difficult to describe, but if you are a creative designer you probably just call it heaven. I will miss the Fjord Stockholm office, but I will do my best to make sure the Claremont office I am just starting to get to know will be equally great, if not even more so! It is a challenge, but one well worth to take on because the work place is where most of us spend a majority of our time throughout life, so it should be amazing! The Fjord Stockholm office have managed to create just such a working environment that truly make it one of the best working places in the world for creative creationists. Well done Fjord Stockholm!
    1 point
  40. Scrum Manager. Developing Architect. Fullstack Developer/Designer. The new roles are popping up left and right these days. Some are clearly just another way to say "generalist", but others are roles that have a very high chance of making people sick. Why do we see these ads? I think it is because the people writing them do not know the craft. For me, who actually is a generalist with pretty decent competence in multiple fields, I find these ads very amusing. Rather than writing that they need multiple roles filled, but only have budget for one, they make up new roles. Presumably in the hopes of getting someone who can do most of what they think they need. Because this is the thing, most people that write these ads don't really know what they need. I have seen ads that sound like someone making a frankensteins monster out of the roles. Clearly with little to no understanding of what the different roles actually mean. Some ads just try to mix the best of two worlds, like the Scrum Manager that combines the caring/facilitating aspect of the Scrum Master with the managing/controling role of the Project Manager. From the person who write the ad it probably makes sense and that is because they do not understand the work involved. From their perspective they probably see a scrum master and a project manager as both having management descriptions, so it should be ok to mix. The fact that they work in different directions where the scrum master work down towards the team and the project manager work up towards the steering group does not seem to occur to them. In most cases this is not so much of an issue because what you will get in most cases is a generalist. A Scrum Manager for example will be a general manager with some understanding of the scrum process and some understanding of the financial side of project management. The person will not be optimized for any of the roles, but will get things done. Sometimes at the expense of either the project or the team. Or both. The biggest risk with making these combined roles is that unless you really know that you are compromising the roles you can cause serious damage. Not just to the deliveries and the teams as they do not get the attention they need, but also to the individual you are trying to hire. It is very easy to burn someone out with a combined role, especially if the expectations if that you should do both roles at 100%. The very least you must always do when defining combined roles is to define the ratio. How much time should be spent where and why. For anyone looking to fill a combined role, here are some examples and some sugegstions on how to approach them: Scrum Manager - Focus on the Scrum Master part. By making the team working well you will get most of the work as a project manager for free. Deliver reports to the steering with focus on risk mitigation and finance. Progress will come of itself if you focus on the Scrum Master part correctly. If put in a compromised position, always protect the team. It will serve you best in the long run. This is a sure way to burn yourself out if you try to do both at 100%, so be weary of the signs and make sure you get plenty of time to actually work and not just sit in meetings. Full stack x - Most designers or developers are full stack, kind of. We do take an interest in what is around us and we dabble in the surrounding fields naturally. So just make sure you are not expected to actually be responsible for anything you are not comfortable with and you will be fine. Developing Architect/Scrum Master - This is one of the most devestating roles you can have. As an architect or Scrum Master you will be in meetings constantly, whch means that any attempts to actually develop anything will be a massive source of frustration. If you will attempt this, dedicate blocks of time to development that can not be disturbed. Preferably you work from home or in a separate room with phone, mail and other distractions turned off. Minimum of 4 hours blocks, but I suggest full days for focused work. Avoid this if possible or accept that the amount of developing you will do is most likely next to nothing or will happen during weekends and night time. Scrum Master and QA - While most Scrum Master will assist in QA by doing tests or gathering requirements, that is not their actual job. Being a tester or a reuirements analyst is a full time job, just like being a scrum master. If you are going to split your attention between the two, make sure you understand the cost both to you and your team. You will not be doing any 40 hour weeks, but rather do 60 hour weeks to make this work and the stress will be intense. Be mindful of combined roles as they can spiral and become very stressful. What may look like an opportunity to show your skills, especially if you are new in the role(s) can put you on the bech for years if you are unlucky. If you are looking for people to join your team, always look towards who need that role. Is it for management taking care of the need of the people above, then hire a manager. If the person is taking care of the team, then hire a scrum master. If you need someone to do focused develop, hire a developer. If you need someone to take responsibility for the code structure, hire an architect, or elevate a development lead. And so on... Combined roles have always been a part of working in IT. As long as you know what you are expected to do and know you can handle it even when things get rough, then ignore the title and do the job. Also be careful about dividing your work because that also can cause serious health issues. Above I have some of the combined roles I see a lot. What roles do you see and how do you handle them?
    1 point
  41. In this article, we suggest you to get acquainted with the free editor of web languages - CodeLobster IDE. It is presented on the software market for a long time already, and it wins a lot of fans. CodeLobster IDE allows you to edit PHP, HTML, CSS, JavaScript and TypeScript files, it highlights the syntax and gives hints for tags, functions and their parameters. This editor easily deals with those files that contain a mixed content. If you insert PHP code in your HTML template, then the editor correctly highlights both HTML tags and PHP functions. The same applies to CSS and JavaScript/TypeScript code, which is contained in HTML files. The program includes auto-completion function, which greatly speeds up the programmer's work and eliminates the possibility of errors. CodeLobster IDE provides contextual help on all supported programming languages, it uses the most up to date documentation at this moment, downloading it from official sites. So we can quickly get a description of any HTML tag, CSS attribute, PHP or JavaScript/TypeScript function by pressing the F1 key. The built-in PHP debugger allows you to execute PHP scripts step by step, sequentially moving through the lines of code. You can assign check points, view the process of the work of loops, and monitor the values of all variables during the execution of the script. Other useful functions and features of the IDE: A pair highlighting of parentheses and tags - you will never have to count parentheses or quotation marks, the editor will take care of it. Highlighting of blocks, selection and collapsing of code snippets, bookmarks to facilitate navigation on the edited file, recognition and building of the complete structure of PHP projects - these functions ensure easy work with projects of any scale. Support for 17 user interface languages, among them English, German, Russian, Spanish, French and others. The program works on the following operation systems: Windows 7, Windows 8, Windows 10, Mac OS, Linux, Ubuntu, Fedora, Debian. The professional version of CodeLobster IDE provides the programmer with even more features. For example, you have an opportunity to work with projects on a remote server with use of the built-in FTP client. You can edit the selected files, preview the results and then synchronize the changes with the files on the hosting. In addition the professional version includes an extensive set of plug-ins: Fully implemented support for JavaScript (and TypeScript) libraries, such as jQuery, Node.js, AngularJS, AngularTS, BackboneJS, EmberJS, VueJS and MeteorJS. A large set of extensions that help to work with PHP frameworks - CakePHP, CodeIgniter, Laravel, Phalcon, Smarty, Symfony, Twig and Yii plug-ins. Plugins for working with the most popular CMS - Drupal, Joomla, Magento and WordPress. Also CodeLobster IDE has special plug-in for Bootstrap. We can download and install any framework directly from the program without being distracted from the main tasks. In general, for a year of work, our team had no complaints against the editor. CodeLobster IDE works fast, does not hang and allows us to work even with large PHP projects. You can download CodeLobster IDE from the original website: http://www.codelobster.com/
    1 point
  42. Today is my birthday. It is also the first birthday of this website after I converted it to use Invision Community. This last year have been filled with ups and downs, not just in life but the entire world seem to be having trouble finding it's footings. As I move into year two of the latest incarnation of this website it is time to find that footing again, at least for this website. When I started the conversion last year it was just another experiment. A way to try out the good old Invision Community again. Something I have done on and off since 2002 or so, but never really stuck with. What I found was that Invision Community was working very well for me now. The many years had matured Invsion Community as a product and as I got deeper into the template system it really appealed to me as it allowed me a creative freedom that not even Wordpress can match. In this last year I have created hundreds of blogposts, hundreds of videos have been added and I have recreated my entire swedish blog again. I have built several databases such as the Awesome People section and My Projects section. I have also had a few setbacks such as loosing all graphics for some strange mishap at my hosting company and also had my account ravaged by virus due to the presence of my old Wordpress site. This has since been corrected and I am now on a new webhost and I have setup an AWS hosting for images (which also cost me dearly due to a script malfunction, but that has since been corrected). Over all it has been a good year, filled with exploration and learning. My passion for front end development have been reignited and my passion for design has also returned. The writing comes and goes, but overall I feel good about it and i feel that it is far easier to write using Invision Community than it is to use Wordpress. It suits me better I think. Moving forward Last year I wrote some goals for this website in the form of short term, medium term and long term goals. These goals are still valid and while I have created the databases and I have a design that works for at the moment, I will rebuild this design again as part of the 4.5 upgrade. Short Term Goals My short term goals is to upgrade the site to version 4.5. With that comes some new features, but the main goal is to reset the structure and design bit. I have played around and experimented a bit in the last year and it is time to clean that up now. So the first short term goal I have is to build a new design, recreating the current design for the 4.5 version. This includes building some new templates that I need for certain databases, but also organize the databases properly. One of those templates I want to build is to recreate the block design I currently use for this blog. It is based from a purchased application and as much as I like it, I do not need the functionality. I also want to build a design I can understand fully and can control rather than relying on someone elses design. I also want to experiment a bit and use css grid, flexbox and maybe even currentColor, which will be superfun I think. The second template is a listing template that I will use for things like My Education and if I decide to add a reference feature, like the CSS reference on w3schools. It will be a very simple template, but very useful for different types of listings. Another short term goal I am working on right now is to update all the projects in My Projects and rebuild My Gallery section. Medium Term Goals The medium term goals will be to create the information for guest blogging and about this site. About this site is not just for the visitors as I also need to define what this site is for myself. I also need to figure out who I build the site for so I know what to create for them. For this purpose I am starting to create sort of a personas gallery for myself, which is actually already helping me focusing the content a bit. Guest blogging is probably not going to take off that much in year 2, but I still want to make sure it is easy to understand how to do it. Having a page and instructions on what it means to guest blog is just a first step however. I still need to build a few things to make it valuable for the guest bloggers so I can repay them for their contributions. I have create a new user group just for authors and I am considering to build a new database for them as well. With the My Projects on it's feet I will take another look at My Roles. I realize that it is quite easy to build a CV - like structure by connecting to the My Projects database. So I will build a new template for this later this fall and combine that with acual CV's as time permit. Long Term Goals The long term goals for year 2 will be to create more content that is helpful. What I mean by that is that much of what I write here is mostly for me. It is news that I think is interesting and my own thoughts mostly. While that is good and fine, I also want to make sure that I add content that can help and inspire. Things like short tutorials, downloadable graphics and inspiring posts on new tools or practices is probably more useful for a visitor, so I will focus a bit extra on that in year 2. It takes a bit more time and energy, but I think it will be worth it. I get a lot of questions on how I built this site, so I am going to write more about that. I know how hard it can be to get started with Invision Community as the information is a bit scattered, so if I can help people get started, then that would be great. Overall the long time goal is still to provide useful information and resources to make people want to come here. The long time goal is also to use this site as a way to keep my toes wet in the front end development area and the design area primarely. These long term goals always balance against me having fun. This site can never be a source of stress, that would defeat it's puprpose. Slow and steady progress over perfection as time permit is key. As is doing this with love, not obligation because this is a website created to satisfy my need to write and create. Nothing more. Nothing less. Onwards to year 2 with new adventures and discoveries!
    1 point
  43. Last year the team behind Chromium announced that support for the transport protocols 1.0 and 1.1 would no longer be supported in a future update. Since January this year unsecured sites have seen warnings and now in March all sites secured using the 1.0 and 1.1 versions of TLS will see a full page interstitial warning. The fact that TLS (Transport Layer Security) 1.0 and 1.1 are insecure has been known for a while and it makes sense to remove support for them. Despite that TLS 1.2 was released 10 years ago there are still around 0.5% of all sites still using the now 20 year old 1.0 and 1.1 protocols. I assume this might be more troublesome than it sounds as I still see people using the old transport protocols in their infrastructure in a way that makes it almost impossible to upgrade. If you have a commercial website of any kind, then having Chrome block your site because the server uses an old transport protocol will be bad. Very bad. Your visitors will most likely leave and your Trust values will plummet. So make sure you have checked this before the last step is taken by Chromium. If your site have issues then you should see a SSL warning if you use Chrome 79 or higher. Source: https://blog.chromium.org/2019/10/chrome-ui-for-deprecating-legacy-tls.html
    1 point
  44. When working with IT projects you can not help but to run into defects and issues in different environments that require fixes. Strangely enough this is often poorly defined and I have seen some creative ways to manage the many different things that is being called defects. So what is a defect really and if something that is not working is not a defect, what is it and how do we handle those? Defect. Bug. Incident. You have probably heard all of them mentioned, probably in the same development project even. Maybe you are one of those unfortunate ones that even have something as weird as a "defect type" to define what type of defect you are dealing with? Well, you are not alone. This is a common issue in many organizations and in this article I will describe my point of view on this subject. What is a defect, for real? This is the ONLY definition of a defect. I know a lot of people will object to this because defects can be found that is not described in a functional, or non-functional, requirement. This is true, but you forget that we always have implicit requirements such as that the system should work as intended. This means that all defects can be tied to a specific requirement, or to an implicit requirement. The only issue with this is that for some tests it can be hard to actually connect a defect to a specific requirement. This happens especially with exploratory testing and in large, complex solutions. That is perfectly ok and you should not spend time finding the exact requirement if it does not have a positive impact on the work process itself. We want to improve the quality of the system after all, not build the perfect documentation. The different types of defects As a Jira expert who design workflows for many organizations I sometimes get asked to add a custom field for labeling defects in different ways. The answer is always no. You can not have different types of defects because it is either something that is not working according to a requirement or it is not. It is as simple as that. Adding labels to defects is just a band-aid for a work processes that does not work. Common labels people want to use in these situations are: Not a Defect - This one is hilarious to me. If it is not a defect, then just close it and move on. No need to have it open with a label saying it is not a defect. That is just a sign of uncertainty from the team that you do not have the courage to actually close things. System issue - This is a label that again is just stupid. It is still a defect, you are just pointing towards someone else to blame for the mess. Don't add a label, just hand it over to another team. New Requirement - You can not have a defect that is also a new requirement for obvious reasons. If this was timetravel you would just be responsible for creating an endless loop. Close the defect and create a new requirement, or change the defect to a new requirement. Changed Requirement - This is just petty and a bit cowardly because if you are dealing with unclear requirements then you bring that up as a problem and fix it. If you have a proper requirement process, then this will never occur, so just close the defect if someone change the requirement after development starts and add a new development task for it. Don't feed the trolls that are responsible for poor requirement management, squash them and get things working the way they should. Design bug - Design is part of the requirement process. If you have a defect because the design was updated, then see my comment on changed requirement. If you did not follow the design specification, then it's just a defect. Can Not Reproduce - Well, that happens and what you do is that you make sure you have steps to reproduce and that you talk to the reporter. If you can not reproduce despite that, then you just close the defect. Wrong Team - Well, then just reassign the defect to the right team then. This is just lazy... In most cases labels like these are invented because the team do not feel comfortable bringing up that the requirement and test process have issues. Rather than adding labels to passively stick it in the face of the people in charge, I suggest you instead add other types of data to be added to every defect: Steps to reproduce - This is a must and it should be detailed so anyone can verify. I usually say that the reporter should ask the janitor or receptionist to verify the steps to reproduce before submitting the defect. If this is not clear, then close the defect with can not reproduce. Eventually people will learn how to write this properly out of sheer frustration. Better yet is to help educate the reporters so they get this right. Environment - Where was this found. All development should be done in 4 environments: Development, Test, Pre-prod and production. All defects should be found in test or pre-prod. Defects found in production are incidents and defects found in development just means that the development is not done yet. Affected Version - Not always applicable, but if you do not have continuous deploys several times a day all the way to production, then you should have a controlled versioning system. Anything deployed to test and pre-prod have a version, even if it is just a tag. So make sure you ask that this is added as it will help you understand what code base the defect is present in. It also make the reporters more inclined to keep track of the code deploys. Connected Requirement - This can help reducing the problem with "nagging" or scope creep. That is when you get defects that have no basis in the requirements, but are usually new requirements. If this is a big issue, then make this mandatory or close defects without this field until the reporters learn what a defect actually is. Component, Module or System - Useful to make sure the right team get the defect if you are in a multi team setup with multiple components or systems. Stop working with poorly defined defects and take control over the process for reporting defects. Crappy defects exist for a reason and while it may be very difficult to speak up in some cases you should always try. Bad defect processes will impact morale and system stability. Remember: A defect is when the solution does not match the agreed requirements. Nothing more, nothing less.
    1 point
  45. One of the most common questions I get is when to use the issue type Task in Jira. This is not surprising since Jira is intentionally not defining how to use the issue types and their hierarchy. This is to avoid restricting the users from building a way of working that is best suited for them. In this article I will explain my thoughts from a development perspective. As I have described before in the article "Setup Jira and Confluence for success - Part 2: Defining Jira Issue Types" there are three levels in the standard Jira hierarchy. Task would fall into the middle level and the sub-tasks would be the last level. This means that Task would be on the same level as a Story and that is what we can start from when defining what should a Task be for in a development perspective. In a normal workflow for development we would have a Story issue created as a result from the requirement, or need if working Agile, process. So the Story would map towards a need or requirement and as such we would have a workflow where we can trace actions from idea all the way to production. Then where do Task fit into that workflow? In most cases it will not as a task would not be a part of a requirement or a need. That is what a Story is for. A Task is most likely only going to be used for Task management rather than as a workflow. This means that a Task would most likely be something that have limited states such as New, In Progress and Closed. It might even just have New and Closed to be even closer to the way task management is defined. In a development situation where you need to have a workflow a Task is best suited for activities that are not directly related to the workflow. Things like setting up environments, prepare presentations or Demos and even things like buying cake for the next retrospective (which of course always is mandatory!). If you use Tasks in this way, then sub-tasks would follow the same pattern. For a development task for example you might need to schedule a meeting with an external vendor to go over the API details for an integration. For a test task you might need to organize a workshop for end to end testing across multiple teams and systems and so on. In short, my definition is that Tasks are used for internal task management that is not directly related to the workflow. Do you agree or disagree?
    1 point
  46. This is a repost from Atlassian's blog where the latest updates to the Atlassian cloud platform is posted. It is reposted here since the Atlassian blog does not have an RSS feed and so we can discuss the changes to the Atlassian Cloud architecture. You can follow these posts withe the tag "atlassian cloud changes". Atlassian Cloud Your cloud-hosted products are supported by the Atlassian Cloud platform. This section usually includes changes related to multiple Atlassian Cloud products, site administration, and user management. See more data from the active users chart The Active users chart now includes up to one year of data and a way to filter by your organization’s products. From admin.atlassian.com, select Security < Insights to see the Active users chart. Requires an Atlassian Access subscription Email users with suggested account changes From the Change details button, you can suggest that a user changes their account details to make their profile more consistent and easier to identify. Read more about administering Atlassian accounts. Give your users a Trusted permission From a user's Permission options, select Trusted to give certain users more responsibility. These users will be able to install and configure new products on your site and invite new users themselves. Claim accounts after verifying a domain To start managing accounts on your domain, we’ve included an additional step that requires you to claim accounts after verifying that you own the domain. From the table on the Domains page, click Claim accounts next to the verified domain. Read more about verifying a domain. Set your language and time zone for Jira and Confluence in your Atlassian account profile Rather than individually setting your language and time zone in Jira and Confluence, these preferences will soon come from your Atlassian account profile. Visit your account preferences to update these settings. It may take up to 10 mins before your updated preferences are reflected in Jira and Confluence. Jira platform Changes in this section usually apply to all Jira products. We'll tell you in the change description if something is only for a specific Jira product. Create roles to fine-tune permissions and access in your next-gen projects Roles allow you to fine-tune how people access and interact with your project. In real life, people play different roles in your project work. Your team may have a dedicated Scrum master, or you may work with consultants or contractors. In Jira, different roles may need limited access to the content of your team’s work. Or, you might want to limit what some people are able to do in your project. For example, you may want to allow only your team’s Scrum masters to plan and manage your upcoming sprints. Or, you might want to prevent a consultant from changing an issue’s status. In next-gen projects, you can tweak the way people interact with your project by creating your own roles with specific project permissions. Then, when you add people to your project, you can assign them a role to ensure they interact the way you expect them to. To try it out, go to Project settings > Access in your next-gen project (Project settings > Internal access in your next-gen service desk). Learn more about roles in next-gen software projects. Learn more about roles in next-gen service desks. New user profile cards When you hover over someone’s name in directories, on dashboards, and in user picker fields, you’ll now start to see rich profile cards with more information and a link to the user’s profile (if you have permission to see it). Next-gen: Epic panel in backlog You can now manage epics on the backlog of your next-gen project via the Epics panel, similar to how epic management works in classic Jira Software projects. Changes you make in the panel on the backlog will reflect on the Roadmap, and vice-versa. Find issues you've recently worked on We’ve added a new Worked on tab to the Your work page. This tab lets you quickly find and resume work on issues you’ve updated recently. Head to Your work > Worked on to get started. Having trouble with next-gen projects? Better help is here. We improved our in-product help experience. Try the Help button in the navigation bar to see help articles related to your next-gen project or service desk. Jira admins: Get more insights into your projects We’ve added a Last Issue Update column to the Jira Settings > Projects page. This column displays the most recent date when someone updated an issue—just to give you an idea of what’s going on with the projects. Portfolio for Jira - Team Offset Change Portfolio has changed how it schedules work for teams to better reflect planning reality. Previously, if one of the teams in the plan had an active sprint that had already started in the past, Portfolio would schedule work for that team in the past. However, just because that team had an active sprint that’s already started, Portfolio would go ahead and schedule work for other teams in the plan, even if these teams didn’t have an active sprint that’s started in the past. We’ve changed this so work will no longer be scheduled for the other teams in the plan that don’t have an active sprint. Rather, Portfolio will now schedule work for these teams starting the next day. Portfolio for Jira - Scheduling with Adapted Sprint Dates Previously, the capacity of the last day of a sprint would be fully allocated to the sprint itself. This makes a 2-week sprint on a board have 11 work days of capacity in Portfolio. We've now improved capacity calculation so that the capacity of a sprint's last day will no longer be allocated to the sprint itself. A 2-week sprint will now have 10 work days of capacity. Jira Software We're rolling out a new type of project known as next-gen. By default, any Jira Software licensed user can create their own next-gen project. These projects don't affect existing Jira projects, shared configurations, or your schemes. You can manage who's allowed to create next-gen projects with the new Create independent projects global permission. Read more about next-gen projects. GitHub app on the Atlassian Marketplace We've partnered with GitHub to build a new and improved integration, which you can install at the Atlassian Marketplace. This replaces the DVCS connector in Jira's system settings. Current GitHub integrations set up under the old method will continue to work, but new integrations must be set up using the app on the Atlassian Marketplace. We're rolling out this update gradually, so it may not be on your Jira Cloud site yet. This won't affect GitHub Enterprise integrations, which must still be set up via the DVCS connector. Next-gen: Create child issues on your roadmap You can now add child issues directly on your roadmap. Just hover over an epic, click the + icon, and give your issue a name. Learn more about managing epics on the roadmap. Jira Service Desk New issue view for Jira Service Desk The new issue view groups key actions and information in a logical way, making it easier for you to scan and update requests. Learn more about the new issue view. Use keyboard shortcuts in your queues Use keyboard shortcuts to navigate around your queues and get your work done faster. You can now move through issues, select their fields, and go to the issue view from your queues just by using your keyboard! Maintenance complete on the customer portal user profile page We have just completed some maintenance on the customer portal user profile page. We also introduced a new layout that is easier to use on mobile devices. Go team! Global create can select request type and raise on behalf of You can now create a request on behalf of your customers and set them as the reporter. Use the global create button ( + ), then select Raise this request on behalf of and add in your customer's email. Confluence Ancestor filter on the new advanced search page You now have an additional filter when using advanced search that lets you narrow the results to pages under the page you selected. This is great when you have a general idea of where the page is that you want, but you can’t remember exactly where. Paginated contributors As a start, Frontend will be be breaking down the contributors to 2 parts, first get the top 2 avatars and then on ‘load more’ will do get the all rest of contributors. Current limitation: Frontend uses Atlaskit component Avatar groups to show the avatars in contributors, but it doesn’t support pagination right now. A improvement request has been made and once they support it, we can modify the page contributors to have true pagination. Your editing experience just got an upgrade The new Confluence editor allows anyone to create beautiful, powerful pages effortlessly. Check out the editor roadmap to learn more. End of support for nested tables As we work on creating a more stable editing experience, we will no longer support nested tables - that is, a table within a list, block quotes, or another table. Existing nested tables will not be affected, you simply won't be able to create new nested tables. We're extending editing improvements to all pages on Android The editing improvements we made to blogs a few months ago are coming to the rest of your Android mobile pages, too. In addition to being faster and more reliable, your new pages are also responsive, optimized for readability, and have advanced tables. Some macros are still missing as we rebuild them, but you can check the list of changes and track updates to macros on our docs site. Annotate images in the new editor Annotate images by adding text, inserting shapes and lines, using brushes, or adding a blur to a certain area. Confluence Cloud recent pages drawer We’ve made it easier to get to the pages you visited or worked with most recently. A new action has been added to the global sidebar that presents you with a list of your recent pages; interaction-specific tabs help you narrow the list based on your actions, like visited, edited, or saved as draft. Share pages directly with your team It’s now easier to share pages with everyone on your team, all in one go. When you click Share on any page or blog post, Confluence now lets you add a team – no need to enter each person individually. Learn more Jira issue URLs are converted to smart links When you paste a Jira issue link into a Confluence page, the URL is converted to a smart link that displays the page icon and the page title. This works if the Jira and Confluence sites are linked or if they are both cloud versions. Convert pages to use the new editor You can now convert your existing pages that were created using the legacy editor to use the new editing experience! Learn more Confluence navigation just got better Get to information faster with improved navigation – making what you need visible from anywhere in Confluence. Learn more Align and resize images in tables in the new editor When images are inserted in table cells, you now have the ability to align and resize them. Portfolio for Jira plan macro The Portfolio for Jira plan Confluence macro lets you embed a Portfolio for Jira Server and Data Center plan in a Confluence page. Join key stakeholders in the spaces where business goals are built and tracked, and share how work is progressing across multiple projects and teams. Improved expand element replaces the macro Content creators just got a better way to control the way information is presented. The existing expand macro has been replaced with a quicker, easier way to include the expand functionality. Insert the improved expand element using /expand or by inserting the element from the editor's Insert toolbar. Bitbucket Create a Jira issue from a pull request comment You can now create a Jira issue from a pull request comment. This new feature also enables you to choose the project where you will create the issue. New Code Review - Limit the amount of rendered diff content Limits the amount of pull request content rendered in the diff and file tree to improve browser performance. Limits include the overall # of files and # of lines for the entire diff. Learn more
    1 point
  47. This is a repost from Atlassian's blog where the latest updates to the Atlassian cloud platform is posted. It is reposted here since the Atlassian blog does not have an RSS feed and so we can discuss the changes to the Atlassian Cloud architecture. You can follow these posts withe the tag "atlassian cloud changes". Atlassian Cloud Your cloud-hosted products are supported by the Atlassian Cloud platform. This section usually includes changes related to multiple Atlassian Cloud products, site administration, and user management. Email users with suggested account changes From the Change details button, you can suggest that a user changes their account details to make their profile more consistent and easier to identify. Read more about administering Atlassian accounts. Give your users a Trusted permission From a user's Permission options, select Trusted to give certain users more responsibility. These users will be able to install and configure new products on your site and invite new users themselves. Claim accounts after verifying a domain To start managing accounts on your domain, we’ve included an additional step that requires you to claim accounts after verifying that you own the domain. From the table on the Domains page, click Claim accounts next to the verified domain. Read more about verifying a domain. Jira platform Changes in this section usually apply to all Jira products. We'll tell you in the change description if something is only for a specific Jira product. New issue view: Add web links Save time and add context to your issues by adding web links in the new issue view. Web links are links to any URL, but they appear prominently below the issue description where they’re easy for you and other issue viewers to find. Use them to link to important sites that teammates might need to better understand an issue. We’re also moving all issue link types, including web links, into the Link issue button. Click Link issue to quickly link related issues or click the down arrow on the button to add links to web pages and Confluence pages (if you have a linked Confluence site). Tame your site’s custom fields See the number of custom fields on your site, so you know if they’re getting out of hand. We've introduced icons to illustrate each type of custom field so you can easily identify them. We’ve also grouped screens and contexts for each custom field into a single Screens and contexts column to make them easier to edit and make the page more readable. Head to Jira settings > Issues > Custom fields to check it out. Click a field’s screens or contexts links to: Edit its name and description. Associate it with screens. Create, edit, or delete contexts. Set or edit its default value. Learn more about custom fields. Create roles to fine-tune permissions and access in your next-gen projects Roles allow you to fine-tune how people access and interact with your project. In real life, people play different roles in your project work. Your team may have a dedicated Scrum master, or you may work with consultants or contractors. In Jira, different roles may need limited access to the content of your team’s work. Or, you might want to limit what some people are able to do in your project. For example, you may want to allow only your team’s Scrum masters to plan and manage your upcoming sprints. Or, you might want to prevent a consultant from changing an issue’s status. In next-gen projects, you can tweak the way people interact with your project by creating your own roles with specific project permissions. Then, when you add people to your project, you can assign them a role to ensure they interact the way you expect them to. To try it out, go to Project settings > Access in your next-gen project (Project settings > Internal access in your next-gen service desk). Learn more. Next-gen: Epic panel in backlog You can now manage epics on the backlog of your next-gen project via the Epics panel, similar to how epic management works in classic Jira Software projects. Changes you make in the panel on the backlog will reflect on the Roadmap, and vice-versa. Find issues you've recently worked on We’ve added a new Worked on tab to the Your work page. This tab lets you quickly find and resume work on issues you’ve updated recently. Head to Your work > Worked on to get started. Having trouble with next-gen projects? Better help is here. We improved our in-product help experience. Try the Help button in the navigation bar to see help articles related to your next-gen project or service desk. Jira admins: Get more insights into your projects We’ve added a Last Issue Update column to the Jira Settings > Projects page. This column displays the most recent date when someone updated an issue—just to give you an idea of what’s going on with the projects. Jira Software We're rolling out a new type of project known as next-gen. By default, any Jira Software licensed user can create their own next-gen project. These projects don't affect existing Jira projects, shared configurations, or your schemes. You can manage who's allowed to create next-gen projects with the new Create independent projects global permission. Read more about next-gen projects. Copy issue links from boards and backlogs Don’t spend time opening and closing issues just to copy a link to the issue. From a board or backlog, right-click on an issue and choose Copy issue link. GitHub app on the Atlassian Marketplace We've partnered with GitHub to build a new and improved integration, which you can install at the Atlassian Marketplace. This replaces the DVCS connector in Jira's system settings. Current GitHub integrations set up under the old method will continue to work, but new integrations must be set up using the app on the Atlassian Marketplace. We're rolling out this update gradually, so it may not be on your Jira Cloud site yet. This won't affect GitHub Enterprise integrations, which must still be set up via the DVCS connector. Next-gen: Create child issues on your roadmap You can now add child issues directly on your roadmap. Just hover over an epic, click the + icon, and give your issue a name. Learn more about managing epics on the roadmap. Jira Service Desk New issue view for Jira Service Desk The new issue view groups key actions and information in a logical way, making it easier for you to scan and update requests. Learn more about the new issue view. Use keyboard shortcuts in your queues Use keyboard shortcuts to navigate around your queues and get your work done faster. You can now move through issues, select their fields, and go to the issue view from your queues just by using your keyboard! Global create can select request type and raise on behalf of You can now create a request on behalf of your customers and set them as the reporter. Use the global create button ( + ), then select Raise this request on behalf of and add in your customer's email. Confluence New loading progress bar Now when a page is loading, you’ll see a thin blue loading bar slide across your screen, just under the top navigation, to give you a better idea how quickly your page is loading. This is for users with the improved navigation experience activated. Your editing experience just got an upgrade The new Confluence editor allows anyone to create beautiful, powerful pages effortlessly. Check out the editor roadmap to learn more. End of support for nested tables As we work on creating a more stable editing experience, we will no longer support nested tables - that is, a table within a list, block quotes, or another table. Existing nested tables will not be affected, you simply won't be able to create new nested tables. We're extending editing improvements to all pages on Android The editing improvements we made to blogs a few months ago are coming to the rest of your Android mobile pages, too. In addition to being faster and more reliable, your new pages are also responsive, optimized for readability, and have advanced tables. Some macros are still missing as we rebuild them, but you can check the list of changes and track updates to macros on our docs site. Annotate images in the new editor Annotate images by adding text, inserting shapes and lines, using brushes, or adding a blur to a certain area. Confluence Cloud recent pages drawer We’ve made it easier to get to the pages you visited or worked with most recently. A new action has been added to the global sidebar that presents you with a list of your recent pages; interaction-specific tabs help you narrow the list based on your actions, like visited, edited, or saved as draft. Share pages directly with your team It’s now easier to share pages with everyone on your team, all in one go. When you click Share on any page or blog post, Confluence now lets you add a team – no need to enter each person individually. Learn more Jira issue URLs are converted to smart links When you paste a Jira issue link into a Confluence page, the URL is converted to a smart link that displays the page icon and the page title. This works if the Jira and Confluence sites are linked or if they are both cloud versions. Convert pages to use the new editor You can now convert your existing pages that were created using the legacy editor to use the new editing experience! Learn more Confluence navigation just got better Get to information faster with improved navigation – making what you need visible from anywhere in Confluence. Learn more Align and resize images in tables in the new editor When images are inserted in table cells, you now have the ability to align and resize them. Portfolio for Jira plan macro The Portfolio for Jira plan Confluence macro lets you embed a Portfolio for Jira Server and Data Center plan in a Confluence page. Join key stakeholders in the spaces where business goals are built and tracked, and share how work is progressing across multiple projects and teams. Improved expand element replaces the macro Content creators just got a better way to control the way information is presented. The existing expand macro has been replaced with a quicker, easier way to include the expand functionality. Insert the improved expand element using /expand or by inserting the element from the editor's Insert toolbar. Bitbucket New Code Review - Limit the amount of rendered diff content Limits the amount of pull request content rendered in the diff and file tree to improve browser performance. Limits include the overall # of files and # of lines for the entire diff. Learn more Create a Jira issue from a pull request comment You can now create a Jira issue from a pull request comment. This new feature also enables you to choose the project where you will create the issue.
    1 point
  48. Jimi Wikman

    My trip to Moscow

    Last week I went on a trip to Moscow to lead some workshops for my current assignment. This was my first trip to Moscow and to Russia in general. Not only did I enjoy my time in Moscow, I find myself considering going back again as a tourist. My trip began a few of weeks before traveling as you need a visa to travel to Moscow. This required some documents and a trip to the Russian visa central. Since we got all the documents in advance this was quick and easy. A waiting period for about 10 days and then we could pick up our visa and travel to Moscow. At Arlanda Airport we traveled with Aeroflot from terminal 2, which is a pretty small terminal compared to the ones I usually travel from. Me and Christan must have been a bit tired, because we missed that we were at the wrong gate and that the restaurants where all upstairs. It all worked out well of course, but we laughed a bit at it afterwards. I am not a frequent flyer by any means, but I have taken a few flights in my days and passing through customs in Moscow was a new experience. Not many speak English (or at all) at the airport and you have to go through several checkpoints which takes forever. It's not annoying or stressful, it just takes extra long due to the many checkpoints. Some checkpoints are even just a few feet apart, which feels a bit redundant. Once cleared we had a taxi waiting for us. The trip took about 90 minutes and cost almost nothing compared to the cost here in Sweden. The hotel had a pretty small lobby and we arrived just as a bus was checking in. I know well how stressful this is from my time working in hotel, but the receptionist checked us in with grace and great attitude. Top score right there. We had a burger king just outside the hotel so we just grabbed a burger and Pepsi cherry by mistake and then went to bed. It was a long day, but overall a smooth trip. The next day we had workshop with the client and afterwards we had a dinner together. We went to a Nordic restaurant called Björn and had some good food. After the meal we got a nice tour of the red square and of course the subway by our hosts Mikhail and Roman. Me and Christian decided that even though we got a nice tour of the red square, we wanted to see it in daylight as well. Day 2 was workshops again and after we wrapped that up we started a walk that would last for almost 5 hours. We aimed for Gorky park and headed out. Going a little bit west we continued to be amazed over how clean Moscow is and how amazing the architecture is. The buildings are impressive and everywhere we stood in awe over the structural pieces of art. Passing through a busy Gorky park we moved towards the river and headed towards the red square. We passed the enormous statue of Peter the Great and then took the bridge over to the Kreml and the red square. Just on the right after the bridge there are some spectacular structures that give an amazing view over Moscow and the Moscow river. After a long walk around the surrounding areas around Kreml to see Bolshoi Theater and Lubyanka prison we ended up watching a bunch of Scotsmen playing just outside the Kreml. This of course was because at the time of our visit there was a competition for military music groups from all over the world. On our way home we decided to walk and we got to see a little about Moscow's nightlife. As expected it was pretty calm and cosy with some musicians playing in the parks and soft music playing in the pubs. I am sure this is a bit different in the weekends, but it was just the right amount of people out for my taste on the weekdays. Going back home took a while. We started at 5 in the morning and took a cab to the airport before 6, just to be sure that we would not have any issues before our flight was leaving at 10.40. The cab drive took a little over an hour and at the airport we had to stand in line for 40 minutes just to check in. After that it was the long process of getting through to our flight through all the checkpoints. It took another hour and I actually got stuck in a very strange situation where the woman before me was having a heated argument with the woman forcing her to step back and take off her shoes before passing the security checkpoint with the scanner. it was awkward because the woman working in the checkpoint waved me to pass through, but the woman without shoes would not let me pass. Eventually we got through and had a smooth flight back to Sweden. I got stuck on the last row and I had company by a nervous guy from India going to Uppsala to study and a restaurant chef returning from a 3 month visit with family in Mongolia. We had an interesting chat on our way back to say the least. Once back home in Sweden we had a very long queue to get past the visa check, but as a swede I could pass right trough. Thank you for that Arlanda! Once home I was super tired and fell aslep in the afternoon. My head desperately trying to process the workshops and of course the amazing city of Moscow. It was an amazing trip.
    1 point
  49. This site is still very much in it's infancy and I have some plans for it that. Some are short term, some medium term and some are long term. What you can expect regardless, is a lot of content and resources. Hopefully also some interaction, even if that is not the immediate goal. Short Term Goals My short term goals in the next month or two are to continue to build up the layout and content areas. Right now this site have a good core for creating content where focus will of course be this blog. The design is still not 100% and I have some cleaning up to do for the Pages section especially. As I get the basics done for my Projects section and my Education sections I will start adding the content. You can expect that to happen quite soon. Also in the short term goals I will work on building content for the videos section and rebuild my Swedish Blog. Medium Term Goals The Medium goals in the next 6 months are to add new content areas such as Profiles and Hosting databases. Profiles will be a continuation of my interview series I started almost 2 years ago. The idea is to present and promote people that I think are interesting and amazing. In some ways it can tie into helping people to get new business and job opportunities, but the main goal is just to showcase amazing people. The hosting database is a pet project since I have been involved in the hosting business for almost 20 years now. It will be a little experiment on making a review database as well as testing to see if it is possible to make some passive income from referrals. Hopefully it can also generate sales and new clients for the hosting companies as well as make things easier for new webmasters looking for a place to host their sites. I might add additional databases as well such as Books and Movies & TV databases, but I don't want to rush or spread myself to thin. Long Term Goals My website has always been about experimentation and exploring the ways the web can be utilized for different things. As I now have a very powerful foundation for building all kind of content I will explore many, many exciting things here. This platform also have a very strong community foundation and my long term goal is to make this a natural place to become a member on. I want to use this platform as a way for me to express myself and showcase my own thoughts and creations, but also as a way to share my knowledge and experiences. If I can help someone to a more successful career by sharing my network of contacts or support someone who are in need of guidance or just to listen, then that would be amazing. I have been building this site since 2002 and I am in no rush to finish it. The journey of creation is the most satisfying one and I plan to work on this one for a very long time...
    1 point
  50. As I am leaving the current project, due to the fact that I am leaving for another company, other people are taking over my duties and I get less and less involvement in the work that I used to hold together as the spider in the web. This is very difficult as I am used to be the one in the center of all things and now I am on the outside. The new team lead do things differently and the process of change always leave a residue of confusion and every fiber in my body just want to step in and "fix" things. The thing is that there is nothing to "fix", it's just change and the fact that I no longer sit in the center of the project any more. The new team lead have things well under control and the project is doing just fine without me. The realization that you really are not that important is both liberating an a bit sad. On one hand I am glad because it means that I have succeeded in making myself obsolete and the team no longer have need of my guidance. They work just fine without me following the processes and workflows we have built together. On the other hand I feel a bit like a parent no longer being needed by their children and they move from home. Just in reverse as I am the one leaving. It's a bit sad to realize that you will no longer be the one they come for when they need help or the one they turn to for advice and comfort. “When you talk, you are only repeating what you already know. But if you listen, you may learn something new.” While this is a strange and sometime uncomfortable situation it is also a great opportunity to observe and learn from the new team lead and also to lift my gaze and look at things outside my part of the project. It's quite interesting and it's a very good learning experience, especially when you can pick up on body language. I see so many things now that I have not yet had time to observe before and it give me a wealth of new insights. So I am in a position right now that feels a bit weird, mostly because I am not just leaving the project, but the company as well. It's also sad as I have to much time to think about how much I will miss my team and my co-workers when I leave. Have you ever been in the same position and what did you learn from that?
    1 point
×
×
  • Create New...