{"version":3,"sources":["app/env/templates/templates.js","templates.js","branding/footlink/statistics/statistics.js","branding/footlink/signup/signup.js","branding/footlink/customise/configWorkflow.js","branding/footlink/customise/configTemplates.js","branding/footlink/customise/configStyles.js","branding/footlink/customise/configReports.js","branding/footlink/customise/configImages.js","branding/footlink/customise/configDirectives.js","branding/footlink/customise/configConfigs.js","branding/footlink/assetsRegister/assetsRegister.js","branding/footlink/orderItemSummaryController.js","branding/footlink/orderFilesController.js","branding/footlink/index.js","branding/footlink/gridItemsActionsHelperService.js","branding/footlink/filters.js","branding/footlink/attachmentsHelperService.js","branding/footlink/approvalFieldsController.js","app/ui/order/orderItemCard/orderItemComments/newComment/newComment.js","app/ui/order/orderItemCard/orderItemComments/commentRow/commentRow.js","app/ui/order/orderItemCard/orderItemFiles/fileUpload/fileUpload.js","app/ui/order/orderItemsGridView/orderItemsGridRouteContainer/orderItemsGridRouteContainer.js","app/ui/order/orderItemsGridView/orderItemsGrid/orderItemsGrid.js","app/ui/order/stepDetailedView/stepDetailed/stepDetailed.js","app/ui/order/stepDetailedView/stepDetailedRouteContainer/stepDetailedRouteContainer.js","app/ui/order/orderItemCard/orderReports/orderReports.js","app/ui/order/orderItemCard/orderItemInfo/orderItemInfo.js","app/ui/order/orderItemCard/orderItemComments/orderItemComments.js","app/ui/order/orderItemCard/orderItemFiles/orderItemFiles.js","app/ui/order/orderItemCard/orderItemFiles/dataSizeFilter.js","app/ui/order/orderItemCard/orderItemFiles/checkDuplicatesService.js","app/ui/order/orderItemCard/orderItemActions/orderItemGridActions.js","app/ui/order/orderItemCard/orderItemActions/orderItemActions.js","app/ui/order/newOrderView/newOrderRouteContainer/newOrderRouteContainer.js","app/ui/order/newOrderView/newOrderServices/newOrderProgressService.js","app/ui/order/newOrderView/newOrderServices/newOrderListService.js","app/ui/order/newOrderView/newOrderServices/newOrderDataService.js","app/ui/order/newOrderView/newOrderServices/newOrderCreateService.js","app/ui/order/newOrderView/newOrderServices/newOrderCalendarService.js","app/ui/order/newOrderView/newOrderServices/newOrderAddressService.js","app/ui/order/newOrderView/newOrderProgress/newOrderProgress.js","app/ui/order/newOrderView/newOrderCustomerSelector/newOrderCustomerSelector.js","app/ui/order/newOrderView/newOrderFilesLoader/newOrderFilesLoader.js","app/ui/order/newOrderView/newOrderAddressSelector/newOrderAddressSelector.js","app/ui/order/newOrderView/newOrderAddressEditor/newOrderAddressEditor.js","app/ui/order/orderDetailedView/orderDetailedRouteContainer/orderDetailedRouteContainer.js","app/ui/order/orderDetailedView/orderDetailed/orderDetailed.js","app/env/data/rest/restProvider/restProvider.js","app/env/data/rest/signalR/signalRHub.js","app/env/data/rest/signalR/signalR.js","app/env/data/rest/signalR/notificationHub.js","app/env/data/rest/modelPool/modelPool.js","app/env/data/rest/model/validationTemplates.js","app/env/data/rest/model/representationModel.js","app/env/data/rest/model/modelFactory.js","app/env/data/rest/model/modelDefinition.js","app/env/data/rest/model/model.js","app/env/data/rest/model/fieldDefinition.js","app/ui/user/settings/settings.js","app/ui/user/profile/profile.js","app/ui/user/notifications/notifications.js","app/ui/shell/shell.js","app/ui/shell/directives/rightPanel.js","app/ui/shell/directives/leftPanel.js","app/ui/shell/directives/headerPanel.js","app/ui/shell/directives/footerPanel.js","app/ui/shell/directives/centrePanel.js","app/ui/shell/directives/activeLinkDirective.js","app/ui/report/reportViewer/reportViewer.js","app/ui/report/reportRouteContainer/reportRouteContainer.js","app/ui/order/orderItemCard/orderItemCardDataProvider.js","app/ui/order/orderItemCard/orderItemCard.js","app/ui/login/loginShadow/loginShadow.js","app/ui/customer/list/list.js","app/ui/customer/overview/overview.js","app/ui/centre/list/list.js","app/ui/centre/overview/overview.js","app/env/data/requestCoupler/requestCouplerUtils.js","app/env/data/requestCoupler/requestCouplerProvider.js","app/env/data/requestCoupler/requestCoupler.js","app/env/data/services/textSearchFields.js","app/env/data/services/signup.js","app/env/data/services/services.js","app/env/data/services/serverInfo.js","app/env/data/services/ping.js","app/env/data/services/permissions.js","app/env/data/services/omqlAliasBuilder.js","app/env/data/services/loginShadowService.js","app/env/data/services/intune.js","app/env/data/services/gridDataProvider.js","app/env/data/services/geocoding.js","app/env/data/services/cookies.js","app/env/data/services/calendar.js","app/env/data/services/auth.js","app/env/data/rest/rest.js","app/env/data/repos/workflow.js","app/env/data/repos/users.js","app/env/data/repos/repos.js","app/env/data/repos/orders.js","app/env/data/repos/orderItems.js","app/env/data/repos/operations.js","app/env/data/repos/localization.js","app/env/data/repos/groups.js","app/env/data/repos/documents.js","app/env/data/repos/customers.js","app/env/data/repos/centres.js","app/env/data/repos/categoryTypes.js","app/env/data/repos/categories.js","app/env/data/repos/addresses.js","app/env/data/models/workflowAuditRecordModel.js","app/env/data/models/userModelLite.js","app/env/data/models/userModel.js","app/env/data/models/stepModel.js","app/env/data/models/orderModelLite.js","app/env/data/models/orderModel.js","app/env/data/models/orderItemModel.js","app/env/data/models/models.js","app/env/data/models/idModel.js","app/env/data/models/documentModel.js","app/env/data/models/customFieldAwareModel.js","app/env/data/models/customerModel.js","app/env/data/models/commentModel.js","app/env/data/models/centreModel.js","app/env/data/models/categoryTypeModel.js","app/env/data/models/categoryModel.js","app/env/data/models/baseModel.js","app/env/data/models/addressModel.js","app/env/data/models/actionModel.js","app/env/data/httpInterceptors/xhrTracerInterceptor.js","app/env/data/httpInterceptors/requestRepeaterInterceptor.js","app/env/data/httpInterceptors/omVersionInterceptor.js","app/env/data/httpInterceptors/jsonResponseInterceptor.js","app/env/data/httpInterceptors/httpInterceptors.js","app/env/data/httpInterceptors/authInterceptor.js","app/env/data/batching/batchingProvider.js","app/env/data/batching/batching.js","app/env/custom/config/configLogicResolvers.js","app/env/custom/config/config.js","common/directives/urlencode/urlencode.js","common/directives/teethConverter/teethConverter.js","common/directives/slideInBounce/slideInBounce.js","common/directives/searchTermHighlight/searchTermHighlight.js","common/directives/scrollIntoViewIf/scrollIntoViewIf.js","common/directives/recompile/recompile.js","common/directives/popupMap/popupMap.js","common/directives/omStatCounter/omStatCounter.js","common/directives/omSpinner/omSpinner.js","common/directives/omNumericTextBox/omNumericTextBox.js","common/directives/omDatePicker/omDatePicker.js","common/directives/inView/inView.js","common/directives/omAutocomplete/omAutocomplete.js","common/directives/meshViewer/meshViewer.js","common/directives/inlineEditText/inlineEditText.js","common/directives/googleTranslate/googleTranslate.js","common/directives/inlineEditDropdown/inlineEditDropdown.js","common/directives/goBackButton/goBackButton.js","common/directives/buttonSliderMenu/buttonSliderMenu.js","common/directives/focus/focus.js","common/directives/appLoadingAnimation/appLoadingAnimation.js","app/ui/user/user.js","app/ui/omStat/omStat.js","app/ui/report/reportManager.js","app/ui/report/report.js","app/ui/order/orderItemsGridSharedSettings.js","app/ui/order/order.js","app/ui/omqlTester/omqlTester.js","app/ui/login/pwdReset.js","app/ui/login/login.js","app/ui/loadingShadow/loadingShadow.js","app/ui/home/home.js","app/ui/help/help.js","app/ui/customer/customer.js","app/ui/error/error.js","app/ui/centre/centre.js","app/ui/appReload/appReload.js","app/env/userSettings/userSettings.js","app/env/uiRouter/uiRouter.js","app/env/threejs/threejsLoader.js","app/env/threejs/threejsExporter.js","app/env/threejs/threejs.js","app/env/templates/templateResolver.js","app/env/services/services.js","app/env/services/fileService.js","app/env/services/colorService.js","app/env/services/barcodeScannerListener.js","app/env/notifications/notifications.js","app/env/log/omLogger.js","app/env/log/logDecorator.js","app/env/log/log.js","app/env/localStorage/localStorage.js","app/env/i18n/uiLocalization.js","app/env/i18n/serverLocalizationFilter.js","app/env/i18n/serverLocalization.js","app/env/i18n/localeName.js","app/env/i18n/kendoMessages.js","app/env/i18n/kendoLocalization.js","app/env/i18n/i18n.js","app/env/i18n/appLocale.js","app/env/i18n/angularLocalization.js","app/env/loading/loadingMixin.js","app/env/loading/loading.js","app/env/helpers/injector.js","app/env/helpers/helpers.js","app/env/extensions/underscore-extensions.js","app/env/extensions/string-extensions.js","app/env/extensions/regex-extensions.js","app/env/extensions/jquery-extensions.js","app/env/extensions/enum-extensions.js","app/env/extensions/date-extensions.js","app/env/exceptions/exceptions.js","app/env/events/events.js","app/env/data/data.js","app/env/device/device.js","app/env/context/context.js","app/env/custom/customTemplateResolver.js","app/env/custom/customTemplate.js","app/env/custom/customResourceResolver.js","app/env/custom/customDirective.js","app/env/custom/customCss.js","app/env/custom/customBackground.js","app/env/custom/custom.js","app/ui/ui.js","app/env/fakeModule.js","app/env/env.js","common/common.js","app/app.js"],"names":["angular","module","run","$templateCache","put","config","$stateProvider","state","url","templateUrl","controller","data","pageTitle","$q","$log","$scope","$state","toastr","gettextCatalog","usersRepository","$timeout","customResourceResolver","$customisationConfig","permissions","uiLocalization","isBusy","monthsCount","months","propertyToSortBy","reverse","statsTableHeaderLabel","limit","waitingUsersOptions","title","position","top","left","jQuery","window","width","animation","om","kendoWindowDefaultOptions","orderTypes","text","getString","value","isSecond","statsReportTypes","deviceType","deviceId","statsPeriods","initData","currMonth1StDay","Date","getFullYear","getMonth","fromDate","getDate","d","getTime","i","push","index","name","toLocaleString","month","year","setMonth","initDataPromise","search","queryForUsersSet","statsReportType","then","usersSet","getStatsPromise","items","length","getUsersStatistics","from","to","orderClass","isSecondOrder","pad","number","sixMonthsAgo","getHours","getMinutes","getSeconds","currMonth1stDayString","query","toString","getWhereQueryForOrdersSet","orderType","_","map","u","$model","id","when","statsByUser","statsByMonths","orderItemsCount","usersStats","each","stats","userStat","foundUserModel","find","userName","extend","usersCount","catch","resp","status","error","translate","statusText","deviceOwnership","where","orderBy","pageNumber","rowsPerPage","dropdownOrdersTypeOptions","dataSource","dataTextField","dataValueField","valueTemplate","template","select","e","selectedItem","item","orderTypeLabel","dataBound","this","list","dropdownStatsOptions","dropdownMonthsCountOptions","$on","loadMore","last","inview","doPrint","requestAnimationFrame","print","doPrintWaitingList","content","printWindow","waitingUsersDialog","element","innerHTML","open","document","write","close","onload","focus","showUsersOnWaitingList","isLoadingWaitingUsers","waitingUsers","customerSearch","customerFilter","indexOf","customFields","DeviceId","getWaitingUserType","wUser","WaitingClass","sortBy","resolve","loadingWaiter","omHideLoadingScreenCallback","$http","$localStorage","authService","signupService","focusTimeout","ddlKeydownHandler","checkFormValidity","isFormValid","userInfo","signupValidator","validate","msg","isSigningUp","onSuggestedAddressesDataBound","onAddressClick","onSuggestedAddressSelect","dataItem","address","rePostCode","reState","street","substr","rest","mState","match","clinicState","trim","replace","mPostCode","clinicPostcode","clinicAddress","clinicCity","isRequestingCode","isRegisteredCompanyNameFetching","isConfirmationCodeRequested","termsAccepted","loginUrl","location","href","userABNValidForCreation","suggestedAddresses","cancel","signupValidatorOptions","rules","validabn","input","is","isValid","isValidABN","val","abnValue","post","build","baseUrl","uri","response","jsonObjectMatch","registeredName","abnApiResponseString","jResponse","JSON","parse","str","isBlank","EntityName","parseRegisteredCompanyName","$applyAsync","clinicName","all","validateUserFieldValue","replaceAll","validateCustomerFieldValue","querySelector","disabled","blur","validregname","goBack","go","uInfo","isUndefined","firstName","lastName","clinicTradingName","clinicPhone","clinicEmail","clinicAccountsEmail","clinicABN","abnToValidate","slice","weights","Array","firstDigit","substring","restDigits","parseInt","abn","total","charAt","getSuggestions","debounce","getSuggestedAddresses","suggest","suggestedAddressesOptions","messages","isString","warn","cinicAddress","cinicCity","cinicState","ddl","$","keyCode","key","closest","keydown","signup","submitUserRegistrationInfo","confirmationCode","email","culture","line1","line2","city","companyName","contactLastName","contactFirstName","country","postalCode","region","telephone","fieldCode","type","registrationFormSent","requestConfirmationCode","requestEmailConfirmationCode","confirmationCodeSent","submitContactDetailsOfExistingUser","submitSupportRequest","contactRequestSent","customerUserWorkflowConfig","orderCreationAction","actions","code","uiPriority","imageResourceName","color","isAllowed","orderItem","expectedBy","isDate","toDateString","FreightRef","steps","ignore","isFloating","noImageOnHomeView","forked","hide","centreUserWorkflowConfig","copy","constant","$customisationConfigProvider","$customLogicResolversProvider","templates","context","resolveResourceUri","styles","gettext","reports","options","reportFileName","buttonImageResourceName","baseEntityName","requiresSelection","condition","gridQuery","today","toISOStringUTC","setDate","setHours","images","directives","user","$customActionsProvider","configs","role","isCentre","isCustomer","hideMenu","forbidOrderDetailsView","newOrderAllowed","resolveConfigFromServer","grid","defaultConfiguration","iconClass","centreId","centreCode","queryForStatInfo","concat","targetUri","iconName","customerId","customerCode","handOutLeftFootScanFile","order","version","gridSettings","textSearchFields","checked","expanded","alias","orderItemCardTab","saveOrderItemCardTab","disableCookiePolicyWarning","ordersRepository","orderItemsRepository","intuneService","tableHeaderLabel","tooOldVersionDetected","todayDate","iOSScanAppLatestVersion","winScanAppLatestVersion","assetTypes","assetType","groupsCount","users","countBy","Class","startsWith","forEach","sprintf","iPad","iQube","dropdownAssetsTypesOptions","getManagedDevices","devices","managedDevices","ordersPromises","result","latestNonSecondOrderItem","oi","IsSecond","o","createdBy","lastOrder","criticalVersionUser","managedDevice","assignedUser","isSameSerial","jsonData","OrderData","ApplicationOrderData","MachineSerialNumber","serialNumber","isSameMachineName","MachineName","deviceName","device","toLowerCase","operatingSystem","userSearch","userFilter","ApplicationVersion","usersDevicesSort","isZeroOrdersUser","isTooOldVersionUser","warnVersionUser","Platform","initMap","deviceLocation","machineName","machineSerial","mapOptions","zoom","center","google","maps","LatLng","Lat","Lng","Map","getElementById","markerInfo","InfoWindow","deviceMarker","setMap","setOptions","Marker","event","addListener","setContent","loadMapScript","script","createElement","src","body","appendChild","mapWindowWidth","viewDeviceLocation","deviceLocationWindow","JSZip","attachmentsHelperService","fileService","jsZip","exportFilesForTaika3D","filesToExport","fileName","orderId","documentId","getLeftFootScanFileNameId","blob","getRightFootScanFileNameId","Blob","stringify","isDownloadingFiles","downloadDocumentFile","zip","f","file","generateAsync","zipFileBlob","suggestedName","self","opts","showSaveFilePicker","handle","createWritable","writable","blobUrl","URL","createObjectURL","a","download","style","display","append","click","revokeObjectURL","remove","saveBlobToFile","info","err","warning","$window","$compile","documentsRepository","threejsLoader","meshViewerDataService","loadingFile","destroyMeshViewerWindow","clearGeometries","destroy","meshViewerWindow","meshViewerScope","$destroy","addFileTo3dViewer","documentFileName","parseFile","geometry","Error","addGeometry","handleError","errorMessage","fileLoadError","view3dModel","windowTitle","meshViewerWindowOptions","modal","draggable","resizable","meshViewerFormWidth","height","meshViewerFormHeight","visible","onMeshViewerOpen","onMeshViewerClose","$new","kendoWindow","bind","$rootScope","gridItemsActionsHelperService","orderSecondPairHandler","ddOrderOption","table","uid","orderOption","doScriptNotify","trace","alert","orderNowDropDownOptions","isIPad","IamIPad","navigator","userAgent","shipOrdersInGroup","group","currentStep","actionToExecute","setBusyStateFunc","gridReloadFunc","resetOrderItemsGridSharedSettings","setFreightReferenceToOrdersGroupAndProgress","provider","$injector","attachmentsHelperServiceProvider","elem","target","$get","service","workflowRepository","executeActionOnItems","selectedOrderItemIds","executeActionForOrderItems","debug","em","serverErrorMessage","message","reject","gridItemsGroup","kg","company","deliveryAddress","ordersCount","kendoConfirm","minWidth","clearSelection","groupItemsIds","page","dialog","kendoPrompt","okText","wrapper","btnOk","attr","addClass","keyup","valueEntered","removeAttr","removeClass","enteredValue","itemsUpdatePromises","gridItem","getOrderItem","itemFromPool","saveOrderItem","filter","getPrescriptionFileNameId","getLeftFootImageFileNameId","getRightFootImageFileNameId","helper","AttachmentsHelper","_this","getOrderIdAndPatientNameString","patientName","OrthoticsOrder","Patient","Name","PatientInfo","PatientRef","orderIdAndPatient","fileId","getDocumentIdByFilename","translatedOrderType","OrderType","calendarService","isRapid","returnOption","ReturnOptions","Return","isInitial","isWeightBearing","platform","isOverdue","now","completedDate","isOverdueDelivery","DeliveryDate","deliveryDate","publicHolidays","isHoliday","date","getDay","getYear","getActualPublicHolidays","holidays","dpOptions","dates","disableDates","directive","restrict","scope","send","comment","$element","newCommentExpand","getCurrentTime","getCurrentUser","restUser","canSendComment","sendComment","isFunction","$watch","newVal","oldVal","batchSize","concurrencyLevel","chunkSize","multiple","documentVersions","cancelled","reset","orderItemId","someFileUploaded","allUploaded","$filter","checkDuplicatesService","dataSizeFilter","uploadId","uploadInfo","count","size","totalSize","uploading","uploadingStopped","conflictWindowOptions","selectedFiles","FileReader","openFileDialog","_typeof","updateProgressCallback","progress","sessionId","isFinished","isSkipped","itemByFile","finished","skipped","progressStatus","submit","deferred","defer","isCancelled","files","uploads","cancelUpload","started","fileServicePromise","uploadFiles","ErrorMessage","finally","updateStatus","FileUploadPromises","promise","selected","uploadedMessage","conflictWindow","skipFile","preventDefault","stopPropagation","onSelect","$apply","sc","replaceFile","toAll","action","actionToAllFiles","pauseDeferred","addCopy","openConflictWindow","fileNameConflict","progressBarOptions","max","min","link","attrs","upload","props","on","dataTransfer","controllerAs","params","step","exact","$stateParams","orderItemsGridSharedSettings","setTextSearch","setStepFilter","resolveConfig","customFilters","customFilter","setCustomFilter","$sce","serverLocalization","reportManager","gridDataProvider","templateResolver","orderItemsGridControllerUpdatesService","barcodeScannerListenerService","selectedOrderItem","selectedOrderItemId","textSearchTrigger","dataRequestCount","hidemenu","barcodeScannerUnsubscribe","events","reloadGrid","orderItemsGrid","getId","Audio","play","searchDropdown","setSelectedOrderItemId","completedDateChangedHandler","isEqual","completedDateChanged","showCompletedFilter","useCreatedDateFilter","setCompletedFilter","datePickerFrom","datePickerTo","enabled","setCreatedFilter","setBusyState","newBusyState","setSelectedOrderItemIds","setPageNumber","applyTextSearch","getSelectedEntities","showStepDetails","executeAction","selectedItemsIds","getSelectedOrderItemIds","confirmActionDialog","getSelectedOrderItemsCount","getSelectionInfoLabel","getStepFilter","searchDropdownOptions","icon","valuePrimitive","clearSearchTerm","textSearch","textSearchConfig","getTextSearch","initAdditionalFilter","totalItemsCountForPageTitle","getSteps","resolveWorkflow","currentUser","workflowConfig","currentStepCode","getFallbackIconForStep","stepCode","hasResource","res","string","contains","s","stepConfig","stepDisplayName","publicNameResource","nameResource","viewTitle","viewIconName","isDefined","publicImageResourceName","getCustomFilter","updatePageTitle","availableHeight","outerHeight","css","$digest","getGridConfig","shellConfig","gridConfig","clone","gConfig","gridHeaderTemplate","hideShowCompletedSwitch","columns","firstVisibleColumn","c","hidden","field","column","toolbar","noRecords","dataBoundEventHandler","call","itemId","get","String","isNullOrWhiteSpace","unhighlight","highlight","change","itemsDeselected","prop","totalSelected","isRepresentationModel","isSingleRowClick","uniq","difference","reportsDropDown","refresh","selectedIdsCount","totalCount","getTotalCount","pageable","disablePagerInfo","disablePagerItemsInfo","pageSizes","initialSort","isArray","setGridSort","dir","initGridConfig","dataSourceObj","transport","read","forcedPageChange","cachedResult","success","setForceIgnorePageSize","setPageSize","pageSize","setGridFilter","sort","children","getPageSize","columnsCount","row","divWidth","Math","floor","random","renderSkeletonPlaceholdersLoadingAnimation","getData","setTotalCount","setTotalPageCount","totalPageCount","getSelectedOrderItemId","ts","empty","schema","model","fields","getPageNumber","getGridFilter","getGridSort","serverPaging","serverSorting","serverFiltering","groupable","initialGroup","kendo","DataSource","initGridDataSource","completedFilterConfig","getCompletedFilter","createdFilterConfig","getCreatedFilter","oneMonthAgo","initDatesFilter","jqTemplate","itemToRemove","hasClass","grep","x","shiftKey","ctrlKey","currentPageRowsCount","currentPageSelectionCount","itemsToRemove","tbody","updatedSelection","findIndex","trigger","getReportList","results","reportComboItems","dropdownReportsOptions","getReportQuery","report","selectedItemId","show","getWorkflowActionConfirmationLabel","trustAsHtml","confirmActionDialogOptions","primary","saveItemsBeforeActionExecute","itemsToUpdateAndSave","itemsSavePromises","onBeforeActionExecute","itemsMsg","buttonHtml","executeActionConfirmed","initController","reloadGridBySignalREvent","onOrderItemChanged","onNewOrderItem","onOrderChanged","initSignalREvents","selectedEntities","selectedDOM","firstSelected","newOrderItemCb","orderItemChangedCb","orderChangedCb","modelInfo","modelType","cb","stepDetailedControllerUpdatesService","lastSelectedIndex","lastPageNumber","specifiedItemNotFound","isDataLoaded","isOrderItemDataLoaded","orderItemIdFromParams","getRandom","start","stop","toFirstPage","reloadList","toPrevPage","toNextPage","toLastPage","selectOrderItem","onOrderItemLoadStart","onOrderItemLoadEnd","onOrderItemActionExecute","isOrderItemActionExecuting","onOrderItemActionExecuteStart","setShadows","itemsListContainer","eventTarget","isScrollingItemsList","endOfScroll","scrollHeight","clientHeight","scrollTop","getGridViewUri","stateDisplayName","stateIconName","fallbackIconForStep","elementName","nodeName","orderItems","off","lastSelected","rm","getPageTitle","searchResults","selectedId","fixSelection","isClear","clear","parsedItemId","orderItemCardDataProvider","oiGridSharedSettings","onDataChange","singleOrderReportsListName","getReportListByName","showReport","reportName","r","backAction","getOrderItemId","getStep","getOrder","categories","getCategories","orderItemCategories","getOrderItemCategories","categoryTypes","getCategoryTypes","orderItemCommentsControllerUpdatesService","comments","newOrderId","clearNewComment","getComments","isCentreUser","newComment","customerVisible","newCommentModel","newModel","saveComment","onNewComment","callback","$document","filesControllerUpdatesService","refreshDocList","currentPage","loadingDocuments","documents","documentsCount","getDocuments","getDocument","form","method","setAttribute","getToken","numberOfPages","ceil","nextPage","prevPage","getAlreadyUploadedFiles","onNewDocument","fractionSize","out","suffix","tera","pow","isDuplicate","uploadedFiles","generateNewName","onlyName","lastIndexOf","extension","tryName","focusManagementService","onExecuteActionButtonClick","actionCode","isActionButtonEnabled","actionsConfig","actionConfig","undefined","onSelectionChange","selectedItemIds","getOrderItemsPromises","itemsResult","fallbackIconForAction","getActionsForStep","actionsFromApi","promises","isActionAllowed","colorToTransform","defaultColor","transformColor","Infinity","setFocus","grabFocus","endsWith","customAction","init","filesSize","_filesSize","_progressItems","getProgress","uploadedSize","progressItem","round","setFileProgress","itemFound","fileProgressItem","factory","getListOptions","getListFunc","getPath","filteredItems","deepFilterByStr","updateList","resolveNewOrder","newOrderConfig","resolveNewOrderTypes","newOrderTypesConfig","setDataProperty","currentId","property","newOrderDataService","newOrderProgressService","addressesRepository","customersRepository","createOrder","orderVm","orderItemsVms","progressCallback","_orderVm","_orderItemsVms","_deliveryAddress","_outerProgressCallback","_newOrderId","createAddress","setAsCustomerDeliveryAddress","getOrderItems","uploadAllFiles","returnOrderId","addressModel","setCustomerDeliveryAddress","getOrderItemsForOrder","orderItemVm","centresRepository","datePickerOptions","getCustomer","countryCodeFromCustomer","countryCode","initPublicHolidays","datePickerOptionsBase","areDatesDifferent","areDatesEqual","twoDatesDifferent","dateOne","dateTwo","twoDatesEqual","maxDate","dateCode","_publicHolidays","isDateNotAvailable","currentDate","any","holiday","customerModel","getCentre","countryCodeFromCentre","centreModel","getAddresses","getCustomerDeliveryAddresses","deliveryAddressModels","addresses","viewAddresses","toAddress","unshift","item1","findItemIndex","addAddress","updateAddress","hashCode","getCustomerTitle","customer","combineTitle","_addressComparableFields","_titleMaxLength","isPrimary","charCodeAt","getHashCode","contact","joinModelFields","postal","address1","address2","every","str1","str2","removeWhitespaces","prefix","truncate","delimiter","progressWnd","progressWndOptions","selectedCustomerId","newOrderAddressService","newOrderListService","setCustomers","customers","customersList","isCustomersListDisabled","addressEditMode","lackOfCustomers","customersListOptions","getCustomers","el","fileInputElement","filesSelected","fileUploadElement","findFileIndex","storedFile","onRemoveFileClick","confirm","done","fileIndex","splice","selectedAddress","onAddressChange","selectedAddressHashCode","setAddresses","updateAddressesList","onCancelButtonClick","addressesList","onNewButtonClick","editedAddress","onSaveButtonClick","isAddressesListDisabled","addressesListOptions","onSave","onCancel","addressEditorValidator","hideMessages","titles","telephonePattern","orderDetailedControllerUpdatesService","initList","ois","initStepHeader","initStepHeaderInternal","oiStep","modelFactoryProvider","defaultConfig","RestConfigurator","setBaseUrl","setRequestSuffix","requestSuffix","setDefaultHeaders","defaultHeaders","setDefaultParams","defaultParams","setDefaultHttpConfig","defaultHttpConfig","defineModel","define","RestService","modelPool","makeAnotherInstance","configFunction","configurator","modelFactory","EventingMixin","RepresentationModel","ModelDefinition","pool","RestMapper","parts","futureId","futureType","_mapper","path","arguments","urlPart","_addUrlPart","isNumber","getUrl","isArguments","_urlPart","ensureCache","func","has","saveAndTransform","processResponse","getRequestUrl","getRequestConfig","serverFullException","FullException","parseXML","toArray","join","isAuthorized","responce","obj","getDefinition","initAsync","compact","flatten","currentConfig","headers","defaults","cfg","willReturn","modelId","getType","head","delete","patch","save","prototype","raise","proto","renewModel","hasModel","modelCreatedOnServer","modelUpdatedOnServer","globalConnections","initNewConnection","connection","rootPath","hubConnection","useDefaultPath","logging","hubName","connectionPromise","Hub","connectionStateToString","signalR","connectionState","connected","connecting","reconnecting","disconnected","useSharedConnection","proxy","createHubProxy","fn","invoke","args","apply","disconnect","connect","stateChanged","newState","onSignalRConnected","oldState","ensureConnection","listeners","methods","makeArray","queryParams","qs","errorHandler","autoReconnect","autoReconnectTimeout","notificationHub","signalRLogin","token","initialize","uninitialize","signalRLogout","onUpdate","onCreate","SignalRHub","pingService","hub","signalRUrl","Updated","Created","eventName","serverModelType","transformServerModelType","whenConnected","addFilter","typeName","expression","removeFilter","connectPromise","ModelPoolConfigurator","ModelPoolService","storage","promised","_getType","_getId","m","putModel","toRaiseEvent","storedModel","_mergeDeep","storedClientModel","storedOriginalModel","Object","keys","fieldName","newModelFieldValue","storedClientModelFieldValue","storedOriginalModelFieldValue","isPlainObject","isOriginalModelChanged","isClientModelChanged","cloneDeep","getOriginalModel","resetObject","newId","newType","isPromise","removeAll","notNull","isNull","isNaN","notEmpty","lenBetween","longerThan","shorterThan","strVal","longer","shorter","between","greaterThan","lessThan","fieldDefinition","greater","greaterOrEqual","greaterOrEqualThan","less","lessOrEqual","lessOrEqualThan","isPositive","isPositiveOrZero","isNegative","isNegativeOrZero","RepresentationModelFieldTypes","modelDefinition","_modelDefinition","_proto","_rest","_originalModel","_serverObject","_initProto","_initCustomMethods","getFields","fieldDef","subResource","getMethods","methodName","localMethod","dtoObject","_initFieldAsync","_deepCloneClientModel","_setField","serverName","p","_buildOriginalModel","_toServerModel","clearObject","newServerObject","_encode","_decode","encodedValue","DYNAMIC","FLOAT","INTEGER","STRING","BOOLEAN","DATE","toISOString","ARRAY","MODEL","encode","decodedValue","parseFloat","decode","getIdPropertyName","getServerModel","isDirty","isNew","validateField","unRestClone","plainCloneRecursive","original","modelDefinitionsInitQueue","initQueue","modelDefinitions","dependenciesHash","getDependencies","req","definition","initializeModelDefinition","wasErrors","checkConfiguration","constructor","getDeclaredTypes","FieldDefinition","defaultModel","idProperty","modelDefinitionType","modelDefinitionConfiguration","allDefinitions","_modelDefinitionType","_modelDefinitionConfiguration","_allDefinitions","_errPrefix","_validateAndFixConfig","_processParents","_processFields","_processCustomMethods","oldExtend","_getParentConfigs","parentConfigs","parentConfig","getConfig","_fields","filedName","defaultValue","messageArgs","validators","getFormattedMessage","translateFunc","DEFAULT","OBJECT","FieldValidator","fieldConfig","_fieldName","_fieldConfig","noop","_validators","_initValidators","msgArgs","j","errors","_validateInternal","wasUnmarkedError","wasErrorLocal","validator","vFunc","isFinite","isBoolean","customTemplateResolverProvider","userSettings","gridTextSearchService","tabs","getSettings","settings","treeDataSource","observableHierarchy","treeOptions","checkboxes","checkChildren","loadOnDemand","toJSON","fixGridTextSearchConfig","appLocale","passwordValidationRegex","passwordValidationMessage","toState","toParams","fromState","fromParams","getLanguagesList","serverSupportedLanguages","getTranslatedLanguageList","hash","hasOwnProperty","languages","saveAndClose","saveCurrentUser","setCurrentLanguageFromCurrentUser","getCurrentLanguage","pwdValidatorOptions","pwdequal","newPwd","bringUpPasswordEditForm","clearInput","changeOptions","getPasswordValidationRegex","regex","changePwdForm","changePwd","pwdValidator","editPassword","oldPwd","confirmNewPwd","changePwdFormWidth","translationsInitPromise","loading","ensureLoaded","serverInfoService","MENU_MINIMIZED_STORAGE_NAME","minimizedMenu","submitSearch","getItem","minimizedMenuWatcherDestructor","setItem","checkServerVersionAndAskReloadIfNeeded","customTemplateResolver","customNavMenuLinks","getVersion","serverVersion","serverVersionNumber","first","stateGo","stateToGo","isDefaultPrevented","logout","$location","activeLink","activeLinkParent","parent","activeLinkDisabled","nested","activeLinkNested","toggleClass","linkPath","locationPath","haystack","current","needle","$observe","newPath","$interval","rootReportApi","loadingHtml","reportConfig","getReportConfig","reportQuery","enableToolbar","enable","onPageChange","pager","getReportDocument","reason","onActivate","buildReport","building","request","Content-Type","interval","getDocumentProgress","format","firstPage","lastPage","contentDisposition","DocumentId","Format","FirstPage","LastPage","ContentDisposition","encodeURIComponent","pages","pageCount","cancelDocument","moveUp","history","back","getReportParamsForUser","dynamicTextLanguage","getCulture","localTimezone","Intl","DateTimeFormat","resolvedOptions","timeZone","Value","itemReportTitle","itemsReportTitle","exportOptions","exportFormat","gridDataProviderReportQuery","ReportName","Query","OrderBy","BaseEntityName","Parameters","allSteps","exportItems","overflow","attributes","imageUrl","printFrame","appendTo","contentWindow","onafterprint","contents","html","execCommand","Authorization","k","v","cookie","omVersion","batching","categoryTypesRepository","categoriesRepository","orderItemWorkflowAudit","subscribers","subscriberName","unlinkedCategories","linkedCategories","actionExecutePromise","executeActionForOrderItem","stepCodeToSave","actionCodeToSave","orderItemIdToSave","unlinkCategoriesPromise","unlinkCategoriesFromOrderItem","categoriesToUnlink","linkCategoriesPromise","linkCategoriesToOrderItem","categoriesToLink","toUnlink","existingOrderItemCategory","toLink","categoryToLink","orderToSave","orderItemToSave","pluck","saveOrderItemPromise","saveOrderPromise","saveOrder","isEnabled","forceStartBatch","setOrderItemId","force","getOrderItemPromise","getCategoriesPromise","getOrderItemWorkflowAudiPromise","_orderItem","getCategoriesForOrderItem","getCategoriesByTypeCodes","isLinked","oic","_categories","getWorkflowAudit","_orderItemWorkflowAudit","dataWasChanged","initOrderItem","getOrderItemWorkflowAudit","onLoadStart","onLoadEnd","onAfterActionExecute","orderDetailsControllerUpdatesService","geocodingService","stepsConfig","actionIsExecuting","getOrderItemShareLink","originUrl","electronRemoteUrl","showHideShareDialog","showNonSystemShareDialog","setCurrentTab","tab","savedTab","currentTab","orderItemShareLink","shareOrderItem","share","getOrderItemEmailShareLink","subject","messageToShare","shareItemViaTg","fromCharCode","copyOrderItemLink","clipboard","writeText","permissionStatus","copiedToBuffer","getItemStepIconName","noIcon","viewCustomerOrders","isHiddenSummary","orderDeliveryAddressPlace","getGeocodingForAddress","toFormattedString","loginShadowService","credentials","login","getLastUsername","onOpen","kwindow","onClose","anotherUser","clearAuthentication","$broadcast","password","CUSTOMER_ACTIVITY_PERIOD","isActiveCustomerNow","isActiveCustomer","dateToCheckFor","daysDiff","customersStats","diffDays","customersLoadedAndSorted","permissionsGranted","topCustomerStat","numOrders","numOrderItems","customersStat","activeCustomersChange","customersSortByOrders","customersSearch","term","isLast","isInView","inviewInfo","customersLoadedAndSortedCallback","inViewLoaderOptions","viewportOffset","granted","pageDisplayName","activeCustomersCount","totalOrdersCount","activeCustomersCalculated","getCustomersOrdersHistoryStats","activeCustomersWeekAgo","cStat","cs","weekAgo","addDays","customerOverviewUpdatesService","CalendarChartTypes","makeEnum","getCustomerStatistics","filterQuery","getOpenOrdersStats","getCustomerOrdersStepsStats","statValue","stat","getCalendarStats","getCustomerOrdersHistoryStats","toDate","stepsWithStats","calendarStats","ordersTotals","reduce","memo","sws","completed","customerStepsStats","chartData","values","ss","label","chartOptions","chart","margin","right","bottom","y","forceY","showValues","staggerLabels","wrapLabels","noData","valueFormat","d3","duration","xAxis","showYAxis","tooltip","valueFormatter","mostRecentOrderDate","customerCalendarStats","initCalendarChartData","processCustomerStatistics","tooltipKeyFormat","xLabelRotation","tickFormatter","tooltipKeyFormatter","barWidthCoeff","groupedValues","chartTypeName","calendarChartType","description","toUpperCase","tickValuesGetter","currentLocale","formatter","weekly","dateTicks","getYearWeekNumber","groupBy","setToMonday","groupValues","monthly","time","daily","chartCalendarData","bar","chartCalendarOptions","scale","axisLabelDistance","tickFormat","rotateLabels","tickValues","showMaxMin","yAxis","keyFormatter","scaleExtent","useFixedDomain","useNiceScale","horizontalOff","verticalOff","unzoomEventType","bars","dispatch","renderEnd","t","chartBars","selectAll","onChartCalendarReady","datesFilterString","customCompletedFilter","gridOrdersCustomCompletedFilter","gridOrdersCustomFilter","customerOrders","viewCalendarChartDaily","viewCalendarChartWeekly","viewCalendarChartMonthly","isGridReload","resizeGrid","customerAddressPlace","calendarChartTypeWatcherDestructor","initWatchers","dateFrom","initGrid","centres","centresLoadedAndSorted","topCentreStat","centresStat","centresSearch","centreFilter","centresLoadedAndSortedCallback","centresStats","getCentres","centreOverviewUpdatesService","UsersStatsChartTypes","getCentreStatistics","getCentreOrdersStepsStats","getCentreUsersStats","usersStatsFrom","usersStatsTo","processCentreStatistics","centreStepsStats","isActiveCentre","centreUsersStats","chartUsersStatsData","cus","workflowActionsExecutions","chartUsersStatsOptions","tickPadding","centre","centreOrders","userStatsChartType","week","viewUsersActivityLastYear","isUserStatsBusy","viewUsersActivityLastMonth","viewUsersActivityLastWeek","customTabs","centreAddressPlace","createRegExpCollectionCoupler","regexp","collectionUrl","modelProcessor","check","test","process","requests","ids","exec","models","convertHeadersToString","createSimpleGetCollectionCoupler","escapedSingleUrl","RegExp","createCustomFieldsCollectionCoupler","modelRoute","customFieldRoute","idToCustomField","createDocumentsCollectionCoupler","documentsRoute","idToDocuments","createWorkflowAuditCollectionCoupler","workflowAuditRoute","idToWorkflowAudit","workflowAudits","defaultCouplerConfig","maxCouplerQueueSize","minCouplerQueueSize","delay","serviceConfig","couplers","addCoupler","coupler","getCouplers","setDefaultCouplerConfig","setConfig","processors","processRequest","requestConfig","getCoupler","newProcessor","RequestCouplerProcessor","getOrCreateProcessor","addRequest","continueDownNormalPipeline","_coupler","me","timeout","di","$provide","decorator","$delegate","requestCoupler","$httpBackendFn","withCredentials","responseType","callArgs","mock","requestCouplerProvider","requestCoupling","maxQueueSize","minQueueSize","omqlAliasBuilder","gridTextSearchConfigService","ordersCFDefs","orderItemCFDefs","getCustomFieldDefinitions","defs","getCriteria","searchText","exactMatch","aliasStack","criteria","iterateTree","pattern","cfDefs","as","def","pop","getDefaultConfig","mapAddress","addressLine","valueToCheck","fieldToCheck","contactConfirmationCode","userDto","addressDto","userCustomFields","customerCustomFields","phone","appReloadService","serverCurrentVersion","loadingShadowService","pingPromise","reconnectPromise","ping","pingCount","inAction","blockTillConnected","isStepTransitionAllowed","stepId","operation","actionId","assignedCentre","assignedCentre.address","order.customer","order.centre","centre.address","customer.address","OMQL_ORDER_ITEM_ALIASES","OMQL_ORDER_ALIASES","mapFieldToOrderItemAlias","restModelField","mapFieldInternal","mapFieldToOrderAlias","buildOperatorQuery","operator","omqlDateString","queryString","dtStart","valueOf","dtEnd","setMinutes","setSeconds","setMilliseconds","omqlStart","omqlEnd","buildQueryForDateValue","buildQueryForNumberValue","buildQueryForStringValue","defaultPrefix","aliasDictionary","keyToFind","strLeftBack","strRightBack","capitalize","forStep","buildWhereString","buildSortString","whereString","sortString","pageIndex","getForceIgnorePageSize","getIsExclusiveSelection","ignoredSteps","completedFilter","createdFilter","filterString","buildDatesFilterIfAny","textFilter","buildTextSearchFilterIfAny","filterByFields","filters","logic","parseFilterDescriptor","fDescriptor","omqlField","defaultFilters","union","buildFilterStringIfAny","stepsFilter","datesFilter","textSearchFilter","fieldsFilter","sortByFields","direction","rtrim","lastIndexOfBld","findLastIndex","place","class","FIRST_RUN_TOKEN","showCookiesPolicyMessage","cookiePolicyMessage","timeOut","extendedTimeOut","getUsername","getPublicHolidays","getCustomHolidays","currentYear","getActualPublicAndCustomHolidays","isTokenValid","AUTH_TOKEN_STORAGE_NAME","USERNAME_STORAGE_NAME","_passwordValidationRegex","_authToken","_userName","_lastUserName","expirationTimeoutPromise","setToken","setUsername","_resetAuthInfo","removeItem","username","getTokenInfo","b64","split","atob","exp","pwd","UserName","Password","afterLogout","reAuth","oldPassword","newPassword","requestPasswordReset","userNameOrEmail","doPasswordReset","resetRequestKey","stepsCache","stepType","getStepByCode","getStepById","saveStep","getStepStatistics","stepsToActions","orderItemIds","getUsers","getUser","saveUser","getUsersGroups","getUserCentres","getUserCustomers","getUserRole","getUserPermissions","savePromise","whereOrderItems","forUsers","searchQueryCache","executing","q","requestCouplerUtils","baserUrl","userUrl","orderDef","getOrders","getOrdersByStep","newOrder","_cfDefs","returnLiteModels","definitions","orderUrl","orderItemType","orderItemDef","getOrderItemsByStep","getOrderItemsByOrders","orders","countQueryCache","searchCount","downloadDocument","getOrderItemsByCategories","categoryIds","category","getOrderItemsByIds","orderItemUrl","getOperations","localizationRoute","languagesRoute","getLanguages","getTranslations","lang","getUpdatedTranslations","getPermissionsByGroupName","userGroupName","customFieldAwareDef","initUpload","initUploadModel","uploadData","saveDocumentCustomFields","modelUrl","deliveryAddressId","getCustomersStatistics","forCustomers","forCustomerId","getCentresByIds","forCentreId","categoryTypeModel","categoryModel","categoryTypeDefinition","getCategoryType","getCategoryTypeByCode","getCategoriesForCategoryType","categoryDefinition","getCategory","getOrderItemsForCategory","getCategoriesByIds","getCategoriesByTypeCode","categoryTypeCode","typeCode","categoryTypeCodes","typeCodes","linkOrderItemsToCategory","categoryId","unlinkOrderItemsFromCategory","getAddress","restProvider","actionExecutionDate","lastActionExecutionDate","secondsSinceLastActionExecution","actionProcessor","actionProcessorData","FieldValidationTemplates","emailPattern","culturePattern","groups","reference","summary","requiredBy","archiveJobLogEntryId","injectorProvider","orderCustomerId","orderCentreId","assignedCentreId","fileNameDecoded","decodeURIComponent","fileVersion","checkedOut","checkedOutBy","checkedOutById","cfObject","cf","$sourceTypes","addressId","restCentre","userFullName","userId","categoryTypeId","archived","categoryType","created","updated","contactTitle","word","allWords","services","getService","serviceName","reAuthPromise","reConnectPromise","serverUnavailableCodes","unAuthorisedCodes","ignoredUrls","responseError","OMVersion","Accept","$httpProvider","interceptors","batchers","defaultBatcherConfig","autoBatching","batchUrl","addBatcher","batcherConfig","getBathers","setDefaultBatcherConfig","forcedBatchProcessor","requestCount","asTransaction","processor","ForcedBatchProcessor","batcher","isMethodAllowed","isPathAllowed","isRegExp","getBatcher","RequestBatcherProcessor","sendBatchRequest","rid","batchBody","convertHeadersToObject","httpConfig","responses","statusCode","header","convertObjectHeadersToString","_requestCount","_asTransaction","batchingProvider","batchRequestCollectionDelay","maxBatchedRequestPerCall","minimumBatchSize","CustomLogicResolvers","injector","http","log","resourceName","resourceUri","prefixes","resourcesMap","customResourcesMap","addPossiblePrefixesToArray","array","customerPrefix","prefixFoundOnServer","resource","configName","defaultConfigObject","configUri","eval","CustomisationConfig","initCustomResourcesMap","resMap","predicate","numberingScheme","UpperJaw","LowerJaw","Jaw","LeftSide","RightSide","Side","FDIScheme","UniversalScheme","PalmerScheme","QUADRANT","teeth","FDI","Palmer","Universal","Quadrant","OrdinalPosition","MidlineOrdinalPosition","tooth","teethMap","SCHEME","EMPTY","getToothLabel","toothNumberingScheme","sortbyMidlineOrdinal","firstToothQuadrant","valueList","numElementsOverride","numElements","teethRepresentationClass","teethRepresentation","scheme","getNumElements","numelements","teethList","mappedTooth","$animate","offset","easing","animate","opacity","searchTermHighlight","doHighlight","searchTermWatcher","newValue","oldValue","scrollIntoViewIf","bringIntoViewWithTimeout","scrollIntoView","block","rect","getBoundingClientRect","elParent","parentElement","innerHeight","innerWidth","clientWidth","isElementInViewport","$parse","compile","$el","stopWatching","$parent","recompile","assign","newEl","replaceWith","mapWidth","mapHeight","mapTitle","mapCentreCoordinates","mapMarkers","parentCtrl","mapWindowElement","originalElementUpdated","outerHtml","bringUpMapWindow","mapWindowOptions","deactivate","setTarget","omMapWindow","doMapResize","markers","mm","ol","Feature","geom","Point","proj","fromLonLat","lon","lat","tileLayer","layer","Tile","source","OSM","vectorLayer","Vector","features","Style","image","Icon","anchor","anchorOrigin","anchorXUnits","anchorYUnits","omMapContainerDiv","getAccentColor","firstMarker","mapView","View","attribution","control","Attribution","collapsible","controls","constrainResolution","addLayer","setView","mapInitInternal","updateSize","pre","ctrl","Odometer","theme","hideLeadingZeros","odoWatcherDestructor","containerElem","showOdometer","spinnerConfig","$interpolate","priority","terminal","$attr","placeholder","siblings","inputContainer","cmp","moduleName","normalizeOffset","offsetRect","offsetObject","isPercent","n","QuickSignal","didSubscribeFunc","signalFromEvent","subscriber","handler","addEventListener","$dispose","removeEventListener","require","container","inViewOptions","$eval","viewportEventSignal","setTimeout","merge","eventsSignal","inviewInfoSignal","throttle","viewportRect","getViewportRect","compatMode","documentElement","r1","r2","elementRect","inView","offsetWidth","offsetHeight","getClientRects","generateParts","scan","lastInfo","newInfo","generateDirection","horizontal","vertical","changed","equals","inViewExpression","dispose","subscribe","$inview","$inviewInfo","nextValue","initial","scanFunc","signal","signals","disposables","signalMerge","threshhold","deferTimer","chainDisposable","clearTimeout","amd","exports","boundingBoxColor","sceneBackgroundColor","noFog","fogFar","forNear","gridSize","doResize","scene","camera","renderer","$containerElem","animationFrameId","bBoxColor","sceneBackColor","drawBoundingBoxes","Number","drawGrid","drawAxes","alignAxeIndex","alignOffset","destructing","sceneObjects","boundingBoxHelpers","update","render","resizeCanvasToDisplaySize","domElement","aspect","updateProjectionMatrix","setSize","THREE","WebGLRenderer","antialias","alpha","setPixelRatio","devicePixelRatio","Scene","background","Color","fog","Fog","fogNear","add","AxesHelper","AmbientLight","z","intensity","ld","dirLight","DirectionalLight","set","castShadow","shadow","near","far","mapSize","PerspectiveCamera","OrbitControls","enableDamping","dampingFactor","enableKeys","enableZoom","enablePan","enableRotate","resize","onGeometriesAdd","newGeometries","geometries","box","hasColors","mesh","meshInner","BufferGeometry","materials","deleteAttribute","tolerance","VerticesColorsHolder","rgbArray","_classCallCheck","summColors","verticesCount","averageColor","_createClass","EPSILON","hashToIndex","indices","getIndex","positions","getAttribute","vertexCount","nextIndex","attributeNames","tmpAttributes","tmpMorphAttributes","newIndices","getters","setters","includes","oldColorsMap","l","BufferAttribute","itemSize","normalized","morphAttr","morphAttributes","decimalShift","log10","shiftMultiplier","getX","attribute","oldColor","getterFunc","addVertexColor","newarray","newMorphArrays","setterFunc","ml","tmpAttribute","needsUpdate","tmpMorphAttribute","setIndex","mergeVertices","computeVertexNormals","BufferGeometryUtils","toCreasedNormals","MeshPhongMaterial","vertexColors","side","DoubleSide","shininess","emissive","specular","FrontSide","BackSide","Mesh","material","NoColors","receiveShadow","BoxHelper","Group","Object3D","meshMargin","nextMeshCenterShift","maxYSize","maxZSize","sceneObject","boundingBoxHelper","boundingBox","Box3","setFromObject","Vector3","getCenter","getSize","boundingBoxDestinationPosition","shift","subVectors","maxDimension","dist","tan","PI","fov","GridHelper","transparent","saveState","alignMeshesAndCamera","addGeometries","onGeometriesClear","cancelAnimationFrame","_onGeometriesAdd","_onGeometriesClear","viewTemplateElement","editTemplateElement","inlineEditFormName","editInputElement","viewTemplate","editTemplate","inlineEditContainerElementTemplate","inlineEditContainerElement","editFlagsMap","setEditMode","originalValue","originalValues","required","revertChangeAndCancelEdit","$commitViewValue","$rollbackViewValue","$setPristine","$setUntouched","$name","getEditMode","isEditMode","cancelOrSave","relatedTarget","toEditMode","selector","filteredOriginalAttrs","originalTextElementTemplate","buttonTemplate","wrapperTemplate","wrappedElement","originalTag","tagName","buttonElementId","originalTextElement","innerText","oa","setAttributeNode","cloneNode","buttonElement","originalTextWatcherDestructor","switchTranslatedState","stateToSet","showTranslation","doTranslate","currentTarget","elTranslated","textToTranslate","language","encodeURI","prepend","changeHandlerAttr","editSelectElement","watchers","getEditModeDD","setEditModeDD","isEditModeDD","saveDD","toEditModeDD","selectElement","cancelEditDD","wDestructor","itemTemplate","itemAlias","itemClick","itemEnabled","$swipe","startPointX","startLeftAttr","targetOffset","sliderViewBox","sliderCaret","isSwiping","firstTime","canSwipe","fixPositionFromOffset","currentOffset","nextEl","fixPosition","goToPosition","quick","animateCaret","canMoveLeft","canMoveRight","isButtonEnabled","moveLeft","moveRight","onButtonClick","getCaretDimensions","isTouch","point","end","move","delta","toJson","initOffset","intervalPromise","iElement","touch","registerElement","ignoreEnter","keypress","which","focusNext","watch","watchName","unregisterElement","elements","defaultTimeout","getVisibleElements","doFocusFirstElement","visibleElements","doFocusNextElement","toFocus","doFocusElement","leave","eq","customItems","bindToController","arrowUp","arrowDown","colorService","titleInternal","textLength","fontStyle","font-size","openTargetUri","colorSuffix","dynamicStyle","background-image","filterValue","accentColor","getComputedStyle","getPropertyValue","getFiltersToTransformBlackToColor","styleSheets","addRule","listName","reportsToShow","reportsGetters","resolveReport","stepFilter","gridFilter","gridSort","PAGE_SIZE_FOR_STEP_FILTER_PREFIX","isExclusiveSelection","forceIgnorePage","_customFilter","setIsExclusiveSelection","getTotalPageCount","_pageSize","_isExclusiveSelection","selectionWasChanged","_ignore","_step","_completed","_created","_text","_exactMatch","_pageNumber","_totalPageCount","_totalCount","_gridFiler","_gridSort","localStorageKey","oldValues","$watchGroup","newValues","pwdResetSuccess","pwdResetKey","pwdResetLabel","doPwdReset","ngModel","$setViewValue","isPwdResetRequested","pwdResetRequestUser","pwdResetRequestSuccess","requestPwdReset","userNameEmailValidator","$urlRouterProvider","homeControllerUpdatesService","orderStates","customOrderStates","allOpenOrdersCount","findItem","found","lazyInitData","debounceLimited","stepsStat","customOrderStatesConfig","stepModel","stepIndex","stepStat","stepStatisticValue","fork","forksJoin","afterJoin","statInfo","customOrderStateConfig","customOrderStateConfigIndex","getStatResultFromQueryPromise","setOrUpdateObjectsCollection","s1","s2","arrExistingData","arrNewData","matcher","_toConsumableArray","o2","refreshPromise","appErrors","clearErrors","refreshErrors","console","confirmAppReloadDialogOptions","appReloadDialogActions","reload","$localStorageProvider","initPromise","userSettingsKey","settingsToSave","customDefaultUserSettings","versionFromSaved","versionFromDefaultConfig","defaultUserSettings","versionFromCustomConfig","settingsToUse","otherwise","cookiesService","stateBeforeLogin","unfoundState","isAuth","previous","loadedResources","loadersInfo","ext","deps","arrayBuffer","loaderInfo","filename","STLLoader","ThreeMFLoader","AMFLoader","AWDLoader","TextDecoder","Uint8Array","json","BabylonLoader","parseArrayBuffer","fileToArrayBuffer","reader","onerror","abort","readAsArrayBuffer","byteLength","findLoaderByFilename","ensureLoaderLoaded","loaded","loadLoader","notLoadedDeps","fileUrl","some","loadingCache","FILE_UPLOAD_SERVICE_PATH","createUploadSession","customName","Id","FileName","FileSize","OrderItemIds","isNewOrder","sessions","deferredInner","promiseInner","next","existingDuplicateId","fileObject","generated","uploadSessionId","finalChunk","uploaded","sent","chunk","deferredStart","complete","contract","finalize","uploadFile","mode","cache","Request","fetch","ok","g","b","clamp","angle","sin","cos","multiply","matrix","newR","newG","newB","linear","slope","intercept","h","Solver","baseColor","targetHSL","hsl","reusedColor","solveNarrow","solveWide","loss","best","spsa","wide","A","A1","iters","bestLoss","deltas","highArgs","lowArgs","ck","lossDiff","ak","idx","fix","invert","sepia","saturate","hueRotate","brightness","contrast","colorHSL","abs","fmt","hexToRgb","hex","rgb","solve","_scannedSymbolsDelay","_lastKeys","isTextBox","lastSymbolEnteredAt","scannedValue","raiseValueScannedEvent","addChar","char","toastrConfig","closeButton","allowHtml","closeHtml","containerId","tapToDismiss","messageClass","positionClass","titleClass","toastClass","iconClasses","omLoggerProvider","logger","consoleAppender","ajaxAppender","level","_omLoggerProvider","logStorage","bufferSize","bufferExpirationTime","sendLevel","logMessage","parsedArgs","exceptions","arg","stack","parseException","parseArguments","logToConsoleByLevel","ex","groupEnd","timeZoneOffset","getTimezoneOffset","toSend","entry","logs","sendLogToServer","assert","groupCollapsed","timeEnd","fatal","getLogs","omLogger","localStorage","uniquePrefix","chr","len","protocol","hostname","port","pathname","getBaseUrl","fromJson","highlightUntranslatedStrings","LocaleName","languagesList","currentLanguage","setCurrentLanguage","langList","languageCode","getMostSuitableLanguage","strings","loadRemote","translated","insertions","serverLocalizationCache","localizationRepository","hasLanguage","updateCache","resourceCode","setValue","translateInternal","getValue","translateMany","getAllValues","keyPrefix","allPairs","pairs","pair","languageTag","_toTitleCase","_constructFromString","variant","defaultDelimiter","_getComparable","availableLanguages","comparable","ui","FlatColorPicker","FilterCell","operators","gte","gt","lte","lt","neq","endswith","startswith","doesnotcontain","enum","enums","ColorPicker","ColumnMenu","sortAscending","sortDescending","lock","unlock","Editor","bold","italic","underline","strikethrough","superscript","subscript","justifyCenter","justifyLeft","justifyRight","justifyFull","insertUnorderedList","insertOrderedList","indent","outdent","createLink","unlink","insertImage","insertFile","insertHtml","viewHtml","fontName","fontNameInherit","fontSize","fontSizeInherit","formatBlock","formatting","foreColor","backColor","emptyFolder","orderBySize","orderByName","invalidFileType","deleteFile","overwriteFile","directoryNotFound","imageWebAddress","imageAltText","imageWidth","imageHeight","fileWebAddress","fileTitle","linkWebAddress","linkText","linkToolTip","linkOpenInNewWindow","dialogUpdate","dialogInsert","dialogButtonSeparator","dialogCancel","createTable","addColumnLeft","addColumnRight","addRowAbove","addRowBelow","deleteRow","deleteColumn","dropFilesHere","FileBrowser","isTrue","isFalse","FilterMenu","and","or","selectValue","Gantt","views","day","addChild","insertBefore","insertAfter","Grid","commands","canceledit","create","edit","editable","cancelDelete","confirmation","confirmDelete","Groupable","NumericTextBox","upArrowText","downArrowText","Pager","of","itemsPerPage","morePages","PivotGrid","measureFields","columnFields","rowFields","PivotFieldMenu","filterFields","include","RecurrenceEditor","frequencies","never","hourly","yearly","repeatEvery","days","repeatOn","weeks","years","mobileLabel","after","occurrence","endCountOccurrence","endCountAfter","endLabel","endNever","endUntilOn","offsetPositions","second","third","fourth","weekdays","weekday","weekend","Scheduler","allDay","showFullDay","showWorkDay","deleteWindowTitle","ariaSlotLabel","ariaEventLabel","workWeek","agenda","recurrenceMessages","deleteWindowOccurrence","deleteWindowSeries","editWindowTitle","editWindowOccurrence","editWindowSeries","deleteRecurring","editRecurring","editor","allDayEvent","repeat","timezone","startTimezone","endTimezone","separateTimezones","timezoneEditorTitle","timezoneEditorButton","timezoneTitle","noTimezone","editorTitle","Slider","increaseButtonTitle","decreaseButtonTitle","TreeView","requestFailed","retry","Upload","localization","uploadSelectedFiles","statusUploading","statusUploaded","statusWarning","statusFailed","headerStatusUploading","headerStatusUploaded","Validator","kendoMessages","defaultLanguage","setGuestLanguage","LoadingMixin","angularLocalization","kendoLocalization","translatedLanguageList","browserLocale","getBrowserLocale","browserLanguage","systemLanguage","userLanguage","finish","drop","tmhDynamicLocaleProvider","localeLocationPattern","tmhDynamicLocale","_isLoading","_isDropped","_loadingDeferred","isLoading","instanceInjector","exists","keysFromPath","re","objectDeepContainsStr","object","subEl","isObject","mixin","clearObjectProps","propertyName","targetObj","sourceObj","treeRoot","itemsFieldName","beforeFunc","afterFunc","iterateTreeRecursive","ks","hasPath","arr","wait","waitLimit","waitLimitTimeout","later","toUtf16Bytes","bytes","ii","escape","changeTagName","newTagName","replacement","dasherize","swing","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","sqrt","easeOutCirc","easeInOutCirc","easeInElastic","asin","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","touchStatus","startX","currentX","screenX","startY","currentY","screenY","eventType","swipeTolerance","latestTap","offsetX","offsetY","checkForDoubleTap","swipeEvents","touchStart","touchMove","touchCancel","touchEnd","evt","eachTouch","touches","identifier","loc","purge","num","originalEvent","changedTouches","addSwipeEvents","node","className","nodeType","wordNode","splitText","wordClone","parentNode","replaceChild","childNodes","firstChild","normalize","words","caseSensitive","wordsOnly","flag","_iterator","_createForOfIteratorHelper","Symbol","freeze","dtToday","isLessOrEqualTimeOfDay","hours","minutes","hoursToCompareTo","minutesToCompareTo","isSameDateIgnoringTime","date1","date2","diffHours","parseFromWeekNumber","yearWeekNumberString","setTime","toLocaleShortDateString","toLocaleDateString","januaryFirst","daysToNextMonday","nextMonday","diff","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","addHours","copiedDate","isLeapYear","getDaysInMonth","addMonths","yearsToAdd","trunc","monthsToAdd","setFullYear","addHoursSkippingNonWorkingDays","hoursToAdd","addValue","exception","cause","oldErrors","messageToLocalStorage","toLocaleTimeString","toLocalStorage","eventNames","_handlers","eventHandler","ename","en","getEvents","MaxTouchPoints","msMaxTouchPoints","_currentUser","resetCurrentUser","getCurrent","CustomTemplateResolver","_default","customAliasExpression","conditionContextExpression","failOverUri","useFailOver","customAlias","conditionContext","useFailoverTemplate","downloadAndBindHtml","processExpressions","resolveTemplateUri","customTemplateUrl","oldCustomTemplateUrl","resolveFromConfig","contextData","currentContext","cond","opt","resolveDirective","resolveImage","resolveStyle","CD","CD_WRAPPER","CD_NAME","CD_TYPE","CD_VALUE","CD_CUSTOM_NAME","DEFAULT_TAG","CUSTOM_DIRECTIVE","cdName","cdValue","cdType","wrap","cdCustomName","cdResolved","cdNewCustomName","cdNewResolved","customCssUrl","oldCustomCssUrl","customImgUrl","$compileProvider","debugInfoEnabled"],"mappings":"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","file":"../app.min.js","sourcesContent":["// Module for html templates registration(in $templateCache)\r\n// Should be included in modules that uses external html files as templates\r\nangular.module('templates', []);","angular.module('templates').run(['$templateCache', function($templateCache) {$templateCache.put('app/ui/error/error.html','
\\r\\n
\\r\\n\\r\\n
\\r\\n

Here is what happened...

\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
{{errorRow}}
\\r\\n
\\r\\n
\\r\\n\\r\\n

That\\'s all we know.

\\r\\n\\r\\n
\\r\\n Refresh \\r\\n Clear\\r\\n
\\r\\n
');\n$templateCache.put('app/ui/help/help.html','
\\r\\n\\r\\n
\\r\\n \\r\\n {{\\'General Help\\'|translate}}\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n Home\\r\\n
\\r\\n
\\r\\n Help.Home\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n Orders\\r\\n
\\r\\n
\\r\\n Help.Orders\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n Settings\\r\\n
\\r\\n
\\r\\n Help.Settings\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n Help\\r\\n
\\r\\n
\\r\\n This page\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n Log Out\\r\\n
\\r\\n
\\r\\n Help.LogOut\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n {{\"Got it\"|translate}}\\r\\n
\\r\\n\\r\\n
\\r\\n');\n$templateCache.put('app/ui/home/home.html','
\\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');\n$templateCache.put('app/ui/login/login.html','
\\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 \\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 \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
An email has been sent to your registered address. Please follow the instructions in this email to complete the password reset.\\r\\n
\\r\\n
\\r\\n Back\\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
{{\\'Back\\'|translate}}
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n\\r\\n\\r\\n');\n$templateCache.put('app/ui/login/pwdReset.html','
\\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 Click here to login to Order Manager with new password.\\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
\\r\\n');\n$templateCache.put('app/ui/omqlTester/omqlTester.html','
\\r\\n

OMQL Search OrderItems

\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n Where\\r\\n \\r\\n \\r\\n
\\r\\n Order by\\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n
{{results}}
\\r\\n
\\r\\n\\r\\n
\\r\\n');\n$templateCache.put('app/ui/shell/shell.html','
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n');\n$templateCache.put('app/ui/omStat/bookmarkButton.html','\\r\\n');\n$templateCache.put('app/ui/omStat/honeyButton.html','\\r\\n');\n$templateCache.put('app/ui/omStat/omStat.html','
\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n
\\r\\n
');\n$templateCache.put('common/directives/buttonSliderMenu/buttonSliderMenu.html','
0\">\\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\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('common/directives/meshViewer/meshViewer.html','
\\r\\n');\n$templateCache.put('common/directives/omSpinner/omSpinner.html','
\\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\\r\\n
\\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('common/directives/omStatCounter/omStatCounter.html','\\r\\n');\n$templateCache.put('app/ui/centre/overview/gridHeader.html','
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
0\">\\r\\n \\r\\n
\\r\\n');\n$templateCache.put('app/ui/centre/overview/overview.html','
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n {{pageDisplayName}}\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n {{\\'Sorry, you have no access to this data :(\\'|translate}}\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
{{\\'Id:\\'|translate}} {{centre.getId()}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{centre.$model.address.$model.companyName}}\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
[{{centre.$model.code}}]
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
{{\\'Total\\'|translate}}
\\r\\n
00000
\\r\\n
{{ordersTotals.total}}
\\r\\n
\\r\\n
\\r\\n
{{\\'Open\\'|translate}}
\\r\\n
00000
\\r\\n
{{ordersTotals.open}}
\\r\\n
\\r\\n
\\r\\n
{{\\'Cancelled\\'|translate}}
\\r\\n
00000
\\r\\n
{{ordersTotals.cancelled}}
\\r\\n
\\r\\n
\\r\\n
{{\\'Completed\\'|translate}}
\\r\\n
00000
\\r\\n
{{ordersTotals.completed}}
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
{{\\'Orders in Progress\\'|translate}}
\\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
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
0\" ng-show=\"currentTab.name == tab.name\">\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n');\n$templateCache.put('app/ui/centre/list/list.html','
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n {{pageDisplayName}}\\r\\n
\\r\\n\\r\\n
\\r\\n {{\\'Sorry, you have no access to this data :(\\'|translate}}\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
{{\\'Search Centres:\\'|translate}}
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
{{\\'Total Centres\\'|translate}}
\\r\\n
00000
\\r\\n
{{centres.length}}
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n
{{\\'Id\\'|translate}}
\\r\\n
{{\\'Code\\'|translate}}
\\r\\n
{{\\'Name\\'|translate}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{\\'Loading centres data...\\'|translate}}\\r\\n
\\r\\n\\r\\n \\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n');\n$templateCache.put('app/ui/customer/overview/gridHeader.html','
\\r\\n {{\\'Open Orders List\\'|translate}}\\r\\n
\\r\\n
\\r\\n
\\r\\n {{\\'Show Completed\\'|translate}} \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n   {{\\'From:\\'|translate}}\\r\\n \\r\\n {{\\'To:\\'|translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n');\n$templateCache.put('app/ui/customer/overview/overview.html','
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n {{pageDisplayName}}\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n {{\\'Sorry, you have no access to this data :(\\'|translate}}\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
{{\\'Id:\\'|translate}} {{customer.getId()}}
\\r\\n
\\r\\n
\\r\\n
\\r\\n {{customer.$model.address.$model.companyName}}\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
[{{customer.$model.code}}]
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
{{\\'Total\\'|translate}}
\\r\\n
00000
\\r\\n
{{ordersTotals.total}}
\\r\\n
\\r\\n
\\r\\n
{{\\'Open\\'|translate}}
\\r\\n
00000
\\r\\n
{{ordersTotals.open}}
\\r\\n
\\r\\n
\\r\\n
{{\\'Cancelled\\'|translate}}
\\r\\n
00000
\\r\\n
{{ordersTotals.cancelled}}
\\r\\n
\\r\\n
\\r\\n
{{\\'Completed\\'|translate}}
\\r\\n
00000
\\r\\n
{{ordersTotals.completed}}
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
{{\\'Current Orders\\'|translate}}
\\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\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n');\n$templateCache.put('app/ui/customer/list/list.html','
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n {{pageDisplayName}}\\r\\n
\\r\\n\\r\\n
\\r\\n {{\\'Sorry, you have no access to this data :(\\'|translate}}\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
{{\\'Search Customers:\\'|translate}}
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
{{\\'Total Orders\\'|translate}}
\\r\\n
00000
\\r\\n
{{totalOrdersCount}}
\\r\\n
\\r\\n
\\r\\n
{{\\'Total Customers\\'|translate}}
\\r\\n
00000
\\r\\n
{{customers.length}}
\\r\\n
\\r\\n
\\r\\n
{{\\'Active Customers\\'|translate}}
\\r\\n
00000
\\r\\n
\\r\\n {{activeCustomersCount}}\\r\\n
0, down:customersStat.activeCustomersChange < 0}\">\\r\\n 0, \\'fa-caret-down\\':customersStat.activeCustomersChange < 0}\">\\r\\n
\\r\\n {{customersStat.activeCustomersChange > 0 ? \\'+\\' + customersStat.activeCustomersChange : customersStat.activeCustomersChange}}\\r\\n {{\\'last week\\'|translate}}\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
{{\\'Orders\\'|translate}}
\\r\\n \\r\\n \\r\\n
{{\\'Id\\'|translate}}
\\r\\n
{{\\'Code\\'|translate}}
\\r\\n
{{\\'Name\\'|translate}}
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/login/loginShadow/loginShadow.html','
\\r\\n\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/orderItemCard/orderItemCard.html','
\\r\\n {{\\'Loading items...\\'|translate}}\\r\\n
\\r\\n
\\r\\n {{\\'Loading item details...\\'|translate}}\\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 \\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
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n {{\\'Summary\\'|translate}}\\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 \\r\\n
This istemplate div for loading
Just as a placeholder div
For a bettervisual clue of the UI
This is a wonderfultemplate div
Just as a placeholder
For a bettervisual clue of the UI div
This is a loadingtemplate div
This is a divis a loading template div for UI
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/report/reportRouteContainer/reportRouteContainer.html','');\n$templateCache.put('app/ui/report/reportViewer/reportViewer.html','
\\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n {{\\'Cancel\\'|translate}}\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/shell/views/centrePanel.html','
\\r\\n
\\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/shell/views/footerPanel.html','');\n$templateCache.put('app/ui/shell/views/headerPanel.html','
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/shell/views/leftPanel.html','\\r\\n');\n$templateCache.put('app/ui/shell/views/rightPanel.html','');\n$templateCache.put('app/ui/user/notifications/notifications.html','
\\r\\n\\r\\n
{{\\'Notifications\\'|translate}}
\\r\\n\\r\\n

\\r\\n\\r\\n

\\r\\n some notifications related data here\\r\\n

\\r\\n\\r\\n
\\r\\n\\r\\n');\n$templateCache.put('app/ui/user/profile/profile.html','
\\r\\n
\\r\\n \\r\\n {{\\'Profile\\'|translate}}\\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 \\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
\\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
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n
{{\\'Cancel\\'|translate}}
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/user/settings/settings.html','
\\r\\n\\r\\n
\\r\\n \\r\\n {{\\'Personal settings\\'|translate}}\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
    \\r\\n
  • {{\\'Preferences\\'|translate}}
  • \\r\\n
  • {{\\'Search configuration\\'|translate}}
  • \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n

UserSettings.checkboxes.title

\\r\\n\\r\\n
\\r\\n \\r\\n {{dataItem.text|translate}}\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
{{\"Cancel\"|translate}}
\\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n
{{\"Done\"|translate}}
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n');\n$templateCache.put('app/ui/order/orderDetailedView/orderDetailed/orderDetailed.html','\\r\\n
\\r\\n\\r\\n \\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/orderDetailedView/orderDetailedRouteContainer/orderDetailedRouteContainer.html','');\n$templateCache.put('app/ui/order/newOrderView/newOrderAddressEditor/newOrderAddressEditor.html','
\\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 \\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
\\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
\\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 \\r\\n \\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/newOrderView/newOrderAddressSelector/newOrderAddressSelector.html','
\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
{{\\'New\\'|translate}}
\\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 {{selectedAddress.contact}}\\r\\n
\\r\\n
\\r\\n \\r\\n {{selectedAddress.email}}\\r\\n
\\r\\n
\\r\\n \\r\\n {{selectedAddress.telephone}}\\r\\n
\\r\\n
\\r\\n \\r\\n {{selectedAddress.postal}}\\r\\n
\\r\\n
\\r\\n \\r\\n {{selectedAddress.line1}}\\r\\n
\\r\\n
\\r\\n \\r\\n {{selectedAddress.line2}}\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/newOrderView/newOrderFilesLoader/newOrderFilesLoader.html','
\\r\\n \\r\\n\\r\\n
\\r\\n
\\r\\n \\r\\n {{\\'Drop files here\\'|translate}}\\r\\n
\\r\\n {{\\'or click to select\\'|translate}}\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n {{file.name}}\\r\\n
\\r\\n
\\r\\n
\\r\\n
');\n$templateCache.put('app/ui/order/newOrderView/newOrderCustomerSelector/newOrderCustomerSelector.html','
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/newOrderView/newOrderProgress/newOrderProgress.html','
\\r\\n
\\r\\n
');\n$templateCache.put('app/ui/order/newOrderView/newOrderRouteContainer/newOrderRouteContainer.html','\\r\\n');\n$templateCache.put('app/ui/order/orderItemCard/orderItemActions/orderItemActions.html','
0\">\\r\\n \\r\\n \\r\\n
');\n$templateCache.put('app/ui/order/orderItemCard/orderItemActions/orderItemActionsButton.html','
\\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
{{action.name|sTranslate}}
\\r\\n\\r\\n
');\n$templateCache.put('app/ui/order/orderItemCard/orderItemFiles/orderItemFiles.html','
\\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n\\r\\n \\r\\n {{\\'There are no attached documents yet\\'|translate}}\\r\\n \\r\\n
\\r\\n \\r\\n
0 && documents.length > pageSize\">\\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n {{currentPage+1}} of {{numberOfPages()}}\\r\\n \\r\\n\\r\\n = documents.length/pageSize - 1\" ng-click=\"nextPage()\" title=\"{{\\'Next page with files\\'|translate}}\" class=\"fa fa-lg fa-angle-right files-pager-btn\">\\r\\n \\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n 1\" ng-href=\"views/documents/download?orderItemId={{orderItemId}}\" target=\"_blank\">\\r\\n {{\\'download all\\'|translate}}\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n\\r\\n
\\r\\n \\r\\n \\r\\n
ICO First file name goes here on this line
\\r\\n
ICO Second file here goes here
\\r\\n
ICO one more file name goes this line
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/orderItemCard/orderItemComments/orderItemComments.html','
\\r\\n \\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
No comments yet
\\r\\n
\\r\\n\\r\\n
\\r\\n
ICO Comment label
\\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
date label goes here
\\r\\n
visibility label
\\r\\n
some comment text value here
\\r\\n
date label goes here
\\r\\n
visibility label
\\r\\n
some comment text here
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/orderItemCard/orderItemInfo/orderItemInfo.html','
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n Status OneStatus TwoStatus\\r\\n Another FieldField\\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
Some field labelsome field value
Some other field labelother value
Another field hereAnother longer value here
\\r\\n
\\r\\n
Some order property out of the above table
\\r\\n
Another order property here
\\r\\n
Yet another one order property here
\\r\\n
\\r\\n\\r\\n \\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/orderItemCard/orderReports/orderReports.html','
\\r\\n\\r\\n \\r\\n {{\\'There are no reports available for this item\\'|translate}}\\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n {{report.name|sTranslate}}\\r\\n \\r\\n
\\r\\n\\r\\n
0 && reports.length > pageSize\">\\r\\n\\r\\n \\r\\n \\r\\n\\r\\n \\r\\n {{currentPage+1}} of {{numberOfPages()}}\\r\\n \\r\\n\\r\\n = reports.length/pageSize - 1\" ng-click=\"currentPage=currentPage+1\" title=\"{{\\'Next page with reports\\'|translate}}\" class=\"fa fa-lg fa-angle-right reports-pager-btn\">\\r\\n \\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n
ICO Order Label
\\r\\n
ICO Order Detail
\\r\\n
ICO Order Workflow Audit
\\r\\n
ICO Order Files Quality Report
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/stepDetailedView/stepDetailedRouteContainer/stepDetailedRouteContainer.html','');\n$templateCache.put('app/ui/order/stepDetailedView/stepDetailed/stepDetailed.html','
\\r\\n\\r\\n \\r\\n\\r\\n \\r\\n \\r\\n
\\r\\n {{\\'Specified item not found. Select an item to view details.\\'|translate}}\\r\\n
\\r\\n\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/orderItemsGridView/orderItemsGrid/gridHeader.html','
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n {{\\'Show Completed\\'|translate}} \\r\\n \\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n   {{\\'From:\\'|translate}}\\r\\n \\r\\n {{\\'To:\\'|translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
1\">\\r\\n {{getSelectionInfoLabel()}}\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/orderItemsGridView/orderItemsGrid/orderItemsGrid.html','
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
{{viewTitle}}
\\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\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/orderItemsGridView/orderItemsGridRouteContainer/orderItemsGridRouteContainer.html','');\n$templateCache.put('app/ui/order/orderItemCard/orderItemFiles/fileUpload/fileUpload.html','
\\r\\n \\r\\n
\\r\\n
\\r\\n
Oops, this order item already has an attached file named \\'{{fileNameConflict}}\\'.
\\r\\n
Please choose, if you want to overwrite the file or skip this transfer and keep existing file.
\\r\\n
\\r\\n \\r\\n
{{\"Replace\"|translate}}
\\r\\n \\r\\n
\\r\\n \\r\\n
{{\"Upload a copy\"|translate}}
\\r\\n \\r\\n
\\r\\n \\r\\n
{{\"Skip\"|translate}}
\\r\\n \\r\\n
\\r\\n
\\r\\n
1\">\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n {{\\'Drop files here\\'|translate}}\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n {{\\'Uploading...\\'|translate}} \\r\\n
\\r\\n
\\r\\n {{\\'or click to select\\'|translate}}\\r\\n {{uploadInfo.text}}\\r\\n\\r\\n
\\r\\n
\\r\\n {{item.file.name}}
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/orderItemCard/orderItemComments/commentRow/commentRow.html','
\\r\\n
\\r\\n
{{comment.$model.created | date:\\'MM/dd/yyyy h:mm a\\'}}
\\r\\n
{{comment.$model.userFullName}}
\\r\\n
[{{\\'Customer visible\\'|translate}}]
\\r\\n
\\r\\n
\\r\\n {{comment.$model.text}}\\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('app/ui/order/orderItemCard/orderItemComments/newComment/newComment.html','
\\r\\n \\r\\n
\\r\\n\\r\\n\\r\\n  \\r\\n {{\\'Add Comment\\'|translate}}\\r\\n\\r\\n\\r\\n
\\r\\n\\r\\n
\\r\\n\\r\\n
{{getCurrentTime() | date:\\'MM/dd/yyyy h:mm a\\'}}
\\r\\n\\r\\n
{{user.$model.firstName}} {{user.$model.lastName}}
\\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
\\r\\n');\n$templateCache.put('branding/footlink/assetsRegister/assetsRegister.html','
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n {{\\'Ortesi Owned Assets Register\\' | translate}}\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n {{\\'View:\\' | translate}}\\r\\n \\r\\n
\\r\\n
\\r\\n Latest available ScanApp versions are {{winScanAppLatestVersion}} (Windows) and {{iOSScanAppLatestVersion}} (iOS)\\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 \\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 \\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 \\r\\n = users.length\">\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n {{tableHeaderLabel}}\\r\\n [{{usersCount}}] - {{todayDate | date:\\'mediumDate\\'}}\\r\\n
\\r\\n
{{\\'Device ID\\' | translate}}\\r\\n {{\\'Username\\' | translate}}\\r\\n {{\\'Device\\' | translate}}\\r\\n {{\\'3D Scanner\\' | translate}}\\r\\n \\r\\n {{\\'ScanApp ver.\\' | translate}}\\r\\n \\r\\n \\r\\n {{\\'Last Order On\\' | translate}}\\r\\n
{{\\'Type\\' | translate}} (from user.class){{\\'Model\\' | translate}}{{\\'Serial\\' | translate}}\\r\\n {{\\'OS ver.\\' | translate}}\\r\\n \\r\\n \\r\\n {{\\'Device Location\\' | translate}}\\r\\n {{\\'Model\\' | translate}}{{\\'Serial\\' | translate}}{{\\'Firmware\\' | translate}}
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n {{user.device.deviceName || user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.MachineName || \\'n/a\\'}}\\r\\n \\r\\n {{user.$model.name || \\'n/a\\'}}\\r\\n \\r\\n {{user.$model.customFields.Class || user.device.model || \\'n/a\\'}}\\r\\n \\r\\n {{user.device.model || user.$model.jsonData.DeviceInfo.MachineModel}}\\r\\n \\r\\n {{user.device.serialNumber || user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.MachineSerialNumber || \\'n/a\\'}}\\r\\n \\r\\n
\\r\\n {{user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.Platform || user.device.operatingSystem}},\\r\\n {{user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.PlatformVersion || user.device.osVersion}}\\r\\n
\\r\\n
\\r\\n {{\\'TOO OLD / NO INFO\\' | translate}}\\r\\n n/a\\r\\n
\\r\\n
\\r\\n {{user.device.operatingSystem}},\\r\\n {{user.device.osVersion}}\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n See in OM\\r\\n
\\r\\n
\\r\\n {{\\'n/a\\' | translate}}\\r\\n
\\r\\n
\\r\\n {{user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.SelectedScannerInfoLeft.Model || user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.SelectedScannerInfoRight.Model || \\'n/a\\'}}\\r\\n \\r\\n \\r\\n {{user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.SelectedScannerInfoLeft.SerialNumber || user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.SelectedScannerInfoRight.SerialNumber || \\'n/a\\'}}\\r\\n \\r\\n \\r\\n \\r\\n {{user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.SelectedScannerInfoLeft.FirmwareVersion}}\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n ScanApp {{user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.ApplicationVersion}}\\r\\n
\\r\\n
\\r\\n {{\\'TOO OLD / NO INFO\\' | translate}}\\r\\n n/a\\r\\n
\\r\\n
\\r\\n {{user.lastOrder.$model.created | date:\\'shortDate\\'}}\\r\\n No orders
Enrolled on {{user.device.enrolledDateTime | date:\\'shortDate\\'}}
\\r\\n
\\r\\n {{\\'Total Users with Company Devices:\\' | translate}} {{users.length}}\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('branding/footlink/signup/signup.html','
\\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 \\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 \\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
\\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
\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n We will email your Activation Code (and then your new Username and Password) to the same email address that you provided.\\r\\n \\r\\n \\r\\n We have emailed your Activation Code to the email address that you provided. Please fill in this code and submit form.\\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 \\r\\n Thank you for your patience!
\\r\\n We have emailed your login and password to the Clinic Email address you have provided.\\r\\n
\\r\\n

\\r\\n \\r\\n You can now log in.\\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
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n Our records show that your clinic already registered with Ortesi.\\r\\n
\\r\\n Please, fill-in your contact details below and we will reach you as soon as possible.\\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 \\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n
\\r\\n \\r\\n Thank you for your patience!
\\r\\n We will contact you using details you have provided as soon as possible.\\r\\n
\\r\\n

\\r\\n
\\r\\n
\\r\\n
\\r\\n
\\r\\n');\n$templateCache.put('branding/footlink/statistics/statistics.html','
\\r\\n
\\r\\n \\r\\n
\\r\\n\\r\\n
\\r\\n \\r\\n {{\\'Customers Ordering Statistics for \\' + monthsCount + \\' months\\'|translate}}\\r\\n
\\r\\n\\r\\n
\\r\\n {{\\'View\\'|translate}}\\r\\n \\r\\n {{\\'orders from\\'|translate}}\\r\\n \\r\\n {{\\'for\\'|translate}}\\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 \\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 = statsByUser.length\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n = statsByUser.length\">\\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n {{statsTableHeaderLabel}} - {{orderTypeLabel}}\\r\\n [{{\\'Users:\\'|translate}} {{usersCount}}; {{\\'Orders:\\'|translate}} {{orderItemsCount}}]\\r\\n
\\r\\n
{{\\'Username\\'|translate}}{{\\'Device ID\\'|translate}}{{\\'Orders\\'|translate}}\\r\\n {{monthsCount}} Mo. avg\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n {{month.name|translate}}\\r\\n
\\r\\n {{userStat.userName}}\\r\\n \\r\\n {{userStat.$model.customFields.DeviceId || \\'n/a\\'}}\\r\\n \\r\\n {{(userStat.ordersByMonth[userMonth.index]) || 0}}\\r\\n \\r\\n {{(userStat.count / monthsCount) | number:2}}\\r\\n
\\r\\n {{\\'Average Orders:\\'|translate}}\\r\\n \\r\\n {{((statsByMonths[userMonth.index] / statsByUser.length) | number:2) || \\'0\\'}}\\r\\n \\r\\n {{((orderItemsCount / statsByUser.length / monthsCount)| number:2) || \\'0\\'}}\\r\\n
\\r\\n {{\\'Total Orders:\\'|translate}}\\r\\n \\r\\n {{(statsByMonths[userMonth.index]) || \\'0\\'}}\\r\\n \\r\\n {{orderItemsCount}}\\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
\\r\\n
\\r\\n \\r\\n {{\\'Users awaiting for scanner\\'|translate}}\\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 \\r\\n \\r\\n \\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n {{\\'Awaiting for scanner\\'|translate}}\\r\\n
\\r\\n
{{\\'Username\\'|translate}}{{\\'Waiting For\\'|translate}}
\\r\\n {{wUser.$model.name}}\\r\\n \\r\\n {{getWaitingUserType(wUser)}}\\r\\n
\\r\\n {{\\'Total:\\'|translate}}\\r\\n \\r\\n {{waitingUsers.length}}\\r\\n
\\r\\n
\\r\\n\\r\\n
\\r\\n');}]);","angular.module('env.custom.customModule.statistics', ['common.directives.inView'])\r\n\r\n // Below is the route config and controller for the custom view 'Customers' for Footlink company\r\n .config(function ($stateProvider) {\r\n\r\n $stateProvider.state('client.statistics', {\r\n url: '/statistics',\r\n templateUrl: 'branding/footlink/statistics/statistics.html',\r\n controller: 'StatisticsController',\r\n\r\n data: {pageTitle: 'OrderManager: Customers Overview'}\r\n });\r\n })\r\n\r\n .controller('StatisticsController', function StatisticsController($q,\r\n $log,\r\n $scope,\r\n $state,\r\n toastr,\r\n gettextCatalog,\r\n usersRepository,\r\n $timeout,\r\n customResourceResolver,\r\n $customisationConfig,\r\n permissions,\r\n uiLocalization) {\r\n\r\n $scope.isBusy = true;\r\n $scope.monthsCount = 6; //Controls dynamically the length of the period we want the stats to be gathered for\r\n $scope.months = [];\r\n $scope.propertyToSortBy = 'count';\r\n $scope.reverse = false;\r\n $scope.statsTableHeaderLabel = '';\r\n $scope.limit = 10; // initial value for limit\r\n\r\n $scope.waitingUsersOptions = {\r\n title: \"Waiting List\",\r\n position: {\r\n top: '15%',\r\n left: (jQuery(window).width() - 600) / 2\r\n },\r\n animation: om.config.kendoWindowDefaultOptions.animation\r\n };\r\n\r\n var orderTypes = [\r\n {\r\n text: gettextCatalog.getString(\"New pair\"),\r\n value: {isSecond: false}\r\n },\r\n {\r\n text: gettextCatalog.getString(\"Second pair\"),\r\n value: {isSecond: true}\r\n }\r\n ];\r\n var statsReportTypes = [\r\n {\r\n text: gettextCatalog.getString(\"iQubes - Company owned\"),\r\n value: {deviceType: 'Windows', deviceId: ''}\r\n },\r\n {\r\n text: gettextCatalog.getString(\"iPads - Company owned\"),\r\n value: {deviceType: 'IOS', deviceId: ''}\r\n },\r\n {\r\n text: gettextCatalog.getString(\"iQubes - User owned\"),\r\n value: {deviceType: 'Windows', deviceId: 'Own'}\r\n },\r\n {\r\n text: gettextCatalog.getString(\"iPads - User owned\"),\r\n value: {deviceType: 'IOS', deviceId: 'Own'}\r\n }\r\n ];\r\n var statsPeriods = [\r\n {\r\n text: gettextCatalog.getString('Quarter'),\r\n value: 3\r\n },\r\n {\r\n text: gettextCatalog.getString('Half Year'),\r\n value: 6\r\n },\r\n {\r\n text: gettextCatalog.getString('1 year'),\r\n value: 12\r\n }\r\n ];\r\n\r\n $scope.dropdownOrdersTypeOptions = {\r\n dataSource: orderTypes,\r\n dataTextField: \"text\",\r\n dataValueField: \"value\",\r\n valueTemplate: '',\r\n template: \"{{dataItem.text|sTranslate}}\",\r\n select: function (e) {\r\n var selectedItem = $scope.dropdownOrdersTypeOptions.dataSource[e.item.index()];\r\n if ($scope.orderType !== selectedItem.value) {\r\n $scope.orderTypeLabel = selectedItem.text;\r\n $scope.orderType = selectedItem.value;\r\n $scope.isBusy = true;\r\n $scope.statsByUser = null;\r\n initData();\r\n }\r\n },\r\n dataBound: function () {\r\n this.list.width('auto');\r\n }\r\n };\r\n $scope.dropdownStatsOptions = {\r\n dataSource: statsReportTypes,\r\n dataTextField: \"text\",\r\n dataValueField: \"value\",\r\n valueTemplate: '',\r\n template: \"{{dataItem.text|sTranslate}}\",\r\n select: function (e) {\r\n var selectedItem = $scope.dropdownStatsOptions.dataSource[e.item.index()];\r\n if ($scope.statsReportType !== selectedItem.value) {\r\n $scope.statsTableHeaderLabel = selectedItem.text;\r\n $scope.statsReportType = selectedItem.value;\r\n $scope.isBusy = true;\r\n $scope.statsByUser = null;\r\n initData();\r\n }\r\n },\r\n dataBound: function () {\r\n this.list.width('auto');\r\n }\r\n };\r\n $scope.dropdownMonthsCountOptions = {\r\n dataSource: statsPeriods,\r\n dataTextField: \"text\",\r\n dataValueField: \"value\",\r\n valueTemplate: '',\r\n template: \"{{dataItem.text|sTranslate}}\",\r\n select: function (e) {\r\n var selectedItem = $scope.dropdownMonthsCountOptions.dataSource[e.item.index()];\r\n if ($scope.monthsCount !== selectedItem.value) {\r\n $scope.isBusy = true;\r\n $scope.monthsCount = selectedItem.value;\r\n $scope.statsByUser = null;\r\n initData();\r\n }\r\n },\r\n dataBound: function () {\r\n this.list.width('auto');\r\n },\r\n index: 1\r\n };\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n });\r\n\r\n $scope.statsTableHeaderLabel = statsReportTypes[0].text;\r\n $scope.statsReportType = statsReportTypes[0].value;\r\n $scope.orderType = orderTypes[0].value;\r\n $scope.orderTypeLabel = orderTypes[0].text;\r\n\r\n $scope.loadMore = function (last, inview) {\r\n if (last && inview) {\r\n $scope.limit += 20;\r\n }\r\n };\r\n\r\n $scope.doPrint = function () {\r\n $scope.limit = 10000000;\r\n //A little trick to call requestAnimationFrame twice to make sure the DOM\r\n //has been updated to render all the TABLE rows and cells after we change the limit for it\r\n //Once the DOM update finishes, we raise the printing dialog\r\n var intermediate = function () {\r\n window.requestAnimationFrame(function () {\r\n window.print();\r\n });\r\n };\r\n window.requestAnimationFrame(intermediate);\r\n };\r\n\r\n $scope.doPrintWaitingList = function () {\r\n if (!$scope.waitingUsersDialog || $scope.waitingUsersDialog.element.length === 0) {\r\n return;\r\n }\r\n\r\n var content = $scope.waitingUsersDialog.element[0].innerHTML;\r\n var printWindow = window.open('', 'Print', 'height=600,width=800');\r\n\r\n printWindow.document.write('Print');\r\n printWindow.document.write('');\r\n printWindow.document.write('');\r\n printWindow.document.write(content);\r\n printWindow.document.write('');\r\n\r\n printWindow.document.close(); // necessary for IE >= 10\r\n printWindow.onload = function () { // necessary if the div contain images\r\n\r\n printWindow.focus(); // necessary for IE >= 10\r\n printWindow.print();\r\n $timeout(printWindow.close, 0);\r\n };\r\n };\r\n\r\n $scope.showUsersOnWaitingList = function () {\r\n $scope.waitingUsersDialog.open();\r\n initWaitingUsersList();\r\n };\r\n\r\n $scope.customerSearch = function (item) {\r\n if (!$scope.customerFilter ||\r\n (item.userName.indexOf($scope.customerFilter) !== -1) ||\r\n (item.$model.customFields.DeviceId && item.$model.customFields.DeviceId.indexOf($scope.customerFilter) !== -1)) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n $scope.getWaitingUserType = function (wUser) {\r\n if (!wUser) {\r\n return 'n/a';\r\n }\r\n\r\n if (!wUser.$model.customFields.WaitingClass || wUser.$model.customFields.WaitingClass.toString() === '') {\r\n return \"Error. This is not a 'waiting' user.!\";\r\n }\r\n\r\n return wUser.$model.customFields.WaitingClass;\r\n };\r\n\r\n initData();\r\n\r\n function initData() {\r\n $scope.months = [];\r\n $scope.limit = 10;\r\n //We want the stats to show items for the previous 6 months, excluding current month\r\n $scope.currMonth1StDay = new Date(new Date().getFullYear(), new Date().getMonth(), 1);\r\n $scope.fromDate = new Date(\r\n $scope.currMonth1StDay.getFullYear(),\r\n $scope.currMonth1StDay.getMonth() - $scope.monthsCount,\r\n $scope.currMonth1StDay.getDate());\r\n\r\n //Build months array depending on the selected desired period for report\r\n var d = new Date($scope.fromDate.getTime());\r\n for (var i = 0; i < $scope.monthsCount; ++i) {\r\n $scope.months.push({\r\n index: d.getMonth() + 1,\r\n name: d.toLocaleString('default', {month: 'short', year: '2-digit'})\r\n });\r\n d.setMonth(d.getMonth() + 1);\r\n }\r\n\r\n var initDataPromise = usersRepository.search(queryForUsersSet(\r\n $scope.statsReportType.deviceType, $scope.statsReportType.deviceId))\r\n .then(function (usersSet) {\r\n var getStatsPromise;\r\n if (!usersSet.items || usersSet.items.length === 0) {\r\n //we don't have to request orders if we have no users list to request order items for\r\n getStatsPromise = $q.when({statsByUser: [], statsByMonths: [], orderItemsCount: 0});\r\n } else {\r\n getStatsPromise = usersRepository.getUsersStatistics(\r\n getWhereQueryForOrdersSet(\r\n $scope.fromDate,\r\n $scope.currMonth1StDay,\r\n $scope.statsReportType.deviceType,\r\n $scope.orderType.isSecond),\r\n _.map(usersSet.items, function (u) {\r\n return u.$model.id;\r\n })\r\n );\r\n }\r\n\r\n return getStatsPromise.then(function (usersStats) {\r\n //Attach representation model to each userStat record (extend with)\r\n _.each(usersStats.stats,\r\n function (userStat) {\r\n var foundUserModel = _.find(\r\n usersSet.items,\r\n function (u) {\r\n return u.$model.name === userStat.userName;\r\n }\r\n );\r\n if (foundUserModel) {\r\n _.extend(userStat, foundUserModel);\r\n }\r\n });\r\n\r\n $scope.usersCount = usersStats.stats.length;\r\n $scope.statsByUser = usersStats.stats;\r\n $scope.statsByMonths = usersStats.statsByMonths;\r\n $scope.orderItemsCount = usersStats.orderItemsCount;\r\n $scope.isBusy = false;\r\n });\r\n })\r\n .catch(function (resp) {\r\n initDataPromise = null;\r\n if (resp && resp.status) {\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error %s : %s\", resp.status, resp.statusText));\r\n } else {\r\n toastr.error(gettextCatalog.getString(\"Data request failed\"), gettextCatalog.getString(\"Server is not responding\"));\r\n }\r\n });\r\n\r\n return initDataPromise;\r\n }\r\n\r\n function initWaitingUsersList() {\r\n $scope.isLoadingWaitingUsers = true;\r\n var initWaitingListPromise = usersRepository.search(queryForUsersSet(\"Waiting\"))\r\n .then(function (usersSet) {\r\n $scope.waitingUsers = usersSet.items;\r\n $scope.isLoadingWaitingUsers = false;\r\n })\r\n .catch(function (resp) {\r\n if (resp && resp.status) {\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error %s : %s\", resp.status, resp.statusText));\r\n } else {\r\n toastr.error(gettextCatalog.getString(\"Data request failed\"), gettextCatalog.getString(\"Server is not responding\"));\r\n }\r\n });\r\n\r\n return initWaitingListPromise;\r\n }\r\n\r\n function queryForUsersSet(orderClass, deviceOwnership) {\r\n var query =\r\n \"User.Name <> 'DownloadService' AND User.Name <> 'admin' AND User.Name <> 'LabUser' AND User.Name <> 'comlaw' AND \" +\r\n \"User.Name <> 'DelcamSupport' AND User.Name <> 'ortesi2' AND User.Name <> 'Test' AND User.Disabled = false\";\r\n\r\n if (orderClass && orderClass.length > 0) {\r\n //In addition to the orders filter, filter out the customers who should not be shown for the\r\n //requested report type.\r\n //To not create a mess of zero lines as iQube customers mostly will have zero counts for iPad(IOS) reports\r\n switch (orderClass) {\r\n case \"IOS\":\r\n query += \" AND User.Class = 'iPad'\";\r\n break;\r\n case \"Windows\":\r\n query += \" AND User.Class NOT LIKE '%Waiting' AND User.Class LIKE 'iQube%'\";\r\n break;\r\n case \"Waiting\":\r\n query += \" AND User.WaitingClass > ''\";\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n if (deviceOwnership != null) {\r\n //In addition to the other filters, we would like to filter by device ownership (company owned device or user owned device)\r\n switch (deviceOwnership) {\r\n case \"Own\":\r\n query += \" AND User.DeviceId = 'Own'\";\r\n break;\r\n case \"\":\r\n query += \" AND User.DeviceId <> 'Own'\";\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n return {\r\n where: query,\r\n orderBy: \"\",\r\n pageNumber: 0,\r\n rowsPerPage: 100000000\r\n };\r\n }\r\n\r\n function getWhereQueryForOrdersSet(from, to, orderClass, isSecondOrder) {\r\n\r\n function pad(number) {\r\n return number < 10 ? \"0\" + number : number;\r\n }\r\n\r\n var sixMonthsAgo = from.getFullYear() + '-' + pad(from.getMonth() + 1) + '-' + pad(from.getDate()) +\r\n 'T' + pad(from.getHours()) + ':' + pad(from.getMinutes()) + ':' + pad(from.getSeconds());\r\n\r\n var currMonth1stDayString = to.getFullYear() + '-' + pad(to.getMonth() + 1) + '-' + pad(to.getDate()) +\r\n 'T' + pad(to.getHours()) + ':' + pad(to.getMinutes()) + ':' + pad(to.getSeconds());\r\n\r\n var query = \"CreatedBy.Name <> 'DownloadService' AND CreatedBy.Name <> 'admin' AND CreatedBy.Name <> 'LabUser' AND CreatedBy.Name <> 'comlaw' AND \"\r\n + \"CreatedBy.Name <> 'DelcamSupport' AND CreatedBy.Name <> 'ortesi2' AND CreatedBy.Name <> 'Test' AND CreatedBy.Name <> 'appletest' AND \"\r\n + \"CreatedBy.Disabled = false AND OrderItem.Deleted = false AND Customer.Deleted = false AND \"\r\n + \"OrderItem.Created >= #\" + sixMonthsAgo + \"# AND OrderItem.Created <= #\" + currMonth1stDayString + \"#\";\r\n\r\n if (orderClass && orderClass.length > 0) {\r\n //Filter out orders not suitable for the requested report\r\n query += \" AND Order.Class = '\" + orderClass + \"'\";\r\n }\r\n //Filter out orders not suitable for the requested report\r\n query += \" AND Order.IsSecond = \" + isSecondOrder.toString();\r\n\r\n return query;\r\n }\r\n\r\n $scope.sortBy = function (propertyToSortBy) {\r\n $scope.reverse = ($scope.propertyToSortBy === propertyToSortBy) ? !$scope.reverse : false;\r\n $scope.propertyToSortBy = propertyToSortBy;\r\n };\r\n })\r\n\r\n;\r\n","angular.module('env.custom.customModule.signup', [])\r\n\r\n .config(function ($stateProvider) {\r\n $stateProvider.state('signup', {\r\n url: '/signup',\r\n templateUrl: 'branding/footlink/signup/signup.html',\r\n controller: 'SignupController',\r\n data: { pageTitle: 'OrderManager: Sign Up' },\r\n resolve: {\r\n loadingWaiter: function () {\r\n //hack that will hide loading screen, when main state is ready\r\n if (window.omHideLoadingScreenCallback) {\r\n window.omHideLoadingScreenCallback();\r\n }\r\n }\r\n }\r\n });\r\n })\r\n\r\n .controller('SignupController', function SignupController($q, $log, $scope, $state, $http, $localStorage, $timeout, authService, toastr, gettextCatalog, signupService) {\r\n $scope.isBusy = false;\r\n $scope.isRequestingCode = false;\r\n $scope.isRegisteredCompanyNameFetching = false;\r\n $scope.userInfo = {};\r\n $scope.isConfirmationCodeRequested = false;\r\n $scope.termsAccepted = false;\r\n $scope.loginUrl = window.location.href.replace(\"signup\", \"login\");\r\n $scope.userABNValidForCreation = true;\r\n $scope.suggestedAddresses = [];\r\n\r\n var focusTimeout;\r\n var ddlKeydownHandler;\r\n\r\n $scope.$on('$destroy', function () {\r\n $timeout.cancel(focusTimeout);\r\n });\r\n\r\n $scope.signupValidatorOptions = {\r\n rules: {\r\n validabn: function (input) {\r\n //Check the abn input\r\n if (input.is(\"[name=clinicABN]\")) {\r\n var isValid = $scope.isValidABN(input.val());\r\n if (isValid) {\r\n //Spin off the registered company name fetching\r\n fetchRegisteredCompanyName(input.val());\r\n }\r\n return isValid;\r\n }\r\n //And return true for all other inputs as every input is checked against custom rule\r\n return true;\r\n },\r\n validregname: function (input) {\r\n if (input.is(\"[name=clinicName]\")) {\r\n return !_.str.isBlank($scope.userInfo.clinicName); //mark the input field as not valid if the model value is empty\r\n }\r\n //And return true for all other inputs as every input is checked against custom rule\r\n return true;\r\n }\r\n }\r\n };\r\n\r\n $scope.goBack = function () {\r\n $state.go('login');\r\n }\r\n\r\n $scope.isFormValid = function () {\r\n var uInfo = $scope.userInfo;\r\n\r\n return !angular.isUndefined(uInfo) &&\r\n !angular.isUndefined(uInfo.firstName) && uInfo.firstName.length !== 0 &&\r\n !angular.isUndefined(uInfo.lastName) && uInfo.lastName.length !== 0 &&\r\n !angular.isUndefined(uInfo.clinicName) && uInfo.clinicName.length !== 0 &&\r\n !angular.isUndefined(uInfo.clinicTradingName) && uInfo.clinicTradingName.length !== 0 &&\r\n !angular.isUndefined(uInfo.clinicAddress) && uInfo.clinicAddress.length !== 0 &&\r\n !angular.isUndefined(uInfo.clinicCity) && uInfo.clinicCity.length !== 0 &&\r\n !angular.isUndefined(uInfo.clinicState) && uInfo.clinicState.length !== 0 &&\r\n !angular.isUndefined(uInfo.clinicPostcode) && uInfo.clinicPostcode.length !== 0 &&\r\n !angular.isUndefined(uInfo.clinicPhone) && uInfo.clinicPhone.length !== 0 &&\r\n !angular.isUndefined(uInfo.clinicEmail) && uInfo.clinicEmail.length !== 0 &&\r\n !angular.isUndefined(uInfo.clinicAccountsEmail) && uInfo.clinicAccountsEmail.length !== 0 &&\r\n $scope.isValidABN(uInfo.clinicABN);\r\n }\r\n\r\n $scope.isValidABN = function (abnToValidate) {\r\n if (!abnToValidate) {\r\n return false;\r\n }\r\n //we need this to create a copy of string to avoid any infinite digest loops if that string was used in a bindings\r\n var abnValue = abnToValidate.toString().slice().replaceAll(' ', '');\r\n if (abnValue.length !== 11) {\r\n return false;\r\n }\r\n\r\n var abnResult = false;\r\n var weights = new Array(10, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19);\r\n var firstDigit = abnValue.toString().substring(0, 1);\r\n var restDigits = abnValue.toString().substring(1);\r\n\r\n if (parseInt(firstDigit) === 0) {\r\n abnResult = false;\r\n }\r\n var abn = parseInt(firstDigit - 1).toString() + restDigits;\r\n var total = 0;\r\n for (var i = 0; i < 11; i++) {\r\n total += weights[i] * parseInt(abn.charAt(i));\r\n }\r\n\r\n if (total === 0 || total % 89 !== 0) {\r\n abnResult = false; //Not valid ABN\r\n } else\r\n abnResult = true; //Valid ABN\r\n\r\n return abnResult;\r\n }\r\n\r\n function fetchRegisteredCompanyName(abnValue) {\r\n $scope.isRegisteredCompanyNameFetching = true;\r\n\r\n $http.post(om.config.build.baseUrl + \"/rest-proxy/do-get-request\",\r\n {\r\n uri: 'https://abr.business.gov.au/json/AbnDetails.aspx?abn=' + abnValue + '&guid=2c1e5a9d-d9b2-41cc-8e20-f1a6b19e6ea8'\r\n })\r\n .then(\r\n function (response) {\r\n var data = response.data;\r\n try {\r\n var registeredName = '';\r\n if (data.indexOf('callback(') === 0) { //if we have expected response from server with json object\r\n var reJsonObject = /{.*}/gm;\r\n var jsonObjectMatch = data.match(reJsonObject);\r\n if (jsonObjectMatch && jsonObjectMatch[0]) {\r\n //parse json string into object and get registered name from it\r\n registeredName = parseRegisteredCompanyName(jsonObjectMatch[0]);\r\n $scope.$applyAsync(function () { $scope.userInfo.clinicName = registeredName; });\r\n }\r\n }\r\n //Show an error if we still were not able to get the registered name\r\n if (_.str.isBlank(registeredName)) {\r\n toastr.error(\r\n 'ABN service is not available or there is no information for specified ABN.',\r\n gettextCatalog.getString('Registered Company Name can not be fetched'));\r\n } else {\r\n //As we have a proper name for the company, we may want now to validate ABN\r\n $q.all([\r\n signupService.validateUserFieldValue(abnValue.replaceAll(' ', ''), \"Name\"),\r\n signupService.validateCustomerFieldValue(abnValue.replaceAll(' ', ''), \"ReckonAccountsCode\")\r\n ])\r\n .then(function (data) {\r\n $scope.userABNValidForCreation = data[0] === true && data[1] === true;\r\n \r\n if (!$scope.userABNValidForCreation) {\r\n //do nothing as we will show a modal dialog form to the user in that case\r\n }\r\n $scope.isRegisteredCompanyNameFetching = false; //we have finished fetching/validation\r\n },\r\n function (error) {\r\n //Alert user about the fact of error\r\n toastr.error('Error happened while we tried to validate your ABN. Please contact administrator.',\r\n gettextCatalog.getString('Error during ABN validation'));\r\n $scope.isRegisteredCompanyNameFetching = false;\r\n $scope.userABNValidForCreation = false;\r\n });\r\n }\r\n } catch (error) {\r\n toastr.error('Unknown error during ABN processing.',\r\n gettextCatalog.getString('Registered Company Name can not be fetched'));\r\n }\r\n }, function (error) {\r\n //var errorData = error.data;\r\n //Simulate text field focus/blur so the validation message of this input field will be shown\r\n //We need to switch off and switch on the 'disable' attribute in order for the focus/blur trick to work\r\n if (angular.element(document.querySelector(\"#clinicName\")).length !== 0) {\r\n angular.element(document.querySelector(\"#clinicName\"))[0].disabled = '';\r\n angular.element(document.querySelector(\"#clinicName\"))[0].focus();\r\n focusTimeout = $timeout(function () {\r\n angular.element(document.querySelector(\"#clinicName\"))[0].blur();\r\n angular.element(document.querySelector(\"#clinicName\"))[0].disabled = 'disabled';\r\n });\r\n }\r\n $scope.isRegisteredCompanyNameFetching = false;\r\n toastr.error('ABN service is not available or there is no information for specified ABN.', gettextCatalog.getString('Registered Company Name not found'));\r\n });\r\n }\r\n\r\n function parseRegisteredCompanyName(abnApiResponseString) {\r\n var jResponse = JSON.parse(abnApiResponseString);\r\n\r\n return jResponse != null && !_.str.isBlank(jResponse.EntityName) ? jResponse.EntityName : null;\r\n }\r\n\r\n function checkFormValidity() {\r\n if (!$scope.isFormValid($scope.userInfo) || !$scope.signupValidator.validate()) {\r\n var msg = gettextCatalog.getString('Some of the information you have entered is not valid. Please review it and try again.');\r\n toastr.error(msg, gettextCatalog.getString('Registration form is missing some information'));\r\n $scope.isBusy = false;\r\n $scope.isSigningUp = false;\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n $scope.getSuggestions = _.debounce(function () { getSuggestedAddresses(); }, 250);\r\n\r\n $scope.onAddressClick = function() {\r\n var ddl = $(\"#ddlAddresses\").data(\"kendoDropDownList\");\r\n if (ddl && $scope.suggestedAddresses && $scope.suggestedAddresses.length > 0) {\r\n ddl.open();\r\n ddl.focus();\r\n\r\n if (!ddlKeydownHandler) {\r\n ddlKeydownHandler = function(e) {\r\n if (e && ((e.keyCode && e.keyCode === 8) || (e.key && e.key === \"Backspace\"))) {\r\n $(\"#clinicAddress\").focus();\r\n }\r\n };\r\n $(\"#ddlAddresses\").closest('.k-dropdown.k-widget').keydown(ddlKeydownHandler);\r\n }\r\n } else if(ddl) {\r\n ddl.close(); //close it in case it was opened\r\n }\r\n }\r\n\r\n function getSuggestedAddresses() {\r\n if (!$scope.userInfo.clinicAddress || $scope.userInfo.clinicAddress.length < 4) {\r\n return; //do not request suggestions if the address entered too short\r\n }\r\n\r\n signupService.getSuggestedAddresses($scope.userInfo.clinicAddress,\r\n $scope.userInfo.clinicCity,\r\n $scope.userInfo.clinicState)\r\n .then(function(data) {\r\n if (data && data.suggest) {\r\n $scope.$applyAsync(function() {\r\n $scope.suggestedAddresses = data.suggest;\r\n $scope.suggestedAddressesOptions = {\r\n select: onSuggestedAddressSelect,\r\n dataBound: onSuggestedAddressesDataBound\r\n };\r\n });\r\n }\r\n },\r\n function(resp) {\r\n var msg;\r\n if (resp && resp.messages && resp.messages.length > 0 && _.isString(resp.messages[0]) && resp.messages[0].length < 256) {\r\n msg = resp.messages[0];\r\n } else {\r\n msg = gettextCatalog.getString('No address suggestions found or error happened during suggestions request.');\r\n }\r\n $log.warn(\"%s. Details: %s %s %s\", msg, $scope.userInfo.cinicAddress, $scope.userInfo.cinicCity, $scope.userInfo.cinicState);\r\n });\r\n }\r\n\r\n function onSuggestedAddressesDataBound() {\r\n $scope.onAddressClick();\r\n }\r\n\r\n function onSuggestedAddressSelect(e) {\r\n if (e && e.dataItem && e.dataItem.address) {\r\n try {\r\n //parse address string and fill in the corresponding fields\r\n var rePostCode = /\\s+(?:(?:[2-8]\\d|9[0-7]|0?[28]|0?9(?=09))(?:\\d{2}))\\s*/ig;\r\n var reState = /\\s+(ACT|NSW|NT|QLD|SA|TAS|VIC|WA)\\s*/ig;\r\n var street = e.dataItem.address.substr(0, e.dataItem.address.indexOf(','));\r\n var rest = e.dataItem.address.substr(e.dataItem.address.indexOf(',') + 1);\r\n\r\n var mState = rest.match(reState);\r\n if (mState && mState.length > 0 && mState[0]) {\r\n $scope.userInfo.clinicState = mState[0].trim();\r\n rest = rest.replace(reState, ' ');\r\n }\r\n\r\n var mPostCode = rest.match(rePostCode);\r\n if (mPostCode && mPostCode.length > 0 && mPostCode[0]) {\r\n $scope.userInfo.clinicPostcode = mPostCode[0].trim();\r\n rest = rest.replace(rePostCode, '');\r\n }\r\n\r\n $scope.userInfo.clinicAddress = street.trim();\r\n $scope.userInfo.clinicCity = rest.trim();\r\n } catch (e) {\r\n $log.error(\"Something went wrong during parsing of the address data.\", e);\r\n }\r\n }\r\n }\r\n\r\n $scope.signup = function () {\r\n if (!checkFormValidity()) {\r\n return;\r\n }\r\n\r\n $scope.isBusy = true;\r\n $scope.isSigningUp = true;\r\n\r\n signupService.submitUserRegistrationInfo(\r\n $scope.userInfo.confirmationCode,\r\n $scope.userInfo.clinicABN.replaceAll(' ', ''),\r\n {\r\n name: $scope.userInfo.clinicABN.replaceAll(' ', ''),\r\n lastName: $scope.userInfo.lastName,\r\n firstName: $scope.userInfo.firstName,\r\n email: $scope.userInfo.clinicEmail,\r\n culture: 'en-AU'\r\n },\r\n {\r\n line1: $scope.userInfo.clinicAddress,\r\n line2: '',\r\n city: $scope.userInfo.clinicCity,\r\n companyName: $scope.userInfo.clinicTradingName,\r\n contactLastName: $scope.userInfo.lastName,\r\n contactFirstName: $scope.userInfo.firstName,\r\n country: 'Australia',\r\n email: $scope.userInfo.clinicEmail,\r\n postalCode: $scope.userInfo.clinicPostcode,\r\n region: $scope.userInfo.clinicState,\r\n telephone: $scope.userInfo.clinicPhone\r\n },\r\n [\r\n { fieldCode: 'Class', type: 'string', value: 'iPad' },\r\n { fieldCode: 'DeviceId', type: 'string', value: 'Own' },\r\n { fieldCode: 'WaitingClass', type: 'string', value: 'NotWaiting' }\r\n ],\r\n [\r\n { fieldCode: 'ReckonAccountsCode', type: 'string', value: $scope.userInfo.clinicABN.replaceAll(' ', '') },\r\n { fieldCode: 'RegisteredCompanyName', type: 'string', value: $scope.userInfo.clinicName },\r\n { fieldCode: 'AccountsEmail', type: 'string', value: $scope.userInfo.clinicAccountsEmail },\r\n { fieldCode: 'OwnerEmail', type: 'string', value: $scope.userInfo.clinicAccountsEmail },\r\n { fieldCode: 'DeliveryMethod', type: 'string', value: 'AUSPost' },\r\n { fieldCode: 'NextDayDelivery', type: 'string', value: 'EveryDay' }\r\n ]\r\n )\r\n .then(\r\n function () {\r\n $scope.registrationFormSent = true;\r\n $scope.isBusy = false;\r\n $scope.isSigningUp = false;\r\n },\r\n function (resp) {\r\n var data = resp.data;\r\n var msg;\r\n if (data && data.error && _.isString(data.error)) {\r\n msg = data.error;\r\n } else if (data && _.isString(data) && data.length > 0 && data.length < 256) {\r\n msg = data;\r\n } else {\r\n msg = gettextCatalog.getString('Registration form submission failed due to an error. Please review the form and try again later.');\r\n }\r\n toastr.error(msg, gettextCatalog.getString('Sign-up failed'));\r\n $scope.isBusy = false;\r\n $scope.isSigningUp = false;\r\n $scope.registrationFormSent = false;\r\n });\r\n };\r\n\r\n $scope.requestConfirmationCode = function () {\r\n\r\n if (!checkFormValidity()) {\r\n return;\r\n }\r\n\r\n $scope.isRequestingCode = true;\r\n\r\n signupService.requestEmailConfirmationCode($scope.userInfo.clinicEmail, $scope.userInfo.firstName, $scope.userInfo.lastName)\r\n .then(\r\n function () {\r\n $scope.confirmationCodeSent = true;\r\n $scope.isRequestingCode = false;\r\n },\r\n function (resp) {\r\n var data = resp.data;\r\n var msg;\r\n if (data && data.error && _.isString(data.error)) {\r\n msg = data.error;\r\n } else if (data && _.isString(data) && data.length > 0 && data.length < 256) {\r\n msg = data;\r\n } else {\r\n msg = gettextCatalog.getString(\"Request to send confirmation code failed due to an error\");\r\n }\r\n toastr.error(msg, gettextCatalog.getString(\"Request failed\"));\r\n $scope.isRequestingCode = false;\r\n $scope.confirmationCodeSent = false;\r\n });\r\n\r\n return;\r\n };\r\n\r\n $scope.submitContactDetailsOfExistingUser = function() {\r\n\r\n $scope.isBusy = true;\r\n\r\n signupService.submitSupportRequest($scope.userInfo.clinicABN, $scope.userInfo.clinicEmail, $scope.userInfo.clinicPhone)\r\n .then(\r\n function () {\r\n $scope.contactRequestSent = true;\r\n $scope.isBusy = false;\r\n },\r\n function (resp) {\r\n var data = resp.data;\r\n var msg;\r\n if (data && data.error && _.isString(data.error)) {\r\n msg = data.error;\r\n } else if (data && _.isString(data) && data.length > 0 && data.length < 256) {\r\n msg = data;\r\n } else {\r\n msg = gettextCatalog.getString(\"Contact request sending failed due to unknown error. Please contact Ortesi for instructions.\");\r\n }\r\n toastr.error(msg, gettextCatalog.getString(\"Sending failed\"));\r\n $scope.contactRequestSent = false;\r\n $scope.isBusy = false;\r\n });\r\n\r\n return;\r\n };\r\n })\r\n\r\n ;\r\n","(function () {\r\n var customerUserWorkflowConfig = {\r\n\r\n /**\r\n * Action that will be performed as final step of order creation.\r\n * After saving addresses, orders, order items, files, etc.\r\n */\r\n orderCreationAction: \"Approve\",\r\n\r\n /**\r\n * Configures how the app will treat workflow actions.\r\n *\r\n * code - particular action code to identify an action.\r\n * ignore - means the action should be ignored and not rendered in the UI.\r\n * uiPriority - integer value to specify the 'weight' of the step, where to put it in sorted collection in UI.\r\n * imageResourceName / PublicImageResourceName - string value specifying the name of the image resource defined\r\n * in the 'images' collection in the customisation configuration\r\n * color - Specifies what color to use for the button which is used to present the step.\r\n * Possible values are: 'blue', 'green', 'orange', 'red', 'violet', 'yellow', 'grey'. Default is 'grey'.\r\n * isAllowed - A function that identifies if the workflow action allowed to be executed for the passed in item.\r\n */\r\n actions: [\r\n {\r\n code: \"Approve\",\r\n uiPriority: 405,\r\n imageResourceName: \"approval\",\r\n color: \"green\",\r\n isAllowed: function (orderItem) {\r\n return orderItem.$model.expectedBy && angular.isDate(orderItem.$model.expectedBy) &&\r\n orderItem.$model.expectedBy.getTime() >= new Date(new Date().toDateString()).getTime();\r\n }\r\n },\r\n {code: \"BackToApproval\", uiPriority: 404, imageResourceName: \"approval\", color: \"yellow\"},\r\n {code: \"Design\", uiPriority: 405, imageResourceName: \"design\", color: \"green\"},\r\n {code: \"AssignToExubit\", uiPriority: 406, imageResourceName: \"design-exubit\", color: \"blue\"},\r\n {code: \"Review\", uiPriority: 405, imageResourceName: \"design-review\", color: \"green\"},\r\n {code: \"BackToDesign\", uiPriority: 404, imageResourceName: \"design\", color: \"yellow\"},\r\n {code: \"Batching\", uiPriority: 405, imageResourceName: \"batch-create\", color: \"green\"},\r\n {code: \"DesignExubit\", uiPriority: 401, imageResourceName: \"design-exubit\", color: \"red\"},\r\n {code: \"BackToBatching\", uiPriority: 404, imageResourceName: \"batch-create\", color: \"yellow\"},\r\n {code: \"PrintScript\", uiPriority: 405, imageResourceName: \"batch-create\", color: \"green\"},\r\n {code: \"BackToPrintScript\", uiPriority: 404, imageResourceName: \"batch-create\", color: \"yellow\"},\r\n {code: \"InProgress\", uiPriority: 405, color: \"green\"},\r\n {code: \"BackToInProgress\", uiPriority: 404, color: \"yellow\"},\r\n //{code: \"FreightReady\", uiPriority: 500, imageResourceName: \"freight-await\"},\r\n {code: \"InvoiceAwait\", uiPriority: 405, imageResourceName: \"invoice-await\", color: \"green\" },\r\n {code: \"BackToInvoiceAwait\", uiPriority: 404, imageResourceName: \"invoice-await\", color: \"yellow\"},\r\n {\r\n code: \"FinalProcessing\", \r\n uiPriority: 405, \r\n imageResourceName: \"batch-process\",\r\n isAllowed: function (orderItem) {\r\n return true; //angular.isDefined(orderItem.$model.order.$model.jsonData.OrderData.InvoiceOrderData);\r\n },\r\n color: \"green\"\r\n },\r\n {code: \"BackToFinalProcessing\", uiPriority: 404, imageResourceName: \"batch-process\", color: \"yellow\"},\r\n {\r\n code: \"Packaging\", \r\n uiPriority: 405, \r\n imageResourceName: \"shipping-ready\",\r\n isAllowed: function (orderItem) {\r\n return orderItem.$model.customFields.FreightRef && orderItem.$model.customFields.FreightRef !== '';\r\n },\r\n color: \"green\"\r\n },\r\n {code: \"Shipped\", uiPriority: 610, imageResourceName: \"shipped\", color: \"green\"},\r\n {code: \"Complete\", uiPriority: 510, imageResourceName: \"complete\", color: \"green\"},\r\n {code: \"Rejected\", uiPriority: 100, imageResourceName: \"scrapped\", color: \"red\"},\r\n {code: \"OnHold\", uiPriority: 200, imageResourceName: \"on-hold\", color: \"yellow\"},\r\n {code: \"Cancelled\", uiPriority: 10, imageResourceName: \"cancelled\", color: \"red\"}\r\n ],\r\n /**\r\n * Configures how the app will treat workflow steps.\r\n *\r\n * code - particular step code to identify a step.\r\n * ignore - means the step will be ignored by the TrackingClient. Will not be shown on Home screen as a button\r\n * to show items at that step. Items at that step will not be shown in the grid tables.\r\n * uiPriority - integer value to specify the 'weight' of the step, where to put it in sorted collection in UI.\r\n * imageResourceName / PublicImageResourceName - string value specifying the name of the image resource defined\r\n * in the 'images' collection in the customisation configuration\r\n * isFloating - Specifies if the step belongs to a group of 'floating' steps and should be shown separate from\r\n * the main workflow underneath as a 'bookmark'\r\n * color - Specifies what color to use for the button which is used to present the step.\r\n * Possible values are: 'blue', 'green', 'orange', 'red', 'violet', 'yellow', 'grey'. Default is 'grey'.\r\n */\r\n steps: [\r\n {code: \"OrthoMAN\", ignore: true, uiPriority: 1, color: \"grey\", isFloating: true, noImageOnHomeView: false},\r\n {code: \"Approve\", uiPriority: 2, imageResourceName: \"approval\", noImageOnHomeView: false},\r\n {code: \"Design\", uiPriority: 4, imageResourceName: \"design\", forked: false, noImageOnHomeView: false},\r\n {code: \"ExubitDesign\", uiPriority: 5, imageResourceName: \"design-exubit\", forked: false, noImageOnHomeView: false},\r\n {code: \"DesignReview\", uiPriority: 6, imageResourceName: \"design-review\", forked: false, noImageOnHomeView: false},\r\n\t\t\t{code: \"Batching\", uiPriority: 7, imageResourceName: \"batch-create\", noImageOnHomeView: false },\r\n\t\t\t{code: \"PrintScript\", uiPriority: 8, imageResourceName: \"print\", noImageOnHomeView: false },\r\n {code: \"InProgress\", uiPriority: 9, noImageOnHomeView: false },\r\n //{code: \"Production\", uiPriority: 10, noImageOnHomeView: false},\r\n //{\r\n // code: \"Completed\",\r\n // uiPriority: 20,\r\n // imageResourceName: \"complete\",\r\n // publicImageResourceName: \"complete\",\r\n // forksJoin: false\r\n //},\r\n //{code: 'QA', uiPriority: 11, imageResourceName: 'qa', publicImageResourceName: 'in-progress'},\r\n //{code: 'Packing', uiPriority: 13, imageResourceName: 'packaging'},\r\n {code: \"Rejected\", uiPriority: 100, imageResourceName: \"scrapped\", isFloating: true, color: \"red\", noImageOnHomeView: false},\r\n {code: \"OnHold\", uiPriority: 200, imageResourceName: \"on-hold\", isFloating: true, color: \"yellow\", noImageOnHomeView: false},\r\n {code: \"CreateFailed\", uiPriority: 205, imageResourceName: \"incomplete\", isFloating: true, color: \"red\", noImageOnHomeView: false},\r\n {code: \"Cancelled\", ignore: true, imageResourceName: \"scrapped\", uiPriority: 900, isFloating: true, color: \"violet\", noImageOnHomeView: false},\r\n \r\n\t\t\t{code: \"InvoiceAwait\", uiPriority: 1000, ignore: false, imageResourceName: \"invoice-await\", noImageOnHomeView: false},\r\n {code: \"FinalProcessing\", uiPriority: 1010, ignore: false, imageResourceName: \"batch-process\", noImageOnHomeView: false},\r\n {code: \"Packaging\", uiPriority: 1020, ignore: false, imageResourceName: \"shipping-ready\", noImageOnHomeView: false},\r\n\r\n //The 'hide' param allows to not take into account the step count for stats, but allows to search over the items at this step\r\n {code: \"Shipped\", uiPriority: 2000, ignore: false, hide:true, color: \"green\", imageResourceName: \"shipped\", noImageOnHomeView: false}\r\n ]\r\n };\r\n\r\n // the same as customerUserWorkflowConfig, but `Shipped` step is ignored\r\n var centreUserWorkflowConfig = angular.copy(customerUserWorkflowConfig, {});\r\n\r\n // And modify the 'Shipped' step to be 'ignored' for centre users so they don't see\r\n // shipped items on their main home screen.\r\n // This allows to configure different visibility of the particular steps for centre and customers users for example,\r\n // or even individually for user(s).\r\n //\r\n //_.find(centreUserWorkflowConfig.steps, function (s) {\r\n // return s.code === \"Shipped\";\r\n //}).ignore = true;\r\n\r\n angular.module(\"env.customConfig.workflow\", [\r\n 'env.custom.customModule'\r\n ])\r\n .constant(\"customerUserWorkflowConfig\", customerUserWorkflowConfig)\r\n .constant(\"centreUserWorkflowConfig\", centreUserWorkflowConfig);\r\n})();\r\n","angular.module('env.customConfig.templates', [\r\n 'env.customConfig.provider',\r\n 'env.customConfig.logicResolvers',\r\n \"env.custom.customModule\"\r\n])\r\n .config(function ($customisationConfigProvider, $customLogicResolversProvider) {\r\n $customisationConfigProvider.templates =\r\n [\r\n {\r\n name: \"signup-link-template\",\r\n resolve: function (context) {\r\n return \"\";\r\n //return \"customise/html/\" + this.name + \"/\" + this.name + \".html\";\r\n }\r\n },\r\n {\r\n name: \"login-screen-band\",\r\n resolve: function (context) {\r\n //context object for login-screen-band will be of the form: { user: %currentUserObject% }\r\n\r\n //For some company branded site when we do need lower band on login screen\r\n //The path isn't calculated as this needs serving directly before the customisation system has fully started\r\n return \"customise/html/\" + this.name + \"/\" + this.name + \".html\";\r\n\r\n // For some other cases we don't need lower band on login screen\r\n //return \"\";\r\n }\r\n },\r\n {\r\n name: \"home-view-custom-content\",\r\n resolve: function (context) {\r\n //context object for home-view-custom-content will be of the form: { user: %currentUserObject% }\r\n\r\n //Calculated prefix of the customised resource name from context information (current user, step, etc.)\r\n //will be used to find the corresponding resource's URI in the resources map that are available on the server\r\n return $customLogicResolversProvider.resolveResourceUri(context, this.name + \".html\");\r\n }\r\n },\r\n {\r\n name: \"order-attachment-header\",\r\n resolve: function(context) {\r\n //context object for order-attachment-header will be of the form: { user: %currentUserObject% }\r\n\r\n //Calculated prefix of the customised resource name from context information (current user, step, etc.)\r\n //will be used to find the corresponding resource's URI in the resources map that are available on the server\r\n return $customLogicResolversProvider.resolveResourceUri(context, this.name + \".html\");\r\n }\r\n },\r\n {\r\n name: \"additional-fields\",\r\n resolve: function (context) {\r\n //context object for additional-fields will be of the form: { user: %currentUserObject%, step: %stepCode% }\r\n\r\n //Calculated prefix of the customised resource name from context information (current user, step, etc.)\r\n //will be used to find the corresponding resource's URI in the resources map that are available on the server\r\n return $customLogicResolversProvider.resolveResourceUri(context, this.name + \".html\");\r\n }\r\n },\r\n {\r\n name: \"step-details-pager-item-template\",\r\n resolve: function (context) {\r\n //context object for step-details-pager-item-template will be of the form: { user: %currentUserObject%, step: %stepCode% }\r\n\r\n //Calculated prefix of the customised resource name from context information (current user, step, etc.)\r\n //will be used to find the corresponding resource's URI in the resources map that are available on the server\r\n return $customLogicResolversProvider.resolveResourceUri(context, this.name + \".html\");\r\n }\r\n },\r\n {\r\n name: \"step-details-pager-item-loading-template\",\r\n resolve: function (context) {\r\n //context object for step-details-pager-item-loading-template will be of the form: { user: %currentUserObject%, step: %stepCode% }\r\n\r\n //Calculated prefix of the customised resource name from context information (current user, step, etc.)\r\n //will be used to find the corresponding resource's URI in the resources map that are available on the server\r\n return $customLogicResolversProvider.resolveResourceUri(context, this.name + \".html\");\r\n }\r\n },\r\n {\r\n name: \"order-item-summary-template\",\r\n resolve: function (context) {\r\n //context object for order-item-summary-template will be of the form: { user: %currentUserObject%, step: %stepCode% }\r\n\r\n //Calculated prefix of the customised resource name from context information (current user, step, etc.)\r\n //will be used to find the corresponding resource's URI in the resources map that are available on the server\r\n return $customLogicResolversProvider.resolveResourceUri(context, this.name + \".html\");\r\n }\r\n },\r\n {\r\n name: \"sample-template\",\r\n resolve: function (context) {\r\n return \"customise/html/sample-template/_general_sample-template.html\";\r\n }\r\n },\r\n {},\r\n {}\r\n ];\r\n })\r\n;\r\n","angular.module('env.customConfig.styles', [\r\n 'env.customConfig.provider',\r\n 'env.customConfig.logicResolvers',\r\n 'env.custom.customModule'\r\n])\r\n\r\n .config(function ($customisationConfigProvider, $customLogicResolversProvider) {\r\n $customisationConfigProvider.styles =\r\n [\r\n {\r\n name: \"login-css-override\",\r\n resolve: function (context) {\r\n //context object for login-screen-band will be of the form: { user: %currentUserObject% }\r\n\r\n //For Autodesk branded site when we do need lower band on login screen\r\n //The path isn't calculated as this needs serving directly before the customisation system has fully started\r\n return \"customise/css/\" + this.name + \"/\" + this.name + \".css\";\r\n\r\n //For Delcam branded site when we don't need lower band on login screen\r\n //return \"\";\r\n }\r\n },\r\n {\r\n name: \"customers-orders-stats\",\r\n resolve: function (context) {\r\n //context object for custom css will be of the form: { user: %currentUserObject% }\r\n\r\n //The path isn't calculated as this needs serving directly before the customisation system has fully started\r\n return \"customise/html/customers/customers.css\";\r\n }\r\n },\r\n {\r\n name: \"order-files-css-override\",\r\n resolve: function (context) {\r\n //context object for order-files-css-override will be of the form: { user: %currentUserObject% }\r\n\r\n return \"customise/css/\" + this.name + \"/\" + this.name + \".css\";\r\n }\r\n },\r\n {},\r\n {}\r\n ];\r\n })\r\n\r\n;\r\n","angular.module(\"env.customConfig.reports\", [\r\n \"env.customConfig.provider\",\r\n \"env.customConfig.logicResolvers\",\r\n \"env.custom.customModule\"\r\n])\r\n .config(function ($customisationConfigProvider, $customLogicResolversProvider, gettext) {\r\n\r\n $customisationConfigProvider.reports =\r\n [\r\n {\r\n name: \"order-label\",\r\n options: [\r\n {\r\n value: {\r\n name: 'Order Label',\r\n reportFileName: 'OrderLabel.repx',\r\n buttonImageResourceName: 'smallReportIcon',\r\n baseEntityName: \"OrderItem\",\r\n requiresSelection: true\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"order-pair-label\",\r\n options: [\r\n {\r\n value: {\r\n name: 'Order Pair Labels',\r\n reportFileName: 'OrderPairLabels.repx',\r\n buttonImageResourceName: 'smallReportIcon',\r\n baseEntityName: \"OrderItem\",\r\n requiresSelection: true\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"order-report\",\r\n resolve: function (context) {\r\n //context object for login-screen-band will be of the form: { user: %currentUserObject% }\r\n return {\r\n name: 'Customer Prescription Copy',\r\n reportFileName: 'OrderDetail.repx',\r\n buttonImageResourceName: 'smallReportIcon',\r\n baseEntityName: \"OrderItem\",\r\n requiresSelection: true\r\n };\r\n }\r\n },\r\n {\r\n name: \"lab-order-report\",\r\n resolve: function (context) {\r\n //context object for login-screen-band will be of the form: { user: %currentUserObject% }\r\n return {\r\n name: 'Laboratory Prescription Copy',\r\n reportFileName: 'LabOrderDetail.repx',\r\n buttonImageResourceName: 'smallReportIcon',\r\n baseEntityName: \"OrderItem\",\r\n requiresSelection: true\r\n };\r\n }\r\n },\r\n {\r\n name: \"orders-report-general\",\r\n options: [\r\n {\r\n value: {\r\n name: gettext(\"Show Orders Report\"),\r\n reportFileName: \"OrderItems.repx\",\r\n buttonImageResourceName: \"smallReportIcon\",\r\n baseEntityName: \"OrderItem\"\r\n },\r\n condition: function (context) {\r\n return true;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"order-report-barcodes\",\r\n options: [\r\n {\r\n value: {\r\n name: 'Order Report + Barcodes',\r\n reportFileName: 'OrderDetail.B.Barcodes.repx',\r\n buttonImageResourceName: 'smallReportIcon',\r\n baseEntityName: \"OrderItem\",\r\n requiresSelection: true\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"order-report-smaller\",\r\n options: [\r\n {\r\n value: {\r\n name: 'Order Report - Smaller',\r\n reportFileName: 'OrderDetail.B.Smaller.repx',\r\n buttonImageResourceName: 'smallReportIcon',\r\n baseEntityName: \"OrderItem\",\r\n requiresSelection: true\r\n }\r\n }\r\n ]\r\n }, \r\n {\r\n name: \"order-certificate\",\r\n options: [\r\n {\r\n value: {\r\n name: 'Order Certificate',\r\n reportFileName: 'OrderCertificate.repx',\r\n buttonImageResourceName: 'smallReportIcon',\r\n baseEntityName: \"OrderItem\",\r\n requiresSelection: true\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"show-audit\",\r\n options: [\r\n {\r\n value: {\r\n name: gettext(\"Show Audit\"),\r\n reportFileName: \"Audit.repx\",\r\n buttonImageResourceName: \"smallReportIcon\",\r\n baseEntityName: \"WorkflowAudit\"\r\n },\r\n condition: function (context) {\r\n //return context.user && context.user.role && context.user.role.isCentre;\r\n return true;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"multi-orders\",\r\n options: [\r\n {\r\n value: {\r\n name: gettext(\"Orders Report\"),\r\n reportFileName: \"OrdersReport.repx\",\r\n buttonImageResourceName: \"smallReportIcon\",\r\n baseEntityName: \"OrderItem\"\r\n },\r\n condition: function (context) {\r\n return true;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"daily-report\",\r\n options: [\r\n {\r\n value: {\r\n name: gettext(\"Daily Report\"),\r\n reportFileName: \"DailyReport.repx\",\r\n buttonImageResourceName: \"smallReportIcon\",\r\n baseEntityName: \"OrderItem\"\r\n },\r\n condition: function (context) {\r\n return true;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"orders-by-customer\",\r\n options: [\r\n {\r\n value: {\r\n name: gettext(\"Orders by Customer\"),\r\n reportFileName: \"OrdersbyCustomer.repx\",\r\n buttonImageResourceName: \"smallReportIcon\",\r\n baseEntityName: \"OrderItem\"\r\n },\r\n condition: function (context) {\r\n return true;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"orders-by-date\",\r\n options: [\r\n {\r\n value: {\r\n name: gettext(\"Ordering Stats (1 year)\"),\r\n reportFileName: \"OrdersCountByDate.repx\",\r\n query: function (gridQuery, selectedItem) {\r\n\r\n function pad(number) {\r\n return number < 10 ? \"0\" + number : number;\r\n }\r\n\r\n //We want the report to show items for the previous 12 months\r\n var today = new Date();\r\n var from = new Date(today.getFullYear() - 1, today.getMonth(), today.getDate());\r\n\r\n var oneYearAgo = from.toISOStringUTC();\r\n var todayDayString = today.toISOStringUTC();\r\n\r\n return \"OrderItem.Deleted = false AND OrderItem.Created >= #\" + oneYearAgo + \"# AND OrderItem.Created <= #\" + todayDayString + \"#\";\r\n },\r\n buttonImageResourceName: \"smallReportIcon\",\r\n baseEntityName: \"OrderItem\"\r\n },\r\n condition: function (context) {\r\n return true;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"orders-by-date-2yrs\",\r\n options: [\r\n {\r\n value: {\r\n name: gettext(\"Ordering Stats (2 years)\"),\r\n reportFileName: \"OrdersCountByDate.repx\",\r\n query: function (gridQuery, selectedItem) {\r\n\r\n function pad(number) {\r\n return number < 10 ? \"0\" + number : number;\r\n }\r\n\r\n //We want the report to show items for the previous 12 months\r\n var today = new Date();\r\n var from = new Date(today.getFullYear() - 2, today.getMonth(), today.getDate());\r\n\r\n var oneYearAgo = from.toISOStringUTC();\r\n var todayDayString = today.toISOStringUTC();\r\n\r\n return \"OrderItem.Deleted = false AND OrderItem.Created >= #\" + oneYearAgo + \"# AND OrderItem.Created <= #\" + todayDayString + \"#\";\r\n },\r\n buttonImageResourceName: \"smallReportIcon\",\r\n baseEntityName: \"OrderItem\"\r\n },\r\n condition: function (context) {\r\n return true;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"orders-by-mid-layer\",\r\n options: [\r\n {\r\n value: {\r\n name: gettext(\"Orders by Mid-Layer\"),\r\n reportFileName: \"OrdersbyMidLayer.repx\",\r\n query: function (gridQuery, selectedItem) {\r\n\r\n function pad(number) {\r\n return number < 10 ? \"0\" + number : number;\r\n }\r\n\r\n //We want the report to show items for the previous 6 months, excluding current month\r\n var today = new Date();\r\n var from = new Date(today.getFullYear(), today.getMonth() - 6, 1);\r\n\r\n var oneMonthsAgo = from.toISOStringUTC();\r\n var todayDayString = today.toISOStringUTC();\r\n\r\n return \"OrderItem.Deleted = false AND OrderItem.Created >= #\" + oneMonthsAgo + \"# AND OrderItem.Created <= #\" + todayDayString + \"#\";\r\n },\r\n orderBy: \"Id ASC\",\r\n buttonImageResourceName: \"smallReportIcon\",\r\n baseEntityName: \"OrderItem\"\r\n },\r\n condition: function (context) {\r\n return true;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"overnight-orders-overview\",\r\n options: [\r\n {\r\n value: {\r\n name: gettext(\"Overnight Orders Overview\"),\r\n reportFileName: \"OvernightOrders.repx\",\r\n query: function (gridQuery, selectedItem) {\r\n\r\n function pad(number) {\r\n return number < 10 ? \"0\" + number : number;\r\n }\r\n\r\n //We want to take for analysis orders during last week, however it is safer to take a bit more\r\n //in case it is Monday morning and we want to take into analysis orders from weekend\r\n var from = new Date();\r\n from.setDate(from.getDate() - 10); //To be able to look back 5 working days ago starting from monday, we need to have 10 days back history\r\n from.setHours(15, 0, 0, 0);\r\n\r\n var weekAgo = from.toISOStringUTC();\r\n \r\n return \"OrderItem.Deleted = false AND Step.Code <> 'Cancelled' AND Step.Code <> 'CreateFailed' AND OrderItem.Created >= #\" + weekAgo + \"#\";\r\n },\r\n buttonImageResourceName: \"smallReportIcon\",\r\n baseEntityName: \"OrderItem\"\r\n },\r\n condition: function (context) {\r\n return true;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"orders-month-overview\",\r\n options: [\r\n {\r\n value: {\r\n name: gettext(\"Month Overview\"),\r\n reportFileName: \"OrdersMonthOverview.repx\",\r\n query: function (gridQuery, selectedItem) {\r\n function pad(number) {\r\n return number < 10 ? \"0\" + number : number;\r\n }\r\n\r\n //We want the report to show items for the previous 6 months, excluding current month\r\n var today = new Date();\r\n var from = new Date(today.getFullYear(), today.getMonth() - 1, today.getDate());\r\n\r\n var oneMonthsAgo = from.toISOStringUTC();\r\n var todayDayString = today.toISOStringUTC();\r\n\r\n return \"OrderItem.Deleted = false AND Step.Code <> 'Cancelled' AND Step.Code <> 'CreateFailed' AND OrderItem.Created >= #\" + oneMonthsAgo + \"# AND OrderItem.Created <= #\" + todayDayString + \"#\";\r\n },\r\n buttonImageResourceName: \"smallReportIcon\",\r\n baseEntityName: \"OrderItem\"\r\n },\r\n condition: function (context) {\r\n return true;\r\n }\r\n }\r\n ]\r\n },\r\n //{\r\n // name: \"orders-report-fixed-query1\",\r\n // options: [\r\n // {\r\n // value: {\r\n // name: gettext(\"Show Particular Items Report\"),\r\n // reportFileName: \"OrderItemsFixed.repx\",\r\n // buttonImageResourceName: \"smallReportIcon\",\r\n // query: \"OrderItem.Deleted = false AND Step.Code = 'Scan'\", //Any OMQL query here, Optional parameter\r\n // orderBy: \"Id ASC\",\r\n // baseEntityName: \"OrderItem\"\r\n // },\r\n // condition: function (context) {\r\n // return true;\r\n // }\r\n // }\r\n // ]\r\n //},\r\n //{\r\n // name: \"orders-by-customer-one-month\",\r\n // options: [\r\n // {\r\n // value: {\r\n // name: gettext(\"Orders by Customer (1 Year)\"),\r\n // reportFileName: \"Orders by Customer.repx\",\r\n // buttonImageResourceName: \"smallReportIcon\",\r\n // query: function (gridQuery, selectedItem) {\r\n\r\n // function pad(number) {\r\n // if (number < 10) {\r\n // return '0' + number;\r\n // }\r\n // return number;\r\n // }\r\n // var today = new Date();\r\n // today.setFullYear(today.getFullYear() - 1);\r\n // var todayUtc = new Date(today.getUTCFullYear(), today.getUTCMonth(), today.getUTCDate(), today.getUTCHours(), today.getUTCMinutes(), today.getUTCSeconds());\r\n\r\n // var oneYearAgo = todayUtc.toISOStringUTC();\r\n\r\n // return \"OrderItem.Deleted = false AND OrderItem.Created > #\" + oneYearAgo + \"#\";\r\n // },\r\n // orderBy: \"Created ASC\",\r\n // baseEntityName: \"OrderItem\"\r\n // },\r\n // condition: function (context) {\r\n // return context.user && context.user.role && context.user.role.isCentre;\r\n // }\r\n // }\r\n // ]\r\n //}\r\n ];\r\n })\r\n;\r\n","angular.module('env.customConfig.images', [\r\n 'env.customConfig.provider',\r\n 'env.customConfig.logicResolvers',\r\n 'env.custom.customModule'\r\n])\r\n .config(function ($customisationConfigProvider, $customLogicResolversProvider) {\r\n $customisationConfigProvider.images =\r\n [\r\n {\r\n name: \"login-back\",\r\n options: [\r\n {\r\n //Default background.\r\n //If you want another images based on some criterias, put\r\n //them above this option item with a condition to check user.centre (shown below for centre-logo).\r\n //If you want just another background for this product installation, change the string below and\r\n //that's it.\r\n //value: \"customise/resources/innovating_future_dental.png\"\r\n //value: \"customise/resources/autodesk-om-background.jpg\"\r\n value: \"customise/resources/ortesi-om-background.jpg\"\r\n }\r\n ]\r\n },\r\n {\r\n name: \"login-logo\",\r\n options: [\r\n {\r\n value: \"customise/resources/om-logo.png\"\r\n }\r\n ]\r\n },\r\n {\r\n name: \"shell-back\",\r\n options: [\r\n {\r\n //Default background.\r\n //If you want another images based on some criterias, put\r\n //them above this option item with a condition to check user.centre (shown below for centre-logo).\r\n //If you want just another background for this product installation, change the string below and\r\n //that's it.\r\n value: \"customise/resources/om-shell-background.png\"\r\n }\r\n ]\r\n },\r\n {\r\n name: \"sidebar-logo\",\r\n options: [\r\n {\r\n // value: \"customise/resources/exubit-om-logo-sidebar.png\"\r\n }\r\n ]\r\n },\r\n {\r\n name: \"sidebar-logo-small\",\r\n options: [\r\n {\r\n // value: \"customise/resources/exubit-om-logo-sidebar-small.png\"\r\n }\r\n ]\r\n },\r\n\r\n {name: \"smallReportIcon\", options: [{value: \"customise/resources/smallreporticon.png\"}]},\r\n {\r\n name: \"centre-logo\",\r\n options: [\r\n /*{\r\n value: \"customise/resources/logos/centre1.png\",\r\n condition: function (context) {\r\n return context.user !== null && context.user.centre == 'Centre1';\r\n }\r\n },*/\r\n {\r\n //default centre to be shown if none above is true\r\n value: \"customise/resources/logos/centre-default.png\"\r\n }\r\n ]\r\n },\r\n {name: \"track\", options: [{value: \"customise/resources/steps/track.png\"}]},\r\n {name: \"workflow\", options: [{value: \"customise/resources/steps/workflow.png\"}]},\r\n {name: \"workflow-light\", options: [{value: \"customise/resources/steps/workflow-light.png\"}]},\r\n {name: \"next\", options: [{value: \"customise/resources/steps/next.png\"}]},\r\n {name: \"in-progress\", options: [{value: \"customise/resources/steps/wip.png\"}]},\r\n {name: \"rejected\", options: [{value: \"customise/resources/steps/rejected.png\"}]},\r\n {name: \"incomplete\", options: [{value: \"customise/resources/steps/incomplete.png\"}]},\r\n {name: \"scrapped\", options: [{value: \"customise/resources/steps/scrapped.png\"}]},\r\n {name: \"design\", options: [{value: \"customise/resources/steps/design.png\"}]},\r\n {name: \"design-exubit\", options: [{value: \"customise/resources/steps/design2.png\"}]},\r\n {name: \"design-review\", options: [{value: \"customise/resources/steps/design-review.png\"}]},\r\n {name: \"qa\", options: [{value: \"customise/resources/steps/qa.png\"}]},\r\n {name: \"approval\", options: [{value: \"customise/resources/steps/approval.png\"}]},\r\n {name: \"approved\", options: [{value: \"customise/resources/steps/approved.png\"}]},\r\n {name: \"on-hold\", options: [{value: \"customise/resources/steps/hold.png\"}]},\r\n {name: \"cancelled\", options: [{value: \"customise/resources/steps/rejected.png\"}]},\r\n {name: \"scan\", options: [{value: \"customise/resources/steps/scan.png\"}]},\r\n {name: \"complete\", options: [{value: \"customise/resources/steps/complete.png\"}]},\r\n {name: \"user-accept\", options: [{value: \"customise/resources/steps/user-accept.png\"}]},\r\n {name: \"shipped\", options: [{value: \"customise/resources/steps/shipped.png\"}]},\r\n {name: \"manufacture\", options: [{value: \"customise/resources/steps/manufacture.png\"}]},\r\n {name: \"toolpath\", options: [{value: \"customise/resources/steps/manufacture.png\"}]},\r\n {name: \"invoice-await\", options: [{value: \"customise/resources/steps/invoice-await.png\"}]},\r\n\t\t\t\t{name: \"batch-create\", options: [{value: \"customise/resources/steps/batch-create.png\"}]},\r\n {name: \"batch-process\", options: [{value: \"customise/resources/steps/batch-process.png\"}]},\r\n\t\t\t\t{name: \"print\", options: [{value: \"customise/resources/steps/print.png\"}]},\r\n {name: \"shipping-ready\", options: [{value: \"customise/resources/steps/shipped.png\"}]}\r\n\r\n ];\r\n })\r\n;\r\n","angular.module('env.customConfig.directives', [\r\n 'env.customConfig.provider',\r\n 'env.customConfig.logicResolvers',\r\n 'env.custom.customModule'\r\n])\r\n .config(function ($customisationConfigProvider, $customLogicResolversProvider) {\r\n $customisationConfigProvider.directives =\r\n [\r\n {\r\n name: \"hello-directive\",\r\n options: [\r\n {\r\n value: \"hello-alice\",\r\n condition: function (context) { // can return string or boolean\r\n return context.user.name == 'Alice';\r\n }\r\n },\r\n {\r\n value: \"hello-bob\",\r\n condition: function (context) {\r\n return context.user.name == 'Bob';\r\n }\r\n },\r\n {\r\n value: \"hello-mark\",\r\n condition: function (context) {\r\n return context.user.name == 'Mark';\r\n }\r\n }\r\n ]\r\n },\r\n {},\r\n {}\r\n ];\r\n })\r\n;\r\n","angular.module('env.customConfig.configs', [\r\n 'env.customConfig.provider',\r\n 'env.customConfig.logicResolvers',\r\n 'env.customConfig.workflow',\r\n 'env.custom.customModule'\r\n])\r\n .config(function ($customisationConfigProvider,\r\n $customLogicResolversProvider,\r\n centreUserWorkflowConfig,\r\n customerUserWorkflowConfig,\r\n $customActionsProvider) {\r\n $customisationConfigProvider.configs =\r\n [\r\n {\r\n //List of the reports to be shown on the Orders gridview toolbar's dropdown button\r\n //those reports should be configured in the configReports.js configuration file\r\n name: \"orders-grid-reports\",\r\n options: [\r\n {\r\n //for DelcamSupport user\r\n value: [\"overnight-orders-overview\", \"orders-month-overview\", \"orders-by-mid-layer\", \"orders-by-date\", \"orders-by-date-2yrs\"],\r\n condition: function (context) {\r\n //Show the above reports collection only for DelcamSupport user\r\n return context.user.name === 'DelcamSupport';\r\n }\r\n },\r\n {\r\n //for centre user\r\n value: [\"overnight-orders-overview\", \"orders-month-overview\", \"orders-by-mid-layer\", \"orders-by-date\", \"orders-by-date-2yrs\"],\r\n //value: [\"orders-by-iqube-user\", \"orders-by-ipad-user\", \"orders-by-iqube-user-new\", \"orders-by-ipad-user-new\"],\r\n //value: [\"multi-orders\", \"daily-report\", \"orders-by-customer\", \"orders-by-date\"],\r\n condition: function (context) {\r\n //Show the above reports collection only for Centre (Lab) users\r\n return context.user.role.isCentre;\r\n }\r\n },\r\n {\r\n //for customer user\r\n //can be a different report for a customer user\r\n //(or removed at all if you want to show the same as for centre user, see example below)\r\n value: [\"orders-report-general\", \"show-audit\"],\r\n condition: function (context) {\r\n //Hide all reports for customer users for now\r\n return false;//context.user.role.isCustomer;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n //List of the reports to be shown on the Order Details's page (if needed)\r\n //those reports should be configured in the configReports.js configuration file\r\n name: \"order-reports\",\r\n options: [\r\n {\r\n //for customer user\r\n value: [],\r\n condition: function (context) {\r\n //Show the above reports collection only for Centre users\r\n return context.user.role.isCustomer;\r\n }\r\n },\r\n {\r\n value: [\"order-label\", \"order-pair-label\", \"lab-order-report\", \"order-report\", \"order-certificate\"],\r\n condition: function (context) {\r\n //Show the above reports collection only for specific users\r\n return context.user.name === 'DelcamSupport';\r\n }\r\n },\r\n {\r\n value: [\"order-label\", \"order-pair-label\", \"lab-order-report\", \"order-certificate\"],\r\n condition: function (context) {\r\n //Show the above reports collection only for Centre users\r\n return context.user.role.isCentre;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n //Main shell config to instruct app to hide the navbar menu and/or allow view order details\r\n name: \"shell-config\",\r\n options: [\r\n {\r\n value: {\r\n hideMenu: false,\r\n forbidOrderDetailsView: false,\r\n newOrderAllowed: false\r\n },\r\n condition: function (context) {\r\n return context.user.role.isCentre;\r\n }\r\n },\r\n {\r\n value: {\r\n hideMenu: true,\r\n forbidOrderDetailsView: true,\r\n newOrderAllowed: false\r\n },\r\n condition: function (context) {\r\n return context.user.role.isCustomer;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"spinner-config\",\r\n options: [\r\n {\r\n value: {\r\n type: \"dots\"\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"grid-config\",\r\n resolve: function (context) {\r\n //Tries to resolve the uri to the configuration file and then to download and evaluate it.\r\n //If succeeded, the resulted configuration object as a proper javascript object instance will be returned.\r\n return $customLogicResolversProvider.resolveConfigFromServer(context, this.name + \".js\", om.config.grid.defaultConfiguration);\r\n }\r\n },\r\n {\r\n name: \"workflow-config\",\r\n options: [\r\n {\r\n value: customerUserWorkflowConfig,\r\n condition: function (context) {\r\n return context.user.role.isCustomer;\r\n }\r\n },\r\n {\r\n value: centreUserWorkflowConfig,\r\n condition: function (context) {\r\n return context.user.role.isCentre;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"left-panel-custom-links-config\",\r\n options: [\r\n {\r\n value: [],\r\n condition: function (context) {\r\n return context.user.role.isCustomer;\r\n }\r\n },\r\n {\r\n value: [\r\n {\r\n href: '#/client/centres',\r\n iconClass: 'icon-organization hover-highlight',\r\n title: 'Centres'\r\n },\r\n {\r\n href: '#/client/statistics',\r\n iconClass: 'icon-chart hover-highlight',\r\n title: 'Statistics'\r\n },\r\n {\r\n href: '#/client/assetsRegister',\r\n iconClass: 'icon-screen-tablet hover-highlight',\r\n title: 'Assets'\r\n }\r\n ],\r\n condition: function (context) {\r\n return context.user.role.isCentre;\r\n }\r\n }\r\n ]\r\n },\r\n {\r\n name: \"centre-profile-open-orders-filter\",\r\n resolve: function (context) {\r\n if (!context.user.role.isCentre || angular.isUndefined(context.centreId)) {\r\n return null;\r\n }\r\n return {\r\n name: context.centreCode,\r\n color: 'green',\r\n queryForStatInfo:\r\n `OrderItem.Deleted = false AND Step.Code <> 'Shipped' AND Step.Code <> 'Complete' AND Step.Code <> 'Cancelled' AND (Centre.Id = ${context.centreId} OR AssignedCentre.Id = ${context.centreId})`,\r\n targetUri: `#/client/centres/${context.centreId}/overview`,\r\n iconName: 'track',\r\n uiPriority: 1\r\n };\r\n }\r\n },\r\n {\r\n name: \"customer-profile-open-orders-filter\",\r\n resolve: function (context) {\r\n if (!context.user.role.isCentre || angular.isUndefined(context.customerId)) {\r\n return null;\r\n }\r\n return {\r\n name: context.customerCode,\r\n color: 'green',\r\n queryForStatInfo: `OrderItem.Deleted = false AND Step.Code <> 'Shipped' AND Step.Code <> 'Complete' AND Step.Code <> 'Cancelled' AND Customer.Id = ${context.customerId}`,\r\n targetUri: `#/client/customers/${context.customerId}/overview`,\r\n iconName: 'track',\r\n uiPriority: 1\r\n };\r\n }\r\n },\r\n {\r\n name: \"customer-profile-completed-orders-filter\",\r\n resolve: function (context) {\r\n if (!context.user.role.isCentre || angular.isUndefined(context.customerId)) {\r\n return null;\r\n }\r\n return {\r\n name: context.customerCode,\r\n color: 'red',\r\n queryForStatInfo: `OrderItem.Deleted = false AND Step.Code <> 'Cancelled' AND Customer.Id = ${context.customerId}`,\r\n targetUri: `#/client/customers/${context.customerId}/overview`,\r\n iconName: 'track',\r\n uiPriority: 1\r\n };\r\n }\r\n },\r\n {\r\n name: \"order-item-card-barcode-scanner-custom-action\",\r\n resolve: function (context) {\r\n return function () {\r\n if (!angular.isUndefined($customActionsProvider) && $customActionsProvider.handOutLeftFootScanFile) {\r\n $customActionsProvider.handOutLeftFootScanFile(context.orderItem);\r\n }\r\n };\r\n }\r\n },\r\n {\r\n name: \"order-item-card-page-title-getter\",\r\n resolve: function (context) {\r\n return function () {\r\n if (context.orderItem) {\r\n return 'OrderManager: Order ' + context.orderItem.$model.order.$model.id;\r\n }\r\n return null;\r\n };\r\n }\r\n },\r\n {\r\n name: \"new-order-config\",\r\n resolve: function () {\r\n }\r\n },\r\n {\r\n name: \"new-order-types-config\",\r\n resolve: function () {\r\n }\r\n },\r\n {\r\n name: \"defaultUserSettings-config\",\r\n options: [\r\n {\r\n value: {\r\n version: 1,\r\n gridSettings: {\r\n textSearchFields: [\r\n {\r\n \"text\": \"Order Item\", \"checked\": true, \"expanded\": true, \"items\": [\r\n { \"text\": \"Id\", \"alias\": \"OrderItem.Id\", \"type\": \"int\", \"checked\": false },\r\n { \"text\": \"Data\", \"alias\": \"OrderItem.Data\", \"checked\": false },\r\n { \"text\": \"Completed\", \"alias\": \"OrderItem.Completed\", \"type\": \"date\", \"checked\": false },\r\n { \"text\": \"Expected by\", \"alias\": \"OrderItem.ExpectedBy\", \"type\": \"date\", \"checked\": false },\r\n { \"text\": \"Required by\", \"alias\": \"OrderItem.RequiredBy\", \"type\": \"date\", \"checked\": false },\r\n { \"text\": \"Summary\", \"alias\": \"OrderItem.Summary\", \"checked\": true },\r\n { \"text\": \"Custom fields\", \"customFields\": \"OrderItem\", \"checked\": true },\r\n { \"text\": \"Step\", \"alias\": \"Step.Code\", \"checked\": false },\r\n {\r\n \"text\": \"Assigned Centre\", \"checked\": false, \"items\": [\r\n { \"text\": \"Code\", \"alias\": \"AssignedCentre.Code\", \"checked\": false },\r\n {\r\n \"text\": \"Address\", \"alias\": \"AssignedCentreAddress\", \"checked\": false, \"items\": [\r\n { \"text\": \"Line 1\", \"alias\": \"Line1\", \"checked\": false },\r\n { \"text\": \"Line 2\", \"alias\": \"Line2\", \"checked\": false },\r\n { \"text\": \"City\", \"alias\": \"City\", \"checked\": false },\r\n { \"text\": \"Company Name\", \"alias\": \"CompanyName\", \"checked\": false },\r\n { \"text\": \"Contact last name\", \"alias\": \"ContactLastName\", \"checked\": false },\r\n { \"text\": \"Contact first name\", \"alias\": \"ContactFirstName\", \"checked\": false },\r\n { \"text\": \"Contact title\", \"alias\": \"ContactTitle\", \"checked\": false },\r\n { \"text\": \"Country\", \"alias\": \"Country\", \"checked\": false },\r\n { \"text\": \"Email\", \"alias\": \"Email\", \"checked\": false },\r\n { \"text\": \"Postal code\", \"alias\": \"PostalCode\", \"checked\": false },\r\n { \"text\": \"Region\", \"alias\": \"Region\", \"checked\": false },\r\n { \"text\": \"Telephone\", \"alias\": \"Telephone\", \"checked\": false }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"text\": \"Created By\", \"alias\": \"CreatedBy\", \"checked\": true, \"items\": [\r\n { \"text\": \"Name\", \"alias\": \"Name\", \"checked\": true },\r\n { \"text\": \"Last name\", \"alias\": \"LastName\", \"checked\": true },\r\n { \"text\": \"First name\", \"alias\": \"FirstName\", \"checked\": true },\r\n { \"text\": \"Title\", \"alias\": \"Title\", \"checked\": true },\r\n { \"text\": \"Email\", \"alias\": \"Email\", \"checked\": true }\r\n ]\r\n },\r\n {\r\n \"text\": \"Order\", \"checked\": false, \"items\": [\r\n { \"text\": \"Id\", \"alias\": \"Order.Id\", \"type\": \"int\", \"checked\": true },\r\n { \"text\": \"Reference\", \"alias\": \"Order.Reference\", \"checked\": true },\r\n { \"text\": \"Summary\", \"alias\": \"Order.Summary\", \"checked\": true },\r\n { \"text\": \"Data\", \"alias\": \"Order.Data\", \"checked\": false },\r\n { \"text\": \"Completed\", \"alias\": \"Order.Completed\", \"type\": \"date\", \"checked\": false },\r\n { \"text\": \"Expected by\", \"alias\": \"Order.ExpectedBy\", \"type\": \"date\", \"checked\": false },\r\n { \"text\": \"Required by\", \"alias\": \"Order.RequiredBy\", \"type\": \"date\", \"checked\": false },\r\n { \"text\": \"Custom fields\", \"customFields\": \"Order\", \"checked\": false },\r\n {\r\n \"text\": \"Centre\", \"checked\": false, \"items\": [\r\n { \"text\": \"Code\", \"alias\": \"Centre.Code\", \"checked\": false },\r\n {\r\n \"text\": \"Address\", \"alias\": \"CentreAddress\", \"checked\": false, \"items\": [\r\n { \"text\": \"Line 1\", \"alias\": \"Line1\", \"checked\": false },\r\n { \"text\": \"Line 2\", \"alias\": \"Line2\", \"checked\": false },\r\n { \"text\": \"City\", \"alias\": \"City\", \"checked\": false },\r\n { \"text\": \"Company Name\", \"alias\": \"CompanyName\", \"checked\": false },\r\n { \"text\": \"Contact last name\", \"alias\": \"ContactLastName\", \"checked\": false },\r\n { \"text\": \"Contact first name\", \"alias\": \"ContactFirstName\", \"checked\": false },\r\n { \"text\": \"Contact title\", \"alias\": \"ContactTitle\", \"checked\": false },\r\n { \"text\": \"Country\", \"alias\": \"Country\", \"checked\": false },\r\n { \"text\": \"Email\", \"alias\": \"Email\", \"checked\": false },\r\n { \"text\": \"Postal code\", \"alias\": \"PostalCode\", \"checked\": false },\r\n { \"text\": \"Region\", \"alias\": \"Region\", \"checked\": false },\r\n { \"text\": \"Telephone\", \"alias\": \"Telephone\", \"checked\": false }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"text\": \"Customer\", \"checked\": false, \"items\": [\r\n { \"text\": \"Code\", \"alias\": \"Customer.Code\", \"checked\": false },\r\n { \"text\": \"Address\", \"alias\": \"CustomerAddress\", \"checked\": false, \"items\": [\r\n { \"text\": \"Line 1\", \"alias\": \"Line1\", \"checked\": false },\r\n { \"text\": \"Line 2\", \"alias\": \"Line2\", \"checked\": false },\r\n { \"text\": \"City\", \"alias\": \"City\", \"checked\": false },\r\n { \"text\": \"Company Name\", \"alias\": \"CompanyName\", \"checked\": false },\r\n { \"text\": \"Contact last name\", \"alias\": \"ContactLastName\", \"checked\": false },\r\n { \"text\": \"Contact first name\", \"alias\": \"ContactFirstName\", \"checked\": false },\r\n { \"text\": \"Contact title\", \"alias\": \"ContactTitle\", \"checked\": false },\r\n { \"text\": \"Country\", \"alias\": \"Country\", \"checked\": false },\r\n { \"text\": \"Email\", \"alias\": \"Email\", \"checked\": false },\r\n { \"text\": \"Postal code\", \"alias\": \"PostalCode\", \"checked\": false },\r\n { \"text\": \"Region\", \"alias\": \"Region\", \"checked\": false },\r\n { \"text\": \"Telephone\", \"alias\": \"Telephone\", \"checked\": false }\r\n ]\r\n }\r\n ]\r\n },\r\n {\r\n \"text\": \"Delivery address\", \"alias\": \"DeliveryAddress\", \"checked\": true, \"items\": [\r\n { \"text\": \"Line 1\", \"alias\": \"Line1\", \"checked\": true },\r\n { \"text\": \"Line 2\", \"alias\": \"Line2\", \"checked\": true },\r\n { \"text\": \"City\", \"alias\": \"City\", \"checked\": true },\r\n { \"text\": \"Company Name\", \"alias\": \"CompanyName\", \"checked\": true },\r\n { \"text\": \"Contact last name\", \"alias\": \"ContactLastName\", \"checked\": true },\r\n { \"text\": \"Contact first name\", \"alias\": \"ContactFirstName\", \"checked\": true },\r\n { \"text\": \"Contact title\", \"alias\": \"ContactTitle\", \"checked\": true },\r\n { \"text\": \"Country\", \"alias\": \"Country\", \"checked\": true },\r\n { \"text\": \"Email\", \"alias\": \"Email\", \"checked\": true },\r\n { \"text\": \"Postal code\", \"alias\": \"PostalCode\", \"checked\": true },\r\n { \"text\": \"Region\", \"alias\": \"Region\", \"checked\": true },\r\n { \"text\": \"Telephone\", \"alias\": \"Telephone\", \"checked\": true }\r\n ]\r\n }\r\n ]\r\n }\r\n ]\r\n }\r\n ]\r\n },\r\n orderItemCardTab: \"updates\",\r\n saveOrderItemCardTab: true,\r\n disableCookiePolicyWarning: true\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n })\r\n ;\r\n","angular.module('env.custom.customModule.assetsRegister', ['common.directives.inView'])\r\n\r\n // Below is the route config and controller for the custom view 'Customers' for Footlink company\r\n .config(function ($stateProvider) {\r\n\r\n $stateProvider.state('client.assetsRegister', {\r\n url: '/assetsRegister',\r\n templateUrl: 'branding/footlink/assetsRegister/assetsRegister.html',\r\n controller: 'AssetsRegisterController',\r\n\r\n data: {pageTitle: 'OrderManager: Assets Register'}\r\n });\r\n })\r\n\r\n .controller('AssetsRegisterController', function AssetsRegisterController($q,\r\n $log,\r\n $scope,\r\n $state,\r\n toastr,\r\n gettextCatalog,\r\n usersRepository,\r\n ordersRepository,\r\n orderItemsRepository,\r\n $timeout,\r\n customResourceResolver,\r\n $customisationConfig,\r\n permissions,\r\n uiLocalization,\r\n intuneService) {\r\n\r\n $scope.isBusy = true;\r\n $scope.limit = 10; // initial value for limit\r\n $scope.tableHeaderLabel = '';\r\n $scope.tooOldVersionDetected = false;\r\n $scope.todayDate = new Date();\r\n\r\n $scope.iOSScanAppLatestVersion = '1.5.5.2';\r\n $scope.winScanAppLatestVersion = '1.5.1.0';\r\n\r\n var assetTypes = [\r\n {\r\n text: gettextCatalog.getString(\"All Devices\"),\r\n value: {deviceType: 'All', deviceId: ''}\r\n },\r\n {\r\n text: gettextCatalog.getString(\"iQube Devices\"),\r\n value: {deviceType: 'Windows', deviceId: ''}\r\n },\r\n {\r\n text: gettextCatalog.getString(\"iPad Devices\"),\r\n value: {deviceType: 'IOS', deviceId: ''}\r\n }\r\n ];\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n });\r\n\r\n $scope.tableHeaderLabel = gettextCatalog.getString(\"ORTESI OWNED ASSET REGISTER - \") + assetTypes[0].text;\r\n $scope.assetType = assetTypes[0].value;\r\n\r\n $scope.loadMore = function (last, inview) {\r\n if (last && inview) {\r\n $scope.limit += 20;\r\n }\r\n };\r\n\r\n $scope.doPrint = function () {\r\n $scope.limit = 10000000;\r\n //A little trick to call requestAnimationFrame twice to make sure the DOM\r\n //has been updated to render all the TABLE rows and cells after we change the limit for it\r\n //Once the DOM update finishes, we raise the printing dialog\r\n var intermediate = function () {\r\n window.requestAnimationFrame(function () {\r\n window.print();\r\n });\r\n };\r\n window.requestAnimationFrame(intermediate);\r\n };\r\n\r\n $scope.userSearch = function (item) {\r\n if (!$scope.userFilter ||\r\n (item.$model.name &&\r\n item.$model.name.toLowerCase().indexOf($scope.userFilter.toLowerCase()) !== -1) ||\r\n (item.lastOrder && item.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.MachineName &&\r\n item.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.MachineName.toLowerCase().indexOf($scope.userFilter.toLowerCase()) !== -1) ||\r\n (item.lastOrder && item.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.MachineSerialNumber &&\r\n item.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.MachineSerialNumber.toLowerCase().indexOf($scope.userFilter.toLowerCase()) !== -1) ||\r\n (item.lastOrder && item.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.ApplicationVersion &&\r\n item.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.ApplicationVersion.toLowerCase().indexOf($scope.userFilter.toLowerCase()) !== -1) ||\r\n (item.$model.customFields.Class &&\r\n item.$model.customFields.Class.toLowerCase().indexOf($scope.userFilter.toLowerCase()) !== -1)) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n $scope.usersDevicesSort = function (user) {\r\n if (user && user.device && user.device.deviceName) {\r\n return user.device.deviceName;\r\n }\r\n if (user && user.lastOrder && user.lastOrder.$model && user.lastOrder.$model.jsonData && user.lastOrder.$model.jsonData.OrderData && user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData) {\r\n return user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.MachineName;\r\n }\r\n return 'n/a';\r\n };\r\n\r\n initData();\r\n\r\n function initDeviceTypesDropDown() {\r\n\r\n if ($scope.users) {\r\n var groupsCount = _.countBy($scope.users, function (u) {\r\n if (u.$model.customFields.Class === 'iPad') {\r\n return 'iPad';\r\n } else if (u.$model.customFields.Class.indexOf('Waiting') !== -1) {\r\n return 'Waiting';\r\n } else if (u.$model.customFields.Class.startsWith('iQube')) {\r\n return 'iQube';\r\n }\r\n });\r\n //if we have users collection initialised, update asset types dropdown with counts\r\n _.forEach(assetTypes, function (assetType) {\r\n switch (assetType.value.deviceType) {\r\n case \"All\":\r\n assetType.text += _.str.sprintf(' (%s)', $scope.users.length); //show all users count\r\n break;\r\n case \"IOS\":\r\n assetType.text += _.str.sprintf(' (%s)', groupsCount.iPad); //show ipad users count\r\n break;\r\n case \"Windows\":\r\n assetType.text += _.str.sprintf(' (%s)', groupsCount.iQube); //show iqube users count\r\n break;\r\n }\r\n });\r\n\r\n }\r\n\r\n $scope.dropdownAssetsTypesOptions = {\r\n dataSource: assetTypes,\r\n dataTextField: \"text\",\r\n dataValueField: \"value\",\r\n valueTemplate: '',\r\n template: \"{{dataItem.text|sTranslate}}\",\r\n select: function (e) {\r\n var selectedItem = $scope.dropdownAssetsTypesOptions.dataSource[e.item.index()];\r\n if ($scope.assetType !== selectedItem.value) {\r\n $scope.tableHeaderLabel = gettextCatalog.getString(\"ORTESI OWNED ASSET REGISTER - \") + selectedItem.text;\r\n $scope.isBusy = true;\r\n $scope.users = null;\r\n $scope.assetType = selectedItem.value;\r\n initData();\r\n }\r\n },\r\n dataBound: function () {\r\n this.list.width('auto');\r\n }\r\n };\r\n }\r\n\r\n function initData() {\r\n\r\n $scope.limit = 10;\r\n\r\n var initDataPromise = usersRepository.search(queryForUsersSet($scope.assetType.deviceType))\r\n .then(function (usersSet) {\r\n //Get users list from OM\r\n $scope.usersCount = usersSet.items.length;\r\n $scope.users = usersSet.items; //after all we will assemble a list of entities here that will\r\n //represent user/device with its metadata.\r\n //If we will have a managed device w/o assigned user, we will add\r\n //entity here with the device serial, w/o user.$model\r\n initDeviceTypesDropDown();\r\n\r\n //Get managed devices information from MDM via request to OM\r\n return intuneService.getManagedDevices().then(function (devices) {\r\n $scope.managedDevices = devices;\r\n });\r\n })\r\n .then(function () {\r\n //Create promise for each user object that will fetch order/orderitem info from OM for that user containing\r\n //more metadata information about the device this user is using\r\n var ordersPromises = [];\r\n _.each($scope.users,\r\n function (u) {\r\n //if it's a real user model\r\n if (u && u.$model) {\r\n ordersPromises.push(orderItemsRepository\r\n .search({\r\n where: \"OrderItem.Deleted = false AND CreatedBy.Name = '\" + u.$model.name +\r\n \"' AND (Step.Code <> 'Cancelled' OR Step.Code = 'Cancelled')\", //To include all open/completed orders and cancelled as well.\r\n orderBy: 'OrderItem.Created desc',\r\n pageNumber: 0,\r\n rowsPerPage: 3 //to try and include not only 'second' orders as they may contain outdated device info but we can't filter them out with omql\r\n }, true)\r\n .then(function (result) {\r\n var user;\r\n if (result && result.items && result.items.length > 0) {\r\n //Look through each order item in the list, returning the first one that belongs to non-second order\r\n var latestNonSecondOrderItem = _.find(result.items, function (oi) {\r\n return !oi.$model.order.$model.customFields.IsSecond;\r\n });\r\n if (!latestNonSecondOrderItem) {\r\n //if there are no non-second orders amongst returned orders, just use the latest one\r\n latestNonSecondOrderItem = result.items[0];\r\n }\r\n //And assign the found latest order onto the user\r\n user = _.find($scope.users, function (o) {\r\n return o.$model.name === latestNonSecondOrderItem.$model.createdBy;\r\n });\r\n user.lastOrder = latestNonSecondOrderItem.$model.order;\r\n }\r\n //By some reason we need to explictly check the user like the check below\r\n if (!user) {\r\n $scope.tooOldVersionDetected = true;\r\n } else if ($scope.criticalVersionUser(user)) {\r\n $scope.tooOldVersionDetected = true;\r\n }\r\n }));\r\n }\r\n });\r\n return $q.all(ordersPromises);\r\n })\r\n .then(function () {\r\n //Process the collections to form the final collection representing devices and users\r\n _.each($scope.managedDevices, function (managedDevice) {\r\n var assignedUser = _.find($scope.users, function (u) {\r\n var isSameSerial = u.lastOrder && u.lastOrder.$model.jsonData && u.lastOrder.$model.jsonData.OrderData && u.lastOrder.$model.jsonData.OrderData.ApplicationOrderData &&\r\n u.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.MachineSerialNumber === managedDevice.serialNumber;\r\n var isSameMachineName = u.lastOrder && u.lastOrder.$model.jsonData && u.lastOrder.$model.jsonData.OrderData && u.lastOrder.$model.jsonData.OrderData.ApplicationOrderData &&\r\n u.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.MachineName === managedDevice.deviceName;\r\n\r\n return isSameSerial && isSameMachineName;\r\n });\r\n if (assignedUser) {\r\n //otherwise just store device on a user just in case\r\n assignedUser.device = managedDevice;\r\n } else {\r\n //we have a managed device w/o assigned user, but we need to show it, so add a fake record\r\n //however we need to make sure the OS of the managed in Intune (MDM) device is the same as the OS \r\n //of the selected device type in the dropdown\r\n if ($scope.assetType.deviceType.toLowerCase() === managedDevice.operatingSystem.toLowerCase() ||\r\n $scope.assetType.deviceType.toLowerCase() === 'all') {\r\n $scope.users.push({ device: managedDevice });\r\n }\r\n }\r\n });\r\n })\r\n .then(function () {\r\n $scope.isBusy = false;\r\n })\r\n .catch(function (resp) {\r\n initDataPromise = null;\r\n if (resp && resp.status) {\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error %s : %s\", resp.status, resp.statusText));\r\n } else {\r\n toastr.error(gettextCatalog.getString(\"Data request failed\"), gettextCatalog.getString(\"Server is not responding\"));\r\n }\r\n });\r\n\r\n return initDataPromise;\r\n }\r\n\r\n function queryForUsersSet(deviceType) {\r\n var query =\r\n \"User.Name <> 'DownloadService' AND User.Name <> 'admin' AND User.Name <> 'LabUser' AND User.Name <> 'appletest' AND \" +\r\n \"User.Name <> 'comlaw' AND User.Name <> 'DelcamSupport' AND User.Name <> 'ortesi2' AND User.Name <> 'Test' AND User.Disabled = false\";\r\n\r\n if (deviceType && deviceType.length > 0) {\r\n switch (deviceType) {\r\n case \"IOS\":\r\n query += \" AND User.Class = 'iPad'\";\r\n break;\r\n case \"Windows\":\r\n query += \" AND User.Class NOT LIKE '%Waiting' AND User.Class LIKE 'iQube%'\";\r\n break;\r\n case \"All\":\r\n query += \" AND User.Class NOT LIKE '%Waiting' AND (User.Class = 'iPad' OR User.Class LIKE 'iQube%')\";\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n //Filtering out the users who are own their devices\r\n //We user user's customfield DeviceId for that.\r\n query += \" AND User.DeviceId <> 'Own' AND User.DeviceId NOT LIKE '%CLINIC OWNED%'\";\r\n\r\n\r\n return {\r\n where: query,\r\n orderBy: \"\",\r\n pageNumber: 0,\r\n rowsPerPage: 100000000\r\n };\r\n }\r\n\r\n $scope.isZeroOrdersUser = function (user) {\r\n return !user.lastOrder;\r\n };\r\n\r\n $scope.isTooOldVersionUser = function (user) {\r\n return !user.lastOrder ||\r\n !user.lastOrder.$model.jsonData ||\r\n !user.lastOrder.$model.jsonData.OrderData ||\r\n !user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData ||\r\n !user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.ApplicationVersion;\r\n };\r\n\r\n $scope.criticalVersionUser = function (user) {\r\n return $scope.isZeroOrdersUser(user) || $scope.isTooOldVersionUser(user);\r\n }\r\n\r\n $scope.warnVersionUser = function (user) {\r\n if ($scope.criticalVersionUser(user)) {\r\n return false;\r\n }\r\n if (!user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.Platform) {\r\n //If we have no platform info - the version is definitely not the latest\r\n return true;\r\n }\r\n if (user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.Platform === 'IOS') {\r\n return user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.ApplicationVersion !== $scope.iOSScanAppLatestVersion;\r\n }\r\n if (user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.Platform === 'Windows') {\r\n return user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.ApplicationVersion !== $scope.winScanAppLatestVersion;\r\n }\r\n\r\n //or just warn by default if no version info\r\n return !user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.ApplicationVersion;\r\n }\r\n\r\n // Map region ------------------------------------------------------------------\r\n\r\n $scope.initMap = function (deviceLocation, userName, machineName, machineSerial) {\r\n $scope.mapOptions = {\r\n zoom: 10,\r\n center: new google.maps.LatLng(deviceLocation.Lat, deviceLocation.Lng)\r\n };\r\n if (angular.isUndefined($scope.map)) {\r\n $scope.map = new google.maps.Map(document.getElementById('gmap'));\r\n }\r\n if (angular.isUndefined($scope.markerInfo)) {\r\n $scope.markerInfo = new google.maps.InfoWindow();\r\n }\r\n\r\n if (!angular.isUndefined($scope.deviceMarker)) {\r\n $scope.deviceMarker.setMap(null);\r\n $scope.deviceMarker = null;\r\n }\r\n\r\n $scope.map.setOptions($scope.mapOptions);\r\n\r\n $scope.deviceMarker = new google.maps.Marker({\r\n map: $scope.map,\r\n position: new google.maps.LatLng(deviceLocation.Lat, deviceLocation.Lng),\r\n title: _.str.sprintf(\"%s (%s)\", machineName, userName),\r\n content: _.str.sprintf('
Latitude: %s
Longitude: %s
Device Serial: %s
',\r\n deviceLocation.Lat, deviceLocation.Lng, machineSerial)\r\n });\r\n\r\n google.maps.event.addListener($scope.deviceMarker, 'click', function () {\r\n $scope.markerInfo.setContent(_.str.sprintf('
%s (%s)

%s

', machineName, userName, $scope.deviceMarker.content));\r\n $scope.markerInfo.open($scope.map, $scope.deviceMarker);\r\n });\r\n }\r\n\r\n $scope.loadMapScript = function () {\r\n var script = document.createElement('script');\r\n script.type = 'text/javascript';\r\n script.src = 'https://maps.googleapis.com/maps/api/js?key=AIzaSyCKfTb9mUPiJBfgbRhZMFh8etPQGt-cWc4&extension=.js';\r\n document.body.appendChild(script);\r\n }\r\n\r\n $scope.mapWindowWidth = 800;\r\n $scope.viewDeviceLocation = function (deviceLocation, user) {\r\n\r\n $scope.deviceLocationWindow.setOptions({\r\n title: _.str.sprintf(\"%s (%s) location\", user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.MachineName, user.$model.name),\r\n position: {\r\n top: '15%',\r\n left: (jQuery(window).width() - $scope.mapWindowWidth) / 2\r\n },\r\n animation: om.config.kendoWindowDefaultOptions.animation\r\n });\r\n\r\n $scope.initMap(\r\n deviceLocation,\r\n user.$model.name,\r\n user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.MachineName,\r\n user.lastOrder.$model.jsonData.OrderData.ApplicationOrderData.MachineSerialNumber);\r\n\r\n $scope.deviceLocationWindow.open();\r\n };\r\n\r\n // End of Map region -----------------------------------------------------------\r\n })\r\n\r\n;\r\n","angular.module('env.custom.customModule.orderItemSummary', [])\r\n .constant('jsZip', window.JSZip)\r\n .controller('orderItemSummaryController', function ($log, $q, $scope, $timeout, toastr, attachmentsHelperService, authService, fileService, gettextCatalog, jsZip) {\r\n\r\n //var watcherDestructor = $scope.$watch(\r\n // 'orderItem',\r\n // function (newVal, oldVal) {\r\n // if (newVal && newVal !== oldVal && (!newVal.$model.expectedBy || newVal.$model.expectedBy.getFullYear() === 1)) {\r\n // setDefaultCompletionDate(newVal);\r\n // }\r\n // }\r\n //);\r\n $scope.$on('$destroy', function () {\r\n //watcherDestructor();\r\n });\r\n\r\n $scope.exportFilesForTaika3D = function () {\r\n //Files to be zipped. Some of them needs to be downloaded first\r\n var filesToExport = [\r\n {\r\n fileName: `${$scope.orderItem.$model.orderId}L.stl`,\r\n documentId: attachmentsHelperService.getLeftFootScanFileNameId($scope.orderItem),\r\n blob: null\r\n }, {\r\n fileName: `${$scope.orderItem.$model.orderId}R.stl`,\r\n documentId: attachmentsHelperService.getRightFootScanFileNameId($scope.orderItem),\r\n blob: null\r\n }, {\r\n fileName: `${$scope.orderItem.$model.orderId}.json`,\r\n documentId: null,\r\n blob: new Blob([JSON.stringify($scope.orderItem.$model.order.$model.jsonData, null, 2)], { type: 'text/json' })\r\n }\r\n ];\r\n $scope.isDownloadingFiles = true;\r\n\r\n $q.all([\r\n filesToExport[0].documentId != null ? fileService.downloadDocumentFile(filesToExport[0].documentId) : $q.when(null),\r\n filesToExport[1].documentId != null ? fileService.downloadDocumentFile(filesToExport[1].documentId) : $q.when(null)\r\n ])\r\n .then(function (data) {\r\n //Now as all files are downloaded, add blobs to the array of files which then will be zipped\r\n filesToExport[0].blob = data[0];\r\n filesToExport[1].blob = data[1];\r\n\r\n //And zip them all!\r\n var zip = jsZip();\r\n filesToExport.forEach(function (f) {\r\n if (f.blob && f.blob != null) {\r\n zip.file(f.fileName, f.blob);\r\n }\r\n });\r\n\r\n return zip.generateAsync({ type: 'blob' }).then(function (zipFileBlob) {\r\n return saveBlobToFile(zipFileBlob, `${$scope.orderItem.$model.orderId}.zip`);\r\n });\r\n\r\n }).then(function () {\r\n $scope.$applyAsync(function () {\r\n $scope.isDownloadingFiles = false;\r\n });\r\n toastr.info(\"Order JSON data and feet scans has been saved for export to Taika3D as Zip file.\", \"Order files saved\");\r\n })\r\n .catch(function (err) {\r\n $scope.$applyAsync(function () {\r\n $scope.isDownloadingFiles = false;\r\n });\r\n\r\n if (err && err.code === 20 && err.name === 'AbortError') {\r\n toastr.warning(\"Export file saving has been cancelled by user.\", \"Operation cancelled\");\r\n } else {\r\n toastr.error(err.toString(), \"Error during Order export generation :(\");\r\n }\r\n });\r\n }\r\n\r\n function saveBlobToFile(blob, suggestedName) {\r\n // Feature detection. The API needs to be supported\r\n // and the app not run in an iframe.\r\n var supportsFileSystemAccess = 'showSaveFilePicker' in window && window.self === window.top;\r\n // If the File System Access API is supported…\r\n if (supportsFileSystemAccess) {\r\n var opts = { suggestedName: suggestedName };\r\n\r\n return window.showSaveFilePicker(opts)\r\n .then(function (handle) {\r\n // Write the blob to the file.\r\n return handle.createWritable()\r\n .then(function (writable) {\r\n return writable.write(blob)\r\n .then(function () {\r\n return writable.close();\r\n });\r\n });\r\n });\r\n } else {\r\n // Fallback if the File System Access API is not supported…\r\n // Create the blob URL.\r\n var blobUrl = URL.createObjectURL(blob);\r\n // Create the `` element and append it invisibly.\r\n var a = document.createElement('a');\r\n a.href = blobUrl;\r\n a.download = suggestedName;\r\n a.style.display = 'none';\r\n document.body.append(a);\r\n // Programmatically click the element.\r\n a.click();\r\n // Revoke the blob URL and remove the element.\r\n return $timeout(function () {\r\n URL.revokeObjectURL(blobUrl);\r\n a.remove();\r\n }, 1000);\r\n }\r\n }\r\n });\r\n","angular.module('env.custom.customModule.orderFiles', [])\r\n\r\n .controller('orderFilesController', function ($window, $compile, $log, $q, $scope, gettextCatalog, toastr,\r\n authService, documentsRepository, threejsLoader, meshViewerDataService, fileService) {\r\n\r\n $scope.loadingFile = true;\r\n\r\n $scope.$on('$destroy', function () {\r\n //watcherDestructor();\r\n });\r\n\r\n var meshViewerFormWidth = 0.8; //meaning percentage 80%\r\n var meshViewerFormHeight = 0.8; //meaning percentage 80%\r\n\r\n $scope.view3dModel = function(document) {\r\n\r\n var windowTitle = gettextCatalog.getString(\"Model preview: \") + (document.$model.fileName.length < 40 ? document.$model.fileName : \r\n document.$model.fileName.substr(0, 20) + \"...\" + document.$model.fileName.substr(document.$model.fileName.length - 17));\r\n\r\n $scope.meshViewerWindowOptions = {\r\n animation: om.config.kendoWindowDefaultOptions.animation,\r\n actions: [\"Close\"],\r\n modal: true,\r\n draggable: false,\r\n resizable: false,\r\n width: (meshViewerFormWidth * 100) + \"%\",\r\n height: (meshViewerFormHeight * 100) + \"%\",\r\n visible: false,\r\n title: windowTitle,\r\n open: $scope.onMeshViewerOpen,\r\n close: $scope.onMeshViewerClose\r\n };\r\n\r\n $scope.document = document;\r\n //Save document file name for later usage\r\n $scope.documentFileName = document.$model.fileName;\r\n\r\n //And then\r\n //Bring up kendoui window with the mesh viewer in it (initialised with the document data)\r\n if ($scope.meshViewerWindow) {\r\n destroyMeshViewerWindow();\r\n }\r\n $scope.meshViewerScope = $scope.$new(false);\r\n $scope.meshViewerWindow = \r\n $($compile(\"
\" + \r\n \"
\" + \r\n \"\" + \r\n \"
\")($scope.meshViewerScope))\r\n .kendoWindow($scope.meshViewerWindowOptions);\r\n \r\n //Update mesh viewer window options to update its size and position according to current browser window size\r\n $scope.meshViewerWindow.data(\"kendoWindow\").center();\r\n $scope.meshViewerWindow.data(\"kendoWindow\").open();\r\n\r\n //Re-center kendo window on browser window resize\r\n angular.element($window).bind('resize', function() {\r\n if ($scope.meshViewerWindow) {\r\n $scope.meshViewerWindow.data(\"kendoWindow\").center();\r\n }\r\n });\r\n };\r\n\r\n $scope.onMeshViewerClose = function() {\r\n destroyMeshViewerWindow();\r\n }\r\n\r\n $scope.onMeshViewerOpen = function() {\r\n $scope.loadingFile = true;\r\n\r\n fileService\r\n .downloadDocumentFile($scope.document.$model.id)\r\n .then(addFileTo3dViewer);\r\n }\r\n\r\n function destroyMeshViewerWindow() {\r\n meshViewerDataService.clearGeometries();\r\n meshViewerDataService.destroy();\r\n\r\n $scope.meshViewerWindow.data(\"kendoWindow\").destroy();\r\n $scope.meshViewerWindow.remove();\r\n delete $scope.meshViewerWindow;\r\n\r\n if ($scope.meshViewerScope) {\r\n $scope.meshViewerScope.$destroy();\r\n }\r\n }\r\n\r\n function addFileTo3dViewer(file) {\r\n //Assign file name to the file object so the parser will use the file extension to infer the proper viewing engine\r\n file.name = $scope.documentFileName;\r\n\r\n return threejsLoader\r\n .parseFile(file)\r\n .then(function (geometry) {\r\n if (!geometry) {\r\n throw new Error('Geometry data empty.');\r\n }\r\n\r\n $scope.$applyAsync(function () { $scope.loadingFile = false; });\r\n\r\n meshViewerDataService.clearGeometries();\r\n\r\n return meshViewerDataService.addGeometry(geometry);\r\n }, function (err) {\r\n handleError(\"Unable to parse 3D model file\", err);\r\n })\r\n .catch(function (err) {\r\n handleError(\"Unable to render 3D model file\", err);\r\n });\r\n }\r\n\r\n function handleError(errorMessage, error) {\r\n toastr.error(null, gettextCatalog.getString(errorMessage));\r\n $log.error(errorMessage, error);\r\n\r\n $scope.$applyAsync(function () { $scope.loadingFile = false; $scope.fileLoadError = true;});\r\n\r\n if ($scope.meshViewerWindow) {\r\n $scope.meshViewerWindow.data(\"kendoWindow\").close();\r\n }\r\n }\r\n\r\n });\r\n","angular.module('env.custom.customModule', [\r\n 'env.custom.customModule.signup',\r\n 'env.custom.customModule.filters',\r\n 'env.custom.customModule.statistics',\r\n 'env.custom.customModule.assetsRegister',\r\n 'env.custom.customModule.attachmentsHelperService',\r\n 'env.custom.customModule.gridItemsActionsHelperService',\r\n 'env.custom.customModule.approvalFields',\r\n 'env.custom.customModule.orderItemSummary',\r\n 'env.custom.customModule.orderFiles'\r\n])\r\n .run(function ($rootScope, $log, toastr, $q, gridItemsActionsHelperService) {\r\n // Custom click handler for the custom button of the 'customer' branded grid\r\n // to order second pair with particular options\r\n $rootScope.orderSecondPairHandler = function (dataItem) {\r\n var kg = $(\"#orderItemsGrid\").data(\"kendoGrid\");\r\n var row = kg.table.find('tr[data-uid=\"' + dataItem.uid + '\"]');\r\n var ddOrderOption = row.find('select.ddOrderNow')[0];\r\n var orderOption = ddOrderOption ? ddOrderOption.value : '';\r\n //Now try to notify external application rendering the view\r\n try {\r\n //If we have the page loaded from inside the ScanApp then try to communicate it!\r\n doScriptNotify(dataItem.$model.order.$model.id + \":\" + orderOption);\r\n $log.trace(\"Sent Order Id to ScanApp: \" + dataItem.$model.order.$model.id + \":\" + orderOption);\r\n } catch (e) {\r\n //Something went wrong and we probably just have the page loaded in the regular browser\r\n alert('Please run the Ortesi3D application and order second pair from the list of completed orders!');\r\n $log.error('Error during notifying of the external application about requested action.', e);\r\n }\r\n };\r\n\r\n $rootScope.orderNowDropDownOptions = {\r\n dataSource: [\r\n {text: 'Identical', value: 'SecondIdentical'},\r\n {text: 'Non-Identical', value: 'SecondNonIdentical'},\r\n {text: 'Cover Change', value: 'SecondIdenticalShellWithDifferentCover'}\r\n ],\r\n dataTextField: \"text\",\r\n dataValueField: \"value\",\r\n template: \"{{dataItem.text|translate}}\",\r\n select: function (e) {\r\n //console.log(document.getElementById('ddOrderNow').selectedOptions[0].value);\r\n },\r\n dataBound: function () {\r\n this.list.width('auto');\r\n }\r\n };\r\n\r\n //When this code runs on a page executed in browser container in iPad, the variable IamIPad will be defined\r\n $rootScope.isIPad = typeof (IamIPad) !== 'undefined' || (navigator.userAgent.indexOf('iPad;') !== -1 && navigator.userAgent.indexOf('AppleWebKit') !== -1);\r\n\r\n $rootScope.shipOrdersInGroup = function(group, currentStep, actionToExecute, setBusyStateFunc, gridReloadFunc, resetOrderItemsGridSharedSettings) {\r\n gridItemsActionsHelperService.shipOrdersInGroup(group, currentStep, actionToExecute, setBusyStateFunc, gridReloadFunc, resetOrderItemsGridSharedSettings);\r\n }\r\n\r\n $rootScope.setFreightReferenceToOrdersGroupAndProgress = function(group, currentStep, actionToExecute, setBusyStateFunc, gridReloadFunc, resetOrderItemsGridSharedSettings) {\r\n gridItemsActionsHelperService.setFreightReferenceToOrdersGroupAndProgress(group, currentStep, actionToExecute, setBusyStateFunc, gridReloadFunc, resetOrderItemsGridSharedSettings);\r\n }\r\n })\r\n\r\n .provider('$customActions', function CustomActions($injector, attachmentsHelperServiceProvider) {\r\n\r\n function handOutLeftFootScanFile(item) {\r\n var elem = document.createElement('a');\r\n elem.href = 'views/documents/download?id=' + attachmentsHelperServiceProvider.getLeftFootScanFileNameId(item);\r\n elem.target = 'hiddenIframe';\r\n elem.click();\r\n }\r\n\r\n this.handOutLeftFootScanFile = handOutLeftFootScanFile;\r\n this.$get = function ($log, $http) {\r\n\r\n this.handOutLeftFootScanFile = handOutLeftFootScanFile;\r\n\r\n return this;\r\n };\r\n })\r\n\r\n;\r\n","angular.module('env.custom.customModule.gridItemsActionsHelperService', [])\r\n .service('gridItemsActionsHelperService', function ($log, $q, toastr, orderItemsRepository, workflowRepository, uiLocalization, gettextCatalog) {\r\n\r\n var _this = this;\r\n\r\n var executeActionOnItems = function (currentStep, actionToExecute, selectedOrderItemIds, setBusyStateFunc) {\r\n\r\n if (!currentStep || !actionToExecute) {\r\n throw \"Current step code and action code have to be defined.\";\r\n }\r\n\r\n setBusyStateFunc(true);\r\n\r\n return workflowRepository.executeActionForOrderItems(currentStep, actionToExecute, selectedOrderItemIds)\r\n .then(function (resp) {\r\n $log.debug('Executed action [' + actionToExecute + '] for selected ' + selectedOrderItemIds.length + ' items.');\r\n toastr.info(\r\n uiLocalization.translate(\"%s items has been progressed [%s].\", selectedOrderItemIds.length, actionToExecute),\r\n uiLocalization.translate(\"Action execution completed\"));\r\n },\r\n function (error) {\r\n if (error) {\r\n var em = error.serverErrorMessage || error.message;\r\n toastr.error(uiLocalization.translate(\"Action execution error! Error details: %s\", em));\r\n $log.error(\"Action execution error: \\n\" + em);\r\n }\r\n return $q.reject(null);\r\n });\r\n };\r\n\r\n _this.shipOrdersInGroup = function (gridItemsGroup, currentStep, actionToExecute, setBusyStateFunc, gridReloadFunc, resetOrderItemsGridSharedSettings) {\r\n try {\r\n if (!gridItemsGroup || !gridItemsGroup.items) {\r\n throw \"Group item is undefined. Can not select orders in a group.\";\r\n }\r\n\r\n var kg = $(\"#orderItemsGrid\").data(\"kendoGrid\");\r\n var items = gridItemsGroup.items;\r\n var shipItemsConfirm = function (company, ordersCount) {\r\n return $(\"
\").kendoConfirm({\r\n title: _.str.sprintf(\"Ship %s order%s to %s\", ordersCount, ordersCount === 1 ? \"\" : \"s\", company),\r\n minWidth: \"600px\",\r\n width: \"40%\",\r\n content: _.str.sprintf(\"Are you sure to ship %s order%s to %s as a consolidated package?\", ordersCount, ordersCount === 1 ? \"\" : \"s\", company)\r\n }).data(\"kendoConfirm\").open().result;\r\n }\r\n\r\n if (items.length > 0) {\r\n shipItemsConfirm(items[0].$model.order.$model.deliveryAddress.$model.companyName, items.length)\r\n .then(function () {\r\n setBusyStateFunc(true);\r\n kg.clearSelection();\r\n var groupItemsIds = _.map(items, function(i) { return i.$model.id; });\r\n\r\n return executeActionOnItems(currentStep, actionToExecute, groupItemsIds, setBusyStateFunc)\r\n .then(function (result) {\r\n //Now we can reset the selected items, page number and grid\r\n resetOrderItemsGridSharedSettings();\r\n kg.dataSource.page(1);\r\n\r\n gridReloadFunc().then(function () { setBusyStateFunc(false); });\r\n },\r\n function (err) {\r\n setBusyStateFunc(false);\r\n toastr.error('The error has been logged. Please contact OrderManager administrator.', 'Oops, something went wrong :(');\r\n $log.error('Error during setting Freight Ref to orders in the grid.', err);\r\n });\r\n },\r\n function (data) {\r\n setBusyStateFunc(false);\r\n //user just cancelled the operation\r\n });\r\n } else {\r\n toastr.warning('Sorry, no orders found in the group to be selected.', 'No orders to select');\r\n }\r\n } catch (e) {\r\n //Something went wrong \r\n toastr.error('The error has been logged. Please contact OrderManager administrator.', 'Oops, something went wrong :(');\r\n $log.error('Error during setting Freight Ref to orders in the grid.', e);\r\n }\r\n };\r\n\r\n _this.setFreightReferenceToOrdersGroupAndProgress = function (gridItemsGroup, currentStep, actionToExecute, setBusyStateFunc, gridReloadFunc, resetOrderItemsGridSharedSettings) {\r\n try {\r\n if (!gridItemsGroup || !gridItemsGroup.items) {\r\n throw \"Group item is undefined. Can not set Freight Ref to orders in a group.\";\r\n }\r\n\r\n var kg = $(\"#orderItemsGrid\").data(\"kendoGrid\");\r\n var items = gridItemsGroup.items;\r\n var freightRefPrompt = function (company, ordersCount) {\r\n var dialog = $(\"
\").kendoPrompt({\r\n messages: {\r\n okText: _.str.sprintf(\"Send %s order%s to Packaging\", ordersCount, ordersCount === 1 ? \"\" : \"s\"),\r\n cancel: gettextCatalog.getString(\"Cancel\")\r\n },\r\n title: _.str.sprintf(\"Package %s order%s to %s\", ordersCount, ordersCount === 1 ? \"\" : \"s\", company),\r\n value: \"\",\r\n minWidth: \"600px\",\r\n width: \"40%\",\r\n content: gettextCatalog.getString('Orders will be sent as a consolidated package.')\r\n }).data(\"kendoPrompt\");\r\n \r\n var input = dialog.wrapper.find(\"input.k-textbox\");\r\n var btnOk = dialog.wrapper.find(\"li.k-button.k-primary\");\r\n\r\n if (btnOk) {\r\n btnOk.attr(\"disabled\", true);\r\n btnOk.addClass(\"k-state-disabled\");\r\n }\r\n if (input) {\r\n input.attr(\"placeholder\", gettextCatalog.getString('Enter Freight Reference...'));\r\n input.keyup(function() {\r\n var valueEntered = input.val();\r\n if (valueEntered && valueEntered.length > 0) {\r\n btnOk.removeAttr(\"disabled\");\r\n btnOk.removeClass(\"k-state-disabled\");\r\n } else {\r\n btnOk.attr(\"disabled\", true);\r\n btnOk.addClass(\"k-state-disabled\");\r\n }\r\n });\r\n }\r\n\r\n return dialog.open().result;\r\n };\r\n\r\n if (items.length > 0) {\r\n freightRefPrompt(items[0].$model.order.$model.deliveryAddress.$model.companyName, items.length)\r\n .then(function (enteredValue) { \r\n if (enteredValue && enteredValue.length > 0) {\r\n setBusyStateFunc(true);\r\n kg.clearSelection();\r\n\r\n var itemsUpdatePromises = [];\r\n\r\n _.each(items,\r\n function(gridItem) {\r\n //Select row in the grid and visually indicate item to be updated\r\n kg.select(kg.table.find('tr[data-uid=\"' + gridItem.uid + '\"]'));\r\n //This will update item in the grid visually with new value\r\n gridItem.$model.customFields.FreightRef = enteredValue;\r\n //Then we get model from pool, set new field value to it and save item to the server\r\n itemsUpdatePromises.push(orderItemsRepository.getOrderItem(gridItem.$model.id)\r\n .then(function(itemFromPool) {\r\n itemFromPool.$model.customFields.FreightRef = enteredValue;\r\n return orderItemsRepository.saveOrderItem(itemFromPool)\r\n .then(function(resp) {\r\n $log.debug(\"OrderItem [Id: \" +\r\n resp.$model.id +\r\n \"] saved to server.\");\r\n return resp;\r\n },\r\n function(error) {\r\n if (error) {\r\n var em = (error.serverErrorMessage &&\r\n _.str.startsWith(error.serverErrorMessage,\r\n \"Can not use EditOrderItem to change step.\"))\r\n ? gettextCatalog.getString(\r\n \"Item was updated on server. Please, review it before saving any changes.\")\r\n : error.serverErrorMessage || error.message;\r\n toastr.error(em,\r\n gettextCatalog.getString(\r\n \"Order item update failed\"));\r\n $log.error(\r\n \"OrderItem update error prior to Action execution: unable to save OrderItem. \\n\" +\r\n error.message);\r\n }\r\n return $q.reject(null);\r\n });\r\n })\r\n );\r\n });\r\n $q.all(itemsUpdatePromises)\r\n .then(function(result) {\r\n //Wait while we get all items updates posted to server with new values we have set\r\n //and then we can safely move items to next step here\r\n var groupItemsIds = _.map(items, function(i) { return i.$model.id; });\r\n\r\n return executeActionOnItems(currentStep,\r\n actionToExecute,\r\n groupItemsIds,\r\n setBusyStateFunc)\r\n .then(function(result) {\r\n //Now we can reset the selected items, page number and grid\r\n resetOrderItemsGridSharedSettings();\r\n kg.dataSource.page(1);\r\n gridReloadFunc().then(function() { setBusyStateFunc(false); });\r\n });\r\n },\r\n function(err) {\r\n setBusyStateFunc(false);\r\n toastr.error(\r\n 'The error has been logged. Please contact OrderManager administrator.',\r\n 'Oops, something went wrong :(');\r\n $log.error('Error during setting Freight Ref to orders in the grid.', err);\r\n });\r\n } else {\r\n toastr.error('Freight Reference for the consolidated package can not be empty.', 'Freight Reference');\r\n }\r\n },\r\n function (data) {\r\n setBusyStateFunc(false);\r\n //user just cancelled the operation\r\n });\r\n } else {\r\n toastr.warning('Sorry, no orders found in the group to be updated.', 'No orders to update');\r\n }\r\n } catch (e) {\r\n setBusyStateFunc(false);\r\n //Something went wrong \r\n toastr.error('The error has been logged. Please contact OrderManager administrator.', 'Oops, something went wrong :(');\r\n $log.error('Error during setting Freight Ref to orders in the grid.', e);\r\n }\r\n };\r\n\r\n return _this;\r\n })\r\n ;\r\n","angular.module('env.custom.customModule.filters', [])\r\n\r\n .filter('getPrescriptionFileNameId', function (attachmentsHelperService) {\r\n return function (dataItem) {\r\n return attachmentsHelperService.getPrescriptionFileNameId(dataItem);\r\n };\r\n })\r\n\r\n .filter('getLeftFootImageFileNameId', function (attachmentsHelperService) {\r\n return function (dataItem) {\r\n return attachmentsHelperService.getLeftFootImageFileNameId(dataItem);\r\n };\r\n })\r\n\r\n .filter('getRightFootImageFileNameId', function (attachmentsHelperService) {\r\n return function (dataItem) {\r\n return attachmentsHelperService.getRightFootImageFileNameId(dataItem);\r\n };\r\n })\r\n\r\n .filter('getLeftFootScanFileNameId', function (attachmentsHelperService) {\r\n return function (dataItem) {\r\n return attachmentsHelperService.getLeftFootScanFileNameId(dataItem);\r\n };\r\n })\r\n\r\n .filter('getRightFootScanFileNameId', function (attachmentsHelperService) {\r\n return function (dataItem) {\r\n return attachmentsHelperService.getRightFootScanFileNameId(dataItem);\r\n };\r\n })\r\n;\r\n","angular.module('env.custom.customModule.attachmentsHelperService', [])\r\n .provider('attachmentsHelperService', function () {\r\n var helper = new AttachmentsHelper();\r\n this.getPrescriptionFileNameId = helper.getPrescriptionFileNameId;\r\n this.getLeftFootImageFileNameId = helper.getLeftFootImageFileNameId;\r\n this.getRightFootImageFileNameId = helper.getRightFootImageFileNameId;\r\n this.getLeftFootScanFileNameId = helper.getLeftFootScanFileNameId;\r\n this.getRightFootScanFileNameId = helper.getRightFootScanFileNameId;\r\n this.getOrderIdAndPatientNameString = helper.getOrderIdAndPatientNameString;\r\n\r\n this.$get = function () {\r\n return new AttachmentsHelper();\r\n };\r\n\r\n function AttachmentsHelper() {\r\n function getPatientName(dataItem) {\r\n if (dataItem.$model.order.$model.jsonData.OrderData.OrthoticsOrder.Patient) {\r\n return dataItem.$model.order.$model.jsonData.OrderData.OrthoticsOrder.Patient.Name;\r\n }\r\n if (dataItem.$model.order.$model.jsonData.OrderData.OrthoticsOrder.PatientInfo) {\r\n return dataItem.$model.order.$model.jsonData.OrderData.OrthoticsOrder.PatientInfo.PatientRef;\r\n }\r\n return null;\r\n }\r\n\r\n var _this = this;\r\n\r\n _this.getOrderIdAndPatientNameString = function (dataItem) {\r\n var patientName = getPatientName(dataItem);\r\n if (!patientName) {\r\n return null;\r\n }\r\n return dataItem.$model.order.$model.id + '_' + patientName;\r\n };\r\n\r\n _this.getPrescriptionFileNameId = function (dataItem) {\r\n var orderIdAndPatient = _this.getOrderIdAndPatientNameString(dataItem);\r\n //Try the new file format first\r\n var fileId = dataItem.getDocumentIdByFilename(orderIdAndPatient + '_UserPrescription.pdf');\r\n if (!fileId) {\r\n //we have an 'old format' file name, so use it instead\r\n var translatedOrderType = dataItem.$model.order.$model.jsonData.OrderData.OrthoticsOrder.OrderType;\r\n switch (dataItem.$model.order.$model.jsonData.OrderData.OrthoticsOrder.OrderType) {\r\n case 'Initial':\r\n translatedOrderType = 'OrderDetail';\r\n break;\r\n case 'SecondIdentical':\r\n translatedOrderType = 'OrderDetail.SecondIdenticalOrder';\r\n break;\r\n case 'SecondIdenticalShellWithDifferentCover':\r\n translatedOrderType = 'OrderDetail.SecondIdenticalOrderWithDifferentCover';\r\n break;\r\n case 'SecondNonIdentical':\r\n translatedOrderType = 'OrderDetail.SecondNonIdenticalOrder';\r\n break;\r\n default:\r\n translatedOrderType = 'OrderDetail';\r\n break;\r\n }\r\n\r\n fileId = dataItem.getDocumentIdByFilename(\r\n 'Order#' + dataItem.$model.order.$model.id + '_' + translatedOrderType + '.pdf');\r\n }\r\n return fileId;\r\n };\r\n\r\n _this.getLeftFootImageFileNameId = function (dataItem) {\r\n var orderIdAndPatient = _this.getOrderIdAndPatientNameString(dataItem);\r\n var fileId = dataItem.getDocumentIdByFilename(orderIdAndPatient + '_LeftFootImage.jpg');\r\n if (!fileId) {\r\n fileId = dataItem.getDocumentIdByFilename('LeftFootImage.jpg');\r\n }\r\n if (!fileId) {\r\n fileId = dataItem.getDocumentIdByFilename(orderIdAndPatient + '_left.jpg');\r\n }\r\n return fileId;\r\n };\r\n\r\n _this.getRightFootImageFileNameId = function (dataItem) {\r\n var orderIdAndPatient = _this.getOrderIdAndPatientNameString(dataItem);\r\n var fileId = dataItem.getDocumentIdByFilename(orderIdAndPatient + '_RightFootImage.jpg');\r\n if (!fileId) {\r\n fileId = dataItem.getDocumentIdByFilename('RightFootImage.jpg');\r\n }\r\n if (!fileId) {\r\n fileId = dataItem.getDocumentIdByFilename(orderIdAndPatient + '_right.jpg');\r\n }\r\n return fileId;\r\n };\r\n\r\n _this.getLeftFootScanFileNameId = function (dataItem) {\r\n var orderIdAndPatient = _this.getOrderIdAndPatientNameString(dataItem);\r\n var fileId = dataItem.getDocumentIdByFilename(orderIdAndPatient + '_LeftFootScan.stl');\r\n if (!fileId) {\r\n fileId = dataItem.getDocumentIdByFilename('LeftFootScan.stl');\r\n }\r\n if (!fileId) {\r\n fileId = dataItem.getDocumentIdByFilename(orderIdAndPatient + '_left.dmt');\r\n }\r\n return fileId;\r\n };\r\n\r\n _this.getRightFootScanFileNameId = function (dataItem) {\r\n var orderIdAndPatient = _this.getOrderIdAndPatientNameString(dataItem);\r\n var fileId = dataItem.getDocumentIdByFilename(orderIdAndPatient + '_RightFootScan.stl');\r\n if (!fileId) {\r\n fileId = dataItem.getDocumentIdByFilename('RightFootScan.stl');\r\n }\r\n if (!fileId) {\r\n fileId = dataItem.getDocumentIdByFilename(orderIdAndPatient + '_right.dmt');\r\n }\r\n return fileId;\r\n };\r\n }\r\n })\r\n;\r\n","angular.module('env.custom.customModule.approvalFields', [])\r\n\r\n .controller('approvalFieldsController', function ($log, $q, $scope, calendarService) {\r\n\r\n $scope.isRapid = function() {\r\n var returnOption = $scope.order.$model.jsonData.OrderData.OrthoticsOrder.ReturnOptions.Return;\r\n return returnOption && returnOption.toLowerCase().startsWith('rapid');\r\n }\r\n\r\n $scope.isInitial = function() {\r\n var orderType = $scope.order.$model.jsonData.OrderData.OrthoticsOrder.OrderType;\r\n return orderType && orderType.toLowerCase() === 'initial';\r\n }\r\n\r\n $scope.isWeightBearing = function() {\r\n var platform = $scope.order.$model.jsonData.OrderData.ApplicationOrderData.Platform;\r\n\r\n return platform && platform.toLowerCase() !== 'ios';\r\n }\r\n\r\n $scope.isOverdue = function () {\r\n if ($scope.orderItem.$model.expectedBy) {\r\n var now = new Date();\r\n now.setHours(0, 0, 0, 0);\r\n var completedDate = new Date($scope.orderItem.$model.expectedBy);\r\n completedDate.setHours(0, 0, 0, 0);\r\n\r\n return completedDate <= now;\r\n }\r\n return false;\r\n }\r\n $scope.isOverdueDelivery = function () {\r\n if ($scope.orderItem.$model.customFields.DeliveryDate) {\r\n var now = new Date();\r\n now.setHours(0, 0, 0, 0);\r\n var deliveryDate = new Date($scope.orderItem.$model.customFields.DeliveryDate);\r\n deliveryDate.setHours(0, 0, 0, 0);\r\n\r\n return deliveryDate <= now;\r\n }\r\n return false;\r\n }\r\n\r\n //var completionValidator = $(\"#completionDateForm\").kendoValidator().data(\"kendoValidator\");\r\n //var deliveryValidator = $(\"#deliveryDateForm\").kendoValidator().data(\"kendoValidator\");\r\n var publicHolidays = [];\r\n\r\n calendarService.getActualPublicHolidays('AU')\r\n .then(function (holidays) {\r\n publicHolidays = holidays || [];\r\n\r\n //Once we have holidays info, we can do other stuff we need to -\r\n //Set default completion date to the currently selected item\r\n //*** Commented out for now. We decided to not alter completion/delivery dates as they are all set by Scan Apps.\r\n //$scope.$applyAsync(function () {\r\n // setDefaultCompletionDate($scope.orderItem);\r\n //});\r\n\r\n $scope.dpOptions = {\r\n dates: [new Date(\"22/02/2019\")],\r\n disableDates: function (date) {\r\n return isHoliday(date);\r\n }\r\n };\r\n },\r\n function (error) {\r\n $log.error(\"Can't fetch public holidays information. Error: %s\", error);\r\n return $q.reject(error);\r\n });\r\n\r\n // We have decided to set the issue date from inside the ScanApp\r\n //\r\n //var watcherDestructor = $scope.$watch(\r\n // 'orderItem',\r\n // function (newVal, oldVal) {\r\n // if (newVal && newVal !== oldVal && (!newVal.$model.expectedBy || newVal.$model.expectedBy.getFullYear() === 1)) {\r\n // setDefaultCompletionDate(newVal);\r\n // }\r\n // }\r\n //);\r\n $scope.$on('$destroy', function () {\r\n //watcherDestructor();\r\n });\r\n\r\n function isHoliday(date) {\r\n if (!date) {\r\n return false;\r\n }\r\n //See if it's weekend first\r\n if (date.getDay() === 0 || date.getDay() === 6) {\r\n return true;\r\n }\r\n\r\n //Then if it's a holiday\r\n for (var i = 0; i < publicHolidays.length; i++) {\r\n if (publicHolidays[i].getDate() === date.getDate() &&\r\n publicHolidays[i].getMonth() === date.getMonth() &&\r\n publicHolidays[i].getYear() === date.getYear()) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function setDefaultCompletionDate(orderItem) {\r\n if (orderItem) {\r\n //Set default completion date to be a number of working days ahead according to the order's 'returnOptions'\r\n var daysToAdd;\r\n switch (orderItem.$model.order.$model.jsonData.OrderData.OrthoticsOrder.ReturnOptions.Return) {\r\n case \"Rapid4Days\":\r\n daysToAdd = 4;\r\n break;\r\n case \"Rapid72Hours\":\r\n daysToAdd = 3;\r\n break;\r\n case \"Rapid48Hours\":\r\n daysToAdd = 2;\r\n break;\r\n case \"Rapid24Hours\":\r\n daysToAdd = 1;\r\n break;\r\n case \"RapidSameDay\":\r\n daysToAdd = 0;\r\n break;\r\n case \"Unspecified\":\r\n case \"Standard5Days\":\r\n default:\r\n //5 - is the default work days number for Footlink. Later we will take holidays into account\r\n daysToAdd = 5;\r\n break;\r\n }\r\n //see how many days should we actually add to add required amount of working days skipping holidays\r\n var d = new Date(new Date().setHours(0, 0, 0, 0));\r\n var actualDaysToAdd = orderItem.$model.created.getHours() >= 14 ? daysToAdd : daysToAdd - 1;\r\n if (isHoliday(d)) { //we add one more day if it's a holiday today exactly\r\n actualDaysToAdd++;\r\n }\r\n for (var i = 0; i < actualDaysToAdd; ++i) {\r\n d = new Date(d.getTime() + 1000 * 60 * 60 * 24); //add one day\r\n if (isHoliday(d)) { //we need more if it's a holiday\r\n actualDaysToAdd++;\r\n }\r\n }\r\n var todayMidnight = new Date(new Date().setHours(0, 0, 0, 0));\r\n orderItem.$model.expectedBy = new Date(todayMidnight.getTime() + 1000 * 60 * 60 * 24 * actualDaysToAdd);\r\n }\r\n }\r\n });\r\n","angular.module('ui.order.orderItemCard.orderItemComments.newComment', [])\r\n\r\n .directive('newComment', function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'app/ui/order/orderItemCard/orderItemComments/newComment/newComment.html',\r\n scope: {\r\n send: \"&\",\r\n comment: \"=\"\r\n },\r\n controller: 'NewCommentController'\r\n };\r\n })\r\n\r\n .controller('NewCommentController', function ($scope, $element, $timeout, usersRepository) {\r\n $scope.newCommentExpand = false;\r\n $scope.user = null;\r\n $scope.getCurrentTime = function () {\r\n return new Date();\r\n };\r\n\r\n usersRepository.getCurrentUser().then(function (restUser) {\r\n $scope.user = restUser;\r\n });\r\n\r\n $scope.canSendComment = function () {\r\n return $scope.comment &&\r\n $scope.comment.text &&\r\n $scope.comment.text.length >= 2;\r\n };\r\n\r\n $scope.sendComment = function () {\r\n if ($scope.send && _.isFunction($scope.send) && $scope.canSendComment()) {\r\n $scope.newCommentExpand = false;\r\n $scope.isBusy = true;\r\n $scope.send();\r\n $scope.isBusy = false;\r\n }\r\n };\r\n\r\n $scope.$watch('newCommentExpand', function (newVal, oldVal) {\r\n if (newVal !== oldVal && newVal) {\r\n $timeout(function () {\r\n $element.find('#newCommentTextBox:first').focus();\r\n }, 0);\r\n }\r\n });\r\n })\r\n\r\n;\r\n","angular.module('ui.order.orderItemCard.orderItemComments.commentRow', [])\r\n\r\n .directive('commentRow', function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'app/ui/order/orderItemCard/orderItemComments/commentRow/commentRow.html',\r\n scope: false\r\n };\r\n })\r\n\r\n;","angular.module('ui.order.orderItemCard.orderItemFiles.fileUpload', [])\r\n\r\n .directive('fileUpload', function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'app/ui/order/orderItemCard/orderItemFiles/fileUpload/fileUpload.html',\r\n scope: {\r\n batchSize: \"@\",\r\n concurrencyLevel: \"@\",\r\n chunkSize: \"@\",\r\n multiple: \"@\",\r\n documentVersions: \"@\",\r\n cancelled: \"&\",\r\n validate: \"&\",\r\n reset: \"@\",\r\n orderItemId: \"@\",\r\n someFileUploaded: \"&\",\r\n allUploaded: \"&\"\r\n },\r\n controller: function ($scope, $timeout, $filter, $q, gettextCatalog, toastr, fileService, checkDuplicatesService) {\r\n\r\n //complete = true;\r\n $scope.dataSizeFilter = $filter('dataSize');\r\n $scope.uploadId = '';\r\n $scope.uploadInfo = {count: 0, size: 0};\r\n $scope.items = [];\r\n $scope.totalSize = 0;\r\n $scope.uploading = false;\r\n $scope.uploadingStopped = false;\r\n $scope.chunkSize = typeof $scope.chunkSize === 'string' ? parseInt($scope.chunkSize) : 1000000;\r\n $scope.batchSize = typeof $scope.batchSize === 'string' ? parseInt($scope.batchSize) : 1;\r\n $scope.concurrencyLevel = typeof $scope.concurrencyLevel === 'string' ? parseInt($scope.batchSize) : 1;\r\n\r\n $scope.conflictWindowOptions = {\r\n animation: om.config.kendoWindowDefaultOptions.animation\r\n }\r\n\r\n $scope.selectedFiles = gettextCatalog.getString('Drag & Drop files here or');\r\n if (typeof (window.FileReader) == 'undefined') {\r\n $scope.selectedFiles = gettextCatalog.getString('No files selected.');\r\n }\r\n $scope.openFileDialog = function (e) {\r\n if (!$scope.uploading) {\r\n $(\"input[type='file'][name='file']\").click();\r\n }\r\n };\r\n $scope.reset = function () {\r\n $scope.uploadInfo = null;\r\n $scope.items = [];\r\n if (typeof ($scope.documentVersions) == \"object\") {\r\n $scope.documentVersions = {};\r\n }\r\n };\r\n\r\n var removeUploadedProgressBars = function () {\r\n if ($scope.isCancelled) {\r\n $scope.items = [];\r\n } else {\r\n if ($scope.uploading) return;\r\n $scope.items = _.filter($scope.items, function (value) {\r\n return value.finished === false && value.skipped === false;//if status not cancelled clear all finished items\r\n });\r\n }\r\n };\r\n\r\n $scope.submit = function () {\r\n var deferred = $q.defer();\r\n $scope.isCancelled = false;\r\n\r\n //if ($scope.totalSize == 0) return;\r\n $scope.uploading = true;\r\n $scope.uploadingStopped = false;\r\n\r\n if (!$scope.isCancelled && !(typeof $scope.cancelled == 'function' && $scope.cancelled() === true)) {\r\n var files = [];\r\n if ($scope.validate({uploads: $scope.items}) !== 'undefined' && $scope.validate({uploads: $scope.items}) === false) {\r\n $scope.cancelUpload();\r\n return;\r\n }\r\n for (var i = 0; i < $scope.items.length; i++) {\r\n if ($scope.items[i].started) continue;\r\n files.push($scope.items[i].file);\r\n $scope.items[i].started = true;\r\n }\r\n var fileServicePromise = fileService\r\n .uploadFiles(files, $scope.chunkSize, $scope.batchSize, $scope.concurrencyLevel,\r\n function () {\r\n return $scope.isCancelled || $scope.cancelled() === true;\r\n }, updateProgressCallback, $scope.orderItemId, false)\r\n .then(function (result) {\r\n $scope.allUploaded();\r\n }, function (error) {\r\n if (error.data && error.data.ErrorMessage) toastr.error(error.data.ErrorMessage);\r\n }).finally(function () {\r\n $scope.updateStatus();\r\n $timeout(function () {\r\n $scope.$applyAsync(function () {\r\n $scope.uploadingStopped = true;\r\n $scope.uploading = false;\r\n });\r\n\r\n $timeout(function () {\r\n $scope.$applyAsync(function () {\r\n removeUploadedProgressBars();\r\n });\r\n }, $scope.isCancelled ? 0 : 2000);\r\n }, 100);\r\n deferred.resolve();\r\n }\r\n );\r\n //that 'if' used for opportunity of submitting file while another is uploading\r\n if (!$scope.FileUploadPromises) {\r\n $scope.FileUploadPromises = fileServicePromise;\r\n } else {\r\n $scope.FileUploadPromises = $scope.FileUploadPromises.then(function () {\r\n return fileServicePromise;\r\n });\r\n }\r\n }\r\n return deferred.promise;\r\n };\r\n $scope.updateStatus = function () {\r\n $scope.totalSize = 0;\r\n var selected = [];\r\n if (!$scope.uploadInfo) $scope.uploadInfo = {count: 0, size: 0};\r\n for (var i = 0; i < $scope.items.length; i++) {\r\n var item = $scope.items[i];\r\n if (!item.finished) {\r\n if (item.file.size == 0) continue;\r\n $scope.totalSize += item.file.size;\r\n selected.push(item.file);\r\n } else {\r\n $scope.uploadInfo.count++;\r\n $scope.uploadInfo.size += item.file.size;\r\n }\r\n }\r\n var uploadedMessage = $scope.uploadInfo.count > 1 || $scope.uploadInfo.count == 0\r\n ? 'Uploaded %s files (%s)'\r\n : 'Uploaded %s file (%s)';\r\n $scope.uploadInfo.text = gettextCatalog.getString(_.str.sprintf(uploadedMessage, $scope.uploadInfo.count, $scope.dataSizeFilter($scope.uploadInfo.size)));\r\n };\r\n $scope.itemByFile = function (file) {\r\n for (var i in $scope.items) {\r\n if ($scope.items[i].file == file) return $scope.items[i];\r\n }\r\n return null;\r\n };\r\n $scope.cancelUpload = function (e) {\r\n $scope.isCancelled = true;\r\n $scope.uploading = false;\r\n\r\n if ($scope.conflictWindow.options.visible) {\r\n $scope.skipFile(true); //skip all files if conflict window was shown, as we're cancelling anyway\r\n }\r\n e.preventDefault();\r\n e.stopPropagation();\r\n };\r\n $scope.onSelect = function (files) {\r\n $scope.$apply(function (sc) {\r\n for (var i = 0; i < files.length; i++) {\r\n var file = files[i];\r\n if (file.size == 0) continue;\r\n var item = {file: file, progress: 0, started: false, finished: false, skipped: false};\r\n sc.items.push(item);\r\n }\r\n });\r\n $scope.submit();\r\n };\r\n\r\n $scope.replaceFile = function (toAll) {\r\n checkDuplicatesService.action = \"replace\";\r\n if ($scope.toAll) checkDuplicatesService.actionToAllFiles = \"replace\";\r\n checkDuplicatesService.pauseDeferred.resolve();\r\n $scope.conflictWindow.close();\r\n };\r\n $scope.addCopy = function (toAll) {\r\n checkDuplicatesService.action = \"addcopy\";\r\n if ($scope.toAll) checkDuplicatesService.actionToAllFiles = \"addcopy\";\r\n checkDuplicatesService.pauseDeferred.resolve();\r\n $scope.conflictWindow.close();\r\n };\r\n $scope.skipFile = function (toAll) {\r\n checkDuplicatesService.action = \"skip\";\r\n if ($scope.toAll) checkDuplicatesService.actionToAllFiles = \"skip\";\r\n checkDuplicatesService.pauseDeferred.resolve();\r\n $scope.conflictWindow.close();\r\n };\r\n checkDuplicatesService.openConflictWindow = function (name) {\r\n $scope.toAll = false;\r\n $scope.fileNameConflict = name;\r\n $scope.conflictWindow.open();\r\n };\r\n \r\n function updateProgressCallback(file, progress, sessionId, isFinished, isSkipped) {\r\n var item = $scope.itemByFile(file);\r\n if (item != null) {\r\n item.sessionId = sessionId;\r\n item.progress = progress;\r\n item.finished = isFinished;\r\n item.skipped = isSkipped;\r\n if (isFinished) {\r\n $scope.someFileUploaded();\r\n }\r\n if (isSkipped) {\r\n //var pb = $('#pb' + $scope.items.indexOf(item) + ' span.k-progress-status');\r\n //pb.text(\"bla\");\r\n //pb.css(\"color\", \"red\");\r\n\r\n $('#pb' + $scope.items.indexOf(item)).data(\"kendoProgressBar\").progressStatus.text(\"skipped\");\r\n\r\n }\r\n }\r\n }\r\n\r\n $scope.progressBarOptions = {\r\n max: 100,\r\n min: 1,\r\n type: \"percent\"\r\n\r\n }\r\n\r\n $scope.$watch('orderItemId', function (newVal, oldVal) {\r\n if (newVal !== oldVal) {\r\n $scope.uploadInfo = null; //reset counters of uploaded files/bytes\r\n }\r\n });\r\n },\r\n link: function (scope, element, attrs) {\r\n var input = element.find(\"[name='file']\");\r\n var upload = element.find(\"[name='file-upload']\");\r\n jQuery.event.props.push('dataTransfer');\r\n upload.on(\"dragover\", function () {\r\n upload.addClass('drag-hover');\r\n return false;\r\n });\r\n upload.on(\"dragleave\", function () {\r\n upload.removeClass('drag-hover');\r\n return false;\r\n });\r\n upload.on(\"drop\", function (event) {\r\n scope.onSelect(event.dataTransfer.files);\r\n event.preventDefault();\r\n upload.removeClass('drag-hover');\r\n upload.addClass('drag-drop');\r\n });\r\n\r\n scope.input = input;\r\n if (scope.multiple) input.attr('multiple', 'multiple');\r\n input.on('change', function (e) {\r\n scope.onSelect(e.target.files);\r\n input.val(\"\");\r\n });\r\n }\r\n };\r\n });\r\n","angular.module('ui.order.orderItemsGridRouteContainer', [])\r\n\r\n .config(function ($stateProvider) {\r\n $stateProvider.state('client.orders', {\r\n url: '/orders/:step?search&exact&filter',\r\n templateUrl: 'app/ui/order/orderItemsGridView/orderItemsGridRouteContainer/orderItemsGridRouteContainer.html',\r\n data: {pageTitle: 'OrderManager: Orders'},\r\n controller: 'OrderItemsGridRouteContainerController',\r\n controllerAs: 'OrderItemsGridRouteContainerController',\r\n params: { step: 'all-open', search: null, exact: false, filter: null} // to silently pass parameters to state\r\n });\r\n })\r\n\r\n .controller('OrderItemsGridRouteContainerController', function ($q, $rootScope, $scope, $stateParams, orderItemsGridSharedSettings, customResourceResolver) {\r\n\r\n //See if we need set search string onto grid shared settings\r\n if ($stateParams.search && $stateParams.search.length > 0) {\r\n orderItemsGridSharedSettings.setTextSearch($stateParams.search, $stateParams.exact === 'true' || $stateParams.exact === true ? true : false);\r\n } else {\r\n orderItemsGridSharedSettings.setTextSearch('', false);\r\n }\r\n\r\n //See if we have been requested for a custom filter view or just a regular particular 'Step' view\r\n if ($stateParams.step === 'filtered') {\r\n //To indicate to orderItemsGridView that we want to work in 'all-open' mode, not exact 'step' view\r\n orderItemsGridSharedSettings.setStepFilter('all-open');\r\n\r\n if ($stateParams.filter && $stateParams.filter.length > 0) {\r\n //Get custom filter config from customisation config as it was specified via state param value\r\n customResourceResolver.resolveConfig('om-stat-custom-order-states', [], {})\r\n .then(function(customFilters) {\r\n if (customFilters) {\r\n var customFilter = customFilters.find(function(f) {\r\n return f.name === $stateParams.filter;\r\n });\r\n if (customFilter) {\r\n //And set onto shared settings so gridDataProvider will be able to get the OMQL query \r\n //from orderItemsGridSharedSettings later to fetch order items from server\r\n orderItemsGridSharedSettings.setCustomFilter(customFilter);\r\n } else {\r\n orderItemsGridSharedSettings.setCustomFilter(null); //we want to reset the custom filter then anyway\r\n }\r\n }\r\n });\r\n }\r\n\r\n } else {\r\n //Set particular 'Step' filter to indicate we need a regular 'Step' view corresponding particular OrderManager workflow 'Step'\r\n //to render order items sitting on that workflow step\r\n orderItemsGridSharedSettings.setStepFilter($stateParams.step);\r\n orderItemsGridSharedSettings.setCustomFilter(null);\r\n }\r\n\r\n })\r\n\r\n;\r\n","angular.module('ui.order.orderItemsGrid', [\r\n 'ui.order.orderItemCard.orderItemGridActions',\r\n 'kendo.directives'\r\n])\r\n\r\n .directive('orderItemsGrid', function () {\r\n return {\r\n restrict: \"E\",\r\n templateUrl: 'app/ui/order/orderItemsGridView/orderItemsGrid/orderItemsGrid.html',\r\n scope: {},\r\n controller: 'OrderItemsGridController',\r\n controllerAs: 'OrderItemsGridController'\r\n };\r\n })\r\n\r\n .controller('OrderItemsGridController', function ($timeout, $window, $rootScope, $scope, $element, $compile, $q, $log, $sce, $state, gettextCatalog, toastr,\r\n $customisationConfig, usersRepository,\r\n serverLocalization, uiLocalization, customResourceResolver,\r\n workflowRepository, orderItemsGridSharedSettings, reportManager,\r\n gridDataProvider, templateResolver, orderItemsRepository, \r\n orderItemsGridControllerUpdatesService,\r\n barcodeScannerListenerService) {\r\n\r\n $scope.selectedOrderItem = null;\r\n $scope.selectedOrderItemId = null;\r\n\r\n var textSearchTrigger = false;\r\n var dataRequestCount = 0;\r\n\r\n //Indicates we were requested for a version of the view without navbar menu on the left\r\n //Usually this is necessary for a customer view when this view embedded into other software\r\n $scope.hidemenu = $state.params.hidemenu && $state.params.hidemenu === 'true';\r\n\r\n //Subscribe to barcode scanner events\r\n var barcodeScannerUnsubscribe = barcodeScannerListenerService.events.on('valueScanned', checkBarcode);\r\n\r\n _.extend($scope, {\r\n setBusyState: setBusyState,\r\n reloadGrid: reloadGrid,\r\n resetOrderItemsGridSharedSettings: resetOrderItemsGridSharedSettings,\r\n applyTextSearch: applyTextSearch,\r\n getSelectedEntities: getSelectedEntities,\r\n showStepDetails: showStepDetails,\r\n executeAction: executeAction,\r\n getSelectedOrderItemsCount: getSelectedOrderItemsCount,\r\n getSelectionInfoLabel: getSelectionInfoLabel\r\n });\r\n\r\n initController();\r\n initWatchers();\r\n\r\n /**\r\n * Controller initialization\r\n */\r\n function initController() {\r\n $scope.isBusy = false;\r\n $scope.step = orderItemsGridSharedSettings.getStepFilter() || 'all-open';\r\n \r\n //clear any remembered search filter for 'All Items' view if \r\n //it's not the searching from the main app header searchbox\r\n if ($scope.step === 'all-open' && !$state.params.search) {\r\n orderItemsGridSharedSettings.setTextSearch(null);\r\n }\r\n\r\n //clear any remembered selected items if we re-visit the items grid\r\n orderItemsGridSharedSettings.setSelectedOrderItemIds([]);\r\n\r\n initAdditionalFilter();\r\n initTitle();\r\n initGrid();\r\n initReportList();\r\n initModalDialog();\r\n } \r\n\r\n function initModalDialog() {\r\n $scope.getWorkflowActionConfirmationLabel = function () {\r\n var message = getSelectedOrderItemsCount() > 1\r\n ?\r\n uiLocalization.translate('Are you sure to apply the action to all selected %s items?', getSelectedOrderItemsCount())\r\n :\r\n uiLocalization.translate('Are you sure to apply the action to the selected item?');\r\n return $sce.trustAsHtml(message);\r\n };\r\n\r\n $scope.confirmActionDialogOptions = {\r\n //buttonLayout: \"normal\"\r\n };\r\n\r\n $scope.actions = [\r\n {\r\n text: uiLocalization.translate('Yes'),\r\n primary: true,\r\n action: function (e) {\r\n executeActionConfirmed(e);\r\n }\r\n },\r\n {\r\n text: uiLocalization.translate('No'),\r\n action: function (e) {\r\n }\r\n }\r\n ];\r\n }\r\n\r\n function initGridBehaviorConfig() {\r\n //overrides the url params according to the customization config\r\n return customResourceResolver.resolveConfig('shell-config')\r\n .then(function (shellConfig) {\r\n if (shellConfig) {\r\n $scope.hidemenu = shellConfig.hideMenu === true;\r\n $scope.forbidOrderDetailsView = shellConfig.forbidOrderDetailsView === true;\r\n }\r\n });\r\n }\r\n\r\n function initAdditionalFilter() {\r\n $scope.searchDropdownOptions = {\r\n dataSource: [\r\n { text: gettextCatalog.getString(\"Regular Search\"), value: \"reg-search\", icon: \"search-dropdown-icon icon-magnifier-add\" },\r\n { text: gettextCatalog.getString(\"Exact Match Search\"), value: \"exact-search\", icon: \"search-dropdown-icon icon-magnifier\" }\r\n ],\r\n valuePrimitive: false,\r\n dataTextField: \"text\",\r\n dataValueField: \"value\",\r\n valueTemplate: ' ',\r\n template: '' +\r\n '{{dataItem.text}}',\r\n dataBound: function () {\r\n this.list.width(\"auto\");\r\n }\r\n };\r\n\r\n $scope.clearSearchTerm = function () {\r\n orderItemsGridSharedSettings.setTextSearch(null);\r\n $scope.textSearch = null;\r\n applyTextSearch();\r\n };\r\n\r\n var textSearchConfig = orderItemsGridSharedSettings.getTextSearch();\r\n if (textSearchConfig) {\r\n $scope.textSearch = textSearchConfig.text;\r\n $scope.searchDropdown = textSearchConfig.exact ? \"exact-search\" : \"reg-search\";\r\n } else {\r\n $scope.textSearch = null;\r\n $scope.searchDropdown = \"reg-search\";\r\n }\r\n }\r\n\r\n function initDatesFilter() {\r\n\r\n //TODO: if $scope.gridConfig.showCalendarFromToDates -- configure orderItemsGridSharedSettings \r\n\r\n\r\n var completedFilterConfig = orderItemsGridSharedSettings.getCompletedFilter();\r\n var createdFilterConfig = orderItemsGridSharedSettings.getCreatedFilter();\r\n\r\n if (completedFilterConfig) {\r\n //showCompletedFilter flag value controled by kendo-switch when turned ON by user\r\n //This kendo-switch will be shown in the UI if gridConfig.hideShowCompletedSwitch == false\r\n $scope.showCompletedFilter = !!completedFilterConfig.enabled;\r\n var now = new Date();\r\n var oneMonthAgo = new Date();\r\n oneMonthAgo.setMonth(now.getMonth() - 3); //Let's try 3 month ago\r\n $scope.datePickerFrom = completedFilterConfig.from || oneMonthAgo;\r\n $scope.datePickerTo = completedFilterConfig.to || now;\r\n //Now allow the filter to be shown only for 'all-open' stage\r\n $scope.showCompletedFilter = $scope.step === 'all-open' && !!completedFilterConfig.enabled;\r\n }\r\n\r\n if (createdFilterConfig || !!$scope.gridConfig.useCreatedDateFilter) {\r\n //gridConfig.useCreatedDateFilter - used to control usage of the order created date filtering.\r\n //Dates filtering controls will be shown if gridConfig.useCreatedDateFilter == true\r\n $scope.useCreatedDateFilter = !!$scope.gridConfig.useCreatedDateFilter;\r\n var now = new Date();\r\n var oneMonthAgo = new Date();\r\n oneMonthAgo.setMonth(now.getMonth() - 3); //Let's try 3 month ago\r\n $scope.datePickerFrom = createdFilterConfig && createdFilterConfig.from ? createdFilterConfig.from : oneMonthAgo;\r\n $scope.datePickerTo = createdFilterConfig && createdFilterConfig.to ? createdFilterConfig.to : now;\r\n }\r\n\r\n if (!completedFilterConfig && !$scope.useCreatedDateFilter) {\r\n $scope.showCompletedFilter = false;\r\n $scope.datePickerFrom = null;\r\n $scope.datePickerTo = null;\r\n }\r\n completedDateChanged();\r\n }\r\n\r\n function completedDateChanged() {\r\n orderItemsGridSharedSettings.setCompletedFilter({\r\n from: $scope.datePickerFrom,\r\n to: $scope.datePickerTo,\r\n enabled: !!$scope.showCompletedFilter\r\n });\r\n orderItemsGridSharedSettings.setCreatedFilter({\r\n from: $scope.datePickerFrom,\r\n to: $scope.datePickerTo,\r\n enabled: !!$scope.useCreatedDateFilter\r\n });\r\n }\r\n\r\n /**\r\n * Initialize watchers (call only one time!)\r\n */\r\n function initWatchers() {\r\n\r\n $scope.$watch('datePickerFrom', completedDateChangedHandler);\r\n $scope.$watch('datePickerTo', completedDateChangedHandler);\r\n $scope.$watch('showCompletedFilter', function (newVal, oldVal) {\r\n if (newVal !== oldVal) {\r\n if (newVal === true && !$scope.datePickerFrom && !$scope.datePickerTo) {\r\n var now = new Date();\r\n var oneMonthAgo = new Date();\r\n oneMonthAgo.setMonth(now.getMonth() - 3); //Let's try 3 month ago\r\n $scope.datePickerFrom = oneMonthAgo;\r\n $scope.datePickerTo = now;\r\n }\r\n completedDateChanged();\r\n reloadGrid();\r\n }\r\n });\r\n initSignalREvents();\r\n\r\n $scope.$on(\r\n \"$destroy\",\r\n function () {\r\n destroyGrid();\r\n orderItemsGridControllerUpdatesService.onOrderItemChanged(null);\r\n orderItemsGridControllerUpdatesService.onNewOrderItem(null);\r\n orderItemsGridControllerUpdatesService.onOrderChanged(null);\r\n barcodeScannerUnsubscribe();\r\n }\r\n );\r\n\r\n function completedDateChangedHandler(newVal, oldVal) {\r\n if (!_.isEqual(newVal, oldVal)) {\r\n completedDateChanged();\r\n if ($scope.showCompletedFilter === true || !!$scope.useCreatedDateFilter) {\r\n reloadGrid();\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Init the view title depending on the current user, current selected step\r\n * @returns {Promise}\r\n */\r\n function initTitle() {\r\n $scope.totalItemsCountForPageTitle = 0;\r\n\r\n return $q.all([\r\n usersRepository.getCurrentUser(),\r\n workflowRepository.getSteps(),\r\n customResourceResolver.resolveWorkflow()\r\n ])\r\n .then(function (data) {\r\n var currentUser = data[0];\r\n var steps = data[1];\r\n var workflowConfig = data[2];\r\n\r\n var currentStepCode = orderItemsGridSharedSettings.getStepFilter();\r\n\r\n if (currentStepCode && currentStepCode !== \"all-open\") {\r\n var isCustomer = currentUser.isCustomer();\r\n var step = _.find(steps, function (s) {\r\n return s.$model.code.toLowerCase() === currentStepCode.toLowerCase();\r\n });\r\n\r\n var stepConfig = _.find(workflowConfig.steps, function (s) {\r\n return s.code === currentStepCode;\r\n });\r\n var stepDisplayName = isCustomer ? step.$model.publicNameResource : step.$model.nameResource;\r\n\r\n $scope.viewTitle = serverLocalization.translate(stepDisplayName);\r\n $scope.viewIconName =\r\n angular.isUndefined(stepConfig)\r\n ? getFallbackIconForStep(step.$model.code)\r\n : (angular.isDefined(stepConfig.publicImageResourceName) && isCustomer\r\n ? stepConfig.publicImageResourceName : (angular.isDefined(stepConfig.imageResourceName)\r\n ? stepConfig.imageResourceName\r\n : getFallbackIconForStep(step.$model.code)));\r\n\r\n function getFallbackIconForStep(stepCode) {\r\n return $customisationConfig.hasResource(function (res) {\r\n return _.string.contains(res, stepCode + \".\");\r\n }) ? stepCode : \"workflow\";\r\n }\r\n } else {\r\n //See if we have custom filter applied\r\n var customFilter = orderItemsGridSharedSettings.getCustomFilter();\r\n if (customFilter) {\r\n $scope.viewTitle = gettextCatalog.getString(customFilter.name || \"Filtered Items\");\r\n $scope.viewIconName = customFilter.iconName || \"track\"; //'track' icon as a default one if no custom specified\r\n } else {\r\n $scope.viewTitle = gettextCatalog.getString(\"All Items\");\r\n $scope.viewIconName = \"track\";\r\n }\r\n }\r\n\r\n updatePageTitle();\r\n\r\n }, function (error) {\r\n if (error && error.message) {\r\n $log.error(error.message);\r\n } else if (error && _.isString(error)) {\r\n $log.error(error);\r\n } else {\r\n $log.error(\"Unknown error. Can't initialize grid title.\");\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Initialize grid\r\n * @returns {Promise}\r\n */\r\n function initGrid() {\r\n\r\n angular.element($window).bind('resize', function () {\r\n resizeGrid();\r\n // manual $digest required as resize event\r\n // is outside of angular\r\n $scope.$digest();\r\n });\r\n\r\n $q.all([\r\n gridDataProvider.getGridConfig($scope.step),\r\n templateResolver.resolve('app/ui/order/orderItemsGridView/orderItemsGrid/gridHeader.html'),\r\n initGridBehaviorConfig()\r\n ]).then(function (data) {\r\n var gridConfig = _.clone(data[0]);\r\n var gridHeaderTemplate = data[1];\r\n\r\n gridConfig = initGridConfig(gridConfig, gridHeaderTemplate);\r\n gridConfig.dataSource = initGridDataSource(gridConfig);\r\n $scope.gridConfig = gridConfig;\r\n\r\n //Init dates filtering controls in the grid header (we need to do it from here to make sure we have grid config available )\r\n //Before we compile grid into the view\r\n initDatesFilter();\r\n\r\n var gridTemplate = '
';\r\n var jqTemplate = $('#orderItemsKendoGrid').append(gridTemplate);\r\n $compile(jqTemplate)($scope);\r\n\r\n //Init all the handlers for the events of the grid (like row click, checkbox-selector click, ,double-click, etc.\r\n initGridEventsHandlers(gridConfig);\r\n\r\n //Trigger window resize event to properly resize grid\r\n $timeout(function () { $(window).trigger('resize'); });\r\n },\r\n function (error) {\r\n $log.error(\"Can't initialize grid: \");\r\n if (error && error.message) {\r\n $log.error(error.message);\r\n } else if (error && _.isString(error)) {\r\n $log.error(error);\r\n } else {\r\n $log.error(\"Unknown error\");\r\n }\r\n });\r\n }\r\n\r\n function resizeGrid() {\r\n var availableHeight = $(window).height() - $(\"div.grid-view-title\").height() \r\n - $(\"div.k-grid-toolbar\").outerHeight(true) - $(\"thead.k-grid-header\").outerHeight(true) - $(\"div.k-grouping-header\").outerHeight(true) \r\n - $(\"div.k-grid-pager\").outerHeight(true) - $(\"#header\").outerHeight(true);\r\n\r\n $('#orderItemsKendoGrid table').css(\"height\", availableHeight);\r\n }\r\n\r\n function destroyGrid() {\r\n if (!$scope.orderItemsGrid || !$scope.orderItemsGrid.destroy) {\r\n return;\r\n }\r\n $scope.orderItemsGrid.destroy();\r\n }\r\n\r\n var hasItemsSelectedOnOtherPages = false;\r\n var isSingleRowClick = false;\r\n\r\n function initGridEventsHandlers(gConfig) {\r\n //double click event to allow user to open order details\r\n $(\"#orderItemsKendoGrid tbody[role='rowgroup']\").on(\"dblclick\", \"tr\", function () {\r\n isSingleRowClick = true;\r\n showStepDetails();\r\n });\r\n\r\n //Handle the checkboxes clicks to select items (as if the 'Ctrl' pressed)\r\n $(\"#orderItemsKendoGrid tbody[role='rowgroup']\").on(\"click\", \"tr\", function (e) {\r\n isSingleRowClick = false;\r\n $('tbody tr').find('input[type=checkbox]').prop('checked', false);\r\n $('tbody tr.k-state-selected').find('input[type=checkbox]').prop('checked', true);\r\n\r\n if (!$(e.target).hasClass(\"row-selector\")) {\r\n //if it's not label nor checkbox of the row selector which should act as 'add to selection'\r\n //we need to act as it's just a signle row selection to reset the previously selected items\r\n isSingleRowClick = !e.shiftKey && !e.ctrlKey && !$(e.target).hasClass(\"k-checkbox\");\r\n return;\r\n }\r\n\r\n var rowElement = this;\r\n var row = $(rowElement);\r\n var grid = $scope.orderItemsGrid;\r\n\r\n hasItemsSelectedOnOtherPages =\r\n orderItemsGridSharedSettings.getSelectedOrderItemIds().length > grid.select().length;\r\n\r\n if (row.hasClass(\"k-state-selected\")) {\r\n var itemToRemove = grid.dataItem(row);\r\n var selected = $.grep(\r\n grid.select(),\r\n function (x) {\r\n return itemToRemove.getId() !== grid.dataItem(x).getId();\r\n });\r\n //and remove from the saved selection as well\r\n orderItemsGridSharedSettings.setSelectedOrderItemIds(\r\n _.filter(orderItemsGridSharedSettings.getSelectedOrderItemIds(),\r\n function (id) {\r\n return id !== itemToRemove.getId();\r\n }));\r\n\r\n grid.clearSelection();\r\n grid.select(selected);\r\n e.stopPropagation();\r\n } else {\r\n grid.select(row);\r\n e.stopPropagation(); //to not trigger default grid selection mechanism\r\n }\r\n });\r\n\r\n //And handle 'select-all' action\r\n $(\"#orderItemsKendoGrid thead[role='rowgroup']\").on(\"click\", \"tr\", function (e) {\r\n isSingleRowClick = false;\r\n $('tbody tr').find('input[type=checkbox]').prop('checked', false); //clear all checkboxes in all rows\r\n $('tbody tr.k-state-selected').find('input[type=checkbox]').prop('checked', true); //'check' those in the selected rows\r\n\r\n //Get the counts of selected and total items\r\n var selectedIdsCount = orderItemsGridSharedSettings.getSelectedOrderItemIds().length;\r\n var totalCount = orderItemsGridSharedSettings.getTotalCount();\r\n\r\n //As we land here after items selected via 'select-all label' click later on the 'checkbox' click event\r\n //just update the checkbox state here\r\n if ($(e.target).hasClass(\"k-checkbox\")) {\r\n $(e.target).prop('checked', selectedIdsCount === totalCount);\r\n $(e.target).prop('indeterminate', selectedIdsCount < totalCount && selectedIdsCount > 0);\r\n }\r\n\r\n if (!$(e.target).hasClass(\"all-selector\")) {\r\n return; //do not perform other actions if it's not the actual 'select-all' label click to avoid duplication\r\n }\r\n\r\n var grid = $scope.orderItemsGrid;\r\n var currentPageRowsCount = grid.tbody.find(\">tr[role='row']:not(.k-grouping-row)\").length;\r\n var currentPageSelectionCount = grid.select().length;\r\n\r\n if (selectedIdsCount >= currentPageRowsCount) {\r\n //See if we have all items selected on the current page\r\n //or we items selected on other pages already\r\n if (currentPageSelectionCount < currentPageRowsCount) {\r\n grid.select(grid.tbody.find(\">tr\")); //actually visualise in the grid the current page selection\r\n } else {\r\n if (selectedIdsCount === totalCount) {\r\n //So to indicate we need to clear ALL items from selection on subsequent click on 'select-all' checkbox\r\n //when we have really ALL items selected by selecting them on each page manually\r\n orderItemsGridSharedSettings.setSelectedOrderItemIds([]);\r\n } else {\r\n //remove from the selection only the items of the current page\r\n var itemsToRemove = grid.select();\r\n //and remove from the saved selection (we need to filter out items that are selected but are located\r\n //on the other grid pages, so we remove only the items that were selected on the current page\r\n var updatedSelection = _.filter(orderItemsGridSharedSettings.getSelectedOrderItemIds(),\r\n function (id) {\r\n return _.findIndex(itemsToRemove, function (i) {\r\n return grid.dataItem(i).getId() === id;\r\n }) === -1;\r\n });\r\n orderItemsGridSharedSettings.setSelectedOrderItemIds(updatedSelection);\r\n }\r\n //Just clear the selection so visually is nothing selected\r\n //as we are here 'de-selecting' items\r\n grid.clearSelection(); //this call clears selection from the current grid page only\r\n }\r\n } else {\r\n //Just select one page\r\n grid.select(grid.tbody.find(\">tr\")); //actually visualise in the grid the current page selection\r\n }\r\n\r\n e.stopPropagation();\r\n });\r\n }\r\n\r\n function initGridConfig(gConfig, gridHeaderTemplate) {\r\n //TODO: We might want to further refactor the approach to use special term to distinguish the mode 'existing step' or virtual view\r\n //where 'all-open' is a virtual view just like any other specified for the brand custom config\r\n //In this case we may end up being able to specify custom config not for the existing steps only, but also for any\r\n //'virtual view' specified as a custom filter in the configConfigs.js\r\n //All we would need is to update the method that gets gridConfig for us by resolving it using the 'forStep' variable, which will\r\n //contain not only either 'all-open' or 'real step name' values, but also 'custom filter' name values. \r\n //Currently we use the grid config of 'all-open' for the 'custom filter' views\r\n if (orderItemsGridSharedSettings.getCustomFilter() !== null) {\r\n gConfig.hideShowCompletedSwitch = true;\r\n }\r\n\r\n if (gConfig.hideShowCompletedSwitch && gConfig.hideShowCompletedSwitch === true) {\r\n orderItemsGridSharedSettings.hideShowCompletedSwitch = true;\r\n }\r\n if (gConfig.columns) {\r\n var firstVisibleColumn = _.find(gConfig.columns, function (c) {\r\n return !c.hidden && c.field;\r\n });\r\n if (firstVisibleColumn) {\r\n firstVisibleColumn.template = _.string.sprintf(\r\n \"
#:%s#
\",\r\n gettextCatalog.getString(\"View Details\"),\r\n firstVisibleColumn.field);\r\n }\r\n\r\n //Check if we have columns without percentage specified. Assign width if so.\r\n for (var i = 0; i < gConfig.columns.length; i++) {\r\n var column = gConfig.columns[i];\r\n if (!column.width) {\r\n column.width = 2 * (100 / gConfig.columns.length) + \"%\";\r\n }\r\n }\r\n }\r\n\r\n gConfig.toolbar = [{ template: gridHeaderTemplate }];\r\n\r\n gConfig.noRecords = {\r\n template: gettextCatalog.getString(\"No items to display\")\r\n };\r\n\r\n gConfig.dataBound = function (e) {\r\n // For some reason after we compile the grid into the page, it requests data and calls dataBound twice\r\n // This happens once after grid init so we just need to avoid one duplicated request\r\n // So to workaround that we skip the second duplicated data request in the datasource.read method\r\n // and we need to skip the duplicated dataBound execution by skipping it if dataRequestCount less than 2\r\n if (dataRequestCount < 2) {\r\n return;\r\n }\r\n\r\n //Execute the dataBound defined on the customised config first \r\n if (angular.isDefined($scope.gridConfig.dataBoundEventHandler) && angular.isFunction($scope.gridConfig.dataBoundEventHandler)) {\r\n try {\r\n $scope.gridConfig.dataBoundEventHandler.call($scope.orderItemsGrid, e);\r\n } catch (error) {\r\n $log.error(\"Error during executing customised Grid's config's DataBound even handler.\", error);\r\n }\r\n }\r\n\r\n //And then mark the already selected rows in the grid so it will be visible to user they are selected\r\n //upon navigation to the gridview\r\n var selectedItemsIds = orderItemsGridSharedSettings.getSelectedOrderItemIds();\r\n if (selectedItemsIds) {\r\n _.forEach(selectedItemsIds, function (itemId) {\r\n var dataItem = $scope.gridConfig.dataSource.get(itemId);\r\n if (dataItem && dataItem.uid) {\r\n $scope.orderItemsGrid.select('tr[data-uid=\"' + dataItem.uid + '\"]');\r\n }\r\n });\r\n }\r\n\r\n //And highlight the searchTerm found in the text values inside rows shown\r\n $timeout(function () {\r\n if (!String.isNullOrWhiteSpace($scope.textSearch)) {\r\n $(\"#orderItemsKendoGrid tbody td[role='gridcell']\").highlight($scope.textSearch);\r\n } else {\r\n $(\"#orderItemsKendoGrid tbody td[role='gridcell']\").unhighlight();\r\n }\r\n });\r\n };\r\n\r\n gConfig.change = function (e) {\r\n var grid = $scope.orderItemsGrid;\r\n //See which exact items got deselected if any (items which are yet checked but the rows are deselected already)\r\n var itemsDeselected = _.map($('tbody tr:not(.k-state-selected) input:checked'),\r\n function (input) {\r\n return grid.dataItem(input.closest('tr'));\r\n });\r\n\r\n //Update checkbox if the row selected/deselected\r\n $('tbody tr').find('input[type=checkbox]').prop('checked', false);\r\n $('tbody tr.k-state-selected').find('input[type=checkbox]').prop('checked', true);\r\n\r\n //Get currently total selected items on all pages\r\n var totalSelected = orderItemsGridSharedSettings.getSelectedOrderItemIds();\r\n //Get selected items on the current page only directly from the grid object\r\n var selected = getSelectedEntities();\r\n\r\n if (selected && selected[0] && selected[0].isRepresentationModel) {\r\n $scope.selectedOrderItemId = selected[0].getId();\r\n $scope.selectedOrderItem = selected[0];\r\n\r\n //Assemble deduplicated list of totally selected items on all pages to save it\r\n if (!isSingleRowClick) {\r\n //Add items that were selected (ignoring duplicates)\r\n totalSelected = _.uniq([].concat(totalSelected, _.map(selected, function (s) {\r\n return s.getId();\r\n })));\r\n } else {\r\n totalSelected = [$scope.selectedOrderItemId];\r\n isSingleRowClick = false; //reset flag\r\n }\r\n }\r\n //Remove items that were deselected if any\r\n if (itemsDeselected && itemsDeselected.length > 0) {\r\n totalSelected = _.difference(totalSelected, _.map(itemsDeselected, function (s) {\r\n return s.getId();\r\n }));\r\n }\r\n\r\n //we need to trigger dropdown list refresh so it will reevaluate its items templates (Kendo issue :( )\r\n $scope.reportsDropDown.refresh();\r\n\r\n //Save updated selection\r\n orderItemsGridSharedSettings.setSelectedOrderItemIds(totalSelected);\r\n\r\n //Get updated values\r\n var selectedIdsCount = orderItemsGridSharedSettings.getSelectedOrderItemIds().length;\r\n var totalCount = orderItemsGridSharedSettings.getTotalCount();\r\n\r\n //Update 'select all' checkbox if necessary (if present)\r\n $('thead tr').find('input[type=checkbox]').prop('checked', selectedIdsCount === totalCount);\r\n $('thead tr').find('input[type=checkbox]').prop('indeterminate', selectedIdsCount < totalCount && selectedIdsCount > 0);\r\n\r\n };\r\n\r\n //Grid pager is 'ON' by default or if specified so\r\n if (!gConfig.pageable || typeof gConfig.pageable === 'boolean' || gConfig.pageable !== null) {\r\n //Pager info (items count) is 'ON' by defaults unless specified to be 'OFF'\r\n var disablePagerInfo = gConfig.disablePagerItemsInfo && gConfig.disablePagerItemsInfo === true;\r\n if (disablePagerInfo) {\r\n //Reset pageable object. Otherwise just not touch it as it contains other valuable settings\r\n gConfig.pageable = {\r\n refresh: true,\r\n pageSizes: true,\r\n info: !disablePagerInfo\r\n };\r\n }\r\n }\r\n\r\n //See if we have default sorting specified, then set it onto grid shared settings\r\n if (angular.isDefined(gConfig.initialSort)) {\r\n if (angular.isArray(gConfig.initialSort)) {\r\n orderItemsGridSharedSettings.setGridSort(gConfig.initialSort);\r\n } else if (angular.isDefined(gConfig.initialSort.field) && angular.isDefined(gConfig.initialSort.dir)) {\r\n orderItemsGridSharedSettings.setGridSort([gConfig.initialSort]);\r\n }\r\n }\r\n\r\n\r\n return gConfig;\r\n }\r\n\r\n var forcedPageChange = false;\r\n var cachedResult;\r\n\r\n function initGridDataSource(gridConfig) {\r\n var dataSourceObj = {\r\n transport: {\r\n read: function (options) {\r\n if (forcedPageChange) { // prevent data request after manual page change\r\n forcedPageChange = false;\r\n if (cachedResult) {\r\n options.success(cachedResult);\r\n } else {\r\n toastr.error(gettextCatalog.getString(\"Data request cache error\"));\r\n options.error();\r\n }\r\n return;\r\n }\r\n $scope.isBusy = true;\r\n\r\n //Reset page size ignorance flag as it shouldn't alter grid behavior.\r\n //It is applied only on the item details card if order item id specified in the url as a parameter\r\n orderItemsGridSharedSettings.setForceIgnorePageSize(false);\r\n\r\n orderItemsGridSharedSettings.setPageNumber(options.data.page || 1);\r\n orderItemsGridSharedSettings.setPageSize(angular.isDefined(options.data.pageSize) ? options.data.pageSize : 20);\r\n orderItemsGridSharedSettings.setGridFilter(options.data.filter);\r\n orderItemsGridSharedSettings.setGridSort(options.data.sort);\r\n\r\n // check if we have a duplicated request after grid init\r\n // i.e. For some reason after we compile the grid into the page, it requests data\r\n // and then requests data again. This happens once after grid init so we just need to avoid one duplicated request\r\n if (dataRequestCount === 1 && cachedResult &&\r\n $scope.gridConfig.dataSource.page() === options.data.page &&\r\n $scope.gridConfig.dataSource.pageSize() === options.data.pageSize) {\r\n dataRequestCount++;\r\n options.success(cachedResult);\r\n $scope.isBusy = false;\r\n return;\r\n }\r\n\r\n renderSkeletonPlaceholdersLoadingAnimation();\r\n\r\n gridDataProvider.getData()\r\n .then(function (result) {\r\n orderItemsGridSharedSettings.setTotalCount(result.totalCount);\r\n orderItemsGridSharedSettings.setTotalPageCount(result.totalPageCount);\r\n cachedResult = result;\r\n dataRequestCount++;\r\n\r\n // check if current page number was changed\r\n if ($scope.gridConfig.dataSource.page() !== result.pageNumber ||\r\n $scope.gridConfig.dataSource.pageSize() !== result.rowsPerPage) {\r\n forcedPageChange = true;\r\n options.page = result.pageNumber;\r\n options.pageSize = result.rowsPerPage;\r\n $scope.gridConfig.dataSource.query(options);\r\n }\r\n\r\n if (!$scope.selectedOrderItemId) {\r\n $scope.selectedOrderItemId = orderItemsGridSharedSettings.getSelectedOrderItemId();\r\n }\r\n\r\n var ts = orderItemsGridSharedSettings.getTextSearch();\r\n if (result.totalCount === 1 && result.items.length === 1) { // if we found one item...\r\n if (ts && ts.text && textSearchTrigger === true) { // ...and search box is not empty...\r\n if (!$scope.forbidOrderDetailsView) { // ...and we are allowed to go into order details\r\n // ...open the item\r\n //\r\n //Commented for now as we will handle the navigation caused by barcode scanner\r\n //in the dedicated handler 'checkBarcode()'\r\n //orderItemsGridSharedSettings.setSelectedOrderItemId(result.items[0].getId());\r\n //$state.go('client.step', {\r\n // step: $scope.step\r\n //});\r\n }\r\n }\r\n } else if (result.totalCount === 0) { // if we found nothing\r\n // todo sound notification\r\n if (ts && ts.text && textSearchTrigger === true) {\r\n // select search text box\r\n $($element).find(\"#gridTextSearchField\").select();\r\n }\r\n }\r\n\r\n clearSkeletonPlaceholdersLoadingAnimation();\r\n\r\n $scope.totalItemsCountForPageTitle = result.totalCount;\r\n updatePageTitle();\r\n\r\n options.success(result);\r\n $scope.isBusy = false;\r\n textSearchTrigger = false;\r\n },\r\n function (resp) {\r\n textSearchTrigger = false;\r\n if (resp && resp.status) {\r\n toastr.error(resp.message, gettextCatalog.getString(\"Data request failed\"));\r\n } else {\r\n toastr.error(gettextCatalog.getString(\"Data request failed\"),\r\n gettextCatalog.getString(\"Server is not responding\"));\r\n }\r\n options.error();\r\n $scope.isBusy = false;\r\n });\r\n }\r\n },\r\n schema: {\r\n data: function (response) {\r\n return response ? response.items : null;\r\n },\r\n total: function (response) {\r\n return response ? response.totalCount : 0;\r\n },\r\n model: {\r\n id: \"$model.id\",\r\n fields: gridConfig.fields || {}\r\n }\r\n },\r\n page: orderItemsGridSharedSettings.getPageNumber() || 1,\r\n pageSize: orderItemsGridSharedSettings.getPageSize() || gridConfig.pageSize || 20,\r\n filter: orderItemsGridSharedSettings.getGridFilter(),\r\n sort: orderItemsGridSharedSettings.getGridSort(),\r\n serverPaging: true,\r\n serverSorting: true,\r\n serverFiltering: true\r\n };\r\n\r\n if (gridConfig.groupable == true && angular.isDefined(gridConfig.initialGroup)) {\r\n dataSourceObj.group = gridConfig.initialGroup;\r\n dataSourceObj.pageSize = gridConfig.pageSize;\r\n }\r\n\r\n return new kendo.data.DataSource(dataSourceObj);\r\n }\r\n\r\n function updatePageTitle() {\r\n //And update the browser tab page title\r\n $rootScope.pageTitle =\r\n gettextCatalog.getString('OrderManager: ') + $scope.viewTitle + \r\n ($scope.totalItemsCountForPageTitle > 0 ? (': ' + $scope.totalItemsCountForPageTitle) : '');\r\n }\r\n\r\n function renderSkeletonPlaceholdersLoadingAnimation() {\r\n if ($('#orderItemsKendoGrid table tbody').children().length > 0 || $('#orderItemsKendoGrid div.k-grid-norecords').length > 0) {\r\n //Do not render skeleton loading placeholders if we do have records to show OR if instead there are no records to show and we alreayd know it\r\n return;\r\n }\r\n\r\n var pageSize = orderItemsGridSharedSettings.getPageSize();\r\n if (!angular.isDefined(pageSize)) {\r\n pageSize = $scope.gridConfig.pageSize;\r\n }\r\n\r\n if (pageSize === 0 || pageSize > 15) {\r\n pageSize = 15; //Set page size for the loading-placeholders content to 15 if it's configured for bigger value or 0 which is 'show all'\r\n }\r\n\r\n var columnsCount = 10; //10 by default but it's better to try and find the columns count from grid template\r\n //which is initialised based on the grid branded config\r\n if ($('#orderItemsKendoGrid table colgroup').length > 0) {\r\n columnsCount = $('#orderItemsKendoGrid table colgroup').children().length;\r\n }\r\n for (var i = 0; i < pageSize; i++) {\r\n\r\n //Render visual templates to indicate loading rows/cells\r\n var row = $('');\r\n for (var c = 0; c < columnsCount; c++) {\r\n var divWidth = c > 0 ? (40 + Math.floor(Math.random() * 60)) : 100;\r\n row.append($('
'));\r\n }\r\n $('#orderItemsKendoGrid table tbody').append(row);\r\n\r\n }\r\n }\r\n\r\n function clearSkeletonPlaceholdersLoadingAnimation() {\r\n $('#orderItemsKendoGrid table tbody').empty();\r\n }\r\n\r\n function initSignalREvents() {\r\n var reloadGridBySignalREvent = _.debounce(function (e) {\r\n reloadGrid();\r\n }, 500);\r\n\r\n orderItemsGridControllerUpdatesService.onOrderItemChanged(reloadGridBySignalREvent);\r\n orderItemsGridControllerUpdatesService.onNewOrderItem(reloadGridBySignalREvent);\r\n orderItemsGridControllerUpdatesService.onOrderChanged(reloadGridBySignalREvent);\r\n }\r\n\r\n /**\r\n * Reports DropDown initialization\r\n * @returns {Promise}\r\n */\r\n function initReportList() {\r\n return reportManager.getReportList(orderItemsGridSharedSettings.getStepFilter())\r\n .then(function (results) {\r\n var reportComboItems = [];\r\n _.forEach(results, function (value) {\r\n reportComboItems.push({\r\n \"text\": value.name,\r\n \"value\": value\r\n });\r\n });\r\n $scope.dropdownReportsOptions = {\r\n dataSource: reportComboItems,\r\n dataTextField: \"text\",\r\n dataValueField: \"value\",\r\n height: \"auto\",\r\n valueTemplate: gettextCatalog.getString(\"Reports\"),\r\n template: \"{{dataItem.text|sTranslate}}\",\r\n select: function (e) {\r\n gridDataProvider.getReportQuery() //acquire the current query used to populate the grid\r\n .then(function (gridQuery) {\r\n var report = $scope.dropdownReportsOptions.dataSource[e.item.index()]; //get the clicked report configuration\r\n var selectedItemId = orderItemsGridSharedSettings.getSelectedOrderItemId(); //see if we have a selected item\r\n\r\n if (!!report.value.requiresSelection) {\r\n if (angular.isDefined(selectedItemId)) {\r\n //we use the selected item id as a query for the report if we have one selected\r\n reportManager.show({\r\n report: report.value,\r\n query: [selectedItemId],\r\n orderBy: report.value.orderBy || gridQuery.orderBy\r\n });\r\n }\r\n //do nothing if report requires selection and we don't have any item selected\r\n } else {\r\n //If report doesn't require selection, use either specific custom query of the report (report.value.query)\r\n //specified in customisation or just the query that is used to show the current data set (gridQuery.query)\r\n //user is being viewing at.\r\n //Query and orderBy from report specified in customisation have higher priority over current-context data.\r\n reportManager.show({\r\n report: report.value,\r\n //Now supply the query to the report manager. Here we check if the report was configured with static query,\r\n //dynamic (function) query or no query at all. If it is a dynamic query - we use it, otherwise we use static query.\r\n //In case no query was configured in the report configuration section, we just use the grid's query to generate\r\n //report for exactly the same items we see in the grid.\r\n query: angular.isFunction(report.value.query)\r\n ? report.value.query(gridQuery, $scope.selectedOrderItem)\r\n : (report.value.query || gridQuery.query),\r\n orderBy: report.value.orderBy || gridQuery.orderBy\r\n });\r\n }\r\n });\r\n },\r\n dataBound: function () {\r\n this.list.width('auto');\r\n }\r\n };\r\n }, function (error) {\r\n $log.error(\"Can't initialize report list: \");\r\n if (error && error.message) {\r\n $log.error(error.message);\r\n } else if (error && _.isString(error)) {\r\n $log.error(error);\r\n } else {\r\n $log.error(\"Unknown error\");\r\n }\r\n });\r\n }\r\n\r\n function getSelectionInfoLabel() {\r\n return uiLocalization.translate('You have %s items selected', getSelectedOrderItemsCount());\r\n }\r\n\r\n function getSelectedOrderItemsCount() {\r\n return orderItemsGridSharedSettings.getSelectedOrderItemIds().length;\r\n }\r\n\r\n /**\r\n * Get selected items from grid\r\n * @returns {!RepresentationModel[]}\r\n */\r\n function getSelectedEntities() {\r\n var selectedEntities = [];\r\n var selectedDOM = $scope.orderItemsGrid.select();\r\n _.forEach(selectedDOM, function (value) {\r\n selectedEntities.push($scope.orderItemsGrid.dataItem(value));\r\n });\r\n return selectedEntities;\r\n }\r\n\r\n /**\r\n * Go to the Step Details View\r\n */\r\n function showStepDetails() {\r\n var selected = getSelectedEntities();\r\n if (!selected || $scope.forbidOrderDetailsView) {\r\n //Do not allow to go into step details if nothing selected\r\n //OR if we are requested to do so according to the customisation configs\r\n return;\r\n }\r\n var firstSelected = selected[0];\r\n if (firstSelected && firstSelected.isRepresentationModel) {\r\n orderItemsGridSharedSettings.setSelectedOrderItemId(firstSelected.getId());\r\n // go to the Step Details View\r\n $state.go('client.step', {\r\n step: $scope.step\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Apply text search\r\n */\r\n function applyTextSearch() {\r\n orderItemsGridSharedSettings.setTextSearch($scope.textSearch, $scope.searchDropdown === \"exact-search\");\r\n reloadGrid();\r\n textSearchTrigger = true;\r\n }\r\n\r\n /**\r\n * Handle barcode scanner value scanned\r\n */\r\n function checkBarcode(e) {\r\n //See if the scanned value corresponds to any valid order item Id of any item on the currently \r\n //being shown step, then select that item and redirect to the 'detailed' view\r\n if (e.value.length > 0) {\r\n orderItemsGridSharedSettings.setTextSearch(e.value, true);\r\n reloadGrid().then(function () {\r\n if ($scope.orderItemsGrid && $scope.orderItemsGrid.dataItem(\"tbody tr:eq(0)\") != null &&\r\n (e.value == $scope.orderItemsGrid.dataItem(\"tbody tr:eq(0)\").getId() ||\r\n e.value == $scope.orderItemsGrid.dataItem(\"tbody tr:eq(0)\").$model.order.getId())) {\r\n //set the very first item as a selected one\r\n orderItemsGridSharedSettings.setSelectedOrderItemId($scope.orderItemsGrid.dataItem(\"tbody tr:eq(0)\").getId());\r\n $state.go('client.step', { step: $scope.step });\r\n orderItemsGridSharedSettings.setTextSearch(e.value, $scope.searchDropdown === \"exact-search\");\r\n } else {\r\n //Nothing found so just reset search and refresh grid\r\n var snd = new Audio(\"data:audio/wav;base64,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qJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=\");\r\n snd.play();\r\n toastr.warning(gettextCatalog.getString('There are no items corresponding to the scanned barcode [' + e.value + '].'), gettextCatalog.getString('Nothing found :('));\r\n textSearchTrigger = false;\r\n orderItemsGridSharedSettings.setTextSearch('', $scope.searchDropdown === \"exact-search\");\r\n reloadGrid();\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Force grid to refresh (if loaded)\r\n */\r\n function reloadGrid() {\r\n\r\n if ($scope.orderItemsGrid && $scope.orderItemsGrid.dataSource && $scope.orderItemsGrid.dataSource.read) {\r\n $('thead tr').find('input[type=checkbox]').prop('checked', false);\r\n $('thead tr').find('input[type=checkbox]').prop('indeterminate', false);\r\n\r\n return $scope.orderItemsGrid.dataSource.read();\r\n }\r\n\r\n return $q.when(null);\r\n }\r\n\r\n /**\r\n * Updates busy state\r\n */\r\n function setBusyState(newBusyState) {\r\n $scope.isBusy = newBusyState;\r\n }\r\n\r\n function resetOrderItemsGridSharedSettings() {\r\n //The below code used by the external helper methods which operate on the items in the grid\r\n //to clear selection and current page\r\n orderItemsGridSharedSettings.setSelectedOrderItemIds([]);\r\n orderItemsGridSharedSettings.setPageNumber(1);\r\n }\r\n\r\n /**\r\n * Executes selected action for the selected items\r\n */\r\n function executeAction(actionToExecute) {\r\n\r\n var selectedItemsIds = orderItemsGridSharedSettings.getSelectedOrderItemIds();\r\n if (!actionToExecute || $scope.isBusy || !selectedItemsIds || selectedItemsIds.length === 0) {\r\n return;\r\n }\r\n\r\n $scope.actionToExecute = actionToExecute;\r\n $scope.confirmActionDialog.open();\r\n }\r\n\r\n function executeActionConfirmed(e) {\r\n $scope.isBusy = true;\r\n var currentStep = $scope.step;\r\n\r\n onBeforeActionExecute(e)\r\n .then(function () {\r\n workflowRepository\r\n .executeActionForOrderItems(currentStep, $scope.actionToExecute, orderItemsGridSharedSettings.getSelectedOrderItemIds())\r\n .then(function (resp) {\r\n $log.debug('Executed action [' + $scope.actionToExecute + '] for selected ' + getSelectedOrderItemsCount() + ' items.');\r\n var itemsCount = orderItemsGridSharedSettings.getSelectedOrderItemIds().length;\r\n var itemsMsg = itemsCount ?\r\n uiLocalization.translate(\"%s item has been progressed to [%s].\", orderItemsGridSharedSettings.getSelectedOrderItemIds().length, $scope.actionToExecute) :\r\n uiLocalization.translate(\"%s items have been progressed to [%s].\", orderItemsGridSharedSettings.getSelectedOrderItemIds().length, $scope.actionToExecute);\r\n var buttonHtml = _.str.sprintf(\r\n '
%s 
',\r\n uiLocalization.translate(\"Go to Overview\"));\r\n\r\n toastr.info(_.str.sprintf('%s %s', itemsMsg, buttonHtml), uiLocalization.translate(\"Action execution completed\"));\r\n\r\n //Now we can reset the selected items, page number and grid\r\n orderItemsGridSharedSettings.setSelectedOrderItemIds([]);\r\n orderItemsGridSharedSettings.setPageNumber(1);\r\n $scope.orderItemsGrid.dataSource.page(1);\r\n reloadGrid().then(function () {\r\n $scope.actionToExecute = '';\r\n $scope.isBusy = false;\r\n });\r\n },\r\n function (error) {\r\n if (error) {\r\n var em = error.serverErrorMessage || error.message;\r\n toastr.error(uiLocalization.translate(\"Action execution error! Error details: %s\", em));\r\n $log.error(\"Action execution error: \\n\" + em);\r\n $scope.isBusy = false;\r\n }\r\n return $q.reject(null);\r\n });\r\n });\r\n }\r\n\r\n function onBeforeActionExecute(e) {\r\n if (!$scope.gridConfig.saveItemsBeforeActionExecute) {\r\n return $q.when(); //do not attempt to save items if it is not required\r\n }\r\n\r\n var grid = $scope.orderItemsGrid;\r\n\r\n //TODO: The following code will get the selection only on the current page, so it will work only for the \r\n //cases when we have all items shown on the page\r\n var itemsToUpdateAndSave = _.map(grid.select(), function (x) { return grid.dataItem(x); });\r\n\r\n //We want to save every order item (and its custom fields) before progressing it to the next step (executing action on it)\r\n //In case order items values were updated\r\n var itemsSavePromises = [];\r\n for (var i = 0; i < itemsToUpdateAndSave.length; i++) {\r\n itemsSavePromises.push(orderItemsRepository.saveOrderItem(itemsToUpdateAndSave[i]));\r\n }\r\n $log.debug('About to save to server ' + itemsToUpdateAndSave.length + ' selected items for selected before progressing them / executing workflow action.');\r\n\r\n return $q.all(itemsSavePromises);\r\n }\r\n\r\n })\r\n\r\n // Separate service for update events (to prevent multiple event subscription)\r\n .service('orderItemsGridControllerUpdatesService', function (rest) {\r\n var _this = this;\r\n var newOrderItemCb;\r\n var orderItemChangedCb;\r\n var orderChangedCb;\r\n\r\n rest.events.on(\"modelCreatedOnServer\", function (modelInfo) {\r\n if (!newOrderItemCb) {\r\n return;\r\n }\r\n if (modelInfo && modelInfo.modelType == \"OrderItemModel\") {\r\n newOrderItemCb(modelInfo);\r\n }\r\n });\r\n\r\n rest.events.on(\"modelUpdatedOnServer\", function (modelInfo) {\r\n if (modelInfo.modelType == \"OrderItemModel\" && orderItemChangedCb) {\r\n orderItemChangedCb(modelInfo);\r\n } else if (modelInfo.modelType == \"OrderModel\" && orderChangedCb) {\r\n orderChangedCb(modelInfo);\r\n }\r\n });\r\n\r\n _this.onNewOrderItem = function (cb) {\r\n newOrderItemCb = cb;\r\n };\r\n\r\n _this.onOrderItemChanged = function (cb) {\r\n orderItemChangedCb = cb;\r\n };\r\n\r\n _this.onOrderChanged = function (cb) {\r\n orderChangedCb = cb;\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n ;\r\n","angular.module('ui.order.stepDetailed', [])\r\n\r\n .directive('stepDetailed', function () {\r\n return {\r\n restrict: \"E\",\r\n templateUrl: 'app/ui/order/stepDetailedView/stepDetailed/stepDetailed.html',\r\n scope: {},\r\n controller: 'StepDetailedController',\r\n controllerAs: 'StepDetailedController'\r\n };\r\n })\r\n\r\n .controller('StepDetailedController', function ($window, $rootScope, $scope, $state, $q, $log, toastr, gettextCatalog, orderItemsGridSharedSettings,\r\n gridDataProvider, stepDetailedControllerUpdatesService,\r\n usersRepository, workflowRepository, $customisationConfig,\r\n serverLocalization, uiLocalization, customResourceResolver) {\r\n\r\n var lastSelectedIndex;\r\n var lastPageNumber;\r\n\r\n $scope.specifiedItemNotFound = false;\r\n $scope.isDataLoaded = false;\r\n $scope.isOrderItemDataLoaded = false;\r\n $scope.hidemenu = ($state.params.hidemenu && $state.params.hidemenu === 'true');\r\n\r\n $scope.step = orderItemsGridSharedSettings.getStepFilter() || 'all-open';\r\n $scope.orderItemIdFromParams = $state.params.orderItemId;\r\n\r\n $scope.pageNumber = orderItemsGridSharedSettings.getPageNumber();\r\n if (!$scope.pageNumber) {\r\n $scope.pageNumber = 1;\r\n orderItemsGridSharedSettings.setPageNumber(1);\r\n }\r\n $scope.getRandom = function (start, stop) { return Math.floor(Math.random() * (stop - start)) + start; };\r\n\r\n _.extend($scope, {\r\n toFirstPage: toFirstPage,\r\n toPrevPage: toPrevPage,\r\n toNextPage: toNextPage,\r\n toLastPage: toLastPage,\r\n \r\n selectOrderItem: selectOrderItem,\r\n\r\n onOrderItemLoadStart: onOrderItemLoadStart,\r\n onOrderItemLoadEnd: onOrderItemLoadEnd,\r\n onOrderItemActionExecute: onOrderItemActionExecute,\r\n onOrderItemActionExecuteStart: onOrderItemActionExecuteStart,\r\n\r\n setShadows: setShadows,\r\n getGridViewUri: getGridViewUri\r\n });\r\n\r\n initController();\r\n\r\n function initController() {\r\n initStepHeader();\r\n reloadList();\r\n initWatchers();\r\n }\r\n\r\n function initWatchers() {\r\n\r\n stepDetailedControllerUpdatesService.onOrderItemChanged(function () {\r\n reloadList();\r\n });\r\n stepDetailedControllerUpdatesService.onOrderChanged(function () {\r\n reloadList();\r\n });\r\n stepDetailedControllerUpdatesService.onNewOrderItem(function () {\r\n reloadList();\r\n });\r\n\r\n angular.element(document.querySelector('#order-items-list-ul')).on('scroll',\r\n function(e) {\r\n $scope.setShadows(e);\r\n });\r\n angular.element($window).on('resize',\r\n function(e) {\r\n $scope.setShadows(e);\r\n });\r\n\r\n angular.element(document).keydown(function (e) {\r\n if (!$scope.isDataLoaded || !e || !e.keyCode || !e.target) {\r\n return;\r\n }\r\n var elementName = e.target.nodeName.toLowerCase();\r\n if (elementName === 'input' || elementName === 'textarea') {\r\n return; //ignore arrows when inside input boxes\r\n }\r\n switch(e.keyCode) {\r\n case 37:\r\n //Left\r\n if ($scope.pageNumber > 1) {\r\n toPrevPage();\r\n }\r\n break;\r\n case 39:\r\n //Right\r\n if ($scope.pageNumber < $scope.totalPageCount) {\r\n toNextPage();\r\n }\r\n break;\r\n case 38:\r\n //Up\r\n if (lastSelectedIndex > 0) {\r\n lastSelectedIndex--;\r\n selectOrderItem($scope.orderItems[lastSelectedIndex]);\r\n\r\n } else if ($scope.pageNumber > 1) {\r\n lastSelectedIndex = orderItemsGridSharedSettings.getPageSize() - 1;\r\n toPrevPage();\r\n }\r\n break;\r\n case 40:\r\n //Down\r\n if (lastSelectedIndex < ($scope.orderItems.length - 1)) {\r\n lastSelectedIndex++;\r\n selectOrderItem($scope.orderItems[lastSelectedIndex]);\r\n\r\n } else if($scope.pageNumber < $scope.totalPageCount) {\r\n lastSelectedIndex = 0;\r\n toNextPage();\r\n }\r\n break;\r\n default:\r\n //Do nothing\r\n break;\r\n\r\n }\r\n\r\n return;\r\n });\r\n\r\n $scope.$on(\r\n \"$destroy\",\r\n function () {\r\n stepDetailedControllerUpdatesService.onOrderItemChanged(null);\r\n stepDetailedControllerUpdatesService.onNewOrderItem(null);\r\n stepDetailedControllerUpdatesService.onOrderChanged(null);\r\n angular.element(document).off('keydown');\r\n angular.element(document.querySelector('#order-items-list-ul')).off('scroll');\r\n angular.element($window).off('resize');\r\n }\r\n );\r\n }\r\n\r\n var isScrollingItemsList = false;\r\n function setShadows(event) {\r\n var itemsListContainer = angular.element(document.querySelector('.nav-menu.order-items-list'));\r\n var eventTarget = document.querySelector('#order-items-list-ul');\r\n if (!eventTarget && event) {\r\n eventTarget = event.target;\r\n }\r\n if (!eventTarget || eventTarget.id !== 'order-items-list-ul') {\r\n return;\r\n }\r\n \r\n if (!isScrollingItemsList) {\r\n window.requestAnimationFrame(function() {\r\n try {\r\n if (!eventTarget || eventTarget.children.length < 1) {\r\n return;\r\n }\r\n\r\n var endOfScroll =\r\n eventTarget.scrollHeight -\r\n eventTarget.clientHeight -\r\n 2; //safer to subtract some more pixels\r\n\r\n if (eventTarget.scrollTop > 0) {\r\n itemsListContainer.addClass('off-top');\r\n } else {\r\n itemsListContainer.removeClass('off-top');\r\n }\r\n if (eventTarget.scrollTop < endOfScroll) {\r\n itemsListContainer.addClass('off-bottom');\r\n } else {\r\n itemsListContainer.removeClass('off-bottom');\r\n }\r\n isScrollingItemsList = false;\r\n } catch (e) {\r\n //something happened during updating of the orderitems list classes to indicate its scrollability\r\n }\r\n });\r\n isScrollingItemsList = true;\r\n }\r\n }\r\n\r\n /**\r\n * Select orderItem\r\n * @param {RepresentationModel} orderItem model\r\n */\r\n function selectOrderItem(orderItem) {\r\n $scope.orderItemId = orderItem ? orderItem.getId() : null;\r\n orderItemsGridSharedSettings.setSelectedOrderItemId($scope.orderItemId);\r\n\r\n var lastSelected = _.findIndex($scope.orderItems, function (rm) {\r\n return rm.getId() === $scope.orderItemId;\r\n });\r\n if (lastSelected < 0) {\r\n lastSelected = 0;\r\n }\r\n lastSelectedIndex = lastSelected;\r\n $scope.specifiedItemNotFound = false;\r\n\r\n updatePageTitle(orderItem);\r\n }\r\n\r\n function onOrderItemLoadStart() {\r\n $scope.isOrderItemDataLoaded = false;\r\n }\r\n\r\n function onOrderItemLoadEnd() {\r\n $scope.isOrderItemDataLoaded = true;\r\n }\r\n\r\n var isOrderItemActionExecuting = false;\r\n\r\n function onOrderItemActionExecuteStart() {\r\n isOrderItemActionExecuting = true;\r\n }\r\n\r\n function onOrderItemActionExecute() {\r\n isOrderItemActionExecuting = false;\r\n return reloadList();\r\n }\r\n\r\n function updatePageTitle(orderItem) {\r\n customResourceResolver\r\n .resolveConfig(\"order-item-card-page-title-getter\", null, { orderItem: orderItem })\r\n .then(function (getPageTitle) {\r\n var pageTitle = getPageTitle ? getPageTitle() : null;\r\n $rootScope.pageTitle = pageTitle || gettextCatalog.getString('OrderManager: Item ') + $scope.orderItemId;\r\n });\r\n }\r\n\r\n function getGridViewUri() {\r\n var customFilter = orderItemsGridSharedSettings.getCustomFilter();\r\n if (customFilter) {\r\n return customFilter.targetUri + '?filter=' + customFilter.name;\r\n } else {\r\n return '#/client/orders/' + $scope.step;\r\n }\r\n }\r\n\r\n /**\r\n * Reload order items list\r\n */\r\n function reloadList() {\r\n if (isOrderItemActionExecuting) {\r\n return;\r\n }\r\n $scope.isDataLoaded = false;\r\n orderItemsGridSharedSettings.setPageNumber($scope.pageNumber);\r\n lastPageNumber = $scope.pageNumber;\r\n orderItemsGridSharedSettings.setForceIgnorePageSize(angular.isDefined($scope.orderItemIdFromParams) && $scope.orderItemIdFromParams !== '');\r\n\r\n return gridDataProvider.getData()\r\n .then(function (searchResults) {\r\n $scope.orderItems = searchResults.items;\r\n\r\n $scope.$applyAsync(function() {\r\n $scope.setShadows();\r\n });\r\n\r\n $scope.pageNumber = orderItemsGridSharedSettings.getPageNumber();\r\n $scope.totalPageCount = searchResults.totalPageCount;\r\n\r\n fixSelection(searchResults);\r\n $scope.orderItemId = orderItemsGridSharedSettings.getSelectedOrderItemId();\r\n\r\n $scope.isDataLoaded = true;\r\n\r\n updatePageTitle($scope.orderItem);\r\n\r\n if (searchResults.totalCount === 0 && searchResults.items.length === 0) {\r\n // todo sound notification\r\n if (orderItemsGridSharedSettings.isClear()) {\r\n toastr.info(gettextCatalog.getString(\"Going back to the home screen...\"), gettextCatalog.getString(\"No order items to display at current step\"));\r\n orderItemsGridSharedSettings.clear();\r\n $state.go('client.home', {\r\n step: $scope.step\r\n });\r\n } else {\r\n toastr.info(gettextCatalog.getString(\"Going back to the grid...\"), gettextCatalog.getString(\"No order items to display\"));\r\n orderItemsGridSharedSettings.clear();\r\n $state.go('client.orders', {\r\n step: $scope.step\r\n });\r\n }\r\n }\r\n }, function (err) {\r\n $scope.isDataLoaded = true;\r\n $log.error(\"Can't load data for list in stepDetailed view. Cause: %s\", err.message);\r\n toastr.error(err.message, gettextCatalog.getString(\"Can't load list of order items\"));\r\n });\r\n }\r\n\r\n function fixSelection(resp) {\r\n if (resp.items.length > 0) {\r\n var selectedId = orderItemsGridSharedSettings.getSelectedOrderItemId();\r\n\r\n if (selectedId) {\r\n var lastSelected = _.findIndex(resp.items, function (rm) {\r\n return rm.getId() === selectedId;\r\n });\r\n if (lastSelected >= 0) {\r\n lastSelectedIndex = lastSelected;\r\n } else {\r\n //item was moved or deleted, so last selected item id not found in the new search result\r\n if ((lastPageNumber && lastPageNumber !== orderItemsGridSharedSettings.getPageNumber()) ||\r\n lastSelectedIndex >= resp.items.length) {\r\n lastSelectedIndex = resp.items.length - 1;\r\n } else if (!lastSelectedIndex || lastSelectedIndex === -1) {\r\n //just select first on the page\r\n lastSelectedIndex = 0;\r\n } else {\r\n //otherwise we keep last selected index so the next item in the list will get selected\r\n //when we moved further in the workflow chain the item we stayed on\r\n }\r\n }\r\n $scope.orderItem = resp.items[lastSelectedIndex];\r\n }\r\n if (lastSelectedIndex == null || lastSelectedIndex < 0) {\r\n\r\n //If we don't have order Item Id supplied from external source via url param\r\n //and we had no information on last selected Id, then just select first one in the collection\r\n if (!$scope.orderItemIdFromParams) {\r\n lastSelectedIndex = 0;\r\n\r\n if (lastSelectedIndex >= resp.items.length) {\r\n lastSelectedIndex = resp.items.length - 1;\r\n }\r\n\r\n orderItemsGridSharedSettings.setSelectedOrderItemId(resp.items[lastSelectedIndex].getId());\r\n $scope.orderItem = resp.items[lastSelectedIndex];\r\n } else {\r\n //if we have order Item Id supplied externally via url param but it wasn't found in the collection \r\n //selected index -1 or null (not found) - don't select anything\r\n lastSelectedIndex = null;\r\n orderItemsGridSharedSettings.setSelectedOrderItemId(null);\r\n $scope.orderItem = null;\r\n $scope.specifiedItemNotFound = true;\r\n }\r\n } else {\r\n $scope.specifiedItemNotFound = false;\r\n orderItemsGridSharedSettings.setSelectedOrderItemId(resp.items[lastSelectedIndex].getId());\r\n }\r\n } else {\r\n lastSelectedIndex = null;\r\n orderItemsGridSharedSettings.setSelectedOrderItemId(null);\r\n $scope.orderItem = null;\r\n }\r\n }\r\n\r\n /**\r\n * Method to collect/construct data necessary to render corresponding step icon/button in the header of the nav bar\r\n * @returns {Promise}\r\n */\r\n function initStepHeader() {\r\n $scope.stateDisplayName = \"\";\r\n $scope.stateIconName = \"\";\r\n\r\n return $q.all(\r\n [\r\n usersRepository.getCurrentUser(),\r\n workflowRepository.getSteps(),\r\n customResourceResolver.resolveWorkflow()\r\n ]\r\n ).then(function (data) {\r\n var workflowConfig = data[2];\r\n var stepDisplayName = \"All Items\";\r\n\r\n var isCustomer = data[0].isCustomer();\r\n var step = _.find(data[1], function (s) {\r\n return s.$model.code === $scope.step;\r\n });\r\n var stepConfig = _.find(workflowConfig.steps, function (s) {\r\n return s.code === $scope.step;\r\n });\r\n\r\n if (step) {\r\n stepDisplayName = isCustomer ? step.$model.publicNameResource : step.$model.nameResource;\r\n }\r\n\r\n var fallbackIconForStep = function (stepCode) {\r\n if (stepCode === \"all-open\") {\r\n return \"track\";\r\n }\r\n return $customisationConfig.hasResource(function (res) { return _.string.contains(res, stepCode + \".\"); }) ? stepCode : \"workflow\";\r\n };\r\n \r\n if ($scope.step && $scope.step !== \"all-open\") {\r\n $scope.stateDisplayName = serverLocalization.translate(stepDisplayName);\r\n $scope.stateIconName = angular.isUndefined(stepConfig) ? fallbackIconForStep($scope.step) :\r\n (angular.isDefined(stepConfig.publicImageResourceName) && isCustomer\r\n ? stepConfig.publicImageResourceName\r\n :\r\n (angular.isDefined(stepConfig.imageResourceName) ? stepConfig.imageResourceName :\r\n fallbackIconForStep($scope.step)));\r\n } else {\r\n //See if we have custom filter applied\r\n var customFilter = orderItemsGridSharedSettings.getCustomFilter();\r\n if (customFilter) {\r\n $scope.stateDisplayName = gettextCatalog.getString(customFilter.name || \"Filtered Items\");\r\n $scope.stateIconName = customFilter.iconName || fallbackIconForStep($scope.step);\r\n } else {\r\n $scope.stateDisplayName = gettextCatalog.getString(\"All Items\");\r\n $scope.stateIconName = fallbackIconForStep($scope.step);\r\n }\r\n }\r\n });\r\n }\r\n\r\n function toFirstPage() {\r\n if (!$scope.isDataLoaded) {\r\n return;\r\n }\r\n $scope.pageNumber = 1;\r\n reloadList();\r\n }\r\n\r\n function toPrevPage() {\r\n if (!$scope.isDataLoaded) {\r\n return;\r\n }\r\n $scope.pageNumber = $scope.pageNumber - 1;\r\n if ($scope.pageNumber <= 0 || $scope.pageNumber > $scope.totalPageCount) {\r\n $scope.pageNumber = 1;\r\n }\r\n reloadList();\r\n }\r\n\r\n function toNextPage() {\r\n if (!$scope.isDataLoaded) {\r\n return;\r\n }\r\n $scope.pageNumber = $scope.pageNumber + 1;\r\n if ($scope.pageNumber <= 0 || $scope.pageNumber > $scope.totalPageCount) {\r\n $scope.pageNumber = $scope.totalPageCount;\r\n }\r\n reloadList();\r\n }\r\n\r\n function toLastPage() {\r\n if (!$scope.isDataLoaded) {\r\n return;\r\n }\r\n $scope.pageNumber = $scope.totalPageCount;\r\n reloadList();\r\n }\r\n })\r\n\r\n // Separate service for update events (to prevent multiple event subscription)\r\n .service('stepDetailedControllerUpdatesService', function (rest) {\r\n var _this = this;\r\n var newOrderItemCb;\r\n var orderItemChangedCb;\r\n var orderChangedCb;\r\n\r\n rest.events.on(\"modelCreatedOnServer\", function (modelInfo) {\r\n if (!newOrderItemCb) {\r\n return;\r\n }\r\n if (modelInfo && modelInfo.modelType === \"OrderItemModel\") {\r\n newOrderItemCb(modelInfo);\r\n }\r\n });\r\n\r\n rest.events.on(\"modelUpdatedOnServer\", function (modelInfo) {\r\n if (modelInfo.modelType === \"OrderItemModel\" && orderItemChangedCb) {\r\n orderItemChangedCb(modelInfo);\r\n } else if (modelInfo.modelType === \"OrderModel\" && orderChangedCb) {\r\n orderChangedCb(modelInfo);\r\n }\r\n });\r\n\r\n _this.onNewOrderItem = function (cb) {\r\n newOrderItemCb = cb;\r\n };\r\n\r\n _this.onOrderItemChanged = function (cb) {\r\n orderItemChangedCb = cb;\r\n };\r\n\r\n _this.onOrderChanged = function (cb) {\r\n orderChangedCb = cb;\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;\r\n","angular.module('ui.order.stepDetailedRouteContainer', [])\r\n\r\n .config(function ($stateProvider) {\r\n $stateProvider.state('client.step', {\r\n url: '/orders/:step/details/:orderItemId?',\r\n templateUrl: 'app/ui/order/stepDetailedView/stepDetailedRouteContainer/stepDetailedRouteContainer.html',\r\n data: {pageTitle: 'OrderManager: Item details'},\r\n controller: 'StepDetailedRouteContainerController',\r\n controllerAs: 'StepDetailedRouteContainerController'\r\n });\r\n })\r\n\r\n .controller('StepDetailedRouteContainerController', function ($scope, $stateParams, orderItemsGridSharedSettings) {\r\n orderItemsGridSharedSettings.setStepFilter($stateParams.step);\r\n\r\n //If we have exact order item Id supplied in the url - this means we want to show this exact item exclusively\r\n if ($stateParams.orderItemId) {\r\n var parsedItemId = 0;\r\n try {\r\n parsedItemId = parseInt($stateParams.orderItemId);\r\n } catch (e) {\r\n //Just ignore the Id if it's not a valid number\r\n }\r\n\r\n if (parsedItemId > 0) {\r\n orderItemsGridSharedSettings.setSelectedOrderItemId(parsedItemId, true);\r\n }\r\n }\r\n })\r\n\r\n;\r\n","angular.module('ui.order.orderItemCard.orderReports', [])\r\n\r\n .directive('orderReports', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n templateUrl: 'app/ui/order/orderItemCard/orderReports/orderReports.html',\r\n controller: 'OrderReportsController'\r\n };\r\n })\r\n\r\n .controller('OrderReportsController', function ($scope, $state, $q, $log, toastr, rest, orderItemCardDataProvider, reportManager, $timeout,\r\n orderItemsGridSharedSettings) {\r\n\r\n var oiGridSharedSettings = orderItemsGridSharedSettings;\r\n\r\n orderItemCardDataProvider.onDataChange('OrderReportsController', function () {\r\n initData();\r\n });\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n orderItemCardDataProvider.onDataChange('OrderReportsController', void 0);\r\n });\r\n\r\n function initData() {\r\n var singleOrderReportsListName = \"order-reports\";\r\n $scope.step = $state.params.step ? $state.params.step : 'all-open';\r\n $scope.pageSize = 15;\r\n $scope.reports = null;\r\n $scope.orderItem = orderItemCardDataProvider.getOrderItem();\r\n if (!$scope.orderItem) {\r\n return;\r\n }\r\n $scope.orderItemId = $scope.orderItem.getId();\r\n if (!$scope.orderItemId) {\r\n return;\r\n }\r\n\r\n //Get reports list and render report links\r\n reportManager.getReportListByName(oiGridSharedSettings.getStepFilter(), singleOrderReportsListName, $scope.orderItem)\r\n .then(function (results) {\r\n var reports = [];\r\n _.forEach(results, function (value) {\r\n reports.push({\r\n \"name\": value.name,\r\n \"value\": value\r\n });\r\n });\r\n\r\n $scope.reports = reports;\r\n\r\n }, function (error) {\r\n $log.error(_.string.sprintf(\"Can't initialize report list [%s]: \", singleOrderReportsListName));\r\n if (error && error.message) {\r\n $log.error(error.message);\r\n } else if (error && _.isString(error)) {\r\n $log.error(error);\r\n } else {\r\n $log.error(\"Unknown error\");\r\n }\r\n });\r\n }\r\n\r\n\r\n $scope.showReport = function (reportName) {\r\n\r\n var report = _.find($scope.reports, function (r) {\r\n return r.name == reportName;\r\n }); //get the clicked report configuration\r\n\r\n if (report && !!report.value.requiresSelection && angular.isDefined($scope.orderItemId)) {\r\n //we use the selected item id as a query for the report\r\n reportManager.show({\r\n report: report.value,\r\n query: [$scope.orderItemId],\r\n orderBy: report.value.orderBy,\r\n backAction: function () {\r\n $state.go('client.step', {step: $scope.step});\r\n }\r\n });\r\n }\r\n //do nothing if report requires selection and we don't have an item id\r\n }\r\n })\r\n\r\n;\r\n","angular.module('ui.order.orderItemCard.orderItemInfo', [])\r\n\r\n .directive('orderItemInfo', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n templateUrl: 'app/ui/order/orderItemCard/orderItemInfo/orderItemInfo.html',\r\n controller: 'OrderItemInfoController'\r\n };\r\n })\r\n\r\n .controller('OrderItemInfoController', function ($scope, orderItemCardDataProvider) {\r\n\r\n orderItemCardDataProvider.onDataChange('OrderItemInfoController', function () {\r\n initData();\r\n });\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n orderItemCardDataProvider.onDataChange('OrderItemInfoController', void 0);\r\n });\r\n\r\n function initData() {\r\n $scope.orderItemId = orderItemCardDataProvider.getOrderItemId();\r\n\r\n if (!$scope.orderItemId) {\r\n $scope.orderItem = null;\r\n $scope.step = null;\r\n $scope.order = null;\r\n $scope.categories = null;\r\n $scope.orderItemCategories = null;\r\n $scope.categoryTypes = null;\r\n } else {\r\n $scope.orderItem = orderItemCardDataProvider.getOrderItem();\r\n $scope.step = orderItemCardDataProvider.getStep();\r\n $scope.order = orderItemCardDataProvider.getOrder();\r\n $scope.categories = orderItemCardDataProvider.getCategories();\r\n $scope.orderItemCategories = orderItemCardDataProvider.getOrderItemCategories();\r\n $scope.categoryTypes = orderItemCardDataProvider.getCategoryTypes();\r\n }\r\n }\r\n\r\n })\r\n\r\n;","angular.module('ui.order.orderItemCard.orderItemComments', [\r\n 'ui.order.orderItemCard.orderItemComments.commentRow',\r\n 'ui.order.orderItemCard.orderItemComments.newComment'\r\n])\r\n\r\n .directive('orderItemComments', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n templateUrl: 'app/ui/order/orderItemCard/orderItemComments/orderItemComments.html',\r\n controller: 'OrderItemCommentsController'\r\n };\r\n })\r\n\r\n .controller('OrderItemCommentsController', function ($scope, $q, $log, toastr, rest, orderItemCardDataProvider,\r\n orderItemCommentsControllerUpdatesService,\r\n usersRepository, ordersRepository) {\r\n $scope.newComment = null;\r\n $scope.sendComment = sendComment;\r\n $scope.isCentreUser = false;\r\n\r\n orderItemCardDataProvider.onDataChange('OrderItemCommentsController', function () {\r\n initData();\r\n });\r\n\r\n orderItemCommentsControllerUpdatesService.onNewComment(function () {\r\n initData();\r\n });\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n orderItemCommentsControllerUpdatesService.onNewComment(void 0);\r\n orderItemCardDataProvider.onDataChange('OrderItemCommentsController', void 0);\r\n });\r\n\r\n function initData() {\r\n $scope.comments = null;\r\n var order = orderItemCardDataProvider.getOrder();\r\n var newOrderId = order ? order.getId() : null;\r\n if (newOrderId !== $scope.orderId) {\r\n clearNewComment(); // clear text of new comment only if orderId was changed\r\n }\r\n $scope.orderId = newOrderId;\r\n if (!$scope.orderId) {\r\n return;\r\n }\r\n\r\n $q.all([\r\n usersRepository.getCurrentUser(),\r\n ordersRepository.getComments($scope.orderId)\r\n ])\r\n .then(\r\n function (data) {\r\n var currentUser = data[0];\r\n var comments = data[1];\r\n $scope.isCentreUser = currentUser.isCentre();\r\n $scope.comments = $scope.orderId ? comments : null;\r\n },\r\n function (error) {\r\n $scope.comments = null;\r\n $log.error(\"Can't load comments for order `%s`. Cause: %s\", $scope.orderId, error.message);\r\n toastr.error(error.message, \"Can't load comments\");\r\n });\r\n }\r\n\r\n /**\r\n * Send new comment\r\n */\r\n function sendComment() {\r\n if (!$scope.orderId || !$scope.newComment) {\r\n return; // error or nothing to show\r\n }\r\n var newCommentModel = rest.newModel('CommentModel', _.clone($scope.newComment));\r\n $scope.newComment = null;\r\n\r\n ordersRepository.saveComment($scope.orderId, newCommentModel)\r\n .then(function () {\r\n clearNewComment();\r\n initData();\r\n }, function (error) {\r\n $log.error(\"Can't add new comment for order `%s`. Cause: %s\", $scope.orderId, error.message);\r\n toastr.error(error.message, \"Can't add comment\");\r\n });\r\n }\r\n\r\n function clearNewComment() {\r\n $scope.newComment = {\r\n text: '',\r\n customerVisible: false\r\n };\r\n }\r\n })\r\n\r\n // Separate service for update events (to prevent multiple event subscription)\r\n .service('orderItemCommentsControllerUpdatesService', function (rest) {\r\n var _this = this;\r\n var callback;\r\n\r\n rest.events.on(\"modelCreatedOnServer\", function (modelInfo) {\r\n if (!callback) {\r\n return;\r\n }\r\n if (modelInfo && modelInfo.modelType === \"CommentModel\") {\r\n callback(modelInfo);\r\n }\r\n });\r\n\r\n _this.onNewComment = function (cb) {\r\n callback = cb;\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;","angular.module('ui.order.orderItemCard.orderItemFiles', [\r\n 'ui.order.orderItemCard.orderItemFiles.fileUpload',\r\n 'ui.order.orderItemCard.orderItemFiles.dataSizeFilter',\r\n 'ui.order.orderItemCard.orderItemFiles.checkDuplicatesService'\r\n])\r\n\r\n .directive('orderItemFiles', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {},\r\n templateUrl: 'app/ui/order/orderItemCard/orderItemFiles/orderItemFiles.html',\r\n controller: 'OrderItemFilesController'\r\n };\r\n })\r\n\r\n .controller('OrderItemFilesController', function ($scope, toastr, $document,\r\n orderItemsRepository, authService,\r\n checkDuplicatesService, filesControllerUpdatesService,\r\n orderItemCardDataProvider, $http, $log) {\r\n $scope.baseUrl = om.config.build.baseUrl;\r\n\r\n $scope.currentPage = 0;\r\n $scope.pageSize = 15;\r\n\r\n $scope.loadingDocuments = false;\r\n $scope.validate = validate;\r\n $scope.getDocument = getDocument;\r\n $scope.numberOfPages = numberOfPages;\r\n $scope.someFileUploaded = someFileUploaded;\r\n $scope.documentsCount = 3; //Just for default 'loading templates' view\r\n\r\n $scope.nextPage = function () { $scope.currentPage++; }\r\n $scope.prevPage = function () { $scope.currentPage--; }\r\n\r\n checkDuplicatesService.getAlreadyUploadedFiles = function () {\r\n return $scope.documents;\r\n };\r\n\r\n filesControllerUpdatesService.onNewDocument(function () {\r\n $scope.$applyAsync(function () {\r\n refreshDocList();\r\n });\r\n });\r\n\r\n orderItemCardDataProvider.onDataChange('OrderItemFilesController', function () {\r\n if ($scope.orderItemId === orderItemCardDataProvider.getOrderItemId()) {\r\n return;\r\n }\r\n $scope.$applyAsync(function () {\r\n $scope.orderItemId = orderItemCardDataProvider.getOrderItemId();\r\n\r\n refreshDocList();\r\n });\r\n });\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n filesControllerUpdatesService.onNewDocument(void 0);\r\n orderItemCardDataProvider.onDataChange('OrderItemFilesController', void 0);\r\n });\r\n\r\n initController();\r\n\r\n function initController() {\r\n refreshDocList();\r\n }\r\n\r\n function numberOfPages() {\r\n var length = $scope.documents ? $scope.documents.length : 0;\r\n return Math.ceil(length / $scope.pageSize);\r\n }\r\n\r\n function getDocument(documentId) {\r\n\r\n var form = document.createElement(\"form\");\r\n form.method = \"POST\";\r\n form.action = om.config.build.baseUrl + \"/documents/\" + documentId + \"/download\";\r\n form.setAttribute(\"style\", \"display:none\");\r\n\r\n var input = document.createElement(\"input\");\r\n input.setAttribute(\"name\", \"Authorization\");\r\n input.setAttribute(\"value\", authService.getToken());\r\n form.appendChild(input);\r\n form.submit();\r\n }\r\n\r\n function someFileUploaded() {\r\n refreshDocList();\r\n }\r\n\r\n function validate() {\r\n return true;\r\n }\r\n\r\n function refreshDocList() {\r\n $scope.currentPage = 0;\r\n var orderItem = orderItemCardDataProvider.getOrderItem();\r\n\r\n if (!orderItem) {\r\n $scope.documents = null;\r\n return $scope.documents;\r\n }\r\n\r\n $scope.loadingDocuments = true;\r\n\r\n if (orderItem.$model.documents) {\r\n //init the count for 'loading templates' right away while we updating documents info by loading from server\r\n $scope.documentsCount = orderItem.$model.documents.length;\r\n\r\n //Looks like we are safe to show documents that we have and then just explicitly update them just in case\r\n //But we should be ok in most cases to show them rightaway as we have them loaded on the models as sub resources already\r\n $scope.documents = orderItem.$model.documents;\r\n }\r\n\r\n //Explicitly refresh documents from server here (makes it fail proof if somebody made documents custom fields to be lazy loaded)\r\n return orderItemsRepository.getDocuments(orderItem)\r\n .then(\r\n function (documents) {\r\n $scope.currentPage = 0;\r\n $scope.loadingDocuments = false;\r\n $scope.documents = documents;\r\n $scope.documentsCount = documents.length;\r\n return documents;\r\n },\r\n function (error) {\r\n $scope.currentPage = 0;\r\n $scope.loadingDocuments = false;\r\n toastr.error(error.message, \"Can't load documents\");\r\n $log.error(\"Can't load documents of orderItem `%s`. Cause: %s\", $scope.orderItemId, error.message);\r\n });\r\n }\r\n })\r\n\r\n // Separate service for update events (to prevent multiple event subscription)\r\n .service('filesControllerUpdatesService', function (rest) {\r\n var _this = this;\r\n var callback;\r\n\r\n rest.events.on(\"modelCreatedOnServer\", function (modelInfo) {\r\n if (!callback) {\r\n return;\r\n }\r\n if (modelInfo && modelInfo.modelType == \"DocumentModel\") {\r\n callback(modelInfo);\r\n }\r\n });\r\n\r\n _this.onNewDocument = function (cb) {\r\n callback = cb;\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n .filter('startFrom', function () {\r\n return function (input, start) {\r\n if (!input || !input.length) {\r\n return;\r\n }\r\n start = +start; //parse to int\r\n return input.slice(start);\r\n }\r\n })\r\n\r\n;\r\n","angular.module('ui.order.orderItemCard.orderItemFiles.dataSizeFilter', [])\r\n\r\n .filter('dataSize', function ($filter) {\r\n return function (input, fractionSize) {\r\n if (typeof fractionSize == 'undefined') fractionSize = 1;\r\n if (!input) input = 0;\r\n var out = input;\r\n\r\n var suffix = 'B';\r\n var kilo = 1 << 10;\r\n var mega = 1 << 20;\r\n var giga = 1 << 30;\r\n var tera = Math.pow(2, 40);\r\n if (out >= tera) {\r\n out = out / tera;\r\n suffix = 'TB';\r\n } else if (out >= giga) {\r\n out = out / giga;\r\n suffix = 'GB';\r\n } else if (out >= mega) {\r\n out = out / mega;\r\n suffix = 'MB';\r\n } else if (out >= kilo) {\r\n out = out / kilo;\r\n suffix = 'KB';\r\n } else {\r\n fractionSize = 0;\r\n }\r\n var filtered = $filter('number')(out, fractionSize);\r\n return filtered + suffix;\r\n };\r\n })\r\n\r\n;\r\n","angular.module('ui.order.orderItemCard.orderItemFiles.checkDuplicatesService', [])\r\n\r\n .service('checkDuplicatesService', function () {\r\n var result;\r\n var _this = this;\r\n\r\n //_this.checkConflicts = function (filesToUpload) {\r\n // _this.notConflicted=[];\r\n // _this.conflicted=[];\r\n // var uploadedFiles = _this.getAlreadyUploadedFiles();\r\n // if (uploadedFiles) {\r\n // angular.forEach(filesToUpload, function (value, key) {\r\n // var res = _.find(uploadedFiles, function (element, key) {\r\n // return value.name == element.$model.fileName ;\r\n // });\r\n // if(!res) _this.notConflicted.push(value);\r\n // if(res) _this.conflicted.push(value);\r\n // });\r\n // } else {\r\n // toastr.error(null, gettextCatalog.getString(\"Can't get a list of uploaded files\"));\r\n // }\r\n //};\r\n _this.file;\r\n _this.isDuplicate = function (name) {\r\n var uploadedFiles = _this.getAlreadyUploadedFiles();\r\n if (uploadedFiles) {\r\n var res = _.find(uploadedFiles, function (element, key) {\r\n return name == element.$model.fileName;\r\n });\r\n if (res) return res.$model.id;\r\n } else {\r\n toastr.error(null, gettextCatalog.getString(\"Can't get a list of uploaded files\"));\r\n }\r\n };\r\n _this.generateNewName = function (name) {\r\n var onlyName = name.substring(0, name.lastIndexOf(\".\"));\r\n var extension = name.substring(name.lastIndexOf(\".\"), name.length);\r\n for (var i = 1; true; i++) {\r\n var tryName = onlyName + \" (\" + i + \")\" + extension;\r\n if (!_this.isDuplicate(tryName)) return tryName;\r\n }\r\n };\r\n //_this.handlePause = function(pauseDeferred){\r\n // _this.pauseDeferred = pauseDeferred;\r\n //};\r\n\r\n\r\n function findAndIncrement(uploadedFiles, filesToUpload) {\r\n //angular.forEach(filesToUpload, function (value, key) {\r\n //\r\n // var found = _.find(uploadedFiles, function (element, key) {\r\n // return value.name == element.$model.fileName\r\n // });\r\n // var i = 1;\r\n // var indexOfFound = uploadedFiles.indexOf(found);\r\n // do {\r\n //\r\n // found.$model.fileName = changeName(found.$model.fileName, i);\r\n // i++;\r\n // }\r\n // while (found);\r\n // if (found) {\r\n //\r\n // }\r\n //\r\n //});\r\n }\r\n\r\n //_this.getNotConflicted = function (filesToUpload) {\r\n // _this.notConflicted=[];\r\n // _this.conflicted=[];\r\n // var uploadedFiles = _this.getAlreadyUploadedFiles();\r\n // if (uploadedFiles) {\r\n // angular.forEach(filesToUpload, function (value, key) {\r\n // var res = _.find(uploadedFiles, function (element, key) {\r\n // return value.name == element.$model.fileName ;\r\n // });\r\n // if(!res) _this.notConflicted.push(value);\r\n // if(res) _this.conflicted.push(value);\r\n // });\r\n // } else {\r\n // toastr.error(null, gettextCatalog.getString(\"Can't get a list of uploaded files\"));\r\n // }\r\n // return _this.notConflicted;\r\n //};\r\n //_this.getConflicted = function(filesToUpload){\r\n //\r\n // _this.conflicted=[];\r\n // var uploadedFiles = _this.getAlreadyUploadedFiles();\r\n // if (uploadedFiles) {\r\n // angular.forEach(filesToUpload, function (value, key) {\r\n // var res = _.find(uploadedFiles, function (element, key) {\r\n // return value.name == element.$model.fileName ;\r\n // });\r\n // if(res) _this.conflicted.push(value);\r\n // });\r\n // } else {\r\n // toastr.error(null, gettextCatalog.getString(\"Can't get a list of uploaded files\"));\r\n // }\r\n //};\r\n function changeName(name, i) {\r\n var lastIndex = name.lastIndexOf(\".\");\r\n name = name.substring(0, 8) + \"(\" + i + \")\" + name.substring(9);\r\n }\r\n\r\n return _this;\r\n });","angular.module('ui.order.orderItemCard.orderItemGridActions', [])\r\n\r\n .directive('orderItemGridActions', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n executeAction: \"&executeAction\"\r\n },\r\n templateUrl: 'app/ui/order/orderItemCard/orderItemActions/orderItemActions.html',\r\n controller: 'OrderItemGridActionsController'\r\n };\r\n })\r\n\r\n .controller('OrderItemGridActionsController', function ($timeout, $scope, toastr, $log, $q, $customisationConfig, usersRepository,\r\n workflowRepository, orderItemsGridSharedSettings, permissions, gettextCatalog,\r\n focusManagementService, customResourceResolver, orderItemsRepository) {\r\n\r\n $scope.onExecuteActionButtonClick = onExecuteActionButtonClick;\r\n $scope.isActionButtonEnabled = isActionButtonEnabled;\r\n\r\n orderItemsGridSharedSettings.onSelectionChange('OrderItemGridActionsController', function () {\r\n initData();\r\n });\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n orderItemsGridSharedSettings.onSelectionChange('OrderItemGridActionsController', void 0);\r\n });\r\n\r\n function transformColor(colorToTransform) {\r\n var defaultColor = \"#8F9499\";\r\n switch (colorToTransform) {\r\n case \"red\":\r\n return \"#EC8678\";\r\n case \"green\":\r\n return \"#77DA95\";\r\n case \"yellow\":\r\n return \"#EBE176\";\r\n case \"violet\":\r\n return \"#AC83E1\";\r\n case \"orange\":\r\n return \"#E8B470\";\r\n case \"blue\":\r\n return \"#7BB0DE\";\r\n case \"grey\":\r\n return defaultColor;\r\n default:\r\n return defaultColor;\r\n }\r\n }\r\n\r\n function initData() {\r\n var defaultColor = \"#8F9499\";\r\n var selectedItemIds = orderItemsGridSharedSettings.getSelectedOrderItemIds();\r\n if (!selectedItemIds || selectedItemIds.length === 0) {\r\n $scope.actions = [];\r\n return;\r\n }\r\n var getOrderItemsPromises = _.map(selectedItemIds, function(id) { return orderItemsRepository.getOrderItem(id);});\r\n\r\n $q.all(getOrderItemsPromises).then(function(itemsResult) {\r\n $scope.orderItems = itemsResult;\r\n\r\n $q.all(\r\n [\r\n usersRepository.getCurrentUser(),\r\n workflowRepository.getSteps(),\r\n customResourceResolver.resolveWorkflow()\r\n ])\r\n .then(function (data) {\r\n var restUser = data[0];\r\n var steps = data[1];\r\n $scope.workflowConfig = data[2];\r\n $scope.orderItem = $scope.orderItems.length > 0 ? $scope.orderItems[0] : null;\r\n $scope.step = $scope.orderItem.$model.stepCode;\r\n var actionsConfig = $scope.workflowConfig.actions;\r\n\r\n var currentStep = _.find(steps, function (result) {\r\n return result.$model.code === $scope.step;\r\n });\r\n var isCustomer = restUser.isCustomer();\r\n var fallbackIconForAction = function (actionCode) {\r\n return $customisationConfig.hasResource(function (res) {\r\n return _.string.contains(res, actionCode + \".\");\r\n }) ? actionCode : \"workflow\";\r\n };\r\n var actions = [];\r\n workflowRepository.getActionsForStep(currentStep.$model.code)\r\n .then(function (actionsFromApi) {\r\n var promises = [];\r\n _.forEach(actionsFromApi, function (value) {\r\n var promise = permissions.isActionAllowed(currentStep.$model.id, value.$model.id)\r\n .then(function (isAllowed) {\r\n if (!isAllowed) {\r\n return;\r\n }\r\n var actionConfig = _.find(actionsConfig, function (result) {\r\n return result.code === value.$model.code;\r\n });\r\n if (actionConfig && actionConfig.ignore) {\r\n return; //Ignore the action if configured so in workflow config\r\n }\r\n\r\n actions.push({\r\n code: value.$model.code,\r\n name: value.$model.nameResource,\r\n color: angular.isDefined(actionConfig) && angular.isDefined(actionConfig.color) ? transformColor(actionConfig.color) : defaultColor,\r\n uiPriority: angular.isDefined(actionConfig) && angular.isDefined(actionConfig.uiPriority) ? actionConfig.uiPriority : Infinity,\r\n iconName: angular.isUndefined(actionConfig) ? fallbackIconForAction(value.$model.code) : (angular.isDefined(actionConfig.publicImageResourceName) && isCustomer\r\n ? actionConfig.publicImageResourceName : (angular.isDefined(actionConfig.imageResourceName) ? actionConfig.imageResourceName : fallbackIconForAction(value.$model.code)))\r\n });\r\n });\r\n promises.push(promise);\r\n });\r\n if (promises.length > 0) {\r\n return $q.all(promises);\r\n }\r\n\r\n return $q.when(null);\r\n })\r\n .then(function () {\r\n $scope.actions = _.clone(actions);\r\n focusManagementService.setFocus();\r\n }, function (err) {\r\n $scope.actions = [];\r\n $log.error(\"Can't init actions list for orderItem: %s. Cause: %s.\", $scope.orderItem ? $scope.orderItem.getId() : undefined, err.message);\r\n toastr.error(err.message, gettextCatalog.getString(\"Can't initialize actions list\"));\r\n });\r\n });\r\n });\r\n }\r\n\r\n function onExecuteActionButtonClick(actionCode) {\r\n $scope.executeAction({actionCode: actionCode});\r\n }\r\n\r\n function isActionButtonEnabled(actionCode) {\r\n if (!$scope.orderItem && !$scope.orderItems) {\r\n return false; //Do not allow to click button if we have no order item at all. Nothing to perform action on\r\n }\r\n var actionsConfig = $scope.workflowConfig.actions;\r\n\r\n if (actionsConfig) {\r\n var actionConfig = _.find(actionsConfig, function (result) {\r\n return result.code === actionCode;\r\n });\r\n if (!angular.isDefined(actionConfig) || !angular.isDefined(actionConfig.isAllowed)) {\r\n return true; //We have no validation checks configured for Action - meaning - always allowed\r\n }\r\n try {\r\n if ($scope.orderItems) {\r\n //try to validate if action allowed for each of the selected items\r\n var result = true;\r\n _.each($scope.orderItems, function(oi) {\r\n result &= actionConfig.isAllowed(oi);\r\n });\r\n return result;\r\n }\r\n return true;\r\n } catch (err) {\r\n $log.error(\"Can't validate action [%s] allowance for orderItem: %s. Cause: %s.\",\r\n actionCode, $scope.orderItem ? $scope.orderItem.getId() : undefined, err.message);\r\n return true; //if failed - allow the button to be clicked. probably the validation check has an error inside\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n })\r\n\r\n;\r\n","angular.module('ui.order.orderItemCard.orderItemActions', [])\r\n\r\n .directive('orderItemActions', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n executeAction: \"&executeAction\",\r\n grabFocus: \"&grabFocus\"\r\n },\r\n templateUrl: 'app/ui/order/orderItemCard/orderItemActions/orderItemActions.html',\r\n controller: 'OrderItemActionsController'\r\n };\r\n })\r\n\r\n .controller('OrderItemActionsController', function ($timeout, $scope, toastr, $log, $q, $customisationConfig, usersRepository,\r\n workflowRepository, orderItemCardDataProvider, permissions, gettextCatalog,\r\n customResourceResolver, barcodeScannerListenerService) {\r\n\r\n var barcodeScannerUnsubscribe = barcodeScannerListenerService.events.on('valueScanned', checkBarcode);\r\n\r\n $scope.onExecuteActionButtonClick = onExecuteActionButtonClick;\r\n $scope.isActionButtonEnabled = isActionButtonEnabled;\r\n\r\n orderItemCardDataProvider.onDataChange('OrderItemActionsController', function () {\r\n initData();\r\n });\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n orderItemCardDataProvider.onDataChange('OrderItemActionsController', void 0);\r\n barcodeScannerUnsubscribe();\r\n });\r\n\r\n function transformColor(colorToTransform) {\r\n var defaultColor = \"#8F9499\";\r\n switch (colorToTransform) {\r\n case \"red\":\r\n return \"#EC8678\";\r\n case \"green\":\r\n return \"#77DA95\";\r\n case \"yellow\":\r\n return \"#EBE176\";\r\n case \"violet\":\r\n return \"#AC83E1\";\r\n case \"orange\":\r\n return \"#E8B470\";\r\n case \"blue\":\r\n return \"#7BB0DE\";\r\n case \"grey\":\r\n return defaultColor;\r\n default:\r\n return defaultColor;\r\n }\r\n }\r\n\r\n function initData() {\r\n var defaultColor = \"#8F9499\";\r\n\r\n $scope.orderItem = orderItemCardDataProvider.getOrderItem();\r\n if (!$scope.orderItem) {\r\n return;\r\n }\r\n $scope.step = $scope.orderItem.$model.stepCode;\r\n\r\n $q.all(\r\n [\r\n usersRepository.getCurrentUser(),\r\n workflowRepository.getSteps(),\r\n customResourceResolver.resolveWorkflow()\r\n ])\r\n .then(function (data) {\r\n var restUser = data[0];\r\n var steps = data[1];\r\n $scope.workflowConfig = data[2];\r\n var actionsConfig = $scope.workflowConfig.actions;\r\n\r\n var currentStep = _.find(steps, function (result) {\r\n return result.$model.code == $scope.step;\r\n });\r\n var isCustomer = restUser.isCustomer();\r\n var fallbackIconForAction = function (actionCode) {\r\n return $customisationConfig.hasResource(function (res) {\r\n return _.string.contains(res, actionCode + \".\");\r\n }) ? actionCode : \"workflow\";\r\n };\r\n var actions = [];\r\n workflowRepository.getActionsForStep(currentStep.$model.code)\r\n .then(function (actionsFromApi) {\r\n var promises = [];\r\n _.forEach(actionsFromApi, function (value) {\r\n var promise = permissions.isActionAllowed(currentStep.$model.id, value.$model.id)\r\n .then(function (isAllowed) {\r\n if (!isAllowed) {\r\n return;\r\n }\r\n var actionConfig = _.find(actionsConfig, function (result) {\r\n return result.code == value.$model.code;\r\n });\r\n if (actionConfig && actionConfig.ignore) {\r\n return; //Ignore the action if configured so in workflow config\r\n }\r\n\r\n actions.push({\r\n code: value.$model.code,\r\n name: value.$model.nameResource,\r\n color: angular.isDefined(actionConfig) && angular.isDefined(actionConfig.color)\r\n ? transformColor(actionConfig.color)\r\n : defaultColor,\r\n uiPriority: angular.isDefined(actionConfig) && angular.isDefined(actionConfig.uiPriority)\r\n ? actionConfig.uiPriority\r\n : Infinity,\r\n iconName: angular.isUndefined(actionConfig)\r\n ? fallbackIconForAction(value.$model.code)\r\n :\r\n (angular.isDefined(actionConfig.publicImageResourceName) && isCustomer\r\n ? actionConfig.publicImageResourceName\r\n : (angular.isDefined(actionConfig.imageResourceName)\r\n ? actionConfig.imageResourceName\r\n : fallbackIconForAction(value.$model.code)))\r\n });\r\n });\r\n promises.push(promise);\r\n });\r\n if (promises.length > 0) {\r\n return $q.all(promises);\r\n }\r\n })\r\n .then(function () {\r\n $scope.actions = _.clone(actions);\r\n }, function (err) {\r\n $scope.actions = [];\r\n $log.error(\"Can't init actions list for orderItem: %s. Cause: %s.\", $scope.orderItem\r\n ? $scope.orderItem.getId()\r\n : undefined, err.message);\r\n toastr.error(err.message, gettextCatalog.getString(\"Can't initialize actions list\"));\r\n });\r\n });\r\n }\r\n\r\n function onExecuteActionButtonClick(actionCode) {\r\n $scope.executeAction({actionCode: actionCode});\r\n }\r\n\r\n function isActionButtonEnabled(actionCode) {\r\n if (!$scope.orderItem) {\r\n return false; //Do not allow to click button if we have no order item at all. Nothing to perform action on\r\n }\r\n var actionsConfig = $scope.workflowConfig.actions;\r\n if (actionsConfig) {\r\n var actionConfig = _.find(actionsConfig, function (result) {\r\n return result.code === actionCode;\r\n });\r\n if (!angular.isDefined(actionConfig) || !angular.isDefined(actionConfig.isAllowed)) {\r\n return true; //We have no validation checks configured for Action - meaning - always allowed\r\n }\r\n try {\r\n return actionConfig.isAllowed($scope.orderItem); //try to validate if action allowed\r\n } catch (err) {\r\n $log.error(\"Can't validate action [%s] allowance for orderItem: %s. Cause: %s.\",\r\n actionCode, $scope.orderItem ? $scope.orderItem.getId() : undefined, err.message);\r\n return true; //if failed - allow the button to be clicked. probably the validation check has an error inside\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n //region Barcode stuff\r\n\r\n function checkBarcode(e) {\r\n\r\n if (e.value.length > 0) {\r\n //See if we have a match of the Action\r\n if ($scope.actions && $scope.actions.length > 0) {\r\n for (var i = 0; i < $scope.actions.length; i++) {\r\n var actionCode = $scope.actions[i].code;\r\n if (e.value.endsWith(actionCode)) {\r\n onExecuteActionButtonClick(actionCode);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (e.value.length > 0 && $scope.orderItem &&\r\n (e.value == $scope.orderItem.$model.id || e.value == $scope.orderItem.$model.order.$model.id)) {\r\n //Else see if we have an ID scanned once again to indicate\r\n //that we need to execute customised action against that particular order item\r\n customResourceResolver\r\n .resolveConfig(\"order-item-card-barcode-scanner-custom-action\", null, {orderItem: $scope.orderItem})\r\n .then(function (customAction) {\r\n if (customAction) {\r\n customAction();\r\n }\r\n });\r\n }\r\n }\r\n }\r\n\r\n //endregion\r\n })\r\n\r\n;\r\n","(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('ui.order.newOrderRouteContainer', [])\r\n\r\n .config(function ($stateProvider) {\r\n\r\n $stateProvider.state('client.new-order', {\r\n url: '/new', // ?protoOrderId&protoOrderItemId\r\n templateUrl: 'app/ui/order/newOrderView/newOrderRouteContainer/newOrderRouteContainer.html',\r\n data: {pageTitle: 'OrderManager: New Order'},\r\n controller: 'NewOrderRouteContainerController',\r\n controllerAs: 'NewOrderRouteContainerController'\r\n });\r\n\r\n })\r\n\r\n .controller('NewOrderRouteContainerController', function () {\r\n // $scope.protoOrderId = $stateParams.protoOrderId;\r\n // $scope.protoOrderItemId = $stateParams.protoOrderItemId;\r\n })\r\n ;\r\n})(window.angular);\r\n","(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('ui.order.newOrder.progressService', [])\r\n\r\n .service('newOrderProgressService', function () {\r\n var _this = this;\r\n\r\n angular.extend(_this, {\r\n init: init,\r\n getProgress: getProgress,\r\n setFileProgress: setFileProgress\r\n });\r\n\r\n var _filesSize = 0;\r\n var _progressItems = [];\r\n\r\n return _this;\r\n\r\n function init(filesSize) {\r\n _filesSize = filesSize;\r\n _progressItems = [];\r\n }\r\n\r\n function getProgress() {\r\n var uploadedSize = 0;\r\n angular.forEach(_progressItems, function (progressItem) {\r\n uploadedSize += progressItem.file.size * (progressItem.progress / 100);\r\n })\r\n return Math.round((uploadedSize / _filesSize) * 100);\r\n }\r\n\r\n function setFileProgress(file, progress, sessionId) {\r\n var itemFound = _.find(_progressItems, function (item) {\r\n return (item.file.name === file.name) && (item.sessionId === sessionId);\r\n });\r\n\r\n if (itemFound) {\r\n itemFound.progress = progress;\r\n } else {\r\n _progressItems.push(new fileProgressItem(file, progress, sessionId));\r\n }\r\n }\r\n\r\n function fileProgressItem(file, progress, sessionId) {\r\n var _this = this;\r\n\r\n _this.file = file;\r\n _this.progress = progress;\r\n _this.sessionId = sessionId;\r\n }\r\n })\r\n ;\r\n})(window.angular);\r\n","(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('ui.order.newOrder.listService', [])\r\n .factory('newOrderListService', NewOrderListService);\r\n\r\n function NewOrderListService() {\r\n return {\r\n getListOptions: getListOptions,\r\n updateList: updateList\r\n };\r\n\r\n function getListOptions(getListFunc, template, dataValueField) {\r\n var dataSource = new kendo.data.DataSource({\r\n serverFiltering: true,\r\n transport: {\r\n read: read\r\n }\r\n });\r\n\r\n return {\r\n filter: \"contains\",\r\n dataValueField: dataValueField,\r\n valueTemplate: template,\r\n template: template,\r\n dataSource: dataSource\r\n };\r\n\r\n function read(options) {\r\n var filter = _.getPath(options, \"data.filter.filters.0.value\");\r\n if (filter) {\r\n var filteredItems = _.deepFilterByStr(getListFunc() || [], filter);\r\n options.success(filteredItems);\r\n } else {\r\n options.success((getListFunc() || []).slice());\r\n }\r\n }\r\n }\r\n\r\n function updateList(list) {\r\n if (list && list.dataSource && list.dataSource.read) {\r\n list.dataSource.read();\r\n }\r\n }\r\n }\r\n\r\n})(window.angular);\r\n","(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('ui.order.newOrder.dataService', [])\r\n\r\n .service('newOrderDataService', function ($q, customResourceResolver, usersRepository) {\r\n\r\n angular.extend(this, {\r\n init: init,\r\n destroy: destroy,\r\n setDataProperty: setDataProperty\r\n });\r\n\r\n var _this = this;\r\n\r\n _this.currentUser = null;\r\n _this.newOrderConfig = null;\r\n _this.newOrderTypesConfig = null;\r\n _this.orderCreationAction = \"\";\r\n\r\n return _this;\r\n\r\n function init() {\r\n return $q.all([\r\n initCurrentUser(),\r\n initWorkflowConfig(),\r\n initNewOrderConfig(),\r\n initNewOrderTypesConfig()\r\n ]);\r\n }\r\n\r\n function destroy() {\r\n }\r\n\r\n function initCurrentUser() {\r\n return usersRepository.getCurrentUser()\r\n .then(function (currentUser) {\r\n _this.currentUser = currentUser;\r\n });\r\n }\r\n\r\n function initWorkflowConfig() {\r\n return customResourceResolver.resolveWorkflow()\r\n .then(function (workflowConfig) {\r\n _this.orderCreationAction = workflowConfig.orderCreationAction;\r\n });\r\n }\r\n\r\n function initNewOrderConfig() {\r\n return customResourceResolver.resolveNewOrder()\r\n .then(function (newOrderConfig) {\r\n _this.newOrderConfig = newOrderConfig;\r\n });\r\n }\r\n\r\n function initNewOrderTypesConfig() {\r\n return customResourceResolver.resolveNewOrderTypes()\r\n .then(function (newOrderTypesConfig) {\r\n _this.newOrderTypesConfig = newOrderTypesConfig;\r\n });\r\n }\r\n\r\n function setDataProperty(currentId, property, options) {\r\n if (currentId && property && options) {\r\n property[\"@selectedOption\"] = _.find(options, function (item) {\r\n return currentId === item.id\r\n }).title;\r\n property[\"#text\"] = currentId;\r\n }\r\n }\r\n });\r\n})(window.angular);\r\n","(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('ui.order.newOrder.createService', [])\r\n\r\n .service('newOrderCreateService', function ($q, fileService, newOrderDataService, newOrderProgressService,\r\n addressesRepository, customersRepository, ordersRepository) {\r\n\r\n angular.extend(this, {\r\n init: init,\r\n destroy: destroy,\r\n createOrder: createOrderChain\r\n });\r\n\r\n var _this = this;\r\n\r\n var _orderVm = {};\r\n var _orderItemsVms = [];\r\n var _deliveryAddress = null;\r\n var _outerProgressCallback = undefined;\r\n var _newOrderId = 0;\r\n\r\n return _this;\r\n\r\n function createOrderChain(orderVm, deliveryAddress, orderItemsVms, progressCallback) {\r\n\r\n _orderVm = orderVm;\r\n _orderItemsVms = orderItemsVms;\r\n _deliveryAddress = deliveryAddress;\r\n _outerProgressCallback = progressCallback;\r\n\r\n _newOrderId = 0;\r\n\r\n return orderAddress()\r\n .then(createOrder)\r\n .then(getOrderItems)\r\n .then(uploadAllFiles)\r\n .then(returnOrderId);\r\n }\r\n\r\n function orderAddress() {\r\n if (_deliveryAddress.id) {\r\n return $q.when(_deliveryAddress);\r\n } else {\r\n return addressesRepository.createAddress(_deliveryAddress)\r\n .then(setAsCustomerDeliveryAddress);\r\n }\r\n }\r\n\r\n function setAsCustomerDeliveryAddress(addressModel) {\r\n return customersRepository\r\n .setCustomerDeliveryAddress(_orderVm.customerId, addressModel.$model.id)\r\n .then(function () {\r\n return addressModel.$model;\r\n });\r\n }\r\n\r\n function createOrder(address) {\r\n return ordersRepository.createOrder({\r\n \"order\": _orderVm,\r\n \"items\": _orderItemsVms,\r\n \"address\": address,\r\n \"actionToExecute\": newOrderDataService.orderCreationAction\r\n }).then(function (newOrderId) {\r\n _newOrderId = newOrderId;\r\n return _newOrderId;\r\n });\r\n }\r\n\r\n function getOrderItems(orderId) {\r\n return ordersRepository.getOrderItemsForOrder(orderId);\r\n }\r\n\r\n function uploadAllFiles(orderItems) {\r\n setFilesSize();\r\n\r\n return $q.all(_.map(_orderItemsVms, function (orderItemVm, index) {\r\n return uploadFiles(orderItemVm.files, orderItems[index].$model.id);\r\n }));\r\n }\r\n\r\n function setFilesSize() {\r\n var filesSize = 0;\r\n angular.forEach(_orderItemsVms, function (item) {\r\n angular.forEach(item.files, function (file) {\r\n filesSize += file.size;\r\n });\r\n });\r\n newOrderProgressService.init(filesSize);\r\n }\r\n\r\n function uploadFiles(files, orderItemId) {\r\n var chunkSize = 1000000;\r\n return fileService.uploadFiles(files, chunkSize, 1, 1, undefined, progressCallback, orderItemId, true);\r\n }\r\n\r\n function progressCallback(file, progress, sessionId) {\r\n newOrderProgressService.setFileProgress(file, progress, sessionId);\r\n _outerProgressCallback();\r\n }\r\n\r\n function returnOrderId() {\r\n return _newOrderId;\r\n }\r\n\r\n function init() {\r\n return $q.all([]);\r\n }\r\n\r\n function destroy() {\r\n }\r\n });\r\n})(window.angular);\r\n","(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('ui.order.newOrder.calendarService', [])\r\n\r\n .service('newOrderCalendarService', function ($q, calendarService, centresRepository, customersRepository) {\r\n\r\n angular.extend(this, {\r\n datePickerOptions: datePickerOptions,\r\n areDatesDifferent: areDatesDifferent,\r\n areDatesEqual: areDatesEqual,\r\n twoDatesDifferent: twoDatesDifferent,\r\n twoDatesEqual: twoDatesEqual,\r\n maxDate: maxDate,\r\n destroy: destroy,\r\n init: init\r\n });\r\n\r\n var _this = this;\r\n var _publicHolidays = [];\r\n\r\n return _this;\r\n\r\n function datePickerOptions(customerId) {\r\n return countryCode(customerId)\r\n .then(initPublicHolidays)\r\n .then(datePickerOptionsBase);\r\n }\r\n\r\n function datePickerOptionsBase() {\r\n return {\r\n disableDates: isDateNotAvailable\r\n };\r\n }\r\n\r\n function isDateNotAvailable(date) {\r\n if (!date) return true;\r\n if (isDayInPast(date)) return true;\r\n if (isWeekendDay(date)) return true;\r\n if (isPublicHoliday(date)) return true;\r\n\r\n return false;\r\n }\r\n\r\n function isWeekendDay(date) {\r\n return date.getDay() === 0 || date.getDay() === 6;\r\n }\r\n\r\n function isDayInPast(date) {\r\n var currentDate = new Date();\r\n return dateCode(date) < dateCode(currentDate);\r\n }\r\n\r\n function dateCode(date) {\r\n return date.getFullYear() * 10000 + date.getMonth() * 100 + date.getDate();\r\n }\r\n\r\n function isPublicHoliday(date) {\r\n return _.any(_publicHolidays, function (holiday) {\r\n return twoDatesEqual(holiday, date);\r\n });\r\n }\r\n\r\n function twoDatesEqual(dateOne, dateTwo) {\r\n if (!dateOne && !dateTwo) return true;\r\n if (!dateOne) return false;\r\n if (!dateTwo) return false;\r\n\r\n return dateCode(dateOne) === dateCode(dateTwo);\r\n }\r\n\r\n function twoDatesDifferent(dateOne, dateTwo) {\r\n return !twoDatesEqual(dateOne, dateTwo);\r\n }\r\n\r\n function areDatesEqual(dates) {\r\n if (!dates) return true;\r\n if (dates.length < 2) return true;\r\n\r\n return _.all(dates, function (date) {\r\n return twoDatesEqual(dates[0], date)\r\n });\r\n }\r\n\r\n function areDatesDifferent(dates) {\r\n return !areDatesEqual(dates);\r\n }\r\n\r\n function maxDate(dates) {\r\n return _.max(dates, function (date) {\r\n return dateCode(date);\r\n });\r\n }\r\n\r\n function initPublicHolidays(countryCode) {\r\n _publicHolidays = [];\r\n if (countryCode) {\r\n return calendarService\r\n .getActualPublicHolidays(countryCode)\r\n .then(function (holidays) {\r\n _publicHolidays = holidays || [];\r\n });\r\n }\r\n }\r\n\r\n function countryCode(customerId) {\r\n if (!customerId) return $q.when(\"\");\r\n\r\n return customersRepository\r\n .getCustomer(customerId)\r\n .then(countryCodeFromCustomer);\r\n }\r\n\r\n function countryCodeFromCustomer(customerModel) {\r\n return centresRepository\r\n .getCentre(customerModel.$model.centreId)\r\n .then(countryCodeFromCentre);\r\n }\r\n\r\n function countryCodeFromCentre(centreModel) {\r\n var countryCode = centreModel.$model.address.$model.country || \"\";\r\n if (countryCode) {\r\n countryCode = countryCode.slice(0, 2);\r\n }\r\n\r\n return countryCode;\r\n }\r\n\r\n function init() {\r\n return $q.all([]);\r\n }\r\n\r\n function destroy() {\r\n }\r\n });\r\n})(window.angular);\r\n","(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('ui.order.newOrder.addressService', [])\r\n\r\n .service('newOrderAddressService', function (customersRepository) {\r\n var _this = this;\r\n\r\n angular.extend(_this, {\r\n getAddresses: getAddresses,\r\n addAddress: addAddress,\r\n getCustomerTitle: getCustomerTitle\r\n });\r\n\r\n var _addressComparableFields = [\"companyName\",\r\n \"contactTitle\",\r\n \"contactFirstName\",\r\n \"contactLastName\",\r\n \"email\",\r\n \"telephone\",\r\n \"postalCode\",\r\n \"country\",\r\n \"region\",\r\n \"city\",\r\n \"line1\",\r\n \"line2\"];\r\n\r\n var _titleMaxLength = 80;\r\n\r\n return _this;\r\n\r\n function getAddresses(customerId) {\r\n return customersRepository.getCustomer(customerId)\r\n .then(function (customerModel) {\r\n return customersRepository.getCustomerDeliveryAddresses(customerId)\r\n .then(function (deliveryAddressModels) {\r\n var viewAddresses = _.map(deliveryAddressModels, function (addressModel) {\r\n return toAddress(addressModel, false);\r\n });\r\n viewAddresses.unshift(toAddress(customerModel.$model.address, true));\r\n\r\n return getUniqueAddresses(viewAddresses);\r\n });\r\n });\r\n }\r\n\r\n function addAddress(addresses, address) {\r\n var index = findItemIndex(addresses, address);\r\n if (index === -1) {\r\n updateAddress(address, 0, '#FFEBEE');\r\n addresses.push(address);\r\n } else {\r\n address = addresses[index];\r\n }\r\n\r\n return address.hashCode;\r\n }\r\n\r\n function toAddress(addressModel, isPrimary) {\r\n var address = {};\r\n _.each(_addressComparableFields, function (field) {\r\n address[field] = addressModel.$model[field];\r\n });\r\n updateAddress(address, addressModel.$model.id, isPrimary ? '#E8F5E9' : '#FFF8E1');\r\n\r\n return address;\r\n }\r\n\r\n function updateAddress(address, id, color) {\r\n address.id = id;\r\n address.style = {};\r\n address.style['background-color'] = color;\r\n\r\n setHashCode(address);\r\n setContact(address);\r\n setTitle(address);\r\n setPostal(address);\r\n }\r\n\r\n function setHashCode(address) {\r\n address.hashCode = getHashCode(address);\r\n }\r\n\r\n function setContact(address) {\r\n address.contact = joinModelFields(address, [\"contactTitle\",\r\n \"contactFirstName\",\r\n \"contactLastName\"], \" \");\r\n }\r\n\r\n function setTitle(address) {\r\n address.title = combineTitle(address.contact, address, [\"city\", \"telephone\", \"email\"]);\r\n }\r\n\r\n function setPostal(address) {\r\n address.postal = joinModelFields(address, [\"postalCode\", \"country\", \"region\", \"city\"], \" \");\r\n }\r\n\r\n function getHashCode(address) {\r\n var hashCode = 0;\r\n\r\n var str = JSON.stringify(address);\r\n for (var i = 0; i < str.length; i++) {\r\n hashCode += str.charCodeAt(i) * (i + 1);\r\n }\r\n\r\n hashCode = hashCode * 100000 + address.id;\r\n\r\n return hashCode.toString();\r\n }\r\n\r\n function getUniqueAddresses(addresses) {\r\n return _.filter(addresses, function (item1, index) {\r\n var foundIndex = findItemIndex(addresses, item1);\r\n return index === foundIndex;\r\n });\r\n }\r\n\r\n function findItemIndex(addresses, item) {\r\n return _.findIndex(addresses, function (i) {\r\n return areAddressesEqual(item, i);\r\n });\r\n }\r\n\r\n function areAddressesEqual(address1, address2) {\r\n return _.every(_addressComparableFields, function (field) {\r\n return areStringsEqual(address1[field], address2[field]);\r\n });\r\n }\r\n\r\n function areStringsEqual(str1, str2) {\r\n if (str1 && !str2) return false;\r\n if (!str1 && str2) return false;\r\n if (!str1 && !str2) return true;\r\n\r\n return removeWhitespaces(str1).toLowerCase() === removeWhitespaces(str2).toLowerCase();\r\n }\r\n\r\n function removeWhitespaces(str) {\r\n return str.replace(/\\s+/g, '');\r\n }\r\n\r\n function getCustomerTitle(customer) {\r\n var address = customer.address.$model;\r\n var prefix = address.companyName ? address.companyName : customer.code;\r\n\r\n return combineTitle(prefix, address, [\"country\", \"city\", \"line1\", \"line2\"]);\r\n }\r\n\r\n function combineTitle(prefix, address, fields) {\r\n var title = _.str.sprintf(\"%s [%s\", prefix, joinModelFields(address, fields, \", \"));\r\n\r\n return _.str.sprintf(\"%s]\", _.str.truncate(title, _titleMaxLength));\r\n }\r\n\r\n function joinModelFields(model, fields, delimiter) {\r\n var result = \"\";\r\n _.each(fields, function (field) {\r\n if (model[field]) {\r\n if (result) result += delimiter;\r\n result += model[field];\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n })\r\n ;\r\n})(window.angular);\r\n","(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('ui.order.newOrder.progress', [])\r\n .directive('newOrderProgress', function () {\r\n return {\r\n restrict: \"E\",\r\n templateUrl: 'app/ui/order/newOrderView/newOrderProgress/newOrderProgress.html',\r\n scope: {\r\n progressWnd: \"=wnd\",\r\n progress: \"=\",\r\n title: \"@\"\r\n },\r\n controller: 'NewOrderProgressController'\r\n };\r\n })\r\n\r\n .controller('NewOrderProgressController', function ($scope) {\r\n $scope.progressWndOptions = {\r\n title: $scope.title,\r\n modal: true,\r\n visible: false,\r\n width: \"30%\",\r\n animation: om.config.kendoWindowDefaultOptions.animation\r\n };\r\n\r\n $scope.progressBarOptions = {\r\n animation: false,\r\n max: 100,\r\n min: 0,\r\n type: \"percent\",\r\n width: \"99%\"\r\n }\r\n })\r\n ;\r\n})(window.angular);\r\n","(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('ui.order.newOrder.customerSelector', [])\r\n\r\n .directive('newOrderCustomerSelector', function () {\r\n return {\r\n restrict: \"E\",\r\n templateUrl: 'app/ui/order/newOrderView/newOrderCustomerSelector/newOrderCustomerSelector.html',\r\n scope: {\r\n selectedCustomerId: \"=customerId\",\r\n deliveryAddress: \"=\"\r\n },\r\n controller: 'NewOrderCustomerSelectorController'\r\n };\r\n })\r\n\r\n .controller('NewOrderCustomerSelectorController', function ($scope,\r\n newOrderAddressService, newOrderListService, customersRepository, usersRepository) {\r\n\r\n angular.extend($scope, {\r\n isCustomersListDisabled: isCustomersListDisabled\r\n });\r\n\r\n $scope.customers = [];\r\n\r\n initCustomersListOptions();\r\n initCustomers();\r\n\r\n function initCustomers() {\r\n $scope.customers = [];\r\n usersRepository.getCurrentUser()\r\n .then(function (user) {\r\n if (user.isCentre()) {\r\n customersRepository.getCustomers()\r\n .then(function (customers) {\r\n setCustomers(customers);\r\n });\r\n } else if (user.isCustomer()) {\r\n setCustomers(user.$model.customers);\r\n }\r\n });\r\n }\r\n\r\n function setCustomers(customers) {\r\n $scope.customers = customers || [];\r\n\r\n _.each($scope.customers,\r\n function(customer) {\r\n customer.title = newOrderAddressService.getCustomerTitle(customer.$model);\r\n });\r\n\r\n if ($scope.customers.length === 1) {\r\n $scope.selectedCustomerId = $scope.customers[0].$model.id;\r\n }\r\n\r\n updateCustomersList();\r\n }\r\n\r\n function isCustomersListDisabled() {\r\n var addressEditMode = $scope.selectedCustomerId && !$scope.deliveryAddress;\r\n var lackOfCustomers = $scope.customers.length < 2;\r\n\r\n return addressEditMode || lackOfCustomers;\r\n }\r\n\r\n function initCustomersListOptions() {\r\n var getCustomers = function () {\r\n return $scope.customers;\r\n };\r\n var customerTemplate = \"{{dataItem.title}}\";\r\n $scope.customersListOptions = newOrderListService.getListOptions(getCustomers, customerTemplate, \"$model.id\");\r\n }\r\n\r\n function updateCustomersList() {\r\n var selectedCustomerId = $scope.selectedCustomerId;\r\n newOrderListService.updateList($scope.customersList);\r\n if ($scope.selectedCustomerId !== selectedCustomerId) {\r\n $scope.selectedCustomerId = selectedCustomerId;\r\n }\r\n }\r\n })\r\n ;\r\n})(window.angular);\r\n","(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('ui.order.newOrder.filesLoader', [])\r\n\r\n .directive('newOrderFilesLoader', function () {\r\n return {\r\n restrict: \"E\",\r\n templateUrl: 'app/ui/order/newOrderView/newOrderFilesLoader/newOrderFilesLoader.html',\r\n scope: {\r\n files: \"=\"\r\n },\r\n controller: 'NewOrderFilesLoaderController',\r\n link: function (scope, el, attrs) { // eslint-disable-line no-unused-vars\r\n scope.fileInputElement = el.find(\"#new-order-file-input\");\r\n scope.fileInputElement.on('change', function (e) {\r\n scope.$apply(function () {\r\n scope.filesSelected(e.target.files);\r\n });\r\n scope.fileInputElement.val(\"\");\r\n });\r\n\r\n var fileUploadElement = el.find(\"#new-order-file-upload\");\r\n jQuery.event.props.push('dataTransfer');\r\n fileUploadElement.on(\"dragover\", function () {\r\n fileUploadElement.addClass('drag-hover');\r\n return false;\r\n });\r\n fileUploadElement.on(\"dragleave\", function () {\r\n fileUploadElement.removeClass('drag-hover');\r\n return false;\r\n });\r\n fileUploadElement.on(\"drop\", function (e) {\r\n scope.$apply(function () {\r\n scope.filesSelected(e.dataTransfer.files);\r\n });\r\n e.preventDefault();\r\n fileUploadElement.removeClass('drag-hover');\r\n fileUploadElement.addClass('drag-drop');\r\n });\r\n }\r\n };\r\n })\r\n\r\n .controller('NewOrderFilesLoaderController', function ($scope, uiLocalization) {\r\n angular.extend($scope, {\r\n openFileDialog: openFileDialog,\r\n filesSelected: filesSelected,\r\n onRemoveFileClick: onRemoveFileClick\r\n });\r\n\r\n $scope.files = [];\r\n\r\n function openFileDialog(e) { // eslint-disable-line no-unused-vars\r\n $scope.fileInputElement.click();\r\n }\r\n\r\n function filesSelected(files) {\r\n angular.forEach(files, function (file) {\r\n if (findFileIndex(file) < 0) {\r\n $scope.files.push(file);\r\n }\r\n })\r\n }\r\n\r\n function onRemoveFileClick(file) {\r\n var message = _.str.sprintf(uiLocalization.translate(\"Remove %s\"), file.name);\r\n kendo.confirm(message).done(function () {\r\n removeFile(file);\r\n });\r\n }\r\n\r\n function removeFile(file) {\r\n var fileIndex = findFileIndex(file);\r\n if (fileIndex >= 0) {\r\n $scope.$apply(function () {\r\n $scope.files.splice(fileIndex, 1);\r\n });\r\n }\r\n }\r\n\r\n function findFileIndex(file) {\r\n return _.findIndex($scope.files, function (storedFile) {\r\n return file.name === storedFile.name && file.size === storedFile.size;\r\n });\r\n }\r\n })\r\n ;\r\n})(window.angular);\r\n","(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('ui.order.newOrder.addressSelector', [])\r\n\r\n .directive('newOrderAddressSelector', function () {\r\n return {\r\n restrict: \"E\",\r\n templateUrl: 'app/ui/order/newOrderView/newOrderAddressSelector/newOrderAddressSelector.html',\r\n scope: {\r\n selectedCustomerId: \"=customerId\",\r\n selectedAddress: \"=deliveryAddress\"\r\n },\r\n controller: 'newOrderAddressSelectorController'\r\n };\r\n })\r\n\r\n .controller('newOrderAddressSelectorController', function ($scope, newOrderAddressService, newOrderListService) {\r\n angular.extend($scope, {\r\n onNewButtonClick: onNewButtonClick,\r\n onCancelButtonClick: onCancelButtonClick,\r\n onSaveButtonClick: onSaveButtonClick,\r\n isAddressesListDisabled: isAddressesListDisabled\r\n });\r\n\r\n $scope.addressEditMode = false;\r\n $scope.addresses = [];\r\n\r\n initAddressesListOptions();\r\n\r\n $scope.$watch(\"selectedCustomerId\", onCustomerChange);\r\n $scope.$watch(\"selectedAddressHashCode\", onAddressChange);\r\n\r\n function onCustomerChange() {\r\n initAddresses();\r\n }\r\n\r\n function initAddresses() {\r\n $scope.addresses = [];\r\n\r\n if ($scope.selectedCustomerId) {\r\n newOrderAddressService\r\n .getAddresses($scope.selectedCustomerId)\r\n .then(setAddresses);\r\n }\r\n }\r\n\r\n function onAddressChange() {\r\n $scope.selectedAddress = null;\r\n if ($scope.selectedAddressHashCode) {\r\n $scope.selectedAddress = _.find($scope.addresses, function (address) {\r\n return address.hashCode === $scope.selectedAddressHashCode;\r\n });\r\n if (!$scope.selectedAddress) {\r\n $scope.selectedAddressHashCode = 0;\r\n }\r\n }\r\n }\r\n\r\n function setAddresses(addresses) {\r\n $scope.addresses = addresses;\r\n\r\n if ($scope.addresses.length) {\r\n $scope.selectedAddressHashCode = $scope.addresses[0].hashCode;\r\n }\r\n\r\n updateAddressesList();\r\n }\r\n\r\n function onNewButtonClick() {\r\n $scope.addressEditMode = true;\r\n\r\n $scope.editedAddress = _.clone($scope.selectedAddress);\r\n $scope.selectedAddress = null;\r\n }\r\n\r\n function onSaveButtonClick() {\r\n $scope.selectedAddressHashCode = newOrderAddressService.addAddress($scope.addresses, $scope.editedAddress);\r\n updateAddressesList();\r\n onCancelButtonClick();\r\n }\r\n\r\n function onCancelButtonClick() {\r\n onAddressChange();\r\n $scope.addressEditMode = false;\r\n }\r\n\r\n function isAddressesListDisabled() {\r\n return $scope.addressEditMode || $scope.addresses.length < 2;\r\n }\r\n\r\n function initAddressesListOptions() {\r\n var getAddresses = function () {\r\n return $scope.addresses;\r\n };\r\n var addressTemplate = '{{dataItem.title}}';\r\n $scope.addressesListOptions = newOrderListService.getListOptions(getAddresses, addressTemplate, \"hashCode\");\r\n }\r\n\r\n function updateAddressesList() {\r\n var selectedAddressHashCode = $scope.selectedAddressHashCode;\r\n newOrderListService.updateList($scope.addressesList);\r\n if ($scope.selectedAddressHashCode !== selectedAddressHashCode) {\r\n $scope.selectedAddressHashCode = selectedAddressHashCode;\r\n }\r\n }\r\n })\r\n ;\r\n})(window.angular);\r\n","(function (angular) {\r\n 'use strict';\r\n\r\n angular.module('ui.order.newOrder.addressEditor', [])\r\n\r\n .directive('newOrderAddressEditor', function () {\r\n return {\r\n restrict: \"E\",\r\n templateUrl: 'app/ui/order/newOrderView/newOrderAddressEditor/newOrderAddressEditor.html',\r\n scope: {\r\n address: \"=\",\r\n onSave: \"&\",\r\n onCancel: \"&\"\r\n },\r\n controller: 'newOrderAddressEditorController'\r\n };\r\n })\r\n\r\n .controller('newOrderAddressEditorController', function ($scope, gettextCatalog) {\r\n angular.extend($scope, {\r\n onSaveButtonClick: onSaveButtonClick,\r\n onCancelButtonClick: onCancelButtonClick\r\n });\r\n\r\n $scope.titles = [\r\n gettextCatalog.getString('Mr.'),\r\n gettextCatalog.getString('Ms.'),\r\n gettextCatalog.getString('Mrs.'),\r\n gettextCatalog.getString('Dr.')\r\n ];\r\n\r\n $scope.telephonePattern = \"( *\\\\+)?( *[0-9] *)*(\\\\(( *[0-9] *)+\\\\))?( *[0-9]( *- *[0-9])* *)+\";\r\n\r\n function onSaveButtonClick() {\r\n if ($scope.addressEditorValidator.validate()) {\r\n $scope.onSave();\r\n }\r\n }\r\n\r\n function onCancelButtonClick() {\r\n $scope.addressEditorValidator.hideMessages();\r\n $scope.onCancel();\r\n }\r\n })\r\n ;\r\n})(window.angular);\r\n","angular.module('ui.order.orderDetailedRouteContainer', [])\r\n\r\n .config(function ($stateProvider) {\r\n\r\n $stateProvider.state('client.order', {\r\n url: '/order?orderId&orderItemId',\r\n templateUrl: 'app/ui/order/orderDetailedView/orderDetailedRouteContainer/orderDetailedRouteContainer.html',\r\n data: {pageTitle: 'OrderManager: Order'},\r\n controller: 'OrderDetailedRouteContainerController',\r\n controllerAs: 'OrderDetailedRouteContainerController'\r\n });\r\n\r\n })\r\n\r\n .controller('OrderDetailedRouteContainerController', function ($scope, $state, $stateParams, gettextCatalog, toastr) {\r\n\r\n if (!$stateParams.orderId && !$stateParams.orderItemId) {\r\n toastr.warning(gettextCatalog.getString(\"Order was not specified\"));\r\n $state.go('client.orders');\r\n }\r\n\r\n $scope.orderId = $stateParams.orderId;\r\n $scope.orderItemId = $stateParams.orderItemId;\r\n\r\n })\r\n;","angular.module('ui.order.orderDetailed', [])\r\n\r\n .directive('orderDetailed', function () {\r\n return {\r\n restrict: \"E\",\r\n templateUrl: 'app/ui/order/orderDetailedView/orderDetailed/orderDetailed.html',\r\n scope: {\r\n orderId: \"=\",\r\n orderItemId: \"=\"\r\n },\r\n controller: 'OrderDetailedController',\r\n controllerAs: 'OrderDetailedController'\r\n };\r\n })\r\n\r\n .controller('OrderDetailedController', function ($scope, $state, $q, $log, toastr, gettextCatalog, serverLocalization, uiLocalization,\r\n $customisationConfig, orderDetailedControllerUpdatesService,\r\n orderItemsRepository, ordersRepository, usersRepository, workflowRepository, customResourceResolver) {\r\n var currentUser;\r\n var steps;\r\n\r\n $scope.hidemenu = ($state.params.hidemenu && $state.params.hidemenu === 'true');\r\n $scope.selectOrderItem = selectOrderItem;\r\n\r\n initController();\r\n\r\n function initController() {\r\n initData();\r\n initWatchers();\r\n }\r\n\r\n function initWatchers() {\r\n orderDetailedControllerUpdatesService.onOrderItemChanged(function (modelInfo) {\r\n if ($scope.orderItems && _.any($scope.orderItems, function (oi) {\r\n return oi.getId() == modelInfo.id;\r\n })) {\r\n initList();\r\n }\r\n });\r\n orderDetailedControllerUpdatesService.onOrderChanged(function (modelInfo) {\r\n if ($scope.orderId && modelInfo.id === $scope.orderId) {\r\n initList();\r\n }\r\n });\r\n orderDetailedControllerUpdatesService.onNewOrderItem(function () {\r\n initList();\r\n });\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n orderDetailedControllerUpdatesService.onOrderItemChanged(void 0);\r\n orderDetailedControllerUpdatesService.onOrderChanged(void 0);\r\n orderDetailedControllerUpdatesService.onNewOrderItem(void 0);\r\n });\r\n }\r\n\r\n function onOrderItemActionExecute() {\r\n initData();\r\n }\r\n\r\n function initData() {\r\n if ($scope.orderId) {\r\n\r\n initList();\r\n\r\n } else if ($scope.orderItemId) {\r\n $scope.isDataLoaded = false;\r\n orderItemsRepository.getOrderItem($scope.orderItemId)\r\n .then(function (oi) {\r\n $scope.orderItem = oi;\r\n $scope.orderItemId = oi.getId();\r\n $scope.orderId = oi.$model.orderId;\r\n $scope.order = oi.$model.order;\r\n initList();\r\n }, function (err) {\r\n $scope.isDataLoaded = true;\r\n $log.error(\"Can't load orderItem: `%s`. Cause: %s\", $scope.orderItemId, err.message);\r\n $scope.orderItem = null;\r\n $scope.orderItemId = null;\r\n toastr.error(err.message, gettextCatalog.getString(\"Can't load order item\"));\r\n });\r\n\r\n } else {\r\n\r\n toastr.warning(gettextCatalog.getString(\"Order was not specified\"));\r\n $state.go('client.orders');\r\n\r\n }\r\n }\r\n\r\n function initList() {\r\n if (!$scope.orderId) {\r\n return;\r\n }\r\n $scope.isDataLoaded = false;\r\n ordersRepository.getOrderItemsForOrder($scope.orderId)\r\n .then(function (ois) {\r\n $scope.orderItems = ois;\r\n if ($scope.orderItemId) {\r\n $scope.orderItem = _.find($scope.orderItems, function (oi) {\r\n return oi.getId() == $scope.orderItemId;\r\n });\r\n $scope.orderItemId = $scope.orderItem ? $scope.orderItem.getId() : null;\r\n }\r\n return initStepHeader()\r\n .then(function () {\r\n $scope.isDataLoaded = true;\r\n });\r\n },\r\n function (err) {\r\n $scope.isDataLoaded = true;\r\n $log.error(\"Can't load list of orderItems for order: `%s`. Cause: %s\", $scope.orderId, err.message);\r\n toastr.error(err.message, gettextCatalog.getString(\"Can't load list of order items\"));\r\n });\r\n }\r\n\r\n /**\r\n * Method to collect/construct data necessary to render corresponding step icon/button in the header of the nav bar\r\n */\r\n function initStepHeader() {\r\n $scope.stateDisplayName = \"\";\r\n $scope.stateIconName = \"\";\r\n\r\n if (!currentUser || !steps) {\r\n return $q.all([\r\n usersRepository.getCurrentUser(),\r\n workflowRepository.getSteps()\r\n ]).then(function (data) {\r\n currentUser = data[0];\r\n steps = data[1];\r\n return initStepHeaderInternal();\r\n });\r\n } else {\r\n return initStepHeaderInternal();\r\n }\r\n }\r\n\r\n function initStepHeaderInternal() {\r\n customResourceResolver.resolveWorkflow()\r\n .then(function (workflowConfig) {\r\n if (!$scope.orderItem) {\r\n return;\r\n }\r\n\r\n var oiStep = $scope.orderItem.$model.stepCode;\r\n var stepDisplayName = \"All Items\";\r\n var isCustomer = currentUser.isCustomer();\r\n var step = _.find(steps, function (s) {\r\n return s.$model.code === oiStep;\r\n });\r\n var stepConfig = _.find(workflowConfig.steps, function (s) {\r\n return s.code === oiStep;\r\n });\r\n\r\n if (step) {\r\n stepDisplayName = isCustomer ? step.$model.publicNameResource : step.$model.nameResource;\r\n }\r\n\r\n var fallbackIconForStep = function (stepCode) {\r\n return $customisationConfig.hasResource(function (res) {\r\n return _.string.contains(res, stepCode + \".\");\r\n }) ? stepCode : \"workflow\";\r\n };\r\n\r\n if ($scope.step && $scope.step !== \"all-open\") {\r\n $scope.stateDisplayName = serverLocalization.translate(stepDisplayName);\r\n } else {\r\n $scope.stateDisplayName = gettextCatalog.getString(\"All Items\");\r\n }\r\n $scope.stateIconName =\r\n !stepConfig\r\n ? fallbackIconForStep(oiStep)\r\n : (\r\n (!!stepConfig.publicImageResourceName && isCustomer)\r\n ? stepConfig.publicImageResourceName\r\n : (!!stepConfig.imageResourceName\r\n ? stepConfig.imageResourceName\r\n : fallbackIconForStep(oiStep))\r\n );\r\n });\r\n }\r\n\r\n function selectOrderItem(oi) {\r\n $scope.orderItem = oi;\r\n if ($scope.orderItem) {\r\n $scope.orderItemId = $scope.orderItem.getId();\r\n }\r\n initStepHeader();\r\n }\r\n\r\n })\r\n\r\n // Separate service for update events (to prevent multiple event subscription)\r\n .service('orderDetailedControllerUpdatesService', function (rest) {\r\n var _this = this;\r\n var newOrderItemCb;\r\n var orderItemChangedCb;\r\n var orderChangedCb;\r\n\r\n rest.events.on(\"modelCreatedOnServer\", function (modelInfo) {\r\n if (!newOrderItemCb) {\r\n return;\r\n }\r\n if (modelInfo && modelInfo.modelType === \"OrderItemModel\") {\r\n newOrderItemCb(modelInfo);\r\n }\r\n });\r\n\r\n rest.events.on(\"modelUpdatedOnServer\", function (modelInfo) {\r\n if (modelInfo.modelType === \"OrderItemModel\" && orderItemChangedCb) {\r\n orderItemChangedCb(modelInfo);\r\n } else if (modelInfo.modelType === \"OrderModel\" && orderChangedCb) {\r\n orderChangedCb(modelInfo);\r\n }\r\n });\r\n\r\n _this.onNewOrderItem = function (cb) {\r\n newOrderItemCb = cb;\r\n };\r\n\r\n _this.onOrderItemChanged = function (cb) {\r\n orderItemChangedCb = cb;\r\n };\r\n\r\n _this.onOrderChanged = function (cb) {\r\n orderChangedCb = cb;\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;","angular.module('env.data.rest.restProvider', [])\r\n\r\n .provider('rest', function (modelFactoryProvider) {\r\n\r\n var defaultConfig = getDefaultConfig();\r\n\r\n function getDefaultConfig() {\r\n var cfg = new RestConfigurator();\r\n\r\n // some defaults here\r\n\r\n return cfg;\r\n }\r\n\r\n /**\r\n * Helper for Rest service initialisation\r\n * @constructor\r\n */\r\n function RestConfigurator() {\r\n var config = this;\r\n\r\n /**\r\n * The base URL for all calls to your API\r\n * @param {string} baseUrl url without leading or trailing slashes\r\n */\r\n config.setBaseUrl = function (baseUrl) {\r\n config.baseUrl = baseUrl;\r\n };\r\n\r\n /**\r\n * Request suffix for all calls to your API\r\n * @param {string} requestSuffix suffix without trailing or leading slashes\r\n */\r\n config.setRequestSuffix = function (requestSuffix) {\r\n config.requestSuffix = requestSuffix;\r\n };\r\n\r\n /**\r\n * Hash of default headers for all calls to your API\r\n * @param {Object.} defaultHeaders default headers hash\r\n */\r\n config.setDefaultHeaders = function (defaultHeaders) {\r\n config.defaultHeaders = defaultHeaders;\r\n };\r\n\r\n /**\r\n * Hash of default request params for all calls to your API\r\n * @param {Object.} defaultParams hash of default request params\r\n */\r\n config.setDefaultParams = function (defaultParams) {\r\n config.defaultParams = defaultParams;\r\n };\r\n\r\n /**\r\n * Default config for $http service\r\n * @param {Object.} defaultHttpConfig default config for $http service\r\n */\r\n config.setDefaultHttpConfig = function (defaultHttpConfig) {\r\n config.defaultHttpConfig = defaultHttpConfig;\r\n };\r\n }\r\n\r\n /**\r\n * Define model\r\n * @param {string} name name of the model\r\n * @param {*} config configuration\r\n */\r\n function defineModel(name, config) {\r\n modelFactoryProvider.define(name, config);\r\n }\r\n\r\n _.extend(this, {\r\n defaultConfig: defaultConfig,\r\n defineModel: defineModel\r\n });\r\n\r\n this.$get = function (RestService, modelPool) {\r\n\r\n /**\r\n * Get new instance of RestService with custom config\r\n * @param {Function} [configFunction] configuration function that takes RestConfigurator as argument\r\n * @returns {RestService}\r\n */\r\n function makeAnotherInstance(configFunction) {\r\n var configurator = _.clone(defaultConfig);\r\n if (configFunction) {\r\n configFunction(configurator);\r\n }\r\n return new RestService(configurator, modelPool);\r\n }\r\n\r\n return _.extend(makeAnotherInstance(), {\r\n makeAnotherInstance: makeAnotherInstance\r\n });\r\n }\r\n })\r\n\r\n .factory('RestService', function ($q, $log, $http, $injector, authService, modelFactory, EventingMixin, RepresentationModel, ModelDefinition) {\r\n /**\r\n * Rest service\r\n * @param {RestConfigurator} configurator Configurator of Rest Service\r\n * @param {ModelPoolService} pool model pool instance\r\n * @constructor\r\n */\r\n function RestService(configurator, pool) {\r\n var _this = this;\r\n\r\n _.extend(_this, new EventingMixin([\r\n \"modelUpdated\",\r\n \"modelUpdatedOnServer\",\r\n \"modelCreatedOnServer\"\r\n ]));\r\n\r\n /**\r\n * @type {RestConfigurator}\r\n */\r\n var config = configurator;\r\n /**\r\n * @type {ModelPoolService}\r\n */\r\n var modelPool = pool;\r\n\r\n /**\r\n * Request mapper. Contains information about request and execute it\r\n * @param {Array|string} [parts] parts of the url\r\n * @constructor\r\n */\r\n function RestMapper(parts) {\r\n var _mapper = this;\r\n var path = path || [];\r\n var futureId;\r\n var futureType;\r\n\r\n //region Mapping\r\n\r\n map(parts);\r\n\r\n /**\r\n * Map request\r\n * @returns {RestService.RestMapper}\r\n */\r\n function map() {\r\n _.forEach(arguments, function (urlPart) {\r\n if (!urlPart) {\r\n // do nothing, return mapper\r\n } else if (_.isString(urlPart)) {\r\n _addUrlPart(urlPart);\r\n } else if (_.isNumber(urlPart)) {\r\n _addUrlPart(urlPart.toString());\r\n } else if (urlPart.isRepresentationModel) {\r\n //map(urlPart.getDefinition().getUrl());\r\n map(urlPart.getId());\r\n } else if (urlPart instanceof ModelDefinition) {\r\n map(urlPart.getUrl());\r\n } else if (_.isArray(urlPart) || _.isArguments(urlPart)) {\r\n _.forEach(urlPart, function (_urlPart) {\r\n map(_urlPart);\r\n });\r\n } else if (_.isFunction(urlPart.toString)) {\r\n map(urlPart.toString());\r\n } else {\r\n throw new Error(\"Can't construct route\");\r\n }\r\n });\r\n return _mapper;\r\n }\r\n\r\n function _addUrlPart(urlPart) {\r\n path.push(urlPart);\r\n }\r\n\r\n /**\r\n * Add information about objects that will be returned (for cache service)\r\n * @param {string|ModelDefinition} modelType type of the returned model\r\n * @param {string|Number} [modelId] id of the model. This id will be promised to cache service.\r\n * @returns {RestService.RestMapper}\r\n */\r\n function willReturn(modelType, modelId) {\r\n if (modelType) {\r\n if (_.isString(modelType)) {\r\n futureType = modelType;\r\n } else {\r\n futureType = modelType.getType();\r\n }\r\n }\r\n if (modelId) {\r\n futureId = modelId;\r\n }\r\n return _mapper;\r\n }\r\n\r\n //endregion\r\n\r\n //region HTTP public interface\r\n\r\n function ensureCache(func) {\r\n if (futureId && futureType && modelPool.has(futureType, futureId)) {\r\n return modelPool.get(futureType, futureId);\r\n }\r\n return func();\r\n }\r\n\r\n function get(config) {\r\n return ensureCache(function () {\r\n return processResponse($http.get(getRequestUrl(), getRequestConfig(config)));\r\n });\r\n }\r\n\r\n function head(config) {\r\n return ensureCache(function () {\r\n return processResponse($http.head(getRequestUrl(), getRequestConfig(config)));\r\n });\r\n }\r\n\r\n function post(data, config) {\r\n return ensureCache(function () {\r\n return saveAndTransform(data).then(function (model) {\r\n return processResponse($http.post(getRequestUrl(), model, getRequestConfig(config)));\r\n });\r\n });\r\n }\r\n\r\n function put(data, config) {\r\n return saveAndTransform(data).then(function (model) {\r\n return processResponse($http.put(getRequestUrl(), model, getRequestConfig(config)));\r\n });\r\n }\r\n\r\n function remove(config) {\r\n return processResponse($http.delete(getRequestUrl(), getRequestConfig(config)));\r\n }\r\n\r\n function patch(data, config) {\r\n return saveAndTransform(data).then(function (model) {\r\n return processResponse($http.patch(getRequestUrl(), model, getRequestConfig(config)));\r\n });\r\n }\r\n\r\n function save(model, config) {\r\n if (model.isRepresentationModel) {\r\n futureId = model.getId();\r\n futureType = model.getType();\r\n map(model);\r\n }\r\n return put(model, config);\r\n }\r\n\r\n /**\r\n * Very custom method for search engine\r\n * @param {Object} query query object\r\n * @returns {!Promise} promise of search result\r\n */\r\n function search(query) {\r\n query = _.defaults(query || {}, {\r\n where: \"\",\r\n orderBy: \"\",\r\n pageNumber: 0,\r\n rowsPerPage: 10\r\n });\r\n\r\n var result = null;\r\n return processResponse(\r\n $http.post(getRequestUrl(), query, getRequestConfig(config))\r\n .then(function (searchResults) {\r\n if (searchResults && searchResults.data && searchResults.data.items) {\r\n result = searchResults.data;\r\n return {data: result.items};\r\n }\r\n return $q.reject(\"Empty search results!\");\r\n }\r\n )).then(function (items) {\r\n result.items = items;\r\n return result;\r\n });\r\n }\r\n\r\n //endregion\r\n\r\n //region Request processing\r\n\r\n function saveAndTransform(model) {\r\n if (model && model.isRepresentationModel) {\r\n return model.saveAndTransform();\r\n }\r\n return $q.when(model);\r\n }\r\n\r\n function processResponse(promise) {\r\n promise = processErrors(promise);\r\n promise = transformToModel(promise);\r\n promise = processCache(promise);\r\n\r\n return promise;\r\n }\r\n\r\n function processErrors(promise) {\r\n return promise.then(function (resp) { //data, status, headers, config, statusText\r\n if (!resp) {\r\n return $q.reject(\"Unknown communication error\");\r\n }\r\n return resp;\r\n },\r\n function (resp) {\r\n var error = {};\r\n if (resp) {\r\n var msg = `Request failed: ${resp.config ? resp.config.method : ''} ${getRequestUrl()}.`;\r\n\r\n error.status = resp.status;\r\n error.statusText = resp.statusText;\r\n if (resp.data) {\r\n error.serverErrorMessage = resp.data.ErrorMessage;\r\n error.serverFullException = resp.data.FullException;\r\n if (_.isString(resp.data)) {\r\n try { // parse HTML error page\r\n error.serverErrorMessage = $($.parseXML(resp.data))\r\n .find('body')\r\n .children() // get all `div` elements\r\n .map(function () {\r\n return $(this).text();\r\n })\r\n .toArray()\r\n .join(\"\\n\");\r\n } catch (err) {\r\n // just ignore the exception...\r\n }\r\n }\r\n }\r\n\r\n if (error.status) {\r\n msg += \" HTTP error \" + error.status;\r\n if (error.statusText) {\r\n msg += \": \" + error.statusText;\r\n }\r\n msg += \".\";\r\n } else {\r\n msg += \" Server is not responding.\";\r\n }\r\n\r\n if (error.serverErrorMessage) {\r\n msg += \" Server error: \" + error.serverErrorMessage + \".\";\r\n }\r\n\r\n error.message = msg;\r\n } else {\r\n error.message = \"Unknown error\";\r\n }\r\n\r\n error.data = error;\r\n\r\n //If auth token was dropped, write the error as warning, otherwise as error\r\n if (authService.isAuthorized() && error.status === 401) {\r\n $log.error(error.message);\r\n } else {\r\n $log.warn(error.message);\r\n }\r\n\r\n return $q.reject(error);\r\n });\r\n }\r\n\r\n function transformToModel(promise) {\r\n if (!futureType) {\r\n return promise.then(function (responce) {\r\n if (responce) {\r\n return responce.data;\r\n }\r\n return responce;\r\n }\r\n );\r\n }\r\n\r\n return promise.then(function (responce) {\r\n if (responce.data) {\r\n if (_.isArray(responce.data)) {\r\n var promises = [];\r\n _.forEach(responce.data, function (obj) {\r\n var model = new RepresentationModel(getDefinition(futureType));\r\n promises.push(model.initAsync(obj));\r\n });\r\n return $q.all(promises);\r\n } else {\r\n var model = new RepresentationModel(getDefinition(futureType));\r\n return model.initAsync(responce.data);\r\n }\r\n }\r\n return responce.data;\r\n });\r\n }\r\n\r\n function processCache(promise) {\r\n if (!futureType) {\r\n return promise;\r\n }\r\n return modelPool.promise(promise, futureType, futureId);\r\n }\r\n\r\n /**\r\n * Get mapped request url\r\n * @returns {string}\r\n */\r\n function getRequestUrl() {\r\n return _.compact(_.flatten([config.baseUrl, path, config.requestSuffix])).join(\"/\");\r\n }\r\n\r\n /**\r\n * Get united config for $http\r\n * @param {Object.} currentConfig\r\n * @returns {Object.}\r\n */\r\n function getRequestConfig(currentConfig) {\r\n currentConfig = currentConfig || {};\r\n var headers = _.defaults({},\r\n currentConfig.headers || {},\r\n config.defaultHeaders || {},\r\n (config.defaultHttpConfig && config.defaultHttpConfig.headers)\r\n ? config.defaultHttpConfig.headers\r\n : {}\r\n );\r\n var params = _.defaults({},\r\n currentConfig.params || {},\r\n config.defaultParams || {},\r\n (config.defaultHttpConfig && config.defaultHttpConfig.params)\r\n ? config.defaultHttpConfig.params\r\n : {}\r\n );\r\n\r\n var cfg = _.defaults({}, config.defaultHttpConfig, currentConfig);\r\n cfg.headers = headers;\r\n cfg.params = params;\r\n\r\n return cfg;\r\n }\r\n\r\n //endregion\r\n\r\n _.extend(_mapper, {\r\n map: map,\r\n willReturn: willReturn,\r\n\r\n get: get,\r\n head: head,\r\n post: post,\r\n put: put,\r\n remove: remove,\r\n patch: patch,\r\n save: save,\r\n search: search\r\n });\r\n }\r\n\r\n /**\r\n * Map request\r\n * @returns {RestService.RestMapper}\r\n */\r\n function map() {\r\n return new RestMapper(Array.prototype.slice.call(arguments));\r\n }\r\n\r\n function getDefinition(modelType) {\r\n return modelFactory.getDefinition(modelType);\r\n }\r\n\r\n /**\r\n * Create new model\r\n * @param {string} modelType model type\r\n * @param {Object} proto plain object for model\r\n * @returns {RepresentationModel} new model\r\n */\r\n function newModel(modelType, proto) {\r\n return new RepresentationModel(getDefinition(modelType), proto);\r\n }\r\n\r\n /**\r\n * Renew model from server\r\n * @param {string} modelType model type\r\n * @param {string|number} id model id\r\n * @param {number} [version] version of the model\r\n */\r\n function renewModel(modelType, id, version) {\r\n if (version && version > 0) {\r\n return modelPool.get(modelType, id)\r\n .then(function (model) {\r\n if (model && model.$model.version >= version) {\r\n return model;\r\n }\r\n return map(getDefinition(modelType)).map(id).willReturn(modelType).get();\r\n }, function () {\r\n return map(getDefinition(modelType)).map(id).willReturn(modelType).get();\r\n });\r\n }\r\n return map(getDefinition(modelType)).map(id).willReturn(modelType).get();\r\n }\r\n\r\n /**\r\n * Check if rest engine tracking this model\r\n * @param {string} modelType\r\n * @param {string|number} id\r\n * @returns {boolean}\r\n */\r\n function hasModel(modelType, id) {\r\n if (!modelType || !id) {\r\n return false;\r\n }\r\n return modelPool.has(modelType, id);\r\n }\r\n\r\n modelPool.events.on(\"modelUpdated\", function (model) {\r\n _this.events.raise(\"modelUpdated\", model);\r\n });\r\n\r\n function modelCreatedOnServer(modelInfo) {\r\n _this.events.raise(\"modelCreatedOnServer\", modelInfo);\r\n }\r\n\r\n function modelUpdatedOnServer(modelInfo) {\r\n _this.events.raise(\"modelUpdatedOnServer\", modelInfo);\r\n }\r\n\r\n _.extend(_this, {\r\n config: config,\r\n getDefinition: getDefinition,\r\n map: map,\r\n newModel: newModel,\r\n renewModel: renewModel,\r\n hasModel: hasModel,\r\n modelCreatedOnServer: modelCreatedOnServer,\r\n modelUpdatedOnServer: modelUpdatedOnServer\r\n });\r\n }\r\n\r\n return (RestService);\r\n })\r\n;\r\n","angular.module('env.data.rest.signalR.signalRHub', [])\r\n\r\n .factory('SignalRHub', function ($timeout, $q, $log) {\r\n //This will allow same connection to be used for all Hubs\r\n //It also keeps connection as singleton.\r\n var globalConnections = [];\r\n\r\n function initNewConnection(options) {\r\n var connection = null;\r\n try {\r\n if (options && options.rootPath) {\r\n connection = $.hubConnection(options.rootPath, {useDefaultPath: false});\r\n } else {\r\n connection = $.hubConnection();\r\n }\r\n connection.logging = (options && options.logging ? true : false);\r\n } catch (e) {\r\n $log.error(\"SignalR connection error\", e);\r\n }\r\n return connection;\r\n }\r\n\r\n function getConnection(options) {\r\n var useSharedConnection = !(options && options.useSharedConnection === false);\r\n if (useSharedConnection) {\r\n return typeof globalConnections[options.rootPath] === 'undefined' ?\r\n globalConnections[options.rootPath] = initNewConnection(options) :\r\n globalConnections[options.rootPath];\r\n } else {\r\n return initNewConnection(options);\r\n }\r\n }\r\n\r\n return function (hubName, options) {\r\n var Hub = this;\r\n var connectionPromise;\r\n\r\n Hub.connection = getConnection(options);\r\n Hub.proxy = Hub.connection.createHubProxy(hubName);\r\n\r\n Hub.on = function (event, fn) {\r\n Hub.proxy.on(event, fn);\r\n };\r\n Hub.invoke = function (method, args) {\r\n return Hub.proxy.invoke.apply(Hub.proxy, arguments)\r\n };\r\n Hub.disconnect = function () {\r\n Hub.connection.stop();\r\n };\r\n Hub.connect = function () {\r\n if (Hub.connection.state == $.signalR.connectionState.connected) {\r\n return $q.when(Hub.connection);\r\n } else if (Hub.connection.state == $.signalR.connectionState.connecting ||\r\n Hub.connection.state == $.signalR.connectionState.reconnecting) {\r\n return connectionPromise;\r\n } else if (Hub.connection.state == $.signalR.connectionState.disconnected) {\r\n try {\r\n connectionPromise = Hub.connection.start(options.transport\r\n ? {transport: options.transport}\r\n : null);\r\n return connectionPromise;\r\n } catch (e) {\r\n $log.error(\"SignalR connection error\", e);\r\n return $q.reject(\"SignalR connection error: \" + e.toString());\r\n }\r\n }\r\n $log.error(\"SignalR connection error: unknown state\");\r\n return $q.reject(\"SignalR connection error: unknown state\");\r\n };\r\n\r\n Hub.connection.stateChanged(function (change) {\r\n if (change.newState == $.signalR.connectionState.connected) {\r\n if (options.onSignalRConnected && _.isFunction(options.onSignalRConnected)) {\r\n options.onSignalRConnected();\r\n }\r\n }\r\n\r\n $log.debug(\"SignalR state changed. New state: %s. Old state: %s\",\r\n connectionStateToString(change.newState),\r\n connectionStateToString(change.oldState));\r\n });\r\n\r\n function connectionStateToString(code) {\r\n try {\r\n if (code === $.signalR.connectionState.connected) {\r\n return \"connected\";\r\n } else if (code === $.signalR.connectionState.connecting) {\r\n return \"connecting\";\r\n } else if (code === $.signalR.connectionState.reconnecting) {\r\n return \"reconnecting\";\r\n } else if (code === $.signalR.connectionState.disconnected) {\r\n return \"disconnected\";\r\n }\r\n } catch (e) {\r\n }\r\n return \"unknown (code: \" + code + \")\";\r\n }\r\n\r\n Hub.ensureConnection = function () {\r\n try {\r\n return Hub.connect();\r\n } catch (e) {\r\n $log.error(\"SignalR hub ensure connection error\", e);\r\n return $q.reject(\"SignalR hub ensure connection error: \" + e.toString());\r\n }\r\n };\r\n\r\n if (options && options.listeners) {\r\n angular.forEach(options.listeners, function (fn, event) {\r\n Hub.on(event, fn);\r\n });\r\n }\r\n if (options && options.methods) {\r\n angular.forEach(options.methods, function (method) {\r\n Hub[method] = function () {\r\n var args = $.makeArray(arguments);\r\n args.unshift(method);\r\n return Hub.invoke.apply(Hub, args);\r\n };\r\n });\r\n }\r\n if (options && options.queryParams) {\r\n Hub.connection.qs = options.queryParams;\r\n }\r\n if (options && options.errorHandler) {\r\n Hub.connection.error(options.errorHandler);\r\n }\r\n\r\n if (options && options.autoReconnect) {\r\n Hub.connection.disconnected(function () {\r\n $timeout(function () {\r\n Hub.connect();\r\n }, options.autoReconnectTimeout || 5000); // Restart connection after 5 seconds.\r\n });\r\n }\r\n\r\n Hub.connect();\r\n\r\n return Hub;\r\n };\r\n })\r\n;\r\n","angular.module('env.data.rest.signalR', [\r\n\r\n 'env.data.rest.signalR.signalRHub',\r\n 'env.data.rest.signalR.notificationHub'\r\n\r\n]);","angular.module('env.data.rest.signalR.notificationHub', [])\r\n\r\n .run(function ($log, $rootScope, authService, notificationHub, rest) {\r\n\r\n notificationHub.onUpdate(function (modelInfo) {\r\n var id = modelInfo.id;\r\n var modelType = modelInfo.modelType;\r\n var version = modelInfo.version;\r\n\r\n rest.modelUpdatedOnServer(modelInfo);\r\n\r\n if (rest.hasModel(modelType, id)) {\r\n\r\n rest.renewModel(modelType, id, version).catch(function (error) {\r\n $log.warn(_.str.sprintf(\r\n \"Model was updated by other client, but we were unable to renew model from server.\" +\r\n \"Type: %s; Id: %s. Error: \", modelType, id, error ? error.toString() : \"undefined\"));\r\n });\r\n }\r\n });\r\n\r\n notificationHub.onCreate(function (modelInfo) {\r\n rest.modelCreatedOnServer(modelInfo);\r\n });\r\n\r\n notificationHub.onSignalRConnected(function () {\r\n signalRLogin();\r\n });\r\n\r\n function signalRLogin() {\r\n var token = authService.getToken();\r\n if (token) {\r\n notificationHub.initialize(token);\r\n } else {\r\n notificationHub.uninitialize();\r\n }\r\n }\r\n\r\n function signalRLogout() {\r\n notificationHub.uninitialize();\r\n }\r\n\r\n authService.events.on('login', signalRLogin);\r\n authService.events.on('continueSessionAfterReload', signalRLogin);\r\n\r\n authService.events.on('loginFailed', signalRLogout);\r\n authService.events.on('logout', signalRLogout);\r\n authService.events.on('authenticationRequiredAfterReload', signalRLogout);\r\n authService.events.on('sessionExpired', signalRLogout);\r\n\r\n })\r\n\r\n .service('notificationHub', function ($log, $q, EventingMixin, SignalRHub, pingService) {\r\n\r\n var _this = this;\r\n _.extend(_this, new EventingMixin([\r\n 'Updated',\r\n 'Created',\r\n 'SignalRConnected'\r\n ]));\r\n\r\n //declaring the hub connection\r\n var hub = new SignalRHub('NotificationHub', {\r\n\r\n rootPath: om.config.build.signalRUrl,\r\n\r\n //client side methods\r\n listeners: {\r\n \"Updated\": function (modelType, id, version) {\r\n raise(\"Updated\", modelType, id, version);\r\n },\r\n \"Created\": function (modelType, id, version) {\r\n raise(\"Created\", modelType, id, version);\r\n }\r\n },\r\n\r\n //handle connection error\r\n errorHandler: function (error) {\r\n $log.warn(\"SignalR error: \" + error ? error.toString() : \"unknown error\");\r\n },\r\n\r\n //server side methods\r\n methods: ['initialize', 'uninitialize', 'addFilter', 'removeFilter'],\r\n\r\n autoReconnect: true,\r\n autoReconnectTimeout: 30000, // ms\r\n\r\n onSignalRConnected: function () {\r\n _this.events.raise(\"SignalRConnected\");\r\n }\r\n });\r\n\r\n /**\r\n * Login for signalR hub\r\n * @param {string} token security token\r\n */\r\n var initialize = function (token) {\r\n return ensureConnection().then(function () {\r\n try {\r\n return pingService.whenConnected().then(function () {\r\n return hub.initialize(token);\r\n });\r\n } catch (e) {\r\n $log.error(\"Error on attempt to login through SignalR connection\", e);\r\n return $q.reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Login for signalR hub\r\n */\r\n var uninitialize = function () {\r\n return ensureConnection().then(function () {\r\n try {\r\n return hub.uninitialize();\r\n } catch (e) {\r\n $log.error(\"Error on attempt to logout through SignalR connection\", e);\r\n return $q.reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Subscribe for CREATE event\r\n * @param {function} func callback\r\n */\r\n function onCreate(func) {\r\n _this.events.on(\"Created\", func)\r\n }\r\n\r\n /**\r\n * Subscribe for UPDATE event\r\n * @param {function} func callback\r\n */\r\n function onUpdate(func) {\r\n _this.events.on(\"Updated\", func)\r\n }\r\n\r\n /**\r\n * Subscribe for UPDATE event\r\n * @param {function} func callback\r\n */\r\n function onSignalRConnected(func) {\r\n _this.events.on(\"SignalRConnected\", func)\r\n }\r\n\r\n function raise(eventName, serverModelType, id, version) {\r\n if (id && serverModelType) {\r\n var modelType = transformServerModelType(serverModelType);\r\n try {\r\n _this.events.raise(eventName, {id: id, modelType: modelType, version: version});\r\n } catch (e) {\r\n $log.warn(\"Error on handling '\" + eventName + \"' signalR event\", e);\r\n }\r\n }\r\n }\r\n\r\n function transformServerModelType(serverModelType) {\r\n if (serverModelType == \"Action\") {\r\n return \"ActionModel\";\r\n }\r\n if (serverModelType == \"Centre\") {\r\n return \"CentreModel\";\r\n }\r\n if (serverModelType == \"Comment\") {\r\n return \"CommentModel\";\r\n }\r\n if (serverModelType == \"Customer\") {\r\n return \"CustomerModel\";\r\n }\r\n if (serverModelType == \"Document\") {\r\n return \"DocumentModel\";\r\n }\r\n if (serverModelType == \"OrderItem\") {\r\n return \"OrderItemModel\";\r\n }\r\n if (serverModelType == \"Order\") {\r\n return \"OrderModel\";\r\n }\r\n if (serverModelType == \"Step\") {\r\n return \"StepModel\";\r\n }\r\n if (serverModelType == \"User\") {\r\n return \"UserModel\";\r\n }\r\n throw new Error(_.str.sprintf(\"Unrecognized model type: %s\", serverModelType));\r\n }\r\n\r\n /**\r\n * Add new event filter\r\n * @param {string} typeName type name\r\n * @param {string} expression filtering expression\r\n */\r\n function addFilter(typeName, expression) {\r\n return ensureConnection().then(function () {\r\n try {\r\n return hub.addFilter(typeName, expression);\r\n } catch (e) {\r\n $log.error(\"Error on attempt to call SignalR server function 'addFilter'\", e);\r\n return $q.reject(e);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Remove event filter\r\n * @param {string} typeName\r\n */\r\n function removeFilter(typeName) {\r\n return ensureConnection().then(function () {\r\n try {\r\n return hub.removeFilter(typeName);\r\n } catch (e) {\r\n $log.error(\"Error on attempt to call SignalR server function 'removeFilter'\", e);\r\n return $q.reject(e);\r\n }\r\n });\r\n }\r\n\r\n function ensureConnection() { // todo refactor away to hub\r\n return hub.ensureConnection();\r\n }\r\n\r\n _.extend(_this, {\r\n initialize: initialize,\r\n uninitialize: uninitialize,\r\n addFilter: addFilter,\r\n removeFilter: removeFilter,\r\n onCreate: onCreate,\r\n onUpdate: onUpdate,\r\n onSignalRConnected: onSignalRConnected,\r\n connectPromise: hub.promise\r\n });\r\n\r\n return _this;\r\n })\r\n\r\n;\r\n","angular.module('env.data.rest.modelPool', [])\r\n\r\n .provider('modelPool', function () {\r\n var defaultConfig = getDefaultConfig();\r\n\r\n function getDefaultConfig() {\r\n var cfg = new ModelPoolConfigurator();\r\n // default config\r\n return cfg;\r\n }\r\n\r\n /**\r\n * Helper for ModelPool initialisation\r\n * @constructor\r\n */\r\n function ModelPoolConfigurator() {\r\n var config = this;\r\n // todo configurator must have setter methods\r\n }\r\n\r\n _.extend(this, {\r\n defaultConfig: defaultConfig\r\n });\r\n\r\n this.$get = function (ModelPoolService) {\r\n\r\n /**\r\n * Get new instance of ModelPool with custom config\r\n * @param {Function} [configFunction] configuration function that takes ModelPoolConfigurator as argument\r\n * @returns {ModelPoolService}\r\n */\r\n function makeAnotherInstance(configFunction) {\r\n var configurator = _.clone(defaultConfig);\r\n if (configFunction) {\r\n configFunction(configurator);\r\n }\r\n return new ModelPoolService(configurator);\r\n }\r\n\r\n return _.extend(makeAnotherInstance(), {\r\n makeAnotherInstance: makeAnotherInstance\r\n });\r\n };\r\n })\r\n\r\n .factory('ModelPoolService', function ($q, EventingMixin) {\r\n\r\n /**\r\n * Model Pool service\r\n * @param {ModelPoolConfigurator} configurator\r\n * @constructor\r\n */\r\n function ModelPoolService(configurator) {\r\n\r\n var _this = this;\r\n _.extend(_this, new EventingMixin([\r\n 'modelPromise',\r\n 'modelUpdated',\r\n 'modelRemove',\r\n 'clearCache'\r\n ]));\r\n\r\n /**\r\n * Config\r\n */\r\n var config = configurator;\r\n\r\n /**\r\n * Storage of models\r\n */\r\n var storage = {};\r\n\r\n /**\r\n * Storage of promises of models that will be requested from the server but not returned yet\r\n */\r\n var promised = {};\r\n\r\n /**\r\n * Get model's type\r\n * @param {RepresentationModel} model\r\n * @returns {string} model's type\r\n * @private\r\n */\r\n function _getType(model) {\r\n return model.getType();\r\n }\r\n\r\n /**\r\n * Get model's id for cache service\r\n * @param {RepresentationModel} model\r\n * @returns {string} model's id\r\n * @private\r\n */\r\n function _getId(model) {\r\n return model.getId();\r\n }\r\n\r\n /**\r\n * Put model to the cache\r\n * @param {RepresentationModel|Array.} model model or array or models to store in the cache\r\n */\r\n function put(model) {\r\n if (_.isArray(model)) {\r\n var result = [];\r\n _.forEach(model, function (m) {\r\n result.push(putModel(m));\r\n });\r\n return result;\r\n } else {\r\n return putModel(model);\r\n }\r\n }\r\n\r\n function putModel(model) {\r\n if (!model) {\r\n return;\r\n }\r\n var type = _getType(model);\r\n var id = _getId(model);\r\n\r\n if (!storage[type]) {\r\n storage[type] = {};\r\n }\r\n if (storage[type][id]) {\r\n var toRaiseEvent = false;\r\n if (!_.isEqual(storage[type][id].$model, model.$model)) {\r\n toRaiseEvent = true;\r\n }\r\n _resolveConflict(storage[type][id], model);\r\n if (toRaiseEvent) {\r\n _this.events.raise(\"modelUpdated\", storage[type][id]);\r\n }\r\n } else {\r\n storage[type][id] = model;\r\n }\r\n\r\n return storage[type][id];\r\n }\r\n\r\n /**\r\n * Resolve conflicts\r\n * @param {RepresentationModel} storedModel\r\n * @param {RepresentationModel} newModel\r\n * @returns {RepresentationModel} storedModel, with resolved conflicts\r\n * @private\r\n */\r\n function _resolveConflict(storedModel, newModel) {\r\n _mergeDeep(newModel.$model, storedModel.$model, storedModel.getOriginalModel());\r\n return _.resetObject(storedModel, newModel);\r\n }\r\n\r\n function _mergeDeep(newModel, storedClientModel, storedOriginalModel) {\r\n _.forEach(Object.keys(newModel), (fieldName) => {\r\n var newModelFieldValue = newModel[fieldName];\r\n var storedClientModelFieldValue = storedClientModel[fieldName];\r\n var storedOriginalModelFieldValue = storedOriginalModel[fieldName];\r\n\r\n if (_.isUndefined(storedOriginalModelFieldValue)) {\r\n storedOriginalModelFieldValue = storedClientModelFieldValue;\r\n }\r\n\r\n if (newModelFieldValue && newModelFieldValue.isRepresentationModel && storedClientModelFieldValue && storedClientModelFieldValue.isRepresentationModel) {\r\n //Do nothing here as each representation model will get into the model pool anyway and the conflict will be resolved for each model\r\n } else if (_.isPlainObject(newModelFieldValue)) { // checking if this thing is plain object like `{...}`\r\n _mergeDeep(newModelFieldValue, storedClientModelFieldValue, storedOriginalModelFieldValue);\r\n } else if (_.isArray(newModelFieldValue) && _.every(newModelFieldValue, el => el == null || el.isRepresentationModel)) {\r\n // Just skip it\r\n } else {\r\n if (!_.isEqual(storedClientModelFieldValue, storedOriginalModelFieldValue)) {\r\n // This field was changed locally in dirty model\r\n var isOriginalModelChanged = !_.isEqual(newModelFieldValue, storedOriginalModelFieldValue) // There were changes on server\r\n var isClientModelChanged = !_.isEqual(newModelFieldValue, storedClientModelFieldValue) // There are difference between current and dirty model\r\n if (!isOriginalModelChanged && isClientModelChanged) {\r\n // dirtyModel has changes. Apply them.\r\n newModel[fieldName] = _.cloneDeep(storedClientModelFieldValue);\r\n }\r\n else {\r\n // Both models has changes. We choose current (target) model value.\r\n // OR\r\n // Both models has changes and they are equal.\r\n // So we do nothing in both cases.\r\n }\r\n }\r\n else {\r\n // do nothing and leave current field value\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Declare the promise of future RepresentationModel\r\n * @param {string} type model type\r\n * @param {Promise} promise Promise of the RepresentationModel\r\n * @param {string} [id] ID of the model\r\n * @returns {!Promise} promise of \"put resolved model to the cache\" action\r\n */\r\n function promise(promise, type, id) {\r\n if (!id) {\r\n return promise.then(function (model) {\r\n return put(model);\r\n });\r\n }\r\n\r\n _this.events.raise(\"modelPromise\", {id: id, modelType: type});\r\n\r\n if (!promised[type]) {\r\n promised[type] = {};\r\n }\r\n\r\n return promised[type][id] = promise.then(function (model) {\r\n if (model) {\r\n var newId = _getId(model);\r\n var newType = _getType(model);\r\n if (newId != id) {\r\n return $q.reject(_.str.sprintf(\r\n \"ID of the resolved model(%s) is not equal to the promised ID(%s)\", newId, id));\r\n }\r\n if (newType != type) {\r\n return $q.reject(_.str.sprintf(\r\n \"Type of the resolved model(%s) is not equal to the promised type(%s)\", newType, type));\r\n }\r\n delete promised[type][id];\r\n return put(model);\r\n } else {\r\n if (storage[type] && storage[type][id]) {\r\n delete storage[type][id];\r\n }\r\n delete promised[type][id];\r\n return storage[type][id];\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Get model from cache\r\n * @param {string} type - model type\r\n * @param {string} id - model id\r\n * @returns {!Promise.} promise of RepresentationModel\r\n */\r\n function get(type, id) {\r\n if (promised[type] && promised[type][id] && _.isPromise(promised[type][id])) {\r\n return promised[type][id];\r\n }\r\n return $q.when(storage[type] ? storage[type][id] : null);\r\n }\r\n\r\n /**\r\n * Check if cache has model\r\n * @param {string} type - model type\r\n * @param {string} id - model id\r\n * @returns {boolean}\r\n */\r\n function has(type, id) {\r\n return !!((storage[type] && storage[type][id]) || (promised[type] && promised[type][id]));\r\n }\r\n\r\n /**\r\n * Remove model from cache.\r\n * Only model will be deleted.\r\n * Promise(if any) will be preserved.\r\n * @param {string} type - model type\r\n * @param {string} id - model id\r\n */\r\n function remove(type, id) {\r\n if (storage[type] && storage[type][id]) {\r\n delete storage[type][id];\r\n _this.events.raise(\"modelRemove\", {id: id, modelType: type});\r\n }\r\n }\r\n\r\n /**\r\n * Clears the cache.\r\n * Note: Promised values will be preserved and cached after return\r\n */\r\n function removeAll() {\r\n storage = {};\r\n _this.events.raise(\"clearCache\");\r\n }\r\n\r\n _.extend(_this, {\r\n put: put,\r\n promise: promise,\r\n get: get,\r\n has: has,\r\n remove: remove,\r\n removeAll: removeAll\r\n });\r\n }\r\n\r\n return (ModelPoolService);\r\n })\r\n\r\n;\r\n","angular.module('env.data.rest.model.validationTemplates', [])\r\n\r\n .constant('FieldValidationTemplates', {\r\n /**\r\n * Value is not null or undefined or NaN\r\n */\r\n notNull: function () {\r\n return [\r\n function (val) {\r\n return !(_.isNull(val) || _.isUndefined(val) || _.isNaN(val));\r\n },\r\n \"Value must be set\"\r\n ];\r\n },\r\n\r\n /**\r\n * Value is not null or undefined or NaN or empty\r\n */\r\n notEmpty: function () {\r\n return [\r\n function (val) {\r\n return !(_.isNull(val) || _.isUndefined(val) || _.isNaN(val) || val == '' || (_.isArray(val) && val.length <= 0));\r\n },\r\n \"Value must be set\"\r\n ];\r\n },\r\n\r\n /**\r\n * Value length is between two arguments. For every entity that has toString method\r\n * @param {Integer|Number} longerThan\r\n * @param {Integer|Number} shorterThan\r\n */\r\n lenBetween: function (longerThan, shorterThan) {\r\n return [\r\n function (val) {\r\n if (_.isNull(val) || _.isUndefined(val) || _.isNaN(val)) {\r\n return false;\r\n }\r\n if (val.toString) {\r\n var strVal = val.toString();\r\n return (longerThan ? strVal.length >= longerThan : true) &&\r\n (shorterThan ? strVal.length <= shorterThan : true);\r\n }\r\n\r\n throw new Error(\"Not implemented\");\r\n },\r\n \"Value length must be between %s and %s\",\r\n longerThan.toString(),\r\n shorterThan.toString()\r\n ];\r\n },\r\n\r\n /**\r\n * Value length is longer than argument. For every entity that has toString method\r\n * @param {Integer|Number} longerThan\r\n */\r\n longer: function (longerThan) {\r\n return [\r\n function (val) {\r\n if (_.isNull(val) || _.isUndefined(val) || _.isNaN(val)) {\r\n return false;\r\n }\r\n if (val.toString) {\r\n var strVal = val.toString();\r\n return longerThan ? strVal.length >= longerThan : true;\r\n }\r\n\r\n throw new Error(\"Not implemented\");\r\n },\r\n \"Value length must be longer than %s\",\r\n longerThan.toString()\r\n ];\r\n },\r\n\r\n /**\r\n * Value length is shorter than argument. For every entity that has toString method\r\n * @param {Integer|Number} shorterThan\r\n */\r\n shorter: function (shorterThan) {\r\n return [\r\n function (val) {\r\n if (_.isNull(val) || _.isUndefined(val) || _.isNaN(val)) {\r\n return false;\r\n }\r\n if (val.toString) {\r\n var strVal = val.toString();\r\n return shorterThan ? strVal.length <= shorterThan : true;\r\n }\r\n\r\n throw new Error(\"Not implemented\");\r\n },\r\n \"Value length must be shorter than %s\",\r\n shorterThan.toString()\r\n ];\r\n },\r\n\r\n /**\r\n * Value is between two arguments. For numbers and dates only\r\n * @param {Integer|Number|Date} greaterThan\r\n * @param {Integer|Number|Date} lessThan\r\n */\r\n between: function (greaterThan, lessThan) {\r\n return [\r\n function (val, fieldDefinition) {\r\n if (_.isNull(val) || _.isUndefined(val) || _.isNaN(val)) {\r\n return false;\r\n }\r\n if (fieldDefinition.type == 'integer' || fieldDefinition.type == 'number' || fieldDefinition.type == 'date') {\r\n return (greaterThan ? val >= greaterThan : true) && (lessThan ? val <= lessThan : true);\r\n }\r\n\r\n throw new Error(\"Not implemented\");\r\n },\r\n \"Value must be between %s and %s\",\r\n greaterThan.toString(),\r\n lessThan.toString()\r\n ];\r\n },\r\n\r\n /**\r\n * Value is greater than argument. For numbers and dates only\r\n * @param {Integer|Number|Date} greaterThan\r\n */\r\n greater: function (greaterThan) {\r\n return [\r\n function (val, fieldDefinition) {\r\n if (_.isNull(val) || _.isUndefined(val) || _.isNaN(val)) {\r\n return false;\r\n }\r\n if (fieldDefinition.type == 'integer' || fieldDefinition.type == 'number' || fieldDefinition.type == 'date') {\r\n return (greaterThan ? val > greaterThan : true);\r\n }\r\n throw new Error(\"Not implemented\");\r\n },\r\n \"Value must be greater than %s\",\r\n greaterThan.toString()\r\n ]\r\n },\r\n\r\n /**\r\n * Value is greater or equal than argument. For numbers and dates only\r\n * @param {Integer|Number|Date} greaterOrEqualThan\r\n */\r\n greaterOrEqual: function (greaterOrEqualThan) {\r\n return [\r\n function (val, fieldDefinition) {\r\n if (_.isNull(val) || _.isUndefined(val) || _.isNaN(val)) {\r\n return false;\r\n }\r\n if (fieldDefinition.type == 'integer' || fieldDefinition.type == 'number' || fieldDefinition.type == 'date') {\r\n return greaterOrEqualThan ? val >= greaterOrEqualThan : true;\r\n }\r\n\r\n throw new Error(\"Not implemented\");\r\n },\r\n \"Value must be greater or equal than %s\",\r\n greaterOrEqualThan.toString()\r\n ]\r\n },\r\n\r\n /**\r\n * Value is less than argument. For numbers and dates only\r\n * @param {Integer|Number|Date} lessThan\r\n */\r\n less: function (lessThan) {\r\n return [\r\n function (val, fieldDefinition) {\r\n if (_.isNull(val) || _.isUndefined(val) || _.isNaN(val)) {\r\n return false;\r\n }\r\n if (fieldDefinition.type == 'integer' || fieldDefinition.type == 'number' || fieldDefinition.type == 'date') {\r\n return lessThan ? val < lessThan : true;\r\n }\r\n\r\n throw new Error(\"Not implemented\");\r\n },\r\n \"Value must be less than %s\",\r\n lessThan.toString()\r\n ]\r\n },\r\n\r\n /**\r\n * Value is less or equal than argument. For numbers and dates only\r\n * @param {Integer|Number|Date} lessOrEqualThan\r\n */\r\n lessOrEqual: function (lessOrEqualThan) {\r\n return [\r\n function (val, fieldDefinition) {\r\n if (_.isNull(val) || _.isUndefined(val) || _.isNaN(val)) {\r\n return false;\r\n }\r\n if (fieldDefinition.type == 'integer' || fieldDefinition.type == 'number' || fieldDefinition.type == 'date') {\r\n return (lessOrEqualThan ? val <= lessOrEqualThan : true);\r\n }\r\n\r\n throw new Error(\"Not implemented\");\r\n },\r\n \"Value must be less or equal than %s\",\r\n lessOrEqualThan.toString()\r\n ]\r\n },\r\n\r\n /**\r\n * Value is positive (greater than zero)\r\n */\r\n isPositive: function () {\r\n return [\r\n function (val, fieldDefinition) {\r\n if (_.isNull(val) || _.isUndefined(val) || _.isNaN(val)) {\r\n return false;\r\n }\r\n if (fieldDefinition.type == 'integer' || fieldDefinition.type == 'number') {\r\n return val > 0;\r\n }\r\n\r\n throw new Error(\"Not implemented\");\r\n },\r\n \"Value must be positive\"\r\n ]\r\n },\r\n\r\n /**\r\n * Value is positive or equal to zero\r\n */\r\n isPositiveOrZero: function () {\r\n return [\r\n function (val, fieldDefinition) {\r\n if (_.isNull(val) || _.isUndefined(val) || _.isNaN(val)) {\r\n return false;\r\n }\r\n if (fieldDefinition.type == 'integer' || fieldDefinition.type == 'number') {\r\n return val >= 0;\r\n }\r\n\r\n throw new Error(\"Not implemented\");\r\n },\r\n \"Value must be positive or equal to zero\"\r\n ]\r\n },\r\n\r\n /**\r\n * Value is negative (greater than zero)\r\n */\r\n isNegative: function () {\r\n return [\r\n function (val, fieldDefinition) {\r\n if (_.isNull(val) || _.isUndefined(val) || _.isNaN(val)) {\r\n return false;\r\n }\r\n if (fieldDefinition.type == 'integer' || fieldDefinition.type == 'number') {\r\n return val < 0;\r\n }\r\n\r\n throw new Error(\"Not implemented\");\r\n },\r\n \"Value must be negative\"\r\n ]\r\n },\r\n\r\n /**\r\n * Value is positive or equal to zero\r\n */\r\n isNegativeOrZero: function () {\r\n return [\r\n function (val, fieldDefinition) {\r\n if (_.isNull(val) || _.isUndefined(val) || _.isNaN(val)) {\r\n return false;\r\n }\r\n if (fieldDefinition.type == 'integer' || fieldDefinition.type == 'number') {\r\n return val <= 0;\r\n }\r\n\r\n throw new Error(\"Not implemented\");\r\n },\r\n \"Value must be negative or equal to zero\"\r\n ]\r\n }\r\n })\r\n\r\n;","angular.module('env.data.rest.model.representationModel', [])\r\n\r\n .factory('RepresentationModel', function ($log, $q, $injector, RepresentationModelFieldTypes) {\r\n\r\n /**\r\n * Representation (client-side) model\r\n * @param {ModelDefinition} modelDefinition model definition\r\n * @param {Object} [proto] plain prototype of new model\r\n * @constructor\r\n */\r\n function RepresentationModel(modelDefinition, proto) {\r\n\r\n /**\r\n * Model Definition\r\n * @type {ModelDefinition}\r\n */\r\n this._modelDefinition = modelDefinition;\r\n\r\n this._proto = proto;\r\n\r\n this._rest = $injector.get(\"rest\", \"RepresentationModel\");\r\n\r\n /**\r\n * Current state of representation model\r\n * @type {Object}\r\n */\r\n this.$model = this._modelDefinition.newModel(); // basic init\r\n\r\n /**\r\n * Clean(non-changed) client-side object\r\n * @type {Object}\r\n */\r\n this._originalModel = {};\r\n\r\n /**\r\n * Server-side original model. Do not change this model!\r\n * @type {Object}\r\n */\r\n this._serverObject = {};\r\n\r\n /**\r\n * Hook for instance detecting\r\n */\r\n this.isRepresentationModel = true;\r\n\r\n this._initProto();\r\n this._initCustomMethods();\r\n }\r\n\r\n RepresentationModel.prototype._initProto = function () {\r\n var _this = this;\r\n if (this._proto) {\r\n _.forEach(this._modelDefinition.getFields(), function (fieldDef) {\r\n if (!fieldDef.subResource) {\r\n _this.$model[fieldDef.name] = _.clone(_this._proto[fieldDef.name]);\r\n }\r\n });\r\n }\r\n }\r\n\r\n RepresentationModel.prototype._initCustomMethods = function () {\r\n var _this = this;\r\n _.forEach(this._modelDefinition.getMethods(), function (method, methodName) {\r\n if (!_this[methodName]) {\r\n var localMethod = method;\r\n _this[methodName] = function () {\r\n return localMethod.apply(_this, [_this._rest, _this].concat([].slice.call(arguments)));\r\n };\r\n } else {\r\n $log.warn(_.str.sprintf(\"Can't init custom method %s. Field or method with such name already exists. Check %s model definition\", methodName, _this._modelDefinition.getType()));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Async initialization of model (with sub resources initialization)\r\n * @param {Object} [dtoObject] server-side object\r\n * @returns {!Promise.} promise of current model\r\n */\r\n RepresentationModel.prototype.initAsync = function (dtoObject) {\r\n var _this = this;\r\n _this._serverObject = dtoObject;\r\n var promises = [];\r\n _.forEach(_.sortBy(this._modelDefinition.getFields(), \"subResource\"), function (fieldDef) {\r\n promises.push(_this._initFieldAsync(fieldDef));\r\n });\r\n return $q.all(promises).then(function () {\r\n _this._originalModel = _this._deepCloneClientModel(_this.$model);\r\n return _this;\r\n });\r\n }\r\n\r\n /**\r\n * Deep clone for every field except RepresentationModels\r\n * @param model\r\n * @return {*}\r\n */\r\n RepresentationModel.prototype._deepCloneClientModel = function (model) {\r\n var _this = this;\r\n var clone = _.clone(model);\r\n _.each(clone, function (value, key) {\r\n if (value == null) {\r\n clone[key] = value;\r\n } else if (_.isArray(value)) {\r\n if (_.every(value, e => e == null || e.isRepresentationModel)) {\r\n clone[key] = value.slice();\r\n } else {\r\n clone[key] = _this._deepCloneClientModel(value);\r\n }\r\n } else if (value.isRepresentationModel) {\r\n clone[key] = value;\r\n } else if (_.isPlainObject(value)) {\r\n clone[key] = _this._deepCloneClientModel(value);\r\n } else if (_.isDate(value)) {\r\n clone[key] = new Date(value.getTime());\r\n }\r\n });\r\n return clone;\r\n }\r\n\r\n /**\r\n * Async initialization of model field\r\n * @param {FieldDefinition} fieldDefinition field definition\r\n * @returns {!Promise.} promise of initialized field\r\n */\r\n RepresentationModel.prototype._initFieldAsync = function (fieldDefinition) {\r\n var _this = this;\r\n var deferred = $q.defer();\r\n if (fieldDefinition.subResource) {\r\n var init = fieldDefinition.get(_this._rest, _this, _this._serverObject, fieldDefinition);\r\n if (init && _.isPromise(init)) {\r\n init.then(\r\n function (subResource) {\r\n deferred.resolve(_this._setField(fieldDefinition, subResource));\r\n },\r\n function (err) {\r\n deferred.reject(err);\r\n });\r\n } else if (init && _.isFunction(init)) {\r\n deferred.resolve(fieldDefinition, _this._setField(fieldDefinition, init()));\r\n } else {\r\n deferred.resolve(fieldDefinition, _this._setField(fieldDefinition, init));\r\n }\r\n } else {\r\n if (_this._serverObject) {\r\n _this._setField(fieldDefinition, _this._serverObject[fieldDefinition.serverName]);\r\n }\r\n deferred.resolve(_this.$model[fieldDefinition.name]);\r\n }\r\n\r\n return deferred.promise;\r\n }\r\n\r\n RepresentationModel.prototype.saveAndTransform = function () {\r\n var _this = this;\r\n var promises = [];\r\n _.forEach(this._modelDefinition.getFields(), function (fieldDef) {\r\n if (fieldDef.save) {\r\n var p = fieldDef.save(_this._rest, _this);\r\n if (p && _.isPromise(p)) {\r\n promises.push(p);\r\n }\r\n }\r\n });\r\n\r\n return $q.all(promises).then(\r\n function (resp) {\r\n _this._buildOriginalModel();\r\n _this._toServerModel();\r\n return _this._serverObject;\r\n }\r\n );\r\n }\r\n\r\n RepresentationModel.prototype._buildOriginalModel = function () {\r\n var _this = this;\r\n _.clearObject(_this._originalModel);\r\n _.forEach(_this._modelDefinition.getFields(), function (fieldDef) {\r\n if (!fieldDef.subResource) {\r\n _this._originalModel[fieldDef.serverName] = _this.$model[fieldDef.name];\r\n }\r\n });\r\n return _this._originalModel;\r\n }\r\n\r\n /**\r\n * Transform representation model to server-side model\r\n * @returns {Object} copy of server-side model\r\n */\r\n RepresentationModel.prototype._toServerModel = function () {\r\n var _this = this;\r\n _this._serverObject = _this._serverObject || {};\r\n var newServerObject = _.cloneDeep(_this._serverObject);\r\n\r\n _.forEach(_this._modelDefinition.getFields(), function (fieldDef) {\r\n if (!fieldDef.subResource) {\r\n newServerObject[fieldDef.serverName] = _this._encode(fieldDef, _this.$model[fieldDef.name]);\r\n }\r\n });\r\n _.resetObject(_this._serverObject, newServerObject);\r\n return _this._serverObject;\r\n }\r\n\r\n /**\r\n * Set field of the model\r\n * @param {FieldDefinition} fieldDefinition field definition\r\n * @param {*} [value] server object field value\r\n * @returns {*} field of the model\r\n */\r\n RepresentationModel.prototype._setField = function (fieldDefinition, value) {\r\n this.$model[fieldDefinition.name] = this._decode(fieldDefinition, value);\r\n return this.$model[fieldDefinition.name];\r\n }\r\n\r\n RepresentationModel.prototype._encode = function (fieldDefinition, value) {\r\n var _this = this;\r\n var encodedValue;\r\n var type = fieldDefinition.type;\r\n\r\n try {\r\n if (type == RepresentationModelFieldTypes.DYNAMIC) {\r\n encodedValue = _.cloneDeep(value);\r\n } else if (type == RepresentationModelFieldTypes.FLOAT) {\r\n encodedValue = _.clone(value);\r\n } else if (type == RepresentationModelFieldTypes.INTEGER) {\r\n encodedValue = _.clone(value);\r\n } else if (type == RepresentationModelFieldTypes.STRING) {\r\n encodedValue = _.clone(value);\r\n } else if (type == RepresentationModelFieldTypes.BOOLEAN) {\r\n encodedValue = _.clone(value);\r\n } else if (type == RepresentationModelFieldTypes.DATE) {\r\n if (value && _.isDate(value)) {\r\n encodedValue = value.toISOString();\r\n } else {\r\n encodedValue = _.clone(value);\r\n }\r\n } else if (type == RepresentationModelFieldTypes.ARRAY) {\r\n encodedValue = _.clone(value);\r\n } else if (type == RepresentationModelFieldTypes.MODEL) {\r\n encodedValue = value;\r\n }\r\n } catch (error) {\r\n $log.warn(_.str.sprintf(\"Encode of field crashed. Model type: %s; Field name: %s; Server value: %s\", _this.getType(), fieldDefinition.name, value), error);\r\n encodedValue = null;\r\n }\r\n\r\n if (fieldDefinition.encode) {\r\n try {\r\n return fieldDefinition.encode(value, encodedValue, _this, _this._rest);\r\n } catch (error) {\r\n $log.warn(_.str.sprintf(\"Custom encode function crashed. Model type: %s; Field name: %s; Server value: %s\", _this.getType(), fieldDefinition.name, value), error);\r\n }\r\n }\r\n return encodedValue;\r\n }\r\n\r\n RepresentationModel.prototype._decode = function (fieldDefinition, value) {\r\n var _this = this;\r\n var decodedValue;\r\n var type = fieldDefinition.type;\r\n\r\n try {\r\n if (type == RepresentationModelFieldTypes.DYNAMIC) {\r\n decodedValue = _.cloneDeep(value);\r\n } else if (type == RepresentationModelFieldTypes.FLOAT) {\r\n decodedValue = parseFloat(value);\r\n } else if (type == RepresentationModelFieldTypes.INTEGER) {\r\n decodedValue = parseInt(value);\r\n } else if (type == RepresentationModelFieldTypes.STRING) {\r\n decodedValue = value ? value.toString() : null;\r\n } else if (type == RepresentationModelFieldTypes.BOOLEAN) {\r\n decodedValue = !!(value && (value == true || value.toLowerCase() == \"true\" || value == \"1\" || value.toLowerCase() == \"yes\"));\r\n } else if (type == RepresentationModelFieldTypes.DATE) {\r\n if (value) {\r\n if (_.isString(value)) {\r\n try {\r\n if (value.indexOf('Z') < 0) { // anyway we support only ISO strings\r\n decodedValue = new Date(value + 'Z');\r\n } else {\r\n decodedValue = new Date(value);\r\n }\r\n } catch (error) {\r\n $log.warn(_.str.sprintf(\r\n \"Incorrect date format in server object. Model type: %s; Field name: %s; Server value: %s\",\r\n _this.getType(),\r\n fieldDefinition.name,\r\n value),\r\n error);\r\n }\r\n } else if (_.isDate(value)) {\r\n decodedValue = value;\r\n } else {\r\n $log.warn(_.str.sprintf(\r\n \"Incorrect date format in server object. Model type: %s; Field name: %s; Server value: %s\",\r\n _this.getType(),\r\n fieldDefinition.name,\r\n value));\r\n }\r\n }\r\n } else if (type == RepresentationModelFieldTypes.ARRAY) {\r\n decodedValue = (!value || !_.isArray(value)) ? [] : _.clone(value);\r\n } else if (type == RepresentationModelFieldTypes.MODEL) {\r\n decodedValue = value;\r\n }\r\n } catch (error) {\r\n $log.warn(_.str.sprintf(\"Decoding of field crashed. Model type: %s; Field name: %s; Server value: %s\", _this.getType(), fieldDefinition.name, value), error);\r\n decodedValue = null;\r\n }\r\n\r\n if (fieldDefinition.decode) {\r\n try {\r\n return fieldDefinition.decode(value, decodedValue, _this, _this._rest);\r\n } catch (error) {\r\n $log.warn(_.str.sprintf(\"Custom decode function crashed. Model type: %s; Field name: %s; Server value: %s\", _this.getType(), fieldDefinition.name, value), error);\r\n }\r\n }\r\n return decodedValue;\r\n }\r\n\r\n /**\r\n * Get model type\r\n * @returns {string}\r\n */\r\n RepresentationModel.prototype.getType = function () {\r\n return this._modelDefinition.getType();\r\n }\r\n\r\n /**\r\n * Get model definition\r\n * @returns {ModelDefinition}\r\n */\r\n RepresentationModel.prototype.getDefinition = function () {\r\n return this._modelDefinition;\r\n }\r\n\r\n /**\r\n * Get model ID\r\n * @returns {string}\r\n */\r\n RepresentationModel.prototype.getId = function () {\r\n return this.$model[this._modelDefinition.getIdPropertyName()];\r\n }\r\n\r\n /**\r\n * Get original version of server-side model, if exists\r\n * @returns {*}\r\n */\r\n RepresentationModel.prototype.getServerModel = function () {\r\n return !this._serverObject ? null : _.cloneDeep(this._serverObject);\r\n }\r\n\r\n /**\r\n * Get original client-side model\r\n * @returns {*}\r\n */\r\n RepresentationModel.prototype.getOriginalModel = function () {\r\n return _.cloneDeep(this._originalModel);\r\n }\r\n\r\n /**\r\n * Reset changes\r\n */\r\n RepresentationModel.prototype.reset = function () {\r\n var _this = this;\r\n _.forEach(this._modelDefinition.getFields(), function (fieldDef) {\r\n if (!fieldDef.subResource) {\r\n _this.$model[fieldDef.name] = _this._originalModel[fieldDef.name];\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Check model is modified. Checks only dirtiness of own fields that can actually be saved on server.\r\n */\r\n RepresentationModel.prototype.isDirty = function (fieldName) {\r\n var _this = this;\r\n return _.any(_this._modelDefinition.getFields(),\r\n function (fieldDef) {\r\n return !fieldDef.subResource &&\r\n (!fieldName || fieldName === fieldDef.name) &&\r\n !_.isEqual(_this._originalModel[fieldDef.name], _this.$model[fieldDef.name]);\r\n });\r\n }\r\n\r\n /**\r\n * Check model is new (created on client-side and not saved yet)\r\n */\r\n RepresentationModel.prototype.isNew = function () {\r\n return !this._serverObject;\r\n }\r\n\r\n /**\r\n * Validate model\r\n * @returns {Array} Array of the validation errors\r\n */\r\n RepresentationModel.prototype.validate = function () {\r\n return []; // todo\r\n }\r\n\r\n /**\r\n * Is model valid. Note, that this function executes full validation cycle\r\n * @returns {boolean}\r\n */\r\n RepresentationModel.prototype.isValid = function () {\r\n return true; // todo\r\n }\r\n\r\n /**\r\n * Validate field\r\n * @param {string} fieldName name of the field\r\n * @returns {Array} Array of the validation errors\r\n */\r\n RepresentationModel.prototype.validateField = function (fieldName) {\r\n return []; // todo\r\n }\r\n\r\n /**\r\n * Full unRest clone of current model. Result will contain plain objects tree only\r\n * @returns {Object}\r\n */\r\n RepresentationModel.prototype.unRestClone = function () {\r\n return plainCloneRecursive(this.$model, {});\r\n }\r\n\r\n\r\n /**\r\n * Recursive unRest cloning function\r\n * @param {Array|Object} original original object\r\n * @param {Array|Object} target destination object\r\n * @returns {Array|Object} target object\r\n */\r\n function plainCloneRecursive(original, target) {\r\n _.forEach(original, function (value, key) {\r\n if (value && _.isArray(value)) {\r\n target[key] = plainCloneRecursive(value, []);\r\n } else if (value && value.isRepresentationModel) {\r\n target[key] = plainCloneRecursive(value.$model, {});\r\n } else {\r\n target[key] = _.cloneDeep(value);\r\n }\r\n });\r\n return target;\r\n }\r\n\r\n return (RepresentationModel);\r\n })\r\n\r\n;\r\n","angular.module('env.data.rest.model.modelFactory', [])\r\n\r\n .provider('modelFactory', function () {\r\n\r\n /**\r\n * Hash of model configs, waiting for initialization\r\n */\r\n var modelDefinitionsInitQueue = {};\r\n\r\n /**\r\n * Create new a model definition\r\n * @param {string} modelType model type name\r\n * @param {*} config model definition configuration\r\n */\r\n function define(modelType, config) {\r\n if (modelDefinitionsInitQueue[modelType]) {\r\n throw new Error(_.str.sprintf(\"Duplicate model definition: %s\", modelType));\r\n }\r\n modelDefinitionsInitQueue[modelType] = config;\r\n }\r\n\r\n _.extend(this, {\r\n define: define\r\n });\r\n\r\n this.$get = function ($log, ModelDefinition) {\r\n\r\n function ModelFactory(initQueue) {\r\n\r\n /**\r\n * Hash of defined models\r\n */\r\n var modelDefinitions = {};\r\n\r\n constructor();\r\n\r\n /**\r\n * Isolated constructor\r\n */\r\n function constructor() {\r\n // Helper hash - model type to array of dependencies\r\n var dependenciesHash = {};\r\n\r\n _.forEach(initQueue, function (value, key) {\r\n dependenciesHash[key] = getDependencies(value);\r\n });\r\n\r\n var i;\r\n // trying to init over and over again until we initialize everything we can\r\n do {\r\n i = 0;\r\n _.forEach(initQueue, function (value, key) {\r\n if (checkDependenciesAreInitialized(key)) {\r\n initializeModelDefinition(key, value);\r\n i++;\r\n }\r\n });\r\n } while (i != 0);\r\n\r\n checkConfiguration();\r\n\r\n /**\r\n * Get dependencies array of model definition\r\n * @param {*} config model definition configuration\r\n * @returns {Array} array of model types names\r\n */\r\n function getDependencies(config) {\r\n var result = [];\r\n if (!config.extend) {\r\n // hm...\r\n } else if (_.isArray(config.extend)) {\r\n _.forEach(config.extend, function (el) {\r\n if (_.isString(el)) {\r\n result.push(el);\r\n }\r\n });\r\n } else if (_.isString(config.extend)) {\r\n result.push(config.extend);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Check dependencies of model definition are initialized\r\n * @param {string} modelType model type\r\n * @returns {boolean} true if all dependencies of model definition are initialized\r\n */\r\n function checkDependenciesAreInitialized(modelType) {\r\n return !_.find(dependenciesHash[modelType], function (req) {\r\n return !modelDefinitions[req];\r\n });\r\n }\r\n\r\n /**\r\n * Initialize model definition from config\r\n * @param {string} modelType model type\r\n * @param {*} config model definition configuration\r\n */\r\n function initializeModelDefinition(modelType, config) {\r\n var definition = new ModelDefinition(modelType, config, modelDefinitions);\r\n delete initQueue[modelType];\r\n modelDefinitions[modelType] = definition;\r\n }\r\n\r\n /**\r\n * Check if some model definitions was not initialized\r\n */\r\n function checkConfiguration() {\r\n var wasErrors = false;\r\n _.forEach(initQueue, function (config, modelType) {\r\n $log.warn(\"Can't initialize model definition `%s`. Please check model definition configuration.\", modelType);\r\n wasErrors = true;\r\n });\r\n if (wasErrors) {\r\n throw new Error(\"Unable to finish initialization of `modelFactory`. See errors before.\");\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get model definition names\r\n * @returns {Array} array of declared model types\r\n */\r\n function getDeclaredTypes() {\r\n return _.keys(modelDefinitions);\r\n }\r\n\r\n /**\r\n * Get model definition by its name\r\n * @param {string} modelType type of the model\r\n * @returns {ModelDefinition}\r\n */\r\n function getDefinition(modelType) {\r\n return modelDefinitions[modelType];\r\n }\r\n\r\n _.extend(this, {\r\n getDefinition: getDefinition,\r\n getDeclaredTypes: getDeclaredTypes\r\n });\r\n }\r\n\r\n return new ModelFactory(modelDefinitionsInitQueue);\r\n }\r\n })\r\n\r\n;","angular.module('env.data.rest.model.modelDefinition', [])\r\n\r\n .factory('ModelDefinition', function (FieldDefinition) {\r\n\r\n var defaultModel = {\r\n idProperty: 'id',\r\n fields: {\r\n id: {}\r\n },\r\n validate: function () {\r\n return true;\r\n }\r\n };\r\n\r\n /**\r\n * Model definition\r\n * @param {string} modelDefinitionType unique type of model\r\n * @param {*} modelDefinitionConfiguration configuration of model\r\n * @param {*} allDefinitions all defined model definitions\r\n * @constructor\r\n */\r\n function ModelDefinition(modelDefinitionType, modelDefinitionConfiguration, allDefinitions) {\r\n this._modelDefinitionType = modelDefinitionType;\r\n this._modelDefinitionConfiguration = modelDefinitionConfiguration;\r\n this._allDefinitions = allDefinitions;\r\n\r\n this._errPrefix = _.str.sprintf(\"`%s` model definition error: \", this._modelDefinitionType);\r\n\r\n //region constructor\r\n\r\n if (!this._modelDefinitionType || !_.isString(this._modelDefinitionType)) {\r\n throw new Error(this._errPrefix + \"model type must be set\");\r\n }\r\n if (!this._modelDefinitionConfiguration) {\r\n throw new Error(this._errPrefix + \"model definition config must be set\");\r\n }\r\n if (!this._allDefinitions) {\r\n this._allDefinitions = [];\r\n }\r\n this.config = this._validateAndFixConfig(this.config);\r\n this.config = this._processParents(this.config);\r\n this.config = this._processFields(this.config);\r\n this.config = this._processCustomMethods(this.config);\r\n\r\n //endregion\r\n }\r\n\r\n /**\r\n * Validate config, fix missed fields, set default values\r\n * @param {*} cfg - config\r\n */\r\n ModelDefinition.prototype._validateAndFixConfig = function (cfg) {\r\n var _this = this;\r\n cfg = _.defaults(this._modelDefinitionConfiguration, defaultModel); // defaults\r\n cfg.type = this._modelDefinitionType;\r\n\r\n // region `extend` field\r\n\r\n var extend = [];\r\n if (cfg.extend) {\r\n if (_.isArray(cfg.extend)) {\r\n _.forEach(cfg.extend, function (el) {\r\n if (_.isString(el)) {\r\n extend.push(el);\r\n }\r\n });\r\n } else if (_.isString(cfg.extend)) {\r\n extend.push(cfg.extend);\r\n }\r\n }\r\n _.forEach(extend, function (el) {\r\n if (!_this._allDefinitions[el]) {\r\n throw new Error(_this._errPrefix + \"not all parents was initialized\");\r\n }\r\n });\r\n cfg.extend = extend;\r\n\r\n // endregion\r\n\r\n return cfg;\r\n }\r\n\r\n ModelDefinition.prototype._processParents = function (cfg) {\r\n var oldExtend = cfg.extend.slice(0);\r\n var params = [true, {}].concat(this._getParentConfigs(cfg), cfg);\r\n cfg = $.extend.apply(null, params);\r\n cfg.extend = oldExtend;\r\n return cfg;\r\n }\r\n\r\n /**\r\n * Get array of parent configs (in order of it's definition)\r\n * @param cfg model definition config\r\n */\r\n ModelDefinition.prototype._getParentConfigs = function (cfg) {\r\n var _this = this;\r\n var parentConfigs = [];\r\n for (var i = 0; i < cfg.extend.length; i++) {\r\n var parentConfig = _this._allDefinitions[cfg.extend[i]].getConfig();\r\n parentConfigs.push(parentConfig);\r\n }\r\n return parentConfigs.reverse();\r\n }\r\n\r\n ModelDefinition.prototype._processFields = function (cfg) {\r\n var _this = this;\r\n this._fields = [];\r\n _.forEach(cfg.fields, function (fieldDefinition, filedName) {\r\n _this._fields.push(new FieldDefinition(filedName, fieldDefinition));\r\n });\r\n return cfg;\r\n }\r\n\r\n ModelDefinition.prototype._processCustomMethods = function (cfg) {\r\n var methods = {};\r\n if (cfg.methods) {\r\n _.forEach(cfg.methods, function (method, methodName) {\r\n if (method && _.isFunction(method)) {\r\n methods[methodName] = method;\r\n }\r\n });\r\n }\r\n cfg.methods = methods;\r\n return cfg;\r\n }\r\n\r\n //region Public methods\r\n\r\n /**\r\n * Get model definition name\r\n * @returns {string} unique model definition name\r\n */\r\n ModelDefinition.prototype.getType = function () {\r\n return this.config.type;\r\n };\r\n\r\n /**\r\n * Get definition config\r\n * @returns {*}\r\n */\r\n ModelDefinition.prototype.getConfig = function () {\r\n return this.config;\r\n };\r\n\r\n /**\r\n * Get field definitions\r\n * @returns {Array} array of FieldDefinition\r\n */\r\n ModelDefinition.prototype.getFields = function () {\r\n return this._fields;\r\n };\r\n\r\n /**\r\n * Get route of current type\r\n * @returns {string}\r\n */\r\n ModelDefinition.prototype.getUrl = function () {\r\n return this.config.url || this.config.type;\r\n };\r\n\r\n /**\r\n * Get name of the model identifier property (must be unique for current definition)\r\n * @returns {string}\r\n */\r\n ModelDefinition.prototype.getIdPropertyName = function () {\r\n return this.config.idProperty || 'id';\r\n };\r\n\r\n /**\r\n * Create absolutely new model with default fields\r\n */\r\n ModelDefinition.prototype.newModel = function () {\r\n var newModel = {};\r\n\r\n _.forEach(this._fields, function (field) {\r\n if (!field.subResource) {\r\n newModel[field.name] = field.defaultValue ? field.defaultValue : null;\r\n }\r\n });\r\n\r\n return newModel;\r\n };\r\n\r\n /**\r\n * Get custom methods\r\n * @returns {Array.}\r\n */\r\n ModelDefinition.prototype.getMethods = function () {\r\n return this.config.methods || {};\r\n };\r\n\r\n //endregion\r\n\r\n return (ModelDefinition);\r\n\r\n })\r\n\r\n;\r\n","angular.module('env.data.rest.model', [\r\n\r\n 'env.data.rest.model.fieldDefinition',\r\n 'env.data.rest.model.modelDefinition',\r\n 'env.data.rest.model.representationModel',\r\n 'env.data.rest.model.modelFactory',\r\n 'env.data.rest.model.validationTemplates'\r\n]);","angular.module('env.data.rest.model.fieldDefinition', [])\r\n\r\n .constant('FieldValidator',\r\n /**\r\n * Representation model field validator\r\n * @param {function|Array} validate validate function or array of function\r\n * @param {string} [message] validation message\r\n * @param {Array} [messageArgs] message arguments (for insertion into %s in message string)\r\n * @constructor\r\n */\r\n function FieldValidator(validate, message, messageArgs) {\r\n var _this = this;\r\n if (_.isFunction(validate)) {\r\n _this.validators = [validate];\r\n } else if (_.isArray(validate) && _.every(validate, _.isFunction)) {\r\n _this.validators = validate;\r\n } else {\r\n throw new Error(\"Illegal argument exception\");\r\n }\r\n _this.message = message;\r\n _this.messageArgs = messageArgs;\r\n _this.getFormattedMessage = function (translateFunc) {\r\n if (!_this.message) {\r\n return;\r\n }\r\n var msg = translateFunc ? translateFunc(_this.message) : _this.message;\r\n if (_this.messageArgs && _this.messageArgs.length > 0) {\r\n return _.str.sprintf.apply(this, [msg].concat(_this.messageArgs));\r\n }\r\n return msg;\r\n };\r\n })\r\n\r\n // enum of available field types\r\n .constant('RepresentationModelFieldTypes', {\r\n DEFAULT: 'dynamic',\r\n DYNAMIC: 'dynamic',\r\n OBJECT: 'OBJECT',\r\n FLOAT: 'number',\r\n INTEGER: 'integer',\r\n STRING: 'string',\r\n BOOLEAN: 'boolean',\r\n DATE: 'date',\r\n ARRAY: 'array',\r\n MODEL: 'model'\r\n })\r\n\r\n .factory('FieldDefinition', function (RepresentationModelFieldTypes, FieldValidator, gettextCatalog) {\r\n\r\n\r\n /**\r\n * Definition of field\r\n * @param {string} fieldName - name of the field\r\n * @param {*} fieldConfig - field definition config\r\n * @constructor\r\n */\r\n function FieldDefinition(fieldName, fieldConfig) {\r\n\r\n this._fieldName = fieldName;\r\n this._fieldConfig = fieldConfig;\r\n\r\n /**\r\n * Client-side name of the field\r\n * @type {string}\r\n */\r\n this.name = this._fieldConfig.name || this._fieldName;\r\n\r\n /**\r\n * Server-side name of the field\r\n * @type {string}\r\n */\r\n this.serverName = this._fieldConfig.serverName || this.name;\r\n\r\n /**\r\n * Field type\r\n * @see {@link RepresentationModelFieldTypes} for further information.\r\n * @type {string|RepresentationModelFieldTypes.DEFAULT}\r\n */\r\n this.type = this._fieldConfig.type || RepresentationModelFieldTypes.DEFAULT;\r\n\r\n /**\r\n * Default value\r\n */\r\n this.defaultValue = this._fieldConfig.defaultValue;\r\n\r\n /**\r\n * Is sub resource\r\n * @type {boolean}\r\n */\r\n this.subResource = !!this._fieldConfig.subResource;\r\n\r\n this.get = (!this._fieldConfig.get || !_.isFunction(this._fieldConfig.get))\r\n ? _.noop\r\n : this._fieldConfig.get.bind(this);\r\n this.save = (!this._fieldConfig.save || !_.isFunction(this._fieldConfig.save))\r\n ? null\r\n : this._fieldConfig.save.bind(this);\r\n\r\n this.encode = _.isFunction(this._fieldConfig.encode)\r\n ? this._fieldConfig.encode.bind(this)\r\n : null;\r\n this.decode = _.isFunction(this._fieldConfig.decode)\r\n ? this._fieldConfig.decode.bind(this)\r\n : null;\r\n\r\n /**\r\n * Validators\r\n */\r\n this._validators = [];\r\n\r\n this._initValidators(this._fieldConfig.validators);\r\n }\r\n\r\n FieldDefinition.prototype._initValidators = function (parts) {\r\n var _this = this;\r\n if (parts) {\r\n if (_.isArray(parts)) {\r\n parts = _.flatten(parts);\r\n for (var i = 0; i < parts.length; i++) {\r\n if (_.isFunction(parts[i])) {\r\n if (parts[i + 1] && _.isString(parts[i + 1])) {\r\n var msgArgs = [];\r\n for (var j = i + 2; j < parts.length && _.isString(parts[j]); j++) {\r\n msgArgs.push(parts[j]);\r\n }\r\n _this._validators.push(new FieldValidator(parts[i], parts[i + 1], msgArgs));\r\n i = j - 1;\r\n } else {\r\n _this._validators.push(new FieldValidator(parts[i]));\r\n }\r\n } else if (parts instanceof FieldValidator) {\r\n _this._validators.push(_.clone(parts));\r\n }\r\n }\r\n } else if (parts instanceof FieldValidator) {\r\n _this._validators.push(parts);\r\n } else if (_.isFunction(parts)) {\r\n _this._validators.push(new FieldValidator(parts));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Validate field\r\n * @param {Object} value value to validate\r\n * @param {RepresentationModel} model model\r\n * @returns {Array} array of validation errors\r\n */\r\n FieldDefinition.prototype.validate = function (value, model) {\r\n var _this = this;\r\n var errors = this._validateInternal(value);\r\n if (errors.length > 0) { // to prevent type errors in custom validators\r\n return errors;\r\n }\r\n\r\n var wasUnmarkedError = false;\r\n var wasErrorLocal = false;\r\n _.forEach(_this._validators, function (validator) {\r\n wasErrorLocal = false;\r\n _.forEach(validator.validators, function (vFunc) {\r\n var result = vFunc(value, _this, model);\r\n if (result != true) {\r\n if (_.isString(result)) {\r\n errors.push(result);\r\n } else if (_.isArray(result) && _.every(result, _.isString)) {\r\n errors.concat(result);\r\n } else {\r\n wasErrorLocal = true;\r\n }\r\n }\r\n });\r\n var msg = validator.getFormattedMessage(gettextCatalog);\r\n if (msg) {\r\n errors.push(msg);\r\n wasErrorLocal = false;\r\n } else if (wasErrorLocal) {\r\n wasUnmarkedError = true;\r\n }\r\n });\r\n\r\n if (wasUnmarkedError) {\r\n errors.push(gettextCatalog.getString(\"Field is not valid\")); // default alert\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n /**\r\n * Validate field internal\r\n * @param {Object} value - value to validate\r\n * @returns {Array} array of validation errors\r\n */\r\n FieldDefinition.prototype._validateInternal = function (value) {\r\n var errors = [];\r\n if (_.isNull(value) || _.isUndefined()) {\r\n return errors;\r\n }\r\n\r\n if (this.type == RepresentationModelFieldTypes.FLOAT) {\r\n if (!_.isNumber(value) || !_.isFinite(value)) {\r\n errors.push(gettextCatalog.getString(\"Value must be number\"));\r\n }\r\n } else if (this.type == RepresentationModelFieldTypes.INTEGER) {\r\n if (!_.isNumber(value) || !_.isFinite(value) || (!_.isNaN(value) && (value % 1 === 0))) {\r\n errors.push(gettextCatalog.getString(\"Value must be integer number\"));\r\n }\r\n } else if (this.type == RepresentationModelFieldTypes.STRING) {\r\n if (!_.isString(value)) {\r\n errors.push(gettextCatalog.getString(\"Value must be string\"));\r\n }\r\n } else if (this.type == RepresentationModelFieldTypes.BOOLEAN) {\r\n if (!_.isBoolean(value)) {\r\n errors.push(gettextCatalog.getString(\"Value must be true or false\"));\r\n }\r\n } else if (this.type == RepresentationModelFieldTypes.DATE) {\r\n if (!_.isDate(value)) {\r\n errors.push(gettextCatalog.getString(\"Value must be Date\"));\r\n }\r\n }\r\n\r\n return errors;\r\n }\r\n\r\n return (FieldDefinition);\r\n }\r\n )\r\n\r\n;\r\n","angular.module('ui.user.settings', [])\r\n\r\n .config(function ($stateProvider, customTemplateResolverProvider) {\r\n\r\n $stateProvider.state('client.settings', {\r\n url: '/settings',\r\n template: customTemplateResolverProvider.get('settings.html', 'app/ui/user/settings/settings.html'),\r\n controller: 'UserSettingsController',\r\n data: {pageTitle: 'OrderManager: User Settings'}\r\n });\r\n\r\n })\r\n\r\n .controller('UserSettingsController', function ($scope, $state, gettextCatalog, toastr, userSettings, gridTextSearchService) {\r\n $scope.tabs = [\r\n \"app/ui/user/settings/tabs/gridSettings.html\",\r\n \"app/ui/user/settings/tabs/otherSettings.html\"\r\n ];\r\n\r\n function initSettings() {\r\n userSettings.getSettings().then(function(settings) {\r\n $scope.settings = settings;\r\n\r\n $scope.treeDataSource = { data: new kendo.observableHierarchy($scope.settings.gridSettings.textSearchFields) };\r\n $scope.treeOptions = {\r\n checkboxes: {\r\n checkChildren: true\r\n },\r\n loadOnDemand: false\r\n };\r\n });\r\n }\r\n\r\n initSettings();\r\n\r\n $scope.save = function () {\r\n userSettings.getSettings().then(function(settings) {\r\n settings.gridSettings.textSearchFields = $scope.treeDataSource.data.toJSON(); //Method of the kendo.observableHierarchy object to return initial structure\r\n userSettings.save();\r\n \r\n gridTextSearchService.fixGridTextSearchConfig(); // to delete empty `items` collections\r\n \r\n $state.go('client.home'); // redirect back to home\r\n toastr.success(gettextCatalog.getString('User settings saved!'));\r\n });\r\n };\r\n\r\n $scope.cancel = function () {\r\n userSettings.getSettings().then(function(settings) {\r\n $scope.treeDataSource = kendo.observableHierarchy(settings.gridSettings.textSearchFields);\r\n $state.go('client.home'); // redirect back to home\r\n });\r\n };\r\n })\r\n\r\n;\r\n","angular.module('ui.user.profile', [])\r\n\r\n .config(function ($stateProvider, customTemplateResolverProvider) {\r\n $stateProvider.state('client.userprofile', {\r\n url: '/profile',\r\n template: customTemplateResolverProvider.get('profile.html', 'app/ui/user/profile/profile.html'),\r\n controller: 'UserProfileController',\r\n data: {pageTitle: 'OrderManager: User Profile'}\r\n });\r\n })\r\n\r\n .controller('UserProfileController', function ($rootScope, $scope, $state, $log, gettextCatalog, toastr, usersRepository, appLocale, rest, authService, serverLocalization) {\r\n\r\n $scope.passwordValidationRegex = /.*/g;\r\n $scope.passwordValidationMessage = \"\";\r\n\r\n $scope.titles = [\r\n gettextCatalog.getString('Mr.'),\r\n gettextCatalog.getString('Ms.'),\r\n gettextCatalog.getString('Mrs.'),\r\n gettextCatalog.getString('Dr.')\r\n ];\r\n\r\n rest.events.on(\"modelUpdated\", function (model) {\r\n if (model && model == $scope.restUser) {\r\n $scope.restUser = $scope.restUser; // force scope renew\r\n }\r\n });\r\n //Declare a handler to reset user object in case of leaving the User Profile view without saving user first\r\n $rootScope.$on(\"$stateChangeStart\", function (event, toState, toParams, fromState, fromParams) {\r\n if (fromState.name === \"client.userprofile\" && $scope.restUser.isDirty()) {\r\n $scope.restUser.reset();\r\n }\r\n });\r\n\r\n usersRepository.getCurrentUser()\r\n .then(function (user) {\r\n $scope.restUser = user;\r\n });\r\n\r\n //We need to get list of OM server supported languages, then we need to match it agains \r\n //UI translations supported languages and finally allow user to choose only those languages\r\n //that supported both by OM server and localisation (have translations actually)\r\n appLocale.getLanguagesList().then(function (serverSupportedLanguages) {\r\n appLocale.getTranslatedLanguageList().then(\r\n function (hash) {\r\n var list = [];\r\n list.push({name: gettextCatalog.getString('Select Language...'), code: null});\r\n\r\n for (var key in hash) {\r\n if (hash.hasOwnProperty(key) && _.indexOf(serverSupportedLanguages, key) !== -1) {\r\n list.push({\r\n name: hash[key],\r\n code: key\r\n });\r\n }\r\n }\r\n $scope.languages = list;\r\n },\r\n function (err) {\r\n toastr.warning(gettextCatalog.getString(\"Can't load list of available languages\"), err);\r\n });\r\n });\r\n\r\n $scope.saveAndClose = function () { // todo model validation\r\n if (!$scope.restUser) {\r\n return;\r\n }\r\n usersRepository.saveCurrentUser()\r\n .then(function () {\r\n return appLocale.setCurrentLanguageFromCurrentUser()\r\n .catch(function () {\r\n toastr.error(_.str.sprintf(gettextCatalog.getString(\"Can't set system language to %s\"), appLocale.getCurrentLanguage()));\r\n });\r\n },\r\n function () {\r\n toastr.error('We were unable to save user');\r\n })\r\n .then(function () {\r\n $state.go('client.home'); // redirect back to home\r\n toastr.success(gettextCatalog.getString('Profile updated!'));\r\n }, function (error) {\r\n $log.error('Error while setting current user language: %s', error);\r\n });\r\n };\r\n\r\n //region password changing\r\n\r\n //custom validation rule 'password equal'\r\n $scope.pwdValidatorOptions = {\r\n rules: {\r\n pwdequal: function (input) {\r\n if (input.is(\"[name=confirmNewPwd]\")) {\r\n return input.val() === $scope.newPwd;\r\n }\r\n return true;\r\n }\r\n }\r\n };\r\n\r\n $scope.bringUpPasswordEditForm = function () {\r\n $scope.clearInput();\r\n $scope.changeOptions();\r\n\r\n //We need to get password validation regex and message to later use with kendo-validator\r\n authService.getPasswordValidationRegex().then(function (regex) {\r\n $scope.passwordValidationRegex = regex;\r\n $scope.passwordValidationMessage = gettextCatalog.getString(\"PasswordStrength.ValidationMessage\");\r\n $scope.changePwdForm.open();\r\n });\r\n };\r\n\r\n //validates and performs changing\r\n $scope.changePwd = function () {\r\n if ($scope.pwdValidator.validate()) {\r\n authService.editPassword($scope.oldPwd, $scope.newPwd)\r\n .then(function (result) {\r\n toastr.success(gettextCatalog.getString('Password has been changed'), gettextCatalog.getString('Success'));\r\n $scope.changePwdForm.close();\r\n }, function (result) {\r\n if (result.status = 400) {\r\n toastr.error(gettextCatalog.getString('Old password is incorrect'), gettextCatalog.getString('Error'));\r\n } else {\r\n toastr.error(gettextCatalog.getString('Something went wrong.'), gettextCatalog.getString('Error'));\r\n }\r\n\r\n });\r\n }\r\n };\r\n\r\n $scope.clearInput = function () {\r\n $scope.oldPwd = '';\r\n $scope.newPwd = '';\r\n $scope.confirmNewPwd = '';\r\n };\r\n\r\n $scope.changePwdFormWidth = 400;\r\n\r\n //changes position before each rendering\r\n $scope.changeOptions = function () {\r\n $scope.changePwdForm.setOptions({\r\n position: {\r\n top: '15%',\r\n left: (jQuery(window).width() - $scope.changePwdFormWidth) / 2\r\n },\r\n animation: om.config.kendoWindowDefaultOptions.animation\r\n });\r\n };\r\n\r\n //endregion\r\n\r\n });\r\n","angular.module('ui.user.notifications', [])\r\n\r\n .config(function ($stateProvider, customTemplateResolverProvider) {\r\n $stateProvider.state('client.notifications', {\r\n url: '/notifications',\r\n template: customTemplateResolverProvider.get('notifications.html', 'app/ui/user/notifications/notifications.html'),\r\n controller: 'UserNotificationsController',\r\n data: {pageTitle: 'OrderManager: Notifications'}\r\n });\r\n\r\n })\r\n\r\n .controller('UserNotificationsController', function ($scope, $state) {\r\n\r\n\r\n })\r\n\r\n;\r\n","angular.module('ui.shell',\r\n [\r\n 'ui.home',\r\n 'ui.order',\r\n 'ui.help',\r\n 'ui.user'\r\n ])\r\n .config(function ($stateProvider, customTemplateResolverProvider) {\r\n $stateProvider.state('client', {\r\n url: '/client?hidemenu',\r\n template: customTemplateResolverProvider.get('shell.html', 'app/ui/shell/shell.html'),\r\n controller: 'ClientController',\r\n\r\n data: {pageTitle: 'OrderManager: Tracking Client'},\r\n\r\n resolve: {\r\n translationsInitPromise: function (appLocale) {\r\n return appLocale.loading.ensureLoaded(); // hold state initialization until promise will be resolved\r\n },\r\n currentUser: function (usersRepository) {\r\n return usersRepository.getCurrentUser();\r\n }\r\n }\r\n });\r\n })\r\n\r\n .controller('ClientController', function ClientController($log, $state, $scope, $localStorage, customResourceResolver, currentUser,\r\n serverInfoService, authService) {\r\n var MENU_MINIMIZED_STORAGE_NAME = \"Nav-Menu-Minimized\";\r\n\r\n $scope.user = currentUser;\r\n $scope.hidemenu = ($state.params.hidemenu && $state.params.hidemenu === 'true');\r\n $scope.minimizedMenu = false;\r\n\r\n $scope.submitSearch = function () {\r\n if ($scope.search && $scope.search != null && $scope.search !== '') {\r\n $state.go('client.orders',\r\n {\r\n step: $state.params.step ? $state.params.step : 'all-open',\r\n search: $scope.search,\r\n exact: false\r\n });\r\n }\r\n $scope.search = null;\r\n };\r\n\r\n initController();\r\n \r\n function initController() {\r\n $scope.minimizedMenu = $localStorage.getItem(MENU_MINIMIZED_STORAGE_NAME);\r\n\r\n //Init menu state watcher and its destructor\r\n var minimizedMenuWatcherDestructor = $scope.$watch(\r\n 'minimizedMenu',\r\n function (newVal, oldVal) {\r\n if (newVal !== oldVal) {\r\n //Store into localStorage\r\n $localStorage.setItem(MENU_MINIMIZED_STORAGE_NAME, newVal);\r\n }\r\n }\r\n );\r\n $scope.$on('$destroy', function () {\r\n minimizedMenuWatcherDestructor();\r\n });\r\n\r\n //overrides the url param according to the customization config\r\n customResourceResolver.resolveConfig('shell-config')\r\n .then(function (shellConfig) {\r\n if (shellConfig) {\r\n //$scope.hidemenu = shellConfig.hideMenu === true;\r\n $scope.newOrderAllowed = shellConfig.newOrderAllowed;\r\n }\r\n });\r\n\r\n //hack that will hide loading screen, when main state is ready\r\n if (window.omHideLoadingScreenCallback) {\r\n window.omHideLoadingScreenCallback();\r\n }\r\n\r\n authService.events.on('login', function () {\r\n //And check on re-login if we need to ask user to reload current tab to load latest client app version from server\r\n return serverInfoService.checkServerVersionAndAskReloadIfNeeded();\r\n });\r\n }\r\n\r\n })\r\n;\r\n","angular.module('ui.shell')\r\n .directive('rightPanelView', function (customTemplateResolver) {\r\n return {\r\n restrict: 'E',\r\n replace: 'true',\r\n templateUrl: 'app/ui/shell/views/rightPanel.html' //customTemplateResolver.get('rightPanel.html', 'app/ui/shell/views/rightPanel.html'),\r\n };\r\n });","angular.module('ui.shell')\r\n .directive('leftPanelView', function (customTemplateResolver) {\r\n return {\r\n restrict: 'E',\r\n replace: 'true',\r\n templateUrl: 'app/ui/shell/views/leftPanel.html', // customTemplateResolver.get('leftPanel.html', 'app/ui/shell/views/leftPanel.html')\r\n controller: function ($rootScope, $scope, $state, authService, $element, customResourceResolver, serverInfoService, gettextCatalog) {\r\n\r\n customResourceResolver.resolveConfig('left-panel-custom-links-config', null, {})\r\n .then(function (customNavMenuLinks) {\r\n $scope.customNavMenuLinks = customNavMenuLinks != null ? customNavMenuLinks : [];\r\n });\r\n serverInfoService.getVersion()\r\n .then(function(version) {\r\n $scope.serverVersion = _.str.sprintf(gettextCatalog.getString('version %s'), version);\r\n $rootScope.serverVersionNumber = version;\r\n });\r\n\r\n $element.find('a').click(function () {\r\n $element.blur();\r\n });\r\n\r\n var flyOut = $element.children().first();\r\n flyOut.click(function () {\r\n if ($element.attr('focused')) {\r\n $element.removeAttr('focused');\r\n $element.blur();\r\n } else {\r\n $element.attr('focused', true);\r\n\r\n }\r\n });\r\n $element.blur(function () {\r\n $element.removeAttr('focused');\r\n });\r\n\r\n $scope.state = $state;\r\n\r\n $scope.stateGo = function (event, stateToGo) {\r\n event.isDefaultPrevented = false;\r\n $state.go(stateToGo);\r\n return true;\r\n };\r\n\r\n $scope.logout = function () {\r\n authService.logout().then(\r\n function (resp) {\r\n $state.go('login');\r\n },\r\n function (resp) {\r\n // something goes wrong? Never mind!\r\n $state.go('login');\r\n });\r\n };\r\n }\r\n };\r\n });\r\n","angular.module('ui.shell')\r\n .directive('headerPanelView', function (customTemplateResolver) {\r\n return {\r\n restrict: 'E',\r\n replace: 'true',\r\n templateUrl: 'app/ui/shell/views/headerPanel.html', // customTemplateResolver.get('headerPanel.html', 'app/ui/shell/views/headerPanel.html'),\r\n controller: function ($scope, $state, usersRepository) {\r\n $scope.currentUser = null;\r\n usersRepository.getCurrentUser()\r\n .then(function (user) {\r\n $scope.currentUser = user;\r\n });\r\n }\r\n };\r\n });","angular.module('ui.shell')\r\n .directive('footerPanelView', function (customTemplateResolver) {\r\n return {\r\n restrict: 'E',\r\n replace: 'true',\r\n templateUrl: 'app/ui/shell/views/footerPanel.html', // customTemplateResolver.get('footerPanel.html', 'app/ui/shell/views/footerPanel.html')\r\n controller: function ($scope, $state) {\r\n $scope.currentDate = new Date();\r\n }\r\n };\r\n });","angular.module('ui.shell')\r\n .directive('centrePanelView', function (customTemplateResolver) {\r\n return {\r\n restrict: 'E',\r\n replace: 'true',\r\n templateUrl: 'app/ui/shell/views/centrePanel.html' // customTemplateResolver.get('centrePanel.html', 'app/ui/shell/views/centrePanel.html')\r\n };\r\n });","//Usage:\r\n// Simple example with angular expression, lets say $scope.var = 2, then link will be active if location is /url/2 :\r\n//\r\n//\r\n//Bootstrap example, parent li will get active class:\r\n//
  • \r\n// \r\n//
  • \r\n//\r\n//Example with nested urls, link will be active if any nested url is active (i.e. /url/1, /url/2, url/1/2/...)\r\n//\r\n//\r\n//Complex example, link points to one url (/url1) but will be active if another is selected (/url2):\r\n//\r\n//\r\n//Example with disabled link, if it is not active it will have 'disabled' class:\r\n//\r\n//All active-link-* attributes can be used in any combination, so very complex conditions could be implemented.\r\n//\r\nangular.module('ui.shell')\r\n .directive('activeLink', ['$location',\r\n function ($location) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, elem, attrs) {\r\n var path = attrs.activeLink ? 'activeLink' : 'href';\r\n var target = angular.isDefined(attrs.activeLinkParent) ? elem.parent() : elem;\r\n var disabled = angular.isDefined(attrs.activeLinkDisabled) ? true : false;\r\n var nested = angular.isDefined(attrs.activeLinkNested) ? true : false;\r\n\r\n function inPath(needle, haystack) {\r\n var current = (haystack === needle);\r\n if (nested) {\r\n current |= (haystack.indexOf(needle + '/') === 0);\r\n }\r\n\r\n return current;\r\n }\r\n\r\n function toggleClass(linkPath, locationPath) {\r\n // remove hash prefix and trailing slashes\r\n linkPath = linkPath ? linkPath.replace(/^#/, '').replace(/\\/+$/, '') : '';\r\n locationPath = locationPath.replace(/\\/+$/, '');\r\n\r\n if (linkPath && inPath(linkPath, locationPath)) {\r\n target.addClass('active');\r\n if (disabled) {\r\n target.removeClass('disabled');\r\n }\r\n } else {\r\n target.removeClass('active');\r\n if (disabled) {\r\n target.addClass('disabled');\r\n }\r\n }\r\n }\r\n\r\n // watch if attribute value changes / evaluated\r\n attrs.$observe(path, function (linkPath) {\r\n toggleClass(linkPath, $location.path());\r\n });\r\n\r\n // watch if location changes\r\n scope.$watch(\r\n function () {\r\n return $location.path();\r\n },\r\n function (newPath) {\r\n toggleClass(attrs[path], newPath);\r\n }\r\n );\r\n }\r\n };\r\n }\r\n ]);\r\n","angular.module('ui.report.reportViewer', [])\r\n\r\n .directive('reportViewer', function () {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'app/ui/report/reportViewer/reportViewer.html',\r\n scope: {},\r\n controller: 'ReportViewerController',\r\n controllerAs: 'ReportViewerController'\r\n }\r\n })\r\n\r\n .controller('ReportViewerController', function ($window, $scope, $rootScope, $q, $log, $sce, $http, $interval, gettextCatalog,\r\n authService, reportManager, orderItemsGridSharedSettings, gridDataProvider,\r\n usersRepository, workflowRepository, $customisationConfig, customResourceResolver,\r\n serverLocalization, uiLocalization, $state, $timeout) {\r\n var rootReportApi = om.config.build.baseUrl + \"/report\";\r\n var loadingHtml = $sce.trustAsHtml(\"
    \" + gettextCatalog.getString(\"Loading...\") + \"
    \");\r\n var reportConfig = reportManager.getReportConfig();\r\n var reportQuery = (reportConfig.query || reportConfig.report.query);\r\n\r\n angular.extend($scope, {\r\n enableToolbar: enableToolbar,\r\n onPageChange: onPageChange,\r\n onActivate: onActivate,\r\n buildReport: buildReport,\r\n getReportDocument: getReportDocument,\r\n getDocumentProgress: getDocumentProgress,\r\n cancelDocument: cancelDocument,\r\n moveUp: moveUp,\r\n getReportParamsForUser: getReportParamsForUser\r\n });\r\n\r\n init();\r\n\r\n function init() {\r\n $scope.isBusy = true;\r\n $scope.selectedOrderItemId = orderItemsGridSharedSettings.getSelectedOrderItemId();\r\n\r\n var itemReportTitle = _.str.sprintf(gettextCatalog.getString('OM: Item %s Report: %s'), $scope.selectedOrderItemId, reportManager.getReportConfig().report.name);\r\n var itemsReportTitle = _.str.sprintf(gettextCatalog.getString('OM: Report: %s'), reportManager.getReportConfig().report.name);\r\n\r\n $rootScope.pageTitle = $scope.selectedOrderItemId ? itemReportTitle : itemsReportTitle;\r\n\r\n $scope.dataSource = new kendo.data.DataSource({\r\n data: [],\r\n pageSize: 1\r\n });\r\n $scope.exportOptions = {\r\n dataSource: [\r\n { text: gettextCatalog.getString(\"Pdf\"), value: \"Pdf\", selected: true },\r\n { text: gettextCatalog.getString(\"Xls\"), value: \"Xls\" },\r\n { text: gettextCatalog.getString(\"Xlsx\"), value: \"Xlsx\" },\r\n { text: gettextCatalog.getString(\"Rtf\"), value: \"Rtf\" },\r\n { text: gettextCatalog.getString(\"Mht\"), value: \"Mht\" },\r\n { text: gettextCatalog.getString(\"Html\"), value: \"Html\" },\r\n { text: gettextCatalog.getString(\"Text\"), value: \"Text\" },\r\n { text: gettextCatalog.getString(\"Csv\"), value: \"Csv\" },\r\n { text: gettextCatalog.getString(\"Image\"), value: \"Image\" }\r\n ],\r\n dataTextField: \"text\",\r\n dataValueField: \"value\"\r\n };\r\n $scope.exportFormat = \"Pdf\";\r\n $scope.step = orderItemsGridSharedSettings.getStepFilter() || 'all-open';\r\n\r\n $q.all([usersRepository.getCurrentUser(), gridDataProvider.getReportQuery()])\r\n .then(function (results) {\r\n var user = results[0];\r\n var gridDataProviderReportQuery = results[1];\r\n\r\n //Double-check if the report was configured with dynamic query (function) and try to evaluate it\r\n //passing the grid's query. Unfortunately we can't acquire selected item reference here, so omitting it.\r\n if (angular.isFunction(reportQuery)) {\r\n reportQuery = reportQuery(gridDataProviderReportQuery);\r\n }\r\n\r\n //See if the resulted report query is array of element IDs or not.\r\n //If it is a string, we have to wrap it with double-quotes, otherwise - not.\r\n if (!_.isArray(reportQuery)) {\r\n reportQuery = '\"' + reportQuery + '\"';\r\n } else {\r\n reportQuery = '' + JSON.stringify(reportQuery) + '';\r\n }\r\n\r\n $scope.request = {\r\n \"ReportName\": reportConfig.report.reportFileName,\r\n \"Query\": reportQuery,\r\n //we use either specific custom query of the report specified in customisation or\r\n //just the query that is used to show the current data set user is being viewing at\r\n //query and orderBy from report specified in customisation have higher priority over current-context data\r\n \"OrderBy\": reportConfig.report.orderBy || reportConfig.orderBy,\r\n \"Format\": \"Html\",\r\n \"BaseEntityName\": reportConfig.report.baseEntityName,\r\n \"Parameters\": $scope.getReportParamsForUser(user)\r\n };\r\n\r\n initStepHeader();\r\n\r\n $scope.exportItems = {\r\n items: [\r\n {\r\n template: \"
    \",\r\n overflow: \"never\"\r\n },\r\n { type: \"separator\" },\r\n {\r\n template: \"
    \",\r\n overflow: \"never\"\r\n },\r\n { type: \"separator\" },\r\n {\r\n template: \"\",\r\n overflow: \"never\"\r\n },\r\n {\r\n type: \"button\",\r\n attributes: { \"title\": gettextCatalog.getString(\"Export a report and save it to the disk\") },\r\n imageUrl: \"./assets/icons/save.png\",\r\n id: \"saveExport\"\r\n },\r\n {\r\n type: \"button\",\r\n attributes: { \"title\": gettextCatalog.getString(\"Export a report and show it in a new window\") },\r\n imageUrl: \"./assets/icons/save-page.png\",\r\n id: \"showExport\"\r\n },\r\n { type: \"separator\" },\r\n {\r\n type: \"button\",\r\n attributes: { \"title\": gettextCatalog.getString(\"PrintReport\") },\r\n imageUrl: \"./assets/icons/print.png\",\r\n id: \"printExport\"\r\n },\r\n {\r\n type: \"button\",\r\n attributes: { \"title\": gettextCatalog.getString(\"PrintCurrentPage\") },\r\n imageUrl: \"./assets/icons/print-page.png\",\r\n id: \"printExportPage\"\r\n\r\n }\r\n ],\r\n click: function (e) {\r\n switch (e.id) {\r\n case \"printExportPage\":\r\n case \"printExport\": {\r\n $scope.enableToolbar(false);\r\n var firstPage = (e.id === \"printExportPage\" ? $scope.pager.page() - 1 : 0);\r\n var lastPage = (e.id === \"printExportPage\" ? firstPage : $scope.dataSource.data().length - 1);\r\n $scope.getReportDocument($scope.documentId, \"Html\", firstPage, lastPage, null).then(function (data) {\r\n var printFrame = \r\n $('')\r\n .appendTo('.report-container');\r\n var contentWindow = printFrame[0].contentWindow;\r\n if (angular.isDefined(contentWindow) && contentWindow != null) {\r\n contentWindow.onafterprint = function() {\r\n if (printFrame) {\r\n printFrame\r\n .remove(); //it's safe to remove the hidden frame now from the DOM\r\n }\r\n\r\n $timeout(function() {\r\n $scope.enableToolbar(true);\r\n });\r\n };\r\n\r\n printFrame.contents().find('html').html(data);\r\n contentWindow.focus(); //for IE\r\n\r\n if (navigator.userAgent.toLowerCase().indexOf('msie') !== -1 ||\r\n navigator.userAgent.toLowerCase().indexOf('edge') !== -1 ||\r\n navigator.userAgent.toLowerCase().indexOf('trident') !== -1) {\r\n contentWindow.document.execCommand('print', false, null);\r\n } else {\r\n contentWindow.print();\r\n }\r\n } else {\r\n $timeout(function () {\r\n $scope.enableToolbar(true);\r\n });\r\n }\r\n\r\n }, function (reason) {\r\n $timeout(function () {\r\n $scope.enableToolbar(true);\r\n });\r\n if (reason && 'FullException' in reason) {\r\n alert(reason.FullException);\r\n }\r\n });\r\n break;\r\n }\r\n case \"saveExport\": {\r\n\r\n $scope.enableToolbar(false);\r\n var form = $('
    ');\r\n var params = {\r\n DocumentId: $scope.documentId,\r\n Format: $scope.exportFormat,\r\n FirstPage: 0,\r\n LastPage: $scope.dataSource.data().length - 1,\r\n ContentDisposition: \"attachment\",\r\n Authorization: authService.getToken()\r\n };\r\n $.each(params, function (k, v) {\r\n form.append($(''));\r\n });\r\n $('body').append(form);\r\n var document = $(window)[0].document;\r\n //document.cookie = \"Authorization=\" + authService.getToken() + \"; path=/\";\r\n document.cookie = \"OMVersion=\" + authService.omVersion + \"; path=/\";\r\n var options = {};\r\n\r\n form.submit(function () {\r\n $scope.enableToolbar(true);\r\n });\r\n form.submit();\r\n break;\r\n }\r\n case \"showExport\": {\r\n $scope.enableToolbar(false);\r\n\r\n var wnd = window.open(\"about:blank\", \"reportExport\", \"width=800.height=600\");\r\n var form = $('');\r\n var params = {\r\n DocumentId: $scope.documentId,\r\n Format: $scope.exportFormat,\r\n FirstPage: 0,\r\n LastPage: $scope.dataSource.data().length - 1,\r\n ContentDisposition: \"inline\",\r\n Authorization: authService.getToken()\r\n };\r\n $.each(params, function (k, v) {\r\n form.append($(''));\r\n });\r\n $('body').append(form);\r\n var document = $(window)[0].document;\r\n //document.cookie = \"Authorization=\" + authService.getToken() + \"; path=/\";\r\n document.cookie = \"OMVersion=\" + authService.omVersion + \"; path=/\";\r\n var options = {};\r\n form.attr('target', 'reportExport');\r\n form.submit(function () {\r\n $scope.enableToolbar(true);\r\n });\r\n\r\n form.submit();\r\n break;\r\n }\r\n\r\n }\r\n }\r\n };\r\n\r\n //And finally trigger the routine that will build and show report\r\n $scope.onActivate();\r\n });\r\n }\r\n\r\n function getReportParamsForUser(user) {\r\n var params = [];\r\n try {\r\n var dynamicTextLanguage = user.getCulture() || 'en-GB';\r\n var localTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone || 'Europe/London';\r\n\r\n params.push({ Name: 'dynamicTextLanguage', Value: dynamicTextLanguage });\r\n params.push({ Name: 'localTimezone', Value: localTimezone });\r\n } catch (error) {\r\n\r\n }\r\n\r\n return params;\r\n }\r\n\r\n function onPageChange() {\r\n $scope.enableToolbar(false);\r\n var page = $scope.pager.page() - 1;\r\n $scope.content = loadingHtml;\r\n $scope.getReportDocument($scope.documentId, \"Html\", page, page, null)\r\n .then(function (data) {\r\n $scope.content = $sce.trustAsHtml(\"
    \" + data + \"
    \");\r\n $scope.enableToolbar(true);\r\n }, function (reason) {\r\n $scope.enableToolbar(true);\r\n if (reason && 'FullException' in reason) alert(reason.FullException);\r\n });\r\n }\r\n\r\n function onActivate() {\r\n $scope.enableToolbar(false);\r\n $scope.content = loadingHtml;\r\n $scope.dataSource.data([]);\r\n $scope.buildReport()\r\n .then(function (data) {\r\n $scope.content = $sce.trustAsHtml(\"
    \" + data + \"
    \");\r\n $scope.enableToolbar(true);\r\n }, function (reason) {\r\n $scope.enableToolbar(true);\r\n if (reason && 'FullException' in reason) {\r\n alert(reason.FullException);\r\n }\r\n });\r\n }\r\n\r\n function buildReport() {\r\n $scope.cancelled = false;\r\n $scope.building = true;\r\n $scope.progress = 0;\r\n var deferred = $q.defer();\r\n\r\n $http({\r\n \"url\": rootReportApi + \"/build\",\r\n \"method\": \"POST\",\r\n \"data\": $scope.request,\r\n \"headers\": { \"Content-Type\": \"application/json\" }\r\n })\r\n .success(function (data, status, headers, config) {\r\n })\r\n .error(function (data, status, headers, config) {\r\n if (status == 401) {\r\n $log.error(\"Got 401 response from server on report build request.\");\r\n deferred.reject();\r\n } else {\r\n $log.error(\"Got error response from server on report build request: \" + JSON.stringify(data));\r\n deferred.reject(data);\r\n }\r\n $scope.building = false;\r\n }).then(function (data) {\r\n var error = null;\r\n $scope.documentId = data.data.documentId;\r\n var interval = $interval(function () {\r\n if (error != null || $scope.cancelled) {\r\n //If we got error or cancellation requested\r\n $interval.cancel(interval);\r\n $scope.building = false;\r\n if ($scope.cancelled) {\r\n $scope.content = $sce.trustAsHtml(\"
    \"\r\n + gettextCatalog.getString(\"Report generation cancelled.\") + \"
    \");\r\n } else if (error != null) {\r\n $log.error(\"Error during report generation: \" + JSON.stringify(error));\r\n }\r\n deferred.reject(error);\r\n } else if ($scope.progress >= 100) {\r\n //stop polling for the report generation progress when it's ready\r\n $interval.cancel(interval);\r\n $log.debug(\"Report generation progress 100%. Cancelling progress polling.\");\r\n //and download the generated report\r\n $scope.getReportDocument($scope.documentId, \"Html\", 0, 0, null).then(function (data) {\r\n $log.debug(\"Generated report downloaded.\");\r\n deferred.resolve(data);\r\n $scope.building = false;\r\n });\r\n } else {\r\n //Keep asking the server for the report generation progress\r\n $scope.getDocumentProgress($scope.documentId).then(function (result) {\r\n if (result.progress !== -1) {\r\n if (result.progress >= $scope.progress) {\r\n $scope.progress = result.progress;\r\n }\r\n $log.debug(\"Report generation progress: \" + result.progress);\r\n } else {\r\n $scope.cancelled = result.cancelled;\r\n $log.debug(\"Report generation progress invalid. Cancelled report generation progress polling routine.\");\r\n }\r\n }, function (reason) {\r\n $log.error(\"Error during report generation progress request: \" + JSON.stringify(reason));\r\n error = reason;\r\n deferred.reject(reason);\r\n $scope.building = false;\r\n });\r\n }\r\n }, 500);\r\n\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n function getReportDocument(id, format, firstPage, lastPage, contentDisposition) {\r\n\r\n var deferred = $q.defer();\r\n var request = {\r\n \"DocumentId\": id,\r\n \"Format\": format,\r\n \"FirstPage\": firstPage,\r\n \"LastPage\": lastPage,\r\n \"ContentDisposition\": contentDisposition\r\n };\r\n $http({\r\n \"url\": rootReportApi + \"/document\",\r\n \"method\": \"POST\",\r\n \"data\": request,\r\n \"headers\": { \"Content-Type\": \"application/json\" }\r\n })\r\n .success(function (data, status, headers, config) {\r\n deferred.resolve(data);\r\n })\r\n .error(function (data, status, headers, config) {\r\n if (status == 401) {\r\n $log.error(\"Got 401 response from server on generated report download request.\");\r\n deferred.reject();\r\n } else {\r\n $log.error(\"Error during generated report download: \" + JSON.stringify(data));\r\n deferred.reject(data);\r\n }\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n function getDocumentProgress(id) {\r\n\r\n var deferred = $q.defer();\r\n var request = {\r\n \"DocumentId\": id\r\n };\r\n $http({\r\n \"url\": rootReportApi + \"/document/progress/\" + encodeURIComponent(id),\r\n \"method\": \"GET\"\r\n })\r\n .success(function (data, status, headers, config) {\r\n var pages = Array.apply(null, Array(data.pageCount)).map(function (x, i) {\r\n return i;\r\n });\r\n $scope.dataSource.data(pages);\r\n $scope.dataSource.page(1);\r\n\r\n deferred.resolve(data);\r\n })\r\n .error(function (data, status, headers, config) {\r\n if (status == 401) {\r\n $log.error(\"Got 401 response from server on report generation progress request.\");\r\n deferred.reject();\r\n } else {\r\n $log.error(\"Got error response from server on report generation progress request.\");\r\n deferred.reject(data);\r\n }\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n function cancelDocument(id) {\r\n\r\n var deferred = $q.defer();\r\n var request = {\r\n \"DocumentId\": id\r\n };\r\n\r\n if (id) {\r\n $http({\r\n \"url\": rootReportApi + \"/document/cancel/\" + encodeURIComponent(id),\r\n \"method\": \"GET\"\r\n })\r\n .success(function (data, status, headers, config) {\r\n //do nothing here\r\n })\r\n .error(function (data, status, headers, config) {\r\n if (status == 401) {\r\n $log.error(\"Got 401 response from server on report generation cancel request.\");\r\n deferred.reject();\r\n } else {\r\n $log.error(\"Got error response from server on report generation cancel request.\");\r\n deferred.reject(data);\r\n }\r\n }).finally(function () {\r\n $scope.cancelled = true;\r\n });\r\n }\r\n return deferred.promise;\r\n }\r\n\r\n function enableToolbar(enable) {\r\n $scope.isBusy = !enable;\r\n }\r\n\r\n function initStepHeader() {\r\n $scope.stateDisplayName = \"\";\r\n $scope.stateIconName = \"\";\r\n\r\n return $q.all(\r\n [\r\n usersRepository.getCurrentUser(),\r\n workflowRepository.getSteps(),\r\n customResourceResolver.resolveWorkflow()\r\n ]\r\n ).then(function (data) {\r\n var allSteps = data[1];\r\n var currentUser = data[0];\r\n var workflowConfig = data[2];\r\n var stepDisplayName = \"All Items\";\r\n\r\n var isCustomer = currentUser.isCustomer();\r\n var step = _.find(allSteps, function (s) {\r\n return s.$model.code === $scope.step;\r\n });\r\n var stepConfig = _.find(workflowConfig.steps, function (s) {\r\n return s.code === $scope.step;\r\n });\r\n\r\n if (step) {\r\n stepDisplayName = isCustomer ? step.$model.publicNameResource : step.$model.nameResource;\r\n }\r\n\r\n var fallbackIconForStep = function (stepCode) {\r\n if (stepCode === \"all-open\") {\r\n return \"track\";\r\n }\r\n return $customisationConfig.hasResource(function (res) { return _.string.contains(res, stepCode + \".\"); }) ? stepCode : \"workflow\";\r\n };\r\n\r\n if ($scope.step && $scope.step !== \"all-open\") {\r\n $scope.stateDisplayName = serverLocalization.translate(stepDisplayName);\r\n $scope.stateIconName = angular.isUndefined(stepConfig) ? fallbackIconForStep($scope.step) :\r\n (angular.isDefined(stepConfig.publicImageResourceName) && isCustomer\r\n ? stepConfig.publicImageResourceName\r\n :\r\n (angular.isDefined(stepConfig.imageResourceName) ? stepConfig.imageResourceName :\r\n fallbackIconForStep($scope.step)));\r\n } else {\r\n var customFilter = orderItemsGridSharedSettings.getCustomFilter();\r\n if (customFilter) {\r\n $scope.stateDisplayName = gettextCatalog.getString(customFilter.name || \"Filtered Items\");\r\n $scope.stateIconName = customFilter.iconName || fallbackIconForStep($scope.step);\r\n } else {\r\n $scope.stateDisplayName = gettextCatalog.getString(\"All Items\");\r\n $scope.stateIconName = fallbackIconForStep($scope.step);\r\n }\r\n }\r\n \r\n });\r\n }\r\n\r\n function moveUp(documentId) {\r\n if (documentId && $scope.progress < 100) {\r\n //Cancel report generation if it's not generated yet\r\n $scope.cancelDocument(documentId);\r\n }\r\n if (reportConfig.backAction) {\r\n reportConfig.backAction();\r\n } else {\r\n //$state.go('client.orders', { step: $scope.step });\r\n $window.history.back();\r\n }\r\n }\r\n })\r\n\r\n ;\r\n","angular.module('ui.report.reportRouteContainer', [])\r\n\r\n .config(function ($stateProvider) {\r\n $stateProvider.state('client.report', {\r\n url: '/report',\r\n templateUrl: 'app/ui/report/reportRouteContainer/reportRouteContainer.html',\r\n data: {pageTitle: 'OM: Report'}\r\n });\r\n })\r\n\r\n .run(function ($rootScope, $state, reportManager, gettextCatalog, toastr) {\r\n $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\r\n if (toState.name === 'client.report' && !reportManager.getReportConfig()) {\r\n event.preventDefault();\r\n $state.go('client.home');\r\n toastr.warning('No context data configured for the report!', gettextCatalog.getString('Invalid Operation'));\r\n }\r\n });\r\n })\r\n\r\n;\r\n","angular.module('ui.order.orderItemCard.orderItemCardDataProvider', [])\r\n\r\n .service('orderItemCardDataProvider', function (gettextCatalog, $q, $log, toastr, batching,\r\n ordersRepository, orderItemsRepository, workflowRepository, categoryTypesRepository, categoriesRepository) {\r\n // Subscribers of Observer pattern\r\n // We use observers cause Angular doesn't track changes of $scope from 3rd party\r\n var subscribers = {};\r\n\r\n var orderItemId;\r\n var orderItem;\r\n var step;\r\n var order;\r\n\r\n var orderItemCategories;\r\n var orderItemWorkflowAudit;\r\n var categoryTypes;\r\n var categories;\r\n\r\n var _this = this;\r\n\r\n _.extend(_this, {\r\n // observer pattern subscription method\r\n onDataChange: onDataChange,\r\n\r\n //actions\r\n executeAction: executeAction,\r\n\r\n saveOrderItem: saveOrderItem,\r\n\r\n // setters\r\n setOrderItemId: setOrderItemId,\r\n\r\n // getters\r\n getOrderItemId: getOrderItemId,\r\n getOrderItem: getOrderItem,\r\n getStep: getStep,\r\n getOrder: getOrder,\r\n getOrderItemCategories: getOrderItemCategories,\r\n getOrderItemWorkflowAudit: getOrderItemWorkflowAudit,\r\n getCategoryTypes: getCategoryTypes,\r\n getCategories: getCategories\r\n });\r\n\r\n return _this;\r\n\r\n /**\r\n * Init all data for orderItem\r\n */\r\n function initOrderItem() {\r\n if (!orderItemId) {\r\n dropData();\r\n dataWasChanged();\r\n return;\r\n }\r\n\r\n var getOrderItemPromise = orderItemsRepository.getOrderItem(orderItemId)\r\n .then(\r\n function (_orderItem) {\r\n orderItem = _orderItem;\r\n order = orderItem.$model.order;\r\n step = orderItem.$model.stepCode;\r\n return ordersRepository.getOrder(orderItem.$model.orderId);\r\n },\r\n function (error) {\r\n $log.error(\"Can't load order item: \" + error.message);\r\n toastr.error(error.message, gettextCatalog.getString(\"Can't load order item\"));\r\n return $q.reject(null);\r\n });\r\n\r\n var getCategoriesPromise = $q.all([\r\n orderItemsRepository.getCategoriesForOrderItem(orderItemId),\r\n categoryTypesRepository.getCategoryTypes()\r\n ])\r\n .then(\r\n function (data) {\r\n //save all existing on server category types\r\n //and all categories linked to the order item\r\n orderItemCategories = data[0];\r\n categoryTypes = data[1];\r\n //return promise that will get all the categories for each type\r\n //marking the categories that already linked to specified order item\r\n return categoriesRepository\r\n .getCategoriesByTypeCodes(_.pluck(categoryTypes, '$model.code'))\r\n .then(function (categories) {\r\n //mark each category as linked if it exists in the list of linked to order item categories\r\n _.each(categories, function (c) {\r\n c.isLinked = _.any(orderItemCategories, function (oic) {\r\n return oic.$model.id == c.$model.id;\r\n });\r\n });\r\n return categories;\r\n });\r\n })\r\n .then(\r\n function (_categories) {\r\n categories = _categories;\r\n },\r\n function (error) {\r\n $log.error(\"Can't initialize categories: \" + error.message);\r\n toastr.error(error.message, gettextCatalog.getString(\"Can't initialize categories\"));\r\n return $q.reject(null);\r\n });\r\n\r\n var getOrderItemWorkflowAudiPromise = orderItemsRepository.getWorkflowAudit(orderItemId)\r\n .then(\r\n function(_orderItemWorkflowAudit) {\r\n orderItemWorkflowAudit = _orderItemWorkflowAudit;\r\n },\r\n function (error) {\r\n $log.error(\"Can't fetch orderItem workflow audit from server: \" + error.message);\r\n toastr.error(error.message, gettextCatalog.getString(\"Can't get Order Item workflow audit.\"));\r\n return $q.reject(null);\r\n }\r\n );\r\n\r\n $q.all(\r\n [\r\n getOrderItemPromise,\r\n getCategoriesPromise,\r\n getOrderItemWorkflowAudiPromise\r\n ])\r\n .then(\r\n function () {\r\n dataWasChanged();\r\n },\r\n function () {\r\n dataWasChanged();\r\n });\r\n }\r\n\r\n function dropData() {\r\n orderItemId = null;\r\n orderItem = null;\r\n step = null;\r\n order = null;\r\n categories = null;\r\n orderItemCategories = null;\r\n orderItemWorkflowAudit = null;\r\n }\r\n\r\n function saveOrderItem() {\r\n var orderToSave = order;\r\n var orderItemToSave = orderItem;\r\n\r\n if (!orderToSave || !orderItemToSave) {\r\n return $q.reject(null);\r\n }\r\n \r\n // Promises\r\n var saveOrderItemPromise = function () {\r\n return orderItemsRepository.saveOrderItem(orderItemToSave)\r\n .then(function (resp) {\r\n return resp;\r\n }, function (error) {\r\n if (error) {\r\n var em = (error.serverErrorMessage && _.str.startsWith(error.serverErrorMessage, \"Can not use EditOrderItem to change step.\"))\r\n ? gettextCatalog.getString(\"Item was updated on server. Please, review it before saving any changes.\")\r\n : error.serverErrorMessage || error.message;\r\n toastr.error(em, gettextCatalog.getString(\"Order item save failed\"));\r\n $log.error(\"OrderItem saving error: unable to save OrderItem. \\n\" + error.message);\r\n }\r\n return $q.reject(null);\r\n });\r\n };\r\n\r\n var saveOrderPromise = function () {\r\n return ordersRepository.saveOrder(orderToSave)\r\n .then(function (resp) {\r\n return resp;\r\n }, function (error) {\r\n if (error) {\r\n var em = error.serverErrorMessage || error.message;\r\n toastr.error(em, gettextCatalog.getString(\"Order save failed\"));\r\n $log.error(\"OrderItem saving error: unable to save Order. \\n\" + error.message);\r\n }\r\n return $q.reject(null);\r\n });\r\n };\r\n\r\n return $q.all([\r\n saveOrderItemPromise(),\r\n saveOrderPromise()\r\n ]);\r\n }\r\n\r\n function executeAction(actionCode, unlinkedCategories, linkedCategories) {\r\n // processing categories:\r\n // we need to loop through existing order item categories to see if anyone was unlinked\r\n // and through other categories to see if anyone was linked instead\r\n var toUnlink = _.filter(orderItemCategories, function (existingOrderItemCategory) {\r\n return _.any(unlinkedCategories, function (c) {\r\n return c.$model.id == existingOrderItemCategory.$model.id;\r\n });\r\n });\r\n var toLink = _.filter(linkedCategories, function (categoryToLink) {\r\n return !_.any(orderItemCategories, function (c) {\r\n return c.$model.id == categoryToLink.$model.id;\r\n });\r\n });\r\n\r\n // Copy all needed resources\r\n var actionCodeToSave = _.clone(actionCode);\r\n var stepCodeToSave = _.clone(step);\r\n var orderToSave = order;\r\n var orderItemToSave = orderItem;\r\n var orderItemIdToSave = orderItem.getId();\r\n var categoriesToLink = _.pluck(toLink, \"$model.id\");\r\n var categoriesToUnlink = _.pluck(toUnlink, \"$model.id\");\r\n\r\n // Promises\r\n\r\n var saveOrderItemPromise = function () {\r\n return orderItemsRepository.saveOrderItem(orderItemToSave)\r\n .then(function (resp) {\r\n return resp;\r\n }, function (error) {\r\n if (error) {\r\n var em = (error.serverErrorMessage && _.str.startsWith(error.serverErrorMessage, \"Can not use EditOrderItem to change step.\"))\r\n ? gettextCatalog.getString(\"Item was updated on server. Please, review it before saving any changes.\")\r\n : error.serverErrorMessage || error.message;\r\n toastr.error(em, gettextCatalog.getString(\"Order item save failed\"));\r\n $log.error(\"Action executing error: unable to save OrderItem. \\n\" + error.message);\r\n }\r\n return $q.reject(null);\r\n });\r\n };\r\n\r\n var saveOrderPromise = function () {\r\n return ordersRepository.saveOrder(orderToSave)\r\n .then(function (resp) {\r\n return resp;\r\n }, function (error) {\r\n if (error) {\r\n var em = error.serverErrorMessage || error.message;\r\n toastr.error(em, gettextCatalog.getString(\"Order save failed\"));\r\n $log.error(\"Action executing error: unable to save Order. \\n\" + error.message);\r\n }\r\n return $q.reject(null);\r\n });\r\n };\r\n\r\n var actionExecutePromise = function () {\r\n return workflowRepository.executeActionForOrderItem(stepCodeToSave, actionCodeToSave, orderItemIdToSave)\r\n .then(function (resp) {\r\n return resp;\r\n }, function (error) {\r\n if (error) {\r\n var em = error.serverErrorMessage || error.message;\r\n toastr.error(em, gettextCatalog.getString(\"Action can not be executed\"));\r\n $log.error(\"Action executing error: \\n\" + error.message);\r\n }\r\n return $q.reject(null);\r\n });\r\n };\r\n\r\n var unlinkCategoriesPromise = function () {\r\n return orderItemsRepository\r\n .unlinkCategoriesFromOrderItem(orderItemIdToSave, categoriesToUnlink)\r\n .then(function (resp) {\r\n return resp;\r\n }, function (error) {\r\n if (error) {\r\n var em = error.serverErrorMessage || error.message;\r\n toastr.error(em, gettextCatalog.getString(\"Unable to unlink Order Item categories\"));\r\n $log.error(\"Action executing error: unable to unlink Order Item categories\\n\" + error.message);\r\n }\r\n return $q.reject(null);\r\n });\r\n };\r\n\r\n var linkCategoriesPromise = function () {\r\n return orderItemsRepository\r\n .linkCategoriesToOrderItem(orderItemIdToSave, categoriesToLink)\r\n .then(function (resp) {\r\n return resp;\r\n }, function (error) {\r\n if (error) {\r\n var em = error.serverErrorMessage || error.message;\r\n toastr.error(em, gettextCatalog.getString(\"Unable to link Order Item categories\"));\r\n $log.error(\"Action executing error: unable to link Order Item categories\\n\" + error.message);\r\n }\r\n return $q.reject(null);\r\n });\r\n };\r\n\r\n if (batching.isEnabled()) {\r\n\r\n return $q.all([\r\n saveOrderItemPromise(),\r\n saveOrderPromise()\r\n ])\r\n .then(function () {\r\n batching.forceStartBatch(3, true);\r\n return $q.all([\r\n actionExecutePromise(),\r\n unlinkCategoriesPromise(),\r\n linkCategoriesPromise()\r\n ]);\r\n });\r\n } else {\r\n\r\n return $q.all([\r\n saveOrderItemPromise(),\r\n saveOrderPromise()\r\n ])\r\n .then(function () {\r\n return actionExecutePromise();\r\n })\r\n .then(function () {\r\n return unlinkCategoriesPromise();\r\n })\r\n .then(function () {\r\n return linkCategoriesPromise();\r\n });\r\n\r\n }\r\n }\r\n\r\n //region Observer pattern\r\n\r\n function onDataChange(subscriberName, cb) {\r\n subscribers[subscriberName] = cb;\r\n }\r\n\r\n function dataWasChanged() {\r\n _.forEach(subscribers, function (callback) {\r\n if (callback && _.isFunction(callback)) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n //endregion\r\n\r\n //region Setters\r\n\r\n /**\r\n * Set order item id\r\n * @param {string|number} [id] order item id\r\n */\r\n function setOrderItemId(id, force) {\r\n if (id !== orderItemId || force === true) {\r\n orderItemId = id;\r\n initOrderItem();\r\n }\r\n }\r\n\r\n //endregion\r\n\r\n //region Getters\r\n\r\n /**\r\n * Get orderItemId\r\n * @returns {string|number}\r\n */\r\n function getOrderItemId() {\r\n return orderItemId;\r\n }\r\n\r\n /**\r\n * Get orderItem\r\n * @returns {RepresentationModel}\r\n */\r\n function getOrderItem() {\r\n return orderItem;\r\n }\r\n\r\n /**\r\n * Get step\r\n * @returns {string}\r\n */\r\n function getStep() {\r\n return step;\r\n }\r\n\r\n /**\r\n * Get order\r\n * @returns {RepresentationModel}\r\n */\r\n function getOrder() {\r\n return order;\r\n }\r\n\r\n /**\r\n * Get order item categories\r\n * @returns {RepresentationModel[]}\r\n */\r\n function getOrderItemCategories() {\r\n return orderItemCategories;\r\n }\r\n\r\n /**\r\n * Get order item workflow audit records\r\n * @returns {RepresentationModel[]}\r\n */\r\n function getOrderItemWorkflowAudit() {\r\n return orderItemWorkflowAudit;\r\n }\r\n\r\n /**\r\n *\r\n * @returns {RepresentationModel[]}\r\n */\r\n function getCategoryTypes() {\r\n return categoryTypes;\r\n }\r\n\r\n /**\r\n * Get categories\r\n * @returns {RepresentationModel[]}\r\n */\r\n function getCategories() {\r\n return categories;\r\n }\r\n\r\n //endregion\r\n })\r\n\r\n;\r\n","angular.module('ui.order.orderItemCard', [\r\n 'ui.order.orderItemCard.orderItemCardDataProvider',\r\n 'ui.order.orderItemCard.orderItemActions',\r\n 'ui.order.orderItemCard.orderItemComments',\r\n 'ui.order.orderItemCard.orderItemFiles',\r\n 'ui.order.orderItemCard.orderReports',\r\n 'ui.order.orderItemCard.orderItemInfo'\r\n])\r\n\r\n .directive('orderItemCard', function () {\r\n return {\r\n restrict: 'E',\r\n controller: 'OrderItemCardController',\r\n controllerAs: 'OrderItemCardController',\r\n templateUrl: 'app/ui/order/orderItemCard/orderItemCard.html',\r\n scope: {\r\n orderItemId: '@orderItemId',\r\n\r\n onLoadStart: '&',\r\n onLoadEnd: '&',\r\n onAfterActionExecute: '&',\r\n onBeforeActionExecute: '&'\r\n }\r\n };\r\n })\r\n\r\n .controller('OrderItemCardController', function ($timeout, $log, $state, $scope, $q, toastr, gettextCatalog, userSettings, orderItemsGridSharedSettings,\r\n orderItemCardDataProvider, orderDetailsControllerUpdatesService, usersRepository, customResourceResolver, $customisationConfig, geocodingService) {\r\n $scope.tabs = [\r\n {\r\n title: gettextCatalog.getString(\"Info\"),\r\n name: \"info\"\r\n },\r\n {\r\n title: gettextCatalog.getString(\"Notes\"),\r\n name: \"notes\"\r\n },\r\n {\r\n title: gettextCatalog.getString(\"Files\"),\r\n name: \"files\"\r\n },\r\n {\r\n title: gettextCatalog.getString(\"Reports\"),\r\n name: \"reports\"\r\n }\r\n ];\r\n var stepsConfig;\r\n\r\n _.extend($scope, {\r\n executeAction: executeAction,\r\n setCurrentTab: setCurrentTab,\r\n shareOrderItem: shareOrderItem,\r\n getOrderItemShareLink: getOrderItemShareLink,\r\n getOrderItemEmailShareLink: getOrderItemEmailShareLink,\r\n showHideShareDialog: showHideShareDialog,\r\n shareItemViaTg: shareItemViaTg,\r\n copyOrderItemLink: copyOrderItemLink,\r\n getItemStepIconName: getItemStepIconName,\r\n viewCustomerOrders: viewCustomerOrders\r\n });\r\n\r\n initController();\r\n\r\n function initController() {\r\n $scope.isHiddenSummary = false;\r\n $scope.isBusy = false;\r\n $scope.showNonSystemShareDialog = false;\r\n $scope.copiedToBuffer = false;\r\n\r\n setCurrentTab();\r\n initData();\r\n initWatchers();\r\n initSignalREvents();\r\n }\r\n\r\n function initData(force) {\r\n if (!force && $scope.orderItemId === orderItemCardDataProvider.getOrderItemId()) {\r\n return;\r\n }\r\n\r\n onLoadStart();\r\n orderItemCardDataProvider.setOrderItemId($scope.orderItemId, force);\r\n\r\n initWorkflowConfig();\r\n }\r\n\r\n function initWorkflowConfig() {\r\n return usersRepository.getCurrentUser().then(function (restUser) {\r\n $scope.isCustomer = restUser.isCustomer();\r\n\r\n customResourceResolver.resolveWorkflow().then(function (workflowConfig) {\r\n stepsConfig = workflowConfig.steps;\r\n });\r\n\r\n });\r\n }\r\n\r\n function processOrderItemInfo() {\r\n $scope.orderDeliveryAddressPlace = null;\r\n\r\n if (!$scope.order) return;\r\n\r\n geocodingService.getGeocodingForAddress($scope.order.$model.deliveryAddress.toFormattedString())\r\n .then(function(result) {\r\n $scope.orderDeliveryAddressPlace = result;\r\n });\r\n }\r\n\r\n function getItemStepIconName() {\r\n if ($scope.orderItem && angular.isDefined(stepsConfig)) {\r\n var stepConfig = _.find(stepsConfig, function (s) { return s.code === $scope.orderItem.$model.stepCode; });\r\n var step = $scope.orderItem.$model.step;\r\n var noIcon = angular.isDefined(stepConfig) && angular.isDefined(stepConfig.noImageOnHomeView) && stepConfig.noImageOnHomeView === true;\r\n var fallbackIconForStep = function (stepCode) {\r\n return $customisationConfig.hasResource(function (res) { return _.string.contains(res, stepCode + \".\"); }) ? stepCode : \"workflow\";\r\n };\r\n\r\n var stepIcon = !noIcon\r\n ? (angular.isUndefined(stepConfig)\r\n ? fallbackIconForStep(step.code) : (angular.isDefined(stepConfig.publicImageResourceName) && $scope.isCustomer\r\n ? stepConfig.publicImageResourceName : (angular.isDefined(stepConfig.imageResourceName)\r\n ? stepConfig.imageResourceName : fallbackIconForStep(step.code)))) : \"\";\r\n\r\n return stepIcon;\r\n }\r\n\r\n return '';\r\n }\r\n\r\n function initWatchers() {\r\n orderItemCardDataProvider.onDataChange('OrderItemCardController', function () {\r\n $scope.orderItemId = orderItemCardDataProvider.getOrderItemId();\r\n\r\n if (!$scope.orderItemId) {\r\n $scope.orderItem = null;\r\n $scope.step = null;\r\n $scope.order = null;\r\n $scope.categories = null;\r\n $scope.categoryTypes = null;\r\n $scope.orderItemCategories = null;\r\n $scope.orderItemWorkflowAudit = null;\r\n } else {\r\n $scope.orderItem = orderItemCardDataProvider.getOrderItem();\r\n $scope.step = orderItemCardDataProvider.getStep();\r\n $scope.order = orderItemCardDataProvider.getOrder();\r\n $scope.categories = orderItemCardDataProvider.getCategories();\r\n $scope.categoryTypes = orderItemCardDataProvider.getCategoryTypes();\r\n $scope.orderItemCategories = orderItemCardDataProvider.getOrderItemCategories();\r\n $scope.orderItemWorkflowAudit = orderItemCardDataProvider.getOrderItemWorkflowAudit();\r\n\r\n processOrderItemInfo();\r\n }\r\n\r\n onLoadEnd();\r\n });\r\n\r\n $scope.$watch('orderItemId', function (newVal, oldVal) {\r\n if (newVal !== oldVal) {\r\n $scope.$applyAsync(function() {\r\n initData();\r\n });\r\n }\r\n });\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n orderDetailsControllerUpdatesService.onNewOrderItem(void 0);\r\n orderDetailsControllerUpdatesService.onOrderItemChanged(void 0);\r\n orderDetailsControllerUpdatesService.onOrderChanged(void 0);\r\n orderItemCardDataProvider.onDataChange('OrderItemCardController', void 0);\r\n });\r\n }\r\n\r\n function initSignalREvents() {\r\n orderDetailsControllerUpdatesService.onOrderItemChanged(function (modelInfo) {\r\n if ($scope.isBusy) {\r\n return;\r\n }\r\n\r\n if ($scope.orderItem && modelInfo.id == $scope.orderItem.getId()) {\r\n initData();\r\n }\r\n });\r\n }\r\n\r\n function viewCustomerOrders() {\r\n if ($scope.orderItem) {\r\n orderItemsGridSharedSettings.setSelectedOrderItemId($scope.orderItem.getId());\r\n \r\n //$state.go('client.orders', { step: 'all-open', search: $scope.order.$model.customer.$model.address.$model.companyName , exact: true});\r\n //orderItemsGridSharedSettings.setTextSearch($scope.order.$model.customer.$model.address.$model.companyName, true);\r\n\r\n $state.go('client.customer', { customerId: $scope.order.$model.customer.getId() });\r\n }\r\n }\r\n\r\n function getOrderItemShareLink() {\r\n return _.str.sprintf('%s%s#/client/orders/all-open/details/%s',\r\n om.config.build.originUrl,\r\n om.config.build.electronRemoteUrl,\r\n $scope.orderItemId);\r\n }\r\n\r\n function shareOrderItem() {\r\n if ($scope.orderItemId && $scope.orderItem) {\r\n if (navigator.share) {\r\n navigator.share({\r\n title: 'Order Manager',\r\n text: 'View Order Item ' + $scope.orderItemId,\r\n url: getOrderItemShareLink()\r\n }).then(function () {\r\n //shared\r\n },\r\n function (e) {\r\n $log.error('Error during sharing of the Order Item.', e);\r\n });\r\n } else {\r\n //Sharing not supported by the agent\r\n $scope.showNonSystemShareDialog = !$scope.showNonSystemShareDialog;\r\n }\r\n }\r\n }\r\n\r\n function getOrderItemEmailShareLink() {\r\n var subject = _.str.sprintf(gettextCatalog.getString('View Item %s in OrderManager'), $scope.orderItemId);\r\n var messageToShare = _.str.sprintf(gettextCatalog.getString('Check out Item %s at %s'), $scope.orderItemId, getOrderItemShareLink());\r\n var url = _.str.sprintf('mailto:?subject=%s&body=%s', encodeURIComponent(subject), encodeURIComponent(messageToShare));\r\n return url;\r\n }\r\n\r\n function shareItemViaTg() {\r\n var messageToShare = _.str.sprintf(gettextCatalog.getString('%sCheck out Item %s in OrderManager'), String.fromCharCode(13), $scope.orderItemId);\r\n window.location = _.str.sprintf('tg://msg_url?text=%s&url=%s', encodeURIComponent(messageToShare), encodeURIComponent(getOrderItemShareLink()));\r\n showHideShareDialog();\r\n }\r\n\r\n function copyOrderItemLink() {\r\n if (navigator.clipboard && navigator.clipboard.writeText &&\r\n navigator.permissions && navigator.permissions.query) {\r\n\r\n var queryOpts = { name: 'clipboard-write' };\r\n navigator.permissions.query(queryOpts).then(function (permissionStatus) {\r\n if (permissionStatus.state === 'granted') {\r\n navigator.clipboard.writeText(getOrderItemShareLink()).then(function () {\r\n $scope.copiedToBuffer = true;\r\n $timeout(function () {\r\n $scope.copiedToBuffer = false; //switch off to re-set icon\r\n showHideShareDialog();\r\n },\r\n 1500);\r\n },\r\n function (err) {\r\n $log.error('Failed to copy Item url into clipboard :(', err);\r\n });\r\n } else {\r\n alert(gettextCatalog.getString('Copying into Clipboard has not been granted for OrderManager in your browser :('));\r\n }\r\n });\r\n } else {\r\n alert(gettextCatalog.getString('Error during copying Order Item URL to Clipboard :('));\r\n }\r\n }\r\n\r\n function showHideShareDialog() {\r\n $scope.showNonSystemShareDialog = !$scope.showNonSystemShareDialog;\r\n }\r\n\r\n function setCurrentTab(tab) {\r\n userSettings.getSettings().then(function (settings) {\r\n if (!tab) {\r\n tab = $scope.tabs[0]; // default tab\r\n if (settings.saveOrderItemCardTab === true || settings.saveOrderItemCardTab === \"true\") {\r\n var savedTab = _.find($scope.tabs, function (tab) {\r\n return tab.name === settings.orderItemCardTab;\r\n });\r\n tab = savedTab || tab;\r\n }\r\n }\r\n $scope.currentTab = tab;\r\n settings.orderItemCardTab = $scope.currentTab.name;\r\n userSettings.save();\r\n });\r\n }\r\n\r\n var actionIsExecuting;\r\n\r\n function executeAction(actionCode) {\r\n if (actionIsExecuting || $scope.isBusy) {\r\n return;\r\n }\r\n actionIsExecuting = true;\r\n onLoadStart();\r\n\r\n var unlinkedCategories = _.where($scope.categories, { isLinked: false });\r\n var linkedCategories = _.where($scope.categories, { isLinked: true });\r\n\r\n onBeforeActionExecute();\r\n\r\n orderItemCardDataProvider.executeAction(actionCode, unlinkedCategories, linkedCategories)\r\n\r\n .then(function () {\r\n return onAfterActionExecute();\r\n }, function () {\r\n return onAfterActionExecute();\r\n })\r\n\r\n .then(function () {\r\n actionIsExecuting = false;\r\n onLoadEnd();\r\n initData(true);\r\n });\r\n }\r\n\r\n function onLoadStart() {\r\n $scope.isBusy = true;\r\n if ($scope.onLoadStart) {\r\n $scope.onLoadStart();\r\n }\r\n }\r\n\r\n function onLoadEnd() {\r\n $scope.isBusy = false;\r\n if ($scope.onLoadEnd) {\r\n $scope.onLoadEnd();\r\n }\r\n $scope.orderItemShareLink = getOrderItemShareLink();\r\n }\r\n\r\n function onAfterActionExecute() {\r\n if ($scope.onAfterActionExecute) {\r\n return $scope.onAfterActionExecute();\r\n }\r\n return $q.when(true);\r\n }\r\n\r\n function onBeforeActionExecute() {\r\n if ($scope.onBeforeActionExecute) {\r\n return $scope.onBeforeActionExecute();\r\n }\r\n\r\n return null;\r\n }\r\n\r\n })\r\n\r\n // Separate service for update events (to prevent multiple event subscription)\r\n .service('orderDetailsControllerUpdatesService', function (rest) {\r\n var _this = this;\r\n var newOrderItemCb;\r\n var orderItemChangedCb;\r\n var orderChangedCb;\r\n\r\n rest.events.on(\"modelCreatedOnServer\", function (modelInfo) {\r\n if (!newOrderItemCb) {\r\n return;\r\n }\r\n if (modelInfo && modelInfo.modelType === \"OrderItemModel\") {\r\n newOrderItemCb(modelInfo);\r\n }\r\n });\r\n\r\n rest.events.on(\"modelUpdatedOnServer\", function (modelInfo) {\r\n if (modelInfo.modelType === \"OrderItemModel\" && orderItemChangedCb) {\r\n orderItemChangedCb(modelInfo);\r\n } else if (modelInfo.modelType === \"OrderModel\" && orderChangedCb) {\r\n orderChangedCb(modelInfo);\r\n }\r\n });\r\n\r\n _this.onNewOrderItem = function (cb) {\r\n newOrderItemCb = cb;\r\n };\r\n\r\n _this.onOrderItemChanged = function (cb) {\r\n orderItemChangedCb = cb;\r\n };\r\n\r\n _this.onOrderChanged = function (cb) {\r\n orderChangedCb = cb;\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n ;\r\n","angular.module('ui.login.loginShadow', [])\r\n\r\n .directive('loginShadow', function () {\r\n return {\r\n restrict: \"E\",\r\n templateUrl: \"app/ui/login/loginShadow/loginShadow.html\",\r\n controller: \"LoginShadowController\",\r\n scope: {}\r\n };\r\n })\r\n\r\n .controller('LoginShadowController', function LoginController($scope, $state, $element, toastr, authService, loginShadowService) {\r\n $scope.isBusy = false;\r\n $scope.credentials = {};\r\n\r\n $scope.credentials.login = authService.getLastUsername();\r\n\r\n $scope.onOpen = function () {\r\n\r\n var kwindow = $(\"#loginShadowWindow\").data(\"kendoWindow\");\r\n kwindow.center();\r\n kwindow.setOptions({\r\n position: {\r\n top: '15%',\r\n left: kwindow.options.position.left\r\n },\r\n animation: om.config.kendoWindowDefaultOptions.animation\r\n });\r\n $(\"#password\").focus();\r\n };\r\n\r\n $scope.onClose = function () {\r\n\r\n };\r\n\r\n $scope.onActivate = function () {\r\n\r\n };\r\n\r\n $scope.anotherUser = function () {\r\n $(\"#loginShadowWindow\").data(\"kendoWindow\").destroy();\r\n loginShadowService.close();\r\n authService.clearAuthentication();\r\n $state.go('login');\r\n };\r\n\r\n $scope.login = function () {\r\n $scope.credentials.login = authService.getLastUsername();\r\n $scope.isBusy = true;\r\n $scope.$broadcast(\"autofill:update\");\r\n\r\n authService.login(authService.getLastUsername(), $scope.credentials.password).then(\r\n function () {\r\n $scope.isBusy = false;\r\n $(\"#loginShadowWindow\").data(\"kendoWindow\").destroy();\r\n loginShadowService.close();\r\n },\r\n function (resp) {\r\n var data = resp.data;\r\n $scope.isBusy = false;\r\n var msg;\r\n if (data && data.error && _.isString(data.error)) {\r\n msg = data.error;\r\n } else if (data && _.isString(data) && data.length > 0 && data.length < 256) {\r\n msg = data;\r\n } else {\r\n msg = \"Wrong username or password. Please try again.\";\r\n }\r\n toastr.error(msg, \"Login failed\");\r\n }\r\n );\r\n\r\n return false;\r\n };\r\n })\r\n\r\n;\r\n","angular.module('ui.customer.list', ['kendo.directives', 'common.directives.inView'])\r\n .config(function ($stateProvider) {\r\n $stateProvider.state('client.customers', {\r\n url: '/customers',\r\n templateUrl: 'app/ui/customer/list/list.html',\r\n controller: 'CustomersController',\r\n controllerAs: 'CustomersController',\r\n data: { pageTitle: 'OrderManager: Customers' },\r\n resolve: {\r\n currentUser: function (usersRepository) {\r\n return usersRepository.getCurrentUser();\r\n }\r\n },\r\n params: {\r\n filter: null\r\n }\r\n });\r\n })\r\n\r\n .controller('CustomersController', function ($window, $compile, $timeout, $rootScope, $scope, $state, $log, $q, gettext, uiLocalization, toastr, \r\n appLocale, rest, authService, currentUser, serverLocalization, customersRepository, ordersRepository, templateResolver, customResourceResolver) {\r\n\r\n// ReSharper disable once InconsistentNaming\r\n const CUSTOMER_ACTIVITY_PERIOD = 30; \r\n\r\n $scope.user = currentUser;\r\n $scope.customers = null;\r\n $scope.customersLoadedAndSorted = false;\r\n $scope.permissionsGranted = false;\r\n $scope.topCustomerStat = { \"numOrders\": 0, \"numOrderItems\": 0, \"date\": \"9999-12-31T23:59:59.9999999Z\" };\r\n $scope.customersStat = { activeCustomersChange: 0 };\r\n $scope.limit = 30; // initial value for limit\r\n\r\n _.extend($scope, {\r\n setBusyState: setBusyState,\r\n customersSortByOrders: customersSortByOrders,\r\n customersSearch: customersSearch,\r\n isActiveCustomerNow: isActiveCustomerNow,\r\n loadMore: loadMore,\r\n customersLoadedAndSortedCallback: customersLoadedAndSortedCallback\r\n });\r\n\r\n initController();\r\n\r\n function initController() {\r\n setBusyState(true);\r\n\r\n if ($state.params.filter) {\r\n $scope.customerFilter = $state.params.filter.toString().trim();\r\n }\r\n\r\n initInViewLoader();\r\n\r\n checkCurrentUserPermissions()\r\n .then(function(granted) {\r\n if (granted) {\r\n initPageHeaderAndData()\r\n .then(function() {\r\n setBusyState(false);\r\n });\r\n } else {\r\n //otherwise do nothing\r\n setBusyState(false);\r\n }\r\n })\r\n .catch(function(error) {\r\n $log.error(\"Can't initialize customers list.\");\r\n if (error && error.message) {\r\n $log.error(error.message);\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error: %s\", error.message));\r\n } else if (error && _.isString(error)) {\r\n $log.error(error);\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error: %s\", error));\r\n } else if (error && error.status) {\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error %s : %s\",\r\n error.status,\r\n error.statusText));\r\n } else {\r\n toastr.error(gettext(\"Data request failed\"), gettext(\"Server is not responding\"));\r\n }\r\n });\r\n }\r\n\r\n function initWatchers() {\r\n\r\n $scope.$on(\r\n \"$destroy\",\r\n function () { \r\n }\r\n );\r\n }\r\n\r\n function checkCurrentUserPermissions() {\r\n return $q.when($scope.user) //we have user already\r\n .then(function(user) {\r\n //Check that current user is a centre user or a customer user who has rights to access specified customer data\r\n $scope.permissionsGranted = user && !user.isCustomer();\r\n\r\n if (!$scope.permissionsGranted) {\r\n toastr.error('Sorry, you have no access to this data :(', 'Access denied');\r\n $log.error(`User [${user.$model.name}] has no permissions to view Customer [${$scope.customerId}] data.`);\r\n }\r\n\r\n return $scope.permissionsGranted;\r\n });\r\n }\r\n\r\n /**\r\n * Updates busy state\r\n */\r\n function setBusyState(newBusyState) {\r\n $scope.isBusy = newBusyState;\r\n }\r\n\r\n function initPageHeaderAndData() {\r\n $scope.pageDisplayName = uiLocalization.translate('Customers Directory');\r\n\r\n $scope.customersStats = {};\r\n $scope.activeCustomersCount = 0;\r\n $scope.totalOrdersCount = 0;\r\n $scope.activeCustomersCalculated = false;\r\n\r\n return $q\r\n .all([customersRepository.getCustomers(), customersRepository.getCustomersOrdersHistoryStats()]) //get customers data and customers stats simultaneously\r\n .then(function(result) {\r\n $scope.customers = result[0];\r\n var stats = result[1];\r\n \r\n if ($scope.customers) {\r\n $rootScope.pageTitle = uiLocalization.translate(\"OrderManager: Customers: %s\",\r\n $scope.customers ? $scope.customers.length : 0);\r\n }\r\n\r\n if (stats) {\r\n processCustomersStats(stats);\r\n }\r\n $scope.activeCustomersCalculated = true;\r\n });\r\n }\r\n\r\n function processCustomersStats(stats) {\r\n\r\n var activeCustomersWeekAgo = 0;\r\n\r\n $scope.customers.forEach(function (c) {\r\n var cStat = _.find(stats, function (cs) { return cs.code === c.$model.code; });\r\n\r\n $scope.customersStats[c.$model.code] = cStat && cStat.stats\r\n ? cStat.stats[0] : { \"numOrders\": 0, \"numOrderItems\": 0, \"date\": \"0001-01-01T00:00:00.0000000Z\" };\r\n\r\n if ($scope.topCustomerStat.numOrderItems <\r\n $scope.customersStats[c.$model.code].numOrderItems) {\r\n $scope.topCustomerStat =\r\n $scope.customersStats[c.$model.code]; //remember top ordering customer\r\n }\r\n\r\n $scope.totalOrdersCount += $scope.customersStats[c.$model.code].numOrderItems;\r\n\r\n if (isActiveCustomerNow(c)) {\r\n $scope.activeCustomersCount++;\r\n }\r\n if (isActiveCustomerWeekAgo(c)) {\r\n activeCustomersWeekAgo++;\r\n }\r\n });\r\n\r\n $scope.customersStat.activeCustomersChange = $scope.activeCustomersCount - activeCustomersWeekAgo;\r\n }\r\n\r\n function customersLoadedAndSortedCallback () {\r\n $timeout(function () {\r\n //We can use that flag to wait till ng-repeat loads and prepares data and then reveal the content to avoid flickering\r\n $scope.customersLoadedAndSorted = true;\r\n setBusyState(false);\r\n }, 100);\r\n }\r\n\r\n function loadMore(isLast, isInView, inviewInfo) {\r\n const isInitialEvent = inviewInfo.event.type === 'initial'; \r\n\r\n if ( ( (isLast && isInView) ) && $scope.limit < $scope.customers.length) {\r\n $scope.$applyAsync(function() {\r\n $scope.limit += 50;\r\n });\r\n }\r\n }\r\n\r\n function initInViewLoader() {\r\n $scope.inViewLoaderOptions = {\r\n viewportOffset: ['1000%', 0, '1000%', 0]\r\n };\r\n }\r\n\r\n function customersSearch (item) {\r\n if (!$scope.customerFilter || !item || !item.$model)\r\n return true;\r\n\r\n const term = $scope.customerFilter.toLowerCase();\r\n\r\n if (item.$model.id.toString().indexOf(term) !== -1 ||\r\n item.$model.code.toLowerCase().indexOf(term) !== -1 ||\r\n item.$model.address.$model.companyName.toLowerCase().indexOf(term) !== -1) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n function customersSortByOrders(customer) {\r\n var ordersCount =\r\n $scope.customersStats &&\r\n $scope.customersStats[customer.$model.code] &&\r\n $scope.customersStats[customer.$model.code].numOrderItems\r\n ? $scope.customersStats[customer.$model.code].numOrderItems\r\n : 0;\r\n\r\n return -ordersCount; //to sort by orders count and then by customer code\r\n }\r\n\r\n function isActiveCustomerNow(customer) {\r\n return isActiveCustomer(customer, new Date(), CUSTOMER_ACTIVITY_PERIOD);\r\n }\r\n\r\n function isActiveCustomerWeekAgo(customer) {\r\n var weekAgo = new Date().addDays(-7);\r\n return isActiveCustomer(customer, weekAgo, CUSTOMER_ACTIVITY_PERIOD);\r\n }\r\n\r\n function isActiveCustomer(customer, dateToCheckFor, daysDiff) {\r\n if (!customer ||\r\n !$scope.customersStats ||\r\n !$scope.customersStats[customer.$model.code] ||\r\n !$scope.customersStats[customer.$model.code].date)\r\n return false;\r\n\r\n return Date.diffDays(new Date($scope.customersStats[customer.$model.code].date), dateToCheckFor) < daysDiff;\r\n }\r\n\r\n\r\n })\r\n ;\r\n","angular.module('ui.customer.overview', ['kendo.directives', 'nvd3'])\r\n\r\n .config(function ($stateProvider) {\r\n $stateProvider.state('client.customer', {\r\n url: '/customers/:customerId/overview',\r\n templateUrl: 'app/ui/customer/overview/overview.html',\r\n controller: 'CustomerOverviewController',\r\n controllerAs: 'CustomerOverviewController',\r\n data: { pageTitle: 'OrderManager: Customer Overview' },\r\n resolve: {\r\n currentUser: function (usersRepository) {\r\n return usersRepository.getCurrentUser();\r\n }\r\n }\r\n });\r\n })\r\n\r\n .controller('CustomerOverviewController', function ($window, $compile, $timeout, $rootScope, $scope, $state, $log, $q, gettext, uiLocalization, toastr, usersRepository,\r\n appLocale, rest, authService, currentUser, serverLocalization, customersRepository, ordersRepository, customerOverviewUpdatesService, geocodingService, workflowRepository, \r\n gridDataProvider, templateResolver, orderItemsGridSharedSettings, customResourceResolver) {\r\n\r\n var textSearchTrigger = false;\r\n var dataRequestCount = 0;\r\n const CalendarChartTypes = Object.makeEnum([\"daily\", \"weekly\", \"monthly\"]);\r\n \r\n $scope.user = currentUser;\r\n $scope.customerId = $state.params.customerId;\r\n $scope.customer = null;\r\n $scope.customerOrders = [];\r\n $scope.permissionsGranted = false;\r\n $scope.calendarChartType = CalendarChartTypes.monthly;\r\n\r\n //We want the stats to show items for the previous 6 months, excluding current month\r\n $scope.monthsCount = 12; //Controls dynamically the length of the period we want the stats to be gathered for\r\n $scope.toDate = new Date();\r\n $scope.fromDate = new Date($scope.toDate.getFullYear(), $scope.toDate.getMonth() - $scope.monthsCount, $scope.toDate.getDate());\r\n\r\n _.extend($scope, {\r\n setBusyState: setBusyState,\r\n applyTextSearch: applyTextSearch,\r\n viewCalendarChartDaily: viewCalendarChartDaily,\r\n viewCalendarChartWeekly: viewCalendarChartWeekly,\r\n viewCalendarChartMonthly: viewCalendarChartMonthly\r\n });\r\n\r\n initController();\r\n\r\n function initController() {\r\n $scope.isBusy = true;\r\n\r\n //clear any remembered search filter \r\n if (!$state.params.search) {\r\n orderItemsGridSharedSettings.setTextSearch(null);\r\n }\r\n\r\n checkCurrentUserPermissions()\r\n .then(function(granted) {\r\n if (granted) {\r\n $q.all([initPageHeaderAndConfigs(), getCustomerStatistics()])\r\n .then(function(result) {\r\n\r\n getAddressGeocodingData();\r\n\r\n //Init watchers to watch for order changes and reload data\r\n initWatchers();\r\n\r\n //Init customer's orders grid\r\n initAdditionalFilter();\r\n initGrid();\r\n })\r\n .then(function() {\r\n $scope.isBusy = false;\r\n });\r\n\r\n } else {\r\n //otherwise do nothing\r\n $scope.isBusy = false;\r\n }\r\n })\r\n .catch(function(error) {\r\n $log.error(\"Can't initialize customers orders data & grid.\");\r\n if (error && error.message) {\r\n $log.error(error.message);\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error: %s\", error.message));\r\n } else if (error && _.isString(error)) {\r\n $log.error(error);\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error: %s\", error));\r\n } else if (error && error.status) {\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error %s : %s\",\r\n error.status,\r\n error.statusText));\r\n } else {\r\n toastr.error(gettext(\"Data request failed\"), gettext(\"Server is not responding\"));\r\n }\r\n });\r\n }\r\n\r\n function initWatchers() {\r\n\r\n var reloadGridBySignalREvent = _.debounce(function (e) {\r\n reloadGrid();\r\n getCustomerStatistics(); \r\n }, 1000);\r\n\r\n customerOverviewUpdatesService.onOrderItemChanged(reloadGridBySignalREvent);\r\n customerOverviewUpdatesService.onOrderChanged(reloadGridBySignalREvent);\r\n customerOverviewUpdatesService.onNewOrderItem(reloadGridBySignalREvent);\r\n\r\n var calendarChartTypeWatcherDestructor = $scope.$watch('calendarChartType',\r\n function(newVal, oldVal) {\r\n if (newVal !== oldVal) {\r\n $scope.$applyAsync(function() {\r\n initCalendarChartData();\r\n });\r\n }\r\n });\r\n\r\n //Grid's 'show completed dates' filter watchers\r\n $scope.$watch('datePickerFrom', completedDateChangedHandler);\r\n $scope.$watch('datePickerTo', completedDateChangedHandler);\r\n $scope.$watch('showCompletedFilter', function (newVal, oldVal) {\r\n if (newVal !== oldVal) {\r\n if (newVal === true && !$scope.datePickerFrom && !$scope.datePickerTo) {\r\n var now = new Date();\r\n var oneMonthAgo = new Date();\r\n oneMonthAgo.setMonth(now.getMonth() - 3); //Let's use 3 month ago\r\n $scope.datePickerFrom = oneMonthAgo;\r\n $scope.datePickerTo = now;\r\n }\r\n completedDateChanged();\r\n reloadGrid();\r\n }\r\n });\r\n\r\n $scope.$on(\r\n \"$destroy\",\r\n function () {\r\n destroyGrid();\r\n customerOverviewUpdatesService.onOrderItemChanged(null);\r\n customerOverviewUpdatesService.onNewOrderItem(null);\r\n customerOverviewUpdatesService.onOrderChanged(null);\r\n\r\n if (calendarChartTypeWatcherDestructor) {\r\n calendarChartTypeWatcherDestructor();\r\n }\r\n }\r\n );\r\n }\r\n\r\n function checkCurrentUserPermissions() {\r\n return $q.when($scope.user) //we have user already\r\n .then(function(user) {\r\n //Check that current user is a centre user or a customer user who has rights to access specified customer data\r\n $scope.permissionsGranted = user && !user.isCustomer();\r\n\r\n if (!$scope.permissionsGranted) {\r\n toastr.error('Sorry, you have no access to this data :(', 'Access denied');\r\n $log.error(`User [${user.$model.name}] has no permissions to view Customer [${$scope.customerId}] data.`);\r\n }\r\n\r\n return $scope.permissionsGranted;\r\n });\r\n }\r\n\r\n function initPageHeaderAndConfigs() {\r\n $scope.pageDisplayName = uiLocalization.translate('Customer Overview');\r\n\r\n return customersRepository.getCustomer($scope.customerId)\r\n .then(function (customer) {\r\n $scope.customer = customer;\r\n\r\n $q.all(\r\n [\r\n gridDataProvider.getGridConfig('all-open'),\r\n templateResolver.resolve('app/ui/customer/overview/gridHeader.html'),\r\n customResourceResolver.resolveConfig(\r\n 'customer-profile-open-orders-filter',\r\n {\r\n //Default config if nothing resolved from customization configuration files\r\n name: $scope.customer.$model.code,\r\n color: 'green',\r\n queryForStatInfo: `OrderItem.Deleted = false AND Step.Code <> 'Complete' AND Step.Code <> 'Cancelled' AND Customer.Id = ${$scope.customerId}`,\r\n targetUri: `#/client/customers/${$scope.customerId}/overview`,\r\n iconName: 'track',\r\n uiPriority: 1\r\n },\r\n {\r\n //Context data for the customized config\r\n customerId: $scope.customerId,\r\n customerCode: $scope.customer.$model.code\r\n }),\r\n customResourceResolver.resolveConfig(\r\n 'customer-profile-completed-orders-filter',\r\n {\r\n //Default config if nothing resolved from customization configuration files\r\n name: $scope.customer.$model.code,\r\n color: 'red',\r\n queryForStatInfo: `OrderItem.Deleted = false AND Step.Code <> 'Cancelled' AND Customer.Id = ${$scope.customerId}`,\r\n targetUri: `#/client/customers/${$scope.customerId}/overview`,\r\n iconName: 'track',\r\n uiPriority: 1\r\n },\r\n {\r\n //Context data for the customized config\r\n customerId: $scope.customerId,\r\n customerCode: $scope.customer.$model.code\r\n })\r\n ]\r\n ).then(function (data) {\r\n var gridConfig = _.clone(data[0]);\r\n $scope.gridHeaderTemplate = data[1];\r\n $scope.gridOrdersCustomFilter = data[2];\r\n $scope.gridOrdersCustomCompletedFilter = data[3];\r\n\r\n //Set our custom filter config onto order items grid shared settings object,\r\n //so grid data provider will get us the orders according to this custom filter OMQL query\r\n //for all open orders, instead of expecting us to request orders for particular step\r\n orderItemsGridSharedSettings.setCustomFilter($scope.gridOrdersCustomFilter);\r\n orderItemsGridSharedSettings.setStepFilter(\"all-open\"); //to set other grid behaviour settings equal to 'all-open' filter\r\n \r\n gridConfig = initGridConfig(gridConfig, $scope.gridHeaderTemplate);\r\n gridConfig.dataSource = initGridDataSource(gridConfig);\r\n $scope.gridConfig = gridConfig;\r\n\r\n if ($scope.customer) {\r\n $scope.pageDisplayName = uiLocalization.translate(\"Customer: %s\", $scope.customer.$model.address.$model.companyName);\r\n $rootScope.pageTitle = uiLocalization.translate(\"OrderManager: Customer: %s\", $scope.customer.$model.address.$model.companyName);\r\n }\r\n });\r\n });\r\n }\r\n\r\n function getCustomerStatistics() {\r\n var filterQuery = null;\r\n\r\n //TODO: Think on applying more filters\r\n return $q.all([workflowRepository.getSteps(), customResourceResolver.resolveWorkflow()])\r\n .then(function (data) {\r\n var steps = data[0];\r\n var workflowConfig = data[1];\r\n\r\n var getOpenOrdersStats = customersRepository\r\n .getCustomerOrdersStepsStats($scope.customerId, filterQuery)\r\n .then(function (stats) {\r\n //A bit of mapping/pre-processing before we return all orders counts per workflow stage\r\n //so we can render later all values (if necessary) even for the workflow stages with 0 items\r\n var stepsWithStats = _.map(steps,\r\n function (step) {\r\n var statValue = stats.find(function (stat) { return stat.step === step.$model.code });\r\n return { step: step, stat: statValue ? statValue : { numOrderItems: 0, numOrders: 0} }\r\n });\r\n\r\n return stepsWithStats;\r\n });\r\n\r\n var getCalendarStats = customersRepository\r\n .getCustomerOrdersHistoryStats($scope.customerId, $scope.fromDate, $scope.toDate);\r\n\r\n return $q.all([getOpenOrdersStats, getCalendarStats]);\r\n })\r\n .then(function (data) {\r\n processCustomerStatistics(data[0], data[1]);\r\n });\r\n }\r\n\r\n function processCustomerStatistics(stepsWithStats, calendarStats) {\r\n if (stepsWithStats) {\r\n //Calculate totals\r\n var ordersTotals = {\r\n //Total order items count at all steps/stages\r\n total: _.reduce(stepsWithStats, function(memo, sws) {\r\n return memo + sws.stat.numOrderItems;\r\n }, 0),\r\n //Non completed orders/items\r\n open: _.reduce(stepsWithStats, function(memo, sws) {\r\n return memo + (sws.step.$model.type !== 2 ? sws.stat.numOrderItems : 0);\r\n }, 0),\r\n //Completed orders items\r\n completed: _.reduce(stepsWithStats, function(memo, sws) {\r\n return memo +\r\n (sws.step.$model.type === 2 && sws.step.$model.code.toLowerCase().indexOf('cancel') === -1 ? sws.stat.numOrderItems : 0);\r\n }, 0),\r\n //Completed orders items\r\n cancelled: _.reduce(stepsWithStats, function (memo, sws) {\r\n return memo +\r\n (sws.step.$model.type === 2 && sws.step.$model.code.toLowerCase().indexOf('cancel') !== -1 ? sws.stat.numOrderItems : 0);\r\n }, 0)\r\n };\r\n\r\n //And assign to variables bound to UI\r\n $scope.$applyAsync(function () {\r\n $scope.customerStepsStats = stepsWithStats;\r\n $scope.ordersTotals = ordersTotals;\r\n\r\n initStepsChartData();\r\n });\r\n }\r\n\r\n if (calendarStats) {\r\n\r\n $scope.$applyAsync(function () {\r\n $scope.customerCalendarStats = calendarStats;\r\n\r\n initCalendarChartData();\r\n\r\n checkIfActiveCustomer();\r\n });\r\n }\r\n }\r\n\r\n function checkIfActiveCustomer() {\r\n if (!$scope.customerCalendarStats || !$scope.customerCalendarStats.stats || $scope.customerCalendarStats.stats.length === 0) return;\r\n\r\n const stats = $scope.customerCalendarStats.stats;\r\n const mostRecentOrderDate = stats[stats.length - 1];\r\n if (mostRecentOrderDate && mostRecentOrderDate.date) {\r\n $scope.isActiveCustomer = Date.diffDays(new Date(mostRecentOrderDate.date), new Date()) < 30;\r\n }\r\n\r\n }\r\n\r\n function initStepsChartData() {\r\n if (!$scope.customerStepsStats) {\r\n return;\r\n }\r\n\r\n $scope.chartData = [\r\n {\r\n key: \"Orders per workflow step\",\r\n values: _.map(\r\n $scope.customerStepsStats.filter(function (ss) { return ss.stat.numOrderItems > 0 && ss.step.$model.type !== 2; }), //ignore 0 items steps and 'end' steps\r\n function (sws) {\r\n return {\r\n label: serverLocalization.translate(sws.step.$model.nameResource),\r\n value: sws.stat.numOrderItems\r\n };\r\n })\r\n }\r\n ];\r\n\r\n $scope.chartOptions = {\r\n chart: {\r\n type: 'discreteBarChart',\r\n height: 250,\r\n margin: { top: 10, right: 0, bottom: 65, left: 0 },\r\n x: function(d) { return d.label; },\r\n y: function(d) { return d.value; },\r\n forceY: [0, 10],\r\n //useInteractiveGuideline: true,\r\n showValues: true,\r\n staggerLabels: $scope.chartData[0].values.length > 6,\r\n wrapLabels: true,\r\n noData: gettext('No orders data available'),\r\n valueFormat: function(d) { return d3.format('~g')(d); },\r\n duration: 500,\r\n xAxis: {\r\n //axisLabel: gettext('Open Orders')\r\n //axisLabelDistance: 10,\r\n //rotateLabels: 40\r\n \r\n },\r\n showYAxis: true,\r\n //yAxis: {\r\n //},\r\n tooltip: {\r\n valueFormatter: function(d) {\r\n return d > 1\r\n ? uiLocalization.translate(\"%s Items\", d3.format('~g')(d))\r\n : uiLocalization.translate(\"%s Item\", d3.format('~g')(d));\r\n }\r\n }\r\n },\r\n //title: {\r\n // enable: true,\r\n // text: gettext('Current Orders')\r\n //},\r\n\r\n //subtitle: {\r\n // enable: true,\r\n // text: 'Subtitle for simple line chart. Lorem ipsum dolor sit amet...',\r\n // css: {\r\n // 'text-align': 'center',\r\n // 'margin': '10px 13px 0px 7px'\r\n // }\r\n //},\r\n\r\n //caption: {\r\n // enable: true,\r\n // html: 'Figure 1. Lorem ipsum dolor sit amet...',\r\n // css: {\r\n // 'text-align': 'justify',\r\n // 'margin': '10px 13px 0px 7px'\r\n // }\r\n //}\r\n };\r\n }\r\n\r\n function viewCalendarChartDaily() {\r\n $scope.calendarChartType = CalendarChartTypes.daily;\r\n }\r\n function viewCalendarChartWeekly() {\r\n $scope.calendarChartType = CalendarChartTypes.weekly;\r\n }\r\n function viewCalendarChartMonthly() {\r\n $scope.calendarChartType = CalendarChartTypes.monthly;\r\n }\r\n\r\n function initCalendarChartData() {\r\n if (!$scope.customerCalendarStats) {\r\n return;\r\n }\r\n\r\n let values = [];\r\n let chartTypeName = $scope.calendarChartType.description[0].toUpperCase() + $scope.calendarChartType.description.slice(1);\r\n let xAxisTickFormat, tooltipKeyFormat, xLabelRotation;\r\n let tickValuesGetter = null;\r\n let tickFormatter;\r\n let tooltipKeyFormatter;\r\n let barWidthCoeff;\r\n let groupedValues;\r\n const currentLocale = currentUser.$model.culture;\r\n const formatter = new Intl.DateTimeFormat(currentLocale);\r\n\r\n switch ($scope.calendarChartType) {\r\n case CalendarChartTypes.weekly:\r\n tooltipKeyFormat = 'Week %W, %Y'; //For weeks - used for parsing only, as tick formatter will render weeks numbers not 00-51, but 01-52.\r\n xLabelRotation = -45;\r\n barWidthCoeff = 0.5;\r\n tickValuesGetter = function (values) {\r\n return _.map(values[0].values,\r\n function (v, i) {\r\n return values[0].values.length > 10 ? (i % 2 === 0 ? null : v.x) : v.x; //we return empty string for each even tick, so we don't have a mess of week labels on x axis\r\n });\r\n };\r\n tickFormatter = function (dateTicks) {\r\n if (!dateTicks) return '';\r\n var date = new Date(dateTicks);\r\n return `W${date.getYearWeekNumber()}, ${date.getFullYear()}`;\r\n };\r\n tooltipKeyFormatter = function (dateTicks) {\r\n var date = new Date(dateTicks);\r\n return `W${date.getYearWeekNumber()}, ${date.getFullYear()}`;\r\n }\r\n\r\n groupedValues = _.groupBy($scope.customerCalendarStats.stats, function (s) { return new Date(s.date).setToMonday(); });\r\n\r\n values = _.map(groupedValues,\r\n function (groupValues, key, list) {\r\n return {\r\n //label for each Week as parsed from the group key\r\n x: new Date(key).getTime(),\r\n //value\r\n y: _.reduce(groupValues,\r\n function (memo, s) {\r\n return memo + s.numOrderItems; //summarize order items count from each day of the Month group\r\n }, 0)\r\n };\r\n });\r\n break;\r\n case CalendarChartTypes.monthly:\r\n xAxisTickFormat = '%b %y';\r\n tooltipKeyFormat = '%B %Y';\r\n xLabelRotation = -45;\r\n barWidthCoeff = 0.7;\r\n tickValuesGetter = function (values) { return _.map(values[0].values, function (v) { return new Date(v.x); }); };\r\n tickFormatter = function (d) { return d3.time.format(xAxisTickFormat)(d); };\r\n tooltipKeyFormatter = function (d) { return d3.time.format(tooltipKeyFormat)(new Date(d)); }\r\n \r\n groupedValues = _.groupBy($scope.customerCalendarStats.stats,\r\n function(s) {\r\n return d3.time.format(tooltipKeyFormat)(new Date(s.date));\r\n });\r\n\r\n values = _.map(groupedValues,\r\n function (groupValues, key, list) {\r\n return { \r\n //label for Month, in ticks\r\n x: new Date(key).getTime(),\r\n //value\r\n y: _.reduce(groupValues,\r\n function (memo, s) {\r\n return memo + s.numOrderItems; //summarize order items count from each day of the Month group\r\n }, 0)\r\n };\r\n });\r\n \r\n break;\r\n case CalendarChartTypes.daily:\r\n default:\r\n tooltipKeyFormat = '%b %d, %Y';\r\n xLabelRotation = -45;\r\n barWidthCoeff = 0.6;\r\n tickValuesGetter = null;\r\n tickFormatter = function (d) { return formatter.format(d); };\r\n tooltipKeyFormatter = function (d) { return d3.time.format(tooltipKeyFormat)(new Date(d)); }\r\n\r\n values = _.map($scope.customerCalendarStats.stats,\r\n function(s) {\r\n return {x: new Date(s.date).getTime(), y: s.numOrderItems};\r\n });\r\n break;\r\n }\r\n\r\n $scope.chartCalendarData = [\r\n {\r\n key: uiLocalization.translate('%s Orders History', chartTypeName),\r\n bar: true,\r\n values: values\r\n }\r\n ];\r\n\r\n $scope.chartCalendarOptions = {\r\n chart: {\r\n type: 'historicalBarChart',\r\n height: 250,\r\n margin: { top: 10, right: 10, bottom: 75, left: 55 },\r\n x: function (d) { return d.x; },\r\n y: function (d) { return d.y; },\r\n showValues: true,\r\n noData: gettext('No history data available'),\r\n valueFormat: function (d) { return d3.format('~g')(d); },\r\n duration: 500,\r\n xAxis: {\r\n scale: d3.time.scale(),\r\n axisLabelDistance: 5,\r\n tickFormat: tickFormatter,\r\n rotateLabels: xLabelRotation,\r\n tickValues: tickValuesGetter,\r\n showMaxMin: false\r\n },\r\n yAxis: {\r\n axisLabelDistance: 10,\r\n tickFormat: function (d) { return d3.format('~g')(d); }\r\n },\r\n tooltip: {\r\n keyFormatter: tooltipKeyFormatter,\r\n valueFormatter: function (d) {\r\n return d > 1\r\n ? uiLocalization.translate(\"%s Items\", d3.format('~g')(d))\r\n : uiLocalization.translate(\"%s Item\", d3.format('~g')(d));\r\n }\r\n },\r\n zoom: {\r\n enabled: true,\r\n scaleExtent: [1, 50],\r\n useFixedDomain: false,\r\n useNiceScale: true,\r\n horizontalOff: false,\r\n verticalOff: true,\r\n unzoomEventType: 'dblclick.zoom'\r\n },\r\n bars: {\r\n dispatch: {\r\n renderEnd: function (t, u) {\r\n var chartBars = d3.selectAll(\"rect.nv-bar\");\r\n if (chartBars.length > 0) {\r\n chartBars.style(\"width\",\r\n function(d, i) {\r\n return (100 / (chartBars[0].length)) * barWidthCoeff + '%'; //We want to make bars a bit more narrow\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n $scope.onChartCalendarReady = function(scope, element) {\r\n \r\n };\r\n }\r\n\r\n function getAddressGeocodingData() {\r\n if ($scope.customer) {\r\n geocodingService.getGeocodingForAddress($scope.customer.$model.address.toFormattedString())\r\n .then(function (result) {\r\n $scope.customerAddressPlace = result;\r\n });\r\n }\r\n }\r\n\r\n function initAdditionalFilter() {\r\n $scope.searchDropdownOptions = {\r\n dataSource: [\r\n { text: gettext(\"Regular Search\"), value: \"reg-search\", icon: \"search-dropdown-icon icon-magnifier-add\" },\r\n { text: gettext(\"Exact Match Search\"), value: \"exact-search\", icon: \"search-dropdown-icon icon-magnifier\" }\r\n ],\r\n valuePrimitive: false,\r\n dataTextField: \"text\",\r\n dataValueField: \"value\",\r\n valueTemplate: ' ',\r\n template: '' +\r\n '{{dataItem.text}}',\r\n dataBound: function () {\r\n this.list.width(\"auto\");\r\n }\r\n };\r\n\r\n $scope.clearSearchTerm = function () {\r\n orderItemsGridSharedSettings.setTextSearch(null);\r\n $scope.textSearch = null;\r\n applyTextSearch();\r\n };\r\n\r\n var textSearchConfig = orderItemsGridSharedSettings.getTextSearch();\r\n if (textSearchConfig) {\r\n $scope.textSearch = textSearchConfig.text;\r\n $scope.searchDropdown = textSearchConfig.exact ? \"exact-search\" : \"reg-search\";\r\n } else {\r\n $scope.textSearch = null;\r\n $scope.searchDropdown = \"reg-search\";\r\n }\r\n }\r\n\r\n function initDatesFilter() {\r\n\r\n var completedFilterConfig = orderItemsGridSharedSettings.getCompletedFilter();\r\n \r\n if (completedFilterConfig) {\r\n //showCompletedFilter flag value controlled by kendo-switch when turned ON by user\r\n //This kendo-switch will be shown in the UI if gridConfig.hideShowCompletedSwitch == false\r\n $scope.showCompletedFilter = !!completedFilterConfig.enabled;\r\n var now = new Date();\r\n var dateFrom = new Date();\r\n dateFrom.setMonth(now.getMonth() - 3); //Let's use 3 month ago\r\n $scope.datePickerFrom = completedFilterConfig.from || dateFrom;\r\n $scope.datePickerTo = completedFilterConfig.to || now;\r\n //Now allow the filter to be shown only for 'all-open' stage\r\n $scope.showCompletedFilter = !!completedFilterConfig.enabled;\r\n }\r\n\r\n if (!completedFilterConfig) {\r\n $scope.showCompletedFilter = false;\r\n $scope.datePickerFrom = null;\r\n $scope.datePickerTo = null;\r\n }\r\n completedDateChanged();\r\n }\r\n\r\n function initGrid() {\r\n angular.element($window).bind('resize', function () {\r\n resizeGrid();\r\n\r\n // manual $digest required as resize event\r\n // is outside of angular\r\n $scope.$digest();\r\n });\r\n\r\n //Init dates filtering controls in the grid header (we need to do it from here to make sure we have grid config available )\r\n //Before we compile grid into the view\r\n initDatesFilter();\r\n\r\n var gridTemplate = '
    ';\r\n var jqTemplate = $('#orderItemsKendoGrid').append(gridTemplate);\r\n $compile(jqTemplate)($scope);\r\n\r\n //Init all the handlers for the events of the grid (like row click, checkbox-selector click, ,double-click, etc.\r\n initGridEventsHandlers($scope.gridConfig);\r\n\r\n //Trigger window resize event to properly resize grid\r\n $timeout(function () { $(window).trigger('resize'); });\r\n\r\n }\r\n\r\n function initGridConfig(gConfig, gridHeaderTemplate) {\r\n\r\n gConfig.hideShowCompletedSwitch = true;\r\n\r\n if (gConfig.columns) {\r\n var firstVisibleColumn = _.find(gConfig.columns, function (c) {\r\n return !c.hidden && c.field;\r\n });\r\n if (firstVisibleColumn) {\r\n firstVisibleColumn.template = _.string.sprintf(\r\n \"
    #:%s#
    \",\r\n gettext(\"View Details\"),\r\n firstVisibleColumn.field);\r\n }\r\n\r\n //Check if we have columns without percentage specified. Assign width if so.\r\n for (var i = 0; i < gConfig.columns.length; i++) {\r\n var column = gConfig.columns[i];\r\n if (!column.width) {\r\n column.width = 2 * (100 / gConfig.columns.length) + \"%\";\r\n }\r\n }\r\n }\r\n\r\n gConfig.toolbar = [{ template: gridHeaderTemplate }];\r\n\r\n gConfig.noRecords = {\r\n template: gettext(\"No items to display\")\r\n };\r\n\r\n gConfig.dataBound = function (e) {\r\n //Execute the dataBound defined on the customised config first \r\n if (angular.isDefined($scope.gridConfig.dataBoundEventHandler) && angular.isFunction($scope.gridConfig.dataBoundEventHandler)) {\r\n try {\r\n $scope.gridConfig.dataBoundEventHandler.call($scope.orderItemsGrid, e);\r\n } catch (error) {\r\n $log.error(\"Error during executing customised Grid's config's DataBound even handler.\", error);\r\n }\r\n }\r\n\r\n //And highlight the searchTerm found in the text values inside rows shown\r\n $timeout(function () {\r\n if (!String.isNullOrWhiteSpace($scope.textSearch)) {\r\n $(\"#orderItemsKendoGrid tbody td[role='gridcell']\").highlight($scope.textSearch);\r\n } else {\r\n $(\"#orderItemsKendoGrid tbody td[role='gridcell']\").unhighlight();\r\n }\r\n });\r\n };\r\n\r\n //Grid pager is 'ON' by default or if specified so\r\n if (!gConfig.pageable || typeof gConfig.pageable === 'boolean' || gConfig.pageable !== null) {\r\n //Pager info (items count) is 'ON' by defaults unless specified to be 'OFF'\r\n var disablePagerInfo = gConfig.disablePagerItemsInfo && gConfig.disablePagerItemsInfo === true;\r\n if (disablePagerInfo) {\r\n //Reset pageable object. Otherwise just not touch it as it contains other valuable settings\r\n gConfig.pageable = {\r\n refresh: true,\r\n pageSizes: true,\r\n info: !disablePagerInfo\r\n };\r\n }\r\n }\r\n\r\n //See if we have default sorting specified, then set it onto grid shared settings\r\n if (angular.isDefined(gConfig.initialSort)) {\r\n if (angular.isArray(gConfig.initialSort)) {\r\n orderItemsGridSharedSettings.setGridSort(gConfig.initialSort);\r\n } else if (angular.isDefined(gConfig.initialSort.field) && angular.isDefined(gConfig.initialSort.dir)) {\r\n orderItemsGridSharedSettings.setGridSort([gConfig.initialSort]);\r\n }\r\n }\r\n\r\n return gConfig;\r\n }\r\n\r\n function completedDateChangedHandler(newVal, oldVal) {\r\n if (newVal !== null && !_.isEqual(newVal, oldVal)) {\r\n completedDateChanged();\r\n reloadGrid();\r\n }\r\n }\r\n\r\n function completedDateChanged() {\r\n //re-set our custom filter with added dates filtering controls (or set back to default one) if user entered completion dates filter\r\n if ($scope.showCompletedFilter && $scope.datePickerFrom && $scope.datePickerTo) {\r\n $scope.datePickerFrom.setHours(0, 0, 0, 0);\r\n $scope.datePickerTo.setHours(23, 59, 59, 999);\r\n\r\n //we need timestamp without the milliseconds part, so omql api will understand it\r\n //OMQL DateTimeFormat = \"yyyy-MM-ddTHH:mm:ss\". i.e.: AND OrderItem.Completed = #0001-01-01T00:00:00#\r\n var datesFilterString = ` AND OrderItem.Completed >= #${$scope.datePickerFrom.toISOString()}# AND OrderItem.Completed <= #${$scope.datePickerTo.toISOString()}#`;\r\n var customCompletedFilter = _.clone($scope.gridOrdersCustomCompletedFilter);\r\n customCompletedFilter.queryForStatInfo += datesFilterString;\r\n\r\n orderItemsGridSharedSettings.setCustomFilter(customCompletedFilter);\r\n orderItemsGridSharedSettings.setStepFilter(\"all-open\"); //to set other grid behaviour settings equal to 'all-open' filter\r\n } else {\r\n orderItemsGridSharedSettings.setCustomFilter($scope.gridOrdersCustomFilter);\r\n orderItemsGridSharedSettings.setStepFilter(\"all-open\"); //to set other grid behaviour settings equal to 'all-open' filter\r\n }\r\n }\r\n\r\n var forcedPageChange = false;\r\n var cachedResult;\r\n\r\n function initGridDataSource(gridConfig) {\r\n var dataSourceObj = {\r\n transport: {\r\n read: function (options) {\r\n if (forcedPageChange) { // prevent data request after manual page change\r\n forcedPageChange = false;\r\n if (cachedResult) {\r\n options.success(cachedResult);\r\n } else {\r\n toastr.error(gettext(\"Data request cache error\"));\r\n options.error();\r\n }\r\n return;\r\n }\r\n $scope.isBusy = true;\r\n $scope.isGridReload = true;\r\n\r\n //Reset page size ignorance flag as it shouldn't alter grid behavior.\r\n //It is applied only on the item details card if order item id specified in the url as a parameter\r\n orderItemsGridSharedSettings.setForceIgnorePageSize(false);\r\n\r\n orderItemsGridSharedSettings.setPageNumber(options.data.page || 1);\r\n orderItemsGridSharedSettings.setPageSize(angular.isDefined(options.data.pageSize) ? options.data.pageSize : 20);\r\n orderItemsGridSharedSettings.setGridFilter(options.data.filter);\r\n orderItemsGridSharedSettings.setGridSort(options.data.sort);\r\n\r\n renderSkeletonPlaceholdersLoadingAnimation();\r\n\r\n gridDataProvider.getData()\r\n .then(function (result) {\r\n orderItemsGridSharedSettings.setTotalCount(result.totalCount);\r\n orderItemsGridSharedSettings.setTotalPageCount(result.totalPageCount);\r\n cachedResult = result;\r\n dataRequestCount++;\r\n\r\n // check if current page number was changed\r\n if ($scope.gridConfig.dataSource.page() !== result.pageNumber ||\r\n $scope.gridConfig.dataSource.pageSize() !== result.rowsPerPage) {\r\n forcedPageChange = true;\r\n options.page = result.pageNumber;\r\n options.pageSize = result.rowsPerPage;\r\n $scope.gridConfig.dataSource.query(options);\r\n }\r\n\r\n if (!$scope.selectedOrderItemId) {\r\n $scope.selectedOrderItemId = orderItemsGridSharedSettings.getSelectedOrderItemId();\r\n }\r\n\r\n clearSkeletonPlaceholdersLoadingAnimation();\r\n\r\n options.success(result);\r\n $scope.isBusy = false;\r\n $scope.isGridReload = false;\r\n textSearchTrigger = false;\r\n\r\n resizeGrid();\r\n },\r\n function (resp) {\r\n if (resp && resp.status) {\r\n toastr.error(resp.message, gettext(\"Reading orders data failed\"));\r\n } else {\r\n toastr.error(gettext(\"Reading orders data failed\"), gettext(\"Server is not responding\"));\r\n }\r\n options.error();\r\n $scope.isBusy = false;\r\n $scope.isGridReload = false;\r\n textSearchTrigger = false;\r\n });\r\n }\r\n },\r\n schema: {\r\n data: function (response) {\r\n return response ? response.items : null;\r\n },\r\n total: function (response) {\r\n return response ? response.totalCount : 0;\r\n },\r\n model: {\r\n id: \"$model.id\",\r\n fields: gridConfig.fields || {}\r\n }\r\n },\r\n page: orderItemsGridSharedSettings.getPageNumber() || 1,\r\n pageSize: orderItemsGridSharedSettings.getPageSize() || gridConfig.pageSize || 20,\r\n filter: orderItemsGridSharedSettings.getGridFilter(),\r\n sort: orderItemsGridSharedSettings.getGridSort(),\r\n serverPaging: true,\r\n serverSorting: true,\r\n serverFiltering: true\r\n };\r\n\r\n if (gridConfig.groupable === true && angular.isDefined(gridConfig.initialGroup)) {\r\n dataSourceObj.group = gridConfig.initialGroup;\r\n dataSourceObj.pageSize = gridConfig.pageSize;\r\n }\r\n\r\n return new kendo.data.DataSource(dataSourceObj);\r\n }\r\n\r\n function initGridEventsHandlers(gConfig) {\r\n //double click event to allow user to open order details\r\n $(\"#orderItemsKendoGrid tbody[role='rowgroup']\").on(\"dblclick\", \"tr\", function () {\r\n showStepDetails();\r\n });\r\n }\r\n\r\n /**\r\n * Updates busy state\r\n */\r\n function setBusyState(newBusyState) {\r\n $scope.isBusy = newBusyState;\r\n }\r\n\r\n function applyTextSearch() {\r\n orderItemsGridSharedSettings.setTextSearch($scope.textSearch, $scope.searchDropdown === \"exact-search\");\r\n reloadGrid();\r\n textSearchTrigger = true;\r\n }\r\n\r\n /**\r\n * Get selected items from grid\r\n * @returns {!RepresentationModel[]}\r\n */\r\n function getSelectedEntities() {\r\n var selectedEntities = [];\r\n var selectedDOM = $scope.orderItemsGrid.select();\r\n _.forEach(selectedDOM, function (value) {\r\n selectedEntities.push($scope.orderItemsGrid.dataItem(value));\r\n });\r\n return selectedEntities;\r\n }\r\n\r\n function showStepDetails() {\r\n var selected = getSelectedEntities();\r\n if (!selected || $scope.forbidOrderDetailsView) {\r\n //Do not allow to go into step details if nothing selected\r\n //OR if we are requested to do so according to the customisation configs\r\n return;\r\n }\r\n var firstSelected = selected[0];\r\n if (firstSelected && firstSelected.isRepresentationModel) {\r\n orderItemsGridSharedSettings.setSelectedOrderItemId(firstSelected.getId());\r\n // go to the Step Details View\r\n $state.go('client.step', {\r\n step: $scope.step\r\n });\r\n }\r\n }\r\n\r\n function renderSkeletonPlaceholdersLoadingAnimation() {\r\n if ($('#orderItemsKendoGrid table tbody').children().length > 0 || $('#orderItemsKendoGrid div.k-grid-norecords').length > 0) {\r\n //Do not render skeleton loading placeholders if we do have records to show OR if instead there are no records to show and we alreayd know it\r\n return;\r\n }\r\n\r\n var pageSize = orderItemsGridSharedSettings.getPageSize();\r\n if (!angular.isDefined(pageSize)) {\r\n pageSize = $scope.gridConfig.pageSize;\r\n }\r\n\r\n if (pageSize === 0 || pageSize > 15) {\r\n pageSize = 15; //Set page size for the loading-placeholders content to 15 if it's configured for bigger value or 0 which is 'show all'\r\n }\r\n\r\n var columnsCount = 10; //10 by default but it's better to try and find the columns count from grid template\r\n //which is initialised based on the grid branded config\r\n if ($('#orderItemsKendoGrid table colgroup').length > 0) {\r\n columnsCount = $('#orderItemsKendoGrid table colgroup').children().length;\r\n }\r\n for (var i = 0; i < pageSize; i++) {\r\n\r\n //Render visual templates to indicate loading rows/cells\r\n var row = $('');\r\n for (var c = 0; c < columnsCount; c++) {\r\n var divWidth = c > 0 ? (40 + Math.floor(Math.random() * 60)) : 100;\r\n row.append($('
    '));\r\n }\r\n $('#orderItemsKendoGrid table tbody').append(row);\r\n\r\n }\r\n }\r\n\r\n function clearSkeletonPlaceholdersLoadingAnimation() {\r\n $('#orderItemsKendoGrid table tbody').empty();\r\n }\r\n\r\n function resizeGrid() {\r\n var availableHeight = $(window).height() - $(\"div.grid-view-title\").outerHeight(true) - $(\"div.customer-info\").outerHeight(true) \r\n - $(\"div.k-grid-toolbar\").outerHeight(true) - $(\"thead.k-grid-header\").outerHeight(true) - $(\"div.k-grouping-header\").outerHeight(true)\r\n - $(\"div.k-grid-pager\").outerHeight(true) - $(\"#header\").outerHeight(true)\r\n - parseFloat($(\".orders-list\").css('margin-top'));\r\n\r\n $('#orderItemsKendoGrid table').css(\"height\", availableHeight);\r\n }\r\n\r\n /**\r\n * Force grid to refresh (if loaded)\r\n */\r\n function reloadGrid() {\r\n\r\n if ($scope.orderItemsGrid && $scope.orderItemsGrid.dataSource && $scope.orderItemsGrid.dataSource.read) {\r\n $('thead tr').find('input[type=checkbox]').prop('checked', false);\r\n $('thead tr').find('input[type=checkbox]').prop('indeterminate', false);\r\n\r\n return $scope.orderItemsGrid.dataSource.read();\r\n }\r\n\r\n return $q.when(null);\r\n }\r\n\r\n function destroyGrid() {\r\n if (!$scope.orderItemsGrid || !$scope.orderItemsGrid.destroy) {\r\n return;\r\n }\r\n $scope.orderItemsGrid.destroy();\r\n }\r\n\r\n })\r\n // Separate service for update events (to prevent multiple event subscription)\r\n .service('customerOverviewUpdatesService', function (rest) {\r\n var _this = this;\r\n var newOrderItemCb;\r\n var orderItemChangedCb;\r\n var orderChangedCb;\r\n\r\n rest.events.on(\"modelCreatedOnServer\", function (modelInfo) {\r\n if (!newOrderItemCb) {\r\n return;\r\n }\r\n if (modelInfo && modelInfo.modelType === \"OrderItemModel\") {\r\n newOrderItemCb(modelInfo);\r\n }\r\n });\r\n\r\n rest.events.on(\"modelUpdatedOnServer\", function (modelInfo) {\r\n if (modelInfo.modelType === \"OrderItemModel\" && orderItemChangedCb) {\r\n orderItemChangedCb(modelInfo);\r\n } else if (modelInfo.modelType === \"OrderModel\" && orderChangedCb) {\r\n orderChangedCb(modelInfo);\r\n }\r\n });\r\n\r\n _this.onNewOrderItem = function (cb) {\r\n newOrderItemCb = cb;\r\n };\r\n\r\n _this.onOrderItemChanged = function (cb) {\r\n orderItemChangedCb = cb;\r\n };\r\n\r\n _this.onOrderChanged = function (cb) {\r\n orderChangedCb = cb;\r\n };\r\n\r\n return _this;\r\n })\r\n ;\r\n","angular.module('ui.centre.list', ['kendo.directives', 'common.directives.inView'])\r\n .config(function ($stateProvider) {\r\n $stateProvider.state('client.centres', {\r\n url: '/centres',\r\n templateUrl: 'app/ui/centre/list/list.html',\r\n controller: 'CentresController',\r\n controllerAs: 'CentresController',\r\n data: { pageTitle: 'OrderManager: Centres' },\r\n resolve: {\r\n currentUser: function (usersRepository) {\r\n return usersRepository.getCurrentUser();\r\n }\r\n },\r\n params: {\r\n filter: null\r\n }\r\n });\r\n })\r\n\r\n .controller('CentresController', function ($window, $compile, $timeout, $rootScope, $scope, $state, $log, $q, gettext, uiLocalization, toastr, \r\n appLocale, rest, authService, currentUser, serverLocalization, centresRepository, ordersRepository, templateResolver, customResourceResolver) {\r\n\r\n $scope.user = currentUser;\r\n $scope.centres = null;\r\n $scope.centresLoadedAndSorted = false;\r\n $scope.permissionsGranted = false;\r\n $scope.topCentreStat = { \"numOrders\": 0, \"numOrderItems\": 0, \"date\": \"9999-12-31T23:59:59.9999999Z\" };\r\n $scope.centresStat = { activeCustomersChange: 0 };\r\n $scope.limit = 30; // initial value for limit\r\n\r\n _.extend($scope, {\r\n setBusyState: setBusyState,\r\n centresSearch: centresSearch,\r\n loadMore: loadMore,\r\n centresLoadedAndSortedCallback: centresLoadedAndSortedCallback\r\n });\r\n\r\n initController();\r\n\r\n function initController() {\r\n setBusyState(true);\r\n\r\n if ($state.params.filter) {\r\n $scope.centreFilter = $state.params.filter.toString().trim();\r\n }\r\n\r\n initInViewLoader();\r\n\r\n checkCurrentUserPermissions()\r\n .then(function(granted) {\r\n if (granted) {\r\n initPageHeaderAndData()\r\n .then(function() {\r\n setBusyState(false);\r\n });\r\n } else {\r\n //otherwise do nothing\r\n setBusyState(false);\r\n }\r\n })\r\n .catch(function(error) {\r\n $log.error(\"Can't initialize centres list.\");\r\n if (error && error.message) {\r\n $log.error(error.message);\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error: %s\", error.message));\r\n } else if (error && _.isString(error)) {\r\n $log.error(error);\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error: %s\", error));\r\n } else if (error && error.status) {\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error %s : %s\",\r\n error.status,\r\n error.statusText));\r\n } else {\r\n toastr.error(gettext(\"Data request failed\"), gettext(\"Server is not responding\"));\r\n }\r\n });\r\n }\r\n\r\n function initWatchers() {\r\n\r\n $scope.$on(\r\n \"$destroy\",\r\n function () { \r\n }\r\n );\r\n }\r\n\r\n function checkCurrentUserPermissions() {\r\n return $q.when($scope.user) //we have user already\r\n .then(function(user) {\r\n //Check that current user is a centre user\r\n $scope.permissionsGranted = user && !user.isCustomer();\r\n\r\n if (!$scope.permissionsGranted) {\r\n toastr.error('Sorry, you have no access to this data :(', 'Access denied');\r\n $log.error(`User [${user.$model.name}] has no permissions to view Customer [${$scope.customerId}] data.`);\r\n }\r\n\r\n return $scope.permissionsGranted;\r\n });\r\n }\r\n\r\n /**\r\n * Updates busy state\r\n */\r\n function setBusyState(newBusyState) {\r\n $scope.isBusy = newBusyState;\r\n }\r\n\r\n function initPageHeaderAndData() {\r\n $scope.pageDisplayName = uiLocalization.translate('Centres Directory');\r\n\r\n $scope.centresStats = {};\r\n \r\n return $q\r\n .all([centresRepository.getCentres()]) \r\n .then(function(result) {\r\n $scope.centres = result[0];\r\n \r\n if ($scope.centres) {\r\n $rootScope.pageTitle = uiLocalization.translate(\"OrderManager: Centres: %s\", $scope.centres.length);\r\n }\r\n });\r\n }\r\n\r\n function centresLoadedAndSortedCallback () {\r\n $timeout(function () {\r\n //We can use that flag to wait till ng-repeat loads and prepares data and then reveal the content to avoid flickering\r\n $scope.centresLoadedAndSorted = true;\r\n setBusyState(false);\r\n }, 100);\r\n }\r\n\r\n function loadMore(isLast, isInView, inviewInfo) {\r\n const isInitialEvent = inviewInfo.event.type === 'initial'; \r\n\r\n if ( ( (isLast && isInView) ) && $scope.limit < $scope.centres.length) {\r\n $scope.$applyAsync(function() {\r\n $scope.limit += 50;\r\n });\r\n }\r\n }\r\n\r\n function initInViewLoader() {\r\n $scope.inViewLoaderOptions = {\r\n viewportOffset: ['1000%', 0, '1000%', 0]\r\n };\r\n }\r\n\r\n function centresSearch (item) {\r\n if (!$scope.centreFilter || !item || !item.$model)\r\n return true;\r\n\r\n const term = $scope.centreFilter.toLowerCase();\r\n\r\n if (item.$model.id.toString().indexOf(term) !== -1 ||\r\n item.$model.code.toLowerCase().indexOf(term) !== -1 ||\r\n item.$model.address.$model.companyName.toLowerCase().indexOf(term) !== -1) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n\r\n })\r\n ;\r\n","angular.module('ui.centre.overview', ['kendo.directives', 'nvd3'])\r\n\r\n .config(function ($stateProvider) {\r\n $stateProvider.state('client.centre', {\r\n url: '/centres/:centreId/overview',\r\n templateUrl: 'app/ui/centre/overview/overview.html',\r\n controller: 'CentreOverviewController',\r\n controllerAs: 'CentreOverviewController',\r\n data: { pageTitle: 'OrderManager: Centre Overview' },\r\n resolve: {\r\n currentUser: function (usersRepository) {\r\n return usersRepository.getCurrentUser();\r\n }\r\n }\r\n });\r\n })\r\n\r\n .controller('CentreOverviewController', function ($window, $compile, $timeout, $rootScope, $scope, $state, $log, $q, gettext, uiLocalization, toastr, usersRepository,\r\n appLocale, rest, authService, currentUser, serverLocalization, centresRepository, ordersRepository, centreOverviewUpdatesService, geocodingService, workflowRepository, \r\n gridDataProvider, templateResolver, orderItemsGridSharedSettings, customResourceResolver, reportManager) {\r\n\r\n var textSearchTrigger = false;\r\n var dataRequestCount = 0;\r\n const UsersStatsChartTypes = Object.makeEnum([\"year\", \"month\", \"week\"]);\r\n \r\n $scope.user = currentUser;\r\n $scope.centreId = $state.params.centreId;\r\n $scope.centre = null;\r\n $scope.centreOrders = [];\r\n $scope.permissionsGranted = false;\r\n\r\n $scope.usersStatsTo = new Date();\r\n $scope.usersStatsFrom = new Date().addDays(-7);\r\n $scope.userStatsChartType = UsersStatsChartTypes.week;\r\n \r\n _.extend($scope, {\r\n setBusyState: setBusyState,\r\n applyTextSearch: applyTextSearch,\r\n viewUsersActivityLastYear: viewUsersActivityLastYear,\r\n viewUsersActivityLastMonth: viewUsersActivityLastMonth,\r\n viewUsersActivityLastWeek: viewUsersActivityLastWeek,\r\n setCurrentTab: setCurrentTab\r\n });\r\n\r\n initController();\r\n\r\n function initController() {\r\n $scope.isBusy = true;\r\n\r\n //clear any remembered search filter \r\n if (!$state.params.search) {\r\n orderItemsGridSharedSettings.setTextSearch(null);\r\n }\r\n\r\n //clear any remembered selected items if we re-visit the items grid\r\n orderItemsGridSharedSettings.setSelectedOrderItemIds([]);\r\n\r\n checkCurrentUserPermissions()\r\n .then(function(granted) {\r\n if (granted) {\r\n $q.all([initPageHeaderAndConfigs(), getCentreStatistics()])\r\n .then(function(result) {\r\n\r\n getAddressGeocodingData();\r\n\r\n //Init watchers to watch for order changes and reload data\r\n initWatchers();\r\n\r\n //Init customer's orders grid\r\n initAdditionalFilter();\r\n initGrid();\r\n initReportList();\r\n })\r\n .then(function() {\r\n $scope.isBusy = false;\r\n });\r\n\r\n } else {\r\n //otherwise do nothing\r\n $scope.isBusy = false;\r\n }\r\n })\r\n .catch(function(error) {\r\n $log.error(\"Can't initialize centre orders data & grid.\");\r\n if (error && error.message) {\r\n $log.error(error.message);\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error: %s\", error.message));\r\n } else if (error && _.isString(error)) {\r\n $log.error(error);\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error: %s\", error));\r\n } else if (error && error.status) {\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error %s : %s\",\r\n error.status,\r\n error.statusText));\r\n } else {\r\n toastr.error(gettext(\"Data request failed\"), gettext(\"Server is not responding\"));\r\n }\r\n });\r\n }\r\n\r\n function initWatchers() {\r\n\r\n var reloadGridBySignalREvent = _.debounce(function (e) {\r\n reloadGrid();\r\n getCentreStatistics(); \r\n }, 1000);\r\n\r\n // Watchers are not enabled for now to make less load on server\r\n // \r\n //centreOverviewUpdatesService.onOrderItemChanged(reloadGridBySignalREvent);\r\n //centreOverviewUpdatesService.onOrderChanged(reloadGridBySignalREvent);\r\n //centreOverviewUpdatesService.onNewOrderItem(reloadGridBySignalREvent);\r\n\r\n $scope.$on(\r\n \"$destroy\",\r\n function () {\r\n destroyGrid();\r\n //centreOverviewUpdatesService.onOrderItemChanged(null);\r\n //centreOverviewUpdatesService.onNewOrderItem(null);\r\n //centreOverviewUpdatesService.onOrderChanged(null);\r\n }\r\n );\r\n }\r\n\r\n function checkCurrentUserPermissions() {\r\n return $q.when($scope.user) //we have user already\r\n .then(function(user) {\r\n //Check that current user is a centre user \r\n $scope.permissionsGranted = user && !user.isCustomer();\r\n\r\n if (!$scope.permissionsGranted) {\r\n toastr.error('Sorry, you have no access to this data :(', 'Access denied');\r\n $log.error(`User [${user.$model.name}] has no permissions to view Centre [${$scope.centreId}] data.`);\r\n }\r\n\r\n return $scope.permissionsGranted;\r\n });\r\n }\r\n\r\n function initPageHeaderAndConfigs() {\r\n $scope.pageDisplayName = uiLocalization.translate('Centre Overview');\r\n\r\n return centresRepository.getCentre($scope.centreId)\r\n .then(function(centre) {\r\n $scope.centre = centre;\r\n\r\n $q.all(\r\n [\r\n gridDataProvider.getGridConfig('all-open'),\r\n templateResolver.resolve('app/ui/centre/overview/gridHeader.html'),\r\n customResourceResolver.resolveConfig(\r\n 'centre-profile-open-orders-filter',\r\n {\r\n //Default config if nothing resolved from customization configuration files\r\n name: $scope.centre.$model.code,\r\n color: 'green',\r\n queryForStatInfo:\r\n `OrderItem.Deleted = false AND Step.Code <> 'Complete' AND Step.Code <> 'Cancelled' AND (Centre.Id = ${\r\n $scope.centreId} OR AssignedCentre.Id = ${$scope.centreId})`,\r\n targetUri: `#/client/centres/${$scope.centreId}/overview`,\r\n iconName: 'track',\r\n uiPriority: 1\r\n },\r\n {\r\n //Context data for the customized config\r\n centreId: $scope.centreId,\r\n centreCode: $scope.centre.$model.code\r\n }),\r\n initCentreTabs()\r\n ]\r\n ).then(function(data) {\r\n var gridConfig = _.clone(data[0]);\r\n $scope.gridHeaderTemplate = data[1];\r\n var gridOrdersCustomFilter = data[2];\r\n\r\n //Set our custom filter config onto order items grid shared settings object,\r\n //so grid data provider will get us the orders according to this custom filter OMQL query\r\n //for all open orders, instead of expecting us to request orders for particular step\r\n orderItemsGridSharedSettings.setCustomFilter(gridOrdersCustomFilter);\r\n orderItemsGridSharedSettings.setStepFilter(\"all-open\"); //to set other grid behaviour settings equal to 'all-open' filter\r\n\r\n //Set config onto orderitems grid wrapper directive so it will configure and render itself\r\n gridConfig = initGridConfig(gridConfig, $scope.gridHeaderTemplate);\r\n gridConfig.dataSource = initGridDataSource(gridConfig);\r\n $scope.gridConfig = gridConfig;\r\n\r\n if ($scope.centre) {\r\n $scope.pageDisplayName = uiLocalization.translate(\"Centre: %s\", $scope.centre.$model.address.$model.companyName);\r\n $rootScope.pageTitle = uiLocalization.translate(\"OrderManager: Centre: %s\", $scope.centre.$model.address.$model.companyName);\r\n }\r\n });\r\n });\r\n }\r\n\r\n function initCentreTabs() {\r\n $scope.tabs = [\r\n {\r\n title: gettext(\"Orders in Progress\"),\r\n name: \"ordersList\"\r\n }\r\n ];\r\n\r\n return customResourceResolver.resolveConfig('centre-profile-additional-tabs', [])\r\n .then(function (customTabs) {\r\n if (customTabs && customTabs.length > 0) {\r\n customTabs.forEach(function(t) {\r\n $scope.tabs.push(t);\r\n });\r\n }\r\n\r\n setCurrentTab($scope.tabs[0]);\r\n });\r\n }\r\n\r\n function setCurrentTab(tab) {\r\n $scope.currentTab = tab;\r\n\r\n //TODO: Implement saving current tab for user into userSettings\r\n }\r\n\r\n function getCentreStatistics() {\r\n var filterQuery = null;\r\n\r\n //TODO: Think on applying more filters\r\n return $q.all([workflowRepository.getSteps(), customResourceResolver.resolveWorkflow()])\r\n .then(function (data) {\r\n var steps = data[0];\r\n var workflowConfig = data[1];\r\n\r\n var getOpenOrdersStats = centresRepository\r\n .getCentreOrdersStepsStats($scope.centreId, filterQuery)\r\n .then(function (stats) {\r\n //A bit of mapping/pre-processing before we return all orders counts per workflow stage\r\n //so we can render later all values (if necessary) even for the workflow stages with 0 items\r\n var stepsWithStats = _.map(steps,\r\n function (step) {\r\n var statValue = stats.find(function (stat) { return stat.step === step.$model.code });\r\n return { step: step, stat: statValue ? statValue : { numOrderItems: 0, numOrders: 0} }\r\n });\r\n\r\n return stepsWithStats;\r\n });\r\n\r\n var getCentreUsersStats = centresRepository\r\n .getCentreUsersStats($scope.centreId, $scope.usersStatsFrom, $scope.usersStatsTo);\r\n\r\n return $q.all([getOpenOrdersStats, getCentreUsersStats]);\r\n })\r\n .then(function (data) {\r\n processCentreStatistics(data[0], data[1]);\r\n });\r\n }\r\n\r\n function processCentreStatistics(stepsWithStats, usersStats) {\r\n if (stepsWithStats) {\r\n //Calculate totals\r\n var ordersTotals = {\r\n //Total order items count at all steps/stages\r\n total: _.reduce(stepsWithStats, function(memo, sws) {\r\n return memo + sws.stat.numOrderItems;\r\n }, 0),\r\n //Non completed orders/items\r\n open: _.reduce(stepsWithStats, function(memo, sws) {\r\n return memo + (sws.step.$model.type !== 2 ? sws.stat.numOrderItems : 0);\r\n }, 0),\r\n //Completed orders items\r\n completed: _.reduce(stepsWithStats, function(memo, sws) {\r\n return memo +\r\n (sws.step.$model.type === 2 && sws.step.$model.code.toLowerCase().indexOf('cancel') === -1 ? sws.stat.numOrderItems : 0);\r\n }, 0),\r\n //Completed orders items\r\n cancelled: _.reduce(stepsWithStats, function (memo, sws) {\r\n return memo +\r\n (sws.step.$model.type === 2 && sws.step.$model.code.toLowerCase().indexOf('cancel') !== -1 ? sws.stat.numOrderItems : 0);\r\n }, 0)\r\n };\r\n\r\n //And assign to variables bound to UI\r\n $scope.$applyAsync(function () {\r\n $scope.centreStepsStats = stepsWithStats;\r\n $scope.ordersTotals = ordersTotals;\r\n\r\n initStepsChartData();\r\n\r\n checkIfActiveCentre();\r\n });\r\n }\r\n\r\n if (usersStats) {\r\n //And assign to variables bound to UI\r\n $scope.$applyAsync(function () {\r\n $scope.centreUsersStats = usersStats;\r\n\r\n initUsersStatsChartData();\r\n });\r\n }\r\n }\r\n\r\n function checkIfActiveCentre() {\r\n $scope.isActiveCentre = $scope.ordersTotals && $scope.ordersTotals.open && $scope.ordersTotals.open !== 0;\r\n }\r\n\r\n function initStepsChartData() {\r\n if (!$scope.centreStepsStats) {\r\n return;\r\n }\r\n\r\n $scope.chartData = [\r\n {\r\n key: \"Orders per workflow step\",\r\n values: _.map(\r\n $scope.centreStepsStats.filter(function (ss) { return ss.stat.numOrderItems > 0 && ss.step.$model.type !== 2; }), //ignore 0 items steps and 'end' steps\r\n function (sws) {\r\n return {\r\n label: serverLocalization.translate(sws.step.$model.nameResource),\r\n value: sws.stat.numOrderItems\r\n };\r\n })\r\n }\r\n ];\r\n\r\n $scope.chartOptions = {\r\n chart: {\r\n type: 'discreteBarChart',\r\n height: 250,\r\n margin: { top: 10, right: 5, bottom: 70, left: 0 },\r\n x: function (d) { return d.label; },\r\n y: function (d) { return d.value; },\r\n forceY: [0, 10],\r\n //useInteractiveGuideline: true,\r\n showValues: true,\r\n staggerLabels: $scope.chartData[0].values.length > 6,\r\n wrapLabels: true,\r\n noData: gettext('No orders data available'),\r\n valueFormat: function (d) { return d3.format('~g')(d); },\r\n duration: 500,\r\n showYAxis: true,\r\n tooltip: {\r\n valueFormatter: function(d) {\r\n return d > 1\r\n ? uiLocalization.translate(\"%s Items\", d3.format('~g')(d))\r\n : uiLocalization.translate(\"%s Item\", d3.format('~g')(d));\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n function initUsersStatsChartData() {\r\n if (!$scope.centreUsersStats) {\r\n return;\r\n }\r\n\r\n $scope.chartUsersStatsData = [\r\n {\r\n key: \"Centre Users Stats\",\r\n values: _.map(\r\n $scope.centreUsersStats,\r\n function (cus) {\r\n return {\r\n label: cus.userName,\r\n value: cus.workflowActionsExecutions\r\n };\r\n })\r\n }\r\n ];\r\n\r\n $scope.chartUsersStatsOptions = {\r\n chart: {\r\n type: 'discreteBarChart',\r\n height: 250,\r\n margin: { top: 10, right: 5, bottom: 70, left: 30 },\r\n x: function (d) { return d.label.length > 16 ? (d.label.slice(0, 13) + '...') : d.label; },\r\n y: function (d) { return d.value; },\r\n forceY: [0, 10],\r\n //useInteractiveGuideline: true,\r\n showValues: false,\r\n //staggerLabels: $scope.chartData[0].values.length > 6,\r\n rotateLabels: -35,\r\n wrapLabels: false,\r\n noData: gettext('No user statistics available'),\r\n valueFormat: function (d) { return d3.format('s')(d); },\r\n duration: 500,\r\n xAxis: {\r\n tickPadding: -7\r\n },\r\n showYAxis: true,\r\n yAxis: {\r\n //axisLabel: gettext('Workflow Actions Performed'),\r\n tickFormat: function(d) {\r\n return d3.format('s')(d);\r\n },\r\n axisLabelDistance: 0,\r\n showMaxMin: false\r\n },\r\n tooltip: {\r\n valueFormatter: function (d) {\r\n return d > 1\r\n ? uiLocalization.translate(\"Performed %s workflow actions\", d3.format('s')(d))\r\n : uiLocalization.translate(\"Performed %s workflow action\", d3.format('s')(d));\r\n }\r\n }\r\n }\r\n };\r\n }\r\n\r\n function viewUsersActivityLastYear() {\r\n $scope.usersStatsTo = new Date();\r\n $scope.usersStatsFrom = new Date($scope.usersStatsTo.getFullYear(), $scope.usersStatsTo.getMonth() - 12, $scope.usersStatsTo.getDate());\r\n $scope.userStatsChartType = UsersStatsChartTypes.year;\r\n\r\n $scope.isUserStatsBusy = true;\r\n\r\n centresRepository.getCentreUsersStats($scope.centreId, $scope.usersStatsFrom, $scope.usersStatsTo)\r\n .then(function(usersStats) {\r\n processCentreStatistics(null, usersStats);\r\n\r\n $scope.isUserStatsBusy = false;\r\n });\r\n }\r\n\r\n function viewUsersActivityLastMonth() {\r\n $scope.usersStatsTo = new Date();\r\n $scope.usersStatsFrom = new Date($scope.usersStatsTo.getFullYear(), $scope.usersStatsTo.getMonth() - 1, $scope.usersStatsTo.getDate());\r\n $scope.userStatsChartType = UsersStatsChartTypes.month;\r\n\r\n $scope.isUserStatsBusy = true;\r\n\r\n centresRepository.getCentreUsersStats($scope.centreId, $scope.usersStatsFrom, $scope.usersStatsTo)\r\n .then(function (usersStats) {\r\n processCentreStatistics(null, usersStats);\r\n\r\n $scope.isUserStatsBusy = false;\r\n });\r\n }\r\n\r\n function viewUsersActivityLastWeek() {\r\n $scope.usersStatsTo = new Date();\r\n $scope.usersStatsFrom = new Date().addDays(-7);\r\n $scope.userStatsChartType = UsersStatsChartTypes.week;\r\n\r\n $scope.isUserStatsBusy = true;\r\n\r\n centresRepository.getCentreUsersStats($scope.centreId, $scope.usersStatsFrom, $scope.usersStatsTo)\r\n .then(function (usersStats) {\r\n processCentreStatistics(null, usersStats);\r\n\r\n $scope.isUserStatsBusy = false;\r\n });\r\n }\r\n\r\n function getAddressGeocodingData() {\r\n if ($scope.centre) {\r\n geocodingService.getGeocodingForAddress($scope.centre.$model.address.toFormattedString())\r\n .then(function (result) {\r\n $scope.centreAddressPlace = result;\r\n });\r\n }\r\n }\r\n\r\n //\r\n\r\n function initAdditionalFilter() {\r\n $scope.searchDropdownOptions = {\r\n dataSource: [\r\n { text: gettext(\"Regular Search\"), value: \"reg-search\", icon: \"search-dropdown-icon icon-magnifier-add\" },\r\n { text: gettext(\"Exact Match Search\"), value: \"exact-search\", icon: \"search-dropdown-icon icon-magnifier\" }\r\n ],\r\n valuePrimitive: false,\r\n dataTextField: \"text\",\r\n dataValueField: \"value\",\r\n valueTemplate: ' ',\r\n template: '' +\r\n '{{dataItem.text}}',\r\n dataBound: function () {\r\n this.list.width(\"auto\");\r\n }\r\n };\r\n\r\n $scope.clearSearchTerm = function () {\r\n orderItemsGridSharedSettings.setTextSearch(null);\r\n $scope.textSearch = null;\r\n applyTextSearch();\r\n };\r\n\r\n var textSearchConfig = orderItemsGridSharedSettings.getTextSearch();\r\n if (textSearchConfig) {\r\n $scope.textSearch = textSearchConfig.text;\r\n $scope.searchDropdown = textSearchConfig.exact ? \"exact-search\" : \"reg-search\";\r\n } else {\r\n $scope.textSearch = null;\r\n $scope.searchDropdown = \"reg-search\";\r\n }\r\n }\r\n\r\n function initGrid() {\r\n angular.element($window).bind('resize', function () {\r\n resizeGrid();\r\n\r\n // manual $digest required as resize event\r\n // is outside of angular\r\n $scope.$digest();\r\n });\r\n\r\n var gridTemplate = '
    ';\r\n var jqTemplate = $('#orderItemsKendoGrid').append(gridTemplate);\r\n $compile(jqTemplate)($scope);\r\n\r\n //Init all the handlers for the events of the grid (like row click, checkbox-selector click, ,double-click, etc.\r\n initGridEventsHandlers($scope.gridConfig);\r\n\r\n //Trigger window resize event to properly resize grid\r\n $timeout(function () { $(window).trigger('resize'); });\r\n\r\n }\r\n\r\n function initGridConfig(gConfig, gridHeaderTemplate) {\r\n\r\n gConfig.hideShowCompletedSwitch = true;\r\n\r\n if (gConfig.columns) {\r\n var firstVisibleColumn = _.find(gConfig.columns, function (c) {\r\n return !c.hidden && c.field;\r\n });\r\n if (firstVisibleColumn) {\r\n firstVisibleColumn.template = _.string.sprintf(\r\n \"
    #:%s#
    \",\r\n gettext(\"View Details\"),\r\n firstVisibleColumn.field);\r\n }\r\n\r\n //Check if we have columns without percentage specified. Assign width if so.\r\n for (var i = 0; i < gConfig.columns.length; i++) {\r\n var column = gConfig.columns[i];\r\n if (!column.width) {\r\n column.width = 2 * (100 / gConfig.columns.length) + \"%\";\r\n }\r\n }\r\n }\r\n\r\n gConfig.toolbar = [{ template: gridHeaderTemplate }];\r\n\r\n gConfig.noRecords = {\r\n template: gettext(\"No items to display\")\r\n };\r\n\r\n gConfig.dataBound = function (e) {\r\n //Execute the dataBound defined on the customised config first \r\n if (angular.isDefined($scope.gridConfig.dataBoundEventHandler) && angular.isFunction($scope.gridConfig.dataBoundEventHandler)) {\r\n try {\r\n $scope.gridConfig.dataBoundEventHandler.call($scope.orderItemsGrid, e);\r\n } catch (error) {\r\n $log.error(\"Error during executing customised Grid's config's DataBound even handler.\", error);\r\n }\r\n }\r\n\r\n //And highlight the searchTerm found in the text values inside rows shown\r\n $timeout(function () {\r\n if (!String.isNullOrWhiteSpace($scope.textSearch)) {\r\n $(\"#orderItemsKendoGrid tbody td[role='gridcell']\").highlight($scope.textSearch);\r\n } else {\r\n $(\"#orderItemsKendoGrid tbody td[role='gridcell']\").unhighlight();\r\n }\r\n });\r\n };\r\n\r\n //Grid pager is 'ON' by default or if specified so\r\n if (!gConfig.pageable || typeof gConfig.pageable === 'boolean' || gConfig.pageable !== null) {\r\n //Pager info (items count) is 'ON' by defaults unless specified to be 'OFF'\r\n var disablePagerInfo = gConfig.disablePagerItemsInfo && gConfig.disablePagerItemsInfo === true;\r\n if (disablePagerInfo) {\r\n //Reset pageable object. Otherwise just not touch it as it contains other valuable settings\r\n gConfig.pageable = {\r\n refresh: true,\r\n pageSizes: true,\r\n info: !disablePagerInfo\r\n };\r\n }\r\n }\r\n\r\n //See if we have default sorting specified, then set it onto grid shared settings\r\n if (angular.isDefined(gConfig.initialSort)) {\r\n if (angular.isArray(gConfig.initialSort)) {\r\n orderItemsGridSharedSettings.setGridSort(gConfig.initialSort);\r\n } else if (angular.isDefined(gConfig.initialSort.field) && angular.isDefined(gConfig.initialSort.dir)) {\r\n orderItemsGridSharedSettings.setGridSort([gConfig.initialSort]);\r\n }\r\n }\r\n\r\n return gConfig;\r\n }\r\n\r\n var forcedPageChange = false;\r\n var cachedResult;\r\n\r\n function initGridDataSource(gridConfig) {\r\n var dataSourceObj = {\r\n transport: {\r\n read: function (options) {\r\n if (forcedPageChange) { // prevent data request after manual page change\r\n forcedPageChange = false;\r\n if (cachedResult) {\r\n options.success(cachedResult);\r\n } else {\r\n toastr.error(gettext(\"Data request cache error\"));\r\n options.error();\r\n }\r\n return;\r\n }\r\n $scope.isBusy = true;\r\n $scope.isGridReload = true;\r\n\r\n //Reset page size ignorance flag as it shouldn't alter grid behavior.\r\n //It is applied only on the item details card if order item id specified in the url as a parameter\r\n orderItemsGridSharedSettings.setForceIgnorePageSize(false);\r\n\r\n orderItemsGridSharedSettings.setPageNumber(options.data.page || 1);\r\n orderItemsGridSharedSettings.setPageSize(angular.isDefined(options.data.pageSize) ? options.data.pageSize : 20);\r\n orderItemsGridSharedSettings.setGridFilter(options.data.filter);\r\n orderItemsGridSharedSettings.setGridSort(options.data.sort);\r\n\r\n renderSkeletonPlaceholdersLoadingAnimation();\r\n\r\n gridDataProvider.getData()\r\n .then(function (result) {\r\n orderItemsGridSharedSettings.setTotalCount(result.totalCount);\r\n orderItemsGridSharedSettings.setTotalPageCount(result.totalPageCount);\r\n cachedResult = result;\r\n dataRequestCount++;\r\n\r\n // check if current page number was changed\r\n if ($scope.gridConfig.dataSource.page() !== result.pageNumber ||\r\n $scope.gridConfig.dataSource.pageSize() !== result.rowsPerPage) {\r\n forcedPageChange = true;\r\n options.page = result.pageNumber;\r\n options.pageSize = result.rowsPerPage;\r\n $scope.gridConfig.dataSource.query(options);\r\n }\r\n\r\n if (!$scope.selectedOrderItemId) {\r\n $scope.selectedOrderItemId = orderItemsGridSharedSettings.getSelectedOrderItemId();\r\n }\r\n\r\n clearSkeletonPlaceholdersLoadingAnimation();\r\n\r\n options.success(result);\r\n $scope.isBusy = false;\r\n $scope.isGridReload = false;\r\n textSearchTrigger = false;\r\n\r\n resizeGrid();\r\n },\r\n function (resp) {\r\n if (resp && resp.status) {\r\n toastr.error(resp.message, gettext(\"Reading orders data failed\"));\r\n } else {\r\n toastr.error(gettext(\"Reading orders data failed\"), gettext(\"Server is not responding\"));\r\n }\r\n options.error();\r\n $scope.isBusy = false;\r\n $scope.isGridReload = false;\r\n textSearchTrigger = false;\r\n });\r\n }\r\n },\r\n schema: {\r\n data: function (response) {\r\n return response ? response.items : null;\r\n },\r\n total: function (response) {\r\n return response ? response.totalCount : 0;\r\n },\r\n model: {\r\n id: \"$model.id\",\r\n fields: gridConfig.fields || {}\r\n }\r\n },\r\n page: orderItemsGridSharedSettings.getPageNumber() || 1,\r\n pageSize: orderItemsGridSharedSettings.getPageSize() || gridConfig.pageSize || 20,\r\n filter: orderItemsGridSharedSettings.getGridFilter(),\r\n sort: orderItemsGridSharedSettings.getGridSort(),\r\n serverPaging: true,\r\n serverSorting: true,\r\n serverFiltering: true\r\n };\r\n\r\n if (gridConfig.groupable === true && angular.isDefined(gridConfig.initialGroup)) {\r\n dataSourceObj.group = gridConfig.initialGroup;\r\n dataSourceObj.pageSize = gridConfig.pageSize;\r\n }\r\n\r\n return new kendo.data.DataSource(dataSourceObj);\r\n }\r\n\r\n function initGridEventsHandlers(gConfig) {\r\n //double click event to allow user to open order details\r\n $(\"#orderItemsKendoGrid tbody[role='rowgroup']\").on(\"dblclick\", \"tr\", function () {\r\n showStepDetails();\r\n });\r\n }\r\n\r\n /**\r\n * Updates busy state\r\n */\r\n function setBusyState(newBusyState) {\r\n $scope.isBusy = newBusyState;\r\n }\r\n\r\n function applyTextSearch() {\r\n orderItemsGridSharedSettings.setTextSearch($scope.textSearch, $scope.searchDropdown === \"exact-search\");\r\n reloadGrid();\r\n textSearchTrigger = true;\r\n }\r\n\r\n /**\r\n * Get selected items from grid\r\n * @returns {!RepresentationModel[]}\r\n */\r\n function getSelectedEntities() {\r\n var selectedEntities = [];\r\n var selectedDOM = $scope.orderItemsGrid.select();\r\n _.forEach(selectedDOM, function (value) {\r\n selectedEntities.push($scope.orderItemsGrid.dataItem(value));\r\n });\r\n return selectedEntities;\r\n }\r\n\r\n function showStepDetails() {\r\n var selected = getSelectedEntities();\r\n if (!selected || $scope.forbidOrderDetailsView) {\r\n //Do not allow to go into step details if nothing selected\r\n //OR if we are requested to do so according to the customisation configs\r\n return;\r\n }\r\n var firstSelected = selected[0];\r\n if (firstSelected && firstSelected.isRepresentationModel) {\r\n orderItemsGridSharedSettings.setSelectedOrderItemId(firstSelected.getId());\r\n // go to the Step Details View\r\n $state.go('client.step', {\r\n step: $scope.step\r\n });\r\n }\r\n }\r\n\r\n function renderSkeletonPlaceholdersLoadingAnimation() {\r\n if ($('#orderItemsKendoGrid table tbody').children().length > 0 || $('#orderItemsKendoGrid div.k-grid-norecords').length > 0) {\r\n //Do not render skeleton loading placeholders if we do have records to show OR if instead there are no records to show and we alreayd know it\r\n return;\r\n }\r\n\r\n var pageSize = orderItemsGridSharedSettings.getPageSize();\r\n if (!angular.isDefined(pageSize)) {\r\n pageSize = $scope.gridConfig.pageSize;\r\n }\r\n\r\n if (pageSize === 0 || pageSize > 15) {\r\n pageSize = 15; //Set page size for the loading-placeholders content to 15 if it's configured for bigger value or 0 which is 'show all'\r\n }\r\n\r\n var columnsCount = 10; //10 by default but it's better to try and find the columns count from grid template\r\n //which is initialised based on the grid branded config\r\n if ($('#orderItemsKendoGrid table colgroup').length > 0) {\r\n columnsCount = $('#orderItemsKendoGrid table colgroup').children().length;\r\n }\r\n for (var i = 0; i < pageSize; i++) {\r\n\r\n //Render visual templates to indicate loading rows/cells\r\n var row = $('');\r\n for (var c = 0; c < columnsCount; c++) {\r\n var divWidth = c > 0 ? (40 + Math.floor(Math.random() * 60)) : 100;\r\n row.append($('
    '));\r\n }\r\n $('#orderItemsKendoGrid table tbody').append(row);\r\n\r\n }\r\n }\r\n\r\n function clearSkeletonPlaceholdersLoadingAnimation() {\r\n $('#orderItemsKendoGrid table tbody').empty();\r\n }\r\n\r\n function resizeGrid() {\r\n var availableHeight = $(window).height() - $(\"div.grid-view-title\").outerHeight(true) - $(\"div.centre-info\").outerHeight(true) \r\n - $(\"div.k-grid-toolbar\").outerHeight(true) - $(\"thead.k-grid-header\").outerHeight(true) - $(\"div.k-grouping-header\").outerHeight(true)\r\n - $(\"div.k-grid-pager\").outerHeight(true) - $(\"#header\").outerHeight(true)\r\n - $(\".centre-tabs-links\").outerHeight(true)\r\n - parseFloat($(\".centre-tabs-container\").css('margin-top'));\r\n\r\n $('#orderItemsKendoGrid table').css(\"height\", availableHeight);\r\n }\r\n\r\n /**\r\n * Force grid to refresh (if loaded)\r\n */\r\n function reloadGrid() {\r\n\r\n if ($scope.orderItemsGrid && $scope.orderItemsGrid.dataSource && $scope.orderItemsGrid.dataSource.read) {\r\n $('thead tr').find('input[type=checkbox]').prop('checked', false);\r\n $('thead tr').find('input[type=checkbox]').prop('indeterminate', false);\r\n\r\n return $scope.orderItemsGrid.dataSource.read();\r\n }\r\n\r\n return $q.when(null);\r\n }\r\n\r\n function destroyGrid() {\r\n if (!$scope.orderItemsGrid || !$scope.orderItemsGrid.destroy) {\r\n return;\r\n }\r\n $scope.orderItemsGrid.destroy();\r\n }\r\n\r\n /**\r\n * Reports DropDown initialization\r\n * @returns {Promise}\r\n */\r\n function initReportList() {\r\n return reportManager.getReportListByName('all-open', 'centre-profile-orders-grid-reports')\r\n .then(function (results) {\r\n var reportComboItems = [];\r\n _.forEach(results, function (value) {\r\n reportComboItems.push({ \"text\": value.name, \"value\": value });\r\n });\r\n $scope.dropdownReportsOptions = {\r\n index: undefined,\r\n dataSource: reportComboItems,\r\n dataTextField: \"text\",\r\n dataValueField: \"value\",\r\n height: \"auto\",\r\n valueTemplate: gettext(\"Reports\"),\r\n template: \"{{dataItem.text|sTranslate}}\",\r\n select: function (e) {\r\n gridDataProvider.getReportQuery() //acquire the current query used to populate the grid\r\n .then(function (gridQuery) {\r\n var report = $scope.dropdownReportsOptions.dataSource[e.item.index()]; //get the clicked report configuration\r\n var selectedItemId = orderItemsGridSharedSettings.getSelectedOrderItemId(); //see if we have a selected item\r\n\r\n if (!!report.value.requiresSelection) {\r\n if (angular.isDefined(selectedItemId)) {\r\n //we use the selected item id as a query for the report if we have one selected\r\n reportManager.show({ report: report.value, query: [selectedItemId], orderBy: report.value.orderBy || gridQuery.orderBy });\r\n }\r\n //do nothing if report requires selection and we don't have any item selected\r\n } else {\r\n //If report doesn't require selection, use either specific custom query of the report (report.value.query)\r\n //specified in customisation or just the query that is used to show the current data set (gridQuery.query)\r\n //user is being viewing at.\r\n //Query and orderBy from report specified in customisation have higher priority over current-context data.\r\n reportManager.show({\r\n report: report.value,\r\n //Now supply the query to the report manager. Here we check if the report was configured with static query,\r\n //dynamic (function) query or no query at all. If it is a dynamic query - we use it, otherwise we use static query.\r\n //In case no query was configured in the report configuration section, we just use the grid's query to generate\r\n //report for exactly the same items we see in the grid.\r\n query: angular.isFunction(report.value.query)\r\n ? report.value.query(gridQuery, $scope.selectedOrderItem) : (report.value.query || gridQuery.query), orderBy: report.value.orderBy || gridQuery.orderBy\r\n });\r\n }\r\n });\r\n },\r\n dataBound: function () {\r\n this.list.width('auto');\r\n }\r\n };\r\n }, function (error) {\r\n $log.error(\"Can't initialize report list: \");\r\n if (error && error.message) {\r\n $log.error(error.message);\r\n } else if (error && _.isString(error)) {\r\n $log.error(error);\r\n } else {\r\n $log.error(\"Unknown error\");\r\n }\r\n });\r\n }\r\n\r\n })\r\n // Separate service for update events (to prevent multiple event subscription)\r\n .service('centreOverviewUpdatesService', function (rest) {\r\n var _this = this;\r\n var newOrderItemCb;\r\n var orderItemChangedCb;\r\n var orderChangedCb;\r\n\r\n rest.events.on(\"modelCreatedOnServer\", function (modelInfo) {\r\n if (!newOrderItemCb) {\r\n return;\r\n }\r\n if (modelInfo && modelInfo.modelType === \"OrderItemModel\") {\r\n newOrderItemCb(modelInfo);\r\n }\r\n });\r\n\r\n rest.events.on(\"modelUpdatedOnServer\", function (modelInfo) {\r\n if (modelInfo.modelType === \"OrderItemModel\" && orderItemChangedCb) {\r\n orderItemChangedCb(modelInfo);\r\n } else if (modelInfo.modelType === \"OrderModel\" && orderChangedCb) {\r\n orderChangedCb(modelInfo);\r\n }\r\n });\r\n\r\n _this.onNewOrderItem = function (cb) {\r\n newOrderItemCb = cb;\r\n };\r\n\r\n _this.onOrderItemChanged = function (cb) {\r\n orderItemChangedCb = cb;\r\n };\r\n\r\n _this.onOrderChanged = function (cb) {\r\n orderChangedCb = cb;\r\n };\r\n\r\n return _this;\r\n })\r\n ;\r\n","angular.module('env.data.requestCoupler.requestCouplerUtils', [])\r\n\r\n .service('requestCouplerUtils', function ($http) {\r\n\r\n _.extend(this, {\r\n createSimpleGetCollectionCoupler: createSimpleGetCollectionCoupler,\r\n createCustomFieldsCollectionCoupler: createCustomFieldsCollectionCoupler,\r\n createDocumentsCollectionCoupler: createDocumentsCollectionCoupler,\r\n createWorkflowAuditCollectionCoupler: createWorkflowAuditCollectionCoupler\r\n });\r\n\r\n /**\r\n * Create coupler for simple case of collection\r\n * @param {string} escapedSingleUrl url(escaped for regexp) of single model route\r\n * @param {string} collectionUrl full url of collection route\r\n * @returns {{check: Function, process: Function}}\r\n */\r\n function createSimpleGetCollectionCoupler(escapedSingleUrl, collectionUrl) {\r\n var tester = new RegExp(\"^.*\" + escapedSingleUrl + \"\\/(\\\\d+)$\", \"i\");\r\n\r\n return createRegExpCollectionCoupler(tester, collectionUrl);\r\n }\r\n\r\n function createCustomFieldsCollectionCoupler(modelRoute, customFieldRoute, collectionUrl) {\r\n var tester = new RegExp(\"^.*\" + modelRoute + \"\\/(\\\\d+)\\/\" + customFieldRoute + \"\\/?$\", \"i\");\r\n\r\n return createRegExpCollectionCoupler(tester, collectionUrl, function (idToCustomField) {\r\n return idToCustomField ? idToCustomField.customFields : null;\r\n });\r\n }\r\n\r\n function createDocumentsCollectionCoupler(modelRoute, documentsRoute, collectionUrl) {\r\n var tester = new RegExp(\"^.*\" + modelRoute + \"\\/(\\\\d+)\\/\" + documentsRoute + \"\\/?$\", \"i\");\r\n\r\n return createRegExpCollectionCoupler(tester, collectionUrl, function (idToDocuments) {\r\n return idToDocuments ? idToDocuments.documents : null;\r\n });\r\n }\r\n\r\n function createWorkflowAuditCollectionCoupler(modelRoute, workflowAuditRoute, collectionUrl) {\r\n var tester = new RegExp(\"^.*\" + modelRoute + \"\\/(\\\\d+)\\/\" + workflowAuditRoute + \"\\/?$\", \"i\");\r\n\r\n return createRegExpCollectionCoupler(tester, collectionUrl, function (idToWorkflowAudit) {\r\n return idToWorkflowAudit ? idToWorkflowAudit.workflowAudits : null;\r\n });\r\n }\r\n\r\n function createRegExpCollectionCoupler(regexp, collectionUrl, modelProcessor) {\r\n return {\r\n check: function (request) {\r\n return request.method.toUpperCase() == \"GET\" && regexp.test(request.url);\r\n },\r\n process: function (requests) {\r\n var ids = [];\r\n for (var i = 0; i < requests.length; i++) {\r\n ids.push(regexp.exec(requests[i].url)[1]);\r\n }\r\n $http.get(collectionUrl, {params: {ids: _.uniq(ids)}})\r\n .then(function (resp) {\r\n var models = resp.data;\r\n var headers = convertHeadersToString(resp.headers);\r\n if (models && models.length > 0) {\r\n for (var i = 0; i < requests.length; i++) {\r\n var request = requests[i];\r\n var model = _.find(models, function (m) {\r\n return m.id == ids[i];\r\n });\r\n if (model) {\r\n request.callback(resp.status, modelProcessor\r\n ? modelProcessor(model)\r\n : model, headers, resp.statusText);\r\n } else {\r\n request.callback(404, null, headers, \"Not found\");\r\n }\r\n }\r\n } else {\r\n for (var j = 0; j < requests.length; j++) {\r\n requests[j].callback(404, null, headers, \"Not found\");\r\n }\r\n }\r\n }, function (resp) {\r\n var headers = convertHeadersToString(resp.headers);\r\n for (var j = 0; j < requests.length; j++) {\r\n requests[j].callback(resp.status, resp.data, headers, resp.statusText);\r\n }\r\n });\r\n }\r\n };\r\n }\r\n\r\n function convertHeadersToString(headers) {\r\n var result = '';\r\n for (var property in headers) {\r\n result += property + ': ' + headers[property] + '\\n';\r\n }\r\n return result;\r\n }\r\n\r\n })\r\n\r\n;\r\n","angular.module('env.data.requestCoupler.requestCouplerProvider', [])\r\n\r\n .provider('requestCoupler', function () {\r\n var requestCouplerProvider = this;\r\n var defaultDelay = 100;\r\n\r\n var defaultCouplerConfig = {\r\n maxCouplerQueueSize: 10,\r\n minCouplerQueueSize: 2,\r\n delay: defaultDelay\r\n };\r\n\r\n var serviceConfig = {\r\n enabled: false\r\n };\r\n\r\n var couplers = [];\r\n\r\n /**\r\n * Set default configuration for request couplers\r\n * @param {{\r\n * [maxCouplerQueueSize]: number,\r\n * [minCouplerQueueSize]: number,\r\n * [delay]: number\r\n * }} config configuration object\r\n */\r\n function setDefaultCouplerConfig(config) {\r\n if (config) {\r\n angular.extend(defaultCouplerConfig, config);\r\n }\r\n }\r\n\r\n /**\r\n * Set requestCoupler provider configuration\r\n * @param {{enabled: boolean}} config configuration object\r\n */\r\n function setConfig(config) {\r\n if (config) {\r\n angular.extend(serviceConfig, config);\r\n }\r\n }\r\n\r\n /**\r\n * Add new coupler\r\n * @param {{\r\n * [maxCouplerQueueSize]: number,\r\n * [minCouplerQueueSize]: number,\r\n * [delay]: number,\r\n * check: function,\r\n * process: function\r\n * }} coupler\r\n */\r\n function addCoupler(coupler) {\r\n couplers.push(angular.extend({}, defaultCouplerConfig, coupler));\r\n }\r\n\r\n /**\r\n * Get couplers collection\r\n * @returns {Array}\r\n */\r\n function getCouplers() {\r\n return couplers;\r\n }\r\n\r\n function isEnabled() {\r\n return serviceConfig.enabled === true || serviceConfig.enabled === 'true';\r\n }\r\n\r\n angular.extend(requestCouplerProvider, {\r\n setDefaultCouplerConfig: setDefaultCouplerConfig,\r\n setConfig: setConfig,\r\n addCoupler: addCoupler,\r\n getCouplers: getCouplers\r\n });\r\n\r\n this.$get = function ($timeout) {\r\n\r\n /**\r\n * Request processors\r\n * @type {Array}\r\n */\r\n var processors = [];\r\n\r\n return {\r\n processRequest: processRequest,\r\n addCoupler: addCoupler,\r\n getCouplers: getCouplers\r\n };\r\n\r\n function processRequest(requestConfig) {\r\n if (!isEnabled()) {\r\n requestConfig.continueDownNormalPipeline();\r\n return;\r\n }\r\n\r\n var coupler = getCoupler(requestConfig);\r\n if (!coupler) {\r\n requestConfig.continueDownNormalPipeline(); // normal pipeline\r\n return;\r\n }\r\n\r\n getOrCreateProcessor(coupler).addRequest(requestConfig);\r\n }\r\n\r\n function getCoupler(requestConfig) {\r\n for (var i = 0; i < couplers.length; i++) {\r\n var coupler = couplers[i];\r\n if (coupler.check(requestConfig)) {\r\n return coupler;\r\n }\r\n }\r\n }\r\n\r\n function getOrCreateProcessor(coupler) {\r\n for (var i = 0; i < processors.length; i++) {\r\n if (processors[i].getCoupler() === coupler) {\r\n return processors[i];\r\n }\r\n }\r\n var newProcessor = new RequestCouplerProcessor(coupler);\r\n processors.push(newProcessor);\r\n return newProcessor;\r\n }\r\n\r\n function RequestCouplerProcessor(_coupler) {\r\n var coupler = _coupler;\r\n var requests = [];\r\n var me = this;\r\n\r\n // start timer\r\n var timeout = $timeout(send, coupler.delay || defaultDelay, false);\r\n\r\n angular.extend(this, {\r\n getCoupler: getCoupler,\r\n addRequest: addRequest\r\n });\r\n\r\n function getCoupler() {\r\n return coupler;\r\n }\r\n\r\n function addRequest(request) {\r\n requests.push(request);\r\n if (coupler.maxCouplerQueueSize > 0 && requests.length >= coupler.maxCouplerQueueSize) {\r\n $timeout.cancel(timeout);\r\n send();\r\n }\r\n }\r\n\r\n function send() {\r\n timeout = undefined;\r\n // remove processor from processors\r\n var di = processors.indexOf(me);\r\n if (di > -1) {\r\n processors.splice(di, 1);\r\n }\r\n\r\n // check limitations\r\n if (coupler.minCouplerQueueSize > 0 && requests.length < coupler.minCouplerQueueSize) {\r\n // should let the request continue normally\r\n angular.forEach(requests, function (request) {\r\n request.continueDownNormalPipeline();\r\n });\r\n return;\r\n }\r\n coupler.process(requests);\r\n }\r\n }\r\n }\r\n })\r\n\r\n .config(function ($provide) {\r\n $provide.decorator('$httpBackend', [\r\n '$delegate',\r\n 'requestCoupler',\r\n function ($delegate, requestCoupler) {\r\n var $httpBackendFn = function (method, url, post, callback, headers, timeout, withCredentials, responseType) {\r\n var self = this;\r\n var callArgs = arguments;\r\n\r\n requestCoupler.processRequest({\r\n method: method,\r\n url: url,\r\n data: post,\r\n callback: callback,\r\n headers: headers,\r\n timeout: timeout,\r\n withCredentials: withCredentials,\r\n responseType: responseType,\r\n continueDownNormalPipeline: function () {\r\n $delegate.apply(self, callArgs);\r\n }\r\n });\r\n };\r\n\r\n // If we are testing using angular-mocks we need to provide their special methods\r\n // on the function we are returning otherwise your tests won't work :-(.\r\n if (angular.mock) {\r\n angular.forEach($delegate, function (fn, key) {\r\n $httpBackendFn[key] = fn;\r\n });\r\n }\r\n\r\n return $httpBackendFn;\r\n }\r\n ]);\r\n })\r\n\r\n;","angular.module('env.data.requestCoupler', [\r\n 'env.data.requestCoupler.requestCouplerProvider',\r\n 'env.data.requestCoupler.requestCouplerUtils'\r\n])\r\n\r\n .config(function (requestCouplerProvider) {\r\n requestCouplerProvider.setConfig({\r\n enabled: om.config.requestCoupling.enabled\r\n });\r\n\r\n requestCouplerProvider.setDefaultCouplerConfig({\r\n delay: om.config.requestCoupling.delay || 50,\r\n maxCouplerQueueSize: om.config.requestCoupling.maxQueueSize || 10,\r\n minCouplerQueueSize: om.config.requestCoupling.minQueueSize || 2\r\n });\r\n })\r\n\r\n;","angular.module('env.data.services.gridTextSearch', [])\r\n\r\n .run(function (gridTextSearchService) {\r\n gridTextSearchService.fixGridTextSearchConfig();\r\n })\r\n\r\n .service('gridTextSearchService', function (omqlAliasBuilder, gridTextSearchConfigService, userSettings, authService, orderItemsRepository, ordersRepository) {\r\n\r\n var _this = this;\r\n\r\n var ordersCFDefs = [];\r\n var orderItemCFDefs = [];\r\n\r\n authService.events.on([\r\n 'login',\r\n 'continueSessionAfterReload'\r\n ], function () {\r\n ordersRepository.getCustomFieldDefinitions().then(function (defs) {\r\n ordersCFDefs = defs;\r\n });\r\n orderItemsRepository.getCustomFieldDefinitions().then(function (defs) {\r\n orderItemCFDefs = defs;\r\n });\r\n });\r\n\r\n _.extend(_this, {\r\n getCriteria: getCriteria,\r\n fixGridTextSearchConfig: fixGridTextSearchConfig\r\n });\r\n\r\n return _this;\r\n\r\n function getCriteria(searchText, exactMatch) {\r\n var aliasStack = [];\r\n var criteria = [];\r\n\r\n if (!searchText) {\r\n return $q.when(criteria);\r\n }\r\n\r\n return userSettings.getSettings().then(function(settings) {\r\n _.iterateTree(settings.gridSettings.textSearchFields, \"items\", function (el) {\r\n var pattern;\r\n\r\n if (el.alias) {\r\n aliasStack.push(el.alias);\r\n }\r\n\r\n if (el.checked && (!el.items || el.items.length <= 0)) {\r\n\r\n if (el.customFields) {\r\n pattern = exactMatch ? \"%s = '%s'\" : \"%s LIKE '%%%s%%'\";\r\n var cfDefs = [];\r\n var as = \"\";\r\n if (el.customFields == \"Order\") {\r\n cfDefs = ordersCFDefs;\r\n as = \"Order.\";\r\n } else if (el.customFields == \"OrderItem\") {\r\n cfDefs = orderItemCFDefs;\r\n as = \"OrderItem.\";\r\n }\r\n _.forEach(cfDefs, function (def) {\r\n if (def && def.code) {\r\n criteria.push(_.str.sprintf(pattern, as + def.code, searchText));\r\n }\r\n });\r\n return;\r\n }\r\n\r\n if (aliasStack.length > 0) {\r\n\r\n if (el.pattern && _.isString(el.pattern) && el.pattern.length > 2) {\r\n pattern = el.pattern;\r\n } else if (el.type == \"date\") {\r\n if (exactMatch) {\r\n pattern = \"%s LIKE '%%%s%%'\";\r\n }\r\n } else if (el.type == \"int\") {\r\n if (/^\\+?(0|[1-9]\\d*)$/.test(searchText)) {\r\n pattern = exactMatch ? \"%s = '%s'\" : \"%s LIKE '%%%s%%'\";\r\n }\r\n } else {\r\n pattern = exactMatch ? \"%s = '%s'\" : \"%s LIKE '%%%s%%'\";\r\n }\r\n\r\n if (pattern) {\r\n criteria.push(_.str.sprintf(pattern, aliasStack.join(\".\"), searchText));\r\n }\r\n }\r\n }\r\n },\r\n function (el) {\r\n if (el.alias) {\r\n aliasStack.pop();\r\n }\r\n }\r\n );\r\n return criteria;\r\n });\r\n }\r\n\r\n // preserve user old settings\r\n function fixGridTextSearchConfig() {\r\n userSettings.getSettings().then(function(settings) {\r\n if (!settings.gridSettings) {\r\n settings.gridSettings = {};\r\n }\r\n\r\n if (!settings.gridSettings.textSearchFields || _.isEqual({}, settings.gridSettings.textSearchFields)) {\r\n settings.gridSettings.textSearchFields = gridTextSearchConfigService.getDefaultConfig();\r\n }\r\n\r\n _.iterateTree(settings.gridSettings.textSearchFields,\r\n \"items\",\r\n function (el) {\r\n if (el.items && el.items.length <= 0) {\r\n delete el.items;\r\n }\r\n });\r\n\r\n userSettings.save();\r\n });\r\n }\r\n })\r\n\r\n .service('gridTextSearchConfigService', function () {\r\n\r\n var _this = this;\r\n\r\n _this.getDefaultConfig = function () {\r\n return [mapOrderItem()];\r\n };\r\n\r\n return _this;\r\n\r\n //region map methods\r\n\r\n function mapOrderItem() {\r\n return {\r\n text: 'Order Item',\r\n checked: true,\r\n expanded: true,\r\n items: [\r\n {\r\n text: 'Id',\r\n alias: 'OrderItem.Id',\r\n type: 'int',\r\n checked: true\r\n },\r\n {\r\n text: 'Data',\r\n alias: 'OrderItem.Data',\r\n checked: true\r\n },\r\n {\r\n text: 'Completed',\r\n alias: 'OrderItem.Completed',\r\n type: 'date',\r\n checked: true\r\n },\r\n {\r\n text: 'Expected by',\r\n alias: 'OrderItem.ExpectedBy',\r\n type: 'date',\r\n checked: true\r\n },\r\n {\r\n text: 'Required by',\r\n alias: 'OrderItem.RequiredBy',\r\n type: 'date',\r\n checked: true\r\n },\r\n {\r\n text: 'Summary',\r\n alias: 'OrderItem.Summary',\r\n checked: true\r\n },\r\n\r\n {\r\n text: 'Custom fields',\r\n customFields: 'OrderItem',\r\n checked: true\r\n },\r\n\r\n {\r\n text: 'Step',\r\n alias: 'Step.Code',\r\n checked: true\r\n },\r\n {\r\n text: 'Assigned Centre',\r\n checked: true,\r\n items: [\r\n {\r\n text: 'Code',\r\n alias: 'AssignedCentre.Code',\r\n checked: true\r\n },\r\n mapAddress('Address', 'AssignedCentreAddress')\r\n ]\r\n },\r\n {\r\n text: 'Created By',\r\n alias: 'CreatedBy',\r\n checked: true,\r\n items: [\r\n {\r\n text: 'Name',\r\n alias: 'Name',\r\n checked: true\r\n },\r\n {\r\n text: 'Last name',\r\n alias: 'LastName',\r\n checked: true\r\n },\r\n {\r\n text: 'First name',\r\n alias: 'FirstName',\r\n checked: true\r\n },\r\n {\r\n text: 'Title',\r\n alias: 'Title',\r\n checked: true\r\n },\r\n {\r\n text: 'Email',\r\n alias: 'Email',\r\n checked: true\r\n }\r\n ]\r\n },\r\n\r\n {\r\n text: 'Order',\r\n checked: true,\r\n items: [\r\n {\r\n text: 'Id',\r\n alias: 'Order.Id',\r\n type: 'int',\r\n checked: true\r\n },\r\n {\r\n text: 'Reference',\r\n alias: 'Order.Reference',\r\n checked: true\r\n },\r\n {\r\n text: 'Summary',\r\n alias: 'Order.Summary',\r\n checked: true\r\n },\r\n {\r\n text: 'Data',\r\n alias: 'Order.Data',\r\n checked: true\r\n },\r\n {\r\n text: 'Completed',\r\n alias: 'Order.Completed',\r\n type: 'date',\r\n checked: true\r\n },\r\n {\r\n text: 'Expected by',\r\n alias: 'Order.ExpectedBy',\r\n type: 'date',\r\n checked: true\r\n },\r\n {\r\n text: 'Required by',\r\n alias: 'Order.RequiredBy',\r\n type: 'date',\r\n checked: true\r\n },\r\n {\r\n text: 'Custom fields',\r\n customFields: 'Order',\r\n checked: true\r\n },\r\n {\r\n text: 'Centre',\r\n checked: true,\r\n items: [\r\n {\r\n text: 'Code',\r\n alias: 'Centre.Code',\r\n checked: true\r\n },\r\n mapAddress('Address', 'CentreAddress')\r\n ]\r\n },\r\n {\r\n text: 'Customer',\r\n items: [\r\n {\r\n text: 'Code',\r\n alias: 'Customer.Code',\r\n checked: true\r\n },\r\n mapAddress('Address', 'CustomerAddress')\r\n ]\r\n },\r\n mapAddress('Delivery address', 'DeliveryAddress')\r\n ]\r\n }\r\n\r\n ]\r\n };\r\n }\r\n\r\n function mapAddress(text, alias) {\r\n return {\r\n text: text,\r\n alias: alias,\r\n checked: true,\r\n items: [\r\n {\r\n text: 'Line 1',\r\n alias: 'Line1',\r\n checked: true\r\n },\r\n {\r\n text: 'Line 2',\r\n alias: 'Line2',\r\n checked: true\r\n },\r\n {\r\n text: 'City',\r\n alias: 'City',\r\n checked: true\r\n },\r\n {\r\n text: 'Company Name',\r\n alias: 'CompanyName',\r\n checked: true\r\n },\r\n {\r\n text: 'Contact last name',\r\n alias: 'ContactLastName',\r\n checked: true\r\n },\r\n {\r\n text: 'Contact first name',\r\n alias: 'ContactFirstName',\r\n checked: true\r\n },\r\n {\r\n text: 'Contact title',\r\n alias: 'ContactTitle',\r\n checked: true\r\n },\r\n {\r\n text: 'Country',\r\n alias: 'Country',\r\n checked: true\r\n },\r\n {\r\n text: 'Email',\r\n alias: 'Email',\r\n checked: true\r\n },\r\n {\r\n text: 'Postal code',\r\n alias: 'PostalCode',\r\n checked: true\r\n },\r\n {\r\n text: 'Region',\r\n alias: 'Region',\r\n checked: true\r\n },\r\n {\r\n text: 'Telephone',\r\n alias: 'Telephone',\r\n checked: true\r\n }\r\n ]\r\n };\r\n }\r\n\r\n //function mapCentre(text, alias) {\r\n // return {\r\n // text: text,\r\n // alias: alias,\r\n // items: [\r\n // {\r\n // text: 'Code',\r\n // alias: 'Code'\r\n // },\r\n // mapAddress('Address', 'Address')\r\n // ]\r\n // };\r\n //}\r\n //\r\n //function mapCustomer(text, alias) {\r\n // return {\r\n // text: text,\r\n // alias: alias,\r\n // items: [\r\n // {\r\n // text: 'Code',\r\n // alias: 'Code'\r\n // },\r\n // mapAddress('Address', 'Address'),\r\n // mapCentre('Centre', 'Centre')\r\n // ]\r\n // };\r\n //}\r\n //\r\n //function mapStep(text, alias) {\r\n // return {\r\n // text: text,\r\n // alias: alias,\r\n // items: [\r\n // {\r\n // text: 'Code',\r\n // alias: 'Code'\r\n // }\r\n // ]\r\n // };\r\n //}\r\n //\r\n //function mapOrder(text, alias) {\r\n // return {\r\n // text: text,\r\n // alias: alias,\r\n // items: [\r\n // {\r\n // text: 'Id',\r\n // alias: 'Id',\r\n // type: 'int'\r\n // },\r\n // {\r\n // text: 'Reference',\r\n // alias: 'Reference'\r\n // },\r\n // {\r\n // text: 'Summary',\r\n // alias: 'Summary'\r\n // },\r\n // {\r\n // text: 'Data',\r\n // alias: 'Data'\r\n // },\r\n // {\r\n // text: 'Completed',\r\n // alias: 'Completed',\r\n // type: 'date'\r\n // },\r\n // {\r\n // text: 'Expected by',\r\n // alias: 'ExpectedBy',\r\n // type: 'date'\r\n // },\r\n // {\r\n // text: 'Required by',\r\n // alias: 'RequiredBy',\r\n // type: 'date'\r\n // },\r\n // mapCentre('Centre', 'Centre'),\r\n // mapCustomer('Customer', 'Customer'),\r\n // mapAddress('Delivery address', 'DeliveryAddress'),\r\n // mapUser('Created by', 'CreatedBy')\r\n // ]\r\n // };\r\n //}\r\n //\r\n //function mapOrderItem(text, alias) {\r\n // return {\r\n // text: text,\r\n // expanded: true,\r\n // alias: alias,\r\n // items: [\r\n // {\r\n // text: 'Id',\r\n // alias: 'Id',\r\n // type: 'int'\r\n // },\r\n // {\r\n // text: 'Data',\r\n // alias: 'Data'\r\n // },\r\n // {\r\n // text: 'Completed',\r\n // alias: 'Completed',\r\n // type: 'date'\r\n // },\r\n // {\r\n // text: 'Expected by',\r\n // alias: 'ExpectedBy',\r\n // type: 'date'\r\n // },\r\n // {\r\n // text: 'Required by',\r\n // alias: 'RequiredBy',\r\n // type: 'date'\r\n // },\r\n // {\r\n // text: 'Summary',\r\n // alias: 'Summary'\r\n // },\r\n // mapOrder('Order', 'Order'),\r\n // mapStep('Step', 'Step'),\r\n // mapCentre('Assigned centre', 'AssignedCentre'),\r\n // mapUser('Created by', 'CreatedBy')\r\n // ]\r\n // };\r\n //}\r\n //\r\n //function mapUser(text, alias) {\r\n // return {\r\n // text: text,\r\n // alias: alias,\r\n // items: [\r\n // {\r\n // text: 'Name',\r\n // alias: 'Name'\r\n // },\r\n // {\r\n // text: 'Last name',\r\n // alias: 'LastName'\r\n // },\r\n // {\r\n // text: 'First name',\r\n // alias: 'FirstName'\r\n // },\r\n // {\r\n // text: 'Title',\r\n // alias: 'Title'\r\n // },\r\n // {\r\n // text: 'Email',\r\n // alias: 'Email'\r\n // }\r\n // ]\r\n // }\r\n //}\r\n\r\n //endregion\r\n })\r\n\r\n;\r\n","angular.module('env.data.services.signup', [])\r\n\r\n .run(function (signupService) {\r\n\r\n })\r\n\r\n .provider('signupService', function (EventingMixin) {\r\n var _this = this;\r\n\r\n this.$get = function ($log, $q, $timeout, $localStorage, $http) {\r\n\r\n /**\r\n * Get valid addresses suggestions based on the partially typed address\r\n * @param addressLine - Address line\r\n * @param city - city\r\n * @param state - State\r\n * @returns {HttpPromise} Future object\r\n */\r\n _this.getSuggestedAddresses = function (address, city, state) {\r\n\r\n //Form line from the address parts according to Australian rules and ask for the suggestions for that address\r\n //OrderManager uses appropriate branded version of the address validation API for the Footlink to validate Australian addresses\r\n address = address != null ? address.trim() : '';\r\n city = city != null ? city.trim() : '';\r\n state = state != null ? state.trim() : '';\r\n\r\n var addressLine = address + (city.length > 0 ? \", \" + city : \"\");\r\n\r\n return $http\r\n .get(om.config.build.baseUrl + \"/footlink/address-validation/suggested?query=\" + addressLine + (state.length > 0 ? \"&stateTerritory=\" + state : \"\"))\r\n .then(\r\n function (resp) {\r\n return resp.data ? resp.data : [];\r\n },\r\n function (error) {\r\n $log.error('Can not request email confirmation code. Error: ' + error);\r\n return $q.reject(error);\r\n });\r\n };\r\n\r\n /**\r\n * Requests confirmation code to be sent to the supplied user contacts\r\n * @param email - User email to request confirmation code for. The generated code will be sent to this email.\r\n * @param firstName - User's first name to use in email\r\n * @param lastName - User's last name to use in email\r\n * @returns {HttpPromise} Future object\r\n */\r\n _this.requestEmailConfirmationCode = function (email, firstName, lastName) {\r\n\r\n var model = { email: email, firstName: firstName, lastName: lastName };\r\n\r\n\r\n return $http\r\n .post(om.config.build.baseUrl + \"/signup/request-code\", model)\r\n .then(\r\n function (resp) {\r\n return resp.data ? resp.data : [];\r\n },\r\n function (error) {\r\n $log.error('Can not request email confirmation code. Error: ' + error);\r\n return $q.reject(error);\r\n });\r\n };\r\n\r\n /**\r\n * Validate user field/value to see if we can create such a user\r\n * @param fieldToCheck - User object field name to validate.\r\n * @param valueToCheck - User object value to validate.\r\n * @returns {HttpPromise} Future object\r\n */\r\n _this.validateUserFieldValue = function (valueToCheck, fieldToCheck) {\r\n\r\n var model = { valueToCheck: valueToCheck, fieldToCheck: fieldToCheck };\r\n\r\n return $http\r\n .post(om.config.build.baseUrl + \"/signup/validate-user\", model)\r\n .then(\r\n function (resp) {\r\n return resp.status === 200;\r\n },\r\n function (error) {\r\n $log.error('Error during user field/value validation.');\r\n return false;\r\n });\r\n };\r\n\r\n /**\r\n * Validate customer field/value to see if we can create such a customer\r\n * @param fieldToCheck - User object field name to validate.\r\n * @param valueToCheck - User object value to validate.\r\n * @returns {HttpPromise} Future object\r\n */\r\n _this.validateCustomerFieldValue = function (valueToCheck, fieldToCheck) {\r\n\r\n var model = { valueToCheck: valueToCheck, fieldToCheck: fieldToCheck };\r\n \r\n return $http\r\n .post(om.config.build.baseUrl + \"/signup/validate-customer\", model)\r\n .then(\r\n function (resp) {\r\n return resp.status === 200;\r\n },\r\n function (error) {\r\n $log.error('Error during customer field/value validation.');\r\n return false;\r\n });\r\n };\r\n\r\n /**\r\n * Submits registration information about the user, its standard fields and custom fields to the server\r\n * @param contactConfirmationCode - Confirmation code from the email that we sent to user to confirm his contact\r\n * @param customerCode - Code to assign as Customer.Code\r\n * @param userDto - User entity DTO.\r\n * @param addressDto - Address entity DTO.\r\n * @param userCustomFields - Array of the User entity custom field objects containing type information {type: '', fieldCode: '', value: ''}\r\n * @param customerCustomFields - Array of the Customer entity custom field objects containing type information {type: '', fieldCode: '', value: ''}\r\n *\r\n * @returns {HttpPromise} Future object\r\n */\r\n _this.submitUserRegistrationInfo = function (contactConfirmationCode, customerCode, userDto, addressDto, userCustomFields, customerCustomFields) {\r\n\r\n var model = {\r\n contactConfirmationCode: contactConfirmationCode, \r\n customerCode: customerCode, \r\n user: userDto,\r\n address: addressDto,\r\n userCustomFields: userCustomFields,\r\n customerCustomFields: customerCustomFields\r\n };\r\n\r\n return $http\r\n .post(om.config.build.baseUrl + \"/signup/create-user\", model)\r\n .then(\r\n function (resp) {\r\n return resp.data ? resp.data : [];\r\n },\r\n function (error) {\r\n $log.error('User registration submission failed. Error: ' + error);\r\n return $q.reject(error);\r\n });\r\n };\r\n\r\n /**\r\n * Requests support requests for a user passing to the server Customer code, phone and email.\r\n * May be used in various scenarios, like existing user alert or anything else.\r\n * @param email - User email to request support for.\r\n * @param customerCode - User's Customer entity Code to request support for.\r\n * @param phone - User's phone to request support for\r\n * @returns {HttpPromise} Future object\r\n */\r\n _this.submitSupportRequest = function (customerCode, email, phone) {\r\n\r\n var model = { customerCode: customerCode, email: email, phone: phone };\r\n\r\n\r\n return $http\r\n .post(om.config.build.baseUrl + \"/signup/support-request\", model)\r\n .then(\r\n function (resp) {\r\n return resp.data ? resp.data : [];\r\n },\r\n function (error) {\r\n $log.error('Can not submit support request. Error: ' + error);\r\n return $q.reject(error);\r\n });\r\n };\r\n\r\n return _this;\r\n };\r\n\r\n\r\n })\r\n\r\n;\r\n","angular.module('env.data.services',\r\n [\r\n 'env.data.services.auth',\r\n 'env.data.services.permissions',\r\n 'env.data.services.ping',\r\n 'env.data.services.omqlAliasBuilder',\r\n 'env.data.services.gridDataProvider',\r\n 'env.data.services.loginShadowService',\r\n 'env.data.services.gridTextSearch',\r\n 'env.data.services.calendar',\r\n 'env.data.services.geocoding',\r\n 'env.data.services.intune',\r\n 'env.data.services.signup',\r\n 'env.data.services.cookies',\r\n 'env.data.services.serverInfo'\r\n ])\r\n;\r\n","angular.module('env.data.services.serverInfo', [])\r\n\r\n .service('serverInfoService', function ($rootScope, $log, $q, $http, authService, appReloadService) {\r\n var _this = this;\r\n \r\n /**\r\n * Gets server version\r\n * @returns {Promise}\r\n */\r\n _this.getVersion = function () {\r\n var token = authService.getToken();\r\n if (!token) {\r\n $log.error('Can not fetch server info when not authorized.');\r\n return '';\r\n }\r\n var config = { headers: { Authorization: token } };\r\n\r\n return $http\r\n .get(om.config.build.baseUrl + \"/info/version\", config)\r\n .then(\r\n function (resp) {\r\n return resp.data ? resp.data : '';\r\n },\r\n function (error) {\r\n $log.error('Can not fetch server info. Error: ' + error);\r\n return $q.reject(error);\r\n });\r\n };\r\n\r\n _this.checkServerVersionAndAskReloadIfNeeded = function () {\r\n return _this.getVersion()\r\n .then(function (serverCurrentVersion) {\r\n if (!$rootScope.serverVersionNumber) {\r\n $rootScope.serverVersionNumber = serverCurrentVersion;\r\n }\r\n //We want to know the current server version to decide if we need to refresh our currently loaded SPA if the\r\n //current version is older. Once we reload the page - all the scripts and everything will be reloaded due to\r\n //version specific urls from the index page\r\n if ($rootScope.serverVersionNumber !== serverCurrentVersion) {\r\n\r\n $log.debug(\r\n \"Server new version %s deployment detected [Old version: %s]. Recommending user to reload the current tab.\",\r\n serverCurrentVersion,\r\n $rootScope.serverVersionNumber);\r\n\r\n //Trigger modal dialog to be shown asking for reload\r\n appReloadService.show();\r\n }\r\n });\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;\r\n","angular.module('env.data.services.ping', [])\r\n\r\n .service('pingService', function ($log, $q, $http, $interval, loadingShadowService) {\r\n var _this = this;\r\n var pingPromise;\r\n var reconnectPromise;\r\n\r\n /**\r\n * Ping server\r\n * @returns {Promise}\r\n */\r\n _this.ping = function () {\r\n if (pingPromise) {\r\n return pingPromise;\r\n }\r\n var deferred = $q.defer();\r\n $http.get(om.config.build.baseUrl + \"/ping\").then(\r\n function (resp) {\r\n pingPromise = null;\r\n if (resp && resp.status == 200) {\r\n deferred.resolve();\r\n } else {\r\n deferred.reject();\r\n }\r\n },\r\n function () {\r\n pingPromise = null;\r\n deferred.reject();\r\n }\r\n );\r\n\r\n pingPromise = deferred.promise;\r\n return pingPromise;\r\n };\r\n\r\n /**\r\n * Get the promise, that will be resolved only after successful ping.\r\n * Rejection of promise is not expected (only for unexpected $http errors)\r\n * @returns {Promise}\r\n */\r\n _this.whenConnected = function () {\r\n if (reconnectPromise) {\r\n return reconnectPromise;\r\n }\r\n\r\n var deferred = $q.defer();\r\n var pingCount = 0;\r\n\r\n var inAction = false;\r\n var interval = $interval(\r\n function () {\r\n if (inAction) {\r\n return;\r\n }\r\n inAction = true;\r\n pingCount++;\r\n try {\r\n _this.ping().then(\r\n function () {\r\n inAction = false;\r\n $interval.cancel(interval);\r\n reconnectPromise = null;\r\n deferred.resolve({pingCount: pingCount});\r\n },\r\n function () {\r\n inAction = false;\r\n }\r\n );\r\n } catch (e) {\r\n $log.error(\"Unexpected pingService error\", e);\r\n inAction = false;\r\n reconnectPromise = null;\r\n deferred.reject(\"Unexpected pingService error: \" + e.toString());\r\n $interval.cancel(interval);\r\n }\r\n }, 5000);\r\n\r\n reconnectPromise = deferred.promise;\r\n return reconnectPromise;\r\n };\r\n\r\n _this.blockTillConnected = function () {\r\n loadingShadowService.show();\r\n return _this.whenConnected().then(\r\n function(r) {\r\n loadingShadowService.hide();\r\n return r;\r\n },\r\n function(r) {\r\n loadingShadowService.hide();\r\n return $q.reject(r);\r\n }\r\n );\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;\r\n","angular.module('env.data.services.permissions', [])\r\n\r\n .service('permissions', function permissions($q, $log, usersRepository) {\r\n\r\n /**\r\n * Promise.\r\n * Checks if it is allowed or not for a user to 'see/move items to' particular Order step (state).\r\n * @param stepId - ID of the step (state) to test for\r\n */\r\n this.isStepTransitionAllowed = function (stepId) {\r\n return usersRepository.getCurrentUser().then(\r\n function (restUser) {\r\n return _.any(restUser.$model.permissions, function (p) {\r\n return p.operation == '/Workflow' ||\r\n p.operation == _.str.sprintf('/Workflow/Step:%s', stepId) ||\r\n _.str.startsWith(p.operation, _.str.sprintf('/Workflow/Step:%s/Action', stepId));\r\n });\r\n },\r\n function (error) {\r\n $log.warn(_.string.sprintf(\"Exception during checking if user allowed to 'see/move order to' step. Error: %s\", error));\r\n return $q.reject(error);\r\n });\r\n };\r\n\r\n this.isActionAllowed = function (stepId, actionId) {\r\n return usersRepository.getCurrentUser().then(\r\n function (restUser) {\r\n return _.any(restUser.$model.permissions, function (p) {\r\n return p.operation == '/Workflow' ||\r\n p.operation == _.str.sprintf('/Workflow/Step:%s', stepId) ||\r\n p.operation == _.str.sprintf('/Workflow/Step:%s/Action:%s', stepId, actionId);\r\n });\r\n },\r\n function (error) {\r\n $log.warn(_.string.sprintf(\"Exception during checking if user allowed to 'see/move order to' step. Error: %s\", error));\r\n return false;\r\n });\r\n };\r\n return this;\r\n }\r\n );","angular.module('env.data.services.omqlAliasBuilder', [])\r\n\r\n //\"restModelField\": \"omqlAlias\"\r\n .constant('OMQL_ORDER_ITEM_ALIASES', {\r\n \"step\": \"Step\",\r\n \"stepCode\": \"Step.Code\",\r\n \"createdBy\": \"CreatedBy.Name\",\r\n \"assignedCentre\": \"AssignedCentre\",\r\n \"assignedCentre.address\": \"AssignedCentreAddress\",\r\n \"order\": \"Order\",\r\n \"customer\": \"Customer\",\r\n \"centre\": \"Centre\",\r\n \"order.customer\": \"Customer\",\r\n \"order.centre\": \"Centre\",\r\n \"centre.address\": \"CentreAddress\",\r\n \"customer.address\": \"CustomerAddress\",\r\n \"deliveryAddress\": \"DeliveryAddress\"\r\n })\r\n\r\n .constant('OMQL_ORDER_ALIASES', {\r\n \"createdBy\": \"CreatedBy.Name\",\r\n \"customer\": \"Customer\",\r\n \"centre\": \"Centre\",\r\n \"centre.address\": \"CentreAddress\",\r\n \"customer.address\": \"CustomerAddress\",\r\n \"deliveryAddress\": \"DeliveryAddress\"\r\n })\r\n\r\n .service('omqlAliasBuilder', function (OMQL_ORDER_ITEM_ALIASES, OMQL_ORDER_ALIASES, gettextCatalog) {\r\n var _this = this;\r\n\r\n _.extend(_this, {\r\n mapFieldToOrderItemAlias: mapFieldToOrderItemAlias,\r\n mapFieldToOrderAlias: mapFieldToOrderAlias,\r\n buildOperatorQuery: buildOperatorQuery\r\n });\r\n\r\n return _this;\r\n\r\n //1. Replace '$model.customFields.' with ''\r\n //2. Replace '$model.' with ''\r\n //3. Replace substring from 0 to last . with corresponding token from aliases dictionary, if found.\r\n //4. Make every letter after . to be capital\r\n function mapFieldInternal(restModelField, defaultPrefix, aliasDictionary) {\r\n var keyToFind = restModelField.replaceAll(\"$model.customFields.\", \"\").replaceAll(\"$model.\", \"\");\r\n if (_.string.contains(keyToFind, \".\")) {\r\n keyToFind = aliasDictionary[_.str.strLeftBack(keyToFind, \".\")] + \".\";\r\n } else if (aliasDictionary[keyToFind]) {\r\n keyToFind = aliasDictionary[keyToFind];\r\n if (_.string.contains(keyToFind, \".\")) {\r\n return keyToFind;\r\n }\r\n } else {\r\n keyToFind = defaultPrefix + \".\";\r\n }\r\n var field = _.str(restModelField).strRightBack(\".\").capitalize().value();\r\n\r\n return keyToFind + field;\r\n }\r\n\r\n function mapFieldToOrderItemAlias(restModelField) {\r\n return mapFieldInternal(restModelField, \"OrderItem\", OMQL_ORDER_ITEM_ALIASES);\r\n }\r\n\r\n function mapFieldToOrderAlias(restModelField) {\r\n return mapFieldInternal(restModelField, \"Order\", OMQL_ORDER_ALIASES);\r\n }\r\n\r\n function buildOperatorQuery(operator, field, value) {\r\n var queryString = \"\";\r\n\r\n var omqlDateString = function (date) {\r\n if (!date || !angular.isDate(date) && date.toString() == \"Invalid Date\") {\r\n return \"#001-01-01T00:00:00.000Z#\"; //omql date min value\r\n }\r\n return \"#\" + date.toISOString() + \"#\";\r\n };\r\n var buildQueryForStringValue = function () {\r\n switch (operator) {\r\n case \"eq\":\r\n queryString += _.str.sprintf(\"%s = '%s'\", field, value);\r\n break;\r\n case \"neq\":\r\n queryString += _.str.sprintf(\"%s <> '%s'\", field, value);\r\n break;\r\n case \"contains\":\r\n queryString += _.str.sprintf(\"%s LIKE '%%%s%%'\", field, value);\r\n break;\r\n case \"doesnotcontain\":\r\n queryString += _.str.sprintf(\"%s NOT LIKE '%%%s%%'\", field, value);\r\n break;\r\n case \"startswith\":\r\n queryString += _.str.sprintf(\"%s LIKE '%s%%'\", field, value);\r\n break;\r\n case \"endswith\":\r\n queryString += _.str.sprintf(\"%s LIKE '%%%s'\", field, value);\r\n break;\r\n default:\r\n throw \"Invalid operator for string value!\";\r\n }\r\n }\r\n var buildQueryForDateValue = function () {\r\n var dtStart = new Date(value.valueOf());\r\n var dtEnd = new Date(value.valueOf());\r\n dtStart.setHours(0);\r\n dtStart.setMinutes(0);\r\n dtStart.setSeconds(0);\r\n dtStart.setMilliseconds(0);\r\n dtEnd.setHours(23);\r\n dtEnd.setMinutes(59);\r\n dtEnd.setSeconds(59);\r\n dtEnd.setMilliseconds(999);\r\n var omqlStart = omqlDateString(dtStart);\r\n var omqlEnd = omqlDateString(dtEnd);\r\n\r\n switch (operator) {\r\n case \"eq\":\r\n queryString += _.str.sprintf(\"%s >= %s AND %s <= %s\", field, omqlStart, field, omqlEnd);\r\n break;\r\n case \"neq\":\r\n queryString += _.str.sprintf(\"%s <= %s AND %s >= %s\", field, omqlStart, field, omqlEnd);\r\n break;\r\n\r\n case \"gt\":\r\n queryString += _.str.sprintf(\"%s > %s\", field, omqlEnd);\r\n break;\r\n case \"gte\":\r\n queryString += _.str.sprintf(\"%s >= %s\", field, omqlStart);\r\n break;\r\n case \"lt\":\r\n queryString += _.str.sprintf(\"%s < %s\", field, omqlStart);\r\n break;\r\n case \"lte\":\r\n queryString += _.str.sprintf(\"%s <= %s\", field, omqlEnd);\r\n break;\r\n default:\r\n throw \"Invalid operator for datetime value!\";\r\n }\r\n }\r\n var buildQueryForNumberValue = function () {\r\n switch (operator) {\r\n case \"eq\":\r\n queryString += _.str.sprintf(\"%s = %s\", field, value);\r\n break;\r\n case \"neq\":\r\n queryString += _.str.sprintf(\"%s <> %s\", field, value);\r\n break;\r\n case \"gt\":\r\n queryString += _.str.sprintf(\"%s > %s\", field, value);\r\n break;\r\n case \"gte\":\r\n queryString += _.str.sprintf(\"%s >= %s\", field, value);\r\n break;\r\n case \"lt\":\r\n queryString += _.str.sprintf(\"%s < %s\", field, value);\r\n break;\r\n case \"lte\":\r\n queryString += _.str.sprintf(\"%s <= %s\", field, value);\r\n break;\r\n default:\r\n throw \"Invalid operator for number value!\";\r\n }\r\n }\r\n var buildQueryForBooleanValue = function () {\r\n queryString += _.str.sprintf(\"%s = %s\", field, value);\r\n }\r\n\r\n if (_.isDate(value)) {\r\n buildQueryForDateValue();\r\n } else if (_.isNumber(value)) {\r\n buildQueryForNumberValue();\r\n } else if (_.isBoolean(value)) {\r\n buildQueryForBooleanValue();\r\n } else {\r\n buildQueryForStringValue();\r\n }\r\n\r\n return queryString;\r\n }\r\n }\r\n );\r\n","angular.module('env.data.services.loginShadowService', [])\r\n\r\n .run(function (authService, loginShadowService, gettextCatalog, toastr) {\r\n authService.events.on('sessionExpired', function () {\r\n loginShadowService.show();\r\n toastr.warning(gettextCatalog.getString('Your session expired. Please, log in.'), gettextCatalog.getString('Session expired'));\r\n });\r\n })\r\n\r\n .service(\"loginShadowService\", function ($compile, $rootScope, $q) {\r\n var _this = this;\r\n var scope;\r\n var el;\r\n var deferred;\r\n\r\n _this.show = function () {\r\n if (deferred) {\r\n return deferred;\r\n }\r\n deferred = $q.defer();\r\n scope = $rootScope.$new(true);\r\n el = $compile(\"\")(scope);\r\n angular.element(\"body\").append(el);\r\n return deferred;\r\n };\r\n\r\n _this.close = function () {\r\n if (scope) {\r\n scope.$destroy();\r\n el.remove();\r\n scope = null;\r\n el = null;\r\n }\r\n if (deferred) {\r\n deferred.resolve();\r\n deferred = null;\r\n }\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;","angular.module('env.data.services.intune', [])\r\n\r\n .run(function (intuneService) {\r\n\r\n })\r\n\r\n .provider('intuneService', function (EventingMixin) {\r\n var _this = this;\r\n\r\n this.$get = function ($log, $q, $timeout, $localStorage, $http, authService) {\r\n\r\n /**\r\n * Gets list of managed devices that are currently registered in the Intune for the corresponding OM instance\r\n * @returns {Promise} Future object\r\n */\r\n _this.getManagedDevices = function () {\r\n var token = authService.getToken();\r\n if (!token) {\r\n $log.error('Can not fetch managed devices info from OM Intune api. Error: Not authorized.');\r\n return [];\r\n }\r\n var config = {headers: {Authorization: token}};\r\n\r\n return $http\r\n .get(om.config.build.baseUrl + \"/intune/managed-devices\", config)\r\n .then(\r\n function (resp) {\r\n return resp.data ? resp.data : [];\r\n },\r\n function (error) {\r\n $log.error('Can not fetch managed devices info from OM Intune api. Error: ' + error);\r\n return $q.reject(error);\r\n });\r\n };\r\n\r\n return _this;\r\n };\r\n\r\n\r\n });\r\n","angular.module('env.data.services.gridDataProvider', [])\r\n\r\n .service('gridDataProvider', function ($log, $customisationConfig, orderItemsRepository, usersRepository,\r\n customResourceResolver, omqlAliasBuilder, gridTextSearchService,\r\n orderItemsGridSharedSettings, toastr, gettextCatalog, $q) {\r\n var _this = this;\r\n\r\n _.extend(_this, {\r\n getGridConfig: getGridConfig,\r\n getData: getData,\r\n getReportQuery: getReportQuery\r\n });\r\n\r\n return _this;\r\n\r\n /**\r\n * Get Grid configuration according to the current user and step.\r\n * @param {string} forStep step code of current step\r\n * @returns {Promise} promise of grid configuration\r\n */\r\n function getGridConfig(forStep) {\r\n return customResourceResolver.resolveConfig(\"grid-config\", null, {step: forStep});\r\n }\r\n\r\n /**\r\n * Get data for grid according to grid filtering/sorting and additional filters\r\n * @returns {Promise<{items:RepresentationModel[], pageNumber: number, rowsPerPage: number, totalCount: number, totalPageCount: number}>} promise of search results object\r\n */\r\n function getData() {\r\n return $q.all([\r\n buildWhereString(), //Builds where string according to the search term entered by user in 'search box' on the grid toolbar\r\n buildSortString() //Builds sort string according to the sorting applied over grid's columns headers\r\n ])\r\n .then(function (data) {\r\n var whereString = data[0];\r\n var sortString = data[1];\r\n\r\n var forStep = orderItemsGridSharedSettings.getStepFilter() || \"all-open\";\r\n var pageIndex = (orderItemsGridSharedSettings.getPageNumber() || 1) - 1; // OMQL use zero-based page number\r\n var pageSize = orderItemsGridSharedSettings.getPageSize();\r\n if (!angular.isDefined(pageSize) || pageSize === null) {\r\n pageSize = 10; //set default page size\r\n }\r\n\r\n if (orderItemsGridSharedSettings.getForceIgnorePageSize()) {\r\n //If we were asked to ignore page size (i.e. to load all items to select particular item to view)\r\n pageSize = 0;\r\n }\r\n\r\n if (orderItemsGridSharedSettings.getIsExclusiveSelection()) {\r\n //If we were asked to load the order item exclusively (i.e.: a direct link to the order item)\r\n //so we don't want to load all of them\r\n whereString = 'OrderItem.Id = ' + orderItemsGridSharedSettings.getSelectedOrderItemId();\r\n }\r\n\r\n\r\n $log.debug(\"Search query for step '%s':\", forStep);\r\n $log.debug(whereString);\r\n $log.debug(sortString);\r\n\r\n return orderItemsRepository.search({\r\n where: whereString,\r\n orderBy: sortString,\r\n pageNumber: pageIndex,\r\n rowsPerPage: pageSize\r\n });\r\n })\r\n\r\n .then(function (resp) {\r\n // fix for page number and selection\r\n resp.pageNumber = (resp.pageNumber || 0) + 1; // OMQL use zero-based page number\r\n if (resp.totalCount <= 0 || resp.totalPageCount === 0) {\r\n resp.pageNumber = 1;\r\n } else if (resp.pageNumber > resp.totalPageCount) {\r\n orderItemsGridSharedSettings.setPageNumber(resp.totalPageCount);\r\n\r\n //Re-set the page size only if we are not in 'page size ignore force mode'\r\n if (!orderItemsGridSharedSettings.getForceIgnorePageSize()) {\r\n orderItemsGridSharedSettings.setPageSize(angular.isDefined(resp.rowsPerPage) ? resp.rowsPerPage : 10);\r\n }\r\n $log.debug(\"Making additional search request to fix page information...\");\r\n return getData();\r\n }\r\n\r\n orderItemsGridSharedSettings.setPageNumber(resp.pageNumber);\r\n\r\n if (!orderItemsGridSharedSettings.getForceIgnorePageSize()) {\r\n //Remember the page size only if we were not in 'forced' mode\r\n orderItemsGridSharedSettings.setPageSize(resp.rowsPerPage);\r\n }\r\n\r\n return resp;\r\n });\r\n }\r\n\r\n /**\r\n * Get query for report generators representing the current context shown by the gridDataProvider\r\n * @returns {Promise<{query: string, orderBy: string}>} report query object\r\n */\r\n function getReportQuery() {\r\n return $q.all([\r\n buildWhereString(), //Builds where string according to the search term entered by user in 'search box' on the grid toolbar\r\n buildSortString() //Builds sort string according to the sorting applied over grid's columns headers\r\n ])\r\n .then(function (data) {\r\n var whereString = data[0];\r\n var sortString = data[1];\r\n return {\r\n query: whereString,\r\n orderBy: sortString\r\n };\r\n });\r\n }\r\n\r\n /**\r\n * @return {Promise}\r\n */\r\n function buildWhereString() {\r\n //Either use the custom OMQL configured in the customisation config for the custom filter (if specified)\r\n //Or just build the OMQL 'where' string based on the 'step' name filter and any text search applied\r\n\r\n return $q.all([\r\n // See if we have any 'ignored' steps in workflow config meaning we don't want to get items for those steps\r\n buildStepsFilterForIgnoredSteps(),\r\n // See if we have dates supplied meaning we're about to show completed items for particular period\r\n buildDatesFilterIfAny(),\r\n // Text search for customisable number of fields\r\n buildTextSearchFilterIfAny(),\r\n //Builds filter string according to the filter chosen in the grid's columns filter\r\n buildFilterStringIfAny()\r\n ])\r\n .then(function (data) {\r\n var stepsFilter = data[0];\r\n var datesFilter = data[1];\r\n var textSearchFilter = data[2];\r\n var fieldsFilter = data[3];\r\n\r\n //The final 'where' string\r\n var forStep = orderItemsGridSharedSettings.getStepFilter() || \"all-open\";\r\n var customFilter = orderItemsGridSharedSettings.getCustomFilter();\r\n\r\n var whereString;\r\n\r\n //TODO: We might want to further refactor the approach to use special term to distinguish the mode 'existing step' or virtual view\r\n //where 'all-open' is a virtual view just like any other specified for the brand custom config\r\n if (forStep === 'all-open') {\r\n if (!customFilter) {\r\n //we're querying over orderItems ignoring specified as 'ignore=true' in config steps plus adding dates filter if specified so\r\n //(however, we ignore stepFilter if datesFilter was specified to filter by completion date )\r\n //plus to be safe and not have empty 'where' clause in case we don't have ignored steps and dates filter,\r\n //we specify that we want only not deleted items\r\n whereString = 'OrderItem.Deleted = false' + (stepsFilter.length > 0 && (!datesFilter || datesFilter.length === 0)\r\n ? ' AND ' + stepsFilter : '') + (datesFilter.length > 0 ? ' AND ' + datesFilter : '');\r\n } else {\r\n //Use the custom OMQL query from custom filter defined in the customisation config to be applied to the view.\r\n //This query specified amongst one or more custom filters and particular query to use specified via $stateParams\r\n //by putting it's id/name in the URI used to navigate to the OrderItemsGridView\r\n whereString = customFilter.queryForStatInfo;\r\n }\r\n\r\n //Then add the fields filters based on the 'kendo grid filters' applied by a user on columns in the Grid UI \r\n //and also any 'text search term' filter applied via the search textbox\r\n whereString += \r\n (fieldsFilter.length > 0 ? ' AND ' + fieldsFilter : '') +\r\n (textSearchFilter.length > 0 ? ' AND ' + textSearchFilter : '');\r\n } else {\r\n //we're querying over orderItems at particular step.\r\n //we want to show non deleted and non completed items at that step\r\n //datesFilter string will contain the filter for dates fields to include non completed only\r\n whereString =\r\n 'OrderItem.Deleted = false' +\r\n (forStep ? _.string.sprintf(\" AND Step.Code = '%s'\", forStep) : '') +\r\n (datesFilter.length > 0 ? ' AND ' + datesFilter : '') +\r\n (fieldsFilter.length > 0 ? ' AND ' + fieldsFilter : '') +\r\n (textSearchFilter.length > 0 ? ' AND ' + textSearchFilter : '');\r\n }\r\n\r\n return whereString;\r\n });\r\n }\r\n\r\n /**\r\n * @return {Promise}\r\n */\r\n function buildFilterStringIfAny() {\r\n var filterByFields = orderItemsGridSharedSettings.getGridFilter();\r\n if (!filterByFields) {\r\n filterByFields = {filters: [], logic: \"and\"};\r\n }\r\n\r\n var parseFilterDescriptor = function (fDescriptor) {\r\n var filterString = \"\";\r\n var logic = fDescriptor.logic;\r\n var filters = fDescriptor.filters;\r\n if (filters) {\r\n //Iterate over filters \r\n filterString += \" (\";\r\n for (var i = 0; i < filters.length; i++) {\r\n if (!filters[i]) continue;\r\n var filter = filters[i];\r\n if (filter.filters) {\r\n //parse filters collection recursively\r\n filterString += parseFilterDescriptor(filter);\r\n } else {\r\n //parse single filter descriptor for the field\r\n var omqlField = omqlAliasBuilder.mapFieldToOrderItemAlias(filter.field);\r\n if (_.string.contains(omqlField, \"undefined.\")) {\r\n //Just warn user about what columns will be ignored in filtering\r\n toastr.warning(_.str.sprintf(\"The column '%s' does not support filtering\",\r\n _.str(filter.field).strRightBack(\".\").capitalize().value()), gettextCatalog.getString(\"Please try again\"));\r\n } else {\r\n if (i > 0) {\r\n filterString += _.str.sprintf(\" %s \", logic);\r\n }\r\n\r\n //Get omql query according to the specified logic operator (=, <, >, etc.), field name and value and its type\r\n filterString += omqlAliasBuilder.buildOperatorQuery(filter.operator, omqlField, filter.value);\r\n }\r\n }\r\n }\r\n filterString += \") \";\r\n }\r\n return filterString;\r\n };\r\n\r\n return getDefaultFiltersFromConfig()\r\n .then(function (defaultFilters) {\r\n //Add default filters from config to the filters selected by user in the UI\r\n filterByFields.filters = _.union(defaultFilters, filterByFields.filters);\r\n\r\n if (!filterByFields.filters || filterByFields.filters.length === 0) return \"\";\r\n\r\n return parseFilterDescriptor(filterByFields);\r\n });\r\n }\r\n\r\n function buildSortString() {\r\n var sortByFields = orderItemsGridSharedSettings.getGridSort();\r\n\r\n var sortString = \"\";\r\n //Apply default sorting by date of creation if no user-specific sorting applied\r\n if (!sortByFields || sortByFields.length === 0) return \"OrderItem.Created desc\";\r\n\r\n for (var i = 0; i < sortByFields.length; i++) {\r\n if (!sortByFields[i]) continue;\r\n var field = omqlAliasBuilder.mapFieldToOrderItemAlias(sortByFields[i].field);\r\n if (_.string.contains(field, \"undefined.\")) {\r\n //Just warn user about what columns will be ignored in sorting\r\n toastr.warning(\r\n _.str.sprintf(\"The column '%s' does not support sorting\", _.str(sortByFields[i].field).strRightBack(\".\").capitalize().value()),\r\n gettextCatalog.getString(\"Please try again\"));\r\n } else {\r\n var direction = sortByFields[i].dir;\r\n sortString += _.string.sprintf(\"%s %s, \", field, direction);\r\n }\r\n }\r\n\r\n return $q.when(_.string.rtrim(sortString, \", \"));\r\n }\r\n\r\n /**\r\n * @return {Promise}\r\n */\r\n function buildDatesFilterIfAny() {\r\n var completedFilter = orderItemsGridSharedSettings.getCompletedFilter();\r\n var createdFilter = orderItemsGridSharedSettings.getCreatedFilter();\r\n\r\n var filterString = '';\r\n\r\n if (createdFilter && createdFilter.enabled && createdFilter.from && createdFilter.to) {\r\n //We're showing completed orders/orderItems, so build the filter for dates when items were\r\n //marked as completed. And set 'from' to the beginning of the day and 'to' to the end of the day\r\n createdFilter.from.setHours(0, 0, 0, 0);\r\n createdFilter.to.setHours(23, 59, 59, 999);\r\n\r\n //we need timestamp without the milliseconds part, so omql api will understand it\r\n //OMQL DateTimeFormat = \"yyyy-MM-ddTHH:mm:ss\". i.e.: AND OrderItem.Completed = #0001-01-01T00:00:00#\r\n filterString = _.string.sprintf('OrderItem.Created >= #%s# AND OrderItem.Created <= #%s#', \r\n createdFilter.from.toISOString(), createdFilter.to.toISOString());\r\n\r\n }\r\n\r\n if (completedFilter && completedFilter.enabled && completedFilter.from && completedFilter.to) {\r\n //We're showing completed orders/orderItems, so build the filter for dates when items were\r\n //marked as completed. And set 'from' to the beginning of the day and 'to' to the end of the day\r\n completedFilter.from.setHours(0, 0, 0, 0);\r\n completedFilter.to.setHours(23, 59, 59, 999);\r\n \r\n //we need timestamp without the milliseconds part, so omql api will understand it\r\n //OMQL DateTimeFormat = \"yyyy-MM-ddTHH:mm:ss\". i.e.: AND OrderItem.Completed = #0001-01-01T00:00:00#\r\n\r\n if (filterString && filterString.length > 0) {\r\n filterString += ' AND ';\r\n }\r\n\r\n filterString += _.string.sprintf('OrderItem.Completed >= #%s# AND OrderItem.Completed <= #%s#',\r\n completedFilter.from.toISOString(), completedFilter.to.toISOString());\r\n\r\n }\r\n\r\n return $q.when(filterString);\r\n }\r\n\r\n /**\r\n * @return {Promise}\r\n */\r\n function buildTextSearchFilterIfAny() {\r\n var textFilter = orderItemsGridSharedSettings.getTextSearch();\r\n\r\n if (!textFilter || !textFilter.text || textFilter.text.length < 1) {\r\n return $q.when(\"\");\r\n }\r\n return gridTextSearchService.getCriteria(textFilter.text, !!textFilter.exact).then(function(criteria) {\r\n if (criteria.length > 0) {\r\n return \"(\" + criteria.join(\" OR \") + \")\";\r\n }\r\n return \"\";\r\n });\r\n }\r\n\r\n /**\r\n * @return {Promise}\r\n */\r\n function buildStepsFilterForIgnoredSteps() {\r\n return customResourceResolver.resolveWorkflow()\r\n .then(function (workflowConfig) {\r\n if (!workflowConfig) {\r\n return;\r\n }\r\n var stepsConfig = workflowConfig.steps;\r\n var ignoredSteps = _.where(stepsConfig, {ignore: true});\r\n\r\n return _\r\n .map(ignoredSteps, function (s) {\r\n return _.string.sprintf(\"Step.Code <> '%s'\", s.code);\r\n })\r\n .join(\" AND \");\r\n });\r\n }\r\n\r\n /**\r\n * @return {Promise}\r\n */\r\n function getDefaultFiltersFromConfig() {\r\n return customResourceResolver\r\n .resolveConfig(\"grid-config\", null, {step: orderItemsGridSharedSettings.getStepFilter() || \"all-open\"})\r\n .then(function (gridConfig) {\r\n return usersRepository.getCurrentUser()\r\n .then(function (currentUser) {\r\n var defaultFilters = gridConfig && gridConfig.defaultFilters\r\n ? gridConfig.defaultFilters\r\n : [];\r\n for (var i = 0; i < defaultFilters.length; i++) {\r\n var f = defaultFilters[i];\r\n if (f && f.value && f.value.indexOf('%me%') !== -1) {\r\n f.value = f.value.replace('%me%', currentUser.$model.name);\r\n }\r\n }\r\n return defaultFilters;\r\n });\r\n });\r\n }\r\n\r\n })\r\n\r\n;\r\n","angular.module('env.data.services.geocoding', [])\r\n\r\n .run(function (geocodingService) {\r\n\r\n })\r\n\r\n .provider('geocodingService', function (EventingMixin) {\r\n var _this = this;\r\n\r\n this.$get = function ($log, $q, $timeout, $localStorage, $http, authService) {\r\n\r\n /**\r\n * Performs forward geocoding request using OM Web API Geocoding module\r\n * @param address - Address to perform geocoding request for and get Longitude and Latitude values\r\n * @returns {HttpPromise} Future object\r\n */\r\n _this.getGeocodingForAddress = function (address) {\r\n var token = authService.getToken();\r\n if (!token) {\r\n $log.error('Can not perform geocoding api request. Error: Not authorized.');\r\n return [];\r\n }\r\n var config = { headers: { Authorization: token } };\r\n\r\n var data = { address: address };\r\n\r\n return $http\r\n .post(om.config.build.baseUrl + \"/geocoding/forward-geocode/\", data, config)\r\n .then(\r\n function (resp) {\r\n if (resp.data && resp.data.length > 0) {\r\n var place = null;\r\n\r\n //get the last one as the most general specified place (house, building)\r\n var lastIndexOfBld = _.findLastIndex(resp.data, function (place) { return place.class === 'building' || place.type === 'house'; });\r\n if (lastIndexOfBld !== -1) {\r\n place = resp.data[lastIndexOfBld];\r\n } else {\r\n place = _.last(resp.data);\r\n }\r\n\r\n return place;\r\n }\r\n\r\n return null;\r\n },\r\n function (error) {\r\n $log.error('Error during forward geocode request to geocoding api. Error: ' + error);\r\n return $q.reject(error);\r\n });\r\n };\r\n\r\n return _this;\r\n };\r\n\r\n\r\n })\r\n\r\n ;\r\n","angular.module('env.data.services.cookies', [])\r\n\r\n .service('cookiesService', function ($log, $q, $localStorage, authService, userSettings, gettextCatalog, toastr) {\r\n var _this = this;\r\n var FIRST_RUN_TOKEN = \"FirstRun\";\r\n \r\n /**\r\n * Ping server\r\n * @returns {Promise}\r\n */\r\n _this.showCookiesPolicyMessage = function () {\r\n userSettings.getSettings().then(function(settings) {\r\n //if we have our app configured to show cookie policy warning\r\n if (settings && settings.disableCookiePolicyWarning === true) {\r\n return;\r\n }\r\n\r\n if ($localStorage.getItem(FIRST_RUN_TOKEN) === null) {\r\n var cookiePolicyMessage = gettextCatalog.getString('AuthPopup.CookieStatement');\r\n toastr.warning(cookiePolicyMessage, gettextCatalog.getString('OrderManager Cookie Policy'), { timeOut: 0, extendedTimeOut: 0 });\r\n $localStorage.setItem(FIRST_RUN_TOKEN, authService.getUsername());\r\n }\r\n });\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;\r\n","angular.module('env.data.services.calendar', [])\r\n\r\n .run(function (calendarService) {\r\n\r\n })\r\n\r\n .provider('calendarService', function (EventingMixin) {\r\n var _this = this;\r\n\r\n this.$get = function ($log, $q, $timeout, $localStorage, $http, authService) {\r\n\r\n /**\r\n * Gets public holidays for the specified country and year\r\n * @param countryCode - Code of the Country to get holidays for\r\n * @param year - Year to get holidays for\r\n * @returns {HttpPromise} Future object\r\n */\r\n _this.getPublicHolidays = function (countryCode, year) {\r\n var token = authService.getToken();\r\n if (!token) {\r\n $log.error('Can not fetch public holidays info from calendar api. Error: Not authorized.');\r\n return [];\r\n }\r\n var config = { headers: { Authorization: token } };\r\n\r\n return $http\r\n .get(om.config.build.baseUrl + \"/calendar/public-holidays/\" + countryCode + \"/\" + year, config)\r\n .then(\r\n function (resp) {\r\n return resp.data ? resp.data : [];\r\n },\r\n function (error) {\r\n $log.error('Can not fetch public holidays info from calendar api. Error: ' + error);\r\n return $q.reject(error);\r\n });\r\n };\r\n\r\n /**\r\n * Gets custom holidays (if the custom holidays file configured on the server)\r\n * @returns {HttpPromise} Future object\r\n */\r\n _this.getCustomHolidays = function () {\r\n var token = authService.getToken();\r\n if (!token) {\r\n $log.error('Can not fetch custom holidays info from calendar api. Error: Not authorized.');\r\n return [];\r\n }\r\n var config = { headers: { Authorization: token } };\r\n\r\n return $http\r\n .get(om.config.build.baseUrl + \"/calendar/custom-holidays\", config)\r\n .then(\r\n function (resp) {\r\n return resp.data ? resp.data : [];\r\n },\r\n function (error) {\r\n $log.error('Can not fetch public holidays info from calendar api. Error: ' + error);\r\n return $q.reject(error);\r\n });\r\n };\r\n\r\n /**\r\n * Gets public holidays for the specified country, current and the next year\r\n * @param countryCode - Code of the Country to get holidays for\r\n * @returns {!Promise.>} Promise of dates array\r\n */\r\n _this.getActualPublicHolidays = function (countryCode) {\r\n var currentYear = new Date().getFullYear();\r\n\r\n return $q.all([_this.getPublicHolidays(countryCode, currentYear),\r\n _this.getPublicHolidays(countryCode, currentYear + 1)])\r\n .then(function (results) {\r\n return _.map(_.flatten(results), function (item) {\r\n return new Date(item.date);\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * Gets public PLUS custom holidays for the specified country, current and the next year\r\n * @param countryCode - Code of the Country to get holidays for\r\n * @returns {!Promise.>} Promise of dates array\r\n */\r\n _this.getActualPublicAndCustomHolidays = function (countryCode) {\r\n var currentYear = new Date().getFullYear();\r\n\r\n return $q.all([\r\n _this.getCustomHolidays(),\r\n _this.getPublicHolidays(countryCode, currentYear),\r\n _this.getPublicHolidays(countryCode, currentYear + 1)\r\n ])\r\n .then(function (results) {\r\n return _.map(_.flatten(results), function (item) {\r\n return new Date(item.date);\r\n });\r\n });\r\n };\r\n\r\n return _this;\r\n };\r\n\r\n\r\n })\r\n\r\n ;\r\n","angular.module('env.data.services.auth', [])\r\n\r\n .run(function (authService) {\r\n if (authService.isAuthorized()) {\r\n authService.isTokenValid().then( // after page refresh\r\n function () { // session is still valid\r\n authService.events.raise('continueSessionAfterReload');\r\n },\r\n function () { // session isn't valid anymore\r\n authService.clearAuthentication();\r\n authService.events.raise('authenticationRequiredAfterReload');\r\n });\r\n } else {\r\n authService.clearAuthentication();\r\n authService.events.raise('authenticationRequiredAfterReload');\r\n }\r\n })\r\n\r\n .provider('authService', function (EventingMixin) {\r\n var _this = this;\r\n\r\n _.extend(_this, new EventingMixin([\r\n 'login',\r\n 'loginFailed',\r\n 'logout',\r\n 'sessionExpired', // when session was expired\r\n 'continueSessionAfterReload', // when the page was reloaded, but session is still active (and valid)\r\n 'authenticationRequiredAfterReload' // when the page was reloaded, but old session is not active\r\n ]));\r\n\r\n var AUTH_TOKEN_STORAGE_NAME = \"AuthToken\";\r\n var USERNAME_STORAGE_NAME = \"UserName\";\r\n var FIRST_RUN_TOKEN = \"FirstRun\";\r\n\r\n this.$get = function ($log, $q, $timeout, $localStorage, $http, loginShadowService) {\r\n\r\n var _passwordValidationRegex;\r\n var _passwordValidationMessage;\r\n var _authToken;\r\n var _userName;\r\n var _lastUserName;\r\n var expirationTimeoutPromise;\r\n\r\n setToken($localStorage.getItem(AUTH_TOKEN_STORAGE_NAME));\r\n setUsername($localStorage.getItem(USERNAME_STORAGE_NAME));\r\n\r\n var _resetAuthInfo = function () {\r\n setToken(null);\r\n setUsername(null);\r\n if (expirationTimeoutPromise) {\r\n $timeout.cancel(expirationTimeoutPromise);\r\n expirationTimeoutPromise = null;\r\n }\r\n };\r\n\r\n /**\r\n * Set authorization token\r\n * @param token\r\n */\r\n function setToken(token) {\r\n _authToken = token ? _.clone(token) : null;\r\n if (_authToken) {\r\n $localStorage.setItem(AUTH_TOKEN_STORAGE_NAME, _authToken);\r\n $log.debug(\"Auth token is set to: \" + _authToken);\r\n } else {\r\n $localStorage.removeItem(AUTH_TOKEN_STORAGE_NAME);\r\n $log.debug(\"Auth token was dropped\");\r\n }\r\n return token;\r\n }\r\n\r\n /**\r\n * Get authorization token\r\n * @returns {string} token\r\n */\r\n _this.getToken = function () {\r\n return _.clone(_authToken);\r\n };\r\n\r\n /**\r\n * Get token info\r\n * @returns {Object} token info\r\n */\r\n _this.getTokenInfo = function () {\r\n if (_authToken) {\r\n try {\r\n var b64 = _authToken.split('.')[1];\r\n b64 = b64.replace(/-/g, '+');\r\n b64 = b64.replace(/_/g, '/');\r\n return JSON.parse(atob(b64));\r\n } catch (e) {\r\n\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n /**\r\n * Get current username\r\n * @returns {string} username of current user\r\n */\r\n _this.getUsername = function () {\r\n return _.clone(_userName);\r\n };\r\n\r\n /**\r\n * Get last used username. Used for re-login form.\r\n * @returns {string} username of user\r\n */\r\n _this.getLastUsername = function () {\r\n return _.clone(_lastUserName);\r\n };\r\n\r\n function setUsername(username) {\r\n _userName = username ? _.clone(username) : null;\r\n if (_userName) {\r\n _lastUserName = _.clone(_userName);\r\n $localStorage.setItem(USERNAME_STORAGE_NAME, _userName);\r\n } else {\r\n $localStorage.removeItem(USERNAME_STORAGE_NAME);\r\n }\r\n\r\n return username;\r\n }\r\n\r\n /**\r\n * Resets first run flag in case a different user is logging in\r\n * @param {} username\r\n * @returns {}\r\n */\r\n function resetFirstRun(username) {\r\n if ($localStorage.getItem(FIRST_RUN_TOKEN) && $localStorage.getItem(FIRST_RUN_TOKEN) !== username) {\r\n $localStorage.removeItem(FIRST_RUN_TOKEN, false);\r\n }\r\n }\r\n\r\n /**\r\n * Are we authorised\r\n */\r\n _this.isAuthorized = function () {\r\n return !!_authToken && new Date() < new Date(_this.getTokenInfo().exp);\r\n };\r\n\r\n /**\r\n * Check is token valid on the server. Request will be made only if token is active\r\n * @returns {Promise|HttpPromise} future object\r\n */\r\n _this.isTokenValid = function () {\r\n if (_authToken) {\r\n return $http.get(om.config.build.baseUrl + \"/users/current\", {});\r\n } else {\r\n return $q.reject(\"Not authorized. Auth token is undefined.\");\r\n }\r\n };\r\n\r\n /**\r\n * Authentication request\r\n * @param username - user name\r\n * @param pwd - user password(not a hash)\r\n * @returns {HttpPromise} Future object\r\n */\r\n _this.login = function (username, pwd) {\r\n var credentials = {\r\n UserName: username,\r\n Password: pwd\r\n };\r\n\r\n return $http\r\n .post(om.config.build.baseUrl + \"/auth/login\", credentials)\r\n .then(\r\n function (resp) {\r\n var t = resp.headers(\"Authorization\");\r\n _resetAuthInfo();\r\n if (!t) {\r\n _this.events.raise('loginFailed', {userName: username});\r\n return $q.reject(resp);\r\n }\r\n setToken(t);\r\n resetFirstRun(username);\r\n setUsername(username);\r\n\r\n expirationTimeoutPromise = $timeout(\r\n function () {\r\n _resetAuthInfo();\r\n _this.events.raise('sessionExpired', {userName: username});\r\n },\r\n new Date(_this.getTokenInfo().exp) - new Date() - 60000);\r\n\r\n _this.events.raise('login',\r\n {\r\n token: t,\r\n userName: username\r\n });\r\n $log.trace(\"Logged in as \" + username);\r\n return resp;\r\n },\r\n function (resp) {\r\n _resetAuthInfo();\r\n _this.events.raise('loginFailed', {userName: username});\r\n $log.trace(\"Login failed\");\r\n return $q.reject(resp);\r\n });\r\n };\r\n\r\n /**\r\n * Logout request. In any request result(resolve or reject), authorization token will be dropped.\r\n * @returns {HttpPromise} Future object\r\n */\r\n _this.logout = function () {\r\n function afterLogout() {\r\n _resetAuthInfo();\r\n _this.events.raise('logout');\r\n $log.trace(\"Logout!\");\r\n }\r\n\r\n return $http.post(om.config.build.baseUrl + \"/auth/logout\", {})\r\n .then(afterLogout, afterLogout);\r\n };\r\n\r\n /**\r\n * Clear all authentication and authorisation information (without posting 'logout' event)\r\n */\r\n _this.clearAuthentication = function () {\r\n _resetAuthInfo();\r\n };\r\n\r\n /**\r\n * Show reAuth window and wait till authorised\r\n */\r\n _this.reAuth = function () {\r\n var deferred = $q.defer();\r\n\r\n _resetAuthInfo();\r\n _this.events.on('login', function () {\r\n if (deferred) {\r\n deferred.resolve();\r\n }\r\n });\r\n\r\n return $q.all([\r\n loginShadowService.show(),\r\n deferred.promise\r\n ]);\r\n };\r\n\r\n /**\r\n * Gets regular expression used by server side to validate new passwords according\r\n * to the policy applied on the server.\r\n * @returns {Promise|HttpPromise} future object\r\n */\r\n _this.getPasswordValidationRegex = function () {\r\n\r\n var deferred = $q.defer();\r\n if (_passwordValidationRegex) {\r\n deferred.resolve(_passwordValidationRegex);\r\n } else {\r\n _passwordValidationRegex = /.*/g; //default regex to allow any password\r\n $http.get(om.config.build.baseUrl + \"/passwordvalidation/regex\", {})\r\n .then(function (resp) {\r\n try {\r\n _passwordValidationRegex = resp.data;\r\n deferred.resolve(_passwordValidationRegex);\r\n } catch (err) {\r\n deferred.reject(err);\r\n }\r\n }, function (err) {\r\n deferred.reject(err);\r\n });\r\n }\r\n\r\n return deferred.promise;\r\n };\r\n\r\n /**\r\n * Updates user's password with the new one.\r\n * @returns {Promise|HttpPromise} future object\r\n */\r\n _this.editPassword = function (oldPassword, newPassword) {\r\n\r\n return $http.post(om.config.build.baseUrl + '/users/changepassword', {\r\n 'oldPassword': oldPassword,\r\n 'newPassword': newPassword\r\n });\r\n };\r\n\r\n _this.requestPasswordReset = function (userNameOrEmail) {\r\n\r\n return $http\r\n .post(om.config.build.baseUrl + '/passwordreset/request', {'userNameOrEmail': userNameOrEmail})\r\n .then(\r\n function (resp) {\r\n $log.trace(\"Requested password reset for [\" + userNameOrEmail + \"]\");\r\n return resp;\r\n },\r\n function (resp) {\r\n $log.trace(\"Password reset request failed!\");\r\n return $q.reject(resp);\r\n });\r\n\r\n };\r\n\r\n _this.doPasswordReset = function (resetRequestKey, newPassword) {\r\n\r\n return $http\r\n .post(om.config.build.baseUrl + '/passwordreset/do', {\r\n 'resetRequestKey': resetRequestKey,\r\n 'newPassword': newPassword\r\n })\r\n .then(\r\n function (resp) {\r\n $log.trace(\"Password has been reset for reset-request-key [\" + resetRequestKey + \"]\");\r\n return resp;\r\n },\r\n function (resp) {\r\n $log.trace(\"Password reset failed for reset-request-key [\" + resetRequestKey + \"]!\");\r\n return $q.reject(resp);\r\n });\r\n\r\n };\r\n\r\n return _this;\r\n };\r\n\r\n\r\n })\r\n\r\n;\r\n","angular.module('env.data.rest', [\r\n\r\n 'env.data.rest.model',\r\n 'env.data.rest.modelPool',\r\n 'env.data.rest.restProvider',\r\n\r\n 'env.data.rest.signalR'\r\n\r\n]);","angular.module('env.data.repos.workflow', [])\r\n\r\n .service(\"workflowRepository\", function ($q, rest) {\r\n var _this = this;\r\n\r\n var stepType = \"StepModel\";\r\n var actionType = \"ActionModel\";\r\n\r\n //region Steps\r\n\r\n var stepsCache;\r\n /**\r\n * Get list of steps\r\n * @returns {!Promise.} promise of steps collection\r\n */\r\n _this.getSteps = function () {\r\n if (stepsCache) {\r\n return $q.when(stepsCache.slice(0));\r\n }\r\n\r\n return rest\r\n .map(\"workflow\", \"steps\")\r\n .willReturn(stepType)\r\n .get()\r\n .then(function (steps) {\r\n if (steps) {\r\n stepsCache = steps.slice(0);\r\n }\r\n return steps;\r\n });\r\n };\r\n\r\n /**\r\n * Get step by step code\r\n * @param {string} stepCode step code\r\n * @returns {!Promise.} promise of step model\r\n */\r\n _this.getStepByCode = function (stepCode) {\r\n if (stepsCache) {\r\n var step = _.find(stepsCache, function (step) {\r\n return step.$model.code == stepCode;\r\n });\r\n if (step) {\r\n return $q.when(step);\r\n }\r\n }\r\n\r\n return rest.map(\"workflow\", \"steps\").willReturn(stepType).get({params: {code: stepCode}});\r\n };\r\n\r\n /**\r\n * Get step by id\r\n * @param {string} id id of the step model\r\n * @returns {!Promise.} promise of step model\r\n */\r\n _this.getStepById = function (id) {\r\n if (stepsCache) {\r\n var step = _.find(stepsCache, function (step) {\r\n return step.getId() == id;\r\n });\r\n if (step) {\r\n return $q.when(step);\r\n }\r\n }\r\n\r\n return rest.map(\"workflow\", \"steps\").willReturn(stepType, id).get({params: {id: id}});\r\n };\r\n\r\n /**\r\n * Save step\r\n * @param {RepresentationModel} step Step Model\r\n * @returns {!Promise.} promise of Step Model save\r\n */\r\n _this.saveStep = function (step) {\r\n return rest.map(\"workflow\", \"steps\").save(step);\r\n };\r\n\r\n /**\r\n * Get step statistics\r\n * @returns {!Promise.} promise of step statistics\r\n */\r\n _this.getStepStatistics = function () {\r\n return rest.map(\"workflow\", \"steps\", \"statistics\").get();\r\n };\r\n\r\n //endregion\r\n\r\n //region Actions\r\n\r\n // Actions for steps cache\r\n var stepsToActions = {};\r\n /**\r\n * Get list of actions by step name\r\n * @param {string} stepCode step name\r\n * @returns {!Promise.} promise of actions collection\r\n */\r\n _this.getActionsForStep = function (stepCode) {\r\n if (stepsToActions[stepCode]) {\r\n return $q.when(stepsToActions[stepCode].slice(0));\r\n }\r\n\r\n return rest\r\n .map(\"workflow\", \"steps\", stepCode, \"actions\")\r\n .willReturn(actionType)\r\n .get()\r\n .then(function (actions) {\r\n stepsToActions[stepCode] = actions.slice(0);\r\n return actions;\r\n });\r\n };\r\n\r\n ///**\r\n // * Save action\r\n // * @param {string} stepCode\r\n // * @param {RepresentationModel} action Action Model or action id\r\n // * @returns {!Promise.} promise of Action Model save\r\n // */\r\n // NOTE: this route is closed on server cause this is a security issue\r\n //_this.saveAction = function (stepCode, action) {\r\n // return rest.map(\"workflow\", \"steps\", stepCode, \"actions\").save(action);\r\n //};\r\n\r\n //endregion\r\n\r\n /**\r\n * Execute action for single OrderItem\r\n * @param {string} stepCode step code\r\n * @param {string} actionCode action code\r\n * @param {string|number} orderItemId orderItem id\r\n * @returns {!Promise} promise of executing action result\r\n */\r\n _this.executeActionForOrderItem = function (stepCode, actionCode, orderItemId) {\r\n return rest\r\n .map(\"workflow\", \"steps\", stepCode, \"action\", actionCode)\r\n .post(orderItemId)\r\n .then(function () {\r\n // Order item is changed after step execution\r\n // We need to update it\r\n return rest\r\n .map(rest.getDefinition(\"OrderItemModel\"))\r\n .map(orderItemId)\r\n .willReturn(\"OrderItemModel\")\r\n .get();\r\n });\r\n };\r\n\r\n /**\r\n * Execute action for a list of OrderItems\r\n * @param {string} stepCode step code\r\n * @param {string} actionCode action code\r\n * @param {number[]} orderItemIds orderItems ids\r\n * @returns {!Promise} promise of executing action result\r\n */\r\n _this.executeActionForOrderItems = function (stepCode, actionCode, orderItemIds) {\r\n return rest\r\n .map(\"workflow\", \"steps\", stepCode, \"action\", actionCode)\r\n .post(orderItemIds)\r\n .then(function () {\r\n //do nothing on success\r\n });\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;\r\n","angular.module('env.data.repos.users', [])\r\n\r\n .service('usersRepository', function ($q, rest, authService) {\r\n var _this = this;\r\n var modelType = 'UserModel';\r\n var modelTypeLite = 'UserModelLite';\r\n var modelDefinition = rest.getDefinition(modelType);\r\n\r\n /**\r\n * Get users\r\n * @returns {!Promise.} Promise of collection of User Models\r\n */\r\n _this.getUsers = function () {\r\n return rest.map(modelDefinition).willReturn(modelType).get();\r\n };\r\n\r\n /**\r\n * Get user by id\r\n * @param {string} id id of the user\r\n * @returns {!Promise.} Promise of User Model\r\n */\r\n _this.getUser = function (id) {\r\n return rest.map(modelDefinition).map(id).willReturn(modelType, id).get();\r\n };\r\n\r\n /**\r\n * Save the user\r\n * @param {RepresentationModel} user Representation model of the user\r\n * @returns {!Promise.} Promise of saving success\r\n */\r\n _this.saveUser = function (user) {\r\n return rest.map(modelDefinition).save(user);\r\n };\r\n\r\n /**\r\n * Get UserGroups of the user\r\n * @param {string|RepresentationModel} user User Model or User Id\r\n * @returns {!Promise.} Promise collection of user groups(array of strings)\r\n */\r\n _this.getUsersGroups = function (user) {\r\n return rest.map(modelDefinition).map(user).map('groups').get();\r\n };\r\n\r\n /**\r\n * Get centres of the user\r\n * @param {string|RepresentationModel} user User Model or User Id\r\n * @returns {!Promise.} Promised collection of centres\r\n */\r\n _this.getUserCentres = function (user) {\r\n return rest.map(modelDefinition).map(user).map('centres').willReturn('CentreModel').get();\r\n };\r\n\r\n /**\r\n * Get customers of the user\r\n * @param {string|RepresentationModel} user User Model or User Id\r\n * @returns {!Promise.} Promised collection of customers\r\n */\r\n _this.getUserCustomers = function (user) {\r\n return rest.map(modelDefinition).map(user).map('customers').willReturn('CustomerModel').get();\r\n };\r\n\r\n /**\r\n * Get role of the user\r\n * @param {string|RepresentationModel} user User Model or User Id\r\n * @returns {!Promise.} Promised user role (string)\r\n */\r\n _this.getUserRole = function (user) {\r\n return rest.map(modelDefinition).map(user).map('role').get();\r\n };\r\n\r\n /**\r\n * Get permissions of the user\r\n * @param {string|RepresentationModel} user User Model or User Id\r\n * @returns {!Promise.} Promised collection of user permissions\r\n */\r\n _this.getUserPermissions = function (user) {\r\n return rest.map(modelDefinition).map(user).map('permissions').get();\r\n };\r\n\r\n //region Current user\r\n\r\n var currentUser;\r\n authService.events.on('login', function () {\r\n currentUser = null;\r\n });\r\n authService.events.on('loginFailed', function () {\r\n currentUser = null;\r\n });\r\n authService.events.on('logout', function () {\r\n currentUser = null;\r\n });\r\n\r\n /**\r\n * Get current user from the server\r\n * @param {boolean} [refresh] force reload current user\r\n * @returns {!Promise.} promise\r\n */\r\n _this.getCurrentUser = function (refresh) {\r\n if (currentUser) {\r\n if (_.isPromise(currentUser) || !refresh) {\r\n return $q.when(currentUser);\r\n }\r\n }\r\n if (!authService.getToken()) {\r\n return $q.reject(\"Not authorized. Auth token is undefined.\");\r\n }\r\n currentUser = rest.map(modelDefinition).map(\"current\").willReturn(modelType).get();\r\n currentUser.then(\r\n function (user) {\r\n currentUser = user;\r\n return currentUser;\r\n },\r\n function (resp) {\r\n currentUser = null;\r\n return $q.reject(resp);\r\n });\r\n return currentUser;\r\n };\r\n\r\n /**\r\n * Save the current user\r\n * @returns {!Promise.} promise\r\n */\r\n _this.saveCurrentUser = function () {\r\n if (currentUser && currentUser.isRepresentationModel == true) {\r\n var savePromise = rest.map(modelDefinition).save(currentUser);\r\n savePromise.then(function (user) {\r\n if (user && user.isRepresentationModel == true) {\r\n currentUser = user;\r\n }\r\n });\r\n return savePromise\r\n }\r\n throw new Error(\"Not authorised\");\r\n };\r\n\r\n //endregion\r\n\r\n //Ordering statistics\r\n\r\n /**\r\n * Get users statistics\r\n * @param {string} [whereOrderItems] 'Where' query to filter out the order items set for statistics. Optional.\r\n * @param {[]} [forUsers] Array of users Ids to get stats for.\r\n * @returns {!Promise.} promise of users statistics\r\n */\r\n _this.getUsersStatistics = function (whereOrderItems, forUsers) {\r\n if (whereOrderItems === null) {\r\n whereOrderItems = '';\r\n }\r\n if (forUsers == null) {\r\n forUsers = [];\r\n }\r\n\r\n return rest.map('users', 'statistics').post({where: whereOrderItems, users: forUsers});\r\n };\r\n\r\n //endregion\r\n\r\n //region Search\r\n\r\n var searchQueryCache = [];\r\n /**\r\n * Search users\r\n * @param {{where: string, orderBy: string, pageNumber: number, rowsPerPage: number}} query\r\n * @returns {!Promise} promise of search results\r\n */\r\n _this.search = function (query) {\r\n var executing = _.find(searchQueryCache, function (q) {\r\n return _.isEqual(q.query, query);\r\n });\r\n if (executing) {\r\n return executing.promise\r\n .then(function (resp) {\r\n return _.clone(resp); // clone to prevent modification of response content\r\n });\r\n }\r\n\r\n //Here we map returned data to the lightweight usermodel to avoid excessive data fetching from rest api\r\n //and just have direct properties of the user and its customfields\r\n var p = rest\r\n .map(modelDefinition)\r\n .map('search')\r\n .willReturn(modelTypeLite)\r\n .search(query)\r\n .then(function (resp) {\r\n searchQueryCache = _.reject(searchQueryCache, function (q) {\r\n return _.isEqual(q.query, query);\r\n });\r\n return _.clone(resp);\r\n }, function (err) {\r\n searchQueryCache = _.reject(searchQueryCache, function (q) {\r\n return _.isEqual(q.query, query);\r\n });\r\n return $q.reject(err);\r\n });\r\n\r\n searchQueryCache.push({\r\n query: _.clone(query),\r\n promise: $q.when(p)\r\n });\r\n\r\n return $q.when(p);\r\n };\r\n\r\n //endregion\r\n\r\n\r\n return _this;\r\n })\r\n\r\n .run(function (rest, requestCoupler, requestCouplerUtils) {\r\n var baserUrl = om.config.build.baseUrl;\r\n var userUrl = rest.getDefinition('UserModel').getUrl();\r\n\r\n requestCoupler.addCoupler(requestCouplerUtils.createSimpleGetCollectionCoupler(userUrl, baserUrl + '/' + userUrl));\r\n requestCoupler.addCoupler(requestCouplerUtils.createCustomFieldsCollectionCoupler(userUrl, 'customfields', baserUrl + \"/\" + userUrl + '/customfields'));\r\n })\r\n\r\n;\r\n","angular.module('env.data.repos',\r\n [\r\n 'env.data.repos.addresses',\r\n 'env.data.repos.categoryTypes',\r\n 'env.data.repos.categories',\r\n 'env.data.repos.centres',\r\n 'env.data.repos.customers',\r\n 'env.data.repos.documents',\r\n 'env.data.repos.groups',\r\n 'env.data.repos.localization',\r\n 'env.data.repos.operations',\r\n 'env.data.repos.orderItems',\r\n 'env.data.repos.orders',\r\n 'env.data.repos.users',\r\n 'env.data.repos.workflow'\r\n ]\r\n);","angular.module('env.data.repos.orders', [])\r\n\r\n .service(\"ordersRepository\", function ($q, rest) {\r\n var _this = this;\r\n var orderType = \"OrderModel\";\r\n var orderTypeLite = \"OrderModelLite\";\r\n var orderItemType = \"OrderItemModel\";\r\n var documentType = \"DocumentModel\";\r\n var commentType = \"CommentModel\";\r\n var orderDef = rest.getDefinition(orderType);\r\n\r\n //region Orders\r\n\r\n /**\r\n * Get orders\r\n * @returns {!Promise.} promise of orders collection\r\n */\r\n _this.getOrders = function () {\r\n return rest.map(orderDef).willReturn(orderType).get();\r\n };\r\n\r\n /**\r\n * Get orders by step code\r\n * @param {string} stepCode step code\r\n * @returns {!Promise.} promise of orders collection\r\n */\r\n _this.getOrdersByStep = function (stepCode) {\r\n return rest.map(orderDef).willReturn(orderType).get({params: {stepCode: stepCode}});\r\n };\r\n\r\n /**\r\n * Get order by id\r\n * @param {string|number} id is of the Order\r\n * @returns {!Promise.} promise of order\r\n */\r\n _this.getOrder = function (id) {\r\n return rest.map(orderDef).map(id).willReturn(orderType, id).get();\r\n };\r\n\r\n /**\r\n * Save order\r\n * @param {RepresentationModel} order Order Model\r\n * @returns {!Promise.} promise of saved order\r\n */\r\n _this.saveOrder = function (order) {\r\n return rest.map(orderDef).save(order);\r\n };\r\n\r\n /**\r\n * Create order\r\n * @param {RepresentationModel} order Order Model\r\n * @returns {!Promise.} promise of saved order\r\n */\r\n _this.createOrder = function (newOrder) {\r\n return rest.map(orderDef).post(newOrder);\r\n };\r\n\r\n //endregion\r\n\r\n //region Search\r\n\r\n var searchQueryCache = [];\r\n /**\r\n * Search orders\r\n * @param {{where: string, orderBy: string, pageNumber: number, rowsPerPage: number}} query\r\n * @returns {!Promise} promise of search results\r\n */\r\n _this.search = function (query, returnLiteModels) {\r\n var executing = _.find(searchQueryCache, function (q) {\r\n return _.isEqual(q.query, query);\r\n });\r\n if (executing) {\r\n return executing.promise\r\n .then(function (resp) {\r\n return _.clone(resp); // clone to prevent modification of response content\r\n });\r\n }\r\n\r\n var p = rest\r\n .map(orderDef)\r\n .map(\"search\")\r\n .willReturn(returnLiteModels ? orderTypeLite : orderType)\r\n .search(query)\r\n .then(function (resp) {\r\n searchQueryCache = _.reject(searchQueryCache, function (q) {\r\n return _.isEqual(q.query, query);\r\n });\r\n return _.clone(resp);\r\n }, function (err) {\r\n searchQueryCache = _.reject(searchQueryCache, function (q) {\r\n return _.isEqual(q.query, query);\r\n });\r\n return $q.reject(err);\r\n });\r\n\r\n searchQueryCache.push({\r\n query: _.clone(query),\r\n promise: $q.when(p)\r\n });\r\n\r\n return $q.when(p);\r\n };\r\n\r\n //endregion\r\n\r\n //region OrderItems\r\n\r\n /**\r\n * Get Order Items of the Order\r\n * @param {RepresentationModel|string} order Order Model or Order id\r\n * @returns {!Promise.} promise of order items collection\r\n */\r\n _this.getOrderItemsForOrder = function (order) {\r\n return rest.map(orderDef).map(order).map(\"orderitems\").willReturn(orderItemType).get();\r\n };\r\n\r\n //endregion\r\n\r\n //region Documents\r\n\r\n /**\r\n * Get Documents of the Order\r\n * @param {RepresentationModel|string} order Order Model or Order id\r\n * @returns {!Promise.} promise of Documents collection\r\n */\r\n _this.getDocuments = function (order) {\r\n return rest.map(orderDef).map(order).map(\"documents\").willReturn(documentType).get();\r\n };\r\n\r\n //endregion\r\n\r\n //region Comments of Order\r\n\r\n /**\r\n * Get Comments of the Order\r\n * @param {RepresentationModel|string} order Order Model or Order Id\r\n * @returns {!Promise.} promise of Comments collection\r\n */\r\n _this.getComments = function (order) {\r\n return rest.map(orderDef).map(order).map(\"comments\").willReturn(commentType).get();\r\n };\r\n\r\n /**\r\n * Save new comment of the Order\r\n * @param {RepresentationModel|string} order Order Model or Order Id\r\n * @param {RepresentationModel} comment Comment model\r\n * @returns {!Promise.} promise of Comment save\r\n */\r\n _this.saveComment = function (order, comment) {\r\n return rest.map(orderDef).map(order).map(\"comments\").post(comment);\r\n };\r\n\r\n //endregion\r\n\r\n //region Custom fields\r\n\r\n var _cfDefs;\r\n /**\r\n * Get all custom fields for Order\r\n * @returns {!Promise.} promise of Custom Field Definition list\r\n */\r\n _this.getCustomFieldDefinitions = function () {\r\n if (_cfDefs) {\r\n return $q.when(_.clone(_cfDefs));\r\n }\r\n return rest\r\n .map(orderDef)\r\n .map(\"customfielddefinitions\")\r\n .get()\r\n .then(function (definitions) {\r\n _cfDefs = definitions;\r\n return _.clone(_cfDefs);\r\n });\r\n };\r\n\r\n //endregion\r\n\r\n return _this;\r\n })\r\n\r\n .run(function (rest, requestCoupler, requestCouplerUtils) {\r\n var baserUrl = om.config.build.baseUrl;\r\n var orderUrl = rest.getDefinition(\"OrderModel\").getUrl();\r\n\r\n requestCoupler.addCoupler(requestCouplerUtils.createSimpleGetCollectionCoupler(orderUrl, baserUrl + \"/\" + orderUrl));\r\n requestCoupler.addCoupler(requestCouplerUtils.createCustomFieldsCollectionCoupler(orderUrl, \"customfields\", baserUrl + \"/\" + orderUrl + \"/customfields\"));\r\n })\r\n\r\n;\r\n","angular.module('env.data.repos.orderItems', [])\r\n\r\n .service('orderItemsRepository', function ($q, rest) {\r\n var _this = this;\r\n var orderItemType = \"OrderItemModel\";\r\n var documentType = \"DocumentModel\";\r\n var commentType = \"CommentModel\";\r\n var workflowAuditRecordType = \"WorkflowAuditRecordModel\";\r\n var categoryTypeModel = \"CategoryTypeModel\";\r\n var orderItemDef = rest.getDefinition(orderItemType);\r\n\r\n /**\r\n * Get order items by step code\r\n * @param {string} stepCode step code\r\n * @returns {!Promise.} promise of order items collection\r\n */\r\n _this.getOrderItemsByStep = function (stepCode) {\r\n return rest\r\n .map(orderItemDef)\r\n .willReturn(orderItemType)\r\n .get({params: {step: stepCode}});\r\n };\r\n\r\n /**\r\n * Get orderItem by id\r\n * @param {string|number} id id of the OrderItem\r\n * @returns {!Promise.} promise of order\r\n */\r\n _this.getOrderItem = function (id) {\r\n return rest\r\n .map(orderItemDef)\r\n .map(id)\r\n .willReturn(orderItemType, id)\r\n .get();\r\n };\r\n\r\n /**\r\n * Get order items by orders\r\n * @param {string[]} orders array of order ids\r\n * @returns {!Promise.} promise of order items collection\r\n */\r\n _this.getOrderItemsByOrders = function (orders) {\r\n return rest\r\n .map(orderItemDef)\r\n .willReturn(orderItemType)\r\n .get({params: {order: orders.join()}});\r\n };\r\n\r\n /**\r\n * Save order item\r\n * @param {RepresentationModel} orderItem Order Item Model\r\n * @returns {!Promise.} promise of saved orderItem\r\n */\r\n _this.saveOrderItem = function (orderItem) {\r\n return rest\r\n .map(orderItemDef)\r\n .save(orderItem);\r\n };\r\n\r\n //region Search\r\n\r\n var searchQueryCache = [];\r\n /**\r\n * Search order items\r\n * @param {{where: string, orderBy: string, pageNumber: number, rowsPerPage: number}} query\r\n * @returns {!Promise} promise of search results\r\n */\r\n _this.search = function (query) {\r\n var executing = _.find(searchQueryCache, function (q) {\r\n return _.isEqual(q.query, query);\r\n });\r\n if (executing) {\r\n return executing.promise\r\n .then(function (resp) {\r\n return _.clone(resp); // clone to prevent modification of response content\r\n });\r\n }\r\n\r\n var p = rest\r\n .map(orderItemDef)\r\n .map(\"search\")\r\n .willReturn(orderItemType)\r\n .search(query)\r\n .then(function (resp) {\r\n searchQueryCache = _.reject(searchQueryCache, function (q) {\r\n return _.isEqual(q.query, query);\r\n });\r\n return _.clone(resp);\r\n }, function (err) {\r\n searchQueryCache = _.reject(searchQueryCache, function (q) {\r\n return _.isEqual(q.query, query);\r\n });\r\n return $q.reject(err);\r\n });\r\n\r\n searchQueryCache.push({\r\n query: _.clone(query),\r\n promise: $q.when(p)\r\n });\r\n\r\n return $q.when(p);\r\n };\r\n\r\n var countQueryCache = [];\r\n /**\r\n * Count order items corresponding to the specified OMQL query (ignoring orderBy and rowsPerPage)\r\n * @param {{where: string}} query\r\n * @returns {!Promise} promise of search count results\r\n */\r\n _this.searchCount = function (query) {\r\n var executing = _.find(countQueryCache, function (q) {\r\n return _.isEqual(q.query, query);\r\n });\r\n if (executing) {\r\n return executing.promise\r\n .then(function (resp) {\r\n return _.clone(resp); // clone to prevent modification of response content\r\n });\r\n }\r\n\r\n var p = rest\r\n .map(orderItemDef)\r\n .map(\"searchCount\")\r\n .post(query)\r\n .then(function (resp) {\r\n countQueryCache = _.reject(countQueryCache, function (q) {\r\n return _.isEqual(q.query, query);\r\n });\r\n return _.clone(resp);\r\n }, function (err) {\r\n countQueryCache = _.reject(countQueryCache, function (q) {\r\n return _.isEqual(q.query, query);\r\n });\r\n return $q.reject(err);\r\n });\r\n\r\n countQueryCache.push({\r\n query: _.clone(query),\r\n promise: $q.when(p)\r\n });\r\n\r\n return $q.when(p);\r\n };\r\n\r\n //endregion\r\n\r\n //region Documents\r\n\r\n /**\r\n * Get Documents of the Order Item\r\n * @param {RepresentationModel|string} orderItem Order Item Model or Order Item id\r\n * @returns {!Promise.} promise of Documents collection\r\n */\r\n _this.getDocuments = function (orderItem) {\r\n return rest\r\n .map(orderItemDef)\r\n .map(orderItem)\r\n .map(\"documents\")\r\n .willReturn(documentType)\r\n .get();\r\n };\r\n\r\n //endregion\r\n\r\n //region Comments of Order item\r\n\r\n /**\r\n * Get Comments of the Order Item\r\n * @param {RepresentationModel|string} orderItem Order Item Model or Order Item Id\r\n * @returns {!Promise.} promise of Comments collection\r\n */\r\n _this.getComments = function (orderItem) {\r\n return rest\r\n .map(orderItemDef)\r\n .map(orderItem)\r\n .map(\"comments\")\r\n .willReturn(commentType)\r\n .get();\r\n };\r\n\r\n /**\r\n * Get Workflow audit of the Order Item\r\n * @param {RepresentationModel|string} orderItem Order Item Model or Order Item Id\r\n * @returns {!Promise.} promise of Workflow audit records collection\r\n */\r\n _this.getWorkflowAudit = function(orderItem) {\r\n return rest\r\n .map(orderItemDef)\r\n .map(orderItem)\r\n .map(\"workflow-audit\")\r\n .willReturn(workflowAuditRecordType)\r\n .get();\r\n }\r\n\r\n /**\r\n * Save new comment of the Order Item\r\n * @param {RepresentationModel|string} orderItem Order Item Model or Order Item Id\r\n * @param {RepresentationModel} comment Comment model\r\n * @returns {!Promise.} promise of Comment save\r\n */\r\n _this.saveComment = function (orderItem, comment) {\r\n return rest\r\n .map(orderItemDef)\r\n .map(orderItem)\r\n .map(\"comments\")\r\n .save(comment);\r\n };\r\n\r\n _this.downloadDocument = function (documentId) {\r\n return rest\r\n .map(\"documents\")\r\n .map(documentId)\r\n .map(\"download\")\r\n .get();\r\n };\r\n\r\n //endregion\r\n\r\n //region Categories\r\n\r\n /**\r\n * Get order items by category id collection\r\n * @param {!string[]|!number[]} categoryIds array of category ids\r\n * @returns {!Promise.} promise of order items collection\r\n */\r\n _this.getOrderItemsByCategories = function (categoryIds) {\r\n return rest\r\n .map(orderItemDef)\r\n .willReturn(orderItemType)\r\n .get({params: {category: categoryIds}});\r\n };\r\n\r\n /**\r\n * Get order items by id collection\r\n * @param {!string[]|!number[]} itemsIds array of items ids\r\n * @returns {!Promise.} promise of order items collection\r\n */\r\n _this.getOrderItemsByIds = function(ids) {\r\n return rest\r\n .map(orderItemDef)\r\n .willReturn(orderItemType)\r\n .get({params: {id: ids}});\r\n }\r\n\r\n /**\r\n * Get Categories for OrderItem\r\n * @param {string|number} id id of OrderItem\r\n * @returns {!Promise.} promise of Category collection\r\n */\r\n _this.getCategoriesForOrderItem = function (id) {\r\n return rest\r\n .map(orderItemDef)\r\n .map(id)\r\n .map(\"categories\")\r\n .willReturn(categoryTypeModel)\r\n .get();\r\n };\r\n\r\n /**\r\n * Link Categories to OrderItem\r\n * @param {!string|!number} orderItemId id of OrderItem\r\n * @param {!string[]|!number[]} categoryIds collection of Category ids\r\n * @returns {!Promise} promise of operation result\r\n */\r\n _this.linkCategoriesToOrderItem = function (orderItemId, categoryIds) {\r\n return rest\r\n .map(orderItemDef)\r\n .map(orderItemId)\r\n .map(\"linkcategories\")\r\n .post({categoryIds: categoryIds});\r\n };\r\n\r\n /**\r\n * Unlink Categories From OrderItem\r\n * @param {!string|!number} orderItemId id of OrderItem\r\n * @param {!string[]|!number[]} categoryIds collection of Category ids\r\n * @returns {!Promise} promise of operation result\r\n */\r\n _this.unlinkCategoriesFromOrderItem = function (orderItemId, categoryIds) {\r\n return rest\r\n .map(orderItemDef)\r\n .map(orderItemId)\r\n .map(\"unlinkcategories\")\r\n .post({categoryIds: categoryIds});\r\n };\r\n\r\n //endregion\r\n\r\n //region Custom fields\r\n\r\n var _cfDefs;\r\n /**\r\n * Get all custom fields for OrderItem\r\n * @returns {!Promise.} promise of Custom Field Definition list\r\n */\r\n _this.getCustomFieldDefinitions = function () {\r\n if (_cfDefs) {\r\n return $q.when(_.clone(_cfDefs));\r\n }\r\n return rest\r\n .map(orderItemDef)\r\n .map(\"customfielddefinitions\")\r\n .get()\r\n .then(function (definitions) {\r\n _cfDefs = definitions;\r\n return _.clone(_cfDefs);\r\n });\r\n };\r\n\r\n //endregion\r\n\r\n return _this;\r\n })\r\n\r\n .run(function (rest, requestCoupler, requestCouplerUtils) {\r\n var baserUrl = om.config.build.baseUrl;\r\n var orderItemUrl = rest.getDefinition(\"OrderItemModel\").getUrl();\r\n\r\n requestCoupler.addCoupler(requestCouplerUtils.createSimpleGetCollectionCoupler(orderItemUrl, baserUrl + \"/\" + orderItemUrl));\r\n requestCoupler.addCoupler(requestCouplerUtils.createCustomFieldsCollectionCoupler(orderItemUrl, \"customfields\", baserUrl + \"/\" + orderItemUrl + \"/customfields\"));\r\n requestCoupler.addCoupler(requestCouplerUtils.createDocumentsCollectionCoupler(orderItemUrl, \"documents\", baserUrl + \"/\" + orderItemUrl + \"/documents\"));\r\n requestCoupler.addCoupler(requestCouplerUtils.createWorkflowAuditCollectionCoupler(orderItemUrl, \"workflow-audit\", baserUrl + \"/\" + orderItemUrl + \"/workflow-audit\"));\r\n })\r\n\r\n;\r\n","angular.module('env.data.repos.operations', [])\r\n\r\n .service(\"operationsRepository\", function (rest) {\r\n var _this = this;\r\n\r\n /**\r\n * Get operations\r\n * @returns {!Promise.} promise of operations collection\r\n */\r\n _this.getOperations = function () {\r\n return rest.map(\"operations\").get();\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;","angular.module('env.data.repos.localization', [])\r\n\r\n .service(\"localizationRepository\", function (rest) {\r\n var _this = this;\r\n var localizationRoute = \"localization\";\r\n var languagesRoute = \"languages\";\r\n\r\n /**\r\n * Get languages\r\n * @returns {!Promise.} promise of available languages collection\r\n */\r\n _this.getLanguages = function () {\r\n return rest.map(localizationRoute).map(languagesRoute).get();\r\n };\r\n\r\n /**\r\n * Get translations for language and localization keys\r\n * @param {string} lang language code\r\n * @param {string[]} [keys] localization keys\r\n * @returns {!Promise.} promise of translated resources hash\r\n */\r\n _this.getTranslations = function (lang, keys) {\r\n return rest.map(localizationRoute).map(languagesRoute).map(lang).get({params: {keys: keys}});\r\n };\r\n\r\n /**\r\n * Get list of updated translated string pairs\r\n * @param {string} lang language code\r\n * @param {Date} date date of the last update\r\n * @returns {!Promise.} promise of translated resources hash\r\n */\r\n _this.getUpdatedTranslations = function (lang, date) {\r\n return rest.map(localizationRoute).map(languagesRoute).map(lang).get({params: {date: date}});\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;","angular.module('env.data.repos.groups', [])\r\n\r\n .service(\"groupsRepository\", function (rest) {\r\n var _this = this;\r\n\r\n /**\r\n * Get permissions by user group name\r\n * @param {string} userGroupName user group name\r\n * @returns {!Promise.} promise of permissions collection\r\n */\r\n _this.getPermissionsByGroupName = function (userGroupName) {\r\n return rest.map(\"groups\").map(userGroupName).map(\"permissions\").get();\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;","angular.module('env.data.repos.documents', [])\r\n\r\n .service(\"documentsRepository\", function (rest) {\r\n var _this = this;\r\n var modelType = \"DocumentModel\";\r\n var modelDefinition = rest.getDefinition(modelType);\r\n\r\n var customFieldAwareType = \"CustomFieldAwareModel\";\r\n var customFieldAwareDef = rest.getDefinition(customFieldAwareType);\r\n\r\n /**\r\n * Get document by id\r\n * @param {string} id id of the document\r\n * @returns {!Promise.} Promise of document\r\n */\r\n _this.getDocument = function (id) {\r\n return rest.map(modelDefinition).map(id).willReturn(modelType, id).get();\r\n };\r\n\r\n _this.initUpload = function (initUploadModel) {\r\n return rest.map(modelDefinition).map(\"init-upload\").post(initUploadModel);\r\n }\r\n\r\n _this.uploadData = function (data, config) {\r\n return rest.map(modelDefinition).map(\"upload-data\").post(data, config);\r\n }\r\n\r\n /**\r\n * Save document's custom fields\r\n * @param {RepresentationModel} document Document Model which custom fields has to be saved\r\n */\r\n _this.saveDocumentCustomFields = function (document) {\r\n\r\n var customFields = _.find(customFieldAwareDef.getFields(), function (fieldDef) {\r\n return fieldDef.name === \"customFields\";\r\n });\r\n if (angular.isDefined(customFields)) {\r\n customFields.save(rest, document);\r\n }\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n .run(function (rest, requestCoupler, requestCouplerUtils) {\r\n var baserUrl = om.config.build.baseUrl;\r\n var modelUrl = rest.getDefinition(\"DocumentModel\").getUrl();\r\n\r\n requestCoupler.addCoupler(requestCouplerUtils.createSimpleGetCollectionCoupler(modelUrl, baserUrl + \"/\" + modelUrl));\r\n requestCoupler.addCoupler(requestCouplerUtils.createCustomFieldsCollectionCoupler(modelUrl, \"customfields\", baserUrl + \"/\" + modelUrl + \"/customfields\"));\r\n })\r\n\r\n;\r\n","angular.module('env.data.repos.customers', [])\r\n\r\n .service(\"customersRepository\", function (rest) {\r\n var _this = this;\r\n var modelType = \"CustomerModel\";\r\n var modelDefinition = rest.getDefinition(modelType);\r\n\r\n /**\r\n * Get customers\r\n * @returns {!Promise.>} Promise of customers collection\r\n */\r\n _this.getCustomers = function () {\r\n return rest.map(modelDefinition).willReturn(modelType).get();\r\n };\r\n\r\n /**\r\n * Get customer by id\r\n * @param {string} id of the customer\r\n * @returns {!Promise.} Promise of customer\r\n */\r\n _this.getCustomer = function (id) {\r\n return rest.map(modelDefinition).map(id).willReturn(modelType, id).get();\r\n };\r\n\r\n /**\r\n * Get customer delivery addresses by the customer id\r\n * @param {string} customerId of the customer\r\n * @returns {!Promise.>} Promise of addresses collection\r\n */\r\n _this.getCustomerDeliveryAddresses = function (customerId) {\r\n return rest.map(modelDefinition)\r\n .map(customerId)\r\n .map(\"deliveryAddresses\")\r\n .willReturn(\"AddressModel\")\r\n .get();\r\n };\r\n\r\n /**\r\n * Set customer delivery address for a customer\r\n * @param {string} customerId of the customer\r\n * @param {string} deliveryAddressId of the customer\r\n */\r\n _this.setCustomerDeliveryAddress = function (customerId, deliveryAddressId) {\r\n return rest.map(modelDefinition)\r\n .map(customerId)\r\n .map(\"deliveryAddresses\")\r\n .map(deliveryAddressId)\r\n .post();\r\n };\r\n\r\n //Ordering statistics\r\n\r\n /**\r\n * Get customers statistics\r\n * @param {string} [whereOrderItems] 'Where' query to filter out the order items set for statistics. Optional.\r\n * @param {[]} [forCustomers] Array of customers Ids to get stats for.\r\n * @returns {!Promise.} promise of users statistics\r\n */\r\n _this.getCustomersStatistics = function (whereOrderItems, forCustomers) {\r\n if (whereOrderItems === null) {\r\n whereOrderItems = '';\r\n }\r\n if (forCustomers == null) {\r\n forCustomers = [];\r\n }\r\n\r\n return rest.map('customers', 'statistics').post({where: whereOrderItems, customers: forCustomers});\r\n };\r\n\r\n /**\r\n * Get single customer open orders stats\r\n * @param {string} [whereOrderItems] 'Where' query to filter out the order items set for statistics. Optional.\r\n * @param {string|number} [forCustomerId] Id of the customer to get orders stats for.\r\n * @returns {!Promise.} promise of users statistics\r\n */\r\n _this.getCustomerOrdersStepsStats = function (forCustomerId, whereOrderItems) {\r\n if (whereOrderItems === null) {\r\n whereOrderItems = '';\r\n }\r\n if (!forCustomerId) {\r\n throw new Error('Id of the customer must be specified.');\r\n }\r\n\r\n return rest\r\n .map('customers')\r\n .map(forCustomerId)\r\n .map('ordersStatistics')\r\n .post({ where: whereOrderItems });\r\n };\r\n\r\n /**\r\n * Get single customer orders history stats\r\n * @param {string|number} [forCustomerId] Id of the customer to get orders stats for.\r\n * @param {Date} [from] Get customer orders history stats starting from this date.\r\n * @param {Date} [to] Get customer orders history stats up to this date.\r\n * @returns {!Promise.} promise of users statistics\r\n */\r\n _this.getCustomerOrdersHistoryStats = function (forCustomerId, from, to) {\r\n if (!forCustomerId) {\r\n throw new Error('Id of the customer must be specified.');\r\n }\r\n\r\n var params = null;\r\n\r\n if (from && to) {\r\n params = { from: from, to: to };\r\n }\r\n\r\n return rest\r\n .map('customers')\r\n .map(forCustomerId)\r\n .map('statistics')\r\n .post(params);\r\n };\r\n\r\n /**\r\n * Get all customers simple orders history stats\r\n * @param {Date} [from] Get customer orders history stats starting from this date.\r\n * @param {Date} [to] Get customer orders history stats up to this date.\r\n * @returns {!Promise.} promise of users statistics\r\n */\r\n _this.getCustomersOrdersHistoryStats = function (from, to) {\r\n\r\n var params = null;\r\n\r\n if (from && to) {\r\n params = { from: from, to: to };\r\n }\r\n\r\n return rest\r\n .map('customers')\r\n .map('statistics-simple')\r\n .post(params);\r\n };\r\n\r\n //endregion\r\n\r\n return _this;\r\n })\r\n\r\n .run(function (rest, requestCoupler, requestCouplerUtils) {\r\n var baserUrl = om.config.build.baseUrl;\r\n var modelUrl = rest.getDefinition(\"CustomerModel\").getUrl();\r\n\r\n requestCoupler.addCoupler(requestCouplerUtils.createSimpleGetCollectionCoupler(modelUrl, baserUrl + \"/\" + modelUrl));\r\n })\r\n\r\n;\r\n","angular.module('env.data.repos.centres', [])\r\n\r\n .service(\"centresRepository\", function (rest) {\r\n var _this = this;\r\n var modelType = \"CentreModel\";\r\n var modelDefinition = rest.getDefinition(modelType);\r\n\r\n /**\r\n * Get centres\r\n * @returns {!Promise.>} Promise of centres collection\r\n */\r\n _this.getCentres = function () {\r\n return rest.map(modelDefinition).willReturn(modelType).get();\r\n };\r\n\r\n /**\r\n * Get centres by ids\r\n * @param {string[]} ids array of model ID\r\n * @returns {!Promise.>} Promise of centres collection\r\n */\r\n _this.getCentresByIds = function (ids) {\r\n return rest.map(modelDefinition).willReturn(modelType).get({params: {id: ids}});\r\n };\r\n\r\n /**\r\n * Get centre by id\r\n * @param id id of the centre\r\n * @returns {!Promise.} Promise of centre\r\n */\r\n _this.getCentre = function (id) {\r\n return rest.map(modelDefinition).map(id).willReturn(modelType, id).get();\r\n };\r\n\r\n _this.getCentreOrdersStepsStats = function (forCentreId, whereOrderItems) {\r\n if (whereOrderItems === null) {\r\n whereOrderItems = '';\r\n }\r\n if (!forCentreId) {\r\n throw new Error('Id of the centre must be specified.');\r\n }\r\n\r\n return rest\r\n .map('centres')\r\n .map(forCentreId)\r\n .map('ordersStatistics')\r\n .post({ where: whereOrderItems });\r\n };\r\n\r\n _this.getCentreUsersStats = function(forCentreId, from, to) {\r\n if (!forCentreId) {\r\n throw new Error('Id of the centre must be specified.');\r\n }\r\n\r\n var datesFilter = {};\r\n if (from) {\r\n datesFilter.from = from;\r\n }\r\n if (to) {\r\n datesFilter.to = to;\r\n }\r\n\r\n return rest\r\n .map('centres')\r\n .map(forCentreId)\r\n .map('usersStatistics')\r\n .post(datesFilter);\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n .run(function (rest, requestCoupler, requestCouplerUtils) {\r\n var baserUrl = om.config.build.baseUrl;\r\n var modelUrl = rest.getDefinition(\"CentreModel\").getUrl();\r\n\r\n requestCoupler.addCoupler(requestCouplerUtils.createSimpleGetCollectionCoupler(modelUrl, baserUrl + \"/\" + modelUrl));\r\n })\r\n\r\n;\r\n","angular.module('env.data.repos.categoryTypes', [])\r\n\r\n .service(\"categoryTypesRepository\", function (rest) {\r\n var _this = this;\r\n var categoryTypeModel = \"CategoryTypeModel\";\r\n var categoryModel = \"CategoryModel\";\r\n var categoryTypeDefinition = rest.getDefinition(categoryTypeModel);\r\n var categoryDefinition = rest.getDefinition(categoryModel);\r\n\r\n /**\r\n * Get all CategoryTypes\r\n * @returns {!Promise.} promise of CategoryTypes collection\r\n */\r\n _this.getCategoryTypes = function () {\r\n return rest\r\n .map(categoryTypeDefinition)\r\n .willReturn(categoryTypeModel)\r\n .get();\r\n };\r\n\r\n /**\r\n * Get CategoryType by id\r\n * @param {string|number} id id of the CategoryType\r\n * @returns {!Promise.} promise of CategoryType\r\n */\r\n _this.getCategoryType = function (id) {\r\n return rest\r\n .map(categoryTypeDefinition)\r\n .map(id)\r\n .willReturn(categoryTypeModel, id)\r\n .get();\r\n };\r\n\r\n /**\r\n * Get CategoryType by code\r\n * @param {string} code code of the CategoryType\r\n * @returns {!Promise.} promise of CategoryType\r\n */\r\n _this.getCategoryTypeByCode = function (code) {\r\n return rest\r\n .map(categoryTypeDefinition)\r\n .willReturn(categoryTypeModel)\r\n .get({params: {code: code}});\r\n };\r\n\r\n /**\r\n * Get Categories for CategoryType\r\n * @param {string} id id of the CategoryType\r\n * @returns {!Promise.} promise of Category collection\r\n */\r\n _this.getCategoriesForCategoryType = function (id) {\r\n return rest\r\n .map(categoryTypeDefinition)\r\n .map(id)\r\n .map(\"categories\")\r\n .willReturn(categoryModel)\r\n .get();\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n .run(function (rest, requestCoupler, requestCouplerUtils) {\r\n var baserUrl = om.config.build.baseUrl;\r\n var modelUrl = rest.getDefinition(\"CategoryTypeModel\").getUrl();\r\n\r\n requestCoupler.addCoupler(requestCouplerUtils.createSimpleGetCollectionCoupler(modelUrl, baserUrl + \"/\" + modelUrl));\r\n })\r\n\r\n;","angular.module('env.data.repos.categories', [])\r\n\r\n .service(\"categoriesRepository\", function (rest) {\r\n var _this = this;\r\n var categoryTypeModel = \"CategoryTypeModel\";\r\n var categoryModel = \"CategoryModel\";\r\n var orderItemModel = \"OrderItemModel\";\r\n var categoryTypeDefinition = rest.getDefinition(categoryTypeModel);\r\n var categoryDefinition = rest.getDefinition(categoryModel);\r\n\r\n /**\r\n * Get Category by id\r\n * @param {!string|!number} id id of the Category\r\n * @returns {!Promise.} promise of Category\r\n */\r\n _this.getCategory = function (id) {\r\n return rest\r\n .map(categoryDefinition)\r\n .map(id)\r\n .willReturn(categoryModel, id)\r\n .get();\r\n };\r\n\r\n /**\r\n * Get OrderItems for Category\r\n * @param {!string} id id of the Category\r\n * @returns {!Promise.} promise of OrderItems collection\r\n */\r\n _this.getOrderItemsForCategory = function (id) {\r\n return rest\r\n .map(categoryDefinition)\r\n .map(id)\r\n .map(\"orderitems\")\r\n .willReturn(orderItemModel)\r\n .get();\r\n };\r\n\r\n /**\r\n * Get Categories by id\r\n * @param {!string[]|!number[]} ids Category id's collection\r\n * @returns {!Promise.} promise of Category collection\r\n */\r\n _this.getCategoriesByIds = function (ids) {\r\n return rest\r\n .map(categoryDefinition)\r\n .willReturn(categoryModel)\r\n .get({params: {ids: ids.join(',')}});\r\n };\r\n\r\n /**\r\n * Get Categories by CategoryType code\r\n * @param {!string} categoryTypeCode CategoryType code\r\n * @returns {!Promise.} promise of Category collection\r\n */\r\n _this.getCategoriesByTypeCode = function (categoryTypeCode) {\r\n return rest\r\n .map(categoryDefinition)\r\n .willReturn(categoryModel)\r\n .get({params: {typeCode: categoryTypeCode}});\r\n };\r\n\r\n /**\r\n * Get Categories by CategoryType codes\r\n * @param {!string[]} categoryTypeCodes CategoryType codes collection\r\n * @returns {!Promise.} promise of Category collection\r\n */\r\n _this.getCategoriesByTypeCodes = function (categoryTypeCodes) {\r\n return rest\r\n .map(categoryDefinition)\r\n .willReturn(categoryModel)\r\n .get({params: {typeCodes: categoryTypeCodes.join(',')}});\r\n };\r\n\r\n /**\r\n * Link OrderItems to category\r\n * @param {!string|!number} categoryId id of Category\r\n * @param {!string|!number} orderItemIds collection of OrderItem ids\r\n * @returns {!Promise} promise of operation result\r\n */\r\n _this.linkOrderItemsToCategory = function (categoryId, orderItemIds) {\r\n return rest\r\n .map(categoryDefinition)\r\n .map(categoryId)\r\n .map(\"link\")\r\n .post({orderItemIds: orderItemIds});\r\n };\r\n\r\n /**\r\n * Unlink OrderItems from category\r\n * @param {!string|!number} categoryId id of Category\r\n * @param {!string|!number} orderItemIds collection of OrderItem ids\r\n * @returns {!Promise} promise of operation result\r\n */\r\n _this.unlinkOrderItemsFromCategory = function (categoryId, orderItemIds) {\r\n return rest\r\n .map(categoryDefinition)\r\n .map(categoryId)\r\n .map(\"unlink\")\r\n .post({orderItemIds: orderItemIds});\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n .run(function (rest, requestCoupler, requestCouplerUtils) {\r\n var baserUrl = om.config.build.baseUrl;\r\n var modelUrl = rest.getDefinition(\"CategoryModel\").getUrl();\r\n\r\n requestCoupler.addCoupler(requestCouplerUtils.createSimpleGetCollectionCoupler(modelUrl, baserUrl + \"/\" + modelUrl));\r\n })\r\n\r\n;","angular.module('env.data.repos.addresses', [])\r\n\r\n .service(\"addressesRepository\", function (rest) {\r\n var _this = this;\r\n var modelType = \"AddressModel\";\r\n var modelDefinition = rest.getDefinition(modelType);\r\n\r\n /**\r\n * Get addresses\r\n * @returns {!Promise.>} Promise of addresses collection\r\n */\r\n _this.getAddresses = function () {\r\n return rest.map(modelDefinition).willReturn(modelType).get();\r\n };\r\n\r\n /**\r\n * Get address by id\r\n * @param id id of the address\r\n * @returns {!Promise.} Promise of address\r\n */\r\n _this.getAddress = function (id) {\r\n return rest.map(modelDefinition).map(id).willReturn(modelType, id).get();\r\n };\r\n\r\n /**\r\n * Create address\r\n * @param {RepresentationModel} address model\r\n * @returns {!Promise.} Promise of address\r\n */\r\n _this.createAddress = function (address) {\r\n return rest.map(modelDefinition).willReturn(modelType).post(address);\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n .run(function (rest, requestCoupler, requestCouplerUtils) {\r\n var baserUrl = om.config.build.baseUrl;\r\n var modelUrl = rest.getDefinition(\"AddressModel\").getUrl();\r\n\r\n requestCoupler.addCoupler(requestCouplerUtils.createSimpleGetCollectionCoupler(modelUrl, baserUrl + \"/\" + modelUrl));\r\n })\r\n\r\n;\r\n","angular.module('env.data.models.workflowAuditRecordModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"WorkflowAuditRecordModel\",\r\n {\r\n extend: ['IdModel'],\r\n fields: {\r\n userName: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n orderId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n orderItemId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n stepCode: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n actionCode: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n actionExecutionDate: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n lastActionExecutionDate: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n secondsSinceLastActionExecution: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n actionProcessor: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n actionProcessorData: {\r\n type: RepresentationModelFieldTypes.STRING\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;\r\n","angular.module('env.data.models.userModelLite', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes, FieldValidationTemplates) {\r\n var emailPattern = /([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})/; // todo copy from server-side\r\n // Regex of short version of IETF standard\r\n var culturePattern = /^([a-z]{2,3})(?:[\\-_ ]([a-z]{4}))?(?:[\\-_ ]((?:[a-z]{1,3})|(?:[0-9]{3})))?(?:[\\-_ ]([a-z0-9]{5,8}))?$/i;\r\n\r\n restProvider.defineModel('UserModelLite',\r\n {\r\n extend: ['BaseModel', 'CustomFieldAwareModel'],\r\n url: 'users',\r\n fields: {\r\n name: {\r\n type: RepresentationModelFieldTypes.STRING,\r\n validators: FieldValidationTemplates.notEmpty()\r\n },\r\n lastName: {\r\n type: RepresentationModelFieldTypes.STRING,\r\n validate: FieldValidationTemplates.notEmpty()\r\n },\r\n firstName: {\r\n type: RepresentationModelFieldTypes.STRING,\r\n validate: FieldValidationTemplates.notEmpty()\r\n },\r\n title: {\r\n type: RepresentationModelFieldTypes.STRING,\r\n validate: FieldValidationTemplates.notEmpty()\r\n },\r\n email: {\r\n type: RepresentationModelFieldTypes.STRING,\r\n validate: [\r\n function (val) {\r\n return val && val !== '' && emailPattern.test(val);\r\n },\r\n 'E-mail is not valid'\r\n ]\r\n },\r\n disabled: {\r\n type: RepresentationModelFieldTypes.BOOLEAN\r\n },\r\n culture: {\r\n type: RepresentationModelFieldTypes.STRING,\r\n validate: [\r\n function (val) {\r\n return val && val !== '' && culturePattern.test(val);\r\n },\r\n 'Culture code is not valid'\r\n ]\r\n },\r\n jsonData: {\r\n type: RepresentationModelFieldTypes.DYNAMIC,\r\n decode: function (value) {\r\n return value ? JSON.parse(value) : null;\r\n },\r\n encode: function (value) {\r\n return value ? JSON.stringify(value) : null;\r\n }\r\n }\r\n },\r\n\r\n methods: {\r\n getCulture: function (rest, model) {\r\n return model.$model.culture;\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;\r\n","angular.module('env.data.models.userModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes, FieldValidationTemplates) {\r\n var emailPattern = /([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})/; // todo copy from server-side\r\n // Regex of short version of IETF standard\r\n var culturePattern = /^([a-z]{2,3})(?:[\\-_ ]([a-z]{4}))?(?:[\\-_ ]((?:[a-z]{1,3})|(?:[0-9]{3})))?(?:[\\-_ ]([a-z0-9]{5,8}))?$/i;\r\n\r\n restProvider.defineModel('UserModel',\r\n {\r\n extend: ['BaseModel'],\r\n url: 'users',\r\n fields: {\r\n name: {\r\n type: RepresentationModelFieldTypes.STRING,\r\n validators: FieldValidationTemplates.notEmpty()\r\n },\r\n lastName: {\r\n type: RepresentationModelFieldTypes.STRING,\r\n validate: FieldValidationTemplates.notEmpty()\r\n },\r\n firstName: {\r\n type: RepresentationModelFieldTypes.STRING,\r\n validate: FieldValidationTemplates.notEmpty()\r\n },\r\n title: {\r\n type: RepresentationModelFieldTypes.STRING,\r\n validate: FieldValidationTemplates.notEmpty()\r\n },\r\n email: {\r\n type: RepresentationModelFieldTypes.STRING,\r\n validate: [\r\n function (val) {\r\n return val && val !== '' && emailPattern.test(val);\r\n },\r\n 'E-mail is not valid'\r\n ]\r\n },\r\n disabled: {\r\n type: RepresentationModelFieldTypes.BOOLEAN\r\n },\r\n culture: {\r\n type: RepresentationModelFieldTypes.STRING,\r\n validate: [\r\n function (val) {\r\n return val && val !== '' && culturePattern.test(val);\r\n },\r\n 'Culture code is not valid'\r\n ]\r\n },\r\n jsonData: {\r\n type: RepresentationModelFieldTypes.DYNAMIC,\r\n decode: function (value) {\r\n return value ? JSON.parse(value) : null;\r\n },\r\n encode: function (value) {\r\n return value ? JSON.stringify(value) : null;\r\n }\r\n },\r\n\r\n role: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.DYNAMIC,\r\n get: function (rest, model) {\r\n return rest.map(model.getDefinition()).map(model).map('role').get();\r\n }\r\n },\r\n permissions: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.ARRAY,\r\n get: function (rest, model) {\r\n return rest.map(model.getDefinition()).map(model).map('permissions').get();\r\n }\r\n },\r\n centres: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.ARRAY,\r\n get: function (rest, model) {\r\n return rest.map(model.getDefinition()).map(model).map('centres').willReturn('CentreModel').get();\r\n }\r\n },\r\n customers: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.ARRAY,\r\n get: function (rest, model) {\r\n return rest.map(model.getDefinition()).map(model).map('customers').willReturn('CustomerModel').get();\r\n }\r\n },\r\n groups: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.ARRAY,\r\n get: function (rest, model) {\r\n return rest.map(model.getDefinition()).map(model).map('groups').get();\r\n }\r\n }\r\n },\r\n\r\n methods: {\r\n isCustomer: function (rest, model) {\r\n return !!model.$model.role.isCustomer;\r\n },\r\n isCentre: function (rest, model) {\r\n return !!model.$model.role.isCentre;\r\n },\r\n getCulture: function (rest, model) {\r\n return model.$model.culture;\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;\r\n","angular.module('env.data.models.stepModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"StepModel\",\r\n {\r\n extend: ['BaseModel'],\r\n fields: {\r\n code: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n publicNameResource: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n nameResource: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n type: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;","angular.module('env.data.models.orderModelLite', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"OrderModelLite\",\r\n {\r\n extend: ['BaseModel'],\r\n url: \"orders\",\r\n fields: {\r\n centreId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n customerId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n deliveryAddressId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n completed: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n reference: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n summary: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n createdBy: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n expectedBy: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n requiredBy: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n value: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n archiveJobLogEntryId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n jsonData: {\r\n type: RepresentationModelFieldTypes.DYNAMIC,\r\n decode: function (value) {\r\n return value ? JSON.parse(value) : null;\r\n },\r\n encode: function (value) {\r\n return value ? JSON.stringify(value) : null;\r\n }\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;\r\n","angular.module('env.data.models.orderModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"OrderModel\",\r\n {\r\n extend: ['BaseModel', 'CustomFieldAwareModel'],\r\n url: \"orders\",\r\n fields: {\r\n centreId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n customerId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n deliveryAddressId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n completed: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n reference: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n summary: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n createdBy: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n expectedBy: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n requiredBy: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n value: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n archiveJobLogEntryId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n jsonData: {\r\n type: RepresentationModelFieldTypes.DYNAMIC,\r\n decode: function (value) {\r\n return value ? JSON.parse(value) : null;\r\n },\r\n encode: function (value) {\r\n return value ? JSON.stringify(value) : null;\r\n }\r\n },\r\n customer: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.MODEL,\r\n get: function (rest, model) {\r\n if (model.$model.customerId) {\r\n return rest\r\n .map(rest.getDefinition(\"CustomerModel\"))\r\n .map(model.$model.customerId)\r\n .willReturn(\"CustomerModel\", model.$model.customerId).get();\r\n }\r\n return null;\r\n }\r\n },\r\n centre: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.MODEL,\r\n get: function (rest, model) {\r\n if (model.$model.centreId) {\r\n return rest\r\n .map(rest.getDefinition(\"CentreModel\"))\r\n .map(model.$model.centreId)\r\n .willReturn(\"CentreModel\", model.$model.centreId)\r\n .get();\r\n }\r\n return null;\r\n }\r\n },\r\n deliveryAddress: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.MODEL,\r\n get: function (rest, model) {\r\n if (model.$model.deliveryAddressId) {\r\n return rest\r\n .map(rest.getDefinition(\"AddressModel\"))\r\n .map(model.$model.deliveryAddressId)\r\n .willReturn(\"AddressModel\", model.$model.deliveryAddressId).get();\r\n }\r\n return null;\r\n }\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;\r\n","angular.module('env.data.models.orderItemModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes, injectorProvider) {\r\n\r\n var workflowRepository;\r\n\r\n function getWorkflowRepository() {\r\n if (!workflowRepository) {\r\n workflowRepository = injectorProvider.get().get(\"workflowRepository\");\r\n }\r\n return workflowRepository;\r\n }\r\n\r\n restProvider.defineModel(\"OrderItemModel\",\r\n {\r\n extend: ['BaseModel', 'CustomFieldAwareModel'],\r\n url: \"orderitems\",\r\n fields: {\r\n completed: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n orderId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n orderCustomerId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n orderCentreId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n assignedCentreId: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n stepCode: {\r\n serverName: 'step',\r\n name: 'stepCode',\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n step: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.MODEL,\r\n get: function (rest, model) {\r\n if (model.$model.stepCode) {\r\n return getWorkflowRepository().getStepByCode(model.$model.stepCode);\r\n }\r\n return null;\r\n }\r\n },\r\n summary: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n createdBy: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n expectedBy: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n requiredBy: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n value: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n order: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.MODEL,\r\n get: function (rest, model) {\r\n if (model.$model.orderId) {\r\n return rest\r\n .map(rest.getDefinition(\"OrderModel\"))\r\n .map(model.$model.orderId)\r\n .willReturn(\"OrderModel\", model.$model.orderId)\r\n .get();\r\n }\r\n return null;\r\n }\r\n },\r\n customer: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.MODEL,\r\n get: function (rest, model) {\r\n if (model.$model.orderCustomerId) {\r\n return rest\r\n .map(rest.getDefinition(\"CustomerModel\"))\r\n .map(model.$model.orderCustomerId)\r\n .willReturn(\"CustomerModel\", model.$model.orderCustomerId).get();\r\n }\r\n return null;\r\n }\r\n },\r\n assignedCentre: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.MODEL,\r\n get: function (rest, model) {\r\n if (model.$model.assignedCentreId) {\r\n return rest\r\n .map(rest.getDefinition(\"CentreModel\"))\r\n .map(model.$model.assignedCentreId)\r\n .willReturn(\"CentreModel\", model.$model.assignedCentreId).get();\r\n }\r\n return null;\r\n }\r\n },\r\n jsonData: {\r\n type: RepresentationModelFieldTypes.DYNAMIC,\r\n decode: function (value) {\r\n return value ? JSON.parse(value) : null;\r\n },\r\n encode: function (value) {\r\n return value ? JSON.stringify(value) : null;\r\n }\r\n },\r\n documents: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.ARRAY,\r\n get: function (rest, model) {\r\n return rest\r\n .map(model.getDefinition())\r\n .map(model.getId())\r\n .map(\"documents\")\r\n .willReturn(\"DocumentModel\")\r\n .get();\r\n }\r\n }\r\n },\r\n methods: {\r\n getDocumentIdByFilename: function (rest, model, fileName) {\r\n var fileNameDecoded = window.decodeURIComponent(fileName);\r\n for (var i = 0; i < model.$model.documents.length; i++) {\r\n var document = model.$model.documents[i];\r\n if (document && document.$model && document.$model.fileName === fileNameDecoded) {\r\n return document.$model.id;\r\n }\r\n }\r\n return null;\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;\r\n","angular.module('env.data.models', [\r\n\r\n 'env.data.models.idModel',\r\n 'env.data.models.baseModel',\r\n 'env.data.models.customFieldAwareModel',\r\n\r\n 'env.data.models.actionModel',\r\n 'env.data.models.addressModel',\r\n 'env.data.models.categoryModel',\r\n 'env.data.models.categoryTypeModel',\r\n 'env.data.models.centreModel',\r\n 'env.data.models.commentModel',\r\n 'env.data.models.workflowAuditRecordModel',\r\n 'env.data.models.customerModel',\r\n 'env.data.models.documentModel',\r\n 'env.data.models.orderItemModel',\r\n 'env.data.models.orderModel',\r\n 'env.data.models.orderModelLite',\r\n 'env.data.models.stepModel',\r\n 'env.data.models.userModel',\r\n 'env.data.models.userModelLite'\r\n\r\n]);\r\n","angular.module('env.data.models.idModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes, FieldValidationTemplates) {\r\n restProvider.defineModel(\"IdModel\",\r\n {\r\n fields: {\r\n id: {\r\n type: RepresentationModelFieldTypes.INTEGER,\r\n validate: FieldValidationTemplates.notEmpty()\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;","angular.module('env.data.models.documentModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"DocumentModel\",\r\n {\r\n extend: ['BaseModel', 'CustomFieldAwareModel'],\r\n url: \"documents\",\r\n fields: {\r\n fileName: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n fileVersion: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n checkedOut: {\r\n type: RepresentationModelFieldTypes.BOOLEAN\r\n },\r\n checkedOutBy: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n checkedOutById: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n size: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n archiveJobLogEntryId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;\r\n","angular.module('env.data.models.customFieldAwareModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"CustomFieldAwareModel\",\r\n {\r\n fields: {\r\n customFields: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.DYNAMIC,\r\n get: function (rest, model) {\r\n return rest\r\n .map(model.getDefinition())\r\n .map(model)\r\n .map(\"customfields\")\r\n .get()\r\n .then(function (customFields) {\r\n var cfObject = {};\r\n cfObject.$sourceTypes = {};\r\n\r\n _.forEach(customFields, function (cf) {\r\n if (cf && cf.fieldCode && !_.isUndefined(cf.type) && !_.isNull(cf.type)) {\r\n\r\n cfObject.$sourceTypes[cf.fieldCode] = cf.type;\r\n\r\n if (_.isUndefined(cf.value) || _.isNull(cf.value)) {\r\n cfObject[cf.fieldCode] = null;\r\n } else if (cf.type === \"String\" || cf.type == 0) {\r\n cfObject[cf.fieldCode] = cf.value;\r\n } else if (cf.type === \"Text\" || cf.type == 1) {\r\n cfObject[cf.fieldCode] = cf.value;\r\n } else if (cf.type === \"Integer\" || cf.type == 2) {\r\n cfObject[cf.fieldCode] = parseInt(cf.value);\r\n } else if (cf.type === \"FloatingPoint\" || cf.type == 3) {\r\n cfObject[cf.fieldCode] = parseFloat(cf.value);\r\n } else if (cf.type === \"Money\" || cf.type == 4) {\r\n cfObject[cf.fieldCode] = parseFloat(cf.value);\r\n } else if (cf.type === \"Boolean\" || cf.type == 5) {\r\n cfObject[cf.fieldCode] = !!(\r\n cf.value === true ||\r\n cf.value === 1 ||\r\n cf.value.toString().toLowerCase() === \"true\" ||\r\n cf.value.toString() === \"1\" ||\r\n cf.value.toString().toLowerCase() === \"yes\");\r\n } else if (cf.type == \"DateTime\" || cf.type == 6) {\r\n try {\r\n cfObject[cf.fieldCode] = new Date(cf.value);\r\n } catch (error) {\r\n $log.warn(\r\n \"Incorrect date format in server object. Model type: %s; Field name: %s; Server value: %s\",\r\n model.getType(),\r\n \"customFields\",\r\n cf.value,\r\n error);\r\n cfObject[cf.fieldCode] = null;\r\n }\r\n } else if (cf.type == \"Binary\" || cf.type == 7) {\r\n cfObject[cf.fieldCode] = cf.value; // todo parse binary\r\n } else {\r\n cfObject[cf.fieldCode] = cf.value;\r\n }\r\n }\r\n });\r\n\r\n return cfObject;\r\n });\r\n },\r\n\r\n save: function (rest, model) {\r\n var customFields = [];\r\n\r\n _.forEach(model.$model.customFields, function (value, code) {\r\n if (code === \"$sourceTypes\") {\r\n return;\r\n }\r\n\r\n var cf = {\r\n type: model.$model.customFields.$sourceTypes[code],\r\n fieldCode: code\r\n };\r\n\r\n if (_.isUndefined(value) || _.isNull(value)) {\r\n cf.value = null;\r\n } else if (cf.type === \"String\" || cf.type === 0) {\r\n cf.value = value.toString();\r\n } else if (cf.type === \"Text\" || cf.type === 1) {\r\n cf.value = value.toString();\r\n } else if (cf.type === \"Integer\" || cf.type === 2) {\r\n cf.value = value.toString();\r\n } else if (cf.type === \"FloatingPoint\" || cf.type === 3) {\r\n cf.value = value.toString();\r\n } else if (cf.type === \"Money\" || cf.type === 4) {\r\n cf.value = value.toString();\r\n } else if (cf.type === \"Boolean\" || cf.type === 5) {\r\n cf.value = value.toString();\r\n } else if (cf.type === \"DateTime\" || cf.type === 6) {\r\n if (_.isDate(value)) {\r\n cf.value = value.toISOString();\r\n } else {\r\n cf.value = value.toString();\r\n }\r\n } else if (cf.type === \"Binary\" || cf.type === 7) {\r\n cf.value = value.toString(); // todo parse binary\r\n } else {\r\n //cf.value = value;\r\n //Ignore unknown custom fields\r\n cf = null;\r\n }\r\n\r\n if (cf != null && cf.type != null) {\r\n customFields.push(cf);\r\n }\r\n });\r\n\r\n return rest\r\n .map(model.getDefinition())\r\n .map(model)\r\n .map(\"customfields\")\r\n .put(customFields);\r\n }\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;\r\n","angular.module('env.data.models.customerModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"CustomerModel\",\r\n {\r\n extend: ['BaseModel'],\r\n url: \"customers\",\r\n fields: {\r\n code: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n centreId: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n addressId: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n centreCode: {\r\n type: RepresentationModelFieldTypes.STRING,\r\n subResource: true,\r\n get: function (rest, model) {\r\n var centreId = model.$model.centreId;\r\n if (centreId) {\r\n return rest\r\n .map(rest.getDefinition(\"CentreModel\"))\r\n .map(centreId).willReturn(\"CentreModel\", centreId)\r\n .get()\r\n .then(function (restCentre) {\r\n return restCentre.$model.code;\r\n });\r\n }\r\n return null;\r\n }\r\n },\r\n address: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.MODEL,\r\n get: function (rest, model) {\r\n if (model.$model.addressId) {\r\n return rest\r\n .map(rest.getDefinition(\"AddressModel\"))\r\n .map(model.$model.addressId)\r\n .willReturn(\"AddressModel\", model.$model.addressId).get();\r\n }\r\n return null;\r\n }\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;\r\n","angular.module('env.data.models.commentModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"CommentModel\",\r\n {\r\n extend: ['BaseModel'],\r\n fields: {\r\n customerVisible: {\r\n type: RepresentationModelFieldTypes.BOOLEAN\r\n },\r\n userFullName: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n userId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n text: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n orderId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n orderItemId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;","angular.module('env.data.models.centreModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"CentreModel\",\r\n {\r\n extend: ['BaseModel'],\r\n url: \"centres\",\r\n fields: {\r\n addressId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n address: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.MODEL,\r\n get: function (rest, model) {\r\n if (model.$model.addressId) {\r\n return rest\r\n .map(rest.getDefinition(\"AddressModel\"))\r\n .map(model.$model.addressId)\r\n .willReturn(\"AddressModel\", model.$model.addressId).get();\r\n }\r\n return null;\r\n }\r\n },\r\n code: {\r\n type: RepresentationModelFieldTypes.STRING\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;\r\n","angular.module('env.data.models.categoryTypeModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"CategoryTypeModel\",\r\n {\r\n extend: ['BaseModel'],\r\n url: \"categorytype\",\r\n fields: {\r\n code: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n name: {\r\n type: RepresentationModelFieldTypes.STRING\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;","angular.module('env.data.models.categoryModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"CategoryModel\",\r\n {\r\n extend: ['BaseModel'],\r\n url: \"category\",\r\n fields: {\r\n categoryTypeId: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n name: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n archived: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n categoryType: {\r\n subResource: true,\r\n type: RepresentationModelFieldTypes.MODEL,\r\n get: function (rest, model) {\r\n if (model.$model.categoryTypeId) {\r\n return rest\r\n .map(rest.getDefinition(\"CategoryTypeModel\"))\r\n .map(model.$model.categoryTypeId)\r\n .willReturn(\"CategoryTypeModel\", model.$model.categoryTypeId)\r\n .get();\r\n }\r\n return null;\r\n }\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;","angular.module('env.data.models.baseModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"BaseModel\",\r\n {\r\n extend: ['IdModel'],\r\n fields: {\r\n created: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n updated: {\r\n type: RepresentationModelFieldTypes.DATE\r\n },\r\n version: {\r\n type: RepresentationModelFieldTypes.INTEGER\r\n },\r\n data: {\r\n type: RepresentationModelFieldTypes.DYNAMIC\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;","angular.module('env.data.models.addressModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"AddressModel\",\r\n {\r\n extend: ['BaseModel'],\r\n url: \"addresses\",\r\n fields: {\r\n line1: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n line2: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n city: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n companyName: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n contactLastName: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n contactFirstName: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n contactTitle: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n country: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n email: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n postalCode: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n region: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n telephone: {\r\n type: RepresentationModelFieldTypes.STRING\r\n }\r\n },\r\n methods: {\r\n toFormattedString: function (rest, model) {\r\n var addressParts = _.filter([\r\n //Get address line1 if not empty, remove 'carriage return' symbols, filter out duplicate words (often users copy-past duplicate words)\r\n (model.$model.line1 || '').replace('\\n', ' ').split(' ').filter(function (word, i, allWords) { return i === allWords.indexOf(word); }).join(' '),\r\n //Get address line 2 if not empty, remove 'carriage return' symbols, filter out duplicate words (often users copy-past duplicate words)\r\n model.$model.line2 !== model.$model.line1 ?\r\n (model.$model.line2 || '').replace('\\n', ' ').split(' ').filter(function (word, i, allWords) { return i === allWords.indexOf(word); }).join(' ') : '',\r\n model.$model.city,\r\n model.$model.postalCode,\r\n model.$model.country\r\n ],\r\n function(a) {\r\n return !angular.isUndefined(a) && a !== null && a.length > 0;\r\n });\r\n \r\n return addressParts.join(', ');\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;\r\n","angular.module('env.data.models.actionModel', [])\r\n\r\n .config(function (restProvider, RepresentationModelFieldTypes) {\r\n restProvider.defineModel(\"ActionModel\",\r\n {\r\n extend: ['BaseModel'],\r\n fields: {\r\n nameResource: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n code: {\r\n type: RepresentationModelFieldTypes.STRING\r\n },\r\n step: {\r\n type: RepresentationModelFieldTypes.STRING\r\n }\r\n }\r\n }\r\n );\r\n })\r\n\r\n;","angular.module('env.data.httpInterceptors.xhrTracerInterceptor', [])\r\n\r\n .factory('xhrTracerInterceptor', function ($q, $log) {\r\n return {\r\n response: function (response) {\r\n if (response && response.config) {\r\n $log.trace(\"%s %s -> %s %s\", response.config.method, response.config.url, response.status, response.statusText);\r\n }\r\n return response;\r\n }\r\n };\r\n })\r\n\r\n;","angular.module('env.data.httpInterceptors.requestRepeaterInterceptor', [])\r\n\r\n .factory('requestRepeaterInterceptor', function ($q, $injector, $timeout) {\r\n // To avoid circular dependency we use $injector\r\n var services = {};\r\n\r\n function getService(serviceName) {\r\n if (services[serviceName]) {\r\n return services[serviceName];\r\n }\r\n services[serviceName] = $injector.get(serviceName, \"requestRepeaterInterceptor\");\r\n return services[serviceName];\r\n }\r\n\r\n /**\r\n * HTTP response codes for server unavailability detection\r\n * @type {number[]}\r\n */\r\n var serverUnavailableCodes = [\r\n 403, 404, 405, 406, 407, 408, 409, 410, 429, 434,\r\n 501, 502, 503, 504, 509,\r\n 0\r\n ];\r\n\r\n /**\r\n * HTTP response codes for unAuthorised detection\r\n * @type {number[]}\r\n */\r\n var unAuthorisedCodes = [\r\n 401\r\n ];\r\n\r\n /**\r\n * Ignored URLs\r\n * @type {string[]}\r\n */\r\n var ignoredUrls = [\r\n om.config.build.baseUrl + \"/ping\",\r\n om.config.build.baseUrl + \"/auth/logout\",\r\n om.config.build.baseUrl + \"/auth/login\"\r\n ];\r\n\r\n var reAuthPromise;\r\n var reConnectPromise;\r\n\r\n /**\r\n * ReAuthorise promise\r\n * @param {Object} response $http response object\r\n * @returns {Promise}\r\n */\r\n function reAuth(response) {\r\n if (!reAuthPromise) {\r\n if (getService('$state').is('login')) {\r\n return $q.reject(response);\r\n }\r\n\r\n reAuthPromise = getService(\"authService\").reAuth();\r\n }\r\n\r\n return reAuthPromise.then(\r\n function () {\r\n reAuthPromise = null;\r\n return getService(\"$http\")(response.config);\r\n },\r\n function () {\r\n reAuthPromise = null;\r\n });\r\n }\r\n\r\n /**\r\n * ReConnect promise\r\n * @param {Object} response $http response object\r\n * @returns {Promise}\r\n */\r\n function reConnect(response) {\r\n if (!reConnectPromise) {\r\n reConnectPromise = getService(\"pingService\").ping()\r\n .then(\r\n function () {\r\n reConnectPromise = null;\r\n return $q.reject(response);\r\n },\r\n function () {\r\n return getService(\"pingService\").blockTillConnected();\r\n }\r\n );\r\n }\r\n\r\n return reConnectPromise.then(\r\n function () {\r\n reConnectPromise = null;\r\n return $timeout(function () {\r\n return getService(\"$http\")(response.config);\r\n }, 200);\r\n },\r\n function () { // impossible!\r\n reConnectPromise = null;\r\n return $q.reject(response);\r\n });\r\n }\r\n\r\n return {\r\n 'responseError': function (response) {\r\n if (response && response.config && response.config.url && !_.contains(ignoredUrls, response.config.url)) {\r\n if (_.contains(unAuthorisedCodes, response.status)) {\r\n return reAuth(response);\r\n }\r\n if (_.contains(serverUnavailableCodes, response.status)) {\r\n return reConnect(response);\r\n }\r\n }\r\n\r\n return $q.reject(response);\r\n }\r\n };\r\n })\r\n\r\n;\r\n","angular.module('env.data.httpInterceptors.omVersionInterceptor', [])\r\n\r\n // Insert owin information about API version into each http request\r\n .factory('omVersionInterceptor', function ($q) {\r\n return {\r\n request: function (request) {\r\n request.headers = request.headers || {};\r\n request.headers.OMVersion = om.config.build.omVersion; // API version\r\n return request || $q.when(request);\r\n }\r\n };\r\n })\r\n\r\n;\r\n","angular.module('env.data.httpInterceptors.jsonResponseInterceptor', [])\r\n\r\n // Insert 'Accept:\"application/json\"' header for every api call.\r\n // This needs for valid json response from server when error was happened, instead of html page.\r\n .factory('jsonResponseInterceptor', function ($q) {\r\n return {\r\n request: function (request) {\r\n if (request.url.indexOf('api/') !== -1) {\r\n request.headers = request.headers || {};\r\n request.headers.Accept = \"application/json\";\r\n }\r\n return request || $q.when(request);\r\n }\r\n };\r\n })\r\n\r\n;\r\n","angular.module('env.data.httpInterceptors', [\r\n\r\n 'env.data.httpInterceptors.authInterceptor',\r\n 'env.data.httpInterceptors.jsonResponseInterceptor',\r\n 'env.data.httpInterceptors.omVersionInterceptor',\r\n 'env.data.httpInterceptors.requestRepeaterInterceptor',\r\n\r\n 'env.data.httpInterceptors.xhrTracerInterceptor'\r\n])\r\n\r\n .config(function ($httpProvider) {\r\n $httpProvider.interceptors.push('authInterceptor');\r\n $httpProvider.interceptors.push('jsonResponseInterceptor');\r\n $httpProvider.interceptors.push('omVersionInterceptor');\r\n $httpProvider.interceptors.push('requestRepeaterInterceptor');\r\n\r\n //$httpProvider.interceptors.push('xhrTracerInterceptor');\r\n })\r\n\r\n;","angular.module('env.data.httpInterceptors.authInterceptor', [])\r\n\r\n //Insert auth token into each http request\r\n .factory('authInterceptor', function AuthInterceptor($injector, $q) {\r\n var authService;\r\n return {\r\n request: function (request) {\r\n if (!authService) {\r\n authService = $injector.get('authService', 'AuthInterceptor'); // avoid circular dependency\r\n }\r\n request.headers = request.headers || {};\r\n var token = authService.getToken();\r\n if (token) {\r\n request.headers.Authorization = token;\r\n }\r\n return request || $q.when(request);\r\n }\r\n };\r\n })\r\n\r\n;\r\n","angular.module('env.data.batching.batchingProvider', [])\r\n\r\n .provider('batching', function () {\r\n var batchingProvider = this;\r\n\r\n var batchers = [];\r\n var defaultDelay = 100;\r\n\r\n var defaultBatcherConfig = {\r\n maxQueueSize: 10,\r\n minQueueSize: 2,\r\n delay: defaultDelay,\r\n url: /.*/,\r\n methods: ['GET', 'HEAD', 'POST', 'PUT', 'DELETE']\r\n };\r\n\r\n var serviceConfig = {\r\n autoBatching: false,\r\n enabled: false,\r\n batchUrl: '/batch'\r\n };\r\n\r\n function setDefaultBatcherConfig(config) {\r\n if (config) {\r\n angular.extend(defaultBatcherConfig, config);\r\n }\r\n }\r\n\r\n function setConfig(config) {\r\n if (config) {\r\n angular.extend(serviceConfig, config);\r\n }\r\n }\r\n\r\n function addBatcher(batcherConfig) {\r\n batchers.push(angular.extend({}, defaultBatcherConfig, batcherConfig));\r\n }\r\n\r\n function getBathers() {\r\n return batchers;\r\n }\r\n\r\n function isEnabled() {\r\n return serviceConfig.enabled === true || serviceConfig.enabled === 'true';\r\n }\r\n\r\n angular.extend(batchingProvider, {\r\n setDefaultBatcherConfig: setDefaultBatcherConfig,\r\n setConfig: setConfig,\r\n addBatcher: addBatcher,\r\n getBathers: getBathers,\r\n isEnabled: isEnabled\r\n });\r\n\r\n this.$get = [\"$timeout\", \"$injector\", function ($timeout, $injector) {\r\n\r\n var $http;\r\n\r\n /**\r\n * Request processors\r\n * @type {Array}\r\n */\r\n var processors = [];\r\n var forcedBatchProcessor;\r\n\r\n return {\r\n forceStartBatch: forceStartBatch,\r\n processRequest: processRequest,\r\n addBatcher: addBatcher,\r\n getBathers: getBathers,\r\n isEnabled: isEnabled\r\n };\r\n\r\n function forceStartBatch(requestCount, asTransaction) {\r\n if (forcedBatchProcessor) {\r\n throw new Error(\"Forced batch is started already\");\r\n }\r\n _.forEach(processors, function (processor) {\r\n processor.send();\r\n });\r\n\r\n forcedBatchProcessor = new ForcedBatchProcessor(requestCount, asTransaction);\r\n }\r\n\r\n function processRequest(requestConfig) {\r\n\r\n if (!isEnabled() ||\r\n (requestConfig.method.toUpperCase() === \"POST\" &&\r\n requestConfig.url.indexOf(serviceConfig.batchUrl) > -1)) {\r\n requestConfig.continueDownNormalPipeline();\r\n return;\r\n }\r\n\r\n if (forcedBatchProcessor) {\r\n forcedBatchProcessor.addRequest(requestConfig);\r\n return;\r\n }\r\n\r\n if (!serviceConfig.autoBatching) {\r\n requestConfig.continueDownNormalPipeline();\r\n return;\r\n }\r\n\r\n var batcher = getBatcher(requestConfig);\r\n if (!batcher) {\r\n requestConfig.continueDownNormalPipeline(); // normal pipeline\r\n return;\r\n }\r\n\r\n getOrCreateProcessor(batcher).addRequest(requestConfig);\r\n }\r\n\r\n function getBatcher(requestConfig) {\r\n for (var i = 0; i < batchers.length; i++) {\r\n var batcher = batchers[i];\r\n\r\n var isMethodAllowed = true;\r\n if (batcher.methods) {\r\n isMethodAllowed = _.any(batcher.methods, function (m) {\r\n return m.toUpperCase() == requestConfig.method.toUpperCase();\r\n });\r\n }\r\n\r\n var isPathAllowed = true;\r\n if (batcher.url) {\r\n if (_.isRegExp(batcher.url)) {\r\n isPathAllowed = batcher.url.test(requestConfig.url);\r\n } else if (_.isString(batcher.url)) {\r\n isPathAllowed = requestConfig.url.indexOf(batcher.url) > -1;\r\n } else {\r\n isPathAllowed = false;\r\n }\r\n }\r\n\r\n if (isMethodAllowed && isPathAllowed) {\r\n return batcher;\r\n }\r\n }\r\n }\r\n\r\n function getOrCreateProcessor(batcherConfig) {\r\n for (var i = 0; i < processors.length; i++) {\r\n if (processors[i].getBatcher() === batcherConfig) {\r\n return processors[i];\r\n }\r\n }\r\n var newProcessor = new RequestBatcherProcessor(batcherConfig);\r\n processors.push(newProcessor);\r\n return newProcessor;\r\n }\r\n\r\n function sendBatchRequest(requests, asTransaction) {\r\n if (!requests || requests.length <= 0) {\r\n return;\r\n }\r\n\r\n // We need unique id for each request\r\n for (var i = 0; i < requests.length; i++) {\r\n requests[i].rid = 'r_' + i;\r\n }\r\n\r\n var batchBody = _.map(requests, function (r) {\r\n return {\r\n rid: r.rid,\r\n method: r.method,\r\n url: r.url,\r\n data: _.isString(r.data) ? r.data : JSON.stringify(r.data),\r\n headers: convertHeadersToObject(r.headers)\r\n };\r\n });\r\n\r\n var httpConfig = {};\r\n if (asTransaction === true) {\r\n if (!httpConfig.headers) {\r\n httpConfig.headers = {};\r\n }\r\n httpConfig.headers['Batch-As-Transaction'] = true;\r\n }\r\n\r\n if (!$http) {\r\n $http = $injector.get('$http', 'batching');\r\n }\r\n $http.post(serviceConfig.batchUrl, batchBody, httpConfig)\r\n .then(function (resp) {\r\n var responses = resp.data;\r\n if (responses) {\r\n for (var i = 0; i < requests.length; i++) {\r\n var request = requests[i];\r\n var response = _.find(responses, function (resp) {\r\n return resp.rid === request.rid;\r\n });\r\n if (!response) {\r\n request.callback(404, null, \"\", \"NotFound\");\r\n } else {\r\n var data;\r\n try {\r\n data = JSON.parse(response.data);\r\n } catch (e) {\r\n data = response.data;\r\n }\r\n request.callback(\r\n response.statusCode,\r\n data,\r\n convertObjectHeadersToString(request.headers),\r\n response.statusText);\r\n }\r\n }\r\n } else {\r\n for (var j = 0; j < requests.length; j++) {\r\n requests[j].callback(400, null, \"\", \"BadRequest\");\r\n }\r\n }\r\n }, function (resp) {\r\n if (resp) {\r\n var headers = convertHeadersToString(resp.headers);\r\n for (var i = 0; i < requests.length; i++) {\r\n requests[i].callback(resp.status, resp.data, headers, resp.statusText);\r\n }\r\n } else {\r\n for (var j = 0; j < requests.length; j++) {\r\n requests[j].callback(400, null, \"\", \"BadRequest\");\r\n }\r\n }\r\n\r\n });\r\n }\r\n\r\n function convertHeadersToObject(headers) {\r\n var result = [];\r\n for (var property in headers) {\r\n if (headers.hasOwnProperty(property)) {\r\n result.push({\r\n key: property,\r\n value: headers[property]\r\n });\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n function convertObjectHeadersToString(headers) {\r\n var result = '';\r\n for (var i = 0; i < headers.length; i++) {\r\n var header = headers[i];\r\n result += header.key + ': ' + header.value + '\\n';\r\n }\r\n return result;\r\n }\r\n\r\n function convertHeadersToString(headers) {\r\n var result = '';\r\n for (var property in headers) {\r\n if (headers.hasOwnProperty(property)) {\r\n result += property + ': ' + headers[property] + '\\n';\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n function ForcedBatchProcessor(_requestCount, _asTransaction) {\r\n var requests = [];\r\n var asTransaction = !!_asTransaction;\r\n var requestCount = _requestCount;\r\n\r\n angular.extend(this, {\r\n addRequest: addRequest,\r\n send: send\r\n });\r\n\r\n function addRequest(requestConfig) {\r\n requests.push(requestConfig);\r\n requestCount--;\r\n if (requestCount <= 0) {\r\n forcedBatchProcessor = null;\r\n send();\r\n }\r\n }\r\n\r\n function send() {\r\n sendBatchRequest(requests, asTransaction)\r\n }\r\n }\r\n\r\n function RequestBatcherProcessor(batcherConfig) {\r\n var requests = [];\r\n var me = this;\r\n\r\n // start timer\r\n var timeout = $timeout(send, batcherConfig.delay || defaultDelay, false);\r\n\r\n angular.extend(this, {\r\n getBatcher: getBatcher,\r\n addRequest: addRequest\r\n });\r\n\r\n function getBatcher() {\r\n return batcherConfig;\r\n }\r\n\r\n function addRequest(request) {\r\n requests.push(request);\r\n if (batcherConfig.maxQueueSize > 0 && requests.length >= batcherConfig.maxQueueSize) {\r\n send();\r\n }\r\n }\r\n\r\n function send() {\r\n $timeout.cancel(timeout);\r\n timeout = undefined;\r\n // remove processor from processors\r\n var di = processors.indexOf(me);\r\n if (di > -1) {\r\n processors.splice(di, 1);\r\n }\r\n\r\n // check limitations\r\n if (batcherConfig.minQueueSize > 0 && requests.length < batcherConfig.minQueueSize) {\r\n // should let the request continue normally\r\n angular.forEach(requests, function (request) {\r\n request.continueDownNormalPipeline();\r\n });\r\n return;\r\n }\r\n\r\n sendBatchRequest(requests);\r\n }\r\n }\r\n }];\r\n })\r\n\r\n .config(function ($provide) {\r\n $provide.decorator('$httpBackend', [\r\n '$delegate',\r\n 'batching',\r\n function ($delegate, batching) {\r\n var $httpBackendFn = function (method, url, post, callback, headers, timeout, withCredentials, responseType) {\r\n var self = this;\r\n var callArgs = arguments;\r\n\r\n batching.processRequest({\r\n method: method,\r\n url: url,\r\n data: post,\r\n callback: callback,\r\n headers: headers,\r\n timeout: timeout,\r\n withCredentials: withCredentials,\r\n responseType: responseType,\r\n continueDownNormalPipeline: function () {\r\n $delegate.apply(self, callArgs);\r\n }\r\n });\r\n };\r\n\r\n // If we are testing using angular-mocks we need to provide their special methods\r\n // on the function we are returning otherwise your tests won't work :-(.\r\n if (angular.mock) {\r\n angular.forEach($delegate, function (fn, key) {\r\n $httpBackendFn[key] = fn;\r\n });\r\n }\r\n\r\n return $httpBackendFn;\r\n }\r\n ]);\r\n })\r\n\r\n;","angular.module('env.data.batching', [\r\n 'env.data.batching.batchingProvider'\r\n])\r\n\r\n .config(function (batchingProvider) {\r\n batchingProvider.setConfig({\r\n enabled: om.config.batching.enabled,\r\n autoBatching: om.config.batching.autoBatching,\r\n batchUrl: om.config.build.baseUrl + '/batch'\r\n });\r\n\r\n batchingProvider.setDefaultBatcherConfig({\r\n delay: om.config.batching.batchRequestCollectionDelay || 50,\r\n maxQueueSize: om.config.batching.maxBatchedRequestPerCall || 10,\r\n minQueueSize: om.config.batching.minimumBatchSize || 2\r\n });\r\n\r\n batchingProvider.addBatcher({\r\n url: om.config.build.baseUrl\r\n });\r\n })\r\n\r\n;","angular.module('env.customConfig.logicResolvers', ['env.customConfig.provider'])\r\n\r\n /**\r\n * Holds a set of common methods used to calculate a proper name prefix for a customised resources\r\n * depending on the resources existence, current user, step information or any other supplied data via context.\r\n */\r\n .provider('$customLogicResolvers', function CustomLogicResolvers() {\r\n\r\n var injector = angular.injector([\"ng\"]);\r\n var http = injector.get(\"$http\");\r\n var log = injector.get(\"$log\");\r\n\r\n this.$get = function () {\r\n return new CustomLogicResolvers();\r\n };\r\n\r\n /**\r\n * Resolves URI to the specified customised resource based on the logic to form the name of the resource\r\n * using prefixes to indicate how the resource relates to centre or customer users, steps, centre code, etc.\r\n */\r\n this.resolveResourceUri = function (context, resourceName) {\r\n\r\n //Calculate the prefix based on the following logic. Then finds the corresponding\r\n //resource in the server's resource index file and returns the full URI to the resource.\r\n //\r\n //Centre users:\r\n //1. __additional-fields.html\r\n //2. __additional-fields.html\r\n //3. _general_additional-fields.html\r\n //4. _general_additional-fields.html\r\n //\r\n //Customer users:\r\n //1. Customer___additional-fields.html\r\n //2. Customer___additional-fields.html\r\n //3. Customer__general_additional-fields.html\r\n //4. Customer__general_additional-fields.html\r\n //\r\n //--> if none of these file names resolve to a valid file in the server's 'customise' folder, \r\n //try the 'centre user' named files in the order listed above using the %user%.Customer.Centre \r\n //as the Id to locate the Centre.Code for use in the template name.\r\n\r\n //Context object will be of the form: { user: %currentUserObject%, step: %stepCode% }\r\n var resourceUri = resourceName;\r\n if (!context) {\r\n return resourceUri;\r\n }\r\n\r\n var prefixes = [];\r\n var user = context.user;\r\n var step = context.step || \"\";\r\n var code = \"\";\r\n var isCustomer = user && user.role.isCustomer;\r\n var resourcesMap = context.customResourcesMap;\r\n\r\n if (user && user.role.isCentre && user.centres && user.centres.length > 0) {\r\n code = user.centres[0].code;\r\n } else if (user && user.customers && user.customers.length > 0) {\r\n code = user.customers[0].centreCode;\r\n }\r\n\r\n var addPossiblePrefixesToArray = function (array, customerPrefix) {\r\n if (code && step) {\r\n array.push(_.string.sprintf(\"%s%s_%s_\", customerPrefix ? customerPrefix : \"\", code, step));\r\n }\r\n if (step) {\r\n array.push(_.string.sprintf(\"%s_%s_\", customerPrefix ? customerPrefix : \"\", step));\r\n }\r\n if (code) {\r\n array.push(_.string.sprintf(\"%s%s_general_\", customerPrefix ? customerPrefix : \"\", code));\r\n }\r\n\r\n array.push(_.string.sprintf(\"%s_general_\", customerPrefix ? customerPrefix : \"\"));\r\n };\r\n\r\n //Add all possible prefixes to the array to find out later what prefix is topmost \r\n //and corresponds to the available customised resource on the server.\r\n //If user is a customer user - try with the 'customer_' prefix first.\r\n if (isCustomer) {\r\n addPossiblePrefixesToArray(prefixes, \"Customer_\"); //customer users targeted resources prefixes\r\n }\r\n addPossiblePrefixesToArray(prefixes); //centre users targeted resources prefixes\r\n prefixes.push(\"\"); //and finally push empty prefix for the case when resource used without a prefix at all\r\n\r\n for (var i = 0; i < prefixes.length; ++i) {\r\n var p = prefixes[i];\r\n var prefixFoundOnServer = _.find(resourcesMap, function (resource) {\r\n return _.string.endsWith(resource, _.string.sprintf(\"/%s%s\", p, resourceName));\r\n });\r\n if (prefixFoundOnServer) {\r\n resourceUri = prefixFoundOnServer;\r\n break;\r\n }\r\n }\r\n\r\n //log.debug(_.string.sprintf(\"Resolved URI for customised resource [%s] to: %s\", resourceName, resourceUri));\r\n\r\n //return the full path to the resource as it stated in the resources map on the server\r\n return resourceUri;\r\n };\r\n\r\n /**\r\n * Tries to resolve the uri to the configuration file and then to download and evaluate it.\r\n * If succeeded, the resulted configuration object as a proper javascript object instance will be returned.\r\n */\r\n this.resolveConfigFromServer = function (context, configName, defaultConfigObject) {\r\n //Context object will be of the form: { user: %currentUserObject%, step: %stepCode% }\r\n\r\n //Resolve URI of the config js file on the server\r\n var configUri = this.resolveResourceUri(context, configName);\r\n\r\n //Try to download it and evaluate\r\n if (configUri) {\r\n return http.get(configUri).then(function (resp) {\r\n // this callback will be called asynchronously\r\n // when the response is available\r\n log.debug(_.string.sprintf(\"Successfully downloaded config [%s] from server [%s].\", configName, configUri));\r\n //Now try to construct the config object and return it\r\n var config = null;\r\n try {\r\n config = eval(resp.data);\r\n } catch (e) {\r\n config = defaultConfigObject;\r\n log.error(_.string.sprintf(\"Error while constructing config object [%s] downloaded from [%s]. %s\", configName, configUri, e));\r\n }\r\n return config || defaultConfigObject;\r\n },\r\n function (resp) {\r\n // called asynchronously if an error occurs\r\n // or server returns response with an error status.\r\n log.error(_.string.sprintf(\"Can not download config [%s] from server [%s]. Details: %s %s.\", configName, configUri, resp.status, resp.statusText));\r\n return defaultConfigObject;\r\n });\r\n } else {\r\n //otherwise just return null object\r\n return null;\r\n }\r\n };\r\n\r\n });\r\n","(function () {\r\n angular.module('env.customConfig',\r\n [\r\n 'env.customConfig.provider',\r\n 'env.customConfig.templates',\r\n 'env.customConfig.directives',\r\n 'env.customConfig.images',\r\n 'env.customConfig.styles',\r\n 'env.customConfig.configs',\r\n 'env.customConfig.reports',\r\n 'env.customConfig.logicResolvers'\r\n ])\r\n .run(function ($log, $customisationConfig) {\r\n $customisationConfig.initCustomResourcesMap();\r\n\r\n // validate customisationConfig sections\r\n if (angular.isUndefined($customisationConfig)) {\r\n $log.error('Wrong customisation config! Check please `customise/config*.js` and any dependant configuration files.');\r\n }\r\n if (angular.isUndefined($customisationConfig.directives)) {\r\n $log.error('Wrong customisation config: directives! Check please `customise/configDirectives.js` and any dependant configuration files.');\r\n }\r\n if (angular.isUndefined($customisationConfig.images)) {\r\n $log.error('Wrong customisation config: images! Check please `customise/configImages.js` and any dependant configuration files.');\r\n }\r\n if (angular.isUndefined($customisationConfig.templates)) {\r\n $log.error('Wrong customisation config: templates! Check please `customise/configTemplates.js` and any dependant configuration files.');\r\n }\r\n if (angular.isUndefined($customisationConfig.styles)) {\r\n $log.error('Wrong customisation config: styles! Check please `customise/configStyles.js` and any dependant configuration files.');\r\n }\r\n if (angular.isUndefined($customisationConfig.configs)) {\r\n $log.error('Wrong customisation config: configs! Check please `customise/configConfigs.js` and any dependant configuration files.');\r\n }\r\n if (angular.isUndefined($customisationConfig.reports)) {\r\n $log.error('Wrong customisation config: reports! Check please `customise/configReports.js` and any dependant configuration files.');\r\n }\r\n });\r\n\r\n angular.module('env.customConfig.provider', [])\r\n .constant('servertext', function (str) {\r\n /*\r\n * Does nothing, simply returns the input string.\r\n *\r\n * This function serves as a marker for gulp tasks `exportServerTranslations` to know that\r\n * this string should be extracted for OrderManager server translations.\r\n */\r\n return str;\r\n })\r\n .provider('$customisationConfig', function CustomisationConfigProvider() {\r\n /**\r\n * Whenever instance of the CustomisationConfig will be requested from its provider, it will be given the content of the\r\n * predefined configurations supplied via the .config() function calls in the corresponding configuration sub-modules.\r\n */\r\n this.$get = function ($log, $http) {\r\n\r\n return new CustomisationConfig($log, $http, this.templates, this.directives, this.images, this.styles, this.configs, this.reports);\r\n };\r\n }\r\n );\r\n\r\n /**\r\n * Provides the access points to all of the config sections of the customisation subsystem throughout the application.\r\n */\r\n function CustomisationConfig($log, $http, templates, directives, images, styles, configs, reports) {\r\n var _this = this;\r\n var log = $log;\r\n var http = $http;\r\n\r\n this.templates = templates;\r\n this.directives = directives;\r\n this.images = images;\r\n this.styles = styles;\r\n this.configs = configs;\r\n this.reports = reports;\r\n\r\n var downloadCustomResourcesMap = function () {\r\n return http.get(om.config.build.baseUrl + '/customisedresources/map')\r\n .then(function (resp) {\r\n log.debug(\"Downloaded customised resources map from the server and cached.\");\r\n return resp.data;\r\n })\r\n .catch(function (error) {\r\n log.error(_.string.sprintf(\"Can't download customised resources map [%s] from the server: %s %s\",\r\n error.config.url, error.status, error.statusText));\r\n return [];\r\n });\r\n };\r\n\r\n this.initCustomResourcesMap = function () {\r\n downloadCustomResourcesMap().then(function (resMap) {\r\n _this.customResourcesMap = resMap;\r\n });\r\n };\r\n\r\n this.hasResource = function (predicate) {\r\n return angular.isDefined(_.find(_this.customResourcesMap, predicate));\r\n };\r\n }\r\n})();\r\n","angular.module('common.directives.urlencode', [])\r\n\r\n .filter('urlencode', function () {\r\n return function (input) {\r\n if (input) {\r\n return window.encodeURIComponent(input);\r\n }\r\n return \"\";\r\n };\r\n })\r\n\r\n;","angular.module('common.directives.teethConverter', [])\r\n\r\n // teeth-converter directive\r\n .directive('teethConverter', function () {\r\n return {\r\n restrict: \"AE\",\r\n template: '{{teethRepresentation}}',\r\n scope: {\r\n data: '=',\r\n numberingScheme: '@'\r\n },\r\n controller: 'TeethConverterController',\r\n controllerAs: 'TeethConverterController'\r\n };\r\n })\r\n\r\n // Flags\r\n .constant('QUADRANT', {\r\n UpperJaw: 0,\r\n LowerJaw: 1,\r\n Jaw: 1,\r\n LeftSide: 0,\r\n RightSide: 2,\r\n Side: 2\r\n })\r\n\r\n // Scheme of the teeth map (types of the conversion)\r\n .constant('SCHEME', {\r\n FDIScheme: 'fdi',\r\n UniversalScheme: 'universal',\r\n PalmerScheme: 'palmer'\r\n })\r\n\r\n // Empty value of the teeth range\r\n .constant('EMPTY', '')\r\n\r\n // Teeth map factory\r\n .factory(\"teethMap\", function TeethFactory(QUADRANT) {\r\n\r\n // Common Teeth Map without Key\r\n var teeth = [{\r\n FDI: \"18\",\r\n Palmer: \"UR8\",\r\n Universal: \"1\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 1,\r\n MidlineOrdinalPosition: 8\r\n },\r\n {\r\n FDI: \"17\",\r\n Palmer: \"UR7\",\r\n Universal: \"2\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 2,\r\n MidlineOrdinalPosition: 7\r\n },\r\n {\r\n FDI: \"16\",\r\n Palmer: \"UR6\",\r\n Universal: \"3\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 3,\r\n MidlineOrdinalPosition: 6\r\n },\r\n {\r\n FDI: \"15\",\r\n Palmer: \"UR5\",\r\n Universal: \"4\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 4,\r\n MidlineOrdinalPosition: 5\r\n },\r\n {\r\n FDI: \"14\",\r\n Palmer: \"UR4\",\r\n Universal: \"5\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 5,\r\n MidlineOrdinalPosition: 4\r\n },\r\n {\r\n FDI: \"13\",\r\n Palmer: \"UR3\",\r\n Universal: \"6\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 6,\r\n MidlineOrdinalPosition: 3\r\n },\r\n {\r\n FDI: \"12\",\r\n Palmer: \"UR2\",\r\n Universal: \"7\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 7,\r\n MidlineOrdinalPosition: 2\r\n },\r\n {\r\n FDI: \"11\",\r\n Palmer: \"UR1\",\r\n Universal: \"8\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 8,\r\n MidlineOrdinalPosition: 1\r\n },\r\n {\r\n FDI: \"21\",\r\n Palmer: \"UL1\",\r\n Universal: \"9\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 9,\r\n MidlineOrdinalPosition: 9\r\n },\r\n {\r\n FDI: \"22\",\r\n Palmer: \"UL2\",\r\n Universal: \"10\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 10,\r\n MidlineOrdinalPosition: 10\r\n },\r\n {\r\n FDI: \"23\",\r\n Palmer: \"UL3\",\r\n Universal: \"11\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 11,\r\n MidlineOrdinalPosition: 11\r\n },\r\n {\r\n FDI: \"24\",\r\n Palmer: \"UL4\",\r\n Universal: \"12\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 12,\r\n MidlineOrdinalPosition: 12\r\n },\r\n {\r\n FDI: \"25\",\r\n Palmer: \"UL5\",\r\n Universal: \"13\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 13,\r\n MidlineOrdinalPosition: 13\r\n },\r\n {\r\n FDI: \"26\",\r\n Palmer: \"UL6\",\r\n Universal: \"14\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 14,\r\n MidlineOrdinalPosition: 14\r\n },\r\n {\r\n FDI: \"27\",\r\n Palmer: \"UL7\",\r\n Universal: \"15\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 15,\r\n MidlineOrdinalPosition: 15\r\n },\r\n {\r\n FDI: \"28\",\r\n Palmer: \"UL8\",\r\n Universal: \"16\",\r\n Quadrant: QUADRANT.UpperJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 16,\r\n MidlineOrdinalPosition: 16\r\n },\r\n {\r\n FDI: \"38\",\r\n Palmer: \"LL8\",\r\n Universal: \"17\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 17,\r\n MidlineOrdinalPosition: 24\r\n },\r\n {\r\n FDI: \"37\",\r\n Palmer: \"LL7\",\r\n Universal: \"18\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 18,\r\n MidlineOrdinalPosition: 23\r\n },\r\n {\r\n FDI: \"36\",\r\n Palmer: \"LL6\",\r\n Universal: \"19\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 19,\r\n MidlineOrdinalPosition: 22\r\n },\r\n {\r\n FDI: \"35\",\r\n Palmer: \"LL5\",\r\n Universal: \"20\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 20,\r\n MidlineOrdinalPosition: 21\r\n },\r\n {\r\n FDI: \"34\",\r\n Palmer: \"LL4\",\r\n Universal: \"21\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 21,\r\n MidlineOrdinalPosition: 20\r\n },\r\n {\r\n FDI: \"33\",\r\n Palmer: \"LL3\",\r\n Universal: \"22\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 22,\r\n MidlineOrdinalPosition: 19\r\n },\r\n {\r\n FDI: \"32\",\r\n Palmer: \"LL2\",\r\n Universal: \"23\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.LeftSide,\r\n OrdinalPosition: 23,\r\n MidlineOrdinalPosition: 18\r\n },\r\n {\r\n FDI: \"31\",\r\n Palmer: \"LL1\",\r\n Universal: \"24\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 24,\r\n MidlineOrdinalPosition: 17\r\n },\r\n {\r\n FDI: \"41\",\r\n Palmer: \"LR1\",\r\n Universal: \"25\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 25,\r\n MidlineOrdinalPosition: 25\r\n },\r\n {\r\n FDI: \"42\",\r\n Palmer: \"LR2\",\r\n Universal: \"26\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 26,\r\n MidlineOrdinalPosition: 26\r\n },\r\n {\r\n FDI: \"43\",\r\n Palmer: \"LR3\",\r\n Universal: \"27\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 27,\r\n MidlineOrdinalPosition: 27\r\n },\r\n {\r\n FDI: \"44\",\r\n Palmer: \"LR4\",\r\n Universal: \"28\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 28,\r\n MidlineOrdinalPosition: 28\r\n },\r\n {\r\n FDI: \"45\",\r\n Palmer: \"LR5\",\r\n Universal: \"29\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 29,\r\n MidlineOrdinalPosition: 29\r\n },\r\n {\r\n FDI: \"46\",\r\n Palmer: \"LR6\",\r\n Universal: \"30\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 30,\r\n MidlineOrdinalPosition: 30\r\n },\r\n {\r\n FDI: \"47\",\r\n Palmer: \"LR7\",\r\n Universal: \"31\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 31,\r\n MidlineOrdinalPosition: 31\r\n },\r\n {\r\n FDI: \"48\",\r\n Palmer: \"LR8\",\r\n Universal: \"32\",\r\n Quadrant: QUADRANT.LowerJaw | QUADRANT.RightSide,\r\n OrdinalPosition: 32,\r\n MidlineOrdinalPosition: 32\r\n }\r\n ];\r\n\r\n // Prepare map with FDI key\r\n var map = {};\r\n\r\n _.forEach(teeth, function (tooth) {\r\n map[tooth.FDI] = tooth;\r\n });\r\n\r\n return map;\r\n })\r\n\r\n .controller('TeethConverterController', function ($scope, gettext, teethMap, QUADRANT, SCHEME, EMPTY, uiLocalization) {\r\n\r\n initData();\r\n\r\n $scope.$watch('data', function (newVal, oldVal) {\r\n if (newVal !== oldVal) {\r\n initData();\r\n }\r\n });\r\n\r\n function initData() {\r\n $scope.teethRepresentationClass = '';\r\n\r\n // If teeth is null then return.\r\n if (_.isNull($scope.data) || _.isUndefined($scope.data)) {\r\n // no value at all\r\n $scope.teethRepresentation = EMPTY;\r\n return;\r\n }\r\n\r\n // -------------------------------------\r\n // Functions.\r\n // -------------------------------------\r\n var getToothLabel = function (tooth, scheme) {\r\n switch (scheme) {\r\n case SCHEME.UniversalScheme:\r\n return tooth.Universal;\r\n case SCHEME.PalmerScheme:\r\n return tooth.Palmer;\r\n default:\r\n return tooth.FDI;\r\n }\r\n };\r\n var getNumElements = function (data) {\r\n if (_.isNull(data.numelements) || _.isUndefined(data.numelements)) {\r\n return null;\r\n } else {\r\n var result = parseInt(data.numelements);\r\n return _.isNaN(result) ? null : result;\r\n }\r\n };\r\n // Get location (it depends on format of JSON data which was passed into controller)\r\n var getLocation = function (location) {\r\n // Standard JSON which was retrieved from xml2json function (now we get it from the test)\r\n if (location._ !== undefined) {\r\n return location._;\r\n }\r\n // JSON from OM server\r\n if (location['#text'] !== undefined) {\r\n return location['#text'];\r\n }\r\n return null;\r\n };\r\n // -------------------------------------\r\n\r\n // Parse the values for teeth and fill-in the list\r\n var valueList = [];\r\n if (!_.isNull($scope.data.teeth) && !_.isUndefined($scope.data.teeth) &&\r\n !_.isNull($scope.data.teeth.tooth) && !_.isUndefined($scope.data.teeth.tooth)) {\r\n\r\n // Use toJSON function of Kendo API to get js array if it necessary\r\n var teeth = _.isUndefined($scope.data.teeth.tooth.toJSON) ? $scope.data.teeth.tooth : $scope.data.teeth.tooth.toJSON();\r\n\r\n // Teeth array for iterating\r\n var teethList = $.isArray(teeth) ? teeth : [teeth];\r\n \r\n // Use the TeethMap to turn tooth numbers read from the XML data\r\n // into real teeth. We use the ordinal members of the TeethMap\r\n // to decide on how to sort the collection after we've converted it.\r\n _.forEach(teethList,\r\n function(tooth) {\r\n\r\n if (!_.isNull(tooth.location) && !_.isUndefined(tooth.location)) {\r\n\r\n // Map tooth to the TeethMap (if no tooth then return null)\r\n var mappedTooth = teethMap[getLocation(tooth.location)];\r\n\r\n if (!_.isUndefined(mappedTooth)) {\r\n valueList.push(mappedTooth);\r\n }\r\n }\r\n });\r\n }\r\n\r\n // If there are no teeth to show, use the 'numelements' node to simply show the number of elements.\r\n if (valueList.length === 0) {\r\n //Show at least number of elements if specified\r\n var numElements = getNumElements($scope.data);\r\n\r\n // no value\r\n if (_.isNull(numElements)) {\r\n $scope.teethRepresentation = EMPTY;\r\n } else {\r\n //Marking the string for translation to be picked up via 'gettext' call\r\n $scope.teethRepresentation = uiLocalization.translate(numElements > 1 ? gettext(\"%s units\") : gettext(\"%s unit\"), numElements);\r\n }\r\n return;\r\n }\r\n\r\n // -------------------------------------\r\n\r\n // Teeth scheme\r\n var toothNumberingScheme = $scope.numberingScheme.toLowerCase();\r\n\r\n // Determine the kind of sorting\r\n var sortbyMidlineOrdinal = toothNumberingScheme !== SCHEME.UniversalScheme;\r\n\r\n // If all the teeth are not in the same quadrant of the mouth, sort by the ordinal position\r\n // rather than the midline position - this ensures we don't end up with a range like\r\n // 11-22 for a 5 unit bridge spanning teeth 11,12,13,21,22 in the FDI numbering scheme\r\n var firstToothQuadrant = _.first(valueList).Quadrant;\r\n\r\n if (_.any(valueList, function (tooth) {\r\n return tooth.Quadrant != firstToothQuadrant;\r\n })) {\r\n sortbyMidlineOrdinal = false;\r\n }\r\n\r\n // Do sorting\r\n valueList = _.sortBy(valueList, function (tooth) {\r\n return sortbyMidlineOrdinal ? tooth.MidlineOrdinalPosition : tooth.OrdinalPosition;\r\n });\r\n\r\n //Still get the numElements value in case it was overriden and not match the teeth metadata collection\r\n var numElementsOverride = getNumElements($scope.data);\r\n\r\n // This code assumes that if we have a bridge restoration that the teeth specified\r\n // are consecutive. We assume that the data entry system (ie DentCAD has validated this).\r\n var first = _.first(valueList);\r\n var last = _.last(valueList);\r\n\r\n //Marking the string for translation to be picked up via 'gettext' call\r\n if (first.FDI === last.FDI && numElementsOverride && numElementsOverride === 1) {\r\n //Show the single tooth position if we have matching number of elements (teeth) specified\r\n $scope.teethRepresentation = uiLocalization.translate(\r\n gettext(\"1 unit, %s\"),\r\n getToothLabel(first, toothNumberingScheme)\r\n );\r\n } else {\r\n //Show the multiple teeth positions \r\n $scope.teethRepresentation = uiLocalization.translate(\r\n ((valueList && valueList.length > 1) || (numElementsOverride && numElementsOverride > 1) ? gettext(\"%s units, %s\") : gettext(\"%s unit, %s\")),\r\n (numElementsOverride ? numElementsOverride : valueList.length),\r\n _.str.sprintf('%s - %s', getToothLabel(first, toothNumberingScheme), getToothLabel(last, toothNumberingScheme))\r\n );\r\n\r\n $scope.teethRepresentationClass = numElementsOverride && numElementsOverride !== valueList.length ? 'error' : '';\r\n }\r\n }\r\n\r\n });\r\n","angular.module('common.directives.slideInBounce', [])\r\n\r\n .directive(\"slideInBounce\", function ($animate, $timeout) {\r\n return ({\r\n restrict: 'A',\r\n scope: {\r\n },\r\n link: function (scope, element, attrs) {\r\n var el = $(element);\r\n \r\n $timeout(function () {\r\n scope.$applyAsync(function () {\r\n\r\n el.stop(true, false);\r\n el.css('position', 'relative');\r\n el.css('opacity', 0);\r\n el.css(\"top\", -50); //initial offset (TODO: think on exporting as a parameter, as well as direction of animation)\r\n animateElement(el, 0, 400, \"easeOutBounce\"); // initial animation\r\n });\r\n }, 10);\r\n }\r\n });\r\n\r\n function animateElement(element, offset, duration, easing) {\r\n if (parseInt(offset) == null) {\r\n return;\r\n }\r\n\r\n element.stop(true, false);\r\n element.animate(\r\n {\r\n top: offset || 0,\r\n opacity: 1\r\n },\r\n duration || 400,\r\n easing || \"easeInOutExpo\",\r\n function () {\r\n \r\n });\r\n }\r\n }\r\n );\r\n","angular.module('common.directives.searchTermHighlight', [])\r\n\r\n .directive('searchTermHighlight', function ($timeout) {\r\n return {\r\n restrict: 'A',\r\n scope: { searchTermHighlight: '=' },\r\n link: function (scope, element, attrs) {\r\n\r\n var doHighlight = _.debounce(function (e) {\r\n $(element).unhighlight();\r\n\r\n if (!String.isNullOrWhiteSpace(e)) {\r\n $(element).highlight(e);\r\n } else {\r\n //$(element).unhighlight();\r\n }\r\n }, 300);\r\n\r\n var searchTermWatcher = scope.$watch('searchTermHighlight', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n doHighlight(newValue);\r\n }\r\n });\r\n\r\n scope.$on('$destroy', function () {\r\n if (searchTermWatcher) {\r\n searchTermWatcher();\r\n }\r\n });\r\n }\r\n };\r\n})\r\n","angular.module('common.directives.scrollIntoViewIf', [])\r\n\r\n .directive(\"scrollIntoViewIf\", function ($animate, $timeout) {\r\n return ({\r\n restrict: 'A',\r\n scope: {\r\n scrollIntoViewIf: '='\r\n },\r\n link: function (scope, element, attrs) {\r\n var el = $(element);\r\n\r\n scope.$watch('scrollIntoViewIf', function (newVal, oldVal) {\r\n if (newVal !== oldVal && newVal === true) {\r\n //Bring into view if it's not visible already\r\n if (!isElementInViewport(el[0])) {\r\n bringIntoViewWithTimeout();\r\n }\r\n }\r\n });\r\n\r\n bringIntoViewWithTimeout();\r\n\r\n function bringIntoViewWithTimeout() {\r\n $timeout(function () {\r\n var result = angular.isDefined(scope.scrollIntoViewIf) && scope.scrollIntoViewIf === true;\r\n if (angular.isDefined(result) && result === true) {\r\n scope.$applyAsync(function () {\r\n bringIntoView(el[0]);\r\n });\r\n }\r\n }, 100);\r\n }\r\n\r\n function isElementInViewport() {\r\n if (!el) return false;\r\n\r\n var rect = el[0].getBoundingClientRect();\r\n var elParent = el[0].parentElement;\r\n\r\n return rect.top >= 0 &&\r\n rect.left >= 0 &&\r\n rect.bottom <= (elParent.innerHeight || elParent.clientHeight) &&\r\n rect.right <= (elParent.innerWidth || elParent.clientWidth);\r\n }\r\n }\r\n });\r\n\r\n function bringIntoView(element) {\r\n element.scrollIntoView({ block: 'nearest' });\r\n }\r\n }\r\n );\r\n","angular.module('common.directives.recompile', [])\r\n\r\n // Magic directive for runtime templates recompilation. Use with care!\r\n //\r\n // Example:\r\n //\r\n // In template:\r\n //
    \r\n // //{{something to recompile}}...\r\n //
    \r\n //\r\n // In controller:\r\n // $scope.someBoolVarOnScope = true; for recompilation.\r\n .directive('recompile', function ($compile, $parse) {\r\n return {\r\n restrict: 'A',\r\n scope: true, // required to be able to clear watchers safely\r\n compile: function (el) {\r\n var template = angular.element('').append(el.clone()).html(); // source template as string, with some changes\r\n // is important thing. Don't know why, but it doesn't work without it...\r\n\r\n return function link(scope, $el, attrs) {\r\n var stopWatching = scope.$parent.$watch(attrs.recompile, function (newVal) {\r\n if (!newVal || newVal === 'false') {\r\n return;\r\n }\r\n\r\n $parse(attrs.recompile).assign(scope.$parent, false);\r\n\r\n // recompile\r\n var newEl = $compile(template)(scope.$parent);\r\n $el.replaceWith(newEl);\r\n\r\n // Destroy old scope, reassign new scope.\r\n stopWatching();\r\n scope.$destroy();\r\n });\r\n };\r\n }\r\n };\r\n })\r\n\r\n;\r\n","angular.module('common.directives.popupMap', [])\r\n\r\n .directive('popupMap', function ($document, $window, $compile) {\r\n return {\r\n restrict: 'A',\r\n scope: {\r\n mapWidth: '@mapWidth',\r\n mapHeight: '@mapHeight',\r\n mapTitle: '@mapTitle',\r\n mapCentreCoordinates: '=?mapCentreCoordinates',\r\n mapMarkers: '=?mapMarkers'\r\n }, \r\n controller: 'PopupMapController',\r\n controllerAs: 'PopupMapController',\r\n link: function (scope, element, attrs, parentCtrl) {\r\n if (!element || !element[0]) return;\r\n\r\n element.removeAttr('popup-map'); // necessary to avoid infinite compile loop\r\n\r\n //Compile original element with its scope\r\n var originalElementUpdated = $compile(element.outerHtml())(scope.$parent);\r\n\r\n //Replace the original element with the updated element with attached click handler to bring up the map window\r\n element.replaceWith(originalElementUpdated);\r\n\r\n angular.element(originalElementUpdated).on('click', scope.bringUpMapWindow);\r\n\r\n scope.mapWindowOptions = {\r\n title: scope.mapTitle,\r\n animation: om.config.kendoWindowDefaultOptions.animation,\r\n width: scope.mapWidth,\r\n height: scope.mapHeight,\r\n modal: true,\r\n visible: false,\r\n resizable: false,\r\n actions: [\"Close\"],\r\n deactivate: function (e) {\r\n if (scope.map) {\r\n scope.map.setTarget(null);\r\n scope.map = void 0;\r\n }\r\n }\r\n };\r\n\r\n //We are creating kendo window dynamically here instead of compiling it against the scope to avoid strange issues\r\n //when objects added to the DOM (i.e. hidden window) are rendered by angular to the page breaking the DOM even visually\r\n var mapWindowElement = $('#omMapWindow');\r\n if (!mapWindowElement || mapWindowElement.length === 0) {\r\n mapWindowElement = $('
    ' +\r\n '
    ' +\r\n + '
    ')\r\n .appendTo('body'); //Create DOM element to hold window\r\n\r\n mapWindowElement.kendoWindow(scope.mapWindowOptions); //Create kendo window object\r\n\r\n scope.omMapWindow = $(\"#omMapWindow\").data(\"kendoWindow\"); //Remember reference to the created kendo window object\r\n }\r\n \r\n scope.mapWindowElement = mapWindowElement;\r\n }\r\n };\r\n })\r\n\r\n .controller('PopupMapController', function ($scope, $element, $timeout) {\r\n\r\n _.extend($scope, {\r\n doMapResize: doMapResize,\r\n bringUpMapWindow: bringUpMapWindow\r\n });\r\n\r\n initController();\r\n\r\n function initController() {\r\n \r\n $scope.$on(\"$destroy\", function () {\r\n destroy();\r\n });\r\n }\r\n\r\n /**\r\n * Controller destructor\r\n */\r\n function destroy() {\r\n\r\n if ($scope.map) {\r\n $scope.map.setTarget(null);\r\n $scope.map = void 0;\r\n }\r\n if ($scope.omMapWindow) {\r\n $scope.omMapWindow.destroy();\r\n $scope.omMapWindow = void 0;\r\n }\r\n\r\n if ($scope.mapWindowElement) {\r\n $scope.mapWindowElement.remove();\r\n }\r\n }\r\n\r\n function bringUpMapWindow() {\r\n\r\n $scope.omMapWindow.title($scope.mapTitle);\r\n $scope.omMapWindow.center().open();\r\n\r\n mapInitInternal();\r\n\r\n $timeout(function () {\r\n $scope.map.updateSize();\r\n });\r\n }\r\n\r\n function getAccentColor() {\r\n var defaultColor = '#32A9D9'; //default OM accent color\r\n\r\n if ($scope.omMapWindow) {\r\n //Get the om-map css applied color, which is compiled from less current theme's accent color\r\n var omMapContainerDiv = $scope.omMapWindow.element.find('.om-map');\r\n\r\n return omMapContainerDiv && omMapContainerDiv.length > 0 ? omMapContainerDiv.css('color') : defaultColor;\r\n }\r\n\r\n return defaultColor;\r\n }\r\n\r\n function mapInitInternal() {\r\n var markers = [];\r\n\r\n if ($scope.mapMarkers && $scope.mapMarkers.length > 0) {\r\n markers = _.map(_.filter($scope.mapMarkers, function (mm) { return mm !== null; }),\r\n function(place) {\r\n return new ol.Feature({\r\n geometry: new ol.geom.Point(ol.proj.fromLonLat([place.lon, place.lat]))\r\n });\r\n });\r\n }\r\n\r\n var tileLayer = new ol.layer.Tile({\r\n source: new ol.source.OSM()\r\n });\r\n\r\n var vectorLayer = new ol.layer.Vector({\r\n source: new ol.source.Vector({\r\n features: markers\r\n }),\r\n style: new ol.style.Style({\r\n image: new ol.style.Icon({\r\n scale: 0.2,\r\n anchor: [0.5, 0],\r\n anchorOrigin: 'bottom-left',\r\n anchorXUnits: 'fraction',\r\n anchorYUnits: 'fraction',\r\n src: 'assets/images/map-marker.png',\r\n color: getAccentColor()\r\n })\r\n })\r\n });\r\n\r\n var firstMarker = $scope.mapMarkers && $scope.mapMarkers.length > 0 ? $scope.mapMarkers[0] : null;\r\n var mapView = new ol.View({\r\n center: firstMarker ? ol.proj.fromLonLat([firstMarker.lon, firstMarker.lat]) : ol.proj.fromLonLat([0, 50]),\r\n zoom: firstMarker ? 17 : 0\r\n });\r\n\r\n //Create map if not created yet\r\n if (!$scope.map) {\r\n var attribution = new ol.control.Attribution({ collapsible: false });\r\n\r\n\r\n $scope.map = new ol.Map({\r\n target: 'om-map',\r\n controls: ol.control.defaults.defaults({ attribution: false }).extend([attribution]),\r\n constrainResolution: true\r\n });\r\n } \r\n\r\n $scope.map.addLayer(tileLayer);\r\n $scope.map.addLayer(vectorLayer);\r\n\r\n //Set map view\r\n $scope.map.setView(mapView);\r\n }\r\n \r\n function doMapResize() {\r\n //TODO: Add implementation to resize map in case modal map window is resizable\r\n }\r\n })\r\n;\r\n","angular.module('common.directives.omStatCounter', [])\r\n\r\n .directive('omStatCounter', function ($window) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'common/directives/omStatCounter/omStatCounter.html',\r\n scope: {\r\n value: '@'\r\n }, \r\n controller: 'OmStatCounterController',\r\n link: {\r\n pre: function preLink(scope, element, attrs, ctrl) {\r\n //use this when necessary to force the counter to spin even if the odometer control receives non zero value right from the very beginning\r\n //scope.value = 0;\r\n\r\n //Init the odometer control\r\n var odo = new Odometer({\r\n el: element[0],\r\n value: scope.value,\r\n format: 'd',\r\n duration: 200,\r\n theme: 'default',\r\n hideLeadingZeros: true\r\n });\r\n },\r\n post: function postLink(scope, element, attrs, ctrl) {\r\n var odoWatcherDestructor;\r\n var containerElem = element[0];\r\n\r\n scope.showOdometer = scope.value !== '';\r\n\r\n //init watcher\r\n odoWatcherDestructor = scope.$watch('value', function (newVal, oldVal) {\r\n scope.showOdometer = newVal !== '';\r\n\r\n containerElem.innerHTML = newVal;\r\n });\r\n\r\n scope.$on(\"$destroy\", function () {\r\n if (odoWatcherDestructor) {\r\n odoWatcherDestructor();\r\n }\r\n });\r\n }\r\n }\r\n };\r\n })\r\n\r\n .controller('OmStatCounterController', function ($scope, $element, $timeout) {\r\n \r\n init();\r\n\r\n function init() {\r\n\r\n \r\n }\r\n })\r\n;\r\n","angular.module('common.directives.omSpinner', [])\r\n\r\n // OrderManager loading spinner directive\r\n .directive('omSpinner', function () {\r\n return {\r\n restrict: 'AEC',\r\n templateUrl: 'common/directives/omSpinner/omSpinner.html',\r\n scope: {\r\n size: '@',\r\n type: '@'\r\n },\r\n controller: 'OmSpinnerController'\r\n };\r\n })\r\n\r\n .controller('OmSpinnerController', function ($scope, $element, $window, $interval, customResourceResolver) {\r\n\r\n getSpinnerConfig();\r\n\r\n function getSpinnerConfig() {\r\n return customResourceResolver.resolveConfig(\"spinner-config\", null)\r\n .then(function(spinnerConfig) {\r\n if(spinnerConfig) {\r\n $scope.type = spinnerConfig.type;\r\n }\r\n });\r\n }\r\n })\r\n;\r\n","angular.module('common.directives.omNumericTextBox', [])\r\n .directive('omNumericTextBox', function ($compile, $interpolate) {\r\n //We need a custom directive to wrap kendo-numeric-text-box directive\r\n //to overcome the issues of the kendo creature.\r\n //There is an issue with it as it expects the placeholder to be expression,\r\n //thus, we need to put single quotes around any text content we put into placeholder.\r\n //Also it emits internally second input to show value and uses original input to edit value.\r\n //Therefore the titles and placeholders of those inputs are different as the values are \r\n //evaluated at different point in time.\r\n //\r\n //So we create our wrapper directive, compile it from template where we assign all the\r\n //properties assigned to our directive to the underlying kendo directive with necessary\r\n //fixes to overcome its issues to not to force user (application engineer) to do that.\r\n return {\r\n priority: 2000,\r\n restrict: 'AE',\r\n terminal: true,\r\n scope: false,\r\n compile: function compile(element, attrs) {\r\n //Creating input to assign kendo directive to\r\n var input = $(\"\").attr('kendo-numeric-text-box', '');\r\n //Transfer all properties applied to the this input from our directive\r\n //skipping placeholder as it needs to be treated in different manner\r\n angular.forEach(attrs, function (value, name) {\r\n if (!_.string.startsWith(name, '$') && name != 'placeholder') {\r\n input.attr(attrs.$attr[name], $interpolate(value));\r\n }\r\n });\r\n //Set kendo placeholder via kendo options object\r\n input.attr(\"k-options\", \"{placeholder:'\" + attrs.placeholder + \"'}\");\r\n\r\n //In order to make our focus directive that allows barcode scanners support\r\n //to be able to focus/select the real input to enter new value, we have to\r\n //catch the situation when 'focus' directive tries to focus our directive's \r\n //root container where it ('focus') was intially applied. And when we catch\r\n //that, we have to find the 'visible' input that kendo uses to show value,\r\n //and focus it. And after that kendo internally will hide it, show input\r\n //for entering values and focuses it. \r\n //Kendo magic, sad but true.\r\n input.on(\"select\", function () {\r\n input.siblings(\"input:visible\").focus();\r\n });\r\n\r\n //And finally for the kendo directive to be able to compile and build its DOM to\r\n //incorporate it around our input we created above, we need to put that input\r\n //into some container. Otherwise kendo directive will just not finish its compile routine.\r\n var inputContainer = $(\"
    \").append(input);\r\n\r\n //Actually do compile.\r\n var cmp = $compile(inputContainer);\r\n\r\n //And return a link function inside which we append the resulted element to our directive's \r\n //container.\r\n return function postLink(scope, element, attrs, controller) {\r\n element.append(cmp(scope));\r\n }\r\n }\r\n };\r\n });","angular.module('common.directives.omDatePicker', [])\r\n .directive('omDatePicker', function ($compile, $interpolate) {\r\n //We need a custom directive to wrap kendo-date-picker directive\r\n //to overcome the issues of the kendo creature.\r\n //\r\n //So we create our wrapper directive, compile it from template where we assign all the\r\n //properties assigned to our directive to the underlying kendo directive with necessary\r\n //fixes to overcome its issues to not to force user (application engineer) to do that.\r\n return {\r\n priority: 2000,\r\n restrict: 'AE',\r\n terminal: true,\r\n scope: false,\r\n compile: function compile(element, attrs) {\r\n //Creating input to assign kendo directive to\r\n var input = $(\"\").attr('kendo-date-picker', '');\r\n //Transfer all properties applied to the this input from our directive\r\n //skipping placeholder as it needs to be treated in different manner\r\n angular.forEach(attrs, function (value, name) {\r\n if (!_.string.startsWith(name, '$')) {\r\n input.attr(attrs.$attr[name], $interpolate(value));\r\n }\r\n });\r\n\r\n //And finally for the kendo directive to be able to compile and build its DOM to\r\n //incorporate it around our input we created above, we need to put that input\r\n //into some container. Otherwise kendo directive will just not finish its compile routine.\r\n var inputContainer = $(\"
    \").append(input);\r\n\r\n //Actually do compile.\r\n var cmp = $compile(inputContainer);\r\n\r\n //And return a link function inside which we append the resulted element to our directive's \r\n //container.\r\n return function postLink(scope, element, attrs, controller) {\r\n element.append(cmp(scope));\r\n }\r\n }\r\n };\r\n });","// # Angular-Inview\r\n// - Author: [Nicola Peduzzi](https://github.com/thenikso)\r\n// - Repository: https://github.com/thenikso/angular-inview\r\n// - Install with: `npm install angular-inview`\r\n// - Version: **3.0.0**\r\n(function () {\r\n 'use strict';\r\n\r\n // An [angular.js](https://angularjs.org) directive to evaluate an expression if\r\n // a DOM element is or not in the current visible browser viewport.\r\n // Use it in your AngularJS app by including the javascript and requireing it:\r\n //\r\n // `angular.module('myApp', ['angular-inview'])`\r\n var moduleName = 'common.directives.inView';\r\n angular.module(moduleName, [])\r\n\r\n // ## in-view directive\r\n //\r\n // ### Usage\r\n // ```html\r\n // \r\n // ```\r\n .directive('inView', ['$parse', inViewDirective])\r\n\r\n // ## in-view-container directive\r\n .directive('inViewContainer', inViewContainerDirective);\r\n\r\n // ## Implementation\r\n function inViewDirective($parse) {\r\n return {\r\n // Evaluate the expression passed to the attribute `in-view` when the DOM\r\n // element is visible in the viewport.\r\n restrict: 'A',\r\n require: '?^^inViewContainer',\r\n link: function inViewDirectiveLink(scope, element, attrs, container) {\r\n // in-view-options attribute can be specified with an object expression\r\n // containing:\r\n // - `offset`: An array of values to offset the element position.\r\n // Offsets are expressed as arrays of 4 numbers [top, right, bottom, left].\r\n // Like CSS, you can also specify only 2 numbers [top/bottom, left/right].\r\n // Instead of numbers, some array elements can be a string with a percentage.\r\n // Positive numbers are offsets outside the element rectangle and\r\n // negative numbers are offsets to the inside.\r\n // - `viewportOffset`: Like the element offset but appied to the viewport.\r\n // - `generateDirection`: Indicate if the `direction` information should\r\n // be included in `$inviewInfo` (default false).\r\n // - `generateParts`: Indicate if the `parts` information should\r\n // be included in `$inviewInfo` (default false).\r\n // - `throttle`: Specify a number of milliseconds by which to limit the\r\n // number of incoming events.\r\n var options = {};\r\n if (attrs.inViewOptions) {\r\n options = scope.$eval(attrs.inViewOptions);\r\n }\r\n if (options.offset) {\r\n options.offset = normalizeOffset(options.offset);\r\n }\r\n if (options.viewportOffset) {\r\n options.viewportOffset = normalizeOffset(options.viewportOffset);\r\n }\r\n\r\n // Build reactive chain from an initial event\r\n var viewportEventSignal = signalSingle({type: 'initial'})\r\n\r\n // Merged with the window events\r\n .merge(signalFromEvent(window, 'checkInView click ready wheel mousewheel DomMouseScroll MozMousePixelScroll resize scroll touchmove mouseup keydown'))\r\n\r\n // Merge with container's events signal\r\n if (container) {\r\n viewportEventSignal = viewportEventSignal.merge(container.eventsSignal);\r\n }\r\n\r\n // Throttle if option specified\r\n if (options.throttle) {\r\n viewportEventSignal = viewportEventSignal.throttle(options.throttle);\r\n }\r\n\r\n // Map to viewport intersection and in-view informations\r\n var inviewInfoSignal = viewportEventSignal\r\n\r\n // Inview information structure contains:\r\n // - `inView`: a boolean value indicating if the element is\r\n // visible in the viewport;\r\n // - `changed`: a boolean value indicating if the inview status\r\n // changed after the last event;\r\n // - `event`: the event that initiated the in-view check;\r\n .map(function (event) {\r\n var viewportRect;\r\n if (container) {\r\n viewportRect = container.getViewportRect();\r\n // TODO merge with actual window!\r\n } else {\r\n viewportRect = getViewportRect();\r\n }\r\n viewportRect = offsetRect(viewportRect, options.viewportOffset);\r\n var elementRect = offsetRect(element[0].getBoundingClientRect(), options.offset);\r\n var isVisible = !!(element[0].offsetWidth || element[0].offsetHeight || element[0].getClientRects().length);\r\n var info = {\r\n inView: isVisible && intersectRect(elementRect, viewportRect),\r\n event: event,\r\n element: element,\r\n elementRect: elementRect,\r\n viewportRect: viewportRect\r\n };\r\n // Add inview parts\r\n if (options.generateParts && info.inView) {\r\n info.parts = {};\r\n info.parts.top = elementRect.top >= viewportRect.top;\r\n info.parts.left = elementRect.left >= viewportRect.left;\r\n info.parts.bottom = elementRect.bottom <= viewportRect.bottom;\r\n info.parts.right = elementRect.right <= viewportRect.right;\r\n }\r\n return info;\r\n })\r\n\r\n // Add the changed information to the inview structure.\r\n .scan({}, function (lastInfo, newInfo) {\r\n // Add inview direction info\r\n if (options.generateDirection && newInfo.inView && lastInfo.elementRect) {\r\n newInfo.direction = {\r\n horizontal: newInfo.elementRect.left - lastInfo.elementRect.left,\r\n vertical: newInfo.elementRect.top - lastInfo.elementRect.top\r\n };\r\n }\r\n // Calculate changed flag\r\n newInfo.changed =\r\n newInfo.inView !== lastInfo.inView ||\r\n !angular.equals(newInfo.parts, lastInfo.parts) ||\r\n !angular.equals(newInfo.direction, lastInfo.direction);\r\n return newInfo;\r\n })\r\n\r\n // Filters only informations that should be forwarded to the callback\r\n .filter(function (info) {\r\n // Don't forward if no relevant infomation changed\r\n if (!info.changed) {\r\n return false;\r\n }\r\n // Don't forward if not initially in-view\r\n if (info.event.type === 'initial' && !info.inView) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n // Execute in-view callback\r\n var inViewExpression = $parse(attrs.inView);\r\n var dispose = inviewInfoSignal.subscribe(function (info) {\r\n scope.$applyAsync(function () {\r\n inViewExpression(scope, {\r\n '$inview': info.inView,\r\n '$inviewInfo': info\r\n });\r\n });\r\n });\r\n\r\n // Dispose of reactive chain\r\n scope.$on('$destroy', dispose);\r\n }\r\n }\r\n }\r\n\r\n function inViewContainerDirective() {\r\n return {\r\n restrict: 'A',\r\n controller: ['$element', function ($element) {\r\n this.element = $element;\r\n this.eventsSignal = signalFromEvent($element, 'scroll');\r\n this.getViewportRect = function () {\r\n return $element[0].getBoundingClientRect();\r\n };\r\n }]\r\n }\r\n }\r\n\r\n // ## Utilities\r\n\r\n function getViewportRect() {\r\n var result = {\r\n top: 0,\r\n left: 0,\r\n width: window.innerWidth,\r\n right: window.innerWidth,\r\n height: window.innerHeight,\r\n bottom: window.innerHeight\r\n };\r\n if (result.height) {\r\n return result;\r\n }\r\n var mode = document.compatMode;\r\n if (mode === 'CSS1Compat') {\r\n result.width = result.right = document.documentElement.clientWidth;\r\n result.height = result.bottom = document.documentElement.clientHeight;\r\n } else {\r\n result.width = result.right = document.body.clientWidth;\r\n result.height = result.bottom = document.body.clientHeight;\r\n }\r\n return result;\r\n }\r\n\r\n function intersectRect(r1, r2) {\r\n return !(r2.left > r1.right ||\r\n r2.right < r1.left ||\r\n r2.top > r1.bottom ||\r\n r2.bottom < r1.top);\r\n }\r\n\r\n function normalizeOffset(offset) {\r\n if (!angular.isArray(offset)) {\r\n return [offset, offset, offset, offset];\r\n }\r\n if (offset.length == 2) {\r\n return offset.concat(offset);\r\n } else if (offset.length == 3) {\r\n return offset.concat([offset[1]]);\r\n }\r\n return offset;\r\n }\r\n\r\n function offsetRect(rect, offset) {\r\n if (!offset) {\r\n return rect;\r\n }\r\n var offsetObject = {\r\n top: isPercent(offset[0]) ? (parseFloat(offset[0]) * rect.height / 100) : offset[0],\r\n right: isPercent(offset[1]) ? (parseFloat(offset[1]) * rect.width / 100) : offset[1],\r\n bottom: isPercent(offset[2]) ? (parseFloat(offset[2]) * rect.height / 100) : offset[2],\r\n left: isPercent(offset[3]) ? (parseFloat(offset[3]) * rect.width / 100) : offset[3]\r\n };\r\n // Note: ClientRect object does not allow its properties to be written to therefore a new object has to be created.\r\n return {\r\n top: rect.top - offsetObject.top,\r\n left: rect.left - offsetObject.left,\r\n bottom: rect.bottom + offsetObject.bottom,\r\n right: rect.right + offsetObject.right,\r\n height: rect.height + offsetObject.top + offsetObject.bottom,\r\n width: rect.width + offsetObject.left + offsetObject.right\r\n };\r\n }\r\n\r\n function isPercent(n) {\r\n return angular.isString(n) && n.indexOf('%') > 0;\r\n }\r\n\r\n // ## QuickSignal FRP\r\n // A quick and dirty implementation of Rx to have a streamlined code in the\r\n // directives.\r\n\r\n // ### QuickSignal\r\n //\r\n // - `didSubscribeFunc`: a function receiving a `subscriber` as described below\r\n //\r\n // Usage:\r\n // var mySignal = new QuickSignal(function(subscriber) { ... })\r\n function QuickSignal(didSubscribeFunc) {\r\n this.didSubscribeFunc = didSubscribeFunc;\r\n }\r\n\r\n // Subscribe to a signal and consume the steam of data.\r\n //\r\n // Returns a function that can be called to stop the signal stream of data and\r\n // perform cleanup.\r\n //\r\n // A `subscriber` is a function that will be called when a new value arrives.\r\n // a `subscriber.$dispose` property can be set to a function to be called uppon\r\n // disposal. When setting the `$dispose` function, the previously set function\r\n // should be chained.\r\n QuickSignal.prototype.subscribe = function (subscriber) {\r\n this.didSubscribeFunc(subscriber);\r\n var dispose = function () {\r\n if (subscriber.$dispose) {\r\n subscriber.$dispose();\r\n subscriber.$dispose = null;\r\n }\r\n }\r\n return dispose;\r\n }\r\n\r\n QuickSignal.prototype.map = function (f) {\r\n var s = this;\r\n return new QuickSignal(function (subscriber) {\r\n subscriber.$dispose = s.subscribe(function (nextValue) {\r\n subscriber(f(nextValue));\r\n });\r\n });\r\n };\r\n\r\n QuickSignal.prototype.filter = function (f) {\r\n var s = this;\r\n return new QuickSignal(function (subscriber) {\r\n subscriber.$dispose = s.subscribe(function (nextValue) {\r\n if (f(nextValue)) {\r\n subscriber(nextValue);\r\n }\r\n });\r\n });\r\n };\r\n\r\n QuickSignal.prototype.scan = function (initial, scanFunc) {\r\n var s = this;\r\n return new QuickSignal(function (subscriber) {\r\n var last = initial;\r\n subscriber.$dispose = s.subscribe(function (nextValue) {\r\n last = scanFunc(last, nextValue);\r\n subscriber(last);\r\n });\r\n });\r\n }\r\n\r\n QuickSignal.prototype.merge = function (signal) {\r\n return signalMerge(this, signal);\r\n };\r\n\r\n QuickSignal.prototype.throttle = function (threshhold) {\r\n var s = this, last, deferTimer;\r\n return new QuickSignal(function (subscriber) {\r\n var chainDisposable = s.subscribe(function () {\r\n var now = +new Date,\r\n args = arguments;\r\n if (last && now < last + threshhold) {\r\n clearTimeout(deferTimer);\r\n deferTimer = setTimeout(function () {\r\n last = now;\r\n subscriber.apply(null, args);\r\n }, threshhold);\r\n } else {\r\n last = now;\r\n subscriber.apply(null, args);\r\n }\r\n });\r\n subscriber.$dispose = function () {\r\n clearTimeout(deferTimer);\r\n if (chainDisposable) chainDisposable();\r\n };\r\n });\r\n };\r\n\r\n function signalMerge() {\r\n var signals = arguments;\r\n return new QuickSignal(function (subscriber) {\r\n var disposables = [];\r\n for (var i = signals.length - 1; i >= 0; i--) {\r\n disposables.push(signals[i].subscribe(function () {\r\n subscriber.apply(null, arguments);\r\n }));\r\n }\r\n subscriber.$dispose = function () {\r\n for (var i = disposables.length - 1; i >= 0; i--) {\r\n if (disposables[i]) disposables[i]();\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Returns a signal from DOM events of a target.\r\n function signalFromEvent(target, event) {\r\n return new QuickSignal(function (subscriber) {\r\n var handler = function (e) {\r\n subscriber(e);\r\n };\r\n var el = angular.element(target);\r\n event.split(' ').map(function (e) {\r\n el[0].addEventListener(e, handler, true);\r\n });\r\n subscriber.$dispose = function () {\r\n event.split(' ').map(function (e) {\r\n el[0].removeEventListener(e, handler, true);\r\n });\r\n };\r\n });\r\n }\r\n\r\n function signalSingle(value) {\r\n return new QuickSignal(function (subscriber) {\r\n setTimeout(function () {\r\n subscriber(value);\r\n });\r\n });\r\n }\r\n\r\n // Module loaders exports\r\n if (typeof define === 'function' && define.amd) {\r\n define(['angular'], moduleName);\r\n } else if (typeof module !== 'undefined' && module && module.exports) {\r\n module.exports = moduleName;\r\n }\r\n\r\n})();\r\n","angular.module('common.directives.omAutocomplete', [])\r\n .directive('omAutocomplete', function ($compile, $interpolate) {\r\n //We need a custom directive to wrap kendo-autocomplete directive\r\n //to overcome the issues of the kendo creature.\r\n //There is an issue with it as it expects the placeholder to be expression,\r\n //thus, we need to put single quotes around any text content we put into placeholder.\r\n //Also it emits internally second input to show value and uses original input to edit value.\r\n //Therefore the titles and placeholders of those inputs are different as the values are \r\n //evaluated at different point in time.\r\n //\r\n //So we create our wrapper directive, compile it from template where we assign all the\r\n //properties assigned to our directive to the underlying kendo directive with necessary\r\n //fixes to overcome its issues to not to force user (application engineer) to do that.\r\n return {\r\n priority: 2000,\r\n restrict: 'AE',\r\n terminal: true,\r\n scope: false,\r\n compile: function compile(element, attrs) {\r\n //Creating input to assign kendo directive to\r\n var input = $(\"\").attr('kendo-autocomplete', '');\r\n //Transfer all properties applied to the this input from our directive\r\n //skipping placeholder as it needs to be treated in different manner\r\n angular.forEach(attrs, function (value, name) {\r\n if (!_.string.startsWith(name, '$') && name != 'placeholder') {\r\n input.attr(attrs.$attr[name], $interpolate(value));\r\n }\r\n });\r\n //Set kendo placeholder via kendo options object\r\n input.attr(\"k-options\", \"{placeholder:'\" + attrs.placeholder + \"'}\");\r\n\r\n //And finally for the kendo directive to be able to compile and build its DOM to\r\n //incorporate it around our input we created above, we need to put that input\r\n //into some container. Otherwise kendo directive will just not finish its compile routine.\r\n var inputContainer = $(\"
    \").append(input);\r\n\r\n //Actually do compile.\r\n var cmp = $compile(inputContainer);\r\n\r\n //And return a link function inside which we append the resulted element to our directive's \r\n //container.\r\n return function postLink(scope, element, attrs, controller) {\r\n element.append(cmp(scope));\r\n }\r\n }\r\n };\r\n });","angular.module('common.directives.meshViewer', [])\r\n\r\n .directive('meshViewer', function ($window) {\r\n return {\r\n restrict: 'E',\r\n templateUrl: 'common/directives/meshViewer/meshViewer.html',\r\n scope: {\r\n boundingBoxColor: '@',\r\n sceneBackgroundColor: '@',\r\n noFog: '@',\r\n fogFar: '@',\r\n forNear: '@',\r\n gridSize: '@'\r\n }, // TODO передовать меши через скоуп, в массиве, но обязательно чистить его.\r\n controller: 'MeshViewerController',\r\n link: function (scope, element, attrs) {\r\n angular.element($window).bind('resize', function () {\r\n\r\n scope.doResize(); //trigger resize handler in case the overall browser window was resized,\r\n //so handler inside will set the renderer's canvas height/width to the actual height/width of its parent\r\n\r\n // manuall $digest required as resize event\r\n // is outside of angular\r\n scope.$digest();\r\n });\r\n }\r\n };\r\n })\r\n\r\n .controller('MeshViewerController', function ($scope, $element, meshViewerDataService) {\r\n\r\n var bBoxColor = $scope.boundingBoxColor || 'ffff00';\r\n bBoxColor = bBoxColor.replace('#', '');\r\n\r\n var sceneBackColor = $scope.sceneBackgroundColor || 'e0e0e0';\r\n sceneBackColor = sceneBackColor.replace('#', '');\r\n\r\n var config = {\r\n drawBoundingBoxes: true,\r\n boundingBoxColor: Number('0x' + bBoxColor),\r\n drawGrid: true,\r\n drawAxes: true,\r\n alignAxeIndex: 0, // 0 - x, 1 - y, 2 - z\r\n alignOffset: 20,\r\n\r\n // TODO lights\r\n // TODO materials\r\n };\r\n\r\n\r\n var grid;\r\n var scene;\r\n var camera;\r\n var controls; // Orbit Controls to control camera by mouse\r\n var renderer;\r\n var destructing = false;\r\n var sceneObjects = [];\r\n var boundingBoxHelpers = [];\r\n\r\n /**\r\n * Renderer width\r\n */\r\n var width;\r\n\r\n /**\r\n * Renderer height\r\n */\r\n var height;\r\n\r\n /**\r\n * Container DOM element for Three.js renderer\r\n */\r\n var $containerElem;\r\n\r\n /**\r\n * Id returned by requestAnimationFrame function\r\n */\r\n var animationFrameId;\r\n\r\n init();\r\n\r\n function init() {\r\n $containerElem = $(\"#om-mesh-viewer-container\");\r\n initThreeJs();\r\n\r\n $containerElem.resize(function () { // on resize event\r\n resizeCanvasToDisplaySize();\r\n });\r\n $scope.doResize = resizeCanvasToDisplaySize;\r\n\r\n meshViewerDataService.init();\r\n meshViewerDataService.onGeometriesAdd(function (newGeometries) {\r\n if (newGeometries && newGeometries.length > 0) {\r\n addGeometries(newGeometries);\r\n }\r\n });\r\n meshViewerDataService.onGeometriesClear(function () {\r\n clearGeometries();\r\n });\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n destroy();\r\n });\r\n }\r\n\r\n /**\r\n * Controller destructor\r\n */\r\n function destroy() {\r\n // stop animation\r\n destructing = true;\r\n if (animationFrameId != null && cancelAnimationFrame) {\r\n cancelAnimationFrame(animationFrameId);\r\n }\r\n\r\n meshViewerDataService.destroy();\r\n\r\n clearGeometries();\r\n\r\n // renderer.domElement.addEventListener('dblclick', null, false); // remove listener to render\r\n if (controls && controls.dispose) {\r\n controls.dispose();\r\n }\r\n if (scene && scene.dispose) {\r\n scene.dispose();\r\n }\r\n if (renderer && renderer.dispose) {\r\n renderer.dispose();\r\n }\r\n\r\n scene = null;\r\n camera = null;\r\n controls = null;\r\n renderer = null;\r\n\r\n $containerElem.empty();\r\n }\r\n\r\n /**\r\n * Init three.js stuff\r\n */\r\n function initThreeJs() {\r\n if (renderer !== undefined && renderer != null) {\r\n return;\r\n }\r\n\r\n // Init renderer\r\n renderer = new THREE.WebGLRenderer({antialias: true, alpha: true});\r\n renderer.setPixelRatio(window.devicePixelRatio);\r\n width = $containerElem.width();\r\n height = $containerElem.height();\r\n renderer.setSize(width, height);\r\n $containerElem.append(renderer.domElement);\r\n\r\n // Init scene\r\n scene = new THREE.Scene();\r\n scene.background = new THREE.Color(Number('0x' + sceneBackColor));\r\n\r\n if (!(angular.isDefined($scope.noFog) && $scope.noFog === true)) {\r\n //Set default fog for the scene\r\n scene.fog = new THREE.Fog(Number('0x' + sceneBackColor), Number($scope.fogNear || 100), Number($scope.fogFar || 200));\r\n }\r\n\r\n // Helpers\r\n if (config.drawAxes) {\r\n scene.add(new THREE.AxesHelper(100));\r\n }\r\n\r\n // Lights\r\n addLightsToScene();\r\n\r\n // Init camera (camera near and far clipping planes will updated later after all geometries added)\r\n camera = new THREE.PerspectiveCamera(45, width / height, 1, 4000);\r\n\r\n // Init orbiting with mouse control\r\n initOrbitControls();\r\n\r\n camera.position.set(2, 2, 1);\r\n controls.update(); // update() must be called after any manual changes to the camera's transform\r\n\r\n animationFrameId = requestAnimationFrame(animate);\r\n }\r\n\r\n function addLightsToScene() {\r\n //Ambient light first to make the models looks more volumetric\r\n scene.add(new THREE.AmbientLight(0x3D3A2A));\r\n\r\n //And two opposite directional lights to cast some shadows\r\n var directionalLights = [\r\n {position: {x: 400, y: 400, z: 100}, color: 0xC1A87D, intensity: 0.9},\r\n {position: {x: -400, y: -400, z: -100}, color: 0xC1A87D, intensity: 0.9}\r\n ];\r\n\r\n directionalLights.forEach(function (ld) {\r\n var dirLight = new THREE.DirectionalLight(ld.color, ld.intensity);\r\n dirLight.position.set(ld.position.x, ld.position.y, ld.position.z);\r\n dirLight.castShadow = true;\r\n dirLight.shadow.camera.near = 1;\r\n dirLight.shadow.camera.far = 50;\r\n //dirLight.shadow.bias = -0.001;\r\n\r\n dirLight.shadow.camera.right = 1;\r\n dirLight.shadow.camera.left = -1;\r\n dirLight.shadow.camera.top = 1;\r\n dirLight.shadow.camera.bottom = -1;\r\n\r\n dirLight.shadow.mapSize.width = 1024;\r\n dirLight.shadow.mapSize.height = 1024;\r\n scene.add(dirLight);\r\n });\r\n }\r\n\r\n function initOrbitControls() {\r\n // https://threejs.org/docs/#examples/controls/OrbitControls\r\n controls = new THREE.OrbitControls(camera, renderer.domElement);\r\n\r\n // Damping (inertia), which can be used to give a sense of weight to the controls.\r\n controls.enableDamping = true;\r\n controls.dampingFactor = 0.6;\r\n\r\n controls.enableKeys = true; // keyboard controls\r\n controls.enableZoom = true;\r\n controls.enablePan = true;\r\n controls.enableRotate = true;\r\n }\r\n\r\n /**\r\n * Animate infinite loop\r\n * @param {number} [time] A DOMHighResTimeStamp similar to the one returned by performance.now(), indicating\r\n * the point in time when requestAnimationFrame() starts to execute callback functions\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMHighResTimeStamp\r\n */\r\n function animate(time) {\r\n if (destructing === true) {\r\n return;\r\n }\r\n controls.update(); // required if controls.enableDamping or controls.autoRotate are set to true\r\n renderer.render(scene, camera);\r\n animationFrameId = requestAnimationFrame(animate);\r\n }\r\n\r\n /**\r\n * Function to resize canvas. Should be called if container size was changed\r\n */\r\n function resizeCanvasToDisplaySize() {\r\n\r\n if (!renderer || !renderer.domElement) {\r\n return;\r\n }\r\n\r\n var container = renderer.domElement.parentElement;\r\n if (!container) {\r\n return;\r\n }\r\n\r\n width = container.clientWidth;\r\n height = container.clientHeight;\r\n camera.aspect = width / height;\r\n camera.updateProjectionMatrix();\r\n renderer.setSize(width, height);\r\n // renderer.setSize(width, height, false);\r\n\r\n // TODO update any render target sizes here\r\n }\r\n\r\n /**\r\n * Add new mesh to scene\r\n * @param {Array} geometries list of arrays\r\n */\r\n function addGeometries(geometries) {\r\n for (var i = 0; i < geometries.length; i++) {\r\n var geometry = geometries[i];\r\n var box;\r\n\r\n if (geometry instanceof THREE.BufferGeometry) {\r\n var materials = [];\r\n var hasColors = geometry.hasColors;\r\n var alpha = geometry.alpha;\r\n\r\n //Delete all normals first so we can merge vertices at the same positions\r\n geometry.deleteAttribute('normal');\r\n\r\n //Merge vertices at the same positions (depending on tolerance) taking into account colors (by merging them)\r\n geometry = mergeVertices(geometry);\r\n\r\n //Compute normals\r\n geometry.computeVertexNormals();\r\n\r\n //And finally make it smoother\r\n geometry = THREE.BufferGeometryUtils.toCreasedNormals(geometry, 45);\r\n geometry.hasColors = hasColors;\r\n geometry.alpha = alpha;\r\n\r\n if (geometry.hasColors) {\r\n materials.push(new THREE.MeshPhongMaterial({ opacity: geometry.alpha, vertexColors: true, side: THREE.DoubleSide }));\r\n } else {\r\n materials = [\r\n new THREE.MeshPhongMaterial({ color: 0xaba069, shininess: 30, emissive: 0x806a5b, specular: 0x111111, side: THREE.FrontSide }),\r\n new THREE.MeshPhongMaterial({ color: 0x7C6838, shininess: 30, emissive: 0x843A1F, specular: 0x111111, side: THREE.BackSide })\r\n ];\r\n }\r\n\r\n //Create mesh and assign faces the proper material index for the front and back side of the faces\r\n var mesh = new THREE.Mesh(geometry, materials[0]);\r\n\r\n //If geometry has no colors and we have created two colors for front and back side faces, create a mesh to render inner faces\r\n //We do it explicitly here cause we have a BufferGeometry without faces in it\r\n if (!geometry.hasColors && materials.length > 1) {\r\n mesh.material.side = THREE.FrontSide;\r\n var meshInner = new THREE.Mesh(geometry, materials[1]);\r\n meshInner.material.side = THREE.BackSide;\r\n meshInner.material.vertexColors = THREE.NoColors;\r\n mesh.add(meshInner);\r\n }\r\n\r\n mesh.castShadow = true;\r\n mesh.receiveShadow = true;\r\n\r\n //Add mesh to the scene\r\n scene.add(mesh);\r\n sceneObjects.push(mesh);\r\n\r\n //Draw bounding box if configured so\r\n if (config.drawBoundingBoxes) {\r\n box = new THREE.BoxHelper(mesh, config.boundingBoxColor);\r\n scene.add(box);\r\n boundingBoxHelpers.push(box);\r\n }\r\n } else if (geometry instanceof THREE.Group) {\r\n scene.add(geometry);\r\n sceneObjects.push(geometry);\r\n if (config.drawBoundingBoxes) {\r\n box = new THREE.BoxHelper(geometry, config.boundingBoxColor);\r\n scene.add(box);\r\n boundingBoxHelpers.push(box);\r\n }\r\n } else if (geometry instanceof THREE.Scene) {\r\n // TODO\r\n } else if (geometry instanceof THREE.Object3D) { // Default handler\r\n // TODO\r\n }\r\n }\r\n\r\n // Align meshes in one row\r\n // and move camera position to see all the meshes\r\n alignMeshesAndCamera();\r\n }\r\n\r\n /**\r\n * Align all the meshes in single row.\r\n */\r\n function alignMeshesAndCamera() {\r\n var meshMargin = config.alignOffset;\r\n var nextMeshCenterShift = 0;\r\n var maxYSize = 0;\r\n var maxZSize = 0;\r\n\r\n\r\n for (var i = 0; i < sceneObjects.length; i++) {\r\n var sceneObject = sceneObjects[i];\r\n\r\n var boundingBoxHelper = boundingBoxHelpers[i];\r\n var boundingBox;\r\n\r\n boundingBox = new THREE.Box3().setFromObject(boundingBoxHelper);\r\n\r\n // Getting center of bounding box\r\n var center = new THREE.Vector3(); // this coordinates returns in mesh-oriented coordinates\r\n boundingBox.getCenter(center); // converting to world coordinates\r\n\r\n // getting size of bounding box\r\n var size = new THREE.Vector3();\r\n boundingBox.getSize(size);\r\n\r\n if (size.y > maxYSize) {\r\n maxYSize = size.y;\r\n }\r\n if (size.z > maxZSize) {\r\n maxZSize = size.z;\r\n }\r\n\r\n // We will place meshes one by one on the Ox axis.\r\n // The meshes themselves will be positioned so that the center of the Bounding Box lies on the Ox axis\r\n\r\n // calculate next position on oX axis\r\n var boundingBoxDestinationPosition = new THREE.Vector3(nextMeshCenterShift + size.x / 2, 0, 0);\r\n\r\n // Vector describing shift between bounding box center and next position on Ox axis\r\n var shift = new THREE.Vector3()\r\n .subVectors(boundingBoxDestinationPosition, center);\r\n\r\n // Apply that shift to the scene 3dObject position\r\n sceneObject.position.add(shift);\r\n\r\n nextMeshCenterShift = nextMeshCenterShift + size.x + meshMargin;\r\n\r\n boundingBoxHelper.update();\r\n }\r\n\r\n // Fix camera position\r\n var maxDimension = nextMeshCenterShift > maxYSize ? nextMeshCenterShift : maxYSize;\r\n if (maxDimension < maxZSize) {\r\n maxDimension = maxZSize;\r\n }\r\n var dist = maxDimension / 1.5 / Math.tan(Math.PI * camera.fov / 360);\r\n\r\n camera.position.set((nextMeshCenterShift - meshMargin) / 2, maxYSize, dist);\r\n\r\n //Update the fog according to total bounding box size, so it will not hide the object but only the edges of the grid\r\n if (scene.fog) {\r\n scene.fog.near = maxDimension * 6;\r\n scene.fog.far = maxDimension * 10;\r\n }\r\n\r\n //Update grid size according to objects size, so it won't be too large yet we will not see its edges\r\n if (config.drawGrid) {\r\n grid = new THREE.GridHelper(maxDimension * 20, maxDimension / 2, 0x000000, 0x000000);\r\n grid.material.opacity = 0.1;\r\n grid.material.transparent = true;\r\n scene.add(grid);\r\n }\r\n\r\n //Update camera farther clipping plane according to objects size\r\n camera.far = maxDimension * 14;\r\n\r\n controls.target = new THREE.Vector3((nextMeshCenterShift - meshMargin) / 2, 0, 0);\r\n controls.update();\r\n controls.saveState();\r\n }\r\n\r\n /**\r\n * Clear all meshes from scene\r\n */\r\n function clearGeometries() {\r\n if (!scene) {\r\n return;\r\n }\r\n\r\n if (sceneObjects) {\r\n // scene.traverse is more right way, but it is really buggy\r\n for (var i = 0; i < sceneObjects.length; i++) {\r\n var obj = sceneObjects[i];\r\n if (scene && scene.remove) {\r\n scene.remove(obj);\r\n }\r\n }\r\n sceneObjects = [];\r\n }\r\n\r\n if (boundingBoxHelpers) {\r\n for (var j = 0; j < boundingBoxHelpers.length; j++) {\r\n scene.remove(boundingBoxHelpers[j]);\r\n }\r\n boundingBoxHelpers = [];\r\n }\r\n }\r\n\r\n function mergeVertices(geometry, tolerance = 1e-4) {\r\n\r\n class VerticesColorsHolder {\r\n constructor(rgbArray) {\r\n this.summColors = rgbArray;\r\n this.verticesCount = 1;\r\n this.averageColor = Array.from(rgbArray); //Just to hold pre-calculated average for faster get\r\n }\r\n\r\n addVertexColor(rgbArray) {\r\n if(!this.summColors) return;\r\n if(!rgbArray || rgbArray.length !== this.summColors.length) return;\r\n\r\n this.verticesCount++;\r\n\r\n for(let i = 0; i < this.summColors.length; i++) {\r\n this.summColors[i] += rgbArray[i];\r\n this.averageColor[i] = this.summColors[i] / this.verticesCount;\r\n }\r\n }\r\n\r\n getAverageColor() {\r\n return this.averageColor;\r\n }\r\n }\r\n\r\n tolerance = Math.max(tolerance, Number.EPSILON);\r\n\r\n // Generate an index buffer if the geometry doesn't have one, or optimize it\r\n // if it's already available.\r\n const hashToIndex = {};\r\n const indices = geometry.getIndex();\r\n const positions = geometry.getAttribute('position');\r\n const vertexCount = indices ? indices.count : positions.count;\r\n\r\n // next value for triangle indices\r\n let nextIndex = 0;\r\n\r\n // attributes and new attribute arrays\r\n const attributeNames = Object.keys(geometry.attributes);\r\n const tmpAttributes = {};\r\n const tmpMorphAttributes = {};\r\n const newIndices = [];\r\n const getters = ['getX', 'getY', 'getZ', 'getW'];\r\n const setters = ['setX', 'setY', 'setZ', 'setW'];\r\n\r\n // See if geometry has colors, so the resulting geometry will has colors as well (meaning we have to merge them)\r\n // by averaging colors of the merged vertices\r\n const hasColors = geometry.hasColors || attributeNames.includes('color');\r\n let oldColorsMap = [];\r\n\r\n // Initialize the arrays, allocating space conservatively. Extra\r\n // space will be trimmed in the last step.\r\n for (let i = 0, l = attributeNames.length; i < l; i++) {\r\n\r\n const name = attributeNames[i];\r\n const attr = geometry.attributes[name];\r\n tmpAttributes[name] = new THREE.BufferAttribute(new attr.array.constructor(attr.count * attr.itemSize), attr.itemSize, attr.normalized);\r\n const morphAttr = geometry.morphAttributes[name];\r\n if (morphAttr) {\r\n tmpMorphAttributes[name] = new THREE.BufferAttribute(new morphAttr.array.constructor(morphAttr.count * morphAttr.itemSize), morphAttr.itemSize, morphAttr.normalized);\r\n }\r\n\r\n }\r\n\r\n // convert the error tolerance to an amount of decimal places to truncate to\r\n const decimalShift = Math.log10(1 / tolerance);\r\n const shiftMultiplier = Math.pow(10, decimalShift);\r\n for (let i = 0; i < vertexCount; i++) {\r\n\r\n const index = indices ? indices.getX(i) : i;\r\n\r\n // Generate a hash for the vertex attributes at the current index 'i'\r\n let hash = '';\r\n\r\n for (let j = 0, l = attributeNames.length; j < l; j++) {\r\n\r\n const name = attributeNames[j];\r\n const attribute = geometry.getAttribute(name);\r\n const itemSize = attribute.itemSize;\r\n\r\n if (name === 'color') continue; //do not use color information for vertex descriptor as we want to\r\n //merge vertices with different colors and just average their color\r\n //into a merged one\r\n\r\n for (let k = 0; k < itemSize; k++) {\r\n // double tilde truncates the decimal value\r\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\r\n }\r\n }\r\n\r\n // Add another reference to the vertex if it's already\r\n // used by another index\r\n if (hash in hashToIndex) {\r\n\r\n newIndices.push(hashToIndex[hash]);\r\n\r\n if(attributeNames.includes('color')) {\r\n //Then on any 'merged' vertex we need to store its color into old colors map\r\n const name = 'color';\r\n const attribute = geometry.getAttribute(name);\r\n const itemSize = attribute.itemSize;\r\n const oldColor = [];\r\n for (let k = 0; k < itemSize; k++) {\r\n const getterFunc = getters[k];\r\n const setterFunc = setters[k];\r\n\r\n oldColor[k] = attribute[getterFunc](index);\r\n }\r\n oldColorsMap[hashToIndex[hash]].addVertexColor(oldColor);\r\n }\r\n\r\n } else {\r\n // copy data to the new index in the temporary attributes\r\n for (let j = 0, l = attributeNames.length; j < l; j++) {\r\n const name = attributeNames[j];\r\n const attribute = geometry.getAttribute(name);\r\n const morphAttr = geometry.morphAttributes[name];\r\n const itemSize = attribute.itemSize;\r\n const newarray = tmpAttributes[name];\r\n const newMorphArrays = tmpMorphAttributes[name];\r\n const oldColor = [];\r\n\r\n for (let k = 0; k < itemSize; k++) {\r\n const getterFunc = getters[k];\r\n const setterFunc = setters[k];\r\n newarray[setterFunc](nextIndex, attribute[getterFunc](index));\r\n\r\n if(name === 'color') {\r\n //Get the color value for vertex found and store into the map for later calculation\r\n //of the average color of all the merged vertex for particular position (depending on tolerance)\r\n oldColor[k] = attribute[getterFunc](index);\r\n }\r\n if (morphAttr) {\r\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\r\n newMorphArrays[m][setterFunc](nextIndex, morphAttr[m][getterFunc](index));\r\n }\r\n }\r\n }\r\n if(name === 'color') {\r\n //Store the first color value for vertex found\r\n if(!oldColorsMap[nextIndex]) {\r\n oldColorsMap[nextIndex] = new VerticesColorsHolder(oldColor);\r\n }\r\n else {\r\n oldColorsMap[nextIndex].addVertexColor(oldColor);\r\n }\r\n }\r\n }\r\n\r\n hashToIndex[hash] = nextIndex;\r\n newIndices.push(nextIndex);\r\n nextIndex++;\r\n }\r\n }\r\n\r\n // generate resulting THREE.BufferGeometry\r\n const result = geometry.clone();\r\n result.hasColors = hasColors;\r\n\r\n for (const name in geometry.attributes) {\r\n const tmpAttribute = tmpAttributes[name];\r\n\r\n if(name === 'color') {\r\n //update colors information in the buffer attribute object\r\n for(let i = 0; i < oldColorsMap.length; i++) {\r\n tmpAttribute.set(oldColorsMap[i].averageColor, i * tmpAttribute.itemSize);\r\n }\r\n tmpAttribute.needsUpdate = true;\r\n }\r\n result.setAttribute(name, new THREE.BufferAttribute(tmpAttribute.array.slice(0, nextIndex * tmpAttribute.itemSize), tmpAttribute.itemSize, tmpAttribute.normalized));\r\n\r\n if (!(name in tmpMorphAttributes)) continue;\r\n for (let j = 0; j < tmpMorphAttributes[name].length; j++) {\r\n const tmpMorphAttribute = tmpMorphAttributes[name][j];\r\n result.morphAttributes[name][j] = new THREE.BufferAttribute(tmpMorphAttribute.array.slice(0, nextIndex * tmpMorphAttribute.itemSize), tmpMorphAttribute.itemSize, tmpMorphAttribute.normalized);\r\n }\r\n }\r\n\r\n // indices\r\n result.setIndex(newIndices);\r\n\r\n //Clean up a bit\r\n oldColorsMap = null;\r\n\r\n return result;\r\n\r\n }\r\n })\r\n\r\n .service('meshViewerDataService', function () {\r\n var _this = this;\r\n\r\n var _onGeometriesAdd;\r\n var _onGeometriesClear;\r\n _this.geometries = [];\r\n\r\n _this.init = function () {\r\n _this.geometries = [];\r\n _onGeometriesAdd = void 0;\r\n };\r\n\r\n _this.destroy = function () {\r\n _this.geometries = [];\r\n _onGeometriesAdd = void 0;\r\n };\r\n\r\n _this.addGeometry = function (geometry) {\r\n _this.geometries.push(geometry);\r\n if (_onGeometriesAdd) {\r\n _onGeometriesAdd([geometry]);\r\n }\r\n };\r\n\r\n _this.addGeometries = function (geometries) {\r\n _this.geometries.concat(geometries);\r\n if (_onGeometriesAdd) {\r\n _onGeometriesAdd(geometries);\r\n }\r\n };\r\n\r\n _this.clearGeometries = function () {\r\n _this.geometries = [];\r\n if (_onGeometriesClear) {\r\n _onGeometriesClear();\r\n }\r\n };\r\n\r\n _this.onGeometriesClear = function (func) {\r\n _onGeometriesClear = func;\r\n };\r\n\r\n _this.onGeometriesAdd = function (func) {\r\n _onGeometriesAdd = func;\r\n if (_this.geometries && _this.geometries.length > 0) {\r\n _onGeometriesAdd(_this.geometries);\r\n }\r\n };\r\n\r\n return this;\r\n })\r\n;\r\n","angular.module('common.directives.inlineEditText', [])\r\n\r\n .directive(\"inlineEditText\", function ($animate, $timeout, $http, $compile) {\r\n return ({\r\n restrict: 'E',\r\n //scope: {}, // We need to share the scope here, so we update templates passed to directives and bind some elements \r\n // to directive's handlers/properties and some to parent scope's properties\r\n controller: 'inlineEditTextController',\r\n controllerAs: 'inlineEditTextController',\r\n link: function (scope, element, attrs, parentCtrl) {\r\n\r\n if (!element || !element[0]) return;\r\n\r\n var viewTemplateElement = element.find('view-template');\r\n var editTemplateElement = element.find('edit-template'); //If edit template is not found - we won't be rendering a button and click handler to switch into 'edit mode'\r\n\r\n if (viewTemplateElement.length === 0) {\r\n return; //Do nothing as we don't have view template\r\n }\r\n\r\n if (editTemplateElement.length > 1) {\r\n throw new Error('Edit template must contain single root element.');\r\n }\r\n\r\n var id = _.random(0, 1000000);\r\n var inlineEditFormName = `inlineEditForm${id}`;\r\n\r\n //Update view-template's and edit-template's internal elements where necessary\r\n var editInputElement = editTemplateElement.find('[ng-model]').first();\r\n if (editInputElement) {\r\n editInputElement.attr('id', `editElementRoot${id}`);\r\n editInputElement.attr('ng-keydown', `cancelOrSave($event, ${inlineEditFormName})`); //add so we can handle the keydown events during user edit actions\r\n editInputElement.attr('ng-blur', `cancelOrSave($event, ${inlineEditFormName})`); //add so we can handle event when user clicks away from edit control\r\n }\r\n\r\n var viewTemplate = viewTemplateElement.html();\r\n var editTemplate = editTemplateElement ? editTemplateElement.html() : null;\r\n\r\n //Now wrap the edit template supplied to the directive with additional form and container element markup\r\n editTemplate =\r\n `
    \r\n \r\n ${editTemplate}\r\n \r\n \r\n
    `;\r\n\r\n viewTemplate =\r\n ``;\r\n\r\n //Finally assemble container element to hold view and edit parts of UI\r\n var inlineEditContainerElementTemplate = `
    ${viewTemplate}\\n${editTemplate}
    `;\r\n var inlineEditContainerElement = $compile(inlineEditContainerElementTemplate)(scope); //compile against directive's scope, which inherits all the properties from parent scope\r\n\r\n //Finally replace our directive original element with re-compiled and actual content\r\n element.replaceWith(inlineEditContainerElement);\r\n }\r\n });\r\n })\r\n .controller('inlineEditTextController', function ($element, $scope, $http, $compile, $timeout) {\r\n\r\n //We need the hashmap of the edit flags for all inline edit controls as they don't have isolated scope, but share scope instead with parent scope\r\n //This is necessary in order to be able to wrap the edit controls into UI blocks using the bindings to parent scope, yet being able to bind to some\r\n //of our handlers as well. We can't bind one control simultaneously to more than one scope.\r\n var editFlagsMap = new Map();\r\n\r\n _.extend($scope, {\r\n getEditMode: getEditMode,\r\n setEditMode: setEditMode,\r\n isEditMode: isEditMode,\r\n save: save,\r\n cancelOrSave: cancelOrSave,\r\n toEditMode: toEditMode\r\n });\r\n\r\n init();\r\n\r\n function init() {\r\n //We need the hashmap of the original values for all inline edit controls as they don't have isolated scope, but share scope instead with parent scope\r\n $scope.originalValues = new Map();\r\n }\r\n\r\n function getEditMode(uid) {\r\n return editFlagsMap.get(uid.toString());\r\n }\r\n function setEditMode(uid, value) {\r\n editFlagsMap.set(uid.toString(), value);\r\n }\r\n\r\n function isEditMode(uid) {\r\n return $scope.getEditMode(uid) === true;\r\n }\r\n\r\n function save(e, form) {\r\n if (form) {\r\n if (!e || !e.target) return;\r\n\r\n //Get original value stored to compare with the value entered by user to see if we need to actually commit anything\r\n var originalValue = $scope.originalValues.get(e.target.id);\r\n\r\n //We need to enforce the form validation and proceed only if the form is valid\r\n //The form is not validated yet as we use the 'custom' value for 'updateOn' ng-model-option configuration setting\r\n //so the value is not propagated onto the model unless we explicitly save the value to the server by clicking 'save' button\r\n //or by User's pressing 'Enter' key\r\n if ((e.target.required && (!e.target.value || e.target.value === '')) || e.target.value === originalValue) {\r\n revertChangeAndCancelEdit(e, form);\r\n return;\r\n }\r\n\r\n if (e.target.pattern) {\r\n try {\r\n const re = new RegExp(e.target.pattern);\r\n if (!re.test(e.target.value)) {\r\n revertChangeAndCancelEdit(e, form);\r\n return;\r\n }\r\n } catch (e) {\r\n }\r\n }\r\n\r\n //Commit the value from the form to ng-model if we have the form.\r\n //This is necessary cause we have 'custom' ng-model-options to update model value \r\n //so we don't save new value entered if user decides not to save it and clicked away\r\n form.$commitViewValue();\r\n }\r\n\r\n $scope.$applyAsync(function () {\r\n setEditMode(getId(form), false);\r\n setIsBusyOnParentScope(true);\r\n });\r\n }\r\n\r\n function setIsBusyOnParentScope(valueToSet) {\r\n if ($scope.$parent && $scope.$parent.$parent) {\r\n $scope.$parent.$parent.isBusy = valueToSet;\r\n }\r\n }\r\n\r\n function toEditMode(uid) {\r\n var selector = `#editElementRoot${uid}`;\r\n\r\n setEditMode(uid, true);\r\n\r\n $timeout(function () {\r\n $scope.$applyAsync(function () {\r\n if (selector && selector.length > 0) {\r\n var input = $(selector);\r\n if (input.length > 0) {\r\n input.focus();\r\n\r\n $scope.originalValues.set(input[0].id, input.val());\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n function cancelOrSave(e, form) {\r\n\r\n if (e) {\r\n //Keypress\r\n if (e.keyCode) {\r\n if (e.keyCode === 27) {\r\n //Esc pressed, so cancel edit\r\n revertChangeAndCancelEdit(e, form);\r\n }\r\n if (e.keyCode === 13) {\r\n //Enter pressed\r\n save(e, form);\r\n }\r\n } else {\r\n if (e.relatedTarget && $(e.relatedTarget).hasClass('save-text-field-btn')) {\r\n //User wants to save new value by clicking on Save button\r\n save(e, form);\r\n } else if (e.type === 'blur') {\r\n revertChangeAndCancelEdit(e, form);\r\n }\r\n }\r\n\r\n }\r\n }\r\n\r\n function revertChangeAndCancelEdit(e, f) {\r\n //e.preventDefault(); //We need this to not save the value onto model when we have 'blur' cause model value configured to be updated on blur only\r\n //This is necessary to avoid value saving onto model when user just clicks away\r\n if (f) {\r\n f.$rollbackViewValue();\r\n f.$setPristine();\r\n f.$setUntouched();\r\n }\r\n setEditMode(getId(f), false);\r\n }\r\n\r\n function getId(element) {\r\n if (element && element.$name) {\r\n return element.$name.replace('inlineEditForm', '');\r\n }\r\n\r\n return null;\r\n }\r\n\r\n });\r\n","angular.module('common.directives.googleTranslate', [])\r\n\r\n .directive(\"googleTranslate\", function ($animate, $timeout, $http, $compile) {\r\n return ({\r\n restrict: 'A',\r\n scope: {\r\n\r\n },\r\n controller: 'GoogleTranslateController',\r\n controllerAs: 'GoogleTranslateController',\r\n link: function (scope, element, attrs, parentCtrl) {\r\n\r\n if (!element || !element[0]) return;\r\n\r\n var originalTag = element[0].tagName.toLowerCase();\r\n var filteredOriginalAttrs = _.filter(element[0].attributes, function (a) { return a.name !== 'google-translate'; });\r\n\r\n var buttonElementId = `trnsltBtn${_.random(0, 1000000)}`;\r\n scope.buttonElementId = buttonElementId;\r\n\r\n var originalTextElement = $('');\r\n originalTextElement.addClass('original-text-element');\r\n originalTextElement.attr('ng-hide', 'showTranslation');\r\n originalTextElement.text(element[0].innerText);\r\n var originalTextElementTemplate = originalTextElement.outerHtml();\r\n\r\n var buttonTemplate = `
    ` +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '';\r\n var wrapperTemplate = `<${originalTag}>${originalTextElementTemplate}`;\r\n\r\n //Compile original element with its scope after we wrapped it with the same tag around for our future manipulations\r\n var wrappedElement = $compile(wrapperTemplate)(scope.$parent);\r\n _.forEach(filteredOriginalAttrs, function(oa) { wrappedElement[0].setAttributeNode(oa.cloneNode()); }); //copy original attributes to the wrapper node\r\n\r\n var buttonElement = $compile(buttonTemplate)(scope);\r\n wrappedElement.append(buttonElement);\r\n\r\n element.replaceWith(wrappedElement);\r\n }\r\n });\r\n })\r\n .controller('GoogleTranslateController', function ($element, $scope, $http, $compile, $timeout, gettext, uiLocalization, usersRepository) {\r\n\r\n var originalTextWatcherDestructor;\r\n\r\n function init() {\r\n originalTextWatcherDestructor = $scope.$watch(\r\n function () {\r\n return $element[0].innerHTML;\r\n },\r\n function (newVal, oldVal) {\r\n\r\n //We use jquery to hide/show cause the button has css class animation/transition for opacity applied\r\n //and using ng-hide/ng-show gives us a delay when hiding a button\r\n if (angular.isUndefined(newVal) || newVal.length === 0) {\r\n $(`#${$scope.buttonElementId}`).css('visibility', 'collapse');\r\n } else {\r\n $(`#${$scope.buttonElementId}`).css('visibility', 'visible');\r\n }\r\n\r\n if (newVal !== oldVal) {\r\n $scope.$applyAsync(function() {\r\n $scope.showTranslation = false;\r\n $scope.$parent.showTranslation = false;\r\n });\r\n }\r\n }\r\n );\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n if (originalTextWatcherDestructor) {\r\n originalTextWatcherDestructor();\r\n }\r\n });\r\n }\r\n\r\n init();\r\n\r\n $scope.doTranslate = function (e) {\r\n\r\n var el = $(e.currentTarget); //the button itself\r\n el = el.parent(); //element containing element with original text\r\n\r\n if (!el) {\r\n throw new Error('Not found element/text for translation!');\r\n }\r\n\r\n var elOriginal = el.find('.original-text-element');\r\n var textToTranslate = elOriginal.text().trim();\r\n\r\n if ($scope.showTranslation) {\r\n //Switch back to original if we are showing translation at the moment\r\n switchTranslatedState();\r\n return;\r\n }\r\n\r\n //See if we have translation done already then clear element content to render refreshed content afterwards\r\n var elTranslated = el.find('.translation-element');\r\n if (elTranslated && elTranslated.length > 0) {\r\n elTranslated.remove();\r\n }\r\n\r\n $scope.isBusy = true;\r\n\r\n usersRepository.getCurrentUser()\r\n .then(function (user) {\r\n\r\n var culture = user.getCulture();\r\n var language = culture.substr(0, culture.indexOf('-'));\r\n\r\n $http.post(om.config.build.baseUrl + \"/rest-proxy/do-get-request\",\r\n {\r\n uri: `https://clients5.google.com/translate_a/t?client=dict-chrome-ex&sl=auto&tl=${language}&q=${encodeURI(textToTranslate)}`\r\n })\r\n .then(function (result) {\r\n if (result && result.data && result.data[0] && result.data[0][0]) {\r\n $scope.$applyAsync(function () {\r\n\r\n elTranslated = $compile(`${result.data[0][0].toString()}`)($scope);\r\n el.prepend(elTranslated);\r\n\r\n $scope.isBusy = false;\r\n switchTranslatedState(true);\r\n });\r\n }\r\n },\r\n function (error) {\r\n $scope.$applyAsync(function () {\r\n $scope.isBusy = false;\r\n switchTranslatedState(false);\r\n });\r\n\r\n throw new Error(error);\r\n });\r\n });\r\n }\r\n\r\n function switchTranslatedState(stateToSet) {\r\n if (angular.isUndefined(stateToSet) || stateToSet === null) {\r\n $scope.showTranslation = !$scope.showTranslation;\r\n $scope.$parent.showTranslation = !$scope.$parent.showTranslation;\r\n } else {\r\n $scope.showTranslation = stateToSet;\r\n $scope.$parent.showTranslation = stateToSet;\r\n }\r\n }\r\n\r\n });\r\n","angular.module('common.directives.inlineEditDropdown', [])\r\n\r\n .directive(\"inlineEditDropdown\", function ($animate, $timeout, $http, $compile) {\r\n return ({\r\n restrict: 'E',\r\n //scope: {}, // We need to share the scope here, so we update templates passed to directives and bind some elements \r\n // to directive's handlers/properties and some to parent scope's properties\r\n controller: 'inlineEditDropdownController',\r\n controllerAs: 'inlineEditDropdownController',\r\n link: function (scope, element, attrs, parentCtrl) {\r\n\r\n if (!element || !element[0]) return;\r\n\r\n var viewTemplateElement = element.find('view-template');\r\n var editTemplateElement = element.find('edit-template'); //If edit template is not found - we won't be rendering a button and click handler to switch into 'edit mode'\r\n\r\n if (viewTemplateElement.length === 0) {\r\n return; //Do nothing as we don't have view template\r\n }\r\n\r\n if (editTemplateElement.length > 1) {\r\n throw new Error('Edit template must contain single root element.');\r\n }\r\n\r\n var id = _.random(0, 1000000);\r\n var inlineEditFormName = `inlineEditForm${id}`;\r\n\r\n //Update view-template's and edit-template's internal elements where necessary\r\n var editSelectElement = editTemplateElement.find('[ng-model]').first();\r\n if (editSelectElement) {\r\n editSelectElement.attr('id', `editElementRoot${id}`);\r\n editSelectElement.attr('ng-blur', `cancelEditDD($event, ${inlineEditFormName})`); //add so we can handle event when user clicks away from edit control\r\n editSelectElement.addClass('inline-dropdown');\r\n\r\n //Add the call to our internal 'save' handler to switch control's state before the control triggers any change handler assigned to it\r\n //to actually save value or do anything else.\r\n //But leave any user/caller's assigned handlers so the logic will work that was applied by the control's user\r\n var changeHandlerAttr = editSelectElement.attr('ng-change') ? 'ng-change' : (editSelectElement.attr('k-on-change') ? 'k-on-change' : '');\r\n if (changeHandlerAttr && changeHandlerAttr.length > 0) {\r\n editSelectElement.attr(changeHandlerAttr, `saveDD($event, ${inlineEditFormName}); ${editSelectElement.attr(changeHandlerAttr)}`);\r\n }\r\n }\r\n\r\n var buildElement = function() {\r\n var viewTemplate = viewTemplateElement.html();\r\n var editTemplate = editTemplateElement ? editTemplateElement.html() : null;\r\n\r\n //Now wrap the edit template supplied to the directive with additional form and container element markup\r\n editTemplate =\r\n `
    \r\n
    \r\n ${editTemplate}\r\n
    \r\n
    `;\r\n\r\n viewTemplate =\r\n `
    \r\n ${viewTemplate}\r\n \r\n
    `;\r\n\r\n //Finally assemble container element to hold view and edit parts of UI\r\n var inlineEditContainerElementTemplate =\r\n `
    ${viewTemplate}\\n${editTemplate}
    `;\r\n var inlineEditContainerElement =\r\n $compile(inlineEditContainerElementTemplate)(\r\n scope); //compile against directive's scope, which inherits all the properties from parent scope\r\n\r\n return inlineEditContainerElement;\r\n };\r\n\r\n //Finally replace our directive original element with re-compiled and actual content\r\n element.replaceWith(buildElement());\r\n\r\n //Watch the ng-Model binding path and re-render element if it changes\r\n if (!scope.watchers) {\r\n scope.watchers = [];\r\n }\r\n scope.watchers.push(\r\n scope.$watch(\r\n editSelectElement.attr('ng-model'),\r\n function (newVal, oldVal) {\r\n if (newVal !== oldVal) {\r\n //As the model was changed we might want to re-render the UI for our control/directive\r\n //TODO: We might want to have watchers here to do actions on model changes\r\n }\r\n }\r\n ));\r\n }\r\n });\r\n })\r\n .controller('inlineEditDropdownController', function ($element, $scope, $http, $compile, $timeout) {\r\n\r\n //We need the hashmap of the edit flags for all inline edit controls as they don't have isolated scope, but share scope instead with parent scope\r\n //This is necessary in order to be able to wrap the edit controls into UI blocks using the bindings to parent scope, yet being able to bind to some\r\n //of our handlers as well. We can't bind one control simultaneously to more than one scope.\r\n var editFlagsMap = new Map();\r\n\r\n _.extend($scope, {\r\n getEditModeDD: getEditMode,\r\n setEditModeDD: setEditMode,\r\n isEditModeDD: isEditMode,\r\n saveDD: save,\r\n toEditModeDD: toEditMode,\r\n cancelEditDD: cancelEdit\r\n });\r\n\r\n init();\r\n\r\n function init() {\r\n $scope.$on(\"$destroy\", function() {\r\n runAllWatchersDestructor();\r\n });\r\n }\r\n\r\n function runAllWatchersDestructor() {\r\n if ($scope.watchers && $scope.watchers.length > 0) {\r\n $scope.watchers.forEach(function(wDestructor) {\r\n if (wDestructor) {\r\n wDestructor();\r\n }\r\n });\r\n }\r\n }\r\n\r\n function getEditMode(uid) {\r\n return editFlagsMap.get(uid.toString());\r\n }\r\n function setEditMode(uid, value) {\r\n editFlagsMap.set(uid.toString(), value);\r\n }\r\n\r\n function isEditMode(uid) {\r\n return getEditMode(uid) === true;\r\n }\r\n\r\n function save(e, form) {\r\n $scope.$applyAsync(function () {\r\n setEditMode(getId(form), false);\r\n setIsBusyOnParentScope(true);\r\n });\r\n }\r\n\r\n function setIsBusyOnParentScope(valueToSet) {\r\n if ($scope.$parent && $scope.$parent.$parent) {\r\n $scope.$parent.$parent.isBusy = valueToSet;\r\n }\r\n }\r\n\r\n function toEditMode(uid) {\r\n var selector = `#editElementRoot${uid}`;\r\n\r\n setEditMode(uid, true);\r\n\r\n $timeout(function () {\r\n $scope.$applyAsync(function () {\r\n if (selector && selector.length > 0) {\r\n var selectElement = $(selector);\r\n if (selectElement.length > 0) {\r\n selectElement.data('kendoDropDownList').focus();\r\n //selectElement.data('kendoDropDownList').open();\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n function cancelEdit(e, form) {\r\n\r\n e.preventDefault();\r\n if (form) {\r\n form.$rollbackViewValue();\r\n }\r\n setEditMode(getId(form), false);\r\n }\r\n\r\n function getId(element) {\r\n if (element && element.$name) {\r\n return element.$name.replace('inlineEditForm', '');\r\n }\r\n\r\n return null;\r\n }\r\n\r\n });\r\n","angular.module('common.directives.goBackButton', [])\r\n\r\n .directive('goBackButton', ['$window', function ($window) {\r\n return {\r\n restrict: 'A',\r\n link: function (scope, elem, attrs) {\r\n elem.bind('click', function () {\r\n $window.history.back();\r\n });\r\n }\r\n };\r\n}]);\r\n","angular.module('common.directives.buttonSliderMenu', [])\r\n\r\n .directive('buttonSliderMenu', function () {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n itemTemplate: '@',\r\n items: \"=\",\r\n itemAlias: \"@\",\r\n itemClick: \"&\",\r\n itemEnabled: \"&\"\r\n },\r\n templateUrl: 'common/directives/buttonSliderMenu/buttonSliderMenu.html',\r\n controller: 'ButtonSliderMenuController'\r\n };\r\n })\r\n\r\n .controller('ButtonSliderMenuController', function ($scope, $element, $window, $swipe, $interval, device) {\r\n\r\n var sliderViewBox = $element.find(\"#buttonSliderMenu_sliderViewBox\");\r\n var sliderCaret = $element.find(\"#buttonSliderMenu_sliderCaret\");\r\n var isMoving = false;\r\n var isSwiping = false;\r\n var firstTime = true;\r\n var startPointX;\r\n var startLeftAttr;\r\n\r\n _.extend($scope, {\r\n moveLeft: moveLeft,\r\n moveRight: moveRight,\r\n\r\n canMoveLeft: canMoveLeft,\r\n canMoveRight: canMoveRight,\r\n canSwipe: canSwipe,\r\n\r\n onButtonClick: onButtonClick,\r\n isButtonEnabled: isButtonEnabled,\r\n\r\n getCaretDimensions: getCaretDimensions\r\n });\r\n\r\n initController();\r\n\r\n function initController() {\r\n $scope.position = $scope.position || 0;\r\n initSwipe();\r\n initWatchers();\r\n }\r\n\r\n function initWatchers() {\r\n $scope.$watch($scope.getCaretDimensions, function (newValue, oldValue) {\r\n if (newValue.width !== oldValue.width && $scope.items && $scope.items.length > 0) {\r\n if (sliderCaret.html().indexOf(\"{{\") > 0 || // to prevent animation to width of uncompiled template\r\n parseInt(sliderCaret.css(\"left\")) >= 0) {\r\n return;\r\n }\r\n fixPosition();\r\n goToPosition(true);\r\n }\r\n }, true);\r\n\r\n $scope.$watch('position', function (newValue, oldValue) {\r\n if (newValue !== oldValue) {\r\n fixPosition();\r\n goToPosition();\r\n }\r\n });\r\n\r\n $scope.$watch('items', function (newValue, oldValue) {\r\n if (!_.isEqual(angular.toJson(oldValue), angular.toJson(newValue))) {\r\n if (firstTime) {\r\n isMoving = false;\r\n $scope.position = 0;\r\n var initOffset = sliderViewBox.width();\r\n initOffset = initOffset > 0 ? initOffset : 500;\r\n sliderCaret.stop(true, false);\r\n sliderCaret.css(\"left\", initOffset);\r\n animateCaret(0, 500, \"easeOutBounce\"); // initial animation\r\n firstTime = false;\r\n } else {\r\n $scope.position = 0;\r\n isMoving = false;\r\n targetOffset = null;\r\n sliderCaret.stop(true, false);\r\n sliderCaret.css(\"left\", 0);\r\n }\r\n }\r\n });\r\n\r\n var intervalPromise = $interval(function () {\r\n $scope.canSwipe();\r\n }, 500);\r\n\r\n $scope.$on('$destroy', function () {\r\n $interval.cancel(intervalPromise);\r\n });\r\n }\r\n\r\n function initSwipe() {\r\n // touch device check\r\n if (!device.isTouch()) {\r\n return;\r\n }\r\n\r\n $swipe.bind($(sliderViewBox), {\r\n start: function (point) {\r\n isSwiping = true;\r\n isMoving = false;\r\n targetOffset = null;\r\n sliderCaret.stop(true, false);\r\n\r\n startPointX = point.x;\r\n startLeftAttr = parseInt(sliderCaret.css(\"left\"));\r\n },\r\n end: function () {\r\n isSwiping = false;\r\n fixPositionFromOffset();\r\n goToPosition();\r\n },\r\n move: function (point) {\r\n var delta = point.x - startPointX;\r\n sliderCaret.css(\"left\", startLeftAttr + delta);\r\n },\r\n cancel: function () {\r\n isSwiping = false;\r\n fixPositionFromOffset();\r\n goToPosition();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Check if we see all the buttons\r\n * @returns {boolean}\r\n */\r\n function canSwipe() {\r\n return !isSwiping && (sliderCaret.width() > sliderViewBox.width() || parseInt(sliderCaret.css(\"left\")) != 0);\r\n }\r\n\r\n function fixPositionFromOffset() {\r\n try {\r\n var currentOffset = -parseInt(sliderCaret.css(\"left\")); // reversed sign!\r\n\r\n if (currentOffset <= 0) {\r\n $scope.position = 0;\r\n return;\r\n }\r\n var children = sliderCaret.children();\r\n if (children.length <= 1 || currentOffset < $(children[0]).width() / 2) {\r\n $scope.position = 0;\r\n return;\r\n }\r\n\r\n var offset = 0;\r\n for (var i = 0; i < children.length - 1; i++) {\r\n var el = $(children[i]);\r\n var nextEl = $(children[i + 1]);\r\n if (currentOffset > offset + el.width() / 2 &&\r\n currentOffset < offset + el.width() + nextEl.width() / 2) {\r\n $scope.position = i + 1;\r\n return;\r\n }\r\n offset += el.width();\r\n }\r\n\r\n $scope.position = children.length - 1;\r\n\r\n } catch (e) { // stability improvement! =)\r\n $log.error('Error in button slider menu', e);\r\n $scope.position = 0;\r\n }\r\n }\r\n\r\n function fixPosition() {\r\n if ($scope.position <= 0) {\r\n $scope.position = 0;\r\n } else if ($scope.position >= $scope.items.length) {\r\n $scope.position = $scope.items.length - 1;\r\n }\r\n }\r\n\r\n function goToPosition(quick) {\r\n if (sliderCaret.width() <= sliderViewBox.width()) {\r\n $scope.position = 0;\r\n }\r\n if ($scope.position == 0) {\r\n if (quick) {\r\n isMoving = false;\r\n targetOffset = null;\r\n sliderCaret.stop(true, false);\r\n sliderCaret.css(\"left\", 0);\r\n } else {\r\n animateCaret(0);\r\n }\r\n return;\r\n }\r\n\r\n var offset = 0;\r\n var children = sliderCaret.children();\r\n for (var i = 0; i < $scope.position; i++) {\r\n offset += $(children[i]).width();\r\n }\r\n\r\n if (quick) {\r\n isMoving = false;\r\n targetOffset = null;\r\n sliderCaret.stop(true, false);\r\n sliderCaret.css(\"left\", -offset);\r\n } else {\r\n animateCaret(-offset);\r\n }\r\n }\r\n\r\n /**\r\n * Move one item to the left\r\n */\r\n function moveLeft() {\r\n if (!canMoveLeft()) {\r\n return;\r\n }\r\n $scope.position++;\r\n }\r\n\r\n /**\r\n * Move one item to the right\r\n */\r\n function moveRight() {\r\n if (!canMoveRight()) {\r\n return;\r\n }\r\n $scope.position--;\r\n }\r\n\r\n function canMoveLeft() {\r\n return $scope.items && $scope.position < $scope.items.length - 1 && canSwipe();\r\n }\r\n\r\n function canMoveRight() {\r\n return $scope.position > 0 && canSwipe();\r\n }\r\n\r\n var targetOffset;\r\n\r\n /**\r\n * Animate slider caret\r\n * @param {string|number} [offset] offset of new caret position OR modification expression like \"+={number}\". Default value is 0.\r\n * @param {number} [duration] duration of animation. Default value is 400ms.\r\n * @param {string} [easing] easing name. To use custom easing function you need to connect jQuery easing plugin.\r\n */\r\n function animateCaret(offset, duration, easing) {\r\n if (parseInt(offset) == targetOffset) {\r\n return;\r\n }\r\n\r\n sliderCaret.stop(true, false);\r\n isMoving = true;\r\n targetOffset = parseInt(offset);\r\n sliderCaret.animate(\r\n {left: offset || 0},\r\n duration || 400,\r\n easing || \"easeInOutExpo\",\r\n function () {\r\n isMoving = false;\r\n targetOffset = null;\r\n });\r\n }\r\n\r\n function onButtonClick(item) {\r\n if (!item || !$scope.itemClick || !isButtonEnabled(item)) {\r\n return;\r\n }\r\n var params = {};\r\n params[$scope.itemAlias || \"item\"] = item;\r\n $scope.itemClick(params);\r\n }\r\n\r\n function isButtonEnabled(item) {\r\n if (!item || !$scope.itemEnabled) {\r\n return true;\r\n }\r\n var params = {};\r\n params[$scope.itemAlias || \"item\"] = item;\r\n return $scope.itemEnabled(params);\r\n }\r\n\r\n function getCaretDimensions() {\r\n return {\r\n height: sliderCaret.height(),\r\n width: sliderCaret.width()\r\n };\r\n }\r\n })\r\n\r\n;\r\n","angular.module('common.directives.focus', [])\r\n\r\n // Focus element on page load\r\n .directive('focusOnLoad', function ($timeout) {\r\n return {\r\n restrict: \"AC\",\r\n link: function (scope, element) {\r\n $timeout(function () {\r\n element.focus();\r\n element.select();\r\n });\r\n }\r\n };\r\n })\r\n\r\n // Focus on page load for touch devices\r\n .directive('focusOnLoadTouch', function ($timeout, device) {\r\n return {\r\n restrict: \"AC\",\r\n link: function (scope, element) {\r\n if (device.isTouch()) {\r\n $timeout(function () {\r\n element.focus();\r\n element.select();\r\n });\r\n }\r\n }\r\n };\r\n })\r\n\r\n // Focus on page load for non-touch devices\r\n .directive('focusOnLoadNotTouch', function ($timeout, device) {\r\n return {\r\n restrict: \"AC\",\r\n link: function (scope, element) {\r\n if (!device.isTouch()) {\r\n $timeout(function () {\r\n element.focus();\r\n element.select();\r\n });\r\n }\r\n }\r\n };\r\n })\r\n\r\n .directive('focus', function ($timeout, focusManagementService, device) {\r\n return {\r\n restrict: 'A',\r\n scope: {focus: '='},\r\n link: function (scope, iElement) {\r\n var config = scope.focus;\r\n var element = $(iElement);\r\n\r\n if (_.isUndefined(config)) {\r\n config = {index: 0};\r\n } else if (_.isNumber(config)) {\r\n config = {index: config};\r\n } else if (_.isString(config)) {\r\n config = {index: parseInt(config)};\r\n }\r\n\r\n if (config.touch === true) {\r\n if (device.isTouch()) {\r\n focusManagementService.registerElement(element, config.index);\r\n }\r\n } else {\r\n if (!device.isTouch()) {\r\n focusManagementService.registerElement(element, config.index);\r\n }\r\n }\r\n\r\n if (!config.ignoreEnter) {\r\n element.keypress(function (e) {\r\n var code = (e.keyCode ? e.keyCode : e.which);\r\n if (code == 13) { // Enter\r\n $timeout(function () {\r\n focusManagementService.focusNext(element);\r\n });\r\n e.preventDefault();\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n if (config.watch) {\r\n if (_.isString(config.watch)) {\r\n config.watch = [config.watch];\r\n }\r\n if (_.isArray(config.watch)) {\r\n _.forEach(config.watch, function (watchName) {\r\n scope.$watch(watchName, function (newValue, oldValue) {\r\n if (!_.isEqual(newValue, oldValue)) {\r\n $timeout(function () {\r\n focusManagementService.setFocus(element);\r\n });\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n if (config.event) {\r\n if (_.isString(config.event)) {\r\n config.event = [config.event];\r\n }\r\n if (_.isArray(config.event)) {\r\n _.forEach(config.event, function (eventName) {\r\n scope.$on(eventName, function () {\r\n $timeout(function () {\r\n focusManagementService.setFocus(element);\r\n });\r\n });\r\n });\r\n }\r\n }\r\n\r\n scope.$on('$destroy', function () {\r\n focusManagementService.unregisterElement(element);\r\n });\r\n }\r\n };\r\n })\r\n\r\n .service('focusManagementService', function ($timeout) {\r\n // Collection of elements for focus management\r\n var elements = [];\r\n var defaultTimeout = 50;\r\n\r\n /**\r\n * Register element for focus management\r\n */\r\n function registerElement(element, index) {\r\n elements.push({\r\n element: element,\r\n index: index\r\n });\r\n doFocusFirstElement();\r\n }\r\n\r\n /**\r\n * Unregister element from focus management queue\r\n */\r\n function unregisterElement(element) {\r\n elements = _.reject(elements, function (e) {\r\n return $(e.element).is(element);\r\n });\r\n //doFocusFirstElement();\r\n }\r\n\r\n function getVisibleElements() {\r\n elements = _.sortBy(elements, 'index');\r\n\r\n return _.filter(elements, function (e) {\r\n return e && e.index >= 0 && e.element && e.element[0] && $.contains(document.documentElement, e.element[0]);\r\n });\r\n }\r\n\r\n function doFocusFirstElement() {\r\n $timeout(function () {\r\n var visibleElements = getVisibleElements();\r\n\r\n if (visibleElements[0]) {\r\n var el = $(visibleElements[0].element);\r\n if (!el || !el[0]) {\r\n return;\r\n }\r\n if ($.contains(document.documentElement, el[0])) {\r\n (function (e) {\r\n $timeout(function () {\r\n e.focus();\r\n e.select();\r\n });\r\n })(el);\r\n } else {\r\n doFocusFirstElement();\r\n }\r\n }\r\n },\r\n defaultTimeout);\r\n }\r\n\r\n function doFocusNextElement(element) {\r\n $timeout(function () {\r\n if (!element || !element[0]) {\r\n return;\r\n }\r\n\r\n var visibleElements = getVisibleElements();\r\n for (var i = 0; i < visibleElements.length; i++) {\r\n if ($(visibleElements[i].element).is(element)) {\r\n if (visibleElements[i + 1]) {\r\n var toFocus = $(visibleElements[i + 1].element);\r\n if (!toFocus[0]) {\r\n return;\r\n }\r\n if ($.contains(document.documentElement, toFocus[0])) {\r\n (function (e) {\r\n $timeout(function () {\r\n e.focus();\r\n e.select();\r\n });\r\n })(toFocus);\r\n return;\r\n } else {\r\n doFocusNextElement(element);\r\n }\r\n }\r\n return;\r\n }\r\n }\r\n doFocusFirstElement();\r\n }, defaultTimeout);\r\n }\r\n\r\n function doFocusElement(element) {\r\n $timeout(function () {\r\n if (!element || !element[0]) {\r\n return;\r\n }\r\n\r\n var visibleElements = getVisibleElements();\r\n for (var i = 0; i < visibleElements.length; i++) {\r\n if ($(visibleElements[i].element).is(element)) {\r\n if (visibleElements[i + 1]) {\r\n var toFocus = visibleElements[i].element;\r\n if (!toFocus[0]) {\r\n return;\r\n }\r\n if ($.contains(document.documentElement, toFocus[0])) {\r\n (function (e) {\r\n $timeout(function () {\r\n e.focus();\r\n e.select();\r\n });\r\n })(toFocus);\r\n return;\r\n } else {\r\n doFocusElement(element);\r\n }\r\n }\r\n return;\r\n }\r\n }\r\n }, defaultTimeout);\r\n }\r\n\r\n /**\r\n * Set up focus to first element in queue\r\n */\r\n function setFocus(element) {\r\n if (element) {\r\n doFocusElement(element);\r\n } else {\r\n doFocusFirstElement();\r\n }\r\n }\r\n\r\n /**\r\n * Set up focus to next element in queue\r\n * @param element\r\n */\r\n function focusNext(element) {\r\n doFocusNextElement(element);\r\n }\r\n\r\n return {\r\n registerElement: registerElement,\r\n unregisterElement: unregisterElement,\r\n setFocus: setFocus,\r\n focusNext: focusNext\r\n };\r\n })\r\n;\r\n","angular.module('common.directives.appLoadingAnimation', [])\r\n\r\n .directive(\"appLoadingAnimation\", function ($animate, $timeout) {\r\n // Return the directive configuration.\r\n return ({\r\n link: link,\r\n restrict: \"C\"\r\n });\r\n\r\n // I bind the JavaScript events to the scope.\r\n function link(scope, element, attributes) {\r\n\r\n // Due to the way AngularJS prevents animation during the bootstrap\r\n // of the application, we can't animate the top-level container; but,\r\n // since we added \"ngAnimateChildren\", we can animate the inner\r\n // container during this phase.\r\n // --\r\n // NOTE: Am using .eq(1) so that we don't animate the Style block.\r\n\r\n //That callback must be run when app is loaded.\r\n //This function must be called from any place where we could end up after loading screen.\r\n //In most often cases it will be a 'resolve' function of the view we end up in.\r\n window.omHideLoadingScreenCallback = function () {\r\n $animate.leave(element.children().eq(1)).then(\r\n function cleanupAfterAnimation() {\r\n\r\n // Remove the root directive element.\r\n //element.remove();\r\n\r\n // Clear the closed-over variable references.\r\n //scope = element = attributes = null;\r\n\r\n }\r\n );\r\n };\r\n //$timeout(, 700);\r\n }\r\n\r\n }\r\n );","angular.module('ui.user', [\r\n 'ui.user.notifications',\r\n 'ui.user.profile',\r\n 'ui.user.settings'\r\n]);","angular.module('ui.omStat', [])\r\n .directive('omStat', function ($timeout, customTemplateResolver) {\r\n\r\n return {\r\n restrict: 'EA',\r\n scope: {\r\n items: '=items',\r\n customItems: '=customItems'\r\n }, // use a new isolated scope\r\n template: customTemplateResolver.get('omStat.html', 'app/ui/omStat/omStat.html'),\r\n controller: 'OmStatController'\r\n };\r\n\r\n })\r\n\r\n .directive('honeyButton', function ($timeout, customTemplateResolver) {\r\n\r\n return {\r\n restrict: 'EA',\r\n bindToController: true,\r\n scope: {\r\n color: '@',\r\n arrowUp: '@',\r\n arrowDown: '@',\r\n targetUri: '@',\r\n iconName: '@',\r\n title: '@',\r\n label: '@'\r\n }, // use a new isolated scope\r\n template: customTemplateResolver.get('honeyButton.html', 'app/ui/omStat/honeyButton.html'),\r\n controller: 'HoneyButtonController'\r\n };\r\n })\r\n .controller('HoneyButtonController', function HoneyButtonController($scope, $window, $element, colorService) {\r\n\r\n //set the title to be at least ' ' when it's empty\r\n //the special space symbol (alt+255) entered in the string here, will\r\n //be converted by angular into 'nbsp;'\r\n $scope.titleInternal = !$scope.title ? ' ' : $scope.title;\r\n\r\n //Dynamically update font-size value depending on the length of the title\r\n var getFontSize = function(textLength) {\r\n if (textLength <= 12) return '0.7em';\r\n if (textLength <= 19) return '0.65em';\r\n if (textLength <= 23) return '0.55em';\r\n\r\n return '0.4em';\r\n };\r\n $scope.fontStyle = { 'font-size': getFontSize($scope.titleInternal.length) };\r\n\r\n $scope.openTargetUri = function () {\r\n $window.location = $scope.targetUri;\r\n };\r\n\r\n var arrowUp = $scope.$eval($scope.arrowUp);\r\n var arrowDown = $scope.$eval($scope.arrowDown);\r\n var arrowSuffix = !!arrowUp ? '-up' : (!!arrowDown ? '-down' : '');\r\n var colorSuffix = $scope.color ? $scope.color : 'grey';\r\n \r\n $scope.dynamicStyle = {\r\n 'background-image': 'url(\\'assets/images/honeycomb-' + colorSuffix + arrowSuffix + '.png\\')'\r\n };\r\n\r\n initController();\r\n\r\n function initController() {\r\n //Get the current accent color from the parent button wrap element and calculate apropriate filter element value\r\n //to set onto customer filter property, which will be used by the pseudo element 'before' to apply\r\n //this filter to modify the default black hexagonal lines to match the current Brand's accent color\r\n\r\n //Get the button wrap reference which holds the custom property with the filter value and accent color value\r\n //Once we set the calculated filter to this property, it will be applied on the 'before' pseudo element\r\n //as it uses this custom property for its filter value\r\n var buttonWrap = $element.closest('.om-Honey-Button-Wrap');\r\n\r\n if (buttonWrap.length > 0) {\r\n //Get current accent color defined in the omStat.less head section\r\n var accentColor = _.str.trim(getComputedStyle(document.documentElement).getPropertyValue('--accent-color'));\r\n if (accentColor) {\r\n //Calculate filter value from accent color\r\n var filterValue = colorService.getFiltersToTransformBlackToColor(accentColor);\r\n \r\n //And finally set updated filter to match current accent color\r\n document.styleSheets[0].addRule('.om-Honey-Button-Wrap .om-Stat-Honey-Button:after', `filter:${filterValue};`);\r\n }\r\n }\r\n }\r\n })\r\n\r\n .directive('bookmarkButton', function ($timeout, customTemplateResolver) {\r\n\r\n return {\r\n restrict: 'EA',\r\n bindToController: true,\r\n scope: {\r\n color: '@',\r\n targetUri: '@',\r\n iconName: '@',\r\n title: '@',\r\n label: '@'\r\n }, // use a new isolated scope\r\n template: customTemplateResolver.get('bookmarkButton.html', 'app/ui/omStat/bookmarkButton.html'),\r\n controller: 'BookmarkButtonController'\r\n };\r\n\r\n })\r\n .controller('BookmarkButtonController', function BookmarkButtonController($scope, $window, $element, colorService) {\r\n\r\n initController();\r\n\r\n function initController() {\r\n //Get the current accent color from the parent button wrap element and calculate apropriate filter element value\r\n //to set onto customer filter property, which will be used by the pseudo element 'before' to apply\r\n //this filter to modify the default black hexagonal lines to match the current Brand's accent color\r\n\r\n //Get the button wrap reference which holds the custom property with the filter value and accent color value\r\n //Once we set the calculated filter to this property, it will be applied on the 'before' pseudo element\r\n //as it uses this custom property for its filter value\r\n var buttonWrap = $element.closest('.om-Stat-Bookmark-Button-Wrap');\r\n if (buttonWrap.length > 0) {\r\n //Get current accent color defined in the omStat.less head section\r\n var accentColor = _.str.trim(getComputedStyle(document.documentElement).getPropertyValue('--accent-color'));\r\n if (accentColor) {\r\n //Calculate filter value from accent color\r\n var filterValue = colorService.getFiltersToTransformBlackToColor(accentColor);\r\n \r\n //And finally set updated filter to match current accent color\r\n document.styleSheets[0].addRule('.om-Stat-Bookmark-Button-Wrap:before', `filter:${filterValue};`);\r\n }\r\n }\r\n }\r\n\r\n $scope.openTargetUri = function () {\r\n $window.location = $scope.targetUri;\r\n };\r\n })\r\n\r\n .controller('OmStatController', function OmStatController($scope) {\r\n\r\n //The controller code executes before the compilation of the template (rendering)\r\n //var items = $scope.items;\r\n\r\n })\r\n\r\n;\r\n","angular.module('ui.report.reportManager', [])\r\n\r\n .service('reportManager', function ($q, $state, $log, customResourceResolver) {\r\n var reportConfig;\r\n\r\n var _this = this;\r\n\r\n _.extend(_this, {\r\n show: show,\r\n getReportList: getReportList,\r\n getReportListByName: getReportListByName,\r\n getReportConfig: getReportConfig\r\n });\r\n\r\n return _this;\r\n\r\n function getReportConfig() {\r\n return reportConfig;\r\n }\r\n\r\n function getReportList(stepCode) {\r\n //Default reports list is the list of reports to be shown on the items grid\r\n return getReportListByName(stepCode, \"orders-grid-reports\");\r\n }\r\n\r\n function getReportListByName(stepCode, listName, orderItem) {\r\n return customResourceResolver.resolveConfig(listName, null, {step: stepCode, orderItem: orderItem})\r\n .then(function (reportsToShow) {\r\n\r\n //build array of report configs resolvers\r\n var reportsGetters = [];\r\n _.forEach(reportsToShow, function (value) {\r\n reportsGetters.push(customResourceResolver.resolveReport(value, null, {\r\n step: stepCode,\r\n orderItem: orderItem\r\n }));\r\n });\r\n\r\n //once all report configs are resolved, build the reports combo\r\n return $q.all(reportsGetters)\r\n .then(function (results) {\r\n var reportComboItems = [];\r\n _.forEach(results, function (value, key) {\r\n if (value) {\r\n reportComboItems.push(value);\r\n } else {\r\n $log.error(\"Can not read report configuration [\" + reportsToShow[key] + \"] from configuration file.\");\r\n }\r\n });\r\n return reportComboItems;\r\n });\r\n });\r\n }\r\n\r\n function show(config) {\r\n if (!config) {\r\n return;\r\n }\r\n reportConfig = config;\r\n $state.go('client.report');\r\n }\r\n })\r\n\r\n;\r\n","angular.module('ui.report', [\r\n 'ui.report.reportManager',\r\n 'ui.report.reportRouteContainer',\r\n 'ui.report.reportViewer'\r\n]);","angular.module('ui.order.orderItemsGridSharedSettings', [])\r\n\r\n // Shared settings for order item grid and order item list\r\n .service('orderItemsGridSharedSettings', function ($localStorage) {\r\n\r\n // Subscribers of Observer pattern\r\n // We use observers cause Angular doesn't track changes of $scope from 3rd party\r\n var subscribers = {};\r\n\r\n // todo: comments for getters/setters\r\n // todo: 'changed' flag for gridDataProvider cache\r\n\r\n var _this = this;\r\n\r\n /**\r\n * Additional filter: step\r\n * @type {string}\r\n */\r\n var stepFilter;\r\n\r\n /**\r\n * Custom filter configuration object to filter order items. Contains all metadata describing custom filtering procedure.\r\n * Can be used by the orderItemsGridView by triggering the shared settings object to see if the customer filter applied from the customisation config or not.\r\n * @type {{name: string, color: string, queryForStatInfo: string, targetUri: string, iconName: string, uiPriority: int}}\r\n */\r\n var customFilter = null;\r\n\r\n /**\r\n * Additional filter: completed\r\n * @type {{from: Date, to: Date, enabled: boolean}}\r\n */\r\n var completedFilter;\r\n\r\n /**\r\n * Additional filter: created\r\n * @type {{from: Date, to: Date, enabled: boolean}}\r\n */\r\n var createdFilter;\r\n\r\n /**\r\n * Additional filter: text search\r\n * @type {{text: string, exact: boolean}}\r\n */\r\n var textSearch;\r\n\r\n /**\r\n * Page number. 1-based\r\n * @type {number}\r\n */\r\n var pageNumber;\r\n\r\n /**\r\n * Total Page Count\r\n * @type {number}\r\n */\r\n var totalPageCount;\r\n\r\n /**\r\n * Page size\r\n * @type {number}\r\n */\r\n var pageSize;\r\n\r\n var PAGE_SIZE_FOR_STEP_FILTER_PREFIX = \"Grid-Page-Size-For-Step-\";\r\n\r\n /**\r\n * Total Count\r\n * @type {number}\r\n */\r\n var totalCount;\r\n\r\n /**\r\n * Main grid filter\r\n */\r\n var gridFilter;\r\n\r\n /**\r\n * Main grid sorting\r\n */\r\n var gridSort;\r\n\r\n /**\r\n * Selected order Item Ids\r\n * @type {string}\r\n */\r\n var selectedOrderItemIds = [];\r\n\r\n var isExclusiveSelection = false;\r\n\r\n /**\r\n * Flag to indicate that we want to force ignore of the specified page size\r\n * @type {boolean}\r\n */\r\n var forceIgnorePage = false;\r\n\r\n _.extend(_this, {\r\n setStepFilter: setStepFilter,\r\n getStepFilter: getStepFilter,\r\n\r\n setCustomFilter: setCustomFilter,\r\n getCustomFilter: getCustomFilter,\r\n\r\n setCompletedFilter: setCompletedFilter,\r\n getCompletedFilter: getCompletedFilter,\r\n\r\n setCreatedFilter: setCreatedFilter,\r\n getCreatedFilter: getCreatedFilter,\r\n\r\n setTextSearch: setTextSearch,\r\n getTextSearch: getTextSearch,\r\n\r\n setPageNumber: setPageNumber,\r\n getPageNumber: getPageNumber,\r\n\r\n setTotalPageCount: setTotalPageCount,\r\n getTotalPageCount: getTotalPageCount,\r\n\r\n setPageSize: setPageSize,\r\n getPageSize: getPageSize,\r\n\r\n setTotalCount: setTotalCount,\r\n getTotalCount: getTotalCount,\r\n\r\n setGridFilter: setGridFilter,\r\n getGridFilter: getGridFilter,\r\n\r\n setGridSort: setGridSort,\r\n getGridSort: getGridSort,\r\n\r\n setForceIgnorePageSize: setForceIgnorePageSize,\r\n getForceIgnorePageSize: getForceIgnorePageSize,\r\n\r\n setSelectedOrderItemIds: setSelectedOrderItemIds,\r\n getSelectedOrderItemIds: getSelectedOrderItemIds,\r\n\r\n setSelectedOrderItemId: setSelectedOrderItemId,\r\n getSelectedOrderItemId: getSelectedOrderItemId,\r\n\r\n getIsExclusiveSelection: getIsExclusiveSelection,\r\n setIsExclusiveSelection: setIsExclusiveSelection,\r\n\r\n clear: clear,\r\n isClear: isClear,\r\n\r\n onSelectionChange: onSelectionChange\r\n });\r\n\r\n return _this;\r\n\r\n //region Observer pattern\r\n\r\n function onSelectionChange(subscriberName, cb) {\r\n subscribers[subscriberName] = cb;\r\n }\r\n\r\n function selectionWasChanged() {\r\n _.forEach(subscribers, function (callback) {\r\n if (callback && _.isFunction(callback)) {\r\n callback();\r\n }\r\n });\r\n }\r\n\r\n //endregion\r\n\r\n function clear() {\r\n setStepFilter(null);\r\n setTextSearch(null);\r\n setCompletedFilter(null);\r\n setCreatedFilter(null);\r\n setPageNumber(1);\r\n setGridFilter(null);\r\n setGridSort(null);\r\n setTotalPageCount(0);\r\n setTotalCount(0);\r\n setSelectedOrderItemIds(null);\r\n setForceIgnorePageSize(false);\r\n }\r\n\r\n /**\r\n * Check if there was no filters/sorters\r\n */\r\n function isClear() {\r\n return (!completedFilter || !completedFilter.enabled || (!completedFilter.from && !completedFilter.to))\r\n && (!createdFilter || !createdFilter.enabled || (!createdFilter.from && !createdFilter.to))\r\n && (!textSearch || !textSearch.text || textSearch.text.length <= 0)\r\n && !gridFilter\r\n && !gridSort;\r\n }\r\n\r\n //region Getters and setters\r\n\r\n function setForceIgnorePageSize(_ignore) {\r\n forceIgnorePage = _ignore;\r\n }\r\n\r\n function getForceIgnorePageSize() {\r\n return forceIgnorePage;\r\n }\r\n\r\n function setStepFilter(_step) {\r\n if (!_.isEqual(stepFilter, _step)) {\r\n stepFilter = _.clone(_step);\r\n _this.setGridFilter(null);\r\n _this.setGridSort(null);\r\n _this.setPageSize(null); //reset the page size so we can read it from the saved to localStorage value for each Step filter (view) accordingly\r\n _this.setPageNumber(1);\r\n }\r\n //Reset exclusive-mode anyway even if it is the same step. \r\n //i.e.: This is useful when user want to navigate to the 'whole step overview' up from 'single item view')\r\n _this.setIsExclusiveSelection(false);\r\n }\r\n\r\n function getStepFilter() {\r\n return _.clone(stepFilter);\r\n }\r\n\r\n /**\r\n * Sets custom filter config\r\n * @param {{name: string, color: string, queryForStatInfo: string, targetUri: string, iconName: string, uiPriority: int}} [_customFilter] Custom filter config\r\n * @constructor\r\n */\r\n function setCustomFilter(_customFilter) {\r\n customFilter = _customFilter !== null ? _.clone(_customFilter) : null;\r\n _this.setGridFilter(null);\r\n _this.setGridSort(null);\r\n _this.setPageSize(null); //reset the page size so we can read it from the saved to localStorage value for each Step filter (view) accordingly\r\n _this.setPageNumber(1);\r\n\r\n //Reset exclusive-mode anyway even if it is the same step. \r\n //i.e.: This is useful when user want to navigate to the 'whole step overview' up from 'single item view')\r\n _this.setIsExclusiveSelection(false);\r\n }\r\n\r\n function getCustomFilter() {\r\n return _.clone(customFilter);\r\n }\r\n\r\n /**\r\n * Sets completed filter config\r\n * @param {{from: Date, to: Date, enabled: boolean}} [_completed] Order items completion filter config\r\n * @constructor\r\n */\r\n function setCompletedFilter(_completed) {\r\n completedFilter = _.clone(_completed);\r\n }\r\n\r\n function getCompletedFilter() {\r\n return _.clone(completedFilter);\r\n }\r\n\r\n function setCreatedFilter(_created) {\r\n createdFilter = _.clone(_created);\r\n }\r\n\r\n function getCreatedFilter() {\r\n return _.clone(createdFilter);\r\n }\r\n\r\n function setTextSearch(_text, _exactMatch) {\r\n textSearch = {\r\n text: _text,\r\n exact: _exactMatch\r\n };\r\n }\r\n\r\n function getTextSearch() {\r\n return _.clone(textSearch);\r\n }\r\n\r\n function setPageNumber(_pageNumber) {\r\n pageNumber = _pageNumber;\r\n }\r\n\r\n function getPageNumber() {\r\n return pageNumber;\r\n }\r\n\r\n function setTotalPageCount(_totalPageCount) {\r\n totalPageCount = _totalPageCount;\r\n }\r\n\r\n function getTotalPageCount() {\r\n return totalPageCount;\r\n }\r\n\r\n function setPageSize(_pageSize) {\r\n pageSize = _pageSize;\r\n\r\n //Also store the page number for the current step filter\r\n //so later we can return the saved one\r\n if (stepFilter && stepFilter !== '' && stepFilter != null && pageSize != null) {\r\n $localStorage.setItem(PAGE_SIZE_FOR_STEP_FILTER_PREFIX + stepFilter, pageSize);\r\n }\r\n }\r\n\r\n function getPageSize() {\r\n if (!pageSize || pageSize == null) {\r\n if (stepFilter && stepFilter !== '') {\r\n pageSize = $localStorage.getItem(PAGE_SIZE_FOR_STEP_FILTER_PREFIX + stepFilter);\r\n }\r\n }\r\n\r\n return pageSize;\r\n }\r\n\r\n function setTotalCount(_totalCount) {\r\n totalCount = _totalCount;\r\n }\r\n\r\n function getTotalCount() {\r\n return totalCount;\r\n }\r\n\r\n function setGridFilter(_gridFiler) {\r\n gridFilter = _.clone(_gridFiler);\r\n }\r\n\r\n function getGridFilter() {\r\n return _.clone(gridFilter);\r\n }\r\n\r\n function setGridSort(_gridSort) {\r\n if (_gridSort != null) {\r\n gridSort = _.clone(_gridSort);\r\n } else {\r\n gridSort = [{field: \"$model.created\", dir: \"desc\"}];\r\n }\r\n }\r\n\r\n function getGridSort() {\r\n return _.clone(gridSort);\r\n }\r\n\r\n function setSelectedOrderItemIds(ids) {\r\n selectedOrderItemIds = ids;\r\n selectionWasChanged();\r\n }\r\n\r\n function setSelectedOrderItemId(id, _isExclusiveSelection) {\r\n selectedOrderItemIds = [id];\r\n selectionWasChanged();\r\n\r\n if (_isExclusiveSelection && _isExclusiveSelection === true) {\r\n isExclusiveSelection = true;\r\n }\r\n }\r\n\r\n function getSelectedOrderItemIds() {\r\n if (!selectedOrderItemIds) {\r\n return [];\r\n }\r\n return selectedOrderItemIds;\r\n }\r\n\r\n function getSelectedOrderItemId() {\r\n if (!selectedOrderItemIds) {\r\n return null;\r\n }\r\n return selectedOrderItemIds[0];\r\n }\r\n\r\n function getIsExclusiveSelection() {\r\n return !!isExclusiveSelection;\r\n }\r\n function setIsExclusiveSelection(_isExclusiveSelection) {\r\n isExclusiveSelection = _isExclusiveSelection;\r\n }\r\n\r\n //endregion\r\n })\r\n\r\n;\r\n","angular.module('ui.order',\r\n [\r\n 'ui.order.newOrderRouteContainer',\r\n\r\n 'ui.order.orderDetailedRouteContainer',\r\n 'ui.order.orderDetailed',\r\n\r\n 'ui.order.stepDetailedRouteContainer',\r\n 'ui.order.stepDetailed',\r\n\r\n 'ui.order.orderItemsGridRouteContainer',\r\n 'ui.order.orderItemsGrid',\r\n\r\n 'ui.order.orderItemCard',\r\n\r\n 'ui.order.orderItemsGridSharedSettings'\r\n ]);\r\n","angular.module('ui.omqlTester', [])\r\n\r\n .config(function ($stateProvider) {\r\n $stateProvider.state('omql', {\r\n url: '/omql',\r\n templateUrl: 'app/ui/omqlTester/omqlTester.html',\r\n controller: 'OmqlTesterController',\r\n data: {pageTitle: 'OrderManager: OMQL test page'}\r\n });\r\n })\r\n\r\n .controller('OmqlTesterController', function ($scope, orderItemsRepository, $localStorage) {\r\n\r\n var localStorageKey = \"om.omqlTester\";\r\n var oldValues = $localStorage.getItem(localStorageKey);\r\n if (oldValues) {\r\n $scope.where = oldValues.where;\r\n $scope.orderBy = oldValues.orderBy;\r\n }\r\n\r\n $scope.$watchGroup(['where', 'orderBy'], watcher);\r\n\r\n function watcher(newValues, oldValues) {\r\n if (!_.isEqual(newValues, oldValues)) {\r\n $localStorage.setItem(localStorageKey, {\r\n where: $scope.where,\r\n orderBy: $scope.orderBy\r\n });\r\n }\r\n }\r\n\r\n $scope.submit = function () {\r\n $scope.results = \"loading...\";\r\n\r\n orderItemsRepository.search({\r\n where: $scope.where,\r\n orderBy: $scope.orderBy,\r\n \"pageNumber\": 0,\r\n \"rowsPerPage\": 50\r\n }).then(\r\n function (resp) {\r\n if (resp) {\r\n resp.items = _.map(resp.items, function (i) {\r\n return i.getServerModel();\r\n });\r\n $scope.results = JSON.stringify(resp, null, 4);\r\n } else {\r\n $scope.results = \"NULL\";\r\n }\r\n }, function (resp) {\r\n $scope.results = resp.message || \"Unknown error\";\r\n });\r\n\r\n };\r\n\r\n })\r\n\r\n;","angular.module('ui.pwdReset', [\r\n 'ui.login.loginShadow'\r\n])\r\n\r\n .config(function ($stateProvider, customTemplateResolverProvider) {\r\n $stateProvider.state('passwordReset', {\r\n url: '/password/reset?key',\r\n template: customTemplateResolverProvider.get('pwdReset.html', 'app/ui/login/pwdReset.html'),\r\n controller: 'PasswordResetController',\r\n data: {pageTitle: 'OrderManager: Reset password'}\r\n });\r\n })\r\n\r\n .controller('PasswordResetController', function PasswordResetController($scope, $state, $localStorage, $stateParams, $timeout, authService, toastr, gettextCatalog, serverLocalization) {\r\n $scope.isBusy = false;\r\n $scope.pwdResetSuccess = false;\r\n $scope.pwdResetKey = $stateParams.key;\r\n $scope.pwdResetLabel = gettextCatalog.getString(\"Reset the password for your OrderManager account\");\r\n $scope.passwordValidationRegex = /.*/g;\r\n $scope.passwordValidationMessage = \"\";\r\n\r\n //We need to get password validation regex and message to later use with kendo-validator\r\n authService.getPasswordValidationRegex().then(function (regex) {\r\n $scope.passwordValidationRegex = regex;\r\n $scope.passwordValidationMessage = gettextCatalog.getString(\"PasswordStrength.ValidationMessage\");\r\n });\r\n\r\n //custom validation rule 'password equal'\r\n $scope.pwdValidatorOptions = {\r\n rules: {\r\n pwdequal: function (input) {\r\n if (input.is(\"[name=confirmNewPwd]\")) {\r\n return input.val() === $scope.newPwd;\r\n }\r\n return true;\r\n }\r\n }\r\n };\r\n\r\n $scope.doPwdReset = function () {\r\n\r\n if (!$scope.pwdValidator.validate()) {\r\n return false;\r\n }\r\n\r\n $scope.pwdResetLabel = gettextCatalog.getString(\"Resetting password...\");\r\n $scope.isBusy = true;\r\n\r\n authService.doPasswordReset($scope.pwdResetKey, $scope.newPwd)\r\n .then(\r\n function () {\r\n $scope.pwdResetLabel = gettextCatalog.getString(\"Your password has been reset.\");\r\n $scope.pwdResetSuccess = true;\r\n $scope.isBusy = false;\r\n },\r\n function (resp) {\r\n var data = resp.data;\r\n var msg;\r\n if (data && data.ErrorMessage && _.isString(data.ErrorMessage)) {\r\n msg = data.ErrorMessage;\r\n } else if (data && _.isString(data) && data.length > 0 && data.length < 256) {\r\n msg = data;\r\n } else {\r\n msg = gettextCatalog.getString(\"Password reset failed due to an error\");\r\n }\r\n $scope.pwdResetLabel = gettextCatalog.getString(\"Password reset failed due to an error\");\r\n toastr.error(msg, gettextCatalog.getString(\"Password reset failed\"));\r\n $scope.isBusy = false;\r\n $scope.pwdResetSuccess = false;\r\n });\r\n\r\n return false;\r\n };\r\n })\r\n\r\n;\r\n","angular.module('ui.login', [\r\n 'ui.login.loginShadow'\r\n])\r\n\r\n .config(function ($stateProvider, customTemplateResolverProvider) {\r\n $stateProvider.state('login', {\r\n url: '/login',\r\n template: customTemplateResolverProvider.get('login.html', 'app/ui/login/login.html'),\r\n controller: 'LoginController',\r\n data: {pageTitle: 'OrderManager: Login please'},\r\n resolve: {\r\n loadingWaiter: function () {\r\n //hack that will hide loading screen, when main state is ready\r\n if (window.omHideLoadingScreenCallback) {\r\n window.omHideLoadingScreenCallback();\r\n }\r\n }\r\n }\r\n });\r\n })\r\n .directive(\"autofill\", function () {\r\n return {\r\n require: \"ngModel\",\r\n link: function (scope, element, attrs, ngModel) {\r\n scope.$on(\"autofill:update\",\r\n function () {\r\n ngModel.$setViewValue(element.val()); //this will set the value from input element to its ngModel so AngularJS will see the value during digest\r\n });\r\n scope.$on(\"autofill:focus\",\r\n function () {\r\n element.focus();\r\n });\r\n\r\n //The following necessary to subscribe to css event when animation starts or ends.\r\n //In css style for the input fields we did set the special animation to be triggered when browser autofill the values\r\n //so we will catch the moment when browser fills values in and we will update the model accordingly\r\n //if (element[0] && element[0].addEventListener) {\r\n\r\n // element.on('blur input',\r\n // function () {\r\n // console.log('blur input: Element value: ' + element.val());\r\n // ngModel.$setViewValue(element.val());\r\n // });\r\n\r\n // element[0].addEventListener('animationend',\r\n // function(e) {\r\n // switch (e.animationName) {\r\n // case \"onAutoFillStart\":\r\n // console.log('onAutoFillStart: Element value: ' + element.val());\r\n // ngModel.$setViewValue(element.val());\r\n // case \"onAutoFillCancel\":\r\n // console.log('onAutoFillCancel: Element value: ' + element.val());\r\n // ngModel.$setViewValue(\"\");\r\n // }\r\n // console.log(element.val());\r\n // });\r\n //}\r\n }\r\n };\r\n })\r\n\r\n .controller('LoginController', function LoginController($scope, $state, $localStorage, $timeout, serverInfoService, \r\n authService, toastr, gettextCatalog) {\r\n $scope.isBusy = false;\r\n $scope.credentials = {};\r\n $scope.isPwdResetRequested = false;\r\n $scope.pwdResetRequestUser = null;\r\n $scope.pwdResetRequestSuccess = false;\r\n $scope.pwdResetLabel = gettextCatalog.getString(\"Reset your password\");\r\n\r\n $scope.login = function () {\r\n $scope.isBusy = true;\r\n $scope.$broadcast(\"autofill:update\");\r\n\r\n authService.login($scope.credentials.login, $scope.credentials.password)\r\n .then(\r\n function () {\r\n $state.go('client.home');// redirect user to his home page\r\n\r\n //And check if we need to ask user to reload current tab to load latest client app version from server\r\n return serverInfoService.checkServerVersionAndAskReloadIfNeeded();\r\n },\r\n function (resp) {\r\n var data = resp.data;\r\n var msg;\r\n if (data && data.error && _.isString(data.error)) {\r\n msg = data.error;\r\n } else if (data && _.isString(data) && data.length > 0 && data.length < 256) {\r\n msg = data;\r\n } else {\r\n msg = gettextCatalog.getString(\"Wrong username or password. Please try again.\");\r\n }\r\n toastr.error(msg, gettextCatalog.getString(\"Login failed\"));\r\n $scope.isBusy = false;\r\n });\r\n\r\n return false;\r\n };\r\n\r\n $scope.requestPwdReset = function () {\r\n\r\n if (!$scope.userNameEmailValidator.validate()) {\r\n return false;\r\n }\r\n\r\n $scope.pwdResetLabel = gettextCatalog.getString(\"Requesting password reset...\");\r\n $scope.isBusy = true;\r\n\r\n authService.requestPasswordReset($scope.pwdResetRequestUser)\r\n .then(\r\n function () {\r\n $scope.pwdResetLabel = gettextCatalog.getString(\"Password Reset Key has been sent to your registered Email Address.\");\r\n $scope.pwdResetRequestSuccess = true;\r\n $scope.isBusy = false;\r\n },\r\n function (resp) {\r\n var data = resp.data;\r\n var msg;\r\n if (data && data.error && _.isString(data.error)) {\r\n msg = data.error;\r\n } else if (data && _.isString(data) && data.length > 0 && data.length < 256) {\r\n msg = data;\r\n } else {\r\n msg = gettextCatalog.getString(\"Request to reset password failed due to an error\");\r\n }\r\n toastr.error(msg, gettextCatalog.getString(\"Request failed\"));\r\n $scope.isBusy = false;\r\n $scope.pwdResetRequestSuccess = false;\r\n });\r\n\r\n return false;\r\n };\r\n })\r\n\r\n;\r\n","angular.module('ui.loadingShadow', [])\r\n\r\n .service(\"loadingShadowService\", function ($compile, $rootScope) {\r\n var _this = this;\r\n var scope;\r\n var el;\r\n\r\n _this.show = function () {\r\n if (scope) {\r\n return;\r\n }\r\n scope = $rootScope.$new(true);\r\n el = $compile(\"\")(scope);\r\n angular.element(\"body\").append(el);\r\n };\r\n\r\n _this.hide = function () {\r\n if (scope) {\r\n scope.$destroy();\r\n el.remove();\r\n scope = null;\r\n el = null;\r\n }\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n .directive('loadingShadow', function () {\r\n return {\r\n restrict: \"E\",\r\n template: '
    ' +\r\n '
    ' +\r\n '
    ' +\r\n '
    {{\"Sorry, server is not responding\"|translate}}
    ' +\r\n '
    {{\"We will bring you online as soon as possible...\"|translate}}
    ' +\r\n '
    ' +\r\n '
    ',\r\n controller: \"LoadingShadowController\",\r\n scope: {}\r\n };\r\n })\r\n\r\n .controller('LoadingShadowController', function LoadingShadowController($scope) {\r\n\r\n })\r\n\r\n;\r\n","angular.module('ui.home',\r\n [\r\n 'ui.omStat'\r\n ])\r\n\r\n .config(function ($stateProvider, $urlRouterProvider, customTemplateResolverProvider) {\r\n\r\n $urlRouterProvider.when('/client', '/client/home');\r\n\r\n $stateProvider.state('client.home', {\r\n url: '/home',\r\n template: customTemplateResolverProvider.get('home.html', 'app/ui/home/home.html'),\r\n controller: 'HomeController',\r\n\r\n data: {pageTitle: 'OrderManager: Home'}\r\n });\r\n })\r\n\r\n .controller('HomeController', function HomeController($q, $log, $timeout, $rootScope, $scope, $state, toastr, gettextCatalog, customResourceResolver,\r\n $customisationConfig, usersRepository, workflowRepository, orderItemsRepository, \r\n barcodeScannerListenerService, orderItemsGridSharedSettings, gridDataProvider,\r\n permissions, homeControllerUpdatesService, uiLocalization) {\r\n var defaultColor = \"grey\";\r\n\r\n if (angular.isUndefined($rootScope.orderStates)) $rootScope.orderStates = [];\r\n if (angular.isUndefined($rootScope.customOrderStates)) $rootScope.customOrderStates = [];\r\n if (angular.isUndefined($rootScope.allOpenOrdersCount)) $rootScope.allOpenOrdersCount = 0;\r\n\r\n //Save references on the local scope, so we can show the same values in our view\r\n $scope.orderStates = $rootScope.orderStates;\r\n $scope.customOrderStates = $rootScope.customOrderStates;\r\n $scope.allOpenOrdersCount = $rootScope.allOpenOrdersCount;\r\n\r\n $scope.isBusy = true;\r\n \r\n //Subscribe to barcode scanner events\r\n var barcodeScannerUnsubscribe = barcodeScannerListenerService.events.on('valueScanned', checkBarcode);\r\n\r\n var lazyInitData = _.debounceLimited(initData, 2000, 5000);\r\n\r\n initData();\r\n initSignalREvents();\r\n\r\n $scope.$on(\"$destroy\", function () {\r\n // Commented the code to unsubscribe so we will keep the handlers working even when we left the Home view to refresh\r\n // orderStates statistics data used from $rootScope on other views.\r\n // TODO: We probably might want to refactor that into separate service supplying 'orderStates' data to Home view and other views\r\n //\r\n //homeControllerUpdatesService.onOrderItemChanged(void 0);\r\n //homeControllerUpdatesService.onNewOrderItem(void 0);\r\n //homeControllerUpdatesService.onOrderChanged(void 0);\r\n\r\n barcodeScannerUnsubscribe();\r\n });\r\n\r\n function initSignalREvents() {\r\n homeControllerUpdatesService.onOrderItemChanged(function () {\r\n lazyInitData();\r\n });\r\n homeControllerUpdatesService.onNewOrderItem(function () {\r\n lazyInitData();\r\n });\r\n\r\n homeControllerUpdatesService.onOrderChanged(function () {\r\n lazyInitData();\r\n });\r\n }\r\n\r\n var initDataPromise;\r\n\r\n function initData() {\r\n\r\n if (initDataPromise) {\r\n return initDataPromise\r\n .then(function () {\r\n return initData();\r\n }, function () {\r\n return initData();\r\n });\r\n }\r\n\r\n initDataPromise = $q.all([\r\n usersRepository.getCurrentUser(),\r\n workflowRepository.getSteps(),\r\n workflowRepository.getStepStatistics(),\r\n customResourceResolver.resolveWorkflow(),\r\n customResourceResolver.resolveConfig('om-stat-custom-order-states', [], {})\r\n ])\r\n .then(function (data) {\r\n var restUser = data[0];\r\n var steps = data[1];\r\n var stepsStat = data[2];\r\n var workflowConfig = data[3];\r\n var customOrderStatesConfig = data[4];\r\n\r\n //Merge steps statistics data from server with the configuration/customisation data\r\n var stepsConfig = workflowConfig.steps;\r\n var promises = [];\r\n var orderStates = [];\r\n var customOrderStates = [];\r\n var allOpenOrdersCount = 0;\r\n\r\n _.forEach(steps, function (stepModel, stepIndex) {\r\n var step = stepModel.$model;\r\n\r\n promises.push(permissions.isStepTransitionAllowed(step.id)\r\n .then(function (isAllowed) {\r\n var stepConfig = _.find(stepsConfig, function (s) {\r\n return s.code == step.code;\r\n });\r\n var stepStat = _.find(stepsStat, function (ss) {\r\n return ss.step == step.code;\r\n });\r\n var stepStatisticValue = angular.isDefined(stepStat) ? stepStat.numOrderItems : 0;\r\n\r\n //Skip the 'ignored' in the workflow configuration steps and don't even count items on that step\r\n if (stepConfig && stepConfig.ignore === true) {\r\n return;\r\n }\r\n //Skip the 'hidden' step in terms of counting items and do not show it's button on home view\r\n //However as this step is just hidden but not ignored - its items will be searchable during search\r\n if (stepConfig && stepConfig.hide === true) {\r\n return;\r\n }\r\n\r\n //Count items (to show stats on 'All orders' button, but skip step-button creation if user\r\n //has no rights to view the step or its action(s) of that step.\r\n allOpenOrdersCount += stepStatisticValue;\r\n if (!isAllowed) {\r\n return;\r\n }\r\n\r\n var isCustomer = restUser.isCustomer();\r\n var noIcon = angular.isDefined(stepConfig) && !!stepConfig.noImageOnHomeView;\r\n\r\n var fallbackIconForStep = function (stepCode) {\r\n return $customisationConfig.hasResource(function (res) { return _.string.contains(res, stepCode + \".\"); }) ? stepCode : \"workflow\";\r\n };\r\n\r\n //Info: We do localise step names using server-side localisation.\r\n //This is achieved via 'sTranslate' angular filter inside the 'home view' html templates\r\n orderStates.push({\r\n code: step.code,\r\n arrowDown: angular.isDefined(stepConfig) && angular.isDefined(stepConfig.arrowDown)\r\n ? stepConfig.arrowDown\r\n : false,\r\n arrowUp: angular.isDefined(stepConfig) && angular.isDefined(stepConfig.arrowUp)\r\n ? stepConfig.arrowUp\r\n : false,\r\n fork: angular.isDefined(stepConfig) && angular.isDefined(stepConfig.fork)\r\n ? stepConfig.fork\r\n : false,\r\n forked: angular.isDefined(stepConfig) && angular.isDefined(stepConfig.forked)\r\n ? stepConfig.forked\r\n : false,\r\n forksJoin: angular.isDefined(stepConfig) && angular.isDefined(stepConfig.forksJoin)\r\n ? stepConfig.forksJoin\r\n : false,\r\n afterJoin: angular.isDefined(stepConfig) && angular.isDefined(stepConfig.afterJoin)\r\n ? stepConfig.afterJoin\r\n : false,\r\n name: isCustomer ? step.publicNameResource : step.nameResource,\r\n statInfo: stepStatisticValue,\r\n color: angular.isDefined(stepConfig) && angular.isDefined(stepConfig.color)\r\n ? stepConfig.color\r\n : defaultColor,\r\n isFloating: angular.isDefined(stepConfig) &&\r\n angular.isDefined(stepConfig.isFloating)\r\n ? stepConfig.isFloating\r\n : false,\r\n uiPriority: angular.isDefined(stepConfig) &&\r\n angular.isDefined(stepConfig.uiPriority)\r\n ? stepConfig.uiPriority\r\n : Infinity,\r\n iconName: !noIcon\r\n ? (angular.isUndefined(stepConfig)\r\n ? fallbackIconForStep(step.code) : (angular.isDefined(stepConfig.publicImageResourceName) && isCustomer\r\n ? stepConfig.publicImageResourceName : (angular.isDefined(stepConfig.imageResourceName)\r\n ? stepConfig.imageResourceName : fallbackIconForStep(step.code)))) : \"\"\r\n });\r\n }));\r\n });\r\n\r\n //See if we have configured in config custom order states queries to show on the Home view stats area\r\n //in addition to the OM existing workflow steps\r\n if (customOrderStatesConfig && customOrderStatesConfig.length > 0) {\r\n _.forEach(customOrderStatesConfig, function (customOrderStateConfig, customOrderStateConfigIndex) {\r\n\r\n if (customOrderStateConfig.queryForStatInfo) {\r\n\r\n // Commented out for the time being as the query seems to be VERY HIGHLOAD for the server when called constantly\r\n // we need to find another solution or a faster query for stats\r\n //\r\n //var getStatResultFromQueryPromise = orderItemsRepository.searchCount({ where: customOrderStateConfig.queryForStatInfo })\r\n // .then(function (customOrderStateQueryResult) {\r\n // //Save stat info onto custom order state config and use it for UI\r\n // customOrderStateConfig.statInfo = customOrderStateQueryResult;\r\n // customOrderStates.push(customOrderStateConfig);\r\n\r\n // $log.debug(_.str.sprintf('Custom stat [%s] query: %s', customOrderStateQueryResult, customOrderStateConfig.queryForStatInfo));\r\n // });\r\n\r\n //Instead let's just create a simple promise and then put the custom button config into customOrderStates collection\r\n var getStatResultFromQueryPromise = $q.when(true).then(function() {\r\n customOrderStateConfig.statInfo = '';\r\n customOrderStates.push(customOrderStateConfig);\r\n\r\n $log.debug(_.str.sprintf('IGNORED custom stat query: %s', customOrderStateConfig.queryForStatInfo));\r\n });\r\n\r\n promises.push(getStatResultFromQueryPromise);\r\n }\r\n });\r\n }\r\n\r\n return $q.all(promises)\r\n .then(function () {\r\n initDataPromise = null;\r\n \r\n //Update data shown to user\r\n setOrUpdateObjectsCollection($rootScope.orderStates, orderStates, function (s1, s2) { return s1.code === s2.code; });\r\n setOrUpdateObjectsCollection($rootScope.customOrderStates, customOrderStates, function (s1, s2) { return s1.code === s2.code; });\r\n \r\n $scope.allOpenOrdersCount = allOpenOrdersCount;\r\n $rootScope.allOpenOrdersCount = allOpenOrdersCount;\r\n $scope.isBusy = false;\r\n });\r\n })\r\n .catch(function (resp) {\r\n initDataPromise = null;\r\n if (resp && resp.status) {\r\n toastr.error(uiLocalization.translate(\"Data request failed. Error %s : %s\", resp.status, resp.statusText));\r\n } else {\r\n toastr.error(gettextCatalog.getString(\"Data request failed\"), gettextCatalog.getString(\"Server is not responding\"));\r\n }\r\n });\r\n\r\n return initDataPromise;\r\n }\r\n\r\n function setOrUpdateObjectsCollection(arrExistingData, arrNewData, matcher) {\r\n if (!arrExistingData || (arrNewData && arrExistingData.length !== arrNewData.length)) {\r\n //Completely new data, so assign the new data from collection with new data to the specified collection with existing data\r\n arrExistingData.splice(0, arrExistingData.length, ...arrNewData);\r\n } else {\r\n //Otherwise merge data so the numbers will be updated, not redrawn\r\n arrExistingData.forEach(function (o, index) {\r\n var found = _.find(arrNewData, function(o2) { return matcher(o, o2); });\r\n if (found) {\r\n //Update existing object values\r\n Object.assign(o, found);\r\n } else {\r\n //If not found - element was removed, so delete it\r\n arrExistingData.splice(index, 1);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Handle barcode scanner value scanned\r\n */\r\n function checkBarcode(e) {\r\n //See if the scanned value corresponds to any valid order item Id of any item on the currently \r\n //being shown step, then select that item and redirect to the 'detailed' view\r\n if (e.value.length > 0) {\r\n //See if we have such an item in OrderManager\r\n findItem(e.value)\r\n .then(function (found) {\r\n if (found && found.items && found.items.length === 1) {\r\n //If it does exist, redirect user to the items list filtering it to show \r\n //this exact item and making it a selected one to bring up into view\r\n orderItemsGridSharedSettings.setSelectedOrderItemId(found.items[0].getId());\r\n $state.go('client.step', {step: $scope.step});\r\n orderItemsGridSharedSettings.setTextSearch(e.value, false); //switch off 'exact match'\r\n } else {\r\n //Nothing found so just reset search and refresh grid\r\n var snd = new Audio(\"data:audio/wav;base64,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qJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=\");\r\n snd.play();\r\n toastr.warning(gettextCatalog.getString('There are no items corresponding to the scanned barcode [' + e.value + '].'), gettextCatalog.getString('Nothing found :('));\r\n orderItemsGridSharedSettings.setTextSearch('', false);\r\n }\r\n });\r\n }\r\n }\r\n\r\n function findItem(value) {\r\n if (value) {\r\n orderItemsGridSharedSettings.setStepFilter('all-open');\r\n orderItemsGridSharedSettings.setTextSearch(value, true); //setting 'exact match'\r\n\r\n return gridDataProvider.getData();\r\n }\r\n\r\n return $q.when(null);\r\n }\r\n })\r\n\r\n // Separate service for update events (to prevent multiple event subscription)\r\n .service('homeControllerUpdatesService', function (rest) {\r\n var _this = this;\r\n var newOrderItemCb;\r\n var orderItemChangedCb;\r\n var orderChangedCb;\r\n\r\n rest.events.on(\"modelCreatedOnServer\", function (modelInfo) {\r\n if (!newOrderItemCb) {\r\n return;\r\n }\r\n if (modelInfo && modelInfo.modelType === \"OrderItemModel\") {\r\n newOrderItemCb(modelInfo);\r\n }\r\n });\r\n\r\n rest.events.on(\"modelUpdatedOnServer\", function (modelInfo) {\r\n if (modelInfo.modelType === \"OrderItemModel\" && orderItemChangedCb) {\r\n orderItemChangedCb(modelInfo);\r\n } else if (modelInfo.modelType === \"OrderModel\" && orderChangedCb) {\r\n orderChangedCb(modelInfo);\r\n }\r\n });\r\n\r\n _this.onNewOrderItem = function (cb) {\r\n newOrderItemCb = cb;\r\n };\r\n\r\n _this.onOrderItemChanged = function (cb) {\r\n orderItemChangedCb = cb;\r\n };\r\n\r\n _this.onOrderChanged = function (cb) {\r\n orderChangedCb = cb;\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;\r\n","angular.module('ui.help',\r\n [])\r\n\r\n .config(function ($stateProvider, customTemplateResolverProvider) {\r\n $stateProvider.state('client.help', {\r\n url: '/help',\r\n template: customTemplateResolverProvider.get('help.html', 'app/ui/help/help.html'),\r\n controller: 'HelpController',\r\n\r\n data: {pageTitle: 'OrderManager: Help'}\r\n });\r\n })\r\n\r\n .controller('HelpController', function HelpController($scope, $state) {\r\n\r\n $scope.close = function () {\r\n $state.go('client.home'); // redirect back to home\r\n };\r\n\r\n }\r\n );\r\n","angular.module('ui.customer',\r\n [\r\n 'ui.customer.list',\r\n 'ui.customer.overview'\r\n ]);\r\n","angular.module('ui.error', [])\r\n\r\n .config(function ($stateProvider) {\r\n $stateProvider.state('error', {\r\n url: '/error',\r\n templateUrl: 'app/ui/error/error.html',\r\n controller: 'ErrorController',\r\n data: {pageTitle: 'OrderManager: Error description'},\r\n resolve: {\r\n loadingWaiter: function () {\r\n //hack that will hide loading screen, when main state is ready\r\n if (window.omHideLoadingScreenCallback) {\r\n window.omHideLoadingScreenCallback();\r\n }\r\n }\r\n }\r\n });\r\n })\r\n\r\n .controller('ErrorController', function ErrorController($scope, $window, $interval, $localStorage) {\r\n $scope.appErrors = []; // collection of error messages\r\n var refreshPromise;\r\n\r\n $scope.clearErrors = function () {\r\n $scope.appErrors = [];\r\n $localStorage.setItem(\"errors\", []);\r\n };\r\n\r\n $scope.refreshErrors = function () {\r\n try {\r\n $scope.appErrors = ($localStorage.getItem(\"errors\") || []).slice().reverse();\r\n } catch (e) {\r\n if (refreshPromise) {\r\n $interval.cancel(refreshPromise);\r\n }\r\n console.error(\"We were unable to refresh `/error` page\", e);\r\n }\r\n };\r\n\r\n $scope.refreshErrors();\r\n refreshPromise = $interval($scope.refreshErrors, 1000);\r\n })\r\n;","angular.module('ui.centre',\r\n [\r\n 'ui.centre.list',\r\n 'ui.centre.overview'\r\n ]);\r\n","angular.module('ui.appReload', [])\r\n\r\n .service(\"appReloadService\", function ($compile, $rootScope) {\r\n var _this = this;\r\n var scope;\r\n var el;\r\n\r\n _this.show = function () {\r\n if (scope) {\r\n var dialog = $(\"#confirmAppReloadDialog\").data(\"kendoDialog\");\r\n dialog.open();\r\n return;\r\n }\r\n scope = $rootScope.$new(true);\r\n el = $compile(\"\")(scope);\r\n angular.element(\"body\").append(el);\r\n };\r\n\r\n _this.hide = function () {\r\n if (scope) {\r\n scope.$destroy();\r\n el.remove();\r\n scope = null;\r\n el = null;\r\n }\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n .directive('appReload', function () {\r\n return {\r\n restrict: \"E\",\r\n template: '
    ' +\r\n '
    {{\\'It is recommended to reload current OrderManager tab in order to get the latest updates and best experience.\\'|translate}}
    ' +\r\n '
    {{\\'Reload?\\'|translate}}
    ' +\r\n '
    ',\r\n controller: \"AppReloadController\",\r\n scope: {}\r\n };\r\n })\r\n\r\n .controller('AppReloadController', function AppReloadController($window, $scope, uiLocalization, appReloadService) {\r\n $scope.confirmAppReloadDialogOptions = {\r\n //buttonLayout: \"normal\"\r\n width: \"35%\"\r\n };\r\n\r\n $scope.appReloadDialogActions = [\r\n {\r\n text: uiLocalization.translate('Yes'),\r\n primary: true,\r\n action: function (e) {\r\n $window.location.reload(true); //reload with forcing the 'get' to try and get non cached latest version from server\r\n }\r\n },\r\n {\r\n text: uiLocalization.translate('No'),\r\n action: function (e) {\r\n }\r\n }\r\n ];\r\n })\r\n\r\n ;\r\n","angular.module('env.userSettings', [])\r\n\r\n .provider('userSettings', function ($localStorageProvider) {\r\n\r\n var _this = this;\r\n var userSettingsKey = \"om.userSettings\";\r\n var initPromise;\r\n var returnLocalPromise;\r\n\r\n /**\r\n * User settings object\r\n */\r\n var settings;\r\n\r\n /**\r\n * Save current settings to local storage\r\n */\r\n function saveSettings() {\r\n var settingsToSave = settings || {};\r\n $localStorageProvider.setItem(userSettingsKey, settingsToSave);\r\n return settingsToSave;\r\n }\r\n\r\n function getSettings() {\r\n return initPromise.then(function(s) {\r\n return settings; //Returning 'settings' here to make sure we don't miss any change on settings object done by other callers\r\n });\r\n }\r\n\r\n _.extend(_this, {\r\n save: saveSettings,\r\n getSettings: getSettings\r\n });\r\n\r\n this.$get = function (customResourceResolver, $localStorage, $q) {\r\n\r\n initSettings();\r\n\r\n return _this;\r\n\r\n function initSettings() {\r\n initPromise = customResourceResolver.resolveConfig(\"defaultUserSettings-config\", null)\r\n .then(function(customDefaultUserSettings) {\r\n var versionFromDefaultConfig = om.config.defaultUserSettings.version || 0;\r\n var versionFromCustomConfig = (customDefaultUserSettings && !_.isEqual(customDefaultUserSettings, {})) ? (customDefaultUserSettings.version || 0) : 0;\r\n var versionFromSaved = 0;\r\n\r\n //See if we have stored settings locally\r\n var settingsToUse = $localStorage.getItem(userSettingsKey);\r\n if (settingsToUse && !_.isEqual(settingsToUse, {})) {\r\n versionFromSaved = settingsToUse.version || 0;\r\n if (versionFromSaved >= versionFromCustomConfig && versionFromSaved >= versionFromDefaultConfig) {\r\n settings = _.clone(settingsToUse);\r\n return settings;\r\n }\r\n }\r\n \r\n //As we have no settings stored locally, use the customized default version, or, if not present, global default settings\r\n if (customDefaultUserSettings && !_.isEqual(customDefaultUserSettings, {}) && versionFromCustomConfig >= versionFromDefaultConfig) {\r\n settings = _.clone(customDefaultUserSettings);\r\n } else {\r\n settings = _.clone(om.config.defaultUserSettings);\r\n }\r\n \r\n return settings;\r\n });\r\n\r\n return initPromise;\r\n }\r\n }\r\n });\r\n","angular.module('env.uiRouter', [])\r\n\r\n .config(function config($urlRouterProvider) {\r\n $urlRouterProvider.when('/logout', ['$state', 'authService', function ($state, authService) {\r\n if (authService.isAuthorized()) {\r\n authService.logout().then(function () {\r\n $state.go('login');\r\n });\r\n return;\r\n }\r\n $state.go('login');\r\n }]);\r\n\r\n $urlRouterProvider.otherwise('/client/home');\r\n })\r\n\r\n .run(function ($rootScope, $state, $log, authService, cookiesService, usersRepository, gettextCatalog, toastr, appLocale) {\r\n var stateBeforeLogin;\r\n\r\n authService.events.on('authenticationRequiredAfterReload', function () {\r\n //$state.go('login');\r\n });\r\n\r\n authService.events.on('continueSessionAfterReload', function () {\r\n //$state.go('client.home');\r\n });\r\n\r\n //On login check if we need a user to redirect to the profile view\r\n //to fill-in missing information\r\n //Also show Cookies policy message if necessary\r\n authService.events.on('login', function () {\r\n\r\n //We have to show cookies warning but only after the app locales loaded\r\n //to make sure the warning will be translated\r\n appLocale.loading.ensureLoaded()\r\n .then(function () {\r\n cookiesService.showCookiesPolicyMessage();\r\n });\r\n\r\n usersRepository.getCurrentUser().then(function (user) {\r\n if (user && !user.isValid()) {\r\n $state.go('client.userprofile');\r\n toastr.warning('It is missing some important information', gettextCatalog.getString('Your profile is incomplete'));\r\n }\r\n });\r\n });\r\n\r\n $rootScope.$on('$stateNotFound',\r\n function (event, unfoundState, fromState, fromParams) {\r\n $log.error(\"Can't found state '%s'\", unfoundState);\r\n }\r\n );\r\n\r\n $rootScope.$on('$stateChangeError',\r\n function (event, toState, toParams, fromState, fromParams, error) {\r\n $log.error(\"Can't navigate to the route '%s'\", toState.name, error);\r\n }\r\n );\r\n\r\n $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {\r\n var isAuth = authService.isAuthorized();\r\n\r\n // Some code to redirect user to the state he was going to prior to authentication\r\n if (fromState.name == 'login' && isAuth && stateBeforeLogin && toState.name != stateBeforeLogin.name) {\r\n event.preventDefault();\r\n $state.go(stateBeforeLogin.name, stateBeforeLogin.params);\r\n stateBeforeLogin = null;\r\n return;\r\n }\r\n\r\n // Some code to prevent \"manual\" navigation to login page when we are authorised\r\n if (toState.name == 'login' && isAuth) {\r\n event.preventDefault();\r\n $state.go('client.home');\r\n return;\r\n }\r\n\r\n // Some code to prevent \"manual\" navigation through routes when we weren't authorised\r\n if (toState.name != 'login' && toState.name != 'passwordReset' && toState.name != 'signup' && !isAuth) {\r\n event.preventDefault();\r\n stateBeforeLogin = {\r\n name: toState.name,\r\n params: toParams\r\n };\r\n if (fromState.name != 'login') {\r\n $state.go('login');\r\n }\r\n return;\r\n }\r\n });\r\n\r\n $rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {\r\n $log.debug(\"UI state changed from '%s' to '%s'\", fromState.name, toState.name);\r\n if (toState.data && toState.data.pageTitle) {\r\n $rootScope.pageTitle = gettextCatalog.getString(toState.data.pageTitle);\r\n }\r\n $state.previous = (fromState && fromState.name) ? fromState.name : null;\r\n });\r\n })\r\n\r\n;\r\n","angular.module('env.threejs.threejsLoader', [])\r\n\r\n // Service to export geometry as file\r\n .service('threejsLoader', function ($q, $http, $log) {\r\n var _this = this;\r\n\r\n /**\r\n * Loaded and evaluated resources\r\n * @type {string[]}\r\n */\r\n var loadedResources = [];\r\n\r\n /**\r\n * Parse function call\r\n *\r\n * @callback parseFunc\r\n * @param {ArrayBuffer} arrayBuffer\r\n * @param {Object} loaderInfo\r\n * @param {string} filename\r\n */\r\n\r\n /**\r\n * Supported loader file formats\r\n * @typedef {Object} LoaderInfo\r\n * @property {string[]} ext - possible extensions of current format\r\n * @property {string[]} deps - dependencies (as file URLs) to eval\r\n * @property {boolean} loaded - Indicates whether files for current Loader was loaded and evaluated\r\n * @property {parseFunc} parse - Parse function with proper Three.js Loader call\r\n */\r\n\r\n /**\r\n * Supported loader file formats\r\n * Check vendor/three.js/examples/js/loaders for available loaders\r\n * We list here not all the loaders\r\n * @type {LoaderInfo[]}\r\n */\r\n var loadersInfo = [\r\n {\r\n ext: ['stl'],\r\n deps: ['vendor/three.js/examples/js/loaders/STLLoader.js'],\r\n parse: function (arrayBuffer, loaderInfo, filename) {\r\n return new THREE.STLLoader().parse(arrayBuffer);\r\n // returns THREE.BufferGeometry\r\n }\r\n },\r\n {\r\n // 3D Manufacturing Format\r\n // https://3mf.io/specification/\r\n ext: ['3mf'],\r\n deps: [\r\n 'vendor/jszip/dist/jszip.min.js',\r\n 'vendor/three.js/examples/js/loaders/3MFLoader.js'\r\n ],\r\n parse: function (arrayBuffer, loaderInfo, filename) {\r\n return new THREE.ThreeMFLoader().parse(arrayBuffer);\r\n // returns THREE.Group\r\n }\r\n },\r\n {\r\n // Additive manufacturing file format\r\n // https://en.wikipedia.org/wiki/Additive_manufacturing_file_format\r\n ext: ['amf'],\r\n deps: [\r\n 'vendor/jszip/dist/jszip.min.js',\r\n 'vendor/three.js/examples/js/loaders/AMFLoader.js'\r\n ],\r\n parse: function (arrayBuffer, loaderInfo, filename) {\r\n return new THREE.AMFLoader().parse(arrayBuffer);\r\n // returns THREE.Group\r\n }\r\n },\r\n {\r\n // Away3D Data format\r\n // Will not work with textures\r\n // http://awaytools.com/awdformat/\r\n ext: ['awd'],\r\n deps: [\r\n 'vendor/three.js/examples/js/loaders/AWDLoader.js'\r\n ],\r\n parse: function (arrayBuffer, loaderInfo, filename) {\r\n return new THREE.AWDLoader().parse(arrayBuffer);\r\n // returns THREE.Object3D\r\n }\r\n },\r\n {\r\n // Babylon.js file format (it's JSON actually)\r\n // https://www.babylonjs.com/\r\n // https://doc.babylonjs.com/resources/file_format_map_(.babylon)\r\n ext: ['babylon'],\r\n deps: [\r\n 'vendor/three.js/examples/js/loaders/BabylonLoader.js'\r\n ],\r\n parse: function (arrayBuffer, loaderInfo, filename) {\r\n var decoder = new TextDecoder(\"utf-8\");\r\n var str = decoder.decode(new Uint8Array(arrayBuffer));\r\n var json = JSON.parse(str);\r\n return new THREE.BabylonLoader().parse(json);\r\n // returns THREE.Scene\r\n }\r\n },\r\n\r\n\r\n // BVHLoader.js\r\n // ColladaLoader.js\r\n // DDSLoader.js\r\n // DRACOLoader.js\r\n // EquirectangularToCubeGenerator.js\r\n // EXRLoader.js\r\n // FBXLoader.js\r\n // GCodeLoader.js\r\n // GLTFLoader.js\r\n // HDRCubeTextureLoader.js\r\n // KMZLoader.js\r\n // KTXLoader.js\r\n // LDrawLoader.js\r\n // LoaderSupport.js\r\n // MD2Loader.js\r\n // MMDLoader.js\r\n // MTLLoader.js\r\n // NodeMaterialLoader.js\r\n // NRRDLoader.js\r\n // OBJLoader.js\r\n // OBJLoader2.js\r\n // PCDLoader.js\r\n // PDBLoader.js\r\n // PlayCanvasLoader.js\r\n // PLYLoader.js\r\n // PRWMLoader.js\r\n // PVRLoader.js\r\n // RGBELoader.js\r\n // STLLoader.js\r\n // SVGLoader.js\r\n // TDSLoader.js\r\n // TGALoader.js\r\n // TTFLoader.js\r\n // VRMLLoader.js\r\n // VRMLoader.js\r\n // VTKLoader.js\r\n // XLoader.js\r\n ];\r\n\r\n _.extend(_this, {\r\n parseArrayBuffer: parseArrayBuffer,\r\n parseFile: parseFile\r\n });\r\n\r\n return _this;\r\n\r\n /**\r\n * Load 3D file and return geometry\r\n * @param {File} file\r\n * @return {Promise} Promise of geometry object\r\n */\r\n function parseFile(file) {\r\n if (file == null || file.size <= 0) {\r\n return $q.reject(\"Unable to load file into 3D viewer. File content should not be empty\");\r\n }\r\n return fileToArrayBuffer(file)\r\n .then(function(arrayBuffer) {\r\n return parseArrayBuffer(arrayBuffer, file.name);\r\n });\r\n }\r\n\r\n /**\r\n * Convert file to ArrayBuffer\r\n * @param file\r\n * @return {Promise}\r\n */\r\n function fileToArrayBuffer(file) {\r\n var deferred = $q.defer();\r\n var reader = new FileReader();\r\n reader.onload = function () {\r\n deferred.resolve(reader.result);\r\n };\r\n reader.onerror = function (event) {\r\n $log.error(\"Unable to read local file '\" + (file\r\n ? file.name\r\n : \"[no file]\") + \"' as ArrayBuffer\", event);\r\n reader.abort();\r\n deferred.reject(\"Unable to read local file as ArrayBuffer\");\r\n };\r\n reader.readAsArrayBuffer(file);\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Load 3D file contents as ArrayBuffer and return geometry\r\n * @param {ArrayBuffer} arrayBuffer ArrayBuffer from file\r\n * @param {string} filename file name to extract extension and detect file format\r\n * @return {Promise} Promise of geometry object\r\n */\r\n function parseArrayBuffer(arrayBuffer, filename) {\r\n if (arrayBuffer == null || arrayBuffer.byteLength <= 0) {\r\n return $q.reject(\"Unable to load file into 3D viewer. File content should not be empty\");\r\n }\r\n if (!filename) {\r\n return $q.reject(\"Unable to load file into 3D viewer. File name should not be empty\");\r\n }\r\n\r\n var loaderInfo = findLoaderByFilename(filename);\r\n if (!loaderInfo) {\r\n return $q.reject(\"Unable to load file into 3D viewer. Format is not supported\");\r\n }\r\n return ensureLoaderLoaded(loaderInfo)\r\n .then(function () {\r\n try {\r\n return loaderInfo.parse(arrayBuffer, loaderInfo, filename);\r\n } catch (e) {\r\n return $q.reject(\"Unable to parse file\");\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Ensure loader was loaded and evaluated\r\n * @param loaderInfo\r\n * @return {Promise}\r\n */\r\n function ensureLoaderLoaded(loaderInfo) {\r\n if (loaderInfo.loaded === true) {\r\n return $q.when(loaderInfo);\r\n }\r\n return loadLoader(loaderInfo);\r\n }\r\n\r\n /**\r\n * Load loader js file and eval it\r\n * @param {LoaderInfo} loaderInfo\r\n * @return {Promise}\r\n */\r\n function loadLoader(loaderInfo) {\r\n // remove already loaded resources if any\r\n var notLoadedDeps = _.filter(loaderInfo.deps, function (fileUrl) {\r\n return !_.contains(loadedResources, fileUrl);\r\n });\r\n\r\n var promises = _.map(notLoadedDeps, function (fileUrl) {\r\n return $http.get(fileUrl)\r\n .then(function (response) {\r\n try {\r\n eval(response.data);\r\n // $log.debug(\"[threejsLoader] file loaded and evaluated: \" + fileUrl);\r\n } catch (e) {\r\n $log.error(\"[threejsLoader] Unable to eval file: \" + fileUrl);\r\n return $q.reject(\"Unable to load three.js loader dependency: \" + fileUrl);\r\n }\r\n loadedResources.push(fileUrl);\r\n }, function () {\r\n $log.error(\"[threejsLoader] Unable to load loader js file \" + fileUrl);\r\n return $q.reject(\"Unable to load three.js loader dependency: \" + fileUrl);\r\n });\r\n });\r\n\r\n return $q.all(promises)\r\n .then(function () {\r\n loaderInfo.loaded = true;\r\n return loaderInfo;\r\n }, function (err) {\r\n loaderInfo.loaded = false;\r\n return $q.reject(err);\r\n });\r\n }\r\n\r\n /**\r\n * Find loader by file extension\r\n * @param {string} filename\r\n * @return {Object}\r\n */\r\n function findLoaderByFilename(filename) {\r\n return _.find(loadersInfo, function (loaderInfo) {\r\n if (!loaderInfo.ext) {\r\n return false;\r\n }\r\n if (_.isString(loaderInfo.ext)) {\r\n return _.string.endsWith(filename.toLowerCase(), loaderInfo.ext.toLowerCase());\r\n }\r\n if (_.isArray(loaderInfo.ext)) {\r\n return loaderInfo.ext.some(function (e) {\r\n return _.string.endsWith(filename.toLowerCase(), e.toLowerCase());\r\n });\r\n }\r\n return false;\r\n });\r\n }\r\n })\r\n\r\n;\r\n","angular.module('env.threejs.threejsExporter', [])\r\n\r\n // Service to export geometry as file\r\n .service('threejsExporter', function ($q, $http, $log) {\r\n var _this = this;\r\n\r\n _.extend(_this, {});\r\n\r\n return _this;\r\n\r\n function load(file) {\r\n\r\n }\r\n })\r\n\r\n;\r\n","angular.module('env.threejs', [\r\n 'env.threejs.threejsLoader',\r\n 'env.threejs.threejsExporter'\r\n]);\r\n","angular.module('env.templateResolver', [])\r\n\r\n .service('templateResolver', function ($http, $q, $templateCache) {\r\n var loadingCache = {};\r\n\r\n var _this = this;\r\n\r\n _.extend(_this, {\r\n resolve: resolve\r\n });\r\n\r\n return _this;\r\n\r\n /**\r\n * Resolve template by url\r\n * @param {string} templateUrl\r\n * @returns {Promise} promise of template as string\r\n */\r\n function resolve(templateUrl) {\r\n var template = $templateCache.get(templateUrl);\r\n if (template) {\r\n var deferred = $q.defer();\r\n deferred.resolve(template);\r\n return deferred.promise;\r\n }\r\n\r\n if (!loadingCache[templateUrl]) {\r\n loadingCache[templateUrl] = $http.get(templateUrl)\r\n .then(function (response) {\r\n delete loadingCache[templateUrl];\r\n $templateCache.put(templateUrl, response.data);\r\n return response.data;\r\n });\r\n }\r\n\r\n return loadingCache[templateUrl];\r\n }\r\n })\r\n\r\n;\r\n","angular.module('env.services', [\r\n 'env.services.barcodeScannerListener',\r\n 'env.services.fileService',\r\n 'env.services.colorService'\r\n])\r\n;\r\n","/* global angular */\r\n(function () {\r\n \"use strict\";\r\n var FILE_UPLOAD_SERVICE_PATH = om.config.build.baseUrl + \"/documents\";\r\n\r\n angular.module('env.services.fileService', [])\r\n .service('fileService', function ($q, $log, toastr, $http, checkDuplicatesService, authService, gettextCatalog) {\r\n var gvUploadSessionId = null;\r\n\r\n angular.extend(this, {\r\n createUploadSession: createUploadSession,\r\n uploadFiles: uploadFiles,\r\n downloadDocumentFile: downloadDocumentFile\r\n });\r\n\r\n function createUploadSession(file, orderItemId, fileId, customName) {\r\n return $http.post(FILE_UPLOAD_SERVICE_PATH + \"/init-upload\", {\r\n \"Id\": fileId,\r\n \"FileName\": customName ? customName : file.name,\r\n \"FileSize\": file.size,\r\n \"OrderItemIds\": [orderItemId]\r\n })\r\n .then(function (result) {\r\n gvUploadSessionId = result;\r\n return { uploadId: result.data, file: file };\r\n }, function (error) {\r\n toastr.error(error.statusText, error.status.toString());\r\n });\r\n }\r\n\r\n function uploadFile(uploadSessionId, file, chunkSize, batchSize, cancelled, progress) {\r\n\r\n var finalChunk = false;\r\n var uploaded = 0;\r\n var size = file.size;\r\n var sent = 0;\r\n var left = size;\r\n var chunk = 0;\r\n var progressCallback = typeof progress === \"undefined\" ? null : progress;\r\n var deferred = $q.defer();\r\n var deferredStart = $q.defer();\r\n var promise = deferredStart.promise;\r\n deferredStart.resolve({ file: file, next: 0, sessionId: uploadSessionId, complete: false });\r\n while (sent < size) {\r\n chunk = left < chunkSize ? left : chunkSize;\r\n promise = promise.then(function (result) {\r\n if (typeof cancelled == 'function' && cancelled() === true) {\r\n $http.post(FILE_UPLOAD_SERVICE_PATH + \"/cancel-upload\", { \"contract\": uploadSessionId });\r\n return $q.reject(\"canceled\");\r\n }\r\n var first = result.next;\r\n var last = first + chunkSize - 1;\r\n if (last > size) {\r\n last = size - 1;\r\n finalChunk = true\r\n }\r\n var data = file.slice(first, last + 1);\r\n return $http.post(FILE_UPLOAD_SERVICE_PATH + \"/upload-data\", data, {\r\n params: {\r\n \"contract\": uploadSessionId,\r\n \"finalize\": finalChunk\r\n }\r\n }).then(function (res) {\r\n uploaded += last - first + 1;\r\n var value = Math.round((uploaded / size) * 100);\r\n progressCallback(file, value, uploadSessionId, finalChunk);\r\n return {\r\n file: file,\r\n next: last + 1,\r\n sessionId: uploadSessionId\r\n };\r\n });\r\n });\r\n sent += chunk;\r\n left -= chunk;\r\n }\r\n promise.then(function (result) {\r\n deferred.resolve(0);\r\n }, function (reason) {\r\n deferred.reject(reason);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n function uploadFiles(files, chunkSize, batchSize, concurrencyLevel, cancelled, progress,\r\n orderItemId, isNewOrder) {\r\n if (typeof cancelled == 'function' && cancelled() === true) return null;\r\n var sessions = [];\r\n var deferred = $q.defer();\r\n var deferredInner = $q.defer();\r\n var promiseInner = deferredInner.promise;\r\n var next = 0;\r\n deferredInner.resolve(files[0]);\r\n checkDuplicatesService.actionToAllFiles = null;\r\n for (var i = 0; i < files.length; i++) {\r\n promiseInner = promiseInner.then(function (result) {\r\n if (result == null || typeof cancelled == 'function' && cancelled() === true) {\r\n return null;\r\n }\r\n\r\n var existingDuplicateId = checkDuplicatesService.isDuplicate(result.name);\r\n if (!isNewOrder && existingDuplicateId) {\r\n var pauseDeferred = $q.defer();\r\n\r\n checkDuplicatesService.file = { fileObject: result, id: existingDuplicateId };\r\n if (checkDuplicatesService.actionToAllFiles) {\r\n pauseDeferred.resolve();\r\n } else {\r\n checkDuplicatesService.pauseDeferred = pauseDeferred;\r\n checkDuplicatesService.openConflictWindow(result.name);\r\n\r\n }\r\n //checkDuplicatesService.handlePause(pauseDeferred);\r\n return pauseDeferred.promise;\r\n }\r\n return result;\r\n }).then(function (result) {\r\n if ((typeof cancelled == 'function' && cancelled() === true)) return $q.reject(\"canceled\");\r\n if (!result) {\r\n var action;\r\n if (checkDuplicatesService.actionToAllFiles) {\r\n action = checkDuplicatesService.actionToAllFiles;\r\n } else {\r\n action = checkDuplicatesService.action;\r\n }\r\n\r\n switch (action) {\r\n case \"replace\":\r\n return createUploadSession(checkDuplicatesService.file.fileObject, orderItemId, checkDuplicatesService.file.id);\r\n break;\r\n case \"addcopy\":\r\n var generated = checkDuplicatesService.generateNewName(checkDuplicatesService.file.fileObject.name);\r\n return createUploadSession(checkDuplicatesService.file.fileObject, orderItemId, 0, generated);\r\n case \"skip\":\r\n progress(checkDuplicatesService.file.fileObject, undefined, null, false, true);\r\n return $q.reject(\"skipped\");\r\n }\r\n } else {\r\n return createUploadSession(result, orderItemId);\r\n }\r\n })\r\n .then(function (result) {\r\n if ((typeof cancelled === 'function' && cancelled() === true) || result == null) return $q.reject(\"canceled\");\r\n return uploadFile(result.uploadId, files[next], chunkSize, batchSize, cancelled, function (file, value, sessionId, isFinished) {\r\n if (value == 100) sessions.push({ file: file, sessionId: sessionId });\r\n if (typeof progress !== 'undefined') progress(file, value, sessionId, isFinished);\r\n }).then(function (result) {\r\n next = next + 1;\r\n if (next > files.length) return null;\r\n return files[next];\r\n });\r\n }, function (error) {\r\n if (error === \"skipped\") {\r\n next = next + 1;\r\n if (next > files.length) return null;\r\n return files[next];\r\n return \"ok\";\r\n }\r\n });\r\n }\r\n\r\n promiseInner.then(function (result) {\r\n deferred.resolve(sessions);\r\n }, function (reason) {\r\n deferred.reject(reason);\r\n });\r\n return deferred.promise;\r\n }\r\n\r\n /**\r\n * Downloads document file content as Blob for the specified Order's Document Id\r\n * @param documentId - Id of the Order Document to download file content for\r\n * @returns {Promise} Future object\r\n */\r\n function downloadDocumentFile(documentId) {\r\n\r\n if (!documentId) {\r\n return $q.reject(\"Document Id can not be null.\");\r\n }\r\n\r\n var url = encodeURI(`api/documents/${documentId}/download`);\r\n var requestConfig = {\r\n method: 'POST',\r\n headers: {\r\n 'Accept': 'application/octet-stream',\r\n 'Authorization': authService.getToken(),\r\n 'OMVersion': om.config.build.omVersion\r\n },\r\n mode: 'cors',\r\n cache: 'default'\r\n };\r\n\r\n var request = new Request(url, requestConfig);\r\n var processResponse = function (response) {\r\n if (response.status === 401) {\r\n return authService.reAuth()\r\n .then(function () {\r\n return fetch(request)\r\n .then(processResponse);\r\n }, function (err) {\r\n toastr.error('You need to re-login to download order document file.', 'Session expired');\r\n $log.error('Re-auth required in order to access order document file.', err);\r\n });\r\n }\r\n if (!response.ok) {\r\n throw new Error(response.status);\r\n }\r\n\r\n return response.blob();\r\n };\r\n\r\n //Now actually fetch file \r\n return fetch(request)\r\n .then(processResponse)\r\n .catch(function (err) {\r\n toastr.error(err.toString(), gettextCatalog.getString(`Unable to download order document [Document Id: ${documentId}]`));\r\n $log.error(\"Unable to download order document file.\", err);\r\n });\r\n }\r\n }\r\n );\r\n})();\r\n","/* global angular */\r\n(function () {\r\n \"use strict\";\r\n\r\n angular.module('env.services.colorService', [])\r\n .service('colorService', function ($q) {\r\n\r\n 'use strict';\r\n\r\n class Color {\r\n constructor(r, g, b) {\r\n this.set(r, g, b);\r\n }\r\n\r\n toString() {\r\n return `rgb(${Math.round(this.r)}, ${Math.round(this.g)}, ${Math.round(this.b)})`;\r\n }\r\n\r\n set(r, g, b) {\r\n this.r = this.clamp(r);\r\n this.g = this.clamp(g);\r\n this.b = this.clamp(b);\r\n }\r\n\r\n hueRotate(angle = 0) {\r\n angle = angle / 180 * Math.PI;\r\n const sin = Math.sin(angle);\r\n const cos = Math.cos(angle);\r\n\r\n this.multiply([\r\n 0.213 + cos * 0.787 - sin * 0.213,\r\n 0.715 - cos * 0.715 - sin * 0.715,\r\n 0.072 - cos * 0.072 + sin * 0.928,\r\n 0.213 - cos * 0.213 + sin * 0.143,\r\n 0.715 + cos * 0.285 + sin * 0.140,\r\n 0.072 - cos * 0.072 - sin * 0.283,\r\n 0.213 - cos * 0.213 - sin * 0.787,\r\n 0.715 - cos * 0.715 + sin * 0.715,\r\n 0.072 + cos * 0.928 + sin * 0.072,\r\n ]);\r\n }\r\n\r\n grayscale(value = 1) {\r\n this.multiply([\r\n 0.2126 + 0.7874 * (1 - value),\r\n 0.7152 - 0.7152 * (1 - value),\r\n 0.0722 - 0.0722 * (1 - value),\r\n 0.2126 - 0.2126 * (1 - value),\r\n 0.7152 + 0.2848 * (1 - value),\r\n 0.0722 - 0.0722 * (1 - value),\r\n 0.2126 - 0.2126 * (1 - value),\r\n 0.7152 - 0.7152 * (1 - value),\r\n 0.0722 + 0.9278 * (1 - value),\r\n ]);\r\n }\r\n\r\n sepia(value = 1) {\r\n this.multiply([\r\n 0.393 + 0.607 * (1 - value),\r\n 0.769 - 0.769 * (1 - value),\r\n 0.189 - 0.189 * (1 - value),\r\n 0.349 - 0.349 * (1 - value),\r\n 0.686 + 0.314 * (1 - value),\r\n 0.168 - 0.168 * (1 - value),\r\n 0.272 - 0.272 * (1 - value),\r\n 0.534 - 0.534 * (1 - value),\r\n 0.131 + 0.869 * (1 - value),\r\n ]);\r\n }\r\n\r\n saturate(value = 1) {\r\n this.multiply([\r\n 0.213 + 0.787 * value,\r\n 0.715 - 0.715 * value,\r\n 0.072 - 0.072 * value,\r\n 0.213 - 0.213 * value,\r\n 0.715 + 0.285 * value,\r\n 0.072 - 0.072 * value,\r\n 0.213 - 0.213 * value,\r\n 0.715 - 0.715 * value,\r\n 0.072 + 0.928 * value,\r\n ]);\r\n }\r\n\r\n multiply(matrix) {\r\n const newR = this.clamp(this.r * matrix[0] + this.g * matrix[1] + this.b * matrix[2]);\r\n const newG = this.clamp(this.r * matrix[3] + this.g * matrix[4] + this.b * matrix[5]);\r\n const newB = this.clamp(this.r * matrix[6] + this.g * matrix[7] + this.b * matrix[8]);\r\n this.r = newR;\r\n this.g = newG;\r\n this.b = newB;\r\n }\r\n\r\n brightness(value = 1) {\r\n this.linear(value);\r\n }\r\n contrast(value = 1) {\r\n this.linear(value, -(0.5 * value) + 0.5);\r\n }\r\n\r\n linear(slope = 1, intercept = 0) {\r\n this.r = this.clamp(this.r * slope + intercept * 255);\r\n this.g = this.clamp(this.g * slope + intercept * 255);\r\n this.b = this.clamp(this.b * slope + intercept * 255);\r\n }\r\n\r\n invert(value = 1) {\r\n this.r = this.clamp((value + this.r / 255 * (1 - 2 * value)) * 255);\r\n this.g = this.clamp((value + this.g / 255 * (1 - 2 * value)) * 255);\r\n this.b = this.clamp((value + this.b / 255 * (1 - 2 * value)) * 255);\r\n }\r\n\r\n hsl() {\r\n // Code taken from https://stackoverflow.com/a/9493060/2688027, licensed under CC BY-SA.\r\n const r = this.r / 255;\r\n const g = this.g / 255;\r\n const b = this.b / 255;\r\n const max = Math.max(r, g, b);\r\n const min = Math.min(r, g, b);\r\n let h, s, l = (max + min) / 2;\r\n\r\n if (max === min) {\r\n h = s = 0;\r\n } else {\r\n const d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n switch (max) {\r\n case r:\r\n h = (g - b) / d + (g < b ? 6 : 0);\r\n break;\r\n\r\n case g:\r\n h = (b - r) / d + 2;\r\n break;\r\n\r\n case b:\r\n h = (r - g) / d + 4;\r\n break;\r\n }\r\n h /= 6;\r\n }\r\n\r\n return {\r\n h: h * 100,\r\n s: s * 100,\r\n l: l * 100,\r\n };\r\n }\r\n\r\n clamp(value) {\r\n if (value > 255) {\r\n value = 255;\r\n } else if (value < 0) {\r\n value = 0;\r\n }\r\n return value;\r\n }\r\n }\r\n\r\n class Solver {\r\n constructor(target, baseColor) {\r\n this.target = target;\r\n this.targetHSL = target.hsl();\r\n this.reusedColor = new Color(0, 0, 0);\r\n }\r\n\r\n solve() {\r\n const result = this.solveNarrow(this.solveWide());\r\n return {\r\n values: result.values,\r\n loss: result.loss,\r\n filter: this.css(result.values)\r\n };\r\n }\r\n\r\n solveWide() {\r\n const A = 5;\r\n const c = 15;\r\n const a = [60, 180, 18000, 600, 1.2, 1.2];\r\n\r\n let best = { loss: Infinity };\r\n for (let i = 0; best.loss > 25 && i < 3; i++) {\r\n const initial = [50, 20, 3750, 50, 100, 100];\r\n const result = this.spsa(A, a, c, initial, 1000);\r\n if (result.loss < best.loss) {\r\n best = result;\r\n }\r\n }\r\n return best;\r\n }\r\n\r\n solveNarrow(wide) {\r\n const A = wide.loss;\r\n const c = 2;\r\n const A1 = A + 1;\r\n const a = [0.25 * A1, 0.25 * A1, A1, 0.25 * A1, 0.2 * A1, 0.2 * A1];\r\n return this.spsa(A, a, c, wide.values, 500);\r\n }\r\n\r\n spsa(A, a, c, values, iters) {\r\n const alpha = 1;\r\n const gamma = 0.16666666666666666;\r\n\r\n let best = null;\r\n let bestLoss = Infinity;\r\n const deltas = new Array(6);\r\n const highArgs = new Array(6);\r\n const lowArgs = new Array(6);\r\n\r\n for (let k = 0; k < iters; k++) {\r\n const ck = c / Math.pow(k + 1, gamma);\r\n for (let i = 0; i < 6; i++) {\r\n deltas[i] = Math.random() > 0.5 ? 1 : -1;\r\n highArgs[i] = values[i] + ck * deltas[i];\r\n lowArgs[i] = values[i] - ck * deltas[i];\r\n }\r\n\r\n const lossDiff = this.loss(highArgs) - this.loss(lowArgs);\r\n for (let i = 0; i < 6; i++) {\r\n const g = lossDiff / (2 * ck) * deltas[i];\r\n const ak = a[i] / Math.pow(A + k + 1, alpha);\r\n values[i] = fix(values[i] - ak * g, i);\r\n }\r\n\r\n const loss = this.loss(values);\r\n if (loss < bestLoss) {\r\n best = values.slice(0);\r\n bestLoss = loss;\r\n }\r\n }\r\n return { values: best, loss: bestLoss };\r\n\r\n function fix(value, idx) {\r\n let max = 100;\r\n if (idx === 2 /* saturate */) {\r\n max = 7500;\r\n } else if (idx === 4 /* brightness */ || idx === 5 /* contrast */) {\r\n max = 200;\r\n }\r\n\r\n if (idx === 3 /* hue-rotate */) {\r\n if (value > max) {\r\n value %= max;\r\n } else if (value < 0) {\r\n value = max + value % max;\r\n }\r\n } else if (value < 0) {\r\n value = 0;\r\n } else if (value > max) {\r\n value = max;\r\n }\r\n return value;\r\n }\r\n }\r\n\r\n loss(filters) {\r\n // Argument is array of percentages.\r\n const color = this.reusedColor;\r\n color.set(0, 0, 0);\r\n\r\n color.invert(filters[0] / 100);\r\n color.sepia(filters[1] / 100);\r\n color.saturate(filters[2] / 100);\r\n color.hueRotate(filters[3] * 3.6);\r\n color.brightness(filters[4] / 100);\r\n color.contrast(filters[5] / 100);\r\n\r\n const colorHSL = color.hsl();\r\n return (\r\n Math.abs(color.r - this.target.r) +\r\n Math.abs(color.g - this.target.g) +\r\n Math.abs(color.b - this.target.b) +\r\n Math.abs(colorHSL.h - this.targetHSL.h) +\r\n Math.abs(colorHSL.s - this.targetHSL.s) +\r\n Math.abs(colorHSL.l - this.targetHSL.l)\r\n );\r\n }\r\n\r\n css(filters) {\r\n function fmt(idx, multiplier = 1) {\r\n return Math.round(filters[idx] * multiplier);\r\n }\r\n return `invert(${fmt(0)}%) sepia(${fmt(1)}%) saturate(${fmt(2)}%) hue-rotate(${fmt(3, 3.6)}deg) brightness(${fmt(4)}%) contrast(${fmt(5)}%)`;\r\n }\r\n }\r\n\r\n var hexToRgb = function(hex) {\r\n // Expand shorthand form (e.g. \"03F\") to full form (e.g. \"0033FF\")\r\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\r\n hex = hex.replace(shorthandRegex, (m, r, g, b) => {\r\n return r + r + g + g + b + b;\r\n });\r\n\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n return result\r\n ? [\r\n parseInt(result[1], 16),\r\n parseInt(result[2], 16),\r\n parseInt(result[3], 16),\r\n ]\r\n : null;\r\n }\r\n\r\n var getFiltersToTransformBlackToColor = function(hex) {\r\n const rgb = this.hexToRgb(hex);\r\n if (rgb.length !== 3) {\r\n throw 'Invalid color format passed in for black color transformation!';\r\n }\r\n\r\n const color = new Color(rgb[0], rgb[1], rgb[2]);\r\n const solver = new Solver(color);\r\n const result = solver.solve();\r\n\r\n return result.filter;\r\n }\r\n\r\n\r\n angular.extend(this, {\r\n hexToRgb: hexToRgb,\r\n getFiltersToTransformBlackToColor: getFiltersToTransformBlackToColor\r\n });\r\n }\r\n );\r\n})();\r\n","angular.module('env.services.barcodeScannerListener', [])\r\n\r\n .service('barcodeScannerListenerService', function ($log, $q, $interval, EventingMixin) {\r\n var _this = this;\r\n var _scannedSymbolsDelay = 10;\r\n var _lastKeys = ''; //this variable holds the symbols scanned\r\n\r\n _.extend(_this, new EventingMixin(['valueScanned']));\r\n\r\n $(window).keypress(handleKeyPress);\r\n\r\n //Adds symbols one by one to the variable that holds the scanned value\r\n //Checks the time interval between values to 'reset' the value whenever the longer interval occurs,\r\n //as this is indicate usually that the value is entered by a human, not barcode scanner\r\n var lastSymbolEnteredAt = Date.now();\r\n\r\n function addChar(char) {\r\n //if we have a first char/symbol or a relatively small interval between symbols indicating us\r\n //that it is a symbol entered by a scanner\r\n if (_lastKeys === '' || (Date.now() - lastSymbolEnteredAt) < _scannedSymbolsDelay) {\r\n lastSymbolEnteredAt = Date.now();\r\n if (char.match(/[A-Za-z0-9_\\-]/i)) {\r\n _lastKeys += char;\r\n while (_lastKeys.length > 50) {\r\n _lastKeys.shift();\r\n }\r\n }\r\n } else {\r\n //reset the symbols sequence as we have a longer pause indicating it is not a barcode scanned value\r\n _lastKeys = '';\r\n //And add the current one as the first symbol of the new sequence\r\n addChar(char);\r\n }\r\n }\r\n\r\n function handleKeyPress(e) {\r\n //First, see if we have a keypress NOT in input or textarea as we don't want to capture anything that\r\n //was meant to be entered there for search or 'submit to server' purposes\r\n if (isTextBox(e.target)) {\r\n _lastKeys = '';\r\n return;\r\n }\r\n\r\n var code = (e.keyCode ? e.keyCode : e.which);\r\n\r\n if (code == 13 || code == 9) { // Enter key hit/scanned\r\n if ((Date.now() - lastSymbolEnteredAt) < _scannedSymbolsDelay) {\r\n raiseValueScannedEvent();\r\n } else {\r\n resetLastKeys();\r\n }\r\n } else {\r\n addChar(String.fromCharCode(code));\r\n }\r\n }\r\n\r\n function raiseValueScannedEvent() {\r\n var scannedValue = _lastKeys;\r\n _lastKeys = '';\r\n try {\r\n $log.info('Entered value from barcode scanner: ' + scannedValue);\r\n _this.events.raise('valueScanned', {value: scannedValue});\r\n } catch (e) {\r\n $log.error('Error in barcode scanner service listener handler.', e);\r\n }\r\n }\r\n\r\n function isTextBox(element) {\r\n var tagName = element.tagName.toLowerCase();\r\n if (tagName === 'textarea') return true;\r\n if (tagName !== 'input') return false;\r\n var type = element.getAttribute('type') ? element.getAttribute('type').toLowerCase() : 'unknown';\r\n // if any of these input types is not supported by a browser, it will behave as input type text.\r\n var inputTypes = [\r\n 'text', 'password', 'number', 'email', 'tel', 'url', 'search', 'date', 'datetime', 'datetime-local',\r\n 'time', 'month', 'week'\r\n ];\r\n return inputTypes.indexOf(type) >= 0;\r\n }\r\n\r\n function resetLastKeys() {\r\n $log.debug('Resetting symbols from scanner.');\r\n _lastKeys = '';\r\n lastSymbolEnteredAt = Date.now();\r\n }\r\n\r\n return _this;\r\n })\r\n\r\n;\r\n","angular.module('env.notifications', ['toastr'])\r\n\r\n // To see how to use angular-toastr see https://github.com/Foxandxss/angular-toastr\r\n .config(function (toastrConfig) {\r\n angular.extend(toastrConfig, {\r\n closeButton: true,\r\n allowHtml: true,\r\n closeHtml: \"\",\r\n containerId: 'toast-container',\r\n timeOut: 7000,\r\n extendedTimeOut: 20000,\r\n tapToDismiss: true,\r\n messageClass: 'toast-message',\r\n positionClass: 'toast-top-right',\r\n titleClass: 'toast-title',\r\n toastClass: 'toast',\r\n iconClasses: {\r\n error: 'toast-error',\r\n info: 'toast-info',\r\n success: 'toast-success',\r\n warning: 'toast-warning'\r\n }\r\n });\r\n })\r\n\r\n;\r\n","angular.module('env.log.omLogger', [])\r\n\r\n .config(function (omLoggerProvider) {\r\n if (om.config.logger) {\r\n omLoggerProvider.config.consoleAppender = _.defaults(om.config.logger.consoleAppender, omLoggerProvider.config.consoleAppender);\r\n omLoggerProvider.config.ajaxAppender = _.defaults(om.config.logger.ajaxAppender, omLoggerProvider.config.ajaxAppender);\r\n if (om.config.debug) {\r\n omLoggerProvider.config.consoleAppender.level = 0;\r\n }\r\n omLoggerProvider.config.ajaxAppender.url = om.config.build.baseUrl + \"/\" + omLoggerProvider.config.ajaxAppender.url;\r\n }\r\n })\r\n\r\n .provider('omLogger', function ($injector) {\r\n let _omLoggerProvider = this;\r\n let logStorage = [];\r\n let $http;\r\n\r\n const defaultConfig = { // default config\r\n consoleAppender: {\r\n enabled: true,\r\n level: 3000\r\n },\r\n\r\n ajaxAppender: {\r\n enabled: false,\r\n bufferSize: 10,\r\n bufferExpirationTime: 10000,\r\n level: 0,\r\n sendLevel: 6000,\r\n url: om.config.build.baseUrl + \"/log\"\r\n }\r\n };\r\n\r\n _omLoggerProvider.config = defaultConfig;\r\n\r\n //region Utils\r\n\r\n _omLoggerProvider.assert = function () {\r\n console.assert.apply(console, arguments);\r\n };\r\n\r\n _omLoggerProvider.count = function () {\r\n console.count.apply(console, arguments);\r\n };\r\n\r\n _omLoggerProvider.dir = function () {\r\n console.dir.apply(console, arguments);\r\n };\r\n\r\n _omLoggerProvider.group = function () {\r\n console.group.apply(console, arguments);\r\n };\r\n\r\n _omLoggerProvider.groupCollapsed = function () {\r\n console.groupCollapsed.apply(console, arguments);\r\n };\r\n\r\n _omLoggerProvider.groupEnd = function () {\r\n console.groupEnd.apply(console, arguments);\r\n };\r\n\r\n _omLoggerProvider.time = function () {\r\n console.time.apply(console, arguments);\r\n };\r\n\r\n _omLoggerProvider.timeEnd = function () {\r\n console.timeEnd.apply(console, arguments);\r\n };\r\n\r\n //endregion\r\n\r\n //region Log messages\r\n\r\n /**\r\n * Log message with trace level: 1000\r\n */\r\n _omLoggerProvider.trace = function () {\r\n logMessage(1000, arguments);\r\n };\r\n\r\n /**\r\n * Log message with debug level: 2000\r\n */\r\n _omLoggerProvider.debug = function () {\r\n logMessage(2000, arguments);\r\n };\r\n\r\n /**\r\n * Log message with default(log) level: 3000\r\n */\r\n _omLoggerProvider.log = function () {\r\n logMessage(3000, arguments);\r\n };\r\n\r\n /**\r\n * Log message with info level: 4000\r\n */\r\n _omLoggerProvider.info = function () {\r\n logMessage(4000, arguments);\r\n };\r\n\r\n /**\r\n * Log message with warning level: 5000\r\n */\r\n _omLoggerProvider.warn = function () {\r\n logMessage(5000, arguments);\r\n };\r\n\r\n /**\r\n * Log message with error level: 6000\r\n */\r\n _omLoggerProvider.error = function () {\r\n logMessage(6000, arguments);\r\n };\r\n\r\n /**\r\n * Log message with fatal error level: 7000\r\n */\r\n _omLoggerProvider.fatal = function () {\r\n logMessage(7000, arguments);\r\n };\r\n\r\n //endregion\r\n\r\n //region Helpers\r\n\r\n function logMessage(level, args) {\r\n if (!_omLoggerProvider.config.consoleAppender.enabled && !_omLoggerProvider.config.ajaxAppender.enabled) {\r\n return;\r\n }\r\n let parsedArgs = parseArguments(args);\r\n logToConsole(level, parsedArgs);\r\n logToServer(level, parsedArgs);\r\n }\r\n\r\n function logToServer(level, args) {\r\n if (!_omLoggerProvider.config.ajaxAppender.enabled) {\r\n return;\r\n }\r\n\r\n if (level >= _omLoggerProvider.config.ajaxAppender.level) {\r\n let msg = args.messages.length > 1 ? _.str.sprintf.apply(console, args.messages) : args.messages[0];\r\n _.forEach(args.exceptions, function (ex) {\r\n if (ex.header) {\r\n msg += \"\\n\" + ex.header;\r\n }\r\n if (ex.stack) {\r\n msg += \"\\n\" + ex.stack;\r\n }\r\n });\r\n let now = new Date();\r\n logStorage.push({\r\n date: now,\r\n timeZoneOffset: now.getTimezoneOffset(),\r\n level: level,\r\n message: msg\r\n });\r\n if (logStorage.length > _omLoggerProvider.config.ajaxAppender.bufferSize) {\r\n logStorage.shift();\r\n }\r\n }\r\n\r\n if (level >= _omLoggerProvider.config.ajaxAppender.sendLevel) {\r\n sendLogToServer();\r\n }\r\n }\r\n\r\n function sendLogToServer() {\r\n let now = new Date();\r\n let toSend = _.clone(logStorage)\r\n .filter(entry => now.getTime() - entry.date.getTime() < _omLoggerProvider.config.ajaxAppender.bufferExpirationTime);\r\n logStorage = [];\r\n\r\n try {\r\n if (!$http) {\r\n $http = $injector.get(\"$http\", \"omLogger\");\r\n }\r\n try {\r\n $http.post(_omLoggerProvider.config.ajaxAppender.url, JSON.stringify({logs: toSend})).then(\r\n function (resp) {\r\n // yay!\r\n }, function (resp) {\r\n handleError(resp)\r\n });\r\n } catch (ex) {\r\n handleError(ex)\r\n }\r\n } catch (e) {\r\n try {\r\n $.post(_omLoggerProvider.config.ajaxAppender.url, JSON.stringify({logs: toSend}), null, \"json\");\r\n } catch (ex) {\r\n handleError(ex)\r\n }\r\n }\r\n\r\n function handleError(e) {\r\n console.group(\"We were unable to send logs to the server\");\r\n console.dir(e);\r\n console.groupEnd();\r\n }\r\n }\r\n\r\n function logToConsole(level, args) {\r\n if (!_omLoggerProvider.config.consoleAppender.enabled) {\r\n return;\r\n }\r\n if (level < _omLoggerProvider.config.consoleAppender.level) {\r\n return;\r\n }\r\n\r\n let msg = args.messages.length > 1 ? _.str.sprintf.apply(null, args.messages) : args.messages[0];\r\n if (msg) {\r\n logToConsoleByLevel(level, msg);\r\n }\r\n\r\n _.forEach(args.exceptions, function (ex) {\r\n if (ex.stack) {\r\n console.group(ex.header);\r\n console.log(ex.stack);\r\n console.groupEnd();\r\n } else {\r\n logToConsoleByLevel(level, ex.header);\r\n }\r\n });\r\n }\r\n\r\n function logToConsoleByLevel(level, msg) {\r\n if (level <= 1000) { // trace\r\n console.log(msg);\r\n } else if (level <= 2000) { // debug\r\n console.log(msg);\r\n } else if (level <= 3000) { // log\r\n console.log(msg);\r\n } else if (level <= 4000) { // info\r\n console.info(msg);\r\n } else if (level <= 5000) { // warn\r\n console.warn(msg);\r\n } else if (level <= 6000) { // error\r\n console.warn(msg);\r\n } else { // fatal\r\n console.warn(msg);\r\n }\r\n }\r\n\r\n\r\n function parseArguments(args) {\r\n let messages = [];\r\n let exceptions = [];\r\n\r\n function parseException(e) {\r\n let result = {};\r\n let name = e.name;\r\n name = !name ? 'Error' : String(name);\r\n let msg = e.message || e.description;\r\n msg = !msg ? '' : String(msg);\r\n result.header = name + (msg ? (': ' + msg) : '');\r\n if (e.stack) {\r\n result.stack = e.stack.toString();\r\n }\r\n return result;\r\n }\r\n\r\n for (let i = 0; i < args.length; i++) {\r\n let arg = args[i];\r\n if (arg) {\r\n if (arg.stack || arg.message || arg.name) { // if error\r\n exceptions.push(parseException(arg));\r\n } else {\r\n messages.push(arg);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n messages: messages,\r\n exceptions: exceptions\r\n };\r\n }\r\n\r\n _omLoggerProvider.getLogs = function () {\r\n return _.clone(logStorage.slice(0));\r\n };\r\n\r\n //endregion\r\n\r\n this.$get = function () {\r\n return {\r\n assert: _omLoggerProvider.assert,\r\n count: _omLoggerProvider.count,\r\n dir: _omLoggerProvider.dir,\r\n group: _omLoggerProvider.group,\r\n groupCollapsed: _omLoggerProvider.groupCollapsed,\r\n groupEnd: _omLoggerProvider.groupEnd,\r\n time: _omLoggerProvider.time,\r\n timeEnd: _omLoggerProvider.timeEnd,\r\n debug: _omLoggerProvider.debug,\r\n trace: _omLoggerProvider.trace,\r\n log: _omLoggerProvider.log,\r\n info: _omLoggerProvider.info,\r\n warn: _omLoggerProvider.warn,\r\n error: _omLoggerProvider.error,\r\n fatal: _omLoggerProvider.fatal,\r\n getLogs: _omLoggerProvider.getLogs\r\n };\r\n };\r\n })\r\n\r\n;\r\n","angular.module('env.log.logDecorator', [])\r\n\r\n .config(function ($provide) {\r\n\r\n $provide.decorator('$log', function ($delegate, omLogger) {\r\n\r\n $delegate = _.extend($delegate, {\r\n assert: omLogger.assert,\r\n count: omLogger.count,\r\n dir: omLogger.dir,\r\n group: omLogger.group,\r\n groupCollapsed: omLogger.groupCollapsed,\r\n groupEnd: omLogger.groupEnd,\r\n time: omLogger.time,\r\n timeEnd: omLogger.timeEnd,\r\n debug: omLogger.debug,\r\n trace: omLogger.trace,\r\n log: omLogger.log,\r\n info: omLogger.info,\r\n warn: omLogger.warn,\r\n error: omLogger.error,\r\n fatal: omLogger.fatal\r\n });\r\n\r\n return $delegate;\r\n });\r\n })\r\n\r\n;\r\n","angular.module('env.log', [\r\n 'env.log.omLogger',\r\n 'env.log.logDecorator'\r\n]);\r\n","angular.module('env.localStorage', [])\r\n\r\n .provider('$localStorage', function (omLoggerProvider) {\r\n var $log = omLoggerProvider;\r\n var localStorage = window && window.localStorage ? window.localStorage : null;\r\n var uniquePrefix = \"om\" + hashCode(getBaseUrl()) + \"_\";\r\n\r\n var _this = this;\r\n\r\n function getBaseUrl() {\r\n var href = '';\r\n href += window.location.protocol + '//' + window.location.hostname;\r\n var port = window.location.port;\r\n if (port && port.length > 0) {\r\n href += ':' + port;\r\n }\r\n href += window.location.pathname;\r\n return href.toLowerCase();\r\n }\r\n\r\n function hashCode(string) {\r\n var hash = 0, i, chr, len;\r\n if (string.length == 0) return hash;\r\n for (i = 0, len = string.length; i < len; i++) {\r\n chr = string.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + chr;\r\n hash |= 0; // Convert to 32bit integer\r\n }\r\n return hash;\r\n }\r\n\r\n //region Public methods\r\n\r\n /**\r\n * Gets item from localStorage by its key. If there is no such key - return NULL.\r\n */\r\n function getItem(key) {\r\n var value;\r\n\r\n if (localStorage) {\r\n try {\r\n value = angular.fromJson(localStorage.getItem(uniquePrefix + key));\r\n } catch (e) {\r\n $log.error(\"Exception during LocalStorage access!\", e);\r\n }\r\n } else {\r\n $log.warn(\"Browser does not support LocalStor\" +\r\n \"age feature! Returning nothing from LocalStorage.\");\r\n }\r\n\r\n return value;\r\n }\r\n\r\n /**\r\n * Sets item into localStorage by its key. Item will be rewritten, if there is value with such key already.\r\n */\r\n function setItem(key, value) {\r\n if (localStorage) {\r\n try {\r\n localStorage.setItem(uniquePrefix + key, angular.toJson(value));\r\n } catch (e) {\r\n $log.error(\"Exception during LocalStorage access!\", e);\r\n }\r\n } else {\r\n $log.warn(\"Browser does not support LocalStorage feature! Setting nothing into LocalStorage.\");\r\n }\r\n }\r\n\r\n /**\r\n * Remove localStorage item by its key.\r\n */\r\n function removeItem(key) {\r\n if (localStorage) {\r\n try {\r\n localStorage.removeItem(uniquePrefix + key);\r\n } catch (e) {\r\n $log.error(\"Exception during LocalStorage access!\", e);\r\n }\r\n } else {\r\n $log.warn(\"Browser does not support LocalStorage feature! Removing nothing from LocalStorage.\");\r\n }\r\n }\r\n\r\n _.extend(_this, {\r\n getItem: getItem,\r\n setItem: setItem,\r\n removeItem: removeItem\r\n });\r\n\r\n //endregion\r\n\r\n this.$get = function () {\r\n return {\r\n getItem: getItem,\r\n setItem: setItem,\r\n removeItem: removeItem\r\n };\r\n };\r\n })\r\n\r\n;","angular.module('env.i18n.uiLocalization', [])\r\n\r\n .run(function (gettextCatalog) {\r\n if (om.config.build.highlightUntranslatedStrings === true) {\r\n gettextCatalog.debug = true;\r\n }\r\n })\r\n\r\n .service('uiLocalization', function ($q, $http, $log, toastr, gettextCatalog, EventingMixin, LocaleName) {\r\n var _this = this;\r\n _this = _.extend(_this, new EventingMixin(['changed']));\r\n\r\n /**\r\n * Cache of available languages\r\n * @type {Array}\r\n */\r\n var languagesList;\r\n\r\n /**\r\n * Default language\r\n * @type {string}\r\n */\r\n var defaultLanguage = \"en-GB\";\r\n\r\n /**\r\n * Current language\r\n * @type {string}\r\n */\r\n var currentLanguage;\r\n\r\n /**\r\n * Get list of supported gettext languages\r\n * @returns {!Promise} promise\r\n */\r\n _this.getLanguagesList = function () {\r\n var deferred = $q.defer();\r\n if (languagesList) {\r\n deferred.resolve(languagesList);\r\n } else {\r\n $http.get('translations/availableGettextLocales.json')\r\n .then(function (resp) {\r\n try {\r\n languagesList = resp.data;\r\n deferred.resolve(languagesList);\r\n } catch (err) {\r\n languagesList = null;\r\n deferred.reject(err);\r\n }\r\n }, function (err) {\r\n deferred.reject(err);\r\n });\r\n }\r\n\r\n return deferred.promise;\r\n };\r\n\r\n /**\r\n * Set current language for ui translations\r\n * @param {string} lang - code of the language\r\n * @returns {!Promise} promise\r\n */\r\n _this.setCurrentLanguage = function (lang) {\r\n var deferred = $q.defer();\r\n\r\n _this.getLanguagesList().then(\r\n function (langList) {\r\n // get the most suitable language code\r\n var languageCode = (new LocaleName(lang)).getMostSuitableLanguage(langList) || defaultLanguage;\r\n\r\n if (gettextCatalog.strings[languageCode]) {\r\n\r\n gettextCatalog.setCurrentLanguage(languageCode);\r\n currentLanguage = languageCode;\r\n _this.events.raise('changed', {language: languageCode});\r\n deferred.resolve(languageCode);\r\n\r\n } else {\r\n\r\n gettextCatalog.loadRemote(\"translations/langs/\" + languageCode + \".json\")\r\n .then(function () {\r\n gettextCatalog.setCurrentLanguage(languageCode);\r\n currentLanguage = languageCode;\r\n _this.events.raise('changed', {language: languageCode});\r\n deferred.resolve(languageCode);\r\n }, function (err) {\r\n deferred.reject(err);\r\n });\r\n\r\n }\r\n },\r\n function (err) {\r\n deferred.reject(err);\r\n }\r\n );\r\n\r\n return deferred.promise;\r\n };\r\n\r\n /**\r\n * Get current ui localization language\r\n * @returns {string|undefined} current ui localization language code\r\n */\r\n _this.getCurrentLanguage = function () {\r\n return currentLanguage;\r\n };\r\n\r\n /**\r\n * Get UI translation for key. WARNING: Don't forget to use 'gettext' to mark string for translation system\r\n * @param {string} key\r\n * @param {string[]} [formatArguments] optional format arguments for `sprintf` function\r\n * @returns {string} translation\r\n */\r\n _this.translate = function (key) {\r\n var message;\r\n\r\n if (!key) {\r\n return null;\r\n }\r\n var translated = gettextCatalog.getString(key);\r\n\r\n if (arguments.length > 1) { // if we have arguments for string format\r\n var insertions = _.flatten(Array.prototype.slice.call(arguments, 1));\r\n\r\n if (!translated) {\r\n message = \"Translation for key `\" + key\r\n + \"` is empty for `\" + currentLanguage\r\n + \"` locale. UI localization engine was unable to format empty string with given arguments: \"\r\n + insertions.join(', ');\r\n $log.warn(message);\r\n toastr.warning(message, \"UI localization error\");\r\n return key;\r\n }\r\n\r\n try {\r\n var params = _.union([translated], insertions);\r\n return _.string.sprintf.apply(_.string.sprintf, params);\r\n } catch (error) {\r\n }\r\n message = \"UI localization engine was unable to format translated string `\" + translated\r\n + \"` (key: '\" + key + \"', locale: '\" + currentLanguage + \"') with given arguments: \" + insertions.join(', ');\r\n $log.warn(message);\r\n toastr.warning(message, \"UI localization error\");\r\n return translated;\r\n }\r\n\r\n return translated;\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;","angular.module('env.i18n.serverLocalizationFilter', [])\r\n\r\n .filter('sTranslate', function (serverLocalization) {\r\n return function (input) {\r\n return serverLocalization.translate(input);\r\n };\r\n })\r\n\r\n;","angular.module('env.i18n.serverLocalization', [])\r\n\r\n .service('serverLocalization', function ($q, $log, toastr, serverLocalizationCache, localizationRepository, EventingMixin, LocaleName) {\r\n var _this = this;\r\n _this = _.extend(_this, new EventingMixin(['changed']));\r\n\r\n /**\r\n * Cache of available languages\r\n * @type {Array}\r\n */\r\n var languagesList;\r\n\r\n /**\r\n * Default language\r\n * @type {string}\r\n */\r\n var defaultLanguage = \"en-GB\";\r\n\r\n /**\r\n * Current language\r\n * @type {string}\r\n */\r\n var currentLanguage;\r\n\r\n /**\r\n * Get list of server supported languages\r\n * @returns {!Promise} promise\r\n */\r\n _this.getLanguagesList = function () {\r\n var deferred = $q.defer();\r\n if (languagesList) {\r\n deferred.resolve(languagesList);\r\n } else {\r\n localizationRepository.getLanguages()\r\n .then(function (resp) {\r\n try {\r\n languagesList = resp;\r\n deferred.resolve(languagesList);\r\n } catch (err) {\r\n languagesList = null;\r\n deferred.reject(err);\r\n }\r\n }, function (err) {\r\n deferred.reject(err);\r\n });\r\n }\r\n\r\n return deferred.promise;\r\n };\r\n\r\n /**\r\n * Set current language for server translations\r\n * @param {string} lang code of the language\r\n * @returns {!Promise} promise\r\n */\r\n _this.setCurrentLanguage = function (lang) {\r\n var deferred = $q.defer();\r\n\r\n _this.getLanguagesList().then(\r\n function (langList) {\r\n // get the most suitable language code\r\n var languageCode = (new LocaleName(lang)).getMostSuitableLanguage(langList) || defaultLanguage;\r\n\r\n if (serverLocalizationCache.hasLanguage(languageCode)) {\r\n currentLanguage = languageCode;\r\n _this.events.raise('changed', {language: languageCode});\r\n deferred.resolve(languageCode);\r\n } else {\r\n updateCache(languageCode).then(\r\n function () {\r\n currentLanguage = languageCode;\r\n _this.events.raise('changed', {language: languageCode});\r\n deferred.resolve(languageCode);\r\n },\r\n function (err) {\r\n deferred.reject(err);\r\n }\r\n );\r\n }\r\n },\r\n function (err) {\r\n deferred.reject(err);\r\n }\r\n );\r\n\r\n return deferred.promise;\r\n };\r\n\r\n /**\r\n * Get current server localization language\r\n * @returns {string} current server localization language code\r\n */\r\n _this.getCurrentLanguage = function () {\r\n return currentLanguage;\r\n };\r\n\r\n /**\r\n * Update cache from server\r\n * @param {string} lang language\r\n * @param {Array} [keys] [Optional] keys to update. If not set - update all language\r\n */\r\n var updateCache = function (lang, keys) {\r\n return localizationRepository.getTranslations(lang, keys)\r\n .then(function (resp) {\r\n _.forEach(resp, function (el) {\r\n if (el && el.resourceCode && el.value) {\r\n serverLocalizationCache.setValue(lang, el.resourceCode, el.value);\r\n }\r\n });\r\n });\r\n };\r\n\r\n /**\r\n * Get server translations for array of keys\r\n * @param {Array} keys keys for translation\r\n * @returns {{}} translations hash object\r\n */\r\n _this.translateMany = function (keys) {\r\n var result = {};\r\n _.forEach(keys, function (el) {\r\n result[el] = translateInternal(el);\r\n });\r\n return result;\r\n };\r\n\r\n /**\r\n * Get server translations for key\r\n * @param {string} key\r\n * @returns {string} translation\r\n */\r\n _this.translate = function (key) {\r\n var message;\r\n\r\n if (!key) {\r\n return null;\r\n }\r\n var translated = translateInternal(key);\r\n\r\n if (arguments.length > 1) { // if we have arguments for string format\r\n var insertions = _.flatten(Array.prototype.slice.call(arguments, 1));\r\n\r\n if (!translated) {\r\n message = \"Translation for key `\" + key\r\n + \"` is empty for `\" + currentLanguage\r\n + \"` locale. UI localization engine was unable to format empty string with given arguments: \"\r\n + insertions.join(', ');\r\n $log.warn(message);\r\n toastr.warning(message, \"UI localization error\");\r\n return key;\r\n }\r\n\r\n try {\r\n return _.string.sprintf(translated, insertions);\r\n } catch (error) {\r\n }\r\n message = \"UI localization engine was unable to format translated string `\" + translated\r\n + \"` (key: '\" + key + \"', locale: '\" + currentLanguage + \"') with given arguments: \" + insertions.join(', ');\r\n $log.warn(message);\r\n toastr.warning(message, \"UI localization error\");\r\n return translated;\r\n }\r\n\r\n return translated;\r\n };\r\n\r\n function translateInternal(key) {\r\n var t = serverLocalizationCache.getValue(currentLanguage, key);\r\n if (!t) {\r\n return om.config.build.highlightUntranslatedStrings === true\r\n ? \"[MISSING_SRV]:\" + key\r\n : key;\r\n }\r\n return t;\r\n }\r\n\r\n return _this;\r\n })\r\n\r\n .service('serverLocalizationCache', function () {\r\n var _this = this;\r\n\r\n var cache = {};\r\n\r\n /**\r\n * Get cached translation for key and language\r\n * @param {string} lang language\r\n * @param {string} key translation key\r\n * @returns {string} cached translation\r\n */\r\n _this.getValue = function (lang, key) {\r\n if (lang in cache && key in cache[lang]) {\r\n return cache[lang][key];\r\n }\r\n };\r\n\r\n /**\r\n * Get all cached translations for specified language where key contains specified criteria string.\r\n * @param {string} lang language\r\n * @param {string} key translation key criteria to search all keys matching it\r\n * @returns {string} cached translation\r\n */\r\n _this.getAllValues = function (lang, keyPrefix) {\r\n if (lang in cache) {\r\n var allPairs = _.pairs(cache[lang]);\r\n\r\n return _.filter(allPairs,\r\n function(pair) {\r\n return pair[0].toString().startsWith(keyPrefix);\r\n });\r\n }\r\n\r\n return [];\r\n };\r\n\r\n /**\r\n * Add new cached value\r\n * @param {string} lang language\r\n * @param {string} key key of the resource\r\n * @param {string} value translation\r\n */\r\n _this.setValue = function (lang, key, value) {\r\n if (!cache[lang]) {\r\n cache[lang] = {};\r\n }\r\n cache[lang][key] = value;\r\n };\r\n\r\n /**\r\n * Check if language already cached\r\n * @param {string} lang language\r\n * @returns {boolean} true if cached\r\n */\r\n _this.hasLanguage = function (lang) {\r\n return !!cache[lang];\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;\r\n","angular.module('env.i18n.localeName', [])\r\n\r\n .factory('LocaleName', function () {\r\n\r\n /**\r\n * IETF language tag object\r\n * @param {string|LocaleName} languageTag - string representation of language tag\r\n * @constructor\r\n */\r\n function LocaleName(languageTag) {\r\n\r\n var me = this;\r\n\r\n /**\r\n * Default delimiter. '-' by default.\r\n * @type {string}\r\n */\r\n this.defaultDelimiter = \"-\";\r\n\r\n /**\r\n * Two-letter language code from ISO 639-1 (2002);\r\n * Or a three-letter code from ISO 639-2 (1998), ISO 639-3 (2007) or ISO 639-5 (2008)\r\n * Usually written in lower case\r\n * @type {string}\r\n */\r\n this.language = null;\r\n\r\n /**\r\n * Four-letter script code from ISO 15924\r\n * Usually written in title case\r\n * @type {string}\r\n */\r\n this.script = null;\r\n\r\n /**\r\n * Two-letter country code from ISO 3166-1 alpha-2, usually written in upper case\r\n * or a three-digit code from UN M.49 for geographical regions;\r\n * @type {string}\r\n */\r\n this.region = null;\r\n\r\n /**\r\n * Five to eight letters,\r\n * or four characters starting with a digit;\r\n * (Variant subtags are registered with IANA and not associated with any external standard.)\r\n * @type {string}\r\n */\r\n this.variant = null;\r\n\r\n //region private members\r\n\r\n /**\r\n * Convert single word to title case\r\n * @param {string} word\r\n * @private\r\n * @return {string}\r\n */\r\n function _toTitleCase(word) {\r\n return word.charAt(0).toUpperCase() + word.substr(1).toLowerCase();\r\n }\r\n\r\n /**\r\n * Constructor function\r\n * @param {string} str - language code\r\n * @private\r\n */\r\n function _constructFromString(str) {\r\n // Regex of short version of IETF standard\r\n var localeRegEx = /^([a-z]{2,3})(?:[\\-_ ]([a-z]{4}))?(?:[\\-_ ]((?:[a-z]{1,3})|(?:[0-9]{3})))?(?:[\\-_ ]([a-z0-9]{5,8}))?$/i;\r\n var match = localeRegEx.exec(str);\r\n if (!match || !match[1]) {\r\n throw new Error(\"String argument is not valid IETF language tag\");\r\n }\r\n\r\n me.language = match[1].toLowerCase();\r\n me.script = _toTitleCase(match[2] || '');\r\n me.region = (match[3] || '').toUpperCase();\r\n me.variant = (match[4] || '').toLowerCase();\r\n }\r\n\r\n /**\r\n * Get comparable variants of language (including current form)\r\n * @param {string} [delimiter] optional delimiter\r\n * @return {Array}\r\n * @private\r\n */\r\n var _getComparable = function (delimiter) {\r\n var d = delimiter || me.defaultDelimiter;\r\n var l = me.language.toLowerCase();\r\n var s = me.script ? d + _toTitleCase(me.script) : '';\r\n var r = me.region ? d + me.region.toUpperCase() : '';\r\n var v = me.variant ? d + me.variant.toLowerCase() : '';\r\n\r\n return _.uniq([ // without duplicates\r\n l + s + r + v, // full form\r\n l + s + r, // without variant part\r\n l + r, // without script part\r\n l + s, // with script part only\r\n l // pure lang form\r\n ]);\r\n };\r\n\r\n //endregion\r\n\r\n //region public members\r\n\r\n /**\r\n * Convert to string representation\r\n * @param {string} [delimiter] optional delimiter\r\n * @returns {string}\r\n */\r\n var toString = function (delimiter) {\r\n var d = delimiter || me.defaultDelimiter;\r\n return me.language.toLowerCase() +\r\n (me.script ? d + _toTitleCase(me.script) : '') +\r\n (me.region ? d + me.region.toUpperCase() : '') +\r\n (me.variant ? d + me.variant.toLowerCase() : '');\r\n };\r\n\r\n /**\r\n * Find the most suitable language from the list\r\n * @param {Array} availableLanguages - array of available languages\r\n * @return {string} most suitable language to the current one from input array of available languages\r\n */\r\n function getMostSuitableLanguage(availableLanguages) {\r\n var comparable = _getComparable();\r\n for (var i = 0; i < comparable.length; i++) {\r\n for (var j = 0; j < availableLanguages.length; j++) {\r\n if (comparable[i].toLowerCase() == availableLanguages[j].toLowerCase()) {\r\n return comparable[i];\r\n }\r\n }\r\n }\r\n }\r\n\r\n //endregion\r\n\r\n if (languageTag && _.isString(languageTag)) {\r\n _constructFromString(languageTag);\r\n } else if (languageTag && typeof languageTag == 'LocaleName') {\r\n _constructFromString(languageTag.toString());\r\n } else {\r\n throw new Error(\"Argument must be string or another LocaleName\");\r\n }\r\n\r\n _.extend(this, {\r\n toString: toString,\r\n getMostSuitableLanguage: getMostSuitableLanguage\r\n });\r\n }\r\n\r\n return (LocaleName);\r\n })\r\n\r\n;","angular.module('env.i18n.kendoMessages', [])\r\n .service('kendoMessages', ['$log', 'gettextCatalog', function ($log, gettextCatalog) {\r\n var _this = this;\r\n _this.update = function () {\r\n try {\r\n kendo.ui.FlatColorPicker && (kendo.ui.FilterCell.prototype.options.operators = $.extend(!0, kendo.ui.FilterCell.prototype.options.operators, {\r\n date: {\r\n eq: gettextCatalog.getString(\"FilterCell.date.eq: equals\"),\r\n gte: gettextCatalog.getString(\"FilterCell.date.gte: greater or equal\"),\r\n gt: gettextCatalog.getString(\"FilterCell.date.gt: greater\"),\r\n lte: gettextCatalog.getString(\"FilterCell.date.lte: less or equal\"),\r\n lt: gettextCatalog.getString(\"FilterCell.date.lt: less\"),\r\n neq: gettextCatalog.getString(\"FilterCell.date.neq: not equals\")\r\n },\r\n number: {\r\n eq: gettextCatalog.getString(\"FilterCell.number.eq: equals\"),\r\n gte: gettextCatalog.getString(\"FilterCell.number.gte: greater or equal\"),\r\n gt: gettextCatalog.getString(\"FilterCell.number.gt: greater\"),\r\n lte: gettextCatalog.getString(\"FilterCell.number.lte: less or equal\"),\r\n lt: gettextCatalog.getString(\"FilterCell.number.lt: less\"),\r\n neq: gettextCatalog.getString(\"FilterCell.number.neq: not equals\")\r\n },\r\n string: {\r\n endswith: gettextCatalog.getString(\"FilterCell.string.endswith: ends with\"),\r\n eq: gettextCatalog.getString(\"FilterCell.string.eq: equals\"),\r\n neq: gettextCatalog.getString(\"FilterCell.string.neq: not equal\"),\r\n startswith: gettextCatalog.getString(\"FilterCell.string.startswith: starts with\"),\r\n contains: gettextCatalog.getString(\"FilterCell.string.contains: contains\"),\r\n doesnotcontain: gettextCatalog.getString(\"FilterCell.string.doesnotcontain: doesn't contains\")\r\n },\r\n \"enum\": {\r\n eq: gettextCatalog.getString(\"FilterCell.enum.eq: equal\"),\r\n neq: gettextCatalog.getString(\"FilterCell.enum.neq: not equal\")\r\n },\r\n enums: {\r\n eq: gettextCatalog.getString(\"FilterCell.enums.eq: equal\"),\r\n neq: gettextCatalog.getString(\"FilterCell.enums.neq: not equal\")\r\n }\r\n }));\r\n (kendo.ui.FlatColorPicker.prototype.options.messages = $.extend(!0, kendo.ui.FlatColorPicker.prototype.options.messages, {\r\n apply: gettextCatalog.getString(\"FlatColorPicker.apply: Apply\"),\r\n cancel: gettextCatalog.getString(\"FlatColorPicker.cancel: Cancel\")\r\n }));\r\n kendo.ui.ColorPicker && (kendo.ui.ColorPicker.prototype.options.messages = $.extend(!0, kendo.ui.ColorPicker.prototype.options.messages, {\r\n apply: gettextCatalog.getString(\"ColorPicker.apply: Apply\"),\r\n cancel: gettextCatalog.getString(\"ColorPicker.cancel: Cancel\")\r\n }));\r\n kendo.ui.ColumnMenu && (kendo.ui.ColumnMenu.prototype.options.messages = $.extend(!0, kendo.ui.ColumnMenu.prototype.options.messages, {\r\n sortAscending: gettextCatalog.getString(\"ColumnMenu.sortAscending: Sort Ascending\"),\r\n sortDescending: gettextCatalog.getString(\"ColumnMenu.sortDescending: Sort Descending\"),\r\n filter: gettextCatalog.getString(\"ColumnMenu.filter: Filter\"),\r\n columns: gettextCatalog.getString(\"ColumnMenu.columns: Columns\"),\r\n done: gettextCatalog.getString(\"ColumnMenu.done: Done\"),\r\n settings: gettextCatalog.getString(\"ColumnMenu.settings: Column Settings\"),\r\n lock: gettextCatalog.getString(\"ColumnMenu.lock: Lock\"),\r\n unlock: gettextCatalog.getString(\"ColumnMenu.unlock: Unlock\")\r\n }));\r\n kendo.ui.Editor && (kendo.ui.Editor.prototype.options.messages = $.extend(!0, kendo.ui.Editor.prototype.options.messages, {\r\n bold: gettextCatalog.getString(\"Editor.bold: Bold\"),\r\n italic: gettextCatalog.getString(\"Editor.italic: Italic\"),\r\n underline: gettextCatalog.getString(\"Editor.underline: Underline\"),\r\n strikethrough: gettextCatalog.getString(\"Editor.strikethrough: Strikethrough\"),\r\n superscript: gettextCatalog.getString(\"Editor.superscript: Superscript\"),\r\n subscript: gettextCatalog.getString(\"Editor.subscript: Subscript\"),\r\n justifyCenter: gettextCatalog.getString(\"Editor.justifyCenter: Center text\"),\r\n justifyLeft: gettextCatalog.getString(\"Editor.justifyLeft: Align text left\"),\r\n justifyRight: gettextCatalog.getString(\"Editor.justifyRight: Align text right\"),\r\n justifyFull: gettextCatalog.getString(\"Editor.justifyFull: Justify\"),\r\n insertUnorderedList: gettextCatalog.getString(\"Editor.insertUnorderedList: Insert unordered list\"),\r\n insertOrderedList: gettextCatalog.getString(\"Editor.insertOrderedList: Insert ordered list\"),\r\n indent: gettextCatalog.getString(\"Editor.indent: Indent\"),\r\n outdent: gettextCatalog.getString(\"Editor.outdent: Outdent\"),\r\n createLink: gettextCatalog.getString(\"Editor.createLink: Insert hyperlink\"),\r\n unlink: gettextCatalog.getString(\"Editor.unlink: Remove hyperlink\"),\r\n insertImage: gettextCatalog.getString(\"Editor.insertImage: Insert image\"),\r\n insertFile: gettextCatalog.getString(\"Editor.insertFile: Insert file\"),\r\n insertHtml: gettextCatalog.getString(\"Editor.insertHtml: Insert HTML\"),\r\n viewHtml: gettextCatalog.getString(\"Editor.viewHtml: View HTML\"),\r\n fontName: gettextCatalog.getString(\"Editor.fontName: Select font family\"),\r\n fontNameInherit: gettextCatalog.getString(\"Editor.fontNameInherit: (inherited font)\"),\r\n fontSize: gettextCatalog.getString(\"Editor.fontSize: Select font size\"),\r\n fontSizeInherit: gettextCatalog.getString(\"Editor.fontSizeInherit: (inherited size)\"),\r\n formatBlock: gettextCatalog.getString(\"Editor.formatBlock: Format\"),\r\n formatting: gettextCatalog.getString(\"Editor.formatting: Format\"),\r\n foreColor: gettextCatalog.getString(\"Editor.foreColor: Color\"),\r\n backColor: gettextCatalog.getString(\"Editor.backColor: Background color\"),\r\n style: gettextCatalog.getString(\"Editor.style: Styles\"),\r\n emptyFolder: gettextCatalog.getString(\"Editor.emptyFolder: Empty Folder\"),\r\n uploadFile: gettextCatalog.getString(\"Editor.uploadFile: Upload\"),\r\n orderBy: gettextCatalog.getString(\"Editor.orderBy: Arrange by:\"),\r\n orderBySize: gettextCatalog.getString(\"Editor.orderBySize: Size\"),\r\n orderByName: gettextCatalog.getString(\"Editor.orderByName: Name\"),\r\n invalidFileType: gettextCatalog.getString('Editor.invalidFileType: The selected file \"{0}\" is not valid. Supported file types are {1}.'),\r\n deleteFile: gettextCatalog.getString('Editor.deleteFile: Are you sure you want to delete \"{0}\"?'),\r\n overwriteFile: gettextCatalog.getString('Editor.overwriteFile: A file with name \"{0}\" already exists in the current directory. Do you want to overwrite it?'),\r\n directoryNotFound: gettextCatalog.getString(\"Editor.directoryNotFound: A directory with this name was not found.\"),\r\n imageWebAddress: gettextCatalog.getString(\"Editor.imageWebAddress: Web address\"),\r\n imageAltText: gettextCatalog.getString(\"Editor.imageAltText: Alternate text\"),\r\n imageWidth: gettextCatalog.getString(\"Editor.imageWidth: Width (px)\"),\r\n imageHeight: gettextCatalog.getString(\"Editor.imageHeight: Height (px)\"),\r\n fileWebAddress: gettextCatalog.getString(\"Editor.fileWebAddress: Web address\"),\r\n fileTitle: gettextCatalog.getString(\"Editor.fileTitle: Title\"),\r\n linkWebAddress: gettextCatalog.getString(\"Editor.linkWebAddress: Web address\"),\r\n linkText: gettextCatalog.getString(\"Editor.linkText: Text\"),\r\n linkToolTip: gettextCatalog.getString(\"Editor.linkToolTip: ToolTip\"),\r\n linkOpenInNewWindow: gettextCatalog.getString(\"Editor.linkOpenInNewWindow: Open link in new window\"),\r\n dialogUpdate: gettextCatalog.getString(\"Editor.dialogUpdate: Update\"),\r\n dialogInsert: gettextCatalog.getString(\"Editor.dialogInsert: Insert\"),\r\n dialogButtonSeparator: gettextCatalog.getString(\"Editor.dialogButtonSeparator: or\"),\r\n dialogCancel: gettextCatalog.getString(\"Editor.dialogCancel: Cancel\"),\r\n createTable: gettextCatalog.getString(\"Editor.createTable: Create table\"),\r\n addColumnLeft: gettextCatalog.getString(\"Editor.addColumnLeft: Add column on the left\"),\r\n addColumnRight: gettextCatalog.getString(\"Editor.addColumnRight: Add column on the right\"),\r\n addRowAbove: gettextCatalog.getString(\"Editor.addRowAbove: Add row above\"),\r\n addRowBelow: gettextCatalog.getString(\"Editor.addRowBelow: Add row below\"),\r\n deleteRow: gettextCatalog.getString(\"Editor.deleteRow: Delete row\"),\r\n deleteColumn: gettextCatalog.getString(\"Editor.deleteColumn: Delete column\"),\r\n search: gettextCatalog.getString(\"Editor.search: Search\"),\r\n dropFilesHere: gettextCatalog.getString(\"Editor.dropFilesHere: Drop files here\"),\r\n styles: gettextCatalog.getString(\"Editor.styles: Styles\")\r\n }));\r\n kendo.ui.FileBrowser && (kendo.ui.FileBrowser.prototype.options.messages = $.extend(!0, kendo.ui.FileBrowser.prototype.options.messages, {\r\n uploadFile: gettextCatalog.getString(\"FileBrowser.uploadFile: Upload\"),\r\n orderBy: gettextCatalog.getString(\"FileBrowser.orderBy: Arrange by\"),\r\n orderByName: gettextCatalog.getString(\"FileBrowser.orderByName: Name\"),\r\n orderBySize: gettextCatalog.getString(\"FileBrowser.orderBySize: Size\"),\r\n directoryNotFound: gettextCatalog.getString(\"FileBrowser.directoryNotFound: A directory with this name was not found.\"),\r\n emptyFolder: gettextCatalog.getString(\"FileBrowser.emptyFolder: Empty Folder\"),\r\n deleteFile: gettextCatalog.getString('FileBrowser.deleteFile: Are you sure you want to delete \"{0}\"?'),\r\n invalidFileType: gettextCatalog.getString('FileBrowser.invalidFileType: The selected file \"{0}\" is not valid. Supported file types are {1}.'),\r\n overwriteFile: gettextCatalog.getString('FileBrowser.overwriteFile: A file with name \"{0}\" already exists in the current directory. Do you want to overwrite it?'),\r\n dropFilesHere: gettextCatalog.getString(\"FileBrowser.dropFilesHere: drop file here to upload\"),\r\n search: gettextCatalog.getString(\"FileBrowser.search: Search\")\r\n }));\r\n kendo.ui.FilterCell && (kendo.ui.FilterCell.prototype.options.messages = $.extend(!0, kendo.ui.FilterCell.prototype.options.messages, {\r\n isTrue: gettextCatalog.getString(\"FilterCell.isTrue: is true\"),\r\n isFalse: gettextCatalog.getString(\"FilterCell.isFalse: is false\"),\r\n filter: gettextCatalog.getString(\"FilterCell.filter: Filter\"),\r\n clear: gettextCatalog.getString(\"FilterCell.clear: Clear\"),\r\n operator: gettextCatalog.getString(\"FilterCell.operator: Operator\")\r\n }));\r\n kendo.ui.FilterMenu && (kendo.ui.FilterMenu.prototype.options.messages = $.extend(!0, kendo.ui.FilterMenu.prototype.options.messages, {\r\n info: gettextCatalog.getString(\"FilterMenu.info: Show items with value that:\"),\r\n isTrue: gettextCatalog.getString(\"FilterMenu.isTrue: is true\"),\r\n isFalse: gettextCatalog.getString(\"FilterMenu.isFalse: is false\"),\r\n filter: gettextCatalog.getString(\"FilterMenu.filter: Filter\"),\r\n clear: gettextCatalog.getString(\"FilterMenu.clear: Clear\"),\r\n and: gettextCatalog.getString(\"FilterMenu.and: And\"),\r\n or: gettextCatalog.getString(\"FilterMenu.or: Or\"),\r\n selectValue: gettextCatalog.getString(\"FilterMenu.selectValue: -Select value-\"),\r\n operator: gettextCatalog.getString(\"FilterMenu.operator: Operator\"),\r\n value: gettextCatalog.getString(\"FilterMenu.value: Value\"),\r\n cancel: gettextCatalog.getString(\"FilterMenu.cancel: Cancel\")\r\n }));\r\n kendo.ui.FilterMenu && (kendo.ui.FilterMenu.prototype.options.operators = $.extend(!0, kendo.ui.FilterMenu.prototype.options.operators, {\r\n string: {\r\n eq: gettextCatalog.getString(\"FilterMenu.string.eq: Is equal to\"),\r\n neq: gettextCatalog.getString(\"FilterMenu.string.neq: Is not equal to\"),\r\n startswith: gettextCatalog.getString(\"FilterMenu.string.startswith: Starts with\"),\r\n contains: gettextCatalog.getString(\"FilterMenu.string.contains: Contains\"),\r\n doesnotcontain: gettextCatalog.getString(\"FilterMenu.string.doesnotcontain: Does not contain\"),\r\n endswith: gettextCatalog.getString(\"FilterMenu.string.endswith: Ends with\")\r\n },\r\n number: {\r\n eq: gettextCatalog.getString(\"FilterMenu.number.eq: Is equal to\"),\r\n neq: gettextCatalog.getString(\"FilterMenu.number.neq: Is not equal to\"),\r\n gte: gettextCatalog.getString(\"FilterMenu.number.gte: Is greater than or equal to\"),\r\n gt: gettextCatalog.getString(\"FilterMenu.number.gt: Is greater than\"),\r\n lte: gettextCatalog.getString(\"FilterMenu.number.lte: Is less than or equal to\"),\r\n lt: gettextCatalog.getString(\"FilterMenu.number.lt: Is less than\")\r\n },\r\n date: {\r\n eq: gettextCatalog.getString(\"FilterMenu.date.eq: Is equal to\"),\r\n neq: gettextCatalog.getString(\"FilterMenu.date.neq: Is not equal to\"),\r\n gte: gettextCatalog.getString(\"FilterMenu.date.gte: Is after or equal to\"),\r\n gt: gettextCatalog.getString(\"FilterMenu.date.gt: Is after\"),\r\n lte: gettextCatalog.getString(\"FilterMenu.date.lte: Is before or equal to\"),\r\n lt: gettextCatalog.getString(\"FilterMenu.date.lt: Is before\")\r\n },\r\n \"enum\": {\r\n eq: gettextCatalog.getString(\"FilterMenu.enum.eq: Is equal to\"),\r\n neq: gettextCatalog.getString(\"FilterMenu.enum.neq: Is not equal to\")\r\n },\r\n enums: {\r\n eq: gettextCatalog.getString(\"FilterMenu.enums.eq: Is equal to\"),\r\n neq: gettextCatalog.getString(\"FilterMenu.enums.neq: Is not equal to\")\r\n }\r\n }));\r\n kendo.ui.Gantt && (kendo.ui.Gantt.prototype.options.messages = $.extend(!0, kendo.ui.Gantt.prototype.options.messages, {\r\n views: {\r\n day: gettextCatalog.getString(\"Gantt.views.day: Day\"),\r\n week: gettextCatalog.getString(\"Gantt.views.week: Week\"),\r\n month: gettextCatalog.getString(\"Gantt.views.month: Month\")\r\n },\r\n actions: {\r\n append: gettextCatalog.getString(\"Gantt.actions.append: Add Task\"),\r\n addChild: gettextCatalog.getString(\"Gantt.actions.addChild: Add Child\"),\r\n insertBefore: gettextCatalog.getString(\"Gantt.actions.insertBefore: Add Above\"),\r\n insertAfter: gettextCatalog.getString(\"Gantt.actions.insertAfter: Add Below\")\r\n }\r\n }));\r\n kendo.ui.Grid && (kendo.ui.Grid.prototype.options.messages = $.extend(!0, kendo.ui.Grid.prototype.options.messages, {\r\n commands: {\r\n cancel: gettextCatalog.getString(\"Grid.commands.cancel: Cancel changes\"),\r\n canceledit: gettextCatalog.getString(\"Grid.commands.canceledit: Cancel\"),\r\n create: gettextCatalog.getString(\"Grid.commands.create: Add new record\"),\r\n destroy: gettextCatalog.getString(\"Grid.commands.destroy: Delete\"),\r\n edit: gettextCatalog.getString(\"Grid.commands.edit: Edit\"),\r\n save: gettextCatalog.getString(\"Grid.commands.save: Save changes\"),\r\n select: gettextCatalog.getString(\"Grid.commands.select: Select\"),\r\n update: gettextCatalog.getString(\"Grid.commands.update: Update\")\r\n },\r\n editable: {\r\n cancelDelete: gettextCatalog.getString(\"Grid.editable.cancelDelete: Cancel\"),\r\n confirmation: gettextCatalog.getString(\"Grid.editable.confirmation: Are you sure you want to delete this record?\"),\r\n confirmDelete: gettextCatalog.getString(\"Grid.editable.confirmDelete: Delete\")\r\n }\r\n }));\r\n kendo.ui.Groupable && (kendo.ui.Groupable.prototype.options.messages = $.extend(!0, kendo.ui.Groupable.prototype.options.messages, {\r\n empty: gettextCatalog.getString(\"Groupable.empty: Drag a column header and drop it here to group by that column\")\r\n }));\r\n kendo.ui.NumericTextBox && (kendo.ui.NumericTextBox.prototype.options = $.extend(!0, kendo.ui.NumericTextBox.prototype.options, {\r\n upArrowText: gettextCatalog.getString(\"NumericTextBox.upArrowText: Increase value\"),\r\n downArrowText: gettextCatalog.getString(\"NumericTextBox.downArrowText: Decreate value\")\r\n }));\r\n kendo.ui.Pager && (kendo.ui.Pager.prototype.options.messages = $.extend(!0, kendo.ui.Pager.prototype.options.messages, {\r\n display: gettextCatalog.getString(\"Pager.display: {0} - {1} of {2} items\"),\r\n empty: gettextCatalog.getString(\"Pager.empty: No items to display\"),\r\n page: gettextCatalog.getString(\"Pager.page: Page\"),\r\n of: gettextCatalog.getString(\"Pager.of: of {0}\"),\r\n itemsPerPage: gettextCatalog.getString(\"Pager.itemsPerPage: items per page\"),\r\n first: gettextCatalog.getString(\"Pager.first: Go to the first page\"),\r\n previous: gettextCatalog.getString(\"Pager.previous: Go to the previous page\"),\r\n next: gettextCatalog.getString(\"Pager.next: Go to the next page\"),\r\n last: gettextCatalog.getString(\"Pager.last: Go to the last page\"),\r\n refresh: gettextCatalog.getString(\"Pager.refresh: Refresh\"),\r\n morePages: gettextCatalog.getString(\"Pager.morePages: More pages\")\r\n }));\r\n kendo.ui.PivotGrid && (kendo.ui.PivotGrid.prototype.options.messages = $.extend(!0, kendo.ui.PivotGrid.prototype.options.messages, {\r\n measureFields: gettextCatalog.getString(\"PivotGrid.measureFields: Drop Data Fields Here\"),\r\n columnFields: gettextCatalog.getString(\"PivotGrid.columnFields: Drop Column Fields Here\"),\r\n rowFields: gettextCatalog.getString(\"PivotGrid.rowFields: Drop Rows Fields Here\")\r\n }));\r\n kendo.ui.PivotFieldMenu && (kendo.ui.PivotFieldMenu.prototype.options.messages = $.extend(!0, kendo.ui.PivotFieldMenu.prototype.options.messages, {\r\n info: gettextCatalog.getString(\"PivotFieldMenu.info: Show items with value that:\"),\r\n filterFields: gettextCatalog.getString(\"PivotFieldMenu.filterFields: Fields Filter\"),\r\n filter: gettextCatalog.getString(\"PivotFieldMenu.filter: Filter\"),\r\n include: gettextCatalog.getString(\"PivotFieldMenu.include: Include Fields...\"),\r\n title: gettextCatalog.getString(\"PivotFieldMenu.title: Fields to include\"),\r\n clear: gettextCatalog.getString(\"PivotFieldMenu.clear: Clear\"),\r\n ok: gettextCatalog.getString(\"PivotFieldMenu.ok: Ok\"),\r\n cancel: gettextCatalog.getString(\"PivotFieldMenu.cancel: Cancel\"),\r\n operators: {\r\n contains: gettextCatalog.getString(\"PivotFieldMenu.operators.contains: Contains\"),\r\n doesnotcontain: gettextCatalog.getString(\"PivotFieldMenu.operators.doesnotcontain: Does not contain\"),\r\n startswith: gettextCatalog.getString(\"PivotFieldMenu.operators.startswith: Starts with\"),\r\n endswith: gettextCatalog.getString(\"PivotFieldMenu.operators.endswith: Ends with\"),\r\n eq: gettextCatalog.getString(\"PivotFieldMenu.operators.eq: Is equal to\"),\r\n neq: gettextCatalog.getString(\"PivotFieldMenu.operators.neq: Is not equal to\")\r\n }\r\n }));\r\n kendo.ui.RecurrenceEditor && (kendo.ui.RecurrenceEditor.prototype.options.messages = $.extend(!0, kendo.ui.RecurrenceEditor.prototype.options.messages, {\r\n frequencies: {\r\n never: gettextCatalog.getString(\"RecurrenceEditor.frequencies.never: Never\"),\r\n hourly: gettextCatalog.getString(\"RecurrenceEditor.frequencies.hourly: Hourly\"),\r\n daily: gettextCatalog.getString(\"RecurrenceEditor.frequencies.daily: Daily\"),\r\n weekly: gettextCatalog.getString(\"RecurrenceEditor.frequencies.weekly: Weekly\"),\r\n monthly: gettextCatalog.getString(\"RecurrenceEditor.frequencies.monthly: Monthly\"),\r\n yearly: gettextCatalog.getString(\"RecurrenceEditor.frequencies.yearly: Yearly\")\r\n },\r\n hourly: {\r\n repeatEvery: gettextCatalog.getString(\"RecurrenceEditor.hourly.repeatEvery: Repeat every: \"),\r\n interval: gettextCatalog.getString(\"RecurrenceEditor.hourly.interval: hour(s)\")\r\n },\r\n daily: {\r\n repeatEvery: gettextCatalog.getString(\"RecurrenceEditor.daily.repeatEvery: Repeat every: \"),\r\n interval: gettextCatalog.getString(\"RecurrenceEditor.daily.interval: day(s)\"),\r\n days: gettextCatalog.getString(\"RecurrenceEditor.daily.days: day(s)\")\r\n },\r\n weekly: {\r\n interval: gettextCatalog.getString(\"RecurrenceEditor.weekly.interval: week(s)\"),\r\n repeatEvery: gettextCatalog.getString(\"RecurrenceEditor.weekly.repeatEvery: Repeat every: \"),\r\n repeatOn: gettextCatalog.getString(\"RecurrenceEditor.weekly.repeatOn: Repeat on: \"),\r\n weeks: gettextCatalog.getString(\"RecurrenceEditor.weekly.weeks: week(s)\")\r\n },\r\n monthly: {\r\n repeatEvery: gettextCatalog.getString(\"RecurrenceEditor.monthly.repeatEvery: Repeat every: \"),\r\n repeatOn: gettextCatalog.getString(\"RecurrenceEditor.monthly.repeatOn: Repeat on: \"),\r\n interval: gettextCatalog.getString(\"RecurrenceEditor.monthly.interval: month(s)\"),\r\n day: gettextCatalog.getString(\"RecurrenceEditor.monthly.day: Day \"),\r\n months: gettextCatalog.getString(\"RecurrenceEditor.monthly.months: month(s)\")\r\n },\r\n yearly: {\r\n repeatEvery: gettextCatalog.getString(\"RecurrenceEditor.yearly.repeatEvery: Repeat every: \"),\r\n repeatOn: gettextCatalog.getString(\"RecurrenceEditor.yearly.repeatOn: Repeat on: \"),\r\n interval: gettextCatalog.getString(\"RecurrenceEditor.yearly.interval: year(s)\"),\r\n of: gettextCatalog.getString(\"RecurrenceEditor.yearly.of: of \"),\r\n years: gettextCatalog.getString(\"RecurrenceEditor.yearly.years: year(s)\")\r\n },\r\n end: {\r\n label: gettextCatalog.getString(\"RecurrenceEditor.end.label: End:\"),\r\n mobileLabel: gettextCatalog.getString(\"RecurrenceEditor.end.mobileLabel: Ends\"),\r\n never: gettextCatalog.getString(\"RecurrenceEditor.end.never: Never\"),\r\n after: gettextCatalog.getString(\"RecurrenceEditor.end.after: After \"),\r\n occurrence: gettextCatalog.getString(\"RecurrenceEditor.end.occurrence: occurrence(s)\"),\r\n on: gettextCatalog.getString(\"RecurrenceEditor.end.on: On \"),\r\n endCountOccurrence: gettextCatalog.getString(\"RecurrenceEditor.end.endCountOccurrence: occurrence(s)\"),\r\n endCountAfter: gettextCatalog.getString(\"RecurrenceEditor.end.endCountAfter: Ends\"),\r\n endLabel: gettextCatalog.getString(\"RecurrenceEditor.end.endLabel: End:\"),\r\n endNever: gettextCatalog.getString(\"RecurrenceEditor.end.endNever: Never\"),\r\n endUntilOn: gettextCatalog.getString(\"RecurrenceEditor.end.endUntilOn: Until\")\r\n },\r\n offsetPositions: {\r\n first: gettextCatalog.getString(\"RecurrenceEditor.offsetPositions.first: first\"),\r\n second: gettextCatalog.getString(\"RecurrenceEditor.offsetPositions.second: second\"),\r\n third: gettextCatalog.getString(\"RecurrenceEditor.offsetPositions.third: third\"),\r\n fourth: gettextCatalog.getString(\"RecurrenceEditor.offsetPositions.fourth: fourth\"),\r\n last: gettextCatalog.getString(\"RecurrenceEditor.offsetPositions.last: last\")\r\n },\r\n weekdays: {\r\n day: gettextCatalog.getString(\"RecurrenceEditor.weekdays.day: day\"),\r\n weekday: gettextCatalog.getString(\"RecurrenceEditor.weekdays.weekday: weekday\"),\r\n weekend: gettextCatalog.getString(\"RecurrenceEditor.weekdays.weekend: weekend day\")\r\n }\r\n }));\r\n kendo.ui.Scheduler && (kendo.ui.Scheduler.prototype.options.messages = $.extend(!0, kendo.ui.Scheduler.prototype.options.messages, {\r\n allDay: gettextCatalog.getString(\"Scheduler.allDay: all day\"),\r\n date: gettextCatalog.getString(\"Scheduler.date: Date\"),\r\n event: gettextCatalog.getString(\"Scheduler.event: Event\"),\r\n time: gettextCatalog.getString(\"Scheduler.time: Time\"),\r\n showFullDay: gettextCatalog.getString(\"Scheduler.showFullDay: Show full day\"),\r\n showWorkDay: gettextCatalog.getString(\"Scheduler.showWorkDay: Show business hours\"),\r\n today: gettextCatalog.getString(\"Scheduler.today: Today\"),\r\n save: gettextCatalog.getString(\"Scheduler.save: Save\"),\r\n cancel: gettextCatalog.getString(\"Scheduler.cancel: Cancel\"),\r\n destroy: gettextCatalog.getString(\"Scheduler.destroy: Delete\"),\r\n deleteWindowTitle: gettextCatalog.getString(\"Scheduler.deleteWindowTitle: Delete event\"),\r\n ariaSlotLabel: gettextCatalog.getString(\"Scheduler.ariaSlotLabel: Selected from {0:t} to {1:t}\"),\r\n ariaEventLabel: gettextCatalog.getString(\"Scheduler.ariaEventLabel: {0} on {1:D} at {2:t}\"),\r\n confirmation: gettextCatalog.getString(\"Scheduler.confirmation: Are you sure you want to delete this event?\"),\r\n views: {\r\n day: gettextCatalog.getString(\"Scheduler.views.day: Day\"),\r\n week: gettextCatalog.getString(\"Scheduler.views.week: Week\"),\r\n workWeek: gettextCatalog.getString(\"Scheduler.views.workWeek: Work Week\"),\r\n agenda: gettextCatalog.getString(\"Scheduler.views.agenda: Agenda\"),\r\n month: gettextCatalog.getString(\"Scheduler.views.month: Month\")\r\n },\r\n recurrenceMessages: {\r\n deleteWindowTitle: gettextCatalog.getString(\"Scheduler.recurrenceMessages.deleteWindowTitle: Delete Recurring Item\"),\r\n deleteWindowOccurrence: gettextCatalog.getString(\"Scheduler.recurrenceMessages.deleteWindowOccurrence: Delete current occurrence\"),\r\n deleteWindowSeries: gettextCatalog.getString(\"Scheduler.recurrenceMessages.deleteWindowSeries: Delete the series\"),\r\n editWindowTitle: gettextCatalog.getString(\"Scheduler.recurrenceMessages.editWindowTitle: Edit Recurring Item\"),\r\n editWindowOccurrence: gettextCatalog.getString(\"Scheduler.recurrenceMessages.editWindowOccurrence: Edit current occurrence\"),\r\n editWindowSeries: gettextCatalog.getString(\"Scheduler.recurrenceMessages.editWindowSeries: Edit the series\"),\r\n deleteRecurring: gettextCatalog.getString(\"Scheduler.recurrenceMessages.deleteRecurring: Do you want to delete only this event occurrence or the whole series?\"),\r\n editRecurring: gettextCatalog.getString(\"Scheduler.recurrenceMessages.editRecurring: Do you want to edit only this event occurrence or the whole series?\")\r\n },\r\n editor: {\r\n title: gettextCatalog.getString(\"Scheduler.editor.title: Title\"),\r\n start: gettextCatalog.getString(\"Scheduler.editor.start: Start\"),\r\n end: gettextCatalog.getString(\"Scheduler.editor.end: End\"),\r\n allDayEvent: gettextCatalog.getString(\"Scheduler.editor.allDayEvent: All day event\"),\r\n description: gettextCatalog.getString(\"Scheduler.editor.description: Description\"),\r\n repeat: gettextCatalog.getString(\"Scheduler.editor.repeat: Repeat\"),\r\n timezone: gettextCatalog.getString(\"Scheduler.editor.timezone: \"),\r\n startTimezone: gettextCatalog.getString(\"Scheduler.editor.startTimezone: Start timezone\"),\r\n endTimezone: gettextCatalog.getString(\"Scheduler.editor.endTimezone: End timezone\"),\r\n separateTimezones: gettextCatalog.getString(\"Scheduler.editor.separateTimezones: Use separate start and end time zones\"),\r\n timezoneEditorTitle: gettextCatalog.getString(\"Scheduler.editor.timezoneEditorTitle: Timezones\"),\r\n timezoneEditorButton: gettextCatalog.getString(\"Scheduler.editor.timezoneEditorButton: Time zone\"),\r\n timezoneTitle: gettextCatalog.getString(\"Scheduler.editor.timezoneTitle: Time zones\"),\r\n noTimezone: gettextCatalog.getString(\"Scheduler.editor.noTimezone: No timezone\"),\r\n editorTitle: gettextCatalog.getString(\"Scheduler.editor.editorTitle: Event\")\r\n }\r\n }));\r\n kendo.ui.Slider && (kendo.ui.Slider.prototype.options = $.extend(!0, kendo.ui.Slider.prototype.options, {\r\n increaseButtonTitle: gettextCatalog.getString(\"Slider.increaseButtonTitle: Increase\"),\r\n decreaseButtonTitle: gettextCatalog.getString(\"Slider.decreaseButtonTitle: Decrease\")\r\n }));\r\n kendo.ui.TreeView && (kendo.ui.TreeView.prototype.options.messages = $.extend(!0, kendo.ui.TreeView.prototype.options.messages, {\r\n loading: gettextCatalog.getString(\"TreeView.loading: Loading...\"),\r\n requestFailed: gettextCatalog.getString(\"TreeView.requestFailed: Request failed.\"),\r\n retry: gettextCatalog.getString(\"TreeView.retry: Retry\")\r\n }));\r\n kendo.ui.Upload && (kendo.ui.Upload.prototype.options.localization = $.extend(!0, kendo.ui.Upload.prototype.options.localization, {\r\n select: gettextCatalog.getString(\"Upload.select: Select files...\"),\r\n cancel: gettextCatalog.getString(\"Upload.cancel: Cancel\"),\r\n retry: gettextCatalog.getString(\"Upload.retry: Retry\"),\r\n remove: gettextCatalog.getString(\"Upload.remove: Remove\"),\r\n uploadSelectedFiles: gettextCatalog.getString(\"Upload.uploadSelectedFiles: Upload files\"),\r\n dropFilesHere: gettextCatalog.getString(\"Upload.dropFilesHere: drop files here to upload\"),\r\n statusUploading: gettextCatalog.getString(\"Upload.statusUploading: uploading\"),\r\n statusUploaded: gettextCatalog.getString(\"Upload.statusUploaded: uploaded\"),\r\n statusWarning: gettextCatalog.getString(\"Upload.statusWarning: warning\"),\r\n statusFailed: gettextCatalog.getString(\"Upload.statusFailed: failed\"),\r\n headerStatusUploading: gettextCatalog.getString(\"Upload.headerStatusUploading: Uploading...\"),\r\n headerStatusUploaded: gettextCatalog.getString(\"Upload.headerStatusUploaded: Done\")\r\n }));\r\n kendo.ui.Validator && (kendo.ui.Validator.prototype.options.messages = $.extend(!0, kendo.ui.Validator.prototype.options.messages, {\r\n required: gettextCatalog.getString(\"Validator.required: {0} is required\"),\r\n pattern: gettextCatalog.getString(\"Validator.pattern: {0} is not valid\"),\r\n min: gettextCatalog.getString(\"Validator.min: {0} should be greater than or equal to {1}\"),\r\n max: gettextCatalog.getString(\"Validator.max: {0} should be smaller than or equal to {1}\"),\r\n step: gettextCatalog.getString(\"Validator.step: {0} is not valid\"),\r\n email: gettextCatalog.getString(\"Validator.email: {0} is not valid email\"),\r\n url: gettextCatalog.getString(\"Validator.url: {0} is not valid URL\"),\r\n date: gettextCatalog.getString(\"Validator.date: {0} is not valid date\")\r\n }));\r\n } catch (ex) {\r\n $log.error('Can not initialize kendo messages gettext translations', ex);\r\n }\r\n };\r\n return _this;\r\n }]);","angular.module('env.i18n.kendoLocalization', [])\r\n\r\n .run(function (uiLocalization, kendoMessages) {\r\n uiLocalization.events.on('changed', function () {\r\n kendoMessages.update();\r\n });\r\n })\r\n\r\n .service('kendoLocalization', function ($q, $http, EventingMixin, LocaleName) {\r\n var _this = this;\r\n _this = _.extend(_this, new EventingMixin(['changed']));\r\n\r\n /**\r\n * Cache of available languages\r\n * @type {Array}\r\n */\r\n var languagesList;\r\n\r\n /**\r\n * Default language\r\n * @type {string}\r\n */\r\n var defaultLanguage = \"en-GB\";\r\n\r\n /**\r\n * Current language\r\n * @type {string}\r\n */\r\n var currentLanguage;\r\n\r\n /**\r\n * Get list of supported angular languages\r\n * @returns {!Promise} promise\r\n */\r\n _this.getLanguagesList = function () {\r\n var deferred = $q.defer();\r\n if (languagesList) {\r\n deferred.resolve(languagesList);\r\n } else {\r\n $http.get('translations/availableKendoLocales.json')\r\n .then(function (resp) {\r\n try {\r\n languagesList = resp.data;\r\n deferred.resolve(languagesList);\r\n } catch (err) {\r\n languagesList = null;\r\n deferred.reject(err);\r\n }\r\n }, function (err) {\r\n deferred.reject(err);\r\n });\r\n }\r\n\r\n return deferred.promise;\r\n };\r\n\r\n /**\r\n * Set current language for kendo localization\r\n * @param {string} lang - code of the language\r\n * @returns {!Promise} promise\r\n */\r\n _this.setCurrentLanguage = function (lang) {\r\n var deferred = $q.defer();\r\n\r\n _this.getLanguagesList().then(\r\n function (langList) {\r\n // get the most suitable language code\r\n var languageCode = (new LocaleName(lang)).getMostSuitableLanguage(langList) || defaultLanguage;\r\n\r\n $http.get('vendor/kendo-om-custom/js/cultures/kendo.culture.' + languageCode + '.min.js')\r\n .then(function (resp) {\r\n eval(resp.data);\r\n kendo.culture(languageCode);\r\n currentLanguage = languageCode;\r\n _this.events.raise('changed', {language: languageCode});\r\n deferred.resolve(languageCode);\r\n },\r\n function (err) {\r\n deferred.reject(err);\r\n });\r\n },\r\n function (err) {\r\n deferred.reject(err);\r\n }\r\n );\r\n\r\n return deferred.promise;\r\n };\r\n\r\n /**\r\n * Get current ui localization language\r\n * @returns {string|undefined} current kendo localization language code\r\n */\r\n _this.getCurrentLanguage = function () {\r\n return currentLanguage;\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;","angular.module('env.i18n', [\r\n 'env.i18n.appLocale',\r\n 'env.i18n.serverLocalization',\r\n 'env.i18n.serverLocalizationFilter',\r\n 'env.i18n.uiLocalization',\r\n 'env.i18n.angularLocalization',\r\n 'env.i18n.kendoLocalization',\r\n 'env.i18n.kendoMessages',\r\n\r\n 'env.i18n.localeName'\r\n])\r\n\r\n;","angular.module('env.i18n.appLocale', [])\r\n\r\n .run(function (authService, appLocale, toastr) {\r\n authService.events.on(\"login\", function () {\r\n appLocale.setCurrentLanguageFromCurrentUser()\r\n .catch(function (err) {\r\n toastr.error(\"Can't set system language to \" + appLocale.getCurrentLanguage());\r\n });\r\n });\r\n\r\n authService.events.on('continueSessionAfterReload', function () {\r\n appLocale.setCurrentLanguageFromCurrentUser()\r\n .catch(function (err) {\r\n toastr.error(\"Can't set system language to \" + appLocale.getCurrentLanguage());\r\n });\r\n });\r\n\r\n authService.events.on('authenticationRequiredAfterReload', function () {\r\n appLocale.setGuestLanguage()\r\n .catch(function (err) {\r\n toastr.error(\"Can't set system language to \" + appLocale.getCurrentLanguage());\r\n });\r\n });\r\n\r\n authService.events.on('logout', function () {\r\n appLocale.setGuestLanguage()\r\n .catch(function (err) {\r\n toastr.error(\"Can't set system language to \" + appLocale.getCurrentLanguage());\r\n });\r\n });\r\n })\r\n\r\n .service('appLocale', function ($window, $q, $http, LoadingMixin, angularLocalization, kendoLocalization, uiLocalization, serverLocalization, LocaleName, usersRepository) {\r\n var _this = this;\r\n\r\n _.extend(_this, new LoadingMixin());\r\n\r\n /**\r\n * Current language\r\n * @type {string}\r\n */\r\n var currentLanguage;\r\n\r\n /**\r\n * Get locale codes, that is supported by server\r\n * @returns {!Promise} promise\r\n */\r\n _this.getLanguagesList = function () {\r\n return serverLocalization.getLanguagesList();\r\n };\r\n\r\n\r\n /**\r\n * Cache of translated language codes\r\n * @type {Array}\r\n */\r\n var translatedLanguageList;\r\n\r\n /**\r\n * Get translated language codes\r\n * @returns {!Promise} promise\r\n */\r\n _this.getTranslatedLanguageList = function () {\r\n var deferred = $q.defer();\r\n if (translatedLanguageList) {\r\n deferred.resolve(translatedLanguageList);\r\n } else {\r\n $http.get('translations/localeTranslations.json')\r\n .then(function (resp) {\r\n try {\r\n translatedLanguageList = resp.data;\r\n deferred.resolve(translatedLanguageList);\r\n } catch (err) {\r\n deferred.reject(err);\r\n }\r\n }, function (err) {\r\n deferred.reject(err);\r\n });\r\n }\r\n\r\n return deferred.promise;\r\n };\r\n\r\n /**\r\n * Set language for guests\r\n */\r\n _this.setGuestLanguage = function () {\r\n var browserLocale = _this.getBrowserLocale();\r\n\r\n var l = new LocaleName(browserLocale).toString();\r\n return uiLocalization.setCurrentLanguage(l);\r\n };\r\n\r\n _this.getBrowserLocale = function () {\r\n return $window.navigator.language ||\r\n $window.navigator.browserLanguage ||\r\n $window.navigator.systemLanguage ||\r\n $window.navigator.userLanguage ||\r\n \"en\";\r\n };\r\n\r\n /**\r\n * Set current language\r\n * @param {string} lang - code of language\r\n * @returns {!Promise} promise\r\n */\r\n _this.setCurrentLanguage = function (lang) {\r\n _this.loading.start();\r\n currentLanguage = new LocaleName(lang).toString();\r\n\r\n return $q.all(\r\n [\r\n angularLocalization.setCurrentLanguage(currentLanguage),\r\n kendoLocalization.setCurrentLanguage(currentLanguage),\r\n uiLocalization.setCurrentLanguage(currentLanguage),\r\n serverLocalization.setCurrentLanguage(currentLanguage)\r\n ]).then(\r\n function (result) {\r\n _this.loading.finish();\r\n return result;\r\n },\r\n function (err) {\r\n _this.loading.drop();\r\n return $q.reject(err);\r\n });\r\n };\r\n\r\n /**\r\n * Set language from current user language\r\n *\r\n * @returns {!Promise} promise\r\n */\r\n _this.setCurrentLanguageFromCurrentUser = function () {\r\n return usersRepository.getCurrentUser()\r\n .then(function (user) {\r\n if (!user.$model.culture) {\r\n //Set at least browser locale for the user as the default\r\n //until it will be changed by the user on his profile view\r\n user.$model.culture = _this.getBrowserLocale();\r\n }\r\n return _this.setCurrentLanguage(user.$model.culture);\r\n });\r\n };\r\n\r\n /**\r\n * Get current language\r\n * @returns {string|undefined} current language code\r\n */\r\n _this.getCurrentLanguage = function () {\r\n return currentLanguage;\r\n };\r\n\r\n return _this;\r\n })\r\n;","angular.module('env.i18n.angularLocalization', ['tmh.dynamicLocale'])\r\n\r\n .config(function (tmhDynamicLocaleProvider) {\r\n tmhDynamicLocaleProvider.localeLocationPattern(\r\n om.config.debug\r\n ? 'vendor/angular-i18n/angular-locale_{{locale | lowercase}}.js'\r\n : 'vendor/angular-i18n/angular-locale_{{locale | lowercase}}.js');\r\n })\r\n\r\n .service('angularLocalization', function ($q, $http, tmhDynamicLocale, EventingMixin, LocaleName) {\r\n var _this = this;\r\n _this = _.extend(_this, new EventingMixin(['changed']));\r\n\r\n /**\r\n * Cache of available languages\r\n * @type {Array}\r\n */\r\n var languagesList;\r\n\r\n /**\r\n * Default language\r\n * @type {string}\r\n */\r\n var defaultLanguage = \"en-GB\";\r\n\r\n /**\r\n * Current language\r\n * @type {string}\r\n */\r\n var currentLanguage;\r\n\r\n /**\r\n * Get list of supported angular languages\r\n * @returns {!Promise} promise\r\n */\r\n _this.getLanguagesList = function () {\r\n var deferred = $q.defer();\r\n if (languagesList) {\r\n deferred.resolve(languagesList);\r\n } else {\r\n $http.get('translations/availableAngularLocales.json')\r\n .then(function (resp) {\r\n try {\r\n languagesList = resp.data;\r\n deferred.resolve(languagesList);\r\n } catch (err) {\r\n languagesList = null;\r\n deferred.reject(err);\r\n }\r\n }, function (err) {\r\n deferred.reject(err);\r\n });\r\n }\r\n\r\n return deferred.promise;\r\n };\r\n\r\n /**\r\n * Set current language for angular translations\r\n * @param {string} lang - code of the language\r\n * @returns {!Promise} promise\r\n */\r\n _this.setCurrentLanguage = function (lang) {\r\n var deferred = $q.defer();\r\n\r\n _this.getLanguagesList().then(\r\n function (langList) {\r\n // get the most suitable language code\r\n var languageCode = (new LocaleName(lang)).getMostSuitableLanguage(langList) || defaultLanguage;\r\n\r\n tmhDynamicLocale.set(languageCode.toLowerCase()).then(\r\n function () {\r\n currentLanguage = languageCode;\r\n _this.events.raise('changed', {language: languageCode});\r\n deferred.resolve(languageCode);\r\n },\r\n function (err) {\r\n deferred.reject(err);\r\n });\r\n },\r\n function (err) {\r\n deferred.reject(err);\r\n }\r\n );\r\n\r\n return deferred.promise;\r\n };\r\n\r\n /**\r\n * Get current angular localization language\r\n * @returns {string|undefined} current angular localization language code\r\n */\r\n _this.getCurrentLanguage = function () {\r\n return currentLanguage;\r\n };\r\n\r\n return _this;\r\n })\r\n\r\n;","angular.module('env.loading.loadingMixin', [])\r\n\r\n .factory('LoadingMixin', function ($q) {\r\n\r\n // Ensuring component loaded mixin. Useful for components with promise-based initialization\r\n\r\n // Inside of your component:\r\n // Call start() when you begin init your component\r\n // Call finish() or drop() when loading is complete or fail\r\n\r\n // On depending component:\r\n // Use promise returned from ensureLoaded().\r\n // This promise will be resolved only AFTER finish() call.\r\n // This promise will be rejected only after drop() call.\r\n function LoadingMixin() {\r\n\r\n var _isLoading = true;\r\n var _isDropped = false;\r\n var _loadingDeferred = $q.defer();\r\n\r\n /**\r\n * Start loading\r\n */\r\n function start() {\r\n _isLoading = true;\r\n _isDropped = false;\r\n }\r\n\r\n /**\r\n * Successfully finish loading\r\n */\r\n function finish() {\r\n _isLoading = false;\r\n _isDropped = false;\r\n _loadingDeferred.resolve();\r\n _loadingDeferred = $q.defer();\r\n }\r\n\r\n /**\r\n * Drop loading process (Existing ensureLoaded promises will be rejected)\r\n */\r\n function drop() {\r\n _isLoading = false;\r\n _isDropped = true;\r\n _loadingDeferred.reject();\r\n _loadingDeferred = $q.defer();\r\n }\r\n\r\n /**\r\n * Get promise that will be resolved only after finish() method call\r\n * @returns {*}\r\n */\r\n function ensureLoaded() {\r\n if (!_isLoading) {\r\n if (_isDropped) {\r\n return $q.reject(false);\r\n } else {\r\n return $q.when(true);\r\n }\r\n }\r\n return _loadingDeferred.promise;\r\n }\r\n\r\n /**\r\n * Is module still loading\r\n * @returns {boolean}\r\n */\r\n function isLoading() {\r\n return !!_isLoading;\r\n }\r\n\r\n this.loading = {\r\n isLoading: isLoading,\r\n start: start,\r\n finish: finish,\r\n drop: drop,\r\n ensureLoaded: ensureLoaded\r\n };\r\n }\r\n\r\n return (LoadingMixin);\r\n });","angular.module('env.loading', [\r\n 'env.loading.loadingMixin'\r\n]);","angular.module('env.helpers.injector', [])\r\n\r\n .provider('injector', function () {\r\n var instanceInjector;\r\n\r\n function get() {\r\n return instanceInjector;\r\n }\r\n\r\n function exists() {\r\n return !!instanceInjector;\r\n }\r\n\r\n _.extend(this, {\r\n get: get,\r\n exists: exists\r\n });\r\n\r\n this.$get = ['$injector', function ($injector) {\r\n instanceInjector = $injector;\r\n\r\n return {\r\n get: get,\r\n exists: exists\r\n };\r\n }];\r\n })\r\n\r\n .run(function (injector) {\r\n })\r\n;","angular.module('env.helpers', [\r\n 'env.helpers.injector'\r\n]);","(function () {\r\n\r\n /**\r\n * Shortcuts to access Underscore.String functions.\r\n */\r\n _.str = _.string = _.s = s;\r\n\r\n // Will take a path like 'element[0][1].subElement[\"Hey!.What?\"][\"[hey]\"]'\r\n // and return [\"element\", \"0\", \"1\", \"subElement\", \"Hey!.What?\", \"[hey]\"]\r\n function keysFromPath(path) {\r\n // from http://codereview.stackexchange.com/a/63010/8176\r\n /**\r\n * Repeatedly capture either:\r\n * - a bracketed expression, discarding optional matching quotes inside, or\r\n * - an unbracketed expression, delimited by a dot or a bracket.\r\n */\r\n var re = /\\[(\"|')(.+)\\1\\]|([^.\\[\\]]+)/g;\r\n\r\n var elements = [];\r\n var result;\r\n while ((result = re.exec(path)) !== null) {\r\n elements.push(result[2] || result[3]);\r\n }\r\n return elements;\r\n }\r\n\r\n function objectDeepContainsStr(object, string) {\r\n if (object == null) {\r\n return false;\r\n } else if (_.isString(object)) {\r\n return _.str.include(object.toLowerCase(), string.toLowerCase());\r\n } else if (_.isArray(object)) {\r\n return _.some(object, function (subEl) {\r\n return objectDeepContainsStr(subEl, string);\r\n });\r\n } else if (_.isObject(object)) {\r\n return _.some(_.values(object), function (subEl) {\r\n return objectDeepContainsStr(subEl, string);\r\n });\r\n } else if (_.isDate(object) || _.isNumber(object)) {\r\n var str = object.toString ? object.toString() : \"\";\r\n return _.str.include(str.toLowerCase(), string.toLowerCase());\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n _.mixin({\r\n\r\n /**\r\n * Deep search string in JSON object or Array\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} object\r\n * @param {string} string\r\n * @returns {boolean} true if string was found somewhere inside JSON object tree\r\n */\r\n objectDeepContainsStr: objectDeepContainsStr,\r\n\r\n /**\r\n * Filter Array of objects by string, checking every element if it contains\r\n * string field that has substring as 2nd parameter string\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Arrays\r\n * @param {Array<*>} array\r\n * @param {string} string string to search\r\n * @returns {Array<*>} filtered array\r\n */\r\n deepFilterByStr: function (array, string) {\r\n if (!array || !_.isArray(array)) {\r\n return array;\r\n }\r\n return _.filter(array, function (el) {\r\n return objectDeepContainsStr(el, string);\r\n });\r\n },\r\n\r\n /**\r\n * Remove all object members (without creating another object)\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} obj object\r\n * @returns {*} empty object from arguments\r\n */\r\n clearObject: function (obj) {\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n delete obj[prop];\r\n }\r\n }\r\n return obj;\r\n },\r\n\r\n clearObjectProps: function(obj, propertyName) {\r\n if (_.isArray(propertyName)) {\r\n for (var p = 0; p < propertyName.length; p++) {\r\n _.clearObjectProps(obj, propertyName[p]);\r\n }\r\n } else {\r\n for (var i in obj) {\r\n if (!obj.hasOwnProperty(i)) continue;\r\n if (i === propertyName) {\r\n delete obj[propertyName];\r\n } else if (typeof obj[i] == 'object') {\r\n _.clearObjectProps(obj[i], propertyName);\r\n }\r\n }\r\n }\r\n return obj;\r\n },\r\n\r\n /**\r\n * Object resetting. Clears object from first argument(removing all properties), and copy all properties from second argument to first one\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} targetObj object to reset. Will be cleared and extended from second argument, and then returned\r\n * @param {*} sourceObj source object. Will not change\r\n * @returns {*} first argument, cleared and refilled\r\n */\r\n resetObject: function (targetObj, sourceObj) {\r\n return _.extend(_.clearObject(targetObj), sourceObj)\r\n },\r\n\r\n /**\r\n * Checks if `value` is a promise.\r\n *\r\n * @static\r\n * @memberOf _\r\n * @category Objects\r\n * @param {*} [value] The value to check.\r\n * @returns {boolean} Returns `true` if the `value` is a promise, else `false`.\r\n * @example\r\n *\r\n * _.isPromise($q.when(something));\r\n * // => true\r\n */\r\n isPromise: function (value) {\r\n return !!value && _.isFunction(value.then);\r\n },\r\n\r\n /**\r\n * Iterate through tree\r\n * @param {Object|Array} treeRoot root of the tree\r\n * @param {string} [itemsFieldName] field with sub elements\r\n * @param {function} [beforeFunc] function that will be called before iterating through tree node\r\n * @param {function} [afterFunc] function that will be called after iterating through tree node\r\n */\r\n iterateTree: function (treeRoot, itemsFieldName, beforeFunc, afterFunc) {\r\n itemsFieldName = itemsFieldName || \"items\";\r\n if (_.isArray(treeRoot)) {\r\n _.forEach(treeRoot, function (subEl) {\r\n iterateTreeRecursive(subEl);\r\n });\r\n } else {\r\n iterateTreeRecursive(treeRoot);\r\n }\r\n return treeRoot;\r\n\r\n function iterateTreeRecursive(element) {\r\n if (beforeFunc) beforeFunc(element);\r\n if (element[itemsFieldName]) {\r\n _.forEach(element[itemsFieldName], function (subEl) {\r\n iterateTreeRecursive(subEl);\r\n });\r\n }\r\n if (afterFunc) afterFunc(element);\r\n }\r\n },\r\n\r\n // Gets the value at any depth in a nested object based on the\r\n // path described by the keys given. Keys may be given as an array\r\n // or as a dot-separated string.\r\n getPath: function getPath(obj, ks) {\r\n ks = typeof ks == \"string\" ? keysFromPath(ks) : ks;\r\n\r\n var i = -1, length = ks.length;\r\n\r\n // If the obj is null or undefined we have to break as\r\n // a TypeError will result trying to access any property\r\n // Otherwise keep incrementally access the next property in\r\n // ks until complete\r\n while (++i < length && obj != null) {\r\n obj = obj[ks[i]];\r\n }\r\n return i === length ? obj : void 0;\r\n },\r\n\r\n // Returns a boolean indicating whether there is a property\r\n // at the path described by the keys given\r\n hasPath: function hasPath(obj, ks) {\r\n ks = typeof ks == \"string\" ? keysFromPath(ks) : ks;\r\n\r\n var i = -1, length = ks.length;\r\n while (++i < length && _.isObject(obj)) {\r\n if (ks[i] in obj) {\r\n obj = obj[ks[i]];\r\n } else {\r\n return false;\r\n }\r\n }\r\n return i === length;\r\n },\r\n\r\n // Deep pluck version\r\n pluck: function pluck(arr, key) {\r\n return _.map(arr, function (o) {\r\n return _.getPath(o, key);\r\n });\r\n },\r\n\r\n /**\r\n * Version of classic debounce with one additional thing: if debounced function called repeatedly more then\r\n * `waitLimit` ms, then the function will be called anyway after `waitLimit` ms after first call.\r\n * @param {function} func the debounced function\r\n * @param {number} wait debounce interval\r\n * @param {number} [waitLimit] maximum timeout before calling the debounced function\r\n * @return {Function}\r\n */\r\n debounceLimited: function (func, wait, waitLimit) {\r\n var timeout;\r\n var waitLimitTimeout;\r\n return function () {\r\n var context = this;\r\n var args = arguments;\r\n var later = function () {\r\n clearTimeout(timeout);\r\n clearTimeout(waitLimitTimeout);\r\n waitLimitTimeout = null;\r\n timeout = null;\r\n func.apply(context, args);\r\n };\r\n if (!waitLimitTimeout && waitLimit) {\r\n waitLimitTimeout = setTimeout(later, waitLimit);\r\n }\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n };\r\n },\r\n\r\n isPlainObject: function (obj) {\r\n return obj !== undefined && obj !== null && obj.constructor === Object;\r\n },\r\n\r\n /**\r\n * Clone object deeply\r\n * @param {*} object object to clone\r\n * @return {*}\r\n */\r\n cloneDeep: function (object) {\r\n //TODO: We need periodically check that nobody clones RepresentationModel. (i.e.if we don't have representation models as FieldType.DYNAMIC)\r\n //if (object && object.isRepresentationModel) {\r\n // console.warn('Attempt to clone RepresentationModel instance!');\r\n //}\r\n return window[\"fast-copy\"](object);\r\n }\r\n });\r\n\r\n\r\n})();\r\n","(function () {\r\n String.prototype.replaceAll = function (str1, str2, ignore) {\r\n return this.replace(new RegExp(str1.replace(/([\\/\\,\\!\\\\\\^\\$\\{\\}\\[\\]\\(\\)\\.\\*\\+\\?\\|\\<\\>\\-\\&])/g, \"\\\\$&\"), (ignore\r\n ? \"gi\"\r\n : \"g\")), (typeof (str2) == \"string\") ? str2.replace(/\\$/g, \"$$$$\") : str2);\r\n };\r\n\r\n String.prototype.endsWith = function (suffix) {\r\n if (!suffix || !_.isString(suffix)) {\r\n return false;\r\n }\r\n return this.indexOf(suffix, this.length - suffix.length) !== -1;\r\n };\r\n\r\n String.isNullOrWhiteSpace = function (string) {\r\n if (!string || !_.isString(string) || string.trim() === '') {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n String.prototype.toUtf16Bytes = function () {\r\n var bytes = [];\r\n for (var ii = 0; ii < this.length; ii++) {\r\n var code = this.charCodeAt(ii); // x00-xFFFF\r\n bytes.push(code & 255, code >> 8); // low, high\r\n }\r\n return bytes;\r\n }\r\n})();\r\n","(function () {\r\n RegExp.prototype.escape = function (s) {\r\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\r\n };\r\n})();","(function () {\r\n /**\r\n * Trick for tag name changing.\r\n * Actually, we copy content of the old element to a new element(with new tag name) and replace old one\r\n * @param {string|string} newTagName - new tag name\r\n * @returns {*|jQuery|HTMLElement}\r\n */\r\n $.fn.changeTagName = function (newTagName) {\r\n // create the new, empty shim\r\n if (!newTagName || !_.isString(newTagName) || newTagName.length <= 0) {\r\n return this;\r\n }\r\n var replacement = $('<' + _.str.trim(_.str.dasherize(newTagName), \"_-\") + '>');\r\n // empty container to hold attributes\r\n var attributes = {};\r\n // copy all the attributes to the shell\r\n $.each(this.get(0).attributes, function (index, attribute) {\r\n attributes[attribute.name] = attribute.value;\r\n });\r\n // assign attributes to replacement\r\n replacement.attr(attributes);\r\n // copy the data\r\n replacement.data(this.data());\r\n // get all the kids, with data and events\r\n var contents = this.contents().clone(true);\r\n // inseminate\r\n replacement.append(contents);\r\n // swap it out\r\n this.replaceWith(replacement);\r\n // and we're done\r\n return replacement;\r\n };\r\n\r\n /**\r\n * Get HTML of element and it's content\r\n * @returns {string} outer HTML\r\n */\r\n $.fn.outerHtml = function () {\r\n return jQuery('
    ').append(this.eq(0).clone()).html();\r\n };\r\n})();\r\n\r\n\r\n/**\r\n * Easing for jquery animate\r\n */\r\n(function () {\r\n jQuery.easing['jswing'] = jQuery.easing['swing'];\r\n\r\n jQuery.extend(jQuery.easing,\r\n {\r\n def: 'easeOutQuad',\r\n swing: function (x, t, b, c, d) {\r\n return jQuery.easing[jQuery.easing.def](x, t, b, c, d);\r\n },\r\n easeInQuad: function (x, t, b, c, d) {\r\n return c * (t /= d) * t + b;\r\n },\r\n easeOutQuad: function (x, t, b, c, d) {\r\n return -c * (t /= d) * (t - 2) + b;\r\n },\r\n easeInOutQuad: function (x, t, b, c, d) {\r\n if ((t /= d / 2) < 1) return c / 2 * t * t + b;\r\n return -c / 2 * ((--t) * (t - 2) - 1) + b;\r\n },\r\n easeInCubic: function (x, t, b, c, d) {\r\n return c * (t /= d) * t * t + b;\r\n },\r\n easeOutCubic: function (x, t, b, c, d) {\r\n return c * ((t = t / d - 1) * t * t + 1) + b;\r\n },\r\n easeInOutCubic: function (x, t, b, c, d) {\r\n if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;\r\n return c / 2 * ((t -= 2) * t * t + 2) + b;\r\n },\r\n easeInQuart: function (x, t, b, c, d) {\r\n return c * (t /= d) * t * t * t + b;\r\n },\r\n easeOutQuart: function (x, t, b, c, d) {\r\n return -c * ((t = t / d - 1) * t * t * t - 1) + b;\r\n },\r\n easeInOutQuart: function (x, t, b, c, d) {\r\n if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;\r\n return -c / 2 * ((t -= 2) * t * t * t - 2) + b;\r\n },\r\n easeInQuint: function (x, t, b, c, d) {\r\n return c * (t /= d) * t * t * t * t + b;\r\n },\r\n easeOutQuint: function (x, t, b, c, d) {\r\n return c * ((t = t / d - 1) * t * t * t * t + 1) + b;\r\n },\r\n easeInOutQuint: function (x, t, b, c, d) {\r\n if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;\r\n return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;\r\n },\r\n easeInSine: function (x, t, b, c, d) {\r\n return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;\r\n },\r\n easeOutSine: function (x, t, b, c, d) {\r\n return c * Math.sin(t / d * (Math.PI / 2)) + b;\r\n },\r\n easeInOutSine: function (x, t, b, c, d) {\r\n return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;\r\n },\r\n easeInExpo: function (x, t, b, c, d) {\r\n return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;\r\n },\r\n easeOutExpo: function (x, t, b, c, d) {\r\n return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\r\n },\r\n easeInOutExpo: function (x, t, b, c, d) {\r\n if (t == 0) return b;\r\n if (t == d) return b + c;\r\n if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;\r\n return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;\r\n },\r\n easeInCirc: function (x, t, b, c, d) {\r\n return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;\r\n },\r\n easeOutCirc: function (x, t, b, c, d) {\r\n return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;\r\n },\r\n easeInOutCirc: function (x, t, b, c, d) {\r\n if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;\r\n return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;\r\n },\r\n easeInElastic: function (x, t, b, c, d) {\r\n var s = 1.70158;\r\n var p = 0;\r\n var a = c;\r\n if (t == 0) return b;\r\n if ((t /= d) == 1) return b + c;\r\n if (!p) p = d * .3;\r\n if (a < Math.abs(c)) {\r\n a = c;\r\n s = p / 4;\r\n } else {\r\n s = p / (2 * Math.PI) * Math.asin(c / a);\r\n }\r\n return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\r\n },\r\n easeOutElastic: function (x, t, b, c, d) {\r\n var s = 1.70158;\r\n var p = 0;\r\n var a = c;\r\n if (t == 0) return b;\r\n if ((t /= d) == 1) return b + c;\r\n if (!p) p = d * .3;\r\n if (a < Math.abs(c)) {\r\n a = c;\r\n s = p / 4;\r\n } else {\r\n s = p / (2 * Math.PI) * Math.asin(c / a);\r\n }\r\n return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;\r\n },\r\n easeInOutElastic: function (x, t, b, c, d) {\r\n var s = 1.70158;\r\n var p = 0;\r\n var a = c;\r\n if (t == 0) return b;\r\n if ((t /= d / 2) == 2) return b + c;\r\n if (!p) p = d * (.3 * 1.5);\r\n if (a < Math.abs(c)) {\r\n a = c;\r\n s = p / 4;\r\n } else {\r\n s = p / (2 * Math.PI) * Math.asin(c / a);\r\n }\r\n if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;\r\n return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b;\r\n },\r\n easeInBack: function (x, t, b, c, d, s) {\r\n if (s == undefined) s = 1.70158;\r\n return c * (t /= d) * t * ((s + 1) * t - s) + b;\r\n },\r\n easeOutBack: function (x, t, b, c, d, s) {\r\n if (s == undefined) s = 1.70158;\r\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\r\n },\r\n easeInOutBack: function (x, t, b, c, d, s) {\r\n if (s == undefined) s = 1.70158;\r\n if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;\r\n return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;\r\n },\r\n easeInBounce: function (x, t, b, c, d) {\r\n return c - jQuery.easing.easeOutBounce(x, d - t, 0, c, d) + b;\r\n },\r\n easeOutBounce: function (x, t, b, c, d) {\r\n if ((t /= d) < (1 / 2.75)) {\r\n return c * (7.5625 * t * t) + b;\r\n } else if (t < (2 / 2.75)) {\r\n return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b;\r\n } else if (t < (2.5 / 2.75)) {\r\n return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b;\r\n } else {\r\n return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b;\r\n }\r\n },\r\n easeInOutBounce: function (x, t, b, c, d) {\r\n if (t < d / 2) return jQuery.easing.easeInBounce(x, t * 2, 0, c, d) * .5 + b;\r\n return jQuery.easing.easeOutBounce(x, t * 2 - d, 0, c, d) * .5 + c * .5 + b;\r\n }\r\n });\r\n})();\r\n\r\n\r\n/* jQuery touch gestures.\r\n *\r\n * Copyright (c) technoweenie (https://github.com/technoweenie/jquery.doubletap/blob/master/lib/jquery.doubletap.js)\r\n */\r\n(function ($) {\r\n\r\n var defaults = {\r\n 'swipeTolerance': 40\r\n };\r\n\r\n var touchStatus = function (target, touch) {\r\n this.target = $(target);\r\n this.touch = touch;\r\n this.startX = this.currentX = touch.screenX;\r\n this.startY = this.currentY = touch.screenY;\r\n this.eventType = null;\r\n };\r\n touchStatus.options = {};\r\n touchStatus.latestTap = null;\r\n\r\n touchStatus.prototype.move = function (touch) {\r\n this.currentX = touch.screenX;\r\n this.currentY = touch.screenY;\r\n };\r\n\r\n touchStatus.prototype.process = function () {\r\n var offsetX = this.currentX - this.startX;\r\n var offsetY = this.currentY - this.startY;\r\n if (offsetX == 0 && offsetY == 0) {\r\n this.checkForDoubleTap();\r\n } else if (Math.abs(offsetY) > touchStatus.options.swipeTolerance && Math.abs(offsetY) > Math.abs(offsetX)) {\r\n this.eventType = offsetY > 0 ? 'swipedown' : 'swipeup';\r\n this.target.trigger('swipe', [this]);\r\n } else if (Math.abs(offsetX) > touchStatus.options.swipeTolerance) {\r\n this.eventType = offsetX > 0 ? 'swiperight' : 'swipeleft';\r\n this.target.trigger('swipe', [this]);\r\n }\r\n if (this.eventType) this.target.trigger(this.eventType, [this]);\r\n this.target.trigger('touch', [this]);\r\n };\r\n\r\n touchStatus.prototype.checkForDoubleTap = function () {\r\n if (touchStatus.latestTap) {\r\n if ((new Date() - touchStatus.latestTap) < 400) {\r\n this.eventType = 'doubletap';\r\n }\r\n }\r\n if (!this.eventType) this.eventType = 'tap';\r\n touchStatus.latestTap = new Date();\r\n };\r\n\r\n var swipeEvents = function (elements, options) {\r\n touchStatus.options = $.extend(defaults, options);\r\n elements.bind('touchstart', this.touchStart);\r\n elements.bind('touchmove', this.touchMove);\r\n elements.bind('touchcancel', this.touchCancel);\r\n elements.bind('touchend', this.touchEnd);\r\n };\r\n\r\n swipeEvents.prototype.touchStart = function (evt) {\r\n var target = this;\r\n swipeEvents.eachTouch(evt, function (touch) {\r\n swipeEvents.touches[touch.identifier] = new touchStatus(target, touch);\r\n });\r\n };\r\n\r\n swipeEvents.prototype.touchMove = function (evt) {\r\n swipeEvents.eachTouch(evt, function (touch) {\r\n var loc = swipeEvents.touches[touch.identifier];\r\n if (loc) loc.move(touch);\r\n });\r\n };\r\n\r\n swipeEvents.prototype.touchCancel = function (evt) {\r\n swipeEvents.eachTouch(evt, function (touch) {\r\n swipeEvents.purge(touch, true);\r\n });\r\n };\r\n\r\n swipeEvents.prototype.touchEnd = function (evt) {\r\n swipeEvents.eachTouch(evt, function (touch) {\r\n swipeEvents.purge(touch);\r\n });\r\n };\r\n\r\n swipeEvents.touches = {};\r\n swipeEvents.purge = function (touch, cancelled) {\r\n if (!cancelled) {\r\n var loc = swipeEvents.touches[touch.identifier];\r\n if (loc) loc.process();\r\n }\r\n delete swipeEvents.touches[touch.identifier];\r\n };\r\n\r\n swipeEvents.eachTouch = function (evt, callback) {\r\n var evt = evt.originalEvent;\r\n var num = evt.changedTouches.length;\r\n for (var i = 0; i < num; i++) {\r\n callback(evt.changedTouches[i]);\r\n }\r\n };\r\n\r\n // adds custom events:\r\n // touch // all events\r\n // swipe // only swipe* events\r\n // swipeleft\r\n // swiperight\r\n // swipeup\r\n // swipedown\r\n // tap\r\n // doubletap\r\n $.fn.addSwipeEvents = function (options, callback) {\r\n if (!callback && jQuery.isFunction(options)) {\r\n callback = options;\r\n options = null;\r\n }\r\n new swipeEvents(this, options);\r\n if (callback) this.bind('touch', callback);\r\n return this;\r\n };\r\n})(jQuery);\r\n\r\n\r\n/*\r\n * jQuery Highlight plugin\r\n *\r\n * Based on highlight v3 by Johann Burkard\r\n * http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html\r\n *\r\n * Code a little bit refactored and cleaned (in my humble opinion).\r\n * Most important changes:\r\n * - has an option to highlight only entire words (wordsOnly - false by default),\r\n * - has an option to be case sensitive (caseSensitive - false by default)\r\n * - highlight element tag and class names can be specified in options\r\n *\r\n * Usage:\r\n * // wrap every occurrance of text 'lorem' in content\r\n * // with (default options)\r\n * $('#content').highlight('lorem');\r\n *\r\n * // search for and highlight more terms at once\r\n * // so you can save some time on traversing DOM\r\n * $('#content').highlight(['lorem', 'ipsum']);\r\n * $('#content').highlight('lorem ipsum');\r\n *\r\n * // search only for entire word 'lorem'\r\n * $('#content').highlight('lorem', { wordsOnly: true });\r\n *\r\n * // don't ignore case during search of term 'lorem'\r\n * $('#content').highlight('lorem', { caseSensitive: true });\r\n *\r\n * // wrap every occurrance of term 'ipsum' in content\r\n * // with \r\n * $('#content').highlight('ipsum', { element: 'em', className: 'important' });\r\n *\r\n * // remove default highlight\r\n * $('#content').unhighlight();\r\n *\r\n * // remove custom highlight\r\n * $('#content').unhighlight({ element: 'em', className: 'important' });\r\n *\r\n *\r\n * Copyright (c) 2009 Bartek Szopka\r\n *\r\n * Licensed under MIT license.\r\n *\r\n */\r\n(function () {\r\n jQuery.extend({\r\n highlight: function (node, re, nodeName, className) {\r\n if (node.nodeType === 3) {\r\n var match = node.data.match(re);\r\n if (match) {\r\n var highlight = document.createElement(nodeName || 'span');\r\n highlight.className = className || 'highlight';\r\n var wordNode = node.splitText(match.index);\r\n wordNode.splitText(match[0].length);\r\n var wordClone = wordNode.cloneNode(true);\r\n highlight.appendChild(wordClone);\r\n wordNode.parentNode.replaceChild(highlight, wordNode);\r\n return 1; //skip added node in parent\r\n }\r\n } else if ((node.nodeType === 1 && node.childNodes) && // only element nodes that have children\r\n !/(script|style)/i.test(node.tagName) && // ignore script and style nodes\r\n !(node.tagName === nodeName.toUpperCase() && node.className === className)) { // skip if already highlighted\r\n for (var i = 0; i < node.childNodes.length; i++) {\r\n i += jQuery.highlight(node.childNodes[i], re, nodeName, className);\r\n }\r\n }\r\n return 0;\r\n }\r\n });\r\n\r\n jQuery.fn.unhighlight = function (options) {\r\n var settings = { className: 'highlight', element: 'span' };\r\n jQuery.extend(settings, options);\r\n\r\n return this.find(settings.element + \".\" + settings.className).each(function () {\r\n var parent = this.parentNode;\r\n parent.replaceChild(this.firstChild, this);\r\n parent.normalize();\r\n }).end();\r\n };\r\n\r\n jQuery.fn.highlight = function (words, options) {\r\n var settings = { className: 'highlight', element: 'span', caseSensitive: false, wordsOnly: false };\r\n jQuery.extend(settings, options);\r\n\r\n if (words.constructor === String) {\r\n words = [words];\r\n }\r\n words = jQuery.grep(words, function (word, i) {\r\n return word != '';\r\n });\r\n words = jQuery.map(words, function (word, i) {\r\n return word.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, \"\\\\$&\");\r\n });\r\n if (words.length == 0) { return this; };\r\n\r\n var flag = settings.caseSensitive ? \"\" : \"i\";\r\n var pattern = \"(\" + words.join(\"|\") + \")\";\r\n if (settings.wordsOnly) {\r\n pattern = \"\\\\b\" + pattern + \"\\\\b\";\r\n }\r\n var re = new RegExp(pattern, flag);\r\n\r\n return this.each(function () {\r\n jQuery.highlight(this, re, settings.element, settings.className);\r\n });\r\n };\r\n})();\r\n\r\n\r\n","(function () {\r\n Object.makeEnum = function (arr) {\r\n let obj = Object.create(null);\r\n for (let val of arr) {\r\n obj[val] = Symbol(val);\r\n }\r\n return Object.freeze(obj);\r\n }\r\n})();\r\n","(function () {\r\n Date.today = function() {\r\n const dtToday = new Date();\r\n dtToday.setHours(0, 0, 0, 0);\r\n\r\n return dtToday;\r\n }\r\n\r\n Date.isLessOrEqualTimeOfDay = function (hours, minutes, hoursToCompareTo, minutesToCompareTo) {\r\n return hours < hoursToCompareTo || (hours === hoursToCompareTo && minutes <= minutesToCompareTo);\r\n }\r\n\r\n Date.isSameDateIgnoringTime = function(date1, date2) {\r\n return new Date(date1).toDateString() === new Date(date2).toDateString();\r\n }\r\n\r\n Date.diffHours = function(date1, date2) {\r\n const fromDate = parseInt(new Date(date1).getTime() / 1000);\r\n const toDate = parseInt(new Date(date2).getTime() / 1000);\r\n return (toDate - fromDate) / 3600; //returns difference in hrs\r\n }\r\n\r\n Date.diffDays = function(date1, date2) {\r\n return Date.diffHours(date1, date2) / 24;\r\n }\r\n\r\n /*\r\n * Parses date from Week number string representation of form: %weekNumber%-%fullYear%.\r\n */\r\n Date.parseFromWeekNumber = function (yearWeekNumberString) {\r\n\r\n if (!yearWeekNumberString) throw new Error('yearWeekNumberString must be defined.');\r\n\r\n const year = yearWeekNumberString.substring(yearWeekNumberString.indexOf('-') + 1);\r\n const week = yearWeekNumberString.substring(0, yearWeekNumberString.indexOf('-'));\r\n\r\n\r\n // Jan 1 of 'year'\r\n const d = new Date(year, 0, 1);\r\n const offset = d.getTimezoneOffset();\r\n\r\n // ISO: week 1 is the one with the year's first Thursday \r\n // so nearest Thursday: current date + 4 - current day number\r\n // Sunday is converted from 0 to 7\r\n d.setDate(d.getDate() + 4 - (d.getDay() || 7));\r\n\r\n // 7 days * (week - overlapping first week)\r\n d.setTime(d.getTime() + 7 * 24 * 60 * 60 * 1000\r\n * (week + (year == d.getFullYear() ? -1 : 0)));\r\n\r\n // daylight savings fix\r\n d.setTime(d.getTime()\r\n + (d.getTimezoneOffset() - offset) * 60 * 1000);\r\n\r\n // back to Monday (from Thursday)\r\n d.setDate(d.getDate() - 3);\r\n\r\n return d;\r\n }\r\n\r\n Date.prototype.toLocaleShortDateString = function() {\r\n const options = { year: '2-digit', month: '2-digit', day: '2-digit' };\r\n const d = this;\r\n\r\n return d.toLocaleDateString(undefined, options);\r\n }\r\n\r\n Date.prototype.getYearWeekNumber = function() {\r\n const currentDate = this;\r\n const januaryFirst = new Date(currentDate.getFullYear(), 0, 1);\r\n const daysToNextMonday = (januaryFirst.getDay() === 1) ? 0 : (7 - januaryFirst.getDay()) % 7;\r\n const nextMonday = new Date(currentDate.getFullYear(), 0, januaryFirst.getDate() + daysToNextMonday);\r\n\r\n return (currentDate < nextMonday) ? 52 : (currentDate > nextMonday ? Math.ceil((currentDate - nextMonday) / (24 * 3600 * 1000) / 7) : 1);\r\n }\r\n\r\n Date.prototype.setToMonday = function () {\r\n const d = new Date(this);\r\n const day = d.getDay();\r\n const diff = d.getDate() - day + (day === 0 ? -6 : 1); // adjust when day is sunday\r\n\r\n d.setDate(diff);\r\n d.setHours(1);\r\n d.setMinutes(0);\r\n d.setSeconds(0);\r\n\r\n return new Date(d);\r\n }\r\n\r\n Date.prototype.toISOStringUTC = function(){\r\n const d = this;\r\n\r\n function pad(number) {\r\n return number < 10 ? \"0\" + number : number;\r\n }\r\n\r\n const isoStringUtc = d.getUTCFullYear() +\r\n '-' + pad(d.getUTCMonth() + 1) +\r\n '-' + pad(d.getUTCDate()) +\r\n 'T' + pad(d.getUTCHours()) +\r\n ':' + pad(d.getUTCMinutes()) +\r\n ':' + pad(d.getUTCSeconds());\r\n\r\n return isoStringUtc.toString();\r\n }\r\n\r\n Date.prototype.addHours = function (h) {\r\n const copiedDate = new Date(this.getTime());\r\n copiedDate.setHours(copiedDate.getHours() + h);\r\n return copiedDate;\r\n }\r\n\r\n Date.prototype.addDays = function(d) {\r\n const copiedDate = new Date(this);\r\n copiedDate.setDate(copiedDate.getDate() + d);\r\n return copiedDate;\r\n }\r\n\r\n Date.isLeapYear = function (year) {\r\n return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));\r\n };\r\n\r\n Date.getDaysInMonth = function (year, month) {\r\n return [31, (Date.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\r\n };\r\n\r\n Date.prototype.isLeapYear = function () {\r\n return Date.isLeapYear(this.getFullYear());\r\n };\r\n\r\n Date.prototype.getDaysInMonth = function () {\r\n return Date.getDaysInMonth(this.getFullYear(), this.getMonth());\r\n };\r\n\r\n Date.prototype.addMonths = function (value) {\r\n const copiedDate = new Date(this);\r\n\r\n var yearsToAdd = Math.trunc(value / 12);\r\n var monthsToAdd = Math.abs(value) >= 12 ? value % 12 : value;\r\n\r\n var n = copiedDate.getDate();\r\n copiedDate.setDate(1);\r\n if (monthsToAdd !== 0) {\r\n copiedDate.setMonth(copiedDate.getMonth() + monthsToAdd);\r\n }\r\n if (yearsToAdd !== 0) {\r\n copiedDate.setFullYear(copiedDate.getFullYear() + yearsToAdd);\r\n }\r\n\r\n copiedDate.setDate(Math.min(n, copiedDate.getDaysInMonth()));\r\n return copiedDate;\r\n };\r\n\r\n Date.prototype.isHoliday = function(holidays) {\r\n const d = this;\r\n\r\n //See if the current date is a weekend or not\r\n if (d.getDay() === 0 || d.getDay() === 6) {\r\n return true; //weekend\r\n }\r\n\r\n //Then see if we were given a holidays list and if the date is in it, meaning it's a holiday\r\n if (holidays && holidays.length > 0) {\r\n for (let i = 0; i < holidays.length; i++) {\r\n if (holidays[i].getDate() === d.getDate() && holidays[i].getMonth() === d.getMonth() && holidays[i].getYear() === d.getYear()) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n Date.prototype.addHoursSkippingNonWorkingDays = function(h, holidays) {\r\n const copiedDate = new Date(this.getTime());\r\n var hoursToAdd = h;\r\n\r\n while (hoursToAdd > 0) {\r\n const addValue = hoursToAdd > 24 ? 24 : hoursToAdd;\r\n\r\n copiedDate.setHours(copiedDate.getHours() + addValue);\r\n\r\n if (!copiedDate.isHoliday(holidays)) {\r\n hoursToAdd -= addValue;\r\n }\r\n }\r\n\r\n return copiedDate;\r\n }\r\n})();\r\n","angular.module(\"env.exceptions\", [])\r\n\r\n // Any uncaught exception in angular expressions is delegated to this service\r\n // For root exceptions handling with `window.onerror` check vendor/exception-catcher\r\n .factory(\"$exceptionHandler\", function ($injector, $localStorage) {\r\n\r\n function toLocalStorage(exception) {\r\n\r\n if (!exception || (!exception.stack && !exception.message && !_.isString(exception))) {\r\n return;\r\n }\r\n var messageToLocalStorage = (new Date()).toLocaleTimeString() + ' ' + (exception.stack || exception.message || exception);\r\n\r\n var oldErrors;\r\n try {\r\n oldErrors = $localStorage.getItem(\"errors\");\r\n } catch (e) {\r\n oldErrors = [];\r\n }\r\n if (!oldErrors || !_.isArray(oldErrors)) {\r\n oldErrors = [];\r\n }\r\n oldErrors = oldErrors.slice(-100);\r\n oldErrors.push(messageToLocalStorage);\r\n $localStorage.setItem(\"errors\", oldErrors);\r\n }\r\n\r\n return function (exception, cause) {\r\n var $log = $injector.get(\"$log\", \"$exceptionHandler\");\r\n\r\n try {\r\n if (exception && cause) {\r\n if (!exception.message) {\r\n exception.message = \"Unknown error\";\r\n }\r\n exception.message += \" (caused by '\" + cause + \"')\";\r\n }\r\n\r\n // to local storage\r\n toLocalStorage(exception);\r\n\r\n // add to log\r\n $log.error(\"Unexpected error in angular expressions!\", exception);\r\n } catch (e) {\r\n $log.error(\"We were unable to handle root angular error!\", e);\r\n $log.error(\"More information about angular error:\", error);\r\n }\r\n\r\n // and raise toast\r\n try {\r\n // resolve toastr on runtime to prevent circular module dependency\r\n var toastr = $injector.get(\"toastr\");\r\n var gettextCatalog = $injector.get(\"gettextCatalog\");\r\n\r\n var msg = gettextCatalog.getString(\"An error report has been logged on our server.\"),\r\n header = gettextCatalog.getString(\"Unexpected error!\");\r\n toastr.error(msg + ' ', header);\r\n } catch (ex) {\r\n $log.warn(\"Can't raise toast!\", ex);\r\n }\r\n };\r\n\r\n })\r\n;\r\n","angular.module('env.events', [])\r\n\r\n .constant('EventingMixin', (function EventingMixin(eventNames) {\r\n\r\n /**\r\n * Event name to event handlers array hash\r\n */\r\n var _handlers = {};\r\n\r\n _.each(eventNames, function (el) {\r\n _handlers[el] = [];\r\n });\r\n\r\n /**\r\n * Subscribe to an event\r\n * @param {string} eventName name of the event\r\n * @param {function} eventHandler event handler\r\n */\r\n function on(eventName, eventHandler) {\r\n if (_.isArray(eventName)) {\r\n _.forEach(eventName, function (ename) {\r\n on(ename, eventHandler);\r\n });\r\n } else {\r\n if (!_handlers[eventName]) {\r\n _handlers[eventName] = [];\r\n }\r\n if (!_.any(_handlers[eventName], function (h) {\r\n return h === eventHandler;\r\n })) {\r\n _handlers[eventName].push(eventHandler);\r\n }\r\n return unSubscribe(eventName, eventHandler);\r\n }\r\n }\r\n\r\n function unSubscribe(eventName, handler) {\r\n return function () {\r\n if (_handlers && _handlers[eventName]) {\r\n _handlers[eventName] = _.filter(_handlers[eventName], function (h) {\r\n return h !== handler;\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Raise event\r\n * @param {string} eventName name of the event\r\n * @param args event arguments\r\n */\r\n function raise(eventName, args) {\r\n if (_.isArray(eventName)) {\r\n _.forEach(eventName, function (en) {\r\n raise(en, args);\r\n });\r\n }\r\n\r\n if (!_handlers[eventName]) {\r\n return;\r\n }\r\n _.each(_handlers[eventName], function (handler) {\r\n handler(args);\r\n });\r\n }\r\n\r\n function getEvents() {\r\n return _.keys(_handlers);\r\n }\r\n\r\n this.events = {\r\n on: on,\r\n raise: raise,\r\n getEvents: getEvents\r\n };\r\n })\r\n );","angular.module('env.data',\r\n [\r\n 'env.data.batching', // need to load before coupler (the later defined decorator will be executed first)\r\n 'env.data.requestCoupler', // need to load before interceptors\r\n 'env.data.httpInterceptors',\r\n 'env.data.rest',\r\n\r\n 'env.data.models', // Model definitions\r\n 'env.data.repos', // Repositories\r\n 'env.data.services' // Services\r\n ])\r\n\r\n .config(function (restProvider) {\r\n restProvider.defaultConfig.setBaseUrl(om.config.build.baseUrl);\r\n })\r\n;","angular.module('env.device', [])\r\n\r\n .constant('device', {\r\n isTouch: function () {\r\n return ('ontouchstart' in window) ||\r\n //commented because of ie10\r\n //('onmsgesturechange' in window) ||\r\n (navigator.MaxTouchPoints > 0) ||\r\n (navigator.msMaxTouchPoints > 0);\r\n }\r\n });","angular.module('env.context', [])\r\n\r\n // Context for customisation engine\r\n .service('context', function context($q, $log, EventingMixin, usersRepository, authService) {\r\n var _this = this;\r\n _.extend(this, new EventingMixin(['changed']));\r\n\r\n /**\r\n * Current user object for customisation engine\r\n * @type {Object}\r\n */\r\n var _currentUser;\r\n\r\n authService.events.on('login', resetCurrentUser);\r\n authService.events.on('loginFailed', resetCurrentUser);\r\n authService.events.on('logout', resetCurrentUser);\r\n authService.events.on('sessionExpired', resetCurrentUser);\r\n\r\n /**\r\n * Reset current user for customisation engine\r\n */\r\n function resetCurrentUser() {\r\n _currentUser = null;\r\n }\r\n\r\n /**\r\n * Get current user for customisation engine\r\n * @returns {*} current user plain object\r\n */\r\n function getUserAsync() {\r\n _currentUser = null;\r\n return usersRepository.getCurrentUser().then(function (restUser) {\r\n _currentUser = restUser.unRestClone();\r\n _this.events.raise('changed', {user: _currentUser});\r\n return _currentUser;\r\n });\r\n }\r\n\r\n /**\r\n * Promise.\r\n * Gets current user (and caches it in private variable). Also subscribes to the login/logout\r\n * events and resets the cached user object.\r\n * Since the caller may call it during configuration stage, it checks inside if the services (repos)\r\n * are available for use, otherwise do nothing.\r\n */\r\n function getCurrentUser() {\r\n return $q.when(!_currentUser ? getUserAsync() : _currentUser);\r\n }\r\n\r\n /**\r\n * Promise.\r\n * Gets current context object adding supplied data to it as well as current user object.\r\n * @param data - data to set onto context object\r\n */\r\n _this.getCurrent = function (data) {\r\n var dataToSet = data || {};\r\n var context = _.clone(dataToSet); // shallow copy\r\n\r\n return getCurrentUser().then(function (user) {\r\n context.user = user;\r\n return context;\r\n\r\n }, function (error) {\r\n $log.warn(\"Can't fetch current user info for the current context. Details: %s\",\r\n error.status && error.statusText ? error.status + \" \" + error.statusText : error);\r\n return context;\r\n });\r\n };\r\n\r\n return _this;\r\n }\r\n );\r\n","angular.module('env.custom.customTemplateResolver', [])\r\n\r\n .provider('customTemplateResolver', function CustomTemplateResolver() {\r\n\r\n //region Public methods\r\n\r\n /**\r\n * Returns HTML containing declaration of the custom template tag\r\n * @param name - alias name of the HTML template to resolve from customisation config\r\n * @param _default - default temaplate URI value to use in case of any error (can't resolve template from config or not exist)\r\n */\r\n this.get = function (name, _default) {\r\n return _.string.sprintf('', name, _default);\r\n };\r\n\r\n //endregion\r\n\r\n\r\n this.$get = function () {\r\n return new CustomTemplateResolver();\r\n };\r\n })\r\n\r\n;","angular.module('env.custom.customTemplate', [])\r\n\r\n .directive('customTemplate', function ($log, $q, $compile, $http, templateResolver, context, customResourceResolver) {\r\n\r\n function link(scope, element, attributes) {\r\n\r\n var oldCustomTemplateUrl = null; // old value of resolved image url\r\n\r\n var recompile = function () {\r\n\r\n var customAliasExpression = element.attr(\"name\");\r\n var conditionContextExpression = element.attr(\"context\");\r\n var failOverUri = element.attr(\"failover-uri\");\r\n\r\n var useFailOver = false;\r\n var customAlias = \"\";\r\n var conditionContext = {};\r\n\r\n processExpressions();\r\n\r\n if (useFailOver) {\r\n useFailoverTemplate();\r\n } else {\r\n customResourceResolver.resolveTemplateUri(customAlias, failOverUri, conditionContext).then(function (customTemplateUrl) {\r\n if (customTemplateUrl == oldCustomTemplateUrl) {\r\n return;\r\n }\r\n oldCustomTemplateUrl = customTemplateUrl;\r\n\r\n //Use specified template or a failover one in case of wrong custom template uri\r\n if (customTemplateUrl && _.isString(customTemplateUrl)) {\r\n $log.trace(\"Fetching custom template [%s] to use with 'ng-include' from [%s].\", customAlias, customTemplateUrl);\r\n downloadAndBindHtml(customTemplateUrl);\r\n } else {\r\n $log.warn(\"Can't find custom template for name '%s'\", customAlias);\r\n useFailoverTemplate();\r\n }\r\n });\r\n }\r\n\r\n function processExpressions() {\r\n if (!customAliasExpression || !_.isString(customAliasExpression)) {\r\n $log.warn(\"'custom-template' directive has no 'name' attribute. Using failover template\");\r\n useFailOver = true;\r\n return;\r\n }\r\n\r\n try {\r\n customAlias = scope.$eval(customAliasExpression);\r\n } catch (e) {\r\n $log.error(\"'custom-template' directive can't evaluate expression from 'name' attribute. Using failover template\", e);\r\n useFailOver = true;\r\n return;\r\n }\r\n\r\n try {\r\n conditionContext = scope.$eval(conditionContextExpression);\r\n } catch (e) {\r\n $log.error(\"'custom-template' directive can't evaluate expression from 'context' attribute\", e);\r\n conditionContext = {};\r\n }\r\n }\r\n\r\n function useFailoverTemplate() {\r\n if (angular.isDefined(failOverUri) && angular.isString(failOverUri)) {\r\n $log.trace(\"Using template specified in failover-uri [%s].\", failOverUri);\r\n downloadAndBindHtml(failOverUri);\r\n } else {\r\n $log.warn(\"'custom-template' directive was unable to use custom template as well as failover template. Nothing rendered!\");\r\n }\r\n }\r\n\r\n function downloadAndBindHtml(uri) {\r\n return templateResolver.resolve(uri)\r\n .then(function (template) {\r\n try {\r\n connectHTML(template);\r\n return template;\r\n } catch (err) {\r\n $log.error(\"'custom-template' directive was unable to bind custom template. Nothing rendered!\", err);\r\n return $q.reject(err);\r\n }\r\n }, function (err) {\r\n $log.warn(\"'custom-template' directive was unable to download custom template. Nothing rendered!\");\r\n return $q.reject(err);\r\n });\r\n }\r\n\r\n function connectHTML(html) {\r\n element.empty();\r\n element.append($compile(html)(scope)); // unsafe!\r\n }\r\n\r\n };\r\n\r\n attributes.$observe(\r\n \"name\",\r\n function (newVal, oldVal) {\r\n if (newVal != oldVal) {\r\n recompile();\r\n }\r\n }\r\n );\r\n attributes.$observe(\r\n \"context\",\r\n function (newVal, oldVal) {\r\n if (newVal != oldVal) {\r\n recompile();\r\n }\r\n }\r\n );\r\n\r\n //Subscribe to the context changed event to recompile directive and redraw the content if any\r\n //in order to reflect the template change according to the new context (user or any other customisation data)\r\n if (context) {\r\n context.events.on('changed', function () {\r\n recompile();\r\n });\r\n }\r\n\r\n recompile();\r\n }\r\n\r\n return {\r\n restrict: 'E',\r\n link: link\r\n };\r\n })\r\n;","angular.module('env.custom.customResourceResolver',\r\n [\r\n 'env.customConfig'\r\n ])\r\n\r\n .service('customResourceResolver', function customResourceResolver($q, $log, $customisationConfig, context) {\r\n var cf = $customisationConfig;\r\n var q = $q;\r\n\r\n // Resolves the particular customised resource from the particular customisation configuration section\r\n // Accepts also the default value to return if nothing was found and any context data that should be\r\n // analyzed by the customisation configuration's internal resolvers/conditions\r\n var resolveFromConfig = function (config, name, _default, contextData) {\r\n\r\n // Temp logging feature to catch bugs with missing user\r\n // TODO remove after investigation\r\n //let err = new Error();\r\n // ----------\r\n\r\n //Context service will return context object with current user set on it along with any data supplied\r\n\r\n return context.getCurrent(contextData).then(function (currentContext) {\r\n\r\n var result;\r\n //Set customised resources map onto context so it will be available later from inside the\r\n //'resolve()' methods in the customised resources declarations\r\n currentContext.customResourcesMap = cf.customResourcesMap;\r\n\r\n for (var i = 0; i < config.length; ++i) {\r\n var c = config[i];\r\n if (angular.isDefined(c.name) && angular.isString(c.name) && c.name == name) {\r\n\r\n //See if we have a 'resolve' method defined on the config section\r\n if (angular.isDefined(c.resolve) && angular.isFunction(c.resolve)) {\r\n var r;\r\n try {\r\n r = c.resolve(currentContext);\r\n } catch (ex) {\r\n //$log.warn(`Base call stack: `, err.stack); // TODO remove after investigation\r\n $log.error(\"Error in the `resolve()` method of `\" + name +\r\n \"` case of the customisation config. Check please `customise/config*.js` configuration files.\", ex);\r\n }\r\n if (r) {\r\n result = r;\r\n break;\r\n }\r\n }\r\n //Looks like we don't have resolve method, so try to check for options defined\r\n //Options are a simpler variant of 'resolve', useful for arrays of values\r\n if (angular.isDefined(c.options) && angular.isArray(c.options)) {\r\n\r\n for (var j = 0; j < c.options.length; ++j) {\r\n var opt = c.options[j];\r\n if (angular.isDefined(opt.condition) && angular.isFunction(opt.condition)) {\r\n var cond;\r\n try {\r\n cond = opt.condition(currentContext);\r\n } catch (ex) {\r\n //$log.warn(`Base call stack: `, err.stack); // TODO remove after investigation\r\n $log.error(\"Error in the `condition()` method of `\" + name +\r\n \"` case of the customisation config. Check please `customise/config*.js` configuration files.\", ex);\r\n }\r\n if (cond) {\r\n if (cond == true && angular.isDefined(opt.value)) {\r\n result = opt.value;\r\n } else {\r\n result = cond;\r\n }\r\n break;\r\n }\r\n } else {\r\n if (angular.isDefined(opt.value)) {\r\n result = opt.value;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n }\r\n\r\n if (result) break;\r\n }\r\n }\r\n\r\n return q.when(result || _default);\r\n });\r\n };\r\n\r\n //region Public methods\r\n\r\n /**\r\n * Promise.\r\n * Resolves custom directive name\r\n * @param name - alias name of the directive\r\n * @param _default - default value\r\n */\r\n this.resolveDirective = function (name, _default, conditionContext) {\r\n return resolveFromConfig(cf.directives, name, _default, conditionContext);\r\n };\r\n\r\n /**\r\n * Promise.\r\n * Resolves custom image url\r\n * @param name - alias name of the image\r\n * @param _default - default value\r\n */\r\n this.resolveImage = function (name, _default, conditionContext) {\r\n return resolveFromConfig(cf.images, name, _default, conditionContext);\r\n };\r\n\r\n /**\r\n * Promise.\r\n * Resolves custom HTML template url\r\n * @param name - alias name of the HTML template\r\n * @param _default - default value\r\n */\r\n this.resolveTemplateUri = function (name, _default, conditionContext) {\r\n return resolveFromConfig(cf.templates, name, _default, conditionContext);\r\n };\r\n\r\n /**\r\n * Promise.\r\n * Resolves custom HTML template url\r\n * @param name - alias name of the HTML template\r\n * @param _default - default value\r\n */\r\n this.resolveStyle = function (name, _default, conditionContext) {\r\n return resolveFromConfig(cf.styles, name, _default, conditionContext);\r\n };\r\n\r\n /**\r\n * Promise.\r\n * Resolves custom config object\r\n * @param name - alias name of the configuration section\r\n * @param _default - default value\r\n */\r\n this.resolveConfig = function (name, _default, conditionContext) {\r\n return resolveFromConfig(cf.configs, name, _default, conditionContext);\r\n };\r\n\r\n /**\r\n * Promise.\r\n * Resolves custom reports object\r\n * @param name - alias name of the report config\r\n * @param _default - default value\r\n */\r\n this.resolveReport = function (name, _default, conditionContext) {\r\n return resolveFromConfig(cf.reports, name, _default, conditionContext);\r\n };\r\n\r\n /**\r\n * Returns custom workflow configuration object\r\n * @param _default - default value\r\n */\r\n this.resolveWorkflow = function (_default, conditionContext) {\r\n return resolveFromConfig(cf.configs, \"workflow-config\", _default, conditionContext);\r\n };\r\n\r\n /**\r\n * Returns custom configuration object for a new order\r\n * @param _default - default value\r\n */\r\n this.resolveNewOrder = function (_default, conditionContext) {\r\n return resolveFromConfig(cf.configs, \"new-order-config\", _default, conditionContext);\r\n };\r\n\r\n /**\r\n * Returns custom configuration object for a new order types\r\n * @param _default - default value\r\n */\r\n this.resolveNewOrderTypes = function (_default, conditionContext) {\r\n return resolveFromConfig(cf.configs, \"new-order-types-config\", _default, conditionContext);\r\n };\r\n\r\n //endregion\r\n\r\n this.$get = function ($q, $log, $customisationConfig, context) {\r\n return new customResourceResolver($q, $log, $customisationConfig, context);\r\n };\r\n })\r\n\r\n;\r\n","angular.module('env.custom.customDirective', [])\r\n\r\n .constant('CUSTOM_DIRECTIVE', {\r\n CD: \"cd\", // name of our `custom-directive-resolving` directive\r\n CD_WRAPPER: \"cd-wrapper\", // name of wrapper directive (current one).\r\n CD_NAME: \"cd-name\", // name of attribute for custom directive alias\r\n CD_TYPE: \"cd-type\", // name of attribute for custom directive restrict type (C, E or A)\r\n CD_VALUE: \"cd-value\", // name of attribute for value of custom attribute\r\n CD_CUSTOM_NAME: \"cd-custom-name\", // name of attribute for resolved custom directive name\r\n DEFAULT_TAG: \"div\" // replacement tag for error situations\r\n })\r\n\r\n .directive('cd', function ($compile, $log, customResourceResolver, CUSTOM_DIRECTIVE) {\r\n\r\n var compile = function (element) {\r\n\r\n var cdName = element.attr(CUSTOM_DIRECTIVE.CD_NAME); // custom directive alias\r\n var cdValue = element.attr(CUSTOM_DIRECTIVE.CD) || ''; // custom directive value\r\n\r\n var cdType = 'a'; // custom directive type (E, A or C)\r\n if (element.prop(\"tagName\").toUpperCase() == CUSTOM_DIRECTIVE.CD.toUpperCase()) { // is element\r\n cdType = 'e'\r\n } else if (angular.isDefined(element.attr(CUSTOM_DIRECTIVE.CD))) { // is attribute\r\n cdType = 'a';\r\n } else if (element.hasClass(CUSTOM_DIRECTIVE.CD)) { // is class\r\n cdType = 'c';\r\n }\r\n\r\n if (angular.isUndefined(cdName) || !angular.isString(cdName)) {\r\n $log.error(\"'\" + CUSTOM_DIRECTIVE.CD + \"' directive must have '\" + CUSTOM_DIRECTIVE.CD_NAME + \"' attribute\");\r\n return;\r\n }\r\n\r\n var wrapper = $('<' + CUSTOM_DIRECTIVE.CD_WRAPPER + '>');\r\n wrapper.attr(CUSTOM_DIRECTIVE.CD_NAME, cdName);\r\n wrapper.attr(CUSTOM_DIRECTIVE.CD_TYPE, cdType);\r\n if (cdValue && cdValue != '') {\r\n wrapper.attr(CUSTOM_DIRECTIVE.CD_VALUE, cdValue);\r\n }\r\n\r\n element.removeAttr(CUSTOM_DIRECTIVE.CD);\r\n element.removeClass(CUSTOM_DIRECTIVE.CD);\r\n element.removeAttr(CUSTOM_DIRECTIVE.CD_NAME);\r\n if (cdType == 'e') {\r\n element = element.changeTagName(CUSTOM_DIRECTIVE.DEFAULT_TAG);\r\n }\r\n\r\n element = element.wrap(wrapper);\r\n\r\n var fn = $compile(element.parent()); // compiling again\r\n\r\n return function (scope) {\r\n fn(scope);\r\n }\r\n\r\n };\r\n\r\n return {\r\n priority: 1001, // compiles first\r\n terminal: true, // prevent lower priority directives to compile after it\r\n restrict: 'EAC', // elements, attributes and classes\r\n compile: compile\r\n };\r\n })\r\n\r\n .directive('cdWrapper', function () {\r\n return {\r\n restrict: 'E',\r\n controller: function ($scope, $element, $compile, $log, customResourceResolver, CUSTOM_DIRECTIVE) {\r\n\r\n var recompile = function () {\r\n var cdName = $element.attr(CUSTOM_DIRECTIVE.CD_NAME); // custom directive alias\r\n var cdType = $element.attr(CUSTOM_DIRECTIVE.CD_TYPE); // custom directive type (E, A or C)\r\n var cdCustomName = $element.attr(CUSTOM_DIRECTIVE.CD_CUSTOM_NAME); // custom directive resolved name\r\n var cdValue = $element.attr(CUSTOM_DIRECTIVE.CD_VALUE) || ''; // custom directive name\r\n var cdResolved = angular.isDefined(cdCustomName) && angular.isString(cdCustomName); // true, if custom directive is resolved\r\n\r\n customResourceResolver.resolveDirective(cdName).then(function (cdNewCustomName) {\r\n var cdNewResolved = angular.isDefined(cdNewCustomName) && angular.isString(cdNewCustomName);\r\n if (cdNewCustomName == cdCustomName) { // if directive not changed\r\n return;\r\n }\r\n\r\n var firstChild = $element.children(\":first\");\r\n if (!firstChild) {\r\n return;\r\n }\r\n\r\n if (cdNewResolved) { // new name was resolved\r\n if (cdType == 'e') {\r\n firstChild = firstChild.changeTagName(cdNewCustomName);\r\n } else if (cdType == 'a') {\r\n if (cdResolved) {\r\n cdValue = firstChild.attr(cdCustomName) || cdValue;\r\n firstChild.removeAttr(cdCustomName); // remove old attr\r\n }\r\n firstChild.attr(cdNewCustomName, cdValue || '');\r\n } else if (cdType == 'c') {\r\n if (cdResolved) {\r\n firstChild.removeClass(cdCustomName);\r\n } // remove old class\r\n firstChild.addClass(cdNewCustomName);\r\n }\r\n } else { // if custom directive not found\r\n if (!cdResolved) {\r\n return; // old one was not set up, new one was not resolved\r\n }\r\n\r\n if (cdType == 'e') {\r\n firstChild = firstChild.changeTagName(CUSTOM_DIRECTIVE.DEFAULT_TAG);\r\n } else if (cdType == 'a') {\r\n cdValue = firstChild.attr(cdCustomName) || cdValue;\r\n $element.attr(CUSTOM_DIRECTIVE.CD_VALUE, cdValue || '');\r\n firstChild.removeAttr(cdCustomName);\r\n } else if (cdType == 'c') {\r\n firstChild.removeClass(cdCustomName);\r\n }\r\n }\r\n\r\n $compile(firstChild)($scope);\r\n });\r\n };\r\n\r\n // todo: raise recompile when condition object will changed\r\n\r\n recompile();\r\n }\r\n };\r\n })\r\n;","angular.module('env.custom.customCss', [])\r\n\r\n .directive('customCss', function ($log, context, customResourceResolver) {\r\n\r\n return {\r\n restrict: 'E',\r\n controller: function ($scope, $element) {\r\n\r\n var oldCustomCssUrl = null; // old value of resolved css url\r\n\r\n var recompile = function () {\r\n\r\n var customAliasExpression = $element.attr(\"name\");\r\n var customAlias;\r\n try {\r\n customAlias = $scope.$eval(customAliasExpression);\r\n } catch (e) {\r\n $log.error(\"'custom-css' directive can't evaluate expression from 'name' attribute.\", e);\r\n return;\r\n }\r\n\r\n customResourceResolver.resolveStyle(customAlias, null).then(function (customCssUrl) {\r\n if (customCssUrl == oldCustomCssUrl) {\r\n return;\r\n }\r\n\r\n oldCustomCssUrl = customCssUrl;\r\n\r\n $element.empty();\r\n if (angular.isDefined(customCssUrl) && angular.isString(customCssUrl)) {\r\n $element.append(\"\");\r\n } else {\r\n $log.warn(\"Can't find custom css for name '\" + customAlias + \"'\");\r\n }\r\n });\r\n };\r\n\r\n $scope.$watch(\r\n function () {\r\n return $element.attr(\"name\");\r\n },\r\n function (newVal, oldVal) {\r\n if (newVal != oldVal) {\r\n recompile();\r\n }\r\n }\r\n );\r\n\r\n //Subscribe to the context changed event to recompile directive and redraw the content if any\r\n //in order to reflect the template change according to the new context (user or any other customisation data)\r\n if (context) {\r\n context.events.on('changed', function () {\r\n recompile();\r\n });\r\n }\r\n\r\n recompile();\r\n }\r\n };\r\n })\r\n\r\n;","angular.module('env.custom.customBackground', [])\r\n\r\n .directive('customBackground', function ($log, context, customResourceResolver) {\r\n return {\r\n restrict: 'A',\r\n controller: function ($scope, $element) {\r\n\r\n var oldValue = null;\r\n\r\n var recompile = function () {\r\n\r\n var customAlias = $element.attr(\"custom-background\");\r\n\r\n if (!customAlias) {\r\n $element.removeClass(\"background-image\");\r\n return;\r\n }\r\n\r\n customResourceResolver.resolveImage(customAlias, null).then(function (customImgUrl) {\r\n if (customImgUrl == oldValue) {\r\n return;\r\n }\r\n oldValue = customImgUrl;\r\n\r\n if (angular.isDefined(customImgUrl) && angular.isString(customImgUrl)) {\r\n $element.removeClass(\"background-image\");\r\n $element.addClass(\"custom-background\");\r\n $element.css(\"background-image\", \"url(\" + customImgUrl + \")\");\r\n } else {\r\n $log.warn(\"Can't find custom image for name '\" + customAlias + \"'\");\r\n $element.removeClass(\"background-image\");\r\n }\r\n });\r\n };\r\n\r\n $scope.$watch(\r\n function () {\r\n return $element.attr(\"custom-background\");\r\n },\r\n function (newVal, oldVal) {\r\n if (newVal != oldVal) {\r\n recompile();\r\n }\r\n }\r\n );\r\n\r\n //Subscribe to the context changed event to recompile directive and redraw the content if any\r\n //in order to reflect the template change according to the new context (user or any other customisation data)\r\n if (context) {\r\n context.events.on('changed', function () {\r\n recompile();\r\n });\r\n }\r\n\r\n recompile();\r\n }\r\n };\r\n })\r\n\r\n;","angular.module('env.custom',\r\n [\r\n 'env.customConfig',\r\n 'env.context',\r\n 'env.custom.customBackground',\r\n 'env.custom.customCss',\r\n 'env.custom.customDirective',\r\n 'env.custom.customTemplate',\r\n 'env.custom.customTemplateResolver',\r\n 'env.custom.customResourceResolver',\r\n 'env.custom.customModule' // custom module located in `src/customize/js/customModule.js` folder (it is empty for main branch)\r\n ])\r\n\r\n;","// UI application module aggregator\r\nangular.module('ui',\r\n [\r\n 'ui.shell',\r\n 'ui.login',\r\n 'ui.pwdReset',\r\n 'ui.loadingShadow',\r\n 'ui.appReload',\r\n 'ui.error',\r\n 'ui.order',\r\n 'ui.customer',\r\n 'ui.centre',\r\n 'ui.report',\r\n\r\n 'ui.omqlTester'\r\n ]);\r\n","angular.module('fakeModule', []);","angular.module('env', [\r\n 'env.log',\r\n 'env.exceptions',\r\n 'env.helpers',\r\n 'templates',\r\n 'env.templateResolver',\r\n 'env.loading',\r\n 'env.localStorage',\r\n 'env.notifications',\r\n 'env.uiRouter',\r\n 'env.userSettings',\r\n 'env.events',\r\n 'env.context',\r\n 'env.device',\r\n 'env.threejs',\r\n 'env.services',\r\n\r\n 'env.data',\r\n 'env.i18n',\r\n 'env.custom'\r\n]);\r\n","angular.module('common',\r\n [\r\n 'common.directives.teethConverter',\r\n 'common.directives.focus',\r\n 'common.directives.urlencode',\r\n 'common.directives.recompile',\r\n 'common.directives.buttonSliderMenu',\r\n 'common.directives.omSpinner',\r\n 'common.directives.omStatCounter',\r\n 'common.directives.appLoadingAnimation',\r\n 'common.directives.omNumericTextBox',\r\n 'common.directives.omAutocomplete',\r\n 'common.directives.omDatePicker',\r\n 'common.directives.meshViewer',\r\n 'common.directives.inView',\r\n 'common.directives.scrollIntoViewIf',\r\n 'common.directives.slideInBounce',\r\n 'common.directives.googleTranslate',\r\n 'common.directives.popupMap',\r\n 'common.directives.inlineEditText',\r\n 'common.directives.inlineEditDropdown',\r\n 'common.directives.searchTermHighlight',\r\n 'common.directives.goBackButton'\r\n ]);\r\n","// Main application module\r\nangular.module('app',\r\n [\r\n // external modules\r\n 'ui.router',\r\n 'gettext',\r\n\r\n // external UI modules\r\n 'ngAnimate',\r\n 'ngTouch',\r\n 'kendo.directives',\r\n\r\n // project env modules\r\n 'env',\r\n\r\n // project ui modules\r\n 'ui',\r\n\r\n // common controls and directives\r\n 'common'\r\n ])\r\n .controller('AppController', function AppController($scope) {\r\n // main controller. Do not delete!\r\n\r\n //Disable accepting drag'n'dropped files in out window\r\n //Drop should happen only in the designated zones\r\n //We don't want the browser to open accidently dropped files\r\n window.addEventListener(\"dragover\", function (e) {\r\n e = e || event;\r\n e.preventDefault();\r\n }, false);\r\n window.addEventListener(\"drop\", function (e) {\r\n e = e || event;\r\n e.preventDefault();\r\n }, false);\r\n })\r\n\r\n .config(function config($compileProvider) {\r\n if (!om.config.debug && $compileProvider.debugInfoEnabled) $compileProvider.debugInfoEnabled(false);\r\n })\r\n\r\n ;\r\n"]}