{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///external \"tessa.tessa.platform\"","webpack:///external \"tessa.tessa.ui\"","webpack:///external \"tessa.tessa.extensions\"","webpack:///external \"tessa.tessa.workflow\"","webpack:///external \"tessa.tessa.cards\"","webpack:///external \"tessa.tessa.ui.cards\"","webpack:///external \"tessa.tessa.platform.validation\"","webpack:///external \"tessa.tessa.workflow.krProcess\"","webpack:///external \"tessa.tessa.localization\"","webpack:///external \"tessa.tessa.ui.tiles\"","webpack:///external \"tessa.tessa.ui.cards.controls\"","webpack:///external \"mobx\"","webpack:///external \"tessa.tessa\"","webpack:///external \"tessa.tessa.forums\"","webpack:///external \"tessa.tessa.views\"","webpack:///external \"tessa.tessa.cards.service\"","webpack:///external \"tessa.tessa.cards.extensions\"","webpack:///external \"tessa.tessa.views.metadata\"","webpack:///external \"React\"","webpack:///external \"tessa.tessa.ui.uiHost\"","webpack:///external \"tessa.tessa.cards.types\"","webpack:///external \"tessa.tessa.workflow.krProcess.clientCommandInterpreter\"","webpack:///external \"tessa.tessa.ui.cards.tasks\"","webpack:///external \"tessa.tessa.ui.views.extensions\"","webpack:///external \"tessa.tessa.ui.cards.forms\"","webpack:///external \"tessa.tessa.files\"","webpack:///external \"tessa.common.utility\"","webpack:///external \"tessa.tessa.ui.files\"","webpack:///external \"tessa.tessa.ui.views\"","webpack:///external \"mobxReact\"","webpack:///external \"tessa.ui\"","webpack:///external \"tessa.tessa.platform.storage\"","webpack:///external \"tessa.tessa.ui.views.content\"","webpack:///external \"styledComponents\"","webpack:///external \"tessa.tessa.ui.views.workplaces.tree\"","webpack:///external \"tessa.components.cardElements\"","webpack:///external \"tessa.tessa.scheme\"","webpack:///external \"tessa.tessa.ui.cards.blocks\"","webpack:///external \"tessa.tessa.ui.conditions\"","webpack:///external \"tessa.tessa.platform.operations\"","webpack:///external \"tessa.common.platform\"","webpack:///external \"tessa.tessa.cards.workflow\"","webpack:///external \"tessa.tessa.cards.metadata\"","webpack:///external \"tessa.tessa.views.workplaces\"","webpack:///./node_modules/file-saver/dist/FileSaver.min.js","webpack:///external \"Moment\"","webpack:///external \"classnames\"","webpack:///(webpack)/buildin/global.js","webpack:///./src/default/bundleRegistrator.ts","webpack:///./src/default/cards/acquaintanceClientStoreExtension.ts","webpack:///./src/default/cards/openFromKrDocStatesOnDoubleClickExtension.ts","webpack:///./src/default/cards/krDocStateClientDeleteExtension.ts","webpack:///./src/default/cards/completionOptionGetTypeIdListRequestExtension.ts","webpack:///./src/default/cards/functionRoleGetTypeIdListRequestExtension.ts","webpack:///./src/default/cards/krPermissionsMandatoryStoreExtension.ts","webpack:///./src/default/cards/registrator.ts","webpack:///./node_modules/compare-versions/index.mjs","webpack:///./src/default/deski/deskiManager.ts","webpack:///./src/default/deski/deskiExtension.tsx","webpack:///./src/default/deski/registrator.ts","webpack:///./src/default/documents/hideEmptyIncomingReferencesControl.ts","webpack:///./src/default/documents/registrator.ts","webpack:///./src/default/eds/cryptoProEDSProvider.ts","webpack:///./src/default/eds/edsProviderInitializeExtension.ts","webpack:///./src/default/eds/signatureSettingsStoreExtension.tsx","webpack:///./src/default/eds/helpers.ts","webpack:///./src/default/eds/signatureSettingsUIExtension.tsx","webpack:///./src/default/eds/registrator.ts","webpack:///./src/default/externalFiles/externalFile.ts","webpack:///./src/default/externalFiles/externalFileExtension.ts","webpack:///./src/default/externalFiles/fileSourceGrouping.ts","webpack:///./src/default/externalFiles/externalFileCreationToken.ts","webpack:///./src/default/externalFiles/externalFileSource.ts","webpack:///./src/default/externalFiles/externalFilesFileControlExtension.ts","webpack:///./src/default/externalFiles/registrator.ts","webpack:///./src/default/files/clientKrPermissionsGetFileContentExtension.ts","webpack:///./src/default/files/clientKrPermissionsGetFileVersionsExtension.ts","webpack:///./src/default/files/wfCardFileExtension.ts","webpack:///./src/default/files/cycleFilesMode.ts","webpack:///./src/default/files/cycleGrouping.ts","webpack:///./src/default/files/cycleGroupingUIHelper.ts","webpack:///./src/default/files/krAddCycleGroupingFileControlExtension.ts","webpack:///./src/default/files/krCurrentCycleFileControlExtension.ts","webpack:///./src/default/files/clientFileTemplatePermissionsGetFileContentExtension.ts","webpack:///./src/default/files/registrator.ts","webpack:///./src/default/workflow/krProcess/krUIHelper.ts","webpack:///./src/default/forums/hideForumTabUIExtension.ts","webpack:///./src/default/forums/topicsUIExtension.ts","webpack:///./src/default/forums/openTopicOnDoubleClickExtension.ts","webpack:///./src/default/workflow/wf/wfUiHelper.ts","webpack:///./src/default/forums/krSettingsForumsSettingsUIExtension.ts","webpack:///./src/default/forums/openForumContextMenuViewExtension.ts","webpack:///./src/default/forums/registrator.ts","webpack:///./src/default/workflow/krProcess/krGlobalTileContainer.ts","webpack:///./src/default/workflow/krProcess/krGlobalTileCommand.ts","webpack:///./src/default/workflow/krProcess/krLocalTileCommand.ts","webpack:///./src/default/workflow/krProcess/krTileInflater.ts","webpack:///./src/default/tiles/krTilesExtension.ts","webpack:///./src/default/tiles/krEditModeTileExtension.ts","webpack:///./src/default/tiles/krShowHiddenStagesTileExtension.ts","webpack:///./src/default/tiles/acquaintanceTileExtension.ts","webpack:///./src/default/tiles/stageSourceBuildTileExtension.ts","webpack:///./src/default/tiles/krTypesAndCreateBasedOnTileExtension.ts","webpack:///./src/default/tiles/extendedDefaultTypeGroupCaptionsTileExtension.ts","webpack:///./src/default/tiles/testProcessTileExtension.ts","webpack:///./src/default/tiles/createMultipleTemplateTileExtension.ts","webpack:///./src/default/tiles/krSettingsTileExtension.ts","webpack:///./src/default/tiles/defaultViewAliases.ts","webpack:///./src/default/tiles/prohibitTilesInViewsTileExtension.ts","webpack:///./src/default/tiles/krDocStateTileExtension.ts","webpack:///./src/default/tiles/docLoadPrintBarcodeTileExtension.ts","webpack:///./src/default/tiles/krPermissionsTileExtension.ts","webpack:///./src/default/tiles/registrator.ts","webpack:///./src/default/ui/krProcess/krUIExtension.ts","webpack:///./src/default/ui/krProcess/stageGroup.ts","webpack:///./src/default/ui/krProcess/stageType.ts","webpack:///./src/default/ui/krProcess/stageSelectorViewModel.ts","webpack:///./src/default/ui/krProcess/stageSelectorDialog.tsx","webpack:///./src/default/workflow/krCompilers/infoAboutChanges.ts","webpack:///./src/default/ui/breadthFirstControlVisitor.ts","webpack:///./src/default/ui/tabContentIndicator.ts","webpack:///./src/default/ui/controlContentIndicator.ts","webpack:///./src/default/ui/blockContentIndicator.ts","webpack:///./src/default/ui/krProcess/krStageUIExtension.ts","webpack:///./src/default/ui/krProcess/krStageTemplateUIExtension.ts","webpack:///./src/default/ui/krProcess/krStageSourceUIExtension.ts","webpack:///./src/default/ui/krProcess/krRecalcStagesUIExtension.ts","webpack:///./src/default/ui/krProcess/krHideCardTypeSettingsUIExtension.ts","webpack:///./src/default/ui/krProcess/krHideApprovalTabOrDocStateBlockUIExtension.ts","webpack:///./src/default/ui/krProcess/krHideApprovalStagePermissionsDisclaimer.ts","webpack:///./src/default/ui/krProcess/krDocumentWorkspaceInfoUIExtension.ts","webpack:///./src/default/ui/krProcess/krCommentRequestUIExtension.ts","webpack:///./src/default/ui/krProcess/krTilesUIExtension.ts","webpack:///./src/default/ui/krProcess/krAdditionalApprovalCardUIExtension.ts","webpack:///./src/default/ui/krProcess/krTemplateUIExtension.ts","webpack:///./src/default/ui/krProcess/krSecondaryProcessUIExtension.ts","webpack:///./src/default/ui/krProcess/krEditModeToolbarUIExtension.ts","webpack:///./src/default/ui/krProcess/stageHandlers/addFromTemplateUIHandler.ts","webpack:///./src/default/ui/krProcess/stageHandlers/approvalUIHandler.ts","webpack:///./src/default/ui/krProcess/stageHandlers/createCardUIHandler.ts","webpack:///./src/default/ui/krProcess/stageHandlers/dialogUIHandler.ts","webpack:///./src/default/ui/krProcess/stageHandlers/krUniversalTaskStageTypeUIHandler.ts","webpack:///./src/default/ui/krProcess/stageHandlers/processManagementUIHandler.ts","webpack:///./src/default/ui/krProcess/stageHandlers/resolutionStageUIHandler.ts","webpack:///./src/default/ui/krProcess/stageHandlers/signingUIHandler.ts","webpack:///./src/default/ui/krProcess/stageHandlers/tabCaptionUIHandler.ts","webpack:///./src/default/ui/krProcess/stageHandlers/testStageTypeUIHandler.ts","webpack:///./src/default/ui/krProcess/stageHandlers/typedTaskUIHandler.ts","webpack:///./src/default/ui/krProcess/registrator.ts","webpack:///./src/default/ui/calendarUIExtension.ts","webpack:///./src/default/ui/outgoingPartnerUIExtension.ts","webpack:///./src/default/ui/carUIExtension.ts","webpack:///./src/default/ui/krDocStateUIExtension.ts","webpack:///./src/default/ui/createAndSelectToolbarUIExtension.ts","webpack:///./src/default/ui/krVirtualFilesUIExtension.ts","webpack:///./src/default/ui/krPermissionsUIExtension.ts","webpack:///./src/default/ui/krExtendedPermissionsUIExtension.ts","webpack:///./src/default/ui/workflowEngine/krRoutesInWorkflowEngineUIExtension.ts","webpack:///./src/default/ui/krGetCycleFileInfoUIExtension.ts","webpack:///./src/default/ui/registrator.ts","webpack:///./src/default/views/createCardExtension.tsx","webpack:///./src/default/views/customFolderViewExtension.tsx","webpack:///./src/default/views/treeViewItemTestExtension.ts","webpack:///./src/default/views/viewsContextMenuExtension.ts","webpack:///./src/default/views/registrator.ts","webpack:///./src/default/workflow/krPermissions/krDontSkipEditModeGetExtension.ts","webpack:///./src/default/workflow/krPermissions/krKeepReadCardPermissionGetExtension.ts","webpack:///./src/default/workflow/krPermissions/krKeepReadCardPermissionStoreExtension.ts","webpack:///./src/default/workflow/krPermissions/registrator.ts","webpack:///./src/default/workflow/krProcess/initialization/globalButtonsInitalizationExtension.ts","webpack:///./src/default/workflow/krProcess/requests/krCardStoreExtension.ts","webpack:///./src/default/workflow/krProcess/requests/krClientCommandCustomExtension.ts","webpack:///./src/default/workflow/krProcess/requests/krClientCommandStoreExtension.ts","webpack:///./src/default/workflow/krProcess/commandInterpreter/createCardViaDocTypeCommandHandler.ts","webpack:///./src/default/workflow/krProcess/commandInterpreter/createCardViaTemplateCommandHandler.ts","webpack:///./src/default/workflow/krProcess/commandInterpreter/openCardClientCommandHandler.ts","webpack:///./src/default/workflow/krProcess/commandInterpreter/showConfirmationDialogClientCommandHandler.ts","webpack:///./src/default/workflow/krProcess/commandInterpreter/advancedDialogCommandHandler.ts","webpack:///./src/default/workflow/krProcess/commandInterpreter/registrator.ts","webpack:///./src/default/workflow/krProcess/commandInterpreter/krAdvancedDialogCommandHandler.ts","webpack:///./src/default/workflow/workflowEngine/weAdvancedDialogCommandHandler.ts","webpack:///./src/default/workflow/krProcess/formatters/addFileFromTemplateStageTypeFormatter.ts","webpack:///./src/default/workflow/krProcess/formatters/dialogsStageTypeFormatter.ts","webpack:///./src/default/workflow/krProcess/formatters/krApprovalStageTypeFormatter.ts","webpack:///./src/default/workflow/krProcess/formatters/krChangeStateStageTypeFormatter.ts","webpack:///./src/default/workflow/krProcess/formatters/krCreateCardStageTypeFormatter.ts","webpack:///./src/default/workflow/krProcess/formatters/krEditStageTypeFormatter.ts","webpack:///./src/default/workflow/krProcess/formatters/krProcessManagementStageTypeFormatter.ts","webpack:///./src/default/workflow/krProcess/formatters/krResolutionStageTypeFormatter.ts","webpack:///./src/default/workflow/krProcess/formatters/krSigningStageTypeFormatter.ts","webpack:///./src/default/workflow/krProcess/formatters/notificationStageTypeFormatter.ts","webpack:///./src/default/workflow/krProcess/formatters/registrationStageTypeFormatter.ts","webpack:///./src/default/workflow/krProcess/formatters/typedTaskStageTypeFormatter.ts","webpack:///./src/default/workflow/krProcess/formatters/universalTaskStageTypeFormatter.ts","webpack:///./src/default/workflow/krProcess/registrator.ts","webpack:///./src/default/workflow/wf/wfResolutionTaskInfo.ts","webpack:///./src/default/workflow/wf/wfCardUIExtension.ts","webpack:///./src/default/workflow/wf/wfTasksClientGetExtension.ts","webpack:///./src/default/workflow/wf/wfTaskSatelliteUIExtension.ts","webpack:///./src/default/workflow/wf/wfTypeSettingsUIExtension.ts","webpack:///./src/default/workflow/wf/wfTileExtension.ts","webpack:///./src/default/workflow/wf/wfTaskSatelliteClientGetFileContentExtension.ts","webpack:///./src/default/workflow/wf/registrator.ts","webpack:///./src/default/workplaces/manager/imageCache.ts","webpack:///./src/default/workplaces/manager/managerWorkplaceTile.tsx","webpack:///./src/default/workplaces/manager/managerWorkplace.tsx","webpack:///./src/default/workplaces/manager/managerWorkplaceSettings.ts","webpack:///./src/default/workplaces/manager/managerWorkplaceExtension.ts","webpack:///./src/default/workplaces/refSectionExtension.ts","webpack:///./src/default/workplaces/automaticNodeRefreshExtension.ts","webpack:///./src/default/workplaces/registrator.ts"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","tessa","platform","ui","extensions","workflow","cards","validation","krProcess","localization","tiles","controls","mobx","forums","views","service","metadata","React","uiHost","types","clientCommandInterpreter","tasks","forms","files","common","utility","mobxReact","storage","content","styledComponents","workplaces","tree","components","cardElements","scheme","blocks","conditions","operations","b","e","XMLHttpRequest","open","responseType","onload","a","response","onerror","console","error","send","status","dispatchEvent","MouseEvent","document","createEvent","initMouseEvent","window","f","self","global","saveAs","HTMLAnchorElement","g","h","URL","webkitURL","j","createElement","download","rel","href","origin","location","target","createObjectURL","setTimeout","revokeObjectURL","navigator","msSaveOrOpenBlob","autoBom","warn","test","type","Blob","title","body","innerText","HTMLElement","safari","userAgent","FileReader","onloadend","result","replace","readAsDataURL","k","Moment","classnames","this","Function","instance","registerBundle","buildTime","context","requestIsSuccessful","token","tryGet","info","uiContext","current","editor","model","cardEditor","cardModel","request","cardVersion","card","version","setInfo","inSelectionMode","doubleClickAction","async","cardId","displayValue","show","openCard","cardTypeId","Int32","splashResolve","id","cardType","stateId","tryGetInfo","requestType","viewContext","view","alias","instanceIdListCount","instanceType","requestInfo","idList","length","Card","push","Guid","rules","failRules","map","x","sectionId","columnIds","y","validateFromRules","requestTasks","taskItems","mainForm","task","taskItem","action","Complete","find","taskModel","cardTask","rowId","controlViewModel","controlsBag","sourceInfo","cardTypeControl","getSourceInfo","some","z","validationFunc","hasEmptyValue","format","caption","notifyUpdateValidation","registerExtension","extension","stage","AfterPlatform","singleton","compareVersions","v1","v2","n1","validateAndParse","n2","p1","pop","p2","compareSegments","split","compare","operator","assertValidOperator","res","operatorResMap","includes","validate","v","semver","sastisfies","match","op","v3","r1","r2","r3","compareStrings","TypeError","Error","shift","isWildcard","tryParse","parseInt","isNaN","ap","bp","String","forceType","Math","max","allowedOperators","keys","indexOf","join","LOCK_DESKI_FIND","_masterKeys","_instance","commonMetadata","deskiInfo","enabled","port","deskiPort","delayTimeout","log","maxIterations","shifts","str","arr","charCodeAt","stringToArray","timeout","fetchWithTimeout","fetch","text","resp","JSON","parse","ShortName","VerMajor","VerMinor","getDeskiUrl","err","silent","findDeski","setCommonMetadataDeskiMeta","localize","Boolean","sessionStorage","getItem","deskiVersionFromServer","setItem","cipher","validationResult","isSuccessful","build","cipherObject","fromText","Info","LocalExpiryDates","LocalPrivateKeys","Key","ExpiresAt","empty","opt","defaultOpt","appUrl","deskiUrl","searchParams","append","options","getRequestOptions","method","stringify","BaseUrl","KnownKeys","headers","Headers","ok","getJSONOrMessageFromResponse","success","message","fromError","isCached","editable","data","blob","newId","sync","req","ms","promise","Promise","resolve","reject","didTimeOut","then","clearTimeout","catch","contentType","json","statusText","InfoKey","BASE_PATH","__BASE_PATH__","APP_URL","_context","deskiEnabled","isMobile","checkDeski","updateMasterKeys","delete","_lastMasterKeysUpdate","Date","now","setInterval","file","editCollapsed","permissions","canEdit","previewIndex","actions","findIndex","canRead","versionAdded","splice","openFile","lastVersion","revertMenu","closureAction","wasModified","isDirty","isLoading","removeFile","deskiAvailable","fileControls","filter","control","fileDoubleClickAction","fileContainer","editedFiles","savingResult","fileInfo","fileInfoResult","getFileInfo","add","IsLocked","Name","IsModified","fileDataResult","getFileData","ID","File","cacheResult","cacheModFileWithNewId","items","clearEditedFiles","fileVM","setAppInfo","masterKeys","contentInfo","getContentInfo","isVirtualFile","source","getContent","cacheContent","addEventListener","size","values","fileType","isVirtual","block","autoComplete","controlVisibility","Collapsed","cadesplugin","async_spawn","args","oStore","CreateObjectAsync","Open","CAPICOM_CURRENT_USER_STORE","CAPICOM_MY_STORE","CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED","CertificatesObj","Certificates","Count","certs","cert","Item","subjectName","SubjectName","issuerName","IssuerName","validFrom","ValidFromDate","validTo","ValidToDate","serialNumber","SerialNumber","certificateStr","Export","CADESCOM_ENCODE_BASE64","getName","company","getParameter","Close","getLastError","certificate","fileBase64Str","encryptAndDigestList","oCertificates","Find","CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME","oCertificate","publicKey","PublicKey","keyAlgo","Algorithm","publicOid","Value","hashAlgoOid","getHashByPublicOid","hashAlgo","getHashAlgoByOid","oHashedData","propset_Algorithm","propset_DataEncoding","CADESCOM_BASE64_TO_BINARY","Hash","oRawSignature","sRawSignature","SignHash","sSignedMessage","buffer","binary","bytes","Uint8Array","len","byteLength","fromCharCode","btoa","arrayBufferToBase64","toByteArray","reverse","signature","signatureAttributes","getAttributesFromSignature","hashOid","toHexString","atob","toUpperCase","sRawFileHash","hash","valid","Import","oSignAttrsHashedData","signedAttributes","VerifyHash","oSignedData","propset_ContentEncoding","propset_Content","VerifyCades","CADESCOM_CADES_BES","marker","strArr","snIndex","pair","encryptOid","digestOid","CADESCOM_HASH_ALGORITHM_CP_GOST_3411","CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256","CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256_HMAC","CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512","CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512_HMAC","CADESCOM_HASH_ALGORITHM_CP_GOST_3411_HMAC","CADESCOM_HASH_ALGORITHM_MD2","CADESCOM_HASH_ALGORITHM_MD4","CADESCOM_HASH_ALGORITHM_MD5","CADESCOM_HASH_ALGORITHM_SHA_256","CADESCOM_HASH_ALGORITHM_SHA_384","CADESCOM_HASH_ALGORITHM_SHA_512","CADESCOM_HASH_ALGORITHM_SHA1","hexString","substr","byteArray","Array","byte","toString","slice","register","row","sections","rows","state","Deleted","typeName","tableControl","rowInitializing","rowModel","DigestControl","isReadOnly","getField","fieldChanged","event","fieldName","set","fieldValue","BeforePlatform","category","isLocal","description","super","copyLinkAction","isCollapsed","cardSourceGroupName","externalSourceGroupName","groupId","groupCaption","order","newGuid","clone","fileOrFileVersion","_info","builder","getContentCore","inSpecialMode","isContainsExternalFiles","groupings","selectedGrouping","removeFiles","filesNamesContents","addFile","executeInContext","executor","fileSource","fileToken","getFileCreationToken","createFile","addVersion","versionsAreComprehensive","num","versionToken","getVersionCreationToken","number","Success","createFileVersion","versions","versionRowId","canCopyToMainCard","index","downloadIndex","createCopyInMainCard","operationFiles","copiedFileList","totalResult","contentResult","ensureContentLoaded","copy","copiedFile","canModifyCategory","newFile","CycleFilesMode","cycleNumber","cycleOrder","maxCyclewNumber","undefined","attach","captionDelegate","getCaption","detach","restore","viewModel","collection","equals","cycle","createdByName","created","modifyFileList","currentMode","historySection","currentCycle","ShowAllCycleFiles","returnAllFiles","ShowCurrentCycleFilesOnly","ShowCurrentAndLastCycleFilesOnly","controlsModes","containerFile","every","_dispose","Routes","cycleGrouping","tryGetSections","commonInfo","fields","approvalHistory","tryGetRows","containerFileAdded","addWithDispose","grouping","switchFilesVisibility","restoreFilesList","currentCycleMode","modeFromContext","groupingModeFromInfo","cardModelInfo","settings","docCardTypeId","dciSection","typeId","settingsRowId","dispose","has","historyRows","groupingsItem","CompiledCardTypes","sendCompileRequest","compileFlag","hasChanges","saveCard","tryGetKrType","krTypesCache","krCardType","cardTypes","useDocTypes","section","tryGetField","docTypes","$value","designTimeCard","runtimeCard","usedComponents","krType","UseForum","useForum","useDefaultDiscussionTab","forumTab","visibility","Hidden","restoreSelectedTab","addTopicShowDialog","permissionsProvider","isEnableAddTopic","modifyAddingTopic","superModeratorPermissionsMessage","isEnableSuperModeratorMode","allForumControls","forumControl","isLicenseValid","isEnabledAddTopic","isEnabledForumEmptyContextMenu","openParticipantsAction","getOpenParticipantsAction","checkAddTopicPermissionAction","getCheckAddTopicPermissionsAction","checkSuperModeratorPermissionAction","getCheckSuperModeratorPermissionAction","topicId","TopicIDKey","topicTypeId","TopicTypeIDKey","showTopic","selectedTab","form","showTopics","_control","participantType","isSuperModerator","paramTopicMeta","paramTopicId","withMetadata","addCriteria","asRequestParameter","paramCardMeta","paramCardId","paramParticipantMeta","paramParticipantType","paramIsSuperModeratorMeta","paramIsSuperModerator","paramCardTypeIdMeta","paramCardTypeId","TopicTabTypeID","paramParticipantsTabNameMeta","paramParticipantsTabName","AddParticipantsTabName","paramRolesTabNameMeta","paramRolesTabName","AddRolesTabName","viewAlias","parameters","treeVisible","openMarkedCard","cardIsNew","mark","proceedConfirmation","proceedAndSaveCardConfirmation","continuationOnSuccessFunc","getInfo","operationInProgress","storeMode","Insert","saveCardBeforeOpening","remove","KeepPreviousCard","cardTypeName","isUpdatedServer","contextInstance","selectedRow","cardModifierAction","openingContext","suffix","isVisible","controlName","toLocaleLowerCase","endsWith","Visible","_disposers","KrSettingsTypeID","cardTypesSection","cardTypesControl","rowInvoked","Inserted","Opening","forumsBlock","useForumFirst","UseForumField","setControlVisibility","UseForumSuffix","UseDefaultDiscussionTabField","closed","cardTypeRow","attachHandlersToCardTypeRow","_cardRowsListener","rowInserted","_s","start","KrDocTypeTypeID","docTypeSection","useForumBlock","stop","permissionProvider","contextMenuGenerators","getParticipantsMenuAction","_model","refSection","selectedRows","menuActions","_e","uiContextExecutor","_ctx","changeParticipantsCommand","removeParticipantsCommand","hasModeratorPermissions","concatUsersName","roleName","currentUserId","UserID","item","newItem","getContextParameterValue","participantsTabName","rolesTabName","ParticipantFromRole","processingChangeRole","getCardId","hasSuperModeratorPermissions","changeParticipantsShowDialog","participants","roleId","forumResponse","updateRoles","readOnly","subscribed","updateParticipants","canRefreshView","refreshView","removeParticipants","processingRemoveRole","removeRoles","checkHasPermissionIsSuperModerator","changeRoleParticipantsShowDialog","Participant","criteriaValues","criteriaName","IsTrue","tryGetSelectedItemsFromViewContext","forumItem","roleType","Platform","KrGlobalTileContainer","infos","_infos","_tile","tileInfo","askConfirmation","confirmationMessage","process","createWithParams","processId","raiseErrorWhenExecutionIsForbidden","setOperationInProgress","RefreshOnSuccess","processInfo","contextSource","tileInfos","groups","inflateTile","icon","tileCollection","nestedTiles","nestedOrder","nestedTileInfo","grouptile","group","NoGroup","sharedInfo","createInfo","toolTip","tooltip","actionGrouping","evaluating","tileGroupingEvaluation","tile","command","onClickAction","isGlobal","TileInfo","setIsEnabledWithCollapsing","currentTile","getTileInfos","panel","workspace","rightPanel","inflate","Workflow","leftPanel","openForEditing","Cards","hotkeyStorage","krEnterEditMode","tryGetTile","addTileHotkey","alt","cardOthers","openWithHiddenButtons","ctrl","enableOnCardUpdateAndNotTaskCard","showAcquaintanceWindow","openAcquaintanceHistoryView","acquaintanceGroup","typeSupportsWorkflow","canUseResolutions","Update","mainCardModel","notEnoughPermissions","openRolesDialog","parameterMetadata","hidden","dataType","multiple","Resolutions","flags","AllowTasks","krToken","hasPermission","defaultRolesRequest","defaultRolesResponse","defaultRolesResult","dialogsType","cardMetadata","getCardTypeByName","dialogForm","new","windowCardModel","sectionRows","defaultRoles","defaultRolesDictionary","idsList","namesList","rolesRows","role","roleRow","None","Warning","comment","sendAcquaintanceRequest","sendAcquaintanceResponse","btn","close","unavailableTypes","initializeKrTilesGlobal","initializeKrCreateBasedOnTiles","createBasedOnTypes","createCard","typesCache","tileIndicesToRemove","groupIndicesToRemove","sort","sortByLocalized","groupIndex","groupTile","countTypes","tilesInGroup","hasVisibleTypeTile","typeTile","DocTypes","addDocTypeTiles","hasDocTypes","groupTiles","orderedTiles","Number","MAX_SAFE_INTEGER","cache","metdata","forGroup","checkKrTypesOnly","hasGroup","groupName","Base","parentTiles","docTypesForCardType","docTypeId","docTypeName","docTypeCaption","docTypeTile","docTypeID","docTypeTitle","localeCompare","createBasedOnTile","enableIfHasDocumentCommonInfoAndNotCreating","createBasedOnTileWithFiles","createBasedOnTilesAndGroup","createBasedOnTilesWithoutGrouping","copyFiles","createBasedOnTileCollection","getCardTypeGroupLocalizedCaption","Map","orderedGroups","forEach","_","groupingTileOrder","groupingTile","groupingTileCollection","tileOrderRef","metadataCardType","getCardTypeById","enableIfNotInSpecialModeAndNotCreating","hasAvailableDocTypes","innerOrderRef","docType","basedOnDocType","createBasedOnDocTypeTile","basedOnCardType","createBasedOnCardTypeTile","orderRef","createBasedOnTileAction","initializeRequestAction","saveBeforeCreatingCard","dialogResult","baseCard","baseCardToken","tokenStorage","creationModeDisplayText","setTypeGroupCaption","captions","startTestProcessAction","enableOnTestTypesAndNoProcesses","sendTestSignalAction","enableOnTestTypesAndHasProcesses","queue","getStorage","addSignal","processTypeName","isAdmin","cardInTemplateType","cardTools","typeIsAllowedForMultipleCreation","createMultipleCardsAction","Singleton","documentCommonInfo","schemeItems","hasAuthor","columnIdList","hasPartner","modelInEditor","dialogType","mainFields","getTypeInfoForMultipleCreation","changePartnerControl","changeAuthorControl","buttonAction","cardCount","changePartner","changeAuthor","templateCard","tuple","tryCreateMultipleCardsAsync","isEnabled","successCount","elapsed","partnerIterator","partners","tryLoadDirectory","DirectoryIterator","userIterator","users","systemIndex","totalStart","getTime","getExportedCardFromTemplateCard","newResponse","createFromTemplate","tryGetCard","cancelOpening","partner","getNext","author","init","storeRequest","store","total","utc","finalMessage","entryPrefix","getByName","viewRequest","calculateRowCounting","viewCurrentUserParameters","viewPagingParameters","currentPage","pageLimit","exportDataPageLimit","provideCurrentUserIdParameter","providePageLimitParameter","Always","entryIdIndex","entryNameIndex","providePageOffsetParameter","viewResult","getData","columns","rowValue","dataTypes","entry","DirectoryEntry","entries","generateAction","enableOnSettingsCardAndAdministrator","generateButtonAction","clearChanges","closeAction","userCount","partnerCount","viewsWithoutDelete","Set","viewsWithoutExport","viewsWithoutViewStorage","others","deleteTile","deleteEvaluating","exportTile","exportEvaluating","exportAllTile","viewStorageTile","viewCardStorageEvaluating","canProcessViewFunc","from","references","openOnDoubleClick","isCard","setEnabledWithCollapsingInViewContext","canDeleteCardFromViewDefault","canExportCardFromViewDefault","canViewCardStorageFromViewDefault","viewsOther","deleteCardFromView","Views","deleteKrDocStateFromViewAsync","deleteKrDocStateFromViewEvaluating","deleteKrDocStateFromView","withoutBackupOnly","operation","_item","startAsync","selectPrinterAndPrintAsync","evaluatingPrintBarcode","settingsCard","tableName","barcodeBytes","downloadBarcode","imageUrl","showHeader","offsetWidth","offsetHeight","printImage","digest","fileId","fileName","fileTypeName","getFileContent","hasContent","imagePath","width","innerWidth","height","innerHeight","header","launcherIcon64","printWindow","write","focus","krPermissionsTileEvaluating","tileAction","Initialize","_commentIsHiddenForApproval","commentIsHiddenForApproval","krSettings","modifyUniversalTaskAction","taskWorkspace","actionsInitialCount","additionalActionsInitialCount","additionalActions","getOrAdd","Table","tableType","Collection","optionId","showComment","generateTaskAction","taskNavigator","targetMetadata","postponeMetadata","targetType","targetForm","targetBlocks","sourceType","sourceForm","formSettings","krCommentsInfoVirtual","getSectionByName","sourceItem","krAdditionalApprovalInfoVirtual","metadataSection","sourceSection","targetSection","setFrom","formWithTasks","taskViewModel","modifyTaskAndAttachHandlers","modifyUniversalTask","modifyDialogTask","isLockedEffective","commentBlock","blockVisibility","additionalApprovalBlock","additionalApprovalsRequestedInfoTable","workspaceChanged","innerCommentBlock","innerAdditionalApprovalBlock","approvalCommentBlock","postponeMetadataInitializing","postponeContentInitializing","isPerformer","modifyWorkspace","co","completionOption","taskButtonCaption","storedState","InProgress","navigateToForm","OptionForm","ExtendedTaskForm","blockViewModel","label","NavigateToForm","Default","StageGroup","StageType","defaultStage","StageSelectorViewModel","selectedGroupIndex","selectedTypeIndex","_typesCache","_types","getGroupTypesFunc","setSelectedTypeIndex","selectedGroup","getStageTypesFunc","ref","bound","StageDialog","props","theme","cardSelectorBackground","getGroupsHeader","getGroupsRows","cells","getIsSelected","getIsLastSelected","setSelected","setSelectedGroupIndex","updateType","getTypesHeader","getTypesRows","handleCloseForm","onClose","cancel","handleCloseFormWithResult","selectedType","groupsGridVM","canSelectMultipleItems","typesGridVM","isOpened","noPortal","isAutoSize","onCloseRequest","className","wideVisibleSize","isShowNoDataText","onClick","InfoAboutChanges","enqueueBlock","enqueueForm","visitInternal","rootControl","enqueueTabs","visitControl","visitBlock","tabControl","tab","tabs","fieldsStorage","fieldIds","updateBlockHeader","_blockViewModel","_originalTabNames","_tabs","_fieldTabMapping","fieldChangedAction","_hasContent","updateTabName","_originalBlockName","_fieldsStorage","visitor","tabCaption","visitByForm","tmpMapping","reduce","rv","_tabFieldsMapping","tabOrder","field","fieldTabMapping","_fieldIds","colId","physicalColumnIdList","_block","fieldSectionMapping","fieldIDs","_fieldSectionMapping","_fieldIDs","_index","colID","cardFieldContainer","parentBlockViewModel","indicatorFormat","fieldChangeAcion","_fieldControlsMapping","updateIndex","updateParentBlockCaption","_disposedValue","_cardFieldContainer","_controls","_indicatorFormat","_parentBlock","_originalParentBlockName","fieldControlsMapping","controlsCount","_originalControlNames","getDisplayName","_controlFieldsMapping","_hasContentControls","fill","update","checkContent","updateControlName","setDisplayName","getNewName","originalName","visitByBlock","addStageDialog","krStageTemplates","krSecondaryProcesses","groupVm","stageGroupsView","cardIdParam","typeIdParam","groupType","stageTypesView","isTemplateParam","param","typeIdMetadata","typeRows","typeIdSet","templateTypeId","typeIdBuilder","refresh","groupOrder","rowIndex","getId","getOrder","nestedStage","cnt","firstIndexInGroup","position","sortedRows","posId","orderChanged","showSettingsBlock","commonBlock","setOptionalControlVisibility","performersBlock","singleVisibility","multipleVisibility","sqlPerformersLinkBlock","setControlCaption","authorBlock","taskKindBlock","taskHistoryBlock","captionVisibility","settingsBlock","controlSettings","stageHandlerID","setVisibilityViaTags","bindTimeFieldsRadio","onTimeFieldChanged","unbindTimeFieldsRadio","currentRow","bindUIHandlers","getExecutionContext","_krStageTypeUIHandlerExecutor","executeAsync","validateViaHandlers","execute","validateTimeLimit","stageTypeId","timeLimit","planned","list","checkField","inputAlias","checkTimeLimit","checkPlanned","validatePerformers","Single","Multiple","perfSec","unbindUIHandlers","handleFormatRow","formatRow","activateStagesHandler","selectedRowStages","selectedRowStage","hasEnableActivateStageButton","setTabIndication","setBlockIndication","approvalStagesTable","leftButtons","ctx","rowAdding","rowEditorClosing","rowValidating","rowEditorClosed","stagesSec","func","Deleting","resolveExecutor","sectionName","sectionMeta","indicator","templateSec","column","controlAlias","inputControl","isArray","isRequired","setControlSettings","_rowModel","setBlockControlsSettings","formViewModel","tags","hasRuntime","hasDesign","hasRuntimeReadonly","hasDesignReadonly","tag","blockSettings","cardTypeBlock","withChanges","extensionExecutor","session","displayTimeLimit","displayParticipants","displaySettings","rawSet","grid","approversControlDisposer","hyperlink","hasComputedRole","approversControl","approversControlChanged","multiplePerformerControl","hasSqlQuery","isChanged","stageRowId","sectionAlias","hasComputedRoleInRow","compileControl","compileAllControl","Disabled","hasStagePositions","newCard","ChangesListToValidationResult","ChangesInHiddenStages","atLeastOne","stagePositions","_disposes","_gridDisposes","gridRowInvoked","_typeSettingBlock","collapseIfUncheckedInRow","_useRegistrationBlock","_useRegistrationControl","_useRegistrationField","_registrationSettingsBlock","_useApprovingBlock","_useApprovingControl","_useApprovingField","_autoApprovalSettingsBlock1","_useAutoApprovingField","_autoApprovalSettingsBlock2","_useAutoApprovingControl","collapseIfDocTypesUnused","gridRowEditorClosed","useControl","_useDocTypesControl","collapseSettingsIfDocTypesInUse","isChecked","_useDocTypesField","inUse","useBlockName","useControlName","useFieldNames","settingsBlockName","q","collapseIfUnchecked","useControlNames","useControls","cardTypesBlock","_typesBlock","_typesControl","hideRouteTab","approvalProcessTab","Registration","resolver","getRowPermissions","ProhibitModify","isParallelControl","approvalTab","EditTemplate","ViewExported","cardModelInitialized","onCardModelInitialized","workspaceInfo","Performer","commentControl","tilesPanel","tilesStorage","localTiles","names","getOwnPropertyNames","removeTilesWithTileInfo","actionGroupingTiles","removeIndices","approvalStagesTable_RowInvoked","_lastSelectedItem","approvalBlock","hasSelectionAction","approversVirtualSection","_card","infoUsersVirtualSection","additionalApprovalUsersVirtualSection","markName","_handleManager","HandleManager","transferData","selectedItem","unmarkName","valueDeleted","clear","unhandleAllAdditioanlApproverItemRows","unhandleFirstIsResponsible","handleAdditionalApproversListItemChanged","mainApproverRow","added","removed","changedItem","handleAdditioanlApproverItemRow","newState","Modified","unhandleAdditioanlApproverItemRow","isCardAvailableForExtension","mainRow","infoUsersVirtualSectionOrdredRows","oldResponsibleRow","notDeletedRowsMinOrderValue","min","deletedRows","deletedRow","setChanged","startsWith","substring","formCloseAction","mainForm_Closed","unhandleAdditionalApproversListItemChanged","additionalApproverHandlers","handler","additionalApproversListRows","additionalApproversListRowsHandler","collectionChanged","stateChanged","firstIsResponsibleRow","firstIsResponsibleRowHandler","routesForm","cardIsAvailableForExtension","_pureProcess","_button","_action","getCurrentMode","updateVisibility","updateCheckRestrictions","updateVisibiltyForPureProcessMode","getVisibility","allowedMode","allowedMode2","sec","allowClientSideLaunch","checkRecalcRestrictions","visibilityForRestrictionFields","removeRows","modeId","dialogName","tileIsVisible","toolbar","addItemIfNotExists","modifiers","removeItemIfExists","tileName","_templateId","onSettingsFieldChanged","notReturnEditConfigureFields","advisory","advisoryConfigureFields","_settings","kindId","kindCaption","getKind","_returnIfNotApprovedFlagControl","flagsBlock","flagsTabs","tabViewModel","innerFlagsBlock","_returnAfterApprovalFlagControl","taskKindsView","idParam","isAdvisory","isNotReturnEdit","_templateCaption","_typeId","_typeCaption","_modeId","template","_cardStoreModeId","_openModeId","_dialogTypeId","buttonSettings_RowClosing","rowClosing","modeChanged","fieldTypedValue","_stageControl","_groupControl","_signalControl","_krResolutionSettingsVirtual","_krPerformersVirtual","_controllerIdStr","_controllerNameStr","_plannedStr","_durationInDaysStr","_withControlStr","_massCreationStr","_majorPerformerStr","_performersStr","_controller","onPerformerStateChanged","performersChanged","oldState","onPerformersChanged","performer","_subscribedTo","_performers","alivePerformer","enableMassCreation","_massCreation","_majorPerformer","NotReturnEdit","returnIfNotSignedFlagControl","returnAfterSigningFlagControl","_indicator","attachCommandToButton","validateCalendarButtonAction","rebuildCalendarButtonAction","buttonAlias","button","getCardPermissions","AllowModify","operationId","CalendarRebuild","isActive","isAlive","driverControl","openRefAction","reference","getRefInfo","preview1","preview2","fileControlManager","pageChanged","setPageNumber","page","getRequest","currentOperationType","SaveAndRefresh","saveCardAndSelectCommand","tryGetParentSelectionViewContext","saveAndCloseItem","curr","parent","rowStateChanged","compile","storeInfo","initialize","virtualSection","initializeConditions","initializeFlags","initializeExtendedPermissions","permissionsSection","flagsByName","includedPermissions","sqlName","flag","includedFlag","tryUpdateFlag","isExtendedOnUpdating","enableExtendedSettings","clearExtendedSettings","disableExtendedSettings","extendControls","cardTable","_extendedControls","extendPermissionGrid","tasksTable","mandatoryTable","extendMandatoryGrid","_sectionsSection","fieldsSection","openedRowModel","sectionRowChanged","clearSection","sectionType","accessSetting","Collections","DisallowRowAdding","DisallowRowDeleting","MaskData","typesSection","optionsSection","fieldsControl","Entries","requiredText","OnTaskCompletion","typesControl","optionsControl","validationType","_extendedSections","parentRowId","fieldRow","isReadonly","VisibilitySetting","isHidden","isPattern","tabSettings","visibilitySettings","visibilitySetting","patternList","controlType","Tab","Block","Control","fillSettings","wildStart","wildEnd","startIndex","endIndex","escapedAlias","hideSections","hideFields","showFields","mandatorySections","mandatoryFields","disallowedSections","parentGrids","disableGrids","table","parentGridSource","blocksBag","formsBag","visitForm","sectionSettings","sectionSetting","hiddenFields","visibleFields","isMandatory","isDisallowed","_visibilitySettings","checkIsHidden","hideForm","hideBlock","showBlock","hideControl","showControl","makeControlMandatory","cardTypeForm","checkName","setting","toLowerCase","extendedCardSettings","cardControlsVisitor","visitors","parentGridStack","initModel","visit","rowInitializaing","rowClosed","extendedSettings","getCardSettings","tasksSettings","getTaskSettings","getVisibilitySettings","uiVisibilitySettings","modifyTask","tvm","taskSettings","taskVisitor","modifyAction","stageBlock","hasNotRoutes","useRoutesInWorkflowEngine","cardInfo","filesByCycles","filesModifiedByCyclesStorage","maxCycleNumber","cycleId","fileModel","taskHistory","taskHistoryGroups","cloneFileSource","versionInfo","originalCardFile","versionId","versionNumber","versionSize","sourceId","versionCreated","versionCreatedById","versionCreatedByName","virtualFile","addVirtalFile","createdById","virtualCardFile","externalSource","storeSource","DateTime","CardCreationKind","CardOpeningKind","contentFactories","CreateCardExtensionSettings","settingsStorage","cardCreationKind","ByTypeFromSelection","cardOpeningKind","ApplicationTab","typeAlias","docTypeIdentifier","viewComponent","area","ToolBarPanel","Middle","ModalDialog","_toolTip","isDataLoading","ByTypeAlias","ByDocTypeIdentifier","canCreateCard","createCardActionBySelectedRow","createCardActionByTypeAlias","createCardActionByDocTypeIdentifier","colPrefix","workplace","createCardInternal","idParamMeta","hasIdParam","openToTheRightOfSelectedTab","createAndSelectId","idParameter","dinfo","selectedObject","handleClick","stopPropagation","disabled","switchExpandOnSingleClick","contentProviderFactory","CustomFolderContentProvider","CustomFolderViewModel","isExpanded","expandedIcon","style","fontSize","display","justifyContent","alignItems","createRefreshMenuAction","createFilterMenuAction","createClearFilterMenuAction","createOpenCardMenuAction","filterView","canFilterView","clearFilterView","canClearFilterView","cardRefs","separatorAddided","addedIDs","cardRef","displayValueColumn","contains","mainPartResponse","globalTiles","visitSections","stagesSection","cardSections","topLevelSecMetadata","stagesMapping","topLevelSection","topLevelRow","previousLayer","currentLayer","secMetadata","schemeItem","refSecTuple","getParentColumnSec","parentComplexColumn","parentRowIdColumn","parentId","topLevelRowId","layers","swapLayers","complex","parentRowSection","columnType","Complex","Physical","complexColumnIndex","commands","commandsStorage","interpret","templateId","templateInfo","coSettings","prepareDialogCommand","skipEditor","outerContext","dialogCardEditor","cos","buttonName","completeTask","completeDialogAsync","showGlobalDialogAsync","parentCardEditor","completeDialog","dialogCard","prepareFilesForStore","actionResult","mainCardId","pressedButtonName","keepFiles","setDialogCard","completeDialogCoreAsync","cardFile","Replaced","ModifiedAndReplaced","fileContent","preparedNewCard","preparedNewCardSignature","Binary","actionOverridings","createUIContextActionOverridings","createNewCard","uiCtx","isClosed","prepareDialog","statusBarIsVisible","clearItems","bottomToolbar","bottomDialogButtons","getButtonAction","completionDialog","actionInfo","buttons","cardButtonType","BottomToolbarButton","addItem","ToolbarButton","BottomDialogButton","completionOptionSettings","modifyCardAction","modifyEditorAction","cardNewMethod","dialogTypeId","cardModelModifierAction","cardEditorModifierAction","Template","registerHandler","ProcessInstance","coSettingsObj","CompletionOptionSettings","_cardEditor","instanceStorage","processInstance","cardResponse","dialogSettingsStorage","dialogSettings","requestSignature","getProcessRequest","responseInfo","additionalInfo","processObj","workflowEngineProcessor","processSignalAsync","refreshCard","requestFromInfo","_name","_fileTemplateName","stageRow","_kindCaption","_taskDigest","buidler","appendString","_isAdvisory","_isParallel","sb","_settingsStateName","_modeName","templateName","modeName","_changeState","_managePrimaryProcess","_stageName","_groupName","_groupRowName","_signal","managePrimaryProcess","stageName","groupRowName","signal","_authorName","_controllerName","_planned","_durationInDays","_withControl","defaultDateFormatting","_excludeDeputies","_excludeSubscribers","excludeDeputies","excludeSubscribers","getDisplaySettings","_taskTypeCaption","_digest","hasChildren","hasIncompleteChildren","resolutionSection","performersRows","performersReaction","cachedForMainInfoForm","cachedMainInfoBlock","cachedForPerformersForm","cachedPerformersBlock","massCreationWasReset","resolutionFieldChangedHandler","updateWithControl","updateShowAdditionalControls","updateMassCreation","updateIncompleteChildResolutionsControls","updateMultiplePerformersControls","unsubscribeFromResolutionSection","unsubscribeFromPerformers","mainInfoBlock","tryGetMainInfoBlock","withControl","showAdditional","massCreation","tryGetPerformersBlock","hasMultiplePerformers","WfTaskCardTypeId","MainCardCategoryId","isTaskCard","tryGetTaskHistory","stateIsInitialized","typeCaption","historyItem","navigateMainCard","toolbarAction","taskCardNavigateAction","taskFiles","isCategoriesEnabled","prevFilter","categoryFilter","categories","groupSorting","containerFileAdding","categoryIsMainCard","fileViewModel","mainFormState","setState","taskInfo","createTaskInfo","modifyResolutionTask","unsubscribe","fileCount","setTag","getState","storeResponse","lastData","responseCardId","taskCard","childrenSection","childrenRows","subscribeToTaskModel","workspaceState","Locked","LockedForAuthor","UnlockedForAuthor","Initial","DefaultForm","setLink","childResolutions","taskSections","subscribeToResolutionSectionAndUpdate","performersSection","subscribeToPerformersAndUpdate","taskRowId","permissionsCalculated","beginTaskCardNavigateAction","tryGetTasks","isLocked","setResolutionFieldChanged","fieldsChangingInClosure","hideOpenViewCommand","resolutionsBlock","useResolutionsAtFirst","useResolutions","cardTypeRows","addedRow","createWfResolutionAction","panelContext","createResolution","notificationSubscriptions","enableOnCardIsNotTaskCard","createFileTemplate","callback","cachedImage","loadImages","ensureCacheResolved","image","createCardModel","loadImage","reader","_activeImage","_hoverImage","_inactiveImage","_hover","count","selectionState","captionColumn","tileColumnName","formatValue","countColumn","countColumnName","activeImageColumnName","hoverImageColumnName","inactiveImageColumnName","images","activeImage","hoverImage","inactiveImage","unSelectAllRows","setSelection","StyledTile","div","StyledImg","img","handleMouseEnter","hover","handleMouseLeave","selectTile","src","isSelected","borderBottom","onMouseEnter","onMouseLeave","top","right","color","padding","background","textAlign","marginTop","ContentPanel","BeforeAll","_loadingGuard","_dataReaction","models","array","deep","initiailize","guard","StyledContainer","ManagerWorkplaceSettings","_metadata","TreeItemFilteringSettings","refSections","parametersEquals","Positive","Negative","contextParameters","settingsParameters","_refreshPending","_treeItem","subscribeToEvents","unsubscribeFromEvents","startTimer","stopTimer","treeItem","updateByTimer","_timer","currentNode","refreshInterval","clearInterval","skipUpdateTable","lastUpdateTime","refreshNode","hasSelection","refreshTableContent","withContentDataRefreshing","refreshContent","workplaceViewModel","rootContext","parentContext"],"mappings":"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","file":"default.10bf05614412906a660d.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 48);\n","module.exports = tessa.tessa.platform;","module.exports = tessa.tessa.ui;","module.exports = tessa.tessa.extensions;","module.exports = tessa.tessa.workflow;","module.exports = tessa.tessa.cards;","module.exports = tessa.tessa.ui.cards;","module.exports = tessa.tessa.platform.validation;","module.exports = tessa.tessa.workflow.krProcess;","module.exports = tessa.tessa.localization;","module.exports = tessa.tessa.ui.tiles;","module.exports = tessa.tessa.ui.cards.controls;","module.exports = mobx;","module.exports = tessa.tessa;","module.exports = tessa.tessa.forums;","module.exports = tessa.tessa.views;","module.exports = tessa.tessa.cards.service;","module.exports = tessa.tessa.cards.extensions;","module.exports = tessa.tessa.views.metadata;","module.exports = React;","module.exports = tessa.tessa.ui.uiHost;","module.exports = tessa.tessa.cards.types;","module.exports = tessa.tessa.workflow.krProcess.clientCommandInterpreter;","module.exports = tessa.tessa.ui.cards.tasks;","module.exports = tessa.tessa.ui.views.extensions;","module.exports = tessa.tessa.ui.cards.forms;","module.exports = tessa.tessa.files;","module.exports = tessa.common.utility;","module.exports = tessa.tessa.ui.files;","module.exports = tessa.tessa.ui.views;","module.exports = mobxReact;","module.exports = tessa.ui;","module.exports = tessa.tessa.platform.storage;","module.exports = tessa.tessa.ui.views.content;","module.exports = styledComponents;","module.exports = tessa.tessa.ui.views.workplaces.tree;","module.exports = tessa.components.cardElements;","module.exports = tessa.tessa.scheme;","module.exports = tessa.tessa.ui.cards.blocks;","module.exports = tessa.tessa.ui.conditions;","module.exports = tessa.tessa.platform.operations;","module.exports = tessa.common.platform;","module.exports = tessa.tessa.cards.workflow;","module.exports = tessa.tessa.cards.metadata;","module.exports = tessa.tessa.views.workplaces;","(function(a,b){if(\"function\"==typeof define&&define.amd)define([],b);else if(\"undefined\"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){\"use strict\";function b(a,b){return\"undefined\"==typeof b?b={autoBom:!1}:\"object\"!=typeof b&&(console.warn(\"Deprecated: Expected third argument to be a object\"),b={autoBom:!b}),b.autoBom&&/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(a.type)?new Blob([\"\\uFEFF\",a],{type:a.type}):a}function c(b,c,d){var e=new XMLHttpRequest;e.open(\"GET\",b),e.responseType=\"blob\",e.onload=function(){a(e.response,c,d)},e.onerror=function(){console.error(\"could not download file\")},e.send()}function d(a){var b=new XMLHttpRequest;b.open(\"HEAD\",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent(\"click\"))}catch(c){var b=document.createEvent(\"MouseEvents\");b.initMouseEvent(\"click\",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f=\"object\"==typeof window&&window.window===window?window:\"object\"==typeof self&&self.self===self?self:\"object\"==typeof global&&global.global===global?global:void 0,a=f.saveAs||(\"object\"!=typeof window||window!==f?function(){}:\"download\"in HTMLAnchorElement.prototype?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement(\"a\");g=g||b.name||\"download\",j.download=g,j.rel=\"noopener\",\"string\"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target=\"_blank\")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:\"msSaveOrOpenBlob\"in navigator?function(f,g,h){if(g=g||f.name||\"download\",\"string\"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement(\"a\");i.href=f,i.target=\"_blank\",setTimeout(function(){e(i)})}}:function(a,b,d,e){if(e=e||open(\"\",\"_blank\"),e&&(e.document.title=e.document.body.innerText=\"downloading...\"),\"string\"==typeof a)return c(a,b,d);var g=\"application/octet-stream\"===a.type,h=/constructor/i.test(f.HTMLElement)||f.safari,i=/CriOS\\/[\\d]+/.test(navigator.userAgent);if((i||g&&h)&&\"object\"==typeof FileReader){var j=new FileReader;j.onloadend=function(){var a=j.result;a=i?a:a.replace(/^data:[^;]*;/,\"data:attachment/file;\"),e?e.location.href=a:location=a,e=null},j.readAsDataURL(a)}else{var k=f.URL||f.webkitURL,l=k.createObjectURL(a);e?e.location=l:location.href=l,e=null,setTimeout(function(){k.revokeObjectURL(l)},4E4)}});f.saveAs=a.saveAs=a,\"undefined\"!=typeof module&&(module.exports=a)});\n\n//# sourceMappingURL=FileSaver.min.js.map","module.exports = Moment;","module.exports = classnames;","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","import { ExtensionContainer } from 'tessa/extensions';\r\nExtensionContainer.instance.registerBundle({\r\n name: 'Tessa.Extensions.Default.js',\r\n buildTime: process.env.BUILD_TIME!\r\n});","import { CardStoreExtension, ICardStoreExtensionContext } from 'tessa/cards/extensions';\r\nimport { KrToken } from 'tessa/workflow';\r\nimport { UIContext } from 'tessa/ui';\r\nimport { ICardEditorModel, ICardModel } from 'tessa/ui/cards';\r\n\r\nexport class AcquaintanceClientStoreExtension extends CardStoreExtension {\r\n\r\n public afterRequest(context: ICardStoreExtensionContext) {\r\n if (!context.requestIsSuccessful) {\r\n return;\r\n }\r\n\r\n const token = KrToken.tryGet(context.response!.info);\r\n const uiContext = UIContext.current;\r\n\r\n let editor: ICardEditorModel;\r\n let model: ICardModel;\r\n if (token\r\n && (editor = uiContext.cardEditor!)\r\n && (model = editor.cardModel!)\r\n && '.SaveWithPermissionsCalc' in context.request.info\r\n && context.response!.cardVersion !== model.card.version\r\n ) {\r\n token.setInfo(editor.info);\r\n }\r\n }\r\n\r\n}","import { DoubleClickInfo, IWorkplaceViewComponent, openCardIntegerDoubleClickAction } from 'tessa/ui/views';\r\nimport { WorkplaceViewComponentExtension } from 'tessa/ui/views/extensions';\r\nimport { LoadingOverlay } from 'tessa/ui';\r\nimport { createTypedField, DotNetType } from 'tessa/platform';\r\nimport { AdvancedCardDialogManager } from 'tessa/ui/cards';\r\n\r\n/**\r\n * Расширение, выполняющее открытие виртуальной карточки по строке в состояниях документа.\r\n */\r\nexport class OpenFromKrDocStatesOnDoubleClickExtension extends WorkplaceViewComponentExtension {\r\n\r\n public getExtensionName(): string {\r\n return 'Tessa.Extensions.Default.Client.Cards.OpenFromKrDocStatesOnDoubleClickExtension';\r\n }\r\n\r\n public initialize(model: IWorkplaceViewComponent) {\r\n if (model.inSelectionMode()) {\r\n return;\r\n }\r\n model.doubleClickAction = async (info: DoubleClickInfo) => {\r\n await openCardIntegerDoubleClickAction(info, async (\r\n cardId,\r\n displayValue,\r\n context\r\n ) => {\r\n await LoadingOverlay.instance.show(async (splashResolve) => {\r\n await AdvancedCardDialogManager.instance.openCard({\r\n cardTypeId: 'e83a230a-f5fc-445e-9b44-7d0140ee69f6', // KrDocStateTypeID\r\n displayValue,\r\n context,\r\n info: {\r\n 'StateID': createTypedField(cardId, DotNetType.Int32)\r\n },\r\n splashResolve\r\n });\r\n });\r\n });\r\n };\r\n }\r\n\r\n}","import { CardDeleteExtension, CardDeleteExtensionContext } from 'tessa/cards/extensions';\r\nimport { UIContext, tryGetFromInfo } from 'tessa/ui';\r\nimport { ICardModel } from 'tessa/ui/cards';\r\nimport { createTypedField, DotNetType } from 'tessa/platform';\r\n\r\n/**\r\n * Расширение на удаление виртуальной карточки состояния документа со стороны клиента.\r\n */\r\nexport class KrDocStateClientDeleteExtension extends CardDeleteExtension {\r\n\r\n public shouldExecute(context: CardDeleteExtensionContext) {\r\n return context.request.cardTypeId === 'e83a230a-f5fc-445e-9b44-7d0140ee69f6'; // KrDocStateTypeID\r\n }\r\n\r\n public beforeRequest(context: CardDeleteExtensionContext) {\r\n const cardId = context.request.cardId;\r\n if (!cardId) {\r\n return;\r\n }\r\n\r\n const editor = UIContext.current.cardEditor;\r\n let model: ICardModel;\r\n\r\n if (editor\r\n && (model = editor.cardModel!)\r\n && model.card.id === cardId\r\n && model.cardType.id === 'e83a230a-f5fc-445e-9b44-7d0140ee69f6' // KrDocStateTypeID\r\n ) {\r\n const stateId = tryGetFromInfo(model.card.tryGetInfo() || {}, 'StateID');\r\n if (stateId != null) {\r\n context.request.info['StateID'] = createTypedField(stateId, DotNetType.Int32);\r\n }\r\n }\r\n }\r\n\r\n}","import { CardRequestExtension, ICardRequestExtensionContext } from 'tessa/cards/extensions';\r\nimport { UIContext, tryGetFromInfo } from 'tessa/ui';\r\nimport { CardInstanceType } from 'tessa/cards';\r\nimport { TypedField, DotNetType, createTypedField } from 'tessa/platform';\r\nimport { CardResponse, GetTypeIDList } from 'tessa/cards/service';\r\n\r\nexport class CompletionOptionGetTypeIdListRequestExtension extends CardRequestExtension {\r\n\r\n public shouldExecute(context: ICardRequestExtensionContext) {\r\n return context.requestType === GetTypeIDList;\r\n }\r\n\r\n public beforeRequest(context: ICardRequestExtensionContext) {\r\n // расширение обычно вызывается при удалении или при экспорте из представления; экспорт запрещён, так что это удаление\r\n const viewContext = UIContext.current.viewContext;\r\n if (!viewContext\r\n || !viewContext.view\r\n || viewContext.view.metadata.alias !== 'CompletionOptionCards'\r\n ) {\r\n return;\r\n }\r\n\r\n let instanceIdListCount: number = 0;\r\n let instanceType: CardInstanceType | null = null;\r\n const requestInfo = context.request.tryGetInfo();\r\n if (requestInfo) {\r\n instanceType = tryGetFromInfo(requestInfo, '.instanceType', null);\r\n const idList = tryGetFromInfo(requestInfo, '.instanceIDList', null);\r\n if (idList) {\r\n instanceIdListCount = idList.length;\r\n }\r\n }\r\n\r\n if (instanceType !== CardInstanceType.Card) {\r\n return;\r\n }\r\n\r\n const types: TypedField[] = [];\r\n for (let i = 0; i < instanceIdListCount; i++) {\r\n types.push(createTypedField('f6b95639-234e-4800-a2f1-3cb20e0bcda4', DotNetType.Guid)); // CompletionOptionTypeID\r\n }\r\n\r\n const response = new CardResponse();\r\n response.info['.typeIDList'] = types;\r\n\r\n context.response = response;\r\n }\r\n\r\n}","import { CardRequestExtension, ICardRequestExtensionContext } from 'tessa/cards/extensions';\r\nimport { UIContext, tryGetFromInfo } from 'tessa/ui';\r\nimport { CardInstanceType } from 'tessa/cards';\r\nimport { TypedField, DotNetType, createTypedField } from 'tessa/platform';\r\nimport { CardResponse, GetTypeIDList } from 'tessa/cards/service';\r\n\r\nexport class FunctionRoleGetTypeIdListRequestExtension extends CardRequestExtension {\r\n\r\n public shouldExecute(context: ICardRequestExtensionContext) {\r\n return context.requestType === GetTypeIDList;\r\n }\r\n\r\n public beforeRequest(context: ICardRequestExtensionContext) {\r\n // расширение обычно вызывается при удалении или при экспорте из представления; экспорт запрещён, так что это удаление\r\n const viewContext = UIContext.current.viewContext;\r\n if (!viewContext\r\n || !viewContext.view\r\n || viewContext.view.metadata.alias !== 'FunctionRoleCards'\r\n ) {\r\n return;\r\n }\r\n\r\n let instanceIdListCount: number = 0;\r\n let instanceType: CardInstanceType | null = null;\r\n const requestInfo = context.request.tryGetInfo();\r\n if (requestInfo) {\r\n instanceType = tryGetFromInfo(requestInfo, '.instanceType', null);\r\n const idList = tryGetFromInfo(requestInfo, '.instanceIDList', null);\r\n if (idList) {\r\n instanceIdListCount = idList.length;\r\n }\r\n }\r\n\r\n if (instanceType !== CardInstanceType.Card) {\r\n return;\r\n }\r\n\r\n const types: TypedField[] = [];\r\n for (let i = 0; i < instanceIdListCount; i++) {\r\n types.push(createTypedField('a830094d-6e03-4242-9c17-0d0a8f2fcb33', DotNetType.Guid)); // FunctionRoleTypeID\r\n }\r\n\r\n const response = new CardResponse();\r\n response.info['.typeIDList'] = types;\r\n\r\n context.response = response;\r\n }\r\n\r\n}","import { CardStoreExtension, ICardStoreExtensionContext } from 'tessa/cards/extensions';\r\nimport { UIContext, tryGetFromInfo } from 'tessa/ui';\r\nimport { systemKeyPrefix, CardTaskAction } from 'tessa/cards';\r\nimport { getTypedFieldValue, TypedField, DotNetType } from 'tessa/platform';\r\nimport { ICardModel } from 'tessa/ui/cards';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { DefaultFormTabWithTasksViewModel } from 'tessa/ui/cards/forms';\r\nimport { TaskViewModel } from 'tessa/ui/cards/tasks';\r\n\r\ninterface KrPermissionMandatoryRuleStorage {\r\n sectionId: guid;\r\n columnIds: guid[];\r\n}\r\n\r\nexport class KrPermissionsMandatoryStoreExtension extends CardStoreExtension {\r\n\r\n public afterRequest(context: ICardStoreExtensionContext) {\r\n // tslint:disable-next-line:no-any\r\n let rules: any[] | null = null;\r\n if (!context.requestIsSuccessful\r\n && UIContext.current.cardEditor\r\n && context.response\r\n && (rules = tryGetFromInfo(context.response.info, systemKeyPrefix + 'FailedMandatoryRules'))\r\n ) {\r\n const cardModel = UIContext.current.cardEditor.cardModel!;\r\n const failRules: KrPermissionMandatoryRuleStorage[] = rules.map(x => {\r\n return {\r\n sectionId: getTypedFieldValue(x['SectionID']),\r\n columnIds: (x['ColumnIDs'] as Array>).map(y => getTypedFieldValue(y))\r\n };\r\n });\r\n\r\n this.validateFromRules(cardModel, failRules);\r\n\r\n const requestTasks = context.request.card.tasks;\r\n const taskItems = cardModel.mainForm instanceof DefaultFormTabWithTasksViewModel ? cardModel.mainForm.tasks : null;\r\n if (requestTasks.length > 0\r\n && !!taskItems\r\n && taskItems.length > 0\r\n ) {\r\n for (let task of requestTasks) {\r\n let taskItem: TaskViewModel | null = null;\r\n if (task.action === CardTaskAction.Complete\r\n && (taskItem = taskItems.find(x => x instanceof TaskViewModel && x.taskModel.cardTask!.rowId === task.rowId)!)\r\n ) {\r\n this.validateFromRules(taskItem.taskModel, failRules);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private validateFromRules(cardModel: ICardModel, failRules: KrPermissionMandatoryRuleStorage[]) {\r\n for (let controlViewModel of cardModel.controlsBag) {\r\n const sourceInfo = controlViewModel.cardTypeControl.getSourceInfo();\r\n if (sourceInfo\r\n && failRules.some(x => x.sectionId === sourceInfo.sectionId\r\n && (x.columnIds.length === 0 || sourceInfo.columnIds.some(y => x.columnIds.some(z => z === y))))\r\n ) {\r\n controlViewModel.validationFunc = (c) => {\r\n if (c.hasEmptyValue) {\r\n return LocalizationManager.instance.format('$KrPermissions_MandatoryControlTemplate', c.caption);\r\n }\r\n\r\n return null;\r\n };\r\n controlViewModel.notifyUpdateValidation();\r\n }\r\n }\r\n }\r\n\r\n}","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { AcquaintanceClientStoreExtension } from './acquaintanceClientStoreExtension';\r\nimport { OpenFromKrDocStatesOnDoubleClickExtension } from './openFromKrDocStatesOnDoubleClickExtension';\r\nimport { KrDocStateClientDeleteExtension } from './krDocStateClientDeleteExtension';\r\nimport { CompletionOptionGetTypeIdListRequestExtension } from './completionOptionGetTypeIdListRequestExtension';\r\nimport { FunctionRoleGetTypeIdListRequestExtension } from './functionRoleGetTypeIdListRequestExtension';\r\nimport { KrPermissionsMandatoryStoreExtension } from './krPermissionsMandatoryStoreExtension';\r\n\r\nExtensionContainer.instance.registerExtension({extension: AcquaintanceClientStoreExtension, stage: ExtensionStage.AfterPlatform, singleton: true});\r\nExtensionContainer.instance.registerExtension({extension: OpenFromKrDocStatesOnDoubleClickExtension, stage: ExtensionStage.AfterPlatform, singleton: true});\r\nExtensionContainer.instance.registerExtension({extension: KrDocStateClientDeleteExtension, stage: ExtensionStage.AfterPlatform});\r\nExtensionContainer.instance.registerExtension({extension: CompletionOptionGetTypeIdListRequestExtension, stage: ExtensionStage.AfterPlatform});\r\nExtensionContainer.instance.registerExtension({extension: FunctionRoleGetTypeIdListRequestExtension, stage: ExtensionStage.AfterPlatform});\r\nExtensionContainer.instance.registerExtension({extension: KrPermissionsMandatoryStoreExtension, stage: ExtensionStage.AfterPlatform});","export default function compareVersions(v1, v2) {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0) return r;\n\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n } else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n\n return 0;\n}\n\nexport const validate = (v) =>\n typeof v === 'string' && /^[v\\d]/.test(v) && semver.test(v);\n\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n\n return operatorResMap[operator].includes(res);\n};\n\nexport const satisfies = (v, r) => {\n // if no range operator then \"=\"\n const m = r.match(/^([<>=~^]+)/);\n const op = m ? m[1] : '=';\n\n // if gt/lt/eq then operator compare\n if (op !== '^' && op !== '~') return compare(v, r, op);\n\n // else range of either \"~\" or \"^\" is assumed\n const [v1, v2, v3] = validateAndParse(v);\n const [r1, r2, r3] = validateAndParse(r);\n if (compareStrings(v1, r1) !== 0) return false;\n if (op === '^') {\n return compareSegments([v2, v3], [r2, r3]) >= 0;\n }\n if (compareStrings(v2, r2) !== 0) return false;\n return compareStrings(v3, r3) >= 0;\n};\n\n// export CJS style for parity\ncompareVersions.validate = validate;\ncompareVersions.compare = compare;\ncompareVersions.sastisfies = satisfies;\n\nconst semver =\n /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\n\nconst validateAndParse = (v) => {\n if (typeof v !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = v.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${v}' received)`);\n }\n match.shift();\n return match;\n};\n\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\n\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\n\nconst forceType = (a, b) =>\n typeof a !== typeof b ? [String(a), String(b)] : [a, b];\n\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b)) return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp) return 1;\n if (ap < bp) return -1;\n return 0;\n};\n\nconst compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || 0, b[i] || 0);\n if (r !== 0) return r;\n }\n return 0;\n};\n\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n};\n\nconst allowedOperators = Object.keys(operatorResMap);\n\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(\n `Invalid operator type, expected string but got ${typeof op}`\n );\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(\n `Invalid operator, expected one of ${allowedOperators.join('|')}`\n );\n }\n};\n","import { ValidationResult, ValidationResultType } from 'tessa/platform/validation';\r\nimport { MetadataStorage } from 'tessa';\r\nimport { DeskiInfo, DeskiMetadata, getTypedFieldValue } from 'tessa/platform';\r\nimport { showLoadingOverlay, showConfirm, showDownloadDeskiDialog } from 'tessa/ui';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { CardService, CardRequest } from 'tessa/cards/service';\r\nimport compareVersions from 'compare-versions';\r\n\r\nconst DESKI_SERVER_PATH = 'http://127.0.0.1';\r\nlet LOCK_DESKI_FIND = false;\r\n\r\nexport type DeskiFileInfo = {\r\n Name: string;\r\n Path: string;\r\n Modified: string;\r\n IsModified: boolean;\r\n IsLocked: boolean;\r\n Size: number;\r\n ID: string;\r\n Editable: boolean;\r\n App: string;\r\n};\r\n\r\nexport type MasterKey = {\r\n Key: string;\r\n ExpiresAt: string;\r\n};\r\n\r\nexport interface CipherInfo {\r\n Info: IStorage | null;\r\n LocalExpiryDates: string[];\r\n LocalPrivateKeys: string[];\r\n}\r\n\r\nexport class DeskiManager {\r\n //#region ctor\r\n\r\n private constructor() {\r\n }\r\n\r\n //#endregion\r\n\r\n //#region instance\r\n\r\n private static _instance: DeskiManager;\r\n\r\n public static get instance(): DeskiManager {\r\n if (!DeskiManager._instance) {\r\n DeskiManager._instance = new DeskiManager();\r\n }\r\n return DeskiManager._instance;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region props\r\n\r\n private _masterKeys: MasterKey[] = [];\r\n\r\n public get masterKeys(): ReadonlyArray {\r\n return this._masterKeys;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n public get deskiEnabled(): boolean {\r\n return MetadataStorage.instance.commonMetadata.deskiInfo.enabled;\r\n }\r\n\r\n public get deskiAvailable(): boolean {\r\n return !!(\r\n MetadataStorage.instance.commonMetadata.deskiInfo.enabled &&\r\n MetadataStorage.instance.commonMetadata.deskiInfo.port\r\n );\r\n }\r\n\r\n public getDeskiUrl(deskiPort?: number): string {\r\n return `${DESKI_SERVER_PATH}:${deskiPort ||\r\n MetadataStorage.instance.commonMetadata.deskiInfo.port ||\r\n 0}`;\r\n }\r\n\r\n public async findDeski(\r\n delayTimeout: boolean = false\r\n ): Promise<{ port?: number; info?: DeskiInfo }> {\r\n if (LOCK_DESKI_FIND) {\r\n console.log('Another deski\\'s extension is already searching for its host companion!');\r\n return {};\r\n }\r\n\r\n try {\r\n LOCK_DESKI_FIND = true;\r\n let port = 7711;\r\n const maxIterations = 20;\r\n let response;\r\n const shifts = stringToArray('TESSA');\r\n let deskiPort: number | undefined = 0;\r\n let info: DeskiInfo | undefined;\r\n\r\n for (let i = 0; port < 65535 && i < maxIterations; i++) {\r\n let timeout = !delayTimeout ? 1000 : i < 3 ? 1000 : 250;\r\n try {\r\n console.log(`Searching for Deski: port ${port}`);\r\n response = await (\r\n await fetchWithTimeout(timeout, fetch(`${DESKI_SERVER_PATH}:${port}/tessa-deski-info`))\r\n ).text();\r\n try {\r\n const resp: DeskiInfo = JSON.parse(response);\r\n if (resp && resp.ShortName === 'deski') {\r\n console.log(\r\n `Deski v${resp.VerMajor}.${resp.VerMinor} is found: ${DESKI_SERVER_PATH}:${port}`\r\n );\r\n deskiPort = port;\r\n info = resp;\r\n console.log(this.getDeskiUrl(deskiPort));\r\n return { port: deskiPort, info };\r\n } else {\r\n console.log(`Another app is listening at port ${port} (not Deski)`);\r\n }\r\n } catch (err) {\r\n console.log(`Another app is listening at port ${port} (not Deski)`);\r\n }\r\n } catch (error) {\r\n console.log(error);\r\n }\r\n port += shifts[i % 5];\r\n }\r\n\r\n if (!deskiPort) {\r\n console.log('Deski isn\\'t found');\r\n }\r\n\r\n return { port: deskiPort, info };\r\n } finally {\r\n LOCK_DESKI_FIND = false;\r\n }\r\n }\r\n\r\n public async checkDeski(silent: boolean = false): Promise {\r\n if (!MetadataStorage.instance.commonMetadata.deskiInfo.port) {\r\n if (silent) {\r\n const resp = await DeskiManager.instance.findDeski(false);\r\n if (resp.port) {\r\n MetadataStorage.instance.setCommonMetadataDeskiMeta(\r\n new DeskiMetadata({ enabled: true, ...resp })\r\n );\r\n }\r\n return !!MetadataStorage.instance.commonMetadata.deskiInfo.port;\r\n }\r\n\r\n const resp = await showLoadingOverlay(\r\n async () => await DeskiManager.instance.findDeski(true),\r\n LocalizationManager.instance.localize('$About_Web_Deski_LoadingCaption')\r\n );\r\n if (resp.port) {\r\n MetadataStorage.instance.setCommonMetadataDeskiMeta(\r\n new DeskiMetadata({ enabled: true, ...resp })\r\n );\r\n }\r\n\r\n // если мы не нашли дески, то предлагаем скачать его\r\n if (!LOCK_DESKI_FIND && !MetadataStorage.instance.commonMetadata.deskiInfo.port) {\r\n if (await showConfirm('$Deski_DownloadConfirmation')) {\r\n await showDownloadDeskiDialog();\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n // если мы его нашли, то нужно проверить версию\r\n if (\r\n !Boolean(window.sessionStorage.getItem('DeskiUpdateRequest')) &&\r\n MetadataStorage.instance.commonMetadata.deskiInfo.port\r\n ) {\r\n const deskiVersionFromServer = MetadataStorage.instance.info.get('DeskiVersion');\r\n const deskiInfo = MetadataStorage.instance.commonMetadata.deskiInfo;\r\n if (\r\n deskiVersionFromServer &&\r\n deskiInfo.version &&\r\n deskiInfo.version !== deskiVersionFromServer &&\r\n compareVersions(deskiVersionFromServer, deskiInfo.version) === 1\r\n ) {\r\n // предлагаем скачать новую версию\r\n window.sessionStorage.setItem('DeskiUpdateRequest', 'true');\r\n const updateDeskiResult = await showConfirm(\r\n LocalizationManager.instance.format(\r\n '$Deski_UpdateConfirmation',\r\n deskiInfo.version,\r\n deskiVersionFromServer\r\n )\r\n );\r\n if (updateDeskiResult) {\r\n await showDownloadDeskiDialog();\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return !!MetadataStorage.instance.commonMetadata.deskiInfo.port;\r\n }\r\n\r\n public async updateMasterKeys(cipher?: CipherInfo): Promise {\r\n if (!cipher) {\r\n const request = new CardRequest();\r\n request.requestType = '74b9cb3a-1a49-4624-baa2-1cc2d0232229'; // ResolveUserCipherInfo\r\n const response = await CardService.instance.request(request);\r\n if (!response.validationResult.isSuccessful) {\r\n return response.validationResult.build();\r\n }\r\n\r\n const cipherObject = response.info['UserCipherInfoObject'];\r\n if (!cipherObject) {\r\n return ValidationResult.fromText(\r\n 'Can not find UserCipherInfoObject in response.',\r\n ValidationResultType.Error\r\n );\r\n }\r\n\r\n cipher = {\r\n Info: null,\r\n LocalExpiryDates: cipherObject['LocalExpiryDates'].map(x => getTypedFieldValue(x)),\r\n LocalPrivateKeys: cipherObject['LocalPrivateKeys'].map(x => getTypedFieldValue(x))\r\n };\r\n }\r\n\r\n const length = cipher.LocalPrivateKeys.length;\r\n const keys: MasterKey[] = [];\r\n for (let i = 0; i < length; i++) {\r\n keys.push({\r\n Key: cipher.LocalPrivateKeys[i],\r\n ExpiresAt: cipher.LocalExpiryDates[i]\r\n });\r\n }\r\n\r\n this._masterKeys = keys;\r\n\r\n return ValidationResult.empty;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region service\r\n\r\n private getRequestOptions(opt?: RequestInit): RequestInit {\r\n const defaultOpt: RequestInit = {\r\n mode: 'cors'\r\n };\r\n return opt ? Object.assign({}, defaultOpt, opt) : defaultOpt;\r\n }\r\n\r\n public async setAppInfo(\r\n appUrl: string,\r\n keys: ReadonlyArray\r\n ): Promise<{ success: true } | { success: false; result: ValidationResult }> {\r\n const deskiUrl = new URL(`${this.getDeskiUrl()}/api/setappinfo`);\r\n deskiUrl.searchParams.append('app', appUrl);\r\n\r\n const options = this.getRequestOptions({ method: 'POST' });\r\n\r\n // const formData = new FormData();\r\n // formData.append('BaseUrl', appUrl);\r\n // formData.append('KnownKeys', JSON.stringify(keys));\r\n // options.body = formData;\r\n\r\n options.body = JSON.stringify({\r\n BaseUrl: appUrl,\r\n KnownKeys: keys\r\n });\r\n\r\n const headers = new Headers();\r\n headers.append('Content-Type', 'application/json; charset=utf-8');\r\n options.headers = headers;\r\n\r\n try {\r\n const response = await fetch(deskiUrl.href, options);\r\n if (!response.ok) {\r\n const result = await getJSONOrMessageFromResponse(response);\r\n return {\r\n success: false,\r\n result: ValidationResult.fromText(result.message, ValidationResultType.Error)\r\n };\r\n }\r\n\r\n return { success: true };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n result: ValidationResult.fromError(e)\r\n };\r\n }\r\n }\r\n\r\n public async getContentInfo(\r\n appUrl: string,\r\n id: string\r\n ): Promise<{ isCached: boolean; result?: ValidationResult }> {\r\n const deskiUrl = new URL(`${this.getDeskiUrl()}/api/getcontentinfo`);\r\n deskiUrl.searchParams.append('app', appUrl);\r\n deskiUrl.searchParams.append('id', id);\r\n\r\n const options = this.getRequestOptions({ method: 'GET' });\r\n\r\n try {\r\n const response = await fetch(deskiUrl.href, options);\r\n const result = await getJSONOrMessageFromResponse(response);\r\n if (!response.ok) {\r\n return {\r\n isCached: false,\r\n result: ValidationResult.fromText(result.message, ValidationResultType.Error)\r\n };\r\n }\r\n\r\n return { isCached: result['IsCashed'] };\r\n } catch (e) {\r\n return { isCached: false, result: ValidationResult.fromError(e) };\r\n }\r\n }\r\n\r\n public async cacheContent(\r\n appUrl: string,\r\n id: string,\r\n name: string,\r\n content: File\r\n ): Promise<{ success: true } | { success: false; result: ValidationResult }> {\r\n const deskiUrl = new URL(`${this.getDeskiUrl()}/api/cachecontent`);\r\n deskiUrl.searchParams.append('app', appUrl);\r\n deskiUrl.searchParams.append('id', id);\r\n deskiUrl.searchParams.append('name', name);\r\n\r\n const options = this.getRequestOptions({ method: 'POST' });\r\n\r\n options.body = new Blob([content]);\r\n\r\n const headers = new Headers();\r\n headers.append('Content-Type', 'applcation/octet-stream');\r\n options.headers = headers;\r\n\r\n try {\r\n const response = await fetch(deskiUrl.href, options);\r\n if (!response.ok) {\r\n const result = await getJSONOrMessageFromResponse(response);\r\n return {\r\n success: false,\r\n result: ValidationResult.fromText(result.message, ValidationResultType.Error)\r\n };\r\n }\r\n\r\n return { success: true };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n result: ValidationResult.fromError(e)\r\n };\r\n }\r\n }\r\n\r\n public async openFile(\r\n appUrl: string,\r\n id: string,\r\n mode: 'file' | 'folder',\r\n editable: boolean\r\n ): Promise<{ success: true } | { success: false; result: ValidationResult }> {\r\n const deskiUrl = new URL(`${this.getDeskiUrl()}/api/openfile`);\r\n deskiUrl.searchParams.append('app', appUrl);\r\n deskiUrl.searchParams.append('id', id);\r\n deskiUrl.searchParams.append('mode', mode);\r\n deskiUrl.searchParams.append('editable', String(editable));\r\n\r\n const options = this.getRequestOptions({ method: 'GET' });\r\n\r\n try {\r\n const response = await fetch(deskiUrl.href, options);\r\n if (!response.ok) {\r\n const result = await getJSONOrMessageFromResponse(response);\r\n return {\r\n success: false,\r\n result: ValidationResult.fromText(result.message, ValidationResultType.Error)\r\n };\r\n }\r\n\r\n return { success: true };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n result: ValidationResult.fromError(e)\r\n };\r\n }\r\n }\r\n\r\n public async getFileInfo(\r\n appUrl: string,\r\n id: string,\r\n editable: boolean\r\n ): Promise<{ info?: DeskiFileInfo; result?: ValidationResult }> {\r\n const deskiUrl = new URL(`${this.getDeskiUrl()}/api/getfileinfo`);\r\n deskiUrl.searchParams.append('app', appUrl);\r\n deskiUrl.searchParams.append('id', id);\r\n deskiUrl.searchParams.append('editable', String(editable));\r\n\r\n const options = this.getRequestOptions({ method: 'GET' });\r\n\r\n try {\r\n const response = await fetch(deskiUrl.href, options);\r\n const result = await getJSONOrMessageFromResponse(response);\r\n if (!response.ok) {\r\n return {\r\n result: ValidationResult.fromText(result.message, ValidationResultType.Error)\r\n };\r\n }\r\n\r\n return { info: result };\r\n } catch (e) {\r\n return { result: ValidationResult.fromError(e) };\r\n }\r\n }\r\n\r\n public async getFileData(\r\n appUrl: string,\r\n id: string\r\n ): Promise<{ data?: Blob; result?: ValidationResult }> {\r\n const deskiUrl = new URL(`${this.getDeskiUrl()}/api/getfiledata`);\r\n deskiUrl.searchParams.append('app', appUrl);\r\n deskiUrl.searchParams.append('id', id);\r\n\r\n const options = this.getRequestOptions({ method: 'GET' });\r\n\r\n try {\r\n const response = await fetch(deskiUrl.href, options);\r\n if (!response.ok) {\r\n const result = await getJSONOrMessageFromResponse(response);\r\n return {\r\n result: ValidationResult.fromText(result.message, ValidationResultType.Error)\r\n };\r\n }\r\n\r\n const data = await response.blob();\r\n return { data };\r\n } catch (e) {\r\n return { result: ValidationResult.fromError(e) };\r\n }\r\n }\r\n\r\n public async cacheModFileWithNewId(\r\n appUrl: string,\r\n id: string,\r\n newId: string\r\n ): Promise<{ success: true } | { success: false; result: ValidationResult }> {\r\n const deskiUrl = new URL(`${this.getDeskiUrl()}/api/cachemodified`);\r\n deskiUrl.searchParams.append('app', appUrl);\r\n deskiUrl.searchParams.append('id', id);\r\n deskiUrl.searchParams.append('newid', newId);\r\n\r\n const options = this.getRequestOptions({ method: 'GET' });\r\n\r\n try {\r\n const response = await fetch(deskiUrl.href, options);\r\n if (!response.ok) {\r\n const result = await getJSONOrMessageFromResponse(response);\r\n return {\r\n success: false,\r\n result: ValidationResult.fromText(result.message, ValidationResultType.Error)\r\n };\r\n }\r\n\r\n return { success: true };\r\n } catch (e) {\r\n return {\r\n success: false,\r\n result: ValidationResult.fromError(e)\r\n };\r\n }\r\n }\r\n\r\n public async removeFile(\r\n appUrl: string,\r\n id: string,\r\n editable: boolean,\r\n sync: boolean = false\r\n ): Promise<{ success: true } | { success: false; result: ValidationResult }> {\r\n const deskiUrl = new URL(`${this.getDeskiUrl()}/api/removefile`);\r\n deskiUrl.searchParams.append('app', appUrl);\r\n deskiUrl.searchParams.append('id', id);\r\n deskiUrl.searchParams.append('editable', String(editable));\r\n\r\n const options = this.getRequestOptions({ method: 'GET' });\r\n\r\n try {\r\n if (sync) {\r\n const req = new XMLHttpRequest();\r\n req.open('GET', deskiUrl.href, false);\r\n req.send();\r\n\r\n return { success: true };\r\n } else {\r\n const response = await fetch(deskiUrl.href, options);\r\n if (!response.ok) {\r\n const result = await getJSONOrMessageFromResponse(response);\r\n return {\r\n success: false,\r\n result: ValidationResult.fromText(result.message, ValidationResultType.Error)\r\n };\r\n }\r\n\r\n return { success: true };\r\n }\r\n } catch (e) {\r\n return {\r\n success: false,\r\n result: ValidationResult.fromError(e)\r\n };\r\n }\r\n }\r\n\r\n public async getContent(\r\n appUrl: string,\r\n id: string\r\n ): Promise<{ data?: Blob; result?: ValidationResult }> {\r\n const deskiUrl = new URL(`${this.getDeskiUrl()}/api/getcontent`);\r\n deskiUrl.searchParams.append('app', appUrl);\r\n deskiUrl.searchParams.append('id', id);\r\n\r\n const options = this.getRequestOptions({ method: 'GET' });\r\n\r\n try {\r\n const response = await fetch(deskiUrl.href, options);\r\n if (!response.ok) {\r\n const result = await getJSONOrMessageFromResponse(response);\r\n return {\r\n result: ValidationResult.fromText(result.message, ValidationResultType.Error)\r\n };\r\n }\r\n\r\n const data = await response.blob();\r\n return { data };\r\n } catch (e) {\r\n return { result: ValidationResult.fromError(e) };\r\n }\r\n }\r\n\r\n public async getOpenFiles(\r\n appUrl: string\r\n ): Promise<{\r\n files?: Array;\r\n result?: ValidationResult;\r\n }> {\r\n const deskiUrl = new URL(`${this.getDeskiUrl()}/api/getopenfiles`);\r\n deskiUrl.searchParams.append('app', appUrl);\r\n\r\n const options = this.getRequestOptions({ method: 'GET' });\r\n\r\n try {\r\n const response = await fetch(deskiUrl.href, options);\r\n const result = await getJSONOrMessageFromResponse(response);\r\n if (!response.ok) {\r\n return {\r\n result: ValidationResult.fromText(result.message, ValidationResultType.Error)\r\n };\r\n }\r\n\r\n return { files: result };\r\n } catch (e) {\r\n return { result: ValidationResult.fromError(e) };\r\n }\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\n// tslint:disable-next-line: no-any\r\nfunction fetchWithTimeout(ms: number, promise: Promise): Promise {\r\n return new Promise((resolve, reject) => {\r\n let didTimeOut = false;\r\n const timeout = setTimeout(function() {\r\n didTimeOut = true;\r\n reject(new Error('Request timed out'));\r\n }, ms);\r\n\r\n promise\r\n .then(response => {\r\n // Clear the timeout as cleanup\r\n clearTimeout(timeout);\r\n if (!didTimeOut) {\r\n resolve(response);\r\n }\r\n })\r\n .catch(err => {\r\n clearTimeout(timeout);\r\n // Rejection already happened with setTimeout\r\n if (didTimeOut) return;\r\n // Reject with error\r\n reject(err);\r\n });\r\n });\r\n}\r\n\r\nfunction stringToArray(str: string) {\r\n const arr: number[] = [];\r\n for (let i = 0; i < str.length; i++) {\r\n arr.push(str.charCodeAt(i));\r\n }\r\n return arr;\r\n}\r\n\r\nasync function getJSONOrMessageFromResponse(response: Response) {\r\n const contentType = response.headers.get('content-type');\r\n if (contentType && contentType.indexOf('application/json') !== -1) {\r\n return await response.json();\r\n }\r\n\r\n return {\r\n message: response.statusText\r\n };\r\n}\r\n","import { DeskiManager, CipherInfo } from './deskiManager';\r\nimport {\r\n ApplicationExtension,\r\n IApplicationExtensionMetadataContext,\r\n WorkspaceStorage,\r\n MetadataStorage\r\n} from 'tessa';\r\nimport { Result } from 'tessa/platform';\r\nimport { MenuAction, showNotEmpty } from 'tessa/ui';\r\nimport { FileExtension, FileExtensionContext } from 'tessa/ui/files';\r\nimport { FileContainer, IFile, FileType } from 'tessa/files';\r\nimport {\r\n ValidationResultBuilder,\r\n ValidationResultType,\r\n ValidationResult\r\n} from 'tessa/platform/validation';\r\nimport { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { FileViewModel, FileListViewModel } from 'tessa/ui/cards/controls';\r\nimport Platform from 'common/platform';\r\nimport { CardFileType } from 'tessa/cards';\r\n\r\nconst InfoKey = '.deskiExtension';\r\n// tslint:disable-next-line: no-any\r\nconst BASE_PATH = (window as any).__BASE_PATH__;\r\nconst APP_URL = BASE_PATH ? `${window.location.origin}/${BASE_PATH}` : window.location.origin;\r\nconst MASTER_KEYS_UPDATE_INTERVAL = 1000 * 60 * 60 * 4;\r\n\r\nexport class DeskiExtension extends ApplicationExtension {\r\n private _lastMasterKeysUpdate: number;\r\n\r\n public afterMetadataReceived(_context: IApplicationExtensionMetadataContext) {\r\n if (!DeskiManager.instance.deskiEnabled || Platform.isMobile()) {\r\n return;\r\n }\r\n\r\n (async () => {\r\n await DeskiManager.instance.checkDeski(true);\r\n const cipher: CipherInfo = MetadataStorage.instance.info.get('DeskiCipher');\r\n const result = await DeskiManager.instance.updateMasterKeys(cipher);\r\n MetadataStorage.instance.info.delete('DeskiCipher');\r\n if (!result.isSuccessful) {\r\n console.error(result.format());\r\n await showNotEmpty(result);\r\n return;\r\n }\r\n this._lastMasterKeysUpdate = Date.now();\r\n\r\n // каждые 5 минут проверяем время, которое прошло с последнего обновления мастер ключа\r\n // если прошло больше константы (4 часа), то обновляемся\r\n setInterval(async () => {\r\n const now = Date.now();\r\n if (now - this._lastMasterKeysUpdate >= MASTER_KEYS_UPDATE_INTERVAL) {\r\n const result = await DeskiManager.instance.updateMasterKeys();\r\n if (!result.isSuccessful) {\r\n console.error(result.format());\r\n return;\r\n }\r\n this._lastMasterKeysUpdate = now;\r\n }\r\n }, 300000);\r\n })();\r\n }\r\n}\r\n\r\nexport class DeskiFileExtension extends FileExtension {\r\n public openingMenu(context: FileExtensionContext) {\r\n if (!DeskiManager.instance.deskiEnabled || Platform.isMobile()) {\r\n return;\r\n }\r\n\r\n const file = context.file.model;\r\n\r\n const editCollapsed = !file.permissions.canEdit;\r\n const previewIndex = context.actions.findIndex(x => x.name === 'Preview');\r\n const canEdit = context.file.model.permissions.canEdit;\r\n // скрываем \"Открыть для чтения\", если это новый файл или файл с заменённой версией, который доступен для редактирования;\r\n // т.е. показываем, если либо недоступен для редактирования, либо несколько файлов, либо есть добавленная версия\r\n const canRead = !canEdit || context.files.length > 1 || !context.file.model.versionAdded;\r\n\r\n context.actions.splice(\r\n previewIndex + 1,\r\n 0,\r\n new MenuAction(\r\n 'EditFile',\r\n '$UI_Controls_FilesControl_OpenForEdit',\r\n 'ta icon-thin-002',\r\n async () => {\r\n await openFile(context.file, 'file', true);\r\n },\r\n null,\r\n !canEdit\r\n ),\r\n new MenuAction(\r\n 'EditFile',\r\n '$UI_Controls_FilesControl_OpenInFolderForEdit',\r\n 'ta icon-thin-101',\r\n async () => {\r\n await openFile(context.file, 'folder', true);\r\n },\r\n null,\r\n editCollapsed\r\n ),\r\n new MenuAction(\r\n 'EditFile',\r\n '$UI_Controls_FilesControl_OpenForRead',\r\n 'ta icon-thin-008',\r\n async () => {\r\n await openFile(context.file, 'file', false);\r\n },\r\n null,\r\n !canRead\r\n ),\r\n new MenuAction(\r\n 'EditFile',\r\n '$UI_Controls_FilesControl_OpenInFolderForRead',\r\n 'ta icon-thin-101',\r\n async () => {\r\n await openFile(context.file, 'folder', false);\r\n },\r\n null,\r\n !editCollapsed\r\n )\r\n );\r\n\r\n // если файл был открыт на редактирование, то удаляем открытую версию из deski\r\n if (!!file.lastVersion.info[InfoKey]) {\r\n const revertMenu = context.actions.find(x => x.name === 'Revert');\r\n if (revertMenu) {\r\n // сначала выполняем обычный revert\r\n // если все прошло успешно, то взываем удаление контента в deski\r\n const closureAction = revertMenu.action;\r\n revertMenu.action = async e => {\r\n if (closureAction) {\r\n // костыль, чтобы понять, что основной revert прошел успешно\r\n // tslint:disable-next-line: no-any\r\n const result = ((await closureAction(e)) as any) as boolean;\r\n if (result && !file.wasModified && file.isDirty) {\r\n try {\r\n context.file.isLoading = true;\r\n file.isDirty = false;\r\n await removeFile(file);\r\n } finally {\r\n context.file.isLoading = false;\r\n }\r\n }\r\n }\r\n };\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class DeskiUIExtension extends CardUIExtension {\r\n shouldExecute() {\r\n if (!DeskiManager.instance.deskiAvailable) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n const fileControls = context.model.controlsBag.filter(\r\n x => x instanceof FileListViewModel\r\n ) as FileListViewModel[];\r\n for (let control of fileControls) {\r\n control.fileDoubleClickAction = async file => {\r\n const canEdit = file.model.permissions.canEdit;\r\n await openFile(file, 'file', canEdit);\r\n };\r\n }\r\n }\r\n\r\n public async saving(context: ICardUIExtensionContext) {\r\n let files = context.fileContainer.files;\r\n if (!files || files.length === 0) {\r\n return;\r\n }\r\n\r\n const editedFiles = files.filter(x => !!x.lastVersion.info[InfoKey]);\r\n if (editedFiles.length === 0) {\r\n return;\r\n }\r\n\r\n const savingResult = new ValidationResultBuilder();\r\n for (let file of editedFiles) {\r\n try {\r\n const { info: fileInfo, result: fileInfoResult } = await DeskiManager.instance.getFileInfo(\r\n APP_URL,\r\n file.lastVersion.id,\r\n true\r\n );\r\n if (fileInfoResult) {\r\n savingResult.add(fileInfoResult);\r\n continue;\r\n }\r\n\r\n if (!fileInfo) {\r\n savingResult.add(\r\n ValidationResultType.Error,\r\n `Can not find deski's FileInfo. File: ${file.lastVersion.id}`\r\n );\r\n continue;\r\n }\r\n\r\n if (fileInfo!.IsLocked) {\r\n savingResult.add(\r\n ValidationResultType.Error,\r\n LocalizationManager.instance.format('$UI_Cards_FileSaving_Locked', fileInfo.Name)\r\n );\r\n continue;\r\n }\r\n\r\n if (!fileInfo.IsModified) {\r\n await removeFile(file);\r\n continue;\r\n }\r\n\r\n const fileDataResult = await DeskiManager.instance.getFileData(APP_URL, fileInfo.ID);\r\n if (fileDataResult.result) {\r\n context.validationResult.add(fileDataResult.result);\r\n continue;\r\n }\r\n\r\n // не fileInfo.Name, т.к. файл может быть переименован\r\n file.replace(new File([fileDataResult.data!], file.name), true);\r\n\r\n file.isDirty = false;\r\n const cacheResult = await DeskiManager.instance.cacheModFileWithNewId(\r\n APP_URL,\r\n fileInfo.ID,\r\n file.lastVersion.id\r\n );\r\n if (!cacheResult.success) {\r\n savingResult.add(cacheResult.result);\r\n }\r\n await removeFile(file);\r\n } catch (error) {\r\n savingResult.add(ValidationResult.fromError(error));\r\n }\r\n }\r\n\r\n const result = savingResult.build();\r\n if (result.items.length > 0) {\r\n console.error(result.format());\r\n }\r\n }\r\n\r\n public async finalized(context: ICardUIExtensionContext) {\r\n await clearEditedFiles(context.fileContainer);\r\n }\r\n}\r\n\r\nasync function openFile(\r\n fileVM: FileViewModel,\r\n mode: 'file' | 'folder',\r\n editable: boolean\r\n): Promise {\r\n if (!(await DeskiManager.instance.checkDeski())) {\r\n return;\r\n }\r\n\r\n const file = fileVM.model;\r\n\r\n if (editable) {\r\n file.lastVersion.info[InfoKey] = true;\r\n }\r\n\r\n let result = await DeskiManager.instance.setAppInfo(APP_URL, DeskiManager.instance.masterKeys);\r\n if (!result.success) {\r\n await showNotEmpty(result.result);\r\n return;\r\n }\r\n\r\n const contentInfo = await DeskiManager.instance.getContentInfo(APP_URL, file.lastVersion.id);\r\n if (contentInfo.result) {\r\n await showNotEmpty(contentInfo.result);\r\n return;\r\n }\r\n if (!contentInfo.isCached || isVirtualFile(file.type)) {\r\n if (isVirtualFile(file.type)) {\r\n await DeskiManager.instance.removeFile(APP_URL, file.lastVersion.id, editable);\r\n }\r\n let content: Result;\r\n if (file.lastVersion.content) {\r\n content = {\r\n data: file.lastVersion.content,\r\n validationResult: new ValidationResultBuilder().build()\r\n };\r\n } else {\r\n content = await file.source.getContent(file);\r\n }\r\n\r\n if (!content.data) {\r\n await showNotEmpty(\r\n ValidationResult.fromText('$Deski_Cant_Load_Content', ValidationResultType.Error)\r\n );\r\n return;\r\n }\r\n result = await DeskiManager.instance.cacheContent(\r\n APP_URL,\r\n file.lastVersion.id,\r\n file.lastVersion.name,\r\n content.data\r\n );\r\n if (!result.success) {\r\n await showNotEmpty(result.result);\r\n return;\r\n }\r\n }\r\n\r\n result = await DeskiManager.instance.openFile(APP_URL, file.lastVersion.id, mode, editable);\r\n if (!result.success) {\r\n await showNotEmpty(result.result);\r\n return;\r\n }\r\n\r\n if (editable) {\r\n file.isDirty = true;\r\n }\r\n}\r\n\r\n// при закрытии вкладки или обновлении страницы вручную надо удалить окрытые файлы\r\nwindow.addEventListener('unload', async function() {\r\n if (!DeskiManager.instance.deskiAvailable) {\r\n return;\r\n }\r\n\r\n const cards = WorkspaceStorage.instance.cards;\r\n if (cards.size === 0) {\r\n return;\r\n }\r\n\r\n\r\n for (let card of cards.values()) {\r\n if (card.editor.cardModel) {\r\n await clearEditedFiles(card.editor.cardModel.fileContainer, true);\r\n }\r\n }\r\n }\r\n);\r\n\r\nconst clearEditedFiles = async (fileContainer: FileContainer, sync: boolean = false) => {\r\n const files = fileContainer.files;\r\n if (!files) {\r\n return;\r\n }\r\n\r\n const editedFiles = files.filter(x => !!x.lastVersion.info[InfoKey]);\r\n if (editedFiles.length === 0) {\r\n return;\r\n }\r\n\r\n for (let file of editedFiles) {\r\n try {\r\n await removeFile(file, sync);\r\n } catch (error) {\r\n console.error(error);\r\n }\r\n }\r\n};\r\n\r\nconst removeFile = async (file: IFile, sync: boolean = false) => {\r\n await DeskiManager.instance.removeFile(APP_URL, file.lastVersion.id, true, sync);\r\n delete file.lastVersion.info[InfoKey];\r\n};\r\n\r\nconst isVirtualFile = (fileType: FileType | null): boolean => {\r\n if (fileType && fileType instanceof CardFileType) {\r\n return fileType.isVirtual;\r\n }\r\n\r\n return false;\r\n};\r\n","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { DeskiExtension, DeskiFileExtension, DeskiUIExtension } from './deskiExtension';\r\n\r\nExtensionContainer.instance.registerExtension({\r\n extension: DeskiExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: DeskiFileExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: DeskiUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\n","import { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { DefaultFormMainViewModel } from 'tessa/ui/cards/forms';\r\nimport { AutoCompleteTableViewModel } from 'tessa/ui/cards/controls';\r\nimport { Visibility } from 'tessa/platform';\r\n\r\nexport class HideEmptyIncomingReferencesControl extends CardUIExtension {\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n const model = context.model;\r\n const view = model.mainForm as DefaultFormMainViewModel;\r\n\r\n if (!view || !(view instanceof DefaultFormMainViewModel)) {\r\n return;\r\n }\r\n\r\n const block = view.blocks.find(x => x.name === 'RefsBlock');\r\n if (!block) {\r\n return;\r\n }\r\n\r\n const control = block.controls.find(x => x.name === 'IncomingRefsControl');\r\n const autoComplete = control as AutoCompleteTableViewModel;\r\n\r\n if (autoComplete\r\n && autoComplete instanceof AutoCompleteTableViewModel\r\n && autoComplete.items.length === 0\r\n ) {\r\n autoComplete.controlVisibility = Visibility.Collapsed;\r\n }\r\n }\r\n\r\n}","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { HideEmptyIncomingReferencesControl } from './hideEmptyIncomingReferencesControl';\r\nExtensionContainer.instance.registerExtension({extension: HideEmptyIncomingReferencesControl, stage: ExtensionStage.AfterPlatform, singleton: true});\r\n","import { EDSProvider, EncryptAndDigest } from 'tessa/cards';\r\nimport { CertData } from 'tessa/files';\r\n\r\nexport class CryptoProEDSProvider extends EDSProvider {\r\n getCerts(): Promise {\r\n return new Promise((resolve, reject) => {\r\n window.cadesplugin.async_spawn(\r\n function* (args) {\r\n try {\r\n const oStore = yield window.cadesplugin.CreateObjectAsync('CAdESCOM.Store');\r\n yield oStore.Open(\r\n window.cadesplugin.CAPICOM_CURRENT_USER_STORE,\r\n window.cadesplugin.CAPICOM_MY_STORE,\r\n window.cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED\r\n );\r\n\r\n const CertificatesObj = yield oStore.Certificates;\r\n const Count = yield CertificatesObj.Count;\r\n const certs: CertData[] = [];\r\n for (let i = 1; i <= Count; i++) {\r\n const cert = yield CertificatesObj.Item(i);\r\n const subjectName = yield cert.SubjectName;\r\n const issuerName = yield cert.IssuerName;\r\n const validFrom = yield cert.ValidFromDate;\r\n const validTo = yield cert.ValidToDate;\r\n const serialNumber = yield cert.SerialNumber;\r\n const certificateStr = yield cert.Export(window.cadesplugin.CADESCOM_ENCODE_BASE64);\r\n certs.push({\r\n subjectName: getName(subjectName) as string,\r\n issuerName: getName(issuerName) as string,\r\n validFrom,\r\n validTo,\r\n serialNumber,\r\n company: getOwner(subjectName) as string,\r\n certificateStr\r\n });\r\n }\r\n\r\n yield oStore.Close();\r\n\r\n args[0](certs);\r\n } catch (err) {\r\n args[1](window.cadesplugin.getLastError(err));\r\n }\r\n },\r\n resolve,\r\n reject\r\n );\r\n });\r\n }\r\n signFile(\r\n certificate: CertData,\r\n fileBase64Str: string,\r\n encryptAndDigestList: EncryptAndDigest[]\r\n ): Promise {\r\n return new Promise((resolve, reject) => {\r\n window.cadesplugin.async_spawn(\r\n function* (args) {\r\n try {\r\n // certificate\r\n const oStore = yield window.cadesplugin.CreateObjectAsync('CAdESCOM.Store');\r\n yield oStore.Open(\r\n window.cadesplugin.CAPICOM_CURRENT_USER_STORE,\r\n window.cadesplugin.CAPICOM_MY_STORE,\r\n window.cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED\r\n );\r\n\r\n const CertificatesObj = yield oStore.Certificates;\r\n const oCertificates = yield CertificatesObj.Find(\r\n window.cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME,\r\n certificate.subjectName\r\n );\r\n\r\n const Count = yield oCertificates.Count;\r\n if (Count === 0) {\r\n throw \"Certificate isn't found: \" + args[0];\r\n }\r\n const oCertificate = yield oCertificates.Item(1);\r\n\r\n // hashAlgo\r\n const publicKey = yield oCertificate.PublicKey();\r\n const keyAlgo = yield publicKey.Algorithm;\r\n const publicOid = yield keyAlgo.Value;\r\n const hashAlgoOid = getHashByPublicOid(publicOid, encryptAndDigestList);\r\n const hashAlgo = getHashAlgoByOid(hashAlgoOid);\r\n\r\n // hashObject\r\n const oHashedData = yield window.cadesplugin.CreateObjectAsync('CAdESCOM.HashedData');\r\n yield oHashedData.propset_Algorithm(hashAlgo);\r\n yield oHashedData.propset_DataEncoding(window.cadesplugin.CADESCOM_BASE64_TO_BINARY);\r\n yield oHashedData.Hash(fileBase64Str);\r\n\r\n // rawSignature\r\n const oRawSignature = yield window.cadesplugin.CreateObjectAsync(\r\n 'CAdESCOM.RawSignature'\r\n );\r\n const sRawSignature = yield oRawSignature.SignHash(oHashedData, oCertificate);\r\n\r\n const sSignedMessage = arrayBufferToBase64(toByteArray(sRawSignature).reverse());\r\n\r\n yield oStore.Close();\r\n\r\n args[2](sSignedMessage);\r\n } catch (err) {\r\n args[3](window.cadesplugin.getLastError(err) || err);\r\n }\r\n },\r\n certificate.subjectName,\r\n fileBase64Str,\r\n resolve,\r\n reject\r\n );\r\n });\r\n }\r\n async checkSign(\r\n signature: string,\r\n fileBase64Str?: string | undefined\r\n ): Promise<{ valid: boolean; error: string }> {\r\n const signatureAttributes = await this.getAttributesFromSignature(signature);\r\n const hashAlgo = getHashAlgoByOid(signatureAttributes.hashOid);\r\n const sRawSignature = toHexString(\r\n atob(signatureAttributes.signature)\r\n .split('')\r\n .map(x => x.charCodeAt(0))\r\n .reverse()\r\n ).toUpperCase();\r\n const sRawFileHash = toHexString(\r\n atob(signatureAttributes.hash)\r\n .split('')\r\n .map(x => x.charCodeAt(0))\r\n // .reverse()\r\n ).toUpperCase();\r\n\r\n return new Promise((resolve, reject) => {\r\n window.cadesplugin.async_spawn(\r\n function* (args) {\r\n try {\r\n // hash\r\n const oHashedData = yield window.cadesplugin.CreateObjectAsync('CAdESCOM.HashedData');\r\n yield oHashedData.propset_Algorithm(hashAlgo);\r\n yield oHashedData.propset_DataEncoding(window.cadesplugin.CADESCOM_BASE64_TO_BINARY);\r\n yield oHashedData.Hash(fileBase64Str);\r\n const hashValue = yield oHashedData.Value;\r\n if (hashValue !== sRawFileHash) {\r\n args[2]({ valid: false, error: '$UI_Signature_MessageDigestInvalid' });\r\n return;\r\n }\r\n\r\n // certificate\r\n const oCertificate = yield window.cadesplugin.CreateObjectAsync('CAdESCOM.Certificate');\r\n yield oCertificate.Import(signatureAttributes.certificate);\r\n\r\n // hash\r\n const oSignAttrsHashedData = yield window.cadesplugin.CreateObjectAsync(\r\n 'CAdESCOM.HashedData'\r\n );\r\n yield oSignAttrsHashedData.propset_Algorithm(hashAlgo);\r\n yield oSignAttrsHashedData.propset_DataEncoding(\r\n window.cadesplugin.CADESCOM_BASE64_TO_BINARY\r\n );\r\n yield oSignAttrsHashedData.Hash(signatureAttributes.signedAttributes);\r\n\r\n // verify\r\n const oRawSignature = yield window.cadesplugin.CreateObjectAsync(\r\n 'CAdESCOM.RawSignature'\r\n );\r\n yield oRawSignature.VerifyHash(oSignAttrsHashedData, oCertificate, sRawSignature);\r\n } catch (err) {\r\n try {\r\n // Возможно это подпись из эры до 3.4 - даем второй шанс\r\n let oSignedData = yield window.cadesplugin.CreateObjectAsync(\r\n 'CAdESCOM.CadesSignedData'\r\n );\r\n yield oSignedData.propset_ContentEncoding(\r\n window.cadesplugin.CADESCOM_BASE64_TO_BINARY\r\n );\r\n yield oSignedData.propset_Content(fileBase64Str);\r\n yield oSignedData.VerifyCades(signature, window.cadesplugin.CADESCOM_CADES_BES, true);\r\n } catch {\r\n args[2]({ valid: false, error: window.cadesplugin.getLastError(err) || err });\r\n return;\r\n }\r\n }\r\n\r\n args[2]({ valid: true });\r\n },\r\n signature,\r\n fileBase64Str,\r\n resolve,\r\n reject\r\n );\r\n });\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n cadesplugin: any;\r\n }\r\n}\r\n\r\nfunction getName(str: string | undefined) {\r\n return getParameter(str, 'CN');\r\n}\r\n\r\nfunction getOwner(str: string | undefined) {\r\n return getParameter(str, 'O');\r\n}\r\n\r\nfunction getParameter(str: string | undefined, marker: string) {\r\n if (!str) {\r\n return undefined;\r\n }\r\n\r\n const strArr = str.split(/=|, /);\r\n if (strArr.length === 1) {\r\n return undefined;\r\n }\r\n\r\n const snIndex = strArr.indexOf(marker);\r\n if (snIndex === -1 || snIndex === strArr.length) {\r\n return undefined;\r\n }\r\n\r\n return strArr[snIndex + 1];\r\n}\r\n\r\nconst getHashByPublicOid = (keyAlgo: string, encryptAndDigestList: EncryptAndDigest[]) => {\r\n const pair = encryptAndDigestList.find(x => x.encryptOid === keyAlgo);\r\n if (pair) {\r\n return pair.digestOid;\r\n } else {\r\n return encryptAndDigestList.find(x => !x.encryptOid)?.digestOid || '';\r\n }\r\n};\r\n\r\nconst getHashAlgoByOid = (hashOid: string) => {\r\n switch (hashOid) {\r\n case '1.2.643.2.2.9':\r\n return window.cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411;\r\n case '1.2.643.7.1.1.2.2':\r\n return window.cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256;\r\n case '1.2.643.7.1.1.4.1':\r\n return window.cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_256_HMAC;\r\n case '1.2.643.7.1.1.2.3':\r\n return window.cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512;\r\n case '1.2.643.7.1.1.4.2':\r\n return window.cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_2012_512_HMAC;\r\n case '1.2.643.2.2.10':\r\n return window.cadesplugin.CADESCOM_HASH_ALGORITHM_CP_GOST_3411_HMAC;\r\n case '1.2.840.113549.2.2':\r\n return window.cadesplugin.CADESCOM_HASH_ALGORITHM_MD2;\r\n case '1.2.840.113549.2.4':\r\n return window.cadesplugin.CADESCOM_HASH_ALGORITHM_MD4;\r\n case '1.2.840.113549.2.5':\r\n return window.cadesplugin.CADESCOM_HASH_ALGORITHM_MD5;\r\n case '2.16.840.1.101.3.4.2.1':\r\n return window.cadesplugin.CADESCOM_HASH_ALGORITHM_SHA_256;\r\n case '2.16.840.1.101.3.4.2.2':\r\n return window.cadesplugin.CADESCOM_HASH_ALGORITHM_SHA_384;\r\n case '2.16.840.1.101.3.4.2.3':\r\n return window.cadesplugin.CADESCOM_HASH_ALGORITHM_SHA_512;\r\n case '1.3.14.3.2.26':\r\n return window.cadesplugin.CADESCOM_HASH_ALGORITHM_SHA1;\r\n default:\r\n throw new Error(`Unsupported digest algorithm: (${hashOid})`);\r\n }\r\n};\r\n\r\nconst toByteArray = (hexString: string) => {\r\n var result: number[] = [];\r\n for (var i = 0; i < hexString.length; i += 2) {\r\n result.push(parseInt(hexString.substr(i, 2), 16));\r\n }\r\n return result;\r\n};\r\nconst toHexString = (byteArray: number[]) => {\r\n return Array.prototype.map\r\n .call(byteArray, function (byte) {\r\n return ('0' + (byte & 0xff).toString(16)).slice(-2);\r\n })\r\n .join('');\r\n};\r\n\r\nfunction arrayBufferToBase64(buffer) {\r\n var binary = '';\r\n var bytes = new Uint8Array(buffer);\r\n var len = bytes.byteLength;\r\n for (var i = 0; i < len; i++) {\r\n binary += String.fromCharCode(bytes[i]);\r\n }\r\n return window.btoa(binary);\r\n}\r\n","import { DependencyStorageRegistry } from 'tessa/platform';\r\nimport { ApplicationExtension } from 'tessa';\r\nimport { CryptoProEDSProvider } from './cryptoProEDSProvider';\r\n\r\nexport class EDSProviderInitializeExtension extends ApplicationExtension {\r\n public initialize() {\r\n DependencyStorageRegistry.instance.register(new CryptoProEDSProvider());\r\n }\r\n}\r\n","import { ICardStoreExtensionContext, CardStoreExtension } from 'tessa/cards/extensions';\r\nimport { CardRowState } from 'tessa/cards';\r\nimport {\r\n SignatureSettingsTypeName,\r\n SignatureSettingsCertificateSettingsSectionName,\r\n CertificateSettingsStartDateFieldName,\r\n CertificateSettingsEndDateFieldName,\r\n CertificateSettingsIsValidDateFieldName,\r\n CertificateSettingsCompanyFieldName,\r\n CertificateSettingsSubjectFieldName,\r\n CertificateSettingsIssuerFieldName\r\n} from './helpers';\r\n\r\nexport class SignatureSettingsStoreExtension extends CardStoreExtension {\r\n public beforeRequest(context: ICardStoreExtensionContext) {\r\n if (context.cardType?.name === SignatureSettingsTypeName) {\r\n for (let row of context?.request.card?.sections?.get(\r\n SignatureSettingsCertificateSettingsSectionName\r\n )?.rows || []) {\r\n if (\r\n !row.get(CertificateSettingsStartDateFieldName) &&\r\n !row.get(CertificateSettingsEndDateFieldName) &&\r\n !row.get(CertificateSettingsIsValidDateFieldName) &&\r\n !row.get(CertificateSettingsCompanyFieldName) &&\r\n !row.get(CertificateSettingsSubjectFieldName) &&\r\n !row.get(CertificateSettingsIssuerFieldName)\r\n ) {\r\n row.state = CardRowState.Deleted;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","export const SignatureSettingsTypeName = 'SignatureSettings';\r\nexport const SignatureSettingsCertificateSettingsSectionName = 'SignatureCertificateSettings';\r\n\r\nexport const SignatureSettingsEncryptionAlgorithmIDName = 'EncryptionAlgorithmID';\r\nexport const SignatureSettingsEncryptionAlgorithmOIDName = 'EncryptionAlgorithmOID';\r\nexport const SignatureSettingsDigestAlgorithmsIDName = 'DigestAlgorithmID';\r\nexport const SignatureSettingsDigestAlgorithmsNameName = 'DigestAlgorithmName';\r\nexport const SignatureSettingsDigestAlgorithmsOIDName = 'DigestAlgorithmOID';\r\n\r\nexport const CertificateSettingsStartDateFieldName = 'StartDate';\r\nexport const CertificateSettingsEndDateFieldName = 'EndDate';\r\nexport const CertificateSettingsIsValidDateFieldName = 'IsValidDate';\r\nexport const CertificateSettingsCompanyFieldName = 'Company';\r\nexport const CertificateSettingsSubjectFieldName = 'Subject';\r\nexport const CertificateSettingsIssuerFieldName = 'Issuer';\r\nexport const SignatureSettingsEncryptionDigestControlName = 'EncryptionDigest';\r\n","import { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { GridViewModel } from 'tessa/ui/cards/controls';\r\nimport {\r\n SignatureSettingsTypeName,\r\n SignatureSettingsEncryptionDigestControlName,\r\n SignatureSettingsDigestAlgorithmsIDName,\r\n SignatureSettingsEncryptionAlgorithmIDName,\r\n SignatureSettingsDigestAlgorithmsOIDName,\r\n SignatureSettingsDigestAlgorithmsNameName\r\n} from './helpers';\r\n\r\nexport class SignatureSettingsUIExtension extends CardUIExtension {\r\n public initialized(context: ICardUIExtensionContext) {\r\n if (context.card.typeName !== SignatureSettingsTypeName) {\r\n return;\r\n }\r\n\r\n const tableControl = context.model.controls.get(\r\n SignatureSettingsEncryptionDigestControlName\r\n ) as GridViewModel;\r\n if (!tableControl) {\r\n return;\r\n }\r\n\r\n tableControl.rowInitializing.add(e => {\r\n const control = e.rowModel?.controls.get(DigestControl);\r\n if (control) {\r\n control.isReadOnly = e.row.getField(SignatureSettingsDigestAlgorithmsIDName) == null;\r\n }\r\n e.row.fieldChanged.add(event => {\r\n if (event.fieldName === SignatureSettingsEncryptionAlgorithmIDName) {\r\n e.row.set(SignatureSettingsDigestAlgorithmsIDName, null);\r\n e.row.set(SignatureSettingsDigestAlgorithmsNameName, null);\r\n e.row.set(SignatureSettingsDigestAlgorithmsOIDName, null);\r\n if (control) {\r\n control.isReadOnly = event.fieldValue == null;\r\n }\r\n }\r\n });\r\n });\r\n }\r\n}\r\n\r\nconst DigestControl = 'DigestAlgorithm';\r\n","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { EDSProviderInitializeExtension } from './edsProviderInitializeExtension';\r\nimport { SignatureSettingsStoreExtension } from './signatureSettingsStoreExtension';\r\nimport { SignatureSettingsUIExtension } from './signatureSettingsUIExtension';\r\n\r\nExtensionContainer.instance.registerExtension({\r\n extension: EDSProviderInitializeExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\n\r\nExtensionContainer.instance.registerExtension({\r\n extension: SignatureSettingsStoreExtension,\r\n stage: ExtensionStage.BeforePlatform,\r\n singleton: true\r\n});\r\n\r\nExtensionContainer.instance.registerExtension({\r\n extension: SignatureSettingsUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\n","import { TessaFile, FileCategory, FileType, IFileSource, FilePermissionsSealed, IFile } from 'tessa/files';\r\n\r\nexport class ExternalFile extends TessaFile {\r\n\r\n constructor(\r\n id: guid,\r\n name: string,\r\n category: FileCategory | null,\r\n type: FileType,\r\n source: IFileSource,\r\n permissions: FilePermissionsSealed | null,\r\n isLocal: boolean = true,\r\n origin: IFile | null = null,\r\n description: string = ''\r\n ) {\r\n super(\r\n id,\r\n name,\r\n category,\r\n type,\r\n source,\r\n permissions,\r\n isLocal,\r\n origin\r\n );\r\n\r\n this.description = description;\r\n }\r\n\r\n public description: string;\r\n\r\n}","import { ExternalFile } from './externalFile';\r\nimport { FileExtension, IFileExtensionContext } from 'tessa/ui/files';\r\nimport { UIContext } from 'tessa/ui';\r\nimport { ICardModel } from 'tessa/ui/cards';\r\n\r\nexport class ExternalFileExtension extends FileExtension {\r\n\r\n public openingMenu(context: IFileExtensionContext) {\r\n // Проверяем тип карточки\r\n const editor = UIContext.current.cardEditor;\r\n let model: ICardModel;\r\n if (editor == null\r\n || !(model = editor.cardModel!)\r\n || model.cardType.name !== 'Car'\r\n ) {\r\n return;\r\n }\r\n\r\n // Отключаем пункт \"Копировать ссылку\"\r\n const copyLinkAction = context.actions.find(p => p.name === 'CopyLink');\r\n if (context.file.model instanceof ExternalFile\r\n && copyLinkAction\r\n ) {\r\n copyLinkAction.isCollapsed = true;\r\n }\r\n }\r\n\r\n}","import { ExternalFile } from './externalFile';\r\nimport { FileGrouping, FileViewModel, GroupInfo } from 'tessa/ui/cards/controls';\r\n\r\nexport class FileSourceGrouping extends FileGrouping {\r\n\r\n public readonly cardSourceGroupName = 'CardSourceGroup';\r\n public readonly externalSourceGroupName = 'ExternalSourceGroup';\r\n\r\n public getGroupInfo(file: FileViewModel): GroupInfo {\r\n const isExternal = file.model instanceof ExternalFile;\r\n\r\n if (isExternal) {\r\n return {\r\n groupId: this.externalSourceGroupName,\r\n groupCaption: '$KrTest_ExternalFilesGroup',\r\n order: -1\r\n };\r\n } else {\r\n return {\r\n groupId: this.cardSourceGroupName,\r\n groupCaption: '$KrTest_MainFilesGroup'\r\n };\r\n }\r\n }\r\n\r\n public clone(): FileSourceGrouping {\r\n return new FileSourceGrouping(\r\n this.name,\r\n this.caption,\r\n this.isCollapsed\r\n );\r\n }\r\n\r\n}","import { ExternalFile } from './externalFile';\r\nimport { FileCreationToken, IFile } from 'tessa/files';\r\n\r\nexport class ExternalFileCreationToken extends FileCreationToken {\r\n\r\n public description: string;\r\n\r\n public set(file: IFile) {\r\n super.set(file);\r\n\r\n this.description = (file instanceof ExternalFile) ? file.description : '';\r\n }\r\n\r\n}","import { saveAs } from 'file-saver';\r\nimport { ExternalFileCreationToken } from './externalFileCreationToken';\r\nimport { ExternalFile } from './externalFile';\r\nimport { FileSource, IFileCreationToken, IFile, IFileVersion, FileVersion } from 'tessa/files';\r\nimport { Guid, Result } from 'tessa/platform';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { ValidationResult, ValidationResultBuilder, ValidationResultType } from 'tessa/platform/validation';\r\n\r\nexport class ExternalFileSource extends FileSource {\r\n\r\n protected createFileCore(token: IFileCreationToken): IFile {\r\n // здесь возможно исключение, связанное с параметрами метода\r\n if (!(token instanceof ExternalFileCreationToken)) {\r\n throw new Error('Unexpected token type.');\r\n }\r\n\r\n // все свойства токена проверяются в конструкторе\r\n return new ExternalFile(\r\n token.id || Guid.newGuid(),\r\n token.name,\r\n token.category,\r\n token.type,\r\n this,\r\n token.permissions.clone(),\r\n token.isLocal,\r\n null,\r\n token.description\r\n );\r\n }\r\n\r\n protected getFileCreationTokenCore(): IFileCreationToken {\r\n return new ExternalFileCreationToken();\r\n }\r\n\r\n protected async getContentCore(\r\n fileOrFileVersion: IFile | IFileVersion,\r\n _info?: IStorage\r\n ): Promise> {\r\n const file = fileOrFileVersion instanceof FileVersion\r\n ? fileOrFileVersion.file\r\n : fileOrFileVersion;\r\n\r\n\r\n const builder = new ValidationResultBuilder();\r\n if (!(file instanceof ExternalFile)) {\r\n builder.add(ValidationResult.fromText('Unexpected file type.', ValidationResultType.Error));\r\n }\r\n\r\n return {\r\n data: new File([(file as ExternalFile).description], fileOrFileVersion.name),\r\n validationResult: builder.build()\r\n };\r\n }\r\n\r\n protected async saveContentCore(\r\n fileOrFileVersion: IFile | IFileVersion,\r\n info?: IStorage\r\n ): Promise> {\r\n const result = await this.getContentCore(fileOrFileVersion, info);\r\n if (!result.data) {\r\n return {\r\n data: false,\r\n validationResult: result.validationResult\r\n };\r\n }\r\n\r\n await saveAs(result.data, fileOrFileVersion.name);\r\n\r\n return {\r\n data: true,\r\n validationResult: result.validationResult\r\n };\r\n }\r\n\r\n}","import { ExternalFile } from './externalFile';\r\nimport { FileSourceGrouping } from './fileSourceGrouping';\r\nimport { ExternalFileSource } from './externalFileSource';\r\nimport { ExternalFileCreationToken } from './externalFileCreationToken';\r\nimport { FileControlExtension, IFileControlExtensionContext } from 'tessa/ui/files';\r\nimport { ICardModel } from 'tessa/ui/cards';\r\nimport { UIContext, MenuAction, IUIContext } from 'tessa/ui';\r\nimport { Guid } from 'tessa/platform';\r\nimport { userSession } from 'common/utility';\r\nimport { CardFileType } from 'tessa/cards';\r\nimport { IFile, FileVersionState } from 'tessa/files';\r\n\r\nexport class ExternalFilesFileControlExtension extends FileControlExtension {\r\n\r\n public openingMenu(context: IFileControlExtensionContext) {\r\n const editor = UIContext.current.cardEditor;\r\n let model: ICardModel;\r\n if (editor == null\r\n || !(model = editor.cardModel!)\r\n || model.cardType.name !== 'Car'\r\n || model.inSpecialMode\r\n ) {\r\n return;\r\n }\r\n\r\n const isContainsExternalFiles = context.control.files.some(p => p.model instanceof ExternalFile);\r\n\r\n // Добавляем группировку/фильтр\r\n if (context.groupings.find(p => p.name === 'Source') == null && isContainsExternalFiles) {\r\n context.groupings.push(new FileSourceGrouping('Source', '$KrTest_GroupingBySource'));\r\n }\r\n\r\n // Добавляем пункт меню для получения файлов\r\n context.actions.splice(\r\n 0, 0,\r\n new MenuAction(\r\n 'GetExternalFiles',\r\n '$KrTest_ExternalSourceFiles',\r\n 'icon-thin-427',\r\n async () => {\r\n if (!isContainsExternalFiles) {\r\n // Устанавливаем группировку\r\n context.control.selectedGrouping = new FileSourceGrouping('Source', '$KrTest_GroupingBySource');\r\n\r\n // Считываем имена и содержимое\r\n const filesNamesContents = [\r\n ['File1.txt', 'File1_text.txt'],\r\n ['File2.txt', 'File2_text.txt'],\r\n ['File3.txt', 'File3_text.txt']\r\n ];\r\n\r\n for (let file of filesNamesContents) {\r\n this.addFile(context, file[0], file[1], model.executeInContext);\r\n }\r\n } else {\r\n // Сбрасываем группировку\r\n context.control.selectedGrouping = null;\r\n\r\n // Убираем внешние файлы\r\n const removeFiles = context.control.files.filter(p => p.model instanceof ExternalFile);\r\n for (let f of removeFiles) {\r\n await context.control.fileContainer.removeFile(f.model, false);\r\n }\r\n }\r\n },\r\n null,\r\n false,\r\n isContainsExternalFiles\r\n )\r\n );\r\n }\r\n\r\n private async addFile(\r\n context: IFileControlExtensionContext,\r\n name: string,\r\n content: string,\r\n executor: (action: (context: IUIContext) => void) => void\r\n ): Promise {\r\n const fileSource = new ExternalFileSource(userSession, executor);\r\n const fileToken = fileSource.getFileCreationToken();\r\n\r\n fileToken.id = Guid.newGuid();\r\n fileToken.name = name;\r\n fileToken.type = new CardFileType('ExternalFile', '$KrTest_ExternalFileType', null);\r\n (fileToken as ExternalFileCreationToken).description = content;\r\n\r\n const file = fileSource.createFile(fileToken);\r\n this.addVersion(name, Guid.newGuid(), 1, file);\r\n\r\n file.versionsAreComprehensive = true;\r\n\r\n await context.control.fileContainer.addFile(file, false, false);\r\n }\r\n\r\n private addVersion(\r\n name: string,\r\n id: guid,\r\n num: number,\r\n file: IFile\r\n ) {\r\n const versionToken = file.source.getVersionCreationToken();\r\n\r\n versionToken.id = id;\r\n versionToken.name = name;\r\n versionToken.number = num;\r\n versionToken.state = FileVersionState.Success;\r\n\r\n const version = file.source.createFileVersion(versionToken, file, null);\r\n file.versions.push(version);\r\n }\r\n\r\n}","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { ExternalFileExtension } from './externalFileExtension';\r\nimport { ExternalFilesFileControlExtension } from './externalFilesFileControlExtension';\r\n\r\nExtensionContainer.instance.registerExtension({\r\n extension: ExternalFileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: ExternalFilesFileControlExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\n","import {\r\n CardGetFileContentExtension,\r\n ICardGetFileContentExtensionContext\r\n} from 'tessa/cards/extensions';\r\nimport { UIContext } from 'tessa/ui';\r\nimport { ICardModel } from 'tessa/ui/cards';\r\nimport { KrToken } from 'tessa/workflow';\r\n\r\nexport class ClientKrPermissionsGetFileContentExtension extends CardGetFileContentExtension {\r\n public beforeRequest(context: ICardGetFileContentExtensionContext) {\r\n const editor = UIContext.current.cardEditor;\r\n let model: ICardModel;\r\n let token: KrToken;\r\n\r\n if (\r\n editor &&\r\n (model = editor.cardModel!) &&\r\n (token = KrToken.tryGet(model.card.info)!) &&\r\n context.request.versionRowId !== '36a03878-57b6-2263-2e3a-9ae659032132' && // ReplacePlaceholdersVersionRowID\r\n model.card.id === context.request.cardId\r\n ) {\r\n token.setInfo(context.request.info);\r\n }\r\n }\r\n}\r\n","import { CardGetFileVersionsExtension, ICardGetFileVersionsExtensionContext } from 'tessa/cards/extensions';\r\nimport { UIContext } from 'tessa/ui';\r\nimport { ICardModel } from 'tessa/ui/cards';\r\nimport { KrToken } from 'tessa/workflow';\r\n\r\nexport class ClientKrPermissionsGetFileVersionsExtension extends CardGetFileVersionsExtension {\r\n\r\n public beforeRequest(context: ICardGetFileVersionsExtensionContext) {\r\n const editor = UIContext.current.cardEditor;\r\n let model: ICardModel;\r\n let token: KrToken;\r\n\r\n if (editor\r\n && (model = editor.cardModel!)\r\n && (token = KrToken.tryGet(model.card.info)!)\r\n ) {\r\n token.setInfo(context.request.info);\r\n }\r\n }\r\n\r\n}","import { FileExtension, IFileExtensionContext, IFileControl } from 'tessa/ui/files';\r\nimport { UIContext, SeparatorMenuAction, MenuAction, showNotEmpty } from 'tessa/ui';\r\nimport { IFile, checkCanDownloadFilesAndShowMessages, FileCategory, FilePermissions } from 'tessa/files';\r\nimport { ValidationResultBuilder } from 'tessa/platform/validation';\r\nimport { unseal, createTypedField, DotNetType } from 'tessa/platform';\r\nimport { FileViewModel } from 'tessa/ui/cards/controls';\r\n\r\nexport class WfCardFileExtension extends FileExtension {\r\n\r\n public openingMenu(context: IFileExtensionContext) {\r\n const editor = UIContext.current.cardEditor;\r\n if (!editor\r\n || !editor.cardModel\r\n || editor.cardModel.cardType.id !== 'de75a343-8164-472d-a20e-4937819760ac' // WfTaskCardTypeID\r\n ) {\r\n return;\r\n }\r\n\r\n const control = context.control;\r\n const files = context.files;\r\n\r\n const canCopyToMainCard = files.some(x => !x.model.category\r\n || x.model.category.id !== 'ef065661-6613-4c87-bf93-0e1dd558a751'); // MainCardCategoryID\r\n\r\n let index = 0;\r\n const downloadIndex = context.actions.findIndex(x => x.name === 'Download');\r\n if (downloadIndex > -1) {\r\n index = downloadIndex + 1;\r\n }\r\n\r\n context.actions.splice(index, 0,\r\n new SeparatorMenuAction(!canCopyToMainCard),\r\n new MenuAction(\r\n 'CopyFromTaskToMainCard',\r\n '$WfResolution_CopyFileFromTaskToMainCard',\r\n 'ta icon-thin-119',\r\n () => WfCardFileExtension.createCopyInMainCard(control, files),\r\n null,\r\n !canCopyToMainCard\r\n )\r\n );\r\n }\r\n\r\n private static async createCopyInMainCard(control: IFileControl, files: ReadonlyArray) {\r\n const operationFiles = files.map(x => x.model);\r\n if (! await checkCanDownloadFilesAndShowMessages(operationFiles)) {\r\n return;\r\n }\r\n\r\n const copiedFileList: [IFile, IFile][] = []\r\n const totalResult = new ValidationResultBuilder();\r\n for (let fileVM of files) {\r\n const file = fileVM.model;\r\n if (!file.category || file.category.id !== 'ef065661-6613-4c87-bf93-0e1dd558a751') { // MainCardCategoryID\r\n try {\r\n fileVM.isLoading = true;\r\n // TODO: не загружать контент, если не нужно.\r\n // сейчас не работает из-за расширений на сервере TaskSatelliteStoreExtension.ExtendedRepositoryWithoutTransaction\r\n\r\n // если контент уже загружен, то делаем обычное копирование\r\n // в противном случае используем externalSource\r\n // const hasContent = !!file.lastVersion.content;\r\n const contentResult = await file.ensureContentLoaded();\r\n if (!contentResult.isSuccessful) {\r\n fileVM.isLoading = false;\r\n totalResult.add(contentResult);\r\n return;\r\n }\r\n\r\n // const result = file.copy(!hasContent);\r\n const result = file.copy();\r\n totalResult.add(result.validationResult);\r\n\r\n if (!result.validationResult.isSuccessful) {\r\n break;\r\n }\r\n\r\n const copiedFile = result.data!;\r\n // мы создаём копию, но не сохраняем ссылку на файл, из которого он был скопирован\r\n copiedFile.origin = null;\r\n copiedFile.category = new FileCategory('ef065661-6613-4c87-bf93-0e1dd558a751', '$WfResolution_MainCardFileCategory');\r\n unseal(copiedFile.permissions).canModifyCategory = false;\r\n copiedFile.info['CopiedToMainCard'] = createTypedField(true, DotNetType.Boolean);\r\n copiedFileList.push([copiedFile, file]);\r\n } finally {\r\n fileVM.isLoading = false;\r\n }\r\n }\r\n }\r\n\r\n const result = totalResult.build();\r\n await showNotEmpty(result);\r\n\r\n if (result.isSuccessful) {\r\n for (let files of copiedFileList) {\r\n const newFile = files[0];\r\n // const sourceFile = files[1];\r\n await control.fileContainer.addFile(newFile);\r\n\r\n // const hasContent = !!newFile.lastVersion.content;\r\n // if (!hasContent) {\r\n // newFile.setExternalContent(sourceFile.lastVersion);\r\n // }\r\n }\r\n }\r\n }\r\n\r\n}","export enum CycleFilesMode {\r\n ShowAllCycleFiles,\r\n ShowCurrentCycleFilesOnly,\r\n ShowCurrentAndLastCycleFilesOnly\r\n}\r\n","import { FileGrouping, FileViewModel, GroupInfo } from 'tessa/ui/cards/controls';\r\nimport { tryGetFromInfo } from 'tessa/ui';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { formatToString, formatDate } from 'tessa/platform';\r\nimport { FileCategory } from 'tessa/files';\r\n\r\n// tslint:disable: triple-equals\r\n\r\nexport class CycleGrouping extends FileGrouping {\r\n //#region ctor\r\n\r\n constructor(name: string, caption: string, isCollapsed: boolean = false) {\r\n super(name, caption, isCollapsed);\r\n }\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n public getGroupInfo(file: FileViewModel): GroupInfo {\r\n const cycleNumber = tryGetFromInfo(file.model.info, 'KrCycleID');\r\n const cycleOrder = tryGetFromInfo(file.model.info, 'KrCycleorder');\r\n const maxCyclewNumber = tryGetFromInfo(file.model.info, 'KrMaxCycleNumber');\r\n if (cycleNumber != undefined && cycleOrder != undefined && maxCyclewNumber != undefined) {\r\n return {\r\n groupId: `CycleGroup${cycleNumber}`,\r\n groupCaption: LocalizationManager.instance.format(\r\n '$UI_Controls_FilesControl_CycleGroup',\r\n cycleNumber\r\n ),\r\n order: cycleOrder + 1\r\n };\r\n }\r\n\r\n return {\r\n groupId: 'DocumentsOnApprovalGroup',\r\n groupCaption: LocalizationManager.instance.localize(\r\n '$UI_Controls_FilesControl_DocumentsOnApprovalGroup'\r\n ),\r\n order: 0\r\n };\r\n }\r\n\r\n public clone(): CycleGrouping {\r\n return new CycleGrouping(this.name, this.caption, this.isCollapsed);\r\n }\r\n\r\n public attach(file: FileViewModel) {\r\n super.attach(file);\r\n file.captionDelegate.set(CycleGrouping.getCaption);\r\n }\r\n\r\n public detach(file: FileViewModel) {\r\n super.detach(file);\r\n const restoredDelegate = file.captionDelegate.restore();\r\n if (restoredDelegate !== CycleGrouping.getCaption) {\r\n throw new Error('FileViewModel.captionDelegate stack is damaged.');\r\n }\r\n }\r\n\r\n private static getCaption(viewModel: FileViewModel): string {\r\n const file = viewModel.model;\r\n const origin = file.origin;\r\n const category = file.category;\r\n\r\n if (\r\n !origin &&\r\n category &&\r\n viewModel.collection.some(\r\n x => x.model.category && FileCategory.equals(x.model.category, category)\r\n )\r\n ) {\r\n return LocalizationManager.instance.format(\r\n '$UI_Controls_FilesControl_Category',\r\n file.name,\r\n category.caption\r\n );\r\n }\r\n\r\n const cycle = tryGetFromInfo(file.info, 'KrCycleID');\r\n const createdByName = tryGetFromInfo(file.info, 'KrCreatedByName');\r\n const created = tryGetFromInfo(file.info, 'KrCreated');\r\n\r\n if (!origin && cycle != undefined && createdByName != undefined && created != undefined) {\r\n return LocalizationManager.instance.format(\r\n '$UI_Controls_FilesControl_Version',\r\n file.name,\r\n file.lastVersion.number,\r\n createdByName\r\n );\r\n }\r\n\r\n if (origin) {\r\n const format = LocalizationManager.instance.localize(\r\n '$UI_Controls_FilesControl_ByCopy_Format'\r\n );\r\n const copy = LocalizationManager.instance.localize('$UI_Controls_FilesControl_ByCopy_Copy');\r\n return formatToString(\r\n format,\r\n file.name,\r\n copy,\r\n file.lastVersion.createdByName,\r\n formatDate(file.lastVersion.created)\r\n );\r\n }\r\n\r\n return file.name;\r\n }\r\n\r\n //#endregion\r\n}\r\n","import { IFileControl } from 'tessa/ui/files';\r\nimport { CycleFilesMode } from './cycleFilesMode';\r\nimport { tryGetFromInfo } from 'tessa/ui';\r\nimport { Card } from 'tessa/cards';\r\nimport { IStorage } from 'tessa/platform/storage';\r\n\r\n// tslint:disable: triple-equals\r\n\r\nexport function switchFilesVisibility(\r\n control: IFileControl,\r\n currentCycle: number | null,\r\n mode: CycleFilesMode\r\n) {\r\n switch (mode) {\r\n case CycleFilesMode.ShowAllCycleFiles:\r\n returnAllFiles(control);\r\n break;\r\n\r\n case CycleFilesMode.ShowCurrentCycleFilesOnly:\r\n if (currentCycle != undefined) {\r\n // Добавить в контейнер все файлы относящиеся к последнему циклу\r\n for (let containerFile of control.fileContainer.files) {\r\n const cycle = tryGetFromInfo(containerFile.info, 'KrCycleID');\r\n if (\r\n cycle != undefined &&\r\n cycle === currentCycle &&\r\n control.files.every(x => x.id !== containerFile.id)\r\n ) {\r\n control.addFile(containerFile);\r\n }\r\n }\r\n // Удалить все файлы, что не относятся к последнему циклу\r\n for (let i = control.files.length - 1; i > -1; i--) {\r\n const file = control.files[i];\r\n const cycle = tryGetFromInfo(file.model.info, 'KrCycleID');\r\n if (cycle != undefined && cycle !== currentCycle) {\r\n control.removeFile(file);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case CycleFilesMode.ShowCurrentAndLastCycleFilesOnly:\r\n if (currentCycle != undefined) {\r\n // Добавить в контейнер все файлы, относящиеся к последнему и предпоследнему циклу\r\n for (let containerFile of control.fileContainer.files) {\r\n const cycle = tryGetFromInfo(containerFile.info, 'KrCycleID');\r\n if (\r\n !containerFile.origin &&\r\n cycle != undefined &&\r\n (cycle === currentCycle || (currentCycle > 1 && cycle === currentCycle - 1)) &&\r\n control.files.every(x => x.id !== containerFile.id)\r\n ) {\r\n control.addFile(containerFile);\r\n }\r\n }\r\n // Удалить все файлы, что не относятся к последнему и предпоследнему циклу\r\n for (let i = control.files.length - 1; i > -1; i--) {\r\n const file = control.files[i];\r\n const cycle = tryGetFromInfo(file.model.info, 'KrCycleID');\r\n if (\r\n cycle != undefined &&\r\n cycle !== currentCycle &&\r\n currentCycle > 1 &&\r\n cycle !== currentCycle - 1\r\n ) {\r\n control.removeFile(file);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n}\r\n\r\nexport function modifyFileList(\r\n control: IFileControl,\r\n card: Card,\r\n currentMode: CycleFilesMode,\r\n mode: CycleFilesMode\r\n) {\r\n // Какой сейчас последний цикл?\r\n const historySection = card.sections.get('KrApprovalHistoryVirtual');\r\n const currentCycle = historySection\r\n ? Math.max(...historySection.rows.map(x => x.get('Cycle')))\r\n : null;\r\n\r\n if (\r\n currentMode !== CycleFilesMode.ShowAllCycleFiles &&\r\n mode !== CycleFilesMode.ShowAllCycleFiles\r\n ) {\r\n // Добавить все файлы назад\r\n returnAllFiles(control);\r\n }\r\n\r\n switch (mode) {\r\n case CycleFilesMode.ShowAllCycleFiles:\r\n // Добавить все файлы назад\r\n returnAllFiles(control);\r\n break;\r\n\r\n case CycleFilesMode.ShowCurrentCycleFilesOnly:\r\n if (currentCycle != undefined) {\r\n // Удалить все файлы, что не относятся к последнему циклу\r\n for (let i = control.files.length - 1; i > -1; i--) {\r\n const file = control.files[i];\r\n const cycle = tryGetFromInfo(file.model.info, 'KrCycleID');\r\n if (cycle != undefined && cycle !== currentCycle) {\r\n control.removeFile(file);\r\n }\r\n }\r\n }\r\n break;\r\n\r\n case CycleFilesMode.ShowCurrentAndLastCycleFilesOnly:\r\n if (currentCycle != undefined) {\r\n // Удалить все файлы, что не относятся к последнему и предпоследнему циклу\r\n for (let i = control.files.length - 1; i > -1; i--) {\r\n const file = control.files[i];\r\n const cycle = tryGetFromInfo(file.model.info, 'KrCycleID');\r\n if (\r\n cycle != undefined &&\r\n cycle !== currentCycle &&\r\n currentCycle > 1 && cycle !== currentCycle - 1\r\n ) {\r\n control.removeFile(file);\r\n }\r\n }\r\n }\r\n break;\r\n }\r\n\r\n control.model.executeInContext(context => {\r\n // Записываем в инфо UIContext`а, только если есть имя (алиас) контрола\r\n if (control.name) {\r\n const controlsModes = tryGetFromInfo(context.info, 'CycleGroupingMode') || {};\r\n\r\n if (!('CycleGroupingMode' in context.info)) {\r\n context.info['CycleGroupingMode'] = controlsModes;\r\n }\r\n\r\n controlsModes[control.name] = mode;\r\n }\r\n\r\n // так же запишем в инфо контрола, чтобы работало локальное сохранение, до обновления краточки\r\n // даже если у контролла нет алиаса\r\n control.info['CycleGroupingMode'] = mode;\r\n });\r\n}\r\n\r\nexport function restoreFilesList(control: IFileControl) {\r\n // Удалим виртуальные файлы \"Версий\"\r\n for (let i = control.files.length - 1; i > -1; i--) {\r\n const file = control.files[i];\r\n const cycle = tryGetFromInfo(file.model.info, 'KrCycleID');\r\n if (!file.model.origin && cycle != undefined) {\r\n control.removeFile(file);\r\n }\r\n }\r\n // Вернём все \"копии\"\r\n for (let containerFile of control.fileContainer.files) {\r\n const cycle = tryGetFromInfo(containerFile.info, 'KrCycleID');\r\n if (\r\n !!containerFile.origin &&\r\n cycle != undefined &&\r\n control.files.every(x => x.id !== containerFile.id)\r\n ) {\r\n control.addFile(containerFile);\r\n }\r\n }\r\n}\r\n\r\nfunction returnAllFiles(control: IFileControl) {\r\n for (let containerFile of control.fileContainer.files) {\r\n const cycle = tryGetFromInfo(containerFile.info, 'KrCycleID');\r\n if (cycle != undefined && control.files.every(x => x.id !== containerFile.id)) {\r\n control.addFile(containerFile);\r\n }\r\n }\r\n}\r\n","import { reaction } from 'mobx';\r\nimport { CycleGrouping } from './cycleGrouping';\r\nimport { CycleFilesMode } from './cycleFilesMode';\r\nimport { switchFilesVisibility, restoreFilesList } from './cycleGroupingUIHelper';\r\nimport { FileControlExtension, IFileControlExtensionContext } from 'tessa/ui/files';\r\nimport { ICardModel } from 'tessa/ui/cards';\r\nimport { getKrComponentsByCard, KrTypesCache, KrComponents } from 'tessa/workflow';\r\nimport { hasNotFlag, createTypedField, DotNetType } from 'tessa/platform';\r\nimport { tryGetFromInfo, UIContext } from 'tessa/ui';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { CardSingletonCache } from 'tessa/cards';\r\n\r\n// tslint:disable: triple-equals\r\n\r\n/**\r\n * Управляет появлением виртуальных файлов \"версий\" при включении и выключении группировки по циклам согласования\r\n */\r\nexport class KrAddCycleGroupingFileControlExtension extends FileControlExtension {\r\n private _dispose: Function[] = [];\r\n\r\n public initialized(context: IFileControlExtensionContext) {\r\n const model = context.info['.cardModel'] as ICardModel;\r\n if (!model || model.inSpecialMode) {\r\n return;\r\n }\r\n\r\n const card = model.card;\r\n if (\r\n !card ||\r\n hasNotFlag(getKrComponentsByCard(card, KrTypesCache.instance), KrComponents.Routes)\r\n ) {\r\n return;\r\n }\r\n\r\n let cycleGrouping = context.groupings.find(p => p.name === 'Cycle');\r\n\r\n // Добавляем группировку/фильтр\r\n if (!cycleGrouping) {\r\n cycleGrouping = new CycleGrouping('Cycle', '$UI_Controls_FilesControl_GroupingByCycle');\r\n context.groupings.push(cycleGrouping);\r\n }\r\n\r\n // Если по умолчанию не выбрана группировка по циклу согласования, то надо убрать виртуальные файлы версий.\r\n if (!(context.control.selectedGrouping instanceof CycleGrouping)) {\r\n for (let i = context.control.files.length - 1; i > -1; i--) {\r\n const file = context.control.files[i];\r\n if (!file.model.origin && tryGetFromInfo(file.model.info, 'KrCycleID') != undefined) {\r\n context.control.removeFile(file);\r\n }\r\n }\r\n }\r\n\r\n const sections = card.tryGetSections();\r\n if (!sections) {\r\n return;\r\n }\r\n\r\n const commonInfo = sections.tryGet('KrApprovalCommonInfoVirtual');\r\n const state: number | null = commonInfo ? commonInfo.fields.tryGet('StateID') : null;\r\n\r\n let currentCycle: number | null = null;\r\n const approvalHistory = sections.tryGet('KrApprovalHistoryVirtual');\r\n if (approvalHistory) {\r\n const rows = approvalHistory.tryGetRows();\r\n if (rows && rows.length > 0) {\r\n currentCycle = Math.max(...rows.map(x => x.tryGet('Cycle', 0)));\r\n }\r\n }\r\n\r\n this._dispose.push(\r\n context.control.containerFileAdded.addWithDispose(e => {\r\n if (\r\n state != undefined &&\r\n state !== 0 && // KrState.Draft\r\n !!e.file.origin &&\r\n currentCycle != undefined &&\r\n currentCycle > 0\r\n ) {\r\n e.file.info['KrCycleID'] = createTypedField(currentCycle, DotNetType.Int32);\r\n }\r\n })!\r\n );\r\n\r\n this._dispose.push(\r\n reaction(\r\n () => context.control.selectedGrouping,\r\n grouping => {\r\n if (grouping instanceof CycleGrouping) {\r\n const currentMode = tryGetFromInfo(\r\n context.control.info,\r\n 'CycleGroupingMode'\r\n );\r\n switchFilesVisibility(\r\n context.control,\r\n currentCycle,\r\n currentMode == undefined ? CycleFilesMode.ShowAllCycleFiles : currentMode\r\n );\r\n } else {\r\n restoreFilesList(context.control);\r\n }\r\n }\r\n )\r\n );\r\n\r\n let currentCycleMode: CycleFilesMode | null = null;\r\n let modeFromContext: CycleFilesMode = CycleFilesMode.ShowAllCycleFiles;\r\n const cardEditor = UIContext.current.cardEditor;\r\n const groupingModeFromInfo = tryGetFromInfo(\r\n UIContext.current.info,\r\n 'CycleGroupingMode'\r\n );\r\n\r\n if (\r\n context.control.name &&\r\n cardEditor &&\r\n cardEditor.cardModel &&\r\n card.id === cardEditor.cardModel.card.id &&\r\n groupingModeFromInfo &&\r\n context.control.name in groupingModeFromInfo\r\n ) {\r\n modeFromContext = groupingModeFromInfo[context.control.name];\r\n currentCycleMode = modeFromContext;\r\n }\r\n\r\n if (currentCycleMode == undefined) {\r\n const cardModelInfo = model.info;\r\n const mode = tryGetFromInfo(cardModelInfo, 'CycleGroupingMode');\r\n if (mode == undefined) {\r\n const settings = CardSingletonCache.instance.cards.get('KrSettings')!;\r\n\r\n // Проверим, что тип карточки/документа включён в настройки\r\n // Читеем тип карточки/документа ровно один раз\r\n let docCardTypeId: guid | undefined = undefined;\r\n const dciSection = card.sections.tryGet('DocumentCommonInfo');\r\n if (dciSection) {\r\n docCardTypeId = dciSection.fields.tryGet('DocTypeID');\r\n }\r\n if (docCardTypeId == undefined) {\r\n docCardTypeId = card.typeId;\r\n }\r\n\r\n let settingsRowId: guid | undefined = undefined;\r\n if (\r\n state != undefined &&\r\n settings.sections.get('KrSettingsCycleGrouping')!.rows.some(x => {\r\n const typeId = x.get('TypeID');\r\n if (typeId === docCardTypeId) {\r\n settingsRowId = x.get('TypesRowID');\r\n // Проверим состояния\r\n if (\r\n settings.sections\r\n .get('KrSettingsCycleGroupingStates')!\r\n .rows.filter(y => y.get('TypesRowID') === settingsRowId)\r\n .some(y => y.get('StateID') === state)\r\n ) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n })\r\n ) {\r\n const row = settings.sections\r\n .get('KrSettingsCycleGroupingTypes')!\r\n .rows.find(x => x.rowId === settingsRowId);\r\n currentCycleMode = row ? row.get('DefaultModeID') : null;\r\n if (currentCycleMode != undefined && cardModelInfo) {\r\n cardModelInfo['CycleGroupingMode'] = currentCycleMode;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (currentCycleMode != undefined) {\r\n context.control.info['CycleGroupingMode'] = currentCycleMode;\r\n if (!context.control.selectedGrouping) {\r\n context.control.selectedGrouping = cycleGrouping;\r\n }\r\n }\r\n }\r\n\r\n public finalized() {\r\n for (let dispose of this._dispose) {\r\n if (dispose) {\r\n dispose();\r\n }\r\n }\r\n this._dispose.length = 0;\r\n }\r\n}\r\n","import { FileControlExtension, IFileControlExtensionContext } from 'tessa/ui/files';\r\nimport { UIContext, tryGetFromInfo, MenuAction } from 'tessa/ui';\r\nimport { ICardModel } from 'tessa/ui/cards';\r\nimport { Card } from 'tessa/cards';\r\nimport { CycleFilesMode } from './cycleFilesMode';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { CycleGrouping } from './cycleGrouping';\r\nimport { modifyFileList } from './cycleGroupingUIHelper';\r\n\r\n// tslint:disable: triple-equals\r\n\r\nexport class KrCurrentCycleFileControlExtension extends FileControlExtension {\r\n public openingMenu(context: IFileControlExtensionContext) {\r\n // Проверяем тип карточки\r\n const editor = UIContext.current.cardEditor;\r\n let model: ICardModel | null = null;\r\n let card: Card | null = null;\r\n if (\r\n !editor ||\r\n !(model = editor.cardModel) ||\r\n !(card = model.card) ||\r\n !card.sections.has('KrApprovalHistoryVirtual')\r\n ) {\r\n return;\r\n }\r\n\r\n const historyRows = card.sections.get('KrApprovalHistoryVirtual')!.rows;\r\n\r\n let currentMode: CycleFilesMode | null = null;\r\n let modeFromContext: CycleFilesMode = CycleFilesMode.ShowAllCycleFiles;\r\n\r\n const groupingModeFromInfo = tryGetFromInfo(\r\n UIContext.current.info,\r\n 'CycleGroupingMode'\r\n );\r\n\r\n if (\r\n context.control.name &&\r\n editor &&\r\n editor.cardModel &&\r\n card.id === editor.cardModel.card.id &&\r\n groupingModeFromInfo &&\r\n context.control.name in groupingModeFromInfo\r\n ) {\r\n modeFromContext = groupingModeFromInfo[context.control.name];\r\n currentMode = modeFromContext;\r\n }\r\n\r\n if (currentMode == undefined) {\r\n const mode = tryGetFromInfo(context.control.info, 'CycleGroupingMode');\r\n currentMode = mode != undefined ? mode : CycleFilesMode.ShowAllCycleFiles;\r\n }\r\n\r\n const groupingsItem = context.actions.find(x => x.name === 'Groupings');\r\n\r\n const action = new MenuAction(\r\n 'CycleFilesMode',\r\n '$UI_Controls_FilesControl_CycleFilesMode',\r\n 'icon-Int787',\r\n null,\r\n [\r\n new MenuAction(\r\n 'ShowAllCycleFiles',\r\n '$UI_Controls_FilesControl_ShowAllCycleFiles',\r\n 'icon-Int787',\r\n () => {\r\n modifyFileList(context.control, card!, currentMode!, CycleFilesMode.ShowAllCycleFiles);\r\n },\r\n null,\r\n false,\r\n currentMode === CycleFilesMode.ShowAllCycleFiles\r\n ),\r\n new MenuAction(\r\n 'ShowCurrentCycleFilesOnly',\r\n '$UI_Controls_FilesControl_ShowCurrentCycleFilesOnly',\r\n 'icon-Int768',\r\n () => {\r\n modifyFileList(\r\n context.control,\r\n card!,\r\n currentMode!,\r\n CycleFilesMode.ShowCurrentCycleFilesOnly\r\n );\r\n },\r\n null,\r\n false,\r\n currentMode === CycleFilesMode.ShowCurrentCycleFilesOnly\r\n ),\r\n new MenuAction(\r\n 'ShowCurrentAndLastCycleFilesOnly',\r\n '$UI_Controls_FilesControl_ShowCurrentAndLastCycleFilesOnly',\r\n 'icon-Int770',\r\n () => {\r\n modifyFileList(\r\n context.control,\r\n card!,\r\n currentMode!,\r\n CycleFilesMode.ShowCurrentAndLastCycleFilesOnly\r\n );\r\n },\r\n null,\r\n false,\r\n currentMode === CycleFilesMode.ShowCurrentAndLastCycleFilesOnly\r\n )\r\n ],\r\n !(context.control.selectedGrouping instanceof CycleGrouping) ||\r\n !historyRows ||\r\n historyRows.length === 0\r\n );\r\n\r\n if (groupingsItem) {\r\n context.actions.splice(context.actions.indexOf(groupingsItem) + 1, 0, action);\r\n } else {\r\n context.actions.push(action);\r\n }\r\n }\r\n}\r\n","import {\n CardGetFileContentExtension,\n ICardGetFileContentExtensionContext\n} from 'tessa/cards/extensions';\nimport { UIContext } from 'tessa/ui';\nimport { KrToken } from 'tessa/workflow';\nimport { ICardModel } from 'tessa/ui/cards';\nimport { systemKeyPrefix } from 'tessa/cards';\n\nexport class ClientFileTemplatePermissionsGetFileContentExtension extends CardGetFileContentExtension {\n public beforeRequest(context: ICardGetFileContentExtensionContext): void {\n const editor = UIContext.current.cardEditor;\n let model: ICardModel;\n let token: KrToken;\n\n if (\n editor &&\n (model = editor.cardModel!) &&\n (token = KrToken.tryGet(model.card.info)!) &&\n context.request.versionRowId === '36a03878-57b6-2263-2e3a-9ae659032132' && // ReplacePlaceholdersVersionRowID\n model.card.id === context.request.info[systemKeyPrefix + 'currentCardID']\n ) {\n token.setInfo(context.request.info);\n }\n }\n}\n\n","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { ClientKrPermissionsGetFileContentExtension } from './clientKrPermissionsGetFileContentExtension';\r\nimport { ClientKrPermissionsGetFileVersionsExtension } from './clientKrPermissionsGetFileVersionsExtension';\r\nimport { WfCardFileExtension } from './wfCardFileExtension';\r\nimport { KrAddCycleGroupingFileControlExtension } from './krAddCycleGroupingFileControlExtension';\r\nimport { KrCurrentCycleFileControlExtension } from './krCurrentCycleFileControlExtension';\r\nimport { ClientFileTemplatePermissionsGetFileContentExtension } from './clientFileTemplatePermissionsGetFileContentExtension';\r\n\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrAddCycleGroupingFileControlExtension,\r\n stage: ExtensionStage.BeforePlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: ClientFileTemplatePermissionsGetFileContentExtension,\r\n stage: ExtensionStage.BeforePlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: ClientKrPermissionsGetFileContentExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: ClientKrPermissionsGetFileVersionsExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: WfCardFileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrCurrentCycleFileControlExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\n","import { UIContext } from 'tessa/ui';\r\nimport { createTypedField, DotNetType } from 'tessa/platform';\r\nimport { KrTypesCache, IKrType } from 'tessa/workflow';\r\nimport { Card } from 'tessa/cards';\r\nimport { ValidationResultBuilder, ValidationResult, ValidationResultType } from 'tessa/platform/validation';\r\n\r\nexport const CompiledCardTypes = [\r\n '2fa85bb3-bba4-4ab6-ba97-652106db96de', // KrStageTemplates\r\n '66cd517b-5423-43db-8374-f50ec0d967eb', // KrStageCommonMethods\r\n '9ce8e9f4-cbf0-4b5f-a569-b508b1fd4b3a', // KrStageGroup\r\n '61420fa1-cc1f-47cb-b0bb-4ea8ee77f51a' // KrSecondaryProcess\r\n];\r\n\r\nexport async function sendCompileRequest(compileFlag: string): Promise {\r\n const context = UIContext.current;\r\n const editor = context.cardEditor;\r\n if (!editor || !editor.cardModel) {\r\n return;\r\n }\r\n\r\n if (editor.cardModel.hasChanges()) {\r\n const success = await editor.saveCard(context);\r\n if (!success) {\r\n return;\r\n }\r\n }\r\n\r\n await editor.saveCard(\r\n context,\r\n {\r\n [compileFlag]: createTypedField(true, DotNetType.Boolean)\r\n });\r\n}\r\n\r\nexport function tryGetKrType(\r\n krTypesCache: KrTypesCache,\r\n card: Card,\r\n cardTypeId: guid,\r\n validationResult: ValidationResultBuilder | null = null\r\n): IKrType | null {\r\n const krCardType = krTypesCache.cardTypes.find(x => x.id === cardTypeId);\r\n if (krCardType == null) {\r\n // карточка может не входить в типовое решение, тогда возвращается null\r\n // при этом нельзя кидать ошибку в ValidationResult, иначе любое действие с такой карточкой будет неудачным\r\n return null;\r\n }\r\n\r\n let result: IKrType = krCardType;\r\n if (krCardType.useDocTypes) {\r\n const section = card.sections.get('DocumentCommonInfo');\r\n if (section) {\r\n const value = section.fields.tryGetField('DocTypeID');\r\n if (value) {\r\n result = krTypesCache.docTypes.find(x => x.id === value.$value)!;\r\n if (!result) {\r\n if (validationResult) {\r\n validationResult.add(ValidationResult.fromText('$KrMessages_UnableToFindTypeWithID', ValidationResultType.Error));\r\n }\r\n\r\n return null;\r\n }\r\n } else {\r\n if (validationResult) {\r\n validationResult.add(ValidationResult.fromText('$KrMessages_UnableToFindTypeWithID', ValidationResultType.Error));\r\n }\r\n\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function designTimeCard(typeId: guid): boolean {\r\n return typeId === '2fa85bb3-bba4-4ab6-ba97-652106db96de' // KrStageTemplates\r\n || typeId === '61420fa1-cc1f-47cb-b0bb-4ea8ee77f51a'; // KrSecondaryProcess\r\n}\r\n\r\nexport function runtimeCard(typeId: guid): boolean {\r\n return !designTimeCard(typeId);\r\n}","import { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { DefaultFormMainViewModel } from 'tessa/ui/cards/forms';\r\nimport { getKrComponentsByCard, KrTypesCache, KrComponents } from 'tessa/workflow';\r\nimport { tryGetKrType } from '../workflow/krProcess/krUIHelper';\r\nimport { hasNotFlag, Visibility } from 'tessa/platform';\r\n\r\nexport class HideForumTabUIExtension extends CardUIExtension {\r\n public initialized(context: ICardUIExtensionContext) {\r\n const model = context.model;\r\n const mainForm = model.mainForm;\r\n if (!(mainForm instanceof DefaultFormMainViewModel)) {\r\n return;\r\n }\r\n\r\n const usedComponents = getKrComponentsByCard(model.card, KrTypesCache.instance);\r\n const krType = tryGetKrType(KrTypesCache.instance, model.card, model.card.typeId);\r\n\r\n if (\r\n hasNotFlag(usedComponents, KrComponents.UseForum) ||\r\n (!!krType && !krType.useForum) ||\r\n (!!krType && krType.useForum && !krType.useDefaultDiscussionTab)\r\n ) {\r\n const forumTab = model.forms.find(x => x.name === 'Forum');\r\n if (forumTab) {\r\n forumTab.visibility = Visibility.Hidden;\r\n mainForm.restoreSelectedTab();\r\n }\r\n }\r\n }\r\n}\r\n","import {\r\n CardUIExtension,\r\n ICardUIExtensionContext,\r\n ICardModel,\r\n CardSavingRequest,\r\n CardSavingMode\r\n} from 'tessa/ui/cards';\r\nimport { ForumViewModel, ForumDialogManager } from 'tessa/ui/cards/controls';\r\nimport {\r\n showConfirm,\r\n showConfirmWithCancel,\r\n showMessage,\r\n IUIContext,\r\n UIContext,\r\n tryGetFromInfo\r\n} from 'tessa/ui';\r\nimport { CardStoreMode } from 'tessa/cards';\r\nimport { DotNetType, createTypedField } from 'tessa/platform';\r\nimport { KrToken } from 'tessa/workflow';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport {\r\n ViewParameterMetadata,\r\n equalsCriteriaOperator,\r\n isTrueCriteriaOperator,\r\n isFalseCriteriaOperator\r\n} from 'tessa/views/metadata';\r\nimport { ParticipantTypes, ForumHelper } from 'tessa/forums';\r\nimport { RequestParameterBuilder } from 'tessa/views';\r\nimport { showView } from 'tessa/ui/uiHost';\r\nimport { DefaultFormMainViewModel } from 'tessa/ui/cards/forms';\r\n\r\nexport class TopicsUIExtension extends CardUIExtension {\r\n //#region fields\r\n\r\n private _dispose: Function | null = null;\r\n\r\n //#endregion\r\n\r\n //#region CardUIExtension\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n if (!context.validationResult.isSuccessful) {\r\n return;\r\n }\r\n\r\n const allForumControls = context.model.controlsBag.filter(\r\n x => x instanceof ForumViewModel\r\n ) as ForumViewModel[];\r\n for (let forumControl of allForumControls) {\r\n if (!forumControl.isLicenseValid) {\r\n continue;\r\n }\r\n\r\n if (context.model.inSpecialMode) {\r\n forumControl.isEnabledAddTopic = false;\r\n forumControl.isEnabledForumEmptyContextMenu = true;\r\n }\r\n\r\n forumControl.openParticipantsAction = this.getOpenParticipantsAction(context, forumControl);\r\n forumControl.checkAddTopicPermissionAction = this.getCheckAddTopicPermissionsAction(\r\n context,\r\n forumControl\r\n );\r\n forumControl.checkSuperModeratorPermissionAction = this.getCheckSuperModeratorPermissionAction(\r\n context,\r\n forumControl\r\n );\r\n\r\n const topicId = tryGetFromInfo(context.model.card.info, ForumHelper.TopicIDKey);\r\n const topicTypeId = tryGetFromInfo(context.model.card.info, ForumHelper.TopicTypeIDKey);\r\n if (topicId && topicTypeId && forumControl.topicTypeId === topicTypeId) {\r\n forumControl.showTopic(topicId);\r\n delete context.model.card.info[ForumHelper.TopicIDKey];\r\n delete context.model.card.info[ForumHelper.TopicTypeIDKey];\r\n const mainFrom = context.model.mainForm as DefaultFormMainViewModel;\r\n mainFrom.selectedTab = forumControl.block.form;\r\n return;\r\n } else {\r\n forumControl.showTopics();\r\n }\r\n }\r\n }\r\n\r\n public finalized() {\r\n if (this._dispose) {\r\n this._dispose();\r\n this._dispose = null;\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n //#region actions\r\n\r\n private getOpenParticipantsAction(context: ICardUIExtensionContext, _control: ForumViewModel) {\r\n const openParticipantsAction = async (\r\n topicId: guid,\r\n participantType: ParticipantTypes,\r\n isSuperModerator: boolean\r\n ): Promise => {\r\n const paramTopicMeta = new ViewParameterMetadata();\r\n paramTopicMeta.alias = 'TopicID';\r\n const paramTopicId = new RequestParameterBuilder()\r\n .withMetadata(paramTopicMeta)\r\n .addCriteria(equalsCriteriaOperator(), 'topicID', topicId)\r\n .asRequestParameter();\r\n\r\n const paramCardMeta = new ViewParameterMetadata();\r\n paramCardMeta.alias = 'CardID';\r\n const paramCardId = new RequestParameterBuilder()\r\n .withMetadata(paramCardMeta)\r\n .addCriteria(equalsCriteriaOperator(), 'cardID', context.card.id)\r\n .asRequestParameter();\r\n\r\n const paramParticipantMeta = new ViewParameterMetadata();\r\n paramParticipantMeta.alias = 'ParticipantTypeID';\r\n const paramParticipantType = new RequestParameterBuilder()\r\n .withMetadata(paramParticipantMeta)\r\n .addCriteria(equalsCriteriaOperator(), 'participantType', participantType)\r\n .asRequestParameter();\r\n\r\n const paramIsSuperModeratorMeta = new ViewParameterMetadata();\r\n paramIsSuperModeratorMeta.alias = 'IsSuperModeratorMode';\r\n const paramIsSuperModerator = new RequestParameterBuilder()\r\n .withMetadata(paramIsSuperModeratorMeta)\r\n .addCriteria(isSuperModerator ? isTrueCriteriaOperator() : isFalseCriteriaOperator())\r\n .asRequestParameter();\r\n\r\n const paramCardTypeIdMeta = new ViewParameterMetadata();\r\n paramCardTypeIdMeta.alias = 'CardTypeID';\r\n const paramCardTypeId = new RequestParameterBuilder()\r\n .withMetadata(paramCardTypeIdMeta)\r\n .addCriteria(equalsCriteriaOperator(), 'cardTypeID', ForumHelper.TopicTabTypeID)\r\n .asRequestParameter();\r\n\r\n const paramParticipantsTabNameMeta = new ViewParameterMetadata();\r\n paramParticipantsTabNameMeta.alias = 'ParticipantsTabName';\r\n const paramParticipantsTabName = new RequestParameterBuilder()\r\n .withMetadata(paramParticipantsTabNameMeta)\r\n .addCriteria(\r\n equalsCriteriaOperator(),\r\n 'participantsTabName',\r\n ForumHelper.AddParticipantsTabName\r\n )\r\n .asRequestParameter();\r\n\r\n const paramRolesTabNameMeta = new ViewParameterMetadata();\r\n paramRolesTabNameMeta.alias = 'RolesTabName';\r\n const paramRolesTabName = new RequestParameterBuilder()\r\n .withMetadata(paramRolesTabNameMeta)\r\n .addCriteria(equalsCriteriaOperator(), 'rolesTabName', ForumHelper.AddRolesTabName)\r\n .asRequestParameter();\r\n\r\n await showView({\r\n viewAlias: 'TopicParticipants',\r\n displayValue: '$Workplaces_User_TopicParticipants',\r\n parameters: [\r\n paramTopicId,\r\n paramCardId,\r\n paramParticipantType,\r\n paramIsSuperModerator,\r\n paramCardTypeId,\r\n paramParticipantsTabName,\r\n paramRolesTabName\r\n ],\r\n treeVisible: false\r\n });\r\n };\r\n\r\n return openParticipantsAction;\r\n }\r\n\r\n private getCheckAddTopicPermissionsAction(\r\n context: ICardUIExtensionContext,\r\n control: ForumViewModel\r\n ) {\r\n const checkAddTopicPermissionsAction = async (): Promise => {\r\n await this.openMarkedCard(\r\n context.uiContext,\r\n 'kr_calculate_addtopic_permissions',\r\n null, // Не требуем подтверждения дейтсвия если не было изменений\r\n async cardIsNew =>\r\n cardIsNew\r\n ? await (showConfirm('$KrTiles_EditModeConfirmation') ? true : null)\r\n : await showConfirmWithCancel('$KrTiles_EditModeConfirmation'),\r\n async () => await this.addTopicShowDialog(context, control)\r\n );\r\n };\r\n return checkAddTopicPermissionsAction;\r\n }\r\n\r\n private getCheckSuperModeratorPermissionAction(\r\n context: ICardUIExtensionContext,\r\n control: ForumViewModel\r\n ) {\r\n const checkSuperModeratorPermissionAction = async (): Promise => {\r\n await this.openMarkedCard(\r\n context.uiContext,\r\n 'kr_calculate_supermoderator_permissions',\r\n null, // Не требуем подтверждения дейтсвия если не было изменений\r\n async cardIsNew =>\r\n cardIsNew\r\n ? await (showConfirm('$KrTiles_EditModeConfirmation') ? true : null)\r\n : await showConfirmWithCancel('$KrTiles_EditModeConfirmation'),\r\n async () => await this.superModeratorPermissionsMessage(context, control)\r\n );\r\n };\r\n return checkSuperModeratorPermissionAction;\r\n }\r\n\r\n private addTopicShowDialog = async (\r\n context: ICardUIExtensionContext,\r\n control: ForumViewModel\r\n ) => {\r\n if (\r\n control.permissionsProvider.isEnableAddTopic(context.uiContext.cardEditor!.cardModel!.card)\r\n ) {\r\n await ForumDialogManager.instance.addTopicShowDialog(context.card.id, model =>\r\n control.modifyAddingTopic(model)\r\n );\r\n return true;\r\n } else {\r\n await showMessage('$Forum_Permission_NoPermissionToAddTopic');\r\n return false;\r\n }\r\n };\r\n\r\n private superModeratorPermissionsMessage = async (\r\n context: ICardUIExtensionContext,\r\n control: ForumViewModel\r\n ) => {\r\n if (\r\n control.permissionsProvider.isEnableSuperModeratorMode(\r\n context.uiContext.cardEditor!.cardModel!.card\r\n )\r\n ) {\r\n await showMessage('$Forum_Permission_SuperModeratorModeOn');\r\n return false;\r\n } else {\r\n await showMessage('$Forum_Permission_NoRequiredPermissions');\r\n return false;\r\n }\r\n };\r\n\r\n private async openMarkedCard(\r\n context: IUIContext,\r\n mark: string | null,\r\n proceedConfirmation: (() => Promise) | null,\r\n proceedAndSaveCardConfirmation: ((cardIsNew: boolean) => Promise) | null,\r\n continuationOnSuccessFunc: (() => Promise) | null = null,\r\n getInfo: IStorage | null = null\r\n ): Promise {\r\n const editor = context.cardEditor;\r\n let model: ICardModel;\r\n\r\n if (!editor || editor.operationInProgress || !(model = editor.cardModel!)) {\r\n return;\r\n }\r\n\r\n const cardIsNew = model.card.storeMode === CardStoreMode.Insert;\r\n const hasChanges = cardIsNew || model.hasChanges();\r\n let saveCardBeforeOpening: boolean | null = false;\r\n\r\n if (hasChanges && proceedAndSaveCardConfirmation) {\r\n saveCardBeforeOpening = await proceedAndSaveCardConfirmation(cardIsNew);\r\n // Если не указана функция подтверждения с вариантом отмены - сохраняем карточку\r\n // если есть подтверждение основного действия\r\n } else if (hasChanges && proceedConfirmation) {\r\n saveCardBeforeOpening = (await proceedConfirmation()) ? true : null;\r\n // Если в карточке не было изменений - не вызываем сохранения\r\n } else if (proceedConfirmation) {\r\n saveCardBeforeOpening = (await proceedConfirmation()) ? false : null;\r\n // Если не указана функция подтверждения и нет изменений - вызываем основное действие\r\n // без подтверждения и сохранения\r\n } else {\r\n saveCardBeforeOpening = false;\r\n }\r\n\r\n if (saveCardBeforeOpening === null) {\r\n return;\r\n }\r\n\r\n if (!getInfo) {\r\n getInfo = {};\r\n }\r\n\r\n if (mark) {\r\n getInfo[mark] = createTypedField(true, DotNetType.Boolean);\r\n }\r\n\r\n if (saveCardBeforeOpening) {\r\n const token = KrToken.tryGet(editor.info);\r\n KrToken.remove(editor.info);\r\n\r\n const saveSuccess = await editor.saveCard(\r\n context,\r\n {\r\n '.SaveWithPermissionsCalc': createTypedField(true, DotNetType.Boolean)\r\n },\r\n new CardSavingRequest(CardSavingMode.KeepPreviousCard)\r\n );\r\n\r\n if (!saveSuccess) {\r\n return;\r\n }\r\n\r\n if (token) {\r\n token.setInfo(getInfo);\r\n }\r\n }\r\n\r\n const cardId = model.card.id;\r\n const cardType = model.cardType;\r\n\r\n const sendTaskSucceeded = await editor.openCard({\r\n cardId,\r\n cardTypeId: cardType.id!,\r\n cardTypeName: cardType.name!,\r\n context,\r\n info: getInfo\r\n });\r\n\r\n if (sendTaskSucceeded) {\r\n editor.isUpdatedServer = true;\r\n } else if (cardIsNew || saveCardBeforeOpening) {\r\n // если карточка новая или была сохранена, а также не удалось выполнить mark-действие при открытии,\r\n // то у нас будет \"висеть\" карточка с некорректной версией;\r\n // её надо обновить, на этот раз без mark'и\r\n\r\n await editor.openCard({\r\n cardId,\r\n cardTypeId: cardType.id!,\r\n cardTypeName: cardType.name!,\r\n context\r\n });\r\n }\r\n\r\n if (!continuationOnSuccessFunc) {\r\n return;\r\n }\r\n\r\n const contextInstance = UIContext.create(context);\r\n try {\r\n await continuationOnSuccessFunc();\r\n } finally {\r\n contextInstance.dispose();\r\n }\r\n }\r\n\r\n //#endregion\r\n}\r\n","import { ForumHelper } from 'tessa/forums';\r\nimport { showLoadingOverlay } from 'tessa/ui';\r\nimport { CardEditorOpeningContext } from 'tessa/ui/cards';\r\nimport { openCard } from 'tessa/ui/uiHost';\r\nimport { DoubleClickInfo, openCardDoubleClickAction } from 'tessa/ui/views';\r\nimport { WorkplaceViewComponentExtension } from 'tessa/ui/views/extensions';\r\nimport { IWorkplaceViewComponent } from 'tessa/ui/views/workplaceViewComponent';\r\n\r\nexport class OpenTopicOnDoubleClickExtension extends WorkplaceViewComponentExtension {\r\n public getExtensionName(): string {\r\n return 'Tessa.Extensions.Default.Client.Forum.OpenTopicOnDoubleClickExtension';\r\n }\r\n\r\n public initializeSettings(model: IWorkplaceViewComponent) {\r\n model.doubleClickAction = async (info: DoubleClickInfo) => {\r\n await openCardDoubleClickAction(info, async (cardId, displayValue, context) => {\r\n const selectedRow = info.context.viewContext?.selectedRow;\r\n if (selectedRow) {\r\n const topicId = selectedRow.get('TopicID');\r\n const typeId = selectedRow.get('TypeID');\r\n if (topicId && typeId) {\r\n await showLoadingOverlay(async () => {\r\n await openCard({\r\n cardId,\r\n displayValue,\r\n context,\r\n cardModifierAction: openingContext =>\r\n this.cardModifierAction(openingContext, topicId, typeId)\r\n });\r\n });\r\n }\r\n }\r\n });\r\n };\r\n }\r\n\r\n private async cardModifierAction(\r\n openingContext: CardEditorOpeningContext,\r\n topicId: string,\r\n typeId: string\r\n ) {\r\n openingContext.card.info[ForumHelper.TopicIDKey] = topicId;\r\n openingContext.card.info[ForumHelper.TopicTypeIDKey] = typeId;\r\n }\r\n}\r\n","import { IBlockViewModel } from 'tessa/ui/cards';\r\nimport { Visibility } from 'tessa/platform';\r\n\r\nexport class WfUiHelper {\r\n public static setControlVisibility(block: IBlockViewModel, suffix: string, isVisible: boolean) {\r\n for (let control of block.controls) {\r\n const controlName = control.name;\r\n if (controlName && controlName.toLocaleLowerCase().endsWith(suffix.toLocaleLowerCase())) {\r\n const controlIsVisible = control.controlVisibility === Visibility.Visible;\r\n if (controlIsVisible !== isVisible) {\r\n control.controlVisibility = isVisible ? Visibility.Visible : Visibility.Collapsed;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { DefaultCardTypes } from 'tessa/workflow';\r\nimport { createTypedField, DotNetType } from 'tessa/platform';\r\nimport { CardRow, CardRowsListener } from 'tessa/cards';\r\nimport { GridRowAction, GridViewModel } from 'tessa/ui/cards/controls';\r\nimport { ForumHelper } from 'tessa/forums';\r\nimport { WfUiHelper } from '../workflow/wf/wfUiHelper';\r\n\r\nexport class KrSettingsForumsSettingsUIExtension extends CardUIExtension {\r\n private _cardRowsListener: CardRowsListener | null;\r\n private _disposers: Array<() => void> = [];\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n const { model } = context;\r\n\r\n if (model.inSpecialMode) {\r\n return;\r\n }\r\n\r\n const cardTypeId = model.card.typeId;\r\n\r\n if (cardTypeId === DefaultCardTypes.KrSettingsTypeID) {\r\n const sections = model.card.tryGetSections();\r\n\r\n const cardTypesSection = sections?.tryGet('KrSettingsCardTypes');\r\n const cardTypesControl = model.controls.get('CardTypeControl');\r\n\r\n if (cardTypesSection && cardTypesControl) {\r\n const cardTypesGrid = cardTypesControl as GridViewModel;\r\n\r\n cardTypesGrid.rowInvoked.add(e => {\r\n if (e.action === GridRowAction.Inserted || e.action === GridRowAction.Opening) {\r\n const forumsBlock = e.rowModel?.blocks.get('UseForumBlock');\r\n\r\n if (forumsBlock) {\r\n const useForumFirst = e.row.get(ForumHelper.UseForumField) as boolean;\r\n\r\n WfUiHelper.setControlVisibility(\r\n forumsBlock,\r\n ForumHelper.UseForumSuffix,\r\n useForumFirst\r\n );\r\n\r\n const dispose = e.row.fieldChanged.addWithDispose(e => {\r\n if (e.fieldName === ForumHelper.UseForumField) {\r\n const useForum = e.fieldValue as boolean;\r\n e.storage.set(\r\n ForumHelper.UseDefaultDiscussionTabField,\r\n createTypedField(useForum, DotNetType.Boolean)\r\n );\r\n WfUiHelper.setControlVisibility(\r\n forumsBlock,\r\n ForumHelper.UseForumSuffix,\r\n useForum\r\n );\r\n }\r\n });\r\n\r\n forumsBlock.form.closed.add(() => {\r\n if (dispose) {\r\n dispose();\r\n }\r\n });\r\n }\r\n }\r\n });\r\n\r\n for (const cardTypeRow of cardTypesSection.rows) {\r\n this.attachHandlersToCardTypeRow(cardTypeRow);\r\n }\r\n\r\n this._cardRowsListener = new CardRowsListener();\r\n this._cardRowsListener.rowInserted.add((_s, row) => {\r\n this.attachHandlersToCardTypeRow(row);\r\n });\r\n this._cardRowsListener.start(cardTypesSection.rows);\r\n }\r\n } else if (cardTypeId === DefaultCardTypes.KrDocTypeTypeID) {\r\n const sections = model.card.tryGetSections();\r\n if (sections) {\r\n const docTypeSection = sections.tryGet('KrDocType');\r\n const useForumBlock = model.blocks.get('UseForumBlock');\r\n if (docTypeSection && useForumBlock) {\r\n const useForumFirst = docTypeSection.fields.get(ForumHelper.UseForumField) as boolean;\r\n WfUiHelper.setControlVisibility(useForumBlock, ForumHelper.UseForumSuffix, useForumFirst);\r\n\r\n const dispose = docTypeSection.fields.fieldChanged.addWithDispose(e => {\r\n if (e.fieldName === ForumHelper.UseForumField) {\r\n const useForum = e.fieldValue as boolean;\r\n e.storage.set(\r\n ForumHelper.UseDefaultDiscussionTabField,\r\n createTypedField(useForum, DotNetType.Boolean)\r\n );\r\n WfUiHelper.setControlVisibility(useForumBlock, ForumHelper.UseForumSuffix, useForum);\r\n }\r\n });\r\n\r\n if (dispose) {\r\n this._disposers.push(dispose);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public finalized() {\r\n if (this._cardRowsListener) {\r\n this._cardRowsListener.stop();\r\n this._cardRowsListener = null;\r\n }\r\n for (let dispose of this._disposers) {\r\n if (dispose) {\r\n dispose();\r\n }\r\n }\r\n this._disposers.length = 0;\r\n }\r\n\r\n private attachHandlersToCardTypeRow(cardTypeRow: CardRow) {\r\n const dispose = cardTypeRow.fieldChanged.addWithDispose(e => {\r\n if (e.fieldName === ForumHelper.UseForumField && !(e.fieldValue as boolean)) {\r\n e.storage.set(\r\n ForumHelper.UseDefaultDiscussionTabField,\r\n createTypedField(e.fieldValue, DotNetType.Boolean)\r\n );\r\n }\r\n });\r\n\r\n if (dispose) {\r\n this._disposers.push(dispose);\r\n }\r\n }\r\n}\r\n","import { WorkplaceViewComponentExtension } from 'tessa/ui/views/extensions';\r\nimport { IWorkplaceViewComponent, IViewContextMenuContext, IViewContext } from 'tessa/ui/views';\r\nimport { ParticipantTypes, ForumHelper, ForumProvider, ForumResponse } from 'tessa/forums';\r\nimport { MenuAction, showError, showNotEmpty, showConfirm } from 'tessa/ui';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { userSession } from 'common/utility';\r\nimport { CriteriaOperatorConst } from 'tessa/views/metadata';\r\nimport {\r\n ForumDialogManager,\r\n ForumPermissionsProvider,\r\n IForumPermissionsProvider\r\n} from 'tessa/ui/cards/controls';\r\nimport { ValidationResultType, ValidationResult } from 'tessa/platform/validation';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { ForumOperationItem } from 'tessa/ui/cards';\r\n\r\nexport class OpenForumContextMenuViewExtension extends WorkplaceViewComponentExtension {\r\n //#region ctor\r\n\r\n constructor() {\r\n super();\r\n this.permissionProvider = new ForumPermissionsProvider();\r\n }\r\n\r\n ////#endregion\r\n\r\n //#region fields\r\n\r\n private permissionProvider: IForumPermissionsProvider;\r\n\r\n //#endregion\r\n\r\n //#region CardUIExtension\r\n\r\n public getExtensionName(): string {\r\n return 'Tessa.Extensions.Default.Client.Forum.OpenForumContextMenuViewExtension';\r\n }\r\n\r\n public initialize(model: IWorkplaceViewComponent) {\r\n model.contextMenuGenerators.push(this.getParticipantsMenuAction());\r\n }\r\n\r\n public initialized(_model: IWorkplaceViewComponent) {}\r\n\r\n //#endregion\r\n\r\n //#region private methods\r\n\r\n private getParticipantsMenuAction(): (ctx: IViewContextMenuContext) => void {\r\n return c => {\r\n if (c.viewContext.refSection == null) {\r\n return;\r\n }\r\n\r\n const { viewContext } = c;\r\n const { selectedRows } = viewContext;\r\n\r\n if (!selectedRows || selectedRows.length === 0) {\r\n return;\r\n }\r\n\r\n const items = this.tryGetRows(selectedRows);\r\n\r\n if (items && items.length !== 0) {\r\n c.menuActions.push(\r\n new MenuAction('ChangeParticipant', '$Forum_MenuAction_ChangeParticipants', null, _e => {\r\n c.uiContextExecutor(_ctx => {\r\n this.changeParticipantsCommand(viewContext, items);\r\n });\r\n }),\r\n new MenuAction('ChangeParticipant', '$Forum_MenuAction_RemoveParticipants', null, _e => {\r\n c.uiContextExecutor(_ctx => {\r\n this.removeParticipantsCommand(viewContext, items);\r\n });\r\n })\r\n );\r\n }\r\n };\r\n }\r\n\r\n private async changeParticipantsCommand(context: IViewContext, items: ForumOperationItem[]) {\r\n if (items.length === 0) {\r\n return;\r\n }\r\n\r\n if (!this.hasModeratorPermissions(context)) {\r\n await showError(\r\n LocalizationManager.instance.format(\r\n '$Forum_UI_Cards_RemoveParticipants_NoRequiredPermissions',\r\n ForumHelper.concatUsersName(\r\n items.map(i => i.roleName),\r\n ','\r\n )\r\n )\r\n );\r\n\r\n return;\r\n }\r\n\r\n const currentUserId = userSession.UserID;\r\n if (items.find(i => i.cardId === currentUserId)) {\r\n await showError(\r\n LocalizationManager.instance.localize(\r\n '$Forum_UI_Cards_ChangeParticipants_СannotEditYourself'\r\n )\r\n );\r\n return;\r\n }\r\n\r\n if (items.length > 1) {\r\n await showError(\r\n LocalizationManager.instance.localize(\r\n '$Forum_UI_Cards_ChangeParticipants_YouCanEditOnlyOneEntry'\r\n )\r\n );\r\n return;\r\n }\r\n\r\n const item = items[0];\r\n\r\n item.cardTypeId = this.getContextParameterValue(context, 'CardTypeID');\r\n item.participantsTabName = this.getContextParameterValue(context, 'ParticipantsTabName');\r\n item.rolesTabName = this.getContextParameterValue(context, 'RolesTabName');\r\n\r\n let newItem: ForumOperationItem | null;\r\n if (item.participantType === ParticipantTypes.ParticipantFromRole) {\r\n newItem = await this.processingChangeRole(\r\n item,\r\n this.getCardId(context),\r\n this.hasSuperModeratorPermissions(context)\r\n );\r\n } else {\r\n newItem = await ForumDialogManager.instance.changeParticipantsShowDialog(item);\r\n }\r\n\r\n if (newItem === null) {\r\n return;\r\n }\r\n\r\n const participants = [newItem.roleId];\r\n\r\n const forumResponse =\r\n newItem.participantType === ParticipantTypes.ParticipantFromRole\r\n ? await ForumProvider.instance.updateRoles(\r\n newItem.topicId,\r\n participants,\r\n newItem.readOnly,\r\n undefined,\r\n newItem.subscribed\r\n )\r\n : await ForumProvider.instance.updateParticipants(\r\n newItem.topicId,\r\n participants,\r\n newItem.readOnly,\r\n newItem.participantType,\r\n undefined,\r\n newItem.subscribed\r\n );\r\n\r\n if (forumResponse.validationResult.isSuccessful) {\r\n if (context.canRefreshView()) {\r\n await context.refreshView();\r\n }\r\n } else {\r\n await showNotEmpty(forumResponse.validationResult.build());\r\n }\r\n }\r\n\r\n private async removeParticipantsCommand(context: IViewContext, items: ForumOperationItem[]) {\r\n if (items.length === 0) {\r\n return;\r\n }\r\n\r\n if (!this.hasModeratorPermissions(context)) {\r\n await showError(\r\n LocalizationManager.instance.format(\r\n '$Forum_UI_Cards_RemoveParticipants_NoRequiredPermissions',\r\n ForumHelper.concatUsersName(\r\n items.map(i => i.roleName),\r\n ','\r\n )\r\n )\r\n );\r\n\r\n return;\r\n }\r\n\r\n const currentUserId = userSession.UserID;\r\n if (!items.find(i => i.cardId === currentUserId)) {\r\n try {\r\n const participants = items.map(i => i.roleId);\r\n\r\n const forumResponse = await this.removeParticipants(\r\n items,\r\n currentUserId,\r\n participants,\r\n this.getCardId(context),\r\n this.hasSuperModeratorPermissions(context)\r\n );\r\n\r\n if (forumResponse.validationResult.isSuccessful) {\r\n if (context.canRefreshView()) {\r\n await context.refreshView();\r\n }\r\n } else {\r\n await showNotEmpty(forumResponse.validationResult.build());\r\n }\r\n } catch (error) {\r\n await showError(error);\r\n }\r\n } else {\r\n await showError('$Forum_UI_Cards_RemoveParticipants_CantRemoveCurrentParticipant');\r\n }\r\n }\r\n\r\n private async removeParticipants(\r\n items: ForumOperationItem[],\r\n currentUserId: string,\r\n participants: string[],\r\n cardId: string,\r\n isSuperModerator: boolean\r\n ) {\r\n let response = new ForumResponse();\r\n\r\n const groupedItems = items.filter((item, i, self) => {\r\n self.indexOf(item) === i;\r\n });\r\n\r\n if (groupedItems.length > 1) {\r\n response.validationResult.add(\r\n ValidationResult.fromText(\r\n LocalizationManager.instance.localize(\r\n '$Forum_UI_Cards_RemoveParticipants_CannotDeleteParticipantsAndRoles'\r\n ),\r\n ValidationResultType.Error\r\n )\r\n );\r\n\r\n return response;\r\n }\r\n\r\n const item = items[0];\r\n\r\n if (item.participantType === ParticipantTypes.ParticipantFromRole) {\r\n response = await this.processingRemoveRole(\r\n items,\r\n currentUserId,\r\n participants,\r\n cardId,\r\n isSuperModerator\r\n );\r\n } else {\r\n const result = await showConfirm(\r\n LocalizationManager.instance.format(\r\n '$Forum_UI_Cards_RemoveParticipant_ConfirmSingle',\r\n ForumHelper.concatUsersName(\r\n items.map(i => i.roleName),\r\n ','\r\n )\r\n )\r\n );\r\n if (result) {\r\n response = await ForumProvider.instance.removeParticipants(\r\n item.topicId,\r\n currentUserId,\r\n participants\r\n );\r\n }\r\n }\r\n\r\n return response;\r\n }\r\n\r\n private async processingRemoveRole(\r\n items: ForumOperationItem[],\r\n currentUserId: string,\r\n participants: string[],\r\n cardId: string,\r\n isSuperModerator: boolean\r\n ): Promise {\r\n if (isSuperModerator) {\r\n const confirmed = await showConfirm(\r\n LocalizationManager.instance.format(\r\n '$Forum_UI_Cards_RemoveParticipant_ConfirmSingle',\r\n ForumHelper.concatUsersName(\r\n items.map(i => i.roleName),\r\n ','\r\n )\r\n )\r\n );\r\n\r\n if (confirmed) {\r\n return await ForumProvider.instance.removeRoles(\r\n items[0].topicId,\r\n currentUserId,\r\n participants\r\n );\r\n }\r\n\r\n return new ForumResponse();\r\n }\r\n\r\n let response = new ForumResponse();\r\n\r\n const result = await showConfirm(\r\n '$Forum_UI_Cards_ChangeParticipants_TryGetSupermoderatorPermission'\r\n );\r\n\r\n if (result) {\r\n const {\r\n data: isEnableSuperModeratorMode,\r\n validationResult\r\n } = await this.permissionProvider.checkHasPermissionIsSuperModerator(cardId);\r\n\r\n if (!validationResult.isSuccessful) {\r\n response.validationResult.add(validationResult);\r\n return response;\r\n }\r\n\r\n if (isEnableSuperModeratorMode) {\r\n const result = await showConfirm(\r\n LocalizationManager.instance.format(\r\n '$Forum_UI_Cards_RemoveParticipant_ConfirmSingle',\r\n ForumHelper.concatUsersName(\r\n items.map(i => i.roleName),\r\n ','\r\n )\r\n )\r\n );\r\n\r\n if (result) {\r\n response = await ForumProvider.instance.removeRoles(\r\n items[0].topicId,\r\n currentUserId,\r\n participants\r\n );\r\n }\r\n }\r\n }\r\n\r\n return response;\r\n }\r\n\r\n private async processingChangeRole(\r\n item: ForumOperationItem,\r\n cardId: string,\r\n isSuperModerator: boolean = false\r\n ): Promise {\r\n if (isSuperModerator) {\r\n return await ForumDialogManager.instance.changeRoleParticipantsShowDialog(item);\r\n }\r\n\r\n const result = await showConfirm(\r\n '$Forum_UI_Cards_ChangeParticipants_TryGetSupermoderatorPermission'\r\n );\r\n\r\n if (result) {\r\n const {\r\n data: isEnableSuperModeratorMode,\r\n validationResult\r\n } = await this.permissionProvider.checkHasPermissionIsSuperModerator(cardId);\r\n\r\n if (!validationResult.isSuccessful) {\r\n await showNotEmpty(validationResult);\r\n return null;\r\n }\r\n\r\n if (isEnableSuperModeratorMode) {\r\n return await ForumDialogManager.instance.changeRoleParticipantsShowDialog(item);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private hasModeratorPermissions(context: IViewContext): boolean {\r\n const participantType = this.getContextParameterValue(\r\n context,\r\n 'ParticipantTypeID'\r\n ) as ParticipantTypes;\r\n\r\n return (\r\n participantType !== ParticipantTypes.Participant &&\r\n participantType !== ParticipantTypes.ParticipantFromRole\r\n );\r\n }\r\n\r\n private hasSuperModeratorPermissions(context: IViewContext): boolean {\r\n return (\r\n context.parameters.parameters.find(p => p.name === 'IsSuperModeratorMode')?.criteriaValues[0]\r\n .criteriaName === CriteriaOperatorConst.IsTrue\r\n );\r\n }\r\n\r\n private getCardId(context: IViewContext): string {\r\n return this.getContextParameterValue(context, 'CardID');\r\n }\r\n\r\n private tryGetRows(rows: readonly IStorage[]): ForumOperationItem[] {\r\n const result: ForumOperationItem[] = [];\r\n for (const row of rows) {\r\n result.push(this.tryGetSelectedItemsFromViewContext(row));\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private tryGetSelectedItemsFromViewContext(selectedRows: IStorage): ForumOperationItem {\r\n const forumItem = new ForumOperationItem(\r\n selectedRows.get('RoleID') as string,\r\n selectedRows.get('RoleName') as string\r\n );\r\n\r\n forumItem.roleType = parseInt(selectedRows.get('TypeID') as string);\r\n forumItem.topicId = selectedRows.get('TopicID') as string;\r\n forumItem.readOnly = selectedRows.get('ReadOnly') as boolean;\r\n forumItem.participantType = selectedRows.get('TypeParticipant') as ParticipantTypes;\r\n forumItem.subscribed = selectedRows.get('Subscribed');\r\n\r\n return forumItem;\r\n }\r\n\r\n // tslint:disable-next-line: no-any\r\n private getContextParameterValue(context: IViewContext, name: string): any {\r\n return context.parameters.parameters.find(p => p.name === name)?.criteriaValues[0].values[0]\r\n .value;\r\n }\r\n\r\n //#endregion\r\n}\r\n","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { HideForumTabUIExtension } from './hideForumTabUIExtension';\r\nimport { TopicsUIExtension } from './topicsUIExtension';\r\nimport { OpenTopicOnDoubleClickExtension } from './openTopicOnDoubleClickExtension';\r\nimport { KrSettingsForumsSettingsUIExtension } from './krSettingsForumsSettingsUIExtension';\r\nimport { OpenForumContextMenuViewExtension } from './openForumContextMenuViewExtension';\r\n\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrSettingsForumsSettingsUIExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n order: 1\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: HideForumTabUIExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n order: 2\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: TopicsUIExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n order: 3\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: OpenTopicOnDoubleClickExtension,\r\n stage: ExtensionStage.Platform,\r\n order: 4\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: OpenForumContextMenuViewExtension,\r\n stage: ExtensionStage.Platform,\r\n order: 3\r\n});\r\n","import { KrTileInfo } from 'tessa/workflow/krProcess';\r\n\r\nexport class KrGlobalTileContainer {\r\n\r\n //#region ctor\r\n\r\n private constructor() {}\r\n\r\n //#endregion\r\n\r\n //#region instance\r\n\r\n private static _instance: KrGlobalTileContainer;\r\n\r\n public static get instance(): KrGlobalTileContainer {\r\n if (!KrGlobalTileContainer._instance) {\r\n KrGlobalTileContainer._instance = new KrGlobalTileContainer();\r\n }\r\n return KrGlobalTileContainer._instance;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region fields\r\n\r\n private _infos: KrTileInfo[];\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n public init(infos: KrTileInfo[]) {\r\n this._infos = infos;\r\n }\r\n\r\n public getTileInfos(): ReadonlyArray {\r\n return this._infos || [];\r\n }\r\n\r\n //#endregion\r\n\r\n}","import { IKrTileCommand } from './interfaces';\r\nimport { Guid } from 'tessa/platform';\r\nimport { IUIContext, LoadingOverlay, showConfirm, showNotEmpty } from 'tessa/ui';\r\nimport { KrProcessInstance, KrTileInfo, launchProcess } from 'tessa/workflow/krProcess';\r\nimport { ITile } from 'tessa/ui/tiles';\r\n\r\nexport class KrGlobalTileCommand implements IKrTileCommand {\r\n //#region ctor\r\n\r\n private constructor() {}\r\n\r\n //#endregion\r\n\r\n //#region instance\r\n\r\n private static _instance: KrGlobalTileCommand;\r\n\r\n public static get instance(): KrGlobalTileCommand {\r\n if (!KrGlobalTileCommand._instance) {\r\n KrGlobalTileCommand._instance = new KrGlobalTileCommand();\r\n }\r\n return KrGlobalTileCommand._instance;\r\n }\r\n\r\n //#endregion\r\n\r\n public async onClickAction(_context: IUIContext, _tile: ITile, tileInfo: KrTileInfo) {\r\n if (tileInfo.id === Guid.empty) {\r\n return;\r\n }\r\n\r\n if (tileInfo.askConfirmation) {\r\n const result = await showConfirm(tileInfo.confirmationMessage);\r\n if (!result) {\r\n return;\r\n }\r\n }\r\n\r\n await LoadingOverlay.instance.show(async () => {\r\n const process = KrProcessInstance.createWithParams({ processId: tileInfo.id });\r\n const result = await launchProcess(process, { raiseErrorWhenExecutionIsForbidden: true });\r\n if (result) {\r\n await showNotEmpty(result.validationResult.build());\r\n }\r\n });\r\n }\r\n}\r\n","import { IKrTileCommand } from './interfaces';\r\nimport { IUIContext, showConfirm } from 'tessa/ui';\r\nimport {\r\n KrProcessInstance,\r\n KrTileInfo,\r\n launchProcessWithCardEditor\r\n} from 'tessa/workflow/krProcess';\r\nimport { Guid } from 'tessa/platform';\r\nimport { ICardModel, CardSavingRequest, CardSavingMode } from 'tessa/ui/cards';\r\nimport { ITile } from 'tessa/ui/tiles';\r\n\r\nexport class KrLocalTileCommand implements IKrTileCommand {\r\n //#region ctor\r\n\r\n private constructor() {}\r\n\r\n //#endregion\r\n\r\n //#region instance\r\n\r\n private static _instance: KrLocalTileCommand;\r\n\r\n public static get instance(): KrLocalTileCommand {\r\n if (!KrLocalTileCommand._instance) {\r\n KrLocalTileCommand._instance = new KrLocalTileCommand();\r\n }\r\n return KrLocalTileCommand._instance;\r\n }\r\n\r\n //#endregion\r\n\r\n public async onClickAction(context: IUIContext, _tile: ITile, tileInfo: KrTileInfo) {\r\n const cardEditor = context.cardEditor;\r\n let model: ICardModel;\r\n if (tileInfo.id === Guid.empty || !cardEditor || !(model = cardEditor.cardModel!)) {\r\n return;\r\n }\r\n\r\n if (tileInfo.askConfirmation) {\r\n const result = await showConfirm(tileInfo.confirmationMessage);\r\n if (!result) {\r\n return;\r\n }\r\n }\r\n\r\n await cardEditor.setOperationInProgress(async () => {\r\n if (model.hasChanges()) {\r\n if (\r\n !(await cardEditor.saveCard(\r\n context,\r\n undefined,\r\n new CardSavingRequest(CardSavingMode.RefreshOnSuccess)\r\n ))\r\n ) {\r\n return;\r\n }\r\n }\r\n const process = KrProcessInstance.createWithParams({\r\n processId: tileInfo.id,\r\n processInfo: {},\r\n cardId: context.cardEditor!.cardModel!.card.id\r\n });\r\n\r\n await launchProcessWithCardEditor(process, cardEditor, true);\r\n });\r\n }\r\n}\r\n","import { IKrTileCommand } from './interfaces';\r\nimport { KrGlobalTileCommand } from './krGlobalTileCommand';\r\nimport { KrLocalTileCommand } from './krLocalTileCommand';\r\nimport {\r\n TileContextSource,\r\n ITile,\r\n Tile,\r\n TileEvaluationEventArgs,\r\n TileGroups\r\n} from 'tessa/ui/tiles';\r\nimport { KrTileInfo } from 'tessa/workflow/krProcess';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { tryGetFromInfo, showNotEmpty } from 'tessa/ui';\r\nimport { getTessaIcon } from 'common/utility';\r\nimport { ValidationResult } from 'tessa/platform/validation';\r\n\r\nexport class KrTileInflater {\r\n //#region ctor\r\n\r\n private constructor() {}\r\n\r\n //#endregion\r\n\r\n //#region instance\r\n\r\n private static _instance: KrTileInflater;\r\n\r\n public static get instance(): KrTileInflater {\r\n if (!KrTileInflater._instance) {\r\n KrTileInflater._instance = new KrTileInflater();\r\n }\r\n return KrTileInflater._instance;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n public inflate(\r\n contextSource: TileContextSource,\r\n tileInfos: ReadonlyArray,\r\n groups: number | null = null\r\n ): ITile[] {\r\n const tiles: ITile[] = [];\r\n\r\n for (let tileInfo of tileInfos) {\r\n tiles.push(this.inflateTile(contextSource, tileInfo, groups));\r\n }\r\n\r\n return tiles;\r\n }\r\n\r\n private inflateTile(\r\n contextSource: TileContextSource,\r\n tileInfo: KrTileInfo,\r\n groups: number | null = null\r\n ): ITile {\r\n const icon = getTessaIcon(tileInfo.icon);\r\n\r\n const tileCollection: ITile[] = [];\r\n if (tileInfo.nestedTiles.length !== 0) {\r\n const nestedTiles: ITile[] = [];\r\n let nestedOrder = 0;\r\n for (let nestedTileInfo of tileInfo.nestedTiles) {\r\n nestedTiles.push(this.inflateTile(contextSource, nestedTileInfo, nestedOrder++));\r\n }\r\n\r\n tileCollection.push(...nestedTiles);\r\n\r\n // Тайл группы.\r\n const grouptile = new Tile({\r\n name: tileInfo.caption,\r\n caption: tileInfo.caption,\r\n icon: icon,\r\n contextSource,\r\n order: tileInfo.order,\r\n group: groups == null ? TileGroups.NoGroup : groups,\r\n tiles: tileCollection,\r\n sharedInfo: KrTileInflater.createInfo(tileInfo),\r\n toolTip: tileInfo.tooltip\r\n });\r\n if (tileInfo.actionGrouping) {\r\n grouptile.info['.actionsGrouping'] = true;\r\n grouptile.evaluating.add(KrTileInflater.tileGroupingEvaluation);\r\n }\r\n return grouptile;\r\n }\r\n\r\n const tile = new Tile({\r\n name: tileInfo.name,\r\n caption: tileInfo.caption,\r\n icon: icon,\r\n contextSource,\r\n command: KrTileInflater.onClickAction,\r\n order: tileInfo.order,\r\n group: groups == null ? TileGroups.NoGroup : groups,\r\n tiles: tileCollection,\r\n sharedInfo: KrTileInflater.createInfo(tileInfo),\r\n toolTip: tileInfo.tooltip\r\n });\r\n if (tileInfo.actionGrouping) {\r\n tile.info['.actionsGrouping'] = true;\r\n tile.evaluating.add(KrTileInflater.tileGroupingEvaluation);\r\n }\r\n return tile;\r\n }\r\n\r\n private static async onClickAction(tile: ITile) {\r\n const tileInfo = tryGetFromInfo(tile.sharedInfo, 'TileInfo', null);\r\n if (tileInfo) {\r\n const context = tile.context;\r\n const command: IKrTileCommand = tileInfo.isGlobal\r\n ? KrGlobalTileCommand.instance\r\n : KrLocalTileCommand.instance;\r\n\r\n try {\r\n // В ТК вызывается как async void.\r\n // UIContext не будет сохраняться после первой асинхронной операции.\r\n // это нужно для синхронизации поведения, например в AdvancedDialogCommandHandler.\r\n command.onClickAction(context, tile, tileInfo);\r\n } catch (err) {\r\n await showNotEmpty(ValidationResult.fromError(err));\r\n }\r\n }\r\n }\r\n\r\n private static createInfo(tileInfo: KrTileInfo): IStorage {\r\n return {\r\n TileInfo: tileInfo\r\n };\r\n }\r\n\r\n private static tileGroupingEvaluation(e: TileEvaluationEventArgs) {\r\n e.setIsEnabledWithCollapsing(e.currentTile, true);\r\n }\r\n\r\n //#endregion\r\n}\r\n","import { KrGlobalTileContainer } from '../workflow/krProcess/krGlobalTileContainer';\r\nimport { KrTileInflater } from '../workflow/krProcess/krTileInflater';\r\nimport { TileExtension, ITileGlobalExtensionContext, TileGroups } from 'tessa/ui/tiles';\r\n\r\nexport class KrTilesExtension extends TileExtension {\r\n public initializingGlobal(context: ITileGlobalExtensionContext) {\r\n const tileInfos = KrGlobalTileContainer.instance.getTileInfos();\r\n if (tileInfos.length > 0) {\r\n const panel = context.workspace.rightPanel;\r\n const tiles = KrTileInflater.instance.inflate(\r\n panel.contextSource,\r\n tileInfos,\r\n TileGroups.Workflow\r\n );\r\n panel.tiles.push(...tiles);\r\n }\r\n }\r\n}\r\n","import { showConfirmWithCancel } from 'tessa/ui';\r\nimport { TileExtension, ITileGlobalExtensionContext, Tile, TileGroups,\r\n ITileLocalExtensionContext, TileHotkey, openMarkedCard, enableWhenVisibleInCardHandler } from 'tessa/ui/tiles';\r\n\r\nexport class KrEditModeTileExtension extends TileExtension {\r\n\r\n //#region TileExtension\r\n\r\n public initializingGlobal(context: ITileGlobalExtensionContext) {\r\n const contextSource = context.workspace.leftPanel.contextSource;\r\n\r\n context.workspace.leftPanel.tiles.push(\r\n new Tile({\r\n name: 'KrEditMode',\r\n caption: '$KrTiles_EditMode',\r\n icon: 'ta icon-thin-002',\r\n contextSource,\r\n command: KrEditModeTileExtension.openForEditing,\r\n group: TileGroups.Cards,\r\n order: 22,\r\n evaluating: enableWhenVisibleInCardHandler,\r\n toolTip: '$KrTiles_EditModeTooltip'\r\n })\r\n );\r\n }\r\n\r\n public initializingLocal(context: ITileLocalExtensionContext) {\r\n const panel = context.workspace.leftPanel;\r\n const hotkeyStorage = panel.contextSource.hotkeyStorage;\r\n const krEnterEditMode = panel.tryGetTile('KrEditMode');\r\n if (krEnterEditMode) {\r\n hotkeyStorage.addTileHotkey(new TileHotkey(krEnterEditMode, 'Alt+E', 'KeyE', {alt: true}));\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n //#region actions\r\n\r\n private static async openForEditing() {\r\n await openMarkedCard(\r\n 'kr_calculate_permissions',\r\n null, // Не требуем подтверждения дейтсвия если не было изменений\r\n () => showConfirmWithCancel('$KrTiles_EditModeConfirmation')\r\n );\r\n }\r\n\r\n //#endregion\r\n\r\n}","import { TileExtension, ITileGlobalExtensionContext, Tile, TileGroups, ITileLocalExtensionContext, TileHotkey,\r\n enableWhenVisibleInCardHandler, openMarkedCard} from 'tessa/ui/tiles';\r\nimport { UIContext, tryGetFromInfo } from 'tessa/ui';\r\nimport { createTypedField, DotNetType } from 'tessa/platform';\r\n\r\nexport class KrShowHiddenStagesTileExtension extends TileExtension {\r\n\r\n public initializingGlobal(context: ITileGlobalExtensionContext) {\r\n const panel = context.workspace.leftPanel;\r\n const contextSource = panel.contextSource;\r\n\r\n const cardOthers = panel.tryGetTile('CardOthers');\r\n if (!cardOthers) {\r\n return;\r\n }\r\n\r\n const tile = new Tile({\r\n name: 'KrShowHiddenStages',\r\n caption: '$KrTiles_ShowHiddenStages',\r\n icon: 'ta icon-thin-045',\r\n contextSource,\r\n command: KrShowHiddenStagesTileExtension.openWithHiddenButtons,\r\n group: TileGroups.Cards,\r\n order: 25,\r\n evaluating: enableWhenVisibleInCardHandler,\r\n toolTip: '$KrTiles_ShowHiddenStagesTooltip'\r\n });\r\n\r\n cardOthers.tiles.push(tile);\r\n }\r\n\r\n public initializingLocal(context: ITileLocalExtensionContext) {\r\n const leftPanel = context.workspace.leftPanel;\r\n const cardOthers = leftPanel.tryGetTile('CardOthers');\r\n if (!cardOthers) {\r\n return;\r\n }\r\n\r\n const tile = leftPanel.tryGetTile('KrShowHiddenStages');\r\n if (!tile) {\r\n return;\r\n }\r\n\r\n const hotkeyStorage = leftPanel.contextSource.hotkeyStorage;\r\n hotkeyStorage.addTileHotkey(new TileHotkey(tile, 'Ctrl+Alt+H', 'KeyH', {ctrl: true, alt: true}));\r\n }\r\n\r\n public static openWithHiddenButtons() {\r\n const editor = UIContext.current.cardEditor;\r\n if (!editor || !editor.cardModel) {\r\n return;\r\n }\r\n\r\n const card = editor.cardModel.card;\r\n const info = {\r\n 'DontHideStagesInfoMark': createTypedField(true, DotNetType.Boolean)\r\n };\r\n\r\n if (tryGetFromInfo(card.info, 'kr_permissions_calculated', false)) {\r\n info['kr_calculate_permissions'] = createTypedField(true, DotNetType.Boolean);\r\n }\r\n\r\n openMarkedCard(null, null, null, null, info);\r\n }\r\n\r\n}","import { UIContext, showNotEmpty, createCardModel, UIButton } from 'tessa/ui';\r\nimport {\r\n TileExtension,\r\n ITileGlobalExtensionContext,\r\n Tile,\r\n TileGroups,\r\n TileEvaluationEventArgs,\r\n ITileLocalExtensionContext,\r\n disableWithCollapsing,\r\n openMarkedCard\r\n} from 'tessa/ui/tiles';\r\nimport { showView, showFormDialog } from 'tessa/ui/uiHost';\r\nimport { ICardModel, ICardEditorModel } from 'tessa/ui/cards';\r\nimport { CardStoreMode, CardRowState, CardRow } from 'tessa/cards';\r\nimport { CardRequest, CardService, CardNewRequest } from 'tessa/cards/service';\r\nimport { CardTypeFlags } from 'tessa/cards/types';\r\nimport { RequestParameterBuilder } from 'tessa/views';\r\nimport { ViewParameterMetadata, equalsCriteriaOperator } from 'tessa/views/metadata';\r\nimport { DbType, hasFlag, TypedField, DotNetType, createTypedField, Guid } from 'tessa/platform';\r\nimport { ValidationResult, ValidationResultType } from 'tessa/platform/validation';\r\nimport {\r\n KrTypesCache,\r\n KrComponents,\r\n KrToken,\r\n getKrComponentsByCard,\r\n CreateResolutions\r\n} from 'tessa/workflow';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { MetadataStorage } from 'tessa';\r\n\r\nexport class AcquaintanceTileExtension extends TileExtension {\r\n //#region TileExtension\r\n\r\n public initializingGlobal(context: ITileGlobalExtensionContext) {\r\n const panel = context.workspace.leftPanel;\r\n const contextSource = panel.contextSource;\r\n\r\n const tile = new Tile({\r\n name: 'AcquaintanceGroup',\r\n caption: '$KrTiles_AcquaintanceGroup',\r\n icon: 'ta icon-thin-083',\r\n contextSource,\r\n group: TileGroups.Cards,\r\n order: 28,\r\n evaluating: AcquaintanceTileExtension.enableOnCardUpdateAndNotTaskCard,\r\n tiles: [\r\n new Tile({\r\n name: 'Acquaintance',\r\n caption: '$KrTiles_Acquaintance',\r\n icon: 'ta icon-thin-083',\r\n contextSource,\r\n command: AcquaintanceTileExtension.showAcquaintanceWindow,\r\n group: TileGroups.Cards,\r\n order: 1,\r\n evaluating: AcquaintanceTileExtension.enableOnCardUpdateAndNotTaskCard\r\n }),\r\n\r\n new Tile({\r\n name: 'AcquaintanceHistory',\r\n caption: '$KrTiles_AcquaintanceHistory',\r\n icon: 'ta icon-thin-084',\r\n contextSource,\r\n command: AcquaintanceTileExtension.openAcquaintanceHistoryView,\r\n group: TileGroups.Cards,\r\n order: 2,\r\n evaluating: AcquaintanceTileExtension.enableOnCardUpdateAndNotTaskCard\r\n })\r\n ]\r\n });\r\n\r\n tile.info['.actionsGrouping'] = true;\r\n panel.tiles.push(tile);\r\n }\r\n\r\n public initializingLocal(context: ITileLocalExtensionContext) {\r\n const panel = context.workspace.leftPanel;\r\n const editor = panel.context.cardEditor;\r\n const acquaintanceGroup = panel.tryGetTile('AcquaintanceGroup');\r\n if (\r\n !!editor &&\r\n !!editor.cardModel &&\r\n !!acquaintanceGroup &&\r\n (!AcquaintanceTileExtension.typeSupportsWorkflow(editor.cardModel) ||\r\n !AcquaintanceTileExtension.canUseResolutions(editor.cardModel))\r\n ) {\r\n disableWithCollapsing(acquaintanceGroup);\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n //#region evaluatings\r\n\r\n private static enableOnCardUpdateAndNotTaskCard(e: TileEvaluationEventArgs) {\r\n const editor = e.currentTile.context.cardEditor;\r\n e.setIsEnabledWithCollapsing(\r\n e.currentTile,\r\n !!editor &&\r\n !!editor.cardModel &&\r\n editor.cardModel.card.storeMode === CardStoreMode.Update &&\r\n editor.cardModel.cardType.id !== 'de75a343-8164-472d-a20e-4937819760ac'\r\n ); // WfTaskCard\r\n }\r\n\r\n //#endregion\r\n\r\n //#region actions\r\n\r\n private static async showAcquaintanceWindow() {\r\n const context = UIContext.current;\r\n const cardEditor = context.cardEditor;\r\n\r\n if (!cardEditor || !cardEditor.cardModel) {\r\n return;\r\n }\r\n\r\n const mainCardModel = cardEditor.cardModel;\r\n const cardIsNew = mainCardModel.card.storeMode === CardStoreMode.Insert;\r\n\r\n if (\r\n !cardIsNew &&\r\n (mainCardModel.hasChanges() || AcquaintanceTileExtension.notEnoughPermissions(mainCardModel))\r\n ) {\r\n await openMarkedCard(\r\n 'kr_calculate_resolution_permissions',\r\n null, // Не требуем подтверждения дейтсвия если не было изменений\r\n async () => true, // Автоматом подтверждаем сохранение\r\n async () => {\r\n if (AcquaintanceTileExtension.notEnoughPermissions(cardEditor.cardModel!)) {\r\n await showNotEmpty(\r\n ValidationResult.fromText(\r\n `${LocalizationManager.instance.localize('$KrMessages_NoPermissionsTo')}\\\r\n ${LocalizationManager.instance.localize('$KrPermissions_CreateResolutions')}`,\r\n ValidationResultType.Error\r\n )\r\n );\r\n return false;\r\n }\r\n\r\n AcquaintanceTileExtension.openRolesDialog(cardEditor);\r\n return true;\r\n }\r\n );\r\n } else {\r\n AcquaintanceTileExtension.openRolesDialog(cardEditor);\r\n }\r\n }\r\n\r\n private static openAcquaintanceHistoryView() {\r\n const context = UIContext.current;\r\n const cardEditor = context.cardEditor;\r\n\r\n if (cardEditor && cardEditor.cardModel) {\r\n const cardId = cardEditor.cardModel.card.id;\r\n\r\n const parameterMetadata = new ViewParameterMetadata();\r\n parameterMetadata.alias = 'CardIDParam';\r\n parameterMetadata.caption = '$Views_Acquaintance_CardID';\r\n parameterMetadata.hidden = true;\r\n parameterMetadata.dataType = DbType.Guid;\r\n parameterMetadata.multiple = false;\r\n\r\n const parameters = [\r\n new RequestParameterBuilder()\r\n .withMetadata(parameterMetadata)\r\n .addCriteria(equalsCriteriaOperator(), cardId, cardId)\r\n .asRequestParameter()\r\n ];\r\n\r\n showView({\r\n viewAlias: 'AcquaintanceHistory',\r\n displayValue: '$Views_AcquaintanceHistory',\r\n parameters\r\n });\r\n }\r\n }\r\n\r\n private static canUseResolutions(model: ICardModel): boolean {\r\n const usedComponents = getKrComponentsByCard(model.card, KrTypesCache.instance);\r\n return hasFlag(usedComponents, KrComponents.Resolutions);\r\n }\r\n\r\n private static typeSupportsWorkflow(model: ICardModel): boolean {\r\n return (\r\n hasFlag(model.cardType.flags, CardTypeFlags.AllowTasks) &&\r\n KrTypesCache.instance.cardTypes.some(x => x.id === model.cardType.id)\r\n );\r\n }\r\n\r\n private static notEnoughPermissions(model: ICardModel): boolean {\r\n const krToken = KrToken.tryGet(model.card.info);\r\n return !!krToken && !krToken.hasPermission(CreateResolutions);\r\n }\r\n\r\n private static async openRolesDialog(editor: ICardEditorModel) {\r\n const model = editor.cardModel;\r\n if (!model) {\r\n return;\r\n }\r\n\r\n // Запрашиваем информируемых по умолчанию\r\n const defaultRolesRequest = new CardRequest();\r\n defaultRolesRequest.requestType = '7a2cb692-7a55-4519-b193-0ce2de435523'; // GetDefaultAcquaintanceRoles\r\n defaultRolesRequest.cardId = model.card.id;\r\n\r\n const defaultRolesResponse = await CardService.instance.request(defaultRolesRequest);\r\n const defaultRolesResult = defaultRolesResponse.validationResult.build();\r\n await showNotEmpty(defaultRolesResult);\r\n if (!defaultRolesResult.isSuccessful) {\r\n return;\r\n }\r\n\r\n // Построение диалога\r\n const dialogsType = MetadataStorage.instance.cardMetadata.getCardTypeByName('Dialogs');\r\n if (!dialogsType) {\r\n return;\r\n }\r\n\r\n const dialogForm = dialogsType.forms.find(x => x.name === 'Acquaintance');\r\n if (!dialogForm) {\r\n return;\r\n }\r\n\r\n const request = new CardNewRequest();\r\n request.cardTypeId = dialogsType.id;\r\n const response = await CardService.instance.new(request);\r\n response.card.id = Guid.newGuid();\r\n await showNotEmpty(response.validationResult.build());\r\n if (!response.validationResult.isSuccessful) {\r\n return;\r\n }\r\n\r\n const windowCardModel = createCardModel(response.card, response.sectionRows);\r\n\r\n // Получаем список ролей для ознакомления по умолчанию\r\n const defaultRoles: { id: guid; name: string }[] = [];\r\n const defaultRolesResponseInfo = defaultRolesResponse.info;\r\n const defaultRolesDictionary = defaultRolesResponseInfo['.DefaultRoles'];\r\n if (defaultRolesDictionary) {\r\n const idsList = defaultRolesDictionary['IDList'] as TypedField[];\r\n const namesList = defaultRolesDictionary['NameList'] as TypedField[];\r\n if (idsList && namesList && idsList.length === namesList.length) {\r\n for (let i = 0; i < idsList.length; i++) {\r\n defaultRoles.push({\r\n id: idsList[i].$value,\r\n name: namesList[i].$value\r\n });\r\n }\r\n }\r\n }\r\n\r\n const rolesRows = windowCardModel.card.sections.get('DialogRoles')!.rows;\r\n for (let role of defaultRoles) {\r\n const roleRow = new CardRow();\r\n roleRow.rowId = Guid.newGuid();\r\n roleRow.set('RoleID', role.id, DotNetType.Guid);\r\n roleRow.set('RoleName', role.name, DotNetType.String);\r\n roleRow.state = CardRowState.None;\r\n rolesRows.push(roleRow);\r\n }\r\n\r\n await showFormDialog(dialogForm, windowCardModel, null, [\r\n new UIButton('$UI_Common_OK', async btn => {\r\n if (rolesRows.length === 0) {\r\n await showNotEmpty(\r\n ValidationResult.fromText(\r\n '$KrMessages_Acquaintance_RolesRequired',\r\n ValidationResultType.Warning\r\n )\r\n );\r\n return;\r\n }\r\n\r\n // Получаем комментарий\r\n const comment = windowCardModel.card.sections.get('Dialogs')!.fields.get('Comment') || '';\r\n\r\n const card = model.card;\r\n const cardId = card.id;\r\n\r\n // Запрос на отправку данных для массового ознакомления\r\n const sendAcquaintanceRequest = new CardRequest();\r\n sendAcquaintanceRequest.requestType = '87e36c4a-0cb5-4226-8580-c339b4bbf2b7'; // Acquaintance\r\n sendAcquaintanceRequest.cardId = cardId;\r\n\r\n sendAcquaintanceRequest.info['.Comment'] = createTypedField(comment, DotNetType.String);\r\n sendAcquaintanceRequest.info['.Roles'] = rolesRows.map(x => x.getField('RoleID')!);\r\n sendAcquaintanceRequest.info['.ExcludeDeputies'] = createTypedField(\r\n false,\r\n DotNetType.Boolean\r\n );\r\n sendAcquaintanceRequest.info['.AddSuccessMessage'] = createTypedField(\r\n true,\r\n DotNetType.Boolean\r\n );\r\n // sendAcquaintanceRequest.info['.PlaceholderAliases']\r\n // sendAcquaintanceRequest.info['.AdditionalInfo'];\r\n\r\n const sendAcquaintanceResponse = await CardService.instance.request(\r\n sendAcquaintanceRequest\r\n );\r\n await showNotEmpty(sendAcquaintanceResponse.validationResult.build());\r\n if (!sendAcquaintanceResponse.validationResult.isSuccessful) {\r\n return;\r\n }\r\n\r\n btn.close();\r\n }),\r\n new UIButton('$UI_Common_Cancel', btn => {\r\n btn.close();\r\n })\r\n ]);\r\n }\r\n\r\n //#endregion\r\n}\r\n","import { sendCompileRequest, CompiledCardTypes } from '../workflow/krProcess/krUIHelper';\r\nimport { TileExtension, ITileGlobalExtensionContext, Tile, TileGroups, ITileLocalExtensionContext, TileHotkey } from 'tessa/ui/tiles';\r\nimport { CardStoreMode } from 'tessa/cards';\r\n\r\nexport class StageSourceBuildTileExtension extends TileExtension {\r\n\r\n public initializingGlobal(context: ITileGlobalExtensionContext) {\r\n const panel = context.workspace.leftPanel;\r\n const contextSource = panel.contextSource;\r\n\r\n const tile = new Tile({\r\n name: 'StageSourceBuild',\r\n caption: '$UI_Tiles_StageSourceBuild',\r\n icon: 'ta icon-thin-096',\r\n contextSource,\r\n command: async () => await sendCompileRequest('.CompileWithValidationResult'),\r\n group: TileGroups.Cards,\r\n order: 26,\r\n evaluating: e => {\r\n const editor = e.currentTile.context.cardEditor;\r\n e.setIsEnabledWithCollapsing(e.currentTile,\r\n !!editor\r\n && !!editor.cardModel\r\n && CompiledCardTypes.some(x => x === editor.cardModel!.cardType.id\r\n && editor.cardModel!.card.storeMode === CardStoreMode.Update)\r\n );\r\n },\r\n toolTip: '$UI_Tiles_StageSourceBuild_ToolTip'\r\n });\r\n\r\n panel.tiles.push(tile);\r\n }\r\n\r\n public initializingLocal(context: ITileLocalExtensionContext) {\r\n const leftPanel = context.workspace.leftPanel;\r\n const tile = leftPanel.tryGetTile('StageSourceBuild');\r\n if (!tile) {\r\n return;\r\n }\r\n\r\n const hotkeyStorage = leftPanel.contextSource.hotkeyStorage;\r\n hotkeyStorage.addTileHotkey(new TileHotkey(tile, 'Ctrl+Shift+B', 'KeyB', {ctrl: true, shift: true}));\r\n }\r\n\r\n}","import { TileExtension, ITileGlobalExtensionContext, TileContextSource, ITile, Tile, TileEvaluationEventArgs } from 'tessa/ui/tiles';\r\nimport { KrTypesCache, getKrComponentsTypesCache, KrComponents, KrDocType, KrCardType, KrToken } from 'tessa/workflow';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { CardMetadataSealed } from 'tessa/cards/metadata';\r\nimport { hasFlag, hasNotFlag, createTypedField, DotNetType } from 'tessa/platform';\r\nimport { CardTypeFlags } from 'tessa/cards/types';\r\nimport { MetadataStorage } from 'tessa';\r\nimport { createCard } from 'tessa/ui/uiHost';\r\nimport { ICardModel } from 'tessa/ui/cards';\r\nimport { CardStoreMode } from 'tessa/cards';\r\nimport { tryGetFromInfo, showConfirmWithCancel, LoadingOverlay } from 'tessa/ui';\r\nimport { IStorage } from 'tessa/platform/storage';\r\n\r\nexport class KrTypesAndCreateBasedOnTileExtension extends TileExtension {\r\n\r\n //#region TileExtension\r\n\r\n public initializingGlobal(context: ITileGlobalExtensionContext) {\r\n const unavailableTypes = KrTypesCache.instance.unavailableTypes;\r\n KrTypesAndCreateBasedOnTileExtension.initializeKrTilesGlobal(context, unavailableTypes);\r\n KrTypesAndCreateBasedOnTileExtension.initializeKrCreateBasedOnTiles(context, unavailableTypes);\r\n }\r\n\r\n //#endregion\r\n\r\n //#region evaluatings\r\n\r\n private static enableIfHasDocumentCommonInfoAndNotCreating(e: TileEvaluationEventArgs) {\r\n const editor = e.currentTile.context.cardEditor;\r\n let model: ICardModel;\r\n\r\n e.setIsEnabledWithCollapsing(\r\n e.currentTile,\r\n !!editor\r\n && !!(model = editor.cardModel!)\r\n && model.card.storeMode !== CardStoreMode.Insert\r\n && !model.inSpecialMode\r\n && MetadataStorage.instance.commonMetadata\r\n .createBasedOnTypes.some(x => x === model.cardType.id));\r\n }\r\n\r\n private static enableIfNotInSpecialModeAndNotCreating(e: TileEvaluationEventArgs) {\r\n const editor = e.currentTile.context.cardEditor;\r\n let model: ICardModel;\r\n\r\n e.setIsEnabledWithCollapsing(\r\n e.currentTile,\r\n !!editor\r\n && !!(model = editor.cardModel!)\r\n && model.card.storeMode !== CardStoreMode.Insert\r\n && !model.inSpecialMode);\r\n }\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n private static initializeKrTilesGlobal(\r\n context: ITileGlobalExtensionContext,\r\n unavailableTypes: Set\r\n ) {\r\n const panel = context.workspace.rightPanel;\r\n const createCard = panel.tryGetTile('CreateCard');\r\n if (!createCard) {\r\n return;\r\n }\r\n\r\n const typesCache = KrTypesCache.instance;\r\n const cardMetadata = MetadataStorage.instance.cardMetadata;\r\n const tileIndicesToRemove: number[] = [];\r\n const groupIndicesToRemove: number[] = [];\r\n\r\n const maxTilesCountInGroupTile = 10; // TODO: получать из settings\r\n const types = typesCache\r\n .types\r\n .map(x => x)\r\n .sort((a, b) => LocalizationManager.instance.sortByLocalized(a.caption, b.caption));\r\n let groupIndex = -1;\r\n\r\n for (let groupTile of createCard.tiles) {\r\n groupIndex++;\r\n tileIndicesToRemove.length = 0;\r\n\r\n // Если будет отображаться <= maxTilesCountInGroupTile типов карточек/документов,\r\n // то список будет одноуровневым поэтому сначала подсчитаем итоговое (с учетом прав)\r\n // число типов карточек/документов\r\n const count = KrTypesAndCreateBasedOnTileExtension.countTypes(\r\n typesCache, cardMetadata, unavailableTypes, groupTile.name);\r\n if (count > maxTilesCountInGroupTile) {\r\n const tilesInGroup = groupTile.tiles;\r\n let hasVisibleTypeTile = false;\r\n let index = -1;\r\n\r\n // Группируем по типам\r\n for (let typeTile of tilesInGroup) {\r\n index++;\r\n\r\n let cardType = cardMetadata.getCardTypeByName(typeTile.name);\r\n if (cardType) {\r\n // Если для типа карточки не используются типы документов - не будет генерить под них тайлы\r\n const components = getKrComponentsTypesCache(cardType.id!, typesCache);\r\n if (hasNotFlag(components, KrComponents.DocTypes)) {\r\n if (unavailableTypes.has(cardType.id!)) {\r\n tileIndicesToRemove.push(index);\r\n } else {\r\n hasVisibleTypeTile = true;\r\n }\r\n } else { // Если для типа карточки используются типы документов\r\n // Уберем возможность создания карточки по тайлу типа карточки\r\n typeTile.command = null;\r\n KrTypesAndCreateBasedOnTileExtension.addDocTypeTiles(\r\n types as KrDocType[],\r\n panel.contextSource,\r\n typeTile.tiles,\r\n unavailableTypes,\r\n cardType.id!\r\n );\r\n\r\n // Если используем типы документов и не добавили ни одного типа документа\r\n // скроем тип карточки\r\n if (typeTile.tiles.length === 0) {\r\n tileIndicesToRemove.push(index);\r\n } else {\r\n hasVisibleTypeTile = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // если все типы карточек были скрыты, то скрываем группу типов\r\n if (!hasVisibleTypeTile) {\r\n groupIndicesToRemove.push(groupIndex);\r\n }\r\n else if (tileIndicesToRemove.length > 0) {\r\n tileIndicesToRemove.reverse();\r\n\r\n for (let i of tileIndicesToRemove) {\r\n tilesInGroup.splice(i, 1);\r\n }\r\n\r\n let order = 0;\r\n for (let tile of tilesInGroup) {\r\n tile.order = order++;\r\n }\r\n }\r\n } else {\r\n let hasDocTypes = false;\r\n\r\n // Не группируем по типам\r\n const groupTiles = groupTile.tiles;\r\n let index = -1;\r\n\r\n // при добавлении типов документа плитка, создающая тип, удаляется и тут же заменяется на плитку группу,\r\n // поэтому итерацию выполняем по коллекции-копии\r\n for (let typeTile of groupTiles.map(x => x)) {\r\n index++;\r\n\r\n const cardType = cardMetadata.getCardTypeByName(typeTile.name);\r\n if (cardType) {\r\n // Если для типа карточки не используются типы документов - не будет генерить\r\n // под них тайлы\r\n const components = getKrComponentsTypesCache(cardType.id!, typesCache);\r\n if (hasNotFlag(components, KrComponents.DocTypes)) {\r\n // Если тип карточки при этом не доступен к созданию - скроем\r\n if (unavailableTypes.has(cardType.id!)) {\r\n tileIndicesToRemove.push(index);\r\n }\r\n } else {\r\n // Тип карточки использует типы документов, поэтому удалим его тайл из тайла группы\r\n hasDocTypes = true;\r\n\r\n tileIndicesToRemove.push(index);\r\n KrTypesAndCreateBasedOnTileExtension.addDocTypeTiles(\r\n types as KrDocType[],\r\n panel.contextSource,\r\n groupTiles,\r\n unavailableTypes,\r\n cardType.id!\r\n );\r\n }\r\n }\r\n }\r\n\r\n // удаляем типы карточки, которые надо удалить\r\n tileIndicesToRemove.reverse();\r\n\r\n for (let i of tileIndicesToRemove) {\r\n groupTiles.splice(i, 1);\r\n }\r\n\r\n if (groupTiles.length === 0) {\r\n groupIndicesToRemove.push(groupIndex);\r\n } else if (hasDocTypes) {\r\n let order = 0;\r\n const orderedTiles = groupTiles\r\n .map(x => x)\r\n .sort((a, b) => LocalizationManager.instance.sortByLocalized(a.caption, b.caption));\r\n for (let typeTile of orderedTiles) {\r\n if (typeTile.name === 'Other') {\r\n typeTile.order = Number.MAX_SAFE_INTEGER;\r\n } else {\r\n typeTile.order = order++;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // удаляем группы типов карточек, которые надо удалить\r\n if (groupIndicesToRemove.length > 0) {\r\n groupIndicesToRemove.reverse();\r\n\r\n for (let i of groupIndicesToRemove) {\r\n createCard.tiles.splice(i, 1);\r\n }\r\n\r\n let order = 0;\r\n for (let tile of createCard.tiles) {\r\n tile.order = order++;\r\n }\r\n }\r\n }\r\n\r\n private static countTypes(\r\n cache: KrTypesCache,\r\n metdata: CardMetadataSealed,\r\n unavailableTypes: Set,\r\n forGroup: string | null = null,\r\n checkKrTypesOnly: boolean = false\r\n ): number {\r\n const hasGroup = !!forGroup;\r\n if (hasGroup) {\r\n forGroup = forGroup!.toLocaleLowerCase();\r\n }\r\n\r\n let result = 0;\r\n for (let cardType of metdata.cardTypes) {\r\n // Скрытые типы карточек не учитываем\r\n if (hasFlag(cardType.flags, CardTypeFlags.Hidden)) {\r\n continue;\r\n }\r\n\r\n // Если нужно посчитать количество типов для группы типов карточек\r\n const groupName = cardType.group ? cardType.group.toLocaleLowerCase() : '';\r\n if (hasGroup && groupName !== forGroup) {\r\n continue;\r\n }\r\n\r\n const components = getKrComponentsTypesCache(cardType.id!, cache);\r\n if (hasFlag(components, KrComponents.DocTypes)) {\r\n // Если тип карточки использует типы документов - считаем все типы документов\r\n // для этого типа карточки, которые не указаны как недоступные\r\n result += cache.docTypes.filter(x => x.cardTypeId === cardType.id\r\n && !unavailableTypes.has(x.id)).length;\r\n } else if (!checkKrTypesOnly || hasFlag(components, KrComponents.Base)) {\r\n // Если тип карточки не использует типы документов - считаем его, если он не\r\n // указан как недоступный\r\n if (!unavailableTypes.has(cardType.id!)) {\r\n result++;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n private static addDocTypeTiles(\r\n docTypes: ReadonlyArray,\r\n contextSource: TileContextSource,\r\n parentTiles: ITile[],\r\n unavailableTypes: Set,\r\n typeId: guid\r\n ) {\r\n const docTypesForCardType = docTypes.filter(x => x.cardTypeId === typeId);\r\n const tiles: ITile[] = [];\r\n\r\n for (let i = 0; i < docTypesForCardType.length; i++) {\r\n const docTypeId = docTypesForCardType[i].id;\r\n\r\n // Если тип документа недоступен - не будем генерить под него тайл\r\n if (unavailableTypes.has(docTypeId)) {\r\n continue;\r\n }\r\n\r\n const docTypeName = docTypesForCardType[i].name;\r\n const docTypeCaption = docTypesForCardType[i].caption;\r\n\r\n // Создаем тайл с именем и отображаемым названием соотв. подтипу\r\n const docTypeTile = new Tile({\r\n name: docTypeName,\r\n caption: docTypeCaption,\r\n icon: '',\r\n contextSource,\r\n command: async (tile) => {\r\n await LoadingOverlay.instance.show(async (splashResolve) => {\r\n await createCard({\r\n cardTypeId: typeId,\r\n context: tile.context,\r\n info: {\r\n docTypeID: createTypedField(docTypeId, DotNetType.Guid),\r\n docTypeTitle: createTypedField(docTypeName, DotNetType.String)\r\n },\r\n splashResolve\r\n });\r\n });\r\n }\r\n });\r\n\r\n tiles.push(docTypeTile);\r\n }\r\n\r\n tiles.sort((a, b) => a.caption.localeCompare(b.caption));\r\n\r\n let order = 0;\r\n for (let tile of tiles) {\r\n tile.order = order++;\r\n parentTiles.push(tile);\r\n }\r\n }\r\n\r\n private static initializeKrCreateBasedOnTiles(\r\n context: ITileGlobalExtensionContext,\r\n unavailableTypes: Set\r\n ) {\r\n const contextSource = context.workspace.leftPanel.contextSource;\r\n const typesCache = KrTypesCache.instance;\r\n const cardMetadata = MetadataStorage.instance.cardMetadata;\r\n\r\n // Добавляем корневой тайл создать на основании\r\n const createBasedOnTile = new Tile({\r\n name: 'CreateCardBasedOn',\r\n caption: '$KrTiles_CreateBasedOn',\r\n icon: 'ta icon-thin-002',\r\n contextSource,\r\n order: 100,\r\n evaluating: KrTypesAndCreateBasedOnTileExtension.enableIfHasDocumentCommonInfoAndNotCreating,\r\n toolTip: '$KrTiles_Web_CreateBasedOnTooltip'\r\n });\r\n const createBasedOnTileWithFiles = new Tile({\r\n name: 'CreateCardBasedOnWithFiles',\r\n caption: '$KrTiles_CreateBasedOnWithFiles',\r\n icon: 'ta icon-thin-002',\r\n contextSource,\r\n order: 101,\r\n evaluating: KrTypesAndCreateBasedOnTileExtension.enableIfHasDocumentCommonInfoAndNotCreating,\r\n toolTip: '$KrTiles_Web_CreateBasedOnTooltipWithFiles'\r\n });\r\n // Если будет отображаться <= maxTilesCountInTypeTile типов карточек/документов,\r\n // то список будет одноуровневым поэтому сначала подсчитаем итоговое (с учетом прав)\r\n // число типов карточек/документов\r\n const count = KrTypesAndCreateBasedOnTileExtension.countTypes(typesCache, cardMetadata, unavailableTypes, null, true);\r\n const maxTilesCountInGroupTile = 10; // TODO: получать из settings\r\n\r\n if (count > maxTilesCountInGroupTile) {\r\n KrTypesAndCreateBasedOnTileExtension.createBasedOnTilesAndGroup(context, unavailableTypes, contextSource, createBasedOnTile, false);\r\n KrTypesAndCreateBasedOnTileExtension.createBasedOnTilesAndGroup(context, unavailableTypes, contextSource, createBasedOnTileWithFiles, true);\r\n } else {\r\n KrTypesAndCreateBasedOnTileExtension.createBasedOnTilesWithoutGrouping(unavailableTypes, contextSource, createBasedOnTile, false);\r\n KrTypesAndCreateBasedOnTileExtension.createBasedOnTilesWithoutGrouping(unavailableTypes, contextSource, createBasedOnTileWithFiles, true);\r\n }\r\n\r\n if (createBasedOnTile.tiles.length > 0) {\r\n const cardOthers = context.workspace.leftPanel.tryGetTile('CardOthers')!;\r\n cardOthers.tiles.push(createBasedOnTile, createBasedOnTileWithFiles);\r\n }\r\n }\r\n\r\n private static createBasedOnTilesAndGroup(\r\n context: ITileGlobalExtensionContext,\r\n unavailableTypes: Set,\r\n contextSource: TileContextSource,\r\n createBasedOnTile: ITile,\r\n copyFiles: boolean\r\n ) {\r\n const typesCache = KrTypesCache.instance;\r\n const cardMetadata = MetadataStorage.instance.cardMetadata;\r\n const createBasedOnTileCollection = createBasedOnTile.tiles;\r\n\r\n const types = KrTypesCache.instance.cardTypes.map(x => {\r\n return {\r\n krCardType: x,\r\n groupCaption: KrTypesAndCreateBasedOnTileExtension.getCardTypeGroupLocalizedCaption(context, x)\r\n };\r\n });\r\n\r\n const groups: Map = new Map();\r\n for (let type of types) {\r\n const group = groups.get(type.groupCaption);\r\n if (!group) {\r\n groups.set(type.groupCaption, [type]);\r\n } else {\r\n group.push(type);\r\n }\r\n }\r\n\r\n const orderedGroups: string[] = [];\r\n groups.forEach((_, key) => orderedGroups.push(key));\r\n // дефолтная сортировка\r\n orderedGroups.sort((a, b) => LocalizationManager.instance.sort(a, b));\r\n\r\n const maxTiles = 10; // TODO: получать из settings\r\n let groupingTileOrder = 0;\r\n\r\n for (let key of orderedGroups) {\r\n const grouping = groups.get(key)!;\r\n grouping.sort((a, b) => LocalizationManager.instance.sortByLocalized(\r\n a.krCardType.caption, b.krCardType.caption));\r\n\r\n const groupingTile = new Tile({\r\n name: key || 'Other',\r\n caption: key || '$UI_Tiles_Other',\r\n icon: '',\r\n contextSource,\r\n order: groupingTileOrder++\r\n });\r\n\r\n groupingTile.info['.isGroup'] = true;\r\n\r\n const groupingTileCollection = groupingTile.tiles;\r\n const tilesInGroup: ITile[] = [];\r\n let tileOrderRef = {order: 0};\r\n\r\n // уже отсортированно\r\n for (let krCardType of grouping.map(x => x.krCardType)) {\r\n const metadataCardType = cardMetadata.getCardTypeById(krCardType.id);\r\n if (!metadataCardType || hasFlag(metadataCardType.flags, CardTypeFlags.Hidden)) {\r\n continue;\r\n }\r\n\r\n if (krCardType.useDocTypes) {\r\n const typeTile = new Tile({\r\n name: '.basedOn' + krCardType.name,\r\n caption: krCardType.caption,\r\n icon: '',\r\n contextSource,\r\n order: tileOrderRef.order++,\r\n evaluating: KrTypesAndCreateBasedOnTileExtension.enableIfNotInSpecialModeAndNotCreating\r\n });\r\n\r\n typeTile.info['InitialCaption'] = krCardType.caption;\r\n\r\n let hasAvailableDocTypes = true;\r\n const innerOrderRef = {order: 0};\r\n const docTypes = typesCache.docTypes.map(x => x).sort((a, b) =>\r\n LocalizationManager.instance.sortByLocalized(a.caption, b.caption));\r\n\r\n for (let docType of docTypes) {\r\n if (docType.cardTypeId !== krCardType.id\r\n || unavailableTypes.has(docType.id)\r\n ) {\r\n continue;\r\n }\r\n\r\n const basedOnDocType = KrTypesAndCreateBasedOnTileExtension.createBasedOnDocTypeTile(\r\n contextSource,\r\n innerOrderRef,\r\n docType,\r\n copyFiles\r\n );\r\n\r\n tilesInGroup.push(basedOnDocType);\r\n typeTile.tiles.push(basedOnDocType);\r\n hasAvailableDocTypes = false;\r\n }\r\n\r\n if (!hasAvailableDocTypes) {\r\n groupingTileCollection.push(typeTile);\r\n }\r\n } else {\r\n if (unavailableTypes.has(krCardType.id)) {\r\n continue;\r\n }\r\n\r\n const basedOnCardType = KrTypesAndCreateBasedOnTileExtension.createBasedOnCardTypeTile(\r\n contextSource,\r\n tileOrderRef,\r\n krCardType,\r\n copyFiles\r\n );\r\n\r\n tilesInGroup.push(basedOnCardType);\r\n groupingTileCollection.push(basedOnCardType);\r\n }\r\n }\r\n\r\n // если плиток с создаваемыми типами карточек и документов мало в пределах группы типов,\r\n // то превращаем их в плоский список\r\n if (tilesInGroup.length > 0 && tilesInGroup.length <= maxTiles) {\r\n groupingTileCollection.length = 0;\r\n let order = 0;\r\n for (let tile of tilesInGroup.sort((a, b) => LocalizationManager.instance.sortByLocalized(\r\n tryGetFromInfo(a.info, 'InitialCaption', ''), tryGetFromInfo(b.info, 'InitialCaption', '')))\r\n ) {\r\n tile.order = order++;\r\n groupingTileCollection.push(tile);\r\n }\r\n }\r\n\r\n // если в группе появилась хотя бы одна плитка, то добавляем её\r\n if (groupingTileCollection.length > 0) {\r\n createBasedOnTileCollection.push(groupingTile);\r\n }\r\n }\r\n }\r\n\r\n private static createBasedOnTilesWithoutGrouping(\r\n unavailableTypes: Set,\r\n contextSource: TileContextSource,\r\n createBasedOnTile: ITile,\r\n copyFiles: boolean\r\n ) {\r\n // этот быстрый и упрощённый метод добавления типов \"единым списком\" без группировки, используется в типовой поставке\r\n\r\n const typesCache = KrTypesCache.instance;\r\n const cardMetadata = MetadataStorage.instance.cardMetadata;\r\n const tileCollection = createBasedOnTile.tiles;\r\n let orderRef = {order: 0};\r\n const types = typesCache\r\n .types\r\n .map(x => x)\r\n .sort((a, b) => LocalizationManager.instance.sortByLocalized(a.caption, b.caption));\r\n\r\n for (let type of types) {\r\n if (type instanceof KrCardType) {\r\n const cardType = type as KrCardType;\r\n if (cardType.useDocTypes\r\n || unavailableTypes.has(cardType.id)\r\n ) {\r\n continue;\r\n }\r\n\r\n const metadataCardType = cardMetadata.getCardTypeById(cardType.id);\r\n if (!metadataCardType\r\n || hasFlag(metadataCardType.flags, CardTypeFlags.Hidden)\r\n ) {\r\n continue;\r\n }\r\n\r\n tileCollection.push(KrTypesAndCreateBasedOnTileExtension.createBasedOnCardTypeTile(\r\n contextSource,\r\n orderRef,\r\n cardType,\r\n copyFiles\r\n ));\r\n } else {\r\n const docType = type as KrDocType;\r\n if (unavailableTypes.has(docType.id)) {\r\n continue;\r\n }\r\n\r\n const metadataCardType = cardMetadata.getCardTypeById(docType.cardTypeId);\r\n if (!metadataCardType\r\n || hasFlag(metadataCardType.flags, CardTypeFlags.Hidden)\r\n ) {\r\n continue;\r\n }\r\n\r\n tileCollection.push(KrTypesAndCreateBasedOnTileExtension.createBasedOnDocTypeTile(\r\n contextSource,\r\n orderRef,\r\n docType,\r\n copyFiles\r\n ));\r\n }\r\n }\r\n }\r\n\r\n private static createBasedOnDocTypeTile(\r\n contextSource: TileContextSource,\r\n order: {order: number},\r\n docType: KrDocType,\r\n copyFiles: boolean\r\n ): ITile {\r\n const result = new Tile({\r\n name: '.basedOn' + docType.name,\r\n caption: docType.caption,\r\n icon: '',\r\n contextSource,\r\n command: async (tile) => {\r\n await KrTypesAndCreateBasedOnTileExtension.createBasedOnTileAction(tile, docType.cardTypeId, docType.cardTypeName, copyFiles,\r\n info => {\r\n info['docTypeID'] = createTypedField(docType.id, DotNetType.Guid);\r\n info['docTypeTitle'] = createTypedField(docType.name, DotNetType.String);\r\n }\r\n );\r\n },\r\n order: order.order++,\r\n evaluating: KrTypesAndCreateBasedOnTileExtension.enableIfNotInSpecialModeAndNotCreating\r\n });\r\n\r\n result.info['InitialCaption'] = docType.caption;\r\n return result;\r\n }\r\n\r\n private static createBasedOnCardTypeTile(\r\n contextSource: TileContextSource,\r\n order: {order: number},\r\n cardType: KrCardType,\r\n copyFiles: boolean\r\n ): ITile {\r\n const result = new Tile({\r\n name: '.basedOn' + cardType.name,\r\n caption: cardType.caption,\r\n icon: '',\r\n contextSource,\r\n command: async (tile) => {\r\n await KrTypesAndCreateBasedOnTileExtension.createBasedOnTileAction(tile, cardType.id, cardType.name, copyFiles);\r\n },\r\n order: order.order++,\r\n evaluating: KrTypesAndCreateBasedOnTileExtension.enableIfNotInSpecialModeAndNotCreating\r\n });\r\n\r\n result.info['InitialCaption'] = cardType.caption;\r\n return result;\r\n }\r\n\r\n private static async createBasedOnTileAction(\r\n tile: ITile,\r\n cardTypeId: guid,\r\n cardTypeName: string,\r\n copyFiles: boolean,\r\n initializeRequestAction: ((info: IStorage) => void) | null = null\r\n ) {\r\n const uiContext = tile.context;\r\n const editor = uiContext.cardEditor;\r\n let model: ICardModel;\r\n if (!editor\r\n || !(model = editor.cardModel!)\r\n ) {\r\n return;\r\n }\r\n\r\n let saveBeforeCreatingCard: boolean;\r\n if (model.hasChanges()) {\r\n const dialogResult = await showConfirmWithCancel('$UI_Cards_ConfirmSavingCardBeforeCreatingBasedOn');\r\n if (dialogResult == null) {\r\n return;\r\n }\r\n\r\n saveBeforeCreatingCard = dialogResult;\r\n } else {\r\n saveBeforeCreatingCard = false;\r\n }\r\n\r\n const requestInfo: IStorage = {};\r\n if (initializeRequestAction) {\r\n initializeRequestAction(requestInfo);\r\n }\r\n\r\n if (saveBeforeCreatingCard) {\r\n const saved = await editor.saveCard(uiContext);\r\n if (!saved) {\r\n return;\r\n }\r\n }\r\n\r\n const baseCard = editor.cardModel!.card;\r\n requestInfo['KrCreateBasedOnCardID'] = createTypedField(baseCard.id, DotNetType.Guid);\r\n requestInfo['KrCreateBasedOnCopyFiles'] = createTypedField(copyFiles, DotNetType.Boolean);\r\n\r\n const baseCardToken = KrToken.tryGet(baseCard.info);\r\n if (baseCardToken) {\r\n const tokenStorage: IStorage = {};\r\n baseCardToken.setInfo(tokenStorage);\r\n\r\n requestInfo['KrCreateBasedOnToken'] = tokenStorage;\r\n }\r\n\r\n await LoadingOverlay.instance.show(async (splashResolve) => {\r\n await createCard({\r\n cardTypeId,\r\n cardTypeName,\r\n context: tile.context,\r\n info: requestInfo,\r\n creationModeDisplayText: '$UI_Tiles_CreateCard_Suffix_BasedOn',\r\n splashResolve\r\n });\r\n });\r\n }\r\n\r\n private static getCardTypeGroupLocalizedCaption(\r\n context: ITileGlobalExtensionContext,\r\n krCardType: KrCardType\r\n ): string {\r\n const cardMetadata = MetadataStorage.instance.cardMetadata;\r\n const cardType = cardMetadata.getCardTypeById(krCardType.id);\r\n const groupCaption = cardType\r\n ? cardType.group\r\n : null;\r\n\r\n if (!groupCaption) {\r\n return '';\r\n }\r\n\r\n const captions = tryGetFromInfo(context.workspace.info, 'TypeGroupCaption', {});\r\n return captions[groupCaption] || groupCaption;\r\n }\r\n\r\n //#endregion\r\n\r\n}","import { TileExtension, ITileGlobalExtensionContext, ITileWorkspace } from 'tessa/ui/tiles';\r\nimport { tryGetFromInfo } from 'tessa/ui';\r\nimport { IStorage } from 'tessa/platform/storage';\r\n\r\nexport class ExtendedDefaultTypeGroupCaptionsTileExtension extends TileExtension {\r\n\r\n public initializingGlobal(context: ITileGlobalExtensionContext) {\r\n ExtendedDefaultTypeGroupCaptionsTileExtension.setTypeGroupCaption(context.workspace, 'Routes', '$KrTiles_Routes');\r\n }\r\n\r\n private static setTypeGroupCaption(workspace: ITileWorkspace, group: string, caption: string) {\r\n let captions = tryGetFromInfo(workspace.info, 'TypeGroupCaption', null);\r\n if (!captions) {\r\n captions = {};\r\n workspace.info['TypeGroupCaption'] = captions;\r\n }\r\n\r\n captions[group] = caption;\r\n }\r\n\r\n}","import { TileExtension, ITileGlobalExtensionContext, Tile, TileGroups, TileEvaluationEventArgs } from 'tessa/ui/tiles';\r\nimport { ICardModel, CardSavingRequest, CardSavingMode } from 'tessa/ui/cards';\r\nimport { hasFlag, createTypedField, DotNetType } from 'tessa/platform';\r\nimport { CardTypeFlags } from 'tessa/cards/types';\r\nimport { CardStoreMode } from 'tessa/cards';\r\nimport { UIContext, tryGetFromInfo } from 'tessa/ui';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { WorkflowQueue } from 'tessa/cards/workflow';\r\n\r\nexport class TestProcessTileExtension extends TileExtension {\r\n\r\n public initializingGlobal(context: ITileGlobalExtensionContext) {\r\n const contextSource = context.workspace.leftPanel.contextSource;\r\n context.workspace.leftPanel.tiles.push(\r\n new Tile({\r\n name: 'StartTestProcess',\r\n caption: '$KrTest_TestApprovalTile',\r\n icon: 'ta icon-thin-127',\r\n contextSource,\r\n command: TestProcessTileExtension.startTestProcessAction,\r\n group: TileGroups.Cards,\r\n order: 6,\r\n evaluating: TestProcessTileExtension.enableOnTestTypesAndNoProcesses\r\n }),\r\n new Tile({\r\n name: 'SendTestSignal',\r\n caption: '$KrTest_TestSignalTile',\r\n icon: 'ta icon-thin-229',\r\n contextSource,\r\n command: TestProcessTileExtension.sendTestSignalAction,\r\n group: TileGroups.Cards,\r\n order: 6,\r\n evaluating: TestProcessTileExtension.enableOnTestTypesAndHasProcesses\r\n })\r\n );\r\n }\r\n\r\n private static enableOnTestTypesAndNoProcesses(e: TileEvaluationEventArgs) {\r\n const editor = e.currentTile.context.cardEditor;\r\n let model: ICardModel;\r\n e.setIsEnabledWithCollapsing(\r\n e.currentTile,\r\n !!editor\r\n && !!(model = editor.cardModel!)\r\n && hasFlag(model.cardType.flags, CardTypeFlags.AllowTasks)\r\n && model.cardType.name === 'Car'\r\n && model.card.storeMode === CardStoreMode.Update\r\n && model.card.sections.get('WorkflowProcesses')!.rows.length === 0\r\n );\r\n }\r\n\r\n private static enableOnTestTypesAndHasProcesses(e: TileEvaluationEventArgs) {\r\n const editor = e.currentTile.context.cardEditor;\r\n let model: ICardModel;\r\n e.setIsEnabledWithCollapsing(\r\n e.currentTile,\r\n !!editor\r\n && !!(model = editor.cardModel!)\r\n && hasFlag(model.cardType.flags, CardTypeFlags.AllowTasks)\r\n && model.cardType.name === 'Car'\r\n && model.card.storeMode === CardStoreMode.Update\r\n && model.card.sections.get('WorkflowProcesses')!.rows.length > 0\r\n );\r\n }\r\n\r\n private static async startTestProcessAction() {\r\n const context = UIContext.current;\r\n const editor = context.cardEditor;\r\n\r\n if (!editor || !editor.cardModel) {\r\n return;\r\n }\r\n\r\n await editor.saveCard(\r\n context,\r\n {\r\n '.startProcess': createTypedField('TestProcess', DotNetType.String)\r\n }\r\n );\r\n }\r\n\r\n private static async sendTestSignalAction() {\r\n const context = UIContext.current;\r\n const editor = context.cardEditor;\r\n\r\n if (!editor || !editor.cardModel) {\r\n return;\r\n }\r\n\r\n await editor.saveCard(\r\n context,\r\n undefined,\r\n new CardSavingRequest(\r\n CardSavingMode.RefreshOnSuccess,\r\n (card) => {\r\n const info = card.info;\r\n let storage: IStorage;\r\n let queue: WorkflowQueue;\r\n if ((storage = tryGetFromInfo(info, '.workflowQueue', null)!)) {\r\n queue = new WorkflowQueue(storage);\r\n } else {\r\n queue = new WorkflowQueue(storage);\r\n info['.workflowQueue'] = queue.getStorage();\r\n }\r\n\r\n queue.addSignal({processTypeName: 'Main', name: 'TestSignal'});\r\n }\r\n )\r\n );\r\n }\r\n\r\n}","import Moment from 'moment';\r\nimport { TileExtension, ITileLocalExtensionContext, ITile, Tile, TileGroups } from 'tessa/ui/tiles';\r\nimport { userSession } from 'common/utility';\r\nimport { ICardModel, IControlViewModel } from 'tessa/ui/cards';\r\nimport { CardTypeFlags, CardTypeSealed, CardTypeNamedFormSealed } from 'tessa/cards/types';\r\nimport { tryGetFromInfo, UIContext, showNotEmpty, createCardModel, UIButton, showConfirm, showMessage, showError,\r\n showLoadingOverlay, createCardFileSourceForCard, createCardFileContainer } from 'tessa/ui';\r\nimport { hasNotFlag, Guid, Visibility, DbType, DotNetType } from 'tessa/platform';\r\nimport { CardStoreMode, Card, CardSection } from 'tessa/cards';\r\nimport { MetadataStorage } from 'tessa';\r\nimport { CardNewRequest, CardService, CardCreateFromTemplateRequest, CardStoreRequest } from 'tessa/cards/service';\r\nimport { showFormDialog } from 'tessa/ui/uiHost';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { ValidationResult, ValidationResultBuilder } from 'tessa/platform/validation';\r\nimport { ViewService, TessaViewRequest, ViewPagingParameters, ViewCurrentUserParameters, Paging } from 'tessa/views';\r\n\r\nexport class CreateMultipleTemplateTileExtension extends TileExtension {\r\n\r\n public initializingLocal(context: ITileLocalExtensionContext) {\r\n if (!userSession.isAdmin) {\r\n return;\r\n }\r\n\r\n const panel = context.workspace.leftPanel;\r\n const editor = panel.context.cardEditor;\r\n let model: ICardModel;\r\n let cardInTemplateType: CardTypeSealed;\r\n let cardTools: ITile;\r\n if (editor\r\n && (model = editor.cardModel!)\r\n && model.cardType.id === '7ed2fb6d-4ece-458f-9151-0c72995c2d19' // TemplateTypeID\r\n && (cardInTemplateType = tryGetFromInfo(model.info, '.cardInTemplateType'))\r\n && CreateMultipleTemplateTileExtension.typeIsAllowedForMultipleCreation(cardInTemplateType)\r\n && (cardTools = panel.tryGetTile('CardTools')!)\r\n ) {\r\n cardTools.tiles.push(\r\n new Tile({\r\n name: 'CreateMultipleCards',\r\n caption: '$UI_Tiles_CreateMultipleCards',\r\n icon: 'ta icon-thin-064',\r\n contextSource: panel.contextSource,\r\n command: CreateMultipleTemplateTileExtension.createMultipleCardsAction,\r\n group: TileGroups.Cards,\r\n order: 100,\r\n evaluating: (e) => {\r\n e.setIsEnabledWithCollapsing(\r\n e.currentTile,\r\n !!editor.cardModel\r\n && !editor.cardModel.inSpecialMode\r\n && editor.cardModel.card.storeMode === CardStoreMode.Update\r\n );\r\n }\r\n })\r\n );\r\n }\r\n }\r\n\r\n private static typeIsAllowedForMultipleCreation(cardType: CardTypeSealed): boolean {\r\n return hasNotFlag(cardType.flags, CardTypeFlags.Hidden)\r\n && hasNotFlag(cardType.flags, CardTypeFlags.Singleton);\r\n }\r\n\r\n private static getTypeInfoForMultipleCreation(\r\n cardType: CardTypeSealed,\r\n ): {\r\n hasPartner: boolean,\r\n hasAuthor: boolean\r\n } {\r\n const documentCommonInfo = cardType.schemeItems.find(x => x.sectionId === 'a161e289-2f99-4699-9e95-6e3336be8527'); // DocumentCommonInfoSectionID\r\n\r\n if (documentCommonInfo) {\r\n return {\r\n hasAuthor: documentCommonInfo.columnIdList.some(x => x === '22ed59ec-4939-4d96-a7a8-cbf0bda55ec0'), // PartnerComplexColumnID\r\n hasPartner: documentCommonInfo.columnIdList.some(x => x === 'aa152ba8-dc1f-4efa-8c68-03ba804ef6f1') // AuthorComplexColumnID\r\n };\r\n } else {\r\n return {\r\n hasAuthor: false,\r\n hasPartner: false\r\n };\r\n }\r\n }\r\n\r\n private static async createMultipleCardsAction() {\r\n const editor = UIContext.current.cardEditor;\r\n const cardMetadata = MetadataStorage.instance.cardMetadata;\r\n\r\n let modelInEditor: ICardModel;\r\n let cardInTemplateType: CardTypeSealed;\r\n let dialogType: CardTypeSealed;\r\n let dialogForm: CardTypeNamedFormSealed;\r\n if (!editor\r\n || !(modelInEditor = editor.cardModel!)\r\n || !(cardInTemplateType = tryGetFromInfo(modelInEditor.info, '.cardInTemplateType'))\r\n || !(dialogType = cardMetadata.getCardTypeByName('Dialogs')!)\r\n || !(dialogForm = dialogType.forms.find(x => x.name === 'CreateMultipleCards')!)\r\n ) {\r\n return;\r\n }\r\n\r\n const request = new CardNewRequest();\r\n request.cardTypeId = dialogType.id;\r\n const response = await CardService.instance.new(request);\r\n response.card.id = Guid.newGuid();\r\n const result = response.validationResult.build();\r\n await showNotEmpty(result);\r\n if (!result.isSuccessful) {\r\n return;\r\n }\r\n\r\n const model = createCardModel(response.card, response.sectionRows);\r\n\r\n const mainFields = model.card.sections.get('Dialogs')!.fields;\r\n const { hasPartner, hasAuthor } = CreateMultipleTemplateTileExtension.getTypeInfoForMultipleCreation(cardInTemplateType);\r\n\r\n await showFormDialog(\r\n dialogForm,\r\n model,\r\n form => {\r\n const block = form.blocks[0];\r\n if (block) {\r\n let changePartnerControl: IControlViewModel | null = null;\r\n if (!hasPartner\r\n && (changePartnerControl = block.controls.find(x => x.name === 'ChangePartner')!)\r\n ) {\r\n changePartnerControl.controlVisibility = Visibility.Collapsed;\r\n }\r\n\r\n let changeAuthorControl: IControlViewModel | null = null;\r\n if (!hasAuthor\r\n && (changeAuthorControl = block.controls.find(x => x.name === 'ChangeAuthor')!)\r\n ) {\r\n changeAuthorControl.controlVisibility = Visibility.Collapsed;\r\n }\r\n }\r\n },\r\n [\r\n UIButton.create({\r\n caption: '$UI_Cards_CreateMultipleTemplate_CreateCards',\r\n buttonAction: async btn => {\r\n const cardCount = mainFields.get('CardCount');\r\n\r\n if (cardCount > 0\r\n && await showConfirm(LocalizationManager.instance.format('$UI_Cards_CreateMultipleTemplate_Confirm', cardCount))\r\n ) {\r\n const changePartner = hasPartner && mainFields.get('ChangePartner');\r\n const changeAuthor = hasAuthor && mainFields.get('ChangeAuthor');\r\n\r\n const templateCard = modelInEditor.card.clone();\r\n\r\n const tuple = await CreateMultipleTemplateTileExtension.tryCreateMultipleCardsAsync(\r\n cardCount,\r\n changePartner,\r\n changeAuthor,\r\n templateCard\r\n );\r\n btn.close();\r\n\r\n if (tuple) {\r\n await showNotEmpty(tuple[0]);\r\n await showMessage(tuple[1]);\r\n }\r\n }\r\n },\r\n isEnabled: () => mainFields.get('CardCount') > 0\r\n }),\r\n new UIButton('$UI_Common_Cancel', btn => btn.close())\r\n ]\r\n );\r\n }\r\n\r\n private static async tryCreateMultipleCardsAsync(\r\n cardCount: number,\r\n changePartner: boolean,\r\n changeAuthor: boolean,\r\n templateCard: Card\r\n ): Promise<[ValidationResult, string]> {\r\n let successCount = 0;\r\n let elapsed: string = '';\r\n let result!: ValidationResult;\r\n\r\n await showLoadingOverlay(async () => {\r\n let partnerIterator: DirectoryIterator | null = null;\r\n if (changePartner) {\r\n const partners = await this.tryLoadDirectory('Partners', 'Partner');\r\n if (partners && partners.length > 0) {\r\n partnerIterator = new DirectoryIterator(partners);\r\n }\r\n }\r\n\r\n let userIterator: DirectoryIterator | null = null;\r\n if (changeAuthor) {\r\n const users = await this.tryLoadDirectory('Users', 'User');\r\n if (users) {\r\n let systemIndex = users.findIndex(x => x.id === '11111111-1111-1111-1111-111111111111') // SystemID\r\n if (systemIndex >= 0) {\r\n users.splice(systemIndex, 1);\r\n }\r\n if (users.length > 0) {\r\n userIterator = new DirectoryIterator(users);\r\n }\r\n }\r\n }\r\n\r\n const validationResult = new ValidationResultBuilder();\r\n const totalStart = new Date().getTime();\r\n try {\r\n\r\n for (let i = 0; i < cardCount; i++) {\r\n const request = new CardCreateFromTemplateRequest();\r\n request.templateCard = templateCard;\r\n request.getExportedCardFromTemplateCard = true;\r\n const newResponse = await CardService.instance.createFromTemplate(request);\r\n\r\n const card = newResponse.tryGetCard();\r\n if (card) {\r\n card.id = Guid.newGuid();\r\n // TODO: card.permissions = null;\r\n }\r\n\r\n if (!newResponse.validationResult.build().isSuccessful\r\n || newResponse.cancelOpening\r\n || !card\r\n ) {\r\n break;\r\n }\r\n\r\n let section: CardSection;\r\n if ((partnerIterator || userIterator)\r\n && (section = card.sections.tryGet('DocumentCommonInfo')!)\r\n ) {\r\n const fields = section.fields;\r\n if (partnerIterator) {\r\n const partner = partnerIterator.getNext();\r\n fields.set('PartnerID', partner.id, DotNetType.Guid);\r\n fields.set('PartnerName', partner.name, DotNetType.String);\r\n }\r\n\r\n if (userIterator) {\r\n const author = userIterator.getNext();\r\n fields.set('AuthorID', author.id, DotNetType.Guid);\r\n fields.set('AuthorName', author.name, DotNetType.String);\r\n }\r\n }\r\n\r\n const fileSource = createCardFileSourceForCard(card);\r\n const fileContainer = createCardFileContainer(fileSource);\r\n await fileContainer.init();\r\n const storeRequest = new CardStoreRequest();\r\n storeRequest.card = card;\r\n const storeResponse = await CardService.instance.store(storeRequest, fileContainer.files);\r\n if (!storeResponse.validationResult.build().isSuccessful) {\r\n break;\r\n }\r\n\r\n successCount++;\r\n }\r\n\r\n } finally {\r\n result = validationResult.build();\r\n const total = new Date().getTime() - totalStart;\r\n if (total > 0) {\r\n elapsed = Moment.utc(total).format('HH:mm:ss');\r\n }\r\n }\r\n });\r\n\r\n let finalMessage: string = '';\r\n\r\n finalMessage += successCount === cardCount\r\n ? LocalizationManager.instance.format('$UI_Cards_CreateMultipleTemplate_StatisticsSucceeded', cardCount)\r\n : LocalizationManager.instance.format('$UI_Cards_CreateMultipleTemplate_StatisticsFailed', successCount, cardCount);\r\n\r\n if (elapsed) {\r\n finalMessage += '\\n';\r\n finalMessage += `${LocalizationManager.instance.format('$UI_Cards_CreateMultipleTemplate_TimeElapsed', elapsed)}`;\r\n }\r\n\r\n // TimeSpan elapsedPerCard = successCount > 0\r\n // ? TimeSpan.FromMilliseconds(elapsed.TotalMilliseconds / successCount)\r\n // : TimeSpan.Zero;\r\n\r\n // if (elapsedPerCard > TimeSpan.Zero)\r\n // {\r\n // finalMessage\r\n // .AppendLine()\r\n // .AppendFormat(LocalizationManager.GetString(\"UI_Cards_CreateMultipleTemplate_AverageTimeToCreateCard\"), elapsedPerCard.TotalMilliseconds);\r\n // }\r\n\r\n return [result, finalMessage];\r\n }\r\n\r\n private static async tryLoadDirectory(\r\n viewAlias: string,\r\n entryPrefix: string\r\n ): Promise {\r\n const view = ViewService.instance.getByName(viewAlias);\r\n if (!view) {\r\n await showError(LocalizationManager.instance.format('$UI_Cards_CreateMultipleTemplate_NoAccessToDictionary', viewAlias));\r\n return null;\r\n }\r\n\r\n const viewRequest = new TessaViewRequest(view.metadata);\r\n viewRequest.calculateRowCounting = false;\r\n\r\n const viewCurrentUserParameters = new ViewCurrentUserParameters();\r\n const viewPagingParameters = new ViewPagingParameters();\r\n\r\n let currentPage = 1;\r\n let pageLimit = view.metadata.exportDataPageLimit;\r\n if (pageLimit <= 0) {\r\n pageLimit = 10000; // DefaultExportDataPageLimit\r\n }\r\n\r\n viewCurrentUserParameters.provideCurrentUserIdParameter(viewRequest.values);\r\n viewPagingParameters.providePageLimitParameter(\r\n viewRequest.values, Paging.Always, pageLimit, false\r\n );\r\n\r\n let result: DirectoryEntry[] = [];\r\n let entryIdIndex = -1;\r\n let entryNameIndex = -1;\r\n\r\n while (true) {\r\n viewPagingParameters.providePageOffsetParameter(\r\n viewRequest.values, Paging.Always, currentPage++, pageLimit, false\r\n );\r\n\r\n const viewResult = await view.getData(viewRequest);\r\n if (viewResult.rows.length === 0) {\r\n break;\r\n }\r\n\r\n if (entryIdIndex < 0) {\r\n entryIdIndex = viewResult.columns.indexOf(entryPrefix + 'ID');\r\n\r\n if (entryIdIndex < 0) {\r\n return null;\r\n }\r\n }\r\n\r\n if (entryNameIndex < 0) {\r\n entryNameIndex = viewResult.columns.indexOf(entryPrefix + 'Name');\r\n\r\n if (entryNameIndex < 0) {\r\n return null;\r\n }\r\n }\r\n\r\n for (let rowValue of viewResult.rows) {\r\n // tslint:disable-next-line:no-any\r\n const row = rowValue as any[];\r\n if (row.length <= entryIdIndex\r\n || viewResult.dataTypes[entryIdIndex] !== DbType.Guid\r\n || row.length <= entryNameIndex\r\n ) {\r\n return null;\r\n }\r\n\r\n const id = row[entryIdIndex];\r\n const name = row[entryNameIndex];\r\n const entry = new DirectoryEntry(id, name);\r\n result.push(entry);\r\n }\r\n\r\n if (viewResult.rows.length < pageLimit) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n}\r\n\r\nclass DirectoryEntry {\r\n constructor(\r\n public id: guid,\r\n public name: string\r\n ) {}\r\n}\r\n\r\nclass DirectoryIterator {\r\n constructor(\r\n private entries: DirectoryEntry[]\r\n ) {}\r\n\r\n private index = 0;\r\n\r\n public getNext() {\r\n const result = this.entries[this.index++];\r\n if (this.index === this.entries.length) {\r\n this.index = 0;\r\n }\r\n return result;\r\n }\r\n}","import { TileExtension, ITileLocalExtensionContext, Tile, TileGroups, TileEvaluationEventArgs } from 'tessa/ui/tiles';\r\nimport { userSession } from 'common/utility';\r\nimport { UIContext, UIButton, showError, showMessage, showConfirm, showLoadingOverlay, showNotEmpty } from 'tessa/ui';\r\nimport { ICardModel } from 'tessa/ui/cards';\r\nimport { showFormDialog } from 'tessa/ui/uiHost';\r\nimport { DotNetType, createTypedField } from 'tessa/platform';\r\nimport { CardSection } from 'tessa/cards';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { CardRequest, CardService, CardResponse } from 'tessa/cards/service';\r\n\r\nexport class KrSettingsTileExtension extends TileExtension {\r\n\r\n public initializingLocal(context: ITileLocalExtensionContext) {\r\n const panel = context.workspace.leftPanel;\r\n panel.tiles.push(\r\n new Tile({\r\n name: 'GenerateTestCards',\r\n caption: '$KrTiles_GenerateTestCards',\r\n icon: 'ta icon-thin-001',\r\n contextSource: panel.contextSource,\r\n command: KrSettingsTileExtension.generateAction,\r\n group: TileGroups.Cards,\r\n order: 10,\r\n evaluating: KrSettingsTileExtension.enableOnSettingsCardAndAdministrator\r\n })\r\n );\r\n }\r\n\r\n private static enableOnSettingsCardAndAdministrator(e: TileEvaluationEventArgs) {\r\n const editor = e.current.context.cardEditor;\r\n\r\n e.setIsEnabledWithCollapsing(\r\n e.currentTile,\r\n !!editor\r\n && !!editor.cardModel\r\n && editor.cardModel.cardType.id === '35a03878-57b6-4263-ae36-92eb59032132' // KrSettingsTypeID\r\n && userSession.isAdmin\r\n );\r\n }\r\n\r\n private static async generateAction() {\r\n const editor = UIContext.current.cardEditor;\r\n let model: ICardModel;\r\n if (editor\r\n && (model = editor.cardModel!)\r\n ) {\r\n const section = model.card.sections.get('KrCardGeneratorVirtual')!;\r\n const form = model.cardType.forms.find(x => x.name === 'Generator')!;\r\n\r\n await showFormDialog(\r\n form,\r\n model,\r\n () => {\r\n section.fields.set('UserCount', 0, DotNetType.Int32);\r\n section.fields.set('PartnerCount', 0, DotNetType.Int32);\r\n },\r\n [\r\n new UIButton(\r\n '$KrTiles_CreateCardsButton',\r\n btn => KrSettingsTileExtension.generateButtonAction(section, () => btn.close())\r\n ),\r\n new UIButton(\r\n '$UI_Common_Cancel',\r\n btn => btn.close()\r\n )\r\n ]\r\n );\r\n\r\n section.clearChanges();\r\n }\r\n }\r\n\r\n private static async generateButtonAction(\r\n section: CardSection,\r\n closeAction: () => void\r\n ) {\r\n const fields = section.fields;\r\n const userCount = fields.get('UserCount');\r\n if (userCount < 0) {\r\n await showError('$KrTiles_WarnUserCountNegative');\r\n return false;\r\n }\r\n\r\n const partnerCount = fields.get('PartnerCount');\r\n if (partnerCount < 0) {\r\n await showError('$KrTiles_WarnPartnerCountNegative');\r\n return false;\r\n }\r\n\r\n if (userCount === 0 && partnerCount === 0) {\r\n await showMessage('$KrTiles_WarnCardsCountNotDefined');\r\n return false;\r\n }\r\n\r\n const text = userCount === 0\r\n ? LocalizationManager.instance.localize(`$KrTiles_CreatePartnersConfirmation ${partnerCount}. $UI_Common_ContinueConfirmation`)\r\n : partnerCount === 0\r\n ? LocalizationManager.instance.localize(`$KrTiles_CreateUsersConfirmation ${userCount}. $UI_Common_ContinueConfirmation`)\r\n : `${LocalizationManager.instance.localize('$KrTiles_CreatePartnersConfirmation')} ${partnerCount}.\\n`\r\n + `${LocalizationManager.instance.localize('$KrTiles_CreateUsersConfirmation')} ${userCount}.\\n`\r\n + `${LocalizationManager.instance.localize('$UI_Common_ContinueConfirmation')}`;\r\n\r\n if (!await showConfirm(text)) {\r\n return false;\r\n }\r\n\r\n if (userCount > 1000\r\n && !await showConfirm(\r\n LocalizationManager.instance.localize(`$KrTiles_WarnTooMuchUsers ${userCount}. $UI_Common_ContinueConfirmation`),\r\n '$UI_Common_Attention'\r\n )\r\n ) {\r\n return false;\r\n }\r\n\r\n if (partnerCount > 1000\r\n && !await showConfirm(\r\n LocalizationManager.instance.localize(`$KrTiles_WarnTooMuchPartners ${partnerCount}. $UI_Common_ContinueConfirmation`),\r\n '$UI_Common_Attention'\r\n )\r\n ) {\r\n return false;\r\n }\r\n\r\n closeAction();\r\n\r\n let response!: CardResponse;\r\n await showLoadingOverlay(async () => {\r\n const request = new CardRequest();\r\n request.requestType = '207e75b5-abb8-403a-a12a-897019afccf6' // TestData\r\n request.info = {\r\n 'UserCount': createTypedField(userCount, DotNetType.Int32),\r\n 'PartnerCount': createTypedField(partnerCount, DotNetType.Int32)\r\n };\r\n response = await CardService.instance.request(request);\r\n });\r\n\r\n const result = response.validationResult.build();\r\n await showNotEmpty(result);\r\n\r\n return true;\r\n }\r\n\r\n}","\r\nconst viewsWithoutDelete = new Set([\r\n 'KrDocStateCards'\r\n]);\r\n\r\nexport function canDeleteCardFromViewDefault(viewAlias: string) {\r\n return !viewsWithoutDelete.has(viewAlias);\r\n}\r\n\r\nconst viewsWithoutExport = new Set([\r\n 'KrDocStateCards'\r\n]);\r\n\r\nexport function canExportCardFromViewDefault(viewAlias: string) {\r\n return !viewsWithoutExport.has(viewAlias);\r\n}\r\n\r\nconst viewsWithoutViewStorage = new Set([\r\n 'KrDocStateCards'\r\n]);\r\n\r\nexport function canViewCardStorageFromViewDefault(viewAlias: string) {\r\n return !viewsWithoutViewStorage.has(viewAlias);\r\n}","import { TileExtension, ITileLocalExtensionContext, TileEvaluationEventArgs } from 'tessa/ui/tiles';\r\nimport { ITessaView } from 'tessa/views';\r\nimport { canDeleteCardFromViewDefault, canExportCardFromViewDefault,\r\n canViewCardStorageFromViewDefault } from './defaultViewAliases';\r\n\r\n/**\r\n * Запрещает системные плитки \"Удалить\", \"Экспорт\" и \"Показать структуру\" для типовых представлений,\r\n * перечисленных в DefaultViewAliases.\r\n */\r\nexport class ProhibitTilesInViewsTileExtension extends TileExtension {\r\n\r\n //#region TileExtension\r\n\r\n public initializingLocal(context: ITileLocalExtensionContext) {\r\n const others = context.workspace.leftPanel.tryGetTile('ViewsOther');\r\n if (others) {\r\n const deleteTile = others.tryGetTile('DeleteCardFromView');\r\n if (deleteTile) {\r\n deleteTile.evaluating.add(ProhibitTilesInViewsTileExtension.deleteEvaluating);\r\n }\r\n\r\n const exportTile = others.tryGetTile('ExportCardFromView');\r\n if (exportTile) {\r\n exportTile.evaluating.add(ProhibitTilesInViewsTileExtension.exportEvaluating);\r\n }\r\n\r\n const exportAllTile = others.tryGetTile('ExportAllCardsFromView');\r\n if (exportAllTile) {\r\n exportAllTile.evaluating.add(ProhibitTilesInViewsTileExtension.exportEvaluating);\r\n }\r\n\r\n const viewStorageTile = others.tryGetTile('ViewStorageFromView');\r\n if (viewStorageTile) {\r\n viewStorageTile.evaluating.add(ProhibitTilesInViewsTileExtension.viewCardStorageEvaluating);\r\n }\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n private static setEnabledWithCollapsingInViewContext(\r\n e: TileEvaluationEventArgs,\r\n canProcessViewFunc: (view: ITessaView) => boolean\r\n ) {\r\n const viewContext = e.currentTile.context.viewContext;\r\n\r\n let isEnabled = false;\r\n if (viewContext) {\r\n const view = viewContext.view;\r\n const canExecute = !!view\r\n && Array.from(view.metadata.references.values())\r\n .some(x => x.openOnDoubleClick && x.isCard)\r\n && !!viewContext.selectedRow\r\n && canProcessViewFunc(view);\r\n\r\n isEnabled = canExecute;\r\n }\r\n\r\n e.setIsEnabledWithCollapsing(e.currentTile, isEnabled);\r\n }\r\n\r\n private static deleteEvaluating = (e: TileEvaluationEventArgs) =>\r\n ProhibitTilesInViewsTileExtension.setEnabledWithCollapsingInViewContext(\r\n e, view => canDeleteCardFromViewDefault(view.metadata.alias));\r\n\r\n private static exportEvaluating = (e: TileEvaluationEventArgs) =>\r\n ProhibitTilesInViewsTileExtension.setEnabledWithCollapsingInViewContext(\r\n e, view => canExportCardFromViewDefault(view.metadata.alias));\r\n\r\n private static viewCardStorageEvaluating = (e: TileEvaluationEventArgs) =>\r\n ProhibitTilesInViewsTileExtension.setEnabledWithCollapsingInViewContext(\r\n e, view => canViewCardStorageFromViewDefault(view.metadata.alias));\r\n\r\n //#endregion\r\n\r\n}","import { TileExtension, ITileGlobalExtensionContext, Tile, TileGroups, TileEvaluationEventArgs, TileHotkey, ITileLocalExtensionContext } from 'tessa/ui/tiles';\r\nimport { UIContext } from 'tessa/ui';\r\nimport { DeleteIntegerCardOperation } from 'tessa/ui/cards';\r\nimport { createTypedField, DotNetType } from 'tessa/platform';\r\nimport { userSession } from 'common/utility';\r\n\r\nexport class KrDocStateTileExtension extends TileExtension {\r\n\r\n public initializingGlobal(context: ITileGlobalExtensionContext) {\r\n const panel = context.workspace.leftPanel;\r\n\r\n const viewsOther = panel.tryGetTile('ViewsOther');\r\n if (viewsOther) {\r\n const deleteCardFromView = viewsOther.tryGetTile('DeleteCardFromView');\r\n\r\n viewsOther.tiles.push(\r\n new Tile({\r\n name: 'DeleteKrDocStateFromView',\r\n caption: '$UI_Tiles_DeleteCardFromView',\r\n icon: 'icon-thin-059',\r\n contextSource: panel.contextSource,\r\n group: TileGroups.Views,\r\n order: deleteCardFromView ? deleteCardFromView.order : 100,\r\n command: KrDocStateTileExtension.deleteKrDocStateFromViewAsync,\r\n evaluating: KrDocStateTileExtension.deleteKrDocStateFromViewEvaluating,\r\n toolTip: '$UI_Tiles_DeleteCardFromView_ToolTip'\r\n })\r\n );\r\n }\r\n }\r\n\r\n public initializingLocal(context: ITileLocalExtensionContext) {\r\n const panel = context.workspace.leftPanel;\r\n if (!panel.context.viewContext) {\r\n return;\r\n }\r\n\r\n const hotkeyStorage = panel.contextSource.hotkeyStorage;\r\n\r\n const viewsOther = panel.tryGetTile('ViewsOther');\r\n if (!viewsOther) {\r\n return;\r\n }\r\n\r\n const deleteKrDocStateFromView = viewsOther.tryGetTile('DeleteKrDocStateFromView');\r\n if (deleteKrDocStateFromView) {\r\n hotkeyStorage.addTileHotkey(new TileHotkey(deleteKrDocStateFromView, 'Ctrl+D', 'KeyD', { ctrl: true }));\r\n if (userSession.isAdmin) {\r\n hotkeyStorage.addTileHotkey(\r\n new TileHotkey(deleteKrDocStateFromView, 'Ctrl+Alt+D', 'KeyD', { ctrl: true, alt: true })\r\n );\r\n }\r\n }\r\n }\r\n\r\n private static async deleteKrDocStateFromViewAsync() {\r\n const viewContext = UIContext.current.viewContext;\r\n if (viewContext) {\r\n // не включаем режим принудительного удаления без возможности восстановления, т.к. виртуальная карточка\r\n // и так удаляется без восстановления, но режим принудительного удаления отображает другие предупреждения перед удалением\r\n const withoutBackupOnly = false;\r\n\r\n const operation = new DeleteIntegerCardOperation(\r\n (request, item) => request.info['StateID'] = createTypedField(item.cardId, DotNetType.Int32),\r\n _item => 'e83a230a-f5fc-445e-9b44-7d0140ee69f6', // KrDocStateTypeID\r\n withoutBackupOnly\r\n );\r\n\r\n await operation.startAsync(viewContext);\r\n }\r\n\r\n }\r\n\r\n private static deleteKrDocStateFromViewEvaluating(e: TileEvaluationEventArgs) {\r\n const viewContext = e.currentTile.context.viewContext;\r\n\r\n e.setIsEnabledWithCollapsing(e.currentTile,\r\n !!viewContext\r\n && !!viewContext.view\r\n && viewContext.view.metadata.alias === 'KrDocStateCards'\r\n );\r\n }\r\n\r\n}","import {\r\n TileExtension,\r\n ITileGlobalExtensionContext,\r\n Tile,\r\n TileGroups,\r\n ITileLocalExtensionContext,\r\n TileHotkey,\r\n TileEvaluationEventArgs\r\n} from 'tessa/ui/tiles';\r\nimport { UIContext, LoadingOverlay, showNotEmpty, showConfirmWithCancel } from 'tessa/ui';\r\nimport { Guid, DotNetType, createTypedField } from 'tessa/platform';\r\nimport { CardSingletonCache, CardStoreMode } from 'tessa/cards';\r\nimport { ICardModel } from 'tessa/ui/cards';\r\nimport {\r\n CardGetFileContentRequest,\r\n CardGetFileContentResponse,\r\n CardService\r\n} from 'tessa/cards/service';\r\nimport { LocalizationManager } from 'tessa/localization';\r\n\r\nconst Name = 'PrintBarcode';\r\n\r\nexport class DocLoadPrintBarcodeTileExtension extends TileExtension {\r\n public initializingGlobal(context: ITileGlobalExtensionContext) {\r\n const panel = context.workspace.leftPanel;\r\n const contextSource = panel.contextSource;\r\n\r\n // const cardOthers = panel.tryGetTile('CardOthers');\r\n // if (!cardOthers) {\r\n // return;\r\n // }\r\n\r\n const tile = new Tile({\r\n name: Name,\r\n caption: '$CardTypes_Controls_DocLoad_PrintBarcode',\r\n icon: 'ta icon-thin-181',\r\n contextSource,\r\n command: this.selectPrinterAndPrintAsync.bind(this),\r\n group: TileGroups.Cards,\r\n order: 1000,\r\n evaluating: this.evaluatingPrintBarcode,\r\n toolTip: '$CardTypes_Controls_DocLoad_PrintBarcode'\r\n });\r\n\r\n panel.tiles.push(tile);\r\n }\r\n\r\n public initializingLocal(context: ITileLocalExtensionContext) {\r\n const leftPanel = context.workspace.leftPanel;\r\n\r\n const tile = leftPanel.tryGetTile(Name);\r\n if (!tile) {\r\n return;\r\n }\r\n\r\n const hotkeyStorage = leftPanel.contextSource.hotkeyStorage;\r\n hotkeyStorage.addTileHotkey(new TileHotkey(tile, 'Alt+P', 'KeyP', { alt: true }));\r\n }\r\n\r\n private evaluatingPrintBarcode(e: TileEvaluationEventArgs) {\r\n const editor = e.currentTile.context.cardEditor;\r\n let model: ICardModel | null;\r\n\r\n const settingsCard = CardSingletonCache.instance.cards.get('DocLoad');\r\n if (!settingsCard) {\r\n return;\r\n }\r\n const fields = settingsCard.sections.tryGet('DocLoadSettings')!.fields;\r\n const isEnabled = fields.tryGet('IsEnabled');\r\n const tableName = fields.tryGet('DefaultBarcodeTableName');\r\n const fieldName = fields.tryGet('DefaultBarcodeFieldName');\r\n\r\n e.setIsEnabledWithCollapsing(\r\n e.currentTile,\r\n isEnabled &&\r\n !!editor &&\r\n !!(model = editor.cardModel) &&\r\n model.card.storeMode === CardStoreMode.Update &&\r\n model.card.sections.has(tableName) &&\r\n model.card.sections.tryGet(tableName)!.fields.has(fieldName)\r\n );\r\n }\r\n\r\n private async selectPrinterAndPrintAsync() {\r\n const context = UIContext.current;\r\n const editor = context.cardEditor;\r\n const model = editor && editor.cardModel;\r\n if (model == null) {\r\n return;\r\n }\r\n\r\n const settingsCard = CardSingletonCache.instance.cards.get('DocLoad');\r\n if (!settingsCard) {\r\n return;\r\n }\r\n\r\n const card = model.card;\r\n\r\n const barcodeBytes = await this.downloadBarcode(card.id);\r\n if (barcodeBytes == null) {\r\n return;\r\n }\r\n\r\n const imageUrl = URL.createObjectURL(barcodeBytes);\r\n\r\n const fields = settingsCard.sections.tryGet('DocLoadSettings')!.fields;\r\n const showHeader = fields.tryGet('ShowHeader');\r\n const offsetWidth = fields.tryGet('OffsetWidth');\r\n const offsetHeight = fields.tryGet('OffsetHeight');\r\n\r\n this.printImage(imageUrl, model.digest, showHeader, offsetHeight, offsetWidth);\r\n }\r\n\r\n private async downloadBarcode(cardId: string) {\r\n const context = UIContext.current;\r\n const editor = context.cardEditor;\r\n const model = editor && editor.cardModel;\r\n\r\n if (model == null) {\r\n return null;\r\n }\r\n\r\n const fileName = 'Barcode.bmp';\r\n\r\n const request = new CardGetFileContentRequest();\r\n request.cardId = cardId;\r\n request.fileId = Guid.empty;\r\n request.fileName = fileName;\r\n request.versionRowId = Guid.empty;\r\n request.fileTypeName = 'Barcode';\r\n if (model.digest) {\r\n request.info['.digest'] = createTypedField(model.digest, DotNetType.String);\r\n }\r\n\r\n let response!: CardGetFileContentResponse;\r\n await LoadingOverlay.instance.show(async () => {\r\n response = await CardService.instance.getFileContent(request);\r\n });\r\n\r\n const validationResult = response.validationResult.build();\r\n await showNotEmpty(validationResult);\r\n if (!validationResult.isSuccessful || !response.content) {\r\n return;\r\n }\r\n\r\n const content = response.content;\r\n\r\n // TODO: временный коммент: пока вместе с файлом не приходит инфа\r\n // if (response.info['RefreshCard']) {\r\n if (model.card.storeMode === CardStoreMode.Insert || model.hasChanges()) {\r\n if (!(await showConfirmWithCancel('$UI_Common_ConfirmSave'))) {\r\n return null;\r\n }\r\n }\r\n\r\n if (!(await (editor && editor.saveCard(context)))) {\r\n return null;\r\n }\r\n // }\r\n\r\n return response.hasContent ? content : null;\r\n }\r\n\r\n printImage(\r\n imagePath: string,\r\n digest: string,\r\n showHeader: boolean,\r\n offsetHeight: number = 0,\r\n offsetWidth: number = 0\r\n ) {\r\n const width = window.innerWidth;\r\n const height = window.innerHeight;\r\n const header =\r\n (showHeader &&\r\n `
${LocalizationManager.instance.localize(\r\n '$CardTypes_TypesNames_DocLoad'\r\n )}
${LocalizationManager.instance.format(\r\n '$CardTypes_Controls_DocLoad_DocNumber',\r\n digest\r\n )}
`) ||\r\n '';\r\n\r\n const content = `${header}`;\r\n const options =\r\n 'toolbar=no,location=no,directories=no,menubar=no,scrollbars=yes,width=' +\r\n width +\r\n ',height=' +\r\n height;\r\n const printWindow = window.open('', 'print', options);\r\n if (!printWindow) {\r\n return;\r\n }\r\n printWindow.document.open();\r\n printWindow.document.write(content);\r\n printWindow.document.close();\r\n printWindow.focus();\r\n }\r\n}\r\n\r\nconst launcherIcon64 =\r\n 'data:image/png;base64,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';\r\n","import { TileExtension, ITileGlobalExtensionContext, Tile, TileEvaluationEventArgs } from 'tessa/ui/tiles';\r\nimport { ICardModel } from 'tessa/ui/cards';\r\nimport { UIContext } from 'tessa/ui';\r\nimport { systemKeyPrefix } from 'tessa/cards';\r\nimport { createTypedField, DotNetType } from 'tessa/platform';\r\n\r\nexport class KrPermissionsTileExtension extends TileExtension {\r\n\r\n public initializingGlobal(context: ITileGlobalExtensionContext) {\r\n const panel = context.workspace.leftPanel;\r\n\r\n panel.tiles.push(\r\n new Tile({\r\n name: 'KrPermissionsDropCache',\r\n caption: '$KrTiles_DropPermissionsCache',\r\n icon: 'icon-thin-057',\r\n contextSource: panel.contextSource,\r\n command: this.tileAction,\r\n order: 10,\r\n evaluating: this.krPermissionsTileEvaluating\r\n })\r\n );\r\n }\r\n\r\n private krPermissionsTileEvaluating = (e: TileEvaluationEventArgs) => {\r\n const editor = e.currentTile.context.cardEditor;\r\n let model: ICardModel;\r\n\r\n e.setIsEnabledWithCollapsing(\r\n e.currentTile,\r\n !!editor\r\n && !!(model = editor.cardModel!)\r\n && model.cardType.id === 'fa9dbdac-8708-41df-bd72-900f69655dfa'); // KrPermissionsTypeID\r\n }\r\n\r\n private tileAction = async () => {\r\n const context = UIContext.current;\r\n const editor = UIContext.current.cardEditor;\r\n\r\n if (!editor) {\r\n return;\r\n }\r\n\r\n await editor.saveCard(\r\n context,\r\n {\r\n [systemKeyPrefix + 'DropPermissionsCache']: createTypedField(true, DotNetType.Boolean)\r\n }\r\n );\r\n }\r\n\r\n}","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { KrTilesExtension } from './krTilesExtension';\r\nimport { KrEditModeTileExtension } from './krEditModeTileExtension';\r\nimport { KrShowHiddenStagesTileExtension } from './krShowHiddenStagesTileExtension';\r\nimport { AcquaintanceTileExtension } from './acquaintanceTileExtension';\r\nimport { StageSourceBuildTileExtension } from './stageSourceBuildTileExtension';\r\nimport { KrTypesAndCreateBasedOnTileExtension } from './krTypesAndCreateBasedOnTileExtension';\r\nimport { ExtendedDefaultTypeGroupCaptionsTileExtension } from './extendedDefaultTypeGroupCaptionsTileExtension';\r\nimport { TestProcessTileExtension } from './testProcessTileExtension';\r\nimport { CreateMultipleTemplateTileExtension } from './createMultipleTemplateTileExtension';\r\nimport { KrSettingsTileExtension } from './krSettingsTileExtension';\r\nimport { ProhibitTilesInViewsTileExtension } from './prohibitTilesInViewsTileExtension';\r\nimport { KrDocStateTileExtension } from './krDocStateTileExtension';\r\nimport { DocLoadPrintBarcodeTileExtension } from './docLoadPrintBarcodeTileExtension';\r\nimport { KrPermissionsTileExtension } from './krPermissionsTileExtension';\r\n\r\n// Initialize\r\nExtensionContainer.instance.registerExtension({\r\n extension: ExtendedDefaultTypeGroupCaptionsTileExtension,\r\n stage: ExtensionStage.Initialize,\r\n singleton: true,\r\n order: 1\r\n});\r\n\r\n// AfterPlatform\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrTilesExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true,\r\n order: 1\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrEditModeTileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true,\r\n order: 2\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrShowHiddenStagesTileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true,\r\n order: 3\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: AcquaintanceTileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true,\r\n order: 4\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: StageSourceBuildTileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true,\r\n order: 5\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrTypesAndCreateBasedOnTileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true,\r\n order: 6\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: TestProcessTileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true,\r\n order: 7\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: CreateMultipleTemplateTileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true,\r\n order: 8\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrSettingsTileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true,\r\n order: 9\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: ProhibitTilesInViewsTileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true,\r\n order: 10\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrDocStateTileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true,\r\n order: 11\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: DocLoadPrintBarcodeTileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true,\r\n order: 13\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrPermissionsTileExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true,\r\n order: 14\r\n});\r\n","import {\r\n CardUIExtension,\r\n getCompletionOptionSettings,\r\n IBlockViewModel,\r\n ICardUIExtensionContext,\r\n IControlViewModel\r\n} from 'tessa/ui/cards';\r\nimport { DefaultFormTabWithTasksViewModel } from 'tessa/ui/cards/forms';\r\nimport { deepClone, hasNotFlag, unseal, Visibility } from 'tessa/platform';\r\nimport { CardType, CardTypeFlags, CardTypeForm } from 'tessa/cards/types';\r\nimport {\r\n createNavigateBackAction,\r\n getCaptionWithRightArrow,\r\n saveCardWithTaskModifier,\r\n TaskAction,\r\n TaskActionType,\r\n TaskActionViewModel,\r\n TaskFormContentViewModelEventArgs,\r\n TaskGroupingType,\r\n TaskNavigator,\r\n TaskViewModel,\r\n TaskViewModelEventArgs,\r\n TaskWorkspaceState\r\n} from 'tessa/ui/cards/tasks';\r\nimport {\r\n CardRowState,\r\n CardSectionType,\r\n CardSingletonCache,\r\n CardTableType,\r\n CardTaskAction,\r\n CardTaskState\r\n} from 'tessa/cards';\r\nimport { CardMetadata, CardMetadataSection } from 'tessa/cards/metadata';\r\nimport { clone } from 'tessa/platform/storage';\r\nimport { LabelViewModel } from 'tessa/ui/cards/controls';\r\n\r\n/**\r\n * Скрывает результаты запроса комментария из задания согласования если комментарий не запрашивался.\r\n * Скрывает поле \"Комментарий\" для варианта завершения \"Согласовать\", если установлена соответствующая настройка.\r\n */\r\nexport class KrUIExtension extends CardUIExtension {\r\n private _commentIsHiddenForApproval: boolean | null = null;\r\n\r\n private static postponeMetadataInitializing(e: TaskViewModelEventArgs) {\r\n const targetMetadata = unseal(e.task.postponeMetadata);\r\n const targetType = targetMetadata.cardTypes[0];\r\n const targetForm = targetType.forms[0];\r\n const targetBlocks = targetForm.blocks;\r\n\r\n // удаляем блок с информацией по заданию, т.к. он будет скопирован ниже из основной формы\r\n if (targetBlocks.length > 0) {\r\n targetBlocks.splice(0, 1);\r\n }\r\n\r\n // копируем все блоки из основной формы задания в начало формы откладывания, потом сортируем по Order\r\n const sourceType = unseal(deepClone(e.task.taskModel.cardType));\r\n const sourceForm = sourceType as CardTypeForm;\r\n targetBlocks.splice(0, 0, ...sourceForm.blocks);\r\n let order = 0;\r\n for (let block of targetBlocks) {\r\n block.order = order;\r\n order++;\r\n }\r\n\r\n // копируем настройки формы из основной формы задания в форму откладывания\r\n targetForm.formSettings = clone(sourceForm.formSettings);\r\n\r\n // копируем метаинформацию по виртуальной таблице для формы откладывания\r\n const krCommentsInfoVirtual = e.task.taskModel.cardMetadata.getSectionByName(\r\n 'KrCommentsInfoVirtual'\r\n );\r\n if (krCommentsInfoVirtual) {\r\n targetMetadata.sections.push(unseal(deepClone(krCommentsInfoVirtual)));\r\n\r\n const sourceItem = sourceType.schemeItems.find(x => x.sectionId === krCommentsInfoVirtual.id);\r\n if (sourceItem) {\r\n targetType.schemeItems.push(sourceItem);\r\n }\r\n }\r\n\r\n const krAdditionalApprovalInfoVirtual = e.task.taskModel.cardMetadata.getSectionByName(\r\n 'KrAdditionalApprovalInfoVirtual'\r\n );\r\n if (krAdditionalApprovalInfoVirtual) {\r\n targetMetadata.sections.push(\r\n unseal(deepClone(krAdditionalApprovalInfoVirtual))\r\n );\r\n\r\n const sourceItem = sourceType.schemeItems.find(\r\n x => x.sectionId === krAdditionalApprovalInfoVirtual.id\r\n );\r\n if (sourceItem) {\r\n targetType.schemeItems.push(sourceItem);\r\n }\r\n }\r\n\r\n const metadataSection = e.task.taskModel.cardMetadata.getSectionByName(\r\n 'KrAdditionalApprovalsRequestedInfoVirtual'\r\n );\r\n if (metadataSection) {\r\n targetMetadata.sections.push(unseal(deepClone(metadataSection)));\r\n const sourceItem = sourceType.schemeItems.find(x => x.sectionId === metadataSection.id);\r\n if (sourceItem) {\r\n targetType.schemeItems.push(sourceItem);\r\n }\r\n }\r\n }\r\n\r\n private static postponeContentInitializing(e: TaskFormContentViewModelEventArgs) {\r\n let sourceSection = e.task.taskModel.card.sections.tryGet('KrCommentsInfoVirtual');\r\n if (!sourceSection) {\r\n return;\r\n }\r\n\r\n let targetSection = e.card.sections.tryGet('KrCommentsInfoVirtual');\r\n if (!targetSection) {\r\n return;\r\n }\r\n\r\n targetSection.setFrom(sourceSection);\r\n\r\n sourceSection = e.task.taskModel.card.sections.tryGet('KrAdditionalApprovalInfoVirtual');\r\n if (!sourceSection) {\r\n return;\r\n }\r\n\r\n targetSection = e.card.sections.tryGet('KrAdditionalApprovalInfoVirtual');\r\n if (!targetSection) {\r\n return;\r\n }\r\n\r\n targetSection.setFrom(sourceSection);\r\n\r\n sourceSection = e.task.taskModel.card.sections.tryGet('SequenceProvider');\r\n if (!sourceSection) {\r\n return;\r\n }\r\n targetSection = e.card.sections.tryGet('KrAdditionalApprovalsRequestedInfoVirtual');\r\n if (!targetSection) {\r\n return;\r\n }\r\n targetSection.setFrom(sourceSection);\r\n }\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n const model = context.model;\r\n if (\r\n !(model.mainForm instanceof DefaultFormTabWithTasksViewModel) ||\r\n hasNotFlag(model.cardType.flags, CardTypeFlags.AllowTasks)\r\n ) {\r\n return;\r\n }\r\n\r\n const formWithTasks = model.mainForm as DefaultFormTabWithTasksViewModel;\r\n\r\n for (let taskViewModel of formWithTasks.tasks) {\r\n this.modifyTaskAndAttachHandlers(taskViewModel);\r\n this.modifyUniversalTask(taskViewModel);\r\n this.modifyDialogTask(taskViewModel);\r\n }\r\n }\r\n\r\n private commentIsHiddenForApproval = (): boolean => {\r\n if (this._commentIsHiddenForApproval != null) {\r\n return this._commentIsHiddenForApproval;\r\n }\r\n\r\n const krSettings = CardSingletonCache.instance.cards.get('KrSettings');\r\n if (!krSettings) {\r\n this._commentIsHiddenForApproval = false;\r\n return false;\r\n }\r\n\r\n const value = krSettings.sections.get('KrSettings')!.fields.get('HideCommentForApprove');\r\n this._commentIsHiddenForApproval = value;\r\n return value;\r\n };\r\n\r\n private modifyTaskAndAttachHandlers(taskViewModel: TaskViewModel) {\r\n const taskModel = taskViewModel.taskModel;\r\n if (\r\n (taskModel.cardType.id !== 'e4d7f6bf-fea9-4a3b-8a5a-e1a0a40de74c' && // KrApproveTypeID\r\n taskModel.cardType.id !== 'b3d8eae3-c6bf-4b59-bcc7-461d526c326c' && // KrAdditionalApprovalTypeID\r\n taskModel.cardType.id !== '968d68b3-a7c5-4b5d-bfa4-bb0f346880b6') || // KrSigningTypeID\r\n taskModel.cardTask!.isLockedEffective\r\n ) {\r\n return;\r\n }\r\n\r\n let commentBlock: IBlockViewModel;\r\n // скрываем блок с комментариями в текущем представлении\r\n if (\r\n taskModel.card.sections.get('KrCommentsInfoVirtual')!.rows.length === 0 &&\r\n !!(commentBlock = taskModel.blocks.get('CommentsBlockShort')!)\r\n ) {\r\n // Если секция есть, но ее поля незаполнены - значит запроса комментария не было\r\n commentBlock.blockVisibility = Visibility.Collapsed;\r\n }\r\n\r\n if (\r\n taskModel.cardType.id === 'e4d7f6bf-fea9-4a3b-8a5a-e1a0a40de74c' || // KrApproveTypeID\r\n taskModel.cardType.id === 'b3d8eae3-c6bf-4b59-bcc7-461d526c326c' // KrAdditionalApprovalTypeID\r\n ) {\r\n let additionalApprovalBlock: IBlockViewModel;\r\n // скрываем блок с заданиями доп согласования в текущем представлении\r\n if (\r\n taskModel.card.sections.get('KrAdditionalApprovalInfoVirtual')!.rows.length === 0 &&\r\n !!(additionalApprovalBlock = taskModel.blocks.get('AdditionalApprovalBlockShort')!)\r\n ) {\r\n // Если секция есть, но ее поля незаполнены - значит запроса комментария не было\r\n additionalApprovalBlock.blockVisibility = Visibility.Collapsed;\r\n }\r\n\r\n // Скрываем блок с запрошенными заданиями доп согласования в текущем задании\r\n let additionalApprovalsRequestedInfoTable: IControlViewModel;\r\n if (\r\n taskModel.card.sections.tryGet('KrAdditionalApprovalsRequestedInfoVirtual') &&\r\n taskModel.card.sections.tryGet('KrAdditionalApprovalsRequestedInfoVirtual')!.rows.length ===\r\n 0 &&\r\n !!(additionalApprovalsRequestedInfoTable = taskModel.controls.get(\r\n 'AdditionalApprovalsRequestedInfoTable'\r\n )!)\r\n ) {\r\n // Если секция есть, но ее поля незаполнены - значит запроса комментария не было\r\n additionalApprovalsRequestedInfoTable.controlVisibility = Visibility.Collapsed;\r\n }\r\n }\r\n\r\n // в начальной форме задания гарантированно нет поля \"Комментарий\",\r\n // которое может понадобиться скрыть для варианта \"Согласовать\"\r\n\r\n // скрываем блок с комментариями в других представлениях\r\n taskViewModel.workspaceChanged.add(e => {\r\n // получить блок по taskModel.Blocks.TryGet нельзя, т.к. для формы откладывания заданий будет свой экземпляр блока,\r\n // при этом TryGet вернёт блок для предыдущей формы карточки\r\n\r\n const form = e.task.taskWorkspace.form;\r\n if (!form) {\r\n return;\r\n }\r\n\r\n const blocks = form.blocks;\r\n let innerCommentBlock: IBlockViewModel;\r\n if (\r\n taskModel.card.sections.get('KrCommentsInfoVirtual')!.rows.length === 0 &&\r\n !!(innerCommentBlock = blocks.find(x => x.name === 'CommentsBlockShort')!)\r\n ) {\r\n // Если секция есть, но ее поля незаполнены - значит запроса комментария не было\r\n innerCommentBlock.blockVisibility = Visibility.Collapsed;\r\n }\r\n\r\n if (\r\n taskModel.cardType.id === 'e4d7f6bf-fea9-4a3b-8a5a-e1a0a40de74c' || // KrApproveTypeID\r\n taskModel.cardType.id === 'b3d8eae3-c6bf-4b59-bcc7-461d526c326c' // KrAdditionalApprovalTypeID\r\n ) {\r\n let innerAdditionalApprovalBlock: IBlockViewModel;\r\n if (\r\n taskModel.card.sections.get('KrAdditionalApprovalInfoVirtual')!.rows.length === 0 &&\r\n !!(innerAdditionalApprovalBlock = blocks.find(\r\n x => x.name === 'AdditionalApprovalBlockShort'\r\n )!)\r\n ) {\r\n // Если секция есть, но ее поля незаполнены - значит запроса комментария не было\r\n innerAdditionalApprovalBlock.blockVisibility = Visibility.Collapsed;\r\n }\r\n\r\n // Скрываем блок с запрошенными заданиями доп согласования в текущем задании.\r\n let additionalApprovalsRequestedInfoTable: IControlViewModel;\r\n if (\r\n taskModel.card.sections.tryGet('KrAdditionalApprovalsRequestedInfoVirtual') &&\r\n taskModel.card.sections.tryGet('KrAdditionalApprovalsRequestedInfoVirtual')!.rows\r\n .length === 0 &&\r\n !!(additionalApprovalsRequestedInfoTable = taskModel.controls.get(\r\n 'AdditionalApprovalsRequestedInfoTable'\r\n )!)\r\n ) {\r\n // Если секция есть, но ее поля незаполнены - значит запроса комментария не было\r\n additionalApprovalsRequestedInfoTable.controlVisibility = Visibility.Collapsed;\r\n }\r\n\r\n // скрываем поле \"Комментарий\" для варианта завершения \"Согласовать\"\r\n let approvalCommentBlock: IBlockViewModel;\r\n if (\r\n form.name === 'Approve' &&\r\n this.commentIsHiddenForApproval() &&\r\n !!(approvalCommentBlock = blocks.find(x => x.name === 'CommentBlock')!)\r\n ) {\r\n approvalCommentBlock.blockVisibility = Visibility.Collapsed;\r\n }\r\n }\r\n });\r\n\r\n // подписываемся на построение метаинформации и виртуальной карточки для формы откладывания задания\r\n taskViewModel.postponeMetadataInitializing.add(KrUIExtension.postponeMetadataInitializing);\r\n taskViewModel.postponeContentInitializing.add(KrUIExtension.postponeContentInitializing);\r\n }\r\n\r\n private modifyDialogTask(taskViewModel: TaskViewModel) {\r\n const taskModel = taskViewModel.taskModel;\r\n if (\r\n taskModel.cardType.id === '5309ce42-c4d2-4e99-a733-697c589311e7' && // KrShowDialogTypeID\r\n taskModel.cardTask!.isPerformer\r\n ) {\r\n taskViewModel.modifyWorkspace(e => {\r\n if (e.task.taskWorkspace.form && !!e.task.taskWorkspace.form.name) {\r\n return;\r\n }\r\n\r\n const co = getCompletionOptionSettings(\r\n e.task.taskModel.cardTask!.settings,\r\n 'a9067834-1a01-468c-976b-0ec7a9939331'\r\n ); // ShowDialog\r\n if (!co) {\r\n return;\r\n }\r\n\r\n const action = e.task.taskWorkspace.actions.find(\r\n x => x.completionOption!.id === 'a9067834-1a01-468c-976b-0ec7a9939331'\r\n ); // ShowDialog\r\n if (action && !!co.taskButtonCaption) {\r\n action.caption = co.taskButtonCaption;\r\n }\r\n });\r\n }\r\n }\r\n\r\n private modifyUniversalTask(taskViewModel: TaskViewModel) {\r\n const taskModel = taskViewModel.taskModel;\r\n if (\r\n taskModel.cardType.id === '9c6d9824-41d7-41e6-99f1-e19ea9e576c5' && // KrUniversalTaskTypeID\r\n taskModel.cardTask &&\r\n taskModel.cardTask.isPerformer &&\r\n taskModel.cardTask.storedState === CardTaskState.InProgress\r\n ) {\r\n taskViewModel.modifyWorkspace(e => this.modifyUniversalTaskAction(e.task));\r\n }\r\n }\r\n\r\n private modifyUniversalTaskAction = (task: TaskViewModel) => {\r\n if (task.taskWorkspace.form) {\r\n return;\r\n }\r\n\r\n const actionsInitialCount = task.taskWorkspace.actions.length;\r\n let additionalActionsInitialCount = task.taskWorkspace.additionalActions.length;\r\n const taskModel = task.taskModel;\r\n const section = taskModel.card.sections.getOrAdd('KrUniversalTaskOptions');\r\n section.type = CardSectionType.Table;\r\n section.tableType = CardTableType.Collection;\r\n const rowsStorage = section.rows;\r\n const rows = rowsStorage.map(x => x);\r\n rows.sort((a, b) => a.get('Order') - b.get('Order'));\r\n for (let row of rows) {\r\n const optionId = row.get('OptionID');\r\n const caption = row.get('Caption');\r\n const showComment = row.get('ShowComment');\r\n const message = row.get('Message');\r\n const additional = row.get('Additional');\r\n\r\n if (additional) {\r\n const index = task.taskWorkspace.additionalActions.length - additionalActionsInitialCount;\r\n\r\n task.taskWorkspace.additionalActions.splice(\r\n index,\r\n 0,\r\n this.generateTaskAction(\r\n task.taskNavigator,\r\n optionId,\r\n caption,\r\n message,\r\n showComment ? 'WithComment' : ''\r\n )\r\n );\r\n } else {\r\n task.taskWorkspace.actions.splice(\r\n task.taskWorkspace.actions.length - actionsInitialCount,\r\n 0,\r\n this.generateTaskAction(\r\n task.taskNavigator,\r\n optionId,\r\n caption,\r\n message,\r\n showComment ? 'WithComment' : ''\r\n )\r\n );\r\n }\r\n }\r\n };\r\n\r\n private generateTaskAction(\r\n navigator: TaskNavigator,\r\n optionId: guid,\r\n caption: string,\r\n message: string,\r\n showComment: string\r\n ): TaskAction {\r\n return !message && !showComment\r\n ? new TaskActionViewModel(\r\n caption,\r\n () =>\r\n saveCardWithTaskModifier(navigator.taskModel, task => {\r\n task.action = CardTaskAction.Complete;\r\n task.state = CardRowState.Deleted;\r\n task.optionId = optionId;\r\n }),\r\n TaskActionType.Complete,\r\n TaskGroupingType.Default,\r\n null,\r\n navigator.taskModel\r\n )\r\n : new TaskActionViewModel(\r\n getCaptionWithRightArrow(caption),\r\n () => {\r\n navigator.navigateToForm(TaskWorkspaceState.OptionForm, ExtendedTaskForm, [\r\n this.generateTaskAction(navigator, optionId, caption, '', ''),\r\n createNavigateBackAction(navigator)\r\n ]);\r\n\r\n const newTaskModel = navigator.taskModel;\r\n let blockViewModel: IBlockViewModel | undefined;\r\n if ((blockViewModel = newTaskModel.blocks.get(ExtendedTaskForm))) {\r\n let controlViewModel: IControlViewModel | undefined;\r\n if (\r\n (controlViewModel = blockViewModel.controls.find(p => p.name === 'MessageLabel'))\r\n ) {\r\n const label = controlViewModel as LabelViewModel;\r\n if (message) {\r\n label.controlVisibility = Visibility.Visible;\r\n label.text = message;\r\n } else {\r\n label.controlVisibility = Visibility.Collapsed;\r\n }\r\n }\r\n\r\n if ((controlViewModel = blockViewModel.controls.find(p => p.name === 'Comment'))) {\r\n controlViewModel.controlVisibility = showComment\r\n ? Visibility.Visible\r\n : Visibility.Collapsed;\r\n }\r\n }\r\n },\r\n TaskActionType.NavigateToForm,\r\n TaskGroupingType.Default,\r\n null,\r\n navigator.taskModel\r\n );\r\n }\r\n}\r\n\r\nconst ExtendedTaskForm = 'Extended';\r\n","\r\nexport class StageGroup {\r\n\r\n //#region ctor\r\n\r\n constructor(id: guid, name: string, order: number) {\r\n this.id = id;\r\n this.name = name;\r\n this.order = order;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region props\r\n\r\n public readonly id: guid;\r\n\r\n public readonly name: string;\r\n\r\n public readonly order: number;\r\n\r\n //#endregion\r\n\r\n}","\r\nexport class StageType {\r\n\r\n //#region ctor\r\n\r\n constructor(id: guid, caption: string, defaultStage: string) {\r\n this.id = id;\r\n this.caption = caption;\r\n this.defaultStage = defaultStage;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region props\r\n\r\n public readonly id: guid;\r\n\r\n public readonly caption: string;\r\n\r\n public readonly defaultStage: string;\r\n\r\n //#endregion\r\n\r\n}","import { observable, action, computed } from 'mobx';\r\nimport { StageGroup } from './stageGroup';\r\nimport { StageType } from './stageType';\r\n\r\nexport class StageSelectorViewModel {\r\n //#region ctor\r\n\r\n constructor(group: StageGroup | null, cardId: guid, typeId: guid) {\r\n this.group = group;\r\n this.cardId = cardId;\r\n this.typeId = typeId;\r\n this.groups = [];\r\n this.types = [];\r\n this.selectedGroupIndex = -1;\r\n this.selectedTypeIndex = -1;\r\n this._typesCache = new Map();\r\n }\r\n\r\n //#endregion\r\n\r\n //#region fields\r\n\r\n private _typesCache: Map;\r\n\r\n //#endregion\r\n\r\n //#region props\r\n\r\n public readonly group: StageGroup | null;\r\n\r\n public readonly cardId: guid;\r\n\r\n public readonly typeId: guid;\r\n\r\n @observable.ref\r\n public readonly groups: ReadonlyArray;\r\n\r\n @observable.ref\r\n public _types: ReadonlyArray;\r\n\r\n @computed\r\n public get types(): ReadonlyArray {\r\n return this._types;\r\n }\r\n\r\n public set types(value: ReadonlyArray) {\r\n this._types = value;\r\n }\r\n\r\n @observable\r\n public selectedGroupIndex: number;\r\n\r\n @computed\r\n public get selectedGroup(): StageGroup | null {\r\n if (this.selectedGroupIndex < 0 || this.selectedGroupIndex >= this.groups.length) {\r\n return null;\r\n }\r\n\r\n return this.groups[this.selectedGroupIndex];\r\n }\r\n\r\n @observable\r\n public selectedTypeIndex: number;\r\n\r\n @computed\r\n public get selectedType(): StageType | null {\r\n if (this.selectedTypeIndex < 0 || this.selectedTypeIndex >= this.types.length) {\r\n return null;\r\n }\r\n\r\n return this.types[this.selectedTypeIndex];\r\n }\r\n\r\n public getGroupTypesFunc: (\r\n group: StageGroup | null,\r\n cardId: guid,\r\n typeId: guid\r\n ) => Promise;\r\n\r\n public getStageTypesFunc: (groupType: guid, cardId: guid, typeId: guid) => Promise;\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n @action.bound\r\n public async refresh() {\r\n if (!this.getGroupTypesFunc) {\r\n return;\r\n }\r\n (this.groups as StageGroup[]) = await this.getGroupTypesFunc(\r\n this.group,\r\n this.cardId,\r\n this.typeId\r\n );\r\n this.selectedGroupIndex = this.groups.length > 0 ? 0 : -1;\r\n }\r\n\r\n @action.bound\r\n public async updateType() {\r\n (this.types as StageType[]) = [];\r\n this.setSelectedTypeIndex(-1);\r\n if (this.selectedGroup) {\r\n let types = this._typesCache.get(this.selectedGroup.id);\r\n if (types) {\r\n this.types = types;\r\n } else {\r\n types = await this.getStageTypesFunc(this.selectedGroup.id, this.cardId, this.typeId);\r\n this._typesCache.set(this.selectedGroup.id, types);\r\n this.types = types;\r\n }\r\n\r\n if (this.types.length > 0) {\r\n this.setSelectedTypeIndex(0);\r\n }\r\n }\r\n }\r\n\r\n @action.bound\r\n public setSelectedGroupIndex(index: number) {\r\n this.selectedGroupIndex = index;\r\n }\r\n\r\n @action.bound\r\n public setSelectedTypeIndex(index: number) {\r\n this.selectedTypeIndex = index;\r\n }\r\n\r\n //#endregion\r\n}\r\n","import * as React from 'react';\r\nimport { observer } from 'mobx-react';\r\nimport styled from 'styled-components';\r\nimport { StageGroup } from './stageGroup';\r\nimport { StageType } from './stageType';\r\nimport { StageSelectorViewModel } from './stageSelectorViewModel';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport {\r\n Dialog,\r\n DialogContainer,\r\n DialogContent,\r\n DialogHeader,\r\n DialogFooter,\r\n RaisedButton\r\n} from 'ui';\r\nimport { Grid, GridUIViewModel } from 'components/cardElements';\r\n\r\nconst StageDialog = styled(Dialog)`\r\n background: ${props => props.theme.card.cardSelectorBackground};\r\n`;\r\n\r\nexport interface StageSelectorDialogProps {\r\n viewModel: StageSelectorViewModel;\r\n onClose: (\r\n args: {\r\n cancel: boolean;\r\n group: StageGroup | null;\r\n type: StageType | null;\r\n }\r\n ) => void;\r\n}\r\n\r\n@observer\r\n// tslint:disable-next-line:max-line-length\r\nexport class StageSelectorDialog extends React.Component {\r\n //#region ctor\r\n\r\n constructor(props: StageSelectorDialogProps) {\r\n super(props);\r\n }\r\n\r\n //#endregion\r\n\r\n //#region react\r\n\r\n public render() {\r\n // const { viewModel } = this.props;\r\n\r\n const groupsGridVM = new GridUIViewModel({\r\n canSelectMultipleItems: false,\r\n rows: this.getGroupsRows(),\r\n headers: this.getGroupsHeader()\r\n });\r\n\r\n const typesGridVM = new GridUIViewModel({\r\n canSelectMultipleItems: false,\r\n rows: this.getTypesRows(),\r\n headers: this.getTypesHeader()\r\n });\r\n\r\n return (\r\n \r\n \r\n \r\n {LocalizationManager.instance.localize('$UI_Cards_SelectGroupAndType')}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n }\r\n\r\n //#endregion\r\n\r\n //#region renders\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n private getGroupsHeader = () => {\r\n return [\r\n {\r\n alias: 'name',\r\n caption: LocalizationManager.instance.localize('$Views_KrStageTemplates_StageGroup')\r\n }\r\n ];\r\n }\r\n\r\n private getGroupsRows = () => {\r\n const { viewModel } = this.props;\r\n\r\n if (viewModel.groups.length === 0) {\r\n return [];\r\n }\r\n\r\n return viewModel.groups.map((group, index) => ({\r\n rowId: group.id,\r\n // order: group.order,\r\n cells: [{ content: LocalizationManager.instance.localize(group.name) }],\r\n getIsSelected: () => {\r\n return viewModel.selectedGroupIndex === index;\r\n },\r\n getIsLastSelected: () => {\r\n return viewModel.selectedGroupIndex === index;\r\n },\r\n setSelected: () => {\r\n const { viewModel } = this.props;\r\n if (viewModel.selectedGroupIndex === index) {\r\n return;\r\n }\r\n\r\n viewModel.setSelectedGroupIndex(index);\r\n viewModel.updateType();\r\n }\r\n }));\r\n }\r\n\r\n private getTypesHeader = () => {\r\n return [\r\n {\r\n alias: 'name',\r\n caption: LocalizationManager.instance.localize('$Views_KrStageTemplates_Types')\r\n }\r\n ];\r\n }\r\n\r\n private getTypesRows = () => {\r\n const { viewModel } = this.props;\r\n\r\n if (viewModel.types.length === 0) {\r\n return [];\r\n }\r\n\r\n return viewModel.types.map((type, index) => ({\r\n rowId: type.id,\r\n // order: i,\r\n cells: [{ content: LocalizationManager.instance.localize(type.caption) }],\r\n getIsSelected: () => {\r\n return viewModel.selectedTypeIndex === index;\r\n },\r\n getIsLastSelected: () => {\r\n return viewModel.selectedTypeIndex === index;\r\n },\r\n setSelected: () => {\r\n viewModel.setSelectedTypeIndex(index);\r\n }\r\n }));\r\n }\r\n\r\n //#endregion\r\n\r\n //#region handlers\r\n\r\n private handleCloseForm = () => {\r\n this.props.onClose({\r\n cancel: true,\r\n group: null,\r\n type: null\r\n });\r\n };\r\n\r\n private handleCloseFormWithResult = () => {\r\n const { viewModel } = this.props;\r\n\r\n this.props.onClose({\r\n cancel: false,\r\n group: viewModel.selectedGroup,\r\n type: viewModel.selectedType\r\n });\r\n };\r\n\r\n //#endregion\r\n}\r\n","\r\nexport enum InfoAboutChanges {\r\n None = 0x0,\r\n HasChangesToInfo = 0x1,\r\n ChangesListToInfo = 0x2,\r\n HasChangesToValidationResult = 0x4,\r\n ChangesListToValidationResult = 0x8,\r\n ChangesInHiddenStages = 0x16,\r\n ToInfo = HasChangesToInfo | ChangesListToInfo,\r\n ToInfoIncludingHiddenStages = ToInfo | ChangesInHiddenStages,\r\n ToValidationResult = HasChangesToValidationResult | ChangesListToValidationResult,\r\n ToValidationResultIncludingHiddenStages = ToValidationResult | ChangesInHiddenStages,\r\n Full = ToInfoIncludingHiddenStages | ToValidationResultIncludingHiddenStages,\r\n}","import { ICardModel, IControlViewModel, IFormViewModel, IBlockViewModel } from 'tessa/ui/cards';\r\nimport {\r\n TabControlViewModel,\r\n ContainerViewModel,\r\n ControlViewModelBase\r\n} from 'tessa/ui/cards/controls';\r\nimport { BlockViewModelBase } from 'tessa/ui/cards/blocks';\r\n\r\n// tslint:disable:no-any\r\n\r\nexport abstract class BreadthFirstControlVisitor {\r\n protected abstract visitControl(control: IControlViewModel);\r\n\r\n protected abstract visitBlock(block: IBlockViewModel);\r\n\r\n public visitByCard(cardModel: ICardModel) {\r\n const queue: any[] = [];\r\n for (let block of cardModel.blocks) {\r\n this.enqueueBlock(block[1], queue);\r\n }\r\n for (let form of cardModel.forms) {\r\n this.enqueueForm(form, queue);\r\n }\r\n\r\n this.visitInternal(queue);\r\n }\r\n\r\n public visitByRootControl(rootControl: IControlViewModel) {\r\n const queue: any[] = [];\r\n if (rootControl instanceof TabControlViewModel) {\r\n this.enqueueTabs(rootControl, queue);\r\n } else if (rootControl instanceof ContainerViewModel) {\r\n this.enqueueForm(rootControl.form, queue);\r\n }\r\n\r\n this.visitInternal(queue);\r\n }\r\n\r\n public visitByForm(form: IFormViewModel) {\r\n const queue: any[] = [];\r\n this.enqueueForm(form, queue);\r\n this.visitInternal(queue);\r\n }\r\n\r\n public visitByBlock(block: IBlockViewModel) {\r\n const queue: any[] = [];\r\n this.enqueueBlock(block, queue);\r\n this.visitInternal(queue);\r\n }\r\n\r\n private visitInternal(queue: any[]) {\r\n while (queue.length !== 0) {\r\n const item = queue.shift();\r\n if (item instanceof ControlViewModelBase) {\r\n this.visitControl(item);\r\n\r\n if (item instanceof TabControlViewModel) {\r\n this.enqueueTabs(item, queue);\r\n } else if (item instanceof ContainerViewModel) {\r\n this.enqueueForm(item.form, queue);\r\n }\r\n } else if (item instanceof BlockViewModelBase) {\r\n this.visitBlock(item);\r\n this.enqueueBlock(item, queue);\r\n }\r\n }\r\n }\r\n\r\n private enqueueTabs(tabControl: TabControlViewModel, queue: any[]) {\r\n for (let tab of tabControl.tabs) {\r\n this.enqueueForm(tab, queue);\r\n }\r\n }\r\n\r\n private enqueueForm(form: IFormViewModel, queue: any[]) {\r\n for (let block of form.blocks) {\r\n queue.push(block);\r\n }\r\n }\r\n\r\n private enqueueBlock(block: IBlockViewModel, queue: any[]) {\r\n for (let control of block.controls) {\r\n queue.push(control);\r\n }\r\n }\r\n}\r\n","import { BreadthFirstControlVisitor } from './breadthFirstControlVisitor';\r\nimport { TabControlViewModel } from 'tessa/ui/cards/controls';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { IBlockViewModel, IFormViewModel, IControlViewModel } from 'tessa/ui/cards';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { tryGetFromInfo } from 'tessa/ui';\r\nimport { CardFieldChangedEventArgs, StringControlType } from 'tessa/cards';\r\nimport { CardTypeEntryControl } from 'tessa/cards/types';\r\n\r\nexport class TabContentIndicator {\r\n\r\n //#region ctor\r\n\r\n constructor(\r\n tabControl: TabControlViewModel,\r\n fieldsStorage: IStorage,\r\n fieldIds: [guid, string][],\r\n updateBlockHeader: boolean = false\r\n ) {\r\n this._fieldsStorage = fieldsStorage;\r\n if (updateBlockHeader) {\r\n this._blockViewModel = tabControl.block;\r\n this._originalBlockName = this._blockViewModel.caption;\r\n }\r\n\r\n const visitor = new Visitor(this._fieldTabMapping, fieldIds);\r\n for (let i = 0; i < tabControl.tabs.length; i++) {\r\n const tab = tabControl.tabs[i];\r\n this._tabs.push(tab);\r\n this._originalTabNames.push(tab.tabCaption || '');\r\n visitor.index = i;\r\n visitor.visitByForm(tab);\r\n }\r\n\r\n const tmpMapping =\r\n Array.from(this._fieldTabMapping)\r\n .reduce((rv, x) => {\r\n rv.has(x[1])\r\n ? rv.get(x[1])!.push(x[0])\r\n : rv.set(x[1], [x[0]]);\r\n return rv;\r\n }, new Map()); // groupBy value\r\n this._tabFieldsMapping =\r\n Array.from(tmpMapping)\r\n .map(x => {\r\n return {\r\n tabOrder: x[0],\r\n fields: x[1]\r\n };\r\n })\r\n .sort((a, b) => a.tabOrder - b.tabOrder)\r\n .map(x => x.fields);\r\n\r\n this._hasContent = this._originalTabNames.map(_ => false);\r\n }\r\n\r\n //#endregion\r\n\r\n //#region fields\r\n\r\n private _fieldsStorage: IStorage;\r\n\r\n private _blockViewModel: IBlockViewModel | null = null;\r\n\r\n private _originalBlockName: string;\r\n\r\n private _hasContent: boolean[];\r\n\r\n private _originalTabNames: string[] = [];\r\n\r\n private _tabs: IFormViewModel[] = [];\r\n\r\n private _tabFieldsMapping: string[][];\r\n\r\n private _fieldTabMapping: Map = new Map();\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n public update() {\r\n for (let i = 0; i < this._tabs.length; i++) {\r\n this._hasContent[i] = this.updateTabName(i);\r\n }\r\n\r\n if (this._blockViewModel) {\r\n this._blockViewModel.caption = this._hasContent.some(x => !!x)\r\n ? LocalizationManager.instance.format('$KrProcess_TabContainsText', this._originalBlockName)\r\n : this._originalBlockName;\r\n }\r\n }\r\n\r\n private updateTabName(index: number): boolean {\r\n const tab = this._tabs[index];\r\n const fields = this._tabFieldsMapping[index];\r\n for (let field of fields) {\r\n if (tryGetFromInfo(this._fieldsStorage, field)) {\r\n tab.tabCaption = LocalizationManager.instance.format('$KrProcess_TabContainsText', this._originalTabNames[index]);\r\n return true;\r\n }\r\n }\r\n\r\n tab.tabCaption = this._originalTabNames[index];\r\n return false;\r\n }\r\n\r\n public fieldChangedAction = (e: CardFieldChangedEventArgs) => {\r\n const index = this._fieldTabMapping.get(e.fieldName);\r\n if (index == null) {\r\n return;\r\n }\r\n\r\n this._hasContent[index] = this.updateTabName(index);\r\n\r\n if (this._blockViewModel) {\r\n this._blockViewModel.caption = this._hasContent.some(x => !!x)\r\n ? LocalizationManager.instance.format('$KrProcess_TabContainsText', this._originalBlockName)\r\n : this._originalBlockName;\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n}\r\n\r\nclass Visitor extends BreadthFirstControlVisitor {\r\n\r\n private _fieldTabMapping: Map;\r\n private _fieldIds: [guid, string][];\r\n\r\n constructor(\r\n fieldTabMapping: Map,\r\n fieldIds: [guid, string][]\r\n ) {\r\n super();\r\n\r\n this._fieldTabMapping = fieldTabMapping;\r\n this._fieldIds = fieldIds;\r\n }\r\n\r\n public index: number;\r\n\r\n protected visitControl(control: IControlViewModel) {\r\n if (control.cardTypeControl instanceof CardTypeEntryControl\r\n && control.cardTypeControl.type === StringControlType\r\n ) {\r\n for (let colId of control.cardTypeControl.physicalColumnIdList) {\r\n const fieldName = this._fieldIds.find(x => x[0] === colId);\r\n if (fieldName) {\r\n this._fieldTabMapping.set(fieldName[1], this.index);\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected visitBlock(_block: IBlockViewModel) {}\r\n\r\n}","import {\r\n CardFieldChangedEventArgs,\r\n FieldMapStorage,\r\n ICardFieldContainer,\r\n StringControlType\r\n} from 'tessa/cards';\r\nimport { CardTypeEntryControl } from 'tessa/cards/types';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { IControlViewModel, IBlockViewModel } from 'tessa/ui/cards';\r\nimport { BreadthFirstControlVisitor } from './breadthFirstControlVisitor';\r\n\r\nexport class ControlContentIndicatorVisitor extends BreadthFirstControlVisitor {\r\n //#region ctor\r\n constructor(fieldSectionMapping: Map, fieldIDs: Map) {\r\n super();\r\n\r\n this._fieldSectionMapping = fieldSectionMapping;\r\n this._fieldIDs = fieldIDs;\r\n }\r\n //#endregion\r\n\r\n //#region fields\r\n\r\n private _index: number;\r\n private _fieldSectionMapping: Map;\r\n private _fieldIDs: Map;\r\n\r\n //#endregion\r\n\r\n //#region props\r\n\r\n public get index(): number {\r\n return this._index;\r\n }\r\n public set index(value: number) {\r\n this._index = value;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n protected visitControl(control: IControlViewModel) {\r\n const { cardTypeControl } = control;\r\n if (\r\n cardTypeControl instanceof CardTypeEntryControl &&\r\n cardTypeControl.type.name === StringControlType.name\r\n ) {\r\n for (const colID of cardTypeControl.physicalColumnIdList) {\r\n const key = this._fieldIDs.get(colID);\r\n if (key) {\r\n this._fieldSectionMapping.set(key, this.index);\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected visitBlock(_block: IBlockViewModel) {}\r\n\r\n //#endregion\r\n}\r\n\r\nexport abstract class ControlContentIndicator {\r\n //#region ctor\r\n\r\n constructor(\r\n controls: readonly T[],\r\n cardFieldContainer: ICardFieldContainer,\r\n fieldIDs: Map,\r\n parentBlockViewModel: IBlockViewModel | null = null,\r\n indicatorFormat: string = '$KrProcess_TabContainsText'\r\n ) {\r\n this._controls = controls;\r\n this._cardFieldContainer = cardFieldContainer;\r\n this._indicatorFormat = indicatorFormat;\r\n\r\n if (parentBlockViewModel) {\r\n this._parentBlock = parentBlockViewModel;\r\n this._originalParentBlockName = this._parentBlock.caption;\r\n }\r\n\r\n const fieldControlsMapping = new Map();\r\n const visitor = new ControlContentIndicatorVisitor(fieldControlsMapping, fieldIDs);\r\n\r\n const controlsCount = controls.length;\r\n this._originalControlNames = [];\r\n\r\n for (let i = 0; i < controlsCount; i++) {\r\n const control = controls[i];\r\n\r\n if (!control) {\r\n throw new Error('The parameter contains a null value: controls');\r\n }\r\n\r\n this._originalControlNames.push(this.getDisplayName(control));\r\n visitor.index = i;\r\n this.visitControl(visitor, control);\r\n }\r\n\r\n this._fieldControlsMapping = fieldControlsMapping;\r\n\r\n const groups: { order: number; fields: string[] }[] = [];\r\n for (const entry of fieldControlsMapping.entries()) {\r\n let i = groups.findIndex(g => g.order === entry[1]);\r\n if (i === -1) {\r\n groups.push({ order: entry[1], fields: [] });\r\n i = groups.length - 1;\r\n }\r\n groups[i].fields.push(entry[0]);\r\n }\r\n\r\n this._controlFieldsMapping = groups\r\n .sort((a, b) => (a === null || b === null ? 0 : a.order - b.order))\r\n .map(g => g.fields);\r\n\r\n this._hasContentControls = new Array(controlsCount).fill(false);\r\n\r\n this.update();\r\n this._cardFieldContainer.fieldChanged.add(this.fieldChangeAcion);\r\n }\r\n\r\n //#endregion\r\n\r\n //#region fields\r\n\r\n private _fieldControlsMapping: Map;\r\n\r\n private _controlFieldsMapping: readonly string[][];\r\n\r\n private _controls: readonly T[];\r\n\r\n private readonly _cardFieldContainer: ICardFieldContainer;\r\n\r\n private readonly _parentBlock: IBlockViewModel;\r\n\r\n private readonly _originalControlNames: string[];\r\n\r\n private readonly _originalParentBlockName: string;\r\n\r\n private readonly _hasContentControls: boolean[];\r\n\r\n private readonly _indicatorFormat: string;\r\n\r\n private _disposedValue: boolean;\r\n\r\n protected abstract visitControl(visitor: ControlContentIndicatorVisitor, control: T);\r\n\r\n protected abstract getDisplayName(control: T): string;\r\n\r\n protected abstract setDisplayName(control: T, name: string);\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n private fieldChangeAcion = (e: CardFieldChangedEventArgs) => {\r\n const index = this._fieldControlsMapping.get(e.fieldName);\r\n\r\n if (index == null) {\r\n return;\r\n }\r\n\r\n this.updateIndex(index);\r\n this.updateParentBlockCaption();\r\n };\r\n\r\n private update() {\r\n for (let i = 0; i < this._controls.length; i++) {\r\n const hasContent = this.checkContent(i);\r\n this.updateControlName(i, hasContent);\r\n\r\n this._hasContentControls[i] = hasContent;\r\n }\r\n\r\n this.updateParentBlockCaption();\r\n }\r\n\r\n private updateIndex(index: number) {\r\n const hasContent = this.checkContent(index);\r\n this.updateControlName(index, hasContent);\r\n\r\n this._hasContentControls[index] = hasContent;\r\n }\r\n\r\n private updateControlName(index: number, hasContent: boolean) {\r\n const control = this._controls[index];\r\n\r\n this.setDisplayName(\r\n control,\r\n hasContent\r\n ? this.getNewName(this._originalControlNames[index])\r\n : this._originalControlNames[index]\r\n );\r\n }\r\n\r\n private checkContent(index: number): boolean {\r\n if (!(this._cardFieldContainer instanceof FieldMapStorage)) {\r\n return false;\r\n }\r\n\r\n for (const field of this._controlFieldsMapping[index]) {\r\n if (!!this._cardFieldContainer.getField(field)?.$value) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private updateParentBlockCaption() {\r\n if (this._parentBlock != null) {\r\n this._parentBlock.caption = this._hasContentControls.find(v => v)\r\n ? this.getNewName(this._originalParentBlockName)\r\n : this._originalParentBlockName;\r\n }\r\n }\r\n\r\n private getNewName(originalName: string): string {\r\n return LocalizationManager.instance.format(this._indicatorFormat, originalName);\r\n }\r\n\r\n public dispose = () => {\r\n if (this._disposedValue) {\r\n return;\r\n }\r\n\r\n this._cardFieldContainer.fieldChanged.remove(this.fieldChangeAcion);\r\n this._disposedValue = true;\r\n };\r\n\r\n //#endregion\r\n}\r\n","import { ICardFieldContainer } from 'tessa/cards';\r\nimport { ControlContentIndicator, ControlContentIndicatorVisitor } from './controlContentIndicator';\r\nimport { IBlockViewModel } from 'tessa/ui/cards';\r\n\r\nexport class BlockContentIndicator extends ControlContentIndicator {\r\n constructor(\r\n block: IBlockViewModel,\r\n cardFieldContainer: ICardFieldContainer,\r\n fieldIDs: Map\r\n ) {\r\n super([block], cardFieldContainer, fieldIDs);\r\n }\r\n\r\n protected visitControl(visitor: ControlContentIndicatorVisitor, control: IBlockViewModel) {\r\n visitor.visitByBlock(control);\r\n }\r\n protected getDisplayName(control: IBlockViewModel): string {\r\n return control.caption;\r\n }\r\n protected setDisplayName(control: IBlockViewModel, name: string) {\r\n control.caption = name;\r\n }\r\n}\r\n","import { StageGroup } from './stageGroup';\r\nimport { StageType } from './stageType';\r\nimport { StageSelectorViewModel } from './stageSelectorViewModel';\r\nimport { StageSelectorDialog } from './stageSelectorDialog';\r\nimport { designTimeCard, runtimeCard } from '../../workflow/krProcess/krUIHelper';\r\nimport { TabContentIndicator } from '../tabContentIndicator';\r\nimport { BlockContentIndicator } from '../blockContentIndicator';\r\nimport { hasFlag, DotNetType, Visibility, Guid } from 'tessa/platform';\r\nimport { TessaViewRequest, ViewService, RequestParameterBuilder } from 'tessa/views';\r\nimport { RequestParameter, equalsCriteriaOperator } from 'tessa/views/metadata';\r\nimport { showError, showViewModelDialog, tryGetFromSettings, UIButton, MenuAction } from 'tessa/ui';\r\nimport {\r\n CardUIExtension,\r\n ICardUIExtensionContext,\r\n IBlockViewModel,\r\n ICardModel,\r\n IControlViewModel,\r\n IFormViewModel\r\n} from 'tessa/ui/cards';\r\nimport { BlockViewModelBase } from 'tessa/ui/cards/blocks';\r\nimport {\r\n GridViewModel,\r\n GridRowAddingEventArgs,\r\n GridRowEventArgs,\r\n TabControlViewModel,\r\n ContainerViewModel,\r\n ControlViewModelBase,\r\n GridRowAction,\r\n GridRowValidationEventArgs,\r\n GridRowViewModel\r\n} from 'tessa/ui/cards/controls';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport {\r\n CardRow,\r\n CardRowState,\r\n CardSection,\r\n CardFieldChangedEventArgs,\r\n userKeyPrefix,\r\n Card\r\n} from 'tessa/cards';\r\nimport {\r\n KrTypesCache,\r\n KrComponents,\r\n getKrComponentsByCard,\r\n PerformerUsageMode,\r\n KrToken,\r\n CanSkipStages\r\n} from 'tessa/workflow';\r\nimport {\r\n KrStageTypeUIHandlerContext,\r\n KrStageTypeUIHandler,\r\n KrStageTypeFormatter,\r\n KrStageTypeFormatterContext\r\n} from 'tessa/workflow/krProcess';\r\nimport { IExtensionExecutor, ExtensionContainer } from 'tessa/extensions';\r\nimport { userSession } from 'common/utility';\r\nimport { ValidationResult, ValidationResultType } from 'tessa/platform/validation';\r\nimport { MetadataStorage } from 'tessa';\r\n\r\nexport class KrStageUIExtension extends CardUIExtension {\r\n currentRow: CardRow | null;\r\n _dispose: Array = [];\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n const cardModel = context.model;\r\n\r\n this.setTabIndication(cardModel, 'KrStageTemplates', 'CSharpSourceTable');\r\n this.setTabIndication(cardModel, 'KrStageGroups', 'CSharpSourceTableDesign');\r\n this.setTabIndication(cardModel, 'KrStageGroups', 'CSharpSourceTableRuntime');\r\n this.setBlockIndication(cardModel, 'KrSecondaryProcesses', 'VisibilityScriptsBlock');\r\n this.setBlockIndication(cardModel, 'KrSecondaryProcesses', 'ExecutionScriptsBlock');\r\n\r\n // Для шаблона этапов и вторички тоже выполняем расширение без проверки компонентов\r\n if (!designTimeCard(cardModel.cardType.id!)) {\r\n // KrStageTemplateTypeID\r\n const usedComponents = getKrComponentsByCard(cardModel.card, KrTypesCache.instance);\r\n // Выходим если нет согласования\r\n if (!hasFlag(usedComponents, KrComponents.Routes)) {\r\n return;\r\n }\r\n }\r\n\r\n const approvalStagesTable = cardModel.controls.get('ApprovalStagesTable') as GridViewModel;\r\n if (!approvalStagesTable) {\r\n return;\r\n }\r\n\r\n if (!designTimeCard(cardModel.cardType.id!)) {\r\n approvalStagesTable.leftButtons.push(\r\n UIButton.create({\r\n caption: '$CardTypes_Buttons_ActivateStage',\r\n buttonAction: () => this.activateStagesHandler(approvalStagesTable.selectedRows),\r\n isEnabled: () =>\r\n this.hasEnableActivateStageButton(cardModel.card, approvalStagesTable.selectedRows)\r\n })\r\n );\r\n\r\n approvalStagesTable.contextMenuGenerators.push(ctx => {\r\n ctx.menuActions.push(\r\n MenuAction.create({\r\n name: 'ActivateStage',\r\n caption: '$CardTypes_Buttons_ActivateStage',\r\n action: () => this.activateStagesHandler(approvalStagesTable.selectedRows),\r\n isCollapsed: this.hasEnableActivateStageButton(\r\n cardModel.card,\r\n approvalStagesTable.selectedRows\r\n )\r\n })\r\n );\r\n });\r\n\r\n // for (let approvalStageRow of approvalStagesTable.rows.filter(i => !!i.row.tryGet('Hidden'))) {\r\n // approvalStageRow.cells.forEach(c => c.style.backgroundColor = 'rgba(220,220,220, 1)');\r\n // }\r\n }\r\n\r\n approvalStagesTable.rowAdding.add(this.addStageDialog);\r\n approvalStagesTable.rowInitializing.add(this.showSettingsBlock);\r\n approvalStagesTable.rowInvoked.add(this.bindUIHandlers);\r\n approvalStagesTable.rowInvoked.add(this.bindTimeFieldsRadio);\r\n approvalStagesTable.rowInvoked.add(args => (this.currentRow = args.row));\r\n approvalStagesTable.rowEditorClosing.add(this.handleFormatRow);\r\n approvalStagesTable.rowValidating.add(this.validateViaHandlers);\r\n approvalStagesTable.rowValidating.add(this.validateTimeLimit);\r\n approvalStagesTable.rowValidating.add(this.validatePerformers);\r\n approvalStagesTable.rowEditorClosed.add(this.unbindUIHandlers);\r\n approvalStagesTable.rowEditorClosed.add(this.unbindTimeFieldsRadio);\r\n approvalStagesTable.rowEditorClosed.add(() => (this.currentRow = null));\r\n\r\n const stagesSec = context.card.sections.tryGet('KrStagesVirtual');\r\n if (stagesSec) {\r\n for (let row of stagesSec.rows) {\r\n this.formatRow(row, cardModel, false);\r\n }\r\n }\r\n }\r\n\r\n public finalized() {\r\n for (let func of this._dispose) {\r\n if (func) {\r\n func();\r\n }\r\n }\r\n this._dispose.length = 0;\r\n }\r\n\r\n //#region fields\r\n\r\n private _krStageTypeUIHandlerExecutor: IExtensionExecutor | null;\r\n\r\n //#endregion\r\n\r\n //#region handlers\r\n\r\n private addStageDialog = async (args: GridRowAddingEventArgs) => {\r\n const card = args.cardModel.card;\r\n let group: StageGroup | null = null;\r\n\r\n const krStageTemplates = card.sections.tryGet('KrStageTemplates');\r\n const krSecondaryProcesses = card.sections.tryGet('KrSecondaryProcesses');\r\n const hasGroup = !!krStageTemplates || !!krSecondaryProcesses;\r\n if (hasGroup) {\r\n if (krStageTemplates) {\r\n const groupId = krStageTemplates.fields.tryGet('StageGroupID');\r\n if (groupId != null) {\r\n group = new StageGroup(groupId, krStageTemplates.fields.tryGet('StageGroupName')!, 0);\r\n }\r\n } else if (krSecondaryProcesses) {\r\n group = new StageGroup(card.id, krSecondaryProcesses.fields.tryGet('Name')!, 0);\r\n }\r\n }\r\n\r\n const commonInfo = card.sections.tryGet('DocumentCommonInfo');\r\n let type = commonInfo ? commonInfo.fields.tryGet('DocTypeID') : null;\r\n type = type ? type : card.typeId;\r\n\r\n const viewModel = new StageSelectorViewModel(group, card.id, type);\r\n viewModel.getGroupTypesFunc = async (\r\n groupVm: StageGroup | null,\r\n cardId: guid,\r\n typeId: guid\r\n ) => {\r\n if (hasGroup && !groupVm) {\r\n // группа не выбрана в шаблоне этапов\r\n return [];\r\n }\r\n\r\n if (groupVm) {\r\n return [groupVm];\r\n }\r\n\r\n const stageGroupsView = ViewService.instance.getByName('KrFilteredStageGroups')!;\r\n const request = new TessaViewRequest(stageGroupsView.metadata);\r\n\r\n const cardIdParam = new RequestParameterBuilder()\r\n .withMetadata(stageGroupsView.metadata.parameters.get('CardId')!)\r\n .addCriteria(equalsCriteriaOperator(), '', cardId)\r\n .asRequestParameter();\r\n request.values.push(cardIdParam);\r\n\r\n const typeIdParam = new RequestParameterBuilder()\r\n .withMetadata(stageGroupsView.metadata.parameters.get('TypeId')!)\r\n .addCriteria(equalsCriteriaOperator(), '', typeId)\r\n .asRequestParameter();\r\n request.values.push(typeIdParam);\r\n\r\n const result = await stageGroupsView.getData(request);\r\n return result.rows.map(x => new StageGroup(x[0], x[1], x[4]));\r\n };\r\n\r\n viewModel.getStageTypesFunc = async (groupType: guid, cardId: guid, typeId: guid) => {\r\n if (hasGroup && !group) {\r\n // группа не выбрана в шаблоне этапов\r\n return [];\r\n }\r\n\r\n const stageTypesView = ViewService.instance.getByName('KrFilteredStageTypes')!;\r\n const request = new TessaViewRequest(stageTypesView.metadata);\r\n\r\n if (designTimeCard(typeId)) {\r\n const isTemplateParam = new RequestParameterBuilder()\r\n .withMetadata(stageTypesView.metadata.parameters.get('IsTemplate')!)\r\n .addCriteria(equalsCriteriaOperator(), '', true)\r\n .asRequestParameter();\r\n request.values.push(isTemplateParam);\r\n }\r\n\r\n const param = new RequestParameterBuilder()\r\n .withMetadata(stageTypesView.metadata.parameters.get('StageGroupIDParam')!)\r\n .addCriteria(equalsCriteriaOperator(), '', groupType)\r\n .asRequestParameter();\r\n request.values.push(param);\r\n\r\n const cardIdParam = new RequestParameterBuilder()\r\n .withMetadata(stageTypesView.metadata.parameters.get('CardId')!)\r\n .addCriteria(equalsCriteriaOperator(), '', cardId)\r\n .asRequestParameter();\r\n request.values.push(cardIdParam);\r\n\r\n const typeIdMetadata = stageTypesView.metadata.parameters.get('TypeId')!;\r\n let typeIdParam: RequestParameter | null = null;\r\n if (designTimeCard(typeId)) {\r\n const typeRows = card.sections.get('KrStageTypes')!.rows;\r\n if (typeRows.length > 0) {\r\n const typeIdSet = new Set();\r\n\r\n for (let row of typeRows) {\r\n if (row.state !== CardRowState.Deleted) {\r\n const templateTypeId = row.get('TypeID');\r\n if (templateTypeId) {\r\n typeIdSet.add(templateTypeId);\r\n }\r\n }\r\n }\r\n\r\n if (typeIdSet.size > 0) {\r\n const typeIdBuilder = new RequestParameterBuilder().withMetadata(typeIdMetadata);\r\n\r\n for (let id of typeIdSet) {\r\n typeIdBuilder.addCriteria(equalsCriteriaOperator(), '', id);\r\n }\r\n\r\n typeIdParam = typeIdBuilder.asRequestParameter();\r\n }\r\n }\r\n } else {\r\n typeIdParam = new RequestParameterBuilder()\r\n .withMetadata(typeIdMetadata)\r\n .addCriteria(equalsCriteriaOperator(), '', typeId)\r\n .asRequestParameter();\r\n }\r\n\r\n if (typeIdParam) {\r\n request.values.push(typeIdParam);\r\n }\r\n\r\n const result = await stageTypesView.getData(request);\r\n return result.rows.map(x => new StageType(x[0], x[1], x[2]));\r\n };\r\n\r\n await viewModel.refresh();\r\n await viewModel.updateType();\r\n\r\n if (viewModel.groups.length === 0) {\r\n await showError('$UI_Error_NoAvailableStageGroups');\r\n args.cancel = true;\r\n return;\r\n }\r\n\r\n let result: {\r\n cancel: boolean;\r\n group: StageGroup | null;\r\n type: StageType | null;\r\n };\r\n if (viewModel.groups.length === 1 && viewModel.types.length === 1) {\r\n result = {\r\n cancel: false,\r\n group: viewModel.groups[0],\r\n type: viewModel.types[0]\r\n };\r\n } else {\r\n result = await showViewModelDialog(viewModel, StageSelectorDialog);\r\n }\r\n\r\n if (!result.group || !result.type) {\r\n args.cancel = true;\r\n return;\r\n }\r\n\r\n args.row.set('StageGroupID', result.group.id, DotNetType.Guid);\r\n args.row.set('StageGroupName', result.group.name, DotNetType.String);\r\n args.row.set('StageGroupOrder', result.group.order, DotNetType.Int32);\r\n args.row.set('StageTypeID', result.type.id, DotNetType.Guid);\r\n args.row.set('StageTypeCaption', result.type.caption, DotNetType.String);\r\n args.row.set(\r\n 'Name',\r\n LocalizationManager.instance.localize(result.type.defaultStage),\r\n DotNetType.String\r\n );\r\n\r\n if (!designTimeCard(args.cardModel.cardType.id!)) {\r\n const rows = args.rows;\r\n const groupId = result.group.id;\r\n const groupOrder = result.group.order;\r\n\r\n args.rowIndex = ((): number => {\r\n if (rows.length === 0) {\r\n return 0;\r\n }\r\n\r\n let rowIndex = 0;\r\n const getId = (): guid => rows[rowIndex].tryGet('StageGroupID', Guid.empty);\r\n const getOrder = (): number =>\r\n rows[rowIndex].tryGet('StageGroupOrder', Number.MAX_SAFE_INTEGER);\r\n const nestedStage = (): boolean => !!rows[rowIndex].tryGet(userKeyPrefix + 'NestedStage');\r\n\r\n const cnt = rows.length;\r\n\r\n // Достигаем начало требуемой группы\r\n while (\r\n rowIndex < cnt &&\r\n ((getId() !== groupId && getOrder() < groupOrder) || nestedStage())\r\n ) {\r\n rowIndex++;\r\n }\r\n\r\n // На нестеде тут мы быть не можем, т.к. пропустили возможные нестеды выше\r\n // Проверим, что мы в конце или на другой группе\r\n if (rows.length === rowIndex || (getId() !== groupId && getOrder() !== groupOrder)) {\r\n // Текущая группа последняя\r\n // В текущей группе нет этапов, просто добавляем на нужное место.\r\n return rowIndex;\r\n }\r\n\r\n const firstIndexInGroup = rowIndex;\r\n rowIndex++;\r\n\r\n // Спускаемся до конца группы\r\n while (\r\n rowIndex < cnt &&\r\n ((getId() === groupId && getOrder() === groupOrder) || nestedStage())\r\n ) {\r\n rowIndex++;\r\n }\r\n\r\n // Поднимаемся вверх до возможного места добавления\r\n let position = rowIndex;\r\n const sortedRows = rows.map(x => x).sort((a, b) => a.get('Order') - b.get('Order'));\r\n for (let i = rowIndex - 1; i >= firstIndexInGroup; i--) {\r\n const row = sortedRows[i];\r\n if (row.tryGet(userKeyPrefix + 'NestedStage')) {\r\n continue;\r\n }\r\n\r\n const posId = row.tryGet('BasedOnStageTemplateGroupPositionID');\r\n const orderChanged = row.tryGet('OrderChanged');\r\n if (\r\n // tslint:disable-next-line:triple-equals\r\n posId != undefined &&\r\n posId === 1 && // AtLast\r\n // tslint:disable-next-line:triple-equals\r\n orderChanged != undefined &&\r\n !orderChanged\r\n ) {\r\n position = i;\r\n }\r\n }\r\n\r\n return position;\r\n })();\r\n }\r\n };\r\n\r\n private showSettingsBlock = (args: GridRowEventArgs) => {\r\n if (!args.rowModel) {\r\n return;\r\n }\r\n\r\n const commonBlock = args.rowModel.blocks.get('StageCommonInfoBlock');\r\n if (commonBlock) {\r\n this.setOptionalControlVisibility(commonBlock, 'TimeLimitInput', args);\r\n this.setOptionalControlVisibility(commonBlock, 'PlannedInput', args);\r\n this.setOptionalControlVisibility(commonBlock, 'HiddenStageCheckbox', args);\r\n this.setOptionalControlVisibility(commonBlock, 'CanBeSkipCheckbox', args);\r\n }\r\n\r\n const performersBlock = args.rowModel.blocks.get('PerformersBlock');\r\n if (performersBlock) {\r\n const singleVisibility = this.setOptionalControlVisibility(\r\n performersBlock,\r\n 'SinglePerformerEntryAC',\r\n args\r\n );\r\n const multipleVisibility = this.setOptionalControlVisibility(\r\n performersBlock,\r\n 'MultiplePerformersTableAC',\r\n args\r\n );\r\n\r\n const sqlPerformersLinkBlock = args.rowModel.blocks.get('KrSqlPerformersLinkBlock');\r\n if (sqlPerformersLinkBlock && multipleVisibility === Visibility.Visible) {\r\n sqlPerformersLinkBlock.blockVisibility = Visibility.Visible;\r\n }\r\n\r\n if (singleVisibility === Visibility.Visible) {\r\n this.setControlCaption(performersBlock, 'SinglePerformerEntryAC', args);\r\n }\r\n if (multipleVisibility === Visibility.Visible) {\r\n this.setControlCaption(performersBlock, 'MultiplePerformersTableAC', args);\r\n }\r\n }\r\n\r\n const authorBlock = args.rowModel.blocks.get('AuthorBlock');\r\n if (authorBlock) {\r\n this.setOptionalControlVisibility(authorBlock, 'AuthorEntryAC', args);\r\n }\r\n\r\n const taskKindBlock = args.rowModel.blocks.get('TaskKindBlock');\r\n if (taskKindBlock) {\r\n this.setOptionalControlVisibility(taskKindBlock, 'TaskKindEntryAC', args);\r\n }\r\n\r\n const taskHistoryBlock = args.rowModel.blocks.get('KrTaskHistoryBlockAlias');\r\n if (taskHistoryBlock) {\r\n const v = this.setOptionalControlVisibility(\r\n taskHistoryBlock,\r\n 'KrTaskHistoryGroupTypeControlAlias',\r\n args\r\n );\r\n this.setOptionalControlVisibility(\r\n taskHistoryBlock,\r\n 'KrParentTaskHistoryGroupTypeControlAlias',\r\n args\r\n );\r\n this.setOptionalControlVisibility(\r\n taskHistoryBlock,\r\n 'KrTaskHistoryGroupNewIterationControlAlias',\r\n args\r\n );\r\n // Если показывается контрол (а показываются они все по одному правилу), то показывается и заголовок\r\n taskHistoryBlock.captionVisibility = v !== null ? v : Visibility.Collapsed;\r\n }\r\n\r\n const settingsBlock = args.rowModel.blocks.get('SettingsBlock');\r\n if (settingsBlock) {\r\n for (let control of settingsBlock.controls) {\r\n const controlSettings = control.cardTypeControl.controlSettings;\r\n const stageHandlerID = tryGetFromSettings(\r\n controlSettings,\r\n 'StageHandlerDescriptorIDSetting'\r\n );\r\n // tslint:disable-next-line:triple-equals\r\n if (stageHandlerID != undefined) {\r\n if (Guid.equals(args.row.get('StageTypeID'), stageHandlerID)) {\r\n control.controlVisibility = Visibility.Visible;\r\n this.setVisibilityViaTags(args.cardModel.cardType.id!, args.rowModel, control);\r\n } else {\r\n control.controlVisibility = Visibility.Collapsed;\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n private bindTimeFieldsRadio = async (args: GridRowEventArgs) => {\r\n args.row.fieldChanged.add(this.onTimeFieldChanged);\r\n };\r\n\r\n private unbindTimeFieldsRadio = async (args: GridRowEventArgs) => {\r\n args.row.fieldChanged.remove(this.onTimeFieldChanged);\r\n };\r\n\r\n onTimeFieldChanged = (args: CardFieldChangedEventArgs) => {\r\n if (args.fieldValue == null) {\r\n return;\r\n }\r\n\r\n switch (args.fieldName) {\r\n case 'Planned':\r\n this.currentRow!.set('TimeLimit', null);\r\n break;\r\n case 'TimeLimit':\r\n this.currentRow!.set('Planned', null);\r\n break;\r\n }\r\n };\r\n\r\n private bindUIHandlers = async (args: GridRowEventArgs) => {\r\n const context = this.getExecutionContext(args);\r\n if (!context) {\r\n return;\r\n }\r\n\r\n try {\r\n await this._krStageTypeUIHandlerExecutor!.executeAsync('initialize', context);\r\n } catch (err) {\r\n showError((err as Error).message);\r\n }\r\n };\r\n\r\n private validateViaHandlers = (args: GridRowValidationEventArgs) => {\r\n const context = this.getExecutionContext(args);\r\n if (!context) {\r\n return;\r\n }\r\n\r\n try {\r\n this._krStageTypeUIHandlerExecutor!.execute('validate', context);\r\n } catch (err) {\r\n showError((err as Error).message);\r\n }\r\n };\r\n\r\n private validateTimeLimit = async (args: GridRowValidationEventArgs) => {\r\n const row = args.row;\r\n const stageTypeId = row.tryGet('StageTypeID');\r\n const timeLimit = row.tryGet('TimeLimit');\r\n const planned = row.tryGet('Planned');\r\n const controls = args.rowModel!.controls;\r\n let control: IControlViewModel;\r\n let list: guid[];\r\n const checkField = (inputAlias: string) =>\r\n (control = controls.get(inputAlias)!) &&\r\n (list = tryGetFromSettings(\r\n control.cardTypeControl.controlSettings,\r\n 'VisibleForTypesSetting',\r\n null\r\n )!) &&\r\n list.some(x => Guid.equals(x, stageTypeId));\r\n const checkTimeLimit = checkField('TimeLimitInput');\r\n const checkPlanned = checkField('PlannedInput');\r\n if (checkTimeLimit && checkPlanned) {\r\n if (timeLimit == null && planned == null) {\r\n args.validationResult.add(\r\n ValidationResult.fromText(\r\n '$UI_Error_TimeLimitOrPlannedNotSpecifiedWarn',\r\n ValidationResultType.Warning\r\n )\r\n );\r\n }\r\n } else if (checkTimeLimit && timeLimit == null) {\r\n args.validationResult.add(\r\n ValidationResult.fromText(\r\n '$UI_Error_TimeLimitNotSpecifiedWarn',\r\n ValidationResultType.Warning\r\n )\r\n );\r\n }\r\n };\r\n\r\n private validatePerformers = async (args: GridRowValidationEventArgs) => {\r\n const controls = args.rowModel!.controls;\r\n let mode: PerformerUsageMode;\r\n let control: IControlViewModel;\r\n if (\r\n (control = controls.get('SinglePerformerEntryAC')!) &&\r\n control.controlVisibility === Visibility.Visible\r\n ) {\r\n mode = PerformerUsageMode.Single;\r\n } else if (\r\n (control = controls.get('MultiplePerformersTableAC')!) &&\r\n control.controlVisibility === Visibility.Visible\r\n ) {\r\n mode = PerformerUsageMode.Multiple;\r\n } else {\r\n return;\r\n }\r\n\r\n const controlSettings = control.cardTypeControl.controlSettings;\r\n const list = tryGetFromSettings(\r\n controlSettings,\r\n 'RequiredForTypesSetting',\r\n null\r\n );\r\n if (!list) {\r\n return;\r\n }\r\n\r\n const row = args.row;\r\n for (let id of list) {\r\n if (Guid.equals(id, row.get('StageTypeID'))) {\r\n let perfSec: CardSection;\r\n if (\r\n (mode === PerformerUsageMode.Single &&\r\n // tslint:disable-next-line:triple-equals\r\n row.get('KrSinglePerformerVirtual__PerformerID') == undefined) ||\r\n (mode === PerformerUsageMode.Multiple &&\r\n (perfSec = args.cardModel.card.sections.tryGet('KrPerformersVirtual_Synthetic')!) &&\r\n !perfSec.rows.some(\r\n x => Guid.equals(x.get('StageRowID'), row.rowId) && x.state !== CardRowState.Deleted\r\n ))\r\n ) {\r\n args.validationResult.add(\r\n ValidationResult.fromText(\r\n '$UI_Error_PerformerNotSpecifiedWarn',\r\n ValidationResultType.Warning\r\n )\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n };\r\n\r\n private unbindUIHandlers = async (args: GridRowEventArgs) => {\r\n const context = this.getExecutionContext(args);\r\n if (!context) {\r\n return;\r\n }\r\n\r\n try {\r\n await this._krStageTypeUIHandlerExecutor!.executeAsync('finalize', context);\r\n } catch (err) {\r\n showError((err as Error).message);\r\n }\r\n };\r\n\r\n private getExecutionContext(\r\n args: GridRowEventArgs | GridRowValidationEventArgs\r\n ): KrStageTypeUIHandlerContext | null {\r\n if ('action' in args && args.action === GridRowAction.Deleting) {\r\n return null;\r\n }\r\n\r\n const stageTypeId = args.row.tryGet('StageTypeID');\r\n // tslint:disable-next-line:triple-equals\r\n if (stageTypeId == undefined) {\r\n return null;\r\n }\r\n\r\n if (!this._krStageTypeUIHandlerExecutor) {\r\n this._krStageTypeUIHandlerExecutor = ExtensionContainer.instance.resolveExecutor(\r\n KrStageTypeUIHandler\r\n );\r\n }\r\n\r\n if (this._krStageTypeUIHandlerExecutor.length === 0) {\r\n return null;\r\n }\r\n\r\n return new KrStageTypeUIHandlerContext(\r\n stageTypeId,\r\n 'action' in args ? args.action : null,\r\n 'control' in args ? args.control : null,\r\n args.row,\r\n args.rowModel,\r\n args.cardModel,\r\n 'validationResult' in args ? args.validationResult : null\r\n );\r\n }\r\n\r\n private handleFormatRow = (args: GridRowEventArgs) => {\r\n this.formatRow(args.row, args.cardModel, true);\r\n };\r\n\r\n //#endregion\r\n\r\n //#region private methods\r\n\r\n private setTabIndication(cardModel: ICardModel, sectionName: string, controlName: string) {\r\n const section = cardModel.card.sections.tryGet(sectionName);\r\n if (section) {\r\n const sectionMeta = MetadataStorage.instance.cardMetadata.getSectionByName(sectionName);\r\n if (!sectionMeta) {\r\n return;\r\n }\r\n\r\n const fieldIds: [guid, string][] = sectionMeta.columns.map(x => [x.id || '', x.name || '']);\r\n const tabControl = cardModel.controls.get(controlName) as TabControlViewModel;\r\n const indicator = new TabContentIndicator(\r\n tabControl,\r\n section.fields.getStorage(),\r\n fieldIds,\r\n true\r\n );\r\n indicator.update();\r\n this._dispose.push(section.fields.fieldChanged.addWithDispose(indicator.fieldChangedAction));\r\n }\r\n }\r\n\r\n private async setBlockIndication(\r\n cardModel: ICardModel,\r\n sectionName: string,\r\n controlName: string\r\n ) {\r\n const templateSec = cardModel.card.sections.tryGet(sectionName);\r\n\r\n if (!templateSec) {\r\n return;\r\n }\r\n\r\n const control = cardModel.blocks.get(controlName);\r\n\r\n if (!control) {\r\n return;\r\n }\r\n\r\n const sectionMeta = cardModel.cardMetadata.sections.find(s => s.name === sectionName);\r\n\r\n if (!sectionMeta) {\r\n return;\r\n }\r\n\r\n const fieldIDs = new Map();\r\n\r\n for (const column of sectionMeta.columns) {\r\n if (column.id && column.name) {\r\n fieldIDs.set(column.id, column.name);\r\n }\r\n }\r\n\r\n const indicator = new BlockContentIndicator(control, templateSec.fields, fieldIDs);\r\n this._dispose.push(indicator.dispose);\r\n }\r\n\r\n private setOptionalControlVisibility(\r\n block: IBlockViewModel,\r\n controlAlias: string,\r\n e: GridRowEventArgs\r\n ): Visibility | null {\r\n const inputControl = block.controls.find(x => x.name === controlAlias);\r\n if (!inputControl) {\r\n return null;\r\n }\r\n\r\n const controlSettings = inputControl.cardTypeControl.controlSettings;\r\n let list = tryGetFromSettings(controlSettings, 'VisibleForTypesSetting');\r\n if (!list || !Array.isArray(list)) {\r\n return null;\r\n }\r\n\r\n inputControl.controlVisibility = Visibility.Collapsed;\r\n for (let id of list) {\r\n if (Guid.equals(id, e.row.get('StageTypeID'))) {\r\n inputControl.controlVisibility = Visibility.Visible;\r\n break;\r\n }\r\n }\r\n\r\n inputControl.isRequired = false;\r\n list = tryGetFromSettings(controlSettings, 'RequiredForTypesSetting');\r\n if (list && Array.isArray(list)) {\r\n const stageTypeId = e.row.get('StageTypeID');\r\n for (let id of list) {\r\n if (Guid.equals(id, stageTypeId)) {\r\n inputControl.isRequired = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n this.setControlSettings(e.cardModel.cardType.id!, inputControl);\r\n this.setVisibilityViaTags(e.cardModel.cardType.id!, e.rowModel!, inputControl);\r\n\r\n return inputControl.controlVisibility;\r\n }\r\n\r\n private setControlCaption(block: IBlockViewModel, controlAlias: string, e: GridRowEventArgs) {\r\n const inputControl = block.controls.find(x => x.name === controlAlias);\r\n if (!inputControl) {\r\n return;\r\n }\r\n\r\n const controlSettings = inputControl.cardTypeControl.controlSettings;\r\n const captions = tryGetFromSettings<{} | null>(controlSettings, 'ControlCaptionsSetting', null);\r\n if (!captions) {\r\n return;\r\n }\r\n\r\n const stageGroupId = e.row.get('StageTypeID');\r\n const caption = captions[stageGroupId];\r\n if (caption) {\r\n inputControl.caption = caption;\r\n }\r\n }\r\n\r\n private setVisibilityViaTags(\r\n typeId: guid,\r\n _rowModel: ICardModel,\r\n rootControl: IControlViewModel\r\n ) {\r\n const queue = new Array();\r\n if (rootControl instanceof TabControlViewModel) {\r\n this.enqueueTabs(rootControl, queue);\r\n } else if (rootControl instanceof ContainerViewModel) {\r\n this.enqueueForm(rootControl.form, queue);\r\n } else {\r\n return;\r\n }\r\n\r\n while (queue.length !== 0) {\r\n const item = queue.shift();\r\n if (item instanceof ControlViewModelBase) {\r\n this.setControlSettings(typeId, item);\r\n\r\n if (item instanceof TabControlViewModel) {\r\n this.enqueueTabs(item, queue);\r\n }\r\n } else if (item instanceof BlockViewModelBase) {\r\n this.setBlockControlsSettings(typeId, item);\r\n this.enqueueBlock(item, queue);\r\n }\r\n }\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private enqueueTabs(tabControl: TabControlViewModel, queue: any[]) {\r\n for (let tab of tabControl.tabs) {\r\n this.enqueueForm(tab, queue);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private enqueueForm(formViewModel: IFormViewModel, queue: any[]) {\r\n for (let blockViewModel of formViewModel.blocks) {\r\n queue.push(blockViewModel);\r\n }\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private enqueueBlock(blockViewModel: IBlockViewModel, queue: any[]) {\r\n for (let controlViewModel of blockViewModel.controls) {\r\n queue.push(controlViewModel);\r\n }\r\n }\r\n\r\n private setControlSettings(typeId: guid, controlViewModel: IControlViewModel) {\r\n if (controlViewModel.controlVisibility !== Visibility.Visible) {\r\n // Если контрол скрыт, нет смысла в нем копаться.\r\n return;\r\n }\r\n\r\n const controlSettings = controlViewModel.cardTypeControl.controlSettings;\r\n const tags = tryGetFromSettings(controlSettings, 'TagsListSetting');\r\n if (!tags || !Array.isArray(tags)) {\r\n return;\r\n }\r\n\r\n let hasRuntime = false;\r\n let hasDesign = false;\r\n let hasRuntimeReadonly = false;\r\n let hasDesignReadonly = false;\r\n\r\n for (let tag of tags) {\r\n switch (tag) {\r\n case 'Runtime':\r\n hasRuntime = true;\r\n break;\r\n case 'DesignTime':\r\n hasDesign = true;\r\n break;\r\n case 'RuntimeReadonly':\r\n hasRuntimeReadonly = true;\r\n break;\r\n case 'DesignTimeReadonly':\r\n hasDesignReadonly = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!hasDesign && !hasRuntime) {\r\n controlViewModel.controlVisibility = Visibility.Visible;\r\n } else if (hasDesign && designTimeCard(typeId)) {\r\n controlViewModel.controlVisibility = Visibility.Visible;\r\n } else if (hasRuntime && runtimeCard(typeId)) {\r\n controlViewModel.controlVisibility = Visibility.Visible;\r\n } else {\r\n controlViewModel.controlVisibility = Visibility.Collapsed;\r\n }\r\n\r\n if (controlViewModel.controlVisibility === Visibility.Visible) {\r\n if (hasDesignReadonly && designTimeCard(typeId)) {\r\n controlViewModel.isReadOnly = true;\r\n } else if (hasRuntimeReadonly && runtimeCard(typeId)) {\r\n controlViewModel.isReadOnly = true;\r\n }\r\n }\r\n }\r\n\r\n private setBlockControlsSettings(typeId: guid, blockViewModel: IBlockViewModel) {\r\n if (blockViewModel.blockVisibility !== Visibility.Visible) {\r\n // Если блок скрыт, нет смысла в нем копаться.\r\n return;\r\n }\r\n\r\n const blockSettings = blockViewModel.cardTypeBlock.blockSettings;\r\n const tags = tryGetFromSettings(blockSettings, 'TagsListSetting');\r\n if (!tags || !Array.isArray(tags)) {\r\n return;\r\n }\r\n\r\n let hasRuntime = false;\r\n let hasDesign = false;\r\n\r\n for (let tag of tags) {\r\n switch (tag) {\r\n case 'Runtime':\r\n hasRuntime = true;\r\n break;\r\n case 'DesignTime':\r\n hasDesign = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!hasDesign && !hasRuntime) {\r\n blockViewModel.blockVisibility = Visibility.Visible;\r\n } else if (hasDesign && designTimeCard(typeId)) {\r\n blockViewModel.blockVisibility = Visibility.Visible;\r\n } else if (hasRuntime && runtimeCard(typeId)) {\r\n blockViewModel.blockVisibility = Visibility.Visible;\r\n } else {\r\n blockViewModel.blockVisibility = Visibility.Collapsed;\r\n }\r\n }\r\n\r\n private formatRow(row: CardRow, cardModel: ICardModel, withChanges: boolean) {\r\n const stageTypeId = row.tryGet('StageTypeID');\r\n if (!stageTypeId) {\r\n return;\r\n }\r\n\r\n const extensionExecutor = ExtensionContainer.instance.resolveExecutor(KrStageTypeFormatter);\r\n if (extensionExecutor.length === 0) {\r\n return;\r\n }\r\n\r\n const info = {};\r\n const session = userSession;\r\n const ctx = new KrStageTypeFormatterContext(\r\n stageTypeId,\r\n session,\r\n info,\r\n cardModel.card,\r\n row,\r\n null\r\n );\r\n ctx.displayTimeLimit = row.tryGet('DisplayTimeLimit') || '';\r\n ctx.displayParticipants = row.tryGet('DisplayParticipants') || '';\r\n ctx.displaySettings = row.tryGet('DisplaySettings') || '';\r\n\r\n cardModel.executeInContext(() => extensionExecutor.execute('format', ctx));\r\n\r\n if (withChanges) {\r\n const displayTimeLimit = row.tryGet('DisplayTimeLimit');\r\n if (displayTimeLimit !== ctx.displayTimeLimit) {\r\n row.set('DisplayTimeLimit', ctx.displayTimeLimit, DotNetType.String);\r\n }\r\n const displayParticipants = row.tryGet('DisplayParticipants');\r\n if (displayParticipants !== ctx.displayParticipants) {\r\n row.set('DisplayParticipants', ctx.displayParticipants, DotNetType.String);\r\n }\r\n const displaySettings = row.tryGet('DisplaySettings');\r\n if (displaySettings !== ctx.displaySettings) {\r\n row.set('DisplaySettings', ctx.displaySettings, DotNetType.String);\r\n }\r\n } else {\r\n row.rawSet('DisplayTimeLimit', ctx.displayTimeLimit, DotNetType.String);\r\n row.rawSet('DisplayParticipants', ctx.displayParticipants, DotNetType.String);\r\n row.rawSet('DisplaySettings', ctx.displaySettings, DotNetType.String);\r\n }\r\n }\r\n\r\n private activateStagesHandler = (selectedRowStages: GridRowViewModel[]) => {\r\n for (let selectedRowStage of selectedRowStages) {\r\n selectedRowStage.row.set('Skip', false, DotNetType.Boolean);\r\n // selectedRowStage.cells.forEach(c => c.style.backgroundColor = 'transparent');\r\n }\r\n };\r\n\r\n private hasEnableActivateStageButton = (\r\n card: Card,\r\n selectedRows: GridRowViewModel[]\r\n ): boolean => {\r\n let token: KrToken | null = null;\r\n return (\r\n selectedRows.length > 0 &&\r\n !!(token = KrToken.tryGet(card.info)) &&\r\n token.hasPermission(CanSkipStages) &&\r\n selectedRows.every(i => !!i.row.tryGet('Skip'))\r\n );\r\n };\r\n\r\n //#endregion\r\n}\r\n","import { observe, Lambda } from 'mobx';\r\nimport { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { GridViewModel, LabelViewModel, AutoCompleteTableViewModel } from 'tessa/ui/cards/controls';\r\nimport { Card, CardRow, CardRowState } from 'tessa/cards';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { Visibility, DotNetType, Guid } from 'tessa/platform';\r\nimport { ValidationResultType } from 'tessa/platform/validation';\r\n\r\nexport class KrStageTemplateUIExtension extends CardUIExtension {\r\n public initialized(context: ICardUIExtensionContext) {\r\n const cardModel = context.model;\r\n\r\n if (cardModel.card.typeId !== '2fa85bb3-bba4-4ab6-ba97-652106db96de') { // KrStageTemplateTypeID\r\n return;\r\n }\r\n\r\n const grid = cardModel.controls.get('ApprovalStagesTable') as GridViewModel;\r\n if (!grid) {\r\n return;\r\n }\r\n\r\n let approversControlDisposer: Lambda | null = null;\r\n grid.rowInitializing.add(e => {\r\n const hyperlink = e.rowModel!.controls.get('AddComputedRoleLink') as LabelViewModel;\r\n if (!hyperlink) {\r\n return;\r\n }\r\n\r\n hyperlink.controlVisibility = KrStageTemplateUIExtension.hasComputedRole(\r\n e.cardModel.card,\r\n e.row.rowId\r\n )\r\n ? Visibility.Collapsed\r\n : Visibility.Visible;\r\n\r\n const approversControl = e.rowModel!.controls.get(\r\n 'MultiplePerformersTableAC'\r\n ) as AutoCompleteTableViewModel;\r\n if (approversControl) {\r\n const approversControlChanged = () => {\r\n hyperlink.controlVisibility = KrStageTemplateUIExtension.hasComputedRole(\r\n e.cardModel.card,\r\n e.row.rowId\r\n )\r\n ? Visibility.Collapsed\r\n : Visibility.Visible;\r\n };\r\n\r\n approversControlDisposer = observe(approversControl, 'items', approversControlChanged);\r\n }\r\n\r\n const card = e.cardModel.card;\r\n const rows = card.sections.get('KrPerformersVirtual_Synthetic')!.rows;\r\n const rowId = e.row.rowId;\r\n\r\n hyperlink.onClick = () => {\r\n if (!KrStageTemplateUIExtension.hasComputedRole(card, rowId)) {\r\n const row = new CardRow();\r\n row.rowId = Guid.newGuid();\r\n row.state = CardRowState.Inserted;\r\n\r\n row.set('PerformerID', 'cd4d4a0d-414f-478d-a226-319aa8417f88', DotNetType.Guid); // SqlApproverRoleID\r\n row.set('PerformerName', '$KrProcess_SqlPerformersRole', DotNetType.String);\r\n row.set('StageRowID', rowId, DotNetType.Guid);\r\n const order = rows.length !== 0 ? Math.max(...rows.map(x => x.get('Order')), -1) + 1 : 0;\r\n row.set('Order', order, DotNetType.Int32);\r\n rows.push(row);\r\n }\r\n };\r\n });\r\n\r\n grid.rowEditorClosed.add(_ => {\r\n if (approversControlDisposer) {\r\n approversControlDisposer();\r\n }\r\n });\r\n\r\n grid.rowValidating.add(e => {\r\n const multiplePerformerControl = e.rowModel!.controls.get('MultiplePerformersTableAC');\r\n if (\r\n !multiplePerformerControl ||\r\n multiplePerformerControl.controlVisibility !== Visibility.Visible\r\n ) {\r\n return;\r\n }\r\n\r\n if (\r\n KrStageTemplateUIExtension.hasSqlQuery(e.row) &&\r\n e.row.isChanged('SqlApproverRole') &&\r\n !KrStageTemplateUIExtension.hasComputedRole(e.cardModel.card, e.row.rowId)\r\n ) {\r\n e.validationResult.add(\r\n ValidationResultType.Warning,\r\n LocalizationManager.instance.localize('$CardTypes_Validators_SQLApproversRoleMissed')\r\n );\r\n }\r\n });\r\n }\r\n\r\n private static hasSqlQuery(row: CardRow): boolean {\r\n return !!row.get('SqlApproverRole');\r\n }\r\n\r\n private static hasComputedRole(card: Card, stageRowId: guid): boolean {\r\n const sectionAlias =\r\n card.typeId === '4a377758-2366-47e9-98ac-c5f553974236'\r\n ? 'KrPerformersVirtual'\r\n : 'KrPerformersVirtual_Synthetic';\r\n\r\n const section = card.sections.tryGet(sectionAlias);\r\n if (!section) {\r\n return false;\r\n }\r\n\r\n return section.rows.some(row =>\r\n KrStageTemplateUIExtension.hasComputedRoleInRow(row, stageRowId)\r\n );\r\n }\r\n\r\n private static hasComputedRoleInRow(row: CardRow, stageRowId: guid): boolean {\r\n const srid = row.get('StageRowID');\r\n if (srid !== stageRowId) {\r\n return false;\r\n }\r\n\r\n const approverId = row.get('PerformerID');\r\n if (approverId !== 'cd4d4a0d-414f-478d-a226-319aa8417f88') {\r\n // SqlApproverRoleID\r\n return false;\r\n }\r\n\r\n return row.state !== CardRowState.Deleted;\r\n }\r\n}\r\n","import { CompiledCardTypes, sendCompileRequest } from '../../workflow/krProcess/krUIHelper';\r\nimport { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { ButtonViewModel } from 'tessa/ui/cards/controls';\r\n\r\nexport class KrStageSourceUIExtension extends CardUIExtension {\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n if (!CompiledCardTypes.some(x => x === context.card.typeId)) {\r\n return;\r\n }\r\n\r\n const cardModel = context.model;\r\n\r\n const compileControl = cardModel.controls.get('CompileButton') as ButtonViewModel;\r\n if (compileControl) {\r\n compileControl.onClick = () => sendCompileRequest('.CompileWithValidationResult');\r\n }\r\n\r\n const compileAllControl = cardModel.controls.get('CompileAllButton') as ButtonViewModel;\r\n if (compileAllControl) {\r\n compileAllControl.onClick = () => sendCompileRequest('.CompileAllWithValidationResult');\r\n }\r\n }\r\n\r\n}","import { InfoAboutChanges } from '../../workflow/krCompilers/infoAboutChanges';\r\nimport { CardUIExtension, ICardUIExtensionContext, CardModelFlags } from 'tessa/ui/cards';\r\nimport {\r\n getKrComponentsByCard,\r\n KrTypesCache,\r\n KrComponents,\r\n KrToken,\r\n CanFullRecalcRoute\r\n} from 'tessa/workflow';\r\nimport { hasNotFlag, DotNetType, createTypedField } from 'tessa/platform';\r\nimport { GridViewModel } from 'tessa/ui/cards/controls';\r\nimport { Card, CardStoreMode } from 'tessa/cards';\r\nimport { tryGetFromInfo, UIButton } from 'tessa/ui';\r\nimport { IStorage } from 'tessa/platform/storage';\r\n\r\nexport class KrRecalcStagesUIExtension extends CardUIExtension {\r\n public initialized(context: ICardUIExtensionContext) {\r\n const cardModel = context.model;\r\n\r\n const usedComponents = getKrComponentsByCard(cardModel.card, KrTypesCache.instance);\r\n // Выходим если нет согласования\r\n if (hasNotFlag(usedComponents, KrComponents.Routes)) {\r\n return;\r\n }\r\n\r\n const approvalStagesTable = cardModel.controls.get('ApprovalStagesTable') as GridViewModel;\r\n let krToken: KrToken | null = null;\r\n if (\r\n approvalStagesTable &&\r\n hasNotFlag(cardModel.flags, CardModelFlags.Disabled) &&\r\n (krToken = KrToken.tryGet(context.card.info)) &&\r\n krToken.hasPermission(CanFullRecalcRoute)\r\n ) {\r\n const uiContext = context.uiContext;\r\n\r\n const hasStagePositions = KrRecalcStagesUIExtension.hasStagePositions(cardModel.card, false);\r\n const newCard = cardModel.card.storeMode === CardStoreMode.Insert;\r\n\r\n approvalStagesTable.leftButtons.push(\r\n new UIButton('$CardTypes_Buttons_RecalcApprovalStages', () => {\r\n const editor = uiContext.cardEditor;\r\n if (editor && !editor.operationInProgress) {\r\n const mode =\r\n hasStagePositions || newCard\r\n ? InfoAboutChanges.ChangesListToValidationResult\r\n : InfoAboutChanges.ChangesListToValidationResult |\r\n InfoAboutChanges.ChangesInHiddenStages;\r\n const info: IStorage = {\r\n '.Recalc': createTypedField(true, DotNetType.Boolean),\r\n '.InfoAboutChanges': createTypedField(mode, DotNetType.Int32)\r\n };\r\n editor.saveCard(uiContext, info);\r\n }\r\n })\r\n );\r\n }\r\n }\r\n\r\n private static hasStagePositions(card: Card, atLeastOne: boolean): boolean {\r\n // tslint:disable-next-line: no-any\r\n const stagePositions = tryGetFromInfo(card.info, 'StagePositions');\r\n return (\r\n stagePositions && Array.isArray(stagePositions) && (!atLeastOne || stagePositions.length > 0)\r\n );\r\n }\r\n}\r\n","import { reaction } from 'mobx';\r\nimport { CardUIExtension, ICardModel, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { DefaultFormMainViewModel } from 'tessa/ui/cards/forms';\r\nimport {\r\n CheckBoxViewModel,\r\n GridRowAction,\r\n GridRowEventArgs,\r\n GridViewModel\r\n} from 'tessa/ui/cards/controls';\r\nimport { Visibility } from 'tessa/platform';\r\n\r\nexport class KrHideCardTypeSettingsUIExtension extends CardUIExtension {\r\n private static _typesBlock = 'CardTypesBlock';\r\n private static _typesControl = 'CardTypeControl';\r\n private static _typeSettingBlock = 'TypeSettingsBlock';\r\n private static _useDocTypesField = 'UseDocTypes';\r\n private static _useDocTypesControl = 'UseDocTypesControl';\r\n private static _useApprovingField = 'UseApproving';\r\n private static _useApprovingControl = 'UseApprovingControl';\r\n private static _useApprovingBlock = 'UseApprovingBlock';\r\n private static _useAutoApprovingField = 'UseAutoApprove';\r\n private static _useAutoApprovingControl = 'UseAutoApprovingControl';\r\n private static _autoApprovalSettingsBlock1 = 'AutoApprovalSettingsBlock1';\r\n private static _autoApprovalSettingsBlock2 = 'AutoApprovalSettingsBlock2';\r\n private static _useRegistrationBlock = 'UseRegistrationBlock';\r\n private static _useRegistrationControl = 'UseRegistrationControl';\r\n private static _useRegistrationField = 'UseRegistration';\r\n private static _registrationSettingsBlock = 'RegistrationSettingsBlock';\r\n\r\n private _disposes: (Function | null)[] = [];\r\n private _gridDisposes: (Function | null)[] = [];\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n if (\r\n context.card.typeId !== '35a03878-57b6-4263-ae36-92eb59032132' && // KrSettingsTypeID\r\n context.card.typeId !== 'b17f4f35-17e1-4509-994b-ebd576f2c95e' // KrDocTypeTypeID\r\n ) {\r\n return;\r\n }\r\n\r\n const model = context.model;\r\n if (!model.mainForm || !(model.mainForm instanceof DefaultFormMainViewModel)) {\r\n return;\r\n }\r\n\r\n if (model.cardType.id === '35a03878-57b6-4263-ae36-92eb59032132') {\r\n // KrSettingsTypeID\r\n const cardTypesBlock = model.mainForm.blocks.find(\r\n x => x.name === KrHideCardTypeSettingsUIExtension._typesBlock\r\n );\r\n if (cardTypesBlock) {\r\n const cardTypesControl = cardTypesBlock.controls.find(\r\n x => x.name === KrHideCardTypeSettingsUIExtension._typesControl\r\n ) as GridViewModel;\r\n if (cardTypesControl) {\r\n cardTypesControl.rowInvoked.add(this.gridRowInvoked);\r\n cardTypesControl.rowEditorClosed.add(this.gridRowEditorClosed);\r\n }\r\n }\r\n } else if (model.cardType.id === 'b17f4f35-17e1-4509-994b-ebd576f2c95e') {\r\n // KrDocTypeTypeID\r\n this.collapseIfUnchecked(\r\n model,\r\n KrHideCardTypeSettingsUIExtension._useRegistrationBlock,\r\n [KrHideCardTypeSettingsUIExtension._useRegistrationControl],\r\n KrHideCardTypeSettingsUIExtension._registrationSettingsBlock\r\n );\r\n\r\n this.collapseIfUnchecked(\r\n model,\r\n KrHideCardTypeSettingsUIExtension._useApprovingBlock,\r\n [KrHideCardTypeSettingsUIExtension._useApprovingControl],\r\n KrHideCardTypeSettingsUIExtension._autoApprovalSettingsBlock1\r\n );\r\n\r\n this.collapseIfUnchecked(\r\n model,\r\n KrHideCardTypeSettingsUIExtension._useApprovingBlock,\r\n [\r\n KrHideCardTypeSettingsUIExtension._useApprovingControl,\r\n KrHideCardTypeSettingsUIExtension._useAutoApprovingControl\r\n ],\r\n KrHideCardTypeSettingsUIExtension._autoApprovalSettingsBlock2\r\n );\r\n\r\n this.collapseIfUnchecked(\r\n model,\r\n KrHideCardTypeSettingsUIExtension._autoApprovalSettingsBlock1,\r\n [\r\n KrHideCardTypeSettingsUIExtension._useApprovingControl,\r\n KrHideCardTypeSettingsUIExtension._useAutoApprovingControl\r\n ],\r\n KrHideCardTypeSettingsUIExtension._autoApprovalSettingsBlock2\r\n );\r\n }\r\n }\r\n\r\n public finalized() {\r\n for (let dispose of this._disposes) {\r\n if (dispose) {\r\n dispose();\r\n }\r\n }\r\n this._disposes.length = 0;\r\n }\r\n\r\n private gridRowInvoked = (e: GridRowEventArgs) => {\r\n if (e.action === GridRowAction.Inserted || e.action === GridRowAction.Opening) {\r\n if (\r\n !e.rowModel ||\r\n !e.rowModel.blocks.get(KrHideCardTypeSettingsUIExtension._typeSettingBlock)\r\n ) {\r\n return;\r\n }\r\n\r\n this.collapseIfUncheckedInRow(\r\n e,\r\n KrHideCardTypeSettingsUIExtension._useRegistrationBlock,\r\n KrHideCardTypeSettingsUIExtension._useRegistrationControl,\r\n [KrHideCardTypeSettingsUIExtension._useRegistrationField],\r\n KrHideCardTypeSettingsUIExtension._registrationSettingsBlock\r\n );\r\n\r\n this.collapseIfUncheckedInRow(\r\n e,\r\n KrHideCardTypeSettingsUIExtension._useApprovingBlock,\r\n KrHideCardTypeSettingsUIExtension._useApprovingControl,\r\n [KrHideCardTypeSettingsUIExtension._useApprovingField],\r\n KrHideCardTypeSettingsUIExtension._autoApprovalSettingsBlock1\r\n );\r\n\r\n this.collapseIfUncheckedInRow(\r\n e,\r\n KrHideCardTypeSettingsUIExtension._useApprovingBlock,\r\n KrHideCardTypeSettingsUIExtension._useApprovingControl,\r\n [\r\n KrHideCardTypeSettingsUIExtension._useApprovingField,\r\n KrHideCardTypeSettingsUIExtension._useAutoApprovingField\r\n ],\r\n KrHideCardTypeSettingsUIExtension._autoApprovalSettingsBlock2\r\n );\r\n\r\n this.collapseIfUncheckedInRow(\r\n e,\r\n KrHideCardTypeSettingsUIExtension._autoApprovalSettingsBlock1,\r\n KrHideCardTypeSettingsUIExtension._useAutoApprovingControl,\r\n [\r\n KrHideCardTypeSettingsUIExtension._useApprovingField,\r\n KrHideCardTypeSettingsUIExtension._useAutoApprovingField\r\n ],\r\n KrHideCardTypeSettingsUIExtension._autoApprovalSettingsBlock2\r\n );\r\n\r\n this.collapseIfDocTypesUnused(e);\r\n }\r\n };\r\n\r\n private gridRowEditorClosed = () => {\r\n for (let dispose of this._gridDisposes) {\r\n if (dispose) {\r\n dispose();\r\n }\r\n }\r\n this._gridDisposes.length = 0;\r\n };\r\n\r\n private collapseIfDocTypesUnused = (e: GridRowEventArgs) => {\r\n const useControl = e\r\n .rowModel!.blocks.get(KrHideCardTypeSettingsUIExtension._typeSettingBlock)!\r\n .controls.find(\r\n x => x.name === KrHideCardTypeSettingsUIExtension._useDocTypesControl\r\n ) as CheckBoxViewModel;\r\n\r\n if (useControl) {\r\n this.collapseSettingsIfDocTypesInUse(e);\r\n\r\n // при закрытии окна, мы будем вызывать disposer в gridRowEditorClosed\r\n this._gridDisposes.push(\r\n reaction(\r\n () => useControl.isChecked,\r\n () => this.collapseSettingsIfDocTypesInUse(e)\r\n )\r\n );\r\n }\r\n };\r\n\r\n private collapseSettingsIfDocTypesInUse = (e: GridRowEventArgs) => {\r\n for (let block of e.rowModel!.mainForm!.blocks) {\r\n if (block.name === KrHideCardTypeSettingsUIExtension._typeSettingBlock) {\r\n continue;\r\n }\r\n\r\n if (block.name === KrHideCardTypeSettingsUIExtension._registrationSettingsBlock) {\r\n const inUse =\r\n e.row.get(KrHideCardTypeSettingsUIExtension._useRegistrationField) &&\r\n !e.row.get(KrHideCardTypeSettingsUIExtension._useDocTypesField);\r\n block.blockVisibility = inUse ? Visibility.Visible : Visibility.Collapsed;\r\n continue;\r\n }\r\n\r\n if (block.name === KrHideCardTypeSettingsUIExtension._autoApprovalSettingsBlock1) {\r\n const inUse =\r\n e.row.get(KrHideCardTypeSettingsUIExtension._useApprovingField) &&\r\n !e.row.get(KrHideCardTypeSettingsUIExtension._useDocTypesField);\r\n block.blockVisibility = inUse ? Visibility.Visible : Visibility.Collapsed;\r\n continue;\r\n }\r\n\r\n if (block.name === KrHideCardTypeSettingsUIExtension._autoApprovalSettingsBlock2) {\r\n const inUse =\r\n e.row.get(KrHideCardTypeSettingsUIExtension._useApprovingField) &&\r\n e.row.get(KrHideCardTypeSettingsUIExtension._useAutoApprovingField) &&\r\n !e.row.get(KrHideCardTypeSettingsUIExtension._useDocTypesField);\r\n block.blockVisibility = inUse ? Visibility.Visible : Visibility.Collapsed;\r\n continue;\r\n }\r\n\r\n block.blockVisibility = !e.row.get(KrHideCardTypeSettingsUIExtension._useDocTypesField)\r\n ? Visibility.Visible\r\n : Visibility.Collapsed;\r\n }\r\n };\r\n\r\n private collapseIfUncheckedInRow = (\r\n e: GridRowEventArgs,\r\n useBlockName: string,\r\n useControlName: string,\r\n useFieldNames: string[],\r\n settingsBlockName: string\r\n ) => {\r\n if (!!e.rowModel!.blocks.get(useBlockName) && !!e.rowModel!.blocks.get(settingsBlockName)) {\r\n const useControl = e\r\n .rowModel!.blocks.get(useBlockName)!\r\n .controls.find(x => x.name === useControlName) as CheckBoxViewModel;\r\n if (!useControl) {\r\n return;\r\n }\r\n\r\n const settingsBlock = e.rowModel!.blocks.get(settingsBlockName)!;\r\n settingsBlock.blockVisibility = useFieldNames.map(p => e.row.get(p)).every(q => !!q)\r\n ? Visibility.Visible\r\n : Visibility.Collapsed;\r\n\r\n // при закрытии окна, мы будем вызывать disposer в gridRowEditorClosed\r\n this._gridDisposes.push(\r\n reaction(\r\n () => useControl.isChecked,\r\n () => {\r\n const inUse =\r\n useFieldNames.map(p => e.row.get(p)).every(q => !!q) &&\r\n !e.row.get(KrHideCardTypeSettingsUIExtension._useDocTypesField);\r\n settingsBlock.blockVisibility = inUse ? Visibility.Visible : Visibility.Collapsed;\r\n }\r\n )\r\n );\r\n }\r\n };\r\n\r\n private collapseIfUnchecked = (\r\n model: ICardModel,\r\n useBlockName: string,\r\n useControlNames: string[],\r\n settingsBlockName: string\r\n ) => {\r\n const useControls = useControlNames.map(p =>\r\n model.blocks.get(useBlockName)!.controls.find(q => q.name === p)\r\n );\r\n\r\n if (useControls.every(p => !p)) {\r\n return;\r\n }\r\n\r\n const settingsBlock = model.blocks.get(settingsBlockName)!;\r\n settingsBlock.blockVisibility = useControlNames\r\n .map(p => (model.controls.get(p) as CheckBoxViewModel).isChecked)\r\n .every(q => !!q)\r\n ? Visibility.Visible\r\n : Visibility.Collapsed;\r\n\r\n for (let useControl of useControls) {\r\n if (!useControl) {\r\n continue;\r\n }\r\n\r\n this._disposes.push(\r\n reaction(\r\n () => (useControl as CheckBoxViewModel).isChecked,\r\n () => {\r\n const inUse = useControlNames\r\n .map(p => (model.controls.get(p) as CheckBoxViewModel).isChecked)\r\n .every(q => !!q);\r\n settingsBlock.blockVisibility = inUse ? Visibility.Visible : Visibility.Collapsed;\r\n }\r\n )\r\n );\r\n }\r\n };\r\n}\r\n","import { tryGetKrType, designTimeCard } from '../../workflow/krProcess/krUIHelper';\r\nimport { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { DefaultFormMainViewModel } from 'tessa/ui/cards/forms';\r\nimport { getKrComponentsByCard, KrTypesCache, KrComponents } from 'tessa/workflow';\r\nimport { hasNotFlag, Visibility } from 'tessa/platform';\r\n\r\nexport class KrHideApprovalTabOrDocStateBlockUIExtension extends CardUIExtension {\r\n public initialized(context: ICardUIExtensionContext) {\r\n // В карточке шаблона этапов и вторичного процесса ничего не трогать\r\n if (designTimeCard(context.card.typeId)) {\r\n return;\r\n }\r\n\r\n const model = context.model;\r\n if (!(model.mainForm instanceof DefaultFormMainViewModel)) {\r\n return;\r\n }\r\n\r\n const mainForm = model.mainForm as DefaultFormMainViewModel;\r\n\r\n const usedComponents = getKrComponentsByCard(model.card, KrTypesCache.instance);\r\n const krType = tryGetKrType(KrTypesCache.instance, model.card, model.card.typeId);\r\n if (hasNotFlag(usedComponents, KrComponents.Routes) || (!!krType && krType.hideRouteTab)) {\r\n // удаляем вкладку согласования\r\n const approvalProcessTab = model.forms.find(x => x.name === 'ApprovalProcess');\r\n if (approvalProcessTab) {\r\n approvalProcessTab.visibility = Visibility.Hidden;\r\n mainForm.restoreSelectedTab();\r\n }\r\n\r\n // скрываем специальный блок с состоянием документа, если нет согласования и регистрации\r\n if (\r\n hasNotFlag(usedComponents, KrComponents.Routes) &&\r\n hasNotFlag(usedComponents, KrComponents.Registration)\r\n ) {\r\n for (let form of model.forms) {\r\n for (let block of form.blocks) {\r\n if (block.name === 'KrBlockForDocStatus') {\r\n block.blockVisibility = Visibility.Collapsed;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { reaction } from 'mobx';\r\nimport { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { hasNotFlag, hasFlag, Visibility } from 'tessa/platform';\r\nimport { CardTypeFlags } from 'tessa/cards/types';\r\nimport { GridViewModel, GridRowEventArgs, GridRowAction, CheckBoxViewModel } from 'tessa/ui/cards/controls';\r\nimport { CardPermissionFlags } from 'tessa/cards';\r\n\r\nexport class KrHideApprovalStagePermissionsDisclaimer extends CardUIExtension {\r\n\r\n private _disposes: (Function | null)[] = [];\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n const model = context.model;\r\n\r\n if (hasNotFlag(model.cardType.flags, CardTypeFlags.AllowTasks)) {\r\n return;\r\n }\r\n\r\n const approvalTab = model.forms.find(x => x.name === 'ApprovalProcess');\r\n\r\n if (!approvalTab) {\r\n return;\r\n }\r\n\r\n for (let block of approvalTab.blocks) {\r\n if (block.name === 'ApprovalStagesBlock') {\r\n for (let control of block.controls) {\r\n if (control instanceof GridViewModel) {\r\n control.rowInvoked.add(this.gridRowInvoked);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public finalized() {\r\n for (let dispose of this._disposes) {\r\n if (dispose) {\r\n dispose();\r\n }\r\n }\r\n this._disposes.length = 0;\r\n }\r\n\r\n private gridRowInvoked = (e: GridRowEventArgs) => {\r\n if (e.action !== GridRowAction.Inserted && e.action !== GridRowAction.Opening) {\r\n return;\r\n }\r\n\r\n const label = e.rowModel!.controls.get('DisclaimerControl');\r\n if (!label) {\r\n return;\r\n }\r\n\r\n const readOnly = hasFlag(e.rowModel!.card.permissions.resolver\r\n .getRowPermissions('KrStagesVirtual', e.row.rowId), CardPermissionFlags.ProhibitModify);\r\n\r\n if (readOnly) {\r\n const fieldName = 'KrApprovalSettingsVirtual__IsParallel';\r\n if (!e.row.get(fieldName)) {\r\n label.controlVisibility = Visibility.Collapsed;\r\n }\r\n } else {\r\n const isParallelControl = e.rowModel!.controls.get('IsParallelFlag');\r\n if (isParallelControl) {\r\n this._disposes.push(reaction(\r\n () => (isParallelControl as CheckBoxViewModel).isChecked,\r\n () => {\r\n label.controlVisibility = label.controlVisibility === Visibility.Collapsed\r\n ? Visibility.Visible\r\n : Visibility.Collapsed;\r\n }\r\n ));\r\n }\r\n }\r\n }\r\n\r\n}","import { CardUIExtension, ICardUIExtensionContext, CardModelFlags, CardModelInitializingEventArgs } from 'tessa/ui/cards';\r\nimport { hasNotFlag, hasFlag } from 'tessa/platform';\r\nimport { getKrComponents, KrTypesCache, KrComponents } from 'tessa/workflow';\r\n\r\nexport class KrDocumentWorkspaceInfoUIExtension extends CardUIExtension {\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n const editor = context.uiContext.cardEditor;\r\n\r\n if (!editor\r\n || context.model.inSpecialMode\r\n && hasNotFlag(context.model.flags, CardModelFlags.EditTemplate)\r\n && hasNotFlag(context.model.flags, CardModelFlags.ViewExported)\r\n ) {\r\n return;\r\n }\r\n\r\n editor.cardModelInitialized.remove(KrDocumentWorkspaceInfoUIExtension.onCardModelInitialized);\r\n\r\n const usedComponents = getKrComponents(context.model.cardType.id!, null, KrTypesCache.instance);\r\n if (hasFlag(usedComponents, KrComponents.DocTypes)) {\r\n editor.cardModelInitialized.add(KrDocumentWorkspaceInfoUIExtension.onCardModelInitialized);\r\n }\r\n }\r\n\r\n private static async onCardModelInitialized(e: CardModelInitializingEventArgs) {\r\n const sections = e.cardModel.card.tryGetSections();\r\n if (!sections) {\r\n return;\r\n }\r\n\r\n const section = sections.tryGet('DocumentCommonInfo');\r\n if (!section) {\r\n return;\r\n }\r\n\r\n const docTypeTitle = section.fields.tryGet('DocTypeTitle');\r\n if (docTypeTitle) {\r\n e.workspaceInfo = docTypeTitle;\r\n }\r\n }\r\n\r\n}","import { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { hasNotFlag, Visibility } from 'tessa/platform';\r\nimport { CardTypeFlags } from 'tessa/cards/types';\r\nimport { DefaultFormTabWithTasksViewModel } from 'tessa/ui/cards/forms';\r\nimport { CardTaskFlags } from 'tessa/cards';\r\n\r\nexport class KrCommentRequestUIExtension extends CardUIExtension {\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n const cardType = context.model.cardType;\r\n if (hasNotFlag(cardType.flags, CardTypeFlags.AllowTasks)) {\r\n return;\r\n }\r\n\r\n const model = context.model;\r\n if (!(model.mainForm instanceof DefaultFormTabWithTasksViewModel)) {\r\n return;\r\n }\r\n\r\n for (let task of model.mainForm.tasks) {\r\n const taskModel = task.taskModel;\r\n if (taskModel.cardType.id === 'f0360d95-4f88-4809-b926-57b34a2f69f5' // KrRequestCommentTypeID\r\n && hasNotFlag(taskModel.cardTask!.flags, CardTaskFlags.Performer)\r\n && !taskModel.cardTask!.isLockedEffective\r\n ) {\r\n const commentControl = taskModel.controls.get('Comment');\r\n if (commentControl) {\r\n commentControl.controlVisibility = Visibility.Collapsed;\r\n }\r\n }\r\n }\r\n }\r\n\r\n}","import { runInAction } from 'mobx';\r\nimport { KrTileInflater } from '../../workflow/krProcess/krTileInflater';\r\nimport { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { ITilePanel, Tile, TileGroups, ITile } from 'tessa/ui/tiles';\r\nimport { cardInSpecialMode, tryGetFromInfo } from 'tessa/ui';\r\nimport { KrTileInfo } from 'tessa/workflow/krProcess';\r\nimport { IStorage } from 'tessa/platform/storage';\r\n\r\nexport class KrTilesUIExtension extends CardUIExtension {\r\n\r\n public contextInitialized(context: ICardUIExtensionContext) {\r\n const card = context.card;\r\n let tilesPanel: ITilePanel;\r\n if (!card\r\n || cardInSpecialMode(context.model)\r\n || !context.uiContext.tiles\r\n || !(tilesPanel = context.uiContext.tiles.leftPanel)\r\n ) {\r\n return;\r\n }\r\n\r\n const tilesStorage = tryGetFromInfo(card.info, 'LocalTilesInfoMark', null);\r\n if (!tilesStorage) {\r\n return;\r\n }\r\n\r\n const localTiles: KrTileInfo[] = [];\r\n if (Array.isArray(tilesStorage)) {\r\n for (let tile of tilesStorage) {\r\n localTiles.push(new KrTileInfo(tile));\r\n }\r\n } else {\r\n const names = Object.getOwnPropertyNames(tilesStorage);\r\n for (let name of names) {\r\n localTiles.push(new KrTileInfo(tilesStorage[name]));\r\n }\r\n }\r\n\r\n // т.к. в этот момент tilesPanel.tiles уже observable, то нужно завернуть в runInAction\r\n runInAction(() => {\r\n KrTilesUIExtension.removeTilesWithTileInfo(tilesPanel.tiles);\r\n\r\n const tiles = KrTileInflater.instance.inflate(tilesPanel.contextSource, localTiles, TileGroups.Workflow);\r\n\r\n const actionGroupingTiles = tiles\r\n .filter(x => {\r\n const info = tryGetFromInfo(x.sharedInfo, 'TileInfo', null);\r\n return info && info.actionGrouping\r\n })\r\n .map(x => x.clone());\r\n\r\n let groupTile = tilesPanel.tryGetTile('ActionsGrouping');\r\n if (groupTile) {\r\n KrTilesUIExtension.removeTilesWithTileInfo(groupTile.tiles);\r\n }\r\n\r\n if (actionGroupingTiles.length > 0) {\r\n if (!groupTile) {\r\n groupTile = new Tile({\r\n name: 'ActionsGrouping',\r\n caption: '$UI_Tiles_ActionsGrouping',\r\n icon: 'ta icon-thin-258',\r\n contextSource: tilesPanel.contextSource,\r\n group: TileGroups.Cards,\r\n order: 10\r\n });\r\n tilesPanel.tiles.push(groupTile);\r\n }\r\n\r\n groupTile.info['MinActionsGroupingCount'] = 1;\r\n groupTile.tiles.push(...actionGroupingTiles);\r\n }\r\n\r\n // TODO: может быть сюда надо пихать тайлы с фильтром !actionGrouping\r\n tilesPanel.tiles.push(...tiles);\r\n });\r\n }\r\n\r\n private static removeTilesWithTileInfo(tiles: ITile[]) {\r\n const removeIndices: number[] = [];\r\n tiles.forEach((x, i) => {\r\n if (tryGetFromInfo(x.sharedInfo, 'TileInfo', null)) {\r\n removeIndices.push(i);\r\n }\r\n });\r\n removeIndices.reverse();\r\n\r\n for (let i of removeIndices) {\r\n tiles.splice(i, 1);\r\n }\r\n }\r\n\r\n}\r\n","import { reaction } from 'mobx';\r\nimport { designTimeCard } from '../../workflow/krProcess/krUIHelper';\r\nimport { CardUIExtension, ICardUIExtensionContext, ICardModel } from 'tessa/ui/cards';\r\nimport { getKrComponentsByCard, KrTypesCache, KrComponents } from 'tessa/workflow';\r\nimport { hasFlag, Visibility, DotNetType } from 'tessa/platform';\r\nimport { Card, CardRowState, CardRow, CardFieldChangedEventArgs,\r\n CardSection, CardRowStateChangedEventArgs } from 'tessa/cards';\r\nimport { GridViewModel, GridRowEventArgs, GridRowAction,\r\n AutoCompleteTableViewModel, RowAutoCompleteItem } from 'tessa/ui/cards/controls';\r\nimport { ArrayStorage, CollectionChangedEventArgs } from 'tessa/platform/storage';\r\n\r\nexport class KrAdditionalApprovalCardUIExtension extends CardUIExtension {\r\n\r\n //#region fields\r\n\r\n private _disposes: Function[] = [];\r\n private _card: Card;\r\n private _handleManager: HandleManager;\r\n private _lastSelectedItem: RowAutoCompleteItem | null;\r\n\r\n //#endregion\r\n\r\n //#region CardUIExtension\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n const model = context.model;\r\n\r\n if (!this.isCardAvailableForExtension(model)) {\r\n return;\r\n }\r\n\r\n const approvalTab = model.forms.find(x => x.name === 'ApprovalProcess');\r\n if (!approvalTab) {\r\n return;\r\n }\r\n\r\n this._card = context.card;\r\n\r\n // Находим блок с этапами и подписываемся на открытие строки с этапом\r\n const approvalStagesBlock = approvalTab.blocks.find(x => x.name === 'ApprovalStagesBlock')!;\r\n const approvalStagesTable = approvalStagesBlock.controls[0] as GridViewModel;\r\n if (approvalStagesTable) {\r\n this._disposes.push(approvalStagesTable.rowInvoked.addWithDispose(this.approvalStagesTable_RowInvoked)!);\r\n }\r\n }\r\n\r\n public finalized() {\r\n for (let func of this._disposes) {\r\n if (func) {\r\n func();\r\n }\r\n }\r\n this._disposes.length = 0;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n private isCardAvailableForExtension(model: ICardModel): boolean {\r\n if (designTimeCard(model.card.typeId)) {\r\n return true;\r\n }\r\n\r\n const usedComponents = getKrComponentsByCard(model.card, KrTypesCache.instance);\r\n return hasFlag(usedComponents, KrComponents.Routes);\r\n }\r\n\r\n private approvalStagesTable_RowInvoked = (e: GridRowEventArgs) => {\r\n if (e.action !== GridRowAction.Inserted && e.action !== GridRowAction.Opening) {\r\n return;\r\n }\r\n\r\n // Проверим, что все необходимые блоки есть\r\n if (!e.rowModel!.blocks.has('PerformersBlock')\r\n || !e.rowModel!.blocks.has('AdditionalApprovalBlock')\r\n ) {\r\n return;\r\n }\r\n\r\n if (e.row.tryGet('StageTypeID') !== '185610e1-6ab0-064e-9429-4c529804dfe4') { // StageTypeDescriptors.ApprovalDescriptor\r\n return;\r\n }\r\n\r\n this._lastSelectedItem = null;\r\n\r\n // Получим необходимые блоки\r\n const approvalBlock = e.rowModel!.blocks.get('PerformersBlock')!;\r\n const additionalApprovalBlock = e.rowModel!.blocks.get('AdditionalApprovalBlock')!;\r\n\r\n // Скроем блок с доп. согласантами\r\n additionalApprovalBlock.blockVisibility = Visibility.Collapsed;\r\n\r\n // Найдём контрол с согласующими\r\n const approversControl = approvalBlock.controls\r\n .find(x => x.name === 'MultiplePerformersTableAC') as AutoCompleteTableViewModel;\r\n if (!approversControl) {\r\n return;\r\n }\r\n\r\n // контрол будет открывать меню выбора по дабл клику, чтобы не мешался\r\n approversControl.hasSelectionAction = true;\r\n\r\n // Получаем секцию с согласантами\r\n const approversVirtualSection = this._card.typeId === '4a377758-2366-47e9-98ac-c5f553974236'\r\n ? this._card.sections.get('KrPerformersVirtual')!\r\n : this._card.sections.get('KrPerformersVirtual_Synthetic')!;\r\n\r\n // Получаем секции, которые будут отображать инфо по доп сагласующим\r\n const infoUsersVirtualSection =\r\n this._card.sections.get('KrAdditionalApprovalInfoUsersCardVirtual_Synthetic')!;\r\n\r\n // Получаем секции для хранения доп-согласантов\r\n const additionalApprovalUsersVirtualSection =\r\n this._card.sections.get('KrAdditionalApprovalUsersCardVirtual_Synthetic')!;\r\n\r\n let name: string;\r\n for (let row of approversVirtualSection.rows) {\r\n if (additionalApprovalUsersVirtualSection.rows.some(x =>\r\n x.get('MainApproverRowID') === row.rowId\r\n && x.state !== CardRowState.Deleted)\r\n && !!(name = row.get('PerformerName'))\r\n ) {\r\n row.set('PerformerName', KrAdditionalApprovalCardUIExtension.markName(name), DotNetType.String);\r\n }\r\n }\r\n\r\n this._handleManager = new HandleManager(\r\n e.rowModel!,\r\n () => {\r\n this.transferData(\r\n e.row,\r\n infoUsersVirtualSection,\r\n additionalApprovalUsersVirtualSection,\r\n approversControl.selectedItem as RowAutoCompleteItem\r\n );\r\n\r\n // Стираем лишние отметки о доп-согласовании\r\n for (let row of approversVirtualSection.rows) {\r\n if (additionalApprovalUsersVirtualSection.rows.every(x =>\r\n x.get('MainApproverRowID') !== row.rowId\r\n || x.state === CardRowState.Deleted)\r\n ) {\r\n const name = row.get('PerformerName');\r\n row.set('PerformerName', KrAdditionalApprovalCardUIExtension.unmarkName(name), DotNetType.String);\r\n }\r\n }\r\n }\r\n );\r\n\r\n this._disposes.push(approversControl.valueDeleted.addWithDispose(e => {\r\n const item = e.item as RowAutoCompleteItem;\r\n if (approversControl.selectedItem === item) {\r\n infoUsersVirtualSection.rows.clear();\r\n additionalApprovalBlock.blockVisibility = Visibility.Collapsed;\r\n }\r\n\r\n for (let i = additionalApprovalUsersVirtualSection.rows.length - 1; i >= 0; i--) {\r\n const row = additionalApprovalUsersVirtualSection.rows[i];\r\n if (row.get('MainApproverRowID') === item.row.rowId) {\r\n if (row.state !== CardRowState.Inserted) {\r\n row.state = CardRowState.Deleted;\r\n } else {\r\n additionalApprovalUsersVirtualSection.rows.remove(row);\r\n }\r\n }\r\n }\r\n })!);\r\n\r\n this._disposes.push(reaction(\r\n () => approversControl.selectedItem,\r\n (selectedItem: RowAutoCompleteItem | null) => {\r\n // потерю фокуса с выделенного элемента не обрабатываем\r\n if (!selectedItem) {\r\n return;\r\n }\r\n\r\n this._handleManager.unhandleAllAdditioanlApproverItemRows();\r\n this._handleManager.unhandleFirstIsResponsible();\r\n\r\n // Получаем последний выделенный элемент\r\n const item = selectedItem;\r\n\r\n this._handleManager.handleAdditionalApproversListItemChanged(\r\n infoUsersVirtualSection.rows,\r\n e => {\r\n // Смена Display текста в зависимости от изменения списка доп. согласантов.\r\n const mainApproverRow = approversVirtualSection.rows.find(x => x.rowId === item!.row.rowId);\r\n if (mainApproverRow) {\r\n const name = mainApproverRow.get('PerformerName');\r\n if (infoUsersVirtualSection.rows.length > 0) {\r\n mainApproverRow.set('PerformerName', KrAdditionalApprovalCardUIExtension.markName(name), DotNetType.String);\r\n } else {\r\n mainApproverRow.set('PerformerName', KrAdditionalApprovalCardUIExtension.unmarkName(name), DotNetType.String);\r\n }\r\n }\r\n\r\n const items = e.added.length > 0\r\n ? e.added\r\n : e.removed;\r\n for (let changedItem of items) {\r\n if (changedItem.state === CardRowState.None) {\r\n this._handleManager.handleAdditioanlApproverItemRow(\r\n changedItem,\r\n e => {\r\n if (e.newState === CardRowState.Inserted\r\n || e.newState === CardRowState.Modified\r\n ) {\r\n changedItem.set('MainApproverRowID', item!.row.rowId, DotNetType.Guid);\r\n this._handleManager.unhandleAdditioanlApproverItemRow(changedItem);\r\n }\r\n }\r\n );\r\n } else if ((changedItem.state === CardRowState.Inserted\r\n || changedItem.state === CardRowState.Modified)\r\n && !changedItem.get('MainApproverRowID')\r\n ) {\r\n changedItem.set('MainApproverRowID', item!.row.rowId, DotNetType.Guid);\r\n }\r\n }\r\n }\r\n );\r\n\r\n // Переносим данные в хранение и очищаем\r\n this.transferData(e.row, infoUsersVirtualSection, additionalApprovalUsersVirtualSection, this._lastSelectedItem);\r\n this._lastSelectedItem = selectedItem;\r\n\r\n // Наполняем строки автокомплита с доп. согласантами.\r\n if (additionalApprovalUsersVirtualSection.rows.length > 0) {\r\n const sortedRows = additionalApprovalUsersVirtualSection\r\n .rows\r\n .map(x => x)\r\n .sort((a, b) => a.get('Order') - b.get('Order'))\r\n .filter(x => x.get('MainApproverRowID') === item!.row.rowId);\r\n\r\n for (let row of sortedRows) {\r\n if (row.state !== CardRowState.Deleted) {\r\n infoUsersVirtualSection.rows.add(row);\r\n }\r\n }\r\n }\r\n\r\n const value = !!infoUsersVirtualSection.rows\r\n && infoUsersVirtualSection.rows.length > 0\r\n && infoUsersVirtualSection.rows.some(x => x.get('IsResponsible'));\r\n e.row.set('KrApprovalSettingsVirtual__FirstIsResponsible', value, DotNetType.Boolean);\r\n\r\n // Если блок скрыт - показываем\r\n if (additionalApprovalBlock.blockVisibility === Visibility.Collapsed) {\r\n additionalApprovalBlock.blockVisibility = Visibility.Visible;\r\n }\r\n }\r\n ));\r\n }\r\n\r\n private transferData(\r\n mainRow: CardRow,\r\n infoUsersVirtualSection: CardSection,\r\n additionalApprovalUsersVirtualSection: CardSection,\r\n selectedItem: RowAutoCompleteItem | null\r\n ) {\r\n if (!selectedItem) {\r\n return;\r\n }\r\n\r\n if (infoUsersVirtualSection.rows.length > 0) {\r\n const infoUsersVirtualSectionOrdredRows = infoUsersVirtualSection\r\n .rows\r\n .map(x => x)\r\n .sort((a, b) => a.get('Order') - b.get('Order'));\r\n\r\n if (mainRow.get('KrApprovalSettingsVirtual__FirstIsResponsible')) {\r\n // находим старого ответсвенного\r\n const oldResponsibleRow =\r\n infoUsersVirtualSection.rows.find(x => x.get('IsResponsible'));\r\n if (infoUsersVirtualSection.rows.some(x => x.state !== CardRowState.Deleted)) {\r\n // находим минимальный ордер среди не удалённых\r\n const notDeletedRowsMinOrderValue = Math.min(...infoUsersVirtualSection.rows\r\n .filter(x => x.state !== CardRowState.Deleted)\r\n .map(x => x.get('Order')));\r\n // если есть стапрый ответсвенный и его порядок не соответствует минимальном родеру среди не удалённых\r\n // снимаем ему галочку\r\n if (oldResponsibleRow) {\r\n if (oldResponsibleRow.get('Order') !== notDeletedRowsMinOrderValue) {\r\n oldResponsibleRow.set('IsResponsible', false, DotNetType.Boolean);\r\n\r\n // находим нового ответсвенного\r\n const newResponsibleRow = infoUsersVirtualSection.rows.find(\r\n x => x.get('Order') === notDeletedRowsMinOrderValue);\r\n // ставим ему флаг ответсвенности\r\n newResponsibleRow!.set('IsResponsible', true, DotNetType.Boolean);\r\n }\r\n } else {\r\n // находим нового ответсвенного\r\n const newResponsibleRow = infoUsersVirtualSection.rows.find(\r\n x => x.get('Order') === notDeletedRowsMinOrderValue);\r\n // ставим ему флаг ответсвенности\r\n newResponsibleRow!.set('IsResponsible', true, DotNetType.Boolean);\r\n }\r\n }\r\n } else {\r\n // находим старого ответсвенного\r\n const oldResponsibleRow = infoUsersVirtualSection.rows.find(x => x.get('IsResponsible'));\r\n if (oldResponsibleRow) {\r\n oldResponsibleRow.set('IsResponsible', false, DotNetType.Boolean);\r\n }\r\n }\r\n\r\n // Запоминаем старые удалённые элементы\r\n const deletedRows =\r\n additionalApprovalUsersVirtualSection.rows.filter(x => x.state === CardRowState.Deleted);\r\n for (let deletedRow of deletedRows) {\r\n additionalApprovalUsersVirtualSection.rows.remove(deletedRow);\r\n }\r\n\r\n for (let i = additionalApprovalUsersVirtualSection.rows.length; i > 0; i--) {\r\n const row = additionalApprovalUsersVirtualSection.rows[i - 1];\r\n if (row.get('MainApproverRowID') === selectedItem.row.rowId) {\r\n additionalApprovalUsersVirtualSection.rows.remove(row);\r\n }\r\n }\r\n\r\n for (let row of infoUsersVirtualSectionOrdredRows) {\r\n additionalApprovalUsersVirtualSection.rows.add(row);\r\n }\r\n\r\n // Восстанавливаем старые удалённые элементы\r\n for (let deletedRow of deletedRows) {\r\n additionalApprovalUsersVirtualSection.rows.add(deletedRow);\r\n }\r\n } else {\r\n for (let i = additionalApprovalUsersVirtualSection.rows.length; i > 0; i--) {\r\n const row = additionalApprovalUsersVirtualSection.rows[i - 1];\r\n if (row.get('MainApproverRowID') === selectedItem.row.rowId) {\r\n additionalApprovalUsersVirtualSection.rows.remove(row);\r\n }\r\n }\r\n }\r\n\r\n // Чистим данные перед наполнением\r\n infoUsersVirtualSection.rows.clear();\r\n mainRow.setChanged('KrApprovalSettingsVirtual__FirstIsResponsible', false);\r\n }\r\n\r\n private static markName(name: string): string {\r\n if (!name\r\n || name.length === 0\r\n || name.startsWith('(+) ')\r\n ) {\r\n return name;\r\n }\r\n\r\n return name[0] === '$'\r\n ? `(+) {${name}}`\r\n : `(+) ${name}`;\r\n }\r\n\r\n private static unmarkName(name: string): string {\r\n if (name && name.startsWith('(+) ')) {\r\n let from = 4;\r\n let len = name.length;\r\n // (+) {} - Если расширенная локализация, скобки надо выпиливать.\r\n if (name.length >= 6\r\n && name[4] === '{'\r\n && name[name.length - 1] === '}'\r\n ) {\r\n from++;\r\n len -= 1;\r\n }\r\n return name.substring(from, len);\r\n }\r\n\r\n return name;\r\n }\r\n\r\n //#endregion\r\n\r\n}\r\n\r\nclass HandleManager {\r\n\r\n //#region ctor\r\n\r\n constructor(\r\n model: ICardModel,\r\n formCloseAction: Function\r\n ) {\r\n this.model = model;\r\n this.formCloseAction = formCloseAction;\r\n this.model.mainForm!.closed.add(this.mainForm_Closed);\r\n this.additionalApproverHandlers = new Map();\r\n }\r\n\r\n //#endregion\r\n\r\n //#region fields\r\n\r\n private model: ICardModel;\r\n private formCloseAction: Function;\r\n\r\n private additionalApproverHandlers: Map void>;\r\n\r\n private additionalApproversListRows: ArrayStorage | null;\r\n private additionalApproversListRowsHandler: ((e: CollectionChangedEventArgs) => void) | null;\r\n\r\n private firstIsResponsibleRow: CardRow | null;\r\n private firstIsResponsibleRowHandler: ((e: CardFieldChangedEventArgs) => void) | null;\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n private mainForm_Closed = () => {\r\n this.formCloseAction();\r\n this.unhandleAdditionalApproversListItemChanged();\r\n this.unhandleFirstIsResponsible();\r\n this.model.mainForm!.closed.remove(this.mainForm_Closed);\r\n }\r\n\r\n public handleAdditionalApproversListItemChanged(\r\n rows: ArrayStorage,\r\n handler: (e: CollectionChangedEventArgs) => void\r\n ) {\r\n if (this.additionalApproversListRows\r\n && this.additionalApproversListRowsHandler\r\n ) {\r\n this.additionalApproversListRows.collectionChanged.remove(this.additionalApproversListRowsHandler);\r\n }\r\n this.additionalApproversListRows = rows;\r\n this.additionalApproversListRowsHandler = handler;\r\n\r\n this.additionalApproversListRows.collectionChanged.add(this.additionalApproversListRowsHandler);\r\n }\r\n\r\n private unhandleAdditionalApproversListItemChanged() {\r\n if (!this.additionalApproversListRowsHandler) {\r\n return;\r\n }\r\n\r\n this.additionalApproversListRows!.collectionChanged.remove(this.additionalApproversListRowsHandler);\r\n this.additionalApproversListRows = null;\r\n this.additionalApproversListRowsHandler = null;\r\n }\r\n\r\n public handleAdditioanlApproverItemRow(\r\n row: CardRow,\r\n handler: (e: CardRowStateChangedEventArgs) => void\r\n ) {\r\n if (this.additionalApproverHandlers.has(row)) {\r\n return;\r\n }\r\n row.stateChanged.add(handler);\r\n this.additionalApproverHandlers.set(row, handler);\r\n }\r\n\r\n public unhandleAdditioanlApproverItemRow(row: CardRow) {\r\n const handler = this.additionalApproverHandlers.get(row)!;\r\n row.stateChanged.remove(handler);\r\n this.additionalApproverHandlers.delete(row);\r\n }\r\n\r\n public unhandleAllAdditioanlApproverItemRows() {\r\n for (let pair of this.additionalApproverHandlers) {\r\n pair[0].stateChanged.remove(pair[1]);\r\n }\r\n this.additionalApproverHandlers.clear();\r\n }\r\n\r\n public handleFirstIsResponsible(\r\n row: CardRow,\r\n handler: (e: CardFieldChangedEventArgs) => void\r\n ) {\r\n if (this.firstIsResponsibleRow\r\n && this.firstIsResponsibleRowHandler\r\n ) {\r\n this.firstIsResponsibleRow.fieldChanged.remove(this.firstIsResponsibleRowHandler);\r\n }\r\n this.firstIsResponsibleRow = row;\r\n this.firstIsResponsibleRowHandler = handler;\r\n\r\n this.firstIsResponsibleRow.fieldChanged.add(this.firstIsResponsibleRowHandler);\r\n }\r\n\r\n public unhandleFirstIsResponsible() {\r\n if (!this.firstIsResponsibleRowHandler) {\r\n return;\r\n }\r\n\r\n this.firstIsResponsibleRow!.fieldChanged.remove(this.firstIsResponsibleRowHandler);\r\n this.firstIsResponsibleRow = null;\r\n this.firstIsResponsibleRowHandler = null;\r\n }\r\n\r\n //#endregion\r\n\r\n}","import { designTimeCard } from '../../workflow/krProcess/krUIHelper';\r\nimport { CardUIExtension, ICardUIExtensionContext, CardModelFlags, ICardModel, IFormViewModel } from 'tessa/ui/cards';\r\nimport { hasFlag, Visibility } from 'tessa/platform';\r\nimport { getKrComponentsByCard, KrTypesCache, KrComponents } from 'tessa/workflow';\r\n\r\nexport class KrTemplateUIExtension extends CardUIExtension {\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n let routesForm: IFormViewModel;\r\n if (!hasFlag(context.model.flags, CardModelFlags.EditTemplate)\r\n || !this.cardIsAvailableForExtension(context.model)\r\n || !(routesForm = context.model.forms.find(x => x.name === 'ApprovalProcess')!)\r\n ) {\r\n return;\r\n }\r\n\r\n for (let block of routesForm.blocks) {\r\n block.blockVisibility = block.name === 'DisclaimerBlock'\r\n ? Visibility.Visible\r\n : Visibility.Collapsed;\r\n }\r\n }\r\n\r\n private cardIsAvailableForExtension(model: ICardModel): boolean {\r\n if (designTimeCard(model.card.typeId)) {\r\n return true;\r\n }\r\n\r\n const usedComponents = getKrComponentsByCard(model.card, KrTypesCache.instance);\r\n return hasFlag(usedComponents, KrComponents.Routes);\r\n }\r\n\r\n}","import { CardUIExtension, ICardModel, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { DotNetType, Visibility } from 'tessa/platform';\r\nimport { CardRowState } from 'tessa/cards';\r\n\r\nexport class KrSecondaryProcessUIExtension extends CardUIExtension {\r\n private _model: ICardModel;\r\n\r\n private _pureProcess = {\r\n id: 0,\r\n name: '$KrSecondaryProcess_Mode_PureProcess'\r\n };\r\n\r\n private _button = {\r\n id: 1,\r\n name: '$KrSecondaryProcess_Mode_Button'\r\n };\r\n\r\n private _action = {\r\n id: 2,\r\n name: '$KrSecondaryProcess_Mode_Action'\r\n };\r\n\r\n private _dispose: Function | null;\r\n\r\n public shouldExecute(context: ICardUIExtensionContext) {\r\n return context.card.typeId === '61420fa1-cc1f-47cb-b0bb-4ea8ee77f51a';\r\n }\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n this._model = context.model;\r\n const currentMode = this.getCurrentMode();\r\n this.updateVisibility(currentMode);\r\n if (currentMode === this._pureProcess.id) {\r\n this.updateCheckRestrictions();\r\n }\r\n\r\n this._dispose = context.card.sections\r\n .get('KrSecondaryProcesses')!\r\n .fields.fieldChanged.addWithDispose(e => {\r\n switch (e.fieldName) {\r\n case 'ModeID':\r\n this.updateVisibility(this.getCurrentMode());\r\n break;\r\n\r\n case 'AllowClientSideLaunch':\r\n this.updateVisibiltyForPureProcessMode();\r\n break;\r\n\r\n case 'CheckRecalcRestrictions':\r\n this.updateCheckRestrictions();\r\n break;\r\n }\r\n });\r\n }\r\n\r\n public finalized() {\r\n if (this._dispose) {\r\n this._dispose();\r\n this._dispose = null;\r\n }\r\n }\r\n\r\n private updateVisibility(currentMode: number) {\r\n const getVisibility = (allowedMode: number, allowedMode2: number = -2) => {\r\n return allowedMode === currentMode || allowedMode2 === currentMode\r\n ? Visibility.Visible\r\n : Visibility.Collapsed;\r\n };\r\n\r\n const blocks = this._model.blocks;\r\n blocks.get('PureProcessParametersBlock')!.blockVisibility = getVisibility(this._pureProcess.id);\r\n blocks.get('TileParametersBlock')!.blockVisibility = getVisibility(this._button.id);\r\n blocks.get('ActionParametersBlock')!.blockVisibility = getVisibility(this._action.id);\r\n blocks.get('VisibilityScriptsBlock')!.blockVisibility = getVisibility(this._button.id);\r\n\r\n blocks.get('RestictionsBlock')!.blockVisibility = Visibility.Visible;\r\n blocks.get('ExecutionAccessDeniedBlock')!.blockVisibility = Visibility.Visible;\r\n blocks.get('ExecutionScriptsBlock')!.blockVisibility = Visibility.Visible;\r\n\r\n if (currentMode === this._pureProcess.id) {\r\n this.updateVisibiltyForPureProcessMode();\r\n }\r\n }\r\n\r\n private updateVisibiltyForPureProcessMode() {\r\n const card = this._model.card;\r\n const sec = card.sections.get('KrSecondaryProcesses')!;\r\n const allowClientSideLaunch = sec.fields.tryGet('AllowClientSideLaunch') || false;\r\n const checkRecalcControl = this._model.blocks\r\n .get('PureProcessParametersBlock')!\r\n .controls.find(x => x.name === 'CheckRecalcRestrictionsCheckbox')!;\r\n\r\n checkRecalcControl.isReadOnly = allowClientSideLaunch;\r\n const checkRecalcRestrictions = sec.fields.tryGet('CheckRecalcRestrictions') || false;\r\n if (allowClientSideLaunch && !checkRecalcRestrictions) {\r\n sec.fields.set('CheckRecalcRestrictions', true, DotNetType.Boolean);\r\n } else if (!allowClientSideLaunch && !checkRecalcRestrictions) {\r\n this.updateCheckRestrictions();\r\n }\r\n }\r\n\r\n private updateCheckRestrictions() {\r\n const blocks = this._model.blocks;\r\n const card = this._model.card;\r\n const checkRecalcRestrictions =\r\n card.sections.get('KrSecondaryProcesses')!.fields.tryGet('CheckRecalcRestrictions') || false;\r\n const visibilityForRestrictionFields = checkRecalcRestrictions\r\n ? Visibility.Visible\r\n : Visibility.Collapsed;\r\n blocks.get('RestictionsBlock')!.blockVisibility = visibilityForRestrictionFields;\r\n blocks.get('ExecutionAccessDeniedBlock')!.blockVisibility = visibilityForRestrictionFields;\r\n blocks.get('ExecutionScriptsBlock')!.blockVisibility = visibilityForRestrictionFields;\r\n\r\n if (!checkRecalcRestrictions) {\r\n const sec = card.sections.get('KrSecondaryProcesses')!;\r\n sec.fields.set('ExecutionAccessDeniedMessage', null);\r\n sec.fields.set('ExecutionSqlCondition', null);\r\n sec.fields.set('ExecutionSourceCondition', null);\r\n\r\n const clear = (name: string) => {\r\n const rows = card.sections.get(name)!.rows;\r\n const removeRows = rows.filter(x => x.state === CardRowState.Inserted);\r\n for (let row of removeRows) {\r\n rows.remove(row);\r\n }\r\n for (let row of rows) {\r\n row.state = CardRowState.Deleted;\r\n }\r\n };\r\n\r\n clear('KrStageDocStates');\r\n clear('KrStageTypes');\r\n clear('KrStageRoles');\r\n clear('KrSecondaryProcessRoles');\r\n }\r\n }\r\n\r\n private getCurrentMode(): number {\r\n const modeId = this._model.card.sections.get('KrSecondaryProcesses')!.fields.tryGet('ModeID');\r\n // tslint:disable-next-line:triple-equals\r\n return modeId == undefined ? -1 : modeId;\r\n }\r\n}\r\n","import { CardUIExtension, ICardUIExtensionContext, CardDefaultDialog, CardToolbarAction } from 'tessa/ui/cards';\r\nimport { Card } from 'tessa/cards';\r\nimport { tryGetFromInfo, showConfirmWithCancel } from 'tessa/ui';\r\nimport { TypedField, DotNetType, getTypedFieldValue } from 'tessa/platform';\r\nimport { openMarkedCard } from 'tessa/ui/tiles';\r\n\r\nexport class KrEditModeToolbarUIExtension extends CardUIExtension {\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n if (context.dialogName !== CardDefaultDialog) {\r\n return;\r\n }\r\n\r\n if (KrEditModeToolbarUIExtension.tileIsVisible(context.card, 'KrEditMode')) {\r\n context.toolbar.addItemIfNotExists(new CardToolbarAction({\r\n name: 'KrEditMode',\r\n caption: '$KrTiles_EditMode',\r\n icon: 'ta icon-thin-002',\r\n order: 11,\r\n toolTip: '$KrTiles_EditModeTooltip',\r\n command: this.openForEditing\r\n }),\r\n {\r\n name: 'Alt+E', key: 'KeyE', modifiers: {alt: true}\r\n });\r\n } else {\r\n context.toolbar.removeItemIfExists('KrEditMode');\r\n }\r\n }\r\n\r\n private openForEditing = async () => {\r\n await openMarkedCard(\r\n 'kr_calculate_permissions',\r\n null, // Не требуем подтверждения дейтсвия если не было изменений\r\n () => showConfirmWithCancel('$KrTiles_EditModeConfirmation')\r\n );\r\n }\r\n\r\n private static tileIsVisible(card: Card, tileName: string): boolean {\r\n const info = card.tryGetInfo();\r\n if (!info) {\r\n return false;\r\n }\r\n\r\n const tiles = tryGetFromInfo[] | null>(info, '.tiles', null);\r\n if (!tiles) {\r\n return false;\r\n }\r\n\r\n for (let tile of tiles) {\r\n const tileValue = getTypedFieldValue(tile) as string;\r\n if (tileValue.toLocaleLowerCase() === tileName.toLocaleLowerCase()) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n}","import { KrStageTypeUIHandler, IKrStageTypeUIHandlerContext, StageTypeHandlerDescriptor,\r\n addFromTemplateDescriptor } from 'tessa/workflow/krProcess';\r\nimport { plainColumnName } from 'tessa/workflow';\r\nimport { ValidationResult, ValidationResultType } from 'tessa/platform/validation';\r\n\r\nexport class AddFromTemplateUIHandler extends KrStageTypeUIHandler {\r\n\r\n private _templateId: string = plainColumnName('KrAddFromTemplateSettingsVirtual', 'FileTemplateID');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [addFromTemplateDescriptor];\r\n }\r\n\r\n public validate(context: IKrStageTypeUIHandlerContext) {\r\n const template = context.row.tryGet(this._templateId);\r\n // tslint:disable-next-line:triple-equals\r\n if (template == undefined) {\r\n context.validationResult.add(ValidationResult.fromText(\r\n '$KrStages_AddFromTemplate_TemplateIsRequiredWarning', ValidationResultType.Warning));\r\n }\r\n }\r\n\r\n}","import {\r\n KrStageTypeUIHandler,\r\n IKrStageTypeUIHandlerContext,\r\n approvalDescriptor,\r\n StageTypeHandlerDescriptor\r\n} from 'tessa/workflow/krProcess';\r\nimport { IFormViewModel, IBlockViewModel, IControlViewModel } from 'tessa/ui/cards';\r\nimport { TabControlViewModel } from 'tessa/ui/cards/controls';\r\nimport { CardRow, CardFieldChangedEventArgs } from 'tessa/cards';\r\nimport { plainColumnName } from 'tessa/workflow';\r\nimport { DotNetType, Visibility } from 'tessa/platform';\r\nimport { ViewService, TessaViewRequest, RequestParameterBuilder } from 'tessa/views';\r\nimport { equalsCriteriaOperator } from 'tessa/views/metadata';\r\n\r\nexport class ApprovalUIHandler extends KrStageTypeUIHandler {\r\n private _settings: CardRow;\r\n private _returnIfNotApprovedFlagControl: IControlViewModel;\r\n private _returnAfterApprovalFlagControl: IControlViewModel;\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [approvalDescriptor];\r\n }\r\n\r\n public initialize(context: IKrStageTypeUIHandlerContext) {\r\n let flagsBlock: IBlockViewModel;\r\n let flagsTabs: IControlViewModel;\r\n let tabViewModel: IFormViewModel;\r\n let innerFlagsBlock: IBlockViewModel;\r\n if (\r\n (flagsBlock = context.rowModel!.blocks.get('ApprovalStageFlags')!) &&\r\n (flagsTabs = flagsBlock.controls.find(x => x.name === 'FlagsTabs')!) &&\r\n flagsTabs instanceof TabControlViewModel\r\n ) {\r\n if (\r\n (tabViewModel = flagsTabs.tabs.find(x => x.name === 'CommonSettings')!) &&\r\n (innerFlagsBlock = tabViewModel.blocks.find(x => x.name === 'StageFlags')!)\r\n ) {\r\n this._returnIfNotApprovedFlagControl = innerFlagsBlock.controls.find(\r\n x => x.name === 'ReturnIfNotApproved'\r\n )!;\r\n }\r\n\r\n if (\r\n (tabViewModel = flagsTabs.tabs.find(x => x.name === 'AdditionalSettings')!) &&\r\n (innerFlagsBlock = tabViewModel.blocks.find(x => x.name === 'StageFlags')!)\r\n ) {\r\n this._returnAfterApprovalFlagControl = innerFlagsBlock.controls.find(\r\n x => x.name === 'ReturnAfterApproval'\r\n )!;\r\n }\r\n }\r\n\r\n this._settings = context.row;\r\n this._settings.fieldChanged.add(this.onSettingsFieldChanged);\r\n\r\n this.advisoryConfigureFields(\r\n this._settings.tryGet(plainColumnName('KrApprovalSettingsVirtual', 'Advisory'))\r\n );\r\n this.notReturnEditConfigureFields(\r\n this._settings.tryGet(plainColumnName('KrApprovalSettingsVirtual', 'NotReturnEdit'))\r\n );\r\n }\r\n\r\n public finalize() {\r\n this._settings.fieldChanged.remove(this.onSettingsFieldChanged);\r\n this._settings = null!;\r\n }\r\n\r\n private onSettingsFieldChanged = async (e: CardFieldChangedEventArgs) => {\r\n if (e.fieldName === plainColumnName('KrApprovalSettingsVirtual', 'Advisory')) {\r\n const advisory = e.fieldValue;\r\n this.advisoryConfigureFields(advisory);\r\n\r\n if (advisory) {\r\n if (this._settings.tryGet(plainColumnName('KrTaskKindSettingsVirtual', 'KindID')) == null) {\r\n const { kindId, kindCaption } = await this.getKind(\r\n '2e6c5d3e-d408-4f98-8a55-e9d1316bf2cc'\r\n ); // AdvisoryTaskKindID\r\n if (kindId) {\r\n this._settings.set(\r\n plainColumnName('KrTaskKindSettingsVirtual', 'KindID'),\r\n kindId,\r\n DotNetType.Guid\r\n );\r\n this._settings.set(\r\n plainColumnName('KrTaskKindSettingsVirtual', 'KindCaption'),\r\n kindCaption,\r\n DotNetType.String\r\n );\r\n }\r\n }\r\n } else {\r\n if (\r\n this._settings.tryGet(plainColumnName('KrTaskKindSettingsVirtual', 'KindID')) ===\r\n '2e6c5d3e-d408-4f98-8a55-e9d1316bf2cc'\r\n ) {\r\n // AdvisoryTaskKindID\r\n this._settings.set(plainColumnName('KrTaskKindSettingsVirtual', 'KindID'), null);\r\n this._settings.set(plainColumnName('KrTaskKindSettingsVirtual', 'KindCaption'), null);\r\n }\r\n\r\n if (this._returnIfNotApprovedFlagControl) {\r\n this._returnIfNotApprovedFlagControl.isReadOnly = false;\r\n }\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (e.fieldName === plainColumnName('KrApprovalSettingsVirtual', 'NotReturnEdit')) {\r\n this.notReturnEditConfigureFields(e.fieldValue);\r\n }\r\n };\r\n\r\n private async getKind(id: guid): Promise<{ kindId: guid | null; kindCaption: string }> {\r\n const taskKindsView = ViewService.instance.getByName('TaskKinds')!;\r\n\r\n const request = new TessaViewRequest(taskKindsView.metadata);\r\n\r\n const idParam = new RequestParameterBuilder()\r\n .withMetadata(taskKindsView.metadata.parameters.get('ID')!)\r\n .addCriteria(equalsCriteriaOperator(), '', id)\r\n .asRequestParameter();\r\n\r\n request.values.push(idParam);\r\n\r\n const result = await taskKindsView.getData(request);\r\n\r\n if (!result.rows || result.rows.length === 0) {\r\n return { kindId: null, kindCaption: '' };\r\n }\r\n\r\n const row = result.rows[0];\r\n return { kindId: row[0], kindCaption: row[1] };\r\n }\r\n\r\n private advisoryConfigureFields(isAdvisory: boolean) {\r\n if (isAdvisory) {\r\n if (this._returnIfNotApprovedFlagControl) {\r\n this._returnIfNotApprovedFlagControl.isReadOnly = true;\r\n this._settings.set(\r\n plainColumnName('KrApprovalSettingsVirtual', 'ReturnWhenDisapproved'),\r\n false,\r\n DotNetType.Boolean\r\n );\r\n }\r\n }\r\n }\r\n\r\n private notReturnEditConfigureFields(isNotReturnEdit: boolean) {\r\n if (isNotReturnEdit) {\r\n if (this._returnIfNotApprovedFlagControl) {\r\n this._returnIfNotApprovedFlagControl.controlVisibility = Visibility.Collapsed;\r\n }\r\n if (this._returnAfterApprovalFlagControl) {\r\n this._returnAfterApprovalFlagControl.controlVisibility = Visibility.Collapsed;\r\n }\r\n } else {\r\n if (this._returnIfNotApprovedFlagControl) {\r\n this._returnIfNotApprovedFlagControl.controlVisibility = Visibility.Visible;\r\n }\r\n if (this._returnAfterApprovalFlagControl) {\r\n this._returnAfterApprovalFlagControl.controlVisibility = Visibility.Visible;\r\n }\r\n }\r\n }\r\n}\r\n","import { plainColumnName } from 'tessa/workflow';\r\nimport { KrStageTypeUIHandler, IKrStageTypeUIHandlerContext, StageTypeHandlerDescriptor,\r\n createCardDescriptor } from 'tessa/workflow/krProcess';\r\nimport { ValidationResult, ValidationResultType } from 'tessa/platform/validation';\r\nimport { CardRow, CardFieldChangedEventArgs } from 'tessa/cards';\r\n\r\n// tslint:disable:triple-equals\r\n\r\nexport class CreateCardUIHandler extends KrStageTypeUIHandler {\r\n\r\n private _settings: CardRow | null = null;\r\n private _templateId: string = plainColumnName('KrCreateCardStageSettingsVirtual', 'TemplateID');\r\n private _templateCaption: string = plainColumnName('KrCreateCardStageSettingsVirtual', 'TemplateCaption');\r\n private _typeId: string = plainColumnName('KrCreateCardStageSettingsVirtual', 'TypeID');\r\n private _typeCaption: string = plainColumnName('KrCreateCardStageSettingsVirtual', 'TypeCaption');\r\n private _modeId: string = plainColumnName('KrCreateCardStageSettingsVirtual', 'ModeID');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [createCardDescriptor];\r\n }\r\n\r\n public validate(context: IKrStageTypeUIHandlerContext) {\r\n const template = context.row.tryGet(this._templateId);\r\n const type = context.row.tryGet(this._typeId);\r\n const mode = context.row.tryGet(this._modeId);\r\n if (template == undefined && type == undefined) {\r\n context.validationResult!.add(ValidationResult.fromText(\r\n '$KrStages_CreateCard_TemplateAndModeRequired', ValidationResultType.Warning));\r\n } else if (template != undefined && type != undefined) {\r\n context.validationResult!.add(ValidationResult.fromText(\r\n '$KrStages_CreateCard_TemplateAndTypeSelected', ValidationResultType.Warning));\r\n }\r\n if (mode == undefined) {\r\n context.validationResult!.add(ValidationResult.fromText(\r\n '$KrStages_CreateCard_ModeRequired', ValidationResultType.Error));\r\n }\r\n }\r\n\r\n public initialize(context: IKrStageTypeUIHandlerContext) {\r\n this._settings = context.row;\r\n this._settings.fieldChanged.add(this.onSettingsFieldChanged);\r\n }\r\n\r\n public finalize(_context: IKrStageTypeUIHandlerContext) {\r\n this._settings!.fieldChanged.remove(this.onSettingsFieldChanged);\r\n this._settings = null;\r\n }\r\n\r\n private onSettingsFieldChanged = (e: CardFieldChangedEventArgs) => {\r\n if (e.fieldName === this._typeId) {\r\n if (e.fieldValue != undefined) {\r\n this._settings!.set(this._templateId, null);\r\n this._settings!.set(this._templateCaption, null);\r\n }\r\n } else if (e.fieldName === this._templateId) {\r\n if (e.fieldValue != undefined) {\r\n this._settings!.set(this._typeId, null);\r\n this._settings!.set(this._typeCaption, null);\r\n }\r\n }\r\n }\r\n\r\n}","import {\r\n KrStageTypeUIHandler,\r\n IKrStageTypeUIHandlerContext,\r\n StageTypeHandlerDescriptor,\r\n dialogDescriptor\r\n} from 'tessa/workflow/krProcess';\r\nimport { plainColumnName } from 'tessa/workflow';\r\nimport {\r\n ValidationResult,\r\n ValidationResultType,\r\n ValidationResultBuilder\r\n} from 'tessa/platform/validation';\r\nimport { GridViewModel, GridRowEventArgs } from 'tessa/ui/cards/controls';\r\nimport { showNotEmpty } from 'tessa/ui';\r\n\r\n// tslint:disable: triple-equals\r\n\r\nexport class DialogUIHandler extends KrStageTypeUIHandler {\r\n private _cardStoreModeId: string = plainColumnName(\r\n 'KrDialogStageTypeSettingsVirtual',\r\n 'CardStoreModeID'\r\n );\r\n private _openModeId: string = plainColumnName('KrDialogStageTypeSettingsVirtual', 'OpenModeID');\r\n private _dialogTypeId: string = plainColumnName(\r\n 'KrDialogStageTypeSettingsVirtual',\r\n 'DialogTypeID'\r\n );\r\n private _templateId: string = plainColumnName('KrDialogStageTypeSettingsVirtual', 'TemplateID');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [dialogDescriptor];\r\n }\r\n\r\n public validate(context: IKrStageTypeUIHandlerContext) {\r\n if (context.row.tryGet(this._cardStoreModeId) == undefined) {\r\n context.validationResult.add(\r\n ValidationResult.fromText(\r\n '$KrStages_Dialog_CardStoreModeNotSpecified',\r\n ValidationResultType.Error\r\n )\r\n );\r\n }\r\n\r\n if (context.row.tryGet(this._openModeId) == undefined) {\r\n context.validationResult.add(\r\n ValidationResult.fromText(\r\n '$KrStages_Dialog_CardOpenModeNotSpecified',\r\n ValidationResultType.Error\r\n )\r\n );\r\n }\r\n\r\n if (\r\n context.row.tryGet(this._dialogTypeId) == undefined &&\r\n context.row.tryGet(this._templateId) == undefined\r\n ) {\r\n context.validationResult.add(\r\n ValidationResult.fromText(\r\n '$KrStages_Dialog_TemplateAndTypeNotSpecified',\r\n ValidationResultType.Error\r\n )\r\n );\r\n }\r\n\r\n if (\r\n context.row.tryGet(this._dialogTypeId) != undefined &&\r\n context.row.tryGet(this._templateId) != undefined\r\n ) {\r\n context.validationResult.add(\r\n ValidationResult.fromText(\r\n '$KrStages_Dialog_TemplateAndTypeSelected',\r\n ValidationResultType.Error\r\n )\r\n );\r\n }\r\n }\r\n\r\n public initialize(context: IKrStageTypeUIHandlerContext) {\r\n const rowModel = context.rowModel;\r\n let grid: GridViewModel | null = null;\r\n if (rowModel && (grid = rowModel.controls.get('ButtonSettings') as GridViewModel)) {\r\n grid.rowEditorClosing.add(buttonSettings_RowClosing);\r\n }\r\n }\r\n\r\n public finalize(context: IKrStageTypeUIHandlerContext) {\r\n const rowModel = context.rowModel;\r\n let grid: GridViewModel | null = null;\r\n if (rowModel && (grid = rowModel.controls.get('ButtonSettings') as GridViewModel)) {\r\n grid.rowEditorClosing.remove(buttonSettings_RowClosing);\r\n }\r\n }\r\n}\r\n\r\nfunction buttonSettings_RowClosing(e: GridRowEventArgs) {\r\n const row = e.row;\r\n const validationResult = new ValidationResultBuilder();\r\n\r\n // tslint:disable-next-line:triple-equals\r\n if (row.tryGet('TypeID') == undefined) {\r\n validationResult.add(ValidationResult.fromError('$KrStages_Dialog_ButtonTypeIDNotSpecified'));\r\n e.cancel = true;\r\n }\r\n\r\n if (!row.tryGet('Caption')) {\r\n validationResult.add(ValidationResult.fromError('$KrStages_Dialog_ButtonCaptionNotSpecified'));\r\n e.cancel = true;\r\n }\r\n\r\n if (!row.tryGet('Name')) {\r\n validationResult.add(ValidationResult.fromError('$KrStages_Dialog_ButtonAliasNotSpecified'));\r\n e.cancel = true;\r\n }\r\n\r\n showNotEmpty(validationResult.build());\r\n}\r\n","import { KrStageTypeUIHandler, IKrStageTypeUIHandlerContext, StageTypeHandlerDescriptor, universalTaskDescriptor } from 'tessa/workflow/krProcess';\r\nimport { showError } from 'tessa/ui';\r\nimport { GridViewModel, GridRowEventArgs, GridRowAction } from 'tessa/ui/cards/controls';\r\nimport { DotNetType, Guid } from 'tessa/platform';\r\n\r\n// tslint:disable:triple-equals\r\n\r\nexport class KrUniversalTaskStageTypeUIHandler extends KrStageTypeUIHandler {\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [universalTaskDescriptor];\r\n }\r\n\r\n public initialize(context: IKrStageTypeUIHandlerContext) {\r\n if (!context.rowModel) {\r\n return;\r\n }\r\n\r\n const grid = context.rowModel.controls.get('CompletionOptions') as GridViewModel;\r\n if (!grid) {\r\n return;\r\n }\r\n grid.rowInvoked.add(this.rowInvoked);\r\n grid.rowEditorClosing.add(this.rowClosing);\r\n }\r\n\r\n public finalize(context: IKrStageTypeUIHandlerContext) {\r\n if (!context.rowModel) {\r\n return;\r\n }\r\n\r\n const grid = context.rowModel.controls.get('CompletionOptions') as GridViewModel;\r\n if (!grid) {\r\n return;\r\n }\r\n grid.rowInvoked.remove(this.rowInvoked);\r\n grid.rowEditorClosing.remove(this.rowClosing);\r\n }\r\n\r\n private rowInvoked = (args: GridRowEventArgs) => {\r\n if (args.action == GridRowAction.Inserted) {\r\n args.row.set('OptionID', Guid.newGuid(), DotNetType.Guid);\r\n }\r\n }\r\n\r\n private rowClosing = async (args: GridRowEventArgs) => {\r\n if (!args.row.tryGet('Caption')) {\r\n await showError('$KrProcess_UniversalTask_CompletionOptionCaptionEmpty');\r\n args.cancel = true;\r\n }\r\n }\r\n\r\n}","import { plainColumnName } from 'tessa/workflow';\r\nimport { KrStageTypeUIHandler, IKrStageTypeUIHandlerContext, StageTypeHandlerDescriptor,\r\n processManagementDescriptor } from 'tessa/workflow/krProcess';\r\nimport { IControlViewModel } from 'tessa/ui/cards';\r\nimport { DefaultFormSimpleViewModel } from 'tessa/ui/cards/forms';\r\nimport { TypedField, Visibility } from 'tessa/platform';\r\nimport { CardFieldChangedEventArgs } from 'tessa/cards';\r\n\r\n// tslint:disable:triple-equals\r\n\r\nexport class ProcessManagementUIHandler extends KrStageTypeUIHandler {\r\n\r\n private _stageControl: IControlViewModel | null;\r\n private _groupControl: IControlViewModel | null;\r\n private _signalControl: IControlViewModel | null;\r\n private _modeId: string = plainColumnName('KrProcessManagementStageSettingsVirtual', 'ModeID');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [processManagementDescriptor];\r\n }\r\n\r\n public initialize(context: IKrStageTypeUIHandlerContext) {\r\n if (!context.rowModel) {\r\n return;\r\n }\r\n\r\n const form = context.rowModel.mainForm;\r\n if (!form || !(form instanceof DefaultFormSimpleViewModel)) {\r\n return;\r\n }\r\n\r\n this._stageControl = form.controls.get('StageRow')!;\r\n this._groupControl = form.controls.get('StageGroup')!;\r\n this._signalControl = form.controls.get('Signal')!;\r\n if (!this._stageControl || !this._groupControl || !this._signalControl) {\r\n return;\r\n }\r\n\r\n this.updateVisibility(context.row.tryGetField(this._modeId));\r\n context.row.fieldChanged.add(this.modeChanged);\r\n }\r\n\r\n public finalize(context: IKrStageTypeUIHandlerContext) {\r\n context.row.fieldChanged.remove(this.modeChanged);\r\n }\r\n\r\n private modeChanged = (args: CardFieldChangedEventArgs) => {\r\n if (args.fieldName !== this._modeId) {\r\n return;\r\n }\r\n\r\n this.updateVisibility(args.fieldTypedValue);\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n private updateVisibility(field: TypedField | null | undefined) {\r\n this._stageControl!.controlVisibility = Visibility.Collapsed;\r\n this._groupControl!.controlVisibility = Visibility.Collapsed;\r\n this._signalControl!.controlVisibility = Visibility.Collapsed;\r\n\r\n if (field && field.$value === 0) { // stageMode\r\n this._stageControl!.controlVisibility = Visibility.Visible;\r\n }\r\n else if (field && field.$value === 1) { // groupMode\r\n this._groupControl!.controlVisibility = Visibility.Visible;\r\n }\r\n else if (field && field.$value === 5) { // signalMode\r\n this._signalControl!.controlVisibility = Visibility.Visible;\r\n }\r\n }\r\n\r\n}","import {\r\n CardRow,\r\n CardFieldChangedEventArgs,\r\n CardRowState,\r\n CardRowStateChangedEventArgs\r\n} from 'tessa/cards';\r\nimport { ICardModel, IControlViewModel } from 'tessa/ui/cards';\r\nimport { plainColumnName, sectionName } from 'tessa/workflow';\r\nimport {\r\n KrStageTypeUIHandler,\r\n IKrStageTypeUIHandlerContext,\r\n StageTypeHandlerDescriptor,\r\n resolutionDescriptor\r\n} from 'tessa/workflow/krProcess';\r\nimport { Visibility, DotNetType, Guid } from 'tessa/platform';\r\nimport { ArrayStorage, CollectionChangedEventArgs } from 'tessa/platform/storage';\r\n\r\nexport class ResolutionStageUIHandler extends KrStageTypeUIHandler {\r\n //#region ctor\r\n\r\n constructor() {\r\n super();\r\n\r\n this._subscribedTo = new Set();\r\n }\r\n\r\n //#endregion\r\n\r\n //#region fields\r\n\r\n private _settings: CardRow | null;\r\n private _performers: ArrayStorage | null;\r\n private _card: ICardModel | null;\r\n private _controller: IControlViewModel | null;\r\n private _massCreation: IControlViewModel | null;\r\n private _majorPerformer: IControlViewModel | null;\r\n private _subscribedTo: Set;\r\n\r\n private readonly _krResolutionSettingsVirtual = 'KrResolutionSettingsVirtual';\r\n private readonly _krPerformersVirtual = 'KrPerformersVirtual';\r\n\r\n private readonly _controllerIdStr = plainColumnName(\r\n this._krResolutionSettingsVirtual,\r\n 'ControllerID'\r\n );\r\n private readonly _controllerNameStr = plainColumnName(\r\n this._krResolutionSettingsVirtual,\r\n 'ControllerName'\r\n );\r\n private readonly _plannedStr = plainColumnName(this._krResolutionSettingsVirtual, 'Planned');\r\n private readonly _durationInDaysStr = plainColumnName(\r\n this._krResolutionSettingsVirtual,\r\n 'DurationInDays'\r\n );\r\n private readonly _withControlStr = plainColumnName(\r\n this._krResolutionSettingsVirtual,\r\n 'WithControl'\r\n );\r\n private readonly _massCreationStr = plainColumnName(\r\n this._krResolutionSettingsVirtual,\r\n 'MassCreation'\r\n );\r\n private readonly _majorPerformerStr = plainColumnName(\r\n this._krResolutionSettingsVirtual,\r\n 'MajorPerformer'\r\n );\r\n private readonly _performersStr = sectionName(this._krPerformersVirtual);\r\n\r\n //#endregion\r\n\r\n //#region handlers\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [resolutionDescriptor];\r\n }\r\n\r\n public initialize(context: IKrStageTypeUIHandlerContext) {\r\n this._settings = context.row;\r\n this._settings.fieldChanged.add(this.onSettingsFieldChanged);\r\n this._performers = context.cardModel.card.sections.get(this._performersStr)!.rows;\r\n this._performers.collectionChanged.add(this.onPerformersChanged);\r\n\r\n for (let performer of this._performers) {\r\n if (this.alivePerformer(performer)) {\r\n this._subscribedTo.add(performer);\r\n performer.stateChanged.add(this.onPerformerStateChanged);\r\n }\r\n }\r\n\r\n this._card = context.rowModel!;\r\n this._controller = this._card.controls.get('Controller')!;\r\n this._massCreation = this._card.controls.get('MassCreation')!;\r\n this._majorPerformer = this._card.controls.get('MajorPerformer')!;\r\n\r\n if (this._settings.get(this._withControlStr)) {\r\n this._controller.captionVisibility = Visibility.Visible;\r\n this._controller.controlVisibility = Visibility.Visible;\r\n }\r\n\r\n // tslint:disable-next-line: triple-equals\r\n if (this._settings.get(this._massCreationStr) != undefined) {\r\n this._majorPerformer.controlVisibility = Visibility.Visible;\r\n }\r\n\r\n if (this._subscribedTo.size >= 2) {\r\n this._massCreation.controlVisibility = Visibility.Visible;\r\n }\r\n }\r\n\r\n public finalize(_context: IKrStageTypeUIHandlerContext) {\r\n this._settings!.fieldChanged.remove(this.onSettingsFieldChanged);\r\n this._settings = null;\r\n this._performers!.collectionChanged.remove(this.onPerformersChanged);\r\n this._performers = null;\r\n\r\n for (let performer of this._subscribedTo) {\r\n performer.stateChanged.remove(this.onPerformerStateChanged);\r\n }\r\n\r\n this._subscribedTo.clear();\r\n this._card = null;\r\n this._controller = null;\r\n this._massCreation = null;\r\n this._majorPerformer = null;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n private onSettingsFieldChanged = (e: CardFieldChangedEventArgs) => {\r\n if (e.fieldName === this._plannedStr) {\r\n if (e.fieldValue) {\r\n this._settings!.set(this._durationInDaysStr, null);\r\n }\r\n } else if (e.fieldName === this._durationInDaysStr) {\r\n if (e.fieldValue) {\r\n this._settings!.set(this._plannedStr, null);\r\n }\r\n } else if (e.fieldName === this._withControlStr) {\r\n let visibility = Visibility.Collapsed;\r\n if (e.fieldValue) {\r\n visibility = Visibility.Visible;\r\n } else {\r\n this._settings!.set(this._controllerIdStr, null);\r\n this._settings!.set(this._controllerNameStr, null);\r\n }\r\n\r\n this._controller!.captionVisibility = visibility;\r\n this._controller!.controlVisibility = visibility;\r\n } else if (e.fieldName === this._massCreationStr) {\r\n let visibility = Visibility.Collapsed;\r\n if (e.fieldValue) {\r\n visibility = Visibility.Visible;\r\n } else {\r\n this._settings!.set(this._majorPerformerStr, false, DotNetType.Boolean);\r\n }\r\n\r\n this._controller!.controlVisibility = visibility;\r\n }\r\n };\r\n\r\n private onPerformerStateChanged = (e: CardRowStateChangedEventArgs) => {\r\n if (e.newState === CardRowState.Deleted) {\r\n this.performersChanged(CardRowState.Deleted, e.row);\r\n }\r\n\r\n if (e.oldState === CardRowState.Deleted) {\r\n this.performersChanged(CardRowState.Inserted, e.row);\r\n }\r\n };\r\n\r\n private onPerformersChanged = (e: CollectionChangedEventArgs) => {\r\n if (e.added.length > 0) {\r\n for (let performer of e.added) {\r\n this.performersChanged(CardRowState.Inserted, performer);\r\n }\r\n }\r\n\r\n if (e.removed.length > 0) {\r\n for (let performer of e.removed) {\r\n this.performersChanged(CardRowState.Deleted, performer);\r\n }\r\n }\r\n };\r\n\r\n private performersChanged = (action: CardRowState, performer: CardRow) => {\r\n if (action === CardRowState.Inserted) {\r\n if (!this._subscribedTo.has(performer)) {\r\n this._subscribedTo.add(performer);\r\n performer.stateChanged.add(this.onPerformerStateChanged);\r\n }\r\n // Действия могут производиться только в текущем диалоге, а значит,\r\n // всякий новодобавленный оказывается в текущем этапе. По этой причине\r\n // требуется наличие лишь одного исполняющего в таблице. Второй уже\r\n // добавлен, но его связь и прочие поля будут указаны позже.\r\n if (this._performers!.filter(x => this.alivePerformer(x)).length >= 1) {\r\n this.enableMassCreation(true);\r\n }\r\n } else if (action === CardRowState.Deleted) {\r\n this._subscribedTo.delete(performer);\r\n performer.stateChanged.remove(this.onPerformerStateChanged);\r\n\r\n if (this._performers!.filter(x => this.alivePerformer(x)).length < 2) {\r\n this.enableMassCreation(false);\r\n }\r\n }\r\n };\r\n\r\n private alivePerformer(performer: CardRow): boolean {\r\n if (performer.state === CardRowState.Deleted) {\r\n return false;\r\n }\r\n\r\n const stageRowId = performer.tryGet('StageRowID');\r\n // tslint:disable-next-line:triple-equals\r\n if (stageRowId == undefined) {\r\n return false;\r\n }\r\n\r\n return Guid.equals(stageRowId, this._settings!.get('RowID'));\r\n }\r\n\r\n private enableMassCreation(value: boolean) {\r\n this._settings!.set(this._massCreationStr, value, DotNetType.Boolean);\r\n // this._massCreation!.controlVisibility = value ? Visibility.Visible : Visibility.Collapsed;\r\n }\r\n\r\n //#endregion\r\n}\r\n","import {\r\n KrStageTypeUIHandler,\r\n IKrStageTypeUIHandlerContext,\r\n StageTypeHandlerDescriptor,\r\n signingDescriptor\r\n} from 'tessa/workflow/krProcess';\r\nimport { plainColumnName } from 'tessa/workflow';\r\nimport { IControlViewModel, IBlockViewModel, IFormViewModel } from 'tessa/ui/cards';\r\nimport { TabControlViewModel } from 'tessa/ui/cards/controls';\r\nimport { CardRow, CardFieldChangedEventArgs } from 'tessa/cards';\r\nimport { Visibility } from 'tessa/platform';\r\n\r\nexport class SigningUIHandler extends KrStageTypeUIHandler {\r\n private settings: CardRow | null = null;\r\n private returnIfNotSignedFlagControl?: IControlViewModel;\r\n private returnAfterSigningFlagControl?: IControlViewModel;\r\n private NotReturnEdit = plainColumnName('KrSigningStageSettingsVirtual', 'NotReturnEdit');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [signingDescriptor];\r\n }\r\n\r\n public initialize(context: IKrStageTypeUIHandlerContext) {\r\n if (!context.rowModel) {\r\n return;\r\n }\r\n\r\n let innerFlagsBlock: IBlockViewModel;\r\n let tabViewModel: IFormViewModel;\r\n let flagsTabs: IControlViewModel;\r\n let flagsBlock: IBlockViewModel;\r\n\r\n if (\r\n (flagsBlock = context.rowModel.blocks.get('SigningStageFlags')!) &&\r\n (flagsTabs = flagsBlock.controls.find(x => x.name === 'FlagsTabs')!) &&\r\n flagsTabs instanceof TabControlViewModel\r\n ) {\r\n if (\r\n (tabViewModel = flagsTabs.tabs.find(x => x.name === 'CommonSettings')!) &&\r\n (innerFlagsBlock = tabViewModel.blocks.find(x => x.name === 'StageFlags')!)\r\n ) {\r\n this.returnIfNotSignedFlagControl = innerFlagsBlock.controls.find(\r\n x => x.name === 'ReturnIfNotSigned'\r\n );\r\n }\r\n\r\n if (\r\n (tabViewModel = flagsTabs.tabs.find(x => x.name === 'AdditionalSettings')!) &&\r\n (innerFlagsBlock = tabViewModel.blocks.find(x => x.name === 'StageFlags')!)\r\n ) {\r\n this.returnAfterSigningFlagControl = innerFlagsBlock.controls.find(\r\n x => x.name === 'ReturnIfNotSigned'\r\n );\r\n }\r\n }\r\n\r\n this.settings = context.row;\r\n this.settings.fieldChanged.add(this.onSettingsFieldChanged);\r\n\r\n this.notReturnEditConfigureFields(this.settings.tryGet(this.NotReturnEdit, false));\r\n }\r\n\r\n public finalize(_context: IKrStageTypeUIHandlerContext) {\r\n if (this.settings) {\r\n this.settings.fieldChanged.remove(this.onSettingsFieldChanged);\r\n this.settings = null;\r\n }\r\n }\r\n\r\n private onSettingsFieldChanged = (e: CardFieldChangedEventArgs) => {\r\n if (e.fieldName === this.NotReturnEdit) {\r\n this.notReturnEditConfigureFields(e.fieldValue);\r\n }\r\n };\r\n\r\n private notReturnEditConfigureFields(isNotReturnEdit: boolean) {\r\n if (!this.returnIfNotSignedFlagControl || !this.returnAfterSigningFlagControl) {\r\n return;\r\n }\r\n\r\n if (isNotReturnEdit) {\r\n this.returnIfNotSignedFlagControl.controlVisibility = Visibility.Collapsed;\r\n this.returnAfterSigningFlagControl.controlVisibility = Visibility.Collapsed;\r\n } else {\r\n this.returnIfNotSignedFlagControl.controlVisibility = Visibility.Visible;\r\n this.returnAfterSigningFlagControl.controlVisibility = Visibility.Visible;\r\n }\r\n }\r\n}\r\n","import { TabContentIndicator } from '../../tabContentIndicator';\r\nimport { KrStageTypeUIHandler, IKrStageTypeUIHandlerContext } from 'tessa/workflow/krProcess';\r\nimport { TabControlViewModel } from 'tessa/ui/cards/controls';\r\nimport { MetadataStorage } from 'tessa';\r\n\r\n// tslint:disable:triple-equals\r\n\r\nexport class TabCaptionUIHandler extends KrStageTypeUIHandler {\r\n\r\n private _indicator: TabContentIndicator;\r\n private _dispose: Function | null = null;\r\n\r\n public initialize(context: IKrStageTypeUIHandlerContext) {\r\n const control = context.rowModel!.controls.get('CSharpSourceTable');\r\n if (control && control instanceof TabControlViewModel) {\r\n const sectionMeta = MetadataStorage.instance.cardMetadata.getSectionByName('KrStagesVirtual');\r\n if (!sectionMeta) {\r\n return;\r\n }\r\n\r\n const fieldIds: [string, string][] = sectionMeta.columns.map(x => [x.id || '', x.name || '']);\r\n const storage = context.row;\r\n this._indicator = new TabContentIndicator(control, storage.getStorage(), fieldIds, true);\r\n this._indicator.update();\r\n this._dispose = context.row.fieldChanged.addWithDispose(this._indicator.fieldChangedAction);\r\n }\r\n }\r\n\r\n public finalize() {\r\n if (this._dispose) {\r\n this._dispose();\r\n this._dispose = null;\r\n }\r\n }\r\n\r\n}","import { KrStageTypeUIHandler, IKrStageTypeUIHandlerContext } from 'tessa/workflow/krProcess';\r\n\r\nexport class TestStageTypeUIHandler extends KrStageTypeUIHandler {\r\n\r\n public initialize(context: IKrStageTypeUIHandlerContext) {\r\n console.log(context);\r\n }\r\n\r\n}","import { KrStageTypeUIHandler, IKrStageTypeUIHandlerContext, StageTypeHandlerDescriptor, typedTaskDescriptor } from 'tessa/workflow/krProcess';\r\nimport { plainColumnName } from 'tessa/workflow';\r\nimport { ValidationResult, ValidationResultType } from 'tessa/platform/validation';\r\n\r\nexport class TypedTaskUIHandler extends KrStageTypeUIHandler {\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [typedTaskDescriptor];\r\n }\r\n\r\n public validate(context: IKrStageTypeUIHandlerContext) {\r\n if (context.row.tryGet(plainColumnName('KrTypedTaskSettingsVirtual', 'TaskTypeID')) == null) {\r\n context.validationResult.add(ValidationResult.fromText('$KrStages_TypedTask_TaskType', ValidationResultType.Error));\r\n }\r\n }\r\n\r\n}","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { KrUIExtension } from './krUIExtension';\r\nimport { KrStageUIExtension } from './krStageUIExtension';\r\nimport { KrStageTemplateUIExtension } from './krStageTemplateUIExtension';\r\nimport { KrStageSourceUIExtension } from './krStageSourceUIExtension';\r\nimport { KrRecalcStagesUIExtension } from './krRecalcStagesUIExtension';\r\nimport { KrHideCardTypeSettingsUIExtension } from './krHideCardTypeSettingsUIExtension';\r\nimport { KrHideApprovalTabOrDocStateBlockUIExtension } from './krHideApprovalTabOrDocStateBlockUIExtension';\r\nimport { KrHideApprovalStagePermissionsDisclaimer } from './krHideApprovalStagePermissionsDisclaimer';\r\nimport { KrDocumentWorkspaceInfoUIExtension } from './krDocumentWorkspaceInfoUIExtension';\r\nimport { KrCommentRequestUIExtension } from './krCommentRequestUIExtension';\r\nimport { KrTilesUIExtension } from './krTilesUIExtension';\r\nimport { KrAdditionalApprovalCardUIExtension } from './krAdditionalApprovalCardUIExtension';\r\nimport { KrTemplateUIExtension } from './krTemplateUIExtension';\r\nimport { KrSecondaryProcessUIExtension } from './krSecondaryProcessUIExtension';\r\nimport { KrEditModeToolbarUIExtension } from './krEditModeToolbarUIExtension';\r\n\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrStageUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrStageTemplateUIExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrStageSourceUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrRecalcStagesUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrHideCardTypeSettingsUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrHideApprovalTabOrDocStateBlockUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrHideApprovalStagePermissionsDisclaimer,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrDocumentWorkspaceInfoUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrCommentRequestUIExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrTilesUIExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrAdditionalApprovalCardUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrTemplateUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrSecondaryProcessUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrEditModeToolbarUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\n\r\n// StageHandlers\r\nimport {\r\n /*TestStageTypeUIHandler,*/ ResolutionStageUIHandler,\r\n CreateCardUIHandler,\r\n ProcessManagementUIHandler,\r\n KrUniversalTaskStageTypeUIHandler,\r\n AddFromTemplateUIHandler,\r\n DialogUIHandler,\r\n TabCaptionUIHandler,\r\n ApprovalUIHandler,\r\n TypedTaskUIHandler,\r\n SigningUIHandler\r\n} from './stageHandlers';\r\nExtensionContainer.instance.registerExtension({\r\n extension: AddFromTemplateUIHandler,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: ApprovalUIHandler,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: CreateCardUIHandler,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: DialogUIHandler,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrUniversalTaskStageTypeUIHandler,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: ProcessManagementUIHandler,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: ResolutionStageUIHandler,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: TabCaptionUIHandler,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\n// ExtensionContainer.instance.registerExtension({extension: TestStageTypeUIHandler, stage: ExtensionStage.AfterPlatform});\r\nExtensionContainer.instance.registerExtension({\r\n extension: TypedTaskUIHandler,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: SigningUIHandler,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\n","import { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { ButtonViewModel } from 'tessa/ui/cards/controls';\r\nimport { hasFlag, createTypedField, DotNetType } from 'tessa/platform';\r\nimport { CardPermissionFlags } from 'tessa/cards';\r\nimport { CardRequest, CardService } from 'tessa/cards/service';\r\nimport { showNotEmpty, UIContext, showMessage } from 'tessa/ui';\r\nimport { OperationService, OperationTypes } from 'tessa/platform/operations';\r\n\r\nexport class CalendarUIExtension extends CardUIExtension {\r\n public initialized(context: ICardUIExtensionContext) {\r\n CalendarUIExtension.attachCommandToButton(\r\n context,\r\n 'ValidateCalendar',\r\n CalendarUIExtension.validateCalendarButtonAction\r\n );\r\n CalendarUIExtension.attachCommandToButton(\r\n context,\r\n 'RebuildCalendar',\r\n CalendarUIExtension.rebuildCalendarButtonAction\r\n );\r\n }\r\n\r\n private static attachCommandToButton(\r\n context: ICardUIExtensionContext,\r\n buttonAlias: string,\r\n action: Function\r\n ) {\r\n const control = context.model.controls.get(buttonAlias);\r\n if (!control) {\r\n return;\r\n }\r\n\r\n const button = control as ButtonViewModel;\r\n if (\r\n !hasFlag(\r\n context.model.card.permissions.resolver.getCardPermissions(),\r\n CardPermissionFlags.AllowModify\r\n )\r\n ) {\r\n button.isReadOnly = true;\r\n return;\r\n }\r\n\r\n // tslint:disable-next-line:no-any\r\n button.onClick = action as any;\r\n }\r\n\r\n private static async validateCalendarButtonAction() {\r\n const request = new CardRequest();\r\n request.requestType = '3f75d47a-38fd-45f3-8d4a-39b0836f074d';\r\n\r\n const response = await CardService.instance.request(request);\r\n await showNotEmpty(response.validationResult.build(), '$UI_BusinessCalendar_ValidatedTitle');\r\n }\r\n\r\n private static async rebuildCalendarButtonAction() {\r\n const context = UIContext.current;\r\n const editor = context.cardEditor;\r\n\r\n if (editor && !editor.operationInProgress) {\r\n await editor.setOperationInProgress(async () => {\r\n const operationId = await OperationService.instance.create({\r\n typeId: OperationTypes.CalendarRebuild\r\n });\r\n\r\n const result = await editor.saveCard(context, {\r\n '.rebuildOperationGuid': createTypedField(operationId, DotNetType.Guid)\r\n });\r\n\r\n if (!result) {\r\n return;\r\n }\r\n\r\n let isActive = true;\r\n while (isActive) {\r\n await new Promise(resolve => setTimeout(resolve, 1000));\r\n isActive = await OperationService.instance.isAlive(operationId);\r\n }\r\n });\r\n\r\n await showMessage('$UI_BusinessCalendar_CalendarIsRebuiltNotification');\r\n }\r\n }\r\n}\r\n","import { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\n\r\nexport class OutgoingPartnerUIExtension extends CardUIExtension {\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n if (context.card.typeId !== 'c59b76d9-c0db-01cd-a3fb-b339740f0620') { // OutgoingTypeID\r\n return;\r\n }\r\n\r\n const dciSection = context.card.sections.tryGet('DocumentCommonInfo');\r\n if (!dciSection) {\r\n return;\r\n }\r\n\r\n dciSection.fields.fieldChanged.add(e => {\r\n if (e.fieldName === 'PartnerID') {\r\n e.storage.set('ReceiverName', null);\r\n e.storage.set('ReceiverRowID', null);\r\n }\r\n });\r\n }\r\n\r\n}","import { CardUIExtension, ICardUIExtensionContext, AdvancedCardDialogManager } from 'tessa/ui/cards';\r\nimport { FilePreviewViewModel, AutoCompleteEntryViewModel } from 'tessa/ui/cards/controls';\r\nimport { showLoadingOverlay } from 'tessa/ui';\r\n\r\nexport class CarUIExtension extends CardUIExtension {\r\n private _disposes: Function[] = [];\r\n public initialized(context: ICardUIExtensionContext) {\r\n if (context.card.typeId !== 'd0006e40-a342-4797-8d77-6501c4b7c4ac') { // CardTypeID\r\n return;\r\n }\r\n\r\n const cardModel = context.model;\r\n\r\n const driverControl = context.model.controls.get('DriverName2') as AutoCompleteEntryViewModel;\r\n if (driverControl) {\r\n driverControl.openRefAction = async () => {\r\n if (!driverControl.item\r\n // tslint:disable-next-line:triple-equals\r\n || driverControl.item.reference == undefined\r\n ) {\r\n return;\r\n }\r\n\r\n const info = {};\r\n info['.autocomplete'] = driverControl.getRefInfo();\r\n\r\n await cardModel.executeInContext(async context => {\r\n await showLoadingOverlay(async (splashResolve) => {\r\n await AdvancedCardDialogManager.instance.openCard({\r\n cardId: driverControl.item!.reference,\r\n context,\r\n info,\r\n splashResolve\r\n });\r\n });\r\n });\r\n };\r\n }\r\n\r\n const preview1 = context.model.controls.get('Preview1') as FilePreviewViewModel;\r\n const preview2 = context.model.controls.get('Preview2') as FilePreviewViewModel;\r\n if (!preview1 || !preview2) {\r\n return;\r\n }\r\n\r\n this._disposes.push(\r\n preview1.fileControlManager.pageChanged.addWithDispose((args: { page: number }) => {\r\n preview2.fileControlManager.setPageNumber(args.page);\r\n })!\r\n );\r\n\r\n // Использование апи выставления поворотов\r\n // this._disposes.push(\r\n // preview1.fileControlManager.rotateChanged.addWithDispose(\r\n // (args: { fileVersionId: string; page: number; angle: number }) => {\r\n // const version = preview2.fileControlManager.fileVersion;\r\n // if (!version) {\r\n // return;\r\n // }\r\n // preview2.fileControlManager.setRotateAngle(\r\n // version.id,\r\n // preview2.fileControlManager.pageNumber,\r\n // args.angle\r\n // );\r\n // }\r\n // )!\r\n // );\r\n\r\n // Использование апи масштабирования\r\n // this._disposes.push(\r\n // preview1.fileControlManager.scaleChanged.addWithDispose(\r\n // (args: { fileVersionId: string; scale: ScaleOption; customScaleValue: number }) => {\r\n // preview2.fileControlManager.setScale(args.scale, args.customScaleValue);\r\n // }\r\n // )!\r\n // );\r\n }\r\n\r\n public finalized() {\r\n for (let func of this._disposes) {\r\n if (func) {\r\n func();\r\n }\r\n }\r\n this._disposes.length = 0;\r\n }\r\n}\r\n","import { CardUIExtension, ICardUIExtensionContext, CardEditorOperationType } from 'tessa/ui/cards';\r\nimport { tryGetFromInfo } from 'tessa/ui';\r\nimport { DotNetType, createTypedField } from 'tessa/platform';\r\n\r\n/**\r\n * Расширение на обновление виртуальной карточки состояния документа со стороны клиента.\r\n */\r\nexport class KrDocStateUIExtension extends CardUIExtension {\r\n\r\n public shouldExecute(context: ICardUIExtensionContext) {\r\n return context.card.typeId === 'e83a230a-f5fc-445e-9b44-7d0140ee69f6'; // KrDocStateTypeID\r\n }\r\n\r\n public reopening(context: ICardUIExtensionContext) {\r\n const editor = context.uiContext.cardEditor;\r\n if (editor == null\r\n || context.model == null\r\n || context.getRequest == null\r\n ) {\r\n return;\r\n }\r\n\r\n let stateId: number | null = null;\r\n if (editor.currentOperationType === CardEditorOperationType.SaveAndRefresh) {\r\n // идентификатор этой карточки можно менять, поэтому актуальный идентификатор при рефреше после сохранения будет в той карточке,\r\n // которая сохранялась (и была успешно сохранена, раз запущен рефреш)\r\n stateId = context.model.card.sections.get('KrDocStateVirtual')!.fields.get('StateID');\r\n }\r\n\r\n if (stateId == null) {\r\n // либо это обновление без сохранения, либо по какой-то причине поле было пустым\r\n stateId = tryGetFromInfo(context.model.card.tryGetInfo() || {}, 'StateID');\r\n }\r\n\r\n if (stateId == null) {\r\n return;\r\n }\r\n\r\n context.getRequest.info['StateID'] = createTypedField(stateId, DotNetType.Int32);\r\n }\r\n\r\n}","import { CardUIExtension, ICardUIExtensionContext, CardToolbarAction,\r\n CardSavingRequest, CardSavingMode } from 'tessa/ui/cards';\r\nimport { IUIContext, UIContext } from 'tessa/ui';\r\n\r\nexport class CreateAndSelectToolbarUIExtension extends CardUIExtension {\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n const toolbar = context.toolbar;\r\n // Интересует только тот случай, когда родительским контекстом является представление в режиме выбора с необходимым флагом\r\n const uiContext = CreateAndSelectToolbarUIExtension.tryGetParentSelectionViewContext(UIContext.current);\r\n if (!uiContext\r\n || !uiContext.info\r\n ) {\r\n return;\r\n }\r\n\r\n if (!('CreateAndSelectID' in uiContext.info)) {\r\n return;\r\n }\r\n\r\n if (!toolbar.items.find(x => x.name === 'SaveAndSelect')) {\r\n toolbar.removeItemIfExists('SaveAndCloseCard');\r\n toolbar.removeItemIfExists('SaveCloseAndCreateCard');\r\n\r\n const saveAndCloseItem = new CardToolbarAction({\r\n name: 'SaveAndSelect',\r\n caption: '$KrTiles_SaveAndSelect',\r\n icon: 'ta icon-Int426',\r\n order: -1,\r\n toolTip: '$KrTiles_SaveAndSelect_Tooltip',\r\n command: this.saveCardAndSelectCommand\r\n });\r\n\r\n toolbar.addItemIfNotExists(\r\n saveAndCloseItem,\r\n {\r\n name: 'Ctrl+Shift+S', key: 'KeyS', modifiers: {ctrl: true, shift: true}\r\n }\r\n );\r\n }\r\n }\r\n\r\n private static tryGetParentSelectionViewContext(uiContext: IUIContext) {\r\n let curr: IUIContext | null = uiContext;\r\n while (curr && !curr.viewContext) {\r\n curr = curr.parent;\r\n }\r\n return curr;\r\n }\r\n\r\n private saveCardAndSelectCommand = async () => {\r\n const context = UIContext.current;\r\n const editor = context.cardEditor;\r\n\r\n if (!editor || editor.operationInProgress) {\r\n return;\r\n }\r\n\r\n const success = await editor.saveCard(context, undefined, new CardSavingRequest(CardSavingMode.KeepPreviousCard));\r\n if (success) {\r\n const uiContext = CreateAndSelectToolbarUIExtension.tryGetParentSelectionViewContext(context);\r\n if (uiContext) {\r\n uiContext.info['CreateAndSelectID'] = editor.cardModel!.card.id;\r\n await editor.close(true);\r\n }\r\n }\r\n }\r\n\r\n}","import { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { ConditionsUIContext } from 'tessa/ui/conditions';\r\nimport { CardTableType, CardSectionType, CardRowStateChangedEventArgs, systemKeyPrefix } from 'tessa/cards';\r\nimport { DotNetType, createTypedField } from 'tessa/platform';\r\nimport { ButtonViewModel } from 'tessa/ui/cards/controls';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { UIContext } from 'tessa/ui';\r\n\r\nexport class KrVirtualFilesUIExtension extends CardUIExtension {\r\n\r\n public shouldExecute(context: ICardUIExtensionContext) {\r\n return context.card.typeId === '81250a95-5c1e-488c-a423-106e7f982c6b'; // KrVirtualFileTypeID\r\n }\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n const cardModel = context.model;\r\n const card = cardModel.card;\r\n\r\n const conditionContext = new ConditionsUIContext();\r\n conditionContext.initialize(context.model);\r\n\r\n const virtualSection = card.sections.getOrAdd('KrVirtualFileVersions');\r\n virtualSection.type = CardSectionType.Table;\r\n virtualSection.tableType = CardTableType.Collection;\r\n\r\n virtualSection.rows.collectionChanged.add(e => {\r\n if (e.added.length > 0) {\r\n for (let item of e.added) {\r\n item.stateChanged.add(this.rowStateChanged);\r\n }\r\n }\r\n });\r\n\r\n const button = cardModel.controls.get('CompileButton') as ButtonViewModel;\r\n if (button) {\r\n button.onClick = this.compile;\r\n }\r\n }\r\n\r\n private rowStateChanged = (e: CardRowStateChangedEventArgs) => {\r\n e.row.set('FileVersionID', e.row.rowId, DotNetType.Guid);\r\n e.row.stateChanged.remove(this.rowStateChanged);\r\n }\r\n\r\n private compile = async () => {\r\n const storeInfo: IStorage = {};\r\n storeInfo[systemKeyPrefix + 'Compile'] = createTypedField(true, DotNetType.Boolean);\r\n\r\n await UIContext.current.cardEditor!.saveCard(UIContext.current, storeInfo);\r\n }\r\n\r\n}","import { CardUIExtension, ICardModel, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { ConditionsUIContext } from 'tessa/ui/conditions';\r\nimport {\r\n AccessSettings,\r\n getAllDescriptors,\r\n KrPermissionFlagDescriptor,\r\n MandatoryValidationType\r\n} from 'tessa/workflow';\r\nimport { Card, CardFieldChangedEventArgs, CardRow, CardRowState, CardSection } from 'tessa/cards';\r\nimport { DotNetType, Visibility } from 'tessa/platform';\r\nimport { GridViewModel } from 'tessa/ui/cards/controls';\r\nimport { SchemeTableContentType } from 'tessa/scheme';\r\nimport { ValidationResult, ValidationResultType } from 'tessa/platform/validation';\r\nimport { showConfirm } from 'tessa/ui';\r\nimport { LocalizationManager } from 'tessa/localization';\r\n\r\nexport class KrPermissionsUIExtension extends CardUIExtension {\r\n private static _extendedSections: string[] = [\r\n 'KrPermissionExtendedCardRuleFields',\r\n 'KrPermissionExtendedCardRules',\r\n 'KrPermissionExtendedTaskRuleFields',\r\n 'KrPermissionExtendedTaskRuleTypes',\r\n 'KrPermissionExtendedTaskRules',\r\n 'KrPermissionExtendedMandatoryRuleFields',\r\n 'KrPermissionExtendedMandatoryRuleTypes',\r\n 'KrPermissionExtendedMandatoryRuleOptions',\r\n 'KrPermissionExtendedMandatoryRules',\r\n 'KrPermissionExtendedVisibilityRules',\r\n 'KrPermissionExtendedFileRules',\r\n 'KrPermissionExtendedFileRuleCategories'\r\n ];\r\n\r\n private static _extendedControls: string[] = [\r\n 'Priority',\r\n 'CardExtendedSettings',\r\n 'TasksExtendedSettings',\r\n 'MandatoryExtendedSettings',\r\n 'VisibilityExtendedSettings',\r\n 'FileExtendedPermissionsSettings'\r\n ];\r\n\r\n public shouldExecute(context: ICardUIExtensionContext) {\r\n return context.card.typeId === 'fa9dbdac-8708-41df-bd72-900f69655dfa'; // KrPermissionsTypeID\r\n }\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n this.initializeConditions(context);\r\n this.initializeFlags(context);\r\n this.initializeExtendedPermissions(context);\r\n }\r\n\r\n private initializeConditions(context: ICardUIExtensionContext) {\r\n const conditionContext = new ConditionsUIContext();\r\n conditionContext.initialize(context.model);\r\n }\r\n\r\n private initializeFlags(context: ICardUIExtensionContext) {\r\n const model = context.model;\r\n const permissionsSection = context.card.sections.getOrAdd('KrPermissions');\r\n\r\n const flagsByName: Map = new Map();\r\n for (let p of getAllDescriptors().includedPermissions) {\r\n flagsByName.set(p.sqlName || '', p);\r\n }\r\n\r\n for (let flag of getAllDescriptors().includedPermissions) {\r\n if (flag.isVirtual || flag.includedPermissions.length === 0) {\r\n continue;\r\n }\r\n\r\n const value = permissionsSection.fields.tryGet(flag.sqlName || '');\r\n // tslint:disable-next-line:triple-equals\r\n if (value && typeof value === 'boolean') {\r\n for (let includedFlag of flag.includedPermissions) {\r\n this.tryUpdateFlag(model, permissionsSection, includedFlag, true);\r\n }\r\n }\r\n }\r\n\r\n permissionsSection.fields.fieldChanged.add(e => {\r\n const flag = flagsByName.get(e.fieldName);\r\n if (flag) {\r\n for (let includedFlag of flag.includedPermissions) {\r\n this.tryUpdateFlag(model, permissionsSection, includedFlag, !!e.fieldValue);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private initializeExtendedPermissions(context: ICardUIExtensionContext) {\r\n const model = context.model;\r\n const permissionsSection = context.card.sections.getOrAdd('KrPermissions');\r\n let isExtendedOnUpdating = false;\r\n\r\n permissionsSection.fields.fieldChanged.add(async e => {\r\n if (e.fieldName === 'IsExtended') {\r\n if (isExtendedOnUpdating) {\r\n return;\r\n }\r\n\r\n isExtendedOnUpdating = true;\r\n try {\r\n if (e.fieldValue === true) {\r\n this.enableExtendedSettings(model);\r\n } else if (await this.clearExtendedSettings(model)) {\r\n this.disableExtendedSettings(model);\r\n } else {\r\n permissionsSection.fields.set('IsExtended', true, DotNetType.Boolean);\r\n }\r\n } finally {\r\n isExtendedOnUpdating = false;\r\n }\r\n }\r\n });\r\n\r\n if (!permissionsSection.fields.tryGet('IsExtended')) {\r\n this.disableExtendedSettings(model);\r\n }\r\n this.extendControls(model);\r\n }\r\n\r\n private extendControls(model: ICardModel) {\r\n const card = model.card;\r\n const cardTable = model.controls.get(\r\n KrPermissionsUIExtension._extendedControls[1]\r\n ) as GridViewModel;\r\n if (cardTable) {\r\n this.extendPermissionGrid(\r\n cardTable,\r\n card.sections.get('KrPermissionExtendedCardRules')!,\r\n card.sections.get('KrPermissionExtendedCardRuleFields')!\r\n );\r\n }\r\n\r\n const tasksTable = model.controls.get(\r\n KrPermissionsUIExtension._extendedControls[2]\r\n ) as GridViewModel;\r\n if (tasksTable) {\r\n this.extendPermissionGrid(\r\n tasksTable,\r\n card.sections.get('KrPermissionExtendedTaskRules')!,\r\n card.sections.get('KrPermissionExtendedTaskRuleFields')!\r\n );\r\n }\r\n\r\n const mandatoryTable = model.controls.get(\r\n KrPermissionsUIExtension._extendedControls[3]\r\n ) as GridViewModel;\r\n if (mandatoryTable) {\r\n this.extendMandatoryGrid(mandatoryTable, card);\r\n }\r\n }\r\n\r\n private extendPermissionGrid(\r\n grid: GridViewModel,\r\n _sectionsSection: CardSection,\r\n fieldsSection: CardSection\r\n ) {\r\n let openedRowModel: ICardModel | null = null;\r\n const sectionRowChanged = (e: CardFieldChangedEventArgs) => {\r\n if (!openedRowModel) {\r\n return;\r\n }\r\n\r\n const row = e.storage as CardRow;\r\n if (e.fieldName === 'SectionID') {\r\n this.clearSection(row.rowId, fieldsSection);\r\n } else if (e.fieldName === 'SectionTypeID' && !!e.fieldValue) {\r\n const sectionType = e.fieldValue as SchemeTableContentType;\r\n const accessSetting = row.tryGet('AccessSettingID');\r\n if (\r\n accessSetting != null &&\r\n sectionType >= SchemeTableContentType.Collections &&\r\n (accessSetting === AccessSettings.DisallowRowAdding ||\r\n accessSetting === AccessSettings.DisallowRowDeleting)\r\n ) {\r\n row.set('AccessSettingID', null);\r\n row.set('AccessSettingName', null);\r\n }\r\n } else if (e.fieldName === 'AccessSettingID') {\r\n const accessSetting = e.fieldValue;\r\n if (\r\n accessSetting === AccessSettings.DisallowRowAdding ||\r\n accessSetting === AccessSettings.DisallowRowDeleting\r\n ) {\r\n this.clearSection(row.rowId, fieldsSection);\r\n const control = openedRowModel.controls.get('Fields');\r\n if (control) {\r\n control.controlVisibility = Visibility.Collapsed;\r\n }\r\n } else {\r\n const control = openedRowModel.controls.get('Fields');\r\n if (control) {\r\n control.controlVisibility = Visibility.Visible;\r\n }\r\n }\r\n\r\n if (e.fieldValue === AccessSettings.MaskData) {\r\n const control = openedRowModel.controls.get('Mask');\r\n if (control) {\r\n control.controlVisibility = Visibility.Visible;\r\n }\r\n } else {\r\n const control = openedRowModel.controls.get('Mask');\r\n if (control) {\r\n control.controlVisibility = Visibility.Collapsed;\r\n }\r\n }\r\n }\r\n };\r\n\r\n grid.rowInitializing.add(e => {\r\n e.row.fieldChanged.add(sectionRowChanged);\r\n openedRowModel = e.rowModel;\r\n const accessSetting = e.row.tryGet('AccessSettingID');\r\n if (\r\n accessSetting != null &&\r\n (accessSetting === AccessSettings.DisallowRowAdding ||\r\n accessSetting === AccessSettings.DisallowRowDeleting)\r\n ) {\r\n const control = openedRowModel!.controls.get('Fields');\r\n if (control) {\r\n control.controlVisibility = Visibility.Collapsed;\r\n }\r\n }\r\n\r\n if (accessSetting !== AccessSettings.MaskData) {\r\n const control = openedRowModel!.controls.get('Mask');\r\n if (control) {\r\n control.controlVisibility = Visibility.Collapsed;\r\n }\r\n }\r\n });\r\n\r\n grid.rowEditorClosed.add(e => {\r\n e.row.fieldChanged.remove(sectionRowChanged);\r\n openedRowModel = null;\r\n });\r\n }\r\n\r\n private extendMandatoryGrid(grid: GridViewModel, card: Card) {\r\n let openedRowModel: ICardModel | null = null;\r\n const fieldsSection = card.sections.get('KrPermissionExtendedMandatoryRuleFields')!;\r\n const typesSection = card.sections.get('KrPermissionExtendedMandatoryRuleTypes')!;\r\n const optionsSection = card.sections.get('KrPermissionExtendedMandatoryRuleOptions')!;\r\n\r\n const sectionRowChanged = (e: CardFieldChangedEventArgs) => {\r\n if (!openedRowModel) {\r\n return;\r\n }\r\n\r\n const row = e.storage as CardRow;\r\n const fieldsControl = openedRowModel.controls.get('Fields');\r\n if (e.fieldName === 'SectionTypeID' && fieldsControl) {\r\n if (e.fieldValue === SchemeTableContentType.Entries) {\r\n fieldsControl.isRequired = true;\r\n fieldsControl.requiredText = LocalizationManager.instance.localize(\r\n '$CardTypes_Validators_Fields'\r\n );\r\n } else {\r\n fieldsControl.isRequired = false;\r\n fieldsControl.requiredText = '';\r\n }\r\n } else if (e.fieldName === 'ValidationTypeID') {\r\n if (e.fieldValue !== MandatoryValidationType.OnTaskCompletion) {\r\n this.clearSection(row.rowId, typesSection);\r\n this.clearSection(row.rowId, optionsSection);\r\n const typesControl = openedRowModel.controls.get('TaskTypes');\r\n const optionsControl = openedRowModel.controls.get('CompletionOptions');\r\n if (typesControl && optionsControl) {\r\n typesControl.controlVisibility = Visibility.Collapsed;\r\n optionsControl.controlVisibility = Visibility.Collapsed;\r\n }\r\n } else {\r\n const typesControl = openedRowModel.controls.get('TaskTypes');\r\n const optionsControl = openedRowModel.controls.get('CompletionOptions');\r\n if (typesControl && optionsControl) {\r\n typesControl.controlVisibility = Visibility.Visible;\r\n optionsControl.controlVisibility = Visibility.Visible;\r\n }\r\n }\r\n }\r\n };\r\n\r\n grid.rowInitializing.add(e => {\r\n e.row.fieldChanged.add(sectionRowChanged);\r\n openedRowModel = e.rowModel;\r\n const validationType = e.row.tryGet('ValidationTypeID');\r\n const typesControl = openedRowModel!.controls.get('TaskTypes');\r\n const optionsControl = openedRowModel!.controls.get('CompletionOptions');\r\n if (\r\n validationType !== MandatoryValidationType.OnTaskCompletion &&\r\n typesControl &&\r\n optionsControl\r\n ) {\r\n typesControl.controlVisibility = Visibility.Collapsed;\r\n optionsControl.controlVisibility = Visibility.Collapsed;\r\n }\r\n\r\n const sectionType = e.row.tryGet('SectionTypeID');\r\n const fieldsControl = openedRowModel!.controls.get('Fields');\r\n if (sectionType === SchemeTableContentType.Entries && fieldsControl) {\r\n fieldsControl.isRequired = true;\r\n fieldsControl.requiredText = LocalizationManager.instance.localize(\r\n '$CardTypes_Validators_Fields'\r\n );\r\n }\r\n });\r\n\r\n grid.rowValidating.add(e => {\r\n const row = e.row;\r\n const validationType = row.tryGet('ValidationTypeID');\r\n if (\r\n validationType === MandatoryValidationType.OnTaskCompletion &&\r\n !typesSection.rows.some(\r\n x => x.state !== CardRowState.Deleted && x.get('RuleRowID') === row.rowId\r\n )\r\n ) {\r\n e.validationResult.add(\r\n ValidationResult.fromText('$CardTypes_Validators_TaskTypes', ValidationResultType.Error)\r\n );\r\n }\r\n\r\n const sectionType = row.tryGet('SectionTypeID');\r\n if (\r\n sectionType === SchemeTableContentType.Entries &&\r\n !fieldsSection.rows.some(\r\n x => x.state !== CardRowState.Deleted && x.get('RuleRowID') === row.rowId\r\n )\r\n ) {\r\n e.validationResult.add(\r\n ValidationResult.fromText('$CardTypes_Validators_Fields', ValidationResultType.Error)\r\n );\r\n }\r\n });\r\n\r\n grid.rowEditorClosed.add(e => {\r\n e.row.fieldChanged.remove(sectionRowChanged);\r\n openedRowModel = null;\r\n });\r\n }\r\n\r\n private enableExtendedSettings(model: ICardModel) {\r\n for (let controlName of KrPermissionsUIExtension._extendedControls) {\r\n const control = model.controls.get(controlName);\r\n if (control) {\r\n control.controlVisibility = Visibility.Visible;\r\n }\r\n }\r\n }\r\n\r\n private disableExtendedSettings(model: ICardModel) {\r\n for (let controlName of KrPermissionsUIExtension._extendedControls) {\r\n const control = model.controls.get(controlName);\r\n if (control) {\r\n control.controlVisibility = Visibility.Collapsed;\r\n }\r\n }\r\n }\r\n\r\n private async clearExtendedSettings(model: ICardModel): Promise {\r\n const hasRow = (section: CardSection) => {\r\n return section.rows.some(x => x.state !== CardRowState.Deleted);\r\n };\r\n\r\n const card = model.card;\r\n if (\r\n KrPermissionsUIExtension._extendedSections.some(x => hasRow(card.sections.get(x)!)) ||\r\n (await showConfirm('$KrPermissions_DisableExtendedSettingsConfirm'))\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private clearSection(parentRowId: guid, section: CardSection) {\r\n for (let i = section.rows.length - 1; i >= 0; i--) {\r\n const fieldRow = section.rows[i];\r\n if (fieldRow.get('RuleRowID') === parentRowId) {\r\n if (fieldRow.state === CardRowState.Inserted) {\r\n section.rows.splice(i, 1);\r\n } else {\r\n fieldRow.state = CardRowState.Deleted;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private tryUpdateFlag(\r\n model: ICardModel,\r\n section: CardSection,\r\n flag: KrPermissionFlagDescriptor,\r\n isReadonly: boolean\r\n ) {\r\n const control = model.controls.get(flag.name);\r\n if (control) {\r\n control.isReadOnly = isReadonly;\r\n section.fields.set(flag.sqlName || '', isReadonly, DotNetType.Boolean);\r\n }\r\n }\r\n}\r\n","import {\r\n CardUIExtension,\r\n IBlockViewModel,\r\n ICardModel,\r\n ICardUIExtensionContext,\r\n IControlViewModel,\r\n IFormViewModel\r\n} from 'tessa/ui/cards';\r\nimport {\r\n ControlType,\r\n KrPermissionSectionSettings,\r\n KrPermissionVisibilitySettings,\r\n KrToken\r\n} from 'tessa/workflow';\r\nimport { GridRowEventArgs, GridViewModel } from 'tessa/ui/cards/controls';\r\nimport { isTopLevelForm, showNotEmpty } from 'tessa/ui';\r\nimport { ValidationResult } from 'tessa/platform/validation';\r\nimport { TaskViewModel } from 'tessa/ui/cards/tasks';\r\nimport { unseal, Visibility } from 'tessa/platform';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { DefaultFormTabWithTasksViewModel } from 'tessa/ui/cards/forms';\r\nimport { CardRowState } from 'tessa/cards';\r\n\r\nclass VisibilitySetting {\r\n public text: string;\r\n public isHidden: boolean;\r\n public isPattern: boolean;\r\n\r\n constructor(text: string, isHidden: boolean, isPattern: boolean) {\r\n this.text = text;\r\n this.isHidden = isHidden;\r\n this.isPattern = isPattern;\r\n }\r\n}\r\n\r\nclass VisibilitySettings {\r\n public blockSettings: Array = [];\r\n public controlSettings: Array = [];\r\n public tabSettings: Array = [];\r\n\r\n public fill(visibilitySettings: KrPermissionVisibilitySettings[]) {\r\n for (let visibilitySetting of visibilitySettings) {\r\n let patternList: Array;\r\n switch (visibilitySetting.controlType) {\r\n case ControlType.Tab:\r\n patternList = this.tabSettings;\r\n break;\r\n\r\n case ControlType.Block:\r\n patternList = this.blockSettings;\r\n break;\r\n\r\n case ControlType.Control:\r\n patternList = this.controlSettings;\r\n break;\r\n\r\n default:\r\n continue;\r\n }\r\n this.fillSettings(patternList, visibilitySetting);\r\n }\r\n }\r\n\r\n private fillSettings(\r\n patternList: Array,\r\n visibilitySetting: KrPermissionVisibilitySettings\r\n ) {\r\n const alias: string = visibilitySetting.alias;\r\n const length: number = alias.length;\r\n const wildStart: boolean = alias[0] === '*';\r\n const wildEnd: boolean = alias[length - 1] === '*';\r\n if (wildStart || wildEnd) {\r\n const startIndex = wildStart ? 1 : 0;\r\n const endIndex = Math.max(0, length - (wildStart ? 1 : 0) - (wildEnd ? 1 : 0));\r\n const escapedAlias =\r\n // TODO: escape\r\n // endIndex + 1: substring возвращает подстроку от startIndex до endIndex не включительно (+1 для того чтобы включить последний элемент)\r\n alias.substring(startIndex, endIndex + 1);\r\n patternList.push(new VisibilitySetting(escapedAlias, visibilitySetting.isHidden, true));\r\n } else {\r\n patternList.push(new VisibilitySetting(alias, visibilitySetting.isHidden, false));\r\n }\r\n }\r\n}\r\n\r\nclass PermissionsControlsVisitor {\r\n public hideSections: Set = new Set();\r\n public hideFields: Set = new Set();\r\n public showFields: Set = new Set();\r\n public mandatorySections: Set = new Set();\r\n public mandatoryFields: Set = new Set();\r\n public disallowedSections = new Set();\r\n private _visibilitySettings: VisibilitySettings;\r\n\r\n public visit(cardModel: ICardModel, parentGrids: Array) {\r\n let disableGrids = false;\r\n if (cardModel.table && cardModel.table.row.state !== CardRowState.Inserted) {\r\n for (let grid of parentGrids) {\r\n // Если хотя бы одна из родительских таблиц недоступна для редактирования через KrPermissions, то и все таблицы текущей строки должны быть недоступны.\r\n let parentGridSource = grid.cardTypeControl.getSourceInfo();\r\n if (this.disallowedSections.has(parentGridSource.sectionId)) {\r\n disableGrids = true;\r\n break;\r\n }\r\n }\r\n }\r\n for (let control of cardModel.controlsBag) {\r\n this.visitControl(control);\r\n let grid: GridViewModel | null = null;\r\n if (control instanceof GridViewModel) {\r\n grid = control as GridViewModel;\r\n }\r\n if (disableGrids && grid) {\r\n grid.isReadOnly = true;\r\n }\r\n }\r\n\r\n for (let block of cardModel.blocksBag) {\r\n this.visitBlock(block);\r\n }\r\n\r\n for (let form of cardModel.formsBag) {\r\n this.visitForm(cardModel, form);\r\n }\r\n }\r\n\r\n public fill(\r\n sectionSettings: KrPermissionSectionSettings[],\r\n visibilitySettings: VisibilitySettings\r\n ) {\r\n for (let sectionSetting of sectionSettings) {\r\n if (sectionSetting.isHidden) {\r\n this.hideSections.add(sectionSetting.id);\r\n } else {\r\n sectionSetting.hiddenFields.forEach(x => this.hideFields.add(x));\r\n }\r\n\r\n sectionSetting.visibleFields.forEach(x => this.showFields.add(x));\r\n\r\n if (sectionSetting.isMandatory) {\r\n this.mandatorySections.add(sectionSetting.id);\r\n } else {\r\n sectionSetting.mandatoryFields.forEach(x => this.mandatoryFields.add(x));\r\n }\r\n if (sectionSetting.isDisallowed) {\r\n this.disallowedSections.add(sectionSetting.id);\r\n }\r\n }\r\n\r\n this._visibilitySettings = visibilitySettings;\r\n }\r\n\r\n private visitForm(model: ICardModel, form: IFormViewModel) {\r\n if (form.name) {\r\n const hidden: boolean | null = this.checkIsHidden(\r\n this._visibilitySettings.tabSettings,\r\n form.name\r\n );\r\n if (hidden) {\r\n this.hideForm(model, form);\r\n }\r\n // Нет возможности добавлять скрытую форму, т.к. она не была сгенерирована\r\n }\r\n }\r\n\r\n private visitBlock(block: IBlockViewModel) {\r\n if (block.name) {\r\n const hidden: boolean | null = this.checkIsHidden(\r\n this._visibilitySettings.blockSettings,\r\n block.name\r\n );\r\n if (hidden !== null) {\r\n if (hidden) {\r\n this.hideBlock(block);\r\n } else {\r\n this.showBlock(block);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private visitControl(control: IControlViewModel) {\r\n const sourceInfo = control.cardTypeControl.getSourceInfo();\r\n if (\r\n (this.hideSections.has(sourceInfo.sectionId) &&\r\n !sourceInfo.columnIds.some(x => this.showFields.has(x))) ||\r\n sourceInfo.columnIds.some(x => this.hideFields.has(x))\r\n ) {\r\n this.hideControl(control);\r\n }\r\n if (control.name) {\r\n const hidden: boolean | null = this.checkIsHidden(\r\n this._visibilitySettings.controlSettings,\r\n control.name\r\n );\r\n if (hidden !== null) {\r\n if (hidden) {\r\n this.hideControl(control);\r\n } else {\r\n this.showControl(control);\r\n }\r\n }\r\n }\r\n\r\n if (\r\n this.mandatorySections.has(sourceInfo.sectionId) ||\r\n sourceInfo.columnIds.some(x => this.mandatoryFields.has(x))\r\n ) {\r\n this.makeControlMandatory(control);\r\n }\r\n }\r\n\r\n private hideControl(control: IControlViewModel) {\r\n control.controlVisibility = Visibility.Collapsed;\r\n }\r\n\r\n private showControl(control: IControlViewModel) {\r\n control.controlVisibility = Visibility.Visible;\r\n }\r\n\r\n private hideBlock(block: IBlockViewModel) {\r\n block.blockVisibility = Visibility.Collapsed;\r\n }\r\n\r\n private showBlock(block: IBlockViewModel) {\r\n block.blockVisibility = Visibility.Visible;\r\n }\r\n\r\n private hideForm(_model: ICardModel, formViewModel: IFormViewModel) {\r\n if (isTopLevelForm(unseal(formViewModel.cardTypeForm))) {\r\n formViewModel.visibility = Visibility.Collapsed;\r\n } else {\r\n formViewModel.close();\r\n }\r\n }\r\n\r\n private makeControlMandatory(controlViewModel: IControlViewModel) {\r\n controlViewModel.isRequired = true;\r\n controlViewModel.requiredText = LocalizationManager.instance.format(\r\n '$KrPermissions_MandatoryControlTemplate',\r\n controlViewModel.caption\r\n );\r\n }\r\n\r\n private checkIsHidden(settings: Array, checkName: string): boolean | null {\r\n if (settings && settings.length > 0) {\r\n for (let setting of settings) {\r\n if (setting.isPattern) {\r\n if (checkName.match(setting.text)) {\r\n return setting.isHidden;\r\n }\r\n } else {\r\n if (setting.text.toLowerCase() === checkName.toLowerCase()) {\r\n return setting.isHidden;\r\n }\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n}\r\n\r\nexport class KrExtendedPermissionsUIExtension extends CardUIExtension {\r\n public initialized(context: ICardUIExtensionContext) {\r\n const token = KrToken.tryGet(context.card.info);\r\n // Если не используется типовое решение\r\n if (!token || !token.extendedCardSettings) {\r\n return;\r\n }\r\n\r\n const cardControlsVisitor = new PermissionsControlsVisitor();\r\n\r\n // Набор визиторов по гридам\r\n const visitors = new Map();\r\n // Стек текущих открытых таблиц\r\n const parentGridStack: Array = new Array();\r\n\r\n // Инициализация видимости контролов по визитору\r\n const initModel = (initModel: ICardModel, visitor: PermissionsControlsVisitor) => {\r\n visitor.visit(initModel, parentGridStack);\r\n for (let control of initModel.controlsBag) {\r\n if (control instanceof GridViewModel) {\r\n visitors.set(control, visitor);\r\n control.rowInitializing.add(rowInitializaing);\r\n control.rowEditorClosed.add(rowClosed);\r\n }\r\n }\r\n };\r\n\r\n // Инициализация вдимости контролов по визитору при открытии строки таблицы\r\n const rowInitializaing = (e: GridRowEventArgs) => {\r\n try {\r\n if (e.rowModel) {\r\n parentGridStack.push(e.control);\r\n initModel(e.rowModel, visitors.get(e.control)!);\r\n }\r\n } catch (e) {\r\n showNotEmpty(ValidationResult.fromError(e));\r\n }\r\n };\r\n\r\n // Отписка от созданных подписок при закрытии строки грида\r\n const rowClosed = (e: GridRowEventArgs) => {\r\n if (e.rowModel) {\r\n parentGridStack.pop();\r\n for (let control of e.rowModel.controlsBag) {\r\n if (control instanceof GridViewModel) {\r\n visitors.delete(control);\r\n control.rowInitializing.remove(rowInitializaing);\r\n control.rowEditorClosed.remove(rowClosed);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const extendedSettings = token.extendedCardSettings;\r\n const sectionSettings = extendedSettings.getCardSettings();\r\n const tasksSettings = extendedSettings.getTaskSettings();\r\n const visibilitySettings = extendedSettings.getVisibilitySettings();\r\n\r\n const model = context.model;\r\n\r\n if (\r\n (sectionSettings && sectionSettings.length > 0) ||\r\n (tasksSettings && tasksSettings.size > 0) ||\r\n (visibilitySettings && visibilitySettings.length > 0)\r\n ) {\r\n const uiVisibilitySettings = new VisibilitySettings();\r\n uiVisibilitySettings.fill(visibilitySettings);\r\n cardControlsVisitor.fill(sectionSettings, uiVisibilitySettings);\r\n\r\n initModel(model, cardControlsVisitor);\r\n if (tasksSettings && tasksSettings.size > 0) {\r\n this.modifyTask(model, tvm => {\r\n const taskSettings = tasksSettings.get(tvm.taskModel.cardTask!.typeId);\r\n if (!taskSettings) {\r\n return;\r\n }\r\n\r\n const taskVisitor = new PermissionsControlsVisitor();\r\n taskVisitor.fill(taskSettings, uiVisibilitySettings);\r\n\r\n tvm.modifyWorkspace(e => {\r\n initModel(e.task.taskModel, taskVisitor);\r\n });\r\n });\r\n }\r\n }\r\n }\r\n\r\n private modifyTask(\r\n model: ICardModel,\r\n modifyAction: (tvm: TaskViewModel, m: ICardModel) => void\r\n ): boolean {\r\n if (!(model instanceof DefaultFormTabWithTasksViewModel)) {\r\n return false;\r\n }\r\n\r\n for (let task of model.tasks.filter(x => x instanceof TaskViewModel)) {\r\n modifyAction(task, model);\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n","import {\r\n CardModelFlags,\r\n CardUIExtension,\r\n IBlockViewModel,\r\n ICardUIExtensionContext,\r\n IFormViewModel\r\n} from 'tessa/ui/cards';\r\nimport { hasFlag, hasNotFlag, Visibility } from 'tessa/platform';\r\nimport { getKrComponentsByCard, KrComponents, KrTypesCache } from 'tessa/workflow';\r\nimport { designTimeCard, tryGetKrType } from '../../workflow/krProcess/krUIHelper';\r\n\r\nexport default class KrRoutesInWorkflowEngineUIExtension extends CardUIExtension {\r\n public async initialized(context: ICardUIExtensionContext) {\r\n const model = context.model;\r\n const card = model.card;\r\n const cardTypeId = card.typeId;\r\n const routesForm: IFormViewModel | undefined = model.forms.find(\r\n x => x.name === 'ApprovalProcess'\r\n );\r\n const stageBlock: IBlockViewModel | undefined = model.blocks.get('ApprovalStagesBlock');\r\n const hasNotRoutes = hasNotFlag(\r\n getKrComponentsByCard(card, KrTypesCache.instance),\r\n KrComponents.Routes\r\n );\r\n const krType = tryGetKrType(KrTypesCache.instance, card, cardTypeId, context.validationResult);\r\n if (\r\n hasFlag(model.flags, CardModelFlags.EditTemplate) ||\r\n designTimeCard(cardTypeId) ||\r\n hasNotRoutes ||\r\n (krType && !krType.useRoutesInWorkflowEngine) ||\r\n !routesForm ||\r\n !stageBlock\r\n ) {\r\n return;\r\n }\r\n if (stageBlock.blockVisibility !== Visibility.Collapsed) {\r\n stageBlock.blockVisibility = Visibility.Collapsed;\r\n }\r\n }\r\n}\r\n","import { CardUIExtension, ICardUIExtensionContext } from 'tessa/ui/cards';\r\nimport { tryGetFromInfo, createCardFileSourceForCard } from 'tessa/ui';\r\nimport { IStorage, clear } from 'tessa/platform/storage';\r\nimport { Guid, TypedField, DotNetType, getTypedFieldValue, createTypedField } from 'tessa/platform';\r\nimport { VirtualFile, VirtualFileVersion } from 'tessa/files';\r\nimport { CardFileContentSource } from 'tessa/cards';\r\n\r\nexport class KrGetCycleFileInfoUIExtension extends CardUIExtension {\r\n public async initializing(context: ICardUIExtensionContext) {\r\n if (context.model.inSpecialMode) {\r\n return;\r\n }\r\n\r\n const cardInfo = context.card.tryGetInfo();\r\n if (!cardInfo) {\r\n return;\r\n }\r\n\r\n const filesByCycles = tryGetFromInfo<{ [key: string]: TypedField }>(\r\n cardInfo,\r\n 'KrFilesByCycles'\r\n );\r\n const filesModifiedByCyclesStorage = tryGetFromInfo(\r\n cardInfo,\r\n 'KrFilesModifiedByCycles'\r\n );\r\n const maxCycleNumber = tryGetFromInfo(cardInfo, 'KrMaxCycleNumber');\r\n // tslint:disable-next-line: triple-equals\r\n if (!filesByCycles || !filesModifiedByCyclesStorage || maxCycleNumber == undefined) {\r\n return;\r\n }\r\n\r\n for (let fileId in filesByCycles) {\r\n const cycleId = getTypedFieldValue(filesByCycles[fileId]);\r\n const fileModel = context.fileContainer.files.find(x => Guid.equals(x.id, fileId));\r\n if (fileModel) {\r\n fileModel.info['KrCycleID'] = Number(cycleId);\r\n fileModel.info['KrCycleorder'] = Number(maxCycleNumber) - Number(cycleId);\r\n fileModel.info['KrMaxCycleNumber'] = Number(maxCycleNumber);\r\n }\r\n }\r\n\r\n if (filesModifiedByCyclesStorage.length > 0) {\r\n // clone - пустая карточка с той же информацией по типу и по версии, и др. системной информацией, но без фактических данных;\r\n // в неё будут добавляться виртуальные файлы, чтобы незахламлять структуру основной карточки\r\n\r\n const clone = context.card.clone();\r\n clone.sections.clear();\r\n clone.files.clear();\r\n clone.tasks.clear();\r\n clone.taskHistory.clear();\r\n clone.taskHistoryGroups.clear();\r\n clear(clone.info);\r\n\r\n const cloneFileSource = createCardFileSourceForCard(clone);\r\n\r\n for (let versionInfo of filesModifiedByCyclesStorage) {\r\n const fileId = tryGetFromInfo(versionInfo, 'FileID');\r\n\r\n const originalFile = context.fileContainer.files.find(x => Guid.equals(x.id, fileId));\r\n if (!originalFile) {\r\n continue;\r\n }\r\n\r\n const originalCardFile = context.card.files.find(x => Guid.equals(x.rowId, fileId));\r\n if (!originalCardFile) {\r\n continue;\r\n }\r\n\r\n const cycle = tryGetFromInfo(versionInfo, 'Cycle');\r\n const versionId = tryGetFromInfo(versionInfo, 'VersionID');\r\n const versionNumber = tryGetFromInfo(versionInfo, 'Number');\r\n const versionSize = tryGetFromInfo(versionInfo, 'Size');\r\n const sourceId = tryGetFromInfo(versionInfo, 'SourceID');\r\n const versionCreated = tryGetFromInfo(versionInfo, 'Created');\r\n const versionCreatedById = tryGetFromInfo(versionInfo, 'CreatedByID');\r\n const versionCreatedByName = tryGetFromInfo(versionInfo, 'CreatedByName');\r\n\r\n // теперь создаём файл и наполняем его\r\n const virtualFile = await context.fileContainer.addVirtalFile(\r\n cloneFileSource,\r\n new VirtualFile(\r\n originalCardFile.typeName,\r\n Guid.newGuid(),\r\n originalCardFile.name,\r\n token => {\r\n token.size = versionSize;\r\n // TODO\r\n // token.LastVersionTags.AddRange(originalFile.Versions.Last.Tags);\r\n }\r\n ),\r\n new VirtualFileVersion(Guid.newGuid(), originalCardFile.name, token => {\r\n token.size = versionSize;\r\n token.number = versionNumber;\r\n token.created = versionCreated;\r\n token.createdById = versionCreatedById;\r\n token.createdByName = versionCreatedByName;\r\n // TODO\r\n // token.Tags.AddRange(originalFile.Versions.Last.Tags);\r\n })\r\n );\r\n\r\n const virtualCardFile = clone.files.find(x => x.card.id === virtualFile.id)!;\r\n virtualCardFile.card.createdById = versionCreatedById;\r\n virtualCardFile.card.createdByName = versionCreatedByName;\r\n virtualCardFile.card.created = versionCreated;\r\n virtualCardFile.lastVersion!.number = versionNumber;\r\n virtualCardFile.lastVersion!.created = versionCreated;\r\n virtualCardFile.lastVersion!.createdById = versionCreatedById;\r\n virtualCardFile.lastVersion!.createdByName = versionCreatedByName;\r\n\r\n virtualCardFile.externalSource = new CardFileContentSource();\r\n virtualCardFile.externalSource.cardId = context.card.id;\r\n virtualCardFile.externalSource.cardTypeId = context.model.cardType.id!;\r\n virtualCardFile.externalSource.fileId = fileId;\r\n virtualCardFile.externalSource.storeSource = sourceId;\r\n virtualCardFile.externalSource.versionRowId = versionId;\r\n\r\n virtualFile.info['KrCreated'] = createTypedField(versionCreated, DotNetType.DateTime);\r\n virtualFile.info['KrCreatedByName'] = createTypedField(\r\n versionCreatedByName,\r\n DotNetType.String\r\n );\r\n virtualFile.info['KrCycleID'] = createTypedField(cycle, DotNetType.Int32);\r\n virtualFile.info['KrCycleorder'] = createTypedField(\r\n maxCycleNumber - cycle,\r\n DotNetType.Int32\r\n );\r\n virtualFile.info['KrMaxCycleNumber'] = createTypedField(maxCycleNumber, DotNetType.Int32);\r\n }\r\n }\r\n }\r\n}\r\n","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { CalendarUIExtension } from './calendarUIExtension';\r\nimport { OutgoingPartnerUIExtension } from './outgoingPartnerUIExtension';\r\nimport { CarUIExtension } from './carUIExtension';\r\nimport { KrDocStateUIExtension } from './krDocStateUIExtension';\r\nimport { CreateAndSelectToolbarUIExtension } from './createAndSelectToolbarUIExtension';\r\nimport { KrVirtualFilesUIExtension } from './krVirtualFilesUIExtension';\r\nimport { KrPermissionsUIExtension } from './krPermissionsUIExtension';\r\nimport { KrExtendedPermissionsUIExtension } from './krExtendedPermissionsUIExtension';\r\nimport KrRoutesInWorkflowEngineUIExtension from './workflowEngine/krRoutesInWorkflowEngineUIExtension';\r\nimport { KrGetCycleFileInfoUIExtension } from './krGetCycleFileInfoUIExtension';\r\n\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrGetCycleFileInfoUIExtension,\r\n stage: ExtensionStage.BeforePlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: CalendarUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: OutgoingPartnerUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: CarUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrDocStateUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: CreateAndSelectToolbarUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrVirtualFilesUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrPermissionsUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrExtendedPermissionsUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrRoutesInWorkflowEngineUIExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\n","import * as React from 'react';\r\nimport { computed, observable } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport { WorkplaceViewComponentExtension } from 'tessa/ui/views/extensions';\r\nimport { DoubleClickInfo, IWorkplaceViewComponent, ViewComponentRegistry } from 'tessa/ui/views';\r\nimport { BaseContentItem, ContentPlaceArea, ContentPlaceOrder } from 'tessa/ui/views/content';\r\nimport { IconButton } from 'ui';\r\nimport { ApplicationExtension } from 'tessa';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { showError, showLoadingOverlay, showNotEmpty, tryGetFromInfo, UIContext } from 'tessa/ui';\r\nimport { createCard } from 'tessa/ui/uiHost';\r\nimport { equalsCriteriaOperator, ViewReferenceMetadataSealed } from 'tessa/views/metadata';\r\nimport {\r\n convertRowToMap,\r\n getCardId,\r\n ITessaViewResult,\r\n RequestParameterBuilder,\r\n TessaViewRequest\r\n} from 'tessa/views';\r\nimport { CardRequest, CardService } from 'tessa/cards/service';\r\nimport { ValidationResult, ValidationResultBuilder } from 'tessa/platform/validation';\r\nimport { createTypedField, DotNetType } from 'tessa/platform';\r\nimport { KrTypesCache } from 'tessa/workflow';\r\nimport { AdvancedCardDialogManager } from 'tessa/ui/cards';\r\nimport { LocalizationManager } from 'tessa/localization';\r\n\r\nexport class CreateCardExtension extends WorkplaceViewComponentExtension {\r\n public getExtensionName(): string {\r\n return 'Tessa.Extensions.Default.Client.Views.CreateCardExtension';\r\n }\r\n\r\n public initialize(model: IWorkplaceViewComponent) {\r\n // if (!model.inSelectionMode()) {\r\n model.contentFactories.set(\r\n 'CreateCardExtension',\r\n c => new CreateCardButtonViewModel(new CreateCardExtensionSettings(this.settingsStorage), c)\r\n );\r\n // }\r\n }\r\n}\r\n\r\nexport class CreateCardInitializeExtension extends ApplicationExtension {\r\n public initialize() {\r\n ViewComponentRegistry.instance.register(CreateCardButtonViewModel, () => CreateCardButton);\r\n }\r\n}\r\n\r\n//#region CreateCardExtensionSettings\r\n\r\nenum CardCreationKind {\r\n ByTypeFromSelection,\r\n ByTypeAlias,\r\n ByDocTypeIdentifier\r\n}\r\n\r\nenum CardOpeningKind {\r\n ApplicationTab,\r\n ModalDialog\r\n}\r\n\r\nclass CreateCardExtensionSettings {\r\n constructor(storage: IStorage) {\r\n this.cardCreationKind =\r\n storage['CardCreationKind'] != null\r\n ? storage['CardCreationKind']\r\n : CardCreationKind.ByTypeFromSelection;\r\n this.cardOpeningKind =\r\n storage['CardOpeningKind'] != null\r\n ? storage['CardOpeningKind']\r\n : CardOpeningKind.ApplicationTab;\r\n this.typeAlias = storage['TypeAlias'] || '';\r\n this.docTypeIdentifier = storage['DocTypeIdentifier'] || '';\r\n this.idParam = storage['IDParam'] || '';\r\n }\r\n\r\n public readonly cardCreationKind: CardCreationKind;\r\n public readonly cardOpeningKind: CardOpeningKind;\r\n public readonly typeAlias: string;\r\n public readonly docTypeIdentifier: string;\r\n public readonly idParam: guid;\r\n}\r\n\r\n//#endregion\r\n\r\n//#region CreateCardButtonViewModel\r\n\r\nclass CreateCardButtonViewModel extends BaseContentItem {\r\n //#region ctor\r\n\r\n constructor(\r\n settings: CreateCardExtensionSettings,\r\n viewComponent: IWorkplaceViewComponent,\r\n area: ContentPlaceArea = ContentPlaceArea.ToolBarPanel,\r\n order: number = ContentPlaceOrder.Middle\r\n ) {\r\n super(viewComponent, area, order);\r\n this._settings = settings;\r\n this.icon =\r\n this._settings.cardOpeningKind === CardOpeningKind.ModalDialog\r\n ? 'icon-thin-002'\r\n : 'icon-thin-001';\r\n this._toolTip =\r\n settings.cardCreationKind === CardCreationKind.ByTypeFromSelection\r\n ? '$Views_CreateCardExtension_Selection_ToolTip'\r\n : '$Views_CreateCardExtension_SpecifiedType_ToolTip';\r\n }\r\n\r\n //#endregion\r\n\r\n //#region fields\r\n @observable\r\n private _toolTip: string;\r\n @computed\r\n public get toolTip(): string {\r\n return LocalizationManager.instance.localize(this._toolTip);\r\n }\r\n\r\n public set toolTip(value: string) {\r\n this._toolTip = value;\r\n }\r\n\r\n private _settings: CreateCardExtensionSettings;\r\n\r\n //#endregion\r\n\r\n //#region props\r\n\r\n @computed\r\n public get canCreateCard(): boolean {\r\n switch (this._settings.cardCreationKind) {\r\n case CardCreationKind.ByTypeFromSelection:\r\n return this.viewComponent.selectedRow != null && !this.viewComponent.isDataLoading;\r\n case CardCreationKind.ByTypeAlias:\r\n return !!this._settings.typeAlias && !this.viewComponent.isDataLoading;\r\n case CardCreationKind.ByDocTypeIdentifier:\r\n return !!this._settings.docTypeIdentifier && !this.viewComponent.isDataLoading;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n @computed\r\n public get isLoading(): boolean {\r\n return this.viewComponent.isDataLoading;\r\n }\r\n\r\n public readonly icon: string;\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n public createCard() {\r\n if (!this.canCreateCard) {\r\n return;\r\n }\r\n\r\n switch (this._settings.cardCreationKind) {\r\n case CardCreationKind.ByTypeFromSelection:\r\n return this.createCardActionBySelectedRow();\r\n case CardCreationKind.ByTypeAlias:\r\n return this.createCardActionByTypeAlias();\r\n case CardCreationKind.ByDocTypeIdentifier:\r\n return this.createCardActionByDocTypeIdentifier();\r\n default:\r\n return;\r\n }\r\n }\r\n\r\n private async createCardActionBySelectedRow() {\r\n if (!this.viewComponent.selectedRow || !this.viewComponent.view) {\r\n return;\r\n }\r\n\r\n const references: ViewReferenceMetadataSealed[] = [];\r\n this.viewComponent.view.metadata.references.forEach(x => references.push(x));\r\n const ref = references.find(x => x.isCard && x.openOnDoubleClick);\r\n if (!ref) {\r\n return;\r\n }\r\n\r\n const row = this.viewComponent.selectedRow;\r\n const cardId = getCardId(row, ref.colPrefix!);\r\n if (cardId) {\r\n let result: ValidationResult = ValidationResult.empty;\r\n let cardTypeId: guid | null = null;\r\n let docTypeId: guid | null = null;\r\n let docTypeTitle: string | null = null;\r\n\r\n const uiContextExecutor = this.viewComponent.workplace.uiContextExecutor;\r\n await uiContextExecutor(async () => {\r\n const request = new CardRequest();\r\n request.requestType = '6a7b57e9-5088-40c9-a4ca-75a489974a9c'; // GetDocTypeInfo\r\n request.cardId = cardId;\r\n const response = await CardService.instance.request(request);\r\n result = response.validationResult.build();\r\n\r\n cardTypeId = result.isSuccessful\r\n ? tryGetFromInfo(response.info, 'cardTypeID')\r\n : null;\r\n\r\n if (cardTypeId) {\r\n docTypeId = tryGetFromInfo(response.info, 'docTypeID');\r\n docTypeTitle = !!docTypeId\r\n ? tryGetFromInfo(response.info, 'docTypeTitle')\r\n : null;\r\n }\r\n });\r\n\r\n if (result.isSuccessful) {\r\n await showNotEmpty(result);\r\n } else {\r\n await showNotEmpty(\r\n new ValidationResultBuilder()\r\n .add(ValidationResult.fromText('$Views_CreateCardExtension_ErrorGettingType'))\r\n .add(result)\r\n .build()\r\n );\r\n return;\r\n }\r\n\r\n if (cardTypeId) {\r\n const info = docTypeId\r\n ? {\r\n docTypeID: createTypedField(docTypeId, DotNetType.Guid),\r\n docTypeTitle: createTypedField(docTypeTitle, DotNetType.String)\r\n }\r\n : {};\r\n\r\n await this.createCardInternal(cardTypeId!, undefined, info);\r\n return;\r\n }\r\n }\r\n\r\n await showError('$Views_CreateCardExtension_ErrorGettingType');\r\n }\r\n\r\n private async createCardActionByDocTypeIdentifier() {\r\n const docTypeId = this._settings.docTypeIdentifier;\r\n if (!docTypeId) {\r\n return;\r\n }\r\n\r\n const docType = KrTypesCache.instance.docTypes.find(x => x.id === docTypeId);\r\n if (!docType) {\r\n return;\r\n }\r\n\r\n const info = {\r\n docTypeID: createTypedField(docTypeId, DotNetType.Guid),\r\n docTypeTitle: createTypedField(docType.caption, DotNetType.String)\r\n };\r\n\r\n await this.createCardInternal(docType.cardTypeId, undefined, info);\r\n }\r\n\r\n private async createCardActionByTypeAlias() {\r\n const typeName = this._settings.typeAlias;\r\n if (!typeName) {\r\n return;\r\n }\r\n\r\n await this.createCardInternal(undefined, typeName);\r\n }\r\n\r\n private async createCardInternal(cardTypeId?: guid, cardTypeName?: string, info?: IStorage) {\r\n const context = this.viewComponent.workplace.context;\r\n const contextInstance = UIContext.create(context);\r\n try {\r\n const idParam = this._settings.idParam;\r\n const inSelectionMode = this.viewComponent.inSelectionMode();\r\n const idParamMeta = this.viewComponent.view!.metadata.parameters.get(idParam)!;\r\n const hasIdParam = !!idParamMeta;\r\n\r\n if (inSelectionMode && hasIdParam) {\r\n context.info['CreateAndSelectID'] = null;\r\n }\r\n await showLoadingOverlay(async splashResolve => {\r\n if (inSelectionMode || this._settings.cardOpeningKind === CardOpeningKind.ApplicationTab) {\r\n await createCard({\r\n cardTypeId,\r\n cardTypeName,\r\n context,\r\n info,\r\n openToTheRightOfSelectedTab: true,\r\n splashResolve\r\n });\r\n } else {\r\n await AdvancedCardDialogManager.instance.createCard({\r\n cardTypeId,\r\n cardTypeName,\r\n context,\r\n info,\r\n splashResolve\r\n });\r\n }\r\n });\r\n\r\n if (inSelectionMode || this._settings.cardOpeningKind === CardOpeningKind.ModalDialog) {\r\n const createAndSelectId = tryGetFromInfo(context.info, 'CreateAndSelectID') as guid;\r\n if (\r\n inSelectionMode &&\r\n hasIdParam &&\r\n // tslint:disable-next-line:triple-equals\r\n createAndSelectId != undefined\r\n ) {\r\n const request = new TessaViewRequest(this.viewComponent.view!.metadata);\r\n const idParameter = new RequestParameterBuilder()\r\n .withMetadata(idParamMeta)\r\n .addCriteria(equalsCriteriaOperator(), createAndSelectId, createAndSelectId)\r\n .asRequestParameter();\r\n\r\n request.values.push(idParameter);\r\n\r\n let result!: ITessaViewResult;\r\n await showLoadingOverlay(async () => {\r\n result = await this.viewComponent.view!.getData(request);\r\n });\r\n\r\n if (result.rows.length === 1 && this.viewComponent.workplace.doubleClickAction) {\r\n const dinfo = new DoubleClickInfo();\r\n dinfo.view = this.viewComponent.view!.metadata;\r\n dinfo.context = context;\r\n dinfo.selectedObject = convertRowToMap(result.columns, result.rows[0]);\r\n await this.viewComponent.workplace.doubleClickAction(dinfo);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n await this.viewComponent.refreshView();\r\n } finally {\r\n contextInstance.dispose();\r\n }\r\n }\r\n\r\n //#endregion\r\n}\r\n\r\n//#endregion\r\n\r\n//#region CreateCardButton\r\n\r\ninterface CreateCardButtonProps {\r\n viewModel: CreateCardButtonViewModel;\r\n}\r\n\r\n@observer\r\nclass CreateCardButton extends React.Component {\r\n public render() {\r\n const { viewModel } = this.props;\r\n return (\r\n \r\n );\r\n }\r\n\r\n private handleClick = e => {\r\n e.stopPropagation();\r\n this.props.viewModel.createCard();\r\n };\r\n}\r\n\r\n//#endregion\r\n","import * as React from 'react';\r\nimport { observer } from 'mobx-react';\r\nimport classNames from 'classnames';\r\nimport { ApplicationExtension } from 'tessa';\r\nimport { TreeItemExtension } from 'tessa/ui/views/extensions';\r\nimport { ITreeItem, FolderTreeItem } from 'tessa/ui/views/workplaces/tree';\r\nimport { IContentProvider, ViewComponentRegistry, IViewContext } from 'tessa/ui/views';\r\nimport { LocalizationManager } from 'tessa/localization';\r\n\r\nexport class CustomFolderViewExtension extends TreeItemExtension {\r\n\r\n public getExtensionName(): string {\r\n return 'Tessa.Extensions.Default.Client.Views.CustomFolderViewExtension';\r\n }\r\n\r\n public initialize(model: ITreeItem) {\r\n model.switchExpandOnSingleClick = false;\r\n if (model instanceof FolderTreeItem) {\r\n model.hasContent = true;\r\n }\r\n model.contentProviderFactory = () => new CustomFolderContentProvider(model);\r\n }\r\n\r\n}\r\n\r\nexport class CustomFolderInitializeExtension extends ApplicationExtension {\r\n\r\n public initialize() {\r\n ViewComponentRegistry.instance.register(CustomFolderViewModel, () => CustomViewContentComponent);\r\n }\r\n\r\n}\r\n\r\nclass CustomFolderContentProvider implements IContentProvider {\r\n\r\n constructor(tree: ITreeItem) {\r\n this.viewModel = new CustomFolderViewModel(tree);\r\n }\r\n\r\n public readonly viewModel: CustomFolderViewModel;\r\n\r\n public readonly viewContext: IViewContext | null = null;\r\n\r\n public readonly components: ReadonlyMap = new Map();\r\n\r\n public async refresh(): Promise {\r\n }\r\n\r\n public dispose() {\r\n }\r\n\r\n}\r\n\r\nclass CustomFolderViewModel {\r\n\r\n constructor(tree: ITreeItem) {\r\n this.tree = tree;\r\n }\r\n\r\n public readonly tree: ITreeItem;\r\n\r\n}\r\n\r\ninterface CustomFolderComponentProps {\r\n // tslint:disable-next-line:no-any\r\n viewModel: CustomFolderViewModel;\r\n}\r\n\r\n@observer\r\nclass CustomViewContentComponent extends React.Component {\r\n\r\n public render() {\r\n const { viewModel } = this.props;\r\n let icon = viewModel.tree.isExpanded\r\n ? viewModel.tree.expandedIcon\r\n : viewModel.tree.icon;\r\n if (!icon) {\r\n icon = 'icon-thin-101';\r\n }\r\n return (\r\n
\r\n
\r\n \r\n
\r\n {LocalizationManager.instance.localize(viewModel.tree.text)}\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n}","import { TreeItemExtension } from 'tessa/ui/views/extensions';\r\nimport { ITreeItem } from 'tessa/ui/views/workplaces/tree';\r\n\r\nexport class TreeViewItemTestExtension extends TreeItemExtension {\r\n\r\n public getExtensionName(): string {\r\n return 'Tessa.Extensions.Default.Client.Views.TreeViewItemTestExtension';\r\n }\r\n\r\n public initialize(model: ITreeItem) {\r\n console.log(model);\r\n }\r\n\r\n}","import { WorkplaceViewComponentExtension } from 'tessa/ui/views/extensions';\r\nimport { IWorkplaceViewComponent, IViewContextMenuContext } from 'tessa/ui/views';\r\nimport { MenuAction, SeparatorMenuAction, LoadingOverlay } from 'tessa/ui';\r\nimport { ViewReferenceMetadataSealed } from 'tessa/views/metadata';\r\nimport { getValueId, getFirstStringValueByPrefix } from 'tessa/views';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { openCard } from 'tessa/ui/uiHost';\r\n\r\nexport class ViewsContextMenuExtension extends WorkplaceViewComponentExtension {\r\n\r\n public getExtensionName(): string {\r\n return 'Tessa.Extensions.Default.Client.Views.ViewsContextMenuExtension';\r\n }\r\n\r\n public initialize(model: IWorkplaceViewComponent) {\r\n model.contextMenuGenerators.push(ctx => {\r\n ViewsContextMenuExtension.createRefreshMenuAction(ctx);\r\n ViewsContextMenuExtension.createFilterMenuAction(ctx);\r\n ViewsContextMenuExtension.createClearFilterMenuAction(ctx);\r\n ViewsContextMenuExtension.createOpenCardMenuAction(ctx);\r\n });\r\n }\r\n\r\n private static createRefreshMenuAction(ctx: IViewContextMenuContext) {\r\n const viewContext = ctx.viewContext;\r\n\r\n ctx.menuActions.push(new MenuAction(\r\n 'Refresh',\r\n '$UI_Tiles_Refresh',\r\n 'ta icon-thin-412',\r\n () => { viewContext.refreshView(); },\r\n null,\r\n !viewContext.canRefreshView()\r\n ));\r\n }\r\n\r\n private static createFilterMenuAction(ctx: IViewContextMenuContext) {\r\n const viewContext = ctx.viewContext;\r\n\r\n if (viewContext.parameters.metadata.every(p => p.hidden)) {\r\n return;\r\n }\r\n\r\n ctx.menuActions.push(new SeparatorMenuAction());\r\n ctx.menuActions.push(new MenuAction(\r\n 'Filter',\r\n '$UI_Tiles_Filter',\r\n 'ta icon-thin-100',\r\n () => { viewContext.filterView(); },\r\n null,\r\n !viewContext.canFilterView()\r\n ));\r\n }\r\n\r\n private static createClearFilterMenuAction(ctx: IViewContextMenuContext) {\r\n const viewContext = ctx.viewContext;\r\n\r\n if (viewContext.parameters.parameters.every(p => p.readOnly)) {\r\n return;\r\n }\r\n\r\n ctx.menuActions.push(new MenuAction(\r\n 'ClearFilter',\r\n '$Views_Table_ClearFilter_ToolTip',\r\n 'ta icon-thin-065',\r\n () => { viewContext.clearFilterView(); },\r\n null,\r\n !viewContext.canClearFilterView()\r\n ));\r\n }\r\n\r\n private static createOpenCardMenuAction(ctx: IViewContextMenuContext) {\r\n const viewContext = ctx.viewContext;\r\n\r\n if (viewContext.refSection) {\r\n return;\r\n }\r\n\r\n const view = viewContext.view;\r\n const selectedObject = viewContext.selectedRow;\r\n if (!selectedObject || !view) {\r\n return;\r\n }\r\n\r\n const metadata = view.metadata;\r\n if (!metadata) {\r\n return;\r\n }\r\n\r\n const cardRefs: ViewReferenceMetadataSealed[] = [];\r\n metadata.references.forEach(ref => {\r\n if (ref.isCard) {\r\n cardRefs.push(ref);\r\n }\r\n });\r\n if (cardRefs.length === 0) {\r\n return;\r\n }\r\n\r\n let separatorAddided = false;\r\n const addedIDs: Set = new Set();\r\n for (let cardRef of cardRefs) {\r\n const cardId = getValueId(selectedObject, cardRef.colPrefix!);\r\n if (!cardId) {\r\n return;\r\n }\r\n\r\n const displayValueObj = cardRef.displayValueColumn\r\n ? selectedObject.get(cardRef.displayValueColumn)\r\n : getFirstStringValueByPrefix(selectedObject, cardRef.colPrefix!, viewContext.columns);\r\n\r\n const displayValue = displayValueObj || '';\r\n\r\n if (!addedIDs.has(cardId)) {\r\n addedIDs.add(cardId);\r\n if (!separatorAddided) {\r\n ctx.menuActions.push(new SeparatorMenuAction());\r\n separatorAddided = true;\r\n }\r\n\r\n const uiContextExecutor = ctx.uiContextExecutor;\r\n ctx.menuActions.push(new MenuAction(\r\n `OpenCard_${cardId}`,\r\n `${LocalizationManager.instance.localize('$UI_Tiles_OpenCard')}: ${LocalizationManager.instance.localize(displayValue)}`,\r\n 'ta icon-thin-013',\r\n () => {\r\n LoadingOverlay.instance.show(async (splashResolve) => {\r\n await uiContextExecutor(async context => {\r\n await openCard({\r\n cardId,\r\n displayValue,\r\n context,\r\n splashResolve\r\n });\r\n });\r\n });\r\n },\r\n null,\r\n false\r\n ));\r\n }\r\n }\r\n }\r\n\r\n}","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { CreateCardExtension, CreateCardInitializeExtension } from './createCardExtension';\r\nimport { CustomFolderViewExtension, CustomFolderInitializeExtension } from './customFolderViewExtension';\r\nimport { TreeViewItemTestExtension } from './treeViewItemTestExtension';\r\nimport { ViewsContextMenuExtension } from './viewsContextMenuExtension';\r\n\r\nExtensionContainer.instance.registerExtension({\r\n extension: CreateCardExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: CreateCardInitializeExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: CustomFolderInitializeExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: CustomFolderViewExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: TreeViewItemTestExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: ViewsContextMenuExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});","import { CardGetExtension, ICardGetExtensionContext } from 'tessa/cards/extensions';\r\nimport { UIContext, tryGetFromInfo } from 'tessa/ui';\r\nimport { ICardEditorModel, ICardModel, CardEditorOperationType } from 'tessa/ui/cards';\r\nimport { createTypedField, DotNetType } from 'tessa/platform';\r\n\r\nexport class KrDontSkipEditModeGetExtension extends CardGetExtension {\r\n\r\n public beforeRequest(context: ICardGetExtensionContext) {\r\n const uiContext = UIContext.current;\r\n let editor!: ICardEditorModel;\r\n let model!: ICardModel;\r\n if ((editor = uiContext.cardEditor!)\r\n && (model = editor.cardModel!)\r\n // Флаг сохраняем только при открытии при сохранении карточки, рефреш карточки скидывает режим редактирования\r\n && editor.currentOperationType === CardEditorOperationType.SaveAndRefresh\r\n ) {\r\n const card = model.card;\r\n if (tryGetFromInfo(card.info, 'kr_permissions_calculated', false)) {\r\n context.request.info['kr_calculate_permissions'] = createTypedField(true, DotNetType.Boolean);\r\n // Тащим и этот признак на сервер, чтобы не отображать информационное сообщение\r\n // о выдаче прав после сохранения карточки\r\n context.request.info['kr_permissions_calculated'] = createTypedField(true, DotNetType.Boolean);\r\n }\r\n }\r\n }\r\n\r\n}","import { CardGetExtension, ICardGetExtensionContext } from 'tessa/cards/extensions';\r\nimport { UIContext } from 'tessa/ui';\r\nimport { ICardEditorModel, ICardModel, CardEditorOperationType } from 'tessa/ui/cards';\r\nimport { KrToken } from 'tessa/workflow';\r\nimport { Guid } from \"tessa/platform\";\r\n\r\nexport class KrKeepReadCardPermissionGetExtension extends CardGetExtension {\r\n\r\n public beforeRequest(context: ICardGetExtensionContext) {\r\n const uiContext = UIContext.current;\r\n let editor!: ICardEditorModel;\r\n let model!: ICardModel;\r\n if ((editor = uiContext.cardEditor!)\r\n && (model = editor.cardModel!)\r\n // Флаг сохраняем только при открытии при сохранении карточки, рефреш карточки скидывает режим редактирования\r\n && (editor.currentOperationType === CardEditorOperationType.SaveAndRefresh\r\n || editor.currentOperationType === CardEditorOperationType.Open)\r\n ) {\r\n if (KrToken.contains(context.request.info)) {\r\n return;\r\n }\r\n\r\n const token = KrToken.tryGet(model.card.info);\r\n if (token && (Guid.equals(token.cardId, context.request.cardId) || Guid.equals(token.cardId, Guid.empty))) {\r\n token.setInfo(context.request.info);\r\n }\r\n }\r\n }\r\n\r\n}","import { ICardStoreExtensionContext, CardStoreExtension } from 'tessa/cards/extensions';\r\nimport { UIContext } from 'tessa/ui';\r\nimport { ICardEditorModel, ICardModel, CardEditorOperationType } from 'tessa/ui/cards';\r\nimport { KrToken } from 'tessa/workflow';\r\nimport { Guid } from \"tessa/platform\";\r\n\r\nexport class KrKeepReadCardPermissionStoreExtension extends CardStoreExtension {\r\n\r\n public beforeRequest(context: ICardStoreExtensionContext) {\r\n const uiContext = UIContext.current;\r\n let editor!: ICardEditorModel;\r\n let model!: ICardModel;\r\n if ((editor = uiContext.cardEditor!)\r\n && (model = editor.cardModel!)\r\n // Флаг сохраняем только при открытии при сохранении карточки, рефреш карточки скидывает режим редактирования\r\n && (editor.currentOperationType === CardEditorOperationType.SaveAndRefresh\r\n || editor.currentOperationType === CardEditorOperationType.Open)\r\n ) {\r\n const token = KrToken.tryGet(model.card.info);\r\n if (token && (Guid.equals(token.cardId, model.card.id) || Guid.equals(token.cardId, Guid.empty))) {\r\n token.setInfo(context.request.info);\r\n }\r\n }\r\n }\r\n\r\n}","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { KrDontSkipEditModeGetExtension } from './krDontSkipEditModeGetExtension';\r\nimport { KrKeepReadCardPermissionGetExtension } from './krKeepReadCardPermissionGetExtension';\r\nimport { KrKeepReadCardPermissionStoreExtension } from './krKeepReadCardPermissionStoreExtension';\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrDontSkipEditModeGetExtension,\r\n stage: ExtensionStage.BeforePlatform,\r\n order: 1,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrKeepReadCardPermissionGetExtension,\r\n stage: ExtensionStage.BeforePlatform,\r\n order: 2,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrKeepReadCardPermissionStoreExtension,\r\n stage: ExtensionStage.BeforePlatform,\r\n order: 3,\r\n singleton: true\r\n});\r\n","import { KrGlobalTileContainer } from '../krGlobalTileContainer';\r\nimport { ApplicationExtension, IApplicationExtensionMetadataContext } from 'tessa';\r\nimport { tryGetFromInfo } from 'tessa/ui';\r\nimport { KrTileInfo } from 'tessa/workflow/krProcess';\r\n\r\nexport class GlobalButtonsInitalizationExtension extends ApplicationExtension {\r\n\r\n public afterMetadataReceived(context: IApplicationExtensionMetadataContext) {\r\n if (context.mainPartResponse) {\r\n const tiles = tryGetFromInfo(context.mainPartResponse.info, 'GlobalTilesInfoMark', []);\r\n const globalTiles: KrTileInfo[] = [];\r\n if (Array.isArray(tiles)) {\r\n for (let tile of tiles) {\r\n globalTiles.push(new KrTileInfo(tile));\r\n }\r\n } else {\r\n const names = Object.getOwnPropertyNames(tiles);\r\n for (let name of names) {\r\n globalTiles.push(new KrTileInfo(tiles[name]));\r\n }\r\n }\r\n\r\n KrGlobalTileContainer.instance.init(globalTiles);\r\n }\r\n }\r\n\r\n}","import { CardStoreExtension, ICardStoreExtensionContext } from 'tessa/cards/extensions';\r\nimport { hasNotFlag, DotNetType } from 'tessa/platform';\r\nimport { getKrComponentsByCard, KrTypesCache, KrComponents } from 'tessa/workflow';\r\nimport { MetadataStorage } from 'tessa';\r\nimport { MapStorage, ArrayStorage } from 'tessa/platform/storage';\r\nimport { CardSection, CardRow } from 'tessa/cards';\r\nimport { CardMetadataSectionSealed, CardMetadataColumnType, CardMetadataColumnSealed } from 'tessa/cards/metadata';\r\nimport { CardTypeSchemeItemSealed } from 'tessa/cards/types';\r\nimport { designTimeCard } from '../krUIHelper';\r\n\r\nexport class KrCardStoreExtension extends CardStoreExtension {\r\n\r\n public beforeRequest(context: ICardStoreExtensionContext) {\r\n let card = context.request.tryGetCard();\r\n if (card) {\r\n const info = card.tryGetInfo();\r\n if (info) {\r\n delete info['LocalTilesInfoMark'];\r\n }\r\n }\r\n\r\n if (!designTimeCard(context.request.card.typeId)\r\n && hasNotFlag(getKrComponentsByCard(context.request.card, KrTypesCache.instance), KrComponents.Routes)\r\n ) {\r\n return;\r\n }\r\n\r\n card = context.request.card;\r\n KrCardStoreExtension.visitSections(card.sections);\r\n\r\n const stagesSection = card.sections.tryGet('KrStagesVirtual');\r\n if (!stagesSection) {\r\n return;\r\n }\r\n\r\n for (let row of stagesSection.rows) {\r\n row.setChanged('DisplayTimeLimit', false);\r\n row.setChanged('DisplayParticipants', false);\r\n row.setChanged('DisplaySettings', false);\r\n }\r\n }\r\n\r\n private static visitSections(cardSections: MapStorage) {\r\n const cardMetadata = MetadataStorage.instance.cardMetadata;\r\n const cardType = cardMetadata.getCardTypeById('21bca3fc-f75f-413b-b5c8-49538cbfc761'); // KrCardTypeID\r\n if (!cardType) {\r\n return;\r\n }\r\n\r\n const schemeItems = new Map();\r\n cardType.schemeItems.forEach(x => schemeItems.set(x.sectionId!, x));\r\n const topLevelSecMetadata = cardMetadata.getSectionByName('KrStagesVirtual');\r\n if (!topLevelSecMetadata) {\r\n return;\r\n }\r\n\r\n const stagesMapping = new Map();\r\n const topLevelSection = cardSections.tryGet('KrStagesVirtual');\r\n if (!topLevelSection) {\r\n return;\r\n }\r\n\r\n for (let topLevelRow of topLevelSection.rows) {\r\n stagesMapping.set(topLevelRow.rowId, topLevelRow.rowId);\r\n topLevelRow.set('__ParentStageRowID', topLevelRow.rowId, DotNetType.Guid);\r\n }\r\n\r\n let previousLayer = new Set([ topLevelSecMetadata.id! ]);\r\n let currentLayer = new Set();\r\n\r\n // Обход зависимостей проводится в \"ширину\"\r\n // Вершиной является переданная через параметр секция\r\n // В первый слой входят все секции, имеющие столбец с указанием на родителя KrStages\r\n // Вторым слоем будут все секции, у которых \"ссылка на родителя\" указывает на секции первого слоя\r\n // и т.д. до тех пор, пока очередной слой не станет пустым.\r\n while (previousLayer.size !== 0) {\r\n for (let secMetadata of cardMetadata.sections) {\r\n // Секция не используется в карточке, а значит в обработке не участвует.\r\n const schemeItem = schemeItems.get(secMetadata.id!);\r\n if (!schemeItem) {\r\n continue;\r\n }\r\n\r\n // Получаем комплексный столбец с ссылкой на родителя.\r\n const refSecTuple = KrCardStoreExtension.getParentColumnSec(secMetadata, previousLayer);\r\n const parentComplexColumn = refSecTuple[0];\r\n const parentRowIdColumn = refSecTuple[1];\r\n if (!parentComplexColumn || !parentRowIdColumn) {\r\n continue;\r\n }\r\n\r\n // Комплексный столбец используется в карточке.\r\n if (!schemeItem.columnIdList.some(x => x === parentComplexColumn.id)) {\r\n continue;\r\n }\r\n\r\n let section: CardSection, rows: ArrayStorage;\r\n if ((section = cardSections.tryGet(secMetadata.name!)!)\r\n && (rows = section.tryGetRows()!)\r\n && rows.length > 0\r\n ) {\r\n currentLayer.add(secMetadata.id!);\r\n // Проставляем каждой строке ссылку на этап, ориентируясь по\r\n // ссылке на непосредственного родителя.\r\n for (let row of rows) {\r\n const parentId = row.tryGet(parentRowIdColumn.name!);\r\n let topLevelRowId: guid | null = null;\r\n if (parentId\r\n && (topLevelRowId = stagesMapping.get(parentId)!)\r\n ) {\r\n stagesMapping.set(row.rowId, topLevelRowId);\r\n row.set('__ParentStageRowID', topLevelRowId, DotNetType.Guid);\r\n }\r\n }\r\n }\r\n }\r\n\r\n const layers = KrCardStoreExtension.swapLayers(previousLayer, currentLayer);\r\n previousLayer = layers[0];\r\n currentLayer = layers[1];\r\n }\r\n }\r\n\r\n private static getParentColumnSec(\r\n secMetadata: CardMetadataSectionSealed,\r\n previousLayer: Set\r\n ): [CardMetadataColumnSealed | null, CardMetadataColumnSealed | null] {\r\n let complex: CardMetadataColumnSealed | null = null;\r\n let rowId: CardMetadataColumnSealed | null = null;\r\n for (let column of secMetadata.columns) {\r\n if (column.parentRowSection\r\n && column.columnType === CardMetadataColumnType.Complex\r\n && previousLayer.has(column.parentRowSection.id!)\r\n ) {\r\n complex = column;\r\n } else if (complex\r\n && column.columnType === CardMetadataColumnType.Physical\r\n && column.parentRowSection\r\n && complex.parentRowSection\r\n && column.parentRowSection.id === complex.parentRowSection.id\r\n && column.complexColumnIndex === complex.complexColumnIndex\r\n ) {\r\n rowId = column;\r\n break;\r\n }\r\n }\r\n\r\n return [complex, rowId];\r\n }\r\n\r\n private static swapLayers(\r\n previousLayer: Set,\r\n currentLayer: Set\r\n ): [Set, Set] {\r\n previousLayer.clear();\r\n return [currentLayer, previousLayer];\r\n }\r\n\r\n}","import { CardRequestExtension, ICardRequestExtensionContext } from 'tessa/cards/extensions';\r\nimport { tryGetFromInfo } from 'tessa/ui';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { KrProcessClientCommand } from 'tessa/workflow/krProcess';\r\nimport { ClientCommandInterpreter } from 'tessa/workflow/krProcess/clientCommandInterpreter';\r\n\r\nexport class KrClientCommandCustomExtension extends CardRequestExtension {\r\n\r\n public async afterRequest(context: ICardRequestExtensionContext) {\r\n if (context.requestIsSuccessful && context.response) {\r\n const commands: KrProcessClientCommand[] = [];\r\n const commandsStorage = tryGetFromInfo(context.response.info, 'KrProcessClientCommandInfoMark', []);\r\n if (Array.isArray(commandsStorage)) {\r\n for (let tile of commandsStorage) {\r\n commands.push(new KrProcessClientCommand(tile));\r\n }\r\n } else {\r\n const names = Object.getOwnPropertyNames(commandsStorage);\r\n for (let name of names) {\r\n commands.push(new KrProcessClientCommand(commandsStorage[name]));\r\n }\r\n }\r\n\r\n await ClientCommandInterpreter.instance.interpret(commands, context);\r\n }\r\n }\r\n\r\n}","import { CardStoreExtension, ICardStoreExtensionContext } from 'tessa/cards/extensions';\r\nimport { tryGetFromInfo } from 'tessa/ui';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { KrProcessClientCommand } from 'tessa/workflow/krProcess';\r\nimport { ClientCommandInterpreter } from 'tessa/workflow/krProcess/clientCommandInterpreter';\r\n\r\nexport class KrClientCommandStoreExtension extends CardStoreExtension {\r\n\r\n public async afterRequest(context: ICardStoreExtensionContext) {\r\n if (context.requestIsSuccessful && context.response) {\r\n const commands: KrProcessClientCommand[] = [];\r\n const commandsStorage = tryGetFromInfo(context.response.info, 'KrProcessClientCommandInfoMark', []);\r\n if (Array.isArray(commandsStorage)) {\r\n for (let tile of commandsStorage) {\r\n commands.push(new KrProcessClientCommand(tile));\r\n }\r\n } else {\r\n const names = Object.getOwnPropertyNames(commandsStorage);\r\n for (let name of names) {\r\n commands.push(new KrProcessClientCommand(commandsStorage[name]));\r\n }\r\n }\r\n\r\n await ClientCommandInterpreter.instance.interpret(commands, context);\r\n }\r\n }\r\n\r\n}","import { ClientCommandHandlerBase } from 'tessa/workflow/krProcess/clientCommandInterpreter';\r\nimport { IClientCommandHandlerContext } from 'tessa/workflow/krProcess';\r\nimport { getTypedFieldValue, createTypedField, DotNetType } from 'tessa/platform';\r\nimport { createCard } from 'tessa/ui/uiHost';\r\n\r\nexport class CreateCardViaDocTypeCommandHandler extends ClientCommandHandlerBase {\r\n public async handle(context: IClientCommandHandlerContext) {\r\n const command = context.command;\r\n const typeId = getTypedFieldValue(command.parameters['TypeID']);\r\n\r\n if (typeId) {\r\n const info = {\r\n ['.NewBilletCard']: command.parameters['NewCard'],\r\n ['.NewBilletCardSignature']: command.parameters['NewCardSignature']\r\n };\r\n\r\n const docTypeId = getTypedFieldValue(command.parameters['docTypeID']);\r\n const docTypeTitle = getTypedFieldValue(command.parameters['docTypeTitle']);\r\n\r\n if (docTypeId && docTypeTitle) {\r\n info['docTypeID'] = createTypedField(docTypeId, DotNetType.Guid);\r\n info['docTypeTitle'] = createTypedField(docTypeTitle, DotNetType.String);\r\n }\r\n await createCard({\r\n cardTypeId: typeId,\r\n info\r\n });\r\n }\r\n }\r\n}\r\n","import { ClientCommandHandlerBase } from 'tessa/workflow/krProcess/clientCommandInterpreter';\r\nimport { IClientCommandHandlerContext } from 'tessa/workflow/krProcess';\r\nimport { getTypedFieldValue } from 'tessa/platform';\r\nimport { createFromTemplate } from 'tessa/ui/uiHost';\r\n\r\nexport class CreateCardViaTemplateCommandHandler extends ClientCommandHandlerBase {\r\n public async handle(context: IClientCommandHandlerContext) {\r\n const command = context.command;\r\n const templateId = getTypedFieldValue(command.parameters['TemplateID']);\r\n\r\n if (templateId) {\r\n await createFromTemplate({\r\n templateId,\r\n templateInfo: {\r\n ['.NewBilletCard']: command.parameters['NewCard'],\r\n ['.NewBilletCardSignature']: command.parameters['NewCardSignature']\r\n }\r\n });\r\n }\r\n }\r\n}\r\n","import { ClientCommandHandlerBase } from 'tessa/workflow/krProcess/clientCommandInterpreter';\r\nimport { IClientCommandHandlerContext } from 'tessa/workflow/krProcess';\r\nimport { getTypedFieldValue } from 'tessa/platform';\r\nimport { openCard } from 'tessa/ui/uiHost';\r\n\r\nexport class OpenCardClientCommandHandler extends ClientCommandHandlerBase {\r\n\r\n public async handle(context: IClientCommandHandlerContext) {\r\n const cardId = getTypedFieldValue(context.command.parameters['cardID']);\r\n\r\n if (cardId) {\r\n await openCard({cardId});\r\n }\r\n }\r\n\r\n}","import { ClientCommandHandlerBase } from 'tessa/workflow/krProcess/clientCommandInterpreter';\r\nimport { IClientCommandHandlerContext } from 'tessa/workflow/krProcess';\r\nimport { getTypedFieldValue } from 'tessa/platform';\r\nimport { showMessage } from 'tessa/ui';\r\n\r\nexport class ShowConfirmationDialogClientCommandHandler extends ClientCommandHandlerBase {\r\n\r\n public async handle(context: IClientCommandHandlerContext) {\r\n const text = getTypedFieldValue(context.command.parameters['text']);\r\n\r\n if (text) {\r\n await showMessage(text);\r\n }\r\n }\r\n\r\n}","import { ClientCommandHandlerBase } from 'tessa/workflow/krProcess/clientCommandInterpreter';\r\nimport { IClientCommandHandlerContext } from 'tessa/workflow/krProcess';\r\nimport {\r\n CardButtonType,\r\n CardTaskCompletionOptionSettings,\r\n CardTaskDialogActionResult,\r\n systemKeyPrefix,\r\n Card,\r\n CardTaskDialogNewMethod,\r\n CardFileState\r\n} from 'tessa/cards';\r\nimport {\r\n IUIContext,\r\n showConfirm,\r\n UIButton,\r\n UIContext,\r\n createCardEditorModel,\r\n tryGetFromInfo\r\n} from 'tessa/ui';\r\nimport { AdvancedCardDialogManager, CardToolbarAction, ICardEditorModel } from 'tessa/ui/cards';\r\nimport { createTypedField, DotNetType, Guid } from 'tessa/platform';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { createCard, createFromTemplate } from 'tessa/ui/uiHost';\r\nimport { readFileContentAsBase64, IFile } from 'tessa/files';\r\nimport { CardRequestExtensionContext } from 'tessa/cards/extensions';\r\nimport { getTessaIcon } from 'common/utility';\r\n\r\nexport abstract class AdvancedDialogCommandHandler extends ClientCommandHandlerBase {\r\n async handle(context: IClientCommandHandlerContext): Promise {\r\n const coSettings = this.prepareDialogCommand(context);\r\n if (!coSettings) {\r\n return;\r\n }\r\n\r\n // костыль\r\n // в ТК при вызове диалога через тайл или при нажатии на кнопку в тулбаре UIContext не сохраняется.\r\n // в ЛК UIContext, который создается в showGlobalDialogAsync, сохраняется и доступен в расширениях,\r\n // поэтому поведение в этой части расширения может отличаться.\r\n // Для того чтобы обойти эту проблему в WeAdvancedDialogCommandHandler и KrAdvancedDialogCommandHandler прокидывается флажок\r\n // Когда этот флажок есть в CardRequestExtensionContext (и только для этого типа реквестов), то мы пропускаем проверку UIContext.\r\n let skipEditor = false;\r\n if (context.outerContext && context.outerContext instanceof CardRequestExtensionContext) {\r\n skipEditor = tryGetFromInfo(\r\n context.outerContext.request.info,\r\n systemKeyPrefix + 'WebAdvancedDialogCommandSkipUIContextFlag',\r\n false\r\n );\r\n }\r\n\r\n const editor = UIContext.current.cardEditor;\r\n if (editor && !skipEditor) {\r\n editor.info[systemKeyPrefix + 'CardEditorCompletionOptionSettings'] = coSettings;\r\n editor.info[systemKeyPrefix + 'CardEditorCompletionOptionSettingsOnButtonPressed'] = async (\r\n dialogCardEditor: ICardEditorModel,\r\n cos: CardTaskCompletionOptionSettings,\r\n buttonName: string,\r\n completeTask: boolean\r\n ) =>\r\n await this.completeDialogAsync(\r\n dialogCardEditor,\r\n editor,\r\n cos,\r\n buttonName,\r\n completeTask,\r\n context\r\n );\r\n } else {\r\n setTimeout(() => this.showGlobalDialogAsync(coSettings, context));\r\n }\r\n }\r\n\r\n protected abstract prepareDialogCommand(\r\n context: IClientCommandHandlerContext\r\n ): CardTaskCompletionOptionSettings | null;\r\n\r\n protected abstract async completeDialogCoreAsync(\r\n actionResult: CardTaskDialogActionResult,\r\n context: IClientCommandHandlerContext,\r\n cardEditor: ICardEditorModel,\r\n parentCardEditor: ICardEditorModel | null\r\n );\r\n\r\n private async completeDialogAsync(\r\n dialogCardEditor: ICardEditorModel,\r\n parentCardEditor: ICardEditorModel | null,\r\n coSettings: CardTaskCompletionOptionSettings,\r\n buttonName: string,\r\n completeDialog: boolean,\r\n context: IClientCommandHandlerContext\r\n ) {\r\n const dialogCard = dialogCardEditor.cardModel!.card.clone();\r\n await this.prepareFilesForStore(dialogCard, dialogCardEditor.cardModel!.fileContainer.files);\r\n\r\n const actionResult = new CardTaskDialogActionResult();\r\n actionResult.mainCardId = Guid.empty;\r\n actionResult.pressedButtonName = buttonName;\r\n actionResult.storeMode = coSettings.storeMode;\r\n actionResult.keepFiles = coSettings.keepFiles;\r\n actionResult.completeDialog = completeDialog;\r\n actionResult.setDialogCard(dialogCard);\r\n\r\n const closeDialog = await this.completeDialogCoreAsync(\r\n actionResult,\r\n context,\r\n dialogCardEditor,\r\n parentCardEditor\r\n );\r\n if (closeDialog) {\r\n await dialogCardEditor.close();\r\n }\r\n }\r\n\r\n private async prepareFilesForStore(dialogCard: Card, files: readonly IFile[]) {\r\n for (let cardFile of dialogCard.files) {\r\n const file = files.find(x => x.id === cardFile.rowId);\r\n if (!file) {\r\n continue;\r\n }\r\n\r\n switch (cardFile.state) {\r\n case CardFileState.None:\r\n case CardFileState.Modified:\r\n // ничего не делаем\r\n // TODO DESKI: isDirty\r\n break;\r\n case CardFileState.Replaced:\r\n case CardFileState.ModifiedAndReplaced:\r\n case CardFileState.Inserted:\r\n if (!file.lastVersion.content) {\r\n await file.lastVersion.ensureContentLoaded();\r\n }\r\n const fileContent = await readFileContentAsBase64(file.lastVersion.content!)!;\r\n cardFile.info[systemKeyPrefix + 'FileContent'] = createTypedField(\r\n fileContent,\r\n DotNetType.String\r\n );\r\n cardFile.info[systemKeyPrefix + 'FileVersion'] = cardFile.lastVersion!.getStorage();\r\n break;\r\n case CardFileState.Deleted:\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private async showGlobalDialogAsync(\r\n coSettings: CardTaskCompletionOptionSettings,\r\n context: IClientCommandHandlerContext\r\n ) {\r\n const info = coSettings.info;\r\n if (coSettings.preparedNewCard && coSettings.preparedNewCardSignature) {\r\n info[systemKeyPrefix + 'NewBilletCard'] = createTypedField(\r\n coSettings.preparedNewCard,\r\n DotNetType.Binary\r\n );\r\n info[systemKeyPrefix + 'NewBilletCardSignature'] = createTypedField(\r\n coSettings.preparedNewCardSignature,\r\n DotNetType.Binary\r\n );\r\n }\r\n info[systemKeyPrefix + 'StoreMode'] = createTypedField(coSettings.storeMode, DotNetType.Int32);\r\n\r\n const contextInstance = UIContext.create(\r\n new UIContext({\r\n cardEditor: createCardEditorModel(),\r\n actionOverridings: AdvancedCardDialogManager.instance.createUIContextActionOverridings()\r\n })\r\n );\r\n try {\r\n await this.createNewCard(coSettings, info, undefined, cardEditor => {\r\n cardEditor.context.info[systemKeyPrefix + 'DialogClosingAction'] = async (\r\n uiCtx: IUIContext,\r\n args: { cancel: boolean }\r\n ) => {\r\n if (uiCtx.cardEditor!.operationInProgress) {\r\n args.cancel = true;\r\n } else if (!uiCtx.cardEditor!.isClosed) {\r\n // TODO: check alt key\r\n const dialogResult = await showConfirm('$KrProcess_Dialog_ConfirmClose');\r\n if (!dialogResult) {\r\n args.cancel = true;\r\n }\r\n }\r\n return false;\r\n };\r\n this.prepareDialog(cardEditor, coSettings, context);\r\n });\r\n } finally {\r\n contextInstance.dispose();\r\n }\r\n }\r\n\r\n private prepareDialog(\r\n editor: ICardEditorModel,\r\n coSettings: CardTaskCompletionOptionSettings,\r\n context: IClientCommandHandlerContext\r\n ) {\r\n editor.statusBarIsVisible = false;\r\n if (coSettings.dialogName) {\r\n editor.dialogName = coSettings.dialogName;\r\n }\r\n\r\n editor.toolbar.clearItems();\r\n editor.bottomToolbar.clearItems();\r\n editor.bottomDialogButtons.length = 0;\r\n\r\n const getButtonAction = (name: string, cancel: boolean, completionDialog: boolean) => {\r\n const func = !cancel\r\n ? async () =>\r\n await this.completeDialogAsync(\r\n editor,\r\n null,\r\n coSettings,\r\n name,\r\n completionDialog,\r\n context\r\n )\r\n : async () => {\r\n await editor.close();\r\n };\r\n return async () => func();\r\n };\r\n\r\n for (let actionInfo of coSettings.buttons) {\r\n const name = actionInfo.name;\r\n const cancel = actionInfo.cancel;\r\n const completionDialog = actionInfo.completeDialog;\r\n let icon: string = '';\r\n if (actionInfo.icon) {\r\n icon = getTessaIcon(actionInfo.icon);\r\n }\r\n\r\n switch (actionInfo.cardButtonType) {\r\n case CardButtonType.BottomToolbarButton:\r\n editor.bottomToolbar.addItem(\r\n new CardToolbarAction({\r\n name,\r\n icon: icon,\r\n command: getButtonAction(name, cancel, completionDialog),\r\n order: actionInfo.order,\r\n caption: actionInfo.caption\r\n })\r\n );\r\n break;\r\n case CardButtonType.ToolbarButton:\r\n editor.toolbar.addItem(\r\n new CardToolbarAction({\r\n name,\r\n icon: icon,\r\n command: getButtonAction(name, cancel, completionDialog),\r\n order: actionInfo.order,\r\n caption: actionInfo.caption\r\n })\r\n );\r\n break;\r\n case CardButtonType.BottomDialogButton:\r\n editor.bottomDialogButtons.push(\r\n new UIButton(actionInfo.caption, getButtonAction(name, cancel, completionDialog))\r\n );\r\n break;\r\n default:\r\n throw new Error('CardButtonType out of range.');\r\n }\r\n }\r\n }\r\n\r\n private async createNewCard(\r\n completionOptionSettings: CardTaskCompletionOptionSettings,\r\n info?: IStorage,\r\n modifyCardAction?: (card: Card) => void,\r\n modifyEditorAction?: (editor: ICardEditorModel) => void\r\n ) {\r\n switch (completionOptionSettings.cardNewMethod) {\r\n case CardTaskDialogNewMethod.Default:\r\n await createCard({\r\n cardTypeId: completionOptionSettings.dialogTypeId,\r\n info: info,\r\n displayValue: completionOptionSettings.displayValue,\r\n cardModelModifierAction: modifyCardAction ? ctx => modifyCardAction(ctx.card) : undefined,\r\n cardEditorModifierAction: modifyEditorAction\r\n ? ctx => modifyEditorAction(ctx.editor)\r\n : undefined,\r\n context: UIContext.current\r\n });\r\n break;\r\n\r\n case CardTaskDialogNewMethod.Template:\r\n await createFromTemplate({\r\n templateId: completionOptionSettings.dialogTypeId,\r\n templateInfo: info,\r\n modifyCardAction,\r\n modifyEditorAction,\r\n context: UIContext.current\r\n });\r\n break;\r\n\r\n default:\r\n throw new Error('CardTaskDialogNewMethod out of range.');\r\n }\r\n }\r\n}\r\n","import { CreateCardViaDocTypeCommandHandler } from './createCardViaDocTypeCommandHandler';\r\nimport { CreateCardViaTemplateCommandHandler } from './createCardViaTemplateCommandHandler';\r\nimport { OpenCardClientCommandHandler } from './openCardClientCommandHandler';\r\nimport { ShowConfirmationDialogClientCommandHandler } from './showConfirmationDialogClientCommandHandler';\r\nimport { ClientCommandInterpreter } from 'tessa/workflow/krProcess/clientCommandInterpreter';\r\nimport { KrAdvancedDialogCommandHandler } from './krAdvancedDialogCommandHandler';\r\nimport { WeAdvancedDialogCommandHandler } from '../../workflowEngine/weAdvancedDialogCommandHandler';\r\n\r\nClientCommandInterpreter.instance.registerHandler(\r\n 'ShowConfirmationDialog',\r\n ShowConfirmationDialogClientCommandHandler\r\n);\r\n// ClientCommandInterpreter.instance.registerHandler('RefreshAndNotify', RefreshAndNotifyClientCommandHandler); // not used\r\nClientCommandInterpreter.instance.registerHandler(\r\n 'CreateCardViaTemplate',\r\n CreateCardViaTemplateCommandHandler\r\n);\r\nClientCommandInterpreter.instance.registerHandler(\r\n 'CreateCardViaDocType',\r\n CreateCardViaDocTypeCommandHandler\r\n);\r\nClientCommandInterpreter.instance.registerHandler('OpenCard', OpenCardClientCommandHandler);\r\nClientCommandInterpreter.instance.registerHandler(\r\n 'ShowAdvancedDialog',\r\n KrAdvancedDialogCommandHandler\r\n);\r\nClientCommandInterpreter.instance.registerHandler(\r\n 'WeShowAdvancedDialog',\r\n WeAdvancedDialogCommandHandler\r\n);\r\n","import { AdvancedDialogCommandHandler } from './advancedDialogCommandHandler';\r\nimport {\r\n IClientCommandHandlerContext,\r\n KrProcessInstance,\r\n launchProcess\r\n} from 'tessa/workflow/krProcess';\r\nimport { showNotEmpty, tryGetFromInfo } from 'tessa/ui';\r\nimport {\r\n CardTaskCompletionOptionSettings,\r\n CardTaskDialogActionResult,\r\n systemKeyPrefix\r\n} from 'tessa/cards';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { ICardEditorModel } from 'tessa/ui/cards';\r\nimport { createTypedField, DotNetType } from 'tessa/platform';\r\n\r\nexport class KrAdvancedDialogCommandHandler extends AdvancedDialogCommandHandler {\r\n protected prepareDialogCommand(\r\n context: IClientCommandHandlerContext\r\n ): CardTaskCompletionOptionSettings | null {\r\n const parameters = context.command.parameters;\r\n if (!parameters.ProcessInstance) {\r\n return null;\r\n }\r\n const coSettingsObj = parameters.CompletionOptionSettings;\r\n if (!coSettingsObj) {\r\n return null;\r\n }\r\n return new CardTaskCompletionOptionSettings(coSettingsObj);\r\n }\r\n\r\n protected async completeDialogCoreAsync(\r\n actionResult: CardTaskDialogActionResult,\r\n context: IClientCommandHandlerContext,\r\n _cardEditor: ICardEditorModel,\r\n parentCardEditor: ICardEditorModel | null\r\n ): Promise {\r\n const parameters = context.command.parameters;\r\n const instanceStorage = tryGetFromInfo(parameters, 'ProcessInstance', null);\r\n if (!instanceStorage) {\r\n return true;\r\n }\r\n\r\n const processInstance = new KrProcessInstance(instanceStorage);\r\n const requestInfo: IStorage = {};\r\n\r\n if (parentCardEditor && parentCardEditor.cardModel) {\r\n const card = parentCardEditor.cardModel.card;\r\n card.info[systemKeyPrefix + 'CardTaskDialogActionResult'] = actionResult.getStorage();\r\n } else {\r\n requestInfo[systemKeyPrefix + 'CardTaskDialogActionResult'] = actionResult.getStorage();\r\n }\r\n\r\n requestInfo[systemKeyPrefix + 'WebAdvancedDialogCommandSkipUIContextFlag'] = createTypedField(\r\n true,\r\n DotNetType.Boolean\r\n );\r\n\r\n const result = await launchProcess(processInstance, {\r\n cardEditor: parentCardEditor!,\r\n requestInfo: requestInfo\r\n });\r\n if (!result) {\r\n return false;\r\n }\r\n\r\n await showNotEmpty(result.validationResult.build());\r\n return (\r\n result.validationResult.isSuccessful &&\r\n !tryGetFromInfo(result.cardResponse.info, `${systemKeyPrefix}KeepTaskDialog`, false)\r\n );\r\n }\r\n}\r\n","import { AdvancedDialogCommandHandler } from '../krProcess/commandInterpreter/advancedDialogCommandHandler';\r\nimport {\r\n CardTaskCompletionOptionSettings,\r\n CardTaskDialogActionResult,\r\n systemKeyPrefix\r\n} from 'tessa/cards';\r\nimport { IClientCommandHandlerContext } from 'tessa/workflow/krProcess';\r\nimport { ICardEditorModel } from 'tessa/ui/cards';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { showNotEmpty, tryGetFromInfo } from 'tessa/ui';\r\nimport { WorkflowEngineProcessorClient, WorkflowEngineProcessStorageRequest } from 'tessa/workflow';\r\nimport { createTypedField, DotNetType } from 'tessa/platform';\r\n\r\nexport class WeAdvancedDialogCommandHandler extends AdvancedDialogCommandHandler {\r\n protected prepareDialogCommand(\r\n context: IClientCommandHandlerContext\r\n ): CardTaskCompletionOptionSettings | null {\r\n const parameters = context.command.parameters;\r\n const dialogSettingsStorage: IStorage = parameters.CompletionOptionSettings;\r\n const coSettings = tryGetFromInfo(\r\n dialogSettingsStorage,\r\n systemKeyPrefix + 'DialogSettings',\r\n null\r\n );\r\n if (coSettings) {\r\n return new CardTaskCompletionOptionSettings(coSettings);\r\n }\r\n return null;\r\n }\r\n\r\n protected async completeDialogCoreAsync(\r\n actionResult: CardTaskDialogActionResult,\r\n context: IClientCommandHandlerContext,\r\n parentCardEditor: ICardEditorModel | null\r\n ): Promise {\r\n const dialogSettings = context.command.parameters.CompletionOptionSettings;\r\n const { request, requestSignature } = this.getProcessRequest(dialogSettings);\r\n\r\n if (!context.outerContext || !context.outerContext.response) {\r\n return true;\r\n }\r\n\r\n const responseInfo = context.outerContext.response.info || {};\r\n const additionalInfo: IStorage = {};\r\n additionalInfo[systemKeyPrefix + 'CardTaskDialogActionResult'] = actionResult.getStorage();\r\n\r\n const processObj = tryGetFromInfo(\r\n responseInfo,\r\n systemKeyPrefix + 'WorkflowEngineProcessSerializedKey',\r\n null\r\n );\r\n if (processObj) {\r\n additionalInfo[systemKeyPrefix + 'WorkflowEngineProcessSerializedKey'] = processObj;\r\n }\r\n\r\n // ???\r\n // using var uiScope = parentCardEditor is null ? (IDisposable)null : UIContext.Create(parentCardEditor.Context);\r\n\r\n const workflowEngineProcessor = new WorkflowEngineProcessorClient();\r\n const result = await workflowEngineProcessor.processSignalAsync(\r\n request!,\r\n requestSignature,\r\n additionalInfo,\r\n request => {\r\n const requestInfo = request.info;\r\n requestInfo[\r\n systemKeyPrefix + 'WebAdvancedDialogCommandSkipUIContextFlag'\r\n ] = createTypedField(true, DotNetType.Boolean);\r\n }\r\n );\r\n await showNotEmpty(result.validationResult);\r\n if (result.validationResult.isSuccessful && parentCardEditor) {\r\n await parentCardEditor.refreshCard(parentCardEditor.context);\r\n }\r\n\r\n return !!(\r\n result.validationResult.isSuccessful &&\r\n result.responseInfo &&\r\n !tryGetFromInfo(result.responseInfo, `${systemKeyPrefix}KeepTaskDialog`, false)\r\n );\r\n }\r\n\r\n private getProcessRequest(info: IStorage) {\r\n let request: WorkflowEngineProcessStorageRequest | null = null;\r\n const requestFromInfo = tryGetFromInfo(info, systemKeyPrefix + 'ProcessRequest');\r\n if (requestFromInfo) {\r\n request = new WorkflowEngineProcessStorageRequest(requestFromInfo);\r\n }\r\n const requestSignature = tryGetFromInfo(\r\n info,\r\n systemKeyPrefix + 'ProcessRequestSignature',\r\n null\r\n );\r\n return { request, requestSignature };\r\n }\r\n}\r\n","import { plainColumnName } from 'tessa/workflow';\r\nimport { KrStageTypeFormatter, IKrStageTypeFormatterContext, StageTypeHandlerDescriptor,\r\n addFromTemplateDescriptor } from 'tessa/workflow/krProcess';\r\n\r\nexport class AddFileFromTemplateStageTypeFormatter extends KrStageTypeFormatter {\r\n\r\n private _name = plainColumnName('KrAddFromTemplateSettingsVirtual', 'Name');\r\n private _fileTemplateName = plainColumnName('KrAddFromTemplateSettingsVirtual', 'FileTemplateName');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [addFromTemplateDescriptor];\r\n }\r\n\r\n public format(context: IKrStageTypeFormatterContext) {\r\n super.format(context);\r\n context.displayParticipants = '';\r\n context.displayTimeLimit = '';\r\n context.displaySettings = `${context.stageRow.tryGet(this._fileTemplateName) || ''}\\n${context.stageRow.tryGet(this._name) || ''}`;\r\n }\r\n\r\n}","import { plainColumnName } from 'tessa/workflow';\r\nimport { KrStageTypeFormatter, IKrStageTypeFormatterContext, StageTypeHandlerDescriptor,\r\n dialogDescriptor} from 'tessa/workflow/krProcess';\r\n\r\nexport class DialogsStageTypeFormatter extends KrStageTypeFormatter {\r\n\r\n private _kindCaption = plainColumnName('KrTaskKindSettingsVirtual', 'KindCaption');\r\n private _taskDigest = plainColumnName('KrDialogStageTypeSettingsVirtual', 'TaskDigest');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [dialogDescriptor];\r\n }\r\n\r\n public format(context: IKrStageTypeFormatterContext) {\r\n super.format(context);\r\n\r\n const settings = context.stageRow.getStorage();\r\n const buidler = { text: '' };\r\n\r\n this.appendString(buidler, settings, this._kindCaption, '', true);\r\n this.appendString(buidler, settings, this._taskDigest, '', true, false, 30);\r\n\r\n context.displaySettings = buidler.text;\r\n }\r\n\r\n}","import { plainColumnName } from 'tessa/workflow';\r\nimport {\r\n KrStageTypeFormatter,\r\n IKrStageTypeFormatterContext,\r\n StageTypeHandlerDescriptor,\r\n approvalDescriptor\r\n} from 'tessa/workflow/krProcess';\r\n\r\nexport class KrApprovalStageTypeFormatter extends KrStageTypeFormatter {\r\n private _isAdvisory = plainColumnName('KrApprovalSettingsVirtual', 'Advisory');\r\n private _isParallel = plainColumnName('KrApprovalSettingsVirtual', 'IsParallel');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [approvalDescriptor];\r\n }\r\n\r\n public format(context: IKrStageTypeFormatterContext) {\r\n super.format(context);\r\n\r\n let sb = '';\r\n if (context.stageRow.tryGet(this._isAdvisory)) {\r\n sb += '$UI_KrApproval_Advisory\\n\\r';\r\n }\r\n\r\n sb += context.stageRow.tryGet(this._isParallel)\r\n ? '$UI_KrApproval_Parallel'\r\n : '$UI_KrApproval_Sequential';\r\n context.displaySettings = sb;\r\n }\r\n}\r\n","import { plainColumnName } from 'tessa/workflow';\r\nimport { KrStageTypeFormatter, IKrStageTypeFormatterContext, StageTypeHandlerDescriptor,\r\n changesStateDescriptor } from 'tessa/workflow/krProcess';\r\n\r\nexport class KrChangeStateStageTypeFormatter extends KrStageTypeFormatter {\r\n\r\n private _settingsStateName = plainColumnName('KrChangeStateSettingsVirtual', 'StateName');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [changesStateDescriptor];\r\n }\r\n\r\n public format(context: IKrStageTypeFormatterContext) {\r\n const state = context.stageRow.tryGet(this._settingsStateName);\r\n context.displaySettings = !state\r\n ? ''\r\n : state[0] === '$'\r\n ? `{$UI_KrChangeState_State}: {${state}}`\r\n : `{$UI_KrChangeState_State}: ${state}`;\r\n }\r\n\r\n}","import { plainColumnName } from 'tessa/workflow';\r\nimport { KrStageTypeFormatter, IKrStageTypeFormatterContext, StageTypeHandlerDescriptor,\r\n createCardDescriptor } from 'tessa/workflow/krProcess';\r\nimport { LocalizationManager } from 'tessa/localization';\r\n\r\nexport class KrCreateCardStageTypeFormatter extends KrStageTypeFormatter {\r\n\r\n private _templateCaption = plainColumnName('KrCreateCardStageSettingsVirtual', 'TemplateCaption');\r\n private _modeName = plainColumnName('KrCreateCardStageSettingsVirtual', 'ModeName');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [createCardDescriptor];\r\n }\r\n\r\n public format(context: IKrStageTypeFormatterContext) {\r\n const templateName = `${context.stageRow.tryGet(this._templateCaption) || ''}\\n`;\r\n const modeName = `${LocalizationManager.instance.localize(context.stageRow.tryGet(this._modeName) || '')}`;\r\n\r\n context.displaySettings = templateName + modeName;\r\n }\r\n\r\n}","import { plainColumnName } from 'tessa/workflow';\r\nimport { KrStageTypeFormatter, IKrStageTypeFormatterContext, StageTypeHandlerDescriptor,\r\n editDescriptor } from 'tessa/workflow/krProcess';\r\n\r\nexport class KrEditStageTypeFormatter extends KrStageTypeFormatter {\r\n\r\n private _changeState = plainColumnName('KrEditSettingsVirtual', 'ChangeState');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [editDescriptor];\r\n }\r\n\r\n public format(context: IKrStageTypeFormatterContext) {\r\n super.format(context);\r\n context.displaySettings = context.stageRow.tryGet(this._changeState)\r\n ? '$UI_KrEdit_ChangeState'\r\n : '';\r\n }\r\n\r\n}","import { plainColumnName } from 'tessa/workflow';\r\nimport { KrStageTypeFormatter, IKrStageTypeFormatterContext, StageTypeHandlerDescriptor,\r\n processManagementDescriptor } from 'tessa/workflow/krProcess';\r\n\r\nexport class KrProcessManagementStageTypeFormatter extends KrStageTypeFormatter {\r\n\r\n private _managePrimaryProcess = plainColumnName('KrProcessManagementStageSettingsVirtual', 'ManagePrimaryProcess');\r\n private _modeId = plainColumnName('KrProcessManagementStageSettingsVirtual', 'ModeID');\r\n private _modeName = plainColumnName('KrProcessManagementStageSettingsVirtual', 'ModeName');\r\n private _stageName = plainColumnName('KrProcessManagementStageSettingsVirtual', 'StageName');\r\n private _groupName = plainColumnName('KrProcessManagementStageSettingsVirtual', 'StageGroupName');\r\n private _groupRowName = plainColumnName('KrProcessManagementStageSettingsVirtual', 'StageRowGroupName');\r\n private _signal = plainColumnName('KrProcessManagementStageSettingsVirtual', 'Signal');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [processManagementDescriptor];\r\n }\r\n\r\n public format(context: IKrStageTypeFormatterContext) {\r\n const managePrimaryProcess = context.stageRow.tryGet(this._managePrimaryProcess) || false;\r\n const modeId = context.stageRow.tryGet(this._modeId);\r\n const modeName = context.stageRow.tryGet(this._modeName);\r\n let stageName = context.stageRow.tryGet(this._stageName);\r\n let groupName = context.stageRow.tryGet(this._groupName);\r\n let groupRowName = context.stageRow.tryGet(this._groupRowName);\r\n const signal = context.stageRow.tryGet(this._signal);\r\n\r\n let builder = '';\r\n\r\n if (modeName) {\r\n builder += `{${modeName}}\\n`;\r\n }\r\n\r\n if (modeId === 0 && stageName) {\r\n if (stageName[0] === '$') {\r\n stageName = `${stageName}`;\r\n }\r\n\r\n if (groupRowName) {\r\n groupRowName = groupRowName[0] === '$'\r\n ? ` ({${groupRowName}})`\r\n : ` (${groupRowName})`;\r\n }\r\n\r\n builder += `${stageName + groupRowName}\\n`;\r\n } else if (modeId === 1 && groupName) {\r\n if (groupName[0] === '$') {\r\n groupName = `${groupName}`;\r\n }\r\n\r\n builder += `${groupName}\\n`;\r\n } else if (modeId === 5 && signal) {\r\n builder += `${signal}\\n`;\r\n }\r\n\r\n if (managePrimaryProcess) {\r\n builder += '{$CardTypes_Controls_ManagePrimaryProcess}\\n';\r\n }\r\n\r\n context.displaySettings = builder;\r\n }\r\n\r\n}","import {\r\n KrStageTypeFormatter,\r\n IKrStageTypeFormatterContext,\r\n StageTypeHandlerDescriptor,\r\n resolutionDescriptor\r\n} from 'tessa/workflow/krProcess';\r\nimport { plainColumnName } from 'tessa/workflow';\r\nimport { tryGetFromInfo } from 'tessa/ui';\r\n\r\nexport class KrResolutionStageTypeFormatter extends KrStageTypeFormatter {\r\n private _kindCaption = plainColumnName('KrResolutionSettingsVirtual', 'KindCaption');\r\n private _authorName = plainColumnName('KrResolutionSettingsVirtual', 'AuthorName');\r\n private _controllerName = plainColumnName('KrResolutionSettingsVirtual', 'ControllerName');\r\n private _planned = plainColumnName('KrResolutionSettingsVirtual', 'Planned');\r\n private _durationInDays = plainColumnName('KrResolutionSettingsVirtual', 'DurationInDays');\r\n private _withControl = plainColumnName('KrResolutionSettingsVirtual', 'WithControl');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [resolutionDescriptor];\r\n }\r\n\r\n public format(context: IKrStageTypeFormatterContext) {\r\n super.format(context);\r\n\r\n const settings = context.stageRow;\r\n const settingsStorage = settings.getStorage();\r\n const buidler = { text: '' };\r\n\r\n this.appendString(\r\n buidler,\r\n settingsStorage,\r\n this._kindCaption,\r\n '{$CardTypes_Controls_Kind}',\r\n true\r\n );\r\n this.appendString(buidler, settingsStorage, this._authorName, '{$CardTypes_Controls_From}');\r\n\r\n if (tryGetFromInfo(settingsStorage, this._withControl, false)) {\r\n this.appendString(\r\n buidler,\r\n settingsStorage,\r\n this._controllerName,\r\n '{$CardTypes_Controls_Controller}',\r\n false,\r\n true\r\n );\r\n }\r\n\r\n context.displaySettings = buidler.text;\r\n\r\n const planned = settings.tryGet(this._planned);\r\n const timeLimit = settings.tryGet(this._durationInDays);\r\n this.defaultDateFormatting(planned, timeLimit, context);\r\n }\r\n}\r\n","import { plainColumnName } from 'tessa/workflow';\r\nimport {\r\n KrStageTypeFormatter,\r\n IKrStageTypeFormatterContext,\r\n StageTypeHandlerDescriptor,\r\n signingDescriptor\r\n} from 'tessa/workflow/krProcess';\r\n\r\nexport class KrSigningStageTypeFormatter extends KrStageTypeFormatter {\r\n private _isParallel = plainColumnName('KrSigningStageSettingsVirtual', 'IsParallel');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [signingDescriptor];\r\n }\r\n\r\n public format(context: IKrStageTypeFormatterContext) {\r\n super.format(context);\r\n context.displaySettings = context.stageRow.tryGet(this._isParallel)\r\n ? '$UI_KrApproval_Parallel'\r\n : '$UI_KrApproval_Sequential';\r\n }\r\n}\r\n","import { plainColumnName } from 'tessa/workflow';\r\nimport { KrStageTypeFormatter, IKrStageTypeFormatterContext, StageTypeHandlerDescriptor,\r\n notificationDescriptor } from 'tessa/workflow/krProcess';\r\n\r\nexport class NotificationStageTypeFormatter extends KrStageTypeFormatter {\r\n\r\n private _excludeDeputies = plainColumnName('KrNotificationSettingVirtual', 'ExcludeDeputies');\r\n private _excludeSubscribers = plainColumnName('KrNotificationSettingVirtual', 'ExcludeSubscribers');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [notificationDescriptor];\r\n }\r\n\r\n public format(context: IKrStageTypeFormatterContext) {\r\n super.format(context);\r\n\r\n const excludeDeputies = context.stageRow.get(this._excludeDeputies);\r\n const excludeSubscribers = context.stageRow.get(this._excludeSubscribers);\r\n\r\n context.displayTimeLimit = '';\r\n context.displaySettings = this.getDisplaySettings(excludeDeputies, excludeSubscribers);\r\n }\r\n\r\n private getDisplaySettings(\r\n excludeDeputies: boolean,\r\n excludeSubscribers: boolean\r\n ): string {\r\n let settings = '';\r\n if (excludeDeputies) {\r\n settings = '{$UI_KrNotification_ExcludeDeputies}';\r\n }\r\n if (excludeSubscribers) {\r\n if (excludeDeputies) {\r\n settings += '\\n';\r\n }\r\n settings += '{$UI_KrNotification_ExcludeSubscribers}';\r\n }\r\n\r\n return settings;\r\n }\r\n\r\n}","import {\r\n KrStageTypeFormatter,\r\n IKrStageTypeFormatterContext,\r\n StageTypeHandlerDescriptor,\r\n registrationDescriptor\r\n} from 'tessa/workflow/krProcess';\r\n\r\nexport class RegistrationStageTypeFormater extends KrStageTypeFormatter {\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [registrationDescriptor];\r\n }\r\n\r\n public format(context: IKrStageTypeFormatterContext) {\r\n super.format(context);\r\n context.displaySettings =\r\n context.stageRow.tryGet('KrRegistrationStageSettingsVirtual__Comment') || '';\r\n }\r\n}\r\n","import {\r\n KrStageTypeFormatter,\r\n IKrStageTypeFormatterContext,\r\n StageTypeHandlerDescriptor,\r\n typedTaskDescriptor\r\n} from 'tessa/workflow/krProcess';\r\nimport { plainColumnName } from 'tessa/workflow';\r\n\r\nexport class TypedTaskStageTypeFormatter extends KrStageTypeFormatter {\r\n private _taskTypeCaption = plainColumnName('KrTypedTaskSettingsVirtual', 'TaskTypeCaption');\r\n private _taskDigest = plainColumnName('KrTypedTaskSettingsVirtual', 'TaskDigest');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [typedTaskDescriptor];\r\n }\r\n\r\n public format(context: IKrStageTypeFormatterContext) {\r\n super.format(context);\r\n\r\n const settings = context.stageRow.getStorage();\r\n const buidler = { text: '' };\r\n\r\n this.appendString(buidler, settings, this._taskTypeCaption, '', true);\r\n this.appendString(buidler, settings, this._taskDigest, '', true, false, 30);\r\n\r\n context.displaySettings = buidler.text;\r\n }\r\n}\r\n","import {\r\n KrStageTypeFormatter,\r\n IKrStageTypeFormatterContext,\r\n StageTypeHandlerDescriptor,\r\n universalTaskDescriptor\r\n} from 'tessa/workflow/krProcess';\r\nimport { plainColumnName } from 'tessa/workflow';\r\n\r\nexport class UniversalTaskStageTypeFormatter extends KrStageTypeFormatter {\r\n private _kindCaption = plainColumnName('KrUniversalTaskSettingsVirtual', 'KindCaption');\r\n private _digest = plainColumnName('KrUniversalTaskSettingsVirtual', 'Digest');\r\n\r\n public descriptors(): StageTypeHandlerDescriptor[] {\r\n return [universalTaskDescriptor];\r\n }\r\n\r\n public format(context: IKrStageTypeFormatterContext) {\r\n super.format(context);\r\n\r\n const settings = context.stageRow.getStorage();\r\n const buidler = { text: '' };\r\n\r\n this.appendString(buidler, settings, this._kindCaption, '', true);\r\n this.appendString(buidler, settings, this._digest, '', true, false, 30);\r\n\r\n context.displaySettings = buidler.text;\r\n }\r\n}\r\n","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { GlobalButtonsInitalizationExtension } from './initialization/globalButtonsInitalizationExtension';\r\nExtensionContainer.instance.registerExtension({\r\n extension: GlobalButtonsInitalizationExtension,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\n\r\n// Requests\r\nimport {\r\n KrCardStoreExtension,\r\n KrClientCommandCustomExtension,\r\n KrClientCommandStoreExtension\r\n} from './requests';\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrCardStoreExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrClientCommandCustomExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrClientCommandStoreExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\n\r\n// Commands\r\nimport './commandInterpreter/registrator';\r\n\r\n// Formatters\r\nimport {\r\n KrEditStageTypeFormatter,\r\n KrApprovalStageTypeFormatter,\r\n KrChangeStateStageTypeFormatter,\r\n KrCreateCardStageTypeFormatter,\r\n KrResolutionStageTypeFormatter,\r\n KrSigningStageTypeFormatter,\r\n KrProcessManagementStageTypeFormatter,\r\n RegistrationStageTypeFormater,\r\n TypedTaskStageTypeFormatter,\r\n UniversalTaskStageTypeFormatter,\r\n NotificationStageTypeFormatter,\r\n AddFileFromTemplateStageTypeFormatter,\r\n DialogsStageTypeFormatter\r\n} from './formatters';\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrEditStageTypeFormatter,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrApprovalStageTypeFormatter,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrChangeStateStageTypeFormatter,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrCreateCardStageTypeFormatter,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrResolutionStageTypeFormatter,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrSigningStageTypeFormatter,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: KrProcessManagementStageTypeFormatter,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: RegistrationStageTypeFormater,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: TypedTaskStageTypeFormatter,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: UniversalTaskStageTypeFormatter,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: NotificationStageTypeFormatter,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: AddFileFromTemplateStageTypeFormatter,\r\n stage: ExtensionStage.AfterPlatform\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: DialogsStageTypeFormatter,\r\n stage: ExtensionStage.AfterPlatform\r\n});","import { reaction } from 'mobx';\r\nimport { CardRow, CardFieldChangedEventArgs, CardSection, CardRowState} from 'tessa/cards';\r\nimport { IBlockViewModel, IFormViewModel } from 'tessa/ui/cards';\r\nimport { TaskViewModel } from 'tessa/ui/cards/tasks';\r\nimport { Visibility, DotNetType } from 'tessa/platform';\r\nimport { ArrayStorage } from 'tessa/platform/storage';\r\n\r\nexport class WfResolutionTaskInfo {\r\n\r\n //#region ctor\r\n\r\n constructor(\r\n control: TaskViewModel,\r\n hasChildren: boolean,\r\n hasIncompleteChildren: boolean\r\n ) {\r\n this.control = control;\r\n this.hasChildren = hasChildren;\r\n this.hasIncompleteChildren = hasIncompleteChildren;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region fields\r\n\r\n private resolutionSection: CardSection | null = null;\r\n\r\n private performersRows: CardRow[] | null = null;\r\n\r\n private performersReaction: Function | null = null;\r\n\r\n private cachedForMainInfoForm: IFormViewModel | null = null;\r\n\r\n private cachedMainInfoBlock: IBlockViewModel | null = null;\r\n\r\n private cachedForPerformersForm: IFormViewModel | null = null;\r\n\r\n private cachedPerformersBlock: IBlockViewModel | null = null;\r\n\r\n private massCreationWasReset: boolean = false;\r\n\r\n //#endregion\r\n\r\n //#region props\r\n\r\n public readonly control: TaskViewModel;\r\n\r\n public readonly hasChildren: boolean;\r\n\r\n public readonly hasIncompleteChildren: boolean;\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n public update() {\r\n this.updateWithControl();\r\n this.updateShowAdditionalControls();\r\n this.updateMassCreation();\r\n this.updateIncompleteChildResolutionsControls();\r\n\r\n const rows = this.performersRows\r\n ? this.performersRows.filter(x => x.state !== CardRowState.Deleted)\r\n : [];\r\n this.updateMultiplePerformersControls(rows);\r\n }\r\n\r\n public unsubscribe() {\r\n this.unsubscribeFromResolutionSection();\r\n this.unsubscribeFromPerformers();\r\n }\r\n\r\n private static setControlVisibility(block: IBlockViewModel, suffix: string, isVisible: boolean) {\r\n for (let control of block.controls) {\r\n if (control.name && control.name.endsWith(suffix)) {\r\n const controlIsVisible = control.controlVisibility === Visibility.Visible;\r\n if (controlIsVisible !== isVisible) {\r\n control.controlVisibility = isVisible ? Visibility.Visible : Visibility.Collapsed;\r\n }\r\n }\r\n }\r\n }\r\n\r\n private tryGetMainInfoBlock(): IBlockViewModel | null {\r\n const form = this.control.taskWorkspace.form;\r\n if (!form) {\r\n return null;\r\n }\r\n\r\n if (this.cachedForMainInfoForm === form) {\r\n return this.cachedMainInfoBlock;\r\n }\r\n\r\n this.cachedForMainInfoForm = form;\r\n return this.cachedMainInfoBlock = form.blocks.find(x => x.name === 'MainInfo')!;\r\n }\r\n\r\n private tryGetPerformersBlock(): IBlockViewModel | null {\r\n const form = this.control.taskWorkspace.form;\r\n if (!form) {\r\n return null;\r\n }\r\n\r\n if (this.cachedForPerformersForm === form) {\r\n return this.cachedPerformersBlock;\r\n }\r\n\r\n this.cachedForPerformersForm = form;\r\n return this.cachedPerformersBlock = form.blocks.find(x => x.name === 'Performers')!;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region ResolutionSection\r\n\r\n public subscribeToResolutionSectionAndUpdate(section: CardSection) {\r\n this.unsubscribeFromResolutionSection();\r\n\r\n section.fields.fieldChanged.add(this.resolutionFieldChangedHandler);\r\n\r\n this.resolutionSection = section;\r\n\r\n this.updateWithControl();\r\n this.updateShowAdditionalControls();\r\n this.updateMassCreation();\r\n this.updateIncompleteChildResolutionsControls();\r\n }\r\n\r\n public unsubscribeFromResolutionSection() {\r\n if (this.resolutionSection) {\r\n this.resolutionSection.fields.fieldChanged.remove(this.resolutionFieldChangedHandler);\r\n this.resolutionSection = null;\r\n }\r\n }\r\n\r\n private resolutionFieldChangedHandler = (e: CardFieldChangedEventArgs) => {\r\n switch (e.fieldName) {\r\n case 'WithControl':\r\n this.updateWithControl();\r\n break;\r\n\r\n case 'ShowAdditional':\r\n this.updateShowAdditionalControls();\r\n break;\r\n\r\n case 'MassCreation':\r\n this.updateMassCreation();\r\n break;\r\n }\r\n }\r\n\r\n private updateWithControl() {\r\n if (!this.resolutionSection) {\r\n return;\r\n }\r\n\r\n const mainInfoBlock = this.tryGetMainInfoBlock();\r\n if (mainInfoBlock) {\r\n const withControl = this.resolutionSection.fields.tryGet('WithControl', false);\r\n WfResolutionTaskInfo.setControlVisibility(mainInfoBlock, '_WithControl', withControl);\r\n }\r\n }\r\n\r\n private updateShowAdditionalControls() {\r\n if (!this.resolutionSection) {\r\n return;\r\n }\r\n\r\n const mainInfoBlock = this.tryGetMainInfoBlock();\r\n if (mainInfoBlock) {\r\n const showAdditional = this.resolutionSection.fields.tryGet('ShowAdditional', false);\r\n WfResolutionTaskInfo.setControlVisibility(mainInfoBlock, '_Additional', showAdditional);\r\n }\r\n }\r\n\r\n private updateMassCreation() {\r\n if (!this.resolutionSection) {\r\n return;\r\n }\r\n\r\n const massCreation = this.resolutionSection.fields.tryGet('MassCreation', false);\r\n if (!massCreation) {\r\n this.resolutionSection.fields.set('MajorPerformer', false, DotNetType.Boolean);\r\n }\r\n\r\n const performersBlock = this.tryGetPerformersBlock();\r\n if (performersBlock) {\r\n WfResolutionTaskInfo.setControlVisibility(performersBlock, '_MassCreation', massCreation);\r\n }\r\n }\r\n\r\n private updateIncompleteChildResolutionsControls() {\r\n if (!this.resolutionSection) {\r\n return;\r\n }\r\n\r\n const mainInfoBlock = this.tryGetMainInfoBlock();\r\n if (mainInfoBlock) {\r\n WfResolutionTaskInfo.setControlVisibility(mainInfoBlock, '_ChildResolutions', this.hasIncompleteChildren);\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n //#region PerformersRows\r\n\r\n public subscribeToPerformersAndUpdate(performersRows: ArrayStorage) {\r\n this.unsubscribeFromPerformers();\r\n\r\n this.performersRows = performersRows;\r\n this.performersReaction = reaction(\r\n () => performersRows.filter(x => x.state !== CardRowState.Deleted),\r\n (rows) => this.updateMultiplePerformersControls(rows)\r\n );\r\n }\r\n\r\n public unsubscribeFromPerformers() {\r\n if (this.performersReaction) {\r\n this.performersReaction();\r\n this.performersRows = null;\r\n this.performersReaction = null;\r\n }\r\n }\r\n\r\n private updateMultiplePerformersControls(performersRows: CardRow[]) {\r\n const performersBlock = this.tryGetPerformersBlock();\r\n if (performersBlock) {\r\n // хотя бы два элемента\r\n const hasMultiplePerformers = performersRows.length > 1;\r\n WfResolutionTaskInfo.setControlVisibility(performersBlock, '_MultiplePerformers', hasMultiplePerformers);\r\n\r\n // сбрасываем значение галки \"Отправить каждому исполнителю\" при её скрытии\r\n if (this.resolutionSection) {\r\n if (hasMultiplePerformers) {\r\n if (this.massCreationWasReset) {\r\n // TODO: тут нужно получать дефолтные настройки из KrSettings\r\n // пока не понятно откуда их взять\r\n // Сейчас дефолтное значение соответсвует WfMultiplePerformersDefaults.CreateMultipleTasks\r\n this.resolutionSection.fields.set('MassCreation', true, DotNetType.Boolean);\r\n this.resolutionSection.fields.set('MajorPerformer', false, DotNetType.Boolean);\r\n\r\n this.massCreationWasReset = false;\r\n }\r\n } else {\r\n this.resolutionSection.fields.set('MassCreation', false, DotNetType.Boolean);\r\n this.resolutionSection.fields.set('MajorPerformer', false, DotNetType.Boolean);\r\n this.massCreationWasReset = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n //#endregion\r\n\r\n}","import { WfResolutionTaskInfo } from './wfResolutionTaskInfo';\r\nimport {\r\n UIContext,\r\n IUIContext,\r\n tryGetFromInfo,\r\n showConfirmWithCancel,\r\n MenuAction,\r\n SeparatorMenuAction\r\n} from 'tessa/ui';\r\nimport {\r\n CardUIExtension,\r\n ICardUIExtensionContext,\r\n CardSavingRequest,\r\n CardSavingMode,\r\n ICardEditorModel,\r\n ICardModel,\r\n IBlockViewModel,\r\n CardEditorOperationType,\r\n CardToolbarAction\r\n} from 'tessa/ui/cards';\r\nimport { DefaultFormTabWithTasksViewModel } from 'tessa/ui/cards/forms';\r\nimport {\r\n TaskViewModel,\r\n TaskWorkspaceState,\r\n TaskViewModelEventArgs,\r\n TaskFormContentViewModelEventArgs\r\n} from 'tessa/ui/cards/tasks';\r\nimport { LabelViewModel, FileListViewModel, FileTagViewModel } from 'tessa/ui/cards/controls';\r\nimport { createTypedField, DotNetType, Visibility, unseal, deepClone } from 'tessa/platform';\r\nimport { ArrayStorage, MapStorage, clone } from 'tessa/platform/storage';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { CardSection, CardRow, CardRowState } from 'tessa/cards';\r\nimport { CardType, CardTypeForm } from 'tessa/cards/types';\r\nimport { CardMetadata, CardMetadataSection } from 'tessa/cards/metadata';\r\nimport { taskTypeIsResolution } from 'tessa/workflow';\r\n\r\nconst WfTaskCardTypeId = 'de75a343-8164-472d-a20e-4937819760ac';\r\nconst MainCardCategoryId = 'ef065661-6613-4c87-bf93-0e1dd558a751';\r\n\r\n/**\r\n * Расширение для модификации UI карточки и заданий в соответствии с бизнес-процессами Workflow.\r\n */\r\nexport class WfCardUIExtension extends CardUIExtension {\r\n //#region fields\r\n\r\n private _disposes: (Function | null)[] = [];\r\n\r\n //#endregion\r\n\r\n //#region CardUIExtension\r\n\r\n public initialized(context: ICardUIExtensionContext) {\r\n // если нет ни одного задания резолюции в истории, то выходим\r\n const isTaskCard = context.model.cardType.id === WfTaskCardTypeId;\r\n const taskHistory = context.model.tryGetTaskHistory();\r\n if (\r\n !taskHistory ||\r\n (!isTaskCard &&\r\n taskHistory.rows.every(x => !!x.parentRowId || !taskTypeIsResolution(x.typeId)))\r\n ) {\r\n return;\r\n }\r\n\r\n if (isTaskCard) {\r\n // если предыдущая карточка отличалась от карточки-сателлита задачи (т.е. была основной карточкой), то не переносим состояние контролов\r\n // (например, группировку файлов) в открываемую карточку\r\n const editor = context.uiContext.cardEditor;\r\n if (editor && editor.cardModel && editor.cardModel.cardType.id !== WfTaskCardTypeId) {\r\n context.model.stateIsInitialized = true;\r\n }\r\n\r\n let typeCaption = '';\r\n const task = context.card.tasks[0];\r\n if (task) {\r\n typeCaption = task.typeCaption;\r\n } else {\r\n const historyItem = context.card.taskHistory[0];\r\n typeCaption = historyItem ? historyItem.typeCaption : '';\r\n }\r\n\r\n if (typeCaption && context.model.forms.length > 0) {\r\n context.model.forms[0].tabCaption = typeCaption;\r\n }\r\n\r\n // ссылка \"вернуться в карточку\"\r\n const navigateMainCard = context.model.controls.get('NavigateMainCard') as LabelViewModel;\r\n if (navigateMainCard) {\r\n navigateMainCard.controlVisibility = Visibility.Collapsed;\r\n const toolbarAction = new CardToolbarAction({\r\n name: 'NavigateMainCard',\r\n caption: navigateMainCard.text,\r\n toolTip: navigateMainCard.tooltip,\r\n icon: '',\r\n command: () => WfCardUIExtension.taskCardNavigateAction()\r\n });\r\n context.toolbar.clearItems();\r\n context.toolbar.addItem(toolbarAction);\r\n }\r\n\r\n const taskFiles = context.model.controls.get('TaskFiles') as FileListViewModel;\r\n if (taskFiles) {\r\n if (taskFiles.isCategoriesEnabled) {\r\n const prevFilter = taskFiles.categoryFilter;\r\n if (!prevFilter) {\r\n taskFiles.categoryFilter = async categories => {\r\n return categories.filter(x => !x || x.id !== MainCardCategoryId);\r\n };\r\n } else {\r\n taskFiles.categoryFilter = async categories => {\r\n const cats = (await prevFilter(categories)) || [];\r\n return cats.filter(x => !x || x.id !== MainCardCategoryId);\r\n };\r\n }\r\n }\r\n\r\n // делаем группу \"Файлы карточки\" всегда первой\r\n taskFiles.groupSorting = groups => {\r\n groups.forEach(group => {\r\n if (group.caption === '$WfResolution_MainCardFileCategory') {\r\n group.order = -10;\r\n }\r\n });\r\n };\r\n\r\n // теги-иконки для файлов от этой задачи\r\n for (let file of taskFiles.files) {\r\n const cardFile = context.card.files.find(x => x.rowId === file.id);\r\n if (!cardFile || !cardFile.externalSource) {\r\n file.tag = new FileTagViewModel('ta icon-thin-020', 'rgba(0, 176, 0, 0.19)');\r\n }\r\n }\r\n\r\n this._disposes.push(\r\n taskFiles.containerFileAdding.addWithDispose(e => {\r\n // если создаётся копия файла из виртуальных файлов карточки, то надо сбросить категорию файла на \"Без категории\";\r\n // если выполняется копирование файла в основную карточку, то меняется категория, но Origin остаётся как null\r\n const file = e.file;\r\n let categoryIsMainCard = !!file.category && file.category.id === MainCardCategoryId;\r\n if (categoryIsMainCard && file.origin) {\r\n file.category = null;\r\n file.origin = null;\r\n file.info['CopiedToMainCard'] = createTypedField(true, DotNetType.Boolean);\r\n categoryIsMainCard = false;\r\n }\r\n })\r\n );\r\n\r\n this._disposes.push(\r\n taskFiles.containerFileAdded.addWithDispose(e => {\r\n const file = e.file;\r\n let categoryIsMainCard = !!file.category && file.category.id === MainCardCategoryId;\r\n if (!categoryIsMainCard) {\r\n const fileViewModel = e.control.files.find(x => x.id === file.id);\r\n if (fileViewModel) {\r\n fileViewModel.tag = new FileTagViewModel(\r\n 'ta icon-thin-020',\r\n 'rgba(0, 176, 0, 0.19)'\r\n );\r\n }\r\n }\r\n })\r\n );\r\n }\r\n } else {\r\n // открывается карточка, отличная от сателлита, причём в Info присутствует сохранённый State от основной карточки\r\n // (до того, как мы ушли в сателлит), поэтому восстанавливаем состояние\r\n const editor = context.uiContext.cardEditor!;\r\n const mainFormState = tryGetFromInfo(editor.info, 'MainCardState', null);\r\n if (mainFormState) {\r\n context.model.mainForm!.setState(mainFormState);\r\n context.model.stateIsInitialized = true;\r\n\r\n // восстанавливаем его только один раз\r\n delete editor.info['MainCardState'];\r\n }\r\n context.toolbar.removeItemIfExists('NavigateMainCard');\r\n }\r\n\r\n // добавляем обработчики, связанные с отображением задания резолюции и его кнопок\r\n if (\r\n !context.model.inSpecialMode &&\r\n context.model.mainForm instanceof DefaultFormTabWithTasksViewModel\r\n ) {\r\n context.model.mainForm.tasks.forEach(task => {\r\n if (taskTypeIsResolution(task.taskModel.cardType.id!)) {\r\n const taskInfo = WfCardUIExtension.createTaskInfo(task);\r\n\r\n WfCardUIExtension.modifyResolutionTask(taskInfo, context.model, isTaskCard, true);\r\n this._disposes.push(\r\n task.workspaceChanged.addWithDispose(() => {\r\n WfCardUIExtension.modifyResolutionTask(taskInfo, context.model, isTaskCard, false);\r\n })\r\n );\r\n\r\n this._disposes.push(() => taskInfo.unsubscribe());\r\n\r\n this._disposes.push(\r\n task.postponeMetadataInitializing.addWithDispose(\r\n WfCardUIExtension.postponeMetadataInitializing\r\n )\r\n );\r\n this._disposes.push(\r\n task.postponeContentInitializing.addWithDispose(\r\n WfCardUIExtension.postponeContentInitializing\r\n )\r\n );\r\n }\r\n });\r\n }\r\n\r\n if (!isTaskCard) {\r\n taskHistory.contextMenuGenerators.push(ctx => {\r\n if (!context.model.inSpecialMode && taskTypeIsResolution(ctx.historyItem.model.typeId)) {\r\n const fileCount = tryGetFromInfo(ctx.historyItem.model.info, 'FileCount', 0);\r\n\r\n ctx.menuActions.splice(\r\n 0,\r\n 0,\r\n new MenuAction(\r\n 'WfResolution_NavigateTaskCard',\r\n fileCount > 0\r\n ? LocalizationManager.instance.format(\r\n '$WfTaskFiles_ShowFilesTagCount_ContextMenu',\r\n fileCount\r\n )\r\n : '$WfTaskFiles_ShowFilesTag_ContextMenu',\r\n null,\r\n () => WfCardUIExtension.taskCardNavigateAction(ctx.historyItem.model.rowId)\r\n ),\r\n new SeparatorMenuAction(false, 'WfResolution_Visualize_Separator')\r\n );\r\n }\r\n });\r\n\r\n taskHistory.rows.forEach(item => {\r\n let fileCount;\r\n if (\r\n taskTypeIsResolution(item.model.typeId) &&\r\n (fileCount = item.model.info['FileCount']) &&\r\n fileCount.$value > 0\r\n ) {\r\n item.setTag(\r\n 'icon-thin-043',\r\n LocalizationManager.instance.format(\r\n context.model.inSpecialMode\r\n ? '$WfTaskFiles_FilesTagCount_ToolTip'\r\n : '$WfTaskFiles_ShowFilesTagCount_ToolTip',\r\n fileCount.$value\r\n ),\r\n context.model.inSpecialMode\r\n ? () => {}\r\n : () => WfCardUIExtension.taskCardNavigateAction(item.rowId)\r\n );\r\n }\r\n });\r\n }\r\n }\r\n\r\n public reopening(context: ICardUIExtensionContext) {\r\n const editor = context.uiContext.cardEditor;\r\n if (!editor || !context.getRequest) {\r\n return;\r\n }\r\n\r\n if (context.model.cardType.id !== WfTaskCardTypeId) {\r\n // если была открыта не карточка-сателлит, а другая карточка, и сейчас открывается карточка-сателлит,\r\n // то сохраним информацию по выбранной вкладке и прочим параметрам для основной карточки, чтобы потом мы смогли всё восстановить\r\n if (context.getRequest.cardTypeId === WfTaskCardTypeId) {\r\n editor.info['MainCardState'] = context.model.mainForm!.getState();\r\n }\r\n } else if (editor.currentOperationType === CardEditorOperationType.SaveAndRefresh) {\r\n // если была открыта карточка-сателлит, то при её рефреше сразу после сохранения с завершением задания\r\n // мы будем загружать основную карточку, а не сателлит\r\n const storeResponse = editor.lastData.storeResponse;\r\n let responseCardId;\r\n\r\n if (\r\n storeResponse &&\r\n !!(responseCardId = tryGetFromInfo(storeResponse.info, 'NextCardID', null))\r\n ) {\r\n // открываем основную карточку вместо карточки задания, если было завершено задание (про это знает серверное расширение)\r\n context.getRequest.cardId = responseCardId;\r\n context.getRequest.cardTypeId = tryGetFromInfo(storeResponse.info, 'NextCardTypeID', null);\r\n context.getRequest.cardTypeName = null;\r\n }\r\n }\r\n }\r\n\r\n public finalized() {\r\n for (let dispose of this._disposes) {\r\n if (dispose) {\r\n dispose();\r\n }\r\n }\r\n this._disposes.length = 0;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n private static createTaskInfo(taskViewModel: TaskViewModel): WfResolutionTaskInfo {\r\n const taskCard = taskViewModel.taskModel.cardTask!.tryGetCard();\r\n\r\n let childrenSection: CardSection;\r\n let childrenRows!: ArrayStorage;\r\n const hasChildren =\r\n !!taskCard &&\r\n !!taskCard.tryGetSections() &&\r\n !!(childrenSection = taskCard.sections.get('WfResolutionChildrenVirtual')!) &&\r\n !!(childrenRows = childrenSection.tryGetRows()!) &&\r\n childrenSection.rows.length > 0;\r\n\r\n const hasIncompleteChildren =\r\n hasChildren &&\r\n childrenRows.some(x => x.state !== CardRowState.Deleted && !x.tryGetField('Completed'));\r\n\r\n return new WfResolutionTaskInfo(taskViewModel, hasChildren, hasIncompleteChildren);\r\n }\r\n\r\n private static modifyResolutionTask(\r\n taskInfo: WfResolutionTaskInfo,\r\n model: ICardModel,\r\n isTaskCard: boolean,\r\n subscribeToTaskModel: boolean\r\n ) {\r\n const taskViewModel = taskInfo.control;\r\n\r\n if (!model.inSpecialMode) {\r\n const workspaceState = taskViewModel.taskWorkspace.state;\r\n\r\n taskViewModel.taskWorkspace.setTag('icon-thin-043', () => {\r\n WfCardUIExtension.taskCardNavigateAction(taskViewModel.taskModel.cardTask!.rowId);\r\n });\r\n\r\n if (\r\n isTaskCard ||\r\n workspaceState === TaskWorkspaceState.Locked ||\r\n workspaceState === TaskWorkspaceState.LockedForAuthor ||\r\n workspaceState === TaskWorkspaceState.UnlockedForAuthor ||\r\n workspaceState === TaskWorkspaceState.Initial ||\r\n workspaceState === TaskWorkspaceState.DefaultForm\r\n ) {\r\n if (isTaskCard) {\r\n taskViewModel.taskWorkspace.setLink('$WfTaskFiles_ReturnFromFilesLink', () => {\r\n WfCardUIExtension.taskCardNavigateAction(taskViewModel.taskModel.cardTask!.rowId);\r\n });\r\n } else {\r\n const fileCount = tryGetFromInfo(\r\n taskViewModel.taskModel.cardTask!.info,\r\n 'FileCount',\r\n 0\r\n );\r\n if (fileCount > 0) {\r\n const message = LocalizationManager.instance.format(\r\n '$WfTaskFiles_ShowFilesLinkTemplate',\r\n fileCount\r\n );\r\n taskViewModel.taskWorkspace.setLink(message, () => {\r\n WfCardUIExtension.taskCardNavigateAction(taskViewModel.taskModel.cardTask!.rowId);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n const form = taskViewModel.taskWorkspace.form;\r\n let childResolutions!: IBlockViewModel;\r\n // скрываем таблицу с дочерними резолюциями, если таких резолюций нет\r\n if (\r\n form &&\r\n !taskInfo.hasChildren &&\r\n !!(childResolutions = form.blocks.find(x => x.name === 'ChildResolutions')!)\r\n ) {\r\n childResolutions.blockVisibility = Visibility.Collapsed;\r\n }\r\n\r\n if (subscribeToTaskModel) {\r\n const taskCard = taskViewModel.taskModel.cardTask!.tryGetCard();\r\n let taskSections!: MapStorage;\r\n if (taskCard && !!(taskSections = taskCard.tryGetSections()!)) {\r\n const resolutionSection = taskSections.get('WfResolutions');\r\n if (resolutionSection) {\r\n taskInfo.subscribeToResolutionSectionAndUpdate(resolutionSection);\r\n }\r\n\r\n const performersSection = taskSections.get('WfResolutionPerformers');\r\n if (performersSection) {\r\n taskInfo.subscribeToPerformersAndUpdate(performersSection.rows);\r\n }\r\n }\r\n } else {\r\n taskInfo.update();\r\n }\r\n }\r\n\r\n private static taskCardNavigateAction = async (taskRowId?: guid) => {\r\n const context = UIContext.current;\r\n const editor = context.cardEditor;\r\n\r\n if (!editor || !editor.cardModel) {\r\n return;\r\n }\r\n\r\n const model = editor.cardModel;\r\n\r\n if (model.hasChanges()) {\r\n const result = await showConfirmWithCancel('$WfTaskFiles_SaveChangesConfirmation');\r\n if (result === null) {\r\n return;\r\n }\r\n\r\n if (result) {\r\n const success = await editor.saveCard(\r\n context,\r\n {},\r\n new CardSavingRequest(CardSavingMode.KeepPreviousCard)\r\n );\r\n if (success) {\r\n WfCardUIExtension.beginTaskCardNavigateAction(taskRowId, model, editor, context);\r\n }\r\n\r\n return;\r\n }\r\n }\r\n\r\n WfCardUIExtension.beginTaskCardNavigateAction(taskRowId, model, editor, context);\r\n };\r\n\r\n private static beginTaskCardNavigateAction(\r\n taskRowId: guid | null | undefined,\r\n model: ICardModel,\r\n editor: ICardEditorModel,\r\n context: IUIContext\r\n ) {\r\n if (model.cardType.id === WfTaskCardTypeId) {\r\n const section = model.card.sections.get('Satellites')!;\r\n const mainCardId = section.fields.get('MainCardID');\r\n\r\n if (mainCardId) {\r\n const info = {};\r\n\r\n const permissionsCalculated = model.card.info['kr_permissions_calculated'];\r\n // tslint:disable-next-line:triple-equals\r\n if (permissionsCalculated != undefined) {\r\n info['kr_permissions_calculated'] = permissionsCalculated;\r\n info['kr_calculate_permissions'] = permissionsCalculated;\r\n }\r\n\r\n editor.openCard({\r\n cardId: mainCardId,\r\n context,\r\n info\r\n });\r\n }\r\n } else if (taskRowId) {\r\n const info = {};\r\n info['.digest'] = createTypedField(model.digest, DotNetType.String);\r\n\r\n const permissionsCalculated = model.card.info['kr_permissions_calculated'];\r\n // tslint:disable-next-line:triple-equals\r\n if (permissionsCalculated != undefined) {\r\n info['kr_permissions_calculated'] = permissionsCalculated;\r\n }\r\n\r\n editor.openCard({\r\n cardId: taskRowId,\r\n cardTypeId: 'de75a343-8164-472d-a20e-4937819760ac',\r\n cardTypeName: 'WfTaskCard',\r\n context,\r\n info\r\n });\r\n }\r\n }\r\n\r\n private static postponeMetadataInitializing(e: TaskViewModelEventArgs) {\r\n const targetMetadata = unseal(e.task.postponeMetadata);\r\n const targetType = targetMetadata.cardTypes[0];\r\n const targetForm = targetType.forms[0];\r\n const targetBlocks = targetForm.blocks;\r\n\r\n // удаляем блок с информацией по заданию, т.к. он будет скопирован ниже из основной формы\r\n if (targetBlocks.length > 0) {\r\n targetBlocks.splice(0, 1);\r\n }\r\n\r\n // копируем все блоки из основной формы задания в начало формы откладывания, потом сортируем по Order\r\n const sourceType = unseal(deepClone(e.task.taskModel.cardType));\r\n const sourceForm = sourceType as CardTypeForm;\r\n targetBlocks.splice(0, 0, ...sourceForm.blocks);\r\n let order = 0;\r\n for (let block of targetBlocks) {\r\n block.order = order;\r\n order++;\r\n }\r\n\r\n // копируем настройки формы из основной формы задания в форму откладывания\r\n targetForm.formSettings = clone(sourceForm.formSettings);\r\n\r\n // копируем метаинформацию по виртуальной таблице для формы откладывания\r\n const metadataSection = e.task.taskModel.cardMetadata.getSectionByName(\r\n 'WfResolutionChildrenVirtual'\r\n );\r\n if (metadataSection) {\r\n targetMetadata.sections.push(unseal(deepClone(metadataSection)));\r\n\r\n const sourceItem = sourceType.schemeItems.find(x => x.sectionId === metadataSection.id);\r\n if (sourceItem) {\r\n targetType.schemeItems.push(sourceItem);\r\n }\r\n }\r\n }\r\n\r\n private static postponeContentInitializing(e: TaskFormContentViewModelEventArgs) {\r\n const sourceSection = e.task.taskModel.card.sections.tryGet('WfResolutionChildrenVirtual');\r\n if (!sourceSection) {\r\n return;\r\n }\r\n\r\n const targetSection = e.card.sections.tryGet('WfResolutionChildrenVirtual');\r\n if (!targetSection) {\r\n return;\r\n }\r\n\r\n targetSection.setFrom(sourceSection);\r\n }\r\n\r\n //#endregion\r\n}\r\n","import { CardGetExtension, ICardGetExtensionContext } from 'tessa/cards/extensions';\r\nimport { Card, CardTask } from 'tessa/cards';\r\nimport { hasNotFlag } from 'tessa/platform';\r\nimport { CardTypeFlags } from 'tessa/cards/types';\r\nimport { taskTypeIsResolution } from 'tessa/workflow';\r\n\r\n/**\r\n * Загрузка карточки с управлением секциями заданий на клиенте.\r\n */\r\nexport class WfTasksClientGetExtension extends CardGetExtension {\r\n\r\n public afterRequest(context: ICardGetExtensionContext) {\r\n let card: Card;\r\n if (!context.requestIsSuccessful\r\n || !context.cardType\r\n || hasNotFlag(context.cardType.flags, CardTypeFlags.AllowTasks)\r\n || !context.response\r\n || !(card = context.response.tryGetCard()!)\r\n ) {\r\n return;\r\n }\r\n\r\n const tasks = card.tryGetTasks();\r\n if (tasks && tasks.length > 0) {\r\n for (let task of tasks) {\r\n if (taskTypeIsResolution(task.typeId)\r\n && !task.isLocked\r\n ) {\r\n WfTasksClientGetExtension.setResolutionFieldChanged(task);\r\n }\r\n }\r\n }\r\n }\r\n\r\n private static setResolutionFieldChanged(task: CardTask) {\r\n const taskCard = task.tryGetCard();\r\n if (!taskCard) {\r\n return;\r\n }\r\n\r\n const taskSections = taskCard.tryGetSections();\r\n if (!taskSections) {\r\n return;\r\n }\r\n\r\n const resolutionSection = taskSections.tryGet('WfResolutions');\r\n if (!resolutionSection) {\r\n return;\r\n }\r\n\r\n let fieldsChangingInClosure = false;\r\n resolutionSection.fields.fieldChanged.add(e => {\r\n if (fieldsChangingInClosure) {\r\n return;\r\n }\r\n\r\n switch (e.fieldName) {\r\n case 'Planned':\r\n fieldsChangingInClosure = true;\r\n e.storage.set('DurationInDays', null);\r\n fieldsChangingInClosure = false;\r\n break;\r\n case 'DurationInDays':\r\n fieldsChangingInClosure = true;\r\n e.storage.set('Planned', null);\r\n fieldsChangingInClosure = false;\r\n break;\r\n case 'ShowAdditional':\r\n if (!e.fieldValue) {\r\n e.storage.set('KindID', null);\r\n e.storage.set('KindCaption', null);\r\n e.storage.set('AuthorID', null);\r\n e.storage.set('AuthorName', null);\r\n }\r\n break;\r\n case 'WithControl':\r\n if (!e.fieldValue) {\r\n e.storage.set('ControllerID', null);\r\n e.storage.set('ControllerName', null);\r\n }\r\n break;\r\n }\r\n });\r\n }\r\n\r\n}","import {\r\n CardUIExtension,\r\n ICardUIExtensionContext,\r\n CardModelFlags,\r\n CardModelInitializingEventArgs\r\n} from 'tessa/ui/cards';\r\nimport { hasNotFlag } from 'tessa/platform';\r\n\r\nexport class WfTaskSatelliteUIExtension extends CardUIExtension {\r\n public initialized(context: ICardUIExtensionContext) {\r\n if (\r\n (context.model.inSpecialMode &&\r\n hasNotFlag(context.model.flags, CardModelFlags.EditTemplate) &&\r\n hasNotFlag(context.model.flags, CardModelFlags.ViewExported)) ||\r\n !context.uiContext.cardEditor\r\n ) {\r\n return;\r\n }\r\n\r\n const editor = context.uiContext.cardEditor;\r\n editor.cardModelInitialized.remove(WfTaskSatelliteUIExtension.onCardModelInitialized);\r\n if (context.model.cardType.id === 'de75a343-8164-472d-a20e-4937819760ac') {\r\n editor.cardModelInitialized.add(WfTaskSatelliteUIExtension.onCardModelInitialized);\r\n\r\n const taskHistory = context.model.tryGetTaskHistory();\r\n if (taskHistory) {\r\n taskHistory.hideOpenViewCommand = true;\r\n }\r\n }\r\n }\r\n\r\n public static async onCardModelInitialized(e: CardModelInitializingEventArgs) {\r\n const sections = e.cardModel.card.tryGetSections();\r\n if (!sections) {\r\n return;\r\n }\r\n\r\n const section = sections.tryGet('WfTaskCardsVirtual');\r\n const docTypeTitle = !!section ? section.fields.tryGet('DocTypeTitle') : null;\r\n\r\n if (!docTypeTitle) {\r\n e.workspaceInfo = docTypeTitle;\r\n }\r\n }\r\n}\r\n","import { CardUIExtension, ICardUIExtensionContext, IBlockViewModel } from 'tessa/ui/cards';\r\nimport { GridViewModel, GridRowAction } from 'tessa/ui/cards/controls';\r\nimport { DotNetType } from 'tessa/platform';\r\nimport { CardRow } from 'tessa/cards';\r\nimport { WfUiHelper } from './wfUiHelper';\r\n\r\nexport class WfTypeSettingsUIExtension extends CardUIExtension {\r\n public initialized(context: ICardUIExtensionContext) {\r\n const model = context.model;\r\n if (model.inSpecialMode) {\r\n return;\r\n }\r\n\r\n const cardTypeId = model.cardType.id;\r\n if (cardTypeId === '35a03878-57b6-4263-ae36-92eb59032132') {\r\n // KrSettingsTypeID\r\n const sections = model.card.tryGetSections();\r\n if (!sections) {\r\n return;\r\n }\r\n\r\n const cardTypesSection = sections.tryGet('KrSettingsCardTypes');\r\n const cardTypesControl = model.controls.get('CardTypeControl');\r\n if (!cardTypesSection || !cardTypesControl) {\r\n return;\r\n }\r\n\r\n // скрываем / отображаем контролы, связанные с использованием резолюции\r\n const cardTypesGrid = cardTypesControl as GridViewModel;\r\n cardTypesGrid.rowInvoked.add(e => {\r\n let resolutionsBlock: IBlockViewModel;\r\n if (\r\n (e.action === GridRowAction.Inserted || e.action === GridRowAction.Opening) &&\r\n e.rowModel &&\r\n (resolutionsBlock = e.rowModel.blocks.get('UseResolutionsBlock')!)\r\n ) {\r\n const useResolutionsAtFirst = e.row.get('UseResolutions');\r\n WfUiHelper.setControlVisibility(\r\n resolutionsBlock,\r\n '_UseResolutions',\r\n useResolutionsAtFirst\r\n );\r\n\r\n const dispose = e.row.fieldChanged.addWithDispose(e => {\r\n if (e.fieldName === 'UseResolutions') {\r\n const useResolutions = e.fieldValue;\r\n WfUiHelper.setControlVisibility(\r\n resolutionsBlock,\r\n '_UseResolutions',\r\n !!useResolutions\r\n );\r\n }\r\n });\r\n\r\n resolutionsBlock.form.closed.add(() => {\r\n if (dispose) {\r\n dispose();\r\n }\r\n });\r\n }\r\n });\r\n\r\n // сбрасываем состояние полей, когда галка \"использовать резолюции\" очищается\r\n const cardTypeRows = cardTypesSection.rows;\r\n for (let cardTypeRow of cardTypeRows) {\r\n WfTypeSettingsUIExtension.attachHandlersToCardTypeRow(cardTypeRow);\r\n }\r\n\r\n cardTypeRows.collectionChanged.add(e => {\r\n if (e.added) {\r\n for (let addedRow of e.added) {\r\n WfTypeSettingsUIExtension.attachHandlersToCardTypeRow(addedRow);\r\n }\r\n }\r\n });\r\n } else if (cardTypeId === 'b17f4f35-17e1-4509-994b-ebd576f2c95e') {\r\n // KrDocTypeTypeID\r\n const sections = model.card.tryGetSections();\r\n if (!sections) {\r\n return;\r\n }\r\n\r\n const docTypeSection = sections.tryGet('KrDocType');\r\n const resolutionsBlock = model.blocks.get('UseResolutionsBlock');\r\n if (!docTypeSection || !resolutionsBlock) {\r\n return;\r\n }\r\n\r\n // скрываем / отображаем контролы, связанные с использованием резолюции\r\n const useResolutionsAtFirst = docTypeSection.fields.get('UseResolutions');\r\n WfUiHelper.setControlVisibility(resolutionsBlock, '_UseResolutions', useResolutionsAtFirst);\r\n\r\n docTypeSection.fields.fieldChanged.add(e => {\r\n if (e.fieldName === 'UseResolutions') {\r\n // сбрасываем состояние полей, когда галка \"использовать резолюции\" очищается\r\n const useResolutions = e.fieldValue;\r\n if (!useResolutions) {\r\n e.storage.set('DisableChildResolutionDateCheck', false, DotNetType.Boolean);\r\n }\r\n\r\n // скрываем / отображаем контролы, связанные с использованием резолюции\r\n WfUiHelper.setControlVisibility(resolutionsBlock, '_UseResolutions', !!useResolutions);\r\n }\r\n });\r\n }\r\n }\r\n\r\n private static attachHandlersToCardTypeRow(cardTypeRow: CardRow) {\r\n cardTypeRow.fieldChanged.add(e => {\r\n if (e.fieldName === 'UseResolutions' && !e.fieldValue) {\r\n e.storage.set('DisableChildResolutionDateCheck', false, DotNetType.Boolean);\r\n }\r\n });\r\n }\r\n}\r\n","import { UIContext } from 'tessa/ui';\r\nimport { TileExtension, ITileGlobalExtensionContext, Tile, TileGroups,\r\n enableWhenVisibleInCardHandler, TileHotkey, ITileLocalExtensionContext, TileEvaluationEventArgs} from 'tessa/ui/tiles';\r\nimport { CardStoreMode } from 'tessa/cards';\r\nimport { createTypedField, DotNetType } from 'tessa/platform';\r\n\r\n/**\r\n * Плитки для бизнес-процессов Workflow.\r\n */\r\nexport class WfTileExtension extends TileExtension {\r\n\r\n public initializingGlobal(context: ITileGlobalExtensionContext) {\r\n const panel = context.workspace.leftPanel;\r\n const contextSource = panel.contextSource;\r\n\r\n panel.tiles.push(\r\n new Tile({\r\n name: 'WfCreateResolution',\r\n caption: '$WfTiles_CreateResolution',\r\n icon: 'ta icon-thin-091',\r\n contextSource,\r\n command: WfTileExtension.createWfResolutionAction,\r\n group: TileGroups.Cards,\r\n order: 50,\r\n evaluating: enableWhenVisibleInCardHandler,\r\n toolTip: '$WfTiles_CreateResolution_ToolTip'\r\n })\r\n );\r\n }\r\n\r\n public initializingLocal(context: ITileLocalExtensionContext) {\r\n const panel = context.workspace.leftPanel;\r\n const panelContext = panel.context;\r\n if (!panelContext.cardEditor || !panelContext.cardEditor.cardModel) {\r\n return;\r\n }\r\n\r\n const hotkeyStorage = panel.contextSource.hotkeyStorage;\r\n\r\n const createResolution = panel.tryGetTile('WfCreateResolution');\r\n if (createResolution) {\r\n hotkeyStorage.addTileHotkey(new TileHotkey(createResolution, 'Alt+R', 'KeyR', {alt: true}));\r\n }\r\n\r\n const notificationSubscriptions = panel.tryGetTile('NotificationSubscriptions');\r\n if (notificationSubscriptions) {\r\n notificationSubscriptions.evaluating.add(WfTileExtension.enableOnCardIsNotTaskCard);\r\n }\r\n\r\n const createFileTemplate = panel.tryGetTile('CreateFileFromTemplate');\r\n if (createFileTemplate) {\r\n createFileTemplate.evaluating.add(WfTileExtension.enableOnCardIsNotTaskCard);\r\n }\r\n\r\n // const copyLink = panel.tryGetTile('CopyCardLink');\r\n // if (copyLink) {\r\n // copyLink.evaluating.add(e => {\r\n // const editor = e.currentTile.context.cardEditor;\r\n // e.setIsEnabledWithCollapsing(e.currentTile,\r\n // !!editor\r\n // && !!editor.cardModel\r\n // && (editor.cardModel.cardType.id !== 'de75a343-8164-472d-a20e-4937819760ac' // WfTaskCard\r\n // || tryGetFromInfo(editor.cardModel.card.tryGetInfo()!, 'VirtualMainCardID', true)));\r\n // });\r\n // }\r\n }\r\n\r\n private static async createWfResolutionAction() {\r\n const context = UIContext.current;\r\n const editor = context.cardEditor;\r\n\r\n if (!editor || !editor.cardModel) {\r\n return;\r\n }\r\n\r\n const cardIsNew = editor.cardModel.card.storeMode === CardStoreMode.Insert;\r\n if (cardIsNew) {\r\n const saved = await editor.saveCard(context);\r\n if (!saved) {\r\n return;\r\n }\r\n }\r\n\r\n editor.saveCard(context, {\r\n '.startProcess': createTypedField('WfResolution', DotNetType.String)\r\n });\r\n }\r\n\r\n private static enableOnCardIsNotTaskCard(e: TileEvaluationEventArgs) {\r\n const editor = e.currentTile.context.cardEditor;\r\n e.setIsEnabledWithCollapsing(e.currentTile,\r\n !!editor\r\n && !!editor.cardModel\r\n && editor.cardModel.cardType.id !== 'de75a343-8164-472d-a20e-4937819760ac'); // WfTaskCard\r\n }\r\n\r\n}","import { CardGetFileContentExtension, ICardGetFileContentExtensionContext } from 'tessa/cards/extensions';\r\nimport { UIContext, tryGetFromInfo } from 'tessa/ui';\r\nimport { ICardModel } from 'tessa/ui/cards';\r\nimport { getOrUpdateCardDigest } from 'tessa/cards';\r\nimport { createTypedField, DotNetType } from 'tessa/platform';\r\n\r\nexport class WfTaskSatelliteClientGetFileContentExtension extends CardGetFileContentExtension {\r\n\r\n public async beforeRequest(context: ICardGetFileContentExtensionContext) {\r\n const editor = UIContext.current.cardEditor;\r\n const request = context.request;\r\n let model: ICardModel;\r\n if (editor\r\n && (model = editor.cardModel!)\r\n && model.cardType.id === 'de75a343-8164-472d-a20e-4937819760ac' // WfTaskCard\r\n && !tryGetFromInfo(request.tryGetInfo()!, '.digest', null)\r\n ) {\r\n const digest = await getOrUpdateCardDigest(model);\r\n if (digest) {\r\n request.info['.digest'] = createTypedField(digest, DotNetType.String);\r\n }\r\n return;\r\n }\r\n }\r\n\r\n}","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { WfCardUIExtension } from './wfCardUIExtension';\r\nimport { WfTasksClientGetExtension } from './wfTasksClientGetExtension';\r\nimport { WfTaskSatelliteUIExtension } from './wfTaskSatelliteUIExtension';\r\nimport { WfTypeSettingsUIExtension } from './wfTypeSettingsUIExtension';\r\nimport { WfTileExtension } from './wfTileExtension';\r\nimport { WfTaskSatelliteClientGetFileContentExtension } from './wfTaskSatelliteClientGetFileContentExtension';\r\nExtensionContainer.instance.registerExtension({extension: WfCardUIExtension, stage: ExtensionStage.AfterPlatform});\r\nExtensionContainer.instance.registerExtension({extension: WfTasksClientGetExtension, stage: ExtensionStage.AfterPlatform, singleton: true});\r\nExtensionContainer.instance.registerExtension({extension: WfTaskSatelliteUIExtension, stage: ExtensionStage.AfterPlatform, singleton: true});\r\nExtensionContainer.instance.registerExtension({extension: WfTypeSettingsUIExtension, stage: ExtensionStage.AfterPlatform, singleton: true});\r\nExtensionContainer.instance.registerExtension({extension: WfTileExtension, stage: ExtensionStage.AfterPlatform, singleton: true});\r\nExtensionContainer.instance.registerExtension({extension: WfTaskSatelliteClientGetFileContentExtension, stage: ExtensionStage.AfterPlatform, singleton: true});\r\n","import { CardGetRequest, CardService } from 'tessa/cards/service';\r\nimport { showNotEmpty, UIContext, createCardEditorModel/*, createCardFileSourceForCard, createCardFileContainer, IUIContext*/ } from 'tessa/ui';\r\nimport { Card, CardRow, KeyedCardRowFactory } from 'tessa/cards';\r\nimport { MapStorage } from 'tessa/platform/storage';\r\nimport { ICardEditorModel } from 'tessa/ui/cards';\r\n\r\nexport class ImageCache {\r\n\r\n private static cache: Map = new Map();\r\n\r\n public static async loadImage(\r\n cardId: guid,\r\n names: string[],\r\n callback: (image: (string | null)[]) => void\r\n ): Promise {\r\n const cachedImage = ImageCache.cache.get(cardId);\r\n if (cachedImage) {\r\n callback(await cachedImage.loadImages(names));\r\n return;\r\n }\r\n\r\n const request = new CardGetRequest();\r\n request.cardId = cardId;\r\n const response = await CardService.instance.get(request);\r\n\r\n const result = response.validationResult.build();\r\n await showNotEmpty(result);\r\n\r\n if (!result.isSuccessful) {\r\n return;\r\n }\r\n\r\n const card = response.card;\r\n card.ensureCacheResolved();\r\n\r\n const image = new CardImageCache(card);\r\n ImageCache.cache.set(cardId, image);\r\n callback(await image.loadImages(names));\r\n }\r\n\r\n}\r\n\r\nclass CardImageCache {\r\n\r\n constructor(\r\n private _card: Card\r\n ) {\r\n }\r\n\r\n private cache: Map = new Map();\r\n\r\n public async loadImages(\r\n names: string[]\r\n ): Promise<(string | null)[]> {\r\n const result: (string | null)[] = [];\r\n\r\n const editor = createCardEditorModel();\r\n editor.cardModel = await editor.createCardModel(\r\n this._card, new MapStorage({}, new KeyedCardRowFactory(), true));\r\n // таким образом будет записан дайджест карточки при загрузке файлов\r\n const contextInstance = UIContext.create(new UIContext({ cardEditor: editor }));\r\n try {\r\n for (let name of names) {\r\n if (!name) {\r\n result.push(null);\r\n continue;\r\n }\r\n\r\n const cachedImage = this.cache.get(name);\r\n if (cachedImage !== undefined) {\r\n result.push(cachedImage);\r\n } else {\r\n const image = await this.loadImage(name, editor);\r\n this.cache.set(name, image);\r\n result.push(image);\r\n }\r\n }\r\n } finally {\r\n contextInstance.dispose();\r\n editor.close(true);\r\n }\r\n\r\n return result;\r\n\r\n // const fileSource = createCardFileSourceForCard(\r\n // this._card,\r\n // async (action: (context: IUIContext) => void) => {\r\n // await action(UIContext.current);\r\n // }\r\n // );\r\n // const fileContainer = createCardFileContainer(fileSource);\r\n // try {\r\n // await fileContainer.init();\r\n // const file = fileContainer.files.find(x => x.name === name)!;\r\n\r\n // if (!file) {\r\n // return null;\r\n // }\r\n // const result = await file.ensureContentLoaded();\r\n // await showNotEmpty(result);\r\n // if (!result.isSuccessful) {\r\n // return null;\r\n // }\r\n\r\n // const content = file.lastVersion.content;\r\n // if (!content) {\r\n // return null;\r\n // }\r\n\r\n // return new Promise(resolve => {\r\n // const reader = new FileReader();\r\n // reader.onloadend = () => {\r\n // const result = reader.result as string;\r\n // this.cache.set(name, result);\r\n // resolve(result);\r\n // };\r\n // reader.readAsDataURL(content);\r\n // });\r\n // } finally {\r\n // fileContainer.dispose();\r\n // }\r\n }\r\n\r\n public async loadImage(\r\n name: string,\r\n editor: ICardEditorModel\r\n ): Promise {\r\n const fileContainer = editor.cardModel!.fileContainer;\r\n const file = fileContainer.files.find(x => x.name === name)!;\r\n\r\n if (!file) {\r\n return null;\r\n }\r\n const result = await file.ensureContentLoaded();\r\n await showNotEmpty(result);\r\n if (!result.isSuccessful) {\r\n return null;\r\n }\r\n\r\n const content = file.lastVersion.content;\r\n if (!content) {\r\n return null;\r\n }\r\n\r\n return new Promise(resolve => {\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n const result = reader.result as string;\r\n this.cache.set(name, result);\r\n resolve(result);\r\n };\r\n reader.readAsDataURL(content);\r\n });\r\n }\r\n\r\n}","import * as React from 'react';\r\nimport { observer } from 'mobx-react';\r\nimport { observable, computed, action } from 'mobx';\r\nimport styled from 'styled-components';\r\nimport { ImageCache } from './imageCache';\r\nimport { ManagerWorkplaceSettings } from './managerWorkplaceSettings';\r\nimport { LocalizationManager } from 'tessa/localization';\r\nimport { IWorkplaceViewComponent } from 'tessa/ui/views';\r\n\r\n// tslint:disable:no-any\r\n\r\nexport class ManagerWorkplaceTileViewModel {\r\n\r\n constructor(\r\n public readonly viewComponent: IWorkplaceViewComponent,\r\n public readonly row: ReadonlyMap\r\n ) {\r\n }\r\n\r\n @observable\r\n private _activeImage: string = '';\r\n\r\n @observable\r\n private _hoverImage: string = '';\r\n\r\n @observable\r\n private _inactiveImage: string = '';\r\n\r\n @observable\r\n private _hover: boolean = false;\r\n\r\n public caption: string = '';\r\n\r\n public count: number = 0;\r\n\r\n @computed\r\n public get activeImage(): string {\r\n return this._activeImage;\r\n }\r\n public set activeImage(value: string) {\r\n this._activeImage = value;\r\n }\r\n\r\n @computed\r\n public get hoverImage(): string {\r\n return this._hoverImage;\r\n }\r\n public set hoverImage(value: string) {\r\n this._hoverImage = value;\r\n }\r\n\r\n @computed\r\n public get inactiveImage(): string {\r\n return this._inactiveImage;\r\n }\r\n public set inactiveImage(value: string) {\r\n this._inactiveImage = value;\r\n }\r\n\r\n @computed\r\n public get hover(): boolean {\r\n return this._hover;\r\n }\r\n public set hover(value: boolean) {\r\n this._hover = value;\r\n }\r\n\r\n @computed\r\n public get isSelected(): boolean {\r\n const state = this.viewComponent.selectionState;\r\n return state.selectedRow === this.row;\r\n }\r\n\r\n public static async create(\r\n viewComponent: IWorkplaceViewComponent,\r\n row: ReadonlyMap,\r\n settings: ManagerWorkplaceSettings\r\n ): Promise {\r\n const result = new ManagerWorkplaceTileViewModel(viewComponent, row);\r\n const captionColumn = settings.tileColumnName;\r\n if (captionColumn) {\r\n result.caption = LocalizationManager.instance.formatValue(row.get(captionColumn));\r\n }\r\n\r\n const countColumn = settings.countColumnName;\r\n if (countColumn) {\r\n result.count = row.get(countColumn) || 0;\r\n }\r\n\r\n const cardId = settings.cardId;\r\n await ImageCache.loadImage(\r\n cardId,\r\n [\r\n row.get(settings.activeImageColumnName),\r\n row.get(settings.hoverImageColumnName),\r\n row.get(settings.inactiveImageColumnName),\r\n ],\r\n images => {\r\n result.activeImage = images[0] || '';\r\n result.hoverImage = images[1] || '';\r\n result.inactiveImage = images[2] || '';\r\n }\r\n );\r\n\r\n return result;\r\n }\r\n\r\n @action.bound\r\n public selectTile() {\r\n const state = this.viewComponent.selectionState;\r\n state.unSelectAllRows();\r\n state.setSelection(this.row);\r\n }\r\n\r\n}\r\n\r\nconst StyledTile = styled.div`\r\n position: relative;\r\n flex: 0 0;\r\n margin: 0 0 20px 20px;\r\n padding: 1.25em 1.875em 0.3125em 1.875em;\r\n background: rgba(240, 240, 240, 0.5);\r\n cursor: pointer;\r\n @media (max-width: 543px) {\r\n font-size: 0.85rem;\r\n }\r\n`;\r\n\r\nconst StyledImg = styled.img`\r\n display: block;\r\n margin-left: auto;\r\n margin-right: auto;\r\n width: 128px;\r\n height: 128px;\r\n @media (max-width: 543px) {\r\n width: 60px;\r\n height: 60px;\r\n }\r\n`;\r\n\r\ninterface ManagerWorkplaceTileProps {\r\n viewModel: ManagerWorkplaceTileViewModel;\r\n}\r\n\r\n@observer\r\nexport class ManagerWorkplaceTile extends React.Component {\r\n\r\n public render() {\r\n const { viewModel } = this.props;\r\n\r\n const src = viewModel.hover\r\n ? viewModel.hoverImage\r\n : viewModel.isSelected\r\n ? viewModel.activeImage\r\n : viewModel.inactiveImage;\r\n\r\n const style = viewModel.isSelected\r\n ? { borderBottom: '0.375em solid rgba(31, 152, 255, 0.8)' }\r\n : { borderBottom: '0.375em solid rgba(40, 40, 40, 0.95)' };\r\n\r\n return (\r\n \r\n
\r\n {viewModel.count}\r\n
\r\n \r\n
\r\n {viewModel.caption}\r\n
\r\n \r\n );\r\n }\r\n\r\n private handleMouseEnter = () => {\r\n const { viewModel } = this.props;\r\n viewModel.hover = true;\r\n }\r\n\r\n private handleMouseLeave = () => {\r\n const { viewModel } = this.props;\r\n viewModel.hover = false;\r\n }\r\n\r\n private handleClick = () => {\r\n const { viewModel } = this.props;\r\n viewModel.selectTile();\r\n }\r\n\r\n}","import * as React from 'react';\r\nimport { observer } from 'mobx-react';\r\nimport { computed, IReactionDisposer, reaction, action, observable, runInAction } from 'mobx';\r\nimport styled from 'styled-components';\r\nimport { ManagerWorkplaceSettings } from './managerWorkplaceSettings';\r\nimport { ManagerWorkplaceTileViewModel, ManagerWorkplaceTile } from './managerWorkplaceTile';\r\nimport { BaseContentItem, ContentPlaceArea, ContentPlaceOrder } from 'tessa/ui/views/content';\r\nimport { IWorkplaceViewComponent } from 'tessa/ui/views';\r\nimport { Guid } from 'tessa/platform';\r\n\r\nexport class ManagerWorkplaceViewModel extends BaseContentItem {\r\n\r\n //#region ctor\r\n\r\n constructor(\r\n settings: ManagerWorkplaceSettings,\r\n viewComponent: IWorkplaceViewComponent,\r\n area: ContentPlaceArea = ContentPlaceArea.ContentPanel,\r\n order: number = ContentPlaceOrder.BeforeAll\r\n ) {\r\n super(viewComponent, area, order);\r\n this._settings = settings;\r\n this._dataReaction = null;\r\n this.models = observable.array([], { deep: false });\r\n }\r\n\r\n //#endregion\r\n\r\n //#region fields\r\n\r\n private _settings: ManagerWorkplaceSettings;\r\n\r\n private _dataReaction: IReactionDisposer | null;\r\n\r\n private _loadingGuard: guid | null = null;\r\n\r\n //#endregion\r\n\r\n //#region props\r\n\r\n public readonly models: ManagerWorkplaceTileViewModel[];\r\n\r\n @computed\r\n public get isLoading(): boolean {\r\n return this.viewComponent.isDataLoading;\r\n }\r\n\r\n //#endregion\r\n\r\n //#region methods\r\n\r\n public initiailize() {\r\n super.initiailize();\r\n this._dataReaction = reaction(\r\n () => this.viewComponent.data,\r\n () => this.refresh()\r\n );\r\n }\r\n\r\n public dispose() {\r\n super.dispose();\r\n if (this._dataReaction) {\r\n this._dataReaction();\r\n this._dataReaction = null;\r\n }\r\n }\r\n\r\n @action.bound\r\n public async refresh(): Promise {\r\n this.models.length = 0;\r\n const data = this.viewComponent.data;\r\n if (!data) {\r\n return;\r\n }\r\n\r\n const tiles: ManagerWorkplaceTileViewModel[] = [];\r\n const guard = this._loadingGuard = Guid.newGuid();\r\n for (let row of data) {\r\n tiles.push(await ManagerWorkplaceTileViewModel.create(this.viewComponent, row, this._settings));\r\n }\r\n\r\n runInAction(() => {\r\n if (this._loadingGuard === guard) {\r\n this.models.push(...tiles);\r\n this._loadingGuard = null;\r\n }\r\n });\r\n }\r\n\r\n //#endregion\r\n\r\n}\r\n\r\nconst StyledContainer = styled.div`\r\n display: flex;\r\n flex-wrap: wrap;\r\n`;\r\n\r\nexport interface ManagerWorkplaceProps {\r\n viewModel: ManagerWorkplaceViewModel;\r\n}\r\n\r\n@observer\r\nexport class ManagerWorkplace extends React.Component {\r\n\r\n public render() {\r\n const { viewModel } = this.props;\r\n return (\r\n \r\n {viewModel.models.map((x, i) => {\r\n return (\r\n \r\n );\r\n })}\r\n \r\n );\r\n }\r\n\r\n}\r\n","import { IStorage } from 'tessa/platform/storage';\r\n\r\nexport class ManagerWorkplaceSettings {\r\n\r\n constructor(storage: IStorage) {\r\n this.activeImageColumnName = storage['ActiveImageColumnName'] || '';\r\n this.cardId = storage['CardId'] || '';\r\n this.countColumnName = storage['CountColumnName'] || '';\r\n this.hoverImageColumnName = storage['HoverImageColumnName'] || '';\r\n this.inactiveImageColumnName = storage['InactiveImageColumnName'] || '';\r\n this.tileColumnName = storage['TileColumnName'] || '';\r\n }\r\n\r\n public readonly activeImageColumnName: string;\r\n\r\n public readonly cardId: guid;\r\n\r\n public readonly countColumnName: string;\r\n\r\n public readonly hoverImageColumnName: string;\r\n\r\n public readonly inactiveImageColumnName: string;\r\n\r\n public readonly tileColumnName: string;\r\n\r\n}","import { ManagerWorkplaceViewModel, ManagerWorkplace } from './managerWorkplace';\r\nimport { ManagerWorkplaceSettings } from './managerWorkplaceSettings';\r\nimport { ApplicationExtension } from 'tessa';\r\nimport { WorkplaceViewComponentExtension } from 'tessa/ui/views/extensions';\r\nimport { IWorkplaceViewComponent, ViewComponentRegistry, StandardViewComponentContentItemFactory } from 'tessa/ui/views';\r\n\r\n//#region ManagerWorkplaceExtension\r\n\r\nexport class ManagerWorkplaceExtension extends WorkplaceViewComponentExtension {\r\n\r\n public getExtensionName(): string {\r\n return 'Tessa.Extensions.Default.Client.Workplaces.Manager.ManagerWorkplaceExtension';\r\n }\r\n\r\n public initialize(model: IWorkplaceViewComponent) {\r\n const settings = new ManagerWorkplaceSettings(this.settingsStorage);\r\n if (!settings.cardId) {\r\n console.error('ManagerWorkplaceExtension settings is not valid.')\r\n return;\r\n }\r\n\r\n model.contentFactories.set(StandardViewComponentContentItemFactory.Table,\r\n c => new ManagerWorkplaceViewModel(settings, c)\r\n );\r\n }\r\n\r\n}\r\n\r\n//#endregion\r\n\r\n//#region ManagerWorkplaceExtension\r\n\r\nexport class ManagerWorkplaceInitializeExtension extends ApplicationExtension {\r\n\r\n public initialize() {\r\n ViewComponentRegistry.instance.register(ManagerWorkplaceViewModel, () => ManagerWorkplace);\r\n }\r\n\r\n}\r\n\r\n//#endregion","import { TreeItemExtension } from 'tessa/ui/views/extensions';\r\nimport { IWorkplaceFilteringRule, CheckingResult, WorkplaceMetadataComponentSealed,\r\n WorkplaceFilteringContext } from 'tessa/views/workplaces';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { Guid } from 'tessa/platform';\r\nimport { RequestParameter } from 'tessa/views/metadata';\r\n\r\nexport class RefSectionExtension extends TreeItemExtension implements IWorkplaceFilteringRule {\r\n\r\n public getExtensionName(): string {\r\n return 'Tessa.Extensions.Default.Client.Workplaces.RefSectionExtension';\r\n }\r\n\r\n public evaluate(\r\n _metadata: WorkplaceMetadataComponentSealed,\r\n context: WorkplaceFilteringContext,\r\n ): CheckingResult {\r\n const settings = new TreeItemFilteringSettings(this.settingsStorage);\r\n\r\n const conditionEquals = this.settingsStorage\r\n && settings.refSections.some(x => Guid.equals(x, context.refSection))\r\n && RefSectionExtension.parametersEquals(context.parameters, settings.parameters);\r\n return conditionEquals ? CheckingResult.Positive : CheckingResult.Negative;\r\n }\r\n\r\n private static parametersEquals(\r\n contextParameters: RequestParameter[],\r\n settingsParameters: string[]\r\n ): boolean {\r\n if (contextParameters == null || contextParameters.length === 0) {\r\n return true;\r\n }\r\n\r\n return contextParameters.map(p => p.metadata!.alias)\r\n .every(x => settingsParameters.some(y => Guid.equals(x, y)));\r\n }\r\n\r\n}\r\n\r\nclass TreeItemFilteringSettings {\r\n\r\n constructor(storage: IStorage) {\r\n this.refSections = storage['RefSections'] || [];\r\n this.parameters = storage['Parameters'] || [];\r\n }\r\n\r\n public readonly refSections: string[];\r\n\r\n public readonly parameters: string[];\r\n\r\n}","import { reaction } from 'mobx';\r\nimport { TreeItemExtension } from 'tessa/ui/views/extensions';\r\nimport { ITreeItem, isTreeItemVisibleInPath } from 'tessa/ui/views/workplaces/tree';\r\nimport { IStorage } from 'tessa/platform/storage';\r\nimport { tryGetFromSettings } from 'tessa/ui';\r\nimport { IWorkplaceViewModel, IWorkplaceViewComponent } from 'tessa/ui/views';\r\n\r\nexport class AutomaticNodeRefreshExtension extends TreeItemExtension {\r\n\r\n private _settings: AutomaticNodeRefreshSettings;\r\n\r\n // tslint:disable-next-line:no-any\r\n private _timer: any | null;\r\n\r\n private _refreshPending: boolean = false;\r\n\r\n private _treeItem: ITreeItem;\r\n\r\n private _disposes: Function[] = [];\r\n\r\n public getExtensionName(): string {\r\n return 'Tessa.Extensions.Default.Client.Workplaces.AutomaticNodeRefreshExtension';\r\n }\r\n\r\n public initialized(model: ITreeItem) {\r\n this._treeItem = model;\r\n this._settings = new AutomaticNodeRefreshSettings(this.settingsStorage);\r\n this.subscribeToEvents(model);\r\n reaction(\r\n () => model.parent,\r\n (parent) => {\r\n this.unsubscribeFromEvents();\r\n if (!parent) {\r\n this.stopTimer();\r\n } else {\r\n this.subscribeToEvents(model);\r\n this.startTimer();\r\n }\r\n }\r\n );\r\n if (model.workplace && model.workplace.isActive) {\r\n // вкладка с рабочим местом активна на момент запуска приложения\r\n this.startTimer();\r\n }\r\n }\r\n\r\n private subscribeToEvents(treeItem: ITreeItem) {\r\n this._disposes.push(reaction(\r\n () => treeItem.workplace.isActive,\r\n (isActive) => {\r\n if (isActive) {\r\n if (this._refreshPending) {\r\n this.updateByTimer(true);\r\n }\r\n this.startTimer();\r\n }\r\n }\r\n ));\r\n\r\n this._disposes.push(reaction(\r\n () => treeItem.isLoading,\r\n (isLoading) => {\r\n if (!isLoading && !this._timer) {\r\n this.stopTimer();\r\n this.startTimer();\r\n this._refreshPending = false;\r\n }\r\n }\r\n ));\r\n\r\n let currentNode = treeItem.parent;\r\n while (currentNode) {\r\n this._disposes.push(reaction(\r\n () => currentNode ? currentNode.isExpanded : false,\r\n (isExpanded) => {\r\n if (isExpanded && isTreeItemVisibleInPath(treeItem)) {\r\n if (this._refreshPending) {\r\n this.updateByTimer(false);\r\n }\r\n this.startTimer();\r\n }\r\n }\r\n ));\r\n currentNode = currentNode.parent;\r\n }\r\n }\r\n\r\n private unsubscribeFromEvents() {\r\n for (let dispose of this._disposes) {\r\n dispose();\r\n }\r\n this._disposes.length = 0;\r\n }\r\n\r\n private startTimer() {\r\n if (!this._timer) {\r\n this._timer = setInterval(() => this.updateByTimer(false), this._settings.refreshInterval * 1000);\r\n }\r\n }\r\n\r\n private stopTimer() {\r\n if (this._timer) {\r\n clearInterval(this._timer);\r\n this._timer = null;\r\n }\r\n }\r\n\r\n private async updateByTimer(skipUpdateTable: boolean) {\r\n // Если задача не успела отработать или узел находится в процессе обновления,\r\n // то просто выходим из задачи\r\n if (this._treeItem.isLoading\r\n || (Date.now() - this._treeItem.lastUpdateTime) < (this._settings.refreshInterval * 1000)\r\n ) {\r\n return;\r\n }\r\n\r\n if (!this._treeItem.workplace.isActive\r\n || !isTreeItemVisibleInPath(this._treeItem)\r\n ) {\r\n this._refreshPending = true;\r\n this.stopTimer();\r\n return;\r\n }\r\n\r\n await this._treeItem.refreshNode();\r\n if (this._treeItem.hasSelection()) {\r\n this.refreshTableContent(skipUpdateTable);\r\n }\r\n }\r\n\r\n private refreshTableContent(skipUpdateTable: boolean) {\r\n this._refreshPending = false;\r\n if (this._settings.withContentDataRefreshing && !skipUpdateTable) {\r\n this.refreshContent(this._treeItem.workplace);\r\n }\r\n }\r\n\r\n private refreshContent(workplaceViewModel: IWorkplaceViewModel) {\r\n if (!workplaceViewModel) {\r\n return;\r\n }\r\n\r\n // обновляем содержимое (таблицы)\r\n const viewContext = workplaceViewModel.context.viewContext;\r\n if (viewContext) {\r\n // получаем верхнюю вью (от которой зависят остальные)\r\n let rootContext = viewContext;\r\n while (rootContext.parentContext) {\r\n rootContext = rootContext.parentContext;\r\n }\r\n const viewComponent = rootContext as IWorkplaceViewComponent;\r\n\r\n // tslint:disable-next-line:triple-equals\r\n if (viewComponent.currentPage == undefined || viewComponent.currentPage === 1) {\r\n // либо вью не поддерживает пейджинг, либо страница и так первая, либо это какой-то кастом\r\n // если кастом, то надеемся, что он поддерживает RefreshCommand\r\n rootContext.refreshView();\r\n }\r\n else {\r\n // Refresh будет автоматом при изменении номера страницы на первую\r\n viewComponent.currentPage = 1;\r\n }\r\n }\r\n }\r\n\r\n}\r\n\r\nclass AutomaticNodeRefreshSettings {\r\n\r\n constructor(storage: IStorage) {\r\n this.refreshInterval = tryGetFromSettings(storage, 'RefreshInterval', 300);\r\n this.withContentDataRefreshing = tryGetFromSettings(storage, 'WithContentDataRefreshing', true);\r\n }\r\n\r\n public refreshInterval: number;\r\n\r\n public withContentDataRefreshing: boolean;\r\n\r\n}","import { ExtensionContainer, ExtensionStage } from 'tessa/extensions';\r\n\r\nimport { ManagerWorkplaceExtension, ManagerWorkplaceInitializeExtension } from './manager/managerWorkplaceExtension';\r\nimport { RefSectionExtension } from './refSectionExtension';\r\nimport { AutomaticNodeRefreshExtension } from './automaticNodeRefreshExtension';\r\nExtensionContainer.instance.registerExtension({\r\n extension: ManagerWorkplaceExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: ManagerWorkplaceInitializeExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: RefSectionExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});\r\nExtensionContainer.instance.registerExtension({\r\n extension: AutomaticNodeRefreshExtension,\r\n stage: ExtensionStage.AfterPlatform,\r\n singleton: true\r\n});"],"sourceRoot":""}