{"title":"Верстка Дизайнер DamuBPM","template":"\u003clink rel=\"stylesheet\" type=\"text/css\" href=\"/cms/css/new_design_damubpm.css?ver=2\" /\u003e\n\n\u003clink rel=\"stylesheet\" type=\"text/css\" href=\"/cms/css/custom_primeng.css?ver=2\" /\u003e\n\u003clink *ngIf=\"dark_mode\" rel=\"stylesheet\" type=\"text/css\" href=\"/cms/css/custom_primeng_dark.css?ver=2\" /\u003e\n\n\n \n\n\u003cdiv *ngIf=\"loaded\" class=\"sticky\" \u003e\n \u003c!--ТОП НАВИГАЦИЯ--\u003e\n \n \u003cheader class=\"header shadow-1 flex top-0 align-items-center justify-content-between\"\u003e\n \u003cdiv #div_brand class=\"brand m-2 flex align-items-center\"\u003e\n \u003ca href=\"javascript:void(0);\"\n class=\"overflow-hidden \n \u003c!--fixed --\u003e\n top-0 left-0 ps-2 ms-1 pt-2\"\n (click)=\"toggleCondensed()\"\n \u003e\n \u003cng-container *ngIf=\"isCondensed; else lg_logo\" \u003e \n \u003cimg [src]=\"appComponent.params.angular_logo_1\" alt=\"\" height=\"25\" style=\"margin-left: 40px; margin-top: -15px;\"\u003e\n \u003c/ng-container\u003e\n \n \u003cng-template #lg_logo \u003e\n \u003cimg [src]=\"appComponent.params.angular_logo_1\" alt=\"\" height=\"25\" style=\"margin-left: 40px; margin-top: -15px;\"\u003e\n \u003c/ng-template\u003e\n \u003c/a\u003e\n \u003c/div\u003e\n \u003cdiv\u003e\n \u003cng-container [ngTemplateOutlet]=\"usernav\"\u003e\u003c/ng-container\u003e\n \u003c/div\u003e\n \u003c/header\u003e\n \n \u003cdiv class=\"relative\"\u003e\n \n \u003c!-- БОКОВОЕ МЕНЮ СЛЕВА --\u003e\n \u003cdiv #sidebar\n class=\"sidebar fixed transition-all transition-duration-300\"\n [ngClass]=\"{ 'lg' : isCondensed }\"\n \u003e\n \n \u003cdiv class=\"menu shadow-1 px-1 py-4 overflow-hidden md:border-round-lg\"\u003e\n \n \u003cdiv class=\"ps-2 pe-1 flex mb-1 align-items-start justify-content-between white-space-nowrap\"\u003e\n \u003ca href=\"javascript:void(0);\" class=\"ps-2 menu-toggle \" (click)=\"toggleCondensed()\"\u003e\n \u003ci [class]=\"'dm ' + (isCondensed ? 'dm-menu-burger-on' : 'dm-menu-burger-off')\"\u003e\u003c/i\u003e\n \u003c/a\u003e\n \u003cform\n class=\"menu-search\"\n [formGroup]=\"form_search\"\n (submit)=\"onFSSubmit($event)\"\n \u003e\n \u003ca href=\"javascript:void(0)\" (click)=\"show_search_menu = true; search_menu.focus();\" class=\"\"\u003e\u003ci class=\"dm dm-search-02\"\u003e\u003c/i\u003e\u003c/a\u003e\n \u003cinput pInputText type=\"text\" #search_menu\n [style]=\"'width : ' + (show_search_menu ? '100%' : '0')\"\n (blur)=\"show_search_menu = !!form_search.value.search\"\n formControlName=\"search\"\n [ngClass]=\"{ 'py-0': show_search_menu,'p-0': !show_search_menu, }\"\n class=\"p-inputtext-sm border-0 ms-1 transition-all transition-duration-300\"\n /\u003e\n \u003ca *ngIf=\"show_search_menu\" href=\"javascript:void(0)\"\n (click)=\"clearFormSearch();\"\n class=\"\"\n \u003e\u003ci class=\"dm dm-remove\"\u003e\u003c/i\u003e\u003c/a\u003e\n \u003c/form\u003e\n \u003c/div\u003e\n \n \u003cdiv class=\"flex flex-column justify-content-between\" *ngIf=\"appComponent.menu\"\u003e\n \n \u003cp-scrollPanel [style]=\"{ 'height': 'calc(100vh - 164px )', 'width': '100%' }\" [styleClass]=\"'scroller py-3 ps-3'\"\u003e\n \u003cul class=\"list-unstyled mb-0\" *ngIf = \"session_roles.its_user \u0026\u0026 !session_roles.its_applicant\"\u003e\n \u003cli color=\"white\" class=\"menu-title d-flex justify-content-between align-items-center\" style=\"pointer-events: auto\"\u003e\n \u003ca\u003e\n \u003cdiv style=\"margin-left: -18px;\" class=\"text-black clickable\" (click)= \"appComponent.bpRun('its_new_doc_wizard',{})\"\u003e\u003ci style=\"color:white;\" class=\"pi pi-plus\"\u003e\u003c/i\u003e\u003c/div\u003e\n \u003cspan style=\"margin-left: 6px;\" class=\"text-white clickable\" (click)= \"appComponent.bpRun('its_new_doc_wizard',{})\"\u003e{{ 'Создать документ' | translate }}\u003c/span\u003e\n \u003c/a\u003e\n \u003c/li\u003e\n \n \u003cli *ngIf=\"sidebarsize == 'small' \u0026\u0026 !isCondensed\"\u003e\n \u003ca class=\"side-nav-url-ref d-flex align-items-center\"\n (click)= \"appComponent.bpRun('its_new_doc_wizard',{})\"\n \u003e\n \u003ci class=\"pi pi-plus\"\u003e\u003c/i\u003e\n \u003c!--\u003cspan\u003e {{ 'My Documents' | translate }}\u003c/span\u003e--\u003e\n \u003c!--\u003cspan class=\"badge rounded-pill bg-{{item.badge.variant}} float-end\" *ngIf=\"item.badge\"\u003e{{item.badge | translate}}\u003c/span\u003e--\u003e\n \u003c/a\u003e\n \u003c/li\u003e\n \u003c/ul\u003e\n \u003cul class=\"list-unstyled\" *ngIf=\"show_search_menu \u0026\u0026 found_bp_points\"\u003e\n \u003cli\u003e\n \u003cng-container\n [ngTemplateOutlet]=\"verticalmenu\"\n [ngTemplateOutletContext]=\"{ $implicit : { childs: found_bp_points, type: 'parent', expanded: true, title: 'BP-POINTS' } }\"\n \u003e\u003c/ng-container\u003e\n \u003c/li\u003e\n \u003c/ul\u003e\n \n \u003cul class=\"list-unstyled\" *ngIf=\"show_search_menu \u0026\u0026 found_bp_processes\"\u003e\n \u003cli\u003e\n \u003cng-container\n [ngTemplateOutlet]=\"verticalmenu\"\n [ngTemplateOutletContext]=\"{ $implicit : { childs: found_bp_processes, type: 'parent', expanded: true, title: 'BP-PROCESSES' } }\"\n \u003e\u003c/ng-container\u003e\n \u003c/li\u003e\n \u003c/ul\u003e\n \n \u003cul class=\"list-unstyled\" *ngIf=\"show_search_menu \u0026\u0026 found_pages\"\u003e\n \u003cli\u003e\n \u003cng-container\n [ngTemplateOutlet]=\"verticalmenu\"\n [ngTemplateOutletContext]=\"{ $implicit : { childs: found_pages, type: 'parent', expanded: true, title: 'Pages' | translate } }\"\n \u003e\u003c/ng-container\u003e\n \u003c/li\u003e\n \u003c/ul\u003e\n \n \u003cul class=\"list-unstyled\" *ngIf=\"show_search_menu \u0026\u0026 found_angular_widget\"\u003e\n \u003cli\u003e\n \u003cng-container\n [ngTemplateOutlet]=\"verticalmenu\"\n [ngTemplateOutletContext]=\"{ $implicit : { childs: found_angular_widget, type: 'parent', expanded: true, title: 'Widgets' | translate } }\"\n \u003e\u003c/ng-container\u003e\n \u003c/li\u003e\n \u003c/ul\u003e\n \n \u003cul class=\"list-unstyled\" *ngIf=\"!show_search_menu\"\u003e\n \u003cli class=\"d-md-none\"\u003e\n \u003cng-container [ngTemplateOutlet]=\"verticalmenu\"\n [ngTemplateOutletContext]=\"{ $implicit : { childs: appComponent.menu.middle, type: 'parent', expanded: true, title: 'Верхнее меню' } }\"\n \u003e\u003c/ng-container\u003e\n \u003c/li\u003e\n \u003cli\u003e\n \u003cng-container *ngFor=\"let item of appComponent.menu.top\" [ngTemplateOutlet]=\"verticalmenu\"\n [ngTemplateOutletContext]=\"{ $implicit : item }\"\n \u003e\u003c/ng-container\u003e\n \u003c/li\u003e\n \u003cli\u003e\n \u003cng-container [ngTemplateOutlet]=\"verticalmenu\" *ngIf=\"appComponent.menu.favorites?.length\"\n [ngTemplateOutletContext]=\"{ $implicit : { childs: appComponent.menu.favorites, type: 'parent', expanded: true, title: 'Favorites' } }\"\n \u003e\u003c/ng-container\u003e\n \u003c/li\u003e\n \u003c/ul\u003e\n \n \u003c/p-scrollPanel\u003e\n \n \u003cfooter class=\"mx-3 white-space-nowrap\"\u003e\n 2022 © B-Apps, LTD\u003cbr\u003eBy Saumbayev Y.K. \u0026 Saumbayev D.K.\n \u003c/footer\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \n \u003c!-- ОСНОВНОЕ ОКНО --\u003e\n \u003cdiv class=\"content pb-5\"\u003e\n \u003c!--{{appComponent.menu.middle | json}}--\u003e\n \u003cdiv *ngIf=\"appComponent.menu.middle\" class=\" top-menu shadow-1 flex sticky md:border-round-lg align-items-center\"\u003e\n \n \u003cng-container [ngTemplateOutlet]=\"topmenu\"\n [ngTemplateOutletContext]=\"{ mainmenu : appComponent.menu.middle, item_class: 'item-nav ms-3' }\"\n \u003e\u003c/ng-container\u003e\n \n \u003c/div\u003e\n \n \u003cdiv class=\"mt-lg-3 flex justify-content-between align-items-center\"\u003e\n \u003cng-container [ngTemplateOutlet]=\"breadcrumb_tpl\"\u003e\u003c/ng-container\u003e\n \u003cng-container *ngIf=\"router_outlet\" [ngTemplateOutlet]=\"router_outlet.page?.template1\"\u003e\u003c/ng-container\u003e\n \u003c/div\u003e\n \n \u003c!-- --\u003e\n \u003cdiv #main_content class=\"w-100 vh-50\" \u003e\n \n \u003c!--\u003cp-scrollPanel style=\"height: 40vh\" [styleClass]=\"'scroller mt-5 p-2'\"\u003e--\u003e\n \u003crouter-outlet (activate)=\"onPageActivate($event)\"\u003e\u003c/router-outlet\u003e\n \n \u003cdiv class=\"hidden md:block fixed bottom-0 right-0 pr-5\" *ngIf=\"session_roles.admin \u0026\u0026 router_outlet?.page\"\u003e\n \u003cul class=\"flex fs-4 list-unstyled\"\u003e\n \u003cli *ngIf=\"router_outlet.page.entity_id\" class=\"ms-2\"\u003e\u003ca class=\"text-danger\" [href]=\"'/static/#/settings/entitiesdetails/' + router_outlet.page.entity_id\" title=\"Перейти к Сущности (OLD)\"\u003e\u003ci class=\"dm dm-shield-check\"\u003e\u003c/i\u003e\u003c/a\u003e\u003c/li\u003e\n \u003cli *ngIf=\"router_outlet.page.entity_id\" class=\"ms-2\"\u003e\u003ca class=\"text-danger\" [routerLink]=\"'/entity_designer/' + router_outlet.page.entity_id\" title=\"Kuka Designer\"\u003e\u003ci class=\"dm dm-computer\"\u003e\u003c/i\u003e\u003c/a\u003e\u003c/li\u003e\n \u003cli *ngIf=\"router_outlet.page.entity_id\" class=\"ms-2\"\u003e\u003ca class=\"text-danger\" [routerLink]=\"'/entitiesdetails/' + router_outlet.page.entity_id\" title=\"Перейти к сущности\"\u003e\u003ci class=\"pi pi-code\"\u003e\u003c/i\u003e\u003c/a\u003e\u003c/li\u003e\n \u003cli *ngIf=\"router_outlet.page.page_id\" class=\"ms-2\"\u003e\u003ca class=\"text-danger\" [routerLink]=\"'/pagesdetails/' + router_outlet.page.page_id\" title=\"Редактировать страницу\"\u003e\u003ci class=\"dm dm-edit-rectangle\"\u003e\u003c/i\u003e\u003c/a\u003e\u003c/li\u003e\n \u003c/ul\u003e\n \u003c/div\u003e\n \u003c!--\u003c/p-scrollPanel\u003e--\u003e\n \u003c/div\u003e\n \n \u003c!--\u003cjit-page type=\"angular_widget\" code=\"shulte\" [data]=\"{}\"\u003e\u003c/jit-page\u003e--\u003e\n \u003cdiv class=\"bottom-menu fixed bottom-0 left-0 right-0 md:hidden py-2 px-3 shadow-2 flex justify-content-between align-items-center\"\u003e\n \u003ca href=\"javascript:void(0);\" class=\"menu-toggle \" (click)=\"toggleCondensed()\"\u003e\n \u003ci [class]=\"'dm ' + (isCondensed ? 'dm-menu-burger-on' : 'dm-menu-burger-off')\"\u003e\u003c/i\u003e\n \u003c/a\u003e\n \n \u003cdiv\u003e\n \n \u003cng-container *ngFor=\"let mainmenu of appComponent.menu.bottom\" [ngTemplateOutlet]=\"topmenu\"\n [ngTemplateOutletContext]=\"{ mainmenu, item_class: 'flex align-items-center' }\"\n \u003e\u003c/ng-container\u003e\n \u003c!--\u003ca href=\"javascript: void(0);\" (click)=\"logout()\" class=\"text-danger ms-3\" [title]=\"'Logout' | translate\"\u003e\u003ci class=\"dm dm-logout-01\"\u003e\u003c/i\u003e\u003c/a\u003e--\u003e\n \u003cng-container [ngTemplateOutlet]=\"topmenu\"\n [ngTemplateOutletContext]=\"{\n mainmenu : [{\n title: ' ',\n icon: appComponent.menu.account?.length ? 'dm dm-user-circle' : 'dm dm-logout-01',\n url: 'vm.logout()',\n type: appComponent.menu.account ? Models.MenuType.PARENT : Models.MenuType.EVENT,\n childs: appComponent.menu.account || [] \n }],\n item_class: 'flex align-items-center' }\"\n \u003e\u003c/ng-container\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \n\u003c/div\u003e\n\n\u003c!-- HEADER --\u003e\n\u003cng-template #usernav\u003e\n \u003cdiv class=\"small flex justify-content-end\"\u003e\n \u003c!--\u003cform [formGroup]=\"form_search\" (submit)=\"onFSSubmit($event)\" class=\"ms-4 none lg-block\"\u003e--\u003e\n \u003c!-- \u003cspan class=\"p-input-icon-left\"\u003e--\u003e\n \u003c!-- \u003ci class=\"dm dm-search-02\"\u003e\u003c/i\u003e--\u003e\n \u003c!-- \u003cinput pInputText type=\"text\" formControlName=\"search\"--\u003e\n \u003c!-- class=\"p-inputtext-lg my-0 border-0\"--\u003e\n \u003c!-- placeholder=\"{{'Search' | translate}}\"\u003e--\u003e\n \u003c!-- \u003c/span\u003e--\u003e\n \u003c!--\u003c/form\u003e--\u003e\n\n \u003cdiv class=\"usernav flex justify-content-end align-items-center\"\u003e\n\n \u003ca href=\"javascript:void(0);\"\n *ngIf=\"session_roles.admin\"\n (click)=\"toggleDarkMode()\"\n class=\"mt-1 ms-3\"\n \u003e\u003ci [class]=\"dark_mode ? 'dm dm-sun' : 'dm dm-night'\"\u003e\u003c/i\u003e\u003c/a\u003e\n \n \u003c!--\u003cdiv ngbDropdown class=\"hidden md:block\"\u003e--\u003e\n \u003c!-- \u003ca href=\"javascript:void(0)\" ngbDropdownToggle--\u003e\n \u003c!-- *ngIf=\"appComponent.translateService.getLangs().length \u003e 0\"--\u003e\n \u003c!-- aria-expanded=\"false\"--\u003e\n \u003c!-- class=\" ms-2\"--\u003e\n \u003c!-- \u003e--\u003e\n \u003c!-- \u003cspan [innerHtml]=\"appComponent.translateService.currentLang | uppercase | translate\"\u003e\u003c/span\u003e--\u003e\n \u003c!-- \u003cspan class=\"p-badge p-badge-danger\" [innerHtml]=\"appComponent.translateService.getLangs().length\"\u003e\u003c/span\u003e--\u003e\n \u003c!-- \u003c/a\u003e--\u003e\n\n \u003c!-- \u003cdiv ngbDropdownMenu\u003e--\u003e\n \u003c!-- \u003ca href=\"javascript:void(0);\" ngbDropdownItem --\u003e\n \u003c!-- *ngFor=\"let lang of appComponent.translateService.getLangs(); index as index\"--\u003e\n \u003c!-- key=\"index\"--\u003e\n \u003c!-- [ngClass]=\"{ 'active' : appComponent.translateService.currentLang == lang }\"--\u003e\n \u003c!-- (click)=\"appComponent.translateService.use(lang)\"--\u003e\n \u003c!-- [innerHtml]=\"lang | uppercase | translate\"--\u003e\n \u003c!-- \u003e\u003c/a\u003e--\u003e\n \u003c!-- \u003c/div\u003e--\u003e\n \u003c!--\u003c/div\u003e--\u003e\n \n \u003cdiv ngbDropdown *ngIf=\"sessioninfo\"\u003e\n \n \u003ca ngbDropdownToggle\n href=\"javascript:void(0);\"\n aria-expanded=\"false\" \n class=\"ms-3\"\n \u003e\n \u003ci class=\"dm dm-notification-03\"\u003e\u003c/i\u003e\n \u003cspan *ngIf=\"notifications.length\" class=\"p-badge p-badge-danger\" [innerHtml]=\"notifications.length\"\u003e\u003c/span\u003e\n \u003c/a\u003e\n \n \u003cdiv ngbDropdownMenu\u003e\n \u003ch6 *ngIf=\"notifications?.length \u003e 0\" class=\"mx-2\" translate=\"Notifications\"\u003e\u003c/h6\u003e\n \u003ch6 *ngIf=\"!notifications || notifications.length == 0\" class=\"mx-2\" translate=\"Not Found\"\u003e\u003c/h6\u003e\n \u003cdiv style=\"max-height: 230px;\" class=\"overflow-auto\"\u003e\n \u003cng-container *ngFor=\"let item of notifications\"\u003e\n \u003ca ngbDropDownItem \n (click)=\"setIsClosed(item);router.navigate([item.url])\"\n class=\"text-reset notification-item block \"\n [ngClass]=\"{'active' : !!item.active}\"\n \u003e\n \u003cdiv class=\"flex\"\u003e\n \u003cimg *ngIf=\"item.avatar_url\" src=\"item.avatar_url\"\n class=\"me-3 rounded-circle avatar-xs\" alt=\"user-pic\"\u003e\n \u003cdiv class=\"flex-1\"\u003e\n \u003ch6 class=\"mt-0 mb-1\" key=\"t-your-order\" [innerHtml]=\"item.title\"\u003e\u003c/h6\u003e\n \u003cdiv class=\"font-size-13 text-muted\"\u003e\n \u003cp class=\"mb-0 font-size-12\"\u003e\n \u003ci class=\"fas fa-bell\"\u003e\u003c/i\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/a\u003e\n \u003c/ng-container\u003e\n \u003c/div\u003e\n \u003c!--\u003chr /\u003e--\u003e\n \n \u003c!--\u003cdiv class=\"p-2\"\u003e--\u003e\n \u003c!-- \u003ca class=\"\" href=\"javascript:void(0)\"\u003e--\u003e\n \u003c!-- \u003cspan translate=\"Загрузить больше\"\u003e\u003c/span\u003e--\u003e\n \u003c!-- \u003c/a\u003e--\u003e\n \u003c!--\u003c/div\u003e--\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \n \u003cdiv class=\"hidden md:block ms-3\"\u003e\n \u003cng-container [ngTemplateOutlet]=\"topmenu\"\n [ngTemplateOutletContext]=\"{\n mainmenu : [{\n title: sessioninfo?.title,\n icon: 'dm dm-user-circle',\n url: '/usersdetails/' + sessioninfo?.id,\n type: appComponent.menu.account ? Models.MenuType.PARENT : Models.MenuType.ROUTER,\n childs: appComponent.menu.account || [] \n }],\n item_class: 'flex align-items-center' }\"\n \u003e\u003c/ng-container\u003e\n \u003c/div\u003e\n\n \u003cdiv ngbDropdown *ngIf=\"session_roles.admin\" class=\"hidden md:block\"\u003e\n \u003ca ngbDropdownToggle\n href=\"javascript:void(0);\"\n class=\"text-danger ms-2\"\n \u003e\u003ci class=\"dm dm-setting\"\u003e\u003c/i\u003e\u003c/a\u003e\n \n \u003cdiv ngbDropdownMenu class=\"p-5\"\u003e\n \u003cdiv class=\"row\" style=\"width: 50vw\"\u003e\n \u003cdiv class=\"col-6\"\u003e\n \u003cp class=\"fs-6\" translate=\"Параметры\"\u003e\u003c/p\u003e\n \u003cul class=\"my-2 list-unstyled small\"\u003e\n \u003cli\u003e\u003ca ngbDropdownItem routerLink=\"/domains\" translate=\"Domains\"\u003e\u003c/a\u003e\u003c/li\u003e\n \u003cli\u003e\u003ca ngbDropdownItem routerLink=\"/dm-icons\" translate=\"DamuBPM Icons\"\u003e\u003c/a\u003e\u003c/li\u003e\n \u003c/ul\u003e\n \u003c/div\u003e\n \u003cdiv class=\"col-6\"\u003e\n \u003cp class=\"fs-6\" translate=\"Разработка интерфейса\"\u003e\u003c/p\u003e\n \u003cul class=\"my-2 list-unstyled small\"\u003e\n \u003cli\u003e\u003ca ngbDropdownItem routerLink=\"/angular_widget\" translate=\"Widgets\"\u003e\u003c/a\u003e\u003c/li\u003e\n \u003cli\u003e\u003ca ngbDropdownItem routerLink=\"/page_tpls\" translate=\"Pages Template\"\u003e\u003c/a\u003e\u003c/li\u003e\n \u003cli\u003e\u003ca ngbDropdownItem routerLink=\"/pages\" translate=\"Pages\"\u003e\u003c/a\u003e\u003c/li\u003e\n \u003cli ngbDropdownItem \u003eCMS: \u003ca routerLink=\"/cms_p\" translate=\"Pages\"\u003e\u003c/a\u003e | \u003ca routerLink=\"/cms_js\" translate=\"JS\"\u003e\u003c/a\u003e | \u003ca routerLink=\"/cms_css\" translate=\"CSS\"\u003e\u003c/a\u003e\u003c/li\u003e\n \u003cli\u003e\u003ca ngbDropdownItem routerLink=\"/ui_components\" translate=\"UI-Components\"\u003e\u003c/a\u003e\u003c/li\u003e\n \u003c/ul\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \n \u003cdiv class=\"hidden md:block pt-1\"\u003e\n \u003ca href=\"javascript: void(0);\" (click)=\"logout()\" class=\"text-danger ms-3\" [title]=\"'Logout' | translate\"\u003e\u003ci class=\"dm dm-logout-01\"\u003e\u003c/i\u003e\u003c/a\u003e\n \u003c/div\u003e\n \n \u003c/div\u003e\n \u003c/div\u003e\n\u003c/ng-template\u003e\n\n\u003c!--TOP BAR MENU TEMPLATE--\u003e\n\u003cng-template #topmenu let-mainmenu=\"mainmenu\" let-parent_class=\"parent_class\" let-item_class=\"item_class\"\u003e\n \n \u003cng-container *ngFor=\"let item of mainmenu\"\u003e\n \n \u003ca *ngIf=\"item.type == 'router'\" [routerLink]=\"item.url\" [queryParams]=\"item.query\" routerLinkActive=\"active\" (click)=\"getMenu()\" [class]=\"item_class\"\u003e\n \u003ci [class]=\"item.icon || 'dm dm-doc'\" \u003e{{ item.icon_value }}\u003c/i\u003e\n \u003cspan [translate]=\"item.title\"\u003e\u003c/span\u003e\n \u003cspan *ngIf=\"item.badge\" [class]=\"'ms-2 p-badge p-badge-' + (item.badge_variant || 'danger') + ' float-end'\" \n [translate]=\"item.badge\"\u003e\u003c/span\u003e\n \u003c/a\u003e\n \n \u003ca *ngIf=\"item.type == 'bpms'\" href=\"javascript:void(0);\" (click)=\"appComponent.bpRun(item.bp_process_code,{})\" [class]=\"item_class\"\u003e\n \u003ci [class]=\"item.icon || 'dm dm-cpu'\" \u003e{{ item.icon_value }}\u003c/i\u003e\n \u003cspan [translate]=\"item.title\"\u003e\u003c/span\u003e\n \u003cspan *ngIf=\"item.badge\" [class]=\"'ms-2 p-badge p-badge-' + (item.badge_variant || 'danger') + ' float-end'\" \n [translate]=\"item.badge\"\u003e\u003c/span\u003e\n \u003c/a\u003e\n \n \u003ca *ngIf=\"item.type == 'event'\" href=\"javascript:void(0);\" (click)=\"runEval(item.url)\" [class]=\"item_class\"\u003e\n \u003ci [class]=\"item.icon || 'dm dm-invoice'\"\u003e{{ item.icon_value }}\u003c/i\u003e\n \u003cspan [translate]=\"item.title\"\u003e\u003c/span\u003e\n \u003cspan *ngIf=\"item.badge\" [class]=\"'ms-2 p-badge p-badge-' + (item.badge_variant || 'danger') + ' float-end'\" \n [translate]=\"item.badge\"\u003e\u003c/span\u003e\n \u003c/a\u003e\n \n \u003ca *ngIf=\"item.type == 'external'\" [href]=\"item.url\" [class]=\"item_class\"\u003e\n \u003ci [class]=\"item.icon || 'dm dm-globe'\" \u003e{{ item.icon_value }}\u003c/i\u003e\n \u003cspan [translate]=\"item.title\"\u003e\u003c/span\u003e\n \u003cspan *ngIf=\"item.badge\" [class]=\"'ms-2 p-badge p-badge-' + (item.badge_variant || 'danger') + ' float-end'\" \n [translate]=\"item.badge\"\u003e\u003c/span\u003e\n \u003c/a\u003e\n \n \u003cdiv ngbDropdown *ngIf=\"item.type == 'parent'\"\u003e\n \n \u003ca\n ngbDropdownToggle\n href=\"javascript:void(0);\"\n [class]=\"item_class\"\n \u003e\n \u003ci [class]=\"item.icon || 'dm dm-collection'\"\u003e{{ item.icon_value }}\u003c/i\u003e\n \u003cspan [translate]=\"item.title\"\u003e\u003c/span\u003e\n \u003cspan *ngIf=\"item.badge\" [class]=\"'ms-2 p-badge p-badge-' + (item.badge_variant || 'danger') + ' absolute right-0'\" [translate]=\"item.badge\"\u003e\u003c/span\u003e\n \u003c/a\u003e\n \n \u003cdiv ngbDropdownMenu *ngIf=\"item.type == 'parent'\"\u003e\n \u003cng-container [ngTemplateOutlet]=\"topmenu\"\n [ngTemplateOutletContext]=\"{ mainmenu : item.childs, item_class: 'dropdown-item' }\"\n \u003e\u003c/ng-container\u003e\n \u003c/div\u003e\n \u003c/div\u003e\n \u003c/ng-container\u003e\n\n\u003c/ng-template\u003e\n\n\u003c!-- SIDEBAR MENU --\u003e\n\n\u003cng-template #verticalmenu let-item=\"$implicit\"\u003e\n \n \u003ca *ngIf=\"item.type == 'router'\" class=\"my-2\" [routerLink]=\"item.url\" [queryParams]=\"item.query\" routerLinkActive=\"active\" (click)=\"getMenu()\"\u003e\n \u003ci [class]=\"item.icon || 'dm dm-doc'\" \u003e{{ item.icon_value }}\u003c/i\u003e\n \u003cspan [translate]=\"item.title\"\u003e\u003c/span\u003e\n \u003cspan *ngIf=\"item.badge\" [class]=\"'ms-2 p-badge p-badge-' + (item.badge_variant || 'danger') + ' float-end'\" \n [translate]=\"item.badge\"\u003e\u003c/span\u003e\n \u003c/a\u003e\n\n \u003ca *ngIf=\"item.type == 'bpms'\" href=\"javascript:void(0);\" class=\"my-2\" (click)=\"appComponent.bpRun(item.bp_process_code,{})\"\u003e\n \u003ci [class]=\"item.icon || 'dm dm-cpu'\" \u003e{{ item.icon_value }}\u003c/i\u003e\n \u003cspan [translate]=\"item.title\"\u003e\u003c/span\u003e\n \u003cspan *ngIf=\"item.badge\" [class]=\"'ms-2 p-badge p-badge-' + (item.badge_variant || 'danger') + ' float-end'\" \n [translate]=\"item.badge\"\u003e\u003c/span\u003e\n \u003c/a\u003e\n\n \u003ca *ngIf=\"item.type == 'event'\" href=\"javascript:void(0);\" class=\"my-2\" (click)=\"runEval(item.url)\"\u003e\n \u003ci [class]=\"item.icon || 'dm dm-cpu'\"\u003e{{ item.icon_value }}\u003c/i\u003e\n \u003cspan [translate]=\"item.title\"\u003e\u003c/span\u003e\n \u003cspan *ngIf=\"item.badge\" [class]=\"'ms-2 p-badge p-badge-' + (item.badge_variant || 'danger') + ' float-end'\" \n [translate]=\"item.badge\"\u003e\u003c/span\u003e\n \u003c/a\u003e\n\n \u003ca *ngIf=\"item.type == 'external'\" [href]=\"item.url\" class=\"my-2\"\u003e\n \u003ci [class]=\"item.icon || 'dm dm-globe'\" \u003e{{ item.icon_value }}\u003c/i\u003e\n \u003cspan [translate]=\"item.title\"\u003e\u003c/span\u003e\n \u003cspan *ngIf=\"item.badge\" [class]=\"'ms-2 p-badge p-badge-' + (item.badge_variant || 'danger') + ' float-end'\" \n [translate]=\"item.badge\"\u003e\u003c/span\u003e\n \u003c/a\u003e\n\n \u003ca *ngIf=\"item.type == 'parent'\"\n href=\"javascript:void(0);\"\n [ngClass]=\"{ 'collapsed': !!item.expanded }\"\n class=\"expander my-2 \"\n (click)=\"sidebarMenuCollapse(item, item_ul)\"\n \u003e\n \u003ci [class]=\"item.icon || 'dm dm-layers'\"\u003e{{ item.icon_value }}\u003c/i\u003e\n \u003cspan [translate]=\"item.title\"\u003e\u003c/span\u003e\n \u003cspan *ngIf=\"item.badge\" [class]=\"'ms-2 p-badge p-badge-' + (item.badge_variant || 'danger') + ' absolute right-0'\" [translate]=\"item.badge\"\u003e\u003c/span\u003e\n \u003c/a\u003e\n\n \u003cul #item_ul\n class=\"list-unstyled overflow-auto mi-collapse mi-collapsing\"\n [ngClass]=\"{ 'mi-show' : item.expanded }\"\n \u003e\n \u003cli *ngFor=\"let subitem of item.childs; index as index\"\n [ngClass]=\"{ 'active': subitem.active, 'slide-left': subitem.title.length \u003e 20 }\"\n \u003e\n \u003cng-container [ngTemplateOutlet]=\"verticalmenu\"\n [ngTemplateOutletContext]=\"{ $implicit : subitem }\"\n \u003e\u003c/ng-container\u003e\n \u003c/li\u003e\n \u003c/ul\u003e\n\u003c/ng-template\u003e\n\n\u003cng-template #breadcrumb_tpl\u003e\n \u003cnav aria-label=\"breadcrumb\"\u003e\n \u003col class=\"breadcrumb breadcrumb-dividers-bar\" *ngIf=\"appComponent.history.length \u003e 1\"\u003e\n \u003cng-container *ngFor=\"let bc of appComponent.history || []; let index = index\"\u003e\n \u003cng-container *ngIf=\"index \u003e appComponent.active_index - 3 \u0026\u0026 index \u003c appComponent.active_index + 3\"\u003e\n \u003cli *ngIf=\"index != appComponent.active_index\" class=\"breadcrumb-item\"\u003e\n \u003ca routerLinkActive=\"active\" [routerLink]=\"bc.url\" [queryParams]=\"bc.query\" class=\"clickable\" [translate]=\"bc.title\"\u003e\u003c/a\u003e\n \u003c/li\u003e\n \u003cli *ngIf=\"index == appComponent.active_index\" class=\"breadcrumb-item active\"\u003e\n \u003cspan [translate]=\"bc.title\"\u003e\u003c/span\u003e\n \u003c/li\u003e\n \u003c/ng-container\u003e\n \u003c/ng-container\u003e\n \u003c/ol\u003e\n \u003c/nav\u003e\n\u003c/ng-template\u003e\n\n\n\n","json":"const vm = this; \nconst {first} = rxjs;\nconst {forkJoin} = rx;\nconst {map,take} = rxjs;\nconst {QueryOptions} = Models;\nconst { Validators } = forms;\n\n\nreturn class GenClass extends vm.constructor {\n\n Models = Models;\n loaded = false;\n sidebar_menu;\n\n dark_mode = false;\n menu;\n\n isCondensed = false;\n\n user;\n user_detail;\n \n notifications = [];\n \n \n form_search;\n fs_submitted = false;\n \n router_ev_sub;\n\n pages_found = [];\n page_search;\n search_result;\n\n found_bp_points;\n found_bp_processes;\n found_rest_services;\n found_pages;\n found_angular_widget;\n \n router_outlet;\n \n newNotif = false;\n flow_widget = false;\n show_flow_widget = false;\n \n show_search_menu = false;\n \n get fs() {\n return this.form_search.controls;\n }\n \n get filtered_notifications() {\n return this.notifications.filter(x =\u003e x.is_closed == 0);\n }\n\n get has_new_notifications() {\n return this.notifications \u0026\u0026 this.notifications.some(x =\u003e x.is_closed == 0);\n }\n\n param_sub = this.route.params.subscribe(params =\u003e {\n // console.log('-0-0-', this.route.snapshot.queryParams);\n });\n\n query_sub = this.route.queryParams.pipe(take(1)).subscribe(params =\u003e {\n if (params.search) {\n this.fs.search.setValue(params.search);\n }\n });\n \n user_subs = this.accountService.user.subscribe(x =\u003e {\n // \n });\n \n setIsClosed(item){\n \n this.dbQueryService.restapiGet(\"alerts\",{})\n .pipe(first())\n .subscribe(items =\u003e {\n this.notifications = items.alerts;\n //console.log(\"items\",items);\n }); \n\n this.dbQueryService.restapiPost(\"notifications_set_is_closed\",{id:item.id})\n .pipe(first())\n .subscribe(items =\u003e {});\n \n }\n\n getMenu() {\n this.appComponent.getGlobal({\n only_menu : true,\n loader: true,\n callback : (resp) =\u003e {\n // \n }\n })\n }\n\n ngOnInit() {\n // this.route.data.subscribe(d =\u003e {\n // console.log(d.breadcrumbs)\n // })\n \n // \n //if (this.accountService \u0026\u0026 this.accountService.userSubject \u0026\u0026 this.accountService.userSubject.value.sessioninfo \u0026\u0026 this.accountService.userSubject.value.sessioninfo.last_active_at_diff==\"00:00:00\"){\n // this.appComponent.bpRun(\"welcome_form\",{});\n //}\n \n // ------------------\n const MAX_COUNT = 60 * 1500; // максимальное значение обратного отсчета в секундах\n \n this.subs_interval = rx.interval(1 * 60 * 1000).subscribe(x =\u003e {\n if (localStorage \u0026\u0026 localStorage.getItem(\"lastActivity\")){\n let seconds = (new Date() - new Date(localStorage.getItem(\"lastActivity\")) ) / 1000;\n if (seconds \u003e MAX_COUNT) {\n \n if (this.session_parameters \u0026\u0026 this.session_parameters.ui_ng_session_autologout == \"1\") {\n this.subs_interval.unsubscribe();\n this.logout();\n } else{\n this.accountService.getSession(true);\n }\n }\n //console.log(seconds, localStorage.getItem('lastActivity'));\n }\n });\n \n // слушаем движение мышки\n rx.fromEvent(document,'mousemove').subscribe(event =\u003e {\n localStorage.setItem(\"lastActivity\",new Date());\n //console.log(localStorage.getItem('lastActivity'));\n });\n \n // слушаем кнопки мышки\n rx.fromEvent(document,'mousedown').subscribe(event =\u003e {\n localStorage.setItem(\"lastActivity\",new Date());\n //console.log(localStorage.getItem('lastActivity'));\n });\n \n // слушаем клавиатуру\n rx.fromEvent(window,'keydown').subscribe(event =\u003e {\n localStorage.setItem(\"lastActivity\",new Date());\n //console.log(localStorage.getItem('lastActivity'));\n });\n \n if(window.matchMedia \u0026\u0026 this.dark_mode == null){\n let colorSchemeQuery = window.matchMedia('(prefers-color-scheme: dark)');\n colorSchemeQuery.addEventListener('change', this.setDarkModeAuto());\n }\n \n /**\n * ANGULAR WIDGET\n */\n \n //this.getUserInfo(this.sessioninfo?.id);\n this.notifications = this.user_alerts || [];\n\n this.router.events\n // .pipe(rxjs.filter((e) =\u003e e instanceof NavigationEnd))\n .subscribe((e) =\u003e {\n\n if (e.navigationTrigger === 'popstate') {\n //this.ngOnInit();\n }\n \n });\n\n\n this.websocketService.messages.subscribe(msg =\u003e {\n \n //console.log(\"this.websocketService.messages.subscribe1\",msg);\n \n if (msg.data \u0026\u0026 msg.type==\"url_notification\"){\n //console.log(\"this.websocketService.messages.subscribe2\",msg.data);\n \n this.dbQueryService.restapiGet(\"alerts\",{})\n .pipe(first())\n .subscribe(items =\u003e {\n this.notifications = items.alerts;\n this.newNotif = true\n this.notificationService.create('Уведомление!', {\n requireInteraction: true,\n body: this.notifications[this.notifications.length-1] ? this.notifications[this.notifications.length-1].title : 'Проверьте колокольчик',\n icon: '/assets/img/peopleavatars/face_1.svg'\n }).subscribe(x =\u003e {\n console.log(x);\n });\n //console.log(\"items\",items);\n });\n \n }\n \n //this.alertService.info(\"Новое уведомление: \" + msg.data.title);\n \n \n });\n\n this.form_search = this.formBuilder.group({\n search: ['', Validators.required],\n });\n \n this.loaded = true;\n\n // --- ПЛАВАЮЩИЙ ВИДЖЕТ\n \n this.flow_widget = true;\n // -----------------\n \n try {\n this.isCondensed = localStorage.getItem('widget.is_condensed') == '1';\n this.dark_mode = localStorage.getItem('widget.dark_mode') == '1';\n } catch (err) {\n // \n }\n \n this.appComponent.bp_modal_style['height'] = 'auto';\n this.appComponent.bp_modal_style['min-height'] = '500px';\n }\n\n /***\n * Activate droup down set \n */\n ngAfterViewInit() {\n // \n }\n \n ngOnDestroy() {\n this.user_subs.unsubscribe();\n this.query_sub.unsubscribe();\n if(this.flow_widget) this.flow_widget = false;\n // this.router_ev_sub.unsubscribe();\n }\n \n clearFormSearch() {\n this.show_search_menu = false;\n this.found_bp_points = [];\n this.found_bp_processes = [];\n this.found_rest_services = [];\n this.found_pages = [];\n this.found_angular_widget = [];\n this.fs.search.setValue('');\n }\n\n // Поиск в хедере\n onFSSubmit(event) {\n \n this.fs_submitted = true;\n\n let opt1 = new QueryOptions('bp_points');\n opt1.page = 1;\n opt1.perpage = 10;\n opt1.flt = { script_txt: this.fs.search.value }\n \n let opt2 = new QueryOptions('bp_processes');\n opt2.page = 1;\n opt2.perpage = 10;\n opt2.flt = { code: this.fs.search.value, title: this.fs.search.value }\n \n let opt3 = new QueryOptions('rest_services');\n opt3.page = 1;\n opt3.perpage = 10;\n opt3.flt = { body: this.fs.search.value, title: this.fs.search.value }\n \n let opt4 = new QueryOptions('pages');\n opt4.page = 1;\n opt4.perpage = 10;\n opt4.flt = { code: this.fs.search.value, title: this.fs.search.value }\n \n let opt5 = new QueryOptions('angular_widget');\n opt5.page = 1;\n opt5.perpage = 10;\n opt5.flt = { code: this.fs.search.value, title: this.fs.search.value }\n \n forkJoin(\n this.dbQueryService.getQuery(opt1),\n this.dbQueryService.getQuery(opt2),\n // this.dbQueryService.getQuery(opt3),\n this.dbQueryService.getQuery(opt4),\n this.dbQueryService.getQuery(opt5),\n )\n .subscribe((resp) =\u003e {\n // this.template1.hide();\n // this.template1.toggle(event);\n \n // =================================\n let bp_points = (resp[0].items || []).map(x =\u003e ({ \n 'url': 'bp_pointsdetails/' + x.id,\n 'title': x.title || '',\n 'expanded' : true,\n 'icon': 'dm dm-setting',\n 'childs': []\n }));\n \n this.found_bp_points = [];\n for(let item of bp_points) {\n this.found_bp_points.push(Models.MenuItem.setMenu(item));\n }\n \n // =================================\n let bp_processes = (resp[1].items || []).map(x =\u003e ({ \n 'url': 'bp_processesdetails/' + x.id,\n 'title': x.title || '',\n 'expanded' : true,\n 'icon': 'dm dm-setting',\n 'childs': []\n }));\n \n this.found_bp_processes = [];\n for(let item of bp_processes) {\n this.found_bp_processes.push(Models.MenuItem.setMenu(item));\n }\n \n // =================================\n let pages = (resp[2].items || []).map(x =\u003e ({ \n 'url': 'pagesdetails/' + x.id,\n 'title': x.title || '',\n 'expanded' : true,\n 'icon': 'dm dm-doc',\n 'childs': []\n }));\n \n this.found_pages = [];\n for(let item of pages) {\n this.found_pages.push(Models.MenuItem.setMenu(item));\n }\n \n // =================================\n let angular_widget = (resp[3].items || []).map(x =\u003e ({ \n 'url': 'angular_widgetdetails/' + x.id,\n 'title': x.title || '',\n 'expanded' : true,\n 'icon': 'dm dm-doc',\n 'childs': []\n }));\n \n this.found_angular_widget = [];\n for(let item of angular_widget) {\n this.found_angular_widget.push(Models.MenuItem.setMenu(item));\n }\n \n \n // this.found_bp_processes = resp[1];\n // // this.search_result.rest_services = resp[2];\n // this.found_pages = resp[3];\n // this.found_angular_widget = resp[4];\n })\n \n }\n\n updateNotification(notification) {\n this.dbQueryService.updateTable('notifications', [{\n id: notification.id,\n is_closed: \"1\"\n }]).subscribe(resp =\u003e {\n if (resp['error'] == 0) {\n notification.is_closed = 1;\n // this.alertService.info('Прочитано');\n } else {\n this.alertService.error('Ошибка! ' + resp['error_code'] + ' - ' + resp['error_dscr']);\n }\n });\n }\n\n getUserInfo(id) {\n\n this.dbQueryService.getDetail('users', id)\n .pipe(map(resp =\u003e resp['users']))\n .subscribe(users =\u003e {\n if (users \u0026\u0026 users.length \u003e 0) this.user_detail = users[0];\n });\n }\n \n log(...queue) {\n console.log(...queue);\n }\n \n runEval(action, vm = this) {\n return eval(action);\n }\n\n logout() {\n this.accountService.logout();\n }\n \n /**\n * ==========================================================================\n */\n \n toggleCondensed() {\n this.isCondensed = !this.isCondensed;\n \n try {\n localStorage.setItem('widget.is_condensed',this.isCondensed ? '1' : '0');\n } catch(err) {\n // \n }\n }\n \n setDarkModeAuto() {\n this.dark_mode = !!window.matchMedia('(prefers-color-scheme: dark)').matches;\n }\n \n toggleDarkMode() {\n this.dark_mode = !this.dark_mode\n \n try {\n localStorage.setItem('widget.dark_mode',this.dark_mode ? '1' : '0');\n } catch(err) {\n // \n }\n }\n\n sidebarMenuCollapse(item, el) {\n\n const transitionend = () =\u003e {\n el.style['height'] = item.expanded ? 'auto' : '0';\n el.removeEventListener('transitionend', transitionend);\n }; \n\n el.addEventListener(\"transitionend\", transitionend);\n el.style['height'] = item.expanded ? el.scrollHeight + 'px' : '0';\n\n setTimeout(() =\u003e {\n item.expanded = !item.expanded;\n el.style['height'] = item.expanded ? el.scrollHeight + 'px' : '0';\n });\n }\n \n onMaximize($event) {\n console.log($event);\n this.show_flow_widget = $event.maximized;\n }\n \n onPageActivate(router_outlet) {\n this.router_outlet = router_outlet;\n // console.log('router_outlet',this.appComponent.layout.router_outlet,this.appComponent.layout.router_outlet.page);\n }\n\n}"}