1(globalThis.webpackChunkdiscours_io_frontend=globalThis.webpackChunkdiscours_io_frontend||[]).push([[69],{14731(e,t,a){"use strict";function i(e){function t(e){return s(e)}function a(e){return c+":"+(d[e]||0)}var i=e||{},n=i.ttlMs||3e4,s=i.serialize||function(e){return JSON.stringify(e||{})},o=i.clone||function(e){try{return"function"==typeof structuredClone?structuredClone(e):JSON.parse(JSON.stringify(e))}catch(t){return e}},r=Object.create(null),l=Object.create(null),d=Object.create(null),c=0;return{getKey:t,getVersion:a,canShare:function(e){return!(e&&e.timeout)},getCached:function(e){var t=r[e];return t?t.version!==a(e)||Date.now()-t.ts>n?(delete r[e],null):o(t.value):null},setCached:function(e,t,a){r[e]={ts:Date.now(),version:a,value:o(t)}},getInFlight:function(e,t){var a=l[e];return a&&a.version===t?a:null},setInFlight:function(e,t,a){var i={version:t,promise:a};return l[e]=i,i},clearInFlight:function(e,t){l[e]===t&&delete l[e]},invalidate:function(e){if(null!=e){var a=t(e);d[a]=(d[a]||0)+1,delete r[a],delete l[a]}else{var i;for(i in c+=1,r)delete r[i];for(i in l)delete l[i];for(i in d)delete d[i]}}}}a.d(t,{X:()=>i})},30012(){!function e(t){try{var a=document.querySelector("[ng-app]")||document.body,i=angular.element(a).injector();if(!i)return t<5?void setTimeout(function(){e(t+1)},50*Math.pow(2,t)):void 0;var n=i.get("$templateCache");n.put("/components/feedSidebar/feedSidebar.html",'<div class="feed-sidebar-subscriptions" ng-if="$ctrl.subscriptions.length > 0"> <h4 class="feed-sidebar-subscriptions__title">{{ \'ÐодпиÑки\' | t }}</h4> <div class="feed-sidebar-subscriptions__list"> <div ng-repeat="sub in $ctrl.visibleSubscriptions track by (sub._id || $index)"> <a class="feed-sidebar-subscriptions__item" ng-if="$ctrl.hasLink(sub)" ng-href="{{ ::$ctrl.getLink(sub) }}" > <i class="fas feed-sidebar-subscriptions__icon" ng-class="::$ctrl.getIcon(sub)"></i> <span class="feed-sidebar-subscriptions__name">{{ ::$ctrl.getName(sub) }}</span> <span class="feed-sidebar-subscriptions__badge" ng-if="$ctrl.hasNewContent(sub)"></span> </a> <div class="feed-sidebar-subscriptions__item" ng-if="!$ctrl.hasLink(sub)"> <i class="fas feed-sidebar-subscriptions__icon" ng-class="::$ctrl.getIcon(sub)"></i> <span class="feed-sidebar-subscriptions__name">{{ ::$ctrl.getName(sub) }}</span> <span class="feed-sidebar-subscriptions__badge" ng-if="$ctrl.hasNewContent(sub)"></span> </div> </div> </div> <button type="button" class="feed-sidebar-subscriptions__toggle" ng-if="$ctrl.hasMore()" ng-click="$ctrl.toggleShowAll()" > {{ $ctrl.showAll ? (\'СвеÑнÑÑÑ\' | t) : (\'ÐоказаÑÑ Ð²Ñе\' | t) }} </button> <button type="button" class="feed-sidebar-subscriptions__settings" ng-click="$ctrl.openSubscriptionsModal()" > <i class="fas fa-cog"></i> {{ \'ÐаÑÑÑоиÑÑ Ð»ÐµÐ½ÑÑ\' | t }} </button> </div> <div class="feed-sidebar-subscriptions feed-sidebar-subscriptions--empty" ng-if="!$ctrl.loading && $ctrl.subscriptions.length === 0" > <p class="feed-sidebar-subscriptions__empty-text"> {{ \'ÐодпиÑиÑеÑÑ Ð½Ð° авÑоÑов и ÑемÑ, ÑÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¿ÐµÑÑоналÑнÑÑ Ð»ÐµÐ½ÑÑ\' | t }} </p> </div> <div class="feed-sidebar-subscriptions feed-sidebar-subscriptions--loading" ng-if="$ctrl.loading"> <i class="fas fa-spinner fa-spin"></i> </div>'),n.put("/pages/feed/feed.html",'<update-meta title="{{ \'ÐенÑа â ÐиÑкÑÑÑ\' | t }}"></update-meta> <update-meta name="description" content="{{ \'ÐенÑа пÑбликаÑий на ÐиÑкÑÑÑе â маÑеÑÐ¸Ð°Ð»Ñ Ð¾Ñ Ð°Ð²ÑоÑов, на коÑоÑÑÑ
Ð²Ñ Ð¿Ð¾Ð´Ð¿Ð¸ÑанÑ.\' | t }}" ></update-meta> <subscriptions-modal ng-if="subscriptionsModalOpen" user-path="currentUserPath" initial-tab="\'subscriptions\'" is-open="subscriptionsModalOpen" on-close="closeSubscriptionsModal()" ></subscriptions-modal> <div class="feed-auth-prompt" ng-if="showAuthPrompt"> <div class="ds-container"> <div class="tw:w-full tw:md:w-6/12 tw:md:ml-offset-3 tw:text-center"> <div class="feed-auth-prompt__content"> <i class="fas fa-rss feed-auth-prompt__icon"></i> <h2 class="feed-auth-prompt__title">{{ \'ÐаÑÑÑойÑе ленÑÑ\' | t }}</h2> <p class="feed-auth-prompt__description"> {{ \'ÐодпиÑиÑеÑÑ Ð½Ð° лÑбимÑе ÑемÑ, авÑоÑов и ÑообÑеÑÑва â моменÑалÑно ÑзнавайÑе о новÑÑ
пÑбликаÑиÑ
1Ñ
и обÑÑждениÑÑ
\' | t }} </p> <button type="button" class="ds-btn ds-btn-primary feed-auth-prompt__button" ng-click="openLoginModal()" > {{ \'СоздаÑÑ ÑÐ²Ð¾Ñ Ð»ÐµÐ½ÑÑ\' | t }} </button> </div> </div> </div> </div> <div class="feed-access-denied" ng-if="showAccessDenied"> <div class="ds-container"> <div class="tw:w-full tw:md:w-6/12 tw:md:ml-offset-3 tw:text-center"> <div class="feed-access-denied__content"> <i class="fas fa-lock feed-access-denied__icon"></i> <h2 class="feed-access-denied__title">{{ \'Раздел Ð´Ð»Ñ Ð°Ð²ÑоÑов\' | t }}</h2> <p class="feed-access-denied__description"> {{ \'РедакÑÐ¸Ñ Ð´Ð¾ÑÑÑпна ÑолÑко авÑоÑам. ХоÑиÑе ÑÑаÑÑ Ð°Ð²ÑоÑом? ÐодайÑе заÑÐ²ÐºÑ Ñ Ð²Ð°Ñим маÑеÑиалом.\' | t }} </p> <a href="/create" class="ds-btn ds-btn-primary">{{ \'ÐодаÑÑ Ð·Ð°ÑвкÑ\' | t }}</a> </div> </div> </div> </div> <div class="feed-page" ng-if="!showAuthPrompt && !showAccessDenied"> <div class="ds-container"> <div class="tw:row-flex"> <div class="tw:gutter-half tw:md:w-2/12 tw:max-md:hidden"> <div class="feed-sidebar"> <nav class="feed-sidebar__nav" role="tablist" aria-label="{{ \'Ð Ð°Ð·Ð´ÐµÐ»Ñ Ð»ÐµÐ½ÑÑ\' | t }}"> <button type="button" role="tab" class="feed-sidebar__link" ng-class="{\'feed-sidebar__link--active\': activeTab === \'all\' }" ng-click="setTab(\'all\')" ng-attr-aria-selected="{{ activeTab === \'all\' }}" > <i class="fas fa-globe" aria-hidden="true"></i> {{ \'ÐÑÑ\' | t }} <span class="feed-sidebar__badge" ng-if="unreadCounts.all > 0" aria-label="{{ \'ÐепÑоÑиÑаннÑÑ
:\' | t }} {{ unreadCounts.all }}" >{{ unreadCounts.all > 99 ? \'99+\' : unreadCounts.all }}</span > <span class="feed-sidebar__dot" ng-if="tabNeverVisited.all && activeTab !== \'all\' && !unreadCounts.all" aria-hidden="true" ></span> </button> <button type="button" role="tab" class="feed-sidebar__link" ng-class="{\'feed-sidebar__link--active\': activeTab === \'my\', \'feed-sidebar__link--disabled\': !canSeeMyFeed }" ng-click="setTab(\'my\')" ng-attr-aria-selected="{{ activeTab === \'my\' }}" > <i class="fas fa-star" aria-hidden="true"></i> {{ \'ÐÐ¾Ñ Ð»ÐµÐ½Ñа\' | t }} <span class="feed-sidebar__badge" ng-if="unreadCounts.my > 0" aria-label="{{ \'ÐепÑоÑиÑаннÑÑ
:\' | t }} {{ unreadCounts.my }}" >{{ unreadCounts.my > 99 ? \'99+\' : unreadCounts.my }}</span > <span class="feed-sidebar__dot" ng-if="tabNeverVisited.my && activeTab !== \'my\' && !unreadCounts.my" aria-hidden="true" ></span> </button> <button type="button" role="tab" class="feed-sidebar__link" ng-class="{\'feed-sidebar__link--active\': activeTab === \'editorial\', \'feed-sidebar__link--disabled\': !canSeeEditorial }" ng-click="setTab(\'editorial\')" ng-if="canSeeEditorial" ng-attr-aria-selected="{{ activeTab === \'editorial\' }}" > <i class="fas fa-newspaper" aria-hidden="true"></i> {{ \'РедакÑиÑ\' | t }} <span class="feed-sidebar__badge" ng-if="unreadCounts.editorial > 0" aria-label="{{ \'ÐепÑоÑиÑаннÑÑ
:\' | t }} {{ unreadCounts.editorial }}" >{{ unreadCounts.editorial > 99 ? \'99+\' : unreadCounts.editorial }}</span > <span class="feed-sidebar__dot" ng-if="tabNeverVisited.editorial && activeTab !== \'editorial\' && !unreadCounts.editorial" aria-hidden="true" ></span> </button> </nav> <div class="feed-sidebar__subscriptions" ng-if="isLoggedIn"> <feed-sidebar></feed-sidebar> </div> </div> </div> <div class="tw:gutter-half tw:md:w-7/12 tw:w-full"> <div class="feed-tabs tw:hidden tw:max-md:block"> <button type="button" class="feed-tabs__tab" ng-class="{\'feed-tabs__tab--active\': activeTab === \'all\' }" ng-click="setTab(\'all\')" > {{ \'ÐÑÑ\' | t }} <span class="feed-tabs__badge" ng-if="unreadCounts.all > 0" aria-label="{{ \'ÐепÑоÑиÑаннÑÑ
:\' | t }} {{ unreadCounts.all }}" >{{ unreadCounts.all > 99 ? \'99+\' : unreadCounts.all }}</span > <span class="feed-tabs__dot" ng-if="tabNeverVisited.all && activeTab !== \'all\' && !unreadCounts.all" aria-hidden="true" ></span> </button> <button type="button" class="feed-tabs__tab" ng-class="{\'feed-tabs__tab--active\': activeTab === \'my\' }" ng-click="setTab(\'my\')" > {{ \'ÐÐ¾Ñ Ð»ÐµÐ½Ñа\' | t }} <span class="feed-tabs__badge" ng-if="unreadCounts.my > 0" aria-label="{{ \'ÐепÑоÑиÑаннÑÑ
:\' | t }} {{ unreadCounts.my }}" >{{ unreadCounts.my > 99 ? \'99+\' : unreadCounts.my }}</span > <span class="feed-tabs__dot" ng-if="tabNeverVisited.my && activeTab !== \'my\' && !unreadCounts.my" aria-hidden="true" ></span> </button> <button type="button" class="feed-tabs__tab" ng-class="{\'feed-tabs__tab--active\': activeTab === \'editorial\' }" ng-click="setTab(\'editorial\')" ng-if="canSeeEditorial" > {{ \'РедакÑиÑ\' | t }} <span class="feed-tabs__badge" ng-if="unreadCounts.editorial > 0" aria-label="{{ \'ÐепÑоÑиÑаннÑÑ
:\' | t }} {{ unreadCounts.editorial }}" >{{ unreadCounts.editorial > 99 ? \'99+\' : unreadCounts.editorial }}</span > <span class="feed-tabs__dot" ng-if="tabNeverVisited.editorial && activeTab !== \'editorial\' && !unreadCounts.editorial" aria-hidden="true" ></span> </button> </div> <div class="feed-filters-row tw:max-md:hidden"> <div class="feed-sort-tabs" role="tablist" aria-label="{{ \'СоÑÑиÑовка\' | t }}" ng-if="activeTab !== \'editorial\'" > <button type="button" role="tab" class="feed-sort-tabs__tab" ng-class="{\'feed-sort-tabs__tab--active\': sortBy === \'new\' }" ng-click="setSort(\'new\')" ng-attr-aria-selected="{{ sortBy === \'new\' }}" > {{ \'Ðовое\' | t }} </button> <button type="button" role="tab" class="feed-sort-tabs__tab" ng-class="{\'feed-sort-tabs__tab--active\': sortBy === \'popular\' }" ng-click="setSort(\'popular\')" ng-attr-aria-selected="{{ sortBy === \'popular\' }}" > {{ \'ÐопÑлÑÑное\' | t }} </button> <button type="button" role="tab" class="feed-sort-tabs__tab" ng-class="{\'feed-sort-tabs__tab--active\': sortBy === \'discu
1ssed\' }" ng-click="setSort(\'discussed\')" ng-attr-aria-selected="{{ sortBy === \'discussed\' }}" > {{ \'ÐбÑÑждаемое\' | t }} </button> </div> <div class="feed-sub-tabs feed-sub-tabs--inline" ng-if="activeTab === \'editorial\'"> <button type="button" class="feed-sub-tabs__tab" ng-class="{\'feed-sub-tabs__tab--active\': !editorialSubTab }" ng-click="setEditorialSubTab(null)" > {{ \'ÐÑе\' | t }} <span class="custom-tooltip" aria-hidden="true" ng-bind-html="\'ÐбÑÐ°Ñ Ð»ÐµÐ½Ñа вÑеÑ
маÑеÑиалов, пÑедложеннÑÑ
оÑкÑÑÑой ÑедакÑии, помимо&nbsp;ÑеÑ
, коÑоÑÑе ÑÑли&nbsp;в&nbsp;«ЧÑлан».\' | t | trustedHtml" ></span> </button> <button type="button" class="feed-sub-tabs__tab" ng-class="{\'feed-sub-tabs__tab--active\': editorialSubTab === \'current\' }" ng-click="setEditorialSubTab(\'current\')" > {{ \'ÐаÑвки\' | t }} <span class="custom-tooltip" aria-hidden="true" ng-bind-html="\'ÐенÑа новÑÑ
, еÑÑ&nbsp;неопÑбликованнÑÑ
маÑеÑиалов. ÐÑйдÑÑ&nbsp;ли они в&nbsp;жÑÑнале завиÑÐ¸Ñ Ð¾Ñ&nbsp;ваÑего&nbsp;голоÑа.\' | t | trustedHtml" ></span> </button> <button type="button" class="feed-sub-tabs__tab" ng-class="{\'feed-sub-tabs__tab--active\': editorialSubTab === \'journal\' }" ng-click="setEditorialSubTab(\'journal\')" > {{ \'ÐÑÑнал\' | t }} <span class="custom-tooltip" aria-hidden="true" >{{ \'ÐенÑа вÑеÑ
опÑбликованнÑÑ
в жÑÑнале маÑеÑиалов.\' | t }}</span > </button> <button type="button" class="feed-sub-tabs__tab" ng-class="{\'feed-sub-tabs__tab--active\': editorialSubTab === \'archive\' }" ng-click="setEditorialSubTab(\'archive\')" > {{ \'ЧÑлан\' | t }} <span class="custom-tooltip" aria-hidden="true" ng-bind-html="\'СÑда попадаÑÑ Ð·Ð°Ñвки Ñ&nbsp;оÑÑиÑаÑелÑнÑм ÑейÑингом. ÐÑли ÑейÑинг поднимеÑÑÑ, они&nbsp;веÑнÑÑÑÑ Ð²&nbsp;оÑновнÑÑ&nbsp;ленÑÑ.\' | t | trustedHtml" ></span> </button> </div> <div class="feed-filter-dropdowns"> <div class="feed-dropdown" ng-class="{\'feed-dropdown--open\': typeDropdownOpen }"> <button type="button" class="feed-dropdown__trigger" ng-click="toggleDropdown(\'type\')" aria-haspopup="listbox" ng-attr-aria-expanded="{{ !!typeDropdownOpen }}" > <span class="feed-dropdown__trigger-icon" ng-if="type === \'article\'"> <svg-icon name="article" size="16"></svg-icon> </span> <span class="feed-dropdown__trigger-icon" ng-if="type === \'image\'"> <svg-icon name="image" size="16"></svg-icon> </span> <span class="feed-dropdown__trigger-icon" ng-if="type === \'music\'"> <svg-icon name="music" size="16"></svg-icon> </span> <span class="feed-dropdown__trigger-icon" ng-if="type === \'video\'"> <svg-icon name="video" size="16"></svg-icon> </span> <span class="feed-dropdown__trigger-icon" ng-if="type === \'literature\'"> <svg-icon name="literature" size="16"></svg-icon> </span> <span class="feed-dropdown__label">{{ getTypeLabel() | t }}</span> <svg-icon name="chevron-down" size="11" class="feed-dropdown__arrow"></svg-icon> </button> <div class="feed-dropdown__menu"> <button type="button" class="feed-dropdown__item" ng-class="{\'feed-dropdown__item--active\': !type }" ng-click="setType(null)" > <span class="feed-dropdown__item-content">{{ \'ÐÑе ÑоÑмаÑÑ\' | t }}</span> <span class="feed-dropdown__check" ng-if="!type"> <svg-icon name="check" size="14"></svg-icon> </span> </button> <button type="button" class="feed-dropdown__item" ng-class="{\'feed-dropdown__item--active\': type === \'article\' }" ng-click="setType(\'article\')" > <span class="feed-dropdown__item-content"> <span class="feed-dropdown__icon"> <svg-icon name="article" size="24"></svg-icon> </span> {{ \'СÑаÑÑи\' | t }} </span> <span class="feed-dropdown__check" ng-if="type === \'article\'"> <svg-icon name="check" size="14"></svg-icon> </span> </button> <button type="button" class="feed-dropdown__item" ng-class="{\'feed-dropdown__item--active\': type === \'image\' }" ng-click="setType(\'image\')" > <span class="feed-dropdown__item-content"> <span class="feed-dropdown__icon"> <svg-icon name="image" size="24"></svg-icon> </span> {{ \'ÐалеÑеи\' | t }} </span> <span class="feed-dropdown__check" ng-if="type === \'image\'"> <svg-icon name="check" size="14"></svg-icon> </span> </button> <button type="button" class="feed-dropdown__item" ng-class="{\'feed-dropdown__item--active\': type === \'music\' }" ng-click="setType(\'music\')" > <span class="feed-dropdown__item-content"> <span class="feed-dropdown__icon"> <svg-icon name="music" size="24"></svg-icon> </span> {{ \'ÐÑзÑка\' | t }} </span> <span class="feed-dropdown__check" ng-if="type === \'music\'"> <svg-icon name="check" size="14"></svg-icon> </span> </button> <button type="button" class="feed-dropdown__item" ng-class="{\'feed-dropdown__item--active\': type === \'video\' }" ng-click="setType(\'video\')" > <span class="feed-dropdown__item-content"> <span class="feed-dropdown__icon"> <svg-icon name="video" size="24"></svg-icon> </span> {{ \'Ðидео\' | t }} </span> <span class="feed-dropdown__check" ng-if="type === \'video\'"> <svg-icon name="check" size="14"></svg-icon> </span> </button> <button type="button" class="feed-dropdown__item" ng-class="{\'feed-dropdown__item--active\': type === \'literature\' }" ng-click="setType(\'literature\')" > <span class="feed-dropdown__item-content"> <span class="feed-dropdown__icon"> <svg-icon name="literature" size="24"></svg-icon> </span> {{ \'ÐиÑеÑаÑÑÑа\' | t }} </span> <span class="feed-dropdown__check" ng-if="type === \'literature\'"> <svg-icon name="check" size="14"></svg-icon> </span> </button> </div> </div> <div class="feed-dropdown" ng-class="{\'feed-dropdown--open\': periodDropdownOpen }"> <button type="button" class="feed-dropdown__trigger" ng-click="toggleDropdown(\'period\')" aria-haspopup="listbox" ng-attr-aria-expanded="{{ !!periodDropdownOpen }}" > <span class="feed-dropdown__label">{{ getPeriodLabel() | t }}</span> <svg-icon name="chevron-down" size="11" class="feed-dropdown__arrow"></svg-icon> </button> <div class="feed-dropdown__menu"> <button type="button" class="feed-dropdown__item" ng-class="{\'feed-dropdown__item--active\': period === \'alltime\' }" ng-click="setPeriod(\'alltime\')" > <span class="feed-dropdown__item-content">{{ \'Ðа вÑÑ Ð²ÑемÑ\' | t }}</span> <span class="feed-dropdown__check" ng-if="period === \'alltime\'"> <svg-icon name="check" size="14"></svg-icon> </span> </button> <button type="button" class="feed-dropdown__item" ng-class="{\'feed-dropdown__item--active\': period === \'week\' }" ng-click="setPeriod(\'week\')" > <span class="feed-dropdown__item-content">{{ \'Ðа неделÑ\' | t }}</span> <span class="feed-dropdown__check" ng-if="period === \'week\'"> <svg-icon name="check" size="14"></svg-icon> </span> </button> <button type="button" class="feed-dropdown__item" ng-class="{\'feed-dropdown__item--active\': period === \'month\' }" ng-click="setPeriod(\'month\')" > <span class="feed-dropdown__item-content">{{ \'Ðа меÑÑÑ\' | t }}</span> <span class="feed-dropdown__check" ng-if="period === \'month\'"> <svg-icon name="check" size="14"></svg-icon> </span> </button> <button type="button" class="feed-dropdown__item" ng-class="{\'feed-dropdown__item--active\': period === \'quarter\' }" ng-click="setPeriod(\'quarter\')" > <span class="feed-dropdown__item-content">{{ \'Ðа ÑÑи меÑÑÑа\' | t }}</span> <span class="feed-dropdown__check" ng-if="period === \'quarter\'"> <svg-icon name="check" size="14"></svg-icon> </span> </button> <button type="button" class="feed-dropdown__item" ng-class="{\'feed-dropdown__item--active\': period === \'halfyear\' }" ng-click="setPeriod(\'halfyear\')" > <span class="feed-dropdown__item-content">{{ \'Ðа полгода\' | t }}</span> <span class="feed-dropdown__check" ng-if="period === \'halfyear\'"> <svg-icon name="check" size="14"></svg-icon> </span> </button> <button type="button" class="feed-dropdown__item" ng-class="{\'feed-dropdown__item--active\': period === \'year\' }
1" ng-click="setPeriod(\'year\')" > <span class="feed-dropdown__item-content">{{ \'Ðа год\' | t }}</span> <span class="feed-dropdown__check" ng-if="period === \'year\'"> <svg-icon name="check" size="14"></svg-icon> </span> </button> </div> </div> </div> </div> <div class="feed-filters-mobile tw:hidden tw:max-md:block" ng-if="activeTab !== \'editorial\'" > <div class="feed-sort-toggle" role="tablist" aria-label="{{ \'СоÑÑиÑовка\' | t }}"> <button type="button" role="tab" class="feed-sort-toggle__option" ng-class="{\'feed-sort-toggle__option--active\': sortBy === \'new\' }" ng-click="setSort(\'new\')" ng-attr-aria-selected="{{ sortBy === \'new\' }}" > {{ \'Ðовое\' | t }} </button> <button type="button" role="tab" class="feed-sort-toggle__option" ng-class="{\'feed-sort-toggle__option--active\': sortBy === \'popular\' }" ng-click="setSort(\'popular\')" ng-attr-aria-selected="{{ sortBy === \'popular\' }}" > {{ \'ÐопÑлÑÑное\' | t }} </button> <button type="button" role="tab" class="feed-sort-toggle__option" ng-class="{\'feed-sort-toggle__option--active\': sortBy === \'discussed\' }" ng-click="setSort(\'discussed\')" ng-attr-aria-selected="{{ sortBy === \'discussed\' }}" > {{ \'ÐбÑÑждаемое\' | t }} </button> </div> </div> <div class="feed-editorial-mobile-tabs tw:hidden tw:max-md:block" ng-if="activeTab === \'editorial\'" > <button type="button" class="feed-editorial-mobile-tabs__tab" ng-class="{\'feed-editorial-mobile-tabs__tab--active\': !editorialSubTab }" ng-click="setEditorialSubTab(null)" > {{ \'ÐÑе\' | t }} </button> <button type="button" class="feed-editorial-mobile-tabs__tab" ng-class="{\'feed-editorial-mobile-tabs__tab--active\': editorialSubTab === \'current\' }" ng-click="setEditorialSubTab(\'current\')" > {{ \'ÐаÑвки\' | t }} </button> <button type="button" class="feed-editorial-mobile-tabs__tab" ng-class="{\'feed-editorial-mobile-tabs__tab--active\': editorialSubTab === \'journal\' }" ng-click="setEditorialSubTab(\'journal\')" > {{ \'ÐÑÑнал\' | t }} </button> <button type="button" class="feed-editorial-mobile-tabs__tab" ng-class="{\'feed-editorial-mobile-tabs__tab--active\': editorialSubTab === \'archive\' }" ng-click="setEditorialSubTab(\'archive\')" > {{ \'ЧÑлан\' | t }} </button> </div> <div class="feed-loading-skeleton" ng-if="loading && !articles.length" aria-busy="true" aria-label="{{ \'ÐагÑÑзка ленÑÑ\' | t }}" > <div class="feed-skeleton-card" ng-repeat="i in [1,2,3] track by $index"> <div class="feed-skeleton-card__image skeleton"></div> <div class="feed-skeleton-card__body"> <div class="feed-skeleton-card__title skeleton"></div> <div class="feed-skeleton-card__text skeleton"></div> <div class="feed-skeleton-card__text feed-skeleton-card__text--short skeleton"></div> <div class="feed-skeleton-card__meta skeleton"></div> </div> </div> </div> <div class="feed-loading-inline" ng-if="loading && articles.length > 0"> <i class="fas fa-spinner fa-spin"></i> </div> <div class="feed-empty" ng-if="!loading && articles.length === 0 && !loadError"> <p>{{ emptyMessage || (\'ÐÑбликаÑии не найденÑ\' | t) }}</p> <a href="/authors" class="feed-empty__cta" ng-if="activeTab === \'my\' && emptyMessage" >{{ \'ÐайÑи авÑоÑов\' | t }}</a > </div> <div class="feed-empty feed-empty--error" ng-if="!loading && loadError"> <p>{{ emptyMessage || (\'Ðе ÑдалоÑÑ Ð·Ð°Ð³ÑÑзиÑÑ Ð»ÐµÐ½ÑÑ\' | t) }}</p> <button type="button" class="ds-btn ds-btn-default feed-empty__retry" ng-click="retryLoad()" > {{ \'ÐопÑобоваÑÑ Ñнова\' | t }} </button> </div> <div class="feed-articles" ng-if="!loading && articles.length > 0"> <div class="feed-card" ng-repeat="article in articles track by article._id"> <p class="feed-card__category" ng-if="::article.category"> <a ng-href="{{ ::article.categoryLink }}">{{ ::article.category | t }}</a> </p> <h3 class="feed-card__title"> <a ng-href="{{ ::article.link }}" >{{ ::article.title | stripTagsAndTruncate: 999 }}</a > </h3> <div class="feed-card__meta"> <a class="feed-card__author" ng-href="{{ ::article.authorLink }}" ng-if="::article.authorLink && article.createdBy && article.createdBy.thumborId" > <img class="feed-card__avatar" ng-src="{{ ::article.createdBy.thumborId | imageUrl: 48:48 }}" alt="{{ ::(article.author || article.createdBy.name) }}" width="24" height="24" loading="lazy" decoding="async" /> <span class="feed-card__author-name" >{{ ::(article.author || article.createdBy.name) }}</span > </a> <span class="feed-card__author" ng-if="::(!article.authorLink && article.createdBy && article.createdBy.thumborId)" > <img class="feed-card__avatar" ng-src="{{ ::article.createdBy.thumborId | imageUrl: 48:48 }}" alt="{{ ::(article.author || article.createdBy.name) }}" width="24" height="24" loading="lazy" decoding="async" /> <span class="feed-card__author-name" >{{ ::(article.author || article.createdBy.name) }}</span > </span> <span class="feed-card__author feed-card__author--no-avatar" ng-if="::article.author && (!article.createdBy || !article.createdBy.thumborId)" > <a ng-href="{{ ::article.authorLink }}" ng-if="::article.authorLink" >{{ ::article.author }}</a > <span ng-if="::(!article.authorLink)">{{ ::article.author }}</span> </span> <span class="feed-card__date" >{{ ::(article.publishedAt || article.postedAt) | amDateFormat: \'D MMMM YYYY\' }}</span > </div> <div class="feed-card__excerpt" ng-if="::article._excerpt" ng-bind-html="::article._excerpt | stripTagsAndTruncate: 500: true" ></div> <div class="feed-card__image-wrapper" ng-if="::article.thumborId"> <a ng-href="{{ ::article.link }}" class="feed-card__image"> <div class="feed-card__image-inner"> <img ng-src="{{ ::article.thumborId | imageUrl: 600 }}" loading="lazy" decoding="async" sizes="(min-width: 992px) 500px, 100vw" ng-srcset="{{ ::article.thumborId | imageUrl: 400 }} 400w, {{ ::article.thumborId | imageUrl: 600 }} 600w, {{ ::article.thumborId | imageUrl: 800 }} 800w" alt="{{ ::article.title }}" /> </div> </a> <a class="feed-card__type-icon" href="/expo/image" ng-if="article.type === \'Image\'" aria-label="{{ \'Раздел: ÐалеÑеÑ\' | t }}" > <span class="with-icon with-icon--pic-2" aria-hidden="true"></span> </a> <a class="feed-card__type-icon" href="/expo/video" ng-if="article.type === \'Video\'" aria-label="{{ \'Раздел: Ðидео\' | t }}" > <span class="with-icon with-icon--video-2" aria-hidden="true"></span> </a> <a class="feed-card__type-icon" href="/expo/music" ng-if="article.type === \'Music\'" aria-label="{{ \'Раздел: ÐÑзÑка\' | t }}" > <span class="with-icon with-icon--music" aria-hidden="true"></span> </a> <a class="feed-card__type-icon" href="/expo/literature" ng-if="article.type === \'
1Literature\'" aria-label="{{ \'Раздел: ÐиÑеÑаÑÑÑа\' | t }}" > <span class="with-icon with-icon--lit" aria-hidden="true"></span> </a> </div> <div class="feed-card__stats"> <div class="feed-card__stats-left"> <a ng-href="{{ ::article.link }}#comments" class="feed-card__comments"> <svg-icon name="comments" size="21" class="feed-card__comments-icon"></svg-icon> <span class="feed-card__comments-text" ng-if="::article.comments > 0"> {{ ::article.comments | pluralize:\'комменÑаÑий\':\'комменÑаÑиÑ\':\'комменÑаÑиев\' }}<span class="feed-card__comments-new" ng-if="::article.newComments > 0"> / {{ ::article.newComments | pluralize:\'новÑй\':\'новÑÑ
\':\'новÑÑ
\' }}</span > </span> <span class="feed-card__comments-text" ng-if="::(!article.comments || article.comments === 0)" >{{ \'ÐомменÑиÑоваÑÑ\' | t }}</span > </a> <span class="feed-card__views" ng-if="::article.views > 0 && canViewMetrics"> <svg-icon name="eye" size="20" class="feed-card__views-icon"></svg-icon> <span class="feed-card__views-text" >{{ article.views }} <span class="feed-card__views-label">{{ \'пÑоÑмоÑÑов\' | t }}</span></span > </span> </div> <div class="feed-card__stats-right"> <rating-buttons type="ContentItem" item="article" popover-placement="auto bottom-right" root-class="feed-card__rating" ></rating-buttons> </div> </div> </div> </div> <div class="tw:mt-10" ng-if="!loading && !usesCursorPager() && totalCount > perPage"> <discours-pagination items-per-page="{{ perPage }}" total-items="{{ totalCount }}" current-page="{{ currentPage }}" ></discours-pagination> </div> <div class="tw:mt-10 tw:flex tw:justify-center" ng-if="!loading && usesCursorPager() && nextCursor" > <button type="button" class="feed-load-more__button" ng-click="loadMore()" ng-disabled="loadingMore" > {{ loadingMore ? (\'ÐагÑÑзкаâ¦\' | t) : (\'ÐоказаÑÑ ÐµÑÑ\' | t) }} </button> </div> </div> <div class="tw:gutter-half tw:md:w-3/12 tw:max-md:hidden"> <div class="feed-right-sidebar"> <knowledge-base-banner ng-show="activeTab === \'editorial\'"></knowledge-base-banner> <proposal-banner></proposal-banner> <comment-banner></comment-banner> <editorial-banner></editorial-banner> </div> </div> </div> </div> <button type="button" class="feed-mobile-filter-btn tw:hidden tw:max-md:block" ng-class="{\'feed-mobile-filter-btn--has-filters\': getActiveFilterCount() > 0 }" ng-hide="mobileFilterModalOpen" ng-click="openMobileFilterModal()" aria-label="{{ \'ÐÑкÑÑÑÑ ÑилÑÑÑÑ\' | t }}" > <svg-icon name="filter-sliders" size="24"></svg-icon> <span class="feed-mobile-filter-btn__badge" ng-if="getActiveFilterCount() > 0" >{{ getActiveFilterCount() }}</span > </button> <div class="feed-filter-modal" ng-class="{\'feed-filter-modal--open\': mobileFilterModalOpen }"> <div class="feed-filter-modal__backdrop" ng-click="closeMobileFilterModal()" aria-hidden="true" ></div> <div class="feed-filter-modal__content" role="dialog" aria-modal="true" aria-label="{{ \'ФилÑÑÑ Ð»ÐµÐ½ÑÑ\' | t }}" > <div class="feed-filter-modal__header"> <h2 class="feed-filter-modal__title">{{ \'ФилÑÑÑ Ð»ÐµÐ½ÑÑ\' | t }}</h2> <button type="button" class="feed-filter-modal__reset-btn" ng-if="hasTempNonDefaultFilters()" ng-click="resetTempFilters()" aria-label="{{ \'СбÑоÑиÑÑ ÑилÑÑÑÑ\' | t }}" > <svg-icon name="filter-reset" size="24"></svg-icon> </button> </div> <div class="feed-filter-modal__body"> <div class="feed-filter-modal__section" ng-if="activeTab === \'editorial\'"> <div class="feed-filter-modal__section-label">{{ \'ÐоказÑваÑÑ\' | t }}</div> <div class="feed-filter-modal__pills"> <button type="button" class="feed-filter-modal__pill" ng-class="{\'feed-filter-modal__pill--active\': !tempFilters.editorialSubTab }" ng-click="setTempFilter(\'status\', null)" > {{ \'ÐÑе\' | t }} </button> <button type="button" class="feed-filter-modal__pill" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.editorialSubTab === \'current\' }" ng-click="setTempFilter(\'status\', \'current\')" > {{ \'ÐаÑвки\' | t }} </button> <button type="button" class="feed-filter-modal__pill" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.editorialSubTab === \'journal\' }" ng-click="setTempFilter(\'status\', \'journal\')" > {{ \'ÐÑÑнал\' | t }} </button> <button type="button" class="feed-filter-modal__pill" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.editorialSubTab === \'archive\' }" ng-click="setTempFilter(\'status\', \'archive\')" > {{ \'ЧÑлан\' | t }} </button> </div> </div> <div class="feed-filter-modal__section"> <div class="feed-filter-modal__section-label">{{ \'ФоÑмаÑÑ\' | t }}</div> <div class="feed-filter-modal__pills"> <button type="button" class="feed-filter-modal__pill" ng-class="{\'feed-filter-modal__pill--active\': !tempFilters.type }" ng-click="setTempFilter(\'type\', null)" > {{ \'ÐÑе\' | t }} </button> <button type="button" class="feed-filter-modal__pill feed-filter-modal__pill--with-icon" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.type === \'article\' }" ng-click="setTempFilter(\'type\', \'article\')" > <svg-icon name="article" size="24"></svg-icon> {{ \'СÑаÑÑи\' | t }} </button> <button type="button" class="feed-filter-modal__pill feed-filter-modal__pill--with-icon" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.type === \'image\' }" ng-click="setTempFilter(\'type\', \'image\')" > <svg-icon name="image" size="24"></svg-icon> {{ \'ÐалеÑеÑ\' | t }} </button> <button type="button" class="feed-filter-modal__pill feed-filter-modal__pill--with-icon" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.type === \'video\' }" ng-click="setTempFilter(\'type\', \'video\')" > <svg-icon name="video" size="24"></svg-icon> {{ \'Ðидео\' | t }} </button> <button type="button" class="feed-filter-modal__pill feed-filter-modal__pill--with-icon" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.type === \'literature\' }" ng-click="setTempFilter(\'type\', \'literature\')" > <svg-icon name="literature" size="24"></svg-icon> {{ \'ÐиÑеÑаÑÑÑа\' | t }} </button> <button type="button" class="feed-filter-modal__pill feed-filter-modal__pill--with-icon" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.type === \'music\' }" ng-click="setTempFilter(\'type\', \'music\')" > <svg-icon name="music" size="24"></svg-icon> {{ \'ÐÑзÑка\' | t }} </button> </div> </div> <div class="feed-filter-modal__section"> <div class="feed-filter-modal__section-label">{{ \'ÐеÑиод\' | t }}</div> <div class="feed-filter-modal__pills"> <button type="button" class="feed-filter-modal__pill" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.period === \'alltime\' }" ng-click="setTempFilter(\'period\', \'alltime\')" > {{ \'Ðа вÑÑ Ð²ÑемÑ\' | t }} </button> <button type="button" class="feed-filter-modal__pill" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.period === \'week\' }" ng-click="setTempFilter(\'period\', \'week\')" > {{ \'Ðа неделÑ\' | t }} </button> <button type="button" class="feed-filter-modal__pill" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.period === \'month\' }" ng-click="setTempFilter(\'period\', \'month\')" > {{ \'Ðа меÑÑÑ\' | t }} </button> <button type="button" class="feed-filter-modal__pill" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.period === \'quarter\' }" ng-click="setTempFilter(\'period\', \'quarter\')" > {{ \'Ðа ÑÑи меÑÑÑа\' | t }} </button> <button type="button" class="feed-filter-modal__pill" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.period === \'halfyear\' }" ng-click="setTempFilter(\'period\', \'halfyear\')" > {{ \'Ðа полгода\' | t }} </button> <button type="button" class="feed-filter-modal__pill" ng-class="{\'feed-filter-modal__pill--active\': tempFilters.period === \'year\' }" ng-click="setTempFilter(\'period\', \'year\')" > {{ \'Ðа год\' | t }} </button> </div> </div> </div> <div class="feed-filter-modal__footer"> <button type="button" class="feed-filter-modal__close-btn" ng-click="closeMobileFilterModal()" aria-label="{{ \'ÐакÑÑÑÑ\' | t }}" > <svg-icon name="close" size="24"></svg-icon> </button> <button type="button" class="feed-filter-modal__apply-btn" ng-click="applyMobileFilters()"> {{ \'ÐÑимениÑÑ\' | t }} </button> </div> </div> </div> </div>')}catch(e){}}(0)},49127(){angular.module("discours.components").component("feedSidebar",{templateUrl:"/components/feedSidebar/feedSidebar.html",controller:["$log","$scope","$element","followService","loginService","subscriptionModalLoader","eventBus",function(e,t,a,i,n,s,o){function r(){c&&u&&(c.removeEventListener("mouseenter",u),c.removeEventListener("focus",u),c.removeEventListener("touchstart",u),c=null,u=null)}function l(){const e=a[0]?.querySelector(".feed-sidebar-subscriptions__settings");e&&e!==c&&(r(),u=function(){r(),s.prefetch()},c=e,c.addEventListener("mouseenter",u),c.addEventListener("focus",u),c.addEventListener("touchstart",u,{passive:!0}))}const d=this;let c=null,u=null;d.$onInit=function(){d.loading=!0,d.subscriptions=[],d.visibleSubscriptions=[],d.showAll=!1,d.maxVisible=8,n.isLoggedIn()?d.loadSubscriptions():d.loading=!1,o.onScope(t,o.EVENTS.USER_LOGGED_IN,function(){d.loadSubscriptions()}),o.onScope(t,o.EVENTS.USER_LOGGED_OUT,function(){d.subscriptions=[],d.updateVisibleSubscriptions(),r()})},d.loadSubscriptions=function(){d.loading=!0,i.getMySubscriptions({perPage:50}).then(function(e){d.loading=!1,d.subscriptions=e.data||[],d.updateVisibleSubscriptions()}).catch(function(t){e.error("feedSidebar loadSubscriptions error",t),d.loading=!1})},d.toggleShowAll=function(){d.showAll=!d.showAll,d.updateVisibleSubscriptions()},d.updateVisibleSubscriptions=function(){d.visibleSubscriptions=d.showAll?d.subscriptions:d.subscriptions.slice(0,d.maxVisible),t.$evalAsync(l)},d.getVisibleSubscriptions=function(){return d.visibleSubscriptions},d.hasMore=function(){return d.subscriptions.length>d.maxVisible},d.getLink=function(e){return e?"user"===e.targetType&&e.target?.path?"/"+e.target.path:"tag"===e.targetType&&e.target?.slug?"/tags/"+e.target.slug:null:null},d.hasLink=function(e){return!!d.getLink(e)},d.getName=function(e){return e?"user"===e.targetType&&e.target?((e.target.firstName||"")+" "+(e.target.lastName||"")).trim()||"ÐолÑзоваÑелÑ":"tag"===e.targetType&&e.target?e.target.title||"Тема":"":""},d.getIcon=function(e){return e&&"tag"===e.targetType?"fa-hashtag":"fa-user"},d.hasNewContent=function(e){return!1}
1,d.openSubscriptionsModal=function(){o.emit(o.EVENTS.FEED_OPEN_SUBSCRIPTIONS)},d.$onDestroy=function(){r()}}]})},66548(e,t,a){"use strict";function i(e){var t=e.createdBy||{};return{createdAt:e.createdAt,body:e.body,createdBy:e.createdBy,author:t.firstName&&t.lastName?(t.firstName+" "+t.lastName).trim():t.name||"Ðноним",authorLink:t.path?"/"+t.path:"",rating:e.rating||0,thumborId:t.thumborId,image:(0,r.XS)(),replyTo:e.replyTo,_id:e._id,contentItem:e.contentItem,commentLink:(e.commentLink||"").replace(/^https?:\/\/[^/]+/,""),itemLink:(e.itemLink||"").replace(/^https?:\/\/[^/]+/,""),itemTitle:e.itemTitle}}function n(e,t,a){var i=a||0,s=0;return i>=100?(e.subComments=[],e.subCommentsCount=0,e):(e.subComments=t instanceof Map?t.get(e._id)||[]:t.filter(function(t){return t.replyTo===e._id}),s=e.subComments.length,e.subComments.forEach(function(a){a.replyToAuthor=e.author,a.replyToLink=e.authorLink,n(a,t,i+1),s+=a.subCommentsCount}),e.subCommentsCount=s,e)}function s(e){if(!e.length||e.length<=3)return null;var t=e.reduce(function(e,t){return parseInt(t.rating,10)>parseInt(e.rating,10)?t:e},e[0]);return t&&parseInt(t.rating,10)>=3?t:null}function o(e){for(var t=e.map(i),a=new Map,o=[],r=0;r<t.length;r++){var l=t[r];if(l.replyTo){var d=a.get(l.replyTo);d||a.set(l.replyTo,d=[]),d.push(l)}else o.push(l)}return o.forEach(function(e){n(e,a)}),{comments:o,bannerComments:t,count:t.length,best:s(t)}}a.d(t,{Ib:()=>o,hi:()=>s,iY:()=>i});var r=a(2194)},73959(e,t,a){"use strict";var i=a(36817);angular.module("discours.components").component("commentBanner",{restrict:"AE",bindings:{},templateUrl:"/components/commentBanner/commentBanner.html",controller:["$scope","commentsService","authorsService",function(e,t,a){const{defaultImage:n}=a;e.defaultImage=n(),e.commentsAll=[],t.query({count:4,sort:"createdAt,-1"}).then(function(t){const{bannerComments:a=[]}=t,n=(a||[]).filter(e=>e.createdBy).map(e=>{const{createdBy:{firstName:t,lastName:a,thumborId:n},authorLink:s,body:o,commentLink:r,itemLink:l,itemTitle:d}=e,c=(o||"").replace(/<\/p>|<br\s*\/?>|<\/div>/gi,"\n"),u=(0,i._e)(c).replace(/\s+/g," ").trim(),p=u.length>100?`${u.slice(0,100)}...`:u;return{authorFullName:[t,a].filter(Boolean).join(" "),authorImage:n,authorLink:s,commentBody:p,commentLink:r,itemLink:l,itemTitle:d}});e.commentsAll=n}).catch(function(e){})}]})},81277(e,t,a){"use strict";a.r(t),a.d(t,{default:()=>i}),a(30012),angular.module("discours.controllers").controller("FeedCtrl",["$scope","$rootScope","$window","$log","$location","$timeout","loginService","contentItemsService","followService","permissionsService","Notification","subscriptionModalLoader","eventBus",function(e,t,a,i,n,s,o,r,l,d,c,u,p){(function(e,t){var{$window:a}=t;e.isMobile=a.innerWidth<600;var i=null,n=function(){i||(i=requestAnimationFrame(function(){i=null;var t=a.innerWidth<600;t!==e.isMobile&&e.$applyAsync(function(){e.isMobile=t})}))};angular.element(a).bind("resize",n),e.$on("$destroy",function(){angular.element(a).unbind("resize",n),i&&(cancelAnimationFrame(i),i=null)})})(e,{$window:a});var b=function(e,t){function a(e){var t="";try{var a=localStorage.getItem("ls.userId");a&&(t=a.replace(/"/g,"")+"_")}catch(e){}return"feed_lastSeen_"+t+e}function i(e){try{return localStorage.getItem(a(e))||null}catch(e){return null}}function n(e){try{localStorage.setItem(a(e),(new Date).toISOString())}catch(e){}}function s(){var e=c.search(),t={tab:null,type:null,sort:"new",status:null,period:w,page:0};return Object.keys(e).forEach(function(a){-1!==T.indexOf(a)?t.tab=a:-1!==_.indexOf(a)?t.type=a:-1!==v.indexOf(a)?t.sort=a:-1!==h.indexOf(a)?t.status=a:-1!==y.indexOf(a)?t.period=a:"page"===a&&(t.page=parseInt(e[a],10)||0)}),t}function o(e,t,a,i,n,s){var o="/feed",r=[];e&&"all"!==e&&r.push(e),t&&r.push(t),!i||"editorial"===e&&"current"===i||r.push(i),a&&"new"!==a&&r.push(a),n&&n!==w&&r.push(n);var l=r.slice();return s>0&&l.push("page="+s),l.length>0?o+"?"+l.join("&"):o}function r(){return b.canViewEditorial()?"editorial":p.isLoggedIn()?"my":"all"}function l(t){angular.element(t.target).closest(".feed-dropdown").length>0||!e.typeDropdownOpen&&!e.periodDropdownOpen||e.$applyAsync(function(){e.closeDropdowns()})}var{$window:d,$location:c,$timeout:u,loginService:p,permissionsService:b,Notification:f,subscriptionModalLoader:g,eventBus:m}=t,_=["article","image","video","literature","music"],v=["new","popular","discussed"],h=["current","journal","archive"],y=["week","month","quarter","halfyear","year","alltime"],w="quarter",T=["my","all","editorial"],k=!1,S=function(){k=!0;var t=o(e.activeTab,e.type,e.sortBy,e.editorialSubTab,e.period,e.currentPage);c.url(t),u(function(){k=!1},0)},F=s();e.activeTab=F.tab||r(),e.editorialSubTab=F.status||("editorial"===e.activeTab?"current":null),e.type=F.type,e.sortBy=F.sort,e.period=F.period,e.currentPage=F.page,e.typeDropdownOpen=!1,e.periodDropdownOpen=!1,e.isLoggedIn=p.isLoggedIn(),e.isReader=b.isReader(),e.canViewMetrics=b.canViewEditorialMetrics(),e.isAuthor=b.canViewEditorial(),e.userId=p.userId(),e.currentUserPath=p.userPath(),e.subscriptionsModalOpen=!1,e.mobileFilterModalOpen=!1,e.tempFilters={type:null,period:w,editorialSubTab:null},e.unreadCounts={all:0,my:0,editorial:0},e.tabNeverVisited={all:!i("all"),my:!i("my"),editorial:!i("editorial")},e.canSeeMyFeed=e.isLoggedIn,e.canSeeEditorial=e.isAuthor,e.showAuthPrompt=!1,e.showAccessDenied=!1,"my"!==e.activeTab||e.isLoggedIn||(e.showAuthPrompt=!0),"editorial"!==e.activeTab||e.isAuthor||(e.isLoggedIn?e.showAccessDenied=!0:e.showAuthPrompt=!0),e.setTab=function(t){"my"!==t||e.isLoggedIn?"editorial"!==t||e.isAuthor?(e.activeTab=t,n(t),e.unreadCounts[t]=0,e.tabNeverVisited[t]=!1,e.editorialSubTab="editorial"===t?"current":null,e.currentPage=0,"editorial"===t&&(e.sortBy="new"),S(),e.loadData()):e.isLoggedIn?f.info("ÐÑÐ¾Ñ Ñаздел доÑÑÑпен ÑолÑко авÑоÑам"):p.openAuthModal({message:"ÐойдиÑе Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к ÑедакÑии"}):p.openAuthModal({message:"ÐойдиÑе, ÑÑÐ¾Ð±Ñ Ð²Ð¸Ð´ÐµÑÑ Ð¿ÐµÑÑоналÑнÑÑ Ð»ÐµÐ½ÑÑ"})},e.setEditorialSubTab=function(t){e.editorialSubTab=t,e.currentPage=0,S(),e.loadData()},e.setType=function(t){e.type=t||null,e.currentPage=0,e.typeDropdownOpen=!1,S(),e.loadData()},e.setSort=function(t){e.sortBy=t,e.currentPage=0,S(),e.loadData()},e.setPeriod=function(t){e.period=t||w,e.currentPage=0,e.periodDropdownOpen=!1,S(),e.loadData()},e.toggleDropdown=function(t){"type"===t?(e.typeDropdownOpen=!e.typeDropdownOpen,e.periodDropdownOpen=!1):"period"===t&&(e.periodDropdownOpen=!e.periodDropdownOpen,e.typeDropdownOpen=!1)},e.closeDropdowns=function(){e.typeDropdownOpen=!1,e.periodDropdownOpen=!1};var C={article:"СÑаÑÑи",image:"ÐалеÑеи",video:"Ðидео",literature:"ÐиÑеÑаÑÑÑа",music:"ÐÑзÑка"};e.getTypeLabel=function(){return e.type?C[e.type]:"ÐÑе ÑоÑмаÑÑ"};var M={alltime:"Ðа вÑÑ Ð²ÑемÑ",week:"Ðа неделÑ",month:"Ðа меÑÑÑ",quarter:"Ðа ÑÑи меÑÑÑа",halfyear:"Ðа полгода",year:"Ðа год"};e.getPeriodLabel=function(){return M[e.period]||M[w]},angular.element(d.document).on("click",l),e.openLoginModal=function(){p.openAuthModal({message:"ÐойдиÑе Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к пеÑÑоналÑной ленÑе"})},e.openSubscriptionsModal=function(){e.isLoggedIn?g.ensure().then(function(){e.currentUserPath=p.userPath(),e.subscriptionsModalOpen=!0,e.$applyAsync()}).catch(function(){f.error("Ðе ÑдалоÑÑ Ð¾ÑкÑÑÑÑ Ð¾ÐºÐ½Ð¾ подпиÑок. ÐопÑобÑйÑе еÑÑ Ñаз.")}):p.openAuthModal({message:"ÐойдиÑе, ÑÑÐ¾Ð±Ñ Ð½Ð°ÑÑÑоиÑÑ Ð»ÐµÐ½ÑÑ"})},e.closeSubscriptionsModal=function(){e.subscriptionsModalOpen=!1},e.openMobileFilterModal=function(){e.tempFilters={type:e.type,period:e.period,editorialSubTab:e.editorialSubTab},e.mobileFilterModalOpen=!0,angular.element(document).off("keydown.feedFilterModal"),angular.element(document).on("keydown.feedFilterModal",function(t){"Escape"===t.key&&e.mobileFilterModalOpen&&e.$applyAsync(function(){e.closeMobileFilterModal()})})},e.closeMobileFilterModal=function(){e.mobileFilterModalOpen=!1,angular.element(document).off("keydown.feedFilterModal")},e.setTempFilter=function(t,a){"type"===t?e.tempFilters.type=a:"period"===t?e.tempFilters.period=a:"status"===t&&(e.tempFilters.editorialSubTab=a)},e.hasTempNonDefaultFilters=function(){return!!e.tempFilters&&!!(e.tempFilters.type||e.tempFilters.period&&e.tempFilters.period!==w||e.tempFilters.editorialSubTab)},e.resetTempFilters=function(){e.tempFilters={type:null,period:w,editorialSubTab:null}},e.applyMobileFilters=function(){var t=!1;e.tempFilters.type!==e.type&&(e.type=e.tempFilters.type,t=!0),e.tempFilters.period!==e.period&&(e.period=e.tempFilters.period,t=!0),e.tempFilters.editorialSubTab!==e.editorialSubTab&&(e.editorialSubTab=e.tempFilters.editorialSubTab,t=!0),e.mobileFilterModalOpen=!1,t&&(e.currentPage=0,S(),e.loadData())},e.getActiveFilterCount=function(){var t=0;return e.type&&t++,e.period&&e.period!==w&&t++,e.editorialSubTab&&t++,t},e.resetFilters=function(){var t=!1;e.type&&(e.type=null,t=!0),e.period&&e.period!==w&&(e.period=w,t=!0),e.editorialSubTab&&(e.editorialSubTab=null,t=!0),t&&(e.currentPage=0,S(),e.loadData())};var A=m.onScope(e,m.EVENTS.FEED_OPEN_SUBSCRIPTIONS,function(){e.openSubscriptionsModal()});return e.$on("$destroy",function(){A(),angular.element(document).off("keydown.feedFilterModal"),angular.element(d.document).off("
1click",l)}),{updateUrl:S,isUpdatingUrl:function(){return k},parseFlags:s,buildUrlString:o,getPublishedAfterDate:function(e){if(!e||"alltime"===e)return null;var t,a=new Date;switch(e){case"week":t=new Date(a.getTime()-6048e5);break;case"month":(t=new Date(a)).setMonth(t.getMonth()-1);break;case"quarter":(t=new Date(a)).setMonth(t.getMonth()-3);break;case"halfyear":(t=new Date(a)).setMonth(t.getMonth()-6);break;case"year":(t=new Date(a)).setFullYear(t.getFullYear()-1);break;default:return null}return t.toISOString()},getDefaultTab:r,setLastSeenTimestamp:n,getLastSeenTimestamp:i,DEFAULT_PERIOD:w,TYPE_FLAGS:_,SORT_FLAGS:v,STATUS_FLAGS:h,PERIOD_FLAGS:y,VALID_TABS:T}}(e,{$window:a,$location:n,$timeout:s,loginService:o,permissionsService:d,Notification:c,subscriptionModalLoader:u,eventBus:p}),f=function(e,t){function a(){switch(e.sortBy){case"popular":return"rating";case"discussed":return"commentedAt";default:return"publishedAt"}}function i(){switch(e.sortBy){case"popular":return"rating";case"discussed":return"commentedAt";default:return"createdAt"}}function n(t,a){if(e.loading=!1,t&&t.length>0){for(var i=0;i<t.length;i++)t[i]._excerpt=e.getExcerpt(t[i]);e.articles=t,e.totalCount=t.pager&&t.pager.totalCount||t.length,e.nextCursor=t.pager&&t.pager.nextCursor||null,e.emptyMessage=""}else e.articles=[],e.totalCount=0,e.nextCursor=null,e.emptyMessage=a||""}function s(t,a){l.error("FeedCtrl "+a+" error",t),e.loading=!1,e.loadError=!0,e.emptyMessage="ÐÑибка загÑÑзки ленÑÑ"}function o(){m&&d.cancel(m),m=d(function(){m=null,function(){var t=++_,a=f.getLastSeenTimestamp("all");a&&c.get({perPage:1,publishedAfter:a,sort:"publishedAt",noBody:1}).then(function(a){t===_&&(e.unreadCounts.all=a.pager&&a.pager.totalCount||0)}).catch(function(e){l.debug("FeedCtrl loadUnreadCounts(all) error",e)});var i=f.getLastSeenTimestamp("my");i&&e.canSeeMyFeed&&u.getPersonalFeed({perPage:1,publishedAfter:i,sort:"publishedAt"}).then(function(a){t===_&&(e.unreadCounts.my=a.pager&&a.pager.totalCount||0)}).catch(function(e){l.debug("FeedCtrl loadUnreadCounts(my) error",e)});var n=f.getLastSeenTimestamp("editorial");n&&e.canSeeEditorial&&c.get({perPage:1,createdAfter:n,sort:"createdAt",unpublished:"1",noBody:1}).then(function(a){t===_&&(e.unreadCounts.editorial=a.pager&&a.pager.totalCount||0)}).catch(function(e){l.debug("FeedCtrl loadUnreadCounts(editorial) error",e)})}()},0)}function r(){var t={sort:i(),perPage:10,unpublished:"1"};"current"===e.editorialSubTab?(t.application="2",t.new="1"):"journal"===e.editorialSubTab?(t.journal="1",delete t.unpublished):"archive"===e.editorialSubTab&&(t.archive="1"),e.type&&(t.type=e.type);var a=f.getPublishedAfterDate(e.period);return a&&(t.createdAfter=a),"alltime"===e.period&&(t.allTime="1"),t}var{$log:l,$timeout:d,contentItemsService:c,followService:u,loginService:p,permissionsService:b,filtersApi:f,eventBus:g}=t;e.loading=!1,e.loadError=!1,e.articles=[],e.totalCount=0,e.emptyMessage="",e.perPage=10,e.nextCursor=null,e.loadingMore=!1,e.usesCursorPager=function(){return"editorial"===e.activeTab&&"journal"!==e.editorialSubTab},e.getExcerpt=function(e){if(!e)return null;if("Article"===e.type)return e.body||null;if(e.description)return e.description;if(e.body)return e.body;if(e.media&&e.media[0]){var t=e.media[0];return t.body||t.literatureBody||t.musicBody||t.videoBody||t.imageBody||null}return null};var m=null,_=0,v=0;e.loadMore=function(){if(e.usesCursorPager()&&e.nextCursor&&!e.loadingMore){e.loadingMore=!0;var t=++v,a=r();a.before=e.nextCursor,c.query(a).then(function(a){t===v&&function(t){if(e.loadingMore=!1,t&&t.length>0){for(var a=0;a<t.length;a++)t[a]._excerpt=e.getExcerpt(t[a]);e.articles=e.articles.concat(t),e.nextCursor=t.pager&&t.pager.nextCursor||null}else e.nextCursor=null}(a)}).catch(function(a){t===v&&(e.loadingMore=!1,l.error("FeedCtrl loadMore error",a))})}};var h=0;return e.loadData=function(){var t,i;h++,e.loading=!0,e.loadError=!1,e.articles=[],e.totalCount=0,e.nextCursor=null,e.loadingMore=!1,"my"===e.activeTab?function(t){var i={page:e.currentPage,perPage:10,sort:a()};e.type&&(i.type=e.type),"discussed"===e.sortBy&&(i.hasComments="1");var o=f.getPublishedAfterDate(e.period);o&&(i.publishedAfter=o),u.getPersonalFeed(i).then(function(e){if(t===h)if(e&&e.length>0){var a=e.map(function(e){return c.mapOne.call(c,e)});a.pager=e.pager,n(a,"ÐодпиÑиÑеÑÑ Ð½Ð° авÑоÑов и ÑемÑ, ÑÑÐ¾Ð±Ñ Ð²Ð¸Ð´ÐµÑÑ Ð¿ÐµÑÑоналÑнÑÑ Ð»ÐµÐ½ÑÑ")}else n(e,"ÐодпиÑиÑеÑÑ Ð½Ð° авÑоÑов и ÑемÑ, ÑÑÐ¾Ð±Ñ Ð²Ð¸Ð´ÐµÑÑ Ð¿ÐµÑÑоналÑнÑÑ Ð»ÐµÐ½ÑÑ")}).catch(function(e){t===h&&s(e,"loadMyFeed")})}(h):"editorial"===e.activeTab?(t=h,(i=r()).page=e.currentPage,c.query(i).then(function(e){t===h&&n(e)}).catch(function(e){t===h&&s(e,"loadEditorialFeed")})):function(t){var i={sort:a(),page:e.currentPage,perPage:10};e.type&&(i.type=e.type),"discussed"===e.sortBy&&(i.hasComments="1");var o=f.getPublishedAfterDate(e.period);o&&(i.publishedAfter=o),c.query(i).then(function(e){t===h&&n(e)}).catch(function(e){t===h&&s(e,"loadAllFeed")})}(h)},e.retryLoad=function(){e.loadData()},g.onScope(e,g.EVENTS.USER_LOGGED_IN,function(){e.isLoggedIn=!0,e.canSeeMyFeed=!0,e.isAuthor=b.canViewEditorial(),e.canSeeEditorial=e.isAuthor,e.showAuthPrompt=!1,e.currentUserPath=p.userPath(),"my"===e.activeTab&&e.loadData(),o()}),g.onScope(e,g.EVENTS.USER_LOGGED_OUT,function(){e.isLoggedIn=!1,e.canSeeMyFeed=!1,e.isAuthor=!1,e.canSeeEditorial=!1,e.currentUserPath=null,e.subscriptionsModalOpen=!1,e.unreadCounts={all:0,my:0,editorial:0},"my"!==e.activeTab&&"editorial"!==e.activeTab||e.setTab("all")}),e.$on("$locationChangeSuccess",function(){if(!f.isUpdatingUrl()){var t=f.parseFlags(),a=t.tab||f.getDefaultTab(),i=a!==e.activeTab;(i||t.page!==e.currentPage||t.type!==e.type||t.sort!==e.sortBy||(t.status||("editorial"===a?"current":null))!==e.editorialSubTab||t.period!==e.period)&&(i&&(f.setLastSeenTimestamp(a),e.unreadCounts[a]=0,e.tabNeverVisited[a]=!1),e.activeTab=a,e.currentPage=t.page,e.type=t.type,e.sortBy=t.sort,e.editorialSubTab=t.status||("editorial"===a?"current":null),e.period=t.period,e.loadData(),i&&o())}}),e.$on("$destroy",function(){m&&(d.cancel(m),m=null)}
1),{loadUnreadCounts:o,loadMore:e.loadMore}}(e,{$log:i,$timeout:s,contentItemsService:r,followService:l,loginService:o,permissionsService:d,filtersApi:b,eventBus:p});e.showAuthPrompt||e.showAccessDenied||(b.setLastSeenTimestamp(e.activeTab),e.unreadCounts[e.activeTab]=0,e.tabNeverVisited[e.activeTab]=!1,e.loadData(),f.loadUnreadCounts())}]),a(49127),a(94529),a(73959);const i={modules:["discours.controllers","discours.components","discours.factories","discours.templates"]}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.