{"version":3,"sources":["vendor-override.js","app/dataModel.js","app/queryParser.js","js/lax-scripts.js","default-inputs.js","app/routes.js","app/lax.js","app/exceptionhandling.js","app/realtimeProvider.js","app/translations.js","app/controllers/activity-stream-controller.js","app/controllers/admin-settings-controller.js","app/controllers/application-controller.js","app/controllers/billing-controller.js","app/controllers/billing-signup-controller.js","app/controllers/bulk-search-controller.js","app/controllers/buy-user-licenses-controller.js","app/controllers/catalog-controller.js","app/controllers/chat-controller.js","app/controllers/codelist-editor-controller.js","app/controllers/communication-channels-controller.js","app/controllers/compare-items-controller.js","app/controllers/confirm-dialog-controller.js","app/controllers/confirmation-controller.js","app/controllers/contacts-controller.js","app/controllers/create-invitation-controller.js","app/controllers/create-task-controller.js","app/controllers/create-user-controller.js","app/controllers/dashboard-controller.js","app/controllers/data-model-exchange-controller.js","app/controllers/datamodel-customization-controller.js","app/controllers/edit-contact-controller.js","app/controllers/edit-report-controller.js","app/controllers/edit-subscriptions-controller.js","app/controllers/edit-task-controller.js","app/controllers/edit-user-account-controller.js","app/controllers/editor-container-controller.js","app/controllers/editor-controller.js","app/controllers/editor-history-controller.js","app/controllers/editor-item-grouping-controller.js","app/controllers/editor-item-hierarchy-controller.js","app/controllers/editor-view-controller.js","app/controllers/error-details-controller.js","app/controllers/export-mapping-controller.js","app/controllers/feature-toggle-controller.js","app/controllers/fetch-item-controller.js","app/controllers/invitations-controller.js","app/controllers/item-review-controller.js","app/controllers/items-controller.js","app/controllers/items-search-query-controller.js","app/controllers/json-editor.js","app/controllers/key-value-maps-controller.js","app/controllers/layout-template-library-controller.js","app/controllers/manage-data-models-controller.js","app/controllers/mass-update-controller.js","app/controllers/messaging-controller.js","app/controllers/modal-instance-controller.js","app/controllers/navigation-controller.js","app/controllers/orders-controller.js","app/controllers/organizations-controller.js","app/controllers/provide-link-controller.js","app/controllers/publication-status-controller.js","app/controllers/publication-tasks-controller.js","app/controllers/publications-controller.js","app/controllers/publish-items-controller.js","app/controllers/received-requests-information-controller.js","app/controllers/registration-controller.js","app/controllers/release-notes-controller.js","app/controllers/reports-controller.js","app/controllers/requests-controller.js","app/controllers/reset-password-controller.js","app/controllers/search-category-controller.js","app/controllers/send-requests-controller.js","app/controllers/sent-requests-controller.js","app/controllers/sessions-controller.js","app/controllers/shopping-cart-controller.js","app/controllers/show-image-controller.js","app/controllers/show-youtube-controller.js","app/controllers/subscriptions-controller.js","app/controllers/supplier-item-review-controller.js","app/controllers/support-controller.js","app/controllers/task-list-controller.js","app/controllers/uploads-controller.js","app/controllers/user-management-controller.js","app/controllers/users-controller.js","app/controllers/webapp-controller.js","app/controllers/asset-folders/asset-folders-controller.js","app/controllers/asset-folders/modal-create-folder-controller.js","app/controllers/asset-folders/modal-rename-folder-controller.js","app/controllers/asset-folders/modal-upload-controller.js","app/controllers/simple-mapping/import-simple-mapping-controller.js","app/controllers/simple-mapping/prefill-simple-mapping.controller.js","app/controllers/simple-mapping/simple-mapping-controller.js","app/controllers/template-mapping/mapping-editor-controller.js","app/controllers/template-mapping/mapping-function-custom-code-controller.js","app/controllers/template-mapping/mapping-function-default-controller.js","app/controllers/template-mapping/mapping-list-controller.js","app/controllers/template-mapping/mapping-selector-controller.js","app/directives/directives.js","app/directives/codelist-directives.js","app/directives/file-thumbnail-directive.js","app/directives/hint-tooltip-directive.js","app/directives/items-directives.js","app/directives/catalog/catalog-attribute-directive.js","app/directives/catalog/catalog-multi-reference-directive.js","app/directives/catalog/catalog-single-reference-directive.js","app/directives/catalog/thumbs-gallery-directive.js","app/directives/asset-folders/asset-folders-drop-overlay-directives.js","app/directives/asset-folders/asset-folders-list-directive.js","app/directives/asset-folders/asset-folders-tree-directive.js","app/directives/template-mapping/mapping-editor-resizer-directive.js","app/directives/template-mapping/mapping-entries-grid-directive.js","app/directives/template-mapping/mapping-function-hint-directive.js","app/directives/template-mapping/mapping-function-parameter-directives.js","app/directives/template-mapping/spreadsheet-viewer-wrapper-directive.js","app/directives/upselling-ads/banner-ad-directive.js","app/directives/upselling-ads/close-ad-button-directive.js","app/directives/upselling-ads/popup-ad-directive.js","app/services/dashlet-services.js","app/services/datetime-helper-service.js","app/services/local-cache-service.js","app/services/services.js","app/services/asset-folders/asset-folders-service.js","app/services/attributes/additional-category-attribute-service.js","app/services/attributes/enum-attribute-service.js","app/services/attributes/group-attribute-service.js","app/services/attributes/multi-dimensional-attribute-service.js","app/services/attributes/reference-attributes-service.js","app/services/export-mapping/export-mapping-service.js","app/services/simple-mapping/simple-mapping-service.js","app/services/template-mapping/sheetjs-service.js","app/services/template-mapping/template-mapping-service.js","app/services/upselling-ads/upselling-ads-service.js","app/filters/filters.js"],"names":["templateModule","angular","module","e","DataModel","dataModelMap","$log","$rootScope","$translate","$q","$window","Auth","DataModelResource","EnumAttributeService","LocalCacheService","organizationAttributes","userAttributes","contactAttributes","reviewAttributes","dashboardAttributes","self","this","LocalStorage","localStorage","layoutAttributesMap","ADDITIONAL_FIELDS","layoutSectionsMap","categoryAttributesMap","queryParsersMap","categoriesOverview","layoutMapping","additionalCategoriesMap","additionalAttributesMap","getGroupFilteredOptions","options","optionListGroups","groupNames","_","isEmpty","filter","option","groups","some","groupName","includes","groupOptions","key","addMatchingOptions","sourceOptions","addAll","forEach","g","push","getParamName","attribute","paramNames","find","paramName","value","get","params","isNil","addToMapList","map","list","indexOf","getAdditionalCategory","moduleName","categoryName","getLayoutSectionsMap","dataModel","layout","layoutSections","undefined","name","sort_order","sortSectionName","filteredSections","sections","section","length","warn","copy","sortedAttributes","sortAttributeName","filteredAttributes","attributes","concat","contains","getLayoutAttributesMap","layoutAttributes","layoutAttributeNames","filteredAttributeNames","i","j","attributeIsRemovedInSection","attributeNames","getCategoryAttributesMap","categoryAttributes","categoryAttributeNames","category","attributeName","getOptionListCacheKey","optionListName","fetchAndCacheOptionListAsync","optionList","dataModelHash","cacheKey","deferred","defer","optionsLoaded","optionsLoadingPromise","getOptionListOptions","serviceName","response","label","labels","icon","icons","debug","cachedOptionList","waitForDBInitialization","then","insertEntryAsync","STORES","optionLists","objectStoreName","catch","error","resolve","responseError","reject","$promise","promise","clearDefaultItems","removeItem","getDefaultItemKey","orgId","userId","organization","setDefaultItem","item","setItem","JSON","stringify","getDefaultItem","defaultItem","getItem","parse","setCategoriesOverview","categoriesOverview_","setLayoutMapping","layoutMapping_","getRaw","getTaskTags","taskTags","getMappingFunctions","mappingFunctions","mappingFunction","hasOptionList","has","optionListOptions","isObject","x","info","translateAllOptions","finally","optionListOptionsAsync","getEntryAsync","deleteEntriesByIndexAsync","indexes","getAttributeOptions","isString","context","optionsParam","getAttributeOptionsParam","referencedOptionAttribute","getReferencedOptionAttribute","isArray","referencedAttributeName","getOrganizationAttributes","getUserAttributes","getContactAttributes","getReviewAttributes","getDashboardAttributes","getCategoriesToShow","categories","showCategories","allCategories","hasAnyPermission","OBJECT_TYPE_ITEMS","category__","getCategoryMenuEntryTypes","showEntries","showSearchBox","getCategoryMenuEntries","entryTypes","entries","type","getItemAdditionalCategories","additionalCategories","additionalModule","typeName","extension","getMissingAdditionalCategories","missingCategories","categoryNames","addAdditionalCategories","additionalCategoriesPerModule","additionalCategory","code","getMissingAdditionalAttributes","missingAttributes","addAdditionalCategoryAttributes","parentCategory","parent","addAdditionalAttributes","additionalAttributesPerModule","additionalAttributes","additionalAttribute","paramValue","paramKey","isPlainObject","addAdditionalSectionAttributes","result","sectionName","predicate","addAdditionalSectionCategoryAttributes","additionalCategoryName","isMetaAttribute","isFunction","ret","merge","mutateSectionAttribute","isLayoutFilterMutation","hasAttributes","Object","keys","hasAttribute","hasAttributeType","getMemberAttributes","returnNames","memberAttributes","memberAttributeNames","valueAttribute","members","keyMembers","valueMembers","potentialPrimaryKeyPart","endsWith","allAttributes","filterPrimaryKeyPartAttributes","attributeIsRemovedInCategory","attribute_status","hasLayouts","layouts","hasLayout","layoutName","mappedLayout","resolvedLayoutName","default__","filteredLayoutAttributes","filteredLayoutAttributeNames","sectionAttributes","sectionAttributeParam","param","anySectionAttributeParam","found","sectionAttribute","hasCategories","hasCategory","showDeleted","modification_status","hidden","categoryHasAttribute","attributeHasCategory","element","additionalSectionAttributes","filterSection","filteredSection","toLowerCase","additionalParams","a","queryParser","attributesByName","QueryParser","getCustomFilter","filterName","getUiReferenceFilter","getCachedAdditionalCategory","additionalCategoryNameOrCode","additionalModuleName","insertCachedAdditionalCategory","deleteCachedAdditionalCategory","attributesMap_","translate","instant","attributesByLabel","init","attributesMap","toLocaleLowerCase","getAttributeOptionsAsync","optionsByLabel","isLegal","query","search","parseQuery","queryTerms","replace","split","dimension","operator","queryTerm","searchResult","exec","trim","defaultTo","attributeNameOrLabel","setCookie","c_name","diffEscape","c_date","Date","c_value","setDate","getDate","toUTCString","document","cookie","getCookie","c_start","c_end","unescape","substring","applyDefaults","object","source","guard","index","iterable","objectTypes","boolean","function","number","string","args","arguments","argsIndex","argsLength","ownIndex","ownProps","lax_rest_url","s","window","location","host","lax_rest_url_escaped","lax_rest_url_complete","protocol","lax_base_url_escaped","removeAllOptions","combo","getSelect","getChild","remove","obj","domId","getInputElement","$","addOption","optionText","optionValue","documentObject","oOption","createElement","getName","CKEDITOR","env","ie","isNaN","parseInt","add","innerHTML","getChildCount","insertBeforeMe","append","setText","setValue","decodeHtml","html","mapObj","<",">","matched","run","$templateCache","put","$animate","origEnabled","enabled","elem","apply","animationClassNameFilter","test","classNames","provider","$get","url","templateUrl","controller","rights","urls","dependencies","reloadOnSearch","insecure","organizationRolesDenied","ReactBridge","mountComponent","mountPage","settingFeature","licensedFeature","data","$modalInstance","modalParams","vendorDependencies","angularDragula","appDependencies","app","constant","AUTHENTICATION_TOKEN","ACCEPT","ACCEPT_LANGUAGE","CONTENT_TYPE","CURSOR","ETAG","IF_NONE_MATCH","ERROR","ITEM_CURSOR","ITEMS_FOUND","ITEMS_MAX","LOGGING_IN","LOGGED_IN","MESSAGE_CURSOR","SSO_POST","SSO_REDIRECT","SYNC_MANAGER","OK","SEE_OTHER","NOT_MODIFIED","BAD_REQUEST","UNAUTHORIZED","PAYMENT_REQUIRED","FORBIDDEN","NOT_FOUND","CONFLICT","PRECONDITION_FAILED","DATA_MODEL_INVALID","RETRY_LATER","UNSPECIFIED","NONE","SEARCH_QUERY_INVALID","SEARCH_QUERY_TOO_LONG","BULK_SEARCH_STILL_ACTIVE","ADDITIONAL_USERS","ADDITIONAL_ITEMS","DATA_MODELS","FEATURES","CODELIST_TYPES","SUPPORTED_TYPES","login_logo_src","login_logo_alternative_src","login_logo_name","login_logo_bc_src","login_logo_bc_name","login_logo_bc_url","copyright_bc_name","copyright_bc_url","navbar_logo_href","navbar_logo_src","navbar_logo_name","config","$animateProvider","$compileProvider","$controllerProvider","$filterProvider","$httpProvider","$locationProvider","$provide","$routeProvider","$translateProvider","datepickerConfig","datepickerPopupConfig","growlProvider","HttpHeader","HttpStatus","HttpTimeout","RoutesProvider","register","directive","factory","service","classNameFilter","globalTimeToLive","success","warning","globalDisableCountDown","globalPosition","globalReversedOrder","authFunction","$http","neededRights","callback","userDetails","hasDeniedOrganizationRoles","user","$broadcast","hasRights","isLoggedIn","registerRoute","route","authorizeFunction","routeConfig","isUndefined","inputTemplatesRegistered","requirejs","undef","waitSeconds","define","jQuery","console","log","authorize","feature","hasLicensedFeature","hasSettingFeature","when","routes","otherwise","redirectTo","html5Mode","$cookies","$location","growl","AppConstants","request","timeout","loggingIn","headers","language","handleSSOResponse","status","loggingOut","path","startsWith","deeplink","details","exceedances","exceedance","ttl","attr","defaults","common","interceptors","useLegacyPromiseExtensions","useApplyAsync","startingDay","datepickerPopup","showButtonBar","decorator","$delegate","$timeout","_link","link","compile","scope","attrs","bind","evt","target","tagName","isOpen","close","event","relatedTarget","className","_keydown","keydown","which","shiftKey","classList","preventDefault","stopPropagation","$modalStack","ChannelService","$dialogs","$document","addClass","windowClass","size","animate","querySelectorAll","focus","originalDebug","__DEBUG_LOGS_ENABLED","$route","original","displayUrl","lastRoute","cancelListener","current","$on","keyCode","editor","disabled","readOnly","errorLogService","exception","cause","toString","ds","organizationId","deepstream","EVENT","MAX_RECONNECTION_ATTEMPTS_REACHED","CONNECTION_STATE_CHANGED","CONNECTION_STATE","OPEN","connect","settings","token","off","DeepstreamClient","on","topic","connectionState","reconnectionAttempts","login","disconnect","isConnected","getConnectionState","emit","identifier","eventData","eventName","EVENTS_PREFIX","subscribe","subscribeCallback","unsubscribe","DEFAULT_LANGUAGE","DEFAULT_LOCALE","DEFAULT_SUPPORTED_LANGUAGES","translated","LANGUAGE_KEY","$windowProvider","TranslationConfig","tmhDynamicLocaleProvider","useLoader","useSanitizeValueStrategy","addInterpolation","uniformLanguageTag","preferredLanguage","determinePreferredLanguage","storedLanguage","resolveClientLocale","localeLocationPattern","defaultLocale","OpenETagLoader","TranslationResource","storage","languageKey","KEY_TRANSLATION_TAG","translationsTagKey","translationLoader","setTranslations","tag","loader","removableKeys","keyIndex","hasOwnProperty","match","removableKeyIndex","clearAllByStoreNameAsync","translations","requestedLanguage","loadedLanguage","languageCode","setTranslationsAsLoaded","restoreTranslations","errorTranslations","errorReason","getTagFunctionAsync","getDataFunctionAsync","storeName","loadDataByResource","tmhDynamicLocale","translationsCache","translationsLoaded","setLanguage","lookupLanguages","lookupLanguage","defaultLanguage","country","variant","setLocale","locale","localeParts","getLocaleParts","defaultCountry","set","toLower","defaultSplit","getTranslationFromObject","defaultValueFn","translationMap","getDefaultAttributeLabel","translateValue","getDefaultAttributeDescription","defaultDescription","description","getDefaultOptionValue","findEntry","getDefaultOptionIcon","_translateOption","propertyPrefix","optionKey","optionParam","translateOption","defaultValue","entry","supportedLanguages","refreshSupportedLocales","checkTranslationsLoaded","refreshTranslations","refresh","changeLanguage","reload","onReady","use","usedLanguage","errorLocale","alternativeLocale","interpolateParams","interpolationType","prefix","translateAttribute","translateAttributeDescription","translateAllCategories","translatedLabel","translateCategory","translateHierarchy","hierarchy","translateAllSections","translateSection","translateWebApp","webApp","getTranslatedOptions","translatedOptions","translatePhysical","translateOptionIcon","translateAttributeValidations","validations","validation","translateAttributeValidation","translatedMessage","translateValidationMessage","translateValidationLabel","translateMappingFunction","mappingFunctionName","translateMappingFunctionDescription","translateMappingFunctionParam","parameter","parameterName","translateMappingFunctionParamDescription","translatePlaceholder","translateError","validationKey","validationName","slice","attributeLabel","toUpper","validationMessage","attName","prefixKey","translation","msgId","msg_id","message","err_field","isNumber","err_row","errorIndex","memAtt","$scope","$injector","$sce","MonitoringResource","NewsResource","TaskListsResource","TaskResource","showTask","showNews","showActivities","showAll","activityList","loadingActivities","news","body","maxLength","placeholder","charactersRemaining","currentTime","taskLoaded","activityStreamTime","setHours","notificationsLastRead","newsLoaded","activitiesLoaded","createTaskActivity","task","dueDate","template","imageUrl","userHasImage","author","getUserImageUrl","class","createdAt","createDate","getUserName","title","id","trustAsHtml","notes","assignedDate","formatDateToSimpleString","createMonitoringActivity","timestamp","receivedDate","addActivity","activity","newActivities","newNotifications","loadMonitoringItems","checkIfAllActivitiesLoaded","compareByCreatedDate","b","retrieveUnseenActivities","array","unseenCounter","getTemplates","initActivities","TASK_ASSIGNED_EVENT","assignee","NEWS_STREAM_CHANGED_EVENT","retrieveAllActivities","taskId","tasks","taskStatus","postNews","save","$watchCollection","sort","toggleTask","toggleNews","toggleActivities","toggleShowAll","showClass","activity_class","RevalidateItemsResource","RecalculateStatisticsResource","CurrentOperationsResource","ReindexItemsResource","ExportItemResource","OPERATION_KEYS","recalculate","currentOperations","operationIsInProgress","getCurrentOperation","textsOnly","$watch","startOperation","operationName","force","errorResponse","operationLabel","operationKey","operation","updatedAt","lastUpdatedAt","msg","confirm","onlyDirty","reindex","deleteOldUnfinishedExports","presentDate","reqDateVal","getHours","toISOString","delete","before","Modernizr","$anchorScroll","$filter","$interval","$modal","$parse","rowSorter","AdditionalCategoryService","CodelistRessource","ContactsResource","DefaultUiConfig","ErrorCode","EtagLoader","InputTemplatesService","MultiDimensionalAttributeService","ReferenceAttributesService","OrganizationService","SystemSettingsResource","TourService","uiGridConstants","UrlRetrievalService","UserDataModelResource","UserPreferencesResource","UsersGroupService","UsersService","WatchlistService","UpsellingAdsService","CheckURLRessource","FilePreviewService","version","cssLoaded","defaultUiConfig","getSiteUrl","isCustomSite","matchingDomain","laxHostnamePrefix","hostname","__laxHostname__","__laxDomains__","domain","CUSTOM_SITE_DESIGN","customUiConfig","loadCustomUiConfig","overrideDesign","addCustomCss","customCssPath","design","use_default_design","designPath","disableSignUpBtn","disable_signup","systemSettings","NEW_ORGANIZATION_DEFAULT_DESIGN","setDesign","setCustomCss","favIconElement","appleTouchIcon","titleElement","fav_icon","href","page_title","innerText","disable_tours","disableTours","support_email","customSiteSupportEmail","terms_of_service","customSiteTermsOfService","terms_of_service_text","customSiteTermsOfServiceText","additional_user_settings_menu_entries","additionalUserSettingsMenuEntries","support_widget","supportWidget","loadDefaultSiteUiConfig","node","setAttribute","getElementsByTagName","appendChild","onload","$digest","unsetCustomCss","linkNode","getElementById","parentNode","removeChild","uiConfig","customValue","uiConfigUrl","systemSetting","getTermsOfServiceUrl","TERMS_AND_CONDITIONS_URL","getLoginTermsOfServiceText","languageText","customSiteText","initializeSettings","ads","eligibleAds","getEligibleAds","upsellingAd","pickRandomAd","currentDesign","statusText","origin","URL","singleSignOn","ssoRedirect","ssoPost","ssoRedirectURI","ssoPostParams","open","opened","write","formHtml","referencedItems","bulkSearchLoading","bulkSearchStillRunning","bulkSearch","escapeSearchTerm","term","getErrorCode","getErrorMessage","defaultMessage","errorParams","errorMessage","getErrorParameter","getOptions","attributeDefinition","modelString","editable","addRemoveButton","removeButton","columnDefs","NO_EDIT_TEMPLATES_RENDERERS","READONLY_COMPOSITE_ATTRIBUTES","cellEditableConditionFn","triggerEvent","col","colDef","rendererType","getAttributeRenderer","ofRendererWithNoEditTemplate","readonlyByAttributeStates","grid","appScope","isAttributeReadonly","readonlyByCompositeAttribute","transientAttributes","getTransientAttributes","columnDef","memberAttribute","field","headerTooltip","cellEditableCondition","width","minWidth","assign","getColumnSortingOptions","generateCellEditors","extendColumnDefinition","generateCellHeader","cellTemplate","generateActionsColumnDefinition","displayName","cellClass","enableCellEdit","pinnedRight","enableHiding","enableHighlighting","enableColumnResize","enableColumnMenus","enableRowHeaderSelection","enableGridMenu","multiSelect","rowHeight","enableHorizontalScrollbar","enableVerticalScrollbar","onRegisterApi","gridApi","core","rowsRendered","rowValidationErrors","rows","row","isInvalid","validateMultiDimensionalEntry","errors","$emit","attributeErrors","uniq","defaultSorters","Integer","sortNumberStr","Float","Boolean","sortBool","sortDate","DateTime","rendererParams","renderer","customRenderer","baseClass","hasOrganizationRole","role","organizationData","getOrganizationSnapshot","organizationRole","normalizeToNil","isDate","getTime","normalizeToNilObject","equalCustomizer","value1","value2","isEqual","toNumber","isDataModelComplete","indexOfMemberAttribute","parentAttribute","sortingFunction","sortingOptions","uiCollectionSorter","attributeSortingOptions","sortingAlgorithm","getService","priority","sortPriority","direction","initialDirection","ASC","sortDirectionCycle","suppressRemoveSort","rowA","rowB","entity","sorter","columnDefinition","isKeyAttribute","headerCellClass","rowRenderIndex","colRenderIndex","deleted__","additionalButtons","prepareAttribute","cellId","format","emptyDefault","readonly","editableCellTemplate","getOptionsPromise","cellFilter","getDateFormat","gridScope","getItemInContext","filterOptions","uiShowLength","isRowEditable","hasItemPermission","isGridAttributeHidden","attributeStates","attributeStates__","isGridAttributeReadOnly","readonlyAttributes__","action","showVal","scrollTo","old","hash","getFirstFilteredDimensionKey","filteredDimensions","getFilteredDimensions","firstDimension","head","setInputRenderer","getItemGridData","model","doFilter","modelValue","primaryKey__","filterCollection","gridItem","hasRole","roles","initOrganization","getOrganization","initUsers","getUsers","users","hasRight","licensedFeatures","destroyAllNotifications","growlDOMContainer","growlMessages","destroyAllMessages","activityStreamVisible","onunload","initWhenLoggedIn","registerMultiple","BROADCAST_MESSAGE","BULK_SEARCH_CHANGED_EVENT","DATA_MODEL_ACTIVATEABLE_EVENT","DATA_MODEL_CHANGED_EVENT","DATA_MODEL_INVALID_EVENT","DATA_MODEL_TEMPLATE_INVALID_EVENT","EXPORT_SUMMARY_CHANGED_EVENT","FINISHED_VIRUS_SCAN_ON_ASSET","IMPORT_SUMMARY_CHANGED_EVENT","MASS_UPDATE_SUMMARY_CHANGED_EVENT","VALIDATION_FINISHED_EVENT","VALIDATION_TASK_CHANGED_EVENT","USERGROUPS_CHANGED","loadDataModel","CHAT_EVENT","isFavorite","tags__","customService","forOwn","invoke","v","isEqualWith","empty","resetDataModel","communicationPlans","compiledTemplates","isDataModelLoaded","isDataModelLoading","isUserDataModelLoaded","reloadDataModel","dataModelLoader","setDataModel","storeData","createDataModel","clearDataModel","restoreDataModel","errorDataModel","removeData","errorStatus","errorText","plans","plan","prepareCommunicationPlan","planCategory","publicationCategory","unpublicationCategory","subscriptionCategory","categoryType","prepareAttributes","loadUserDataModel","signalDataModelLoaded","loadTemplates","getPreparedCommunicationPlans","planAttributes","userDataModelLoader","setUserDataModel","restoreUserDataModel","errorUserDataModel","userDataModelHash","userDataModelMap","clearUserDataModel","userAccount","bulkSearchOrSubscriptionEntry","validationTask","validationStatus","hopscotch","getCurrTour","modal","getTop","modalScope","currentLayout","itemModified","hasItemModified","notify","uploaderHasFiles","shouldReload","setTimeout","creationUser","digitalAssetPath","variables","referenceId","virusStatus","filePath","NEAR_ITEM_LIMIT_EVENT","usage","limit","reloadUsersAndGroups","account","includeRoles","excludeRoles","effectiveRoles","includeSelf","severity","timeToLive","updatedBy","finished","identification","itemCount","validatedItemsCount","ZIP_BOMB_DETECTED_EVENT","reloadAfterDataModelUpdate","queryCategories","leaf","queryParams","q","res","cleanupItem","tmpItem","changedValues","multiRefAttributes","allGroups","groupMembers","groupHasMultiRef","newMultiRefValues","multiRefValues","multiRefValue","newMultiRefValue","member","groupModels","modelEval","reverse","pop","cleanedItem","extend","stringifyDeepValues","modifiedItem","pickBy","key1","join","contactsLoaded","getContactName","contact","contactsMap","mailTo","email","invitedBuyerTemplates","tpl/sidebar.tpl.html","invitedSupplierTemplates","tourClose","tour","tourName","closeWithoutConfirm","setTourCompleted","getRoleSpecificTemplate","getUserSalutation","firstName","lastName","part","getUser","userIdLowerCase","normalizedUserId","getCurrentLayout","$apply","registerHelper","selector","currTour","currStepNum","getCurrStepNum","wait","cancel","startTour","click","listen","stepNum","step","steps","loadTours","tours","completed","completedTours","startAlways","startAutomatically","tourId","translationKey","content","onClose","onEnd","skipIfNoElement","TIME","matchesOption","translatedOption","createNewOption","isNew","calloutLogic","defaultConfig","calloutMgr","getCalloutManager","removeAllCallouts","createCallout","diffCount","diff","Math","floor","count","parseValue","datepickerOpened","toggleDatepicker","oldState","isDatepickerOpen","clear","forceReloadDynamicEnum","translatedDescription","dynamicValuesUrl","values","isCodelistAttribute","codelist","getPairs","dataModelGatheringKey","translatedOptionIcon","translatedOptionIconUrl","formatAttributeValue","filterAttributeParams","uiParamsFilter","modifiedParams","loadingDynamicValues","optionsFilter","uiOptionsFilter","uiCodelistFilter","skipValuesValidation","currentValue","modified","filteredOptions","clone","attributeScope","getCollectionEntryInContext","loadContextFilteredOptionsIntoScopeAsync","searchValue","addEmptyOption","collectionEntry","loadFilteredOptionsIntoScopeAsync","getContextFilteredOptions","getFilteredOptions","matchValue","newOption","unshift","val","every","opt","pos","splice","foundOption","isNewOption","setGridAdditionalCategory","keyVariable","valueVariable","formattedLabel","loadAdditionalCategory","loadOptionsIntoScope","keyValueObjects","getValuesFormat","defaultFormat","valuesFormat","getFilter","getServiceFunction","functionName","callService","Array","prototype","call","collection","uiCollectionFilter","filteredCollection","callout","placement","calloutWithId","statusLabels","ACCEPTED","BLOCKED","DEFERRED","DELIVERED","ENDED","ESTABLISHED","EVALUATING","EXCEPTION","EXPORTING","FAILED","FATAL","FINISHED","IGNORED","IMPORTED","IMPORTING","INACTIVE","INVITED","PENDING","PENDING_PROCESSING","PROCESSED","PROCESSING","RECEIVED","REJECTED","REVIEWED","RUNNING","SENDING","STARTED","SUCCESS","UNEXPECTED_DELAY","WARNING","restoreGridState","defaultGridState","isGridStateRestoring","moveColumns","orderCache","saveState","restore","toGridState","columns","filters","pinned","pinnedLeft","visible","defaultVisible","getStatusLabel","hasWatchlistItems","getWatchlistItemCount","setSectionAttributeParam","getItemTitle","layoutOptions","itemTitleFilter","getStringLengthMessage","expected","maxValue","isDefaultValueForAttribute","newValue","oldValue","isDefault","removedEmptyKeysObject","omitBy","splitStringByOuterParentheses","str","strArr","without","tagTransform","newTag","initGridState","preferenceKey","gridStateKey","defaultColumnDefs","colMovable","columnPositionChanged","updateGridState","colResizable","columnSizeChanged","columnVisibilityChanged","sortChanged","enableWrapping","$$listeners","addToGridMenu","resetGridState","order","localGridStates","fromJson","gridStateJson","toJson","update","isBoolean","localGridState","currentGridState","selection","getMaxGrowlMessages","dataReference","maxMessages","innerHeight","getCombinedObjectsBase64","objects","combinedString","btoa","encodeURIComponent","blockDuringDataModelDeployment","isDataModelDeploying","isValidHostname","validHostnameChars","localCacheReady","isInitialized","loadSupportWidget","n","configs","widgetId","setLabels","de","banner","contact_form","submit","confirmation","en","ALLOW_SUPPORT_WIDGET","fwSettings","widget_id","FreshworksWidget","prefillTicketForm","showServiceApps","hasPermission","OBJECT_TYPE_UI","checkUrl","filePreviewError","$parentScope","$parent","filePreviewData","preview","newUrl","$routeParams","BillingResource","CurrencyService","customer","billingAddress","selectedProfile","product","validateStep","form","$invalid","executeUpgrade","payment_profile_agreement_terms","$viewValue","changePlan","currency","currentCurrency","cancelSubscription","profile","isActiveProfile","orderedProfile","uppercase","setFocus","toStepId","firstInput","setCurrency","$organization","getPlanBillingProfiles","profiles","getBillingAddress","getCurrencyKey","BulkSearchResource","queryValues","queryTooLong","setCurrentBulkSearch","bulksearchId","dismiss","startBulkSearch","date","getMonth","getFullYear","getMinutes","getSeconds","queryList","prepareQueryValues","queryAttribute","bulkSearchId","getBulkSearchAttributes","attributeSelected","queryValuesOnPaste","textSelectionEnd","pre","post","modifiedData","clipboardData","originalEvent","pastedData","getData","textSelectionStart","selectionStart","selectionEnd","words","AdditionalLicenseType","UsageLimitsResource","additionalLicenseProfiles","orderedPlanProfile","selected","limits","USERS","getMonthlyPrice","monthlyPrice","monthlyPriceMultiplier","mapValues","getYearlyPrice","addAdditionalLicense","additionalLicense","stepId","getOrderedPlanProfile","getAdditionalLicenseProfiles","licenseType","$controller","SessionDataService","ItemResource","page","loadingItems","selectedItem","items","currentLayoutAttributes","LOCAL_STORAGE_SHOW_PREVIEW_KEY","previewLayout","previewCoverImageAttributeName","previewLayoutAttributes","showItemPreview","allItemsSelected","shouldPreview","initCatalogGrid","createCatalogTableColumnDefinition","gridOptions","infiniteScrollDown","rowTemplate","infiniteScroll","needLoadMoreData","loadMore","renderingComplete","clearSelectedRows","rowSelectionChanged","isSelected","addWatchlistItem","removeWatchlistItem","rowSelectionChangedBatch","onlineCatalogState","cursor","numberFound","maxNumberFound","searchFinished","fetchItems","enableShoppingCart","tableLayoutFields","previewLayoutFields","fields","union","doFetchItems","refreshTags","compareItems","primaryKeys","itemsRequests","primaryKey","itemResult","all","dialog","mountDialog","rootScope","unmount","onItemRowClick","coverImage","getItemCoverImage","imageAttribute","image","imageAlternativeText","src","alt","showOrHideItemPreview","notifyDataChange","dataChange","ALL","generateControlColumns","catalogAttributes","resizable","enableCellSelection","allowCellFocus","enableColumnResizing","enableSorting","redirectToItemDetail","setOnlineCatalogState","withPublicationTaskChecksums","checksum__","hasSelectedItems","selectAllVisibleRows","clearWatchlist","selectionId","newBulkSearch","backdrop","showLastBulkSearch","tags","getWatchlistPrimaryKeys","selectRow","allVisibleItemsSelected","selectAllRows","COLUMN","preview_image_attribute","generateUsersAsHTML","connectedUserIds","escape","connectedUsersAsHTML","newMessages","otherUsersLoggedIn","chatWindow","currentText","messages","getRegistered","sendChatMessage","text","broadcast","toggleChatWindow","hideOnlineUsersTooltip","SUBSCRIBE_TYPE","LISTEN_TYPE","REGISTERED_ACTION","addToSet","UNREGISTERED_ACTION","removeFromSet","showOnlineUsersTooltip","calloutConfig","fixedElement","yOffset","style","cssText","InfiniteScrollHelper","QueryCodelistResource","uiGridEditConstants","CODELIST_KEY","showAddInput","valueCellEditableCondition","cell","cellNav","getFocusedCell","rowEdit","creating","editing","activateInitialMap","getAllCodelists","codelistData","activeCodelistKey","activeCodelistId","storedActiveMap","existingActiveMap","selectCodelistMap","editingRow","state","createCodelistKey","create","sortBy","errorData","cellTooltip","enableCellEditOnFocus","lan","toUpperCase","infiniteScrollUp","refreshData","searchTerm","entriesCopy","scrollHelper","addToGridOptions","edit","beginCellEdit","oldLocaleLabels","localeLabels","oldDefaultLabel","defaultLabel","gridHeight","boxContentPadding","contentPadding","offset","newHeight","w","footer","boxContent","css","top","height","checkUnsavedChanges","activeKey","saveEntry","createEntry","deleteCodelist","$event","deleteEntry","codes","deleteEntries","codelistId","deleteSelectedEntries","selectedEntries","getSelectedRows","l","scrollToFocus","$$hashKey","events","CANCEL_CELL_EDIT","deffered","END_CELL_EDIT","newRow","next","absUrl","newCell","CommunicationChannelResource","CommunicationChannelSubDestinationsAndBlockedReviewersResource","CommunicationChannelTypesResource","CommunicationChannelTemplatesResource","PublicationResource","RepublishResource","SECRET_PLACEHOLDER","setPlans","organizationLoaded","toJSON","channelsVerification","channelTypes","loadAllChannels","MESSAGING_ASSET_CHANGED_EVENT","unregister","channelId","messagingAsset","updateMessageCounter","getPlan","channel","getPlanLabel","supportsInbound","supportsOutbound","hasCreatePermission","hasChannelPermission","hasActivatePermission","hasEditPermission","hasEditSubDestinationPermission","hasDeletePermission","channelsSupportingBlockedReviewers","templates","editChannelOpts","types","uploadMessages","formData","fd","autoUpload","reset","uploadComplete","channels","hasChannels","isChannelsLoading","orderPredicate","numberOfPendingIncomingMessages","countMessagingAssetsCreatedAfter","needsVerification","supportsBlockedReviewers","blockedReviewerLabel","blockedReviewerKey","blockedReviewers","subDestinations","loadedChannel","newChannel","ok","selectedTemplate","selectTemplate","t","saveChannel","editChannel","apiToken","hasApiToken","password","hasPassword","privateKey","hasPrivateKey","resetCountKeyDate","resetcountkeydate","clearConnectionError","deleteChannel","deactivateChannel","toggleChannelActivation","active","activateChannel","hasConnectionError","activate","deactivate","uploadInboundMessages","uploadOutboundMessages","toggleShowPublicationMessages","showDetails","canSubscribe","getSubscriptionCategory","getSubscriptionAttributes","subscriptionAttributes","showMessagingDetails","showErrorDetailDialog","errorTitle","errorHeader","getConnectionError","heading","showErrorTooltip","calloutEle","addEventListener","hideErrorTooltip","shouldRemoveTooltip","hideTooltip","elementClass","mouseout","newSubscription","checkCombination","hasCombinationError","actions","planActions","focusOn","planValues","plansArray","directionOptions","channelDirections","AS2","default","configurable","BSYNCED","CUSTOM","HTTPS","SFTP","SMTP","WEBSERVICE","chosenType","encryptAlgorithms","signAlgorithms","bsyncedServers","BSYNCED_SERVERS","yesNoOptions","p","additionalPlan","chooseType","clearValue","inputId","hasPlanAttributes","planName","getPlanAttributes","supportsSubDestinations","subDestinationsColumnDefs","enableColumnMenu","subDestinationsGrid","enableRowSelection","minRowsToShow","addSubDestination","subDestinationKey","subDestinationLabel","deleteSubDestination","blockedReviewersColumnDefs","blockedReviewersGrid","addBlockedReviewer","deleteBlockedReviewer","MessagingResponsesResource","getAssetContent","method","prettifyXml","sourceXml","xsltProcessor","xmlDoc","DOMParser","parseFromString","xsltDoc","XSLTProcessor","importStylesheet","resultDoc","transformToDocument","XMLSerializer","serializeToString","messageContent","responseId","messagingAssetId","messagingResponse","messagingResponseContent","responseMessageId","AdditionalCategoryAttributeService","PhysicalAttributeService","loadAdditionalSectionAttributes","rowLength","isComplexType","inputWidth","labelWidth","isAttributeAlreadyAdded","added","TEMPLATE_DIMENSIONAL","TEMPLATE_IMAGE","TEMPLATE_TABLE","TEMPLATE_TEXT","first","second","collections","showDifferencesOnly","showFilledOnly","loading","itemsWithDifferingCategories","getInputTemplate","rendererData","onlyDefinedCategoryAttributes","onlyDifferences","isNotEqual","onlyFilled","stringValues","attributeToString","comparedItem","units","formatValue","k","shift","prepareAttributeTemplates","comparisonTemplate","prepareTableAttribute","firstItemEntriesLength","secondItemEntriesLength","max","firstItemEntry","secondItemEntry","has_attr","itemSections","sectionsA","sectionsB","sectionIndex","secA","secB","rowIndex","attrIndex","attrA","attrB","isDiffFiltering","firstItem","secondItem","reduce","keyObject","firstValue","secondValue","firstItemAttribute","secondItemAttribute","isFilledOnly","header","notification","no","yes","ConfirmResource","opaque","confirmedSuccessfully","errorInConfirmation","CommunityResource","ContactsResourceByCursor","MultiMap","OrganizationsResource","TabContainer","loadCommunities","communities","community","currentCommunity","onTabActivate","tab","currentSubUrl","suburl","reloadContacts","organizations","communityId","searchOrganizations","searchQuery","$$route","chooseCommunity","keyword","organizationsResponse","ExecuteInvitation","invitation","invitationType","invite","invitationResponse","loadMoreContacts","scrollY","offsetHeight","loadContacts","inviteByEmail","contacts","groupedContacts","loadingContacts","hasNextPage","regex","searchKeyword","reloadAllContacts","pageSize","createCursorAwareResource","keywords","matches","sortby","multiMap","firstLetter","deleted","keySet","letter","keyBy","debouncedSearch","debounce","searchContacts","hasCreatePermisson","OBJECT_TYPE_CONTACT","hasEditPermisson","_contact","contactRole","customValues","hasContactPermission","hasDeletePermisson","hasLoginPermission","createContact","deleteContact","deletionResponse","parameters","canLoginAsManagingUser","communityManager","legacyAccount","loginAsManagingUser","organizationName","existingPublicationsMap","loadExistingPublication","recipientId","recipient","toggleShowDetails","editContact","organizationImageUrl","hasCommunityPanel","isVisible","openSubview","InviteByEmailResource","invitationTypes","customAttributes","saveInvitation","invitationId","saveContactRequest","contactRequest","contactData","contactRequestResponse","attachment","filesSelected","fileUploadSettings","showInlinepreviewInDropzone","editorOptions","basic","removePlugins","toolbar","setAssignee","saveTask","pathParams","comment","hasAttachment","newTask","assets","saveComment","uploadFileForItem","asset","substr","contentType","commentId","getComments","comments","taskLists","taskListId","UserResource","invitedEmailAddress","invitationEmail","restrictionFilter","restrictionQuery","newAccount","allRoles","RolesService","getAllRoles","ValidationsOverviewFactory","WarningsOverviewFactory","RubyOutputDashletFactory","LatestItemsDashletFactory","DashletRegistry","CustomDashletRegistry","CategoriesOverviewFactory","CategoriesListFactory","DashboardResource","DocumentationDashletFactory","NewsDashletFactory","ComplianceStatisticsFactory","DashboardService","MyTasksFactory","PublicationsByDestinationsFactory","ReviewErrorsOverviewFactory","ReviewsFactory","ReviewWarningsOverviewFactory","initDashlets","hasSettingsChanged","load","dataModelType","dataAttrName","statisticName","settingsModalOptions","selectedUrl","selectedIndex","localOnly","defaultDashlets","getDefaultDashlets","addToDefaultDashlets","dashboardOptions","dashlets","hasChanges","storageId","widgets","getDashlets","widget","widgetDefinition","addWidget","setDashboardOptions","customStorage","updatedWidgets","dashboardConfigurationsMigrated","saveDashboardConfig","widgetButtons","hideToolbar","widgetDefinitions","defaultWidgets","hideWidgetName","dashboardConfiguration","dashboardMigration","localStorageDashboardConfig","parsedLocalStorageDashboardConfig","widgetsFromServer","loadWidgets","dashboardConfig","openModels","mode","manageDashboardsModels","openDashboardSettings","loadSettings","customSettings","getSettings","resetDashboard","getUrlIndexByTitle","updateUrl","getNewsOptions","tempOptions","getWidgetCount","widgetName","widgetScope","countBy","true","saveSettings","UseDatamodelResource","DataModelTemplateResource","FeatureToggleService","arrangeDataModels","idx","activeDatamodel","dataModels","dm","dataModelVersion","dataModelName","owner","dataModelOwnerId","dummyInfo","dataModelLabels","ownerEmail","ownerName","activateable","o","langKey","dataModelDeployedAt","dataModelDeployedBy","htmlId","loadDataModels","dataModelClass","defaultDataModels","checkFeatureEnabled","isSystemDataModel","each","datamodel","downloadFormat","modelName","manageDataModels","systemDataModels","templatename","DataModelCustomizationConstants","ResetDataModelResource","UploadCustomDataModelResource","attributeMap","extractNames","getOrCreateLayout","layoutId","customizedDatamodelDiff","getOrCreateSection","sectionId","getOrCreateCategory","modelCategory","categoryList","getRootNodesScope","addAttributeSortOrder","orderedList","foundSection","newSection","removeSection","addAttributeToSection","entryFound","removeCategory","addAttributeToCategory","attributeList","attrib","has_category","completeAttributeList","layoutList","layoutsMap","layoutKey","model_defined","selectedLayout","selectLayout","isFiltered","toggleAlreadyAssigned","accept","sourceNode","destNodes","destIndex","sourceData","$modelValue","destData","destType","$element","isParent","dropped","nodeScope","sourceNodeType","nodesScope","dest","$nodeScope","sectionOrCategory","$treeScope","toggle","collapseAll","treeId","expandAll","addAttribute","createNewAttribute","camelCase","newListAttribute","type_name","editAttribute","updateAttribute","newAttribute","updateAttributeInSection","removeAttribute","indexOfAddElement","categoryId","addSection","createNewSection","sectionLabel","snakeCase","$nodesScope","updateSection","isNull","addCategory","createNewCategory","upperFirst","updateCategory","newCategory","updateAttributeInCategory","saveCustomizedDatamodel","customizedDatamodel","resetDatamodel","isEdit","codelistTypes","codelists","openEditor","levelRestrictions","levelLimit","0","1","jsonEditorData","json","editMode","parentImagetoggle","hideContactIcon","contactOrganization","managedContact","cropImage","toggleContactIcon","uploadId","JobResource","ItemsSearchFilterResource","ExportFormatsResource","SelectionResource","job","schedule","startDateTime","recipients","emailRecipients","mapping","repeatEvery","repeat","repeatType","repeatHour","repeatMinute","itemsQuery","report","planOptions","onBeforeStepChange","onAfterStepChange","updateItemsQuery","assignInWith","dstValue","srcValue","addRecipient","sendTo","editRecipient","deleteRecipient","confirmCreateReport","reportConfig","itemSelection","includeExportMappings","mappingProfiles","jobs","subscriptionDescription","ItemChangesQueueManager","ValidateItemService","subscriptions","subscriptionValidations","queueManager","createQueue","subscriptionChanges","previousSubscriptions","validateItems","subscription","currentSubscription","validation__","allValidationKeys","previousSubscription","validateItem","val_keys","start","defineGridValidationMethods","createSubscriptionTableColumnDefinition","nameColumn","showSelectionCheckbox","selectWithCheckboxOnly","rowEntity","editedPrimaryKey","addRow","channelId__","removeRow","getQueue","hasQueuedItemChanges","stop","loadComments","canEdit","closeTask","transitions","chosenTransition","updateTask","reopenTask","taskOptions","transition","tagsCopy","cancelFields","uploadAttachments","removeAttachement","getTransitionText","enableReopenTask","taskLoadingFinished","UsersResource","selectedGroups","updateEffectiveRoles","allroles","flattenDeep","updateUser","request_payload","groupIds","accountId","payload","group","showItems","showEditor","getBrowseLink","openBrowseLink","keyboard","itemPrimaryKey","showItemPrimaryKey","AssetFoldersService","CommunicationChannelService","DefaultItemResource","GroupAttributeService","SupplierReviewResource","TEMP_ITEM","TEMP_TASK","CUSTOM_ITEM_SERVICE","VALIDATION_STATUS_IS_DIRTY","VALIDATION_STATUS_IS_COMPLIANT","VALIDATION_STATUS_IS_NOT_COMPLIANT","GRID_STATE_KEY_PREFIX","displayEditor","onShowSettings","enableAudit","showCategorySection","additionalModalOpen","originalItem","validationErrorsCount","validationWarningsCount","searchableSubAttributes","isItemEditable","groupIndexes","connectedAccounts","itemHierarchies","itemHierarchyStatus","localValidations","vm","desiredAuditStatus","isOldEditorOn","saveEditorState","taskFromSession","closeOtherPanels","sectionToFocus","attributeToFocus","isCopiedItem","isNewItem","isInitialValidationFinished","editorState","initializeScope","disableDeleteConfirmation","toggleCloseOtherPanels","getDataModelAttributes","toggleDisableDeleteConfirmation","temporaryModelForTypeahead","temporaryWarningsForTypeahead","addToReferenceList","reference","getModelEval","parsedModelString","parseModelString","gridOptionsMap","isShowUnderGroup","addSingleReference","referencedItem","loadAndFormatItemAsync","checkModelAndEval","startCalloutDelay","calloutWaitingPromise","stopCalloutDelay","loadSingleItemForReference","referencedItemPrimaryKey","loadItemsForReference","isReadonly","extendReferencedItemsAsync","gridApiMap","findItems","keywordQuery","loadAndFormatItemsToBeReferencedAsync","ev","dialogName","dialogDefinition","definition","infoTab","getContents","onShow","getDialog","getContentElement","opts","getParentEditor","setup","commit","setData","getValue","allowedContent","showPreview","resolveItemPlaceHolders","property","$eval","messageTimeout","remoteEditedAttributes","removeAfterTimeout","storeItemChanges","storeItemQueue","queuedItemChanges","getQueuedItemChanges","setConnectedAccounts","setSections","labelClass","inputClass","scopeIndex","currentSection","scopeSection","initAttributesForSearch","currentAttribute","setCategories","selectedCategoryName","callCategorySelected","categorySelected","hasEditItemRights","executeSave","itemToSave","isUnique","checkItemModified","unique","saving","executeCloseEditor","unbind","forceCloseTask","checkAttributeEditedRemote","unFilteredItem","validationResults","userName","ITEM_CHANGED_EVENT","closing","typeOfChange","ITEM_EDITED_EVENT","stopQueue","startTransmitItemChangesQueue","currentItemMessage","getValidationResult","calculations","calculatedAttributeValue","setValidationStatus","continueProcessor","hasAttributeState","stateName","states","isAttributeHidden","isAttributeVisible","subAttributes","isAllAttributesHidden","forceRecalc","subAttribute","getAttributeSearchList","updateHiddenForSearchAttributes","queryAdditionalCategories","updateAdditionalCategoryAttributes","lastSelectedCategory","pauseProcessor","saveItemForTask","saveItem","saveWithoutClose","stopItemChangesQueues","startItemChangesQueues","audited__","audit","attributeLabels","getAttributeLabelsForLocalValidations","originalPath","closed","closeEditor","resetEditor","itemChangedEventRegistered","itemEditedEventRegistered","itemEditedEventIdentifier","loadItem","itemResourceMethod","itemResourceParams","validate","__attributeStates__","__validations__","validation_dirty__","hideCategorySection","itemEditorService","enableAuditedButton","itemLoaded","initHierarchyTabs","levels","flatten","validationErrors","toInteger","Failure","Error","validationWarnings","Warning","undoRedoChange","popArr","pushArr","lastChange","undoChange","attrName","lastAttrChange","preprocessItemChanges","validateAttributes","undoChanges","redoChanges","undo","redo","startQueue","startWatch","cachedItem","itemChanges","removeByContent","previousItem","change","oldAttributeStates","rerenderGrid","deregisterWatchDisplayEditor","origPrimaryKey","currentTarget","activeElement","isRegistered","checkModel","elemCount","sectionLoaded","openEditorWithItem","categoryInfo","hierarchies","Map","gridCache","showGrid","initGridOptions","visibleMemberAttributes","baseOnRegisterApi","viewPortKeyDown","rowCol","htmlCell","checkbox","uiGridCell","renderContainers","visibleRowCache","visibleColumnCache","children","select","trigger","getGridData","getShowGrid","removeSort","gridState","column","addElementToTableModel","lastElement","columnDefsElement","removeSingleDimension","clearAttribute","removeAttributeValueConfirmation","cbk","maxFileSize","publicAsset","confidential","uploadUrl","getDefaultUploadUrl","noNameEncoding","useFilename","disableDragAndDrop","getPublicAssetUrlAsync","linkedPublicAsset","publicAssetUrl","privateAssetUrl","onErrorItem","errorCode","file","onFileSelected","linkedAsset","linkedAssetPath","done","getSectionValidationMessages","validationCount","validationErrorCount","validationWarningCount","validationFailures","level","hasValidations","hasOnlyValidationWarnings","attributeValidations","hasWarningsOnly","focusSection","isSectionOpen","hasSectionToFocus","hasAttributeToFocus","focusAttribute","setAttributeUrl","setSectionLoaded","removeCallouts","onShowItemReview","onShowHistory","onShowItemGrouping","onShowItemDetails","onEnterViewName","onAddView","onEditView","onShowPublicationStatus","resetHierarchyShown","toggleItemReview","getItemReviews","showItemReviews","showTaskView","reviews","enabledItemReview","isEnabledByDatamodel","enableItemReview","channel__","supplier__","showItemHistory","showPublicationStatus","loadPublications","showItemGrouping","showItemDetails","promptAndOpenNewItem","auditItem","itemPublications","getPublications","publications","publishedStatus","loadPublicationDestinations","communicationChannels","isLoading","publication","destinationId","destinationType","subDestination","communicationChannel","ch","organzation","itemPublicationsByOrg","itemPublicationsByChannel","getItemPosition","getItemCount","openNextItem","openPreviousItem","formatNavItemIndex","itemPosition","padStart","showItemHierarchy","isHierarchyShown","shouldHierarchyBeShown","currentHierarchy","currentHierarchyName","getChangedAttributeStates","newAttributeStates","changedAttributeStates","keysOldAttributeStates","keysNewAttributeStates","allKeysAttributeStates","attributesWithChangedState","allDataModelAttributes","datamodelAttribute","rerenderSpecificGrid","getCachedGridColumns","alternateMapKey","cachedGrid","getGridInstances","mapKey","mapHits","changedMemberAttribute","changedAttribute","changedGridInstances","gridInstance","changedGridColumnDefs","columnIndex","findIndex","changedColumnDef","cachedGridColumns","initItemDetailsWithinEditor","pathname","showReviewPanel","isInEditorMode","ItemHistoryResource","ItemEventHistoryResource","gridUtil","EDITOR_HISTORY_GRID_STATES_KEY","DEFAULT_GRID_STATE_KEY","EVENT_ACTOR_TYPES","USER","ORGANIZATION","COMM_CHANNEL","OTHER","historyData","mousewheel","imageElement","actorType","customRendererFn","fullName","lastLogin","commChannel","partnerAddress","planLabel","typeLabel","address","encodeAssetLink","assetLink","encodeURI","userTemplate","createTableDefinition","getItemHistory","itemHistory","attributeHistory","valueClass","isInteger","history","updatedAt__","updatedBy__","oldValue__","oldValueClass__","currentValue__","currentValueClass__","attributeElement","previousValue","senderName","additionalText","timeline","userImageUrl","itemEventHistory","assetPath","assetType","assetId","transferType","sender","planDetails","recipientName","partner","partnerName","optionId","gridStatesKey","gridMenuCustomItems","DESC","tabsConfig","ExportMappingResource","browseAttributes","groupingData","groupingAttributes","filterAttributes","getSelectedFullItems","removeGroupingAttribute","addGroupingAttribute","updateItemList","queryAttributes","queryParam","startMassUpdate","hasCategoryPermission","hasAnyActionPermission","hasAnyCreatePermission","hasAnyDeletePermission","hasAnyEditPermission","hasAnyPublishPermission","hasAnyReadPermission","depublishItems","publishItems","hasExportPermission","hasTasksPermission","hasMediaAssetExportPermission","selectedItems","namingPattern","ANY","checkItemPermission","selectedGroupItems","customPublicationService","isAllowedInvalidItem","allowInvalidItem","publicationData","filteredExportFormats","exportFormats","downloadItems","exportType","selectedKeys","getSelectedItemsKeys","usesMapping","parentscope","createExportFromSelection","exportResponse","updateItems","toWait","unmountWhenReady","showEditorAddTask","showMediaAssetExport","intersection","groupingGridOptions","rowSelectionChangedFn","hasDepublishRights","enableDepublication","returnKeyValueFormat","ItemHierarchyResource","OldItemHierarchyResource","nodeSet","CUSTOM_ITEM_HIERARCHY_SETTINGS","dataModelLayoutAttribute","h_attrs","network","itemHierarchyLayoutMapping","nodes","edges","shape","font","color","multi","borderWidth","margin","right","bottom","left","background","interaction","dragNodes","dragView","hierarchical","nodeSpacing","blockShifting","sortMethod","physics","getItemHierarchy","itemToViewHierarchy","hierarchyName","itemHierarchyResult","jsonResult","setOldHierarchyGraph","filterChildRelationValues","hierarchyGraph","includedPrimaryKeys","itemHierarchy","relations","Set","addItemHierarchyToHierarchyGraph","parentPrimaryKey","childPrimaryKeys","getItemHierarchyChildren","childPrimaryKey","relationAttribute","relationValue","childRelationValues","getItemHierarchyChildRelationValues","parentItem","childItem","rootPrimaryKey","hierarchyMap","relationValuesMap","itemObj","mapRelationToEdges","relation","edge","from","to","fetchItemsCallback","itemsByOrder","mapItemsToNodes","initGraph","itemSet","promiseChain","asyncFetchItem","itemObject","itemKey","tempCurrentItem","labelString","updateitemHierarchyLayoutMapping","attributeData","onNodeChosen","chosenItem","container","vis","Network","selectedNodeKey","getNodeAt","pointer","DOM","selectNodes","renderItemHierarchy","view","userViews","currentUserViews","resetView","disabledAttributes","currentlySelectedView","viewSelected","disabledSections","isAllAttributesDisabled","onViewSelected","loadUserViews","saveCurrentView","currentView","loadCurrentView","showSettings","createView","editView","currentlyEditedView","enterViewName","selectView","cancelView","saveView","newAttributes","disableSections","deleteView","idxCurrent","toggleSelection","disableAllAttributes","disableSection","mailToLink","SUPPORT_EMAIL","errorType","errorParameters","upgradePlan","toggleDetails","ExportMappingService","attributesList","exportAttributes","exportProfiles","privateProfiles","publicProfiles","saveFilledExportAll","saveFilledExport","showOnlySelected","allAttributesConditionFlag","getCurrentMapping","internalName","externalName","getCurrentProfile","mappings","allFieldExportFlag","activeExportProfile","getSelectedCount","activeProfile","allAttribute","privateMapping","getAttributes","dontFilter","getFilteredAttributes","unionBy","layoutAttribute","selectedFullItems","filtered","dontFilterAttrs","uniqBy","intersectionBy","updateDropdown","profilesWithOutInternal","showInternalProfile","oldProfiles","prepareCustomValues","elementScope","inputValue","enterURL","sortableOptions","handle","clearSearchQuery","toggleSelectAll","selectAll","allSelected","onProfileNameChange","editActiveExportProfile","runExport","validationResult","updateExportProfile","tmpProfile","toggleOnlySelected","getOnlySelected","isNewProfile","publicExportMapping","profileName","activateExportProfile","deleteExportProfile","fromUpdate","mappingName","notCurrentUsersMapping","selectAllForMapping","checkInput","checkUserMapping","getUploadFileForItemConfiguration","getActive","enableFeature","disableFeature","CountItemsResource","QueryItemResource","exportItems","canDepublish","queryNumber","sortOrder","arr","getSelectAllState","itemsSelected","getSelectedItems","createItemSelection","createItemRestrictions","validateItemSelection","process","noOfItems","parentScope","createExportForExportMapping","exportMapping","doDownloadItems","Content-Type","responseType","reponse","hiddenElement","createObjectURL","Blob","download","compliant","publicationTaskId","publicationTaskStates","publicationDestination","publicationStatus","errorKey","warningKey","reviewErrorKey","reviewWarningKey","reviewer","reviewStatus","bulkSubscriptionId","successFn","$$state","scrollToIfNecessary","resetScroll","dataLoaded","saveScrollPercentage","errorFn","valueCount","restrictions","pageParams","queryService","queryItemResource","countItems","countingItems","numberOfItems","InvitationResource","loadPending","pendingInvitations","getDefaultState","loadAllInvitations","emailInvitations","invitingOrganizationId","invitationState","invitationText","requestType","originalEntry__","contactRequests","acceptanceDate","orderBy","closedVisible","requestTypeFilters","isPending","isClosed","showClosed","getStatusTitle","processInvitation","updateInvitation","deleteInvitation","cancelRequest","editInvitation","editContactRequest","ReviewerReviewResource","review","itemReviewTemplate","reviewAttribute","reviewStates","translateReviewOption","sendItemReview","PublicationMode","sortItemsObserver","EDIT_ITEM_URL","ITEM_BROWSE_URL","FOCUS_ATTRIBUTE_URL","GRID_STATES_KEY","initDependingOnDatamodel","createItemTableColumnDefinition","startGridCellEditListeners","itemCellEditableCondition","getWatchlistCategories","sortable","getGridStateKey","virtualizationThreshold","enableColumnMoving","handleWindowResize","checkItemCategoryPermission","CONTEXT_DEFAULT_VALUE","watchlistCategories","removeWatchlistItems","hasToUpdate","updatedItemsinBrowseList","browseListUpdated","updateAll","resItem","startedBy","totalCount","finishedCount","validation_warnings__","publishedItems","destinations","PUBLICATION_TASK_CHANGED_EVENT","publishedItem","publicationStatus__","publicationStartedAt__","creationDate","publications__","publicationType","difference","publishedAt__","published__","updatedDate","itemSearchQueryChanged","hasAny","gridStates","rowEditItem","rowEditValidations","hasRestrictions","isRowReadable","readable","isRowReadonly","getReviewClass","reviewCountTotal__","reviewCountReceived__","reviewCountReviewed__","reviewCountApproved__","rxjs","Observable","observer","pipe","debounceTime","cols","sorting","rowEditingActive","deregisterWatchEditorParamsItems","laxGridStartCellEdit","laxGridStopCellEdit","processItemChanges","deregisterCellEditListeners","stopGridCellEditListeners","openPublicationsModal","deleteItemsBySelection","omit","setEditorParamsItems","openTaskEditor","taskObj","loadTasks","checkItemRepublication","UI_SHOW_ITEM_REPUBLISH_NEEDED_ICON","showTooltip","dataList","renderTooltipItems","inEditItemMode","inNewItemMode","FOCUS_SECTION_URL","publicationDestinations","sortKey","isOrganization","isChannel","String","isSubDestination","destination","originalScopeItem","savedItem","DEPUBLISH","PUBLISH","selectedItemEntities","deleteItem","deleteSelectedItems","reloadBrowseList","originalPrimaryKey","copyItem","itemsSelection","showItemReview","$attrs","closeItemReviewModal","showItemReviewTooltip","reviewErrors","reviewErrors__","reviewWarnings","reviewWarnings__","reviewRemarks","reviewRemarks__","remark","errorsAndWarnings","showItemValidationsTooltip","validationsErrors_","validationWarnings_","checkPublicationsDirty","checkFlag","publications_dirty__","showPublishValidationsTooltip","publicationErrors","publishedDate","publishTooltip","DateTimeHelperService","StatisticsResource","BulkSubscriptionService","filterGroups","dropdownIsOpen","activeFilters","itemsSearchFilter","invalidFilterName","onFilterView","hasRightValidateItem","hasRightBulkSubscriptions","FILTER_TYPE_CATEGORY","FILTER_TYPE_DATA_MODEL_DEFINED","FILTER_TYPE_ITEM_SELECTION","FILTER_TYPE_PUBLICATION_TASK","FILTER_TYPE_PUBLISHED_TO","FILTER_TYPE_USER_DEFINED","FILTER_TYPE_BULK_SUBSCRIPTION","LOGICAL_OPERATORS_STRING","FILTER_TYPE_TASK","FILTER_TYPE_VALIDATION_WARNINGS","FILTER_TYPE_VALIDATION_ERRORS","FILTER_TYPE_REVIEW_ERRORS","FILTER_TYPE_REVIEW_WARNINGS","FILTER_TYPE_COMPLIANT_ITEMS","FILTER_TYPE_NON_COMPLIANT_ITEMS","FILTER_TYPE_BULK_SEARCH","MAX_URL_PARAM_LENGTH","DATA_MODEL_DEFINED","USER_DEFINED","PUBLISHED_TO","TASK","VALIDATION_WARNINGS","VALIDATION_ERRORS","REVIEW_WARNINGS","REVIEW_ERRORS","COMPLIANT_ITEMS","NON_COMPLIANT_ITEMS","BULK_SEARCH","decodeItemQuery","decodeURIComponent","getSearchFilterAttributes","loadItemsSearchFilters","userFilters","dataModelFilters","warnings","translateAndSortByText","copyAndMarkFiltersByKey","compliantFilters","searchKey","isDoubleQuoted","getCurrentFilter","queryString","rules","rule","notOperator","connector","convertToTimestamp","removeActiveFilter","setActiveFilter","navigateBySameKey","urlKey","$$search","$$url","checkRouteParams","routeParams","Number","activeFilter","activeFilterName","firstPrimaryKey","secondPrimaryKey","setTaskFilter","setValidationFilter","shortenParamString","comp","RegExp","resetActiveFilters","searchFilter","bulkSubscriptions","fetchItemsForBulkSubscriptionId","searchParams","operators","loadWatchlistItems","selectAllItems","clearSelectedItems","dropDownToggled","showValidationErrors","showBulkSubscriptions","showValidationWarnings","showStatus","addFilterRule","removeFilterRule","updateQuery","transformSearchQuery","addFilterGroup","updateAttributeTemplate","rowScope","watch","newKeyword","getTitle","isPublic","prepareSearchFilterAttribute","ke","getDateFromTimestamp","isAllowedTemplate","templateName","onPaste","queryText","createFilter","showEditFilter","editFilter","regexForValues","regexForOperators","groupOperator","hasGroupNotOperator","queryParts","components","queryPart","ruleArray","op","splitted","hasNotOperator","ruleOperator","saveFilter","resetFilterEditor","deleteFilter","removeFilter","fetchItemsForPublicationDestination","filterByValidationFilter","fetchItemsByCompliant","getBulkSubscriptions","configKey","canEditConfigKey","prepareElement","show","allowedTypes","allTypes","allowedActions","allActions","r","saveJson","data_i","jsonData","data_o","getEleVal","output","elements","level_0","ob","expanded","canEditRow","canEditKey","addRestrictions","rearrangIndex","els","el","getIndexRecursive","lastEle","removeElementsFromMain","prepareOperations","hideMenuBtn","hideActions","hideTypes","insertOperation","restriction_on","level_type","level_keys_restriction","parent_level_keys_restriction","insert","prepareElements","innerElements","isParentArray","prepareNext","preparedElements","rIdx1","rIdx2","getElementValue","toggleJson","toggleRows","flag","elm","changeType","insertIdx","cidx","appendIdx","defaultValues","idx1","checkDuplicateKey","noDup","newKey","hasKeyError","isJsonInEditMode","d","editRow","KeyValueMapRessource","QueryKeyValueMapRessource","KEY_VALUE_MAP","keyValueMapsLoading","selectKeyValueMap","activeKeyValueMap","updateValue","getAllMapNames","DeleteItemsResource","layoutBlockTemplates","addBlock","tableColumns","datamodels","getOwnTemplates","uploadDatamodel","getLabel","datamodelsGridOptions","updateDatamodel","err","uploadFile","gathering","gatheringKey","deleteDatamodel","MassUpdateResource","gridResizeHeight","newData","contentHeight","headerHeight","hideHeader","headerRowHeight","footerHeight","showFooter","footerRowHeight","scrollbarHeight","enableScrollbars","getScrollbarWidth","maxNumberOfFilters","cssClass","querySelector","refreshCanvas","isDimensional","treeFilter","supportedFields","isAttributesLoading","formattedSingleReferences","selectedAttributesList","itemData","attributesEditedMap","d_v","d_k","hasIn","massUpdateOptions","estimatedNumberOfItems","runMassUpdate","categoryAttribute","chain","translatedValue","at","loadAndFormatSingleReferences","CountMessageResource","MessagingResource","QueryMessageResource","scopeVarForCreatorData","creatorId","creatorType","fetchCallback","doCount","alsoInAccurateValue","cnt","countMessage","messageCount","needsCount","countErrorMessage","countMessages","messagingStatus","createColumnDefs","SELECT","selectOptions","filterHeaderTemplate","enableFiltering","createChannelMessagesGridOptions","useExternalFiltering","loadMoreMessages","filterChanged","additionalQueryParams","filterColumns","fCol","reloadMessages","channelMessagesGridOptionsMap","getChannelMessagesGridOptions","customFilterChanges","createdBefore","createdAfter","translateStatus","getGridOptions","scopeVariable","loadMessagesForCreator","messagingAssets","changedAt","countingInProgress","numberOfMessages","loadingMessages","fetchMessagesForChannel","searchComplete","translatedStatus","translatedCreatorType","downloadMessage","toggleShowMessages","confirmDeleteItem","pass","confirmDeleteContact","confirmDeleteAttributeValue","confirmDeactivateChannel","confirmDeleteChannel","confirmDeleteTaskList","taskList","confirmDeleteKeyValue","usageLimitStatus","isNavCollapsed","isProfileCollapsed","allUserOrganizations","filteredUserOrganizations","isOrganizationLoading","userOrganizationFilter","updateUsageLimits","usageLimits","ITEMS","abs","usages","itemLimit","doLogout","logout","getUsageLimitLabel","isActive","getWebApps","webApps","ignoreInvalidToken","clearKeys","removeClass","endTour","getSupportLink","toggleActivityStream","updateNotificationsLastRead","lastRead","hide","planBillingProfiles","productName","documentationUrl","documentationTitle","showDashboardSettings","showDashboardAdd","gotoDashboard","getUserOrganizations","getAccountOrganizations","accountOrganizations","currentOrganization","userOrganizations","accountOrganization","isCurrent","systemAccount","managingAccount","deleteAccount","switchOrganization","newOrganization","filterUserOrganizations","searchText","gln","goToOrganizationProfile","goToUserProfile","getAdditionalMenuUrl","urlOrUrls","languageSpecificUrl","firstKey","restrict","clickOutside","$parentElement","$buttonElement","ShoppingCartResource","ShoppingCartService","reAddToShoppingCart","shoppingCartItem","addToShoppingCart","getColumnDefinitions","orderColumDefs","afterSelectionChange","loadOrder","orderId","FavoritesResource","OrdersService","orders","orderDate","total","totalForItem","parseFloat","totalPrice","redirectToOrderDetail","$gridScope","prepareOrganizationAttributes","hideOrganizationIcon","saveOrganizationData","newCustomValues","oldCustomValues","originalOrganizationData","uploadOrganizationImage","queueLimit","hasImage","last","toggleOrganizationIcon","uploader","FileUploader","keyPressed","urlError","isImage","lastIndexOf","svg","notSupported","webp","toggleShowPublicationDetails","restartPublication","QueryPublicationResource","PUBLICATION_GRID_STATES_KEY","getCounterTemplate","getWithStatusTemplate","publicationsGridApi","DEFAULT_QUERY_PARAMS","getJobName","jobId","loadScheduleJobs","stopPublication","reRunPublication","responseErrors","PublicationErrorMessagesCtrl","errorMessages","openErrorsModal","getResponseErrors","isAllowed","isVerificationRequired","destinationChannelIds","runJob","verified","jobsColumnDefs","loadDependencies","communicationChannelsResponse","jobsGridOptions","scrollbars","NEVER","suppressMultiSort","jobsGridApi","jobsGridMaxHeight","ALWAYS","editJob","deleteJob","getDestinationIcon","directPublication","getDestinations","channelSubDestinations","channelIds","organizationsIds","destinationOrganizationIds","sources","ids","getDescriptions","sourceId","sourceCommunicationChannel","toggleActive","newJob","publicationJob","foundJob","foundPublication","PUBLICATION_JOB_CHANGED_EVENT","refreshPage","$locale","DePublicationResource","publicationValues","organizationDestinations","channelDestinations","selectedOrganizations","selectedChannels","actionRepeat","getFilteredDestinations","ele_org","ele_ch","scope_org","scope_ch","filteredOrganizations","filteredChannels","getSelectedPublicationDestinations","doPublishItems","dataToPublish","depublish","publish","allRecipientsSelected","allOrganizationsSelected","publicationMode","publicationCategoryName","selectedPublicationMode","filterPublicationTargets","communicationChannelsWithType","organizationsWithType","org","publicationTargets","filteredPublicationTargets","foundCategoryName","getPublicationItemCategoryOfChannel","publication_mode","setPublicationItem","sch","endDateTime","nextRunDateTime","sd","c","hasPublicationAttributes","getPublicationAttributes","enablePublicationSchedule","selectedPublicationDestinations","confirmPublishItems","flterChanged","selectionUpdated","searchTextChanged","allRecipients","selectAllRecipients","onWizardInit","selectPublicationTargets","ReceivedRequestResource","requests","SignupResource","StatusResource","OrganizationResource","checkUserIfExistsAsync","invitationReference","existsUser","emailOrUsername","redirectToStartPage","isInRegistrationProcess","invitationError","INVITATIONS_TYPE","MODE","LOADING","COLLEAGUE","NEW","currentMode","ORGANIZATION_SIGNUP_STEPS","IDENTIFY_EMAIL","CREATE_USER","CREATE_ORG_ONLY","COLLEAGUE_SIGNUP_STEPS","CONFIRM","ref","signupData","companyName","statusResponse","existsOrganization","organizationExists","updateParams","currentOrganizationSignupStep","currentColleagueSignupStep","userExists","supportsMultiAccounts","signup","signupClicked","signupError","signupResponse","signupComplete","signupErrorKey","signupErrorValue","notYourAccountClicked","acceptColleagueInvitation","identifyEmailAddress","addNewOrganizationToAccount","companyEmail","companyWebsite","companyAddress","shouldDisableOrganizationName","ReleaseNotesResource","ReleaseNotesModalController","releaseNotes","year","footerCopyright","openReleaseNotes","ExportSummaryResource","jobColumnDefs","reportColumnDefs","jobGridOptions","createReport","foo","reports","SentRequestResource","requestId","requestFromSupplier","sendAnswer","questions","ConfirmResetPasswordResource","keyValid","confirmed","redirectToLogin","loginResponse","confirmResetPassword","resetPasswordData","queryLeafCategories","searchCategory","browseCategory","partners","selectedBusinessPartners","businessPartners","addQuestion","sendRequest","getDownloadLink","CatalogAnswers","loadAnswers","viewAnswers","newRequestInformation","progressTooltip","alreadyAnswered","numberOfRecipients","LoginResource","ResendMailResource","ResetPasswordResource","inRevalidationMode","goToRegistration","ExecuteResetPassword","resetPassword","emailSent","resetPasswordPending","resetPasswordResponse","ExecuteResendMail","openResetPasswordModal","resendConfirmationMail","resendMailData","resendMail","resendMailPending","resendMailResponse","doLogin","loginClicked","retryLogin","retryCount","statusErrorResponse","updateTotalPrice","targetScope","addSelectedItems","addItem","removeFromShoppingCart","clearShoppingCart","cartItems","shoppingCart","toDetailPage","videoId","youtubeUrl","SubscriptionResource","loadExistingSubscriptions","toggleShowSubscriptionDetails","ii","saveSubscription","GdsnPartiesResource","temporaryModelForPanels","gdsnParties","showErrors","showWarnings","VIEW_BY_ERRORS_WARNINGS","VIEW_BY_REVIEWER","reqObj","getReviewerDescription","reviewer__","reviewerId","reviewId","idsSet","getReviewerDescriptionFromGDSNParties","mapKeys","loadGDSNReviewerDescriptions","reviewEntityAttributes","sanitizedReview","pick","toggleErrors","toggleWarnings","getCount","getAggregatedComments","getReviewerName","scrollToComment","commentSectionId","scrollIntoView","behavior","QueryTasksResource","TASK_SETTINGS","TRANSLATION_UNASSIGNED","setLocalStorageSettings","loadTaskLists","allTasksLoaded","getQuery","loadingTasks","unionWith","arrVal","othVal","locationChangeStart","filteredTasks","newTaskList","editNewTaskList","usersWithUnassigned","newVal","oldVal","hasTaskListDeletePermisson","hasTaskListPermission","dueDateFilter","taskStatusFilter","getTaskList","timePassed","vdayDiff","vhourDiff","currentTimestamp","dateDiff","vminDiff","DAYS","HOURS","MINUTES","getTasksCount","resetQuery","takeValue","activeTaskList","selectAllTasks","checked","closeSelectedTasks","createTask","selectTaskList","createTaskList","deleteTaskList","selectedTaskList","getLocalUserName","editTask","ImportResource","QueryImportResource","UploadMappingResource","RunMappingResource","getGatheringsTemplate","uploadSuccess","uploadCancelled","loadMoreEntries","getPath","fetchEntries","existingEntry","newEntry","EDIT","StartMappingEditor","DEFAULT_TARGETS","getNonMappedAttributes","isModelDefined","onSelect","$select","oldTarget","alreadyMapped","ignored","nonMappedAttributes","diplaySelected","setMapped","notMappedAlready","columnNames","foundEntry","runMapping","$inject","limitsOK","$resolved","ITEMS_PER_IMPORT_FILE","getTooManyItemsMessage","canRunMapping","canStartMappingEditor","IMPORT_MAPPING_ENABLED","startMappingEditor","summary","deleteImport","fileName","showError","ExportUsersResource","getRoles","getGroups","getAll","updateUsers","getUsersSnapshot","activeUsers","licensesUsed","numberOfUsers","userLimit","createUser","editUser","removeUser","setActive","downloadUsers","blob","filename","display","revokeObjectURL","removeInvitation","pendingInvitation","buyUserLicenses","initGrid","createGroup","userIds","groupCopy","isGroupChanged","groupId","addMember","addedUsers","detectChanges","addrole","addedRoles","removeRole","saveGroup","showErrorMessage","errResponse","goBack","deleteGroup","a1","a2","existUser","u","disable","addUsers","exists","addRoles","UserImageResource","SingleSignOnResource","prepareUserAttributes","hideUserIcon","passwordData","oldPassword","newPassword","confirmNewPassword","isSsoUser","saveUser","tempUser","createTempUser","uploadUserImage","toggleUserIcon","changePassword","newPasswordForm","resetPasswordForm","$setPristine","AssetFoldersResource","LINK_TYPE_FOLDER","LINK_TYPE_ASSET","LOCAL_STORAGE_MODE_KEY","getUploader","onComplete","multiple","onCompleteAll","uploaderScope","failed","queue","isUploaded","isError","VIEW_MODE_GRID","VIEW_MODE_LIST","VIEW_MODE_LARGE_THUMBNAILS","currentPath","currentPathComponents","currentFolder","copiedItem","copiedMultiSelectedItems","filteredItems","loadingSelectedItemInfo","initializing","forwardPaths","multiSelectedItems","customDamMode","getFolderContentsByPath","decodeFilename","currentViewMode","isModal","domContainerId","onSelectedCallback","onCloseCallback","customAssetFoldersWidgetService","initNativeAssetFolders","isWidgetEnabled","initializePageWidgetAsync","initializeBrowseWidgetAsync","noop","getRootFolderContents","sortAssetItems","setFilteredItems","getFolderContents","folderName","fullPath","handleItemDoubleClick","linkType","isImageFile","showImageFile","getImageUrl","handleBreadcrumbClick","pathComponent","handleBackClick","handleForwardClick","previousPath","selectItem","showCreateModal","onDone","onCreateDone","showUploadModal","onCancel","broadcastChildsUpdated","showDeleteModal","itemPath","itemPaths","confirmDialog","deleting","showRenameModal","onRenameDone","getFileIcon","assetFolder","downloadableUrls","downloadFile","anchor","downloadButtonClick","selectFile","isFileTypeAccepted","setActiveViewMode","viewMode","EVENT_CHILDS_UPDATED","broadcastUpdated","newName","EVENT_UPDATED","onSearchQueryChange","onItemDragStart","draggedItem","draggedItems","prepareDragAndDropEvent","onItemDragFinished","droppedItems","droppedOnItem","handleDropEventAsync","onItemMovedSuccessfully","onItemMovedError","cutItem","itemFullPath","prependCurrentPath","handlePasteItemClick","copiedItems","isPasteActionEnabled","pasteItem","pasteItems","sourceItem","destinationItem","sourcePath","itemType","destinationPath","moveItemAsync","sourceItems","moveRequests","sourceParentFolderPath","getParentFolderPath","onAllItemsMovedSuccessfully","onMultiItemSelected","multiSelected","clearMultiSelection","multiSelectAll","viewModel","createFolder","renameFolder","renameFn","renameAsset","isArchiveFile","inputModel","extractArchive","uploading","getUploaderOptions","uploadItem","uploadAll","onAfterAddingFile","fileItem","alias","uploaderOptions","SheetJSService","SimpleMappingsResource","importing","importFile","fileAsArrayBuffer","sheetData","workbook","readFile","SheetNames","sheetName","sheet","Sheets","getRowCells","sheetToJson","createEntries","simpleMappingId","onSimpleMappingImported","onFileDrop","reader","FileReader","arrayBuffer","readAsArrayBuffer","onDrop","dataTransfer","files","$input","onchange","onclick","SimpleMappingsService","linkableAttributes","MODE_PREFILL","MODE_LINK","linkMode","simpleMapping","prefillEntities","importFromCodelist","modelAttributes","importModelAttributesIntoSimpleMappingAsync","linkAttributesToSimpleMappingAsync","linkedAttributes","simpleMappings","setSimpleMappingAsSelected","simpleMappingToSelect","_simpleMapping","getLinkableAttributes","allLinkableAttributes","generateColumnDefinitions","currentSimpleMapping","afterEntriesCellEdit","_dirty","MODE_SCREEN","MODE_MODAL","createNewState","editState","simpleMappingsInEditState","newEntity","export","exportXLSX","import","prefill","importedSimpleMapping","onCurrentMappingsChange","getEntries","cancelEditState","toggleCreateState","startEditState","cancelCreatingNewList","useSelectedMappingList","onSimpleMappingSelected","enrichEntriesWithDefaultValues","filteredEntries","removeSimpleMappingFromList","createNewSimpleMapping","updateSimpleMapping","deleteSimpleMapping","confirmDeleteSimpleMapping","removeEntryFromEntries","_entry","_new","updateEntry","confirmDeleteSelectedEntries","showLinkedAttributesTooltip","linkedAttributesList","translateAttributeByName","afterCellEdit","simpleMappingName","TemplateMappingService","loadTemplateFile","XMLHttpRequest","handsontableOnChange","send","filterMappingsOnSheetName","getSheetNameFromLocationString","getLastEntryId","maxIdEntry","maxBy","TYPE_LIST","TYPE_PAGE","sheets","filteredMappings__","sheetJSFile","spreadsheetViewerInstance","codemirror","CodeMirror","addMappingEntry","saveTemplate","importExportEntity","mergedMappings","templateType","templateSheets","templateCustomAttributes","mappingFunction__","mappingFunctionParams","onConfigureSimpleMappingList","simpleMappingParamName","getSimpleMappingParameterName","onConfigureMappingFunction","onFunctionParametersSaved","onConfigureCustomCodeMappingFunction","getUploadConfiguration","mappingEntry","onFocusSpreadsheetCell","locationString","a1NotationLocation","getA1NotationFromLocationString","numberBasedLocation","convertFromA1Notation","focusSpreadsheetCell","resetFile","templateFileName","templateFileArrayBuffer","enterFocusMode","onTemplateLoad","headerRow","dataRow","onSheetChange","onDropdownSheetChange","selectSheet","onTemplateSheetChange","detail","onTemplateCellChange","templateFileCol","range","templateFileRow","mappingsRowCol","convertToA1Notation","uploadSheetViaHandsontable","fillHeader","headerCells","headerCell","existingLocation","onDeleteMappingEntry","addResetMappingFunctionOption","addResetModelAttributeOption","onLoad","getFilteredLayoutAttributes","getAllModelAttributes","translateMappingFunctions","internalName__","lineWrapping","lineNumbers","autoRefresh","onEditorLoaded","setCursor","line","tempParamsModel","mappingAttributes","PARAM_TYPES","getParameterType","getSelectFromObject","parseSelectFrom","getSelectFromValues","requiredParameters","optional","actualParameters","differenceWith","firstSetEntry","secondSetEntry","onEditSimpleMappingClick","onSimpleMappingFromSimpleMappingsModalSelected","chosenSimpleMapping","uiType","getTemplateMappings","createExportTemplate","deleteTemplate","editTemplate","getEncodedURLComponentString","urlComponent","selectedTemplateCustomAttributes","onSelectedTemplateChange","dropText","showFileUpload","showThumbnail","isLazyLoaded","custom","lazyLoaded","thumbnailToggle","enableFilters","onUpload","customFilters","fn","min","sizeInMegaByte","handleConvertedResponse","resetUploader","cancelAll","clearQueue","clearInput","imageToCrop","toggleFileUpload","onCancelItem","croppedImage","readAsDataURL","_file","onBeforeUploadItem","dataURI","binary","atob","mimeString","charCodeAt","Uint8Array","onSuccessItem","uploadCompleteResponse","FileSelect","isEmptyAfterSelection","provideLinkModal","sha1","showImage","openYoutubePlayer","imageInputClick","disableField","hiddenInputClick","useAssetFolders","showAssetFoldersModal","scopeId","$id","isUploadQueueInProgressOrDone","isUploading","getFileUploaderPlaceholderText","transclude","buttonLabel","buttonIcon","submitLabel","fileType","inlineInput","ecIndex","tmpString","userImage","hiddenInput","dragDropUpload","isDefined","buttonInline","$compile","terminal","removeAttr","showGridFileDialog","showGridFileDialogCtrl","originalValue","saveAsset","equals","imagePreview","getImageElement","prepend","zip","excel","word","powerpoint","pdf","getFileType","getClass","setFileType","fileTypeElement","fieldValue","ngHref","filetype","childCount","parentElement","cutLength","shortFilename","fileTypeArray","shortName","truncate","helper","CanvasRenderingContext2D","File","canvas","onLoadImage","getContext","drawImage","ngThumb","img","Image","formInput","formInputIcon","formInputLabel","clearable","formInputClearable","isClearable","require","ngModelCtrl","dataModelAttribute","physicalAttribute","getFilteredUnits","filteredUnits","$setViewValue","$parsers","$formatters","typeaheadSelected","closeEvent","calculateLayout","mh","mf","mp","resize","h","scrollHeight","clientHeight","overflow","nodeName","outerHeight","h_prefix","changeInHeight","resizeToWindowHeight","visibleRowHeight","getVisibleRows","mainMenuClick","hasClass","collapseSidebar","expandSidebar","expandOrCollapse","mainMenuToggle","dropMenuClick","slideToggle","activeClass","activeLink","activeHref","exactMatch","activeExact","newPath","errSrc","$attr","titleString","widgetContainer","closest","cht","statsSpaceRequired","extraHeightRequired","extraHeight","plot","myModel","plotclick","overlay","onInit","onStepChanging","onLastStepAction","onCancelAction","onLastStepButtonLabel","currentStepIndex","currentStep","hasCancelAction","appendActionsTo","wizard","wizardId","toggleSteps","toStepIndex","goingBackwards","registerStep","nextStep","previousStep","isFirstStep","isLastStep","goToStep","stepIndex","closeNotification","notificationClosed","wizardController","ctrl","$pristine","laxMatch","$setValidity","MIN_SAFE_INTEGER","origHeader","updateWidth","UpdateTableHeaders","position","floatingHeader","innerWidth","toggleOpen","isReadonlyCapableInput","isPlaceholderCapableInput","isUISelect","uiSelectMatch","laxInputName","laxInput","$set","ngClass","ngFocus","ngDisabled","ngReadonly","laxFocusOn","focusable","is","htmlElement","setSelectionRange","valueType","laxNormalizeValue","ngModelGet","ngModel","viewValue","$render","laxDatepicker","datepickerFormat","uniqueId","random","isFocused","laxDatepickerGrid","checkDatepickerClosed","laxDatepickerOnClose","focused","blurred","component","siblings","laxDatetimePicker","$$childTail","showPicker","arrowUp","arrowRight","arrowDown","arrowLeft","leaveField","inputForm","$valid","emitCellEditEvent","keymap","LEFT","UP","RIGHT","DOWN","ESC","ENTER","TAB","uiGridEditService","controllers","uiGridTargetRenderContainerId","renderContainerCtrl","containerId","uiGridCtrl","handleKeyDown","endCellEdit","selectCtrl","clickedInsideGrid","api","navigate","viewPortKeyDownUnregister","viewPortKeyPress","isStartEditKey","fromCharCode","focusSearchInput","mousedown","blur","clickedOutsideOfCell","stuff","BEGIN_CELL_EDIT","endCellEditEvent","laxGridInput","caretPos","createTextRange","move","$elm","cancelCellEdit","ck","toolbarName","updateModel","toggleToolbar","disableAutoInline","inline","ckEditor","inProgressText","completionText","defaultText","bar","buttonText","fadeOut","$observe","tick","requestAnimationFrame","showClearBtn","itemSubKey","clearGroupValue","TEMPLATE_ALTERNATIVES","OpenEnum","OpenEnumSet","Codelist","OpenCodelist","CodelistSet","OpenCodelistSet","loadTemplate","ngCompiledInclude","alternativeName","customModel","customId","customChange","combinedTemplateName","customModelClean","compiledTemplate","clonedElement","compileDynamic","hideOnFeature","sessionIf","Routes","hideOrShow","lis","topLevelLis","li_","li","topLevelLi","childs","child","rightsString","dontHasRights","str1","str2","updateDiff","diffString","strFirst","strSecond","scrollTop","childElementCount","urlParam","urlParamPrefix","urlParamValue","changeUrlParam","realEncodeURIComponent","input","EMAIL_REGEXP","$validators","validateHostname","filterHeight","elementHeight","hasActivatePermisson","OBJECT_TYPE_DATAMODEL","useDataModel","modelId","showInfo","descriptions","rn","translatedReleaseNotes","dataModelInfo","gridContent","extra","htmlString","DataModelRetrievalResource","initValue","formatCategory","selectedAdditionalCategory","nodesMap","nodeCollapseMap","alreadyInitialized","openModal","selectedValue","displayLoader","getCategoryPath","pathNodes","parentNodes","allLeaves","leaves","sel_root","sn","selectedNode","nodesPopupController","escapePressed","nodeSelected","getTopLevelCategories","updateNodes","resetToCategory","ind","$interpolate","$attributes","lastTime","vendors","cancelAnimationFrame","currTime","timeToCall","clearTimeout","expressions","whenReady","waitForInterpolation","hasReadyCheckExpression","evalExpressions","expression","readyCheck","checkIfReady","isInterpolated","isReadyCheckTrue","startSymbol","IMMEDIATELY","SCHEDULE_PLAN","SCHEDULE_REPEAT","hideOn","DATETIME_FORMATS","SHORTDAY","toggleDisabled","updateStartDateTime","pw","lower","upper","digit","symbol","pattern_okay","length_okay","formatFloatValue","cursorPosition","transformedInput","onScroll","sectionRepeat","currentRows","currentSectionRepeatRows","sectionLoadedFn","loadNextRow","$$phase","currentItems","selectInfiniteScrollInitItems","addItems","selectInfiniteScrollAddItems","currentInfiniteScrollItems","selectedOptionsLength","addInfiniteScrollItems","handler","elementBottom","scrollDistance","scrollEnabled","scrollFn","selectInfiniteScrollDistance","selectInfiniteScrollDisabled","selectInfiniteScroll","currentElement","replacementElement","replaceWith","inputpattren","regexValidator","prop","len","isValid","testVal","moreHtml","minimizeMultilineContent","lessHtml","decimalSeparator","localeSpecificNumberFormat","NUMBER_FORMATS","DECIMAL_SEP","maxScale","maxPrecision","mousemove","y","pageY","resizerTarget","mouseup","startPoint","widthInPer","fullPannel","pageX","movement","t_elem","leftPannel","codes_elem","rightPannel","imageInputFocus","uploaderScopeId","emitterScopeId","showFullUrl","strict","progressConfig","bars","addBar","percent","toFixed","removeBar","progressCtrl","$body","contentDocument","setupBrowserTooltips","scrollEnd","onContextMenuOpen","ul","contextMenuTarget","parentModalElement","clientX","clientY","timeStamp","parents","compiledContents","contents","axis","maxGrow","minGrow","AXIS","MAX_GROW","MIN_GROW","TAG_NAME","manageResize","md","sizeProp","posProp","prevSize","nextSize","sumSize","sumGrow","lastPos","prev","previousElementSibling","nextElementSibling","onMouseMove","mm","prevGrowNew","nextGrowNew","flexGrow","onMouseUp","mu","removeEventListener","nodeType","searchUrl","api_search_results","selectedEntry","onSelected","selectionItem","setPreview","isDrawable","dataOrUrl","lineno","colno","fileIcon","getFileIconByMimeType","signal","onSuccess","requestUrl","requestController","fetch","mimeType","imgClass","iconClass","loaderClass","enableFilePreview","defaultPreview","newElement","AbortController","abort","hintId","hintContent","showHintIf","hintIcon","iconColor","renderTooltip","calloutId","removeCallout","hint","attrsctrl","checkCapacity","capacity","myheight","ceil","newLength","oldLength","rootItem","minimalist","hideIfEmpty","hideLabel","prepareSelectedAttributeOptions","allAttributeOptions","selectedOptions","dynamicColumns","dynamicDesktopData","dynamicMobileData","collapse","shouldBeHidden","initializeEnumOptions","getColumns","deferreds","sortingOption","forAttribute","sortingOptionA","sortingOptionB","sortingDirection","desktopItems","desktopItem","mobileItems","columnValue","columnKey","dimensionKey","dimensionValues","mobileItem","getAttributeDimensions","dimensionsKey","dimensions","loadGroupData","loadGroupMembers","loadMemberAttribute","memberName","collapseGroup","getAttributeFields","prepareGridData","formattedSingleReference","loadAndFormatSingleReference","IMAGE","DOCUMENT","media","itemTitle","MEDIA_TYPE_ONLINE_CATALOG","TYPES","thumbsSwiper","mediaSwiper","mouseHoveringOverImage","openMediaModal","setFilteredMedia","filteredMedia","medium","activeMediaType","setAsActive","activeMedia","setActiveMediaType","newActiveType","reInitializeThumbsSwiper","reInitializeMediaSwiper","setMouseHoveringOverImage","isHovering","Swiper","loop","spaceBetween","slidesPerView","freeMode","watchSlidesProgress","navigation","nextEl","prevEl","thumbs","swiper","onZoomedImageClick","Drift","paneContainer","hoverBoundingBox","dragenter","dropTarget","dropContainerElement","getElementsByClassName","dropZoneContainerClass","overClass","dragleave","dragover","drop","droppedItem","dragstart","effectAllowed","dropEffect","dragend","MAX_SAFE_INTEGER","parentElementClass","onItemDoubleClick","onItemSelect","onSelectAll","onClearSelection","min-height","getCellClass","getContextMenuTarget","unSelectRow","enableSelectAll","traverseToFolder","currentlyViewedPath","rootFolder","onlyNewItems","onlyDeletedItems","differenceBy","_item","RecursiveDirectiveHelper","parentPath","getCurrentPath","openFolder","childItems","viewFolder","closeFolder","oldPath","memoize","maxHeight","iframeTarget","firstRow","secondRow","a1OfFirstValue","a1OfSecondValue","translatedName","localeCompare","onTemplateTypeChange","removeFocusClass","formatEntryLocation","locationWithoutSheet","onInternalNameChange","selectedAttribute","onMappingFunctionChange","selectedMappingFunction","newType","getMappingFunctionType","mappingFunctionDefinition","mappingParameters","shouldShowHint","getMissingParameters","isValidSimpleMappingFunction","newParameters","newMappingFunction","showIsValidTooltip","showIsInvalidTooltip","missingParams","bindModel","codeMirrorConfigs","tempModel","onParamSelected","onChange","intersectionWith","firstEntry","secondEntry","assetsUrl","onCellChange","cellSelectionChanged","iframeDocument","buttonElement","button","selectCells","blurSreadsheetDocument","dispatchEvent","Event","loaded","spreadsheetViewerTab","SpreadsheetViewer","instance","configure","licenseKey","themeStylesheet","loadWorkbook","adUrl","adId","trustUrl","trustAsResourceUrl","$divElement","$iframe","setAdAsSeen","dashlets_","dashlet","_dashlet","PieChartFactory","dimensionAttributes","labelTranslator","linkFunction","plotClick","getBrowseLocation","series","dataLoader","getDimensionValue","NO_CATEGORY","occurence","showLegend","GenericDashletFactory","fetchData","plotFunction","seriesIndex","colors","compliantsData","notCompliant","getItemDescription","getItemClass","createdAt__","WidgetDataModel","RubyScriptService","RubyOutputService","constructor","me","widgetAttributes","executeRubyScript","script","executeScript","updateScope","DocumentationDashletService","setSize","barConfig","loadStatisticsData","barData","xaxisTicks","xaxis","ticks","pieConfig","statisticsKey","statistics","translateFunction","pie","radius","formatter","hoverable","clickable","legend","labelFormatter","pieData","dataExisting","destroy","NewsDashletService","ReviewsAndPublicationsDashletService","resource","gridModel","gridDataVar","allQueries","dimensionMap","getReviewStatisticsForChannels","getReviewStatisticsForOrganizations","publicationEntry","existingItem","newItem","isDummyEntry","published","dirty","total_published_bar_width","total_dirty_published_bar_width","shouldBeDrawnAsSubDestination","isParentChannelInCollection","destId1","destId2","reviewStatusMap","APPROVED","reviewsByDimension","reviewEntries","allResponses","statisticsByDimensions","dimensionEntry","total_reviews","statistic","total_published","sumForEachReviewStatus","calculateSumOfReviewsStatus","getReviewStatisticsQuery","promises","reviewLabel","isPresent","containerScope","grabSouthResizer","initY","pixelHeight","$marquee","widgetElm","pixelWidth","curY","one","divHt","roundHeighht","round","chartEl","setHeight","grabResizer","initX","widgetStyleWidth","widthUnits","unitWidth","transformMultiplier","containerStyle","curX","unitChange","roundWidth","setWidth","dateTime","getTimestampFromDate","setSeconds","_this","db","initialized","DBOpenRequest","indexedDB","onsuccess","__IDB","onupgradeneeded","onerror","optionListsNeedMigration","objectStoreNames","translationsNeedMigration","additionalCategoriesNeedMigration","deleteObjectStore","optionListsObjectStore","createObjectStore","keyPath","createIndex","translationsObjectStore","objectStore","transaction","translatedLanguage","deleteEntryAsync","indexName","cursorRequest","openKeyCursor","IDBKeyRange","only","continue","openCursor","interval","setInterval","clearInterval","LogoutResource","UserDetails","CheckNotifications","userRoles","matchesValue","allowed","testValue","partialMatch","isMatch","OBJECT_TYPE_COMMUNICATION_CHANNELS","OBJECT_TYPE_TASK_LISTS","OBJECT_TYPE_ENHANCED_CONTENTS","loginAccount","setOrganization","hasNewNotifications","hasSubDestinationPermission","OBJECT_TYPE_EDIT_SUB_DESTINATION","objectType","permission","permissions","tag_key","data_key","loadFunction","restoreFunction","errorFunction","requestHeader","Promise","results","cache","activeRequests","forceReload","cloneDeep","activeDeferred","organization_","ReplaySubject","users_","$users","reloadAllUsers","user_","responseCbk","AT","BE","CY","DE","EE","ES","FI","FR","GB","GR","IE","IT","LT","LU","LV","MT","NL","PT","SI","SK","UK","US","SUPPORTED_CURRENCIES","getCurrencySymbol","currencyKey","GBP","EUR","USD","$resource","cursorName","paramDefaults","actionDefaults","loaderResource","dataVar","gridApiVar","errorHandler","varName","isLoadComplete","getGridApi","setGridApi","callErrorHandler","onRegisterApiCbk","loadMoreData","setScrollDirections","handleResponse","handleError","setDataLoaded","$cacheFactory","UsersGroupResource","userGroupsFactory","groups_","reloadGroups","loadAllUserGroups","userGroupsData","customHeaders","transformRequest","InfiniteScrollResource","transformResponse","headersGetter","datefilter","dashboardSettings","DASHBOARD_SETTINGS","countMax","countMin","keyMax","keyMin","getOptionListGroups","removeFromFavorite","addToFavorite","contactResult","channelResult","channelsVerificationResult","subChannel","channeltypes","getOrderedAdditionalLicenseProfiles","time","dataType","Accept","getStatus","setStatus","baseUrl","interceptor","sectionattributes","replaceUnitValue","unitValue","unit","splitValue","firstChar","AdditionalDataModelResource","loadMissingAdditionalAttributes","itemAdditionalCategories","itemLayoutFilterName","itemLayoutFilter","subscribeMultiple","unsubscribeMultiple","unlisten","subscribedUsers","RealtimeResource","RealtimeProvider","currentRegistrations","currentSubscribePromise","currentListenPromise","navigator","sendBeacon","_waitUntilSubscribeIdle","_subscribe","_waitUntilListenIdle","_unsubscribe","_waitUntilConnected","resourceActionCallback","_subscribeCallback","waitUntil","_handleConnected","RolesResource","rolesFactory","roles_","reloadAllRoles","loadAllRoles","rolesData","includeDataModelTours","includeReleaseTours","datamodelTours","dataModelTours","releaseTours","releaseToursTours","releaseTour","showCloseButton","__laxVersion__","ENABLED_FEATURES","availableFeatures","featureExists","availableFeaturesList","readFromStorage","sessionStorage","writeToStorage","features","enabledFeatures","ShoppingCartItemResource","ConvertShoppingCartItemResource","price","quantity","shoppingCartId","itemToRemove","getTotalPrice","itemToUpdate","matchedItem","Order","positions","OrderPosition","supplier","gtin","brandName","tradeItemDescription","getOrder","orderToFind","ordersFound","grep","queueName","delay","processorFn","skipProcessorFn","preprocessItemChangesFn","processedItem","processingItem","processorTimeout","processorRunning","startProcessorTimeout","isQueueRunning","processingItemChanges","reason","queueItemChanges","stopProcessorTimeout","lastProcessedItem","lastQueuedItemChanges","getQueueName","getProcessedItem","isProcessorRunning","charAt","ItemChangesQueue","queues","unregisterWatch","stopWatch","BackendValidateItemResource","ValidationResource","ValidateItemsResource","defaultCellValidations","clearAllObjectProperties","oldItem","itemAttributeStates","itemValidations","doBeforeItemUpdate","VALIDATION_USE_DEDICATED_BACKEND_SERVICE","validationResponse","cellValidationsFn","isCellInvalid","cellValidations","getCellValidationMessages","failureMessages","warningMessages","isRowInvalid","getRowValidationMessages","tabs","defaultTab","tabActivateCallback","currentTab","getTabBySuburl","onClickTab","isActiveTab","ITEM_WATCHLIST","watchlist","_addWatchlistItem","oldCategory","primaryKeyCategory","_removeCategory","categoryPrimaryKeys","_removeWatchlistItem","pull","_saveWatchlist","_setWatchlist","setWatchlistItems","setWatchlist","getBySelection","getNamingPatterns","i2","getCodelist","deleteEntryByKey","getById","getHtml","getLayoutBlockTemplates","getRetailerList","generatePreview","enhancedContent","hasBody","convertToPublicAsset","moveAsset","moveFolder","deleteItems","pageName","mountPoint","reactCreateComponent","render","reactPages","componentName","props","reactComponents","root","reactDialogs","acceptedTypes","checkURLWithGetRequestAsync","getUploadUrl","removeAfterUpload","contextPathWhenDragged","onItemMoved","pathComponents","eventDataItem","memo","statusMap","resolves","rejects","memoKey","_res","_rej","currentDataModelHash","fetchAndCacheAdditionalCategory","isDynamicEnumAttribute","getAttributeOptionsFromOptionsParamAsync","getCodelistOptionsAsync","areOptionsLoading","loadedOptions","languageOption","filteredKeys","picked","isGroupOrGroupRendered","parentId","tmp","groupStructure","showHide","getModel","showHideGroupData","__index__","filterGroupPath","includesDimensional","getValidationsModel","currentIndex","groupEntry","groupIndex","groupAttributeEntry","groupLevel","getPathToCheck","pathToCheck","groupMemberAttributes","groupAttributeError","validationsGroupItem","isGroupRendered","isGroupEmpty","isGroupRenderedEntityEmpty","getVisibleMemberAttributes","initGroupAttribute","showGroupData","initGroup","initEntry","getEntryTitle","newGroup","addGroup","groupTitleClick","copyGroup","clearGroup","groupEven","isGroup","getGroupTitleError","getGroupTitleWarning","getGroupValidationMessages","hasGroupValidationMessages","checkGroupValidations","checkGroupValidation","isGroupKeyAttribute","checkGroupLocalValidations","getLocalValidationErrors","hasLocalValidationErrors","registerLocalValidationsWatcher","createPath","pathString","indexEntry","groupAttribute","checkGroup","checkGroupLevels","attributeMembers","groupIsReadOnly","containingAttribute","filterParameters","uiGroupTitleFilter","filter_name","filter_parameters","entryTmp","prevEntry","validationEntry","pathIncluded","failures","formatValidationMessages","validationList","validationObject","failure","loggedWarnings","included","groupHasError","editorScope","groupValues","entryErrors","attributeLocalValidations","multiDimensionalAttribute","areKeysUnique","validateUniqueKeys","atLeastOneKeyAttributeProvided","checkAtLeastOnePropertyProvided","atLeastOneValueAttributeProvided","allEntries","entriesWithTheSameKeys","rowEntry","multiDimensionalEntriesComparator","compareProperties","properties","atLeastOnePropProvided","FindItemsByPrimaryKeyResource","referenceableCategories","references","thisShouldNotBeUsedAsAnAttributeName","formatReferenceItem","itemsResult","extendedItems","completeItem","extendedItem","formattedItem","referenceItem","displayNames","filterFunctionName","uiReferenceFilter","foundItem","referencedFilterAttribute","referencedFilterAttributeType","formattedValue","filterFunction","LINKABLE_ATTRIBUTE_TYPES","modelAttributeNames","filterLinkableAttributes","getCodeLists","getCodeListValuesAsync","codelistName","modelAttribute","optionsKey","getAllAttributeOptionsAsync","optionsPromises","optionsResponses","createSimpleMappingEntriesAsync","simpleMappingEntries","XLSX","read","utils","decode_range","C","encode_cell","mergedRange","getCellMergedRegion","format_cell","sheet_to_json","jsonObject","book_new","worksheet","json_to_sheet","book_append_sheet","writeFile","RUBY_CONTENT_TYPES","BOOLEAN","CODE","MULTI_SELECT","MULTI_TEXT","TEXT","selectFrom","selectMultiple","simpleMappingParameter","stringParts","orderA","cellLocation","colA1","A","ADS_STORAGE_KEY","sample","availableAds","seenAds","getSeenAds","availableAd","seenAd","getAdIfSeen","dateSeen","shouldShowAd","newlySeenAdId","newlySeenAd","now","lastSeenDate","currentDate","adsFrequencyInterval","marketingCampaignsFrequencyInterval","sortedUnits","tempSortedUnits","lowercase","out","padded","patt","decodeURI","specialChar","defaultTypes","drawable","thumbnail","website","outNormal","outPriorized","prioItem","normalItem","selectedKey","continueSearch","searchFields","searchFieldObjects","foundObjects","searchField","searchFieldOption","hiddenAttributes","exportFormat","comparator","actual","lowerCase","deepCompare","actualType","hasKeys","exclude","in_options","exp","pow","getTranslatedAttributeValue","attributeValue","entryIndex","compositeAttribute","firstGroupAttribute","accumulatedResult","xhr","capitalizeFirstLetter","mtch","grp","TypeError"],"mappings":"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","file":"app-c8169188cb.min.js","sourcesContent":["try {\n templateModule = angular.module('llax.templates');\n} catch (e) {\n templateModule = angular.module('llax.templates', []);\n}\ntemplateModule\n .run([\"$templateCache\", function($templateCache) {\n $templateCache.put(\"template/accordion/accordion-group.html\",\n \"
\\n\" +\n \"
\\n\" +\n \"

\\n\" +\n \" {{heading}}\\n\" +\n \"

\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n\n // bring back default checkbox behavior for row selection in ui-grid\n $templateCache.put('ui-grid/selectionRowHeaderButtons',\n \"\"\n );\n $templateCache.put('ui-grid/selectionSelectAllButtons',\n \"
\"\n );\n\n // ui-bootstrap timepicker:\n // add arrow keys to change hours/minutes\n // hide arrow buttons\n $templateCache.put(\"template/timepicker/timepicker.html\",\n \"
\\n\" +\n \"
\\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \" \\n\" +\n \"
 
\\n\" +\n \" \\n\" +\n \" :\\n\" +\n \" \\n\" +\n \"
 
\\n\" +\n \"
\\n\" +\n \"
\\n\" +\n \"\");\n\n // ui-grid grid menu button template, overridden to show a tooltip to the button.\n // Original template can be found here ->\n // https://github.com/angular-ui/ui-grid/blob/master/packages/core/src/templates/ui-grid/ui-grid-menu-button.html\n $templateCache.put(\"ui-grid/ui-grid-menu-button\",\n '
' +\n '
' +\n '  ' +\n '
' +\n '
' +\n '
\"');\n }]);\n\n// ui-select search input wouldn't focus, gets blocked by ngAnimate\n// https://github.com/angular-ui/ui-select/issues/1560#issuecomment-228033704\nangular.module('ui.select')\n .run(['$animate', function($animate) {\n var origEnabled = $animate.enabled;\n $animate.enabled = function(elem) {\n if (arguments.length !== 1) {\n return origEnabled.apply($animate, arguments);\n } else if (origEnabled(elem)) {\n return animationClassNameFilter.test(elem.classNames);\n }\n return false;\n };\n }]);\n","/*ngInject*/\nfunction DataModel(dataModelMap, $log, $rootScope, $translate, $q, $window, Auth, DataModelResource, EnumAttributeService, LocalCacheService) {\n\n var self = this;\n var LocalStorage = $window.localStorage;\n\n this.ADDITIONAL_FIELDS = [\n \"audited__\",\n \"category__\",\n \"channel__\",\n \"checksum__\",\n \"primaryKey__\",\n \"publishedAt__\",\n \"publications_dirty__\",\n \"reviewCountApproved__\",\n \"reviewCountReceived__\",\n \"reviewCountRejected__\",\n \"reviewCountReviewed__\",\n \"reviewCountTotal__\",\n \"reviews__\",\n \"supplierPrimaryKey__\",\n \"supplier__\",\n \"tags__\",\n \"validation__\",\n \"validation_warnings__\",\n \"validation_dirty__\",\n \"attributeStates__\",\n \"readonlyAttributes__\",\n \"reviewErrors__\",\n \"reviewWarnings__\",\n \"reviewRemarks__\"\n ];\n\n // Maps a layout name to a list of attribute names and attributes\n var layoutAttributesMap = {};\n\n // Maps a layout name to a list of sorted sections, including sorted and complete attribute objects\n var layoutSectionsMap = {};\n\n // Maps a category name to a list of attribute names and attributes\n var categoryAttributesMap = {};\n\n // Maps query parsers to layout names\n var queryParsersMap = {};\n\n // Defines the categories overview menu\n var categoriesOverview = {};\n\n // Maps a layout \"function\" to a layout name\n var layoutMapping = {};\n\n // Maps an additional category name or code to a category\n var additionalCategoriesMap = {};\n\n // Maps an additional attribute name to an attribute\n var additionalAttributesMap = {};\n\n // List of organization attributes\n var organizationAttributes;\n\n // List of user attributes\n var userAttributes;\n\n // List of contact attributes\n var contactAttributes;\n\n // List of review attributes\n var reviewAttributes;\n\n // List of dashboard attributes\n var dashboardAttributes;\n\n this.name = function() {\n return dataModelMap.name;\n };\n\n this.label = function() {\n return dataModelMap.label;\n };\n\n this.clearDefaultItems = function() {\n for (var i = 0; i < LocalStorage.length; i++) {\n var key = LocalStorage.key(i);\n if (key.includes(\"defaultItem:\")) {\n LocalStorage.removeItem(key);\n }\n }\n };\n\n this.getDefaultItemKey = function (category, orgId, userId) {\n return \"defaultItem:\" + $rootScope.organization.dataModelHash + \":\" + category + \":\" + orgId + \":\" + userId;\n };\n\n this.setDefaultItem = function (category, item, orgId, userId) {\n LocalStorage.setItem(this.getDefaultItemKey(category, orgId, userId), JSON.stringify(item));\n };\n\n this.getDefaultItem = function (category, orgId, userId) {\n var defaultItem = LocalStorage.getItem(this.getDefaultItemKey(category, orgId, userId));\n\n if (!_.isNil(defaultItem)) {\n try {\n defaultItem = JSON.parse(defaultItem);\n } catch(e) {\n $log.error(\"couldn't parse cached default item\", e);\n return null;\n }\n }\n\n return defaultItem;\n };\n\n this.setCategoriesOverview = function(categoriesOverview_) {\n if (!_.isNil(categoriesOverview_)) {\n categoriesOverview = categoriesOverview_;\n }\n };\n\n this.setLayoutMapping = function(layoutMapping_) {\n if (!_.isNil(layoutMapping_)) {\n layoutMapping = layoutMapping_;\n }\n };\n\n this.getRaw = function() {\n return dataModelMap;\n };\n\n this.getTaskTags = function() {\n return dataModelMap.taskTags;\n };\n\n this.getMappingFunctions = function() {\n return dataModelMap.mappingFunctions;\n };\n\n this.mappingFunction = function(name) {\n return _.get(dataModelMap.mappingFunctions, name);\n };\n\n this.hasOptionList = function(optionListName) {\n return _.has(dataModelMap.optionLists, optionListName);\n };\n\n this.optionList = function(optionListName) {\n return _.get(dataModelMap.optionLists, optionListName);\n };\n\n /**\n *\n * DEPRECATED in favor of `optionListOptionsAsync`. The callers expect a returned array of options, or\n * a promise of loading these options.\n */\n this.optionListOptions = function(optionListName, groupNames) {\n\n // Check and get option list for name\n var optionList = this.optionList(optionListName);\n if (!_.isObject(optionList)) {\n return null;\n }\n\n var options = optionList.options;\n\n // Handle service option lists, if necessary\n if (!_.isEmpty(optionList.serviceName) && !optionList.optionsLoaded) {\n options = getServiceOptionListOptions(optionList, groupNames);\n }\n\n // Filter by groups\n if (!_.isEmpty(options) && !_.isEmpty(groupNames)) {\n options = getGroupFilteredOptions(options, optionList.groups, groupNames);\n }\n\n return options;\n };\n\n /**\n *\n * DEPRECATED in favor of `getServiceOptionListOptionsAsync`.\n */\n function getServiceOptionListOptions(optionList, groupNames) {\n\n var options;\n\n // Options are currently loading, so add code after loading is done\n if (optionList.optionsLoadingPromise) {\n options = [];\n optionList.optionsLoadingPromise.then(function(x) {\n\n // Add matching option list options to options array\n addMatchingOptions(optionList.options, options, groupNames);\n\n });\n return options;\n }\n\n // Check if options were cached\n var dataModelHash = $rootScope.organization.dataModelHash;\n var cacheKey = 'dataModel.optionList.' + optionList.name;\n var cachedOptionList = JSON.parse(LocalStorage.getItem(cacheKey));\n\n if (!_.isNil(cachedOptionList)) {\n\n // Only return options, if they match the data model hash\n if (cachedOptionList.dataModelHash == dataModelHash) {\n\n options = cachedOptionList.options;\n $log.info(\"Loaded \" + options.length + \" option(s) for option list '\" + optionList.name + \"' from local storage\");\n\n // Update option list\n optionList.options = options;\n optionList.optionsLoaded = true;\n\n return options;\n }\n\n // Delete invalid cache entry\n $log.info(\"Invalidated cache for option list '\" + optionList.name + \"'\");\n LocalStorage.removeItem(cacheKey);\n\n }\n\n // Create and attach empty options array\n options = [];\n optionList.options = [];\n optionList.optionsLoaded = false;\n\n // Save the promise\n optionList.optionsLoadingPromise = DataModelResource().getOptionListOptions({\n optionListName: optionList.name,\n serviceName: optionList.serviceName\n }, {},\n function(response) {\n\n _.forEach(response, function(option) {\n optionList.options.push({\n name: option.name,\n serviceName: option.serviceName || '',\n key: option.name,\n value: option.label,\n label: option.label,\n labels: option.labels,\n icon: option.icon,\n icons: option.icons,\n groups: option.groups\n });\n });\n $log.info(\"Loaded \" + optionList.options.length + \" option(s) for option list '\" + optionList.name + \"' from server\");\n\n // Cache options\n cachedOptionList = {\n dataModelHash: dataModelHash,\n options: optionList.options\n };\n\n // FIXME: We still have a couple of places that call the deprecated `optionListOptions()`, for now we are going to skip\n // caching the option list in the local storage, until we completely get rid of `optionListOptions()`.\n $log.info(\"Should have cached option(s) for option list '\" + optionList.name + \"' in local storage\");\n\n // Translate all options\n $rootScope.translateAllOptions(null, optionList.options);\n\n // Add matching option list options to options array\n addMatchingOptions(optionList.options, options, groupNames);\n\n }, function(responseError) {\n $log.error(responseError);\n optionList.error = responseError;\n }).$promise;\n\n // Cleanup after loading\n optionList.optionsLoadingPromise.finally(function() {\n optionList.optionsLoaded = true;\n delete optionList.optionsLoadingPromise;\n });\n\n return options;\n }\n\n /**\n *\n * Returns a promise of loading the intended options whether from the cached storage or the DataModelResource.\n */\n this.optionListOptionsAsync = function(optionListName, groupNames) {\n\n var deferred = $q.defer();\n\n // Check and get option list for name\n var optionList = this.optionList(optionListName);\n if (!_.isObject(optionList)) {\n deferred.resolve(null);\n }\n\n var options = optionList.options;\n\n // Handle service option lists, if necessary\n if (!_.isEmpty(optionList.serviceName) && !optionList.optionsLoaded) {\n getServiceOptionListOptionsAsync(optionList, groupNames)\n .then(function(options) {\n // Filter by groups\n if (!_.isEmpty(options) && !_.isEmpty(groupNames)) {\n options = getGroupFilteredOptions(options, optionList.groups, groupNames);\n }\n\n deferred.resolve(options);\n }).catch(function(error) {\n $log.error(\"Could not load options for '\" + optionListName + \"'\");\n $log.error(error);\n deferred.reject();\n });\n }\n\n // If options are already loaded\n if (!_.isEmpty(options)) {\n // Filter by groups if needed\n if (!_.isEmpty(groupNames)) {\n options = getGroupFilteredOptions(options, optionList.groups, groupNames);\n }\n deferred.resolve(options);\n }\n\n return deferred.promise;\n };\n\n function getServiceOptionListOptionsAsync(optionList, groupNames) {\n\n var deferred = $q.defer();\n var options;\n\n // Options are currently loading, so add code after loading is done\n if (optionList.optionsLoadingPromise) {\n options = [];\n optionList.optionsLoadingPromise.then(function(x) {\n\n // Add matching option list options to options array\n addMatchingOptions(optionList.options, options, groupNames);\n deferred.resolve(options);\n\n });\n return deferred.promise;\n }\n\n // Check if options were cached, else we'll load them then cache them\n var dataModelHash = $rootScope.organization.dataModelHash;\n var cacheKey = getOptionListCacheKey(optionList.name);\n\n getCachedOptionListAsync(cacheKey, dataModelHash)\n .then(function(cachedOptionList) {\n if (!_.isNil(cachedOptionList)) {\n options = cachedOptionList.options;\n $log.debug(\"Loaded \" + options.length + \" option(s) for option list '\" + optionList.name + \"' from local cache\");\n\n // Update option list\n optionList.options = options;\n optionList.optionsLoaded = true;\n\n //return options to the root promise\n deferred.resolve(options);\n } else {\n // Delete invalid cache entries (if any)\n $log.debug(\"Invalidating cache for option list '\" + optionList.name + \"' (if any)\");\n deleteCachedOptionListAsync(cacheKey);\n\n fetchAndCacheOptionListAsync(optionList, dataModelHash, groupNames, cacheKey)\n .then(function(options) {\n deferred.resolve(options);\n }).catch(function() {\n deferred.resolve([]);\n });\n }\n })\n .catch(function() {\n // There was an error checking the cache, let's fetch the options\n // and try to cache them anyway.\n fetchAndCacheOptionListAsync(optionList, dataModelHash, groupNames, cacheKey)\n .then(function(options) {\n deferred.resolve(options);\n }).catch(function() {\n deferred.resolve([]);\n });\n });\n\n // Cleanup after loading\n deferred.promise.finally(function() {\n optionList.optionsLoaded = true;\n delete optionList.optionsLoadingPromise;\n });\n\n optionList.optionsLoadingPromise = deferred.promise;\n\n return deferred.promise;\n }\n\n function getGroupFilteredOptions(options, optionListGroups, groupNames) {\n\n if (_.isEmpty(options) || _.isEmpty(groupNames)) {\n return options;\n }\n\n // Filter either by option list groups or by groups defined in options\n options = _.filter(options, function(option) {\n\n if (!_.isEmpty(optionListGroups)) {\n\n // Check if option is included in any matching option list group\n return _.some(optionListGroups, function(groupOptions, groupName) {\n return _.includes(groupNames, groupName) && _.includes(groupOptions, option.key);\n });\n\n } else if (!_.isEmpty(option.groups)) {\n\n // Check if any option group matches\n return _.some(option.groups, function(groupName) {\n return _.includes(groupNames, groupName);\n });\n\n } else {\n // No groups exist, so don't include option\n return false;\n }\n\n });\n\n return options;\n }\n\n function addMatchingOptions(sourceOptions, options, groupNames) {\n\n if (_.isEmpty(sourceOptions)) {\n return;\n }\n\n var addAll = _.isEmpty(groupNames);\n _.forEach(sourceOptions, function(option) {\n\n // Add option, if either no group names were specified,\n // or any of its groups matches any group name\n if (addAll || _.some(option.groups, function(g) { return _.includes(groupNames, g); })) {\n options.push(option);\n }\n\n });\n\n }\n\n this.getAttributeOptions = function(attribute) {\n\n if (_.isEmpty(attribute)) {\n return null;\n }\n\n if (_.isString(attribute)) {\n\n // Get attribute for name, if necessary\n attribute = this.attribute(attribute);\n return this.getAttributeOptions(attribute, context);\n\n } else if (_.has(attribute, 'params')) {\n\n var optionsParam = this.getAttributeOptionsParam(attribute);\n if (_.isEmpty(optionsParam)) {\n\n // Get options from referenced attribute, if no options were defined\n var referencedOptionAttribute = this.getReferencedOptionAttribute(attribute);\n if (!_.isEmpty(referencedOptionAttribute)) {\n return this.getAttributeOptions(referencedOptionAttribute);\n }\n\n } else if (_.isString(optionsParam)) {\n\n var options = _.get(attribute.params, optionsParam);\n if (_.isString(options)) {\n\n // Get options from optionList, including filtering by groups\n var optionList = options;\n var groupNames = _.get(attribute.params, optionsParam + 'OptionGroups');\n return this.optionListOptions(optionList, groupNames);\n\n } else if (_.isArray(options)) {\n\n // Options is expected to be an array of (key, value) objects\n return options;\n\n }\n\n }\n\n }\n\n // No options exist\n\n return null;\n };\n\n /**\n * Returns the name of the parameter containg options for this attribute\n * or 'null' if the attribute does not contain options.\n */\n this.getAttributeOptionsParam = function(attribute) {\n return getParamName(attribute, [ 'values', 'keys' ]);\n };\n\n /**\n * Returns the name of the referenced option attribute\n * or 'null' if no such attribute is set.\n */\n this.getReferencedOptionAttribute = function(attribute) {\n var paramName = getParamName(attribute, [ 'valueAttribute', 'keyAttribute' ]);\n var referencedAttributeName = _.get(attribute.params, paramName);\n return this.attribute(referencedAttributeName);\n };\n\n function getParamName(attribute, paramNames) {\n return _.find(paramNames, function(paramName) {\n var value = _.get(attribute.params, paramName);\n return !_.isNil(value);\n });\n }\n\n this.getOrganizationAttributes = function() {\n if (organizationAttributes === undefined) {\n if (dataModelMap.organizationAttributes === undefined) {\n return [];\n }\n var attributes = [];\n angular.forEach(dataModelMap.organizationAttributes, function(attributeName) {\n var attribute = this.attribute(attributeName);\n if (attribute) {\n attributes.push(attribute);\n }\n }, this);\n organizationAttributes = attributes;\n }\n return organizationAttributes;\n };\n\n this.getUserAttributes = function() {\n if (userAttributes === undefined) {\n if (dataModelMap.userAttributes === undefined) {\n return [];\n }\n var attributes = [];\n angular.forEach(dataModelMap.userAttributes, function(attributeName) {\n var attribute = this.attribute(attributeName);\n if (attribute) {\n attributes.push(attribute);\n }\n }, this);\n userAttributes = attributes;\n }\n return userAttributes;\n };\n\n this.getContactAttributes = function() {\n if (contactAttributes === undefined) {\n if (dataModelMap.contactAttributes === undefined) {\n return [];\n }\n var attributes = [];\n angular.forEach(dataModelMap.contactAttributes, function(attributeName) {\n var attribute = this.attribute(attributeName);\n if (attribute) {\n attributes.push(attribute);\n }\n }, this);\n contactAttributes = attributes;\n }\n return contactAttributes;\n };\n\n this.getReviewAttributes = function() {\n if (reviewAttributes === undefined) {\n if (dataModelMap.reviewAttributes === undefined) {\n return [];\n }\n var attributes = [];\n angular.forEach(dataModelMap.reviewAttributes, function(attributeName) {\n var attribute = this.attribute(attributeName);\n if (attribute) {\n attributes.push(attribute);\n }\n }, this);\n reviewAttributes = attributes;\n }\n return reviewAttributes;\n };\n\n this.getDashboardAttributes = function() {\n if (dashboardAttributes === undefined) {\n if (dataModelMap.dashboardAttributes === undefined) {\n return [];\n }\n var attributes = [];\n angular.forEach(dataModelMap.dashboardAttributes, function(attributeName) {\n var attribute = this.attribute(attributeName);\n if (attribute) {\n attributes.push(attribute);\n }\n }, this);\n dashboardAttributes = attributes;\n }\n return dashboardAttributes;\n };\n\n function addToMapList(map, key, value) {\n var list = map[key];\n if (!list) {\n list = [];\n map[key] = list;\n }\n if (list.indexOf(value) < 0) {\n list.push(value);\n }\n }\n\n this.getCategoriesToShow = function() {\n var categories;\n if (categoriesOverview && categoriesOverview.showCategories) {\n var dataModel = this;\n categories = categoriesOverview.showCategories.map(function(categoryName) {\n return dataModel.category(categoryName);\n });\n } else {\n categories = this.allCategories();\n }\n categories = _.filter(categories, function(category) {\n return !_.isEmpty(category) && Auth.hasAnyPermission(Auth.OBJECT_TYPE_ITEMS, ['edit', 'read'], {category__: category.name});\n });\n return categories;\n };\n\n this.getCategoryMenuEntryTypes = function() {\n var menuEntries = [];\n if (categoriesOverview && !_.isEmpty(categoriesOverview.showEntries)) {\n menuEntries = ['item_selection'].concat(categoriesOverview.showEntries);\n } else if (categoriesOverview && categoriesOverview.showSearchBox) {\n menuEntries = ['item_selection', 'all', 'uncategorized', 'visible_categories', 'search_box'];\n } else {\n menuEntries = ['item_selection', 'all', 'uncategorized', 'visible_categories'];\n }\n return menuEntries;\n };\n\n this.getCategoryMenuEntries = function() {\n var entryTypes = this.getCategoryMenuEntryTypes();\n var entries = {};\n for (var i = 0; i < entryTypes.length; i++) {\n var type = entryTypes[i];\n if (type === 'visible_categories') {\n var categories = this.getCategoriesToShow();\n for (var j = 0; j < categories.length; j++) {\n var category = categories[j];\n entries['category_' + category.name] = category;\n }\n } else {\n entries[type] = null;\n }\n }\n return entries;\n };\n\n this.getItemAdditionalCategories = function(item) {\n\n var additionalCategories = {};\n angular.forEach(item, function(categoryName, attributeName) {\n var attribute = this.attribute(attributeName);\n if (attribute && attribute.typeName === 'AdditionalCategory' && categoryName) {\n var additionalModule = attribute.params.additionalModule;\n if (!additionalModule) {\n $log.warn(\"Additional category attribute '\" + attributeName + \"' does not have an additional module specified\");\n return;\n }\n var extension = attribute.params.extension || '';\n additionalModule = extension + ':' + additionalModule;\n addToMapList(additionalCategories, additionalModule, categoryName);\n }\n }, this);\n\n return additionalCategories;\n };\n\n this.getMissingAdditionalCategories = function(additionalCategories) {\n\n if (_.isEmpty(additionalCategories)) {\n return {};\n }\n\n var missingCategories = {};\n _.forEach(additionalCategories, function(categoryNames, additionalModule) {\n _.forEach(categoryNames, function(categoryName) {\n\n var category = getAdditionalCategory(additionalModule, categoryName);\n if (!category) {\n addToMapList(missingCategories, additionalModule, categoryName);\n }\n\n });\n });\n\n return missingCategories;\n };\n\n this.addAdditionalCategories = function(additionalCategoriesPerModule) {\n\n _.forEach(additionalCategoriesPerModule, function(additionalCategories, additionalModule) {\n _.forEach(additionalCategories, function(additionalCategory) {\n\n // Add module name\n additionalCategory.additionalModule = additionalModule;\n\n // Cache category for name\n var key = getAdditionalCategoryKey(additionalModule, additionalCategory.name);\n additionalCategoriesMap[key] = additionalCategory;\n\n // Cache category for code\n if (additionalCategory.code && additionalCategory.code != additionalCategory.name) {\n key = getAdditionalCategoryKey(additionalModule, additionalCategory.code);\n additionalCategoriesMap[key] = additionalCategory;\n }\n\n });\n });\n\n };\n\n this.getMissingAdditionalAttributes = function(additionalCategories) {\n\n if (_.isEmpty(additionalCategories)) {\n return {};\n }\n\n var missingAttributes = {};\n _.forEach(additionalCategories, function(categoryNames, additionalModule) {\n _.forEach(categoryNames, function(categoryName) {\n\n var category = getAdditionalCategory(additionalModule, categoryName);\n if (!category) {\n $log.debug(\"Unknown additional category '\" + categoryName + \"' for module '\" + additionalModule + \"'\");\n return;\n }\n\n var attributes = getAdditionalCategoryAttributes(additionalModule, category);\n _.forEach(attributes, function(attributeName) {\n if (!additionalAttributesMap[attributeName]) {\n addToMapList(missingAttributes, additionalModule, attributeName);\n }\n });\n\n });\n });\n\n return missingAttributes;\n };\n\n function getAdditionalCategoryKey(moduleName, categoryName) {\n return moduleName + \":\" + categoryName;\n }\n\n function getAdditionalCategory(moduleName, categoryName) {\n var key = getAdditionalCategoryKey(moduleName, categoryName);\n return additionalCategoriesMap[key];\n }\n\n function getAdditionalCategoryAttributes(moduleName, category) {\n if (_.isNil(category)) {\n return [];\n }\n var attributes = [];\n addAdditionalCategoryAttributes(attributes, moduleName, category);\n return attributes;\n }\n\n function addAdditionalCategoryAttributes(attributes, moduleName, category) {\n if (_.isNil(category)) {\n return;\n }\n if (category.parent) {\n var parentCategory = getAdditionalCategory(moduleName, category.parent);\n addAdditionalCategoryAttributes(attributes, moduleName, parentCategory);\n }\n if (!_.isEmpty(category.attributes)) {\n _.forEach(category.attributes, function(attribute) {\n if (!_.includes(attributes, attribute)) {\n attributes.push(attribute);\n }\n });\n }\n }\n\n this.addAdditionalAttributes = function(additionalAttributesPerModule) {\n angular.forEach(additionalAttributesPerModule, function(additionalAttributes, additionalModule) {\n angular.forEach(additionalAttributes, function(additionalAttribute) {\n additionalAttribute.additionalModule = additionalModule;\n cleanupAttributeParams(additionalAttribute);\n additionalAttributesMap[additionalAttribute.name] = additionalAttribute;\n });\n });\n };\n\n function cleanupAttributeParams(additionalAttribute) {\n\n var params = additionalAttribute.params;\n if (_.isEmpty(params)) {\n return;\n }\n\n _.forEach(params, function(paramValue, paramKey) {\n if (!_.isPlainObject(paramValue)) {\n return;\n }\n paramValue = _.map(paramValue, function(value, key) {\n return {\n 'key': key,\n 'value': value\n };\n });\n params[paramKey] = paramValue;\n });\n\n }\n\n this.addAdditionalSectionAttributes = function(result, sectionName, attributeName, categoryName, predicate) {\n\n if (_.isEmpty(categoryName)) {\n return;\n }\n\n if (!_.isObject(result)) {\n $log.warn(\"First parameter 'result' is not an object\");\n return;\n }\n\n var attribute = this.attribute(attributeName);\n if (_.isNil(attribute)) {\n $log.warn(\"Additional category attribute '\" + attributeName + \"' is not defined\");\n return;\n } else if (attribute.typeName !== 'AdditionalCategory') {\n $log.warn(\"Attribute '\" + attributeName + \"' is not of type 'AdditionalCategory'\");\n return;\n }\n\n var additionalModule = attribute.params.additionalModule;\n if (_.isEmpty(additionalModule)) {\n $log.warn(\"Additional attribute '\" + attributeName + \"' does not have an additional module specified\");\n return;\n }\n\n var extension = attribute.params.extension || '';\n additionalModule = extension + ':' + additionalModule;\n\n addAdditionalSectionCategoryAttributes(result,\n sectionName,\n additionalModule,\n categoryName,\n attribute,\n predicate);\n\n };\n\n function addAdditionalSectionCategoryAttributes(result,\n sectionName,\n additionalModule,\n categoryName,\n additionalAttribute,\n predicate) {\n\n var category = getAdditionalCategory(additionalModule, categoryName);\n if (_.isNil(category)) {\n var additionalCategoryName = additionalAttribute.params.additionalCategory;\n if (categoryName != additionalCategoryName) {\n $log.warn(\"Category '\" + categoryName +\n \"' specified in attribute '\" +\n additionalAttribute.name +\n \"' is not defined in additional module '\" +\n additionalModule + \"'\");\n }\n return;\n }\n\n attributes = result[sectionName] || [];\n if (!_.isEmpty(category.attributes)) {\n _.forEach(category.attributes, function(attribute) {\n\n if (self.isMetaAttribute(attribute) ||_.includes(attributes, attribute)) {\n return;\n }\n\n if (_.isFunction(predicate)) {\n var ret = predicate(attribute);\n if (!ret) {\n return;\n } else if (_.isObject(ret)) {\n attribute = _.merge(ret, {\n 'name': attribute\n });\n } else {\n attribute = {\n 'name': attribute\n };\n }\n }\n\n attributes.push(attribute);\n\n });\n }\n result[sectionName] = attributes;\n\n if (!_.isEmpty(category.parent)) {\n addAdditionalSectionCategoryAttributes(result,\n sectionName,\n additionalModule,\n category.parent,\n additionalAttribute,\n predicate);\n }\n\n }\n\n /**\n * Using `layout filters`, a data model could overwrite the 'hidden' and 'readonly' states\n * of a given attribute.\n *\n * @param predicate: a function that takes the attribute object as an argument and returns an object as in:\n * {\n * readonly?: boolean\n * hidden?: boolean\n * }\n */\n this.mutateSectionAttribute = function(result, sectionName, attributeName, predicate) {\n\n if (!_.isObject(result)) {\n $log.warn(\"First parameter 'result' is not an object\");\n return;\n }\n\n var attribute = this.attribute(attributeName);\n if (_.isNil(attribute)) {\n $log.warn(\"Attribute '\" + attributeName + \"' is not defined\");\n return;\n }\n\n var attributes = result[sectionName] || [];\n if (_.isFunction(predicate)) {\n var ret = predicate(attribute);\n if (!ret) {\n return;\n } else if (_.isObject(ret)) {\n attribute = _.merge(ret, {\n 'name': attribute.name\n });\n } else {\n attribute = {\n 'name': attribute.name\n };\n }\n\n attribute.isLayoutFilterMutation = true;\n attributes.push(attribute);\n }\n\n result[sectionName] = attributes;\n };\n\n this.hasAttributes = function() {\n return dataModelMap.attributes !== undefined && Object.keys(dataModelMap.attributes).length > 0;\n };\n\n this.hasAttribute = function(attributeName) {\n return dataModelMap.attributes[attributeName] !== undefined || additionalAttributesMap[attributeName] !== undefined;\n };\n\n this.hasAttributeType = function(attributeName, typeName) {\n var attribute = this.attribute(attributeName);\n return !_.isNil(attribute) && attribute.typeName == typeName;\n };\n\n this.attribute = function(attributeName) {\n return dataModelMap.attributes[attributeName] || additionalAttributesMap[attributeName];\n };\n\n this.getMemberAttributes = function(attribute, returnNames) {\n var memberAttributes = [];\n var memberAttributeNames = [];\n\n if (attribute.typeName == \"Collection\") {\n memberAttributeNames = self.attribute(attribute.params.valueAttribute).members;\n } else if (attribute.typeName == \"MultiDimensional\") {\n memberAttributeNames = [].concat(attribute.keyMembers, attribute.valueMembers);\n } else if (attribute.typeName == \"Group\") {\n memberAttributeNames = self.attribute(attribute.params.valueAttribute).members;\n } else if (attribute.typeName == \"MultiReference\") {\n memberAttributeNames = [].concat(\n attribute.params.filter,\n self.attribute(attribute.params.valueAttribute).members\n );\n }\n\n angular.forEach(memberAttributeNames, function(attributeName) {\n memberAttributes.push(self.attribute(attributeName));\n });\n\n if (returnNames) {\n return _.map(memberAttributes, 'name');\n } else {\n return memberAttributes;\n }\n };\n\n this.potentialPrimaryKeyPart = function(attributeName) {\n var attribute = dataModelMap.attributes[attributeName];\n return attribute !== undefined && attribute.params !== undefined && attribute.params.potentialPrimaryKeyPart === true;\n };\n\n this.isMetaAttribute = function(attribute) {\n var attributeName;\n if (angular.isObject(attribute)) {\n attributeName = attribute.name;\n } else {\n attributeName = attribute;\n }\n return attributeName.endsWith('__');\n };\n\n /**\n * Returns all attributes defined in the active data model, i.e. without additional attributes.\n */\n this.allAttributes = function() {\n var attributes = [];\n for ( var attributeName in dataModelMap.attributes) {\n attributes.push(this.attribute(attributeName));\n }\n return attributes;\n };\n\n this.filterPrimaryKeyPartAttributes = function() {\n var attributes = [];\n for (var attribute in dataModelMap.attributes) {\n if (this.potentialPrimaryKeyPart(attribute)) {\n attributes.push(attribute);\n }\n }\n return attributes;\n };\n\n this.attributeIsRemovedInCategory = function(category, attributeName) {\n return category.attribute_status !== undefined && category.attribute_status[attributeName] == 'REMOVED';\n };\n\n this.attributeIsRemovedInSection = function(section, attributeName) {\n return section.attribute_status !== undefined && section.attribute_status[attributeName] == 'REMOVED';\n };\n\n this.hasLayouts = function() {\n return dataModelMap.layouts !== undefined && Object.keys(dataModelMap.layouts).length > 0;\n };\n\n this.hasLayout = function(layoutName, item) {\n return this.layout(layoutName, item) !== undefined;\n };\n\n /**\n * Returns the layout based on the layout mapping and the items category,\n * if an item is given.\n */\n this.layout = function(layoutName, item) {\n var category = item ? item.category__ : undefined,\n mappedLayout = layoutMapping[layoutName],\n resolvedLayoutName;\n\n if (angular.isObject(mappedLayout)) {\n if (angular.isString(category)) {\n resolvedLayoutName = mappedLayout[category] || mappedLayout.default__ || layoutName;\n }\n else {\n resolvedLayoutName = mappedLayout.default__ || layoutName;\n }\n }\n resolvedLayoutName = resolvedLayoutName || layoutMapping[layoutName] || layoutName;\n return dataModelMap.layouts[resolvedLayoutName];\n };\n\n this.layoutAttributes = function(layoutName, item) {\n var layout = this.layout(layoutName, item);\n return layout ? getLayoutAttributesMap(this, layout).attributes : [];\n };\n\n this.layoutAttributeNames = function(layoutName, item) {\n var layout = this.layout(layoutName, item);\n return layout ? getLayoutAttributesMap(this, layout).attributeNames : [];\n };\n\n this.filteredLayoutAttributes = function(layoutName, item) {\n var layout = this.layout(layoutName, item);\n return layout ? getLayoutAttributesMap(this, layout).filteredAttributes : [];\n };\n\n this.filteredLayoutAttributeNames = function(layoutName, item) {\n var layout = this.layout(layoutName, item);\n return layout ? getLayoutAttributesMap(this, layout).filteredAttributeNames : [];\n };\n\n this.sectionAttributes = function(layoutName, item) {\n var layout = this.layout(layoutName, item);\n return layout ? getLayoutSectionsMap(this, layout) : [];\n };\n\n this.sectionAttributeParam = function(layoutName, item, sectionName, attributeName, param) {\n var layout = this.layout(layoutName, item);\n if (!layout) {\n return null;\n }\n var layoutSections = layout.sections.filter(function(section) {\n return section.name == sectionName;\n });\n if (layoutSections.length === 0) {\n return null;\n }\n var attributes = layoutSections[0].attributes.filter(function(attribute) {\n return attribute.name == attributeName;\n });\n if (attributes.length === 0) {\n return null;\n }\n var attribute = attributes[0];\n if (param == 'readonly' && this.isMetaAttribute(attribute)) {\n return true;\n }\n return attribute[param];\n };\n\n /*\n * Returns the attribute param defined in the given section, if the `sectionName` is not provided\n * it returns the attribute param from any section in the layout. This is helpful in places where we don't\n * have actual sections but we have layouts (ex. mass update).\n */\n this.anySectionAttributeParam = function(layoutName, item, sectionName, attributeName, param) {\n\n if (!_.isEmpty(sectionName)) {\n return this.sectionAttributeParam(layoutName, item, sectionName, attributeName, param);\n }\n\n var layout = this.layout(layoutName, item);\n if (!layout) {\n return null;\n }\n\n var attribute, found = false;\n _.forEach(layout.sections, function(section) {\n _.forEach(section.attributes, function(sectionAttribute) {\n if (sectionAttribute.name === attributeName) {\n found = true;\n attribute = sectionAttribute;\n return false;\n }\n });\n\n if (found) {\n return false;\n }\n });\n\n if (_.isNil(attribute)) {\n return null;\n }\n\n if (param == 'readonly' && this.isMetaAttribute(attribute)) {\n return true;\n }\n return attribute ? attribute[param] : null ;\n };\n\n this.hasCategories = function() {\n return dataModelMap.categories !== undefined && Object.keys(dataModelMap.categories).length > 0;\n };\n\n this.hasCategory = function(categoryName, showDeleted) {\n return dataModelMap.categories[categoryName] !== undefined && (showDeleted || dataModelMap.categories[categoryName].modification_status !== 'DELETED');\n };\n\n this.category = function(categoryName) {\n return dataModelMap.categories[categoryName];\n };\n\n /**\n * Returns all categories defined in the active data model, i.e. without additional categories.\n */\n this.allCategories = function(showDeleted) {\n var categories = [];\n for ( var categoryName in dataModelMap.categories) {\n var category = this.category(categoryName);\n if (!category.hidden && category.label &&\n (showDeleted || category.modification_status != 'DELETED')) {\n categories.push(category);\n }\n }\n return categories;\n };\n\n this.categoryAttributes = function(categoryName) {\n return this.hasCategory(categoryName) ? getCategoryAttributesMap(this,\n categoryName).attributes : [];\n };\n\n this.categoryAttributeNames = function(categoryName) {\n return this.hasCategory(categoryName) ? getCategoryAttributesMap(this,\n categoryName).attributeNames : [];\n };\n\n this.categoryHasAttribute = function(categoryName, attributeName) {\n var categoryAttributeNames = this.categoryAttributeNames(categoryName);\n return categoryAttributeNames.includes(attributeName);\n };\n\n this.attributeHasCategory = function(attributeName) {\n var allCategories = this.allCategories();\n var attributeInCategory;\n\n attributeInCategory = allCategories.filter(function(element) {\n return element.attributes.contains(attributeName);\n })[0];\n\n return attributeInCategory !== undefined;\n };\n\n /**\n * Returns a list of layout sections for the specified layout where only\n * those attributes are retained which belong to the specified item's category.\n * Additionally the resulting layout sections will hold attribute objects.\n */\n this.filteredSections = function(layout, item, additionalSectionAttributes) {\n\n var categoryName = item.category__;\n var category = this.category(categoryName);\n layout = _.isObject(layout) ? layout : this.layout(layout, item);\n if (!layout || !category) {\n return [];\n }\n\n var attributeNames = this.categoryAttributeNames(category.name);\n var layoutSections = getLayoutSectionsMap(this, layout);\n\n // Filter out sections which are deleted, and remove attributes which are not in the category\n var dataModel = this;\n var filteredSections = layoutSections\n .filter(function(section) {\n return section.modification_status !== 'DELETED';\n })\n .map(function (section) {\n return filterSection(dataModel,\n category,\n layout,\n section,\n attributeNames,\n additionalSectionAttributes);\n });\n return filteredSections;\n };\n\n function filterSection(dataModel, category, layout, section, attributeNames, additionalSectionAttributes) {\n\n // Filter out attributes which are not in the category, or are removed in either category or section\n var filteredSection = angular.copy(section);\n filteredSection.attributes = section.attributes.filter(function(attribute) {\n return attributeNames.contains(attribute.name) &&\n !dataModel.attributeIsRemovedInCategory(category, attribute.name) &&\n !dataModel.attributeIsRemovedInSection(section, attribute.name);\n });\n\n // Add additional attributes for the section\n if (additionalSectionAttributes && section.name) {\n var sectionAttributes = additionalSectionAttributes[section.name] || additionalSectionAttributes[section.name.toLowerCase()];\n if (sectionAttributes) {\n angular.forEach(sectionAttributes, function(sectionAttribute) {\n\n var attributeName = angular.isObject(sectionAttribute) ? sectionAttribute.name : sectionAttribute;\n var attribute = dataModel.attribute(attributeName);\n if (!attribute) {\n $log.warn(\"Unknown additional attribute '\" + attributeName + \"' in section '\" + section.name + \"'\");\n return;\n }\n\n // Add flags, if specified\n if (angular.isObject(sectionAttribute) && Object.keys(sectionAttribute).length > 1) {\n attribute = angular.copy(attribute);\n attribute.additionalParams = {};\n angular.forEach(sectionAttribute, function(paramValue, paramName) {\n if (paramName != 'name') {\n attribute.additionalParams[paramName] = paramValue;\n }\n });\n }\n\n if (!sectionAttribute.isLayoutFilterMutation) {\n // In case of additional section attributes, we\n // remove the attribute first, so it keeps the correct position relative to the other additional attributes\n filteredSection.attributes = filteredSection.attributes.filter(function(a) {\n return a.name != attributeName;\n });\n filteredSection.attributes.push(attribute);\n\n } else {\n // In case we only want to update/mutate the attribute definition in the item editor, then we\n // replace the attribute in the section\n filteredSection.attributes = filteredSection.attributes.map(function(a) {\n if (a.name === attributeName ) {\n return attribute;\n }\n\n return a;\n });\n }\n\n });\n }\n }\n\n return filteredSection;\n }\n\n /**\n * Returns the QueryParser for a layout.\n */\n this.queryParser = function(layoutName) {\n\n if (queryParsersMap[layoutName] === undefined) {\n\n var attributesByName = {};\n var attributes = this.layoutAttributes(layoutName);\n for (var i = 0; i < attributes.length; i++) {\n var attribute = attributes[i];\n attributesByName[attribute.name] = attribute;\n }\n\n queryParsersMap[layoutName] =\n new QueryParser(attributesByName,\n EnumAttributeService,\n $log,\n $translate);\n\n }\n\n return queryParsersMap[layoutName];\n };\n\n /**\n * Returns the custom filter defined in the data model's customDirectives.\n */\n this.getCustomFilter = function(filterName) {\n // FIXME\n };\n\n /**\n * Returns the custom filter defined in the data model's customDirectives for multi/single reference attributes.\n */\n this.getUiReferenceFilter = function(filterName) {\n // FIXME\n };\n\n function getLayoutSectionsMap(dataModel, layout) {\n\n if (layoutSectionsMap[layout.name] === undefined) {\n\n var layoutSections;\n\n // Sort sections by layout sort order\n if (layout.sort_order) {\n\n layoutSections = layout.sort_order.map(function(sortSectionName) {\n var filteredSections = layout.sections.filter(function(section) {\n return section.name == sortSectionName;\n });\n if (filteredSections.length === 0) {\n $log.warn(\"Could not find section \" +\n sortSectionName +\n \" from sort order in layout \" +\n layout.name);\n } else {\n return filteredSections[0];\n }\n });\n\n // FIXME: What about sections which are NOT in sort_order?\n\n } else {\n layoutSections = layout.sections;\n }\n\n // Make a deep copy of all sections, because we will make changes to them\n layoutSections = angular.copy(layoutSections);\n\n // Sort attributes in sections by section sort order and replace with complete attribute object\n _.forEach(layoutSections, function(section) {\n\n if (section.sort_order && section.sort_order.length > 0) {\n\n var sortedAttributes = section.sort_order.map(function(sortAttributeName) {\n var filteredAttributes = section.attributes.filter(function(attribute) {\n return attribute.name == sortAttributeName;\n });\n if (filteredAttributes.length === 0) {\n $log(\"Could not find attribute \" +\n sortAttributeName +\n \" from sort order in section \" +\n section.name +\n \" of layout \" +\n layout.name);\n } else {\n return filteredAttributes[0];\n }\n });\n\n // Add attributes which are not in sort_order\n sortedAttributes.concat(section.attributes.filter(function(attribute) {\n return !section.sort_order.contains(attribute.name);\n }));\n\n section.attributes = sortedAttributes;\n\n }\n\n // Replace simple attribute with complete attribute object and filter out non-existing attributes\n section.attributes = section.attributes.map(function(attribute) {\n return dataModel.attribute(attribute.name);\n }).filter(function(attribute) {\n return attribute !== undefined;\n });\n\n });\n\n layoutSectionsMap[layout.name] = layoutSections;\n\n }\n\n return layoutSectionsMap[layout.name];\n }\n\n function getLayoutAttributesMap(dataModel, layout) {\n\n if (layoutAttributesMap[layout.name] === undefined) {\n\n var layoutAttributes = [];\n var layoutAttributeNames = [];\n var filteredAttributes = [];\n var filteredAttributeNames = [];\n var attribute;\n\n var sections = getLayoutSectionsMap(dataModel, layout);\n for (var i = 0; i < sections.length; i++) {\n var section = sections[i];\n var attributes = section.attributes;\n for (var j = 0; j < attributes.length; j++) {\n attribute = attributes[j];\n layoutAttributes.push(attribute);\n layoutAttributeNames.push(attribute.name);\n if (!dataModel.attributeIsRemovedInSection(section, attribute.name)) {\n filteredAttributes.push(attribute);\n filteredAttributeNames.push(attribute.name);\n }\n }\n }\n\n layoutAttributesMap[layout.name] = {\n attributes: layoutAttributes,\n attributeNames: layoutAttributeNames,\n filteredAttributes: filteredAttributes,\n filteredAttributeNames: filteredAttributeNames\n };\n\n }\n\n return layoutAttributesMap[layout.name];\n }\n\n function getCategoryAttributesMap(dataModel, categoryName) {\n\n if (categoryAttributesMap[categoryName] === undefined) {\n\n var categoryAttributes = [];\n var categoryAttributeNames = [];\n\n var category = dataModel.category(categoryName);\n if (category === undefined) {\n $log.warn(\"Unknown category \" + categoryName);\n } else {\n\n for (var i = 0; i < category.attributes.length; i++) {\n var attributeName = category.attributes[i];\n var attribute = dataModel.attribute(attributeName);\n if (attribute === undefined) {\n $log.warn(\"Unknown attribute \" + attributeName +\n \" in category \" + category.name);\n } else {\n categoryAttributes.push(attribute);\n categoryAttributeNames.push(attributeName);\n }\n }\n\n }\n\n categoryAttributesMap[category.name] = {\n attributes: categoryAttributes,\n attributeNames: categoryAttributeNames\n };\n\n }\n\n return categoryAttributesMap[categoryName];\n }\n\n function getOptionListCacheKey(optionListName) {\n return 'dataModel.optionList.' + optionListName;\n }\n\n function getCachedOptionListAsync(optionListName, dataModelHash) {\n return LocalCacheService.waitForDBInitialization().then(function() {\n return LocalCacheService.getEntryAsync(\n LocalCacheService.STORES.optionLists.objectStoreName,\n [ optionListName, dataModelHash ]);\n });\n }\n\n function insertCachedOptionListAsync(optionListName, optionList) {\n return LocalCacheService.waitForDBInitialization().then(function() {\n return LocalCacheService.insertEntryAsync(\n LocalCacheService.STORES.optionLists.objectStoreName,\n optionListName,\n optionList);\n });\n }\n\n function deleteCachedOptionListAsync(optionListName) {\n return LocalCacheService.waitForDBInitialization().then(function() {\n return LocalCacheService.deleteEntriesByIndexAsync(\n LocalCacheService.STORES.optionLists.objectStoreName,\n LocalCacheService.STORES.optionLists.indexes.optionListName,\n optionListName);\n });\n }\n\n function fetchAndCacheOptionListAsync(optionList, dataModelHash, groupNames, cacheKey) {\n\n var deferred = $q.defer();\n\n // Create and attach empty options array\n options = [];\n optionList.options = [];\n optionList.optionsLoaded = false;\n\n // Save the promise\n optionList.optionsLoadingPromise = DataModelResource().getOptionListOptions({\n optionListName: optionList.name,\n serviceName: optionList.serviceName\n }, {},\n function(response) {\n\n _.forEach(response, function(option) {\n optionList.options.push({\n name: option.name,\n serviceName: option.serviceName || '',\n key: option.name,\n value: option.label,\n label: option.label,\n labels: option.labels,\n icon: option.icon,\n icons: option.icons,\n groups: option.groups\n });\n });\n $log.debug(\"Loaded \" + optionList.options.length + \" option(s) for option list '\" + optionList.name + \"' from server\");\n\n // Cache options\n cachedOptionList = {\n name: getOptionListCacheKey(optionList.name),\n dataModelHash: dataModelHash,\n options: optionList.options\n };\n\n insertCachedOptionListAsync(cacheKey, cachedOptionList)\n .then(function() {\n $log.debug(\"Stored option(s) for option list '\" + optionList.name + \"' in local cache\");\n })\n .catch(function(error) {\n $log.error(\"Could not store option(s) for option list '\" + optionList.name + \"' in local cache\");\n });\n\n // Add matching option list options to options array\n addMatchingOptions(optionList.options, options, groupNames);\n\n deferred.resolve(options);\n\n }, function(responseError) {\n $log.error(responseError);\n optionList.error = responseError;\n deferred.reject();\n }).$promise;\n\n return deferred.promise;\n }\n\n this.getCachedAdditionalCategory = function(additionalCategoryNameOrCode, additionalModuleName, dataModelHash) {\n return LocalCacheService.waitForDBInitialization().then(function() {\n return LocalCacheService.getEntryAsync(\n LocalCacheService.STORES.additionalCategories.objectStoreName,\n [ additionalModuleName, additionalCategoryNameOrCode, dataModelHash ]);\n });\n };\n\n this.insertCachedAdditionalCategory = function(additionalCategoryNameOrCode, additionalModuleName, dataModelHash, additionalCategory) {\n return LocalCacheService.waitForDBInitialization().then(function() {\n return LocalCacheService.insertEntryAsync(\n LocalCacheService.STORES.additionalCategories.objectStoreName,\n [ additionalModuleName, additionalCategoryNameOrCode, dataModelHash ],\n additionalCategory);\n });\n };\n\n this.deleteCachedAdditionalCategory = function(additionalCategoryNameOrCode, additionalModuleName) {\n return LocalCacheService.waitForDBInitialization().then(function() {\n return LocalCacheService.deleteEntriesByIndexAsync(\n LocalCacheService.STORES.additionalCategories.objectStoreName,\n LocalCacheService.STORES.additionalCategories.indexes.additionalCategoryNameOrCode,\n additionalCategoryNameOrCode);\n });\n };\n\n}\n","function QueryParser(attributesMap_, EnumAttributeService, $log, $translate) {\n\n var translate = $translate.instant;\n\n var attributesByName = {};\n var attributesByLabel = {};\n\n function init(attributesMap) {\n\n var key, label;\n\n for (var attributeName in attributesMap) {\n\n var attribute = attributesMap[attributeName];\n if (_.isEmpty(attribute)) {\n continue;\n }\n attribute = angular.copy(attribute);\n attributesByName[attribute.name] = attribute;\n\n // Locale translation is preferred, so only add default label, if it does not exist yet!\n label = attribute.label;\n if (!_.isEmpty(label) && !_.has(attributesByLabel, label.toLocaleLowerCase())) {\n attributesByLabel[label.toLocaleLowerCase()] = attribute;\n }\n\n key = \"attribute.\" + attribute.name;\n label = translate(key);\n if (label !== key) {\n attributesByLabel[label.toLocaleLowerCase()] = attribute;\n }\n\n loadAttributeOptionsAsync(attribute);\n }\n\n }\n init(attributesMap_);\n\n function transformAttributeName(attributeNameOrLabel) {\n if (_.isEmpty(attributeNameOrLabel)) {\n return attributeNameOrLabel;\n }\n attributeNameOrLabel = _.trim(attributeNameOrLabel);\n var attribute = _.find(attributesByName, ['name', attributeNameOrLabel]);\n if (_.isEmpty(attribute)) {\n attribute = _.find(attributesByLabel, ['label', attributeNameOrLabel]);\n }\n if (_.isEmpty(attribute)) {\n attribute = _.find(attributesByName, ['name', attributeNameOrLabel.toLocaleLowerCase()]);\n }\n if (_.isEmpty(attribute)) {\n attribute = attributesByLabel[attributeNameOrLabel.toLocaleLowerCase()];\n }\n\n var result = !_.isEmpty(attribute) ? attribute.name : attributeNameOrLabel;\n\n return result;\n }\n\n function transformValue(attribute, value) {\n\n if (_.isEmpty(attribute) || _.isEmpty(attribute.optionsByLabel)) {\n return value;\n }\n\n value = _.trim(value);\n\n var option = attribute.optionsByLabel[value];\n var result = value;\n\n if (_.isEmpty(option)) {\n option = attribute.optionsByLabel[value.toLocaleLowerCase()];\n }\n if (!_.isEmpty(option)) {\n result = option;\n }\n return result;\n }\n\n this.isLegal = function(query) {\n\n if (_.isEmpty(query)) {\n return true;\n }\n\n var illegalQueryStartRegExp = /^\\s*((AND|OR)\\s+|:|=|,|\\))/;\n if (query.search(illegalQueryStartRegExp) >= 0) {\n return false;\n }\n var illegalQueryEndRegExp = /(\\s+(AND|OR)|:|=|,|\\()\\s*$/;\n if (query.search(illegalQueryEndRegExp) >= 0) {\n return false;\n }\n\n return true;\n };\n\n this.parseQuery = function(query) {\n\n if (_.isEmpty(query)) {\n return query;\n }\n\n // Remove all surplus spaces\n query = query.replace(/\\s+(?= )/g, '');\n\n // Construct new query\n var result = \"\";\n\n // Split the query into terms\n var queryTerms = query.split(/\\s+(AND|OR)\\s+|(\\(|\\))/);\n for (var i = 0; i < queryTerms.length; i++) {\n\n var queryTerm = queryTerms[i];\n if (queryTerm === 'AND' || queryTerm === 'OR') {\n result += ' ' + queryTerm + ' ';\n continue;\n } else if (queryTerm === '(' || queryTerm === ')') {\n result += queryTerm;\n continue;\n } else if (_.isEmpty(queryTerm)) {\n continue;\n }\n\n // Find attributeName, dimension, operator and value parts\n var searchRegExp = /^([^<>=:\\[]+)(\\[[^<>=:]*\\])?\\s?(<|>|<=|>=|=|:)\\s?([^<>=]+)$/;\n var searchResult = searchRegExp.exec(queryTerm);\n if (searchResult === null) {\n result += queryTerm;\n continue;\n }\n\n var fullMatch = searchResult[0];\n var attributeName = _.trim(searchResult[1]);\n var dimension = _.trim(_.defaultTo(searchResult[2], \"\"));\n var operator = _.trim(searchResult[3]);\n var value = _.trim(searchResult[4]);\n\n if (operator === '=') {\n operator = ':';\n }\n\n attributeName = transformAttributeName(attributeName);\n var attribute = attributesByName[attributeName];\n if (!_.isEmpty(attribute)) {\n value = transformValue(attribute, value);\n }\n\n var newPart = attributeName + dimension + operator + value;\n result += newPart;\n\n }\n\n return result;\n };\n\n function loadAttributeOptionsAsync(attribute) {\n return EnumAttributeService.getAttributeOptionsAsync(attribute)\n .then(function(options) {\n\n if (_.isEmpty(options)) {\n return;\n }\n\n var optionsByLabel = {};\n var key, label;\n for (var i = 0; i < options.length; i++) {\n\n var option = options[i];\n\n // Locale translation is preferred, so only add default label, if it does not exist yet!\n label = option.value;\n if (!_.isEmpty(label) && !_.has(optionsByLabel, label.toLocaleLowerCase())) {\n optionsByLabel[label.toLocaleLowerCase()] = option.key;\n }\n\n key = \"attribute.\" + attribute.name + \".option.\" + option.key;\n label = translate(key);\n if (label === key) {\n key = \"option.\" + option.key;\n label = translate(key);\n }\n if (label !== key) {\n optionsByLabel[label.toLocaleLowerCase()] = option.key;\n }\n\n }\n attribute.optionsByLabel = optionsByLabel;\n })\n .catch(function(error) {\n $log.error('QueryParser: Could not load options for', attribute);\n });\n }\n\n}\n\n","\nnavigator.sendBeacon = navigator.sendBeacon || function (url, data) {\n var xhr = new XMLHttpRequest();\n xhr.open('POST', url, false);\n xhr.send(data);\n};\n\nif (typeof String.prototype.startsWith != 'function') {\n String.prototype.startsWith = function (str) {\n return this.slice(0, str.length) == str;\n };\n}\n\nif (typeof String.prototype.endsWith != 'function') {\n String.prototype.endsWith = function (str) {\n return this.indexOf(str, this.length - str.length) !== -1;\n };\n}\n\nString.prototype.camelCase = function(capitalizeFirstLetter) {\n var str = capitalizeFirstLetter ? this.substr(0,1).toUpperCase() + this.substr(1).toLowerCase() : this.toLowerCase();\n return str.replace(/\\s+(.)/g, function(mtch, grp) {\n return grp.toUpperCase();\n });\n};\n\nArray.prototype.contains = function(obj) {\n var i = this.length;\n while (i--) {\n if (this[i] === obj) {\n return true;\n }\n }\n return false;\n};\n\nArray.prototype.addToSet = function(value) {\n var index = this.indexOf(value);\n if (index == -1) {\n this.push(value);\n return true;\n } else {\n return false;\n }\n};\nArray.prototype.removeFromSet = function(value) {\n var index = this.indexOf(value);\n if (index > -1) {\n this.splice(index, 1);\n return true;\n } else {\n return false;\n }\n};\nArray.prototype.removeByContent = Array.prototype.removeFromSet;\n\nArray.prototype.diff = function(a) {\n return this.filter(function(i) {\n return a.indexOf(i) < 0;\n });\n};\n\nif (typeof Object.keys != 'function') {\n Object.keys = function(o) {\n if (o !== Object(o)) {\n throw new TypeError('Object.keys called on a non-object');\n }\n var k = [];\n for (var p in o) {\n if (Object.prototype.hasOwnProperty.call(o, p)) {\n k.push(p);\n }\n }\n return k;\n };\n}\n\nfunction setCookie(name, value) {\n var c_name = diffEscape(name);\n var c_date = new Date();\n c_date.setDate(c_date.getDate() + 365);\n var c_value = diffEscape(value) + \"; expires=\" + c_date.toUTCString();\n document.cookie = c_name + \"=\" + c_value;\n}\n\nfunction getCookie(c_name) {\n var c_value = document.cookie;\n var c_start = c_value.indexOf(\" \" + c_name + \"=\");\n if (c_start == -1) {\n c_start = c_value.indexOf(c_name + \"=\");\n }\n if (c_start == -1) {\n c_value = null;\n } else {\n c_start = c_value.indexOf(\"=\", c_start) + 1;\n var c_end = c_value.indexOf(\";\", c_start);\n if (c_end == -1) {\n c_end = c_value.length;\n }\n c_value = unescape(c_value.substring(c_start, c_end));\n }\n return c_value;\n}\n\nfunction applyDefaults(object, source, guard) {\n\n var objectTypes = {\n 'boolean': false,\n 'function': true,\n 'object': true,\n 'number': false,\n 'string': false,\n 'undefined': false\n };\n\n var index, iterable = object,\n result = iterable;\n if (!iterable) return result;\n var args = arguments,\n argsIndex = 0,\n argsLength = typeof guard == 'number' ? 2 : args.length;\n while (++argsIndex < argsLength) {\n iterable = args[argsIndex];\n if (iterable && objectTypes[typeof iterable]) {\n var ownIndex = -1,\n ownProps = objectTypes[typeof iterable] && Object.keys(iterable),\n length = ownProps ? ownProps.length : 0;\n\n while (++ownIndex < length) {\n index = ownProps[ownIndex];\n if (typeof result[index] == 'undefined') result[index] = iterable[index];\n }\n }\n }\n return result;\n}\n\nfunction lax_rest_url(s) { return \"//\" + window.location.host + \"/api/v1/\" + s; }\nfunction lax_rest_url_escaped(s) { return \"//\" + window.location.host.replace(\":\", \"\\\\:\") + \"/api/v1/\" + s; }\nfunction lax_rest_url_complete(s) { return window.location.protocol + \"//\" + window.location.host + \"/api/v1/\" + s; }\nfunction lax_base_url_escaped(s) { return \"//\" + window.location.host.replace(\":\", \"\\\\:\") + \"/\" + s; }\n\n/* BEGIN CKEDITOR placeholder functions */\nfunction removeAllOptions(combo) {\n combo = getSelect(combo);\n while (combo.getChild(0) && combo.getChild(0).remove()) { /*jsl:pass*/\n }\n}\n\nfunction getSelect(obj) {\n if (obj && obj.domId && obj.getInputElement().$) // Dialog element.\n return obj.getInputElement();\n else if (obj && obj.$)\n return obj;\n return false;\n}\n\nfunction addOption(combo, optionText, optionValue, documentObject, index) {\n combo = getSelect(combo);\n var oOption;\n if (documentObject)\n oOption = documentObject.createElement(\"OPTION\");\n else\n oOption = document.createElement(\"OPTION\");\n\n if (combo && oOption && oOption.getName() == 'option') {\n if (CKEDITOR.env.ie) {\n if (!isNaN(parseInt(index, 10)))\n combo.$.options.add(oOption.$, index);\n else\n combo.$.options.add(oOption.$);\n\n oOption.$.innerHTML = optionText.length > 0 ? optionText : '';\n oOption.$.value = optionValue;\n } else {\n if (index !== null && index < combo.getChildCount())\n combo.getChild(index < 0 ? 0 : index).insertBeforeMe(oOption);\n else\n combo.append(oOption);\n\n oOption.setText(optionText.length > 0 ? optionText : '');\n oOption.setValue(optionValue);\n }\n } else\n return false;\n\n return oOption;\n}\n/* END CKEDITOR placeholder functions */\n\nfunction decodeHtml(html) {\n if (!html || typeof html !== 'string') {\n return html;\n } else {\n var mapObj = {\n '<':\"<\",\n '>':\">\"\n };\n html = html.replace(/<|>/gi, function(matched){\n return mapObj[matched];\n });\n return html;\n }\n}\n","(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('APICodelist',\n '
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('APISelect',\n '{{$select.selected.title}} {{$select.selected.id}}
{{result.id}}
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('AdditionalCategory',\n '
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Boolean',\n '
0\" data-ng-repeat=\"option in options\" data-lax-focus-on=\"{{::a.name}}\">
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Category',\n '
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('CheckBox',\n '');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Collection',\n '

{{::a.label}}

\"loading..\"
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Date',\n '
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('DateTime',\n '
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Decimal',\n '');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Dimensional',\n '
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Document',\n '
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Enum',\n '   ');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('EnumSet',\n '
 
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Float',\n '');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Grid-Editable-EnumSetType',\n '
0\" data-ng-model=\"MODEL_COL_FIELD\" data-append-to-body=\"true\" data-autofocus=\"true\" data-theme=\"bootstrap\" data-lax-grid-ui-select data-multiple class=\"ui-grid-ui-select\">  
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Grid-Editable-EnumType',\n '
 
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Grid-EnumType',\n '
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Grid-SingleBoolean',\n '
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Group',\n '
0 || hasLocalValidationErrors(a, $parent.model), \\'group-title-warning\\': groupWarningCount > 0, \\'group-even\\': groupEven(a), \\'group-odd\\': !groupEven(a)}\"> {{$index+1}} / {{item[a.name].length}} 0 || groupWarningCount > 0\" tooltip-placement=\"right\" tooltip-append-to-body=\"true\" tooltip-html-unsafe=\"{{getGroupValidationMessages(a, $parent.$id, $parent.$parent.$parent.$parent.$id, $index)}}\"> 0\">{{groupErrorCount}} 0\">{{groupWarningCount}}
{{validationEntry.translatedMessage}}
{{validationEntry.translatedMessage}}
{{validationEntry.translatedMessage}}
{{error}}
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('HTMLDimensional',\n '
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('HTMLInput',\n '
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Image',\n '
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Integer',\n '');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('MultiDimensional',\n '

{{::a.label}}

\"loading..\"
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('MultiLineDimensional',\n '
{{getStringLengthMessage(item[a.name][selectedDimension.key].length, a.params.length)}}
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('MultiReference',\n '

{{::a.label}}

ADD_ITEM

');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('NumberRangeSelect',\n '');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Password',\n '');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('Physical',\n '');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('SingleBoolean',\n '
0\">
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('SingleReference',\n '
= 3 && temporaryWarningsForTypeahead[a.name]\" class=\"validation validation-warning\">validationmessage.keys
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('String',\n '
{{getStringLengthMessage(item[a.name].length, a.params.length)}}
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('TextArea',\n '
{{getStringLengthMessage(item[a.name].length, a.params.length)}}
');\n}]);\n})();\n\n(function(module) {\ntry {\n module = angular.module('llax.templates');\n} catch (e) {\n module = angular.module('llax.templates', []);\n}\nmodule.run(['$templateCache', function($templateCache) {\n $templateCache.put('details/GroupDetail',\n '
 {{::a.name}} {{$index+1}}
');\n}]);\n})();\n","angular.module('llax.routes', [])\n .provider(\"Routes\", function() {\n return {\n $get: function() {\n return [{\n url: '/_features',\n templateUrl: 'tpl/blank.tpl.html',\n controller: 'FeatureToggleCtrl'\n }, {\n url: '/admin-settings',\n templateUrl: 'tpl/admin-settings.tpl.html',\n controller: 'AdminSettingsController',\n rights: [\"view.adminsettings\"]\n }, {\n url: '/answer-request/:requestId',\n templateUrl: 'tpl/request-from-supplier.tpl.html',\n controller: 'RequestsController',\n rights: [\"view.requestsforinformation\"]\n }, {\n urls: [\n \"/browse\",\n \"/compare/:firstPrimaryKey*?/:secondPrimaryKey*?\"\n ],\n templateUrl: 'tpl/browse.tpl.html',\n controller: 'ItemsController',\n dependencies: [lax_rest_url(\"datamodel/customDirectives.js\")],\n rights: [\"view.browse\"],\n reloadOnSearch: false\n }, {\n urls: [\n \"/edit/:primaryKey*?/attribute/:attribute?\",\n \"/edit/:primaryKey*?/section/:section?\",\n \"/edit/:primaryKey*?\"\n ],\n templateUrl: 'tpl/browse.tpl.html',\n controller: 'ItemsController',\n dependencies: [lax_rest_url(\"datamodel/customDirectives.js\")],\n //rights: [\"edit.items\"]\n }, {\n urls: [\n \"/copy/:primaryKey*?\",\n \"/copy/:primaryKey*?/section/:section?\",\n \"/copy/:primaryKey*?/attribute/:attribute?\"\n ],\n templateUrl: 'tpl/browse.tpl.html',\n controller: 'ItemsController',\n dependencies: [lax_rest_url(\"datamodel/customDirectives.js\")],\n rights: [\"copy.items\"]\n }, {\n url: \"/catalog\",\n templateUrl: 'tpl/catalog.tpl.html',\n controller: 'CatalogController',\n dependencies: [lax_rest_url(\"datamodel/customDirectives.js\")],\n rights: [\"view.catalog\"],\n reloadOnSearch: false\n }, {\n url: \"/codelist-editor\",\n templateUrl: 'tpl/codelist_editor.tpl.html',\n controller: 'CodelistEditorController',\n rights: [\"view.datamodelcustomization\"]\n }, {\n urls: [\n \"/communicationchannels\",\n \"/communicationchannels/:id?\",\n \"/communicationchannels/:id?/subscriptions\"\n ],\n templateUrl: 'tpl/communicationchannels.tpl.html',\n controller: 'CommunicationChannelsController',\n rights: [\"view.communicationchannels\"]\n }, {\n url: '/confirm/:key/:opaque',\n templateUrl: 'tpl/confirm.tpl.html',\n controller: 'ConfirmationController',\n insecure: true\n }, {\n url: \"/contacts\",\n templateUrl: 'tpl/contacts.tpl.html',\n controller: 'ContactsController',\n rights: [\"view.contacts\"]\n }, {\n url: '/customization',\n templateUrl: 'tpl/datamodel-customization.tpl.html',\n controller: 'DataModelCustomizationController',\n rights: [\"view.datamodelcustomization\"]\n }, {\n urls: [\n \"/dashboard\",\n \"/\"\n ],\n templateUrl: 'tpl/dashboard.tpl.html',\n controller: 'DashboardController',\n dependencies: [lax_rest_url(\"datamodel/customDirectives.js\")],\n rights: [\"view.dashboard\"],\n reloadOnSearch: false\n }, {\n url: \"/datamodelexchange\",\n templateUrl: 'tpl/datamodelexchange.tpl.html',\n controller: 'DataModelExchangeController',\n rights: [\"view.datamodelexchange\"],\n organizationRolesDenied: [\"INVITED_BUYER\", \"INVITED_SUPPLIER\"]\n }, {\n url: '/items/detail/:primaryKey*',\n templateUrl: 'tpl/react.tpl.html',\n controller: [\"ReactBridge\", function(ReactBridge) {\n ReactBridge.mountComponent('ItemDetailsPage', '.react-node');\n }],\n dependencies: [lax_rest_url(\"datamodel/customDirectives.js\")],\n rights: [\"view.itemdetails\"]\n }, {\n url: '/exports',\n templateUrl: 'tpl/react.tpl.html',\n controller: [\"ReactBridge\", function(ReactBridge) {\n ReactBridge.mountPage('ExportPage', '.react-node');\n }],\n rights: [\"view.exports\"]\n }, {\n url: \"/enhanced-content\",\n templateUrl: 'tpl/react.tpl.html',\n controller: [\"ReactBridge\", function(ReactBridge) {\n ReactBridge.mountPage('EnhancedContentPage', '.react-node');\n }],\n settingFeature: 'ENHANCED_CONTENT'\n }, {\n url: '/key-value-maps',\n templateUrl: 'tpl/key-value-maps.tpl.html',\n controller: 'KeyValueMapsController',\n rights: [\"view.datamodelcustomization\"]\n }, {\n url: '/reports',\n templateUrl: 'tpl/reports.tpl.html',\n controller: 'ReportsController',\n rights: [\"view.exports\"]\n }, {\n url: '/login',\n templateUrl: 'tpl/login.tpl.html',\n controller: 'SessionsController',\n insecure: true\n }, {\n url: \"/monitor\",\n templateUrl: 'tpl/react.tpl.html',\n controller: [\"ReactBridge\", function(ReactBridge) {\n ReactBridge.mountPage('MonitorPage', '.react-node');\n }],\n rights: [\"view.monitoring\"]\n }, {\n url: \"/orders\",\n templateUrl: 'tpl/orders.tpl.html',\n controller: 'OrdersController',\n rights: [\"view.shoppingcart\"]\n }, {\n url: '/orders/detail/:orderId',\n templateUrl: 'tpl/orders-detail.tpl.html',\n controller: 'OrderController',\n rights: [\"view.shoppingcart\"]\n }, {\n url: \"/organization\",\n templateUrl: 'tpl/organization.tpl.html',\n controller: 'OrganizationsController',\n rights: [\"view.organizationdata\"]\n }, {\n url: \"/profile\",\n templateUrl: 'tpl/billing-prices.tpl.html',\n controller: 'BillingSignupController',\n rights: [\"view.billing\"]\n }, {\n url: \"/profile/signupsuccess\",\n templateUrl: 'tpl/signup-callback-received.tpl.html',\n controller: 'BillingCallbackController',\n rights: [\"view.billing\"]\n }, {\n url: \"/profile/upgrade\",\n templateUrl: 'tpl/billing-signup.tpl.html',\n controller: 'BillingSignupController',\n rights: [\"view.billing\"]\n },\n {\n url: \"/publications\",\n templateUrl: 'tpl/publications.tpl.html',\n controller: [\"ReactBridge\", function (ReactBridge) {\n ReactBridge.mountComponent(\"ExecutedPublication\", \"#react-executed-publications\");\n }],\n rights: [\"publish.items\"],\n },\n {\n url: '/received-requests',\n templateUrl: 'tpl/received-requests.tpl.html',\n controller: 'ReceivedRequestInformationsController',\n rights: [\"view.requestsforinformation\"]\n }, {\n url: '/register',\n templateUrl: 'tpl/register/register.tpl.html',\n controller: 'RegistrationController',\n insecure: true\n }, {\n url: '/request-information',\n templateUrl: 'tpl/send-request.tpl.html',\n controller: 'SendRequestsController',\n rights: [\"view.requestsforinformation\"]\n }, {\n url: '/revalidateAccount',\n templateUrl: 'tpl/login.tpl.html',\n controller: 'SessionsController',\n insecure: true\n }, {\n url: '/resetpassword/confirm/:key/:opaque',\n templateUrl: 'tpl/confirm-reset-password.tpl.html',\n controller: 'ResetPasswordController',\n insecure: true\n }, {\n url: '/sent-requests',\n templateUrl: 'tpl/sent-requests.tpl.html',\n controller: 'SentRequestsController',\n rights: [\"view.requestsforinformation\"]\n }, {\n url: \"/shopping-cart\",\n templateUrl: 'tpl/shopping-cart.tpl.html',\n controller: 'ShoppingCartController',\n rights: [\"view.shoppingcart\"]\n }, {\n url: \"/support\",\n templateUrl: 'tpl/blank.tpl.html',\n controller: 'SupportCtrl'\n }, {\n urls: [\n \"/tasks\",\n \"/tasks/new\"\n ],\n templateUrl: 'tpl/tasklists.tpl.html',\n controller: 'TaskListController',\n rights: [\"view.tasks\"],\n dependencies: [lax_rest_url(\"datamodel/customDirectives.js\")],\n licensedFeature: 'TASKS',\n reloadOnSearch: false\n }, {\n url: \"/tasks/edit/:taskId\",\n templateUrl: 'tpl/tasks-edit-task.tpl.html',\n controller: 'EditTaskController',\n rights: [\"view.tasks\"],\n dependencies: [lax_rest_url(\"datamodel/customDirectives.js\")]\n }, {\n url: \"/upload\",\n templateUrl: 'tpl/upload.tpl.html',\n controller: 'UploadsController',\n rights: [\"view.upload\"]\n }, {\n url: \"/user\",\n templateUrl: 'tpl/user.tpl.html',\n controller: 'UsersController',\n rights: [\"view.userdetails\"]\n }, {\n url: \"/user-management\",\n templateUrl: 'tpl/user-management.tpl.html',\n controller: 'UserManagementController',\n rights: [\"view.usermanagement\"]\n }, {\n url: \"/user-groups\",\n templateUrl: 'tpl/user-groups.tpl.html',\n controller: 'UserGroupsController',\n rights: [\"view.usermanagement\"]\n }, {\n url: \"/user-group-add\",\n templateUrl: 'tpl/add-user-group.tpl.html',\n controller: 'AddUserGroupController',\n rights: [\"view.usermanagement\"]\n }, {\n url: \"/webapp/:path\",\n templateUrl: 'tpl/webapp.tpl.html',\n controller: 'WebAppController',\n licensedFeature: 'WEB_APPS'\n }, {\n url: \"/export-templates/:name*\",\n templateUrl: 'tpl/template-mapping/template-mapping-editor.tpl.html',\n controller: 'TemplateMappingEditorController',\n licensedFeature: 'EXPORT_TEMPLATES',\n rights: [\"view.exportTemplates\"],\n dependencies: ['assets/spreadsheet-viewer/client-library/clientLibrary.js']\n }, {\n url: \"/export-templates\",\n templateUrl: 'tpl/template-mapping/template-mappings-list.tpl.html',\n controller: 'TemplateMappingListController',\n licensedFeature: 'EXPORT_TEMPLATES',\n rights: [\"view.exportTemplates\"]\n }, {\n url: \"/simple-mappings\",\n templateUrl: 'tpl/simple-mapping/simple-mappings.tpl.html',\n controller: 'SimpleMappingsController',\n licensedFeature: 'EXPORT_TEMPLATES',\n rights: [\"view.exportTemplates\"],\n resolve: {\n data: function() {\n return {};\n },\n $modalInstance: function() {\n return {};\n }\n }\n }, {\n url: \"/asset-folders\",\n templateUrl: 'tpl/asset-folders/asset-folders-grid.tpl.html',\n controller: 'AssetFoldersController',\n rights: [\"view.assetFolders\"],\n dependencies: [lax_rest_url(\"datamodel/customDirectives.js\")],\n resolve: {\n modalParams: function() {\n return null;\n },\n $modalInstance: function() {\n return null;\n }\n }\n }, {\n url: \"/bulk-subscriptions\",\n templateUrl: 'tpl/react.tpl.html',\n controller: [\"ReactBridge\", function(ReactBridge) {\n ReactBridge.mountPage('BulkSubscriptionsPage', '.react-node');\n }]\n }];\n }\n };\n });\n","(function () {\n 'use strict';\n\nvar vendorDependencies = [\n 'ngRoute',\n 'ngCookies',\n 'ui.grid',\n 'ui.grid.autoResize',\n 'ui.grid.cellNav',\n 'ui.grid.edit',\n 'ui.grid.exporter',\n 'ui.grid.infiniteScroll',\n 'ui.grid.moveColumns',\n 'ui.grid.pinning',\n 'ui.grid.resizeColumns',\n 'ui.grid.saveState',\n 'ui.grid.selection',\n 'pascalprecht.translate',\n 'ngAnimate',\n 'ngSanitize',\n 'ui.select',\n 'ui.bootstrap',\n 'ui.bootstrap.datetimepicker',\n 'angular-growl',\n 'ui.dashboard',\n 'angularFileUpload',\n 'ngImgCrop',\n 'ui.tree',\n 'ui.tree-filter',\n 'tmh.dynamicLocale',\n 'infinite-scroll',\n 'ui.codemirror',\n angularDragula(angular)\n ],\n appDependencies = [\n 'llax.routes',\n 'llax.templates',\n 'llax.exceptions',\n 'llax.services',\n 'llax.directives',\n 'llax.directives.itemList',\n 'llax.filters',\n 'llax.app'\n ];\n\nfor (var i = 0; i < appDependencies.length; i++) {\n try {\n angular.module(appDependencies[i]);\n } catch (e) {\n angular.module(appDependencies[i], []);\n }\n}\nvar dependencies = vendorDependencies.concat(appDependencies);\nwindow.animationClassNameFilter = /animate-if|slide-up/;\nangular.module('infinite-scroll').value('THROTTLE_MILLISECONDS', 250);\n\nwindow.app = angular.module('llax', dependencies)\n .constant('AppConstants', {\n 'AUTHENTICATION_TOKEN': 'AUTHENTICATION_TOKEN'\n })\n .constant('HttpHeader', {\n 'ACCEPT': 'Accept',\n 'ACCEPT_LANGUAGE': 'Accept-Language',\n 'CONTENT_TYPE': 'Content-type',\n 'CURSOR': 'x-cursor',\n 'ETAG': 'ETag',\n 'IF_NONE_MATCH': 'If-None-Match',\n 'ERROR': 'X-Error',\n 'ITEM_CURSOR': 'x-item-cursor',\n 'ITEMS_FOUND': 'x-items-found',\n 'ITEMS_MAX': 'x-items-max',\n 'LOGGING_IN': 'X-SyncManager-LoggingIn',\n 'LOGGED_IN': 'X-SyncManager-LoggedIn',\n 'MESSAGE_CURSOR': 'x-message-cursor',\n 'SSO_POST': 'X-SyncManager-SSO-POST',\n 'SSO_REDIRECT' : 'X-SyncManager-SSO-Redirect',\n 'SYNC_MANAGER': 'X-SyncManager'\n })\n .constant('HttpStatus', {\n 'OK': 200,\n 'SEE_OTHER': 303,\n 'NOT_MODIFIED': 304,\n 'BAD_REQUEST': 400,\n 'UNAUTHORIZED': 401,\n 'PAYMENT_REQUIRED': 402,\n 'FORBIDDEN': 403,\n 'NOT_FOUND': 404,\n 'CONFLICT': 409,\n 'PRECONDITION_FAILED': 412,\n 'DATA_MODEL_INVALID': 420,\n 'RETRY_LATER': 422\n })\n .constant('HttpTimeout', 65)\n .constant('ErrorCode', {\n 'UNSPECIFIED': -1,\n 'NONE': 0,\n 'SEARCH_QUERY_INVALID': 301,\n 'SEARCH_QUERY_TOO_LONG': 302,\n 'BULK_SEARCH_STILL_ACTIVE': 401\n })\n .constant('AdditionalLicenseType', {\n 'ADDITIONAL_USERS': 'ADDITIONAL_USERS',\n 'ADDITIONAL_ITEMS': 'ADDITIONAL_ITEMS',\n 'DATA_MODELS': 'DATA_MODELS',\n 'FEATURES': 'FEATURES'\n })\n .constant('DataModelCustomizationConstants', {\n 'CODELIST_TYPES': [\"Codelist\", \"OpenCodelist\", \"CodelistSet\", \"OpenCodelistSet\"],\n 'SUPPORTED_TYPES': [\"String\", \"Integer\", \"Float\", \"Codelist\", \"OpenCodelist\", \"CodelistSet\", \"OpenCodelistSet\"]\n })\n .constant('DefaultUiConfig', {\n 'login_logo_src': '../images/byrd-logo-claim-w.png',\n 'login_logo_alternative_src': '../images/byrd-logo-claim-alternative.png',\n 'login_logo_name': 'BYRD Logo',\n 'login_logo_bc_src': '../images/logo-orbital.png',\n 'login_logo_bc_name': 'Bayard Consulting Logo',\n 'login_logo_bc_url': 'https://www.bayard-consulting.com/',\n 'copyright_bc_name': 'Bayard Consulting',\n 'copyright_bc_url': 'https://www.bayard-consulting.com/',\n 'navbar_logo_href': '/dashboard',\n 'navbar_logo_src': '../images/byrd-logo-w.png',\n 'navbar_logo_name': 'BYRD Logo'\n })\n .config(function($animateProvider,\n $compileProvider,\n $controllerProvider,\n $filterProvider,\n $httpProvider,\n $locationProvider,\n $provide,\n $routeProvider,\n $translateProvider,\n datepickerConfig,\n datepickerPopupConfig,\n growlProvider,\n HttpHeader,\n HttpStatus,\n HttpTimeout,\n RoutesProvider) {\n\n app.controller = $controllerProvider.register;\n app.directive = $compileProvider.directive;\n app.filter = $filterProvider.register;\n app.factory = $provide.factory;\n app.service = $provide.service;\n\n $animateProvider.classNameFilter(animationClassNameFilter);\n\n // angular-growl-2 config\n growlProvider.globalTimeToLive({success: 3000, warning: 5000, info: 3000});\n growlProvider.globalDisableCountDown(true);\n growlProvider.globalPosition('top-center');\n growlProvider.globalReversedOrder(true);\n\n var authFunction = function($q, $http, Auth, $rootScope, neededRights, organizationRolesDenied, callback) {\n var deferred = $q.defer();\n Auth.userDetails().then(function(response) {\n if (organizationRolesDenied && Auth.hasDeniedOrganizationRoles(organizationRolesDenied)) {\n deferred.reject();\n } else {\n var user = response;\n\n $rootScope.$broadcast('UserIsLoggedIn');\n\n if (neededRights && !Auth.hasRights(neededRights)) {\n deferred.reject(); // you could optionally pass error data here\n } else {\n if (_.isFunction(callback)) {\n callback(deferred);\n } else {\n deferred.resolve(user);\n }\n }\n }\n }, function errorCallback(response) {\n Auth.isLoggedIn = false;\n $rootScope.user = {\n isLoggedIn: false\n };\n deferred.reject();\n });\n return deferred.promise;\n };\n\n var dependencyResolver = function($q, $rootScope, deferred, dependencies) {\n if ($rootScope.user && $rootScope.user.isLoggedIn) {\n if (!$rootScope.inputTemplatesRegistered) {\n requirejs.undef(dependencies[0], function() {\n deferred.resolve();\n });\n }\n\n // Extend the dependencies load timeout because of datamodel related scripts.\n requirejs.config({\n waitSeconds: HttpTimeout, // Default is 7 seconds.\n });\n\n // jquery is loaded on its own, we have to provide it to requirejs\n // for any jquery dependencies that gets loaded using requirejs during\n // the app lifetime.\n define('jquery', [], function() { return window.jQuery; });\n\n // TODO: Add etag 'caching'!\n requirejs(dependencies, function() {\n deferred.resolve();\n });\n } else {\n console.log(\"Not authorized, avoiding require\", dependencies, $rootScope.user);\n }\n };\n\n var licensedFeatureResolver = function($q, Auth, feature) {\n var deferred = $q.defer();\n Auth.hasLicensedFeature(feature).then(function() {\n deferred.resolve(feature);\n }, function() {\n deferred.reject();\n });\n return deferred.promise;\n };\n\n var settingFeatureResolver = function($q, Auth, settingFeature) {\n var deferred = $q.defer();\n Auth.hasSettingFeature(settingFeature).then(function() {\n deferred.resolve(settingFeature);\n }, function() {\n deferred.reject();\n });\n return deferred.promise;\n };\n\n function registerRoute(route) {\n\n var routeConfig = {\n templateUrl: route.templateUrl,\n controller: route.controller,\n resolve: route.resolve || {}\n };\n\n if (!_.isUndefined(route.reloadOnSearch)) {\n routeConfig.reloadOnSearch = route.reloadOnSearch;\n }\n\n if (!route.insecure) {\n var authorizeFunction;\n if (route.dependencies) {\n authorizeFunction = /* @ngInject */ function($q, $http, Auth, $rootScope) {\n return authFunction($q, $http, Auth, $rootScope, route.rights, route.organizationRolesDenied, function(deferred) {\n dependencyResolver($q, $rootScope, deferred, route.dependencies);\n });\n };\n } else {\n authorizeFunction = /* @ngInject */ function($q, $http, Auth, $rootScope) {\n return authFunction($q, $http, Auth, $rootScope, route.rights, route.organizationRolesDenied);\n };\n }\n routeConfig.resolve.authorize = authorizeFunction;\n }\n\n if (route.licensedFeature) {\n routeConfig.resolve.licensedFeature = /* @ngInject */ function($q, Auth) {\n return licensedFeatureResolver($q, Auth, route.licensedFeature);\n };\n }\n\n if (route.settingFeature) {\n routeConfig.resolve.settingFeature = /* @ngInject */ function($q, Auth) {\n return settingFeatureResolver($q, Auth, route.settingFeature);\n };\n }\n\n if (route.urls) {\n angular.forEach(route.urls, function(url) {\n $routeProvider.when(url, routeConfig);\n });\n } else {\n $routeProvider.when(route.url, routeConfig);\n }\n\n }\n\n var routes = RoutesProvider.$get();\n\n angular.forEach(routes, function(route) {\n registerRoute(route);\n });\n\n $routeProvider.otherwise({redirectTo: '/'});\n\n $locationProvider.html5Mode(true);\n\n $provide.factory('httpInterceptor', function($cookies, $location, $q, $rootScope, $translate, growl, AppConstants, HttpTimeout) {\n return {\n request: function(config) {\n\n // Actual timeout on AppEngine is 60s, but sometimes it 'gracefully' allows a couple of seconds more.\n config.timeout = HttpTimeout * 1000;\n\n // Add the current \"loggingIn\" status as header\n if ($rootScope.loggingIn) {\n config.headers[HttpHeader.LOGGING_IN] = true;\n }\n\n // Set the accepted language to use\n if ($rootScope.language) {\n config.headers[HttpHeader.ACCEPT_LANGUAGE] = $rootScope.language;\n }\n\n return config;\n },\n response: function(response) {\n\n // Reset any error\n $rootScope.error = null;\n\n // Reset the \"loggingIn\" status if the request was a successful login request\n var loggedIn = response.headers(HttpHeader.LOGGED_IN);\n if (loggedIn) {\n $rootScope.loggingIn = false;\n } else if ($rootScope.handleSSOResponse(response)) {\n return $q.reject(response);\n }\n\n return response;\n },\n responseError: function(response) {\n\n if (response.status === HttpStatus.UNAUTHORIZED) {\n\n $cookies.remove(AppConstants.AUTHENTICATION_TOKEN);\n if (!$rootScope.loggingIn && !$rootScope.loggingOut) {\n if ($location.path() !== '/login' &&\n $location.path() !== '/register' &&\n $location.path() !== '/revalidateAccount' &&\n !$location.path().startsWith('/resetpassword')) {\n $rootScope.deeplink = $location.path();\n $rootScope.$broadcast('InvalidToken');\n }\n }\n\n } else if (response.status === HttpStatus.PAYMENT_REQUIRED) {\n\n console.log(\"Payment required: \", response.data);\n var details = \"\";\n var exceedances = response.data.exceedances;\n for (var key in exceedances) {\n if (details.length > 0) {\n details += \", \";\n }\n details += $translate.instant('USAGE_LIMIT.' + key, {exceedance: exceedances[key].value});\n }\n growl.warning($translate.instant('PAYMENT_REQUIRED', {details: details}), {ttl: 15000});\n\n } else if (response.status !== HttpStatus.NOT_MODIFIED) {\n\n // TODO: Logging \"response\" as object is not feasible in scripted environments, e.g. in tests.\n // There instead we should use this:\n // console.log(\"JSError response:\", JSON.stringify(response, null, 2));\n console.log(\"JSError response:\", response);\n jQuery(\"body\").attr(\"JSError\", response.data);\n\n }\n\n return $q.reject(response);\n }\n };\n });\n\n $httpProvider.defaults.headers.common[HttpHeader.SYNC_MANAGER] = true;\n $httpProvider.interceptors.push('httpInterceptor');\n $httpProvider.useLegacyPromiseExtensions = false;\n $httpProvider.useApplyAsync(true);\n\n // Default datepicker configuration\n datepickerConfig.startingDay = 1;\n datepickerPopupConfig.datepickerPopup = 'mediumDate';\n datepickerPopupConfig.showButtonBar = true;\n\n // \"Decorate\" the original popup wrap directive to add a better close handling\n $provide.decorator('datepickerPopupWrapDirective', function($delegate, $timeout) {\n var directive = $delegate[0];\n var _link = directive.link;\n directive.compile = function() {\n return function(scope, element, attrs) {\n\n // Apply original directive\n _link.apply(this, arguments);\n\n // Close datepicker on click on outer \"ul\" element, otherwise the picker could stay open due to lost focus\n function click(evt) {\n var tagName = evt.target.tagName.toLowerCase();\n if (tagName == \"ul\" && scope.isOpen) {\n $timeout(function() {\n scope.close();\n }, 1);\n }\n }\n element.bind('click', click);\n\n // Close datepicker on click on \"ui-grid\" element\n element.bind('focusout',function(evt){\n if(!_.isNil(event.relatedTarget) && _.includes(event.relatedTarget.className, \"ui-grid\")){\n scope.close();\n }\n });\n\n // Close datepicker on \"tab\"/\"shift-tab\", otherwise the picker would stay open due to lost focus\n var _keydown = scope.keydown;\n scope.keydown = function(evt) {\n if (evt.which === 9 && scope.isOpen) {\n var tagName = evt.target.tagName.toLowerCase();\n if ((tagName == \"table\" && (evt.shiftKey || !scope.showButtonBar)) ||\n (tagName == \"button\" && !evt.shiftKey && evt.target.classList.contains('btn-success'))) {\n evt.preventDefault();\n evt.stopPropagation();\n scope.close();\n return true;\n }\n }\n return _keydown(evt);\n };\n\n };\n };\n return $delegate;\n });\n\n $provide.decorator('modalWindowDirective', function($delegate, $rootScope, $modalStack, $timeout, ChannelService, $dialogs, $document) {\n var directive = $delegate[0];\n var link = function myLinkFnOverride(scope, element, attrs) {\n\n element.addClass(attrs.windowClass || '');\n scope.size = attrs.size;\n\n $timeout(function () {\n // trigger CSS transitions\n scope.animate = true;\n if (!element[0].querySelectorAll('[autofocus]').length) {\n element[0].focus();\n }\n });\n\n };\n\n directive.compile = function() {\n return function(scope, element, attrs) {\n link.apply(this, arguments);\n };\n };\n\n return $delegate;\n });\n\n $provide.decorator('$log', ['$delegate', function ($delegate) {\n\n var originalDebug = $delegate.debug;\n\n // Disable `$log.debug` calls when it's not explicitly enabled\n $delegate.debug = function () {\n\n if (!window.__DEBUG_LOGS_ENABLED) {\n return;\n }\n\n originalDebug.apply(null, arguments);\n };\n\n return $delegate;\n }]);\n\n })\n .run(function($rootScope, $route, $location, $document) {\n\n var BACKSPACE_KEYCODE = 8;\n var original = $location.path;\n $location.displayUrl = function(path) {\n if (path === $location.path()) {\n return;\n }\n var lastRoute = $route.current;\n var cancelListener = $rootScope.$on('$locationChangeSuccess', function() {\n $route.current = lastRoute;\n cancelListener();\n });\n return original.apply($location, [path]);\n };\n\n // feature for disabling backspace navigation (see LAX-3421)\n $document.bind(\"keydown keypress\", function(evt) {\n if (evt.keyCode === BACKSPACE_KEYCODE) {\n\n if (!_.isNil(evt.target.editor)) {\n // CodeMirror & ProseMirror editors\n return;\n }\n\n var allowed = /INPUT|SELECT|TEXTAREA/i;\n if (!allowed.test(evt.target.tagName) || evt.target.disabled || evt.target.readOnly) {\n evt.preventDefault();\n }\n }\n });\n\n });\n\n}());\n","//Exception Interceptor that gives the possiblity to test for exceptions with Selenium\nangular.module('llax.exceptions', ['llax.services', 'pascalprecht.translate'])\n .provider(\"$exceptionHandler\", {\n $get: function(errorLogService) {\n return (errorLogService);\n }\n })\n .factory(\"errorLogService\", function($log, $window) {\n function log(exception, cause) {\n $log.error.apply($log, arguments);\n console.log(\"JSError: \", exception);\n $(\"body\").attr(\"JSError\", exception.toString());\n }\n return (log);\n });\n","angular.module('llax.realtimeProvider', [])\n.service('RealtimeProvider', function($cookies, $log, $rootScope, AppConstants) {\n\n var EVENTS_PREFIX = \"organizationEvents\";\n var PATH_SEPARATOR = \"/\";\n\n // Deepstream constants\n // FIXME: These are needed because we don't know how to 'load' the constants defined in ds.js!?\n var deepstream = {\n CONSTANTS : {\n EVENT : {\n MAX_RECONNECTION_ATTEMPTS_REACHED: \"MAX_RECONNECTION_ATTEMPTS_REACHED\",\n CONNECTION_STATE_CHANGED: \"connectionStateChanged\"\n },\n CONNECTION_STATE: {\n OPEN: \"OPEN\"\n }\n }\n };\n\n var ds;\n var organizationId;\n\n var self = this;\n\n function login(userId, token, settings, callback) {\n\n ds.login({\n type: 'webhook',\n userId: userId,\n token: token\n }, function(success, data) {\n if (success) {\n $log.info(\"Successfully logged in to deepstream with clientData\", data);\n organizationId = data.organizationId;\n callback();\n } else {\n $log.error(\"Could not connect to deepstream using settings:\", settings);\n }\n });\n\n }\n\n this.connect = function(settings, callback) {\n\n $log.debug(\"settings:\", JSON.stringify(settings));\n var url = settings.url;\n\n var userId = $rootScope.user.userId;\n var token = $cookies.get(AppConstants.AUTHENTICATION_TOKEN);\n if (_.isEmpty(token)) {\n $log.error(\"Cannot connect to deepstream, because login token is empty\");\n return;\n }\n\n if (ds) {\n ds.off();\n ds.close();\n }\n\n ds = new DeepstreamClient.DeepstreamClient(url);\n ds.on('error', function(error, event, topic) {\n $log.error(\"Caught deepstream error:\", error, event, topic);\n });\n ds.on(deepstream.CONSTANTS.EVENT.CONNECTION_STATE_CHANGED, function(connectionState) {\n $log.debug(\"connectionStateChanged:\", connectionState);\n });\n ds.on(deepstream.CONSTANTS.EVENT.MAX_RECONNECTION_ATTEMPTS_REACHED, function(reconnectionAttempts) {\n $log.debug(\"Reconnection failed after maximum number of retry attempts reached\");\n self.connect(settings, callback);\n });\n\n login(userId, token, settings, callback);\n\n };\n\n this.disconnect = function() {\n if (ds) {\n ds.off();\n ds.close();\n ds = null;\n }\n };\n\n this.isConnected = function() {\n var isConnected = ds ? ds.getConnectionState() === deepstream.CONSTANTS.CONNECTION_STATE.OPEN : false;\n return isConnected;\n };\n\n this.emit = function(event, identifier, type, data) {\n var eventData = {\n event: event,\n identifier: identifier,\n type: type,\n data: data\n };\n var eventName = _getEventName(event, identifier, type);\n $log.debug(\"emit: eventName:\", eventName, \", eventData:\", eventData);\n ds.event.emit(eventName, eventData);\n };\n\n this.subscribe = function(eventName, subscribeCallback) {\n ds.event.subscribe(eventName, subscribeCallback);\n };\n\n this.unsubscribe = function(eventName) {\n ds.event.unsubscribe(eventName);\n };\n\n function _getEventName(event, identifier, type) {\n var eventName = EVENTS_PREFIX +\n PATH_SEPARATOR +\n organizationId +\n PATH_SEPARATOR +\n type +\n PATH_SEPARATOR +\n event +\n (identifier ? PATH_SEPARATOR + identifier : \"\");\n return eventName;\n }\n\n});\n","angular.module('llax.translations', ['llax.services'])\n .constant('TranslationConfig', {\n 'DEFAULT_LANGUAGE': 'en',\n 'DEFAULT_LOCALE': 'en-iso',\n 'DEFAULT_SUPPORTED_LANGUAGES': [{\n key: 'en',\n translated: 'English'\n }],\n 'LANGUAGE_KEY': 'languageKey'\n })\n .config(function($translateProvider, $windowProvider, TranslationConfig, tmhDynamicLocaleProvider) {\n\n $translateProvider\n .useLoader('translationLoader')\n .useSanitizeValueStrategy('escapeParameters')\n .addInterpolation('$translateMessageFormatInterpolation')\n .uniformLanguageTag('java')\n .preferredLanguage(TranslationConfig.DEFAULT_LANGUAGE)\n .determinePreferredLanguage(function() {\n var storedLanguage = _.get($windowProvider.$get().localStorage, TranslationConfig.LANGUAGE_KEY);\n\n // Local storage stores the values in a serialized manner so a null is actually a 'null'\n if (_.isNil(storedLanguage) || storedLanguage === 'null') {\n return $translateProvider.resolveClientLocale();\n } else {\n return storedLanguage;\n }\n });\n\n// tmhDynamicLocaleProvider.localeLocationPattern('/assets/angular-i18n/js/angular-locale_{{locale}}.js');\n tmhDynamicLocaleProvider.localeLocationPattern('/assets/i18n/angular-locale_{{locale}}.js');\n tmhDynamicLocaleProvider.defaultLocale(TranslationConfig.DEFAULT_LOCALE);\n\n })\n .factory('translationLoader', function($log, $q, $rootScope, LocalCacheService, OpenETagLoader, TranslationResource, $window) {\n return function(options) {\n var storage = $window.localStorage;\n var deferred = $q.defer();\n\n var languageKey = options.key;\n var KEY_TRANSLATION_TAG = 'translationsTag_';\n var translationsTagKey = KEY_TRANSLATION_TAG + languageKey;\n\n var translationLoader = new OpenETagLoader();\n LocalCacheService.waitForDBInitialization().then(function() {\n translationLoader\n .loadDataByResource(TranslationResource, { languageKey: languageKey },\n getTagFunctionAsync,\n getDataFunctionAsync,\n setTranslations,\n restoreTranslations,\n errorTranslations);\n });\n\n function setTranslations(tag, map, loader) {\n\n clearAllTranslationsTag();\n\n LocalCacheService.clearAllByStoreNameAsync(LocalCacheService.STORES.translations.objectStoreName)\n .then(function () {\n return LocalCacheService.insertEntryAsync(LocalCacheService.STORES.translations.objectStoreName,\n languageKey,\n { languageKey: languageKey, map: map });\n })\n .then(function () {\n $rootScope.requestedLanguage = languageKey;\n $rootScope.loadedLanguage = map.languageCode;\n $rootScope.language = map.languageCode;\n\n $log.info(\"Replaced entries in store '%s' with tag '%s': %o\", LocalCacheService.STORES.translations.objectStoreName, tag, map);\n deferred.resolve(map.translations);\n $rootScope.setTranslationsAsLoaded();\n storage.setItem(translationsTagKey, tag);\n map = map.translations;\n })\n .catch(function (error) {\n $log.error(\"Error during IndexedDB operations:\", error);\n deferred.reject(error);\n });\n }\n\n function restoreTranslations(tag, map, loader) {\n $rootScope.setTranslationsAsLoaded();\n $rootScope.language = languageKey;\n $rootScope.loadedLanguage = map.languageCode;\n $log.info(\"Restored translations for language '%s' with tag '%s' from LocalCacheService: %o\", languageKey, tag, map);\n if (!_.isNil(map.map.translations)) {\n deferred.resolve(map.map.translations);\n } else {\n deferred.resolve(map);\n }\n }\n\n function errorTranslations(errorReason, loader) {\n LocalCacheService.deleteEntriesByIndexAsync(LocalCacheService.STORES.translations.objectStoreName,\n LocalCacheService.STORES.translations.key,\n languageKey)\n .then(function () {\n deferred.reject(errorReason);\n });\n }\n function clearAllTranslationsTag() {\n var removableKeys = [];\n for (var keyIndex = 0; keyIndex < storage.length; keyIndex++){\n var key = storage.key(keyIndex);\n if (storage.hasOwnProperty(key)) {\n if (key.match(KEY_TRANSLATION_TAG)) {\n $log.info(\"Removing unused translation local storage key: '%s'\", key);\n removableKeys.push(key);\n }\n }\n }\n\n for (var removableKeyIndex = 0; removableKeyIndex < removableKeys.length; removableKeyIndex++) {\n localStorage.removeItem(removableKeys[removableKeyIndex]);\n }\n }\n\n function getTagFunctionAsync() {\n var tag = storage.getItem(translationsTagKey);\n return $q.when(tag);\n }\n\n function getDataFunctionAsync() {\n var storeName = LocalCacheService.STORES.translations.objectStoreName;\n var _languageKey = [languageKey];\n return LocalCacheService.getEntryAsync(storeName, _languageKey);\n }\n\n return deferred.promise;\n };\n })\n .run(function($http, $log, $rootScope, $timeout, $translate, $window, TranslationConfig, tmhDynamicLocale) {\n\n var LocalStorage = $window.localStorage;\n var translationsCache = {};\n var translationsLoaded = false;\n\n $rootScope.requestedLanguage = null;\n $rootScope.loadedLanguage = null;\n\n $rootScope.supportedLanguages = TranslationConfig.DEFAULT_SUPPORTED_LANGUAGES;\n $rootScope.refreshSupportedLocales = function() {\n $http.get(lax_rest_url('supportedLocales')).then(function(response) {\n var supportedLanguages = [];\n _.forEach(response.data, function(translated, key) {\n supportedLanguages.push({\n key: key,\n translated: translated\n });\n });\n $rootScope.supportedLanguages = supportedLanguages;\n });\n };\n $rootScope.refreshSupportedLocales();\n\n $rootScope.checkTranslationsLoaded = function() {\n return translationsLoaded;\n };\n\n $rootScope.refreshTranslations = function() {\n $timeout(function() {\n // Block the UI until we refresh the translations\n translationsLoaded = false;\n $translate.refresh();\n }, 0);\n };\n\n $rootScope.setTranslationsAsLoaded = function() {\n translationsLoaded = true;\n };\n\n $rootScope.changeLanguage = function(language) {\n\n if (!translationsLoaded || language == $rootScope.requestedLanguage) {\n return;\n }\n\n $log.info(\"User changed language to '%s'\", language);\n LocalStorage.setItem(TranslationConfig.LANGUAGE_KEY, language);\n\n // Setting the language in the local storage and reloading the window\n // will trigger '$translate.onReady' to set the correct language\n $timeout(function() {\n window.location.reload();\n }, 1);\n\n };\n\n $translate.onReady(function() {\n\n var storedLanguage = LocalStorage.getItem(TranslationConfig.LANGUAGE_KEY);\n var requestedLanguage = $rootScope.requestedLanguage;\n var loadedLanguage = $rootScope.loadedLanguage;\n\n // When $translate service is ready, check the 'stored' language.\n // If it does not match either the requested or the loaded language,\n // explicitly use the 'stored' language in $translate\n if (!_.isNil(storedLanguage) && storedLanguage !== 'null' && storedLanguage !== requestedLanguage && storedLanguage !== loadedLanguage) {\n $timeout(function() {\n useLanguage(storedLanguage);\n }, 1);\n } else {\n setLanguage(loadedLanguage, requestedLanguage);\n }\n\n });\n\n function useLanguage(language) {\n return $translate.use(language).then(function(usedLanguage) {\n setLanguage(usedLanguage);\n });\n }\n\n function setLanguage(loadedLanguage, requestedLanguage) {\n\n translationsCache = {};\n translationsLoaded = true;\n\n $rootScope.language = loadedLanguage;\n $rootScope.lookupLanguages = getLookupLanguages($rootScope.language, TranslationConfig.DEFAULT_LANGUAGE);\n setLocale(requestedLanguage || loadedLanguage);\n LocalStorage.setItem(TranslationConfig.LANGUAGE_KEY, requestedLanguage || loadedLanguage);\n\n }\n\n // Set i18n locale for angular filters, like date and numbers\n function setLocale(locale) {\n\n var localeParts = getLocaleParts(locale);\n if (_.isNil(localeParts.country) && !_.isNil(localeParts.defaultCountry)) {\n locale = localeParts.language + '-' + localeParts.defaultCountry;\n } else {\n locale = localeParts.locale;\n }\n tmhDynamicLocale.set(locale);\n\n }\n\n function getLocaleParts(locale) {\n\n locale = _.replace(_.toLower(locale), '_', '-');\n var split = _.split(locale, '-');\n var language = split[0];\n var country = split[1];\n\n var defaultLocale = $translate.resolveClientLocale();\n defaultLocale = _.replace(_.toLower(defaultLocale), '_', '-');\n var defaultSplit = _.split(defaultLocale, '-');\n var defaultLanguage = defaultSplit[0];\n var defaultCountry = defaultSplit[1];\n\n return {\n locale: locale,\n language: language,\n country: country,\n defaultLocale: defaultLocale,\n defaultLanguage: defaultLanguage,\n defaultCountry: defaultCountry\n };\n }\n\n function getLookupLanguages(lookupLanguage, defaultLanguage) {\n\n var lookupLanguages = [];\n\n // Update language and default language to conform the Java locale format (_)\n lookupLanguage = _.replace(lookupLanguage, '-', '_');\n defaultLanguage = _.replace(defaultLanguage, '-', '_');\n\n var split = _.split(lookupLanguage, '_');\n var language = split[0];\n var country = split[1];\n var variant = split[2];\n\n // Add language itself\n if (!_.isEmpty(lookupLanguage)) {\n lookupLanguages.push(lookupLanguage);\n }\n\n // Add language without variant, if possible\n if (!_.isEmpty(variant)) {\n lookupLanguages.push(language + '_' + country);\n }\n\n // Add language without country, if possible\n if (!_.isEmpty(country)) {\n lookupLanguages.push(language);\n }\n\n // Add default language, if necessary\n if (!_.includes(lookupLanguages, defaultLanguage)) {\n lookupLanguages.push(defaultLanguage);\n }\n\n return lookupLanguages;\n }\n\n $rootScope.$on('$localeChangeError', function(event, errorLocale) {\n\n var alternativeLocale;\n var localeParts = getLocaleParts(errorLocale);\n\n if (localeParts.language === TranslationConfig.DEFAULT_LANGUAGE) {\n if (errorLocale !== TranslationConfig.DEFAULT_LOCALE) {\n alternativeLocale = TranslationConfig.DEFAULT_LOCALE;\n }\n } else {\n if (_.isNil(localeParts.country) && !_.isNil(localeParts.defaultCountry)) {\n alternativeLocale = TranslationConfig.DEFAULT_LANGUAGE + '-' + localeParts.defaultCountry;\n } else if (!_.isNil(localeParts.country)) {\n alternativeLocale = localeParts.language;\n } else {\n alternativeLocale = TranslationConfig.DEFAULT_LOCALE;\n }\n }\n\n if (alternativeLocale) {\n $log.info(\"Locale definition for '%s' does not exist; Trying locale '%s'\", errorLocale, alternativeLocale);\n tmhDynamicLocale.set(alternativeLocale);\n\n } else {\n $log.error(\"Could not activate locale '%s'\", errorLocale);\n }\n\n });\n\n /**\n * Returns the translation for the specified key. If no translation was found,\n * returns 'defaultValue', if specified, else the key itself.\n * Uses 'interpolateParams' for interpolation.\n */\n $rootScope.translate = function(key, defaultValue, interpolateParams, interpolationType) {\n var result = _translate(key, interpolateParams, interpolationType);\n if (result === key && !_.isUndefined(defaultValue)) {\n result = defaultValue;\n }\n return result;\n };\n\n /**\n * Returns the translation for a key which is created by prepending 'prefix'\n * to 'value'. If no translation was found, returns 'defaultValue',\n * if specified, else 'value'.\n */\n $rootScope.translateValue = function(prefix, value, defaultValue) {\n var key = prefix + value;\n defaultValue = defaultValue || value;\n return $rootScope.translate(key, defaultValue);\n };\n\n function getTranslationFromObject(object, type, defaultValueFn) {\n\n // Ignore non-objects or 'empty' objects\n if (!_.isObject(object) || _.isEmpty(object)) {\n return defaultValueFn(object);\n }\n\n var result;\n\n // Try translations from translation map first\n var translationMap = _.get(object, type + 's');\n\n if (!_.isEmpty(translationMap)) {\n\n // Find the first non empty translation using the lookup languages hierarchy\n _.forEach($rootScope.lookupLanguages, function(lookupLanguage) {\n result = _.get(translationMap, lookupLanguage);\n if (!_.isEmpty(result)) {\n return false;\n }\n });\n\n }\n\n // Use default label/icon or key\n result = result || defaultValueFn(object);\n\n return result;\n }\n\n function getDefaultAttributeLabel(attribute) {\n if (angular.isObject(attribute)) {\n return $rootScope.translateValue(\"attribute.\", attribute.name, attribute.label);\n } else {\n return $rootScope.translateValue(\"attribute.\", attribute);\n }\n }\n\n $rootScope.translateAttribute = function(attribute) {\n return getTranslationFromObject(attribute, 'label', getDefaultAttributeLabel);\n };\n\n function getDefaultAttributeDescription(attribute) {\n var attributeName;\n var defaultDescription;\n if (angular.isObject(attribute)) {\n attributeName = attribute.name;\n defaultDescription = attribute.description;\n } else {\n attributeName = attribute;\n defaultDescription = null;\n }\n var key = \"attribute.\" + attributeName + \".description\";\n var result = $rootScope.translate(key, defaultDescription);\n return key != result ? result : null;\n }\n\n $rootScope.translateAttributeDescription = function(attribute) {\n return getTranslationFromObject(attribute, 'description', getDefaultAttributeDescription);\n };\n\n $rootScope.translateAllCategories = function(categories) {\n _.forEach(categories, function(category) {\n category.translatedLabel = category.translatedLabel || $rootScope.translateCategory(category);\n });\n return categories;\n };\n\n $rootScope.translateCategory = function(category) {\n if (angular.isObject(category)) {\n return $rootScope.translateValue(\"category.\", category.name, category.label);\n } else {\n return $rootScope.translateValue(\"category.\", category);\n }\n };\n\n $rootScope.translateHierarchy = function(hierarchy) {\n if (angular.isObject(hierarchy)) {\n return $rootScope.translateValue(\"hierarchy.\", hierarchy.name, hierarchy.label);\n } else {\n return $rootScope.translateValue(\"hierarchy.\", hierarchy);\n }\n };\n\n $rootScope.translateAllSections = function(sections) {\n _.forEach(sections, function(section) {\n section.translatedLabel = section.translatedLabel || $rootScope.translateSection(section);\n });\n return sections;\n };\n\n $rootScope.translateSection = function(section) {\n if (angular.isObject(section)) {\n return $rootScope.translateValue(\"section.\", section.name, section.label);\n } else {\n return $rootScope.translateValue(\"section.\", section);\n }\n };\n\n $rootScope.translateWebApp = function(webApp) {\n return $rootScope.translateValue(\"webapp.\", webApp, webApp);\n };\n\n $rootScope.getTranslatedOptions = function(attribute) {\n attribute.translatedOptions = attribute.translatedOptions || _getTranslatedOptions(attribute);\n return attribute.translatedOptions;\n };\n\n function _getTranslatedOptions(attribute) {\n var options = $rootScope.dataModel.getAttributeOptions(attribute);\n var result = _.map(options, function(option) {\n return {\n key: option.key,\n value: $rootScope.translateOption(option, attribute)\n };\n });\n return result;\n }\n\n $rootScope.translateOption = function(option, attribute, defaultValueFn) {\n return _translateOption(option, attribute, 'option', defaultValueFn || getDefaultOptionValue);\n };\n $rootScope.translatePhysical = $rootScope.translateOption;\n\n $rootScope.translateOptionIcon = function(option, attribute) {\n return _translateOption(option, attribute, 'icon', getDefaultOptionIcon);\n };\n\n function getDefaultOptionValue(option, options) {\n if (_.isObject(option)) {\n return _.get(option, 'value', _.get(option, 'key', \"\"));\n } else if (_.isArray(options)) {\n return findValueForKey(option, options);\n } else {\n return _.toString(option);\n }\n }\n\n function getDefaultOptionIcon(option) {\n if (_.isObject(option)) {\n return _.get(option, 'icon', null);\n } else {\n return null;\n }\n }\n\n function _translateOption(option, attribute, type, defaultValueFn) {\n\n // Ignore 'empty' options\n if (_.isEmpty(option)) {\n return defaultValueFn(option);\n }\n\n var result;\n\n // Take the translation defined on the option itself, if possible\n var propertyPrefix = type == 'option' ? 'label' : type;\n if (_.has(option, 'serviceName') || _.has(option, propertyPrefix + 's') || _.has(option, propertyPrefix) || _.has(option.value, 'labels')) {\n\n // Try translations from translation map first\n var translationMap = (angular.isObject(option.value) && _.has(option.value, 'labels'))?\n _.get(option.value, 'labels'):\n _.get(option, propertyPrefix + 's');\n\n if (!_.isEmpty(translationMap)) {\n // Find the first non empty translation using the lookup languages hierarchy\n _.forEach($rootScope.lookupLanguages, function(lookupLanguage) {\n result = _.get(translationMap, lookupLanguage);\n if (!_.isEmpty(result)) {\n return false;\n }\n });\n\n }\n\n // Use default label/icon or key\n result = result || _.get(option, propertyPrefix) || defaultValueFn(option);\n\n return result;\n }\n\n // Ensure, attribute is a data model defined object\n if (_.isEmpty(attribute)) {\n return defaultValueFn(option);\n }\n if (_.isString(attribute)) {\n attribute = $rootScope.dataModel.attribute(attribute);\n if (!_.isObject(attribute)) {\n return defaultValueFn(option);\n } else {\n return _translateOption(option, attribute, type, defaultValueFn);\n }\n }\n\n var attributeName = attribute.name;\n var optionKey = _.isObject(option) ? option.key : option;\n\n var key;\n\n // Try translation by attribute\n key = \"attribute.\" + attributeName + \".\" + type + \".\" + optionKey;\n result = $rootScope.translate(key);\n if (result !== key) {\n return result;\n }\n\n // Get options and retrieve the translation from it\n var options;\n var optionParam = $rootScope.dataModel.getAttributeOptionsParam(attribute);\n if (_.isEmpty(optionParam)) {\n\n // Try the referenced attribute, if defined\n var referencedOptionAttribute = $rootScope.dataModel.getReferencedOptionAttribute(attribute);\n if (!_.isEmpty(referencedOptionAttribute)) {\n return $rootScope.translateOption(option, referencedOptionAttribute, defaultValueFn);\n }\n\n // No options exist\n options = null;\n\n } else {\n\n options = _.get(attribute.params, optionParam);\n if (_.isString(options)) {\n\n // Try translation by optionList\n var optionList = options;\n key = \"optionList.\" + optionList + \".\" + type + \".\" + optionKey;\n result = $rootScope.translate(key);\n if (result !== key) {\n return result;\n }\n\n // Find matching option from optionList, if possible\n options = $rootScope.dataModel.optionListOptions(optionList);\n option = findEntry(option, options) || option;\n\n } else if (!_.isArray(options)) {\n // No options exist\n options = null;\n }\n\n }\n\n // Determine the default value\n var defaultValue = defaultValueFn(option, options);\n\n // Try the option without the attribute name\n key = type + \".\" + optionKey;\n result = $rootScope.translate(key, defaultValue);\n\n return result;\n }\n\n function findEntry(key, entries) {\n return _.find(entries, function(entry) {\n return (entry.key == key);\n });\n }\n\n function findValueForKey(key, entries) {\n var result = findEntry(key, entries);\n return (result ? result.value : null) || key;\n }\n\n $rootScope.translateAttributeValidations = function(attributeName, validations) {\n angular.forEach(validations, function(validation) {\n $rootScope.translateAttributeValidation(attributeName, validation);\n });\n };\n\n $rootScope.translateAttributeValidation = function(attributeName, validation) {\n validation.translatedMessage = $rootScope.translateValidationMessage(validation);\n validation.translatedLabel = $rootScope.translateValidationLabel(attributeName + \":\" + validation.name);\n };\n\n $rootScope.translateMappingFunction = function(mappingFunction) {\n var mappingFunctionName = angular.isObject(mappingFunction) ? mappingFunction.name : mappingFunction;\n var defaultValue = angular.isObject(mappingFunction) ? mappingFunction.label : null;\n return $rootScope.translate(\"mappingFunction.\" + mappingFunctionName + \".label\", defaultValue || mappingFunctionName);\n };\n\n $rootScope.translateMappingFunctionDescription = function(mappingFunction) {\n var mappingFunctionName = angular.isObject(mappingFunction) ? mappingFunction.name : mappingFunction;\n var defaultValue = angular.isObject(mappingFunction) ? mappingFunction.description : null;\n return $rootScope.translate(\"mappingFunction.\" + mappingFunctionName + \".description\", defaultValue || null);\n };\n\n $rootScope.translateMappingFunctionParam = function(mappingFunction, parameter) {\n var mappingFunctionName = angular.isObject(mappingFunction) ? mappingFunction.name : mappingFunction;\n var parameterName = angular.isObject(parameter) ? parameter.name : parameter;\n var defaultValue = angular.isObject(parameter) ? parameter.label : null;\n return $rootScope.translate(\"mappingFunction.\" + mappingFunctionName + \".parameter.\" + parameterName + \".label\", defaultValue || parameterName);\n };\n\n $rootScope.translateMappingFunctionParamDescription = function(mappingFunction, parameter) {\n var mappingFunctionName = angular.isObject(mappingFunction) ? mappingFunction.name : mappingFunction;\n var parameterName = angular.isObject(parameter) ? parameter.name : parameter;\n var defaultValue = angular.isObject(parameter) ? parameter.description : null;\n return $rootScope.translate(\"mappingFunction.\" + mappingFunctionName + \".parameter.\" + parameterName + \".description\", defaultValue || null);\n };\n\n $rootScope.translatePlaceholder = function(attributeName) {\n return $rootScope.translate('attribute.' + attributeName + '.placeholder', '');\n };\n\n /**\n * Deprecated!\n */\n $rootScope.translateError = function(error) {\n return $rootScope.translateValidationLabel(error);\n };\n\n $rootScope.translateValidationLabel = function(validationKey) {\n\n if (_.isEmpty(validationKey)) {\n return \"\";\n }\n\n var index = validationKey.indexOf(':');\n var attributeName;\n var validationName;\n if (index >= 0) {\n attributeName = validationKey.slice(0, index);\n validationName = validationKey.slice(index + 1);\n } else {\n attributeName = null;\n validationName = validationKey;\n }\n\n var attributeLabel =\n (attributeName ? $rootScope.translateAttribute(attributeName) : null);\n\n // FIXME: Define a prefix for the validation label (eg. 'validationlabel')\n var key = _.toUpper(validationName);\n var result = $rootScope.translate(key, key, {\n value: attributeLabel\n });\n\n return result.replace(/\\s+/g, ' ');\n };\n\n $rootScope.translateValidationMessage = function(validationMessage) {\n\n if (_.isEmpty(validationMessage)) {\n return \"\";\n } else if (!_.isObject(validationMessage)) {\n return validationMessage;\n }\n\n var key = \"validationmessage.\" + validationMessage.name;\n var msgId = validationMessage.params ? validationMessage.params.msg_id : null;\n if (msgId) {\n key += \".\" + msgId;\n }\n\n var result = \"\";\n if (!_.isEmpty(validationMessage.params)) {\n\n var prefix = \"\";\n if (validationMessage.path.length > 1) {\n\n var prefixKey = \"VALIDATION_MESSAGE_LOCATION_PREFIX\";\n\n validationMessage.params.err_field = $rootScope.translateAttribute(validationMessage.path[\n validationMessage.path.length - 1]);\n if (_.isObject(validationMessage.path[1])) {\n prefixKey += '.MULTI_DIMENSIONAL';\n } else if (_.isNumber(validationMessage.path[1])) {\n validationMessage.params.err_row = validationMessage.path[1] + 1;\n var attributeName = validationMessage.path[0];\n var attribute = $rootScope.dataModel.attribute(attributeName);\n if (attribute.typeName === 'Group') {\n var errorIndex = validationMessage.path[validationMessage.path.length - 3];\n if (_.isNumber(errorIndex)) {\n validationMessage.params.err_row = errorIndex + 1;\n }\n }\n if (validationMessage.path.length > 3) {\n var attName = validationMessage.path[3];\n var subAtt = attribute.memberAttributes.find(function(memAtt) {\n return memAtt.name === attName;\n });\n prefixKey = setPrefixKeyForAttributeType(prefixKey, subAtt.typeName);\n } else {\n prefixKey += '.ENUM_SET';\n }\n } else {\n prefixKey += '.DIMENSIONAL';\n }\n prefix = $rootScope.translate(prefixKey, prefixKey, validationMessage.params, \"messageformat\");\n\n }\n\n var translation = $rootScope.translate(key, key, validationMessage.params, \"messageformat\");\n if (translation === key) {\n result = validationMessage.message;\n } else {\n prefix = _.isEmpty(prefix) ? '' : prefix + ' ';\n result = prefix + translation;\n }\n\n } else {\n result = $rootScope.translate(key, key, null, null);\n if (result === key) {\n result = validationMessage.message;\n }\n }\n\n return result;\n };\n\n // Helper function to set the prefix key based on the type of the attribute\n function setPrefixKeyForAttributeType(prefixKey, typeName) {\n switch (typeName) {\n case \"MultiDimensional\":\n prefixKey += '.MULTI_DIMENSIONAL';\n return prefixKey;\n\n case \"Collection\":\n prefixKey += '.COLLECTION';\n return prefixKey;\n\n case \"Enum\":\n prefixKey += '.ENUM_SET';\n return prefixKey;\n\n }\n }\n\n function _translate(key, interpolateParams, interpolationType) {\n var result;\n if (_.isEmpty(interpolateParams)) {\n result = translationsCache[key];\n if (_.isEmpty(result)) {\n result = $translate.instant(key);\n if (result !== key) {\n translationsCache[key] = result;\n }\n }\n } else {\n result = $translate.instant(key, interpolateParams, interpolationType);\n }\n return result;\n }\n\n });\n","angular.module('llax')\n .controller('ActivityStreamController', ['$rootScope', '$scope', '$http', '$injector', '$translate', '$sce', 'growl', 'MonitoringResource', 'NewsResource', 'TaskListsResource', 'ChannelService', 'TaskResource',\n function($rootScope, $scope, $http, $injector, $translate, $sce, growl, MonitoringResource, NewsResource, TaskListsResource, ChannelService, TaskResource) {\n\n $scope.showTask = false;\n $scope.showNews = false;\n $scope.showActivities = false;\n $scope.showAll = true;\n $scope.activityList = [];\n $scope.loadingActivities = true;\n $scope.news = {\n body: '',\n maxLength: 150,\n placeholder: $translate.instant('ACTIVITY.NEWS_PLACEHOLDER'),\n charactersRemaining: $translate.instant('ACTIVITY.CHARACTERS_REMAINING')\n };\n\n //IMPORTANT: Replace $scope.activityStreamTime value to ActivityStreamResource GET after backend support is implemented. currentTime here is just a placeholder. ActivityStreamTime service is in services.js\n var currentTime = new Date();\n $scope.activityStreamTime = currentTime.setHours(0);\n if ($rootScope.user.notificationsLastRead) {\n $scope.activityStreamTime = new Date($rootScope.user.notificationsLastRead);\n }\n\n var taskResourceUrl = lax_rest_url('taskLists'),\n taskLoaded = false,\n newsLoaded = false,\n activitiesLoaded = false;\n\n $scope.getTemplates = function() {\n $http.get('tpl/activities.tpl.html')\n .then(function(response) {\n $injector.get('$compile')(response.data);\n });\n };\n $scope.initActivities = function() {\n $scope.getTemplates();\n };\n\n $rootScope.$on('channelMessageReceived', function(event, eventData) {\n var entry;\n if (eventData.event === ChannelService.TASK_ASSIGNED_EVENT && eventData.data.task && eventData.data.task.assignee === $rootScope.userId) {\n addActivity(createTaskActivity(eventData.data.task));\n } else if (eventData.event === ChannelService.NEWS_STREAM_CHANGED_EVENT) {\n entry = eventData.data.entry;\n addActivity(createMonitoringActivity(entry));\n }\n });\n\n $rootScope.$on('selfTaskCreated', function(evt, task) {\n if (task) {\n addActivity(createTaskActivity(task));\n }\n });\n\n $scope.checkIfAllActivitiesLoaded = function() {\n if (taskLoaded && newsLoaded && activitiesLoaded) {\n $scope.loadingActivities = false;\n }\n };\n\n $rootScope.retrieveAllActivities = function() {\n loadTasks($scope.activityList);\n loadNews($scope.activityList);\n loadActivities($scope.activityList);\n };\n\n function createTaskActivity(task) {\n var dueDate = (task.dueDate === undefined) ? '' : new Date(task.dueDate);\n var template = (task.author) ? 'userCreatedTask' : 'fileImportedTask';\n var imageUrl = $rootScope.userHasImage(task.author) ? $rootScope.getUserImageUrl(task.author) : '';\n var taskActivity = {\n 'class': 'tasks',\n 'template': template,\n 'createdAt': task.createDate,\n 'data': {\n 'author': $rootScope.getUserName(task.author),\n 'title': task.title,\n 'id': task.id,\n 'imageUrl': imageUrl,\n 'description': $sce.trustAsHtml(task.notes),\n 'assignedDate': $rootScope.formatDateToSimpleString(task.createDate),\n 'dueDate': dueDate\n }\n };\n return taskActivity;\n }\n\n function createMonitoringActivity(element) {\n var imageUrl = $rootScope.userHasImage(element.author) ? $rootScope.getUserImageUrl(element.author) : '';\n var template = element.module.toLowerCase();\n return {\n 'class': template,\n 'template': template,\n 'createdAt': element.timestamp,\n 'data': {\n 'author': element.author,\n 'imageUrl': imageUrl,\n 'description': element.description,\n 'receivedDate': $rootScope.formatDateToSimpleString(element.timestamp)\n }\n };\n }\n\n function addActivity(activity) {\n //IMPORTANT: send POST request to update activity stream time.\n $rootScope.newActivities++;\n $rootScope.newNotifications = true;\n $scope.activityList.push(activity);\n }\n\n function loadTasks(activityList) {\n TaskResource.query({taskId: \"mine\"}, function(tasks) {\n tasks.forEach(function(task) {\n if (task.taskStatus == \"OPEN\") {\n activityList.push(createTaskActivity(task));\n }\n });\n $rootScope.newActivities += retrieveUnseenActivities(activityList, \"tasks\");\n });\n taskLoaded = true;\n $scope.checkIfAllActivitiesLoaded();\n }\n\n function loadActivities(activityList) {\n loadMonitoringItems(activityList, \"activity\", \"ACTIVITY\", function() {\n $rootScope.newActivities += retrieveUnseenActivities($scope.activityList, \"activity\");\n activitiesLoaded = true;\n });\n }\n\n function loadNews(activityList) {\n loadMonitoringItems(activityList, \"news\", \"NEWS\", function() {\n $rootScope.newActivities += retrieveUnseenActivities($scope.activityList, \"news\");\n newsLoaded = true;\n });\n }\n\n function loadMonitoringItems(activityList, template, module, callback) {\n\n MonitoringResource.query({\n module: module\n }, function(response) {\n var news = response.map(function(element) {\n return createMonitoringActivity(element);\n });\n\n for (var i = 0; i < news.length; i++) {\n activityList.push(news[i]);\n }\n\n callback();\n\n $scope.checkIfAllActivitiesLoaded();\n\n });\n }\n\n $scope.postNews = function(news) {\n if (news) {\n NewsResource.save(news, function() {\n growl.success(\"News Posted successfully\");\n });\n }\n };\n\n $scope.$watchCollection('activityList', function() {\n $scope.activityList.sort(compareByCreatedDate);\n });\n\n function compareByCreatedDate(a, b) {\n if (a.createdAt > b.createdAt)\n return -1;\n if (a.createdAt < b.createdAt)\n return 1;\n return 0;\n }\n $scope.toggleTask = function() {\n $scope.showTask = true;\n $scope.showNews = false;\n $scope.showActivities = false;\n $scope.showAll = false;\n };\n\n $scope.toggleNews = function() {\n $scope.showTask = false;\n $scope.showNews = true;\n $scope.showActivities = false;\n $scope.showAll = false;\n };\n $scope.toggleActivities = function() {\n $scope.showTask = false;\n $scope.showNews = false;\n $scope.showActivities = true;\n $scope.showAll = false;\n };\n $scope.toggleShowAll = function() {\n $scope.showTask = false;\n $scope.showNews = false;\n $scope.showActivities = false;\n $scope.showAll = true;\n };\n\n $scope.showClass = function(activity_class) {\n if ($scope.showAll) {\n return true;\n } else if (activity_class == 'tasks') {\n return $scope.showTask;\n } else if (activity_class == 'news') {\n return $scope.showNews;\n } else if (activity_class == 'activity') {\n return $scope.showActivities;\n }\n };\n\n function retrieveUnseenActivities(array, type) {\n var unseenCounter = 0;\n for (var i = 0; i < array.length - 1; i++) {\n if (array[i].class === type) {\n if (array[i].createdAt > $scope.activityStreamTime) {\n unseenCounter++;\n }\n }\n }\n return unseenCounter;\n }\n\n (function init() {\n $scope.initActivities();\n })();\n\n }\n ]);\n","angular.module('llax')\n .controller('AdminSettingsController',\n /*@ngInject*/\n function($dialogs, $rootScope, $scope, $timeout, $translate, growl,\n HttpStatus, RevalidateItemsResource, RecalculateStatisticsResource, CurrentOperationsResource, ReindexItemsResource, ExportItemResource) {\n\n var OPERATION_KEYS = {\n 'recalculate': 'RECALCULATE_STATISTICS'\n };\n\n $scope.currentOperations = $scope.currentOperations || [];\n\n $scope.operationIsInProgress = false;\n\n $scope.getCurrentOperation = function() {\n CurrentOperationsResource.query({ textsOnly: true },\n function(response) {\n $scope.currentOperations = response;\n },\n function(response) {\n $scope.status = response.status;\n });\n };\n $scope.getCurrentOperation();\n\n $scope.$watch('currentOperations', function(value) {\n if (value.toString().match(/\\w/g) != null) {\n $scope.operationIsInProgress = true;\n } else {\n $scope.operationIsInProgress = false;\n }\n });\n\n $scope.startOperation = function(operationName, force) {\n\n // $scope.operationIsInProgress = true;\n\n switch (operationName) {\n case 'revalidate':\n RevalidateItemsResource.get();\n break;\n case 'recalculate':\n RecalculateStatisticsResource.get({ force: force },\n function() {\n growl.info('ADMINISTRATION.RECALCULATION_IN_PROGRESS');\n }, function(errorResponse) {\n if (!force && errorResponse.status === HttpStatus.PRECONDITION_FAILED) {\n restartOperation(operationName, $translate.instant('ADMINISTRATION.RECALCULATE_STATISTICS'));\n }\n return;\n });\n break;\n case 'revalidateOnlyDirty':\n RevalidateItemsResource.get({onlyDirty:true});\n break;\n case 'reindexAllItems':\n ReindexItemsResource.reindex();\n }\n\n $timeout(function() {\n $scope.getCurrentOperation();\n }, 500);\n\n };\n\n function restartOperation(operationName, operationLabel) {\n\n var operationKey = OPERATION_KEYS[operationName];\n CurrentOperationsResource.get({operationKey: operationKey}, function(operation) {\n\n if (_.isEmpty(operation) || _.isNil(operation.updatedAt)) {\n $scope.startOperation(operationName, true);\n return;\n }\n\n var lastUpdatedAt = $rootScope.formatDateToSimpleString(operation.updatedAt);\n var msg = $translate.instant('ADMINISTRATION.FORCE_OPERATION_EXECUTION', {\n operationName: operationLabel,\n lastUpdatedAt: lastUpdatedAt\n });\n\n $dialogs.confirm('ADMINISTRATION.OPERATION_IN_PROGRESS_HEADER', msg).result.then(function() {\n $scope.startOperation(operationName, true);\n });\n\n });\n\n }\n\n $scope.deleteOldUnfinishedExports = function() {\n growl.info('OPERATION.DELETE_OLD_UNFINISHED_EXPORTS.STARTED');\n var presentDate = new Date();\n presentDate.setHours(presentDate.getHours() - 24);\n var reqDateVal = presentDate.toISOString();\n\n ExportItemResource.delete({\n before: reqDateVal\n }, function(response) {\n growl.success('OPERATION.DELETE_OLD_UNFINISHED_EXPORTS.FINISHED');\n });\n };\n\n }\n );\n","(function() {\n 'use strict';\n\n app.constant(\"Modernizr\", Modernizr);\n angular.module('llax.app', [\n 'angulartics',\n 'llax.directives',\n 'llax.services',\n 'llax.translations',\n 'ng.shims.placeholder',\n 'ngResource',\n 'ngSanitize',\n 'pascalprecht.translate',\n 'ui.select',\n 'ui.tree'\n ])\n .run(function($anchorScroll, $cookies, $dialogs, $document, $filter, $http, $injector, $interval, $location, $log, $modal, $modalStack, $parse, $q,\n $rootScope, $sce, $templateCache, $timeout, $translate, $window, growl, rowSorter,\n AdditionalCategoryService, AppConstants, Auth, ChannelService, CodelistRessource, ContactsResource,\n DataModelResource, DefaultUiConfig, EnumAttributeService, ErrorCode, EtagLoader, HttpHeader,\n InputTemplatesService, LocalCacheService, MultiDimensionalAttributeService, ReferenceAttributesService,\n OrganizationService, SystemSettingsResource, TourService, uiGridConstants, UrlRetrievalService, UserDataModelResource,\n UserPreferencesResource, UsersGroupService, UsersService, WatchlistService, UpsellingAdsService, CheckURLRessource, FilePreviewService) {\n\n migrateLocalStorage();\n\n $rootScope.cssLoaded = false;\n var defaultUiConfig = {\n title: 'BYRD',\n favIcon: 'favicon.ico',\n appleTouchFavIcon: 'apple-touch-icon.png'\n };\n\n // feature for disabling backspace navigation (see LAX-3421)\n $document.bind(\"keydown keypress\", function(evt) {\n if (evt.key === 8) {\n var allowed = /INPUT|SELECT|TEXTAREA/i;\n if (!allowed.test(evt.target.tagName) || evt.target.disabled || evt.target.readOnly) {\n evt.preventDefault();\n }\n }\n });\n\n function getSiteUrl(s) {\n return lax_rest_url_complete('site/' + s);\n }\n\n function isCustomSite() {\n\n // Check if hostname is a custom site,\n // i.e. it is a \"valid\" hostname and differs from all possible hostnames\n var hostname = hostname || window.location.hostname;\n if (hostname === __laxHostname__ || !(hostname.indexOf('.') > 0 && /^[a-zA-Z]/.test(hostname))) {\n // Hostname matches or is not valid, so it cannot be a customSite\n return false;\n }\n\n // Find a matching domain for the defined hostname.\n // If found, check the current hostname against all possible hostnames\n var matchingDomain = _.find(__laxDomains__, function(domain) {\n if (_.endsWith(__laxHostname__, '.' + domain)) {\n return true;\n }\n });\n if (!_.isEmpty(matchingDomain)) {\n\n matchingDomain = '.' + matchingDomain;\n var laxHostnamePrefix = __laxHostname__.slice(0, -(matchingDomain.length));\n var matches = _.some(__laxDomains__, function(domain) {\n return (hostname === (laxHostnamePrefix + '.' + domain));\n });\n\n // Current hostname matches a possible hostname, so it is not a customSite\n return !matches;\n }\n\n return true;\n }\n\n // FIXME: custom site configurations should have their own service file.\n var CUSTOM_SITE_DESIGN = 'custom-site-css';\n var customUiConfig = {};\n\n $rootScope.uiConfig = function(key) {\n var customValue = customUiConfig[key];\n if (customValue !== undefined) {\n return customValue;\n } else {\n return DefaultUiConfig[key];\n }\n };\n\n $rootScope.uiConfigUrl = function(key) {\n var customValue = customUiConfig[key];\n if (customValue !== undefined) {\n if (!_.startsWith(_.toLower(customValue), 'http:') && !_.startsWith(_.toLower(customValue), 'https:')) {\n if (!_.startsWith(customValue, '/')) {\n customValue = getSiteUrl(customValue);\n } else {\n customValue = window.location.protocol + \"//\" + window.location.host + customValue;\n }\n }\n return customValue;\n } else {\n return DefaultUiConfig[key];\n }\n };\n\n function loadCustomUiConfig(overrideDesign) {\n\n var url = getSiteUrl('custom.json?emptyIfNotFound=true');\n $http.get(url).then(function(response) {\n\n var design, designPath;\n\n var addCustomCss;\n var customCssPath = getSiteUrl('custom.css?emptyIfNotFound=true');\n\n if (!_.isEmpty(response.data)) {\n\n for (var key in response.data) {\n customUiConfig[key] = response.data[key];\n }\n\n design = customUiConfig.design;\n if (_.isEmpty(design)) {\n if (customUiConfig.use_default_design != true) {\n design = window.location.host + '/customSiteCss';\n designPath = customCssPath;\n } else {\n addCustomCss = true;\n }\n }\n\n } else {\n customUiConfig = {};\n }\n\n $rootScope.disableSignUpBtn = customUiConfig.disable_signup;\n\n if (overrideDesign) {\n design = overrideDesign;\n designPath = null;\n } else {\n design = design || $rootScope.systemSettings.NEW_ORGANIZATION_DEFAULT_DESIGN;\n }\n\n if (_.isEmpty(design)) {\n $rootScope.cssLoaded = true;\n } else {\n $rootScope.setDesign(design, designPath).then(function() {\n if (addCustomCss) {\n setCustomCss(CUSTOM_SITE_DESIGN, customCssPath);\n }\n });\n }\n\n var favIconElement = angular.element('link[rel~=\"icon\"]');\n var appleTouchIcon = angular.element('link[rel~=\"apple-touch-icon-precomposed\"]');\n if (!_.isNil(customUiConfig.fav_icon) && !_.isEmpty(favIconElement) && !_.isEmpty(appleTouchIcon)) {\n favIconElement[0].href = customUiConfig.fav_icon;\n appleTouchIcon[0].href = customUiConfig.fav_icon;\n } else {\n favIconElement[0].href = defaultUiConfig.favIcon;\n appleTouchIcon[0].href = defaultUiConfig.appleTouchFavIcon;\n }\n\n var titleElement = angular.element('title');\n if (!_.isNil(customUiConfig.page_title) && !_.isEmpty(titleElement)) {\n titleElement[0].innerText = customUiConfig.page_title;\n } else {\n titleElement[0].innerText = defaultUiConfig.title;\n }\n\n if (!_.isNil(customUiConfig.disable_tours)) {\n $rootScope.disableTours = true;\n }\n\n if (!_.isNil(customUiConfig.support_email)) {\n $rootScope.customSiteSupportEmail = customUiConfig.support_email;\n }\n\n if (!_.isNil(customUiConfig.terms_of_service)) {\n $rootScope.customSiteTermsOfService = customUiConfig.terms_of_service;\n }\n\n if (!_.isNil(customUiConfig.terms_of_service_text)) {\n $rootScope.customSiteTermsOfServiceText = customUiConfig.terms_of_service_text;\n }\n\n if (!_.isEmpty(customUiConfig.additional_user_settings_menu_entries)) {\n $rootScope.additionalUserSettingsMenuEntries = customUiConfig.additional_user_settings_menu_entries;\n }\n\n if (!_.isEmpty(customUiConfig.support_widget)) {\n $rootScope.supportWidget = customUiConfig.support_widget;\n }\n\n });\n }\n\n function loadDefaultSiteUiConfig() {\n\n var favIconElement = angular.element('link[rel~=\"icon\"]');\n var appleTouchIcon = angular.element('link[rel~=\"apple-touch-icon-precomposed\"]');\n if (!_.isEmpty(favIconElement) && !_.isEmpty(appleTouchIcon)) {\n favIconElement[0].href = defaultUiConfig.favIcon;\n appleTouchIcon[0].href = defaultUiConfig.appleTouchFavIcon;\n }\n\n var titleElement = angular.element('title');\n if (!_.isEmpty(titleElement)) {\n titleElement[0].innerText = defaultUiConfig.title;\n }\n\n }\n\n $rootScope.systemSettings = {};\n\n $rootScope.systemSetting = function(key) {\n return systemSettings[key];\n };\n\n $rootScope.getTermsOfServiceUrl = function() {\n if (!_.isNil($rootScope.customSiteTermsOfService)) {\n return $rootScope.customSiteTermsOfService;\n } else {\n return $rootScope.systemSettings.TERMS_AND_CONDITIONS_URL;\n }\n };\n\n $rootScope.getLoginTermsOfServiceText = function() {\n // FIXME: We should rethink how to override the translations defined in custom site configurations, just like\n // what we do in 'translationLoader' for data models, the following could be of help\n // -> https://github.com/angular-translate/angular-translate/issues/1125#issuecomment-122667786\n var customSiteText = $rootScope.customSiteTermsOfServiceText;\n if (!_.isNil(customSiteText) &&\n !_.isNil(customSiteText[$rootScope.language])) {\n var languageText = customSiteText[$rootScope.language];\n languageText = languageText.replace('{{url}}', $rootScope.getTermsOfServiceUrl());\n return $sce.trustAsHtml(languageText);\n } else {\n var translation = $translate.instant('TERMS_AND_CONDITIONS.LOGIN', {\n url: $rootScope.getTermsOfServiceUrl()\n });\n return $sce.trustAsHtml(translation);\n }\n };\n\n $rootScope.initializeSettings = function () {\n return SystemSettingsResource.get({}, function(response) {\n\n var ads = response.ads || [];\n var systemSettings = response.systemSettings;\n\n angular.forEach(systemSettings, function(value, key) {\n $rootScope.systemSettings[key] = value;\n });\n\n if (isCustomSite()) {\n loadCustomUiConfig();\n } else if (!_.isEmpty($rootScope.systemSettings.NEW_ORGANIZATION_DEFAULT_DESIGN)){\n loadDefaultSiteUiConfig();\n $rootScope.setDesign($rootScope.systemSettings.NEW_ORGANIZATION_DEFAULT_DESIGN);\n } else {\n loadDefaultSiteUiConfig();\n $rootScope.cssLoaded = true;\n }\n //to test the upselling ads locally uncomment [263-266]\n // $http.get('http://localhost:3000/fetch-upselling-ads?marketingTargets=HCDP').then(function (res){\n // var eligibleAds = UpsellingAdsService.getEligibleAds(res.data || res);\n // $rootScope.upsellingAd = UpsellingAdsService.pickRandomAd(eligibleAds);\n // });\n\n if (ads.length > 0) {\n var eligibleAds = UpsellingAdsService.getEligibleAds(ads);\n $rootScope.upsellingAd = UpsellingAdsService.pickRandomAd(eligibleAds);\n }\n\n });\n };\n $rootScope.initializeSettings();\n\n $rootScope.setDesign = function(design, designPath) {\n\n var deferred = $q.defer();\n\n if (design == $rootScope.currentDesign) {\n deferred.reject();\n } else if (!_.isEmpty(design) && document.getElementById(design)) {\n $rootScope.currentDesign = designPath;\n deferred.reject();\n } else if (!_.isEmpty(design)) {\n\n if (_.isEmpty(designPath)) {\n if (!_.startsWith(design, '/')) {\n designPath = '/designs/' + design + '.css';\n } else if (_.startsWith(design, '/web/')) {\n if (_.endsWith(design, '.css')) {\n designPath = design + '?emptyIfNotFound=true';\n } else if (!_.endsWith(design, '.css?emptyIfNotFound=true')) {\n designPath = design + '.css?emptyIfNotFound=true';\n } else {\n designPath = design;\n }\n } else {\n designPath = design;\n }\n }\n\n $http.get(designPath).then(function() {\n unsetCustomCss(CUSTOM_SITE_DESIGN);\n unsetCustomCss($rootScope.currentDesign);\n setCustomCss(design, designPath);\n $rootScope.currentDesign = design;\n deferred.resolve();\n }, function(errorResponse) {\n $log.error(\"Could not load design '\" + design + \"' from path '\" + designPath + \"': \" + errorResponse.statusText);\n $rootScope.cssLoaded = true;\n });\n\n } else {\n deferred.reject();\n }\n\n return deferred.promise;\n };\n\n function setCustomCss(name, url) {\n\n var node = document.createElement('link');\n node.id = name;\n node.setAttribute('rel', 'stylesheet');\n node.setAttribute('type', 'text/css');\n node.setAttribute('href', url);\n document.getElementsByTagName('head')[0].appendChild(node);\n\n node.onload = function() {\n $rootScope.cssLoaded = true;\n $rootScope.$digest();\n };\n\n }\n\n function unsetCustomCss(name) {\n if (!_.isEmpty(name)) {\n var linkNode = document.getElementById(name);\n if (linkNode) {\n linkNode.parentNode.removeChild(linkNode);\n }\n }\n }\n\n $rootScope.handleSSOResponse = function(response) {\n\n // Ensure, response was received from our own origin\n var origin = window.location.origin;\n var responseUrl = new URL(response.config.url, origin);\n if (responseUrl.origin !== origin) {\n $rootScope.singleSignOn = false;\n return $rootScope.singleSignOn;\n }\n\n // Check if and which type of sso is returned\n var ssoRedirect = response.headers(HttpHeader.SSO_REDIRECT);\n var ssoPost = response.headers(HttpHeader.SSO_POST);\n if (ssoRedirect) {\n\n // Manually redirect, because a \"normal\" redirect response somehow does not work correctly in AngularJS\n var ssoRedirectURI = response.data;\n $log.info(\"Got a SSO redirect response\");\n $log.debug(\"SSO redirection URI:\", ssoRedirectURI);\n\n } else if (ssoPost) {\n\n // Show html post form from params\n var ssoPostParams = response.data;\n $log.info(\"Go a SSO POST response\");\n $log.debug(\"SSO post params:\", ssoPostParams);\n\n } else {\n $rootScope.singleSignOn = false;\n return $rootScope.singleSignOn;\n }\n\n $cookies.remove(AppConstants.AUTHENTICATION_TOKEN);\n $rootScope.singleSignOn = true;\n\n var msg = $rootScope.loggingOut ? 'SSO.LOGOUT_REDIRECT' : 'SSO.LOGIN_REDIRECT';\n\n $modal.open({\n template: '
' + msg + '
',\n }).opened.then(function() {\n $timeout(function() {\n if (!_.isEmpty(ssoRedirectURI)) {\n\n // Manually redirect to URI\n window.location = ssoRedirectURI;\n\n } else if (!_.isEmpty(ssoPostParams)) {\n\n // Show html post form from params\n /* jshint evil:true */\n document.open();\n document.write(ssoPostParams.formHtml);\n document.close();\n /* jshint evil:false */\n\n }\n }, 2000);\n });\n\n return $rootScope.singleSignOn;\n };\n\n var DATA_MODEL_TAG_KEY = \"dataModelTag\";\n var DATA_MODEL_MAP_KEY = \"dataModelMap\";\n\n var USER_DATA_MODEL_TAG_KEY = \"userDataModelTag\";\n var USER_DATA_MODEL_MAP_KEY = \"userDataModelMap\";\n\n $rootScope._ = _;\n $rootScope.disableSignUpBtn = false;\n $rootScope.referencedItems = [];\n $rootScope.bulkSearchLoading = false;\n $rootScope.bulkSearchStillRunning = false;\n $rootScope.bulkSearch = false;\n $rootScope.escapeSearchTerm = function(term) {\n //all colons need to be escaped in the search Term:\n if (term === undefined) return undefined;\n return term.replace(/:\\s*/g, '\\\\:');\n };\n\n $rootScope.getErrorCode = function(errorResponse) {\n var errorCode = _.get(errorResponse, 'data.errorCode') || ErrorCode.UNSPECIFIED;\n return errorCode;\n };\n\n $rootScope.getErrorMessage = function(errorResponse, defaultMessage) {\n var errorMessage = _.get(errorResponse, 'data.message');\n if (errorMessage) {\n var errorParams = _.get(errorResponse, 'data.parameters');\n errorMessage = $rootScope.translate(errorMessage, errorMessage, errorParams);\n } else {\n errorMessage = defaultMessage || errorResponse.data;\n }\n return errorMessage;\n };\n\n $rootScope.getErrorParameter = function(errorResponse, paramName) {\n return _.get(errorResponse, 'data.parameters' + '.' + paramName);\n };\n\n $rootScope.getOptions = function ($scope, attributeDefinition, memberAttributes, data, config, modelString) {\n\n config = config || {};\n var editable = (config.editable === true);\n var addRemoveButton = (config.removeButton ? true : false);\n var columnDefs = [];\n\n // The following attributes `enableCellEdit` state should be disabled in a grid\n // due to their nature, but that doesn't mean that all of them will be readonly, as they\n // define their own editing behavior using the view template of the column.\n var NO_EDIT_TEMPLATES_RENDERERS = [\n 'AdditionalCategory',\n 'SingleBoolean',\n 'Document',\n 'Image'\n ];\n var READONLY_COMPOSITE_ATTRIBUTES = [ 'MultiReference' ];\n\n /*\n * We need to check the attribute readonly state everytime\n * we try to edit a cell, in case the attribute readonly state\n * has changed via a validation attribute states response.\n */\n var cellEditableConditionFn = function cellEditableConditionFn ($scope, triggerEvent) {\n\n if (editable && !_.isNil($scope.col.colDef.attribute)) {\n\n var attribute = $scope.col.colDef.attribute;\n var attributeRenderer = getAttributeRenderer(attribute);\n var rendererType = attributeRenderer.type;\n\n var ofRendererWithNoEditTemplate = _.includes(NO_EDIT_TEMPLATES_RENDERERS, rendererType);\n var readonlyByAttributeStates = $scope.col.grid.appScope.isAttributeReadonly(attribute);\n\n var readonlyByCompositeAttribute = false;\n if (READONLY_COMPOSITE_ATTRIBUTES.contains(attributeDefinition.typeName)) {\n\n if ($rootScope.dataModel.isMetaAttribute(attribute.name)) {\n readonlyByCompositeAttribute = true;\n } else {\n\n // Some composite attributes has their own readonly logic, ex. MultiReference attributes\n // only allow editing the transient attributes stored on the link.\n var transientAttributes = ReferenceAttributesService.getTransientAttributes(attributeDefinition);\n if (transientAttributes.contains(attribute.name)) {\n readonlyByCompositeAttribute = false;\n } else {\n readonlyByCompositeAttribute = true;\n }\n\n }\n }\n\n if (!ofRendererWithNoEditTemplate &&\n !readonlyByAttributeStates &&\n !readonlyByCompositeAttribute) {\n return true;\n }\n }\n\n return false;\n };\n\n for (var i = 0; i < memberAttributes.length; i++) {\n\n var memberAttribute = $rootScope.dataModel.attribute(memberAttributes[i]);\n if (!_.isNil(memberAttribute)) {\n var columnDef = {\n attribute: memberAttribute,\n field: memberAttribute.name,\n headerTooltip: true,\n cellEditableCondition: cellEditableConditionFn,\n width: '*',\n minWidth: 140\n };\n\n // Prepare column definition for sorting in case of any\n _.assign(columnDef, $rootScope.getColumnSortingOptions(attributeDefinition, memberAttribute, i));\n\n $rootScope.generateCellEditors(memberAttribute, columnDef, $scope, config);\n\n $rootScope.extendColumnDefinition(attributeDefinition, columnDef);\n\n $rootScope.generateCellHeader(memberAttribute, columnDef, attributeDefinition);\n\n columnDefs.push(columnDef);\n } else {\n $log.error('There was a missing member attribute ' + memberAttributes[i] + ' in the data model while preparing attribute ' + attributeDefinition.name + '.');\n }\n\n }\n\n if (addRemoveButton) {\n var cellTemplate = $rootScope.generateActionsColumnDefinition(attributeDefinition);\n\n columnDefs.push({\n field: 'remove',\n width: 50,\n displayName: '',\n cellClass: 'text-right',\n cellTemplate: cellTemplate,\n enableCellEdit: false,\n pinnedRight: true,\n enableHiding: false\n });\n }\n return {\n data: modelString,\n enableHighlighting: true,\n enableColumnResize: true,\n enableColumnMenus: false,\n enableRowHeaderSelection: false,\n enableGridMenu: true,\n multiSelect: false,\n columnDefs: columnDefs,\n rowHeight: 34,\n enableHorizontalScrollbar: 1, // hide\n enableVerticalScrollbar: 1, // show when needed\n onRegisterApi: function(gridApi) {\n\n if (attributeDefinition.typeName === 'MultiDimensional') {\n gridApi.core.on.rowsRendered($scope, function() {\n\n // Check every row errors and add them to the list of\n // local validations so we can prevent the user from saving\n // the item while the MultiDimensional attribute is invalid.\n var rowValidationErrors = [];\n _.forEach(gridApi.grid.rows, function(row) {\n row.isInvalid = !MultiDimensionalAttributeService.validateMultiDimensionalEntry(row,\n gridApi.grid.rows,\n attributeDefinition);\n\n if (row.isInvalid) {\n rowValidationErrors.push(row.errors);\n }\n });\n\n gridApi.grid.appScope.$emit('addLocalValidation', {\n path: modelString,\n attributeErrors: {\n attribute: attributeDefinition,\n errors: _.uniq(rowValidationErrors)\n }\n });\n });\n }\n }\n };\n };\n\n // Default sorting algorithms by base class\n // Needs to be set, because attribute values are only stored as String!\n var defaultSorters = {\n 'Integer': function(a, b) { return rowSorter.sortNumberStr(a, b); },\n 'Float': function(a, b) { return rowSorter.sortNumberStr(a, b); },\n 'Boolean': function(a, b) { return rowSorter.sortBool(a, b); },\n 'Date': function(a, b) { return rowSorter.sortDate(a, b); },\n 'DateTime': function(a, b) { return rowSorter.sortDate(a, b); },\n };\n\n $rootScope.getColumnSortingOptions = function(attributeDefinition, memberAttribute, indexOfMemberAttribute) {\n\n var sortingOptions = _.find(attributeDefinition.params.uiCollectionSorter, function(attributeSortingOptions) {\n return attributeSortingOptions.key === memberAttribute.name;\n });\n\n if (!_.isNil(sortingOptions)) {\n\n var sortingAlgorithm = sortingOptions.value.sortingAlgorithm;\n var sortingFunction = $rootScope.getService(sortingAlgorithm);\n if (_.isNil(sortingFunction)) {\n $log.warn(\"Sorting function '\" + sortingAlgorithm +\n \"' is defined in attribute '\" + attributeDefinition.name +\n \"' for member attribute '\" + memberAttribute.name +\n \"' but was not found!'\");\n } else {\n\n var user = $rootScope.user;\n var organization = OrganizationService.getOrganizationSnapshot();\n\n return {\n sort: {\n priority: sortingOptions.value.sortPriority || indexOfMemberAttribute,\n direction: sortingOptions.value.initialDirection || uiGridConstants.ASC\n },\n sortDirectionCycle: sortingOptions.value.sortDirectionCycle || undefined,\n suppressRemoveSort: sortingOptions.value.suppressRemoveSort || false,\n sortingAlgorithm: prepareSortingAlgorithm(memberAttribute, attributeDefinition, sortingFunction, user, organization)\n };\n }\n\n }\n\n // Define a default sorter for specific base classes\n var sorter = defaultSorters[memberAttribute.baseClass];\n if (_.isFunction(sorter)) {\n return {\n sortingAlgorithm: sorter\n };\n } else {\n return {};\n }\n };\n\n function prepareSortingAlgorithm(memberAttribute, parentAttribute, sortingFunction, user, organization) {\n return function(a, b, rowA, rowB, direction) {\n return sortingFunction(a, b, rowA.entity, rowB.entity, direction, memberAttribute, parentAttribute, user, organization);\n };\n }\n\n function getAttributeRenderer(attribute) {\n // Return the renderer and it's additional data for a given attribute.\n //\n // Falls back to the string representation or attribute type if no renderer\n // was set in the data model.\n //\n // examples for return values:\n // {type: 'String'} or {type: 'TextArea', rows: 10}\n var renderer = null;\n var rendererParams;\n if (attribute.params) {\n renderer = attribute.params.customRenderer || attribute.params.renderer;\n if (angular.isObject(renderer)) {\n rendererParams = {};\n angular.forEach(renderer, function(entry) {\n rendererParams[entry.key] = entry.value;\n });\n renderer = rendererParams;\n } else if (angular.isString(renderer)) {\n renderer = {\n type: renderer\n };\n }\n }\n\n // fallback if no valid renderer is defined\n renderer = renderer || {};\n if (!renderer.type) {\n renderer.type = attribute.typeName || attribute.baseClass;\n }\n\n return renderer;\n }\n\n $rootScope.generateCellHeader = function(memberAttribute, columnDefinition, attribute) {\n\n if (attribute.typeName === 'MultiDimensional' &&\n MultiDimensionalAttributeService.isKeyAttribute(memberAttribute, attribute)) {\n // For MultiDimensional, if the header represents a key attribute member, we mark it with a special icon.\n columnDefinition.headerCellClass = 'header-primary-attribute-icon';\n }\n };\n\n $rootScope.extendColumnDefinition = function(attributeDefinition, columnDefinition) {\n\n if (attributeDefinition.typeName === 'MultiDimensional') {\n columnDefinition.cellClass = function(grid, row, col, rowRenderIndex, colRenderIndex) {\n var isRowValid = MultiDimensionalAttributeService.validateMultiDimensionalEntry(row, grid.rows, attributeDefinition);\n if (!isRowValid) {\n return 'ui-grid-invalid-cell';\n } else {\n return '';\n }\n };\n } else if (attributeDefinition.typeName === 'MultiReference') {\n columnDefinition.cellClass = function(grid, row, col, rowRenderIndex, colRenderIndex) {\n if (row.entity.deleted__) {\n return 'ui-grid-invalid-cell';\n } else {\n return '';\n }\n };\n }\n };\n\n $rootScope.generateActionsColumnDefinition = function(attributeDefinition) {\n\n var prefix = '
';\n var suffix = '
';\n var removeButtonTemplate =\n '';\n\n var additionalButtons = '';\n if (attributeDefinition.typeName === 'MultiDimensional') {\n additionalButtons = '';\n } else if (attributeDefinition.typeName === 'MultiReference') {\n var errorMessage = $translate.instant('MULTI_REFERENCE.REFERENCED_ITEM_NOT_FOUND');\n additionalButtons = '';\n }\n\n return prefix + additionalButtons + removeButtonTemplate + suffix;\n };\n\n $rootScope.generateCellEditors = function(attribute, columnDefinition, scope, config) {\n\n $rootScope.prepareAttribute(attribute);\n columnDefinition.displayName = attribute.translatedLabel;\n\n config = config || {};\n\n var context = (config.context || 'grid');\n var emptyDefault = (config.emptyDefault || false);\n var readOnly = (config.editable === false) || attribute.readOnly;\n var cellId = \"cell-{{grid.renderContainers.body.visibleRowCache.indexOf(row) + '-' + grid.renderContainers.body.visibleColumnCache.indexOf(col)}}\";\n var renderer = getAttributeRenderer(attribute);\n var attributeName = attribute.name + \"_{{grid.renderContainers.body.visibleRowCache.indexOf(row)}}\";\n\n columnDefinition.cellId = cellId;\n columnDefinition.attributeName = attributeName;\n columnDefinition.readonly = readOnly;\n var cellTemplate = $templateCache.get('Grid-' + renderer.type);\n if (cellTemplate) {\n columnDefinition.renderer = renderer;\n // FIXME: 'getAttributeOptions()' has unexpected behavior with dynamically loaded\n // options, use 'EnumAttributeService.getAttributesAsync()' instead.\n columnDefinition.options = $rootScope.getAttributeOptions(attribute, true);\n columnDefinition.cellTemplate = cellTemplate;\n\n // Set editable custom template, if it exists\n // Readonly state will be determined at runtime (post-render of the grid), but\n // we should always provide the edit template in case the readonly state\n // changes by other item changes.\n var editableCellTemplate = $templateCache.get('Grid-Editable-' + renderer.type);\n if (editableCellTemplate) {\n columnDefinition.editableCellTemplate = editableCellTemplate;\n }\n } else if (renderer.type === \"AdditionalCategory\") {\n generateCellEditorForAdditionalCategoryType(columnDefinition, readOnly, cellId);\n } else if (renderer.type === \"Boolean\" ||\n renderer.type === \"Enum\" ||\n renderer.type === \"OpenEnum\" ||\n renderer.type === \"Codelist\" ||\n renderer.type === \"OpenCodelist\") {\n generateCellEditorForAnyEnumType(columnDefinition, readOnly, cellId, scope, attribute, attributeName);\n } else if (renderer.type === \"EnumSet\" ||\n renderer.type === \"OpenEnumSet\" ||\n renderer.type === \"CodelistSet\" ||\n renderer.type === \"OpenCodelistSet\") {\n generateCellEditorForEnumSet(columnDefinition, readOnly, cellId, scope, attribute, attributeName);\n } else if (renderer.type ===\"SingleBoolean\") {\n generateCellEditorForSingleBooleanType(columnDefinition, readOnly, cellId, scope, attribute, attributeName);\n } else if (renderer.type === \"Date\") {\n generateCellEditorForDateType(columnDefinition, readOnly, cellId, scope.getDateFormat(attribute), attributeName);\n } else if (renderer.type === \"DateTime\") {\n generateCellEditorForDateTimeType(columnDefinition, readOnly, cellId, scope.getDateFormat(attribute), attributeName);\n } else if (renderer.type === \"Dimensional\" || renderer.type === \"MultiLineDimensional\") {\n generateCellEditorForDimensional(columnDefinition, readOnly, cellId, attributeName);\n } else if (renderer.type === \"Document\" || renderer.type === \"Image\") {\n generateCellEditorForDocumentOrImageType(columnDefinition, readOnly, cellId);\n } else if (renderer.type === \"Float\") {\n generateCellEditorForFloatType(columnDefinition, readOnly, cellId, attributeName);\n } else if (renderer.type === \"Physical\") {\n generateCellEditorForPhysicalType(columnDefinition, readOnly, cellId, context, attribute, attributeName, scope);\n } else if (renderer.type === \"TextArea\") {\n generateCellEditorForTextAreaType(columnDefinition, readOnly, cellId, renderer.rows);\n } else {\n generateDefaultCellEditor(columnDefinition, readOnly, cellId, attribute, attributeName);\n }\n\n // default cellTemplate\n if (attribute.name === \"category__\") {\n columnDefinition.cellTemplate = columnDefinition.cellTemplate ? columnDefinition.cellTemplate : '{{COL_FIELD | categoryNameToLabel}}';\n } else {\n columnDefinition.cellTemplate = columnDefinition.cellTemplate ? columnDefinition.cellTemplate : '{{COL_FIELD CUSTOM_FILTERS}}';\n }\n\n var cellTemplatePrefix;\n var cellTemplateSuffix;\n if (context === \"browse\" || context === \"subscription\") {\n cellTemplatePrefix =\n '
';\n cellTemplateSuffix = '
';\n } else {\n cellTemplatePrefix = '
';\n cellTemplateSuffix = '
';\n }\n\n columnDefinition.cellTemplate = cellTemplatePrefix + columnDefinition.cellTemplate + cellTemplateSuffix;\n\n };\n\n function generateCellEditorForAdditionalCategoryType(colDef, readOnly, cellId) {\n colDef.cellTemplate =\n '' +\n '';\n colDef.enableCellEdit = false;\n }\n\n function generateCellEditorForAnyEnumType(colDef, readOnly, cellId, scope, attribute, attributeName) {\n\n colDef.getOptionsPromise = EnumAttributeService.getAttributeOptionsAsync(attribute, true);\n colDef.cellTemplate = $templateCache.get('Grid-EnumType');\n\n // Readonly state will be determined at runtime (post-render of the grid), but\n // we should always provide the edit template in case the readonly state\n // changes by other item changes.\n colDef.editableCellTemplate = $templateCache.get('Grid-Editable-EnumType');\n }\n\n function generateCellEditorForEnumSet(colDef, readOnly, cellId, scope, attribute, attributeName) {\n\n EnumAttributeService.getAttributeOptionsAsync(attribute, true)\n .then(function(options) {\n colDef.options = options;\n });\n colDef.cellFilter = \"gridEnumSetFormatter:col.colDef.options\";\n\n // Readonly state will be determined at runtime (post-render of the grid), but\n // we should always provide the edit template in case the readonly state\n // changes by other item changes.\n colDef.editableCellTemplate = $templateCache.get('Grid-Editable-EnumSetType');\n }\n\n function generateCellEditorForSingleBooleanType(colDef, readOnly, cellId, scope, attribute, attributeName) {\n // FIXME: 'getAttributeOptions()' has unexpected behavior with dynamically loaded\n // options, use 'EnumAttributeService.getAttributesAsync()' instead.\n colDef.options = $rootScope.getAttributeOptions(attribute, true);\n colDef.cellTemplate = $templateCache.get('Grid-SingleBoolean');\n colDef.enableCellEdit = false;\n }\n\n function generateCellEditorForDateType(colDef, readOnly, cellId, format, attributeName) {\n colDef.cellFilter = \"date:'\" + format + \"'\";\n colDef.minWidth = 150;\n\n // Readonly state will be determined at runtime (post-render of the grid), but\n // we should always provide the edit template in case the readonly state\n // changes by other item changes.\n colDef.editableCellTemplate =\n '
' +\n '
' +\n ' ' +\n '
' +\n '
';\n }\n\n function generateCellEditorForDateTimeType(colDef, readOnly, cellId, format, attributeName) {\n colDef.cellFilter = \"date:'\" + format + \"'\";\n colDef.minWidth = 150;\n\n // Readonly state will be determined at runtime (post-render of the grid), but\n // we should always provide the edit template in case the readonly state\n // changes by other item changes.\n colDef.editableCellTemplate =\n '
' +\n '
' +\n ' ' +\n '
' +\n '
';\n }\n\n function generateCellEditorForDimensional(colDef, readOnly, cellId, attributeName) {\n colDef.cellTemplate =\n '
' +\n ' {{grid.getCellValue(row, col)[grid.appScope.getFirstFilteredDimensionKey(row.entity, col.colDef.attribute)]}}' +\n '
';\n\n // Readonly state will be determined at runtime (post-render of the grid), but\n // we should always provide the edit template in case the readonly state\n // changes by other item changes.\n colDef.editableCellTemplate =\n '
' +\n '
' +\n ' ' +\n '
' +\n '
';\n }\n\n function generateCellEditorForDocumentOrImageType(colDef, readOnly, cellId) {\n colDef.cellTemplate =\n '';\n colDef.enableCellEdit = false;\n }\n\n function generateCellEditorForFloatType(colDef, readOnly, cellId, attributeName) {\n colDef.cellFilter = \"formatFloatValue\";\n\n // Readonly state will be determined at runtime (post-render of the grid), but\n // we should always provide the edit template in case the readonly state\n // changes by other item changes.\n colDef.editableCellTemplate =\n '
' +\n '
' +\n ' ' +\n '
' +\n '
';\n }\n\n function generateCellEditorForPhysicalType(colDef, readOnly, cellId, context, attribute, attributeName, scope) {\n colDef.cellFilter = 'formatFloatValue:this | formatPhysicalValue:col.colDef.attribute';\n\n // Dynamically load the physical attribute options, whether it's in the browse layout (item is the row), or it's\n // in the editor (item is in the editor scope).\n colDef.getOptions = function(gridScope) {\n var options = $rootScope.getTranslatedOptions(attribute);\n var item = $rootScope.getItemInContext(context, scope, gridScope);\n\n return EnumAttributeService.filterOptions(item, gridScope.col.colDef.attribute, null, null, options);\n };\n\n // Readonly state will be determined at runtime (post-render of the grid), but\n // we should always provide the edit template in case the readonly state\n // changes by other item changes.\n colDef.editableCellTemplate =\n '
' +\n '
' +\n ' ' +\n '
' +\n '
';\n }\n\n function generateCellEditorForTextAreaType(colDef, readOnly, cellId, rows) {\n rows = rows || 1;\n\n // Readonly state will be determined at runtime (post-render of the grid), but\n // we should always provide the edit template in case the readonly state\n // changes by other item changes.\n var editableCellTemplate =\n '';\n colDef.editableCellTemplate = editableCellTemplate;\n }\n\n function generateDefaultCellEditor(colDef, readOnly, cellId, attribute, attributeName) {\n // TODO: we should check with Modernizr if attribute type is supported by browser\n // e.g.: type = (Modernizr.inputtypes[INPUT_TYPE] ? INPUT_TYPE : 'text');\n // for now it's set to 'text' (=string) as default\n var type = 'text';\n\n // Readonly state will be determined at runtime (post-render of the grid), but\n // we should always provide the edit template in case the readonly state\n // changes by other item changes.\n if (attribute.params && attribute.params.uiShowLength) {\n colDef.editableCellTemplate =\n '
' +\n ' ' +\n ' {{grid.appScope.getStringLengthMessage(MODEL_COL_FIELD.length, col.colDef.attribute.params.length)}}' +\n '
';\n } else {\n colDef.editableCellTemplate =\n '
' +\n '
' +\n ' ' +\n '
' +\n '
';\n }\n }\n\n $rootScope.isRowEditable = function(row) {\n if (_.isUndefined(row.editable)) {\n row.editable = $rootScope.hasItemPermission('edit', row.entity);\n }\n return row.editable;\n };\n\n $rootScope.isGridAttributeHidden = function(row, col) {\n\n var item = row.entity;\n var attributeStates = item.attributeStates__;\n\n if (!_.isEmpty(attributeStates) && attributeStates.contains((col.name + \":hidden\"))) {\n return true;\n }\n\n var category = item.category__;\n if (_.isNil(category)) { // Do further checks only for items having a category\n return false;\n }\n\n var inCategory = $rootScope.dataModel.categoryHasAttribute(category, col.name);\n return !inCategory; // Make all attrs hidden, if they are not in the category of the item\n };\n\n $rootScope.isGridAttributeReadOnly = function(row, col) {\n\n var item = row.entity;\n var attributeStates = item.attributeStates__;\n\n if (!_.isEmpty(attributeStates) && attributeStates.contains((col.name + \":readonly\"))) {\n return true;\n }\n\n if (!_.isEmpty(item.readonlyAttributes__) && item.readonlyAttributes__.contains((col.name))) {\n return true;\n }\n\n var category = item.category__;\n if (_.isNil(category)) { // Do further checks only for items having a category\n return false;\n }\n\n var inCategory = $rootScope.dataModel.categoryHasAttribute(category, col.name);\n return !inCategory; // Make all attrs readonly, if they are not in the category of the item\n };\n\n $rootScope.hasItemPermission = function(action, item) {\n return Auth.hasItemPermission(action, item);\n };\n\n $rootScope.showVal = function(object) {\n $log.info(\"showVal: object=\", object);\n };\n\n $rootScope.scrollTo = function(id) {\n var old = $location.hash();\n $location.hash(id);\n $anchorScroll();\n // reset to old to prevent route changes\n $location.hash(old);\n };\n\n $rootScope.getFirstFilteredDimensionKey = function(item, attribute) {\n var filteredDimensions = $rootScope.getFilteredDimensions(item, attribute, item[attribute.name]);\n var firstDimension = _.head(filteredDimensions);\n return firstDimension ? firstDimension.key : null;\n };\n\n // FIXME: `setInputRenderer` should be moved to dataModel.js and merged with `datamodel.attribute()`.\n $rootScope.setInputRenderer = function(attribute) {\n // Set the template and extra render parameters for an attribute\n var renderer = getAttributeRenderer(attribute);\n attribute.template = renderer.type;\n if (!attribute.params) {\n attribute.params = {};\n }\n attribute.params.rendererParams = renderer;\n };\n\n $rootScope.getItemGridData = function(attributeDefinition, item, name, model, doFilter, scope) {\n\n if (_.isNil(item) || _.isNil(model)) {\n return;\n }\n\n var modelEval = $parse(model);\n var modelValue = modelEval(scope);\n\n var value = [];\n if (_.isNil(modelValue)) {\n if (!item.primaryKey__ && attributeDefinition.defaultValue) { // if new item => set defaultValues\n value = angular.copy(attributeDefinition.defaultValue);\n }\n } else if (_.isString(modelValue) && modelValue.startsWith(\"[\")) {\n value = JSON.parse(modelValue.toString());\n } else {\n value = modelValue;\n }\n\n if (doFilter) {\n value = $rootScope.filterCollection(value, item, attributeDefinition);\n }\n\n // Replace null values with empty objects to prevent ui-grid from complaining\n value = _.map(value, function(gridItem){\n if (!gridItem) {\n return {};\n }\n return gridItem;\n });\n\n return value;\n };\n\n $rootScope.hasRole = function(role) {\n return !_.isNil($rootScope.user) &&\n (_.isNil($rootScope.user.roles) ||\n _.isEmpty($rootScope.user.roles) ||\n _.includes($rootScope.user.roles, role));\n };\n\n function hasOrganizationRole(role) {\n var organizationData = OrganizationService.getOrganizationSnapshot();\n var hasRole = organizationData !== null &&\n organizationData.organizationRole == role;\n return hasRole;\n }\n\n $rootScope.initOrganization = function() {\n\n var deferred = $q.defer();\n\n OrganizationService.getOrganization().subscribe(function(organization) {\n\n $rootScope.organization = angular.copy(organization);\n\n var design = _.get(organization, 'design');\n if (!_.isEmpty(_.get(organization, 'customSite')) || isCustomSite()) {\n loadCustomUiConfig(design);\n } else {\n customUiConfig = {};\n loadDefaultSiteUiConfig();\n $rootScope.setDesign(design);\n }\n\n deferred.resolve();\n });\n\n return deferred.promise;\n };\n\n $rootScope.initUsers = function() {\n UsersService.getUsers(true).subscribe(function(users) {\n $rootScope.users = angular.copy(users);\n });\n };\n\n $rootScope.hasRight = function(rights) {\n return Auth.hasRights(rights);\n };\n\n $rootScope.hasLicensedFeature = function(feature, organization) {\n var FEATURES_ALLOWED_FOR_COMPATIBILITY = ['TASKS'];\n organization = _.defaultTo(organization, $rootScope.organization);\n // Licensed features is new concept and not yet available to all organizations,\n // thus be default \"old\" organizations have all features!\n if (_.isNil(organization)) {\n return false;\n }\n if (_.isEmpty(organization.licensedFeatures)) {\n return _.includes(FEATURES_ALLOWED_FOR_COMPATIBILITY, feature);\n }\n var hasFeature = _.includes(organization.licensedFeatures, feature);\n return hasFeature;\n };\n\n $rootScope.hasSettingFeature = function(feature, organization) {\n organization = _.defaultTo(organization, $rootScope.organization);\n var value = _.get(organization, 'settings.FEATURE:' + feature);\n return value === true || value === 'true';\n };\n\n $rootScope.destroyAllNotifications = function() {\n var growlDOMContainer = angular.element('.growl-container');\n if (!_.isEmpty(growlDOMContainer)) {\n growlDOMContainer.scope().growlMessages.destroyAllMessages('0');\n }\n };\n\n $rootScope.inputTemplatesRegistered = false;\n\n $rootScope.activityStreamVisible = false;\n $rootScope.newActivities = 0;\n\n window.onunload = function(e) {\n $log.info(\"onunload:\", e);\n ChannelService.disconnect();\n };\n\n $rootScope.initWhenLoggedIn = function() {\n ChannelService.connect(function() {\n ChannelService.registerMultiple([\n ChannelService.BROADCAST_MESSAGE,\n ChannelService.BULK_SEARCH_CHANGED_EVENT,\n ChannelService.DATA_MODEL_ACTIVATEABLE_EVENT,\n ChannelService.DATA_MODEL_CHANGED_EVENT,\n ChannelService.DATA_MODEL_INVALID_EVENT,\n ChannelService.DATA_MODEL_TEMPLATE_INVALID_EVENT,\n ChannelService.EXPORT_SUMMARY_CHANGED_EVENT,\n ChannelService.FINISHED_VIRUS_SCAN_ON_ASSET,\n ChannelService.IMPORT_SUMMARY_CHANGED_EVENT,\n ChannelService.MASS_UPDATE_SUMMARY_CHANGED_EVENT,\n ChannelService.NEWS_STREAM_CHANGED_EVENT,\n // ChannelService.PUBLICATION_JOB_CHANGED_EVENT,\n // ChannelService.PUBLICATION_TASK_CHANGED_EVENT,\n ChannelService.TASK_ASSIGNED_EVENT,\n ChannelService.VALIDATION_FINISHED_EVENT,\n ChannelService.VALIDATION_TASK_CHANGED_EVENT,\n ChannelService.USERGROUPS_CHANGED\n ]);\n $rootScope.loadDataModel();\n if (Auth.hasRights('view.chat')) {\n ChannelService.register(ChannelService.CHAT_EVENT, null, true);\n }\n $rootScope.initUsers();\n });\n };\n\n $rootScope.getDateFormat = function(attribute) {\n var format;\n if (attribute.typeName === \"DateTime\" || attribute.baseClass === \"DateTime\") {\n format = \"medium\";\n } else {\n format = 'mediumDate';\n }\n// // FIXME: Because of an error in our EU1169 data model the default format for date values is wrong!\n// // Thus we have to decide, if and when we will enable a fixed format again.\n// if (attribute && attribute.params && attribute.params['format']) {\n// format = attribute.params['format'];\n// }\n return format;\n };\n\n $rootScope.isFavorite = function(item) {\n return item.tags__ !== undefined && item.tags__ !== null && item.tags__.contains(\"favorite:\" + $rootScope.userId);\n };\n\n $rootScope.normalizeToNilObject = function(object) {\n\n // FIXME: Who is actually using the service to override 'normalizeToNilObject'?\n var customService = $rootScope.getService('CustomService');\n\n return normalizeToNilObject(customService, object);\n };\n\n function normalizeToNilObject(customService, object) {\n\n _.forOwn(object, function(value, key) {\n\n // Ignore internal keys, e.g. __index__ inside a Group attribute\n if (_.startsWith(key, '__')) {\n delete object[key];\n return;\n }\n\n if (customService) {\n _.invoke(customService, 'normalizeToNilObject', object, key, value);\n }\n\n if (_.isArray(value) || _.isPlainObject(value)) {\n value = normalizeToNilObject(customService, value);\n } else {\n value = normalizeToNil(value);\n }\n\n if (_.isNil(value) || (_.isObject(value) && _.isEmpty(value))) {\n delete object[key];\n } else {\n object[key] = value;\n }\n\n });\n\n _.remove(object, function(v) {\n return _.isNil(v);\n });\n\n return _.isEmpty(object) ? undefined : object;\n }\n\n function normalizeToNil(value) {\n\n if (_.isDate(value)) {\n value = value.getTime();\n } else if (_.isString(value) && value.length === 0) {\n value = undefined;\n } else if (_.isArray(value) || _.isPlainObject(value)) {\n value = $rootScope.normalizeToNilObject(value);\n } else if (_.isObject(value)) {\n value = _.toString(value);\n }\n\n return value;\n }\n\n function equalCustomizer(value1, value2) {\n\n value1 = normalizeToNil(value1);\n value2 = normalizeToNil(value2);\n\n if (_.isEqual(value1, value2)) {\n return true;\n } else if (_.isNil(value1) && _.isNil(value2)) {\n return true;\n } else if (_.isNil(value1) || _.isNil(value2)) {\n return false;\n } else if (_.isNumber(value1) || _.isNumber(value2)) {\n return _.isEqual(_.toNumber(value1), _.toNumber(value2));\n }\n\n }\n\n $rootScope.isEqual = function(value1, value2) {\n return _.isEqualWith(value1, value2, equalCustomizer);\n };\n\n $rootScope.isEmpty = function(value) {\n var empty;\n if (_.isNil(value)) {\n empty = true;\n } else if (_.isString(value)) {\n empty = (value === '');\n } else if (_.isDate(value)) {\n empty = false;\n } else if (_.isArray(value) || _.isPlainObject(value)) {\n empty = _.isEmpty(value);\n } else {\n empty = false;\n }\n return empty;\n };\n\n $rootScope.toString = function(value) {\n return JSON.stringify(value);\n };\n\n $rootScope.resetDataModel = function() {\n\n $rootScope.dataModel = new DataModel({\n attributes: {},\n categories: {},\n layouts: {}\n }, $log, $rootScope, $translate, $q, $window, Auth, DataModelResource, EnumAttributeService, LocalCacheService);\n $rootScope.dataModelHash = null;\n $rootScope.communicationPlans = {};\n $rootScope.compiledTemplates = {};\n $rootScope.inputTemplatesRegistered = false;\n\n $rootScope.isDataModelLoaded = false;\n\n };\n $rootScope.resetDataModel();\n $rootScope.isDataModelLoading = false;\n $rootScope.isUserDataModelLoaded = false;\n\n $rootScope.reloadDataModel = function() {\n if (!$rootScope.isDataModelLoading) {\n $rootScope.resetDataModel();\n $rootScope.loadDataModel();\n $rootScope.refreshTranslations();\n $rootScope.refreshSupportedLocales();\n }\n };\n\n function isDataModelComplete(dataModel) {\n\n // Make sure dataModel contains attributes, categories and layouts\n if (dataModel === null || dataModel.attributes === null || dataModel.categories === null || dataModel.layouts === null) {\n console.log(\"DataModel is empty \", dataModel);\n return false;\n }\n\n // Make sure that at least one category is defined\n if ($rootScope.isEmpty(dataModel.categories)) {\n console.log(\"DataModel does not contain any category\");\n return false;\n }\n\n return true;\n }\n\n var dataModelLoader = new EtagLoader(DATA_MODEL_TAG_KEY, DATA_MODEL_MAP_KEY);\n\n $rootScope.loadDataModel = function() {\n\n if ($rootScope.isDataModelLoading) {\n $log.info(\"Called while data model is already loading\");\n } else if (!$rootScope.isDataModelLoaded) {\n\n $rootScope.isDataModelLoading = true;\n $rootScope.inputTemplatesRegistered = false;\n\n dataModelLoader\n .loadDataByResource(DataModelResource, {},\n setDataModel,\n restoreDataModel,\n errorDataModel)\n .then(loadUserDataModel)\n .then(signalDataModelLoaded)\n .finally(function() {\n $rootScope.isDataModelLoading = false;\n InputTemplatesService.loadTemplates();\n });\n\n }\n\n };\n\n function setDataModel(dataModelHash, dataModelMap, loader) {\n if (isDataModelComplete(dataModelMap)) {\n loader.storeData(dataModelHash, dataModelMap);\n createDataModel(dataModelHash, dataModelMap);\n $log.info(\"Loaded data model '\" + dataModelHash + \"':\", dataModelMap);\n } else {\n clearDataModel(loader);\n $log.info(\"Empty or insufficient data model returned:\", dataModelMap);\n }\n }\n\n function restoreDataModel(dataModelHash, dataModelMap, loader) {\n if (isDataModelComplete(dataModelMap)) {\n createDataModel(dataModelHash, dataModelMap);\n $log.info(\"Restored data model '\" + dataModelHash + \"' from local storage:\", dataModelMap);\n } else {\n clearDataModel(loader);\n $log.info(\"Empty or insufficient data model returned:\", dataModelMap);\n }\n }\n\n function errorDataModel(errorReason, loader) {\n loader.removeData();\n $rootScope.dataModelHash = null;\n $rootScope.dataModel = {\n errorStatus: errorReason.status,\n errorText: errorReason.data\n };\n $rootScope.communicationPlans = {};\n $rootScope.isDataModelLoading = false;\n }\n\n function clearDataModel(loader) {\n loader.removeData();\n $rootScope.resetDataModel();\n }\n\n function createDataModel(dataModelHash, dataModelMap) {\n\n $rootScope.dataModelHash = dataModelHash;\n $rootScope.dataModel = new DataModel(dataModelMap, $log, $rootScope, $translate, $q, $window, Auth, DataModelResource, EnumAttributeService, LocalCacheService);\n\n var plans = dataModelMap.communicationPlans || {};\n angular.forEach(plans, function(plan) {\n prepareCommunicationPlan(plan, plan.planCategory, 'planAttributes');\n prepareCommunicationPlan(plan, plan.publicationCategory, 'publicationAttributes');\n prepareCommunicationPlan(plan, plan.unpublicationCategory, 'unpublicationAttributes');\n prepareCommunicationPlan(plan, plan.subscriptionCategory, 'subscriptionAttributes');\n });\n $rootScope.communicationPlans = plans;\n\n }\n\n function prepareCommunicationPlan(plan, categoryName, categoryType) {\n\n if (categoryName) {\n\n // Load non meta attributes only\n var attributes = $rootScope.dataModel.categoryAttributes(categoryName);\n attributes = attributes.filter(function(attribute) {\n return !$rootScope.dataModel.isMetaAttribute(attribute);\n });\n\n // Set renderer and translations for attributes\n $rootScope.prepareAttributes(attributes);\n\n plan[categoryType] = attributes || [];\n\n } else {\n plan[categoryType] = [];\n }\n\n }\n\n $rootScope.getPreparedCommunicationPlans = function() {\n if (!_.isEmpty($rootScope.communicationPlans)) {\n _.forEach($rootScope.communicationPlans, function(plan) {\n if (!_.isEmpty(plan.planAttributes)) {\n $rootScope.prepareAttributes(plan.planAttributes, true);\n }\n });\n }\n return $rootScope.communicationPlans;\n };\n\n var userDataModelLoader = new EtagLoader(USER_DATA_MODEL_TAG_KEY, USER_DATA_MODEL_MAP_KEY);\n\n function loadUserDataModel() {\n return userDataModelLoader\n .loadDataByResource(UserDataModelResource, {},\n setUserDataModel,\n restoreUserDataModel,\n errorUserDataModel);\n }\n\n function setUserDataModel(userDataModelHash, userDataModelMap, loader) {\n\n if (!_.isEmpty(userDataModelMap)) {\n loader.storeData(userDataModelHash, userDataModelMap);\n $rootScope.dataModel.setCategoriesOverview(userDataModelMap.categoriesOverview || {});\n $rootScope.dataModel.setLayoutMapping(userDataModelMap.layoutMapping || {});\n $log.info(\"Loaded user data model '\" + userDataModelHash + \"':\", userDataModelMap);\n } else {\n clearUserDataModel(loader);\n $log.info(\"Empty user data model returned\");\n }\n\n $rootScope.isUserDataModelLoaded = true;\n\n }\n\n function restoreUserDataModel(userDataModelHash, userDataModelMap, loader) {\n\n if (!_.isEmpty(userDataModelMap)) {\n $rootScope.dataModel.setCategoriesOverview(userDataModelMap.categoriesOverview || {});\n $rootScope.dataModel.setLayoutMapping(userDataModelMap.layoutMapping || {});\n $log.info(\"Restored user data model '\" + userDataModelHash + \"' from local storage:\", userDataModelMap);\n } else {\n clearUserDataModel(loader);\n $log.info(\"Empty user data model returned\");\n }\n\n $rootScope.isUserDataModelLoaded = true;\n\n }\n\n function clearUserDataModel(loader) {\n loader.removeData();\n $rootScope.dataModel.setCategoriesOverview({});\n $rootScope.dataModel.setLayoutMapping({});\n }\n\n function errorUserDataModel(errorReason, loader) {\n clearUserDataModel(loader);\n }\n\n function signalDataModelLoaded() {\n $rootScope.isDataModelLoaded = true;\n $rootScope.$broadcast('dataModelLoaded');\n }\n\n $rootScope.$on('userAccountUpdated', function(event, userAccount) {\n $rootScope.dataModel.clearDefaultItems();\n });\n\n $rootScope.$on('organizationUpdated', function(event) {\n $rootScope.dataModel.clearDefaultItems();\n });\n\n $rootScope.$on('channelMessageReceived', function(event, eventData) {\n if (hopscotch.getCurrTour()) {\n return;\n }\n if (eventData.event === ChannelService.DATA_MODEL_CHANGED_EVENT) {\n var modal = $modalStack.getTop();\n\n if (!!modal && modal.value.modalScope.currentLayout == 'edit') {\n var itemModified = $rootScope.hasItemModified();\n var message = 'DATAMODEL.UPDATED';\n if (itemModified) {\n message = 'DATAMODEL.UPDATED.EDITING.UNSAVED_CHANGES';\n }\n\n var infoDialog = $dialogs.notify('MODAL.CONFIRM_HEADER', message);\n infoDialog.result.then(function() {\n window.location.reload();\n }, function() {\n window.location.reload();\n });\n\n } else if (!!modal || $rootScope.uploaderHasFiles) {\n $rootScope.shouldReload = true;\n growl.info('DATAMODEL.UPDATED.EDITING', {\n ttl: 15000\n });\n } else {\n growl.info('DATAMODEL.UPDATED', {\n ttl: 15000\n });\n setTimeout(function() {\n window.location.reload();\n }, 1000);\n }\n } else if (eventData.event === ChannelService.EXPORT_SUMMARY_CHANGED_EVENT) {\n if (eventData.data.status === 'FINISHED' && eventData.data.creationUser === $rootScope.user.userId) {\n var link = \"/api/v1/gatherings/\" + eventData.data.id + eventData.data.digitalAssetPath + \"?download=true\";\n growl.warning('EXPORT.SAVE_SUCCESS_MESSAGE', {\n variables: {link: link},\n referenceId: 1,\n ttl: -1\n });\n }\n } else if (eventData.event === ChannelService.FINISHED_VIRUS_SCAN_ON_ASSET) {\n if (eventData.data.virusStatus === 'INFECTED') {\n var path = eventData.data.filePath;\n growl.error('VIRUS_SCAN.INFECTED', {\n variables: {path: path},\n referenceId: 1,\n ttl: -1\n });\n }\n } else if (eventData.event === ChannelService.NEAR_ITEM_LIMIT_EVENT) {\n growl.warning(\"USAGE_LIMIT.NEAR_ITEM_LIMIT_EVENT\", {\n variables: {\n usage: eventData.data.usage,\n limit: eventData.data.limit\n },\n ttl: -1\n });\n }\n //TOFIX : we need to find a better way to listen to PUBLICATION_TASK_CHANGED_EVENT\n // else if (eventData.event === ChannelService.PUBLICATION_TASK_CHANGED_EVENT) {\n // var publication = eventData.data.publication;\n // if (eventData.data.typeOfChange === \"updated\" && publication.user === $rootScope.user.userId) {\n // // Only notify current user\n // switch (publication.taskStatus) {\n // case 'SUCCESS':\n // growl.info(publication.publicationType === 'ADD' ?\n // 'PUBLICATION_FINISHED.SUCCESS' : 'DEPUBLICATION_FINISHED.SUCCESS', {\n // variables: { count: publication.publishedItemsCount },\n // referenceId: 1,\n // ttl: -1\n // });\n // break;\n // case 'ERROR':\n // growl.error(publication.publicationType === 'ADD' ?\n // 'PUBLICATION_FINISHED.ERROR' : 'DEPUBLICATION_FINISHED.ERROR', {\n // variables: { errorMessage: publication.message },\n // ttl: -1\n // });\n // break;\n // }\n // }\n // }\n else if (eventData.event === ChannelService.USERGROUPS_CHANGED) {\n UsersGroupService.reloadUsersAndGroups();\n } else if (eventData.event === ChannelService.DATA_MODEL_INVALID_EVENT) {\n if (eventData.data.account.userId === $rootScope.user.userId) {\n growl.error('DATA_MODEL_ERROR', {\n variables: {errorMessage: eventData.data.errorMessage},\n ttl: -1\n });\n }\n } else if (eventData.event === ChannelService.BROADCAST_MESSAGE) {\n var includeRoles = eventData.data.includeRoles;\n var excludeRoles = eventData.data.excludeRoles;\n var effectiveRoles = $rootScope.user.effectiveRoles;\n if ((eventData.data.includeSelf || (eventData.data.userId !== $rootScope.userId)) &&\n ((eventData.data.userId === $rootScope.userId) || _.isNil(includeRoles) || _.has(includeRoles, effectiveRoles)) &&\n ((eventData.data.userId === $rootScope.userId) || _.isNil(excludeRoles) || !_.has(excludeRoles, effectiveRoles))) {\n var severity = eventData.data.severity || 'success';\n var params = {};\n if (!_.isNil(eventData.data.referenceId)) {\n params.referenceId = eventData.data.referenceId;\n }\n if (!_.isNil(eventData.data.variables)) {\n params.variables = eventData.data.variables;\n }\n if (!_.isNil(eventData.data.timeToLive)) {\n params.ttl = eventData.data.timeToLive;\n }\n _.invoke(growl, severity, eventData.data.message, params);\n }\n } else if (eventData.event === ChannelService.BULK_SEARCH_CHANGED_EVENT) {\n\n // `bulkSearchChanged` event can be received by bulk search and bulk subscriptions, so we\n // need to normalize both event entities as they are a little bit different.\n var bulkSearchOrSubscriptionEntry = eventData.data.bulkSearch || eventData.data.entry;\n if (_.isNil(bulkSearchOrSubscriptionEntry)) {\n $log.error('Received `bulkSearchChanged` event, but no entry was attached to the event', eventData);\n return;\n }\n\n var changedByUserId = bulkSearchOrSubscriptionEntry.user || bulkSearchOrSubscriptionEntry.updatedBy;\n if (changedByUserId === $rootScope.user.userId) {\n var status = bulkSearchOrSubscriptionEntry.status;\n if (status === 'RUNNING') {\n $rootScope.bulkSearchLoading = true;\n $rootScope.$broadcast('fetchItems');\n } else if (status === 'READY') {\n $rootScope.$broadcast('fetchItems');\n setTimeout(function() {\n growl.success('BULK_SEARCH.FINISHED');\n }, 1);\n $rootScope.bulkSearchStillRunning = false;\n } else if (status === 'ERROR') {\n growl.success('BULK_SEARCH.ERROR');\n }\n if (bulkSearchOrSubscriptionEntry.finished) {\n $rootScope.bulkSearchLoading = false;\n }\n }\n } else if (eventData.event === ChannelService.VALIDATION_TASK_CHANGED_EVENT) {\n var validationTask = eventData.data.validationTask;\n var validationStatus = eventData.data.status;\n\n if(validationTask.identification === $rootScope.user.userId) {\n if (validationStatus === 'FINISHED') {\n growl.success('ITEMS_VALIDATION_FINISHED', {\n variables: {\n itemCount: validationTask.validatedItemsCount\n }\n });\n } else if (validationStatus === 'FAILED') {\n growl.error('ITEMS_VALIDATION_FAILED', {\n variables: {\n itemCount: validationTask.validatedItemsCount\n },\n ttl: -1\n });\n }\n }\n } else if (eventData.event === ChannelService.ZIP_BOMB_DETECTED_EVENT) {\n growl.error('IMPORTS.ERROR_ZIP_BOMB', {variables: eventData.data});\n }\n });\n\n $rootScope.reloadAfterDataModelUpdate = function() {\n if ($rootScope.shouldReload) {\n setTimeout(function() {\n window.location.reload();\n }, 1000);\n }\n };\n\n $rootScope.queryCategories = function(query, dataModel, extension, leaf, limit) {\n query = $rootScope.escapeSearchTerm(query);\n var queryParams = {q: query, dataModel: dataModel, extension: extension, leaf: leaf, limit: limit};\n return $http.get(lax_rest_url('datamodel/retrieval/categories'), {params: queryParams}).then(function(res) {\n return res.data;\n });\n };\n\n $rootScope.cleanupItem = function(item) {\n $rootScope.tmpItem = angular.copy(item);\n // Cleanup values for attributes of type 'MultiReference':\n // Remove all values which are not part of the attribute definition\n var multiRefAttributes = _.filter($rootScope.dataModel.allAttributes(), function(attribute) {\n return attribute.typeName === 'MultiReference';\n });\n\n var allGroups = _.filter($rootScope.dataModel.allAttributes(), function (attribute) {\n return attribute.typeName === 'Group';\n });\n\n var groupsWithMultiRefAttribute = _.filter(allGroups, function (attribute) {\n var groupMembers = $rootScope.dataModel.attribute(attribute.params.valueAttribute).members;\n var groupHasMultiRef = false;\n _.forEach(groupMembers, function (attr) {\n var tmpAttr = $rootScope.dataModel.attribute(attr);\n if (tmpAttr.typeName === 'MultiReference') {\n groupHasMultiRef = true;\n }\n });\n\n return groupHasMultiRef;\n });\n\n // No need to do cleanup, when no multi-ref attributes exist\n if (_.isEmpty(multiRefAttributes)) {\n return $rootScope.tmpItem;\n }\n\n var changedValues = {};\n _.forEach(multiRefAttributes, function(attribute) {\n\n // No need to filter, if no values for the attribute exist\n var multiRefValues = $rootScope.tmpItem[attribute.name];\n if (_.isEmpty(multiRefValues)) {\n return;\n }\n\n var valueAttribute = $rootScope.dataModel.attribute(attribute.params.valueAttribute);\n var newMultiRefValues = [];\n\n // Create new values collection containing only members of the value attribute\n _.forEach(multiRefValues, function(multiRefValue) {\n var newMultiRefValue = {};\n _.forEach(valueAttribute.members, function(member) {\n if (!_.isEmpty(multiRefValue[member])) {\n newMultiRefValue[member] = multiRefValue[member];\n }\n });\n newMultiRefValues.push(newMultiRefValue);\n });\n\n changedValues[attribute.name] = newMultiRefValues;\n\n });\n\n var groupModels = Object.keys($rootScope.referencedItems);\n\n if(!_.isEmpty(groupModels)) {\n _.forEach(groupModels, function(model) {\n var modelEval = $parse(model.replace(\"item\",\"tmpItem\"));\n var attributeName = model.split(\"'\").slice(-2).reverse().pop();\n var attribute = $rootScope.dataModel.attribute(attributeName);\n\n // No need to filter, if no values for the attribute exist\n var multiRefValues = modelEval($rootScope);\n\n if (_.isEmpty(multiRefValues) || _.isEmpty(attribute)) {\n return;\n }\n\n var valueAttribute = $rootScope.dataModel.attribute(attribute.params.valueAttribute);\n var newMultiRefValues = [];\n\n // Create new values collection containing only members of the value attribute\n _.forEach(multiRefValues, function(multiRefValue) {\n var newMultiRefValue = {};\n _.forEach(valueAttribute.members, function(member) {\n if (!_.isEmpty(multiRefValue[member])) {\n newMultiRefValue[member] = multiRefValue[member];\n }\n });\n newMultiRefValues.push(newMultiRefValue);\n });\n\n modelEval.assign($rootScope, newMultiRefValues);\n });\n }\n\n if (_.isEmpty(changedValues)) {\n return $rootScope.tmpItem;\n } else {\n var cleanedItem = angular.copy($rootScope.tmpItem);\n angular.extend(cleanedItem, changedValues);\n return cleanedItem;\n }\n\n };\n\n // For compatibility with old data models that are not using the group-in-group functionality,\n // we have to make sure that \"Object\" or \"Array\" like values of \"String\" attributes are not stored as such,\n // but rather \"stringified\" before storing!\n $rootScope.stringifyDeepValues = function(item) {\n\n var modifiedItem = angular.copy(item);\n var changedValues = _.pickBy(modifiedItem, function(attribute) {\n return (_.isObject(attribute) && !_.isEmpty(attribute));\n });\n\n angular.forEach(changedValues, function(value, key) {\n\n if (!angular.isArray(value)) {\n return;\n }\n\n var parentAttribute = $rootScope.dataModel.attribute(key);\n if (_.isNil(parentAttribute) || parentAttribute.typeName !== 'Collection') {\n return;\n }\n\n angular.forEach(value, function(element) {\n angular.forEach(element, function(value1, key1) {\n\n var attribute = $rootScope.dataModel.attribute(key1);\n if (_.isNil(attribute) || attribute.baseClass !== 'String') {\n return;\n }\n\n if (angular.isArray(value1)) {\n element[key1] = value1.join();\n } else if (angular.isObject(value1)) {\n element[key1] = JSON.stringify(value1);\n }\n\n });\n });\n\n });\n\n modifiedItem = angular.extend(modifiedItem, changedValues);\n\n return modifiedItem;\n };\n\n $rootScope.contactsLoaded = false;\n\n $rootScope.getContactName = function(organizationId) {\n if ($rootScope.contactsLoaded) {\n var contact = _.find($rootScope.contactsMap, { organizationId: organizationId });\n if (!_.isNil(contact)) {\n return contact.name;\n }\n }\n return organizationId;\n };\n\n // This is just a Helper Function that can be used to create the property File-Entries from a Model File\n function logAttributesAndOptions(layoutResponse){\n var layoutstr = \"\";\n var optionStr = \"\";\n\n layoutResponse.forEach(function(layout){\n layout.attributes.forEach(function(attribute){\n layoutstr += \"attribute.\" + attribute.name + \"=\" + attribute.label + \"\\n\";\n if (attribute.typeName == \"Enum\"){\n var options = attribute.params.values;\n options.forEach(function(option){\n optionStr += \"option.\"+option.key+\"=\"+option.value+\"\\n\";\n });\n }\n });\n\n });\n console.log(layoutstr);\n console.log(optionStr);\n }\n $rootScope.mailTo = function(email){\n $window.location = \"mailto:\"+email;\n };\n\n var invitedBuyerTemplates = {\n 'tpl/sidebar.tpl.html' : 'tpl/buyer-sidebar.tpl.html',\n };\n var invitedSupplierTemplates = {\n 'tpl/sidebar.tpl.html' : 'tpl/supplier-sidebar.tpl.html',\n };\n\n $rootScope.getRoleSpecificTemplate = function(template) {\n if (hasOrganizationRole(\"INVITED_BUYER\")){\n //when there is a special template for buyers return this, otherwise return the original template\n template = invitedBuyerTemplates[template] || template;\n } else if (hasOrganizationRole(\"INVITED_SUPPLIER\")){\n template = invitedSupplierTemplates[template] || template;\n }\n return template;\n };\n\n $rootScope.getUserSalutation = function(user) {\n var result = [];\n if (!user || !user.userId) {\n return '';\n }\n _.forEach([user.firstName, user.lastName], function(part) {\n if (!_.isEmpty(part)) {\n result.push(part);\n }\n });\n if (_.isEmpty(result)) {\n result = user.userId;\n } else {\n result.push(\"(\" + user.userId + \")\");\n result = result.join(' ');\n }\n return result;\n };\n\n $rootScope.getUser = function(userId) {\n\n var userIdLowerCase = _.toLower(userId);\n\n if (_.isEmpty(userId) || _.isEmpty($rootScope.users)) {\n return null;\n }\n\n var user = _.find($rootScope.users, function(user) {\n var normalizedUserId = _.toLower(user.userId);\n return user.id == userId || normalizedUserId == userIdLowerCase;\n });\n\n return user;\n };\n\n $rootScope.getUserImageUrl = function(userId) {\n\n if (_.isEmpty(userId)) {\n return null;\n }\n\n var imageUrl;\n var user = $rootScope.getUser(userId);\n if (!_.isNil(user) && !_.isEmpty(user.imageUrl)) {\n imageUrl = user.imageUrl;\n }\n\n return imageUrl;\n };\n\n $rootScope.userHasImage = function(userId) {\n var user = $rootScope.getUser(userId);\n return !_.isNil(user) && !_.isEmpty(user.imageUrl);\n };\n\n $rootScope.getUserName = function(userId) {\n if (!userId) {\n return;\n }\n var user = UsersService.getUser(userId);\n return user ? user.displayName : userId;\n };\n\n $rootScope.getCurrentLayout = function() {\n var layout = $location.url().substring(1, $location.url().length);\n if (layout.indexOf('/') > -1) {\n layout = layout.substring(0, layout.indexOf('/'));\n }\n return layout;\n };\n\n $rootScope.$on('changePage', function(event,data) {\n $rootScope.$apply(function() {\n $location.path(data.location);\n });\n });\n\n hopscotch.registerHelper('waitfor', function waitFor(selector, timeout) {\n var currTour = hopscotch.getCurrTour();\n var currStepNum = hopscotch.getCurrStepNum();\n $rootScope.$apply(function() {\n var wait = $interval(function() {\n if ($(selector).length) {\n $interval.cancel(wait);\n hopscotch.startTour(currTour, currStepNum);\n }\n }, timeout || 500);\n });\n return false;\n });\n\n hopscotch.registerHelper('navigate', function hopscotchNavigate(location, timeout) {\n var currTour = hopscotch.getCurrTour();\n var currStepNum = hopscotch.getCurrStepNum();\n $rootScope.$apply(function() {\n $location.path(location);\n $timeout(function() {\n hopscotch.startTour(currTour, currStepNum);\n }, timeout || 500);\n });\n return false;\n });\n\n hopscotch.registerHelper('click', function(selector, timeout) {\n $timeout(function() {\n $(selector).click();\n }, timeout);\n });\n\n hopscotch.listen('error', function() {\n var tour = hopscotch.getCurrTour();\n var stepNum = hopscotch.getCurrStepNum();\n var step = tour.steps[stepNum];\n $log.error(\"Error in step #\" + step.id + \" of tour '\" + tour.id + \"'! Probably target does not exist.\");\n });\n\n $rootScope.loadTours = function() {\n TourService.loadTours().then(function(response) {\n $rootScope.tours = response;\n for (var i = 0; i < $rootScope.tours.length; i++) {\n var tour = $rootScope.tours[i];\n var tourName = tour.id + (tour.version ? \":\" + tour.version : \"\");\n var completed = $rootScope.user.completedTours || [];\n if (tour.startAlways || (tour.startAutomatically === true && !completed.contains(tourName))) {\n $rootScope.startTour(tour.id);\n return;\n }\n }\n });\n };\n\n function tourClose() {\n var tour = hopscotch.getCurrTour();\n var tourName = tour.id + (tour.version ? \":\" + tour.version : \"\");\n if (tour.closeWithoutConfirm) {\n TourService.setTourCompleted($rootScope.user, tourName, true);\n } else {\n var infoDialog = $dialogs.confirm('TOUR.CLOSED', 'TOUR.START_NEXT_TIME');\n infoDialog.result.then(function() {\n TourService.setTourCompleted($rootScope.user, tourName, false);\n }, function() {\n TourService.setTourCompleted($rootScope.user, tourName, true);\n });\n }\n }\n\n function prepareTour(tour) {\n tour.steps.forEach(function(step) {\n if (step.id) {\n var translationKey = 'TOUR.' + tour.id + '.' + step.id + '.';\n step.title = $rootScope.translate(translationKey + 'title', step.title);\n step.content = $rootScope.translate(translationKey + 'content', step.content);\n }\n });\n if (tour.closeWithoutConfirm) {\n tour.onClose = tourClose;\n tour.onEnd = tourClose;\n } else {\n tour.onClose = tourClose;\n }\n tour.skipIfNoElement = false;\n return tour;\n }\n\n $rootScope.startTour = function(tourId) {\n if ($rootScope.disableTours) {\n $log.info('App tours have been disabled as per the customUiConfig.');\n return;\n }\n var tour = _.find($rootScope.tours, {id: tourId});\n if (tour) {\n tour = prepareTour(tour);\n $timeout(function() {\n hopscotch.startTour(tour, 0);\n }, 500);\n }\n };\n\n var TIME = {\n MILLISECONDS_PER_SECOND: 1000,\n SECONDS_PER_MINUTE: 60,\n SECONDS_PER_HOUR: 3600,\n SECONDS_PER_DAY: 86400,\n SECONDS_PER_WEEK: 604800,\n SECONDS_PER_MONTH: 2419200,\n SECONDS_PER_YEAR: 29030400\n };\n\n $rootScope.formatDateToSimpleString = function(timestamp) {\n var currentTimestamp = new Date().getTime();\n var diff = (currentTimestamp - timestamp) / TIME.MILLISECONDS_PER_SECOND;\n var diffCount;\n\n if (diff < TIME.SECONDS_PER_MINUTE) {\n return $translate.instant('ACTIVITY.FEW_SECONDS');\n } else if (diff < TIME.SECONDS_PER_HOUR) {\n diffCount = Math.floor( diff / TIME.SECONDS_PER_MINUTE );\n return (diffCount == 1) ? $translate.instant('ACTIVITY.MINUTE_AGO') : $translate.instant('ACTIVITY.MINUTES_AGO', { count: diffCount });\n } else if (diff < TIME.SECONDS_PER_DAY) {\n diffCount = Math.floor( diff / TIME.SECONDS_PER_HOUR );\n return (diffCount == 1) ? $translate.instant('ACTIVITY.HOUR_AGO') : $translate.instant('ACTIVITY.HOURS_AGO', { count: diffCount });\n } else if (diff < TIME.SECONDS_PER_WEEK) {\n diffCount = Math.floor( diff / TIME.SECONDS_PER_DAY );\n return (diffCount == 1) ? $translate.instant('ACTIVITY.DAY_AGO') : $translate.instant('ACTIVITY.DAYS_AGO', { count: diffCount });\n } else if (diff < TIME.SECONDS_PER_MONTH) {\n diffCount = Math.floor( diff / TIME.SECONDS_PER_WEEK );\n return (diffCount == 1) ? $translate.instant('ACTIVITY.WEEK_AGO') : $translate.instant('ACTIVITY.WEEKS_AGO', { count: diffCount });\n } else if (diff < TIME.SECONDS_PER_YEAR) {\n diffCount = Math.floor( diff / TIME.SECONDS_PER_MONTH );\n return (diffCount == 1) ? $translate.instant('ACTIVITY.MONTH_AGO') : $translate.instant('ACTIVITY.MONTHS_AGO', { count: diffCount });\n } else {\n diffCount = Math.floor( diff / TIME.SECONDS_PER_YEAR );\n return (diffCount == 1) ? $translate.instant('ACTIVITY.YEAR_AGO') : $translate.instant('ACTIVITY.YEARS_AGO', { count: diffCount });\n }\n };\n\n // Parse a value according to it's type\n $rootScope.parseValue = function(value, type) {\n if (_.isNil(value)) {\n return value;\n }\n if (type === 'date') {\n // Simple ISO date string, without timezone\n return $filter('date')(value, \"yyyy-MM-dd\");\n } else if (type === 'dateTime' && !_.isDate(value)) {\n return new Date(_.toNumber(value));\n } else {\n return value;\n }\n };\n\n // State for datepickers\n $rootScope.datepickerOpened = {};\n\n // Helper to toggle specified datepicker and close all others\n $rootScope.toggleDatepicker = function(evt, name) {\n\n // Once a datepicker is opened, all others will be closed,\n // because their states are removed and thus become \"false\".\n var oldState = $rootScope.datepickerOpened[name];\n $rootScope.datepickerOpened = {};\n if (!oldState) {\n $rootScope.datepickerOpened[name] = true;\n }\n\n };\n\n $rootScope.isDatepickerOpen = function(name) {\n return $rootScope.datepickerOpened && ($rootScope.datepickerOpened[name] === true);\n };\n\n // Set renderer and translations for attributes\n $rootScope.prepareAttributes = function(attributes) {\n UrlRetrievalService.clear();\n angular.forEach(attributes, function(attribute) {\n $rootScope.setInputRenderer(attribute);\n $rootScope.prepareAttribute(attribute, true);\n });\n };\n\n $rootScope.prepareAttribute = function(attribute, forceReloadDynamicEnum) {\n\n attribute.translatedLabel = attribute.translatedLabel || $rootScope.translateAttribute(attribute);\n attribute.label = attribute.translatedLabel; // FIXME: Ensure that HTML code always uses \"translatedLabel\" and remove this line!\n attribute.translatedDescription = attribute.translatedDescription || $rootScope.translateAttributeDescription(attribute);\n attribute.description = attribute.translatedDescription; // FIXME: Ensure that HTML code always uses \"translatedDescription\" and remove this line!\n\n if (!_.isEmpty(attribute.params)) {\n if (_.isNil(attribute.readonly)) {\n attribute.readonly = attribute.params.readonly;\n }\n if (attribute.params.dynamicValuesUrl) {\n if (forceReloadDynamicEnum || _.isEmpty(attribute.params.values)) {\n UrlRetrievalService.get(attribute.params.dynamicValuesUrl).then(function(data) {\n attribute.params.values = data;\n delete attribute.options;\n });\n }\n }\n\n if (EnumAttributeService.isCodelistAttribute(attribute) && attribute.params.codelist) {\n if (forceReloadDynamicEnum || _.isEmpty(attribute.params.values)) {\n CodelistRessource.getPairs({name:attribute.params.codelist, limit:0}, function(data) {\n attribute.params.values = data;\n delete attribute.options;\n });\n }\n } else {\n EnumAttributeService.getAttributeOptionsAsync(attribute, forceReloadDynamicEnum);\n }\n }\n\n };\n\n $rootScope.translateAllOptions = function(attribute, options) {\n var dataModelGatheringKey = $rootScope.organization ? $rootScope.organization.dataModelGatheringKey : null;\n if (!_.isEmpty(dataModelGatheringKey)) {\n _.forEach(options, function(option) {\n option.translatedOption = $rootScope.translateOption(option, attribute);\n option.translatedOptionIcon = $rootScope.translateOptionIcon(option, attribute);\n if (_.isEmpty(option.translatedOptionIconUrl) && !_.isEmpty(option.translatedOptionIcon)) {\n option.translatedOptionIconUrl = lax_rest_url('gatherings/' + dataModelGatheringKey + '/' + option.translatedOptionIcon);\n }\n });\n }\n };\n\n $rootScope.formatAttributeValue = function(object, attribute) {\n\n if (_.isEmpty(object)) {\n return \"\";\n }\n\n var value = object[attribute.name];\n if (_.isEmpty(value)) {\n return \"\";\n }\n\n // FIXME: Create generic 'read-only' templates for attributes\n // and add other types (Float, Dimensional, EnumSet, OpenEnumSet etc.)\n\n var type = attribute.typeName || attribute.baseClass;\n if (type === 'Boolean' || type === 'Enum' || type === 'OpenEnum') {\n value = $filter('formatOptionValue')(value, attribute);\n } else if (type === 'Date') {\n value = $filter('date')(value, $rootScope.getDateFormat(attribute));\n } else if (type === 'Physical') {\n value = $filter('formatPhysicalValue')(value, attribute);\n }\n\n return value;\n };\n\n // DEPRECATED: iuParamsFilter should not be used anymore!\n $rootScope.filterAttributeParams = function(attribute, item, user, organization) {\n\n if (!attribute.params) {\n return;\n }\n\n var uiParamsFilter = attribute.params.uiParamsFilter;\n if (!uiParamsFilter) {\n return;\n }\n\n uiParamsFilter = $parse(uiParamsFilter);\n if (!uiParamsFilter) {\n return;\n }\n\n var context = {\n params: attribute.params,\n item: item,\n user: user,\n organization: organization,\n _: _\n };\n\n var modifiedParams = uiParamsFilter(context);\n if (!_.isObject(modifiedParams)) {\n $log.error(\"Returned modified params (\", modifiedParams, \") is not an object\");\n return;\n }\n\n _.assign(attribute.params, modifiedParams);\n\n };\n\n /**\n * DEPRECATED, in favor of 'EnumAttributeService.getAttributeOptionsAsync()'.\n * Using this method to get dynamically-loaded options has some unexpected behavior due to the nature of the dynamic values.\n */\n $rootScope.getAttributeOptions = function(attribute, forceReloadDynamicEnum) {\n\n if (_.has(attribute, 'options') && !forceReloadDynamicEnum) {\n return attribute.options;\n } else if (!_.has(attribute, 'params')) {\n return null;\n }\n\n if (_.has(attribute.params, 'dynamicValuesUrl')) {\n if (forceReloadDynamicEnum || _.isNil(attribute.params.values)) {\n\n // FIXME: Due to the usage of asynchronous promise,\n // this might not work 100% correctly!\n if (!attribute.loadingDynamicValues) {\n attribute.loadingDynamicValues = true;\n $log.debug(\"Reloading option values for DynamicEnum attribute '%s'\", attribute.name);\n UrlRetrievalService.get(attribute.params.dynamicValuesUrl).then(function(data) {\n attribute.params.values = data;\n delete attribute.options;\n $log.debug(\"Option values loaded for DynamicEnum attribute '%s'\", attribute.name);\n $rootScope.getAttributeOptions(attribute, false);\n }).finally(function() {\n attribute.loadingDynamicValues = false;\n });\n }\n\n }\n }\n\n var options;\n var optionsParam = $rootScope.dataModel.getAttributeOptionsParam(attribute);\n if (_.isEmpty(optionsParam)) {\n\n // Get options from referenced attribute, if no options were defined\n var referencedOptionAttribute = $rootScope.dataModel.getReferencedOptionAttribute(attribute);\n if (_.has(referencedOptionAttribute, 'params')) {\n\n $rootScope.prepareAttribute(referencedOptionAttribute);\n options = $rootScope.getAttributeOptions(referencedOptionAttribute, forceReloadDynamicEnum);\n if (!_.isEmpty(options)) {\n\n attribute.options = options;\n\n // Set optionsFilter and createNewOption, overriding the corresponding values of the referenced attribute\n attribute.optionsFilter = attribute.params.uiOptionsFilter || attribute.params.uiCodelistFilter || referencedOptionAttribute.optionsFilter;\n attribute.createNewOption = attribute.params.skipValuesValidation || referencedOptionAttribute.createNewOption;\n\n }\n\n }\n\n } else {\n\n options = _.get(attribute.params, optionsParam);\n if (_.isString(options)) {\n\n // Get options from optionList, including filtering by groups\n attribute.optionList = options;\n var groupNames = _.get(attribute.params, optionsParam + 'OptionGroups');\n options = $rootScope.dataModel.optionListOptions(attribute.optionList, groupNames);\n attribute.optionsFilter = attribute.params.uiOptionsFilter || attribute.params.uiCodelistFilter;\n\n }\n\n if (_.isArray(options)) {\n attribute.options = options;\n attribute.createNewOption = attribute.params.skipValuesValidation;\n attribute.optionsFilter = attribute.params.uiOptionsFilter || attribute.params.uiCodelistFilter;\n }\n\n }\n\n if (!_.isEmpty(options)) {\n $rootScope.translateAllOptions(attribute, options);\n }\n\n return options;\n };\n\n $rootScope.getFilteredDimensions = function(item, attribute, currentValue) {\n\n // FIXME: 'getAttributeOptions()' has unexpected behavior with dynamically loaded\n // options, use 'EnumAttributeService.getAttributesAsync()' instead.\n var options = $rootScope.getAttributeOptions(attribute);\n var filteredOptions = EnumAttributeService.filterOptions(item, attribute, null, currentValue, options);\n\n // Add options for all non empty values\n if (_.isObject(currentValue) && !_.isEmpty(currentValue)) {\n\n var modified = false;\n _.forOwn(currentValue, function(value, key) {\n\n // Don't add if value or key are empty\n if (_.isNil(value) || _.isNil(key)) {\n return;\n }\n\n // Don't add if key already exists in filtered options\n if (_.some(filteredOptions, {key: key})) {\n return;\n }\n\n // Find option in list of all options or create a new entry\n var option = _.find(options, {key: key});\n if (!option) {\n option = createNewOption(key);\n }\n\n if (!modified) {\n if (filteredOptions === options) {\n filteredOptions = _.clone(options);\n }\n // Add an empty dummy element to identify the additional non empty values\n if (!_.isEmpty(filteredOptions)) {\n filteredOptions.push(null);\n }\n modified = true;\n }\n filteredOptions.push(option);\n\n });\n\n }\n\n return filteredOptions;\n };\n\n /*\n * Returns the item in the context/layout provided, for example:\n * - 'browse' -> item is the grid row\n * - 'edit' or 'detail' -> item is in the scope\n * - otherwise (mass update or custom filter) -> there is no item\n */\n $rootScope.getItemInContext = function(context, attributeScope, gridScope) {\n if (context === 'browse') {\n return gridScope.row.entity;\n } else {\n return attributeScope.item;\n }\n };\n\n /*\n * Returns the row/entry of the collection where the function is being invoked from.\n */\n $rootScope.getCollectionEntryInContext = function(gridScope) {\n if (!_.isNil(gridScope)) {\n return gridScope.row.entity;\n }\n\n return null;\n };\n\n /*\n * Attaches an enum attribute options to the scope and the attribute object itself, based on\n * the context it was called from.\n *\n * @context: layout if available.\n * @attributeScope: the AngularJS scope that the attribute is being rendered in.\n * @gridScope: the angular-ui-grid scope if the attribute is being rendered in a grid row.\n */\n $rootScope.loadContextFilteredOptionsIntoScopeAsync = function(context, attributeScope, gridScope, attribute, currentValue, searchValue, addEmptyOption) {\n\n var item = $rootScope.getItemInContext(context, attributeScope, gridScope);\n var collectionEntry = $rootScope.getCollectionEntryInContext(gridScope);\n\n $rootScope.loadFilteredOptionsIntoScopeAsync(attributeScope, item, attribute, collectionEntry, currentValue, searchValue, addEmptyOption);\n\n };\n\n /*\n * DEPRECATED in favor of `loadContextFilteredOptionsIntoScopeAsync()`.\n */\n $rootScope.getContextFilteredOptions = function(context, attributeScope, gridScope, attribute, currentValue, searchValue, addEmptyOption) {\n var item = $rootScope.getItemInContext(context, attributeScope, gridScope);\n return $rootScope.getFilteredOptions(item, attribute, currentValue, searchValue, addEmptyOption);\n };\n\n /*\n * DEPRECATED in favor of `loadFilteredOptionsIntoScopeAsync()`.\n * This cannot be removed, as long as it's used in the data models, to ensure backward compatibility.\n */\n $rootScope.getFilteredOptions = function(item, attribute, currentValue, searchValue, addEmptyOption) {\n\n // FIXME: 'getAttributeOptions()' has unexpected behavior with dynamically loaded\n // options, use 'EnumAttributeService.getAttributesAsync()' instead.\n var options = $rootScope.getAttributeOptions(attribute, false);\n var filteredOptions = EnumAttributeService.filterOptions(item, attribute, null, currentValue, options);\n\n // Search via 'propsFilter', which also moves the currentValue option to the beginning, if searchValue is empty\n filteredOptions =\n $filter(\"propsFilter\")(filteredOptions,\n { key: searchValue, value: searchValue, translatedOption: searchValue },\n currentValue);\n\n // If first filtered option does not match either searchValue or currentValue,\n // create and add a new option for it at the beginning.\n // Add a new option for searchValue only, if the attribute allows adding new options.\n // Otherwise, use the currentValue, but only if the searchValue is empty and the currentValue is a string\n var matchValue;\n if (attribute.createNewOption && !_.isEmpty(searchValue)) {\n matchValue = searchValue;\n } else if (_.isString(currentValue) && _.isEmpty(searchValue)) {\n matchValue = currentValue;\n }\n if (!_.isEmpty(matchValue)) {\n\n var firstOption = filteredOptions[0];\n if (!matchesOption(firstOption, matchValue)) {\n if (filteredOptions === options) {\n filteredOptions = _.clone(options);\n }\n var newOption = createNewOption(matchValue);\n filteredOptions.unshift(newOption);\n }\n }\n\n // If currentValue is Array and filtered options does not match any currentValue\n // Create and add a new option at the begining of filtered options for unmatched values\n if (_.isArray(currentValue)) {\n _.forEach(currentValue,function(val) {\n if (!_.isNil(val)) {\n var optionNotFound = _.every(options,function(opt) {\n return !matchesOption(opt, val);\n });\n if (optionNotFound) {\n var newOption = createNewOption(val);\n filteredOptions.unshift(newOption);\n }\n }\n });\n }\n\n if (addEmptyOption) {\n if (filteredOptions === options) {\n filteredOptions = _.clone(options);\n }\n var pos = _.isEmpty(filteredOptions) ? 0 : 1;\n filteredOptions.splice(pos, 0, {'key': null, 'translatedOption': $rootScope.translate(\"ATTRIBUTE.EMPTY\", \"empty\")});\n }\n\n return filteredOptions;\n };\n\n /*\n * Attaches an enum attribute options to the scope and the attribute object itself.\n */\n $rootScope.loadFilteredOptionsIntoScopeAsync = function(scope, item, attribute, collectionEntry, currentValue, searchValue, addEmptyOption) {\n\n EnumAttributeService.getAttributeOptionsAsync(attribute, false)\n .then(function(options) {\n\n // Cache the options in the attribute object for the current session\n if (_.isEmpty(attribute.options)) {\n attribute.options = angular.copy(options);\n }\n\n var filteredOptions = EnumAttributeService.filterOptions(item, attribute, collectionEntry, currentValue, options);\n\n // Search via 'propsFilter', which also moves the currentValue option to the beginning, if searchValue is empty\n filteredOptions =\n $filter(\"propsFilter\")(filteredOptions,\n { key: searchValue, value: searchValue, translatedOption: searchValue },\n currentValue);\n\n // If first filtered option does not match either searchValue or currentValue,\n // create and add a new option for it at the beginning.\n // Add a new option for searchValue only, if the attribute allows adding new options.\n // Otherwise, use the currentValue, but only if the searchValue is empty and the currentValue is a string\n var matchValue;\n if (attribute.createNewOption && !_.isEmpty(searchValue)) {\n matchValue = searchValue;\n } else if (_.isString(currentValue) && _.isEmpty(searchValue)) {\n matchValue = currentValue;\n }\n if (!_.isEmpty(matchValue)) {\n\n var firstOption = filteredOptions[0];\n if (!matchesOption(firstOption, matchValue)) {\n if (filteredOptions === options) {\n filteredOptions = _.clone(options);\n }\n var newOption = createNewOption(matchValue);\n filteredOptions.unshift(newOption);\n }\n }\n\n // If currentValue is Array and filtered options does not match any currentValue\n // Create and add a new option at the begining of filtered options for unmatched values\n if (_.isArray(currentValue)) {\n _.forEach(currentValue,function(val) {\n if (!_.isNil(val)) {\n var optionNotFound = _.every(options,function(opt) {\n return !matchesOption(opt, val);\n });\n if (optionNotFound) {\n var newOption = createNewOption(val);\n filteredOptions.unshift(newOption);\n }\n }\n });\n }\n\n if (addEmptyOption) {\n if (filteredOptions === options) {\n filteredOptions = _.clone(options);\n }\n var pos = _.isEmpty(filteredOptions) ? 0 : 1;\n filteredOptions.splice(pos, 0, {'key': null, 'translatedOption': $rootScope.translate(\"ATTRIBUTE.EMPTY\", \"empty\")});\n }\n\n // In Set attributes, we want to keep any pre-filled values (for example via an import) which\n // are not part of the valid options of the attribute, and rely on the validations\n // to report using an invalid option.\n // _.isNil(searchValue) indicates that we are not in a search state!\n if (_.isArray(currentValue) && _.isNil(searchValue)) {\n _.forEach(currentValue, function(value) {\n var foundOption = _.find(filteredOptions, { key: value });\n if (_.isNil(foundOption)) {\n // One of the current values is not part of the attribute options, so we add it in order to keep it available for\n // the ui-select.\n filteredOptions.unshift({ key: value, value: value, translatedOption: value });\n }\n });\n }\n // translate the options\n $rootScope.translateAllOptions(attribute, filteredOptions);\n\n $timeout(function() {\n scope.options = filteredOptions;\n }, 0);\n });\n };\n\n function matchesOption(option, search) {\n if (!_.isObject(option) || _.isEmpty(option) || _.isEmpty(search)) {\n return false;\n }\n search = _.toLower(search);\n return _.toLower(option.key) === search ||\n _.toLower(option.value) === search ||\n _.toLower(option.translatedOption) === search;\n }\n\n $rootScope.isNewOption = function(option) {\n return !_.isObject(option) || _.isEmpty(option) || option.isNew;\n };\n\n function createNewOption(key) {\n if (!_.isEmpty(key)) {\n return {\n key: key,\n value: key,\n translatedOption: key,\n isNew: true\n };\n }\n }\n\n $rootScope.setGridAdditionalCategory = function(scope, keyVariable, valueVariable, attribute) {\n\n var additionalModule = _.get(attribute, 'params.additionalModule');\n scope[valueVariable] = {\n code: null,\n name: null,\n translatedLabel: null,\n formattedLabel: null\n };\n\n scope.$watch(keyVariable, function(key) {\n scope[valueVariable].formattedLabel = key;\n $rootScope.loadAdditionalCategory(key, additionalModule).then(function(value) {\n scope[valueVariable].code = value.code;\n scope[valueVariable].name = value.id;\n scope[valueVariable].translatedLabel = value.title;\n scope[valueVariable].formattedLabel = $filter('additionalCategoryFormatter')(value);\n });\n });\n\n };\n\n $rootScope.loadAdditionalCategory = function(additionalCategoryNameOrCode,\n additionalModule) {\n return AdditionalCategoryService.loadAdditionalCategory(additionalCategoryNameOrCode, additionalModule);\n };\n\n $rootScope.loadOptionsIntoScope = function(scope, getOptionsPromise, keyVariable) {\n\n getOptionsPromise.then(function(result) {\n scope.options = result;\n\n scope.$watch(keyVariable, function(key) {\n var value = findKeyValueObject(scope.options, key);\n value = value || createNewOption(key);\n scope.option = value;\n });\n });\n\n };\n\n function findKeyValueObject(keyValueObjects, key) {\n if (_.isEmpty(key)) {\n return null;\n } else {\n return _.find(keyValueObjects, { key: key });\n }\n }\n\n $rootScope.getValuesFormat = function(attribute, defaultFormat) {\n defaultFormat = defaultFormat || ['label'];\n var valuesFormat = attribute.valuesFormat || defaultFormat;\n _.forEach(valuesFormat, function(format, index) {\n // Replace each space with non-breakable space, for otherwise HTML would not render it\n valuesFormat[index] = _.replace(format, / /g, '\\xa0');\n });\n return valuesFormat;\n };\n\n $rootScope.getFilter = function(filterName) {\n if (Auth.isLoggedIn && !$rootScope.loggingOut && $injector.has(filterName + 'Filter')) {\n return $filter(filterName);\n } else {\n return null;\n }\n };\n\n $rootScope.getService = function(serviceName) {\n if (Auth.isLoggedIn && !$rootScope.loggingOut && $injector.has(serviceName)) {\n return $injector.get(serviceName);\n } else {\n return null;\n }\n };\n\n $rootScope.getServiceFunction = function(serviceName, functionName) {\n\n var service = $rootScope.getService(serviceName);\n if (_.isNil(service)) {\n return null;\n }\n\n if (_.isFunction(service[functionName])) {\n return service[functionName];\n }\n\n return null;\n };\n\n $rootScope.callService = function(serviceName, functionName) {\n\n var service = $rootScope.getService(serviceName);\n if (_.isNil(service)) {\n return null;\n }\n\n if (_.isFunction(service[functionName])) {\n // Need to use ES5 for whatever reason...\n var args = Array.prototype.slice.call(arguments, 2);\n return service[functionName].apply(this, args);\n } else if (!_.isUndefined(service[functionName])) {\n return service[functionName];\n }\n\n return null;\n };\n\n $rootScope.filterCollection = function(collection, item, attribute) {\n\n // Ensure collection is not null or undefined\n collection = collection || [];\n\n var filterName = attribute.params.uiCollectionFilter;\n if (_.isNil(filterName)) {\n return collection;\n }\n\n var filter = $rootScope.getFilter(filterName);\n if (_.isNil(filter)) {\n return collection;\n }\n\n var user = $rootScope.user;\n var organization = OrganizationService.getOrganizationSnapshot();\n\n var filteredCollection = filter(collection, item, attribute, user, organization);\n if (!_.isNil(filteredCollection)) {\n collection = filteredCollection;\n }\n\n return collection;\n };\n\n $rootScope.callout = function(target, message, config) {\n var defaultConfig = {\n id: 'callout-' + target,\n target: '#' + target,\n placement: 'top',\n content: message\n };\n calloutLogic(config, defaultConfig);\n };\n\n $rootScope.calloutWithId = function(target, id, message, config) {\n var defaultConfig = {\n id: 'callout-' + id,\n target: target,\n placement: 'top',\n content: message\n };\n calloutLogic(config, defaultConfig);\n };\n\n function calloutLogic(config, defaultConfig) {\n config = config ? angular.extend(defaultConfig, config) : defaultConfig;\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeAllCallouts();\n calloutMgr.createCallout(config);\n }\n\n $rootScope.removeAllCallouts = function() {\n hopscotch.getCalloutManager().removeAllCallouts();\n };\n\n var statusLabels = {\n ACCEPTED: 'label-success',\n BLOCKED: 'label-info',\n DEFERRED: 'label-default',\n DELIVERED: 'label-primary',\n ENDED: 'label-success',\n ERROR: 'label-danger',\n ESTABLISHED: 'label-success',\n EVALUATING: 'label-warning',\n EXCEPTION: 'label-warning',\n EXPORTING: 'label-info',\n FAILED: 'label-error',\n FATAL: 'label-danger',\n FINISHED: 'label-success',\n IGNORED: 'label-default',\n IMPORTED: 'label-success',\n IMPORTING: 'label-info',\n INACTIVE: 'label-default',\n INVITED: 'label-info',\n OPEN: 'label-warning',\n PENDING: 'label-info',\n PENDING_PROCESSING: 'label-default',\n PROCESSED: 'label-success',\n PROCESSING: 'label-info',\n RECEIVED: 'label-primary',\n REJECTED: 'label-warning',\n REVIEWED: 'label-danger',\n RUNNING: 'label-info',\n SENDING: 'label-info',\n STARTED: 'label-info',\n SUCCESS: 'label-success',\n UNEXPECTED_DELAY: 'label-warning',\n WARNING: 'label-warning'\n };\n\n $rootScope.getStatusLabel = function(status) {\n var label = statusLabels[status] || 'label-default';\n return label;\n };\n\n $rootScope.hasWatchlistItems = function() {\n return WatchlistService.hasWatchlistItems();\n };\n\n $rootScope.getWatchlistItemCount = function() {\n return WatchlistService.getWatchlistItemCount();\n };\n\n $rootScope.setSectionAttributeParam = function(layoutName, sectionName, attribute, paramName, defaultValue, item) {\n var paramValue;\n if (attribute.additionalParams) {\n paramValue = attribute.additionalParams[paramName];\n } else {\n paramValue =\n $rootScope.dataModel.sectionAttributeParam(layoutName,\n item,\n sectionName,\n attribute.name,\n paramName);\n }\n if (paramValue === undefined || paramValue === null) {\n paramValue = defaultValue;\n }\n attribute[paramName] = paramValue;\n };\n\n $rootScope.getItemTitle = function(layoutName, item) {\n var layout = $rootScope.dataModel.layout(layoutName);\n var filterName = layout.layoutOptions ? layout.layoutOptions.itemTitleFilter : null;\n if (_.isNil(filterName)) {\n return item.primaryKey__;\n }\n\n var filter = $rootScope.getFilter(filterName);\n if (_.isNil(filter)) {\n return item.primaryKey__;\n }\n return filter(item, $rootScope.user, $rootScope.organization);\n };\n\n $rootScope.getStringLengthMessage = function(current, expected) {\n var result = \"\";\n var maxValue = 0;\n\n if (!current) {\n current = 0;\n }\n\n if (_.isArray(expected)) {\n if (expected.length === 1) {\n maxValue = expected[0];\n }\n } else if (expected) {\n maxValue = expected;\n }\n var diff = maxValue - current;\n if (maxValue == 0) {\n result = current;\n } else {\n result = $rootScope.translate('STRING.LENGTH.MAX', \"\", {\n maxValue: maxValue,\n current: current\n });\n }\n\n return result;\n };\n\n $rootScope.isDefaultValueForAttribute = function(attributeName, newValue, oldValue) {\n var attribute = $rootScope.dataModel.attribute(attributeName);\n var isDefault = false;\n if (attribute && attribute.typeName == \"Dimensional\") {\n // Checking given value is default value for 'Dimensional' attributes\n var removedEmptyKeysObject = _.omitBy(newValue, function(e) {\n return _.isEmpty(e);\n });\n isDefault = (_.isEmpty(oldValue) && _.isEmpty(removedEmptyKeysObject)) || $rootScope.isEqual(oldValue, removedEmptyKeysObject);\n }\n return isDefault;\n };\n\n $rootScope.splitStringByOuterParentheses = function(str) {\n str = _.trim(str) || '';\n // splitting the query string by AND|OR if it exists outside of parentheses\n var strArr = _(str).split(/(AND|OR)(?![^(]*\\))/).without(\"\").value();\n strArr = _.map(strArr, function(s) {\n s = _.trim(s);\n // removing outer parentheses if exists\n if (s[0] == '(' && s[s.length-1]==')') {\n s = s.substring(1, s.length-1);\n }\n return s;\n });\n return _.isEmpty(strArr) ? [str] : strArr;\n };\n\n $rootScope.tagTransform = function (newTag) {\n var item = {\n key: newTag,\n value: newTag\n };\n return item;\n };\n\n // Initialize the usage of a user preferences stored grid state:\n // Set the scope and gridApi as well as the preferenceKey to store the state,\n // optionally set a 'gridStateKey' if the preference value is an Object.\n // 'gridStateKey' and 'defaultColumDefs' can either be actual values or functions to return the value.\n // Initialization will attach callbacks to column position, size, visibility and sort changes\n // and add a menu entry to reset the grid state to the specified default column defs\n $rootScope.initGridState = function(scope, gridApi, preferenceKey, gridStateKey, defaultColumnDefs) {\n\n if (_.isNil(scope) || _.isNil(gridApi) || _.isNil(preferenceKey)) {\n return;\n }\n\n // Attache callbacks to various grid changes, if available\n if (gridApi.colMovable) {\n gridApi.colMovable.on.columnPositionChanged(scope, function() {\n $rootScope.updateGridState(scope, gridApi, preferenceKey, gridStateKey);\n });\n }\n if (gridApi.colResizable) {\n gridApi.colResizable.on.columnSizeChanged(scope, function() {\n $rootScope.updateGridState(scope, gridApi, preferenceKey, gridStateKey);\n });\n }\n gridApi.core.on.columnVisibilityChanged(scope, function() {\n $rootScope.updateGridState(scope, gridApi, preferenceKey, gridStateKey);\n });\n gridApi.core.on.sortChanged(scope, function() {\n $rootScope.updateGridState(scope, gridApi, preferenceKey, gridStateKey);\n });\n if (_.isObject(scope.enableWrapping) && _.isUndefined(scope.$$listeners[preferenceKey])) {\n scope.$on(preferenceKey, function() {\n $rootScope.updateGridState(scope, gridApi, preferenceKey, gridStateKey);\n });\n }\n\n // Add 'reset' menu item\n $timeout(function() {\n gridApi.core.addToGridMenu(gridApi.grid, [{\n title: $translate.instant('RESET_GRID_COLUMNS'),\n action: function () {\n $rootScope.resetGridState(scope, gridApi, preferenceKey, gridStateKey, defaultColumnDefs);\n },\n order: 210\n }]);\n });\n\n // Restore state, if available\n $rootScope.restoreGridState(scope, gridApi, preferenceKey, gridStateKey);\n\n };\n\n // Reset the specified gridState:\n // Remove the local storage state and reset to the default column defs\n $rootScope.resetGridState = function(scope, gridApi, preferenceKey, gridStateKey, defaultColumnDefs) {\n\n if (_.isNil(scope) || _.isNil(gridApi) || _.isNil(preferenceKey)) {\n return;\n }\n\n if (_.isFunction(gridStateKey)) {\n gridStateKey = gridStateKey();\n }\n\n // Depending on gridStateKey, either remove the complete value or only the associated value\n var localGridStates = angular.fromJson(localStorage.getItem(preferenceKey));\n if (!_.isEmpty(localGridStates)) {\n if (_.isNil(gridStateKey)) {\n localGridStates = null;\n } else {\n delete localGridStates[gridStateKey];\n }\n }\n\n // Update local storage and user preferences accordingly\n if (_.isEmpty(localGridStates)) {\n localStorage.removeItem(preferenceKey);\n UserPreferencesResource.delete({ key: preferenceKey });\n } else {\n var gridStateJson = angular.toJson(localGridStates);\n localStorage.setItem(preferenceKey, gridStateJson);\n UserPreferencesResource.update({ key: preferenceKey }, gridStateJson);\n }\n\n // Restore state from default column defs\n var defaultGridState = toGridState(defaultColumnDefs);\n\n if (_.isObject(scope.enableWrapping) && _.isBoolean(scope.enableWrapping[preferenceKey])) {\n scope.enableWrapping[preferenceKey] = false;\n }\n\n restoreGridState(scope, gridApi, defaultGridState);\n\n };\n\n // Restore the specified gridState from the local storage\n // or reset it to the default column defs, if specified\n $rootScope.restoreGridState = function(scope, gridApi, preferenceKey, gridStateKey, defaultColumnDefs) {\n\n if (_.isNil(scope) || _.isNil(gridApi) || _.isNil(preferenceKey)) {\n return;\n }\n\n if (_.isFunction(gridStateKey)) {\n gridStateKey = gridStateKey();\n }\n\n var localGridStates = angular.fromJson(localStorage.getItem(preferenceKey)) || {};\n var localGridState = _.isNil(gridStateKey) ? localGridStates : localGridStates[gridStateKey];\n\n // Restore state from local storage or default column defs, if specified\n if (_.isEmpty(localGridState) && !_.isEmpty(defaultColumnDefs)) {\n localGridState = toGridState(defaultColumnDefs);\n }\n\n if (!_.isEmpty(localGridState) && _.isBoolean(localGridState.enableWrapping)) {\n scope.enableWrapping[preferenceKey] = localGridState.enableWrapping;\n }\n restoreGridState(scope, gridApi, localGridState);\n\n };\n\n // Update the specified gridState:\n // Compare the local storage state and the current grids state,\n // only update if they differ\n $rootScope.updateGridState = function(scope, gridApi, preferenceKey, gridStateKey) {\n\n if (_.isNil(scope) || _.isNil(gridApi) || _.isNil(preferenceKey)) {\n return;\n }\n\n // Don't update during a restore\n if ($rootScope.isGridStateRestoring) {\n return;\n }\n\n // Get local storage state and current grid state to compare\n var localGridStates = angular.fromJson(localStorage.getItem(preferenceKey)) || {};\n var currentGridState = gridApi.saveState.save();\n delete currentGridState.selection;\n\n //Check for coloumnWrapping\n if (_.isObject(scope.enableWrapping)) {\n currentGridState.enableWrapping = scope.enableWrapping[preferenceKey];\n }\n\n if (_.isFunction(gridStateKey)) {\n gridStateKey = gridStateKey();\n }\n\n // Check if current state has actually changed\n var localGridState = _.isNil(gridStateKey) ? localGridStates : localGridStates[gridStateKey];\n if (!_.isEqual(localGridState, currentGridState)) {\n\n if (_.isNil(gridStateKey)) {\n localGridStates = currentGridState;\n } else {\n localGridStates[gridStateKey] = currentGridState;\n }\n\n // Updatre in local storage and in user preferences\n var gridStateJson = angular.toJson(localGridStates);\n localStorage.setItem(preferenceKey, gridStateJson);\n UserPreferencesResource.update({ key: preferenceKey }, gridStateJson);\n\n }\n\n };\n\n // Restore the specified grid state\n function restoreGridState(scope, gridApi, defaultGridState) {\n\n if (!_.isEmpty(defaultGridState)) {\n\n $rootScope.isGridStateRestoring = true;\n\n $timeout(function() {\n\n // Reset the 'orderCache' because otherwise resetting the original positions does not work\n gridApi.grid.moveColumns = { orderCache : [] };\n\n gridApi.saveState.restore(scope, defaultGridState);\n $rootScope.isGridStateRestoring = false;\n\n });\n\n }\n\n }\n\n // Create a grid state for the specified column defs\n function toGridState(columnDefs) {\n\n if (_.isFunction(columnDefs)) {\n columnDefs = columnDefs();\n }\n\n // 'Convert' column defs to 'column' states\n var columns = [];\n _.forEach(columnDefs, function(columnDef) {\n columns.push({\n filters: [{}],\n name: columnDef.name,\n pinned: columnDef.pinnedRight ? \"right\" : columnDef.pinnedLeft ? \"left\": \"\",\n sort: {},\n visible: columnDef.defaultVisible === false ? false : true,\n width: columnDef.width\n });\n });\n\n // Grid state will only contain column states\n var gridState = {\n columns: columns\n };\n\n return gridState;\n }\n\n $rootScope.getMaxGrowlMessages = function (dataReference) {\n var maxMessages = 5;\n if (dataReference == 0) {\n //notifications-top\n maxMessages = Math.floor(($window.innerHeight / 62) / 3);\n } else if (dataReference == 1) {\n //notifications-bottom\n maxMessages = Math.floor(($window.innerHeight / 52) / 3);\n }\n\n return maxMessages;\n };\n\n function migrateLocalStorage() {\n var LOCAL_STORAGE_VERSION = 2;\n var VERSION_KEY = 'localStorageVersion';\n var localStorage = window.localStorage;\n\n try {\n var version = localStorage.getItem('localStorageVersion');\n\n if (_.isNil(version) || version != LOCAL_STORAGE_VERSION) {\n var keys = Object.keys(localStorage);\n\n // We need to clean up any leftovers of option lists\n _.forEach(keys, function(key) {\n if (_.includes(key, 'optionList')|| _.includes(key, 'translations')) {\n localStorage.removeItem(key);\n }\n });\n\n localStorage.setItem(VERSION_KEY, LOCAL_STORAGE_VERSION);\n }\n } catch (exception) {\n $log.error('Error while migrating local storage', exception);\n }\n }\n\n /**\n * Creates a base64 out of the JSON combination of passed objects. Can be used to create\n * unique identifiers to be used as trackers in an angular-ng-repeat.\n */\n $rootScope.getCombinedObjectsBase64 = function() {\n // Using the `arguments` instead of `...` operand because of ES5!\n var objects = Array.prototype.slice.call(arguments);\n\n var combinedString = _.map(objects, function(object) {\n return JSON.stringify(object);\n }).join(',');\n\n var base64 = btoa(encodeURIComponent(combinedString));\n return base64;\n };\n\n $rootScope.blockDuringDataModelDeployment = function() {\n // We only block the UI if there is no previous data model deployed.\n if ($rootScope.organization.isDataModelDeploying &&\n _.isNil($rootScope.organization.dataModelHash)) {\n return true;\n } else {\n return false;\n }\n\n };\n\n // FIXME: Use the libary instead (https://github.com/miguelmota/is-valid-hostname)\n $rootScope.isValidHostname = function(value) {\n if (typeof value !== 'string') return false;\n var validHostnameChars = /^[a-zA-Z0-9-.]{1,253}\\.?$/g;\n if (!validHostnameChars.test(value)) {\n return false;\n }\n if (value.endsWith('.')) {\n value = value.slice(0, value.length - 1);\n }\n if (value.length > 253) {\n return false;\n }\n var labels = value.split('.');\n var isValid = labels.every(function (label) {\n var validLabelChars = /^([a-zA-Z0-9-]+)$/g;\n var validLabel = validLabelChars.test(label) && label.length < 64 && !label.startsWith('-') && !label.endsWith('-');\n return validLabel;\n });\n return isValid;\n };\n\n $rootScope.localCacheReady = function() {\n return LocalCacheService.isInitialized();\n };\n\n /**\n * Loads the freshworks support widget, documentation of the widget can be found here:\n * https://developers.freshdesk.com/widget-api\n */\n $rootScope.loadSupportWidget = function() {\n\n var configs = _.defaults($rootScope.supportWidget, {\n // Default BYRD widget configs:\n widgetId: 103000007836,\n // In the Freshworks account, we can setup all the languages' labels, and also flag the\n // primary language. The language will be set depending on the browser's locale, if it wasn't found, it will\n // fallback to the primary one. This approach is better than loading every individual language file and providing them\n // to the widget.\n // Also, we can override any label per the following:\n setLabels: {\n \"de\": {\n \"banner\": \"BYRD Support\",\n \"contact_form\": {\n \"title\": \"Ihre Anfrage\",\n \"email\": \"E-Mail\",\n \"submit\": \"Senden\",\n \"confirmation\": \"Vielen Dank für Ihre Anfrage\"\n }\n },\n \"en\": {\n \"banner\": \"BYRD Support\",\n \"contact_form\": {\n \"title\": \"Your Inquiry\",\n \"email\": \"E-Mail\",\n \"submit\": \"Send\",\n \"confirmation\": \"Thank you for your Inquiry\"\n }\n }\n }\n });\n\n // We use server property ALLOW_SUPPORT_WIDGET to check if widget should be disabled or enabled\n if (!$rootScope.systemSettings.ALLOW_SUPPORT_WIDGET && !configs.enabled) {\n return;\n }\n\n // 'fwSettings' on the window object are needed for the freshworks widget\n // to function properly\n window.fwSettings = {\n widget_id: configs.widgetId\n };\n\n if (!_.isFunction(window.FreshworksWidget)) {\n var n = function(){\n n.q.push(arguments);\n };\n n.q = [];\n window.FreshworksWidget = n;\n }\n\n requirejs([\n \"https://euc-widget.freshworks.com/widgets/\" + configs.widgetId + \".js\"\n ], function() {\n FreshworksWidget(\"setLabels\", configs.setLabels);\n\n if (configs.prefillTicketForm) {\n FreshworksWidget('prefill', 'ticketForm', prefillTicketForm);\n }\n });\n };\n\n $rootScope.$on('userLoggedIn', function() {\n $rootScope.loadSupportWidget();\n });\n\n $rootScope.showServiceApps = function() {\n return Auth.hasPermission(Auth.OBJECT_TYPE_UI, 'view.catalog') ||\n Auth.hasPermission(Auth.OBJECT_TYPE_UI, 'view.shoppingcart');\n };\n\n // check URL function if it's valid or invalid URL\n $rootScope.checkUrl = function(url, scope) {\n CheckURLRessource.get({url: url},\n function() {\n //URL is valid\n if (!_.isNil(scope.row) && !_.isNil(scope.col) && !_.isNil(scope.row.filePreviewError)) {\n scope.row.filePreviewError[scope.col.field] = false;\n }\n\n var $parentScope = scope.$parent;\n if(!_.isNil($parentScope.filePreviewData)) {\n $parentScope.filePreviewError = false;\n }\n\n // getURLInfo\n FilePreviewService.preview(url, scope);\n\n scope.$watch('url', function(newUrl) {\n if (newUrl) {\n FilePreviewService.preview(newUrl, scope);\n }\n });\n }, function() {\n //URL is invalid\n if (!_.isNil(scope.row) && !_.isNil(scope.col) && !_.isNil(scope.row.filePreviewError)) {\n scope.row.filePreviewError[scope.col.field] = true;\n }\n\n var $parentScope = scope.$parent;\n if(!_.isNil($parentScope.filePreviewData)) {\n $parentScope.filePreviewError = true;\n }\n\n });\n };\n }\n);\n})();\n","angular.module('llax')\n .controller('BillingCallbackController', function() {});\n","angular.module('llax')\n .controller('BillingSignupController',\n function($rootScope, $scope, $location, $routeParams, $timeout, growl, BillingResource, OrganizationService, CurrencyService) {\n\n $rootScope.customer = {};\n $scope.billingAddress = {};\n\n $scope.selectedProfile = {\n product: $routeParams.product,\n title: $routeParams.title\n };\n\n $scope.validateStep = function(step, form) {\n var result = true;\n if (form.$invalid) {\n result = false;\n growl.error(\"Required fields missing\");\n }\n return result;\n };\n\n $scope.executeUpgrade = function(form) {\n if (!form.payment_profile_agreement_terms.$viewValue) {\n growl.error(\"Required fields missing\");\n return false;\n }\n BillingResource.changePlan({\n plan: $scope.selectedProfile.product,\n currency: $rootScope.currentCurrency,\n billingAddress: $scope.billingAddress\n }, function(response) {\n OrganizationService.getOrganization(true);\n $location.path(\"/profile\");\n },\n function(error) {\n console.log(\"ERROR \", error);\n });\n };\n\n $scope.cancelSubscription = function() {\n var profile = $scope.config[0];\n BillingResource.changePlan({\n plan: profile.name,\n currency: $rootScope.currentCurrency,\n billingAddress: $scope.billingAddress\n }, function(response) {\n OrganizationService.getOrganization(true);\n $location.path(\"/profile\");\n },\n function(error) {\n console.log(\"ERROR \", error);\n });\n };\n\n function getOrderedProfile(profiles) {\n if (!profiles) {\n return;\n }\n return _.find(profiles, {\n name: $scope.selectedProfile.product\n });\n }\n\n $scope.isActiveProfile = function(profile) {\n if (_.isUndefined($scope.organization) || _.isUndefined($scope.organization.orderedProfile)) {\n return profile.name === \"solo\";\n }\n return angular.uppercase(profile.name) === angular.uppercase($scope.organization.orderedProfile);\n };\n\n $scope.setFocus = function(step) {\n var toStepId = \"step\" + (step.toStepId + 1);\n var inputs = angular.element('#' + toStepId + ' :input');\n var firstInput = inputs[0];\n\n $timeout(function() {\n firstInput.focus();\n }, 10);\n };\n\n $scope.setCurrency = function(key) {\n $rootScope.currentCurrency = key;\n };\n\n (function init() {\n OrganizationService.$organization.subscribe(function(organization) {\n $scope.organization = angular.copy(organization);\n });\n\n BillingResource.getPlanBillingProfiles(\n function(response) {\n $scope.config = response;\n $scope.orderedProfile = getOrderedProfile($scope.config);\n }\n );\n\n BillingResource.getBillingAddress(function(response) {\n $scope.billingAddress = response;\n });\n\n if (!$rootScope.currentCurrency) {\n var country = $rootScope.user.country || 'US';\n $rootScope.currentCurrency = CurrencyService.getCurrencyKey(country);\n }\n })();\n });\n","angular.module('llax')\n .controller('bulkSearchController',\n function($location, $modalInstance, $rootScope, $routeParams, $scope, $timeout, $window, growl,\n BulkSearchResource, ErrorCode, queryValues, queryTooLong) {\n\n $scope.queryValues = queryValues;\n $scope.queryTooLong = queryTooLong;\n var LocalStorage = $window.localStorage;\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.startBulkSearch = function() {\n $modalInstance.dismiss('done');\n var date = new Date();\n var name = 'BulkSearch_' + date.getDate() + '_' + (date.getMonth() + 1) + '_' + date.getFullYear() +\n '_' + date.getHours() + '_' + date.getMinutes() + '_' + date.getSeconds();\n var queryList = prepareQueryValues($scope.queryValues);\n BulkSearchResource.save({ name: name, attributeName: $scope.queryAttribute }, queryList, function(response) {\n setCurrentBulkSearch(response);\n }, function(errorResponse) {\n\n var errorCode = $rootScope.getErrorCode(errorResponse);\n if (errorCode === ErrorCode.BULK_SEARCH_STILL_ACTIVE) {\n\n var errorMessage = $rootScope.getErrorMessage(errorResponse);\n growl.warning(errorMessage);\n\n var bulkSearchId = $rootScope.getErrorParameter(errorResponse, 'activeBulkSearchId');\n BulkSearchResource.get({\n bulkSearchId: bulkSearchId\n }, function(response) {\n setCurrentBulkSearch(response);\n });\n\n } else {\n growl.error(\"BULK_SEARCH.ERROR\");\n }\n });\n };\n\n function setCurrentBulkSearch(bulkSearch) {\n $rootScope.bulkSearchLoading = !bulkSearch.finished;\n LocalStorage.setItem(\"BulkSearch\", JSON.stringify(bulkSearch));\n var bulksearchId = bulkSearch.id;\n $rootScope.bulkSearch = bulkSearch;\n var category = \"\";\n if ($routeParams.category) {\n category = \"&category=\" + $routeParams.category;\n }\n $location.url($location.path() + \"?tags=bulkSearch:\" + bulksearchId + \"&bulkSearchId=\" + bulksearchId + category);\n }\n\n $scope.getBulkSearchAttributes = function() {\n var attributes = $rootScope.dataModel.filteredLayoutAttributes('filter');\n if (_.isEmpty(attributes)) {\n attributes = $rootScope.dataModel.allAttributes();\n }\n return attributes;\n };\n\n $scope.attributeSelected = function(attribute) {\n $scope.queryAttribute = attribute.name;\n };\n\n $scope.queryValuesOnPaste = function(evt) {\n\n var clipboardData = (evt.clipboardData || evt.originalEvent.clipboardData || window.clipboardData);\n var pastedData;\n try {\n pastedData = clipboardData.getData('Text') || clipboardData.getData('text/plain');\n } catch (e) {\n $log.error(\"Could not access clipboard\", e);\n return;\n }\n\n pastedData = _.trim(pastedData);\n if (_.isEmpty(pastedData)) {\n return;\n }\n\n var textSelectionStart = evt.originalEvent.target.selectionStart;\n var textSelectionEnd = evt.originalEvent.target.selectionEnd;\n\n var pre = '';\n var post = '';\n\n if (textSelectionStart > 0) {\n pre = $scope.queryValues.substring(0, textSelectionStart);\n }\n if (textSelectionEnd > 0 && textSelectionEnd < $scope.queryValues.length) {\n post = $scope.queryValues.substring(textSelectionEnd);\n }\n\n // entry above not working correct\n if ($scope.queryValues && textSelectionEnd == 0 && textSelectionStart == 0) {\n post = '\\n' + $scope.queryValues;\n }\n\n var rows = _.words(pastedData, /[^\\n\\r]+/g);\n var modifiedData = _.join(rows, '\\n');\n\n // identify entry at line end?\n if ($scope.queryValues && textSelectionStart > $scope.queryValues.length) {\n $scope.queryValues = pre + '\\n' + modifiedData;\n } else {\n $scope.queryValues = pre + modifiedData + post;\n }\n\n evt.originalEvent.preventDefault();\n evt.preventDefault();\n\n // set cursor to correct position\n $timeout(function() {\n evt.originalEvent.target.selectionEnd = textSelectionEnd + modifiedData.length;\n evt.originalEvent.target.selectionStart = evt.originalEvent.target.selectionEnd;\n }, 1);\n\n };\n\n prepareQueryValues = function(values) {\n return _.words(values, /([^\\s,]+[^,\\r\\n\\t]*[^\\s,]+|[^\\s,]+)/g);\n };\n\n }\n );\n","angular.module('llax')\n .controller('BuyUserLicensesController',\n function($modalInstance, $rootScope, $scope, $timeout, growl,\n AdditionalLicenseType, BillingResource, CurrencyService, UsageLimitsResource) {\n\n $scope.additionalLicenseProfiles = [];\n $scope.billingAddress = {};\n $scope.orderedPlanProfile = {};\n $scope.selected = {};\n\n $scope.cancel = function() {\n UsageLimitsResource.get(function(response) {\n $modalInstance.close(response.limits.USERS);\n });\n };\n\n $scope.getMonthlyPrice = function(profile) {\n var monthlyPrice;\n if (_.isNil(profile)) {\n monthlyPrice = {};\n } else if (!_.isEmpty(profile.monthlyPrice)) {\n monthlyPrice = profile.monthlyPrice;\n } else if (_.isNil(profile.monthlyPrice) && !_.isNil(profile.monthlyPriceMultiplier)) {\n monthlyPrice = _.mapValues(_.clone($scope.orderedPlanProfile.monthlyPrice), function(value) {\n return profile.monthlyPriceMultiplier * value;\n });\n } else {\n // FIXME: If no prices are available, ask to contact sales (e.g. for 'enterprise' users)!\n monthlyPrice = {};\n }\n return monthlyPrice;\n };\n\n $scope.getYearlyPrice = function (profile) {\n return _.mapValues($scope.getMonthlyPrice(profile), function (value) {\n return value * 12;\n });\n };\n\n $scope.executeUpgrade = function(form) {\n\n if (!form.payment_profile_agreement_terms.$viewValue) {\n growl.error(\"Required fields missing\");\n return false;\n }\n\n BillingResource.addAdditionalLicense({\n additionalLicense: $scope.selected.profile.name,\n currency: $rootScope.currentCurrency,\n billingAddress: $scope.billingAddress\n }, function() {\n growl.success('USER_MANAGEMENT.LICENSES_ADDED');\n UsageLimitsResource.get(function(response) {\n $modalInstance.close(response.limits.USERS);\n });\n });\n\n };\n\n $scope.validateStep = function(step, form) {\n var result = true;\n if (step.stepId === \"step2\" && form.$invalid) {\n result = false;\n growl.error(\"Required fields missing\");\n }\n return result;\n };\n\n $scope.setFocus = function(step) {\n var toStepId = \"step\" + (step.toStepId + 1);\n var inputs = angular.element('#' + toStepId + ' :input');\n var firstInput = inputs[0];\n\n $timeout(function() {\n firstInput.focus();\n }, 10);\n };\n\n (function init() {\n\n BillingResource.getOrderedPlanProfile(function(response) {\n $scope.orderedPlanProfile = response;\n });\n\n BillingResource.getAdditionalLicenseProfiles({\n licenseType: AdditionalLicenseType.ADDITIONAL_USERS\n },function(response) {\n $scope.additionalLicenseProfiles = response;\n if (response.length > 0) {\n $scope.selected.profile = response[0];\n }\n });\n\n BillingResource.getBillingAddress(function(response) {\n $scope.billingAddress = response;\n });\n\n // FIXME: Set this in 'application-controller'!\n if (!$rootScope.currentCurrency) {\n var country = $rootScope.user.country || 'US';\n $rootScope.currentCurrency = CurrencyService.getCurrencyKey(country);\n }\n\n })();\n\n });\n","angular.module('llax')\n .controller('CatalogController',\n function($controller, $filter, $location, $log, $modal, $rootScope, $routeParams, $scope, $timeout, $window,\n SessionDataService, uiGridConstants, WatchlistService, ReactBridge, $q, ItemResource) {\n\n var ONLINE_CATALOG_GRID_STATES_KEY = \"online-catalog-grid-states\";\n var DEFAULT_GRID_STATE_KEY = \"default-state\";\n\n $controller('FetchItemController', {\n $scope: $scope\n });\n $controller('ShoppingCartController', {\n $scope: $scope\n });\n\n $rootScope.loadDataModel();\n\n $scope.page = $routeParams.page || 1;\n $scope.query = {\n category: $routeParams.category\n };\n $scope.loadingItems = true;\n $scope.selectedItem = null;\n $scope.items = [];\n $scope.currentLayout = \"catalog\";\n $scope.currentLayoutAttributes = [];\n\n var LOCAL_STORAGE_SHOW_PREVIEW_KEY = 'onlineCatalog.showItemPreview';\n $scope.previewLayout = \"catalog_preview\";\n $scope.previewCoverImageAttributeName = null;\n $scope.previewLayoutAttributes = [];\n $scope.showItemPreview = true;\n $scope.allItemsSelected = false;\n setItemPreviewPerLocalStorage();\n loadState();\n\n $scope.$on('dataModelLoaded', function() {\n initCatalogGrid();\n $scope.fetchItems();\n });\n\n $scope.$on('itemSearchQueryChanged', function(event, scope) {\n initCatalogGrid();\n $scope.fetchItems();\n });\n\n if ($routeParams.enableShoppingCart) {\n SessionDataService.put(\"shoppingCart\", true);\n $location.search(\"enableShoppingCart\", null);\n }\n\n $scope.loadMore = function() {\n if (!$scope.loadingItems && !$scope.searchFinished) {\n $scope.page++;\n $scope.loadingItems = true;\n $scope.fetchItems({\n append: true\n });\n }\n };\n\n $scope.fetchItems = function(config) {\n var tableLayoutFields = $rootScope.dataModel.filteredLayoutAttributeNames($scope.currentLayout);\n var previewLayoutFields = $rootScope.dataModel.filteredLayoutAttributeNames($scope.previewLayout);\n var fields = _.union(tableLayoutFields, previewLayoutFields);\n $scope.doFetchItems(config, fields);\n };\n\n function initCatalogGrid() {\n\n var columnDefs = [];\n $scope.currentLayoutAttributes = $rootScope.dataModel.filteredLayoutAttributes($scope.currentLayout);\n for (var i = 0; i < $scope.currentLayoutAttributes.length; i++) {\n attribute = $scope.currentLayoutAttributes[i];\n setSectionAttributeParam(attribute, 'iconSize', '1em');\n setSectionAttributeParam(attribute, 'valuesFormat', ['label']);\n }\n\n columnDefs = $scope.createCatalogTableColumnDefinition($scope.currentLayoutAttributes, true, $scope);\n\n $scope.gridOptions = {\n data: 'items',\n enableColumnMenus: false,\n enableGridMenu: true,\n columnDefs: columnDefs,\n rowHeight: 34,\n infiniteScrollDown: true,\n rowTemplate:\n '
' +\n '
',\n onRegisterApi: function(gridApi) {\n gridApi.infiniteScroll.on.needLoadMoreData($scope, $scope.loadMore);\n $scope.gridApi = gridApi;\n $rootScope.initGridState($scope, $scope.gridApi, ONLINE_CATALOG_GRID_STATES_KEY, DEFAULT_GRID_STATE_KEY, columnDefs);\n\n gridApi.core.on.renderingComplete($scope, function() {\n if ($scope.selectedItem) {\n $timeout(function() {\n gridApi.core.scrollTo($scope.selectedItem);\n }, 100);\n }\n });\n\n gridApi.selection.clearSelectedRows();\n gridApi.selection.on.rowSelectionChanged($scope, function(row, event) {\n if (row.isSelected) {\n WatchlistService.addWatchlistItem(row.entity);\n } else {\n WatchlistService.removeWatchlistItem(row.entity);\n }\n });\n gridApi.selection.on.rowSelectionChangedBatch($scope, function(rows, event) {\n _.forEach(rows, function(row) {\n if (row.isSelected) {\n WatchlistService.addWatchlistItem(row.entity);\n } else {\n WatchlistService.removeWatchlistItem(row.entity);\n }\n });\n });\n }\n };\n }\n\n function initPreviewSection() {\n var previewLayout = $rootScope.dataModel.layout($scope.previewLayout);\n if (!_.isNil(previewLayout)) {\n $scope.previewCoverImageAttributeName = previewLayout.sections[0].preview_image_attribute;\n $scope.previewLayoutAttributes = $rootScope.dataModel.filteredLayoutAttributes($scope.previewLayout);\n } else {\n $log.error(\"OnlineCatalog: Couldn't find a suitable preview layout: \" + $scope.previewLayout);\n }\n }\n\n function setSectionAttributeParam(attribute, paramName, defaultValue) {\n $rootScope.setSectionAttributeParam($scope.currentLayout, null, attribute, paramName);\n }\n\n $scope.refreshTags = function(item) {\n for (var i = 0; i < $scope.items.length; i++) {\n var current = $scope.items[i];\n if (current.primaryKey__ == item.primaryKey__) {\n $scope.items[i].tags__ = item.tags__;\n }\n }\n };\n\n $scope.compareItems = function(primaryKeys) {\n var selectedItems = {};\n var itemsRequests = [];\n _.forEach(primaryKeys, function(primaryKey) {\n var deferred = $q.defer();\n ItemResource.get({}, {\n 'primaryKey': primaryKey\n },\n function(itemResult) {\n for (var key in itemResult) {\n // try to parse JSON like Strings into JSON Objects\n var val = itemResult[key];\n if (val !== undefined && typeof val == \"string\" && (val.startsWith(\"{\") || val.startsWith(\"[\"))) {\n try {\n itemResult[key] = JSON.parse(val);\n } catch (e) {}\n }\n }\n deferred.resolve(itemResult);\n });\n itemsRequests.push(deferred.promise);\n });\n $q.all(itemsRequests).then(function(items){\n selectedItems = items;\n var dialog = ReactBridge.mountDialog(\"CompareItemsDialog\", \"#react-compare-items-dialog\",\n {\n items: selectedItems,\n rootScope: $rootScope,\n currentLayout: $scope.currentLayout,\n onClose: function() {\n dialog.unmount();\n }\n });\n });\n };\n\n $scope.onItemRowClick = function(row) {\n $scope.selectedItem = row.entity;\n $scope.selectedItem.coverImage = $scope.getItemCoverImage($scope.selectedItem);\n };\n\n $scope.getItemCoverImage = function(item) {\n var image = null;\n var imageAlternativeText = null;\n if (!_.isNil($scope.previewCoverImageAttributeName)) {\n image = item[$scope.previewCoverImageAttributeName];\n imageAlternativeText = $scope.previewCoverImageAttributeName;\n } else {\n // Falling back to having the first image attribute as a cover image.\n var imageAttribute = _.find($scope.currentLayoutAttributes, function(attribute) {\n return attribute.typeName === 'Image';\n });\n image = item[imageAttribute.name];\n imageAlternativeText = imageAttribute.name;\n }\n\n if (!_.isNil(image)) {\n return {\n src: image,\n alt: imageAlternativeText\n };\n } else {\n return undefined;\n }\n };\n\n $scope.showOrHideItemPreview = function() {\n $scope.showItemPreview = !$scope.showItemPreview;\n $window.localStorage.setItem(LOCAL_STORAGE_SHOW_PREVIEW_KEY, $scope.showItemPreview);\n $timeout(function() {\n $scope.gridApi.core.notifyDataChange(uiGridConstants.dataChange.ALL);\n }, 0);\n };\n\n $scope.createCatalogTableColumnDefinition = function(attributes, generateControlColumns, $scope) {\n\n var columnDefs = [];\n if (attributes) {\n var catalogAttributes = attributes;\n\n var length = catalogAttributes.length;\n var attr = null;\n for (var i = 0; i < length; i++) {\n attr = catalogAttributes[i];\n var col = {\n attribute: attr,\n name: attr.name,\n headerTooltip: true,\n width: '*',\n minWidth: 120,\n resizable: true\n };\n //attribute type different kinds of cell editors are set on the column\n $rootScope.generateCellEditors(attr, col, $scope, {editable: false});\n columnDefs[i] = col;\n }\n if (generateControlColumns) {\n\n columnDefs.push({\n displayName: $scope.translate('ACTIONS'),\n headerTooltip: true,\n name: 'actions',\n enableCellSelection: false,\n allowCellFocus: false,\n cellClass: 'text-right',\n headerCellClass: 'text-right',\n enableColumnResizing: false,\n enableSorting: false,\n pinnedRight: true,\n width: 100,\n cellTemplate: '
' +\n '
' +\n ' ' +\n ' ' +\n '
' +\n '
'\n });\n }\n }\n return columnDefs;\n };\n\n $scope.redirectToItemDetail = function(item) {\n $scope.setOnlineCatalogState(item);\n if ($location.search().withPublicationTaskChecksums) {\n $location.path('/items/detail/' + item.primaryKey__).search('checksum', item.checksum__);\n } else {\n $location.path('/items/detail/' + item.primaryKey__);\n }\n };\n\n $scope.setOnlineCatalogState = function(item) {\n $rootScope.onlineCatalogState = {\n cursor: $scope.cursor,\n items: $scope.items,\n selectedItem: item,\n numberFound: $scope.numberFound,\n maxNumberFound: $scope.maxNumberFound,\n searchFinished: $scope.searchFinished,\n query: $scope.query\n };\n };\n\n function setItemPreviewPerLocalStorage() {\n if (!_.isNil($window.localStorage.getItem(LOCAL_STORAGE_SHOW_PREVIEW_KEY))) {\n var shouldPreview = $window.localStorage.getItem(LOCAL_STORAGE_SHOW_PREVIEW_KEY);\n try {\n $scope.showItemPreview = JSON.parse(shouldPreview);\n } catch(e) {\n $log.error('OnlineCatalog: Failed to parse local storage key ' + LOCAL_STORAGE_SHOW_PREVIEW_KEY);\n }\n }\n }\n\n function loadState() {\n if (!_.isNil($rootScope.onlineCatalogState)) {\n var onlineCatalogState = $rootScope.onlineCatalogState;\n $scope.items = onlineCatalogState.items;\n $scope.cursor = onlineCatalogState.cursor;\n $scope.selectedItem = onlineCatalogState.selectedItem;\n $scope.numberFound = onlineCatalogState.numberFound;\n $scope.maxNumberFound = onlineCatalogState.maxNumberFound;\n $scope.searchFinished = onlineCatalogState.searchFinished;\n $scope.query = onlineCatalogState.query;\n }\n }\n\n function prepareLoadedState() {\n _.forEach($scope.items, function() {\n if (WatchlistService.hasWatchlistItems()) {\n _.forEach(WatchlistService.getWatchlistPrimaryKeys(), function(entry) {\n $scope.gridApi.selection.selectRow(_.find($scope.items, {primaryKey__: entry}));\n });\n }\n if ($scope.allVisibleItemsSelected()) {\n $scope.gridApi.selection.selectAllRows();\n }\n $scope.gridApi.core.notifyDataChange(uiGridConstants.dataChange.COLUMN);\n });\n }\n\n $scope.hasSelectedItems = function() {\n return $scope.allItemsSelected || WatchlistService.hasWatchlistItems();\n };\n\n $scope.$on('selectedItemsUpdated', function(event, items) {\n if (items === 'ALL') {\n $scope.gridApi.selection.selectAllVisibleRows();\n $scope.allItemsSelected = true;\n } else if (items === 'NONE') {\n $scope.gridApi.selection.clearSelectedRows();\n $scope.allItemsSelected = false;\n WatchlistService.clearWatchlist();\n if ($routeParams.selectionId) {\n $location.search('selectionId', null);\n }\n }\n });\n\n $scope.newBulkSearch = function(queryValues, queryTooLong) {\n $scope.query= \"\";\n $rootScope.$broadcast('buckSearchPopupOpend');\n $modal.open({\n templateUrl: 'tpl/bulk-search.tpl.html',\n controller: 'bulkSearchController',\n backdrop: true,\n windowClass: 'bulk-search-modal',\n resolve: {\n queryValues: function() {\n return queryValues;\n },\n queryTooLong: function() {\n return queryTooLong;\n }\n }\n });\n };\n\n $scope.showLastBulkSearch = function() {\n delete $routeParams.tags;\n delete $routeParams.taskId;\n delete $scope.query.taskId;\n $location.url($location.path() + \"?tags=bulkSearch:\" + $rootScope.bulkSearch.id + \"&bulkSearchId=\" + $rootScope.bulkSearch.id);\n };\n\n (function init() {\n\n // Load preserved state, if any, instead of doing a full fetch.\n if (!_.isNil($rootScope.onlineCatalogState)) {\n $scope.loadingItems = false;\n $timeout(function(){\n prepareLoadedState();\n }, 500);\n } else {\n $scope.fetchItems();\n }\n $timeout(function() {\n ReactBridge.mountComponent('ItemsList', '#items-list');\n }, 100);\n initCatalogGrid();\n initPreviewSection();\n })();\n }\n );\n","angular.module('llax')\n .controller('ChatController',\n /*@ngInject*/\n function($rootScope, $scope, $http, $translate, $log, ChannelService) {\n\n $scope.newMessages = 0;\n $scope.connectedUserIds = [];\n $scope.otherUsersLoggedIn = function() {\n return !_.isEmpty($scope.connectedUserIds);\n };\n\n $scope.chatWindow = {\n visible: false,\n currentText: \"\"\n };\n\n $scope.messages = [];\n\n ChannelService.getRegistered(ChannelService.CHAT_EVENT).then(function(response) {\n $log.debug(\"getRegistered(CHAT):\", response);\n $scope.connectedUserIds = _.filter(response, function(userId) {\n return userId != $rootScope.user.id;\n });\n });\n\n function generateUsersAsHTML() {\n var result = $translate.instant(\"CURRENTLY_ONLINE\") + \"
\";\n result += \"\";\n $scope.connectedUsersAsHTML = result;\n }\n\n $scope.$watchCollection(\"connectedUserIds\", generateUsersAsHTML);\n $scope.$on(\"usersLoaded\", generateUsersAsHTML);\n\n $scope.sendChatMessage = function() {\n\n var message = {\n author: $rootScope.user.userId,\n text: $scope.chatWindow.currentText\n };\n $scope.chatWindow.currentText = \"\";\n\n ChannelService.broadcast(ChannelService.CHAT_EVENT, null, message);\n\n };\n\n $scope.toggleChatWindow = function() {\n $scope.chatWindow.visible = !$scope.chatWindow.visible;\n $scope.newMessages = 0;\n $scope.hideOnlineUsersTooltip();\n };\n\n function addMessage(message) {\n if (_.isNil(message) || _.isEmpty(message)) {\n return;\n }\n if (message.author == $scope.user.userId) {\n message.direction = \"sent\";\n } else {\n message.direction = \"receive\";\n }\n $scope.messages.push(message);\n $scope.newMessages++;\n $scope.$broadcast('scrollTriggered');\n }\n\n $scope.$on('channelMessageReceived', function(event, eventData) {\n\n if (eventData.event !== ChannelService.CHAT_EVENT) {\n return;\n }\n\n var type = eventData.type;\n if (type === ChannelService.SUBSCRIBE_TYPE) {\n addMessage(eventData.data);\n } else if (type === ChannelService.LISTEN_TYPE) {\n\n var action = eventData.data.action;\n var userId = eventData.data.userId;\n if (userId && userId !== $scope.user.id) {\n if (action === ChannelService.REGISTERED_ACTION) {\n $scope.connectedUserIds.addToSet(userId);\n } else if (action === ChannelService.UNREGISTERED_ACTION) {\n $scope.connectedUserIds.removeFromSet(userId);\n }\n }\n\n }\n\n });\n\n $scope.showOnlineUsersTooltip = function() {\n var calloutConfig = {\n id: 'callout_online_users',\n target: 'button-chat',\n placement: 'left',\n content: '',\n fixedElement: true,\n yOffset: -30 -20 * $scope.connectedUserIds.length,\n customRenderer: function() {\n var attributeStart = '
';\n var attributeEnd = '
' + '';\n return attributeStart + $scope.connectedUsersAsHTML + attributeEnd;\n }\n };\n\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeAllCallouts();\n\n var calloutEle = calloutMgr.createCallout(calloutConfig);\n // Hack: override !important css rules, with inline precedence\n calloutEle.element.style.cssText += 'border: none !important; z-index: 1050;';\n };\n\n $scope.hideOnlineUsersTooltip = function() {\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeAllCallouts();\n };\n });\n","angular.module('llax')\n .controller('CodelistEditorController',\n function($scope, $rootScope, $window, $location, $translate, $timeout, $modal, $dialogs,\n $q, $filter, InfiniteScrollHelper, QueryCodelistResource, growl,\n uiGridEditConstants, CodelistRessource, ErrorCode) {\n\n var CODELIST_KEY = \"codelistKey\";\n\n var CODELIST_GRID_STATES_KEY = \"codelist-grid-states\";\n var DEFAULT_GRID_STATE_KEY = \"default-state\";\n\n $scope.showAddInput = false;\n\n var LocalStorage = $window.localStorage;\n\n $scope.entries = [];\n $scope.creating = false;\n $scope.rowEdit = false;\n $scope.editingRow = null;\n $scope.state = {};\n\n $scope.createCodelistKey = function(key) {\n if (key) {\n CodelistRessource.create({\"name\": key }, function(codelist) {\n $scope.showAddInput = false;\n growl.success('CODELIST_EDITOR.CREATE_CODELIST_SUCCESS_MESSAGE', {\n variables: {\n codelist : key\n },\n });\n $scope.keys.push(codelist);\n $scope.keys = _.sortBy($scope.keys, 'name');\n $scope.selectCodelistMap(codelist);\n }, function(errorData) {\n var errorMessage = $rootScope.getErrorMessage(errorData);\n errorMessage = errorMessage || \"CODELIST_EDITOR.CREATE_CODELIST_ERROR_MESSAGE\";\n growl.error(errorMessage, {\n ttl: 3000\n });\n });\n }\n };\n\n $scope.columnDefs = [{\n field: 'code',\n displayName: $translate.instant('CODELIST_EDITOR.CODE'),\n headerTooltip: true,\n cellTooltip: true,\n cellClass: 'text-center',\n enableCellEdit: true,\n enableCellEditOnFocus: true,\n cellEditableCondition: keyCellEditableCondition,\n width: '*'\n }, {\n field: 'defaultLabel',\n displayName: $translate.instant('CODELIST_EDITOR.DEFAULT_LABEL'),\n headerTooltip: true,\n cellTooltip: true,\n cellEditableCondition: valueCellEditableCondition,\n width: '*'\n }];\n _.forEach($rootScope.supportedLanguages, function(lan) {\n $scope.columnDefs.push({\n field: \"localeLabels.\" + lan.key,\n displayName: $translate.instant('LANGUAGE.' + lan.key.toUpperCase()),\n headerTooltip: true,\n cellTooltip: true,\n cellEditableCondition: valueCellEditableCondition,\n width: '*'\n });\n });\n\n $scope.columnDefs.push(\n {\n field: 'actions',\n displayName: '',\n enableCellSelection: false,\n allowCellFocus: false,\n enableCellEdit: false,\n enableHiding : false,\n cellClass: 'text-right',\n headerCellClass: 'text-right',\n enableColumnResizing: false,\n enableSorting: false,\n pinnedRight: true,\n width: 80,\n cellTemplate: '
' +\n '
' +\n '' +\n '' +\n '' +\n '
' +\n '
'\n }\n );\n\n $scope.gridOptions = {\n data: 'entries',\n columnDefs: $scope.columnDefs,\n enableColumnMenus: false,\n enableGridMenu: true,\n enableSorting: false,\n infiniteScrollUp: false,\n infiniteScrollDown: true,\n rowHeight: 34,\n };\n\n $scope.refreshData = function(searchTerm) {\n $scope.entries = $filter('filter')($scope.entriesCopy, searchTerm);\n };\n\n $scope.queryParams = {\n limit: 20\n };\n\n // Accessor to get/set entries, used in 'InfiniteScrollHelper'\n function entriesAccessor(entries) {\n if (!_.isUndefined(entries)) {\n $scope.entries = entries;\n $scope.entriesCopy = angular.copy(entries);\n }\n return $scope.entries;\n }\n\n // Error handler used in 'InfiniteScrollHelper'\n function errorHandler(errorStatus, errorData) {\n var errorCode = $rootScope.getErrorCode({ data: errorData });\n if (errorCode !== ErrorCode.UNSPECIFIED) {\n var errorMessage = $rootScope.getErrorMessage({ data: errorData });\n growl.error(errorMessage, {\n ttl: 3000\n });\n }\n $scope.status = errorStatus;\n }\n\n function keyCellEditableCondition () {\n var cell = $scope.gridApi.cellNav.getFocusedCell();\n\n if(!cell.row.entity.code){\n return true;\n }\n return false;\n }\n\n function valueCellEditableCondition () {\n var cell = $scope.gridApi.cellNav.getFocusedCell();\n\n if ($scope.rowEdit && $scope.creating && cell.row.entity.editing) {\n return true;\n }\n if ($scope.rowEdit && cell.row.entity.editing) {\n return true;\n }\n if ($scope.rowEdit) {\n return false;\n }\n\n return true;\n }\n\n function saveState () {\n var map = $scope.activeCodelistKey;\n var selection = $scope.gridApi.selection.getSelectedRows();\n var row = null;\n if ($scope.rowEdit && $scope.editingRow) {\n row = $scope.editingRow;\n }\n $scope.state = {map: map, row: row, selection: selection};\n }\n\n function restoreState () {\n if ($scope.activeCodelistKey != $scope.state.map) {\n return;\n }\n\n $timeout(function () {\n if ($scope.state) {\n var row = $scope.state.row;\n var selection = $scope.state.selection;\n _.forEach(selection, function (row) {\n $scope.gridApi.selection.selectRow(_.find($scope.entries, {\n code: row.code\n }));\n });\n\n if (row) {\n var newCell = _.find($scope.entries, {\n code: row.code\n });\n if (newCell) {\n newCell.editing = true;\n newCell.oldDefaultLabel = row.defaultLabel;\n newCell.oldLocaleLabels = angular.copy(row.localeLabels);\n }\n }\n }\n });\n }\n\n function activateInitialMap() {\n\n CodelistRessource.getAllCodelists(function(codelistData) {\n $scope.activeCodelistKey = null;\n $scope.activeCodelistId = null;\n $scope.keys = codelistData;\n if (!_.isEmpty($scope.keys)) {\n var storedActiveMap = LocalStorage.getItem(CODELIST_KEY);\n\n var existingActiveMap = _.find($scope.keys, {name: storedActiveMap});\n\n if (existingActiveMap) {\n $scope.selectCodelistMap(existingActiveMap);\n } else {\n $scope.selectCodelistMap($scope.keys[0]);\n }\n } else {\n $scope.entries = [];\n }\n });\n\n }\n\n // The 'infinite scroll' helper object\n // Simple set the 'resource' object, scope and data and gridApi variable, and call 'addToGridOptions' to enable 'infinite scrolling'\n $scope.scrollHelper = new InfiniteScrollHelper(QueryCodelistResource, $scope, entriesAccessor, 'gridApi', errorHandler);\n $scope.scrollHelper.addToGridOptions($scope.gridOptions, function(gridApi) {\n\n $scope.gridApi = gridApi;\n gridApi.edit.on.beginCellEdit($scope,function(row, cell) {\n $scope.rowEdit = true;\n row.editing = true;\n $scope.editingRow = row;\n if (!row.oldLocaleLabels && !_.isEmpty(row.localeLabels)) {\n row.oldLocaleLabels = angular.copy(row.localeLabels);\n }\n if (!row.oldDefaultLabel && row.defaultLabel) {\n row.oldDefaultLabel = row.defaultLabel;\n }\n });\n\n $rootScope.initGridState($scope, $scope.gridApi, CODELIST_GRID_STATES_KEY, DEFAULT_GRID_STATE_KEY, $scope.columnDefs);\n\n });\n\n $scope.gridHeight = function () {\n var w = angular.element($window);\n if (w.width() < 992) {\n return;\n }\n var footer = angular.element('footer');\n var boxContent = angular.element('.box-content');\n var content = angular.element('#content');\n var boxContentPadding = parseInt(boxContent.css('padding-bottom'), 10);\n var contentPadding = parseInt(content.css('padding-bottom'), 10);\n var offset = 630;\n if (angular.element(\"#codelist-grid\") && angular.element(\"#codelist-grid\").offset()) {\n offset = angular.element(\"#codelist-grid\").offset().top + footer.innerHeight() + boxContentPadding + contentPadding;\n }\n var newHeight = w.height() - offset;\n\n if ($scope.gridApi) {\n $scope.gridApi.grid.gridHeight = newHeight;\n }\n\n return {\n 'height': newHeight + \"px\"\n };\n };\n\n angular.element($window).bind('resize', function(){\n $scope.gridHeight();\n $scope.$digest();\n });\n\n $scope.selectCodelistMap = function (key) {\n if (!key || !key.id) {\n return;\n }\n\n if($scope.rowEdit || $scope.creating) {\n var promise = $scope.checkUnsavedChanges();\n promise.then(function () {\n $scope.activeCodelistKey = key.name;\n $scope.activeCodelistId = key.id;\n $scope.activeKey = key;\n\n $scope.scrollHelper.reload(_.merge({\n id: key.id\n }, $scope.queryParams));\n\n $scope.creating = false;\n $scope.rowEdit = false;\n });\n } else {\n $scope.activeCodelistKey = key.name;\n $scope.activeCodelistId = key.id;\n $scope.activeKey = key;\n\n $scope.scrollHelper.reload(_.merge({\n id: key.id\n }, $scope.queryParams));\n }\n $scope.state = {};\n\n if ($scope.gridApi && $scope.gridApi.selection) {\n $scope.gridApi.selection.clearSelectedRows();\n }\n\n LocalStorage.setItem(CODELIST_KEY, $scope.activeCodelistKey);\n };\n\n $scope.saveEntry = function (row) {\n var entry = {\n code: row.code,\n defaultLabel : row.defaultLabel,\n localeLabels : row.localeLabels\n };\n\n CodelistRessource.createEntry({ id: $scope.activeCodelistId }, [entry] ,function (result) {\n $scope.scrollHelper.reload(_.merge({ id: $scope.activeCodelistId }, $scope.queryParams));\n row.editing = false;\n $scope.rowEdit = false;\n var msg = $scope.creating ? \"CODELIST_EDITOR.CREATE_ENTRY_SUCCESS_MESSAGE\" : \"CODELIST_EDITOR.UPDATE_ENTRY_SUCCESS_MESSAGE\";\n $scope.creating = false;\n growl.success(msg, {\n variables: {\n code: entry.code\n },\n ttl: 5000\n });\n }, function (response) {\n var msg = $scope.creating ? \"CODELIST_EDITOR.CREATE_ENTRY_ERROR_MESSAGE\" : \"CODELIST_EDITOR.UPDATE_ENTRY_ERROR_MESSAGE\";\n growl.error(msg);\n });\n };\n\n $scope.deleteCodelist = function(codelist, $event) {\n $event.stopPropagation();\n CodelistRessource.delete({ id: codelist.id } ,function (result) {\n growl.success('CODELIST_EDITOR.DELETE_CODELIST_SUCCESS_MESSAGE', {\n variables: {\n codelist: codelist.name\n },\n ttl: 5000\n });\n activateInitialMap();\n }, function (response) {\n growl.error(\"CODELIST_EDITOR.DELETE_CODELIST_ERROR_MESSAGE\");\n });\n };\n\n $scope.deleteEntry = function (row) {\n var modalInstance = $modal.open({\n templateUrl: 'tpl/confirm-delete-key-value-modal.tpl.html',\n controller: 'ModalInstanceCtrl',\n backdrop: true,\n resolve: {\n data: function() {\n var data = [{key:row.code, value : row.defaultLabel}];\n return data;\n }\n }\n });\n modalInstance.result.then(function() {\n var codes = [row.code];\n CodelistRessource.deleteEntries( row.codelistId, codes).then(function (result) {\n $scope.scrollHelper.reload(_.merge({ id: $scope.activeCodelistId }, $scope.queryParams));\n growl.success('CODELIST_EDITOR.DELETE_ENTRY_SUCCESS_MESSAGE_SINGLE', {\n variables: {\n code: row.code,\n codelist : $scope.activeCodelistKey\n },\n ttl: 5000\n });\n }).catch(function (response) {\n growl.error(\"CODELIST_EDITOR.DELETE_ENTRY_ERROR_MESSAGE\");\n });\n });\n };\n\n $scope.deleteSelectedEntries = function() {\n\n var selectedEntries = $scope.gridApi.selection.getSelectedRows();\n\n if (_.isEmpty($scope.entries) || _.isEmpty(selectedEntries)) {\n growl.warning(\"CODELIST_EDITOR.NO_ENTRIES_SELECTED\");\n return false;\n }\n\n var map = $scope.activeCodelistKey;\n var selection = _.map(selectedEntries, function(entry) {\n return entry.code;\n });\n\n var modalInstance = $modal.open({\n templateUrl: 'tpl/confirm-delete-key-value-modal.tpl.html',\n controller: 'ModalInstanceCtrl',\n backdrop: true,\n resolve: {\n data: function() {\n var data = selectedEntries.map(function(e) {\n return {key:e.code, value: e.defaultLabel};\n });\n return data;\n }\n }\n });\n modalInstance.result.then(function() {\n CodelistRessource.deleteEntries( selectedEntries[0].codelistId, selection).then(function (result) {\n $scope.scrollHelper.reload(_.merge({ id: $scope.activeCodelistId }, $scope.queryParams));\n growl.success('CODELIST_EDITOR.DELETE_ENTRY_SUCCESS_MESSAGE_MULTIPLE', {\n variables: {\n count: selection.length,\n codelist : $scope.activeCodelistKey\n },\n ttl: 5000\n });\n }).catch(function (response) {\n growl.error(\"CODELIST_EDITOR.DELETE_ENTRY_ERROR_MESSAGE\");\n });\n });\n };\n\n $scope.createEntry = function() {\n $scope.creating = true;\n var entry = {\n code: '',\n defaultLabel : '',\n localeLabels : {}\n };\n\n _.forEach($rootScope.supportedLanguages, function(l) {\n entry.localeLabels[l.key] = '';\n });\n\n $scope.entries.unshift(entry);\n\n $timeout(function () {\n $scope.gridApi.cellNav.scrollToFocus($scope.entries[0],$scope.columnDefs[0]);\n });\n };\n\n $scope.cancel = function(row) {\n if (!$scope.creating) {\n row.localeLabels = angular.copy(row.oldLocaleLabels);\n row.defaultLabel = row.oldDefaultLabel;\n } else {\n $scope.entries = _.remove($scope.entries, function(entry) {\n return entry.$$hashKey != row.$$hashKey;\n });\n $scope.creating = false;\n }\n\n $scope.$emit(uiGridEditConstants.events.CANCEL_CELL_EDIT);\n };\n\n $scope.checkUnsavedChanges = function() {\n var deffered = $q.defer();\n var row = $scope.editingRow;\n if (!row && !$scope.creating) {\n return deffered.reject();\n }\n var isEqual = _.isEqual(row.localeLabels, row.oldLocaleLabels) && row.defaultLabel == row.oldDefaultLabel;\n\n if ($scope.rowEdit && !isEqual) {\n var confirmDialog = $dialogs.confirm('MODAL.CONFIRM_HEADER', 'MODAL.DISMISS_WITH_UNSAVED_CHANGES');\n confirmDialog.result.then(function() {\n deffered.resolve();\n }, function() {\n deffered.reject();\n });\n } else {\n deffered.reject();\n }\n return deffered.promise;\n };\n\n $scope.$on(uiGridEditConstants.events.END_CELL_EDIT, function(event) {\n var row = $scope.editingRow;\n var isEqual = _.isEqual(row.localeLabels, row.oldLocaleLabels) && row.defaultLabel == row.oldDefaultLabel;\n if (!$scope.creating && isEqual) {\n $scope.cancel(row);\n }\n });\n\n $scope.$on(uiGridEditConstants.events.CANCEL_CELL_EDIT, function(event) {\n if (!$scope.creating) {\n var newRow = _.find($scope.entries, {code: $scope.editingRow.code});\n if (newRow) {\n newRow.editing = false;\n }\n $scope.rowEdit = false;\n }\n });\n\n $scope.$on('$locationChangeStart', function(event, next) {\n if($scope.rowEdit || $scope.creating) {\n event.preventDefault();\n var promise = $scope.checkUnsavedChanges();\n promise.then(function () {\n $scope.rowEdit = false;\n $scope.creating = false;\n var url = _.replace($location.absUrl(), $location.path(), \"\");\n url = _.replace(next, url, \"\");\n $location.url(url);\n });\n }\n });\n\n $rootScope.$on(\"infiniteScrollLoadMore\",function() {\n saveState();\n });\n\n $rootScope.$on(\"infiniteScrollDataLoaded\",function() {\n restoreState();\n });\n\n (function init() {\n activateInitialMap();\n })();\n }\n );\n","angular.module('llax')\n .controller('CommunicationChannelsController',\n function($controller, $location, $log, $modal, $rootScope, $routeParams, $scope, $timeout, growl, ChannelService,\n CommunicationChannelResource, CommunicationChannelSubDestinationsAndBlockedReviewersResource, CommunicationChannelTypesResource, CommunicationChannelTemplatesResource, Auth,\n InputTemplatesService, OrganizationService, PublicationResource, RepublishResource, ReactBridge) {\n\n var SECRET_PLACEHOLDER = \"......\";\n\n $scope.init = function () {\n CommunicationChannelTypesResource.get({}, function (response) {\n response = response.toJSON();\n\n $scope.channelsVerification = response;\n $scope.channelTypes = Object.keys(response);\n\n if ($rootScope.organization) {\n $scope.loadAllChannels();\n } else {\n var organizationLoaded = false;\n OrganizationService.getOrganization().subscribe(function(organization) {\n if (!organizationLoaded) {\n organizationLoaded = true;\n $rootScope.organization = angular.copy(organization);\n $scope.loadAllChannels();\n }\n });\n }\n\n });\n };\n\n $scope.init();\n\n $controller('PublicationTasksController', {\n $scope: $scope\n });\n $controller('SubscriptionsController', {\n $scope: $scope\n });\n $controller('MessagingController', {\n $scope: $scope\n });\n\n $rootScope.loadDataModel();\n\n ChannelService.register(ChannelService.MESSAGING_ASSET_CHANGED_EVENT);\n\n $scope.$on('$destroy', function() {\n ChannelService.unregister(ChannelService.MESSAGING_ASSET_CHANGED_EVENT);\n });\n\n $scope.$on('channelMessageReceived', function(event, eventData) {\n if (eventData.event === ChannelService.MESSAGING_ASSET_CHANGED_EVENT) {\n var messagingAsset = eventData.data.messagingAsset;\n var channelId = messagingAsset.channelId;\n\n if (channelId) {\n $scope.updateMessageCounter(channelId);\n }\n }\n });\n\n function setPlans(plans) {\n $scope.plans = plans;\n if (!_.isEmpty($scope.plans)) {\n _.forEach($scope.plans, function(plan) {\n if (!_.isEmpty(plan.planAttributes)) {\n $rootScope.prepareAttributes(plan.planAttributes, true);\n }\n });\n }\n }\n\n setPlans($rootScope.communicationPlans);\n $scope.$on('dataModelLoaded', function() {\n $scope.loadAllChannels();\n setPlans($rootScope.communicationPlans);\n });\n\n $scope.getPlan = function(channel) {\n return $scope.plans[channel.plan];\n };\n\n $scope.getPlanLabel = function(channel) {\n var plan = $scope.getPlan(channel);\n if (plan) {\n return (plan.label || plan.name);\n } else if (channel.format) {\n return $rootScope.translateValue('COMMUNICATION_CHANNELS.FORMATS.', channel.format);\n } else {\n return \"\";\n }\n };\n\n $rootScope.supportsInbound = function (channel) {\n if (_.isNil(channel.direction)) {\n return false;\n }\n return channel.direction !== \"OUTBOUND_ONLY\";\n };\n\n $rootScope.supportsOutbound = function (channel) {\n if (_.isNil(channel.direction)) {\n return false;\n }\n return channel.direction !== \"INBOUND_ONLY\";\n };\n\n $scope.hasCreatePermission = function() {\n return Auth.hasChannelPermission(\"create\", null);\n };\n\n $scope.hasActivatePermission = function(channel) {\n return Auth.hasChannelPermission(\"activate\", channel);\n };\n\n $scope.hasEditPermission = function(channel) {\n return Auth.hasChannelPermission(\"edit\", channel);\n };\n\n $scope.hasEditSubDestinationPermission = function(channel) {\n return Auth.hasChannelPermission(\"edit_sub_destinations\", channel);\n };\n\n $scope.hasDeletePermission = function(channel) {\n return Auth.hasChannelPermission(\"delete\", channel);\n };\n\n $scope.channelsSupportingBlockedReviewers = ['AS2', 'BSYNCED', 'CUSTOM'];\n $scope.templates = [];\n CommunicationChannelTemplatesResource.query(function(response) {\n $scope.templates = response;\n });\n\n var editChannelOpts = function(channel, title) {\n return {\n templateUrl: 'tpl/edit-communicationchannel.tpl.html',\n controller: 'EditChannelCtrl',\n windowClass: 'communicationchannel-modal',\n resolve: {\n channel: function() {\n return channel;\n },\n title: function() {\n return title;\n },\n plans: function() {\n return $scope.plans;\n },\n types: function() {\n return $scope.channelTypes;\n },\n templates: function() {\n return $scope.templates;\n },\n channelsVerification: function() {\n return $scope.channelsVerification;\n }\n }\n };\n };\n\n $scope.channels = {};\n $scope.hasChannels = false;\n $scope.isChannelsLoading = true;\n $scope.orderPredicate = 'name';\n\n $scope.updateMessageCounter = function(channelId) {\n CommunicationChannelResource.get({channelId: channelId}, {},\n function(channel) {\n if (channel) {\n $scope.channels[channel.id].numberOfPendingIncomingMessages = channel.numberOfPendingIncomingMessages;\n $scope.channels[channel.id].countMessagingAssetsCreatedAfter = channel.countMessagingAssetsCreatedAfter;\n }\n },\n function (response) {\n $rootScope.error = response.data;\n $scope.status = response.status;\n growl.error(\"COMMUNICATION_CHANNELS.LOAD_ERROR_MESSAGE\");\n });\n };\n\n $scope.loadAllChannels = function() {\n\n CommunicationChannelResource.query({},\n function(channels) {\n if (channels.length > 0) {\n for (var i = 0; i < channels.length; i++) {\n var channel = channels[i];\n channel.needsVerification = !$scope.channelsVerification[channel.type];\n channel.supportsBlockedReviewers = $scope.channelsSupportingBlockedReviewers.indexOf(channel.type) > -1;\n convert(channel);\n $scope.channels[channel.id] = channel;\n }\n $scope.hasChannels = true;\n $scope.isChannelsLoading = false;\n } else {\n $scope.hasChannels = false;\n $scope.isChannelsLoading = false;\n }\n },\n function(response) {\n $rootScope.error = response.data;\n $scope.status = response.status;\n growl.error(\"COMMUNICATION_CHANNELS.LOAD_ERROR_MESSAGE\");\n });\n\n };\n\n $scope.newChannel = function() {\n var modal = $modal.open({\n template: '
' +\n '' +\n '

' +\n 'COMMUNICATION_CHANNELS.NEW_TITLE' +\n '

' +\n '
' +\n '
' +\n '
' +\n '
' +\n '' +\n 'COMMUNICATION_CHANNELS.ERROR_CHANNEL_TYPE_NOT_SUPPORTED_BY_PLAN' +\n '
' +\n '
' +\n '
' +\n '
' +\n '' +\n '' +\n '
',\n controller: function($scope, $modalInstance) {\n $scope.ok = function() {\n $modalInstance.close($scope.selectedTemplate);\n };\n\n $scope.selectTemplate = function(n) {\n $scope.selectedTemplate = _.find($scope.templates, function(t) {\n return t.name == n;\n });\n };\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n },\n size: 'sm',\n windowClass : 'select-cc-template-editor',\n scope: $scope\n });\n modal.result.then(function(template) {\n var channel = {};\n channel = angular.extend(channel, template);\n var modal = $modal.open(editChannelOpts(channel, \"COMMUNICATION_CHANNELS.NEW_TITLE\"));\n modal.result.then(function(channel) {\n $scope.saveChannel(channel);\n }).finally(function() {\n $location.displayUrl(\"/communicationchannels\");\n $rootScope.reloadAfterDataModelUpdate();\n });\n });\n };\n\n $scope.editChannel = function(channel) {\n if (channel.type == \"BSYNCED\"){\n channel.apiToken = \"\";\n if (channel.hasApiToken){\n channel.apiToken = SECRET_PLACEHOLDER;\n }\n }\n if (channel.type == \"SFTP\"){\n channel.password = \"\";\n if (channel.hasPassword){\n channel.password = SECRET_PLACEHOLDER;\n }\n channel.privateKey = \"\";\n if (channel.hasPrivateKey){\n channel.privateKey = SECRET_PLACEHOLDER;\n }\n }\n $location.displayUrl(\"/communicationchannels/\" + channel.id);\n var modal = $modal.open(editChannelOpts(channel, \"COMMUNICATION_CHANNELS.EDIT_TITLE\"));\n modal.result.then(function(channel) {\n if (channel.type == \"BSYNCED\" && channel.apiToken == SECRET_PLACEHOLDER){\n delete channel.apiToken;\n }\n if (channel.type == \"SFTP\") {\n if (channel.password == SECRET_PLACEHOLDER) {\n delete channel.password;\n }\n if (channel.privateKey == SECRET_PLACEHOLDER) {\n delete channel.privateKey;\n }\n }\n $timeout(function () {\n $scope.saveChannel(channel);\n }, 0);\n }).finally(function() {\n $location.displayUrl(\"/communicationchannels\");\n $rootScope.reloadAfterDataModelUpdate();\n });\n };\n\n $scope.resetCountKeyDate = function(channel) {\n console.log(\"about to reset count date for channel: \", channel);\n\n CommunicationChannelResource.resetcountkeydate({\n channelId: channel.id\n }, null,\n function(channel) {\n $scope.channels[channel.id] = channel;\n growl.success(\"COMMUNICATION_CHANNELS.RESET_COUNT_KEY_DATE_SUCCESS_MESSAGE\");\n },\n function(response) {\n $rootScope.error = response.data;\n $scope.status = response.status;\n growl.error(\"COMMUNICATION_CHANNELS.RESET_COUNT_KEY_DATE_ERROR_MESSAGE\");\n });\n };\n\n $scope.saveChannel = function(channel) {\n\n console.log(\"about to save channel: \", channel);\n\n $scope.clearConnectionError(channel);\n\n if (!_.isEmpty(channel.subDestinations)) {\n channel = angular.copy(channel);\n var subDestinations = {};\n for (var i = 0; i < channel.subDestinations.length; i++) {\n var key = channel.subDestinations[i].key;\n var label = channel.subDestinations[i].label || \"\";\n if (_.isEmpty(key)) {\n continue;\n }\n subDestinations[key] = label;\n }\n channel.subDestinations = subDestinations;\n } else {\n channel.subDestinations = null;\n }\n\n if (!_.isEmpty(channel.blockedReviewers)) {\n channel = angular.copy(channel);\n var blockedReviewers = {};\n for (var j = 0; j < channel.blockedReviewers.length; j++) {\n var blockedReviewerKey = channel.blockedReviewers[j].key;\n var blockedReviewerLabel = channel.blockedReviewers[j].label || \"\";\n if (_.isEmpty(blockedReviewerKey)) {\n continue;\n }\n blockedReviewers[blockedReviewerKey] = blockedReviewerLabel;\n }\n channel.blockedReviewers = blockedReviewers;\n } else {\n channel.blockedReviewers = null;\n }\n\n if( !$scope.hasEditPermission(channel) && $scope.hasEditSubDestinationPermission(channel)){\n CommunicationChannelSubDestinationsAndBlockedReviewersResource.save(channel,\n function(channel) {\n $scope.channels[channel.id] = channel;\n growl.success(\"COMMUNICATION_CHANNELS.SAVE_SUCCESS_MESSAGE\");\n $scope.loadAllChannels();\n },\n function(response) {\n $rootScope.error = response.data;\n $scope.status = response.status;\n growl.error(\"COMMUNICATION_CHANNELS.SAVE_ERROR_MESSAGE\");\n });\n } else{\n CommunicationChannelResource.save(channel,\n function(channel) {\n $scope.channels[channel.id] = channel;\n growl.success(\"COMMUNICATION_CHANNELS.SAVE_SUCCESS_MESSAGE\");\n $scope.loadAllChannels();\n },\n function(response) {\n $rootScope.error = response.data;\n $scope.status = response.status;\n growl.error(\"COMMUNICATION_CHANNELS.SAVE_ERROR_MESSAGE\");\n });\n }\n\n };\n\n $scope.$on('deleteChannel', function(scope, channel) {\n console.log(\"about to delete channel: \", channel);\n\n CommunicationChannelResource.remove({\n channelId: channel.id\n }, null,\n function(response) {\n delete $scope.channels[channel.id];\n growl.success(\"COMMUNICATION_CHANNELS.DELETE_SUCCESS_MESSAGE\");\n $scope.loadAllChannels();\n },\n function(response) {\n $rootScope.error = response.data;\n $scope.status = response.status;\n growl.error(\"COMMUNICATION_CHANNELS.DELETE_ERROR_MESSAGE\");\n });\n });\n\n $scope.deleteChannel = function(channel) {\n var modalInstance = $modal.open({\n templateUrl: 'tpl/confirm-delete-communicationchannel.tpl.html',\n controller: 'ModalInstanceCtrl',\n backdrop: true,\n resolve: {\n data: function() {\n return channel;\n }\n }\n });\n };\n\n $scope.$on('deactivateChannel', function(scope, channel) {\n console.log(\"about to deactivate channel: \", channel);\n $scope.deactivateChannel(channel);\n });\n\n $scope.toggleChannelActivation = function(channel) {\n if (!channel.active) {\n $scope.activateChannel(channel);\n } else {\n var modalInstance = $modal.open({\n templateUrl: 'tpl/confirm-deactivate-communicationchannel.tpl.html',\n controller: 'ModalInstanceCtrl',\n backdrop: true,\n resolve: {\n data: function() {\n return channel;\n }\n }\n });\n }\n };\n\n $scope.activateChannel = function(channel) {\n\n console.log(\"about to activate channel: \", channel);\n\n if ($scope.hasConnectionError(channel)) {\n growl.warning(\"COMMUNICATION_CHANNELS.CONNECTION_FAILURE_MESSAGE_SFTP\");\n return;\n }\n\n CommunicationChannelResource.activate({\n channelId: channel.id\n }, null,\n function(channels) {\n // Activation response can also contain previous activated channel\n if (channels.length === 0) {\n growl.warning(\"COMMUNICATION_CHANNELS.ACTIVATE_FAILURE_MESSAGE_\" + channel.type);\n } else {\n for (var i = 0; i < channels.length; i++) {\n $scope.channels[channels[i].id] = channels[i];\n }\n growl.success(\"COMMUNICATION_CHANNELS.ACTIVATE_SUCCESS_MESSAGE\");\n }\n },\n function(response) {\n $rootScope.error = response.data;\n $scope.status = response.status;\n growl.error(\"COMMUNICATION_CHANNELS.ACTIVATE_ERROR_MESSAGE\");\n });\n\n };\n\n $scope.deactivateChannel = function(channel) {\n\n console.log(\"about to deactivate channel: \", channel);\n\n CommunicationChannelResource.deactivate({\n channelId: channel.id\n }, null,\n function(channel) {\n $scope.channels[channel.id] = channel;\n growl.success(\"COMMUNICATION_CHANNELS.DEACTIVATE_SUCCESS_MESSAGE\");\n },\n function(response) {\n $rootScope.error = response.data;\n $scope.status = response.status;\n growl.error(\"COMMUNICATION_CHANNELS.DEACTIVATE_ERROR_MESSAGE\");\n });\n\n };\n\n $scope.uploadInboundMessages = function(channel) {\n return uploadMessages(channel, 'INBOUND');\n };\n\n $scope.uploadOutboundMessages = function(channel) {\n return uploadMessages(channel, 'OUTBOUND');\n };\n\n function convert(loadedChannel) {\n var channel = loadedChannel;\n if (!_.isEmpty(channel.subDestinations)) {\n var subDestinations = [];\n for (var key in channel.subDestinations) {\n var label = channel.subDestinations[key];\n subDestinations.push({\n key: key,\n label: label\n });\n }\n channel.subDestinations = subDestinations;\n } else {\n channel.subDestinations = null;\n }\n\n if (!_.isEmpty(channel.blockedReviewers)) {\n var blockedReviewers = [];\n for (var blockedReviewerKey in channel.blockedReviewers) {\n var blockedReviewerLabel = channel.blockedReviewers[blockedReviewerKey];\n blockedReviewers.push({\n key: blockedReviewerKey,\n label: blockedReviewerLabel\n });\n }\n channel.blockedReviewers = blockedReviewers;\n } else {\n channel.blockedReviewers = null;\n }\n\n return channel;\n }\n\n function uploadMessages(channel, direction) {\n return {\n url: lax_rest_url('messaging/messagingassets') + '?direction=' + direction,\n formData: getFormData(channel),\n autoUpload: true,\n reset: true,\n uploadComplete: function(response) {\n growl.success(\"UPLOAD_SUCCESS_MESSAGE\");\n }\n };\n }\n\n function getFormData(channel) {\n var fd = [];\n fd.push({\n \"channelId\": channel.id\n });\n return fd;\n }\n\n $scope.toggleShowPublicationMessages = function(entity) {\n entity.showDetails = !entity.showDetails;\n };\n\n $scope.canSubscribe = function(channel) {\n if (!$scope.getSubscriptionCategory(channel)) {\n return false;\n }\n if (!$scope.getSubscriptionAttributes(channel)) {\n return false;\n }\n return true;\n };\n\n $scope.getSubscriptionCategory = function(channel) {\n var plan = $scope.getPlan(channel);\n if (plan) {\n return plan.subscriptionCategory;\n } else if (channel.format) {\n var categoryName = $rootScope.dataModel.name() + \"::\" + \"Subscription\" + channel.format;\n var subscriptionCategory = $rootScope.dataModel.category(categoryName);\n return (subscriptionCategory || {}).name;\n } else {\n return null;\n }\n };\n\n $scope.getSubscriptionAttributes = function(channel) {\n var plan = $scope.getPlan(channel);\n if (plan) {\n return plan.subscriptionAttributes;\n } else if (channel.format) {\n var subscriptionAttributes =\n $rootScope.dataModel.filteredLayoutAttributes(\"subscription_\" + channel.format);\n return subscriptionAttributes;\n } else {\n return [];\n }\n };\n\n $scope.showMessagingDetails = function(message) {\n $modal.open({\n templateUrl: 'tpl/show-messaging-details.tpl.html',\n controller: 'ShowMessagingDetailsCtrl',\n backdrop: true,\n windowClass: 'publish-modal',\n resolve: {\n message: function() {\n return message;\n }\n }\n });\n };\n\n $scope.showErrorDetailDialog = function (channel) {\n var errorTitle = $rootScope.translate(\"ITEM_REVIEW.ERROR\");\n // Note: Only SFTP channels can have connection error (at the moment)\n var errorHeader = $rootScope.translate(\"COMMUNICATION_CHANNELS.CONNECTION_FAILURE_MESSAGE_SFTP\");\n var errorMessage = $scope.getConnectionError(channel);\n\n var dialog = ReactBridge.mountDialog(\"CommunicationChannelsErrorDialog\", \"#communication_channels_error_dialog-node\",\n {\n title: errorTitle,\n heading: errorHeader,\n message: errorMessage,\n onClose: function () {\n dialog.unmount();\n }\n });\n };\n\n $scope.showErrorTooltip = function (channel) {\n // Note: Only SFTP channels can have connection error (at the moment)\n var errorHeader = $rootScope.translate(\"COMMUNICATION_CHANNELS.CONNECTION_FAILURE_MESSAGE_SFTP\");\n\n function customRendererFn() {\n var attributeStart = '
  • ';\n var attributeEnd = '
';\n return attributeStart + errorHeader + attributeEnd;\n }\n\n var target = 'error_message-channel-' + channel.id;\n var calloutConfig = {\n id: 'callout_' + channel.id,\n target: target,\n placement: 'left',\n content: '',\n customRenderer: customRendererFn\n };\n\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeAllCallouts();\n\n var calloutEle = calloutMgr.createCallout(calloutConfig);\n // Hack: override !important css rules, with inline precedence\n calloutEle.element.style.cssText += 'border: none !important; z-index: 1049;';\n calloutEle.element.addEventListener(\"click\", function (e) {\n $scope.hideErrorTooltip();\n $scope.showErrorDetailDialog(channel);\n });\n $scope.shouldRemoveTooltip = false;\n };\n\n $scope.hideErrorTooltip = function () {\n $scope.shouldRemoveTooltip = true;\n $timeout(function () {\n hideTooltip('.hopscotch-bubble');\n }, 300);\n };\n\n function hideTooltip(elementClass) {\n if ($(elementClass + ':hover').length == 0 &&\n $scope.shouldRemoveTooltip) {\n $(elementClass + ':hover').off('mouseout');\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeAllCallouts();\n } else {\n $(elementClass).mouseout(function() {\n $timeout(function() {\n hideTooltip(elementClass);\n }, 600);\n });\n }\n }\n\n $scope.getConnectionError = function (channel) {\n return \"Error: \" + channel.errorMessage;\n };\n\n $scope.hasConnectionError = function (channel) {\n return !_.isEmpty(channel.errorMessage);\n };\n\n $scope.clearConnectionError = function (channel) {\n channel.errorMessage = \"\";\n };\n\n if ($routeParams.id) {\n CommunicationChannelResource.get({\n channelId: $routeParams.id\n },\n function(channel) {\n if ($location.path().indexOf('subscriptions') > -1) {\n $scope.newSubscription(channel);\n } else {\n $scope.editChannel(channel);\n }\n });\n }\n\n }\n )\n .controller('EditChannelCtrl',\n function($modalInstance, $rootScope, $scope, $translate, channel, title, plans, types, templates, channelsVerification, uiGridConstants, Auth, CommunicationChannelTypesResource) {\n\n $scope.focusOn = true;\n $scope.channel = channel || {};\n $scope.channel.planValues = $scope.channel.planValues || {};\n $scope.title = title;\n $scope.plans = plans;\n $scope.plansArray = _.values(plans);\n $scope.types = types;\n $scope.directionOptions = [\n {label: \"Inbound\", value: \"INBOUND_ONLY\"},\n {label: \"Outbound\", value: \"OUTBOUND_ONLY\"},\n {label: \"Both\", value: \"BOTH\"}\n ];\n $scope.channelDirections = {\n AS2: {default: \"BOTH\", configurable: false},\n BSYNCED: {default: \"BOTH\", configurable: false},\n CUSTOM: {default: \"OUTBOUND_ONLY\", configurable: true},\n HTTPS: {default: \"OUTBOUND_ONLY\", configurable: false},\n SFTP: {default: \"OUTBOUND_ONLY\", configurable: true},\n SMTP: {default: \"OUTBOUND_ONLY\", configurable: false},\n WEBSERVICE: {default: \"BOTH\", configurable: false}\n };\n $scope.templates = templates;\n $scope.channelsVerification = channelsVerification;\n $scope.chosenType = $scope.channel.type;\n $scope.encryptAlgorithms = ['rc2', '3des'];\n $scope.signAlgorithms = ['sha1', 'md5'];\n $scope.channelsSupportingBlockedReviewers = ['AS2', 'BSYNCED', 'CUSTOM'];\n $scope.bsyncedServers = $rootScope.systemSettings.BSYNCED_SERVERS;\n $scope.channel.needsVerification = !$scope.channelsVerification[channel.type];\n $scope.channel.supportsBlockedReviewers = $scope.channelsSupportingBlockedReviewers.indexOf($scope.channel.type) > -1;\n $scope.hasCombinationError = false;\n $scope.yesNoOptions = [\n {\n key: true,\n label: $rootScope.translate('YES')\n }, {\n key: false,\n label: $rootScope.translate('NO')\n }\n ];\n\n if (!_.isEmpty($scope.channel.plan)) {\n var plan = _.find($scope.plans, function(p) {\n return p.name == $scope.channel.plan;\n });\n if (_.isEmpty(plan)) {\n $scope.additionalPlan = {name : $scope.channel.plan, label : $scope.channel.plan};\n $scope.plansArray.push($scope.additionalPlan);\n }\n }\n\n $scope.ok = function() {\n $modalInstance.close($scope.channel);\n };\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.chooseType = function(channel, type) {\n var selectedPlan = $scope.plans[$scope.channel.plan];\n checkCombination(selectedPlan,type);\n var template = $scope.templates.filter(function(element) {\n return element.name === type;\n })[0];\n if (template) {\n $scope.channel = angular.extend($scope.channel, template);\n $scope.item = $scope.channel.planValues;\n } else {\n $scope.channel.type = type;\n }\n\n $scope.channel.direction = $scope.channelDirections[type].default;\n $scope.channel.needsVerification = !$scope.channelsVerification[$scope.channel.type];\n $scope.channel.supportsBlockedReviewers = $scope.channelsSupportingBlockedReviewers.indexOf($scope.channel.type) > -1;\n };\n\n $scope.changePlan = function(plan) {\n checkCombination(plan,$scope.channel.type);\n };\n\n function checkCombination(plan,type) {\n if (!_.isEmpty(plan) && !_.isEmpty(type)) {\n var actions = [];\n for (var key in plan.planActions) {\n actions = _.union(actions, plan.planActions[key]);\n }\n $scope.hasCombinationError = actions.indexOf(type) < 0;\n } else {\n $scope.hasCombinationError = false;\n }\n }\n\n $scope.clearValue = function(inputId) {\n if (!_.isNil(inputId) && !_.isNil($scope.channel[inputId])) {\n $scope.channel[inputId] = null;\n }\n };\n\n $scope.item = $scope.channel.planValues;\n\n $scope.hasPlanAttributes = function(planName) {\n var planAttributes = $scope.getPlanAttributes(planName);\n return planAttributes.length > 0;\n };\n\n $scope.hasEditPermission = function(channel) {\n return Auth.hasChannelPermission(\"edit\", channel);\n };\n\n $scope.hasEditSubDestinationPermission = function(channel) {\n return Auth.hasChannelPermission(\"edit_sub_destinations\", channel);\n };\n\n $scope.getPlanAttributes = function(planName) {\n var plan = $scope.plans[planName];\n return plan ? plan.planAttributes : [];\n };\n\n $scope.supportsSubDestinations = function(planName) {\n var plan = $scope.plans[planName];\n return plan ? plan.supportsSubDestinations : false;\n };\n\n $scope.subDestinationsColumnDefs = [{\n field: 'key',\n displayName: $translate.instant('COMMUNICATION_CHANNELS.SUB_DESTINATIONS.KEY'),\n headerTooltip: true,\n cellTooltip: true,\n sort: {\n direction: uiGridConstants.ASC,\n },\n width: '46%'\n }, {\n field: 'label',\n displayName: $translate.instant('COMMUNICATION_CHANNELS.SUB_DESTINATIONS.LABEL'),\n headerTooltip: true,\n cellTooltip: true,\n width: '46%'\n }, {\n field: 'actions',\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n width: '8%',\n headerCellClass: 'text-right',\n cellClass: 'text-right',\n pinnedRight: true,\n allowCellFocus: false,\n enableCellEdit: false,\n enableColumnMenu: false,\n enableSorting: false,\n cellTemplate: '
' +\n '' +\n '
'\n }];\n\n $scope.subDestinationsGrid = {\n data: 'channel.subDestinations',\n enableColumnMenus: false,\n enableColumnResize: true,\n enableRowSelection: false,\n minRowsToShow: 5,\n columnDefs: $scope.subDestinationsColumnDefs,\n };\n\n $scope.addSubDestination = function(subDestinationKey, subDestinationLabel) {\n $scope.channel.subDestinations = $scope.channel.subDestinations || [];\n $scope.channel.subDestinations.push({});\n return;\n };\n\n $scope.deleteSubDestination = function(row) {\n var index = $scope.channel.subDestinations.indexOf(row.entity);\n $scope.channel.subDestinations.splice(index, 1);\n };\n\n $scope.supportsBlockedReviewers = function(channel) {\n return channel ? channel.supportsBlockedReviewers : false;\n };\n\n $scope.blockedReviewersColumnDefs = [{\n field: 'key',\n displayName: $translate.instant('COMMUNICATION_CHANNELS.BLOCKED_REVIEWERS.KEY'),\n headerTooltip: true,\n cellTooltip: true,\n sort: {\n direction: uiGridConstants.ASC,\n },\n width: '46%'\n }, {\n field: 'label',\n displayName: $translate.instant('COMMUNICATION_CHANNELS.BLOCKED_REVIEWERS.LABEL'),\n headerTooltip: true,\n cellTooltip: true,\n width: '46%'\n }, {\n field: 'actions',\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n width: '8%',\n headerCellClass: 'text-right',\n cellClass: 'text-right',\n pinnedRight: true,\n allowCellFocus: false,\n enableCellEdit: false,\n enableColumnMenu: false,\n enableSorting: false,\n cellTemplate: '
' +\n '' +\n '
'\n }];\n\n $scope.blockedReviewersGrid = {\n data: 'channel.blockedReviewers',\n enableColumnMenus: false,\n enableColumnResize: true,\n enableRowSelection: false,\n minRowsToShow: 5,\n columnDefs: $scope.blockedReviewersColumnDefs,\n };\n\n $scope.addBlockedReviewer = function(blockedReviewerKey, blockedReviewerLabel) {\n $scope.channel.blockedReviewers = $scope.channel.blockedReviewers || [];\n $scope.channel.blockedReviewers.push({});\n return;\n };\n\n $scope.deleteBlockedReviewer = function(row) {\n var index = $scope.channel.blockedReviewers.indexOf(row.entity);\n $scope.channel.blockedReviewers.splice(index, 1);\n };\n\n }\n )\n .controller('ShowMessagingDetailsCtrl',\n function($rootScope, $scope, $translate, $modalInstance, $http, growl, message, MessagingResponsesResource) {\n\n $scope.message = message;\n\n function getAssetContent(path, callback) {\n $http({\n method: 'GET',\n url: path\n }).then(function(response) {\n callback(response.data);\n }, function() {\n\n });\n }\n var prettifyXml = function(sourceXml) {\n var xmlDoc = new DOMParser().parseFromString(sourceXml, 'application/xml');\n var isNotValidXml = xmlDoc.getElementsByTagName(\"parsererror\").length > 0;\n if (isNotValidXml) {\n return sourceXml;\n }\n var xsltDoc = new DOMParser().parseFromString([\n // describes how we want to modify the XML - indent everything\n '',\n ' ',\n ' ', // change to just text() to strip space in text nodes\n ' ',\n ' ',\n ' ',\n ' ',\n ' ',\n ' ',\n '',\n ].join('\\n'), 'application/xml');\n\n var xsltProcessor = new XSLTProcessor();\n xsltProcessor.importStylesheet(xsltDoc);\n var resultDoc = xsltProcessor.transformToDocument(xmlDoc);\n var resultXml = new XMLSerializer().serializeToString(resultDoc);\n return resultXml;\n };\n\n getAssetContent(lax_rest_url('messaging/messagingassets/') + message.id, function(data) {\n $scope.messageContent = prettifyXml(data);\n });\n\n if ($scope.message.responseId) {\n MessagingResponsesResource.get({\n messagingAssetId: message.id\n },\n function(response) {\n\n $scope.messagingResponse = response;\n\n getAssetContent(lax_rest_url('messaging/messagingassets/') + $scope.messagingResponse.messagingAssetId,\n function(data) {\n $scope.messagingResponseContent = prettifyXml(data);\n }\n );\n });\n } else if ($scope.message.responseMessageId) {\n getAssetContent(lax_rest_url('messaging/messagingassets/') + $scope.message.responseMessageId,\n function(data) {\n $scope.messagingResponseContent = data;\n }\n );\n }\n\n $scope.close = function() {\n $modalInstance.close();\n };\n\n });\n","angular.module('llax')\n .controller('CompareItemsController',\n function($rootScope, $scope, $modalInstance, $q, primaryKeys, AdditionalCategoryAttributeService, EnumAttributeService, PhysicalAttributeService, ItemResource) {\n\n $scope.TEMPLATE_DIMENSIONAL = 'DIMENSIONAL';\n $scope.TEMPLATE_IMAGE = 'IMAGE';\n $scope.TEMPLATE_TABLE = 'TABLE';\n $scope.TEMPLATE_TEXT = 'TEXT';\n\n $scope.attributes = [];\n $scope.items = {\n first: null,\n second: null\n };\n $scope.collections = {\n first: {},\n second: {}\n };\n $scope.filter = {\n showDifferencesOnly: false,\n showFilledOnly: true\n };\n $scope.loading = true;\n $scope.itemsWithDifferingCategories = false;\n\n function loadAdditionalSectionAttributes(layout, item) {\n var deferred = $q.defer();\n\n AdditionalCategoryAttributeService.loadAdditionalSectionAttributes(layout, item, function(additionalSectionAttributes) {\n var sections = $rootScope.dataModel.filteredSections(layout, item, additionalSectionAttributes);\n var rowLength = 0;\n angular.forEach(sections, function(section) {\n section.rows = [];\n var row = [];\n angular.forEach(section.attributes, function(attribute, index) {\n\n $rootScope.setInputRenderer(attribute);\n attribute.label = $scope.translateAttribute(attribute);\n\n $rootScope.setSectionAttributeParam($scope.currentLayout, section.name, attribute, 'readonly', null, $scope.item);\n $rootScope.setSectionAttributeParam($scope.currentLayout, section.name, attribute, 'labelWidth', 4, $scope.item);\n $rootScope.setSectionAttributeParam($scope.currentLayout, section.name, attribute, 'inputWidth', 8, $scope.item);\n\n attribute.isComplexType = (attribute.typeName == 'Collection' || attribute.typeName ==\n 'MultiDimensional' || attribute.typeName == 'MultiReference');\n if (attribute.isComplexType) {\n attribute.inputWidth += attribute.labelWidth;\n attribute.labelWidth = 0;\n }\n\n rowLength += (attribute.labelWidth + attribute.inputWidth);\n row.push(attribute);\n\n if (rowLength >= 12) {\n section.rows.push(row);\n rowLength = 0;\n row = [];\n }\n\n });\n });\n deferred.resolve(sections);\n });\n return deferred.promise;\n }\n\n $scope.getInputTemplate = function(attribute) {\n var rendererData = getAttributeRenderer(attribute);\n if (rendererData.rendererParams) {\n attribute.rendererData.rendererParams = rendererData.rendererParams;\n }\n return rendererData.renderer;\n };\n\n $scope.categoryHasAttribute = function(category, attribute) {\n var categoryAttributeNames = $rootScope.dataModel.categoryAttributeNames(category);\n var found = false;\n for (var i = 0; i <= categoryAttributeNames.length; i++) {\n if (attribute.name == categoryAttributeNames[i]) {\n found = true;\n break;\n }\n }\n return found;\n };\n\n function isAttributeAlreadyAdded(array, attribute) {\n var added = false;\n for (var i = 0; i < array.length; i++) {\n if (array[i].name == attribute.name) {\n added = true;\n break;\n }\n }\n return added;\n }\n\n function mergeAttributes(sectionsA, sectionsB) {\n var attributes = [];\n var sections = (sectionsA.length > sectionsB.length) ? sectionsA : sectionsB;\n\n angular.forEach(sections, function(section, sectionIndex) {\n var secA = sectionsA[sectionIndex];\n var secB = sectionsB[sectionIndex];\n var rows = (secA.rows.length > secB.rows.length) ? secA.rows : secB.rows;\n\n angular.forEach(rows, function(row, rowIndex) {\n angular.forEach(row, function(attr, attrIndex) {\n var attrA = (secA.rows[rowIndex]) ? secA.rows[rowIndex][attrIndex] : undefined;\n var attrB = (secB.rows[rowIndex]) ? secB.rows[rowIndex][attrIndex] : undefined;\n\n if (attrA != undefined && !isAttributeAlreadyAdded(attributes, attrA)) {\n attributes.push(attrA);\n }\n if (attrB !== undefined && !isAttributeAlreadyAdded(attributes, attrB)) {\n attributes.push(attrB);\n }\n });\n });\n });\n return attributes;\n }\n\n $scope.onlyDefinedCategoryAttributes = function(attr) {\n if (_.isNil($scope.items.first) || _.isNil($scope.items.second)) {\n return false;\n }\n\n if (attr.additionalModule ||\n ($scope.categoryHasAttribute($scope.items.first.category__, attr) &&\n $scope.categoryHasAttribute($scope.items.second.category__, attr))) {\n return true;\n }\n\n return false;\n };\n\n $scope.onlyDifferences = function(attr) {\n if (!$scope.filter.showDifferencesOnly) {\n return true;\n }\n return $scope.isNotEqual($scope.items.first, $scope.items.second, [attr.name]);\n };\n\n $scope.onlyFilled = function(attr) {\n if (!$scope.filter.showFilledOnly) {\n return true;\n }\n // Show attribute if it is filled in at least in one of the items\n return !_.isNil($scope.items.first[attr.name]) || !_.isNil($scope.items.second[attr.name]);\n };\n\n $scope.stringValues = {first: {}, second: {}};\n\n $scope.attributeToString = function(item, attribute, options, comparedItem) {\n var values;\n if (attribute.template == 'String' ||\n attribute.template == 'Integer' ||\n attribute.template == 'Date' ||\n attribute.template == 'Float') {\n $scope.stringValues[comparedItem][attribute.name] = item[attribute.name];\n\n } else if (attribute.template == 'Enum' || attribute.template == 'OpenEnum') {\n EnumAttributeService.getAttributeOptionsAsync(attribute)\n .then(function(options) {\n var value = \"\";\n if (_.isArray(options)) {\n for (var i = 0; i < options.length; i++) {\n if (options[i].key == item[attribute.name]) {\n value = options[i].value;\n }\n }\n }\n $scope.stringValues[comparedItem][attribute.name] = value;\n });\n\n } else if (attribute.template == 'Physical') {\n var value = item[attribute.name];\n if (value) {\n EnumAttributeService.getAttributeOptionsAsync(attribute)\n .then(function(units) {\n $scope.stringValues[comparedItem][attribute.name] = PhysicalAttributeService.formatValue(value, units);\n });\n } else {\n $scope.stringValues[comparedItem][attribute.name] = \"\";\n }\n } else if (attribute.template == 'Boolean') {\n values = attribute.params.values;\n for (var k = 0; k < values.length; k++) {\n if (values[k].key == item[attribute.name]) {\n if (values[k].value == 'True') {\n $scope.stringValues[comparedItem][attribute.name] = '\\u2713';\n } else if (values[k].value == 'False') {\n $scope.stringValues[comparedItem][attribute.name] = '\\u2718';\n } else {\n $scope.stringValues[comparedItem][attribute.name] = values[k].value;\n }\n }\n }\n } else if (attribute.template == 'Dimensional' || attribute.template == 'MultiLineDimensional') {\n $scope.stringValues[comparedItem][attribute.name + '-' + options.key] =\n (item[attribute.name]) ? item[attribute.name][options.key] : \"\";\n } else if (attribute.template == 'EnumSet' || attribute.template == 'OpenEnumSet') {\n var result = \"\";\n if (item[attribute.name] && item[attribute.name].length > 0) {\n for (var l = 0; l < item[attribute.name].length; l++) {\n result += item[attribute.name] + \" \";\n }\n }\n $scope.stringValues[comparedItem][attribute.name] = result;\n }\n else {\n $scope.stringValues[comparedItem][attribute.name] = _.toString(item[attribute.name]);\n }\n };\n\n $scope.isNotEqual = function(first, second, keys) {\n return !$scope.isEqual(first, second, keys);\n };\n\n $scope.isEqual = function(first, second, keys) {\n if (first == second) {\n return true;\n }\n if (_.isEmpty(first) && _.isEmpty(second)) {\n return true;\n }\n var key = (keys || []).shift();\n if (!_.isNil(key)) {\n\n if (!_.isNil(first)) {\n first = first[key];\n }\n\n if (!_.isNil(second)) {\n second = second[key];\n }\n\n return $scope.isEqual(first, second, keys);\n }\n\n return _.isEqual(first, second);\n };\n\n $scope.close = function() {\n $modalInstance.close();\n };\n\n $scope.defaults = function(value) {\n if (_.isNil(value)) {\n return \"-\";\n } else {\n return value;\n }\n };\n\n $scope.prepareAttributeTemplates = function(attributes) {\n _.forEach(attributes, function(attribute) {\n switch(attribute.template) {\n case 'Image':\n attribute.comparisonTemplate = $scope.TEMPLATE_IMAGE;\n break;\n case 'Dimensional':\n case 'MultiLineDimensional':\n attribute.comparisonTemplate = $scope.TEMPLATE_DIMENSIONAL;\n break;\n case 'MultiDimensional':\n case 'Collection':\n case 'MultiReference':\n attribute.comparisonTemplate = $scope.TEMPLATE_TABLE;\n $scope.prepareTableAttribute(attribute);\n break;\n default:\n attribute.comparisonTemplate = $scope.TEMPLATE_TEXT;\n }\n });\n };\n\n $scope.prepareTableAttribute = function(attribute) {\n attribute.members = $rootScope.dataModel.getMemberAttributes(attribute);\n $scope.collections.first[attribute.name] = angular.copy($scope.items.first[attribute.name] || []);\n $scope.collections.second[attribute.name] = angular.copy($scope.items.second[attribute.name] || []);\n var firstItemEntriesLength = $scope.collections.first[attribute.name].length;\n var secondItemEntriesLength = $scope.collections.second[attribute.name].length;\n if (firstItemEntriesLength || secondItemEntriesLength) {\n var maxLength = Math.max.apply(Math, [firstItemEntriesLength, secondItemEntriesLength]);\n\n if (maxLength != firstItemEntriesLength) {\n for (var k = 0; k < maxLength - firstItemEntriesLength; k++) {\n $scope.collections.first[attribute.name].push({ });\n }\n }\n\n // Comparing entries of the second collection with the first collection\n for (var i = 0; i < maxLength; i++) {\n $scope.collections.first[attribute.name][i] = $scope.collections.first[attribute.name][i] || {};\n $scope.collections.second[attribute.name][i] = $scope.collections.second[attribute.name][i] || {};\n\n var firstItemEntry = $scope.collections.first[attribute.name][i];\n var secondItemEntry = $scope.collections.second[attribute.name][i];\n for (var j = 0; j < attribute.members.length; j++) {\n var memberAttribute = attribute.members[j].name;\n var has_attr = _.isUndefined(firstItemEntry[memberAttribute]) && _.isUndefined(secondItemEntry[memberAttribute]);\n secondItemEntry[memberAttribute] = {\n isEqual: (has_attr || firstItemEntry[memberAttribute] === secondItemEntry[memberAttribute]),\n val: $scope.defaults(secondItemEntry[memberAttribute])\n };\n }\n }\n }\n };\n\n $scope.init = function() {\n var itemsRequests = [];\n _.forEach(primaryKeys, function(primaryKey) {\n var deferred = $q.defer();\n ItemResource.get({}, {\n 'primaryKey': primaryKey\n },\n function(itemResult) {\n for (var key in itemResult) {\n // try to parse JSON like Strings into JSON Objects\n var val = itemResult[key];\n if (val !== undefined && typeof val == \"string\" && (val.startsWith(\"{\") || val.startsWith(\"[\"))) {\n try {\n itemResult[key] = JSON.parse(val);\n } catch (e) {}\n }\n }\n deferred.resolve(itemResult);\n });\n\n itemsRequests.push(deferred.promise);\n });\n\n $q.all(itemsRequests).then(function(items){\n $scope.items.first = items[0];\n $scope.items.second = items[1];\n\n if ($scope.items.first.category__ !== $scope.items.second.category__) {\n $scope.itemsWithDifferingCategories = true;\n }\n\n $q.all([\n loadAdditionalSectionAttributes('edit', $scope.items.first),\n loadAdditionalSectionAttributes('edit', $scope.items.second)\n ]) .then(function(itemSections) {\n $scope.attributes = mergeAttributes(itemSections[0], itemSections[1]);\n $scope.prepareAttributeTemplates($scope.attributes);\n $scope.loading = false;\n });\n });\n };\n\n $scope.init();\n }\n ).filter(\"dimensionalDiffFilter\", function() {\n return function(keys, isDiffFiltering, attribute, firstItem, secondItem) {\n if (!isDiffFiltering) {\n return keys;\n }\n\n // Filter out keys that are equal in both items, while taking into account\n // that undefined or null values are equal to each other.\n return _.reduce(keys, function(result, keyObject) {\n var firstItemAttribute = firstItem[attribute.name];\n var secondItemAttribute = secondItem[attribute.name];\n var firstValue, secondValue;\n\n if (!_.isNil(firstItemAttribute)) {\n firstValue = firstItemAttribute[keyObject.key];\n }\n\n if (!_.isNil(secondItemAttribute)) {\n secondValue = secondItemAttribute[keyObject.key];\n }\n\n if ((!_.isNil(firstValue) || !_.isNil(secondValue)) && !_.isEqual(firstValue, secondValue)) {\n result.push(keyObject);\n }\n\n return result;\n }, []);\n };\n })\n .filter(\"dimensionalFilledFilter\", function() {\n return function(keys, isFilledOnly, attribute, firstItem, secondItem) {\n if (!isFilledOnly) {\n return keys;\n }\n\n var firstItemAttribute = firstItem[attribute.name];\n var secondItemAttribute = secondItem[attribute.name];\n // Filter out keys that are not filled\n return _.reduce(keys, function(result, keyObject) {\n\n var firstValue;\n if (!_.isNil(firstItemAttribute)) {\n firstValue = firstItemAttribute[keyObject.key];\n }\n var secondValue;\n if (!_.isNil(secondItemAttribute)) {\n secondValue = secondItemAttribute[keyObject.key];\n }\n\n if (!_.isNil(firstValue) || !_.isNil(secondValue)) {\n result.push(keyObject);\n }\n\n return result;\n }, []);\n };\n });\n","angular.module('llax')\n.controller('ConfirmDialogController', ['$scope', '$modalInstance','$translate', 'header', 'msg', 'notification', 'options',\n function ($scope, $modalInstance, $translate, header, msg, notification,options) {\n\n $scope.header = (header !== undefined) ? header : $translate.instant('MODAL.CONFIRM_HEADER');\n $scope.variables = _.get(options,'variables') || {};\n $scope.msg = (msg !== undefined) ? msg : $translate.instant('MODAL.CONFIRM_REQUIRED', $scope.variables);\n $scope.notification = notification;\n\n $scope.no = function() {\n $modalInstance.dismiss('no');\n };\n\n $scope.yes = function() {\n $modalInstance.close('yes');\n };\n }\n ]);\n","angular.module('llax')\n.controller('ConfirmationController', ['$scope', '$routeParams', 'ConfirmResource', '$location', '$route', '$timeout' ,\n function($scope, $routeParams, ConfirmResource, $location, $route, $timeout) {\n\n ConfirmResource.save({\n key: $routeParams.key,\n opaque: $routeParams.opaque\n }).$promise.then(function() {\n $scope.confirmedSuccessfully = true;\n\n $timeout(function() {\n $location.path('/login').replace();\n $route.reload();\n }, 4000);\n\n }, function(response) {\n //error Response\n $scope.errorInConfirmation = true;\n $scope.status = response.status;\n });\n\n }\n ]);\n","angular.module('llax')\n .controller('ContactsController',\n function($controller, $location, $modal, $rootScope, $route, $routeParams, $scope, $timeout, $translate, $window, growl,\n Auth, CommunityResource, ContactsResourceByCursor, MultiMap, OrganizationsResource, OrganizationService, PublicationResource, TabContainer, HttpHeader) {\n\n var lastRoute = $route.current;\n\n $scope.$on('$locationChangeSuccess', function(event) {\n if ($route.current.$$route && $route.current.$$route.templateUrl.indexOf('/contacts') > 0) {\n $route.current = lastRoute;\n }\n });\n\n $scope.chooseCommunity = function(community) {\n $scope.communityId = community.id;\n $scope.searchOrganizations($scope.searchQuery);\n };\n\n $scope.searchOrganizations = function(keyword) {\n OrganizationsResource.query({\n keyword: keyword,\n communityId: $scope.communityId\n },\n function(organizationsResponse) {\n $scope.organizations = organizationsResponse;\n },\n function(response) {\n $scope.status = response.status;\n }\n );\n };\n\n $scope.communities = [];\n\n function loadCommunities(callback) {\n CommunityResource.query(function(response) {\n $scope.communities = response.filter(function(community) {\n return community.name !== \"__DEFAULT_COMMUNITY__\";\n });\n if ($scope.communities.length > 0) {\n $scope.currentCommunity = $scope.communities[0];\n }\n if (callback) {\n callback($scope.communities);\n }\n });\n }\n\n function selectCommunity() {\n if ($scope.communities.length >= 1) {\n $scope.communityId = $scope.communities[0].id;\n }\n }\n\n function onTabActivate(tab) {\n $scope.currentSubUrl = tab.suburl;\n\n if (tab.suburl === 'partners') {\n $rootScope.reloadContacts();\n } else if (tab.suburl === 'community') {\n $scope.organizations = null;\n loadCommunities(function() {\n selectCommunity();\n $scope.searchOrganizations($scope.searchQuery);\n });\n } else if (tab.suburl === 'search') {\n $scope.communityId = null;\n $scope.searchOrganizations($scope.searchQuery);\n }\n }\n\n function initTabs(hasCommunityPanel) {\n var tabContainer = new TabContainer($scope, $location, [{\n title: $translate.instant('BUSINESS_PARTNER'),\n suburl: 'partners',\n template: 'tpl/my-contacts.tpl.html'\n }, {\n title: $translate.instant('COMMUNITIES'),\n suburl: 'community',\n template: 'tpl/search-organisations.tpl.html',\n isVisible: function() {\n return hasCommunityPanel;\n }\n }, {\n title: $translate.instant('INVITATIONS'),\n suburl: 'invitations',\n template: $rootScope.getRoleSpecificTemplate('tpl/invitations.tpl.html')\n }, {\n title: $translate.instant('SEARCH_BUSINESSES'),\n suburl: 'search',\n template: 'tpl/search-organisations.tpl.html'\n }],\n 'partners', onTabActivate);\n tabContainer.openSubview($location.hash());\n }\n\n var ExecuteInvitation = function($rootScope, $scope, $modalInstance, ContactsResource, organization, growl) {\n\n $scope.organization = organization;\n $scope.focusOn = true;\n\n // Invitation type is fixed to CONTACT_REQUEST as of now!\n // Requesting membership in a community - either way - is not yet fully defined!\n var invitationType = 'CONTACT_REQUEST';\n\n $scope.invitation = {\n organizationId: organization.id,\n invitationType: invitationType\n };\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.invite = function(organization) {\n ContactsResource.invite($scope.invitation,\n function(invitationResponse) {\n growl.success(\"INVITATION_SUCCESSFULLY_SENT\");\n $scope.$broadcast('contactDataChanged');\n });\n $modalInstance.close();\n };\n\n };\n\n $scope.inviteByEmail = function() {\n $modal.open({\n templateUrl: 'tpl/send-email-invitation.tpl.html',\n controller: 'ExecuteEmailInvitationController',\n backdrop: true,\n resolve: {\n data: null\n }\n });\n };\n\n $scope.invite = function(organization) {\n $modal.open({\n templateUrl: 'tpl/send-invitation.tpl.html',\n controller: ExecuteInvitation,\n backdrop: true,\n windowClass: 'publish-modal',\n scope: $scope,\n resolve: {\n organization: function() {\n return organization;\n }\n }\n });\n\n };\n\n // my contacts\n $controller('PublicationTasksController', {\n $scope: $scope,\n PublicationResource: PublicationResource\n });\n\n function groupByLetter(contacts) {\n var result = [];\n\n //create Map with First letter pointing to List of contacts:\n var multiMap = new MultiMap();\n for (var i = 0; i < contacts.length; i++) {\n var contact = contacts[i];\n if (!contact.deleted && !_.isNil(contact.name)) {\n var firstLetter = contact.name.toUpperCase().substring(0, 1);\n multiMap.add(firstLetter, contact);\n }\n }\n\n var keySet = multiMap.keySet();\n for (var j = 0; j < keySet.length; j++) {\n var entry = multiMap.get(keySet[j]);\n result.push({\n letter: keySet[j],\n contacts: entry\n });\n }\n\n return result;\n }\n\n // Function to load more contacts when scrolling to the bottom\n function loadMoreContacts() {\n if ($window.innerHeight + $window.scrollY >= document.body.offsetHeight) {\n // User has scrolled to the bottom, load more contacts\n $rootScope.loadContacts();\n }\n }\n\n // Attach scroll event listener to window\n angular.element($window).on('scroll', loadMoreContacts);\n\n // Clean up event listener when scope is destroyed\n $scope.$on('$destroy', function() {\n angular.element($window).off('scroll', loadMoreContacts);\n });\n\n $scope.contacts = null;\n $scope.groupedContacts = null;\n $rootScope.loadingContacts = false; // Flag to indicate if contacts are being loaded\n $rootScope.hasNextPage = true; // Flag to indicate if there's a next page\n\n var regex = /\"[^\"]*\"|[^:#@.,*#!$%&\\/(){}\\[\\]\\s]+/g;\n\n var splitKeywords = function(searchKeyword) {\n if (_.isNil(searchKeyword)) {\n return searchKeyword;\n }\n var matches = searchKeyword.match(regex);\n if (matches) {\n return matches.map(function(item) {\n // Remove surrounding double quotes if present\n item = item.replace(/\"/g, '');\n // Check if the item contains an apostrophe\n if (item.includes(\"'\")) {\n return item;\n }\n return item;\n });\n } else {\n return searchKeyword;\n }\n };\n\n $rootScope.loadContacts = function(searchKeyword, reloadAllContacts) {\n var pageSize = Math.floor($window.innerHeight / 40);\n if (!$rootScope.loadingContacts && $rootScope.hasNextPage) {\n $rootScope.loadingContacts = true;\n return ContactsResourceByCursor.createCursorAwareResource($scope.cursor).query({\n limit: pageSize,\n keywords: splitKeywords(searchKeyword),\n sortby: 'name'\n }, function(response, headers) {\n $scope.cursor = headers(HttpHeader.CURSOR);\n $rootScope.hasNextPage = !!$scope.cursor;\n var contacts = _.reject(response, function(contact) {\n return contact.state !== 'ESTABLISHED';\n });\n\n if ($scope.contacts && !reloadAllContacts) {\n $scope.contacts = $scope.contacts.concat(contacts);\n } else {\n $scope.contacts = contacts;\n }\n $scope.groupedContacts = groupByLetter($scope.contacts);\n $rootScope.contactsLoaded = true;\n $rootScope.contactsMap = _.keyBy(contacts, 'id');\n $rootScope.loadingContacts = false;\n }, function(error) {\n $rootScope.loadingContacts = false;\n console.error(\"Error while loading contacts: \", error.message);\n });\n }\n };\n\n $rootScope.reloadContacts = function(searchKeyword) {\n if(_.isEmpty(searchKeyword)) {\n searchKeyword = null ;\n }\n $rootScope.loadingContacts = false;\n $rootScope.hasNextPage = true;\n $scope.contacts = null;\n $scope.groupedContacts = null;\n $scope.cursor = undefined;\n $rootScope.loadContacts(searchKeyword, true);\n };\n\n $scope.debouncedSearch = _.debounce(function(keywords) {\n $rootScope.reloadContacts(keywords);\n $scope.$apply();\n }, 300);\n\n $rootScope.searchContacts = function(searchKeyword) {\n $scope.debouncedSearch(searchKeyword);\n };\n\n $scope.hasCreatePermisson = Auth.hasAnyPermission(Auth.OBJECT_TYPE_CONTACT, 'create');\n\n $scope.hasEditPermisson = function(_contact) {\n var context = { contactRole : _contact.contactRole, customValues : _contact.customValues };\n return Auth.hasContactPermission('update', context);\n };\n\n $scope.hasDeletePermisson = function(_contact) {\n var context = { contactRole : _contact.contactRole, customValues : _contact.customValues };\n return Auth.hasContactPermission('delete', context);\n };\n\n $scope.hasLoginPermission = function(_contact) {\n var context = { contactRole : _contact.contactRole, customValues : _contact.customValues };\n return Auth.hasContactPermission('login', context);\n };\n\n $scope.createContact = function() {\n var addContactModal = $modal.open({\n templateUrl: 'tpl/contact-editor.tpl.html',\n controller: 'EditContactController',\n backdrop: true,\n resolve: {\n data: function() {\n return {\n contact: {}\n };\n }\n }\n });\n };\n\n $scope.deleteContact = function(organization) {\n var modalInstance = $modal.open({\n templateUrl: 'tpl/confirm-delete-contact-modal.tpl.html',\n controller: 'ModalInstanceCtrl',\n backdrop: true,\n resolve: {\n data: function() {\n return {\n organization: organization\n };\n }\n }\n });\n };\n\n $scope.$on('deleteContact', function(scope, organizationId) {\n ContactsResource.delete({\n organizationId: organizationId\n },\n function(deletionResponse) {\n growl.success(\"CONTACT_SUCCESSFULLY_DELETED\");\n $rootScope.reloadContacts();\n }, function(error) {\n if (error.data && error.data.message) {\n growl.error(error.data.message, { variables: error.data.parameters });\n }\n });\n });\n\n $scope.$on('updateContact', function() {\n $rootScope.reloadContacts();\n });\n\n $scope.canLoginAsManagingUser = function(contact) {\n\n // Current organization must be a \"managing\" organization\n if (!$rootScope.organization.communityManager) {\n return false;\n }\n\n // Current user must not be a \"legacy\" user\n if ($rootScope.user.legacyAccount) {\n return false;\n }\n\n // Contact must be an invited buyer or supplier on this platform\n if (_.isNil(contact.organizationId) || (contact.invitationType !== 'INVITED_BUYER' && contact.invitationType !== 'INVITED_SUPPLIER')) {\n return false;\n }\n\n // FIXME: Check if appropriate billing feature exists!\n\n return true;\n };\n\n $scope.loginAsManagingUser = function(contact) {\n\n var organizationId = contact.organizationId;\n var url = new URL(lax_rest_url_complete('contacts/managingUserLogin') + \"/\" + organizationId);\n\n growl.info('CONTACTS.LOGIN_AS_MANAGING_USER', {\n variables: { organizationName: contact.name },\n ttl: -1\n });\n\n $timeout(function() {\n $window.open(url.toString(), '_self');\n }, 2000);\n\n };\n\n $scope.existingPublicationsMap = {};\n\n $scope.loadExistingPublication = function(recipientId) {\n $scope.existingPublicationsMap[recipientId] = PublicationResource.query({\n recipient: recipientId\n });\n };\n\n $scope.toggleShowDetails = function(recipient) {\n if (_.isNil(recipient.organizationId)) {\n return;\n }\n recipient.showDetails = !recipient.showDetails;\n if (recipient.showDetails) {\n $scope.loadExistingPublication(recipient.organizationId);\n }\n };\n\n $scope.editContact = function(contact) {\n var editContactModal = $modal.open({\n templateUrl: 'tpl/contact-editor.tpl.html',\n controller: 'EditContactController',\n backdrop: true,\n resolve: {\n data: function() {\n return {\n contact: contact\n };\n }\n }\n });\n };\n\n $scope.organizationImageUrl = function(id) {\n return lax_rest_url(\"organizations/\" + id + \"/image\");\n };\n\n if ($routeParams.q) {\n $scope.searchQuery = $routeParams.q;\n }\n\n loadCommunities(function() {\n OrganizationService.$organization.subscribe(function(organization) {\n $scope.organizationData = organization;\n if (!_.isNil($scope.organizationData)) {\n var hasCommunityPanel = !_.isEmpty($scope.communities) && $scope.organizationData.organizationRole === 'COMMUNITY_MANAGER';\n initTabs(hasCommunityPanel);\n }\n });\n });\n\n }\n );\n","angular.module('llax')\n .controller('ExecuteEmailInvitationController',\n function($rootScope, $scope, $modalInstance, $translate, InviteByEmailResource, ContactsResource, growl, data) {\n\n $scope.invitationTypes = [\"INVITED_BUYER\", \"INVITED_SUPPLIER\", \"INVITED_COMMUNITY_MEMBER\"];\n $scope.focusOn = true;\n\n if (_.isUndefined(data)) {\n var invitationType = localStorage.getItem('invitationType') || \"INVITED_SUPPLIER\";\n $scope.invitation = {\n invitationType: invitationType\n };\n } else {\n $scope.invitation = data;\n }\n\n $scope.customAttributes = $rootScope.dataModel.getContactAttributes();\n $rootScope.prepareAttributes($scope.customAttributes);\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.saveInvitation = function(invitation) {\n var invitationType = invitation.invitationType;\n if (!_.isEmpty(invitationType)) {\n localStorage.setItem('invitationType',invitationType);\n }\n InviteByEmailResource.save(invitation,\n function(invitationResponse) {\n growl.success(\"INVITATION_SUCCESSFULLY_SENT\");\n $scope.invitationId = invitationResponse.id;\n });\n $modalInstance.close();\n };\n\n $scope.saveContactRequest = function(contactRequest) {\n var contactData = {\n id: contactRequest.id,\n customValues: contactRequest.customValues,\n organizationId: contactRequest.organizationId\n };\n ContactsResource.save(contactData,\n function(contactRequestResponse) {\n growl.success(\"INVITATION_SUCCESSFULLY_SENT\");\n $scope.invitationId = contactRequestResponse.id;\n });\n $modalInstance.close();\n };\n });\n","angular.module('llax')\n .controller('CreateTaskController',\n function($rootScope, $scope, $translate, $routeParams, $dialogs, growl, $modalInstance, TaskResource, TaskListsResource, data) {\n $scope.focusOn = true;\n $scope.attachment = undefined;\n $scope.filesSelected = false;\n $scope.fileUploadSettings = {\n showInlinepreviewInDropzone : true\n };\n\n $scope.editorOptions = {\n basic: {\n height: '5em',\n removePlugins: 'elementspath',\n toolbar: [{\n name: 'basicstyles',\n items: ['Bold', 'Italic']\n }, {\n name: 'paragraph',\n items: ['BulletedList', 'NumberedList']\n }, {\n name: 'links',\n items: ['Link', 'Unlink']\n }]\n }\n };\n\n function initTask() {\n var taskTags = $rootScope.dataModel.getTaskTags();\n $scope.taskTags = taskTags;\n var task = {};\n if (data.taskListId) {\n task.taskListId = parseInt(data.taskListId, 10);\n } else if ($routeParams.taskListId) {\n task.taskListId = parseInt($routeParams.taskListId, 10);\n }\n if (data.items) {\n task.items = data.items;\n }\n if (data.selectionId) {\n task.selectionId = data.selectionId;\n delete task.items;\n }\n return task;\n }\n\n function loadTaskLists() {\n if (_.isEmpty(data.taskLists)) {\n return TaskListsResource.query({});\n } else {\n return data.taskLists;\n }\n }\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.setAssignee = function(user) {\n $scope.task.assignee = user.userId;\n };\n\n $scope.saveTask = function(task) {\n if (!task.title) {\n growl.warning(\"TASK.MISSING_TASK_TITLE\");\n } else {\n var pathParams = {\n taskId: task.id\n };\n\n TaskResource.save(pathParams, task, function(response) {\n var newTask = response;\n var hasAttachment = !_.isUndefined($scope.attachment);\n if ($rootScope.userId == task.assignee) {\n $rootScope.$broadcast('selfTaskCreated', newTask);\n }\n if (!$scope.filesSelected) {\n if (hasAttachment) {\n var attachment = $scope.attachment;\n var pathParams = {\n taskId: newTask.id\n };\n var comment = {\n assets: attachment,\n author: newTask.author,\n text: \"\",\n taskId: newTask.id\n };\n\n TaskResource.saveComment(pathParams, comment, function(response) {\n $scope.errorMessage = undefined;\n });\n }\n $modalInstance.close(newTask);\n growl.success(\"TASK.ADD_TASK_SUCCESS_MESSAGE\");\n } else {\n var message = $translate.instant('NOTIFY.FILES_STILL_NOT_UPLOADED');\n $dialogs.notify(\"\", message);\n }\n });\n }\n };\n\n $scope.$on('filesSelected', function() {\n $scope.filesSelected = true;\n });\n\n $scope.uploadFileForItem = function(attributeName) {\n return {\n url: lax_rest_url('assets'),\n uploadComplete: function(response) {\n $scope.attachment = $scope.attachment || [];\n var assets = [];\n if (_.isObject(response)) { // HTML5 browsers\n assets = response.map(function(asset) {\n var result = {};\n result.url = asset.url;\n result.name = asset.path.substr(1); //remove trailing /\n result.contentType = asset.contentType;\n return result;\n });\n } else if (_.isString(response)) { //IE9\n response = response.substr(6).slice(0, -7);\n var asset = JSON.parse(response);\n asset.name = asset.path.substr(1);\n assets.push(asset);\n }\n $scope.attachment = $scope.attachment.concat(assets);\n $scope.filesSelected = false;\n }\n };\n };\n\n function loadComments(taskId) {\n TaskResource.getComments({\n taskId: taskId\n }, function(response) {\n $scope.task.comments = response;\n });\n }\n\n $scope.saveComment = function(comment, taskId) {\n if (_.isEmpty(comment.text)) {\n growl.warning('TASK.MISSING_TASK_TITLE');\n return false;\n }\n\n if (!$scope.filesSelected) {\n comment.author = $rootScope.user.userId;\n comment.taskId = taskId;\n\n var pathParams = {\n taskId: taskId,\n commentId: comment.id\n };\n\n TaskResource.saveComment(pathParams, comment, function(response) {\n growl.success(\"SAVE_SUCCESS_MESSAGE\");\n loadComments(taskId);\n });\n } else {\n var message = $translate.instant('NOTIFY.FILES_STILL_NOT_UPLOADED');\n $dialogs.notify(\"\", message);\n }\n };\n\n (function init() {\n $scope.taskLists = loadTaskLists();\n $scope.task = initTask();\n })();\n }\n );\n","angular.module('llax')\n .controller('CreateUserController',\n function($modalInstance, $scope, $translate, data, growl, InviteByEmailResource, UserResource) {\n\n function getRoles() {\n RolesService.getAllRoles().then(function(roles) {\n $scope.roles = _.map(roles, function(elem) {\n return {\n id: elem,\n text: elem\n };\n });\n });\n }\n\n function getFilters() {\n UserResource.filters(function(filters) {\n $scope.filters = _.map(filters, function(filter) {\n return {\n name: filter.name,\n label: filter.label || filter.name\n };\n });\n $scope.filters.unshift({\n name: '',\n label: $translate.instant('MAKE_SELECTION')\n });\n });\n }\n\n $scope.inviteByEmail = function(userAccount) {\n\n var invitation = {\n invitationType: \"INVITED_COLLEAGUE\",\n invitedEmailAddress: userAccount.invitationEmail,\n roles: userAccount.roles,\n restrictionFilter: userAccount.restrictionFilter,\n restrictionQuery: userAccount.restrictionQuery\n };\n\n InviteByEmailResource.save(invitation, function() {\n growl.success(\"USER_MANAGEMENT.INVITATION_SENT\");\n $scope.newAccount = {};\n $modalInstance.close(null);\n });\n };\n\n $scope.cancel = function() {\n $modalInstance.close(null);\n };\n\n (function init() {\n $scope.newAccount = {};\n\n if (_.isArray(data.allRoles)) {\n $scope.roles = data.allRoles;\n } else {\n getRoles();\n }\n if (_.isArray(data.filters)) {\n $scope.filters = data.filters;\n } else {\n getFilters();\n }\n })();\n });\n","angular.module('llax')\n .controller('DashboardController',\n function($dialogs, $location, $modal, $rootScope, $scope, $translate, $window,\n ValidationsOverviewFactory,WarningsOverviewFactory, growl,\n RubyOutputDashletFactory, LatestItemsDashletFactory, DashletRegistry, CustomDashletRegistry,\n CategoriesOverviewFactory, CategoriesListFactory, InputTemplatesService, DashboardResource,\n DocumentationDashletFactory, NewsDashletFactory, ComplianceStatisticsFactory, DashboardService, $timeout, MyTasksFactory,\n PublicationsByDestinationsFactory, ReviewErrorsOverviewFactory, ReviewsFactory, ReviewWarningsOverviewFactory) {\n\n $rootScope.loadDataModel();\n DashboardService.loadSettings({}, function(res) {\n InputTemplatesService.loadTemplates(initDashlets);\n });\n\n function initDashlets(hasSettingsChanged) {\n\n CustomDashletRegistry.load();\n\n DashletRegistry.addAll([{\n name: 'tasks',\n imageUrl: 'images/dashlets/my-tasks-overview.png',\n title: 'LABEL.MY_TASKS',\n description: $translate.instant('DESCRIPTION.MY_TASKS'),\n directive: 'wt-my-tasks',\n dataModelType: MyTasksFactory.create({\n user: $rootScope.user\n })\n },{\n name: 'publicationsByDestination',\n imageUrl: 'images/dashlets/publications-overview.png',\n title: 'WIDGET.PUBLICATIONS.TITLE',\n description: 'WIDGET.PUBLICATIONS.DESCRIPTION',\n directive: 'grid-widget',\n dataModelType: PublicationsByDestinationsFactory.create({\n user: $rootScope.user\n }),\n size: {\n width: '50%',\n height: '280px'\n },\n }, {\n name: 'reviews',\n imageUrl: 'images/dashlets/reviews-overview.png',\n title: 'WIDGET.REVIEWS.TITLE',\n description: 'WIDGET.REVIEWS.DESCRIPTION',\n directive: 'grid-widget',\n dataModelType: ReviewsFactory.create({\n user: $rootScope.user\n }),\n size: {\n width: '100%',\n height: '280px'\n },\n }, {\n name: 'complianceStatistics',\n imageUrl: \"images/dashlets/compliance-overview.png\",\n title: 'WIDGET.COMPLIANCESTATISTICS',\n description: \"WIDGET.COMPLIANCESTATISTICS.DESCRIPTION\",\n directive: 'wt-compliance-statistics',\n dataAttrName: 'value',\n dataModelType: ComplianceStatisticsFactory.create({\n statisticName: '__compliance_statistic'\n }),\n size: {\n width: '100%',\n height: '475px'\n },\n settingsModalOptions: {\n templateUrl: 'tpl/dashlets/widget-settings.tpl.html',\n controller: 'WidgetSpecificSettingsCtrl',\n backdrop: false\n }\n }, {\n name: 'validationsOverview',\n imageUrl: \"images/dashlets/validations-overview.png\",\n title: \"WIDGET.VALIDATIONSOVERVIEW\",\n description: \"WIDGET.VALIDATIONSOVERVIEW.DESCRIPTION\",\n directive: 'wt-generic-list-view',\n dataAttrName: 'value',\n dataModelType: ValidationsOverviewFactory.create({\n statisticName: '__validation_overview'\n }),\n size: {\n width: '50%',\n height: '280px'\n },\n settingsModalOptions: {\n templateUrl: 'tpl/dashlets/widget-settings.tpl.html',\n controller: 'WidgetSpecificSettingsCtrl',\n backdrop: false\n }\n }, {\n name: 'warningsOverview',\n imageUrl: \"images/dashlets/warnings-overview.png\",\n title: 'WIDGET.WARNINGSOVERVIEW',\n description: \"WIDGET.WARNINGSOVERVIEW.DESCRIPTION\",\n directive: 'wt-generic-list-view',\n dataAttrName: 'value',\n dataModelType: WarningsOverviewFactory.create({\n statisticName: '__validation_warnings'\n }),\n size: {\n width: '50%',\n height: '280px'\n },\n settingsModalOptions: {\n templateUrl: 'tpl/dashlets/widget-settings.tpl.html',\n controller: 'WidgetSpecificSettingsCtrl',\n backdrop: false\n }\n }, {\n name: 'reviewErrorsOverview',\n imageUrl: \"images/dashlets/validations-overview.png\",\n title: 'WIDGET.REVIEWERRORSOVERVIEW',\n description: \"WIDGET.REVIEWERRORSOVERVIEW.DESCRIPTION\",\n directive: 'wt-generic-list-view',\n dataAttrName: 'value',\n dataModelType: ReviewErrorsOverviewFactory.create({\n statisticName: '__review_errors'\n }),\n size: {\n width: '50%',\n height: '280px'\n },\n settingsModalOptions: {\n templateUrl: 'tpl/dashlets/widget-settings.tpl.html',\n controller: 'WidgetSpecificSettingsCtrl',\n backdrop: false\n }\n }, {\n name: 'reviewWarningsOverview',\n imageUrl: \"images/dashlets/warnings-overview.png\",\n title: 'WIDGET.REVIEWWARNINGSOVERVIEW',\n description: \"WIDGET.REVIEWWARNINGSOVERVIEW.DESCRIPTION\",\n directive: 'wt-generic-list-view',\n dataAttrName: 'value',\n dataModelType: ReviewWarningsOverviewFactory.create({\n statisticName: '__review_warnings'\n }),\n size: {\n width: '50%',\n height: '280px'\n },\n settingsModalOptions: {\n templateUrl: 'tpl/dashlets/widget-settings.tpl.html',\n controller: 'WidgetSpecificSettingsCtrl',\n backdrop: false\n }\n }, {\n name: 'categoriesOverview',\n imageUrl: \"images/dashlets/categories-overview.png\",\n title: 'WIDGET.CATEGORIESOVERVIEW',\n description: \"WIDGET.CATEGORIESOVERVIEW.DESCRIPTION\",\n directive: 'wt-pie-chart',\n dataAttrName: 'value',\n dataModelType: CategoriesOverviewFactory.create(),\n size: {\n width: '100%',\n height: '320px'\n }\n }, {\n name: 'categoriesList',\n imageUrl: \"images/dashlets/categories-list.png\",\n title: 'WIDGET.CATEGORIESLIST',\n description: \"WIDGET.CATEGORIESLIST.DESCRIPTION\",\n directive: 'wt-generic-list-view',\n dataAttrName: 'value',\n dataModelType: CategoriesListFactory.create(),\n size: {\n width: '100%',\n height: '320px'\n },\n settingsModalOptions: {\n templateUrl: 'tpl/dashlets/widget-settings.tpl.html',\n controller: 'WidgetSpecificSettingsCtrl',\n backdrop: false\n }\n }, {\n name: 'latestItemsWidget',\n title: 'WIDGET.LASTITEMS',\n imageUrl: \"images/dashlets/latest-items.png\",\n description: \"WIDGET.LASTITEMS.DESCRIPTION\",\n directive: 'wt-latest-items',\n size: {\n width: '50%',\n height: '280px'\n },\n dataAttrName: 'value',\n dataModelType: LatestItemsDashletFactory.create(),\n settingsModalOptions: {\n templateUrl: 'tpl/dashlets/widget-settings.tpl.html',\n controller: 'WidgetSpecificSettingsCtrl',\n backdrop: false\n }\n }, {\n name: 'news',\n imageUrl: \"images/dashlets/news.png\",\n title: 'WIDGET.NEWS.WIDGETTITLE',\n attrs: {\n selectedUrl: $rootScope.translate(\"DASHLET.NEWS.URL.0\"),\n selectedIndex:0\n },\n description: \"WIDGET.NEWS.DESCRIPTION\",\n directive: 'wt-news',\n dataAttrName: 'value',\n dataModelType: NewsDashletFactory,\n size: {\n width: '50%',\n height: '280px'\n },\n controller: 'WidgetSpecificSettingsCtrl',\n settingsModalOptions: {\n templateUrl: 'tpl/dashlets/news-widget-settings.tpl.html',\n controller: 'WidgetSpecificSettingsCtrl',\n backdrop: false\n }\n }, {\n name: 'whatsNext',\n imageUrl: \"images/dashlets/whats-next.png\",\n title: 'WIDGET.DOCUMENTATION.TITLE',\n description: \"WIDGET.DOCUMENTATION.DESCRIPTION\",\n directive: 'wt-documentation',\n dataAttrName: 'value',\n dataModelType: DocumentationDashletFactory,\n size: {\n width: '100%',\n height: '280px'\n },\n settingsModalOptions: {\n templateUrl: 'tpl/dashlets/widget-settings.tpl.html',\n controller: 'WidgetSpecificSettingsCtrl',\n backdrop: false\n }\n }, {\n name: 'rubyOutputWidget',\n title: 'WIDGET.RUBYOUTPUT',\n imageUrl: \"images/dashlets/ruby-widget.png\",\n directive: 'wt-ruby-output',\n description: \"WIDGET.RUBYOUTPUT.DESCRIPTION\",\n size: {\n width: '50%',\n height: '280px'\n },\n dataAttrName: 'value',\n localOnly: true,\n dataModelType: RubyOutputDashletFactory,\n settingsModalOptions: {\n templateUrl: 'tpl/dashlets/ruby-widget-settings.tpl.html',\n controller: 'WidgetSpecificSettingsCtrl',\n backdrop: false\n }\n }]);\n\n var defaultDashlets = _.invoke(CustomDashletRegistry,'getDefaultDashlets');\n if (!_.isNil(defaultDashlets) && DashletRegistry.getDefaultDashlets().length === 0) {\n DashletRegistry.addToDefaultDashlets(defaultDashlets);\n }\n\n if (DashletRegistry.getDefaultDashlets().length === 0) {\n DashletRegistry.addToDefaultDashlets([{\n name: 'complianceStatistics'\n }, {\n name: 'validationsOverview'\n }, {\n name: 'warningsOverview'\n }, {\n name: 'whatsNext'\n }\n ]);\n }\n if (hasSettingsChanged && $scope.dashboardOptions.storage) {\n var storage = $scope.dashboardOptions.storage[$scope.dashboardOptions.storageId];\n try {\n storage = JSON.parse(storage);\n } catch(e) {\n storage = null;\n }\n if (storage && _.isArray(storage.widgets)) {\n var dashlets = DashletRegistry.getDashlets();\n var hasChanges;\n _.forEach(storage.widgets, function(widget) {\n var widgetDefinition = _.find(dashlets, {name: widget.name});\n $scope.dashboardOptions.addWidget(widgetDefinition);\n for(var key in widget) {\n if (widgetDefinition.hasOwnProperty(key) && widget[key] != widgetDefinition[key]) {\n widget[key] = widgetDefinition[key];\n hasChanges = true;\n }\n }\n });\n if (hasChanges) {\n $scope.dashboardOptions.storage.setItem( $scope.dashboardOptions.storageId, JSON.stringify(storage) );\n }\n }\n $scope.dashboardOptions = null;\n $timeout(function() {\n setDashboardOptions();\n });\n } else {\n setDashboardOptions();\n }\n }\n\n function setDashboardOptions() {\n\n var customStorage = {\n getItem: function (key) {\n return $window.localStorage.getItem(key);\n },\n\n setItem: function (key, value) {\n $window.localStorage.setItem(key, value);\n\n var widgetsParsed = JSON.parse(value);\n var updatedWidgets = widgetsParsed.widgets;\n updatedWidgets.push({ 'dashboardConfigurationsMigrated': true });\n saveDashboardConfig(updatedWidgets);\n },\n\n removeItem: function (key) {\n $window.localStorage.removeItem(key);\n }\n };\n\n $scope.dashboardOptions = {\n widgetButtons: false,\n hideToolbar: true,\n widgetDefinitions: DashletRegistry.getDashlets(),\n defaultWidgets: DashletRegistry.getDefaultDashlets(),\n storage: customStorage,\n storageId: $rootScope.user.userId,\n hideWidgetName: true\n };\n\n DashboardResource.get({}, function (response) {\n\n $scope.dashboardConfiguration = response;\n var dashboardMigration = false;\n if (!_.isEmpty($scope.dashboardConfiguration)) {\n var migratedObject = $scope.dashboardConfiguration[$scope.dashboardConfiguration.length - 1];\n dashboardMigration = migratedObject.dashboardConfigurationsMigrated;\n }\n\n if (!_.isEmpty($scope.dashboardConfiguration) && dashboardMigration === true) {\n var widgetsFromServer = $scope.dashboardConfiguration.slice(0, $scope.dashboardConfiguration.length - 1);\n if($scope.dashboardOptions.loadWidgets){\n $scope.dashboardOptions.loadWidgets(widgetsFromServer);\n }\n } else {\n var localStorageDashboardConfig = $window.localStorage.getItem($scope.dashboardOptions.storageId);\n var parsedLocalStorageDashboardConfig = JSON.parse(localStorageDashboardConfig);\n if(parsedLocalStorageDashboardConfig){\n var widgets = parsedLocalStorageDashboardConfig.widgets;\n\n widgets.push({ 'dashboardConfigurationsMigrated': true });\n saveDashboardConfig(widgets);\n }\n\n }\n }, function (error) {\n growl.error(\"DASHBOARD_ERROR\");\n });\n\n }\n\n function saveDashboardConfig(dashboardConfig) {\n DashboardResource.save(dashboardConfig);\n }\n\n $scope.manageDashboardsModels = function() {\n var modal = $modal.open({\n templateUrl: 'tpl/manage-dashboards.tpl.html',\n controller: 'ManageDashBoardsController',\n windowClass: 'manage-dashboards-modal',\n scope: $scope\n });\n\n modal.result['finally'](function() {\n $location.url($location.path());\n });\n };\n\n $scope.openDashboardSettings = function() {\n var attributes = $rootScope.dataModel.getDashboardAttributes();\n $rootScope.prepareAttributes(attributes);\n var customSettings = DashboardService.getSettings() || {};\n var dashboardSettingsModal = $modal.open({\n templateUrl: 'tpl/dashboard-settings.tpl.html',\n controller: 'DashboardSettingsController',\n backdrop: true,\n resolve: {\n data: function() {\n return {\n attributes: attributes,\n customSettings: customSettings\n };\n }\n }\n });\n dashboardSettingsModal.result.then(function(result) {\n if (result) {\n initDashlets(true);\n }\n }, function() {\n\n }).finally(function() {\n $location.url($location.path());\n });\n };\n\n openModels($location.search());\n\n $scope.$on('$routeUpdate', function(scope, route) {\n openModels(route.params);\n });\n\n function openModels(params) {\n if (params.mode == 'add') {\n $scope.manageDashboardsModels();\n } else if (params.mode == 'settings') {\n $scope.openDashboardSettings();\n }\n }\n\n $scope.resetDashboard = function() {\n var confirmDialog = $dialogs.confirm('DASHBOARD.RESTORE_DEFAULTS', 'DASHBOARD.CONFIRM_RESTORE_PARAGRAPH');\n confirmDialog.result.then(function() {\n $scope.dashboardOptions\n .storage\n .removeItem($scope.dashboardOptions.storageId);\n\n DashboardResource.save([], function() {\n $window.location.reload();\n });\n });\n };\n }\n);\n//Generic controller for Widgets that have a dedicated Settings Dialog\n// Settings are stored in widget.attrs\nangular.module('llax')\n .controller('WidgetSpecificSettingsCtrl', ['$rootScope', '$scope', '$modalInstance', 'widget',\n function($rootScope, $scope, $modalInstance, widget) {\n // add widget to scope\n $scope.widget = widget;\n\n // set up result object\n $scope.result = jQuery.extend(true, {}, widget);\n\n $scope.ok = function() {\n $modalInstance.close($scope.result);\n };\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.getUrlIndexByTitle = function(settings,title){\n for (i = 0; i < settings.length; i++){\n if (settings[i].title == title){\n return i;\n }\n }\n };\n\n $scope.updateUrl = function(index){\n $scope.result.attrs.selectedUrl = $rootScope.translate(\"DASHLET.NEWS.URL.\"+index,\"\");\n $scope.result.attrs.selectedIndex = index;\n };\n\n $scope.getNewsOptions = function(){\n return $scope.getOptions(\"NEWS\", [\"title\", \"url\"]);\n };\n\n // awaits string array of key to search for\n //searchs for dashlet settings in translation properties\n $scope.getOptions = function(name, keys) {\n var tempOptions = {};\n var options = [];\n for (var i = 0; ($rootScope.translate(\"DASHLET.\" + name + \".\" + _.toUpper(keys[0]) + \".\" + i, \"\")) != \"\"; i++) {\n for (var j = 0; j < keys.length; j++) {\n var key = keys[j];\n tempOptions[key] = $rootScope.translate(\"DASHLET.\" + name + \".\" + _.toUpper(key) + \".\" + i);\n }\n options.push(tempOptions);\n tempOptions = {};\n }\n return options;\n };\n\n }\n ]);\n\nangular.module('llax')\n .controller('ManageDashBoardsController', ['$rootScope', '$scope', '$modalInstance', 'DashletRegistry',\n function($rootScope, $scope, $modalInstance, DashletRegistry) {\n $scope.widgetDefinitions = DashletRegistry.getDashlets();\n $scope.getWidgetCount = function (widgetName) {\n var count = 0;\n if (widgetScope.$parent) {\n count = _.countBy(widgetScope.$parent.widgets, function (w) {\n return w.name == widgetName;\n }).true;\n }\n\n return count ? count : 0;\n };\n $scope.close = function() {\n $modalInstance.close();\n };\n }\n ])\n .controller('DashboardSettingsController', ['$rootScope', '$scope', '$modalInstance','$window', 'data','DashboardService',\n function($rootScope, $scope, $modalInstance, $window, data, DashboardService) {\n $scope.userAttributes = data.attributes;\n $scope.customSettings = Object.assign({},data.customSettings);\n $scope.allCategories = $rootScope.dataModel.allCategories();\n $rootScope.translateAllCategories($scope.allCategories);\n $scope.cancel = function() {\n $modalInstance.close();\n };\n $scope.save = function() {\n DashboardService.saveSettings($scope.customSettings);\n $modalInstance.close($scope.customSettings);\n };\n }\n]);\n","angular.module('llax')\n .controller('DataModelExchangeController', ['$rootScope', '$scope', 'UseDatamodelResource', 'growl', '$modal',\n 'DataModelTemplateResource', 'FeatureToggleService', 'OrganizationService', 'ChannelService',\n function($rootScope, $scope, UseDatamodelResource, growl, $modal,\n DataModelTemplateResource, FeatureToggleService, OrganizationService, ChannelService) {\n\n function downloadModelLink(modelName, downloadFormat) {\n return lax_rest_url('models/') + modelName + '/?downloadFormat=' + downloadFormat;\n }\n\n // FIXME: Get 'name', 'imageUrl' and 'version' for system defined data models from backend!\n $scope.defaultDataModels = [];\n if (FeatureToggleService.checkFeatureEnabled('legacyDataModels')) {\n $scope.defaultDataModels.push({\n id: 'food-regulation-eu1169',\n name: 'MODELEXCHANGE.FOOD_REGULATION_EU',\n imageUrl: '/images/datamodels/data-model-food-regulation-eu1169.jpg',\n ownerName: 'BYRD',\n isSystemDataModel: true\n });\n }\n if (FeatureToggleService.checkFeatureEnabled('legacyDataModels')) {\n $scope.defaultDataModels.push({\n id: 'healthcare',\n name: 'MODELEXCHANGE.HEALTH_CARE',\n imageUrl: '/images/datamodels/data-model-healthcare.jpg',\n ownerName: 'BYRD',\n isSystemDataModel: true\n });\n }\n $scope.defaultDataModels.push({\n id: 'office-supplies',\n name: 'MODELEXCHANGE.OFFICE_SUPPLIES',\n imageUrl: '/images/datamodels/data-model-office-supplies.png',\n ownerName: 'BYRD',\n isSystemDataModel: true,\n version: '1.0'\n });\n $scope.defaultDataModels.push({\n id: 'demomodel',\n name: 'MODELEXCHANGE.DEMOMODEL',\n imageUrl: '/images/datamodels/data-model-demomodel.png',\n ownerName: 'BYRD',\n isSystemDataModel: true,\n version: '1.5.73'\n });\n _.each($scope.defaultDataModels, function(datamodel) {\n datamodel.url = downloadModelLink(datamodel.id, 'zip');\n });\n\n function arrangeDataModels() {\n var activeDatamodel = _.find($scope.dataModels, function(dm) {\n return (!dm.version || (dm.version == $scope.organization.dataModelVersion)) &&\n (dm.name == $scope.organization.dataModelName || dm.id == $scope.organization.dataModelName) &&\n (!dm.owner || dm.owner == $scope.organization.dataModelOwnerId);\n });\n\n if (!_.isEmpty(activeDatamodel)) {\n activeDatamodel.active = true;\n var idx = $scope.dataModels.indexOf(activeDatamodel);\n $scope.dataModels.splice(idx,1);\n $scope.dataModels = _.sortBy($scope.dataModels, [function(o) { return o.name.toLowerCase(); }]);\n $scope.dataModels.unshift(activeDatamodel);\n } else if (!_.isUndefined($scope.organization.dataModelName)) {\n var dummyInfo = {\n name : $scope.organization.dataModelName,\n version : $scope.organization.dataModelVersion || '1.0',\n labels : $scope.organization.dataModelLabels || {},\n ownerEmail : $scope.organization.email || '-',\n ownerName : $scope.organization.name || '-',\n active : true,\n activateable : false\n };\n $scope.dataModels = _.sortBy($scope.dataModels, [function(o) { return o.name.toLowerCase(); }]);\n $scope.dataModels.unshift(dummyInfo);\n }\n _.forEach($scope.dataModels, function(dm) {\n dm.displayName = dm.name || \"\";\n dm.dataModelDeployedAt = $scope.organization.dataModelDeployedAt;\n dm.dataModelDeployedBy = $scope.organization.dataModelDeployedBy;\n dm.htmlId = $scope.translate(dm.name).toLowerCase().replace(/\\s+/g,'-').replace(/\\//g,'');\n if (!_.isEmpty(dm.labels)) {\n var langKey = localStorage.getItem(\"languageKey\");\n dm.displayName = dm.labels[langKey] || dm.labels[''] || dm.name;\n }\n if (dm.version) {\n dm.displayName = $scope.translate(dm.displayName) + ' ' + dm.version;\n }\n });\n }\n\n function loadDataModels() {\n DataModelTemplateResource.query(function(response) {\n\n OrganizationService.$organization.subscribe(function(organization) {\n $scope.organization = angular.copy(organization) || {};\n $scope.organization.dataModelName = $scope.organization.dataModelName || $scope.organization.dataModelClass;\n $scope.dataModels = angular.copy($scope.defaultDataModels.concat(response));\n arrangeDataModels();\n });\n });\n }\n\n loadDataModels();\n\n $scope.manageDataModels = function() {\n var modal = $modal.open({\n templateUrl: 'tpl/manage-datamodels.tpl.html',\n controller: 'ManageDataModelsController',\n windowClass: 'manage-datamodel-modal',\n scope: $scope,\n });\n modal.result.then(function() {\n DataModelTemplateResource.query(function(response) {\n var systemDataModels = angular.copy($scope.defaultDataModels);\n $scope.dataModels = systemDataModels.concat(response);\n arrangeDataModels();\n });\n });\n };\n\n $scope.$on('channelMessageReceived', function(event, eventData) {\n if (eventData.event === ChannelService.DATA_MODEL_ACTIVATEABLE_EVENT) {\n growl.success(\"DATA_MODEL_TEMPLATE_ACTIVATED_SUCCESS\", {\n variables: { templatename: eventData.data.name },\n ttl: 3000\n });\n\n loadDataModels();\n } else if (eventData.event === ChannelService.DATA_MODEL_TEMPLATE_INVALID_EVENT) {\n growl.error(\"DATA_MODEL_TEMPLATE_ACTIVATED_FAILURE\" , {\n variables: { templatename: eventData.data.name, errorMessage: eventData.data.error}\n });\n }\n });\n }\n ]);\n","angular.module('llax')\n .controller('DataModelCustomizationController',\n function($rootScope, $scope, growl, $dialogs, $translate, $modal,\n DataModelCustomizationConstants, HttpStatus, ResetDataModelResource, UploadCustomDataModelResource) {\n\n $scope.focusOn = true;\n $scope.attribute = {};\n var attributeMap = {};\n\n if ($rootScope.isDataModelLoaded) {\n init();\n } else {\n $rootScope.reloadDataModel();\n }\n\n $scope.$on('dataModelLoaded', function() {\n init();\n });\n\n $scope.$on('layoutUpdated', function(scope, layout) {\n $scope.selectedLayout = layout;\n });\n\n $scope.$on('filterUpdated', function(scope, isFiltered) {\n $scope.isFiltered = isFiltered;\n });\n\n function extractNames(items) {\n return _.map(items, \"name\");\n }\n\n function getLayoutList() {\n $scope.layoutsMap = {};\n var layouts = $rootScope.dataModel.getRaw().layouts;\n var layoutList = _.map(layouts, function(value, layoutKey) {\n var sections = angular.copy($rootScope.dataModel.sectionAttributes(layoutKey));\n sections = _.filter(sections, function(section) {\n return (section.attributes && section.attributes.length > 0) || section.model_defined === false;\n });\n $scope.layoutsMap[layoutKey] = sections;\n _.forEach($scope.layoutsMap[layoutKey], function(section) {\n section.type = \"section\";\n section.label = $rootScope.translateSection(section);\n _.forEach(section.attributes, function(attribute) {\n attribute.type = \"attribute\";\n attribute.label = $rootScope.translateAttribute(attribute);\n });\n });\n return layoutKey;\n });\n return layoutList;\n }\n\n function getAttributeList() {\n var allAttributes = $rootScope.dataModel.allAttributes();\n var attributeList = [];\n for (var i = 0; i < allAttributes.length; i++) {\n var attrib = allAttributes[i];\n var hasCategory = $rootScope.dataModel.attributeHasCategory(attrib.name);\n if (attrib.label) {\n attributeList.push({\n name: attrib.name,\n label: $rootScope.translateAttribute(attrib),\n type: \"attribute\",\n has_category: hasCategory,\n params : attrib.params,\n typeName : attrib.typeName,\n baseClass : attrib.baseClass\n\n });\n }\n attributeMap[attrib.name] = attrib;\n }\n return attributeList;\n }\n\n function getCategoryList() {\n var allCategories = $rootScope.dataModel.allCategories(true);\n var categoryList = [];\n _.forEach(allCategories, function(category) {\n categoryList.push({\n name: category.name,\n label: $rootScope.translateCategory(category),\n parent: category.parent,\n type: \"category\",\n attribute_status: category.attribute_status,\n modification_status: category.modification_status,\n attributes: _.forEach($scope.dataModel.categoryAttributes(category.name), function(attribute) {\n attribute.type = \"attribute\";\n attribute.label = $rootScope.translateAttribute(attribute);\n })\n });\n });\n return categoryList;\n }\n\n $scope.selectLayout = function(layout) {\n $scope.currentLayout = $scope.layoutsMap[layout];\n $rootScope.$broadcast('layoutUpdated', layout);\n if ($scope.isFiltered) {\n $scope.toggleAlreadyAssigned($scope.isFiltered);\n }\n };\n\n function getOrCreateLayout(layoutId, action) {\n var diff = $scope.customizedDatamodelDiff;\n diff.layouts = diff.layouts || [];\n var layout;\n\n if (action !== 'SORT') {\n layout = _.find(diff.layouts, {id: layoutId});\n }\n\n if (!layout) {\n layout = {\n id: layoutId,\n action: action,\n sections: []\n };\n diff.layouts.push(layout);\n }\n return layout;\n }\n\n function getOrCreateSection(layout, sectionId, action) {\n var section = _.find(layout.sections, {id: sectionId});\n\n if (!section) {\n section = {\n id: (sectionId === \"null\" ? null : sectionId),\n action: action,\n attributes: []\n };\n layout.sections.push(section);\n }\n return section;\n }\n\n function getOrCreateCategory(categoryName, action) {\n var diff = $scope.customizedDatamodelDiff;\n diff.categories = diff.categories || [];\n\n var category = _.find(diff.categories, {\n id: categoryName\n });\n\n if (!category) {\n var modelCategory = _.find($scope.categoryList, {\n name: categoryName\n });\n category = {\n id: categoryName,\n label: modelCategory.label,\n parent: modelCategory.parent,\n action: action,\n attributes: []\n };\n diff.categories.push(category);\n }\n category.id = _.includes(categoryName, '::') ? categoryName.split('::')[1] : categoryName;\n return category;\n }\n\n $scope.toggleAlreadyAssigned = function(isFiltered) {\n if (isFiltered) {\n $scope.attributeList = _.filter($scope.completeAttributeList, function(element) {\n return !_.includes($rootScope.dataModel.layoutAttributeNames($scope.selectedLayout),\n element.name);\n });\n } else {\n $scope.attributeList = $scope.completeAttributeList;\n }\n $rootScope.$broadcast('filterUpdated', isFiltered);\n };\n\n $scope.options = {\n accept: function(sourceNode, destNodes, destIndex) {\n var sourceData = sourceNode.$modelValue;\n var destData = destNodes.$modelValue;\n var destType = destNodes.$element.attr('data-type');\n\n var attr = _.find(destData, {\n name: sourceData.name\n });\n\n return (sourceData.type === destType && (destNodes.isParent(sourceNode) ||\n !destNodes.isParent(sourceNode) &&\n _.isUndefined(attr)));\n },\n dropped: function(event) {\n var sourceNode = event.source.nodeScope;\n var sourceNodeType = event.source.nodesScope.$element.attr('data-type');\n var destNodes = event.dest.nodesScope;\n var layout = destNodes.selectedLayout;\n\n if (sourceNodeType === 'attribute') {\n if (!destNodes.$nodeScope) return false;\n\n var sectionOrCategory = destNodes.$treeScope.$element.attr('id').split('tree-root-')[1];\n var attribute = sourceNode.$modelValue;\n var section = destNodes.$nodeScope.$modelValue;\n\n if (destNodes.isParent(sourceNode)) {\n addAttributeSortOrder(layout, section, destNodes.$modelValue);\n } else {\n var item = destNodes.$nodeScope.$modelValue;\n\n if (sectionOrCategory === 'categories') {\n addAttributeToCategory(item.name, attribute);\n }\n if (sectionOrCategory === 'layouts') {\n addAttributeToSection(layout, item.name, attribute);\n addAttributeSortOrder(layout, section, destNodes.$modelValue);\n }\n }\n } else if (sourceNodeType === 'section') {\n addSectionSortOrder(layout, destNodes.$modelValue);\n }\n }\n };\n\n function getRootNodesScope(id) {\n return angular.element('#' + id).scope();\n }\n\n $scope.toggle = function(scope) {\n scope.toggle();\n };\n\n $scope.collapseAll = function(treeId) {\n var scope = getRootNodesScope(treeId);\n scope.collapseAll();\n };\n\n $scope.expandAll = function(treeId) {\n var scope = getRootNodesScope(treeId);\n scope.expandAll();\n };\n\n // ATTRIBUTES\n $scope.isVisible = function(item, query) {\n if (_.isNil(query)) {\n return true;\n }\n query = query.toLocaleLowerCase();\n return (_.includes(item.label.toLocaleLowerCase(), query) || _.includes(item.name.toLocaleLowerCase(), query));\n };\n\n $scope.addAttribute = function() {\n var editor = $modal.open({\n templateUrl: 'tpl/editor-add-attribute.tpl.html',\n controller: 'CustomizationEditAttributeController',\n backdrop: true,\n resolve: {\n data: function() {\n return {\n attribute : {}\n };\n }\n }\n });\n editor.result.then(function(attribute) {\n if (!_.isEmpty(attribute)) {\n $scope.createNewAttribute(attribute);\n }\n });\n };\n $scope.createNewAttribute = function (attribute) {\n if (attribute.label && attribute.type) {\n attribute.id = _.camelCase(attribute.label);\n attribute.action = 'ADD';\n\n var newListAttribute = {\n name: attribute.id,\n label: attribute.label,\n type: 'attribute'\n };\n\n if (_.includes(DataModelCustomizationConstants.CODELIST_TYPES, attribute.type)) {\n if (!attribute.codelist) {\n growl.error(\"CUSTOMIZATION.CREATE_ERROR_MESSAGE\");\n return;\n }\n var params = attribute.params || {};\n params.codelist = attribute.codelist;\n params.type_name = attribute.type;\n\n newListAttribute.params = params;\n newListAttribute.typeName = attribute.type;\n\n attribute.params = params;\n attribute.typeName = attribute.type;\n }\n\n $scope.completeAttributeList.push(newListAttribute);\n $scope.customizedDatamodelDiff.attributes.push(attribute);\n $scope.attribute = {};\n growl.success(\"CUSTOMIZATION.CREATE_SUCCESS_MESSAGE\");\n } else {\n growl.error(\"CUSTOMIZATION.CREATE_ERROR_MESSAGE\");\n }\n };\n\n $scope.editAttribute = function(attr) {\n var editor = $modal.open({\n templateUrl: 'tpl/editor-add-attribute.tpl.html',\n controller: 'CustomizationEditAttributeController',\n backdrop: true,\n resolve: {\n data: function() {\n return {\n attribute : attr,\n mode : 'edit'\n };\n }\n }\n });\n editor.result.then(function(attribute) {\n if (!_.isEmpty(attribute)) {\n $scope.updateAttribute(attribute);\n }\n });\n };\n\n $scope.updateAttribute = function(attribute, label) {\n var newAttribute = {\n id: attribute.name,\n label: attribute.label,\n action: 'UPDATE',\n type : attribute.type\n };\n if (attribute.params) {\n newAttribute.params = attribute.params;\n }\n $scope.customizedDatamodelDiff.attributes.push(newAttribute);\n };\n\n $scope.updateAttributeInSection = function(parentNode, layoutId, sectionId, attribute) {\n addAttributeToSection(layoutId, sectionId, attribute);\n parentNode.attribute_status = parentNode.attribute_status ? parentNode.attribute_status : [];\n parentNode.attribute_status[attribute.name] = 'ADD';\n };\n\n $scope.removeAttribute = function(parentNode, attribute) {\n var sectionOrCategory = $rootScope.dataModel.hasCategory(parentNode.name) ? 'category' : 'section';\n if (sectionOrCategory === 'category') {\n removeAttributeFromCategory(parentNode.name, attribute);\n } else {\n removeAttributeFromSection(parentNode.name, attribute);\n }\n parentNode.attribute_status = parentNode.attribute_status ? parentNode.attribute_status : [];\n parentNode.attribute_status[attribute.name] = 'REMOVED';\n };\n\n function addAttributeSortOrder(layout, section, attributes) {\n var orderedList = extractNames(attributes);\n layout = getOrCreateLayout(layout, 'UPDATE');\n var foundSection = _.find(layout.sections, {id: section.name, action: 'SORT'});\n if (foundSection) {\n foundSection.order = orderedList;\n } else {\n var newSection = {\n id: section.name,\n action: \"SORT\",\n order: orderedList\n };\n layout.sections.push(newSection);\n }\n }\n\n // SECTIONS\n $scope.addSection = function() {\n if (_.isEmpty($scope.selectedLayout)) {\n growl.warning(\"CUSTOMIZATION.SELECT_LAYOUT_FIRST\");\n } else {\n var editor = $modal.open({\n templateUrl: 'tpl/editor-add-section.tpl.html',\n controller: 'DataModelCustomizationController',\n backdrop: true,\n resolve: {\n section: function() {\n return {};\n }\n }\n });\n editor.result.then(function(section) {\n $scope.createNewSection(section);\n });\n }\n };\n\n $scope.createNewSection = function(section) {\n if (section.label) {\n var scope = getRootNodesScope('tree-root-layouts');\n var sectionId = _.toUpper(_.snakeCase(section.label));\n var newSection = {\n name: sectionId,\n label: section.label,\n attributes: [],\n type: 'section'\n };\n scope.$nodesScope.$modelValue.push(newSection);\n addSectionToLayout($scope.selectedLayout, sectionId, section.label);\n growl.success(\"SAVE_SUCCESS_MESSAGE\");\n } else {\n growl.error(\"SAVE_ERROR_MESSAGE\");\n }\n };\n\n $scope.updateSection = function(layoutId, section) {\n var layout = getOrCreateLayout(layoutId, 'UPDATE');\n layout.sections.push({\n id: section.name,\n label: section.label,\n action: 'UPDATE',\n attributes: []\n });\n\n var updateSection = _.find($scope.currentLayout, {\n name: section.name\n });\n if (!_.isNull(updateSection)) {\n updateSection.modification_status = null;\n }\n };\n\n $scope.removeSection = function(layoutId, section) {\n if (section.attributes.length > 0) {\n var header = 'Section is not empty';\n var message = 'Delete Section \"' + section.name + '\" with all ' + section.attributes.length +\n ' items from Layout \"' + layoutId + '\"?';\n\n var confirmDialog = $dialogs.confirm(header, message);\n confirmDialog.result.then(function() {\n removeSection(layoutId, section.name);\n });\n } else {\n removeSection(layoutId, section.name);\n }\n };\n\n function removeSection(layoutId, sectionId) {\n var layout = getOrCreateLayout(layoutId, 'UPDATE');\n var section = getOrCreateSection(layout, sectionId, 'REMOVE');\n var removedSection = _.find($scope.currentLayout, {\n name: sectionId\n });\n removedSection.modification_status = 'DELETED';\n }\n\n function addSectionToLayout(layoutId, sectionId, sectionLabel) {\n var layout = getOrCreateLayout(layoutId, 'UPDATE');\n var section = getOrCreateSection(layout, sectionId, 'ADD');\n section.label = sectionLabel;\n }\n\n function addSectionSortOrder(layout, sections) {\n var orderedList = extractNames(sections);\n layout = getOrCreateLayout(layout, 'SORT');\n layout.order = orderedList;\n }\n\n function addAttributeToSection(layoutId, sectionId, attribute) {\n var layout = getOrCreateLayout(layoutId, 'UPDATE');\n var section = getOrCreateSection(layout, sectionId, 'UPDATE');\n\n var entryFound = _.find(section.attributes, {id: attribute.name});\n\n if (entryFound) {\n entryFound.action = 'ADD';\n } else {\n section.attributes.push({\n id: attribute.name,\n action: 'ADD'\n });\n }\n }\n\n function removeAttributeFromSection(sectionId, attribute) {\n var layoutId = $scope.selectedLayout;\n var layout = getOrCreateLayout(layoutId, 'UPDATE');\n var section = getOrCreateSection(layout, sectionId, 'UPDATE');\n\n var indexOfAddElement = -1;\n var attributeHasAction = _.find(section.attributes, function(element, index) {\n var result = element.id === attribute.name && element.action === 'ADD';\n indexOfAddElement = index;\n return result;\n });\n\n if (attributeHasAction) {\n section.attributes.splice(indexOfAddElement, 1);\n } else {\n section.attributes.push({\n id: attribute.name,\n action: 'REMOVE'\n });\n }\n }\n\n // CATEGORIES\n $scope.addCategory = function() {\n var editor = $modal.open({\n templateUrl: 'tpl/editor-add-category.tpl.html',\n controller: 'DataModelCustomizationController',\n backdrop: true,\n resolve: {\n category: function() {\n return {};\n }\n }\n });\n editor.result.then(function(category) {\n $scope.createNewCategory(category);\n });\n };\n\n $scope.createNewCategory = function(category) {\n if (category.label) {\n var id = _.upperFirst(_.camelCase(category.label));\n category = {\n id: id,\n label: category.label,\n parent: 'PIM::Item',\n action: 'ADD',\n attributes: []\n };\n $scope.customizedDatamodelDiff.categories.push(category);\n $scope.categoryList.push({\n name: category.id,\n label: category.label,\n attributes: []\n });\n growl.success(\"SAVE_SUCCESS_MESSAGE\");\n } else {\n growl.error(\"SAVE_ERROR_MESSAGE\");\n }\n };\n\n $scope.updateCategory = function(category) {\n var categoryName = category.name.split('::')[1];\n var newCategory = {\n id: categoryName,\n label: category.label,\n parent: category.parent,\n action: 'UPDATE',\n attributes: []\n };\n $scope.customizedDatamodelDiff.categories.push(newCategory);\n };\n\n $scope.updateAttributeInCategory = function(parentNode, categoryName, attribute) {\n addAttributeToCategory(categoryName, attribute);\n parentNode.attribute_status = parentNode.attribute_status ? parentNode.attribute_status : [];\n parentNode.attribute_status[attribute.name] = 'ADD';\n };\n\n $scope.removeCategory = function(category) {\n if (category.attributes.length > 0) {\n var header = 'Category is not empty';\n var message = 'Delete Category \"' + category.name + '\" with all ' + category.attributes.length +\n ' Attributes?';\n\n var confirmDialog = $dialogs.confirm(header, message);\n confirmDialog.result.then(function() {\n removeCategory(category);\n });\n } else {\n removeCategory(category);\n }\n };\n\n function removeCategory(category) {\n var removedCategory = _.find($scope.categoryList, {\n name: category.name\n });\n removedCategory.modification_status = 'DELETED';\n }\n\n function addAttributeToCategory(categoryName, attribute) {\n var category = getOrCreateCategory(categoryName, 'UPDATE');\n category.attributes.push({\n id: attribute.name,\n action: 'ADD'\n });\n }\n\n function removeAttributeFromCategory(categoryId, attribute) {\n var category = getOrCreateCategory(categoryId, 'UPDATE');\n\n var indexOfAddElement = -1;\n var attributeHasAction = _.find(category.attributes, function(element, index) {\n var result = element.id === attribute.name && element.action === 'ADD';\n indexOfAddElement = index;\n return result;\n });\n if (attributeHasAction) {\n category.attributes.splice(indexOfAddElement, 1);\n } else {\n category.attributes.push({\n id: attribute.name,\n action: 'REMOVE'\n });\n }\n }\n\n // CUSTOMIZED_DATAMODEL\n $scope.saveCustomizedDatamodel = function() {\n var customizedDatamodel = $scope.customizedDatamodelDiff;\n\n UploadCustomDataModelResource.save({}, customizedDatamodel,\n function(data) {\n growl.success(\"SAVE_SUCCESS_MESSAGE\");\n $scope.errorMessage = undefined;\n },\n function(response) {\n $scope.status = response.status;\n if (response.status === HttpStatus.BAD_REQUEST) {\n $scope.errorMessage = $translate.instant(response.data.message, response.data.parameters);\n } else {\n growl.error(\"SAVE_ERROR_MESSAGE\");\n }\n }\n );\n };\n\n $scope.resetDatamodel = function() {\n var header = 'CUSTOMIZATION.RESET_DATAMODEL';\n var message = 'CUSTOMIZATION.RESET_DATAMODEL_TEXT';\n\n var confirmDialog = $dialogs.confirm(header, message);\n\n confirmDialog.result.then(function() {\n ResetDataModelResource.save({}, function() {\n growl.success(\"DATAMODEL_RESET_SUCCESS_MESSAGE\");\n $rootScope.reloadDataModel();\n }, function(response) {\n growl.error(\"DATAMODEL_RESET_ERROR_MESSAGE\");\n });\n });\n };\n\n function init() {\n $scope.customizedDatamodelDiff = {\n attributes: [],\n layouts: [],\n categories: []\n };\n $scope.attributeList = getAttributeList();\n $scope.completeAttributeList = angular.copy($scope.attributeList);\n $scope.categoryList = getCategoryList();\n $scope.layoutList = getLayoutList();\n\n if (!_.isEmpty($scope.selectedLayout)) {\n $scope.selectLayout($scope.selectedLayout);\n }\n }\n\n }\n )\n .controller('CustomizationEditAttributeController',\n function($scope, $modalInstance, data, $modal, CodelistRessource, DataModelCustomizationConstants) {\n\n $scope.attribute = data.attribute || {};\n $scope.isEdit = data.mode == 'edit';\n $scope.types = DataModelCustomizationConstants.SUPPORTED_TYPES;\n $scope.codelistTypes = DataModelCustomizationConstants.CODELIST_TYPES;\n $scope.codelists = [];\n CodelistRessource.getAllCodelists(function (codelistData) {\n _.forEach(codelistData, function (codelist) {\n $scope.codelists.push(codelist.name);\n });\n });\n $scope.close = function(attr) {\n $modalInstance.close(attr);\n };\n $scope.openEditor = function(attr) {\n var key;\n _.forEach(attr.params, function(val,k) {\n if (_.isArray(val)) {\n key = k;\n }\n });\n\n var config = {\n key : key,\n levelRestrictions : {\n levelLimit : 1,\n types : {\n \"0\" : {\n type :'array'\n },\n \"1\" : {\n type :'object',\n keys : ['key','value']\n }\n }\n }\n };\n\n var editor = $modal.open({\n templateUrl: 'tpl/json-editor.tpl.html',\n controller: 'JsonEditorController',\n windowClass: 'manage-datamodel-modal',\n resolve: {\n jsonEditorData: function() {\n return {\n json : attr.params,\n config : config\n };\n }\n }\n });\n editor.result.then(function(params) {\n if (!_.isNil(params)) {\n attr.params = params;\n }\n });\n };\n\n });\n","angular.module('llax')\n .controller('EditContactController',\n function($rootScope, $scope, $modalInstance, growl, data, ContactsResource) {\n\n $scope.contactAttributes = $rootScope.dataModel.getContactAttributes();\n $rootScope.prepareAttributes($scope.contactAttributes);\n $scope.editMode = false;\n $scope.readOnly = false;\n $scope.parentImagetoggle = true;\n $scope.invitationTypes = [\"INVITED_BUYER\", \"INVITED_SUPPLIER\", \"INVITED_COMMUNITY_MEMBER\"];\n $scope.hideContactIcon = false;\n\n if (data && data.contact.id) {\n $scope.contact = angular.copy(data.contact);\n $scope.editMode = true;\n $scope.readOnly = !_.isNil(data.contact.organizationId);\n } else {\n $scope.contactOrganization = {};\n $scope.contact = {};\n }\n\n $scope.close = function(contact) {\n // FIXME: Ignore \"managedContact\" in backend!\n delete contact.managedContact;\n if ($scope.editMode) {\n ContactsResource.save(contact, function() {\n growl.success(\"CONTACT_SUCCESSFULLY_UPDATED\");\n $rootScope.$broadcast('updateContact');\n $modalInstance.close();\n }, function(error) {\n if (error.data && error.data.message) {\n growl.error(error.data.message, { variables: error.data.parameters });\n } else {\n growl.error(\"SAVE_ERROR_MESSAGE\");\n }\n });\n } else {\n ContactsResource.create(contact, function() {\n growl.success(\"CONTACT_SUCCESSFULLY_ADDED\");\n $rootScope.$broadcast('updateContact');\n $modalInstance.close();\n }, function(error) {\n if (error.data && error.data.message) {\n growl.error(error.data.message, { variables: error.data.parameters });\n } else {\n growl.error(\"SAVE_ERROR_MESSAGE\");\n }\n });\n }\n };\n\n $scope.uploadFileForItem = function(attributeName) {\n return {\n url: lax_rest_url('assets'),\n filters: ['imageFilter'],\n accept: 'image/jpeg,image/gif,image/png',\n cropImage: true,\n uploadComplete: function(response) {\n var assets = [];\n if (_.isObject(response)) { // HTML5 browsers\n assets = response.map(function(asset) {\n var result = {};\n result.url = asset.url;\n result.name = asset.path.substr(1); //remove trailing /\n result.contentType = asset.contentType;\n return result;\n });\n } else if (_.isString(response)) { //IE9\n response = response.substr(6).slice(0, -7);\n var asset = JSON.parse(response);\n asset.name = asset.path.substr(1);\n assets.push(asset);\n }\n if (assets && assets.length>0) {\n $scope.contact.imageUrl = assets[0].url;\n }\n }\n };\n };\n\n $scope.cancel = function() {\n $modalInstance.close();\n };\n\n $scope.toggleContactIcon = function() {\n $scope.hideContactIcon = !$scope.hideContactIcon;\n };\n\n $scope.$on('toggleFileUpload', function(event, uploadId) {\n if(uploadId == \"contact_upload\") {\n $scope.toggleContactIcon();\n }\n });\n });\n","angular.module('llax')\n .controller('EditReportController',\n function($rootScope, $scope, $modalInstance, $filter, JobResource, ItemsSearchFilterResource, ExportFormatsResource,\n SelectionResource, growl, data) {\n\n if (data) {\n $scope.job = {\n name: data.name,\n type: data.type,\n active: data.schedule.active,\n date: $filter('date')(data.schedule.startDateTime, 'medium'),\n status: data.schedule.status,\n recipients: data.emailRecipients.join(', ')\n };\n if (data.format) {\n $scope.job.mapping = data.format.split(\"__mappingname__=\")[1];\n }\n if (data.schedule.repeatEvery) {\n $scope.job.repeat = data.schedule.repeatEvery + ' ' + data.schedule.repeatType + ' from ' +\n data.schedule.repeatHour + ':' + data.schedule.repeatMinute;\n }\n if (data.selectionId) {\n SelectionResource.get({\n selectionId: data.selectionId\n }, function(response) {\n var query = _.filter(response.itemsQuery, function(value, key) {\n return !_.isNil(value);\n });\n $scope.job.query = query.join(', ');\n });\n }\n }\n\n $scope.report = {\n name: '',\n itemsQuery: {},\n emailRecipients: []\n };\n\n $scope.planOptions = {\n action: 'SCHEDULE_PLAN',\n job: {\n schedule: {}\n }\n };\n\n $scope.ok = function() {\n $modalInstance.close();\n };\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.onBeforeStepChange = function(event, report) {\n var valuesSet = !_.isEmpty(report.itemsQuery.category) || !_.isEmpty(report.filter);\n if (valuesSet) {\n return true;\n } else {\n growl.warning(\"ITEM_LIBRARY_REPORT.NO_CRITERIA_SET\");\n return false;\n }\n };\n\n $scope.onAfterStepChange = function(event) {\n return true;\n };\n\n $scope.updateItemsQuery = function(option) {\n $scope.report.itemsQuery = _.assignInWith($scope.report.itemsQuery, option.itemsQuery,\n function(dstValue, srcValue) {\n return _.isNil(srcValue) ? dstValue : srcValue;\n });\n };\n\n $scope.addRecipient = function() {\n $scope.report.emailRecipients.push({\n sendTo: \"\",\n editing: true\n });\n };\n\n $scope.editRecipient = function(recipient) {\n recipient.editing = true;\n };\n $scope.deleteRecipient = function(recipient) {\n $scope.report.emailRecipients = _.without($scope.report.emailRecipients, recipient);\n };\n\n function getCurrentJob(selectionId, config) {\n var job = angular.extend($scope.planOptions.job, {\n type: 'EXPORT',\n selectionId: selectionId,\n format: config.format,\n emailRecipients: _.map(config.emailRecipients, 'sendTo')\n });\n job.schedule.active = true;\n return job;\n }\n\n $scope.confirmCreateReport = function(reportConfig) {\n if (!$scope.planOptions.job.name) {\n growl.warning('ITEM_LIBRARY_REPORT.REPORT_NAME_MISSING');\n return;\n }\n var itemSelection = {\n itemsQuery: reportConfig.itemsQuery\n };\n SelectionResource.save(itemSelection, function(response) {\n var job = getCurrentJob(response.selectionId, reportConfig);\n JobResource.save(job,\n function(response) {\n growl.info('ITEM_LIBRARY_REPORT.CREATE_REPORT_SUCCESSFULL');\n $scope.ok();\n },\n function(errorResponse) {\n growl.error('ITEM_LIBRARY_REPORT.CREATE_REPORT_FAILED');\n });\n });\n };\n\n (function init() {\n ItemsSearchFilterResource.query({}, function(response) {\n $scope.filters = _.map(response, function(entry) {\n return {\n key: entry.name,\n itemsQuery: entry.itemsQuery,\n userId: entry.userId\n };\n });\n });\n ExportFormatsResource.query({\n includeExportMappings: true\n }, function(response) {\n $scope.mappingProfiles = _.filter(response, function(entry) {\n return _.startsWith(entry.value, 'Excel');\n });\n });\n JobResource.query({}, function(response) {\n $scope.jobs = response;\n });\n $scope.categories = _.map($rootScope.dataModel.getRaw().categories, function(entry) {\n return {\n key: entry.name\n };\n });\n })();\n }\n );\n","angular.module('llax')\n .controller('EditSubscriptionsController',\n function($scope, $rootScope, $modalInstance, $translate, $q, channel, subscriptionDescription, ItemChangesQueueManager,\n ValidateItemService) {\n\n $scope.subscriptionDescription = subscriptionDescription;\n $scope.subscriptions = subscriptionDescription.subscriptions;\n\n // Validations per subscription\n var subscriptionValidations = [];\n\n // Function to call when subscription changes are validated\n function processValidateSubscription(subscriptionChanges, subscriptions, previousSubscriptions) {\n\n // Validate all changed subscription rows\n var validateItems = [];\n angular.forEach(subscriptionChanges, function(subscription, index) {\n\n var currentSubscription = subscription;\n currentSubscription.validation__ = [];\n\n var previousSubscription = {};\n\n if (!_.isEmpty(previousSubscriptions) && !_.isEmpty(previousSubscriptions[index])) {\n previousSubscription = previousSubscriptions[index];\n previousSubscription.validation__ = [];\n\n }\n\n if (!_.isEmpty(previousSubscriptions) && !$rootScope.isEqual(angular.copy(currentSubscription),angular.copy(previousSubscription))) {\n // Clear all validation map entries for row, because we always validate the complete subscription\n subscriptionValidations = subscriptionValidations || [];\n subscriptionValidations[index] = {};\n\n var validateItem = ValidateItemService.validateItem($scope,\n $scope.item,\n subscriptions[index],\n previousSubscriptions[index],\n null,\n subscriptionValidations[index]);\n validateItems.push(validateItem.$promise);\n var allValidationKeys = [];\n validateItem.$promise.then(function(res) {\n _.forEach(res.validations, function(value, key) {\n var val_keys = _.map(value, function(v) {\n return key + ':' + v.name;\n });\n allValidationKeys = allValidationKeys.concat(val_keys);\n\n });\n $scope.subscriptions[index].validation__ = allValidationKeys;\n });\n }\n\n });\n\n return $q.all(validateItems);\n }\n\n // Create and start queues for validating and saving changes\n var queueManager = new ItemChangesQueueManager();\n queueManager.createQueue('validateSubscriptionQueue', 600, processValidateSubscription);\n queueManager.createQueue('storeSubscriptionsQueue'); // The 'store' queue only listens to changes, so we can check if subscriptions were modified\n queueManager.start($scope, $scope.subscriptions, 'subscriptions');\n\n function getCellValidations(row, col) {\n\n if (!subscriptionValidations) {\n return [];\n }\n\n var index = $scope.subscriptions.indexOf(row.entity);\n var validations = subscriptionValidations[index] || {};\n\n var attributeName = col.field;\n var cellValidations = validations[attributeName] || [];\n\n return cellValidations;\n }\n\n // Define validation methods for grid like 'getCellValidationMessages' and 'getRowValidationMessages'.\n ValidateItemService.defineGridValidationMethods($scope, getCellValidations);\n\n $scope.createSubscriptionTableColumnDefinition = function(channel) {\n\n var subscriptionAttributes = $scope.getSubscriptionAttributes(channel);\n var columnDefs = [];\n var length = subscriptionAttributes.length;\n var nameColumn = {\n field: 'name',\n displayName: $translate.instant('NAME'),\n headerTooltip: true,\n cellTooltip: true,\n enableCellEdit: true,\n enableCellSelection: true,\n resizable: true\n };\n columnDefs.push(nameColumn);\n\n for (var i = 0; i < length; i++) {\n var attr = subscriptionAttributes[i];\n var col = {\n attribute: attr,\n field: attr.name,\n headerTooltip: true,\n cellTooltip: true,\n enableCellEdit: true,\n resizable: true\n };\n //based on the attribute type different kinds of cell editors are set on the column\n $rootScope.generateCellEditors(attr, col, $scope, {\n context: \"subscription\",\n emptyDefault: true\n });\n columnDefs[i + 1] = col;\n }\n\n columnDefs.push({\n field: 'oneTime',\n displayName: $translate.instant('ONE_TIME'),\n headerTooltip: true,\n enableCellEdit: false,\n cellTemplate: '
' +\n '' +\n '
'\n });\n\n columnDefs.push({\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n name: 'actions',\n enableCellEdit: false,\n enableCellSelection: false,\n allowCellFocus: false,\n cellClass: 'text-right',\n headerCellClass: 'text-right',\n enableColumnResizing: false,\n enableSorting: false,\n width: 150,\n cellTemplate: '
' +\n '
' +\n '' +\n '' +\n '{{row.entity.validation__.length}}' +\n '' +\n '' +\n '
' +\n '
'\n });\n\n $scope.columnDefs = columnDefs;\n $scope.gridOptions = {\n data: 'subscriptions',\n showSelectionCheckbox: false,\n enableCellSelection: true,\n enableRowSelection: true,\n enableCellEdit: true,\n enableColumnMenus: false,\n enableColumnResize: true,\n multiSelect: false,\n selectWithCheckboxOnly: false,\n columnDefs: $scope.columnDefs,\n rowHeight: 34,\n enableHorizontalScrollbar: 1, // hide\n enableVerticalScrollbar: 1, // show when needed\n onRegisterApi: function(gridApi) {\n $scope.gridApi = gridApi;\n gridApi.edit.on.beginCellEdit($scope, function(rowEntity, colDef) {\n $scope.editedPrimaryKey = rowEntity.primaryKey__;\n });\n }\n };\n };\n\n $scope.createSubscriptionTableColumnDefinition(channel);\n\n $scope.addRow = function() {\n var newSubscription = {\n 'channelId__': subscriptionDescription.channelId,\n 'category__': subscriptionDescription.category__\n };\n $scope.subscriptions.push(newSubscription);\n };\n\n $scope.removeRow = function(row) {\n var index = $scope.subscriptions.indexOf(row.entity);\n $scope.subscriptions.splice(index, 1);\n };\n\n $scope.save = function() {\n $scope.subscriptionDescription.subscriptions = $scope.subscriptions;\n $modalInstance.close($scope.subscriptionDescription);\n };\n\n $scope.cancel = function() {\n // TODO: Add confirm dialog when subscriptions were changed\n var storeSubscriptionsQueue = queueManager.getQueue('storeSubscriptionsQueue');\n var modified = storeSubscriptionsQueue.hasQueuedItemChanges();\n\n $modalInstance.dismiss('cancel');\n };\n\n $scope.$on('$destroy', function() {\n queueManager.stop();\n });\n\n }\n );\n","angular.module('llax')\n .controller('EditTaskController',\n function($rootScope, $scope, $translate, $routeParams, $dialogs, $controller, $location, growl, TaskResource) {\n\n $controller('EditorContainerController', {\n $scope: $scope\n });\n\n $scope.focusOn = true;\n $scope.attachment = undefined;\n $scope.filesSelected = false;\n $scope.fileUploadSettings = {\n showInlinepreviewInDropzone : true\n };\n\n $scope.hasEditPermission = function(task) {\n var canEdit = true;\n if (task && $rootScope.user && !_.isEmpty($rootScope.user.roles)) {\n canEdit = $rootScope.user.roles.indexOf('admin') > -1 || $rootScope.user.userId == task.author;\n }\n return canEdit;\n };\n\n $scope.editorOptions = {\n basic: {\n height: '5em',\n removePlugins: 'elementspath',\n toolbar: [{\n name: 'basicstyles',\n items: ['Bold', 'Italic']\n }, {\n name: 'paragraph',\n items: ['BulletedList', 'NumberedList']\n }, {\n name: 'links',\n items: ['Link', 'Unlink']\n }]\n }\n };\n\n function initTask() {\n var taskTags = $rootScope.dataModel.getTaskTags();\n $scope.taskTags = taskTags;\n TaskResource.get({ taskId: $routeParams.taskId }, function(response) {\n var task = response;\n task.comments = loadComments(task.id);\n $scope.task = task;\n $scope.tagsCopy = angular.copy($scope.task.tags);\n $scope.task.notes = decodeHtml($scope.task.notes);\n $scope.taskLoadingFinished = true;\n });\n }\n\n $scope.closeTask = function(task) {\n if (task.transitions && !task.chosenTransition) {\n growl.error(\"TASK.CLOSE_TASK.FAILED_MESSAGE\");\n return;\n }\n task.taskStatus = 'FINISHED';\n $scope.updateTask(task);\n };\n\n $scope.reopenTask = function(task) {\n task.taskStatus = 'OPEN';\n $scope.updateTask(task);\n };\n\n $scope.$on('itemEditorClosed', function(event, result) {\n if (result && result.taskOptions && result.taskOptions.closeTask) {\n $scope.task.chosenTransition = result.taskOptions.transition;\n $scope.closeTask($scope.task);\n $location.path(\"/tasks\");\n }\n });\n\n $scope.setAssignee = function(user) {\n $scope.task.assignee = user.userId;\n };\n\n $scope.tagsCopy = {};\n $scope.cancelFields = function(field) {\n if (field == 'tags') {\n $scope.task.tags = angular.copy($scope.tagsCopy);\n }\n };\n\n $scope.updateTask = function() {\n TaskResource.save({\n taskId: $scope.task.id\n }, $scope.task, function(response) {\n $scope.task = response;\n $scope.tagsCopy = angular.copy($scope.task.tags);\n loadComments($scope.task.id);\n growl.success(\"TASK.SAVE_TASK_SUCCESS_MESSAGE\");\n });\n };\n\n $scope.$on('filesSelected', function() {\n $scope.filesSelected = true;\n });\n\n $scope.uploadAttachments = function() {\n return {\n url: lax_rest_url('assets'),\n reset: true,\n uploadComplete: function(response) {\n $scope.comment.assets = $scope.comment.assets || [];\n var assets = _.map(response, function(asset) {\n var result = {};\n result.url = asset.url;\n result.name = asset.path.substr(1);\n result.contentType = asset.contentType;\n return result;\n });\n $scope.comment.assets = $scope.comment.assets.concat(assets);\n $scope.filesSelected = false;\n }\n };\n };\n\n $scope.removeAttachement = function(asset) {\n _.remove($scope.comment.assets, {\n url: asset.url\n });\n };\n\n $scope.$on(\"removeAttachement\", function (event, eventData) {\n $scope.removeAttachement(eventData);\n });\n\n function loadComments(taskId) {\n TaskResource.getComments({\n taskId: taskId\n }, function(response) {\n $scope.task.comments = response;\n });\n }\n\n $scope.saveComment = function(comment, taskId) {\n if (_.isEmpty(comment.text)) {\n growl.warning('TASK.MISSING_TASK_TITLE');\n return false;\n }\n\n if (!$scope.filesSelected) {\n comment.author = $rootScope.user.userId;\n comment.taskId = taskId;\n\n var pathParams = {\n taskId: taskId,\n commentId: comment.id\n };\n\n TaskResource.saveComment(pathParams, comment, function(response) {\n $scope.comment = {};\n $scope.$broadcast('clearAttributeValue');\n growl.success(\"SAVE_SUCCESS_MESSAGE\");\n loadComments(taskId);\n });\n } else {\n var message = $translate.instant('NOTIFY.FILES_STILL_NOT_UPLOADED');\n $dialogs.notify(\"\", message);\n }\n };\n\n $scope.getTransitionText = function(task) {\n if (!task.transitions) {\n return task.chosenTransition;\n }\n var chosenTransition = _.find(task.transitions, { key: task.chosenTransition });\n return chosenTransition ? chosenTransition.text : task.chosenTransition;\n };\n\n $scope.enableReopenTask = function(task) {\n if (_.isEmpty(task)) {\n return false;\n }\n var customService = $rootScope.getService('CustomTaskEditorSettings');\n return !customService || customService.enableReopenTask(task, $rootScope.user, $rootScope.organization);\n };\n\n (function init() {\n initTask();\n })();\n }\n );\n","angular.module('llax')\n .controller('EditUserAccountController',\n function($rootScope, $scope, $modalInstance, $q, growl, data, RolesService, UsersResource, UsersGroupService) {\n $scope.filters = data.filters;\n $scope.userAccount = angular.copy(data.userAccount);\n\n $scope.selectedGroups = [];\n $scope.effectiveRoles = [];\n $scope.groups = [];\n $scope.updateEffectiveRoles = function(groups) {\n $scope.selectedGroups = groups;\n if (_.isArray(groups)) {\n var allroles = _.concat(_.flattenDeep(_.map(groups,'roles')), _.get(data,'userAccount.roles') || []);\n $scope.effectiveRoles = _.union(allroles);\n }\n };\n\n $scope.updateUser = function() {\n var request_payload = {};\n request_payload.restrictionQuery = $scope.userAccount.restrictionQuery;\n request_payload.restrictionFilter = $scope.userAccount.restrictionFilter;\n request_payload.groupIds = _.map($scope.selectedGroups,'id');\n request_payload.roles = $scope.userAccount.roles;\n UsersResource.updateUser({\n accountId: $scope.userAccount.id,\n payload: request_payload\n }, function(response) {\n UsersGroupService.reloadUsersAndGroups();\n $modalInstance.close(true);\n growl.success(\"USER_MANAGEMENT.USER_UPDATE_SUCCESS\");\n });\n };\n\n function getRoles() {\n RolesService.getAllRoles().then(function(roles) {\n $scope.roles = _.map(roles, function(elem) {\n return {\n id: elem,\n text: elem\n };\n });\n });\n }\n\n function prepareGroups() {\n if (_.isArray(data.allGroups)) {\n $scope.groups = data.allGroups;\n if (data.userAccount && _.isArray(data.userAccount.groupIds)) {\n $scope.selectedGroups = _.filter(data.allGroups, function(group) {\n return data.userAccount.groupIds.indexOf(group.id) > -1;\n });\n $scope.updateEffectiveRoles($scope.selectedGroups);\n }\n }\n }\n\n $scope.close = function(userAccount) {\n $modalInstance.close();\n };\n\n (function init() {\n if (_.isArray(data.allRoles)) {\n $scope.roles = data.allRoles;\n } else {\n getRoles();\n }\n prepareGroups();\n })();\n });\n","angular.module('llax')\n .controller('EditorContainerController', ['$rootScope', '$scope', '$routeParams', '$location', '$modal','$timeout',\n function($rootScope, $scope, $routeParams, $location, $modal, $timeout) {\n\n $scope.showItems = function(task) {\n if (task.items && task.items.length === 1) {\n $scope.task = task;\n $scope.showEditor(task.items[0], task);\n } else {\n $location.path(\"/browse\").search(\"taskId\", task.id);\n }\n };\n\n $scope.getBrowseLink = function(task) {\n if (!task) {\n return \"\";\n }\n return 'browse?taskId=' + task.id;\n };\n\n $scope.openBrowseLink = function(task) {\n $location.path(\"/browse\").search(\"taskId\", task.id);\n };\n\n $scope.showEditor = function(primaryKey, task) {\n var path = $location.path();\n var editor = $modal.open({\n templateUrl: 'tpl/editor.tpl.html',\n controller: 'EditorController',\n backdrop: 'static',\n keyboard: true,\n windowClass: 'item-editor',\n resolve: {\n params: function() {\n return {\n itemPrimaryKey: primaryKey,\n task: task\n };\n }\n }\n });\n editor.result.then(function(response) {\n // Start the editor with another item\n if (!_.isNil(response.showItemPrimaryKey)) {\n $timeout(function() {\n $scope.showEditor(response.showItemPrimaryKey,task);\n }, 1);\n }\n }).finally(function() {\n $location.displayUrl(path);\n });\n };\n\n }\n ]);\n","angular.module('llax')\n .controller('EditorController',\n function($controller, $dialogs, $document, $location, $log, $modal, $modalInstance,\n $parse, $q, $rootScope, $routeParams, $scope, $timeout, $translate, $window, growl, params,\n AssetFoldersService, Auth, AdditionalCategoryAttributeService, ChannelService, CommunicationChannelService,\n DefaultItemResource, GroupAttributeService, InputTemplatesService, ItemResource, ItemChangesQueueManager,\n OrganizationService, ReferenceAttributesService, SessionDataService, SupplierReviewResource, TaskResource, uiGridConstants, UrlRetrievalService,\n UsersService, ValidateItemService, ReactBridge) {\n\n var LOAD_WITH_VALIDATIONS = true;\n var TEMP_ITEM = \"tmpItem\";\n var TEMP_TASK = \"tmpTask\";\n var CUSTOM_ITEM_REVIEW_SERVICE = \"CustomItemReviewSettings\";\n var CUSTOM_ITEM_SERVICE = \"CustomItemEditorSettings\";\n\n var VALIDATION_STATUS_IS_DIRTY = \"isDirty\";\n var VALIDATION_STATUS_IS_COMPLIANT = \"isCompliant\";\n var VALIDATION_STATUS_IS_NOT_COMPLIANT = \"isNotCompliant\";\n var VALIDATION_STATUS_IS_RUNNING = \"isRunning\";\n\n var GRID_STATE_KEY_PREFIX = \"gridState:\";\n\n var LocalStorage = $window.localStorage;\n\n $scope.onShowSettings = false;\n $scope.focusOn = true;\n $scope.enableAudit = true;\n $scope.showCategorySection = true;\n $rootScope.additionalModalOpen = false;\n\n $scope.item = {};\n $scope.originalItem = {};\n $scope.attributeStates = {};\n $scope.validations = {};\n\n $scope.validationStatus = null;\n $scope.validationErrorsCount = 0;\n $scope.validationWarningsCount = 0;\n\n $scope.allAttributes = [];\n $scope.searchableSubAttributes = [];\n $scope.isItemEditable = null;\n $scope.groupIndexes =[];\n $scope.connectedUserIds = [];\n $scope.connectedAccounts = [];\n\n $scope.itemHierarchies = [];\n $scope.itemHierarchyStatus = [];\n\n // A map of local (client-side) validations where the attribute path in the item\n // is the key.\n $scope.localValidations = {};\n\n $scope.vm = {\n desiredAuditStatus: null\n };\n\n $scope.displayEditor = false;\n function displayEditor() {\n $timeout(function() {\n $scope.displayEditor = true;\n }, 1);\n }\n $scope.isOldEditorOn = localStorage.getItem('OLD_EDITOR') === 'true';\n\n $scope.saveEditorState = function() {\n console.log('Editor state:', $scope.isOldEditorOn);\n\n localStorage.setItem('OLD_EDITOR', $scope.isOldEditorOn);\n window.location.reload();\n\n };\n\n var taskFromSession = JSON.parse(LocalStorage.getItem(TEMP_TASK));\n LocalStorage.removeItem(TEMP_TASK);\n\n $scope.task = _.isNil(params.task)? taskFromSession : params.task;\n\n $scope.currentLayout = 'edit';\n\n OrganizationService.$organization.subscribe(function(organization) {\n $scope.organization = angular.copy(organization);\n });\n\n $scope.sectionToFocus = $routeParams.section;\n $scope.attributeToFocus = $routeParams.attribute;\n\n // Unset routing params when opening editor, otherwise they keep 'cached' when opening the editor again!\n $routeParams.section = undefined;\n $routeParams.attribute = undefined;\n\n $scope.isCopiedItem = ($location.path().startsWith('/copy/'));\n $scope.isNewItem = ($location.path() == '/edit' || $location.path().startsWith('/edit/new') || $scope.isCopiedItem);\n $scope.allCategories = [];\n\n $scope.isInitialValidationFinished = ($scope.isNewItem == true) ? true : false;\n\n // Extend editor dialog scope with passed params (showDetails, showHistory...etc).\n _.extend($scope, params.editorState);\n\n GroupAttributeService.initializeScope($scope);\n\n $controller('EditorViewController', {\n $scope: $scope\n });\n\n $scope.isRowEditable = function(row) {\n if (!_.isNil($scope.isItemEditable)) {\n row.editable = $scope.isItemEditable;\n }\n return row.editable;\n };\n\n var closeOtherPanels = SessionDataService.get(\"closeOtherPanels\");\n if (closeOtherPanels) {\n $scope.closeOtherPanels = closeOtherPanels == \"true\" ? true : false;\n } else {\n SessionDataService.put(\"closeOtherPanels\", true);\n $scope.closeOtherPanels = true;\n }\n\n $scope.toggleCloseOtherPanels = function(closeOtherPanels) {\n SessionDataService.put(\"closeOtherPanels\", closeOtherPanels);\n $scope.closeOtherPanels = closeOtherPanels;\n };\n\n var disableDeleteConfirmation = LocalStorage.getItem(\"disableDeleteConfirmation-\" + $rootScope.userId);\n if (disableDeleteConfirmation) {\n $scope.disableDeleteConfirmation = disableDeleteConfirmation == \"true\" ? true : false;\n } else {\n LocalStorage.setItem(\"disableDeleteConfirmation-\" + $rootScope.userId, false);\n $scope.disableDeleteConfirmation = false;\n }\n\n $scope.toggleDisableDeleteConfirmation = function(disableDeleteConfirmation) {\n LocalStorage.setItem(\"disableDeleteConfirmation-\" + $rootScope.userId, disableDeleteConfirmation);\n $scope.disableDeleteConfirmation = disableDeleteConfirmation;\n };\n\n $scope.temporaryModelForTypeahead = {};\n $scope.temporaryWarningsForTypeahead = {};\n $scope.addToReferenceList = function(item, a, label, model) {\n var modelEval = ReferenceAttributesService.getModelEval(model, a);\n var reference = modelEval($scope)|| [];\n\n reference.push(item);\n\n //add found element to $scope.item\n if (reference.length < 10) {\n var parsedModelString = ReferenceAttributesService.parseModelString(model, a.name);\n $scope.gridOptionsMap[parsedModelString].minRowsToShow++;\n }\n\n //clear input field, when item is added\n delete $scope.temporaryModelForTypeahead[a.name];\n\n };\n\n $scope.isShowUnderGroup = function(attribute, validation) {\n if (attribute.typeName === 'Group') {\n return validation.path.length === 1;\n } else {\n return true;\n }\n };\n\n $scope.addSingleReference = function (referencedItem, a, label, model) {\n\n ReferenceAttributesService.loadAndFormatItemAsync(referencedItem.primaryKey__, null, a)\n .then(function(result) {\n $timeout(function() {\n ReferenceAttributesService.checkModelAndEval(model, a, referencedItem, $scope);\n // \"Hack\" to bind a descriptive String including all filter elements to the item\n $scope.temporaryModelForTypeahead[a.name] = result;\n }, 0);\n });\n };\n\n $scope.$on('clearAttributeValue', function (event, attributeName) {\n // For single reference attribute, remove typeahead when removing selection\n if ($scope.temporaryModelForTypeahead[attributeName]) {\n delete $scope.temporaryModelForTypeahead[attributeName];\n }\n });\n\n $scope.startCalloutDelay = function(name, description) {\n\n $scope.calloutWaitingPromise = $timeout(function() {\n // Ensure that we are only targeting visible attributes,\n // in case of the same attribute being reused in different sections.\n var htmlElementSelector = '.panel-collapse.collapse.in #' + name;\n var target = $(htmlElementSelector)[0];\n $scope.calloutWithId(target, name, description);\n }, 250);\n\n };\n\n $scope.stopCalloutDelay = function() {\n $timeout.cancel($scope.calloutWaitingPromise);\n };\n\n $scope.loadSingleItemForReference = function (attribute, item, name, model) {\n var modelEval = ReferenceAttributesService.getModelEval(model, attribute);\n var referencedItemPrimaryKey = modelEval($scope);\n\n if (_.isEmpty(referencedItemPrimaryKey)) {\n return;\n }\n\n ReferenceAttributesService.loadAndFormatItemAsync(referencedItemPrimaryKey, $scope.item, attribute)\n .then(function(result) {\n $timeout(function(){\n // \"Hack\" to bind the formatted reference item\n $scope.temporaryModelForTypeahead[name] = result;\n }, 0);\n });\n };\n\n $scope.loadItemsForReference = function(attribute, item, name, model) {\n model = ReferenceAttributesService.parseModelString(model, name);\n var isReadonly = $scope.isAttributeReadonly(attribute);\n var modelEval = ReferenceAttributesService.getModelEval(model, attribute);\n var referencedItems = modelEval($scope);\n\n if (_.isEmpty(referencedItems)) {\n return;\n }\n $rootScope.referencedItems[model] = angular.copy(referencedItems);\n ReferenceAttributesService.extendReferencedItemsAsync(attribute, referencedItems)\n .then(function(result) {\n // We can only filter the referenced items when in read-only state so\n // we don't trigger a data change in the editor after the filtration.\n if (isReadonly) {\n modelEval.assign($scope, $rootScope.filterCollection(result, item, $rootScope.dataModel.attribute(name)));\n } else {\n modelEval.assign($scope, result);\n }\n\n // Trigger a rerender of the multi reference attribute, for example\n // if the item was not found, we need to show an error\n if (!_.isNil($scope.gridApiMap[model])) {\n $timeout(function() {\n $scope.gridApiMap[model].core.notifyDataChange(uiGridConstants.dataChange.ALL);\n }, 0);\n }\n });\n };\n\n $scope.findItems = function(keywordQuery, attribute) {\n return ReferenceAttributesService.loadAndFormatItemsToBeReferencedAsync(keywordQuery, $scope.item, attribute);\n };\n\n function getDataModelAttributes() {\n\n return $rootScope.dataModel.filteredLayoutAttributes($scope.currentLayout, $scope.item).map(function(attribute) {\n return [attribute.label, 'item.' + attribute.name];\n });\n }\n\n // Overwrite Default Implementation of placeholder plugin\n CKEDITOR.on('dialogDefinition', function(ev) {\n // Take the dialog name and its definition from the event data.\n var dialogName = ev.data.name;\n var dialogDefinition = ev.data.definition;\n\n // Check if the definition is from the dialog we're interested on (the \"Link\" dialog).\n if (dialogName == 'placeholder') {\n // Get a reference to the \"Link Info\" tab.\n var infoTab = dialogDefinition.getContents(\"info\");\n\n infoTab.add({\n type: 'select',\n id: 'datamodelAttribute',\n label: 'Attribute',\n style: 'width: 300px;',\n items: getDataModelAttributes(),\n onShow: function() {\n var values = this.getDialog().getContentElement('info', 'datamodelAttribute'); // 'general' is the id of the dialog panel.\n removeAllOptions(values);\n\n var opts = getDataModelAttributes();\n\n for (var i = 0; i < opts.length; i++) {\n addOption(values, opts[i][0], opts[i][1], this.getDialog().getParentEditor().document);\n }\n },\n\n setup: function(widget) {\n this.setValue(widget.data.name);\n },\n commit: function(widget) {\n widget.setData('name', this.getValue());\n }\n });\n infoTab.remove('name');\n }\n });\n\n $scope.editorOptions = {\n 'basic': {\n removePlugins: 'elementspath',\n toolbar: [{\n name: 'basicstyles',\n items: ['Bold', 'Italic']\n }, {\n name: 'paragraph',\n items: ['BulletedList', 'NumberedList']\n }, {\n name: 'links',\n items: ['Link', 'Unlink']\n }, {\n name: 'insert',\n items: ['CreatePlaceholder']\n }],\n },\n 'html': {\n removePlugins: 'elementspath',\n allowedContent: true,\n toolbar: [{\n name: 'styles',\n items: ['Format']\n }, {\n name: 'basicstyles',\n items: ['Bold', 'Italic']\n }, {\n name: 'paragraph',\n items: ['NumberedList', 'BulletedList']\n }, {\n name: 'links',\n items: ['Link', 'Unlink']\n }, {\n name: 'insert',\n items: ['CreatePlaceholder', 'Table']\n }, {\n name: 'clipboard',\n items: ['Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo']\n }, {\n name: 'document',\n items: ['Source']\n }, {\n name: 'tools',\n items: ['Maximize']\n }]\n }\n };\n\n $scope.showPreview = {};\n\n $scope.resolveItemPlaceHolders = function(text) {\n if (!text) return;\n\n function replaceMatches(match) {\n\n var property = match.substr(2, match.length - 4);\n\n property = property.replace(/'/g, \"'\"); // recreate quotes\n property = property.replace(/ /g, \"\"); // replace spaces\n property = property.replace(/item/g, '$scope.item');\n\n var value = $scope.$eval(property);\n\n if (!value) {\n value = match;\n }\n return value;\n }\n\n return text.replace(/\\[\\[.+?\\]\\]/g, replaceMatches);\n\n };\n\n var remoteEditedAttributes = [];\n\n $scope.checkAttributeEditedRemote = function(attribute) {\n if (remoteEditedAttributes.contains(attribute)) {\n return \"light-yellow\";\n }\n };\n\n var messageTimeout;\n\n function removeAfterTimeout(field) {\n if (messageTimeout !== undefined) {\n $timeout.cancel(messageTimeout);\n }\n\n messageTimeout = $timeout(function() {\n $rootScope[field] = undefined;\n messageTimeout = undefined;\n }, 5000);\n }\n\n function storeItemChanges() {\n var storeItemQueue = queueManager.getQueue('storeItemQueue');\n var queuedItemChanges = angular.copy(storeItemQueue.getQueuedItemChanges());\n queuedItemChanges.primaryKey__ = $scope.item.primaryKey__;\n $log.debug(\"queuedItemChanges:\", queuedItemChanges);\n LocalStorage.setItem(TEMP_ITEM, JSON.stringify(queuedItemChanges));\n }\n\n $scope.$on('channelMessageReceived', function(event, eventData) {\n\n var type = eventData.type;\n\n var item = eventData.data.item;\n var action = eventData.data.action;\n var userId = eventData.data.userId;\n var userName = $rootScope.getUserName(userId);\n\n if (eventData.event === ChannelService.DATA_MODEL_CHANGED_EVENT) {\n storeItemChanges();\n } else if (eventData.event === ChannelService.ITEM_CHANGED_EVENT) {\n\n if (!$scope.saving && !$scope.closing) {\n\n var typeOfChange = eventData.data.typeOfChange;\n var primaryKeys = eventData.data.primaryKeys;\n\n if (type === ChannelService.SUBSCRIBE_TYPE &&\n typeOfChange === 'updated' &&\n _.includes(primaryKeys, $scope.item.primaryKey__)) {\n\n var itemModified = $rootScope.hasItemModified();\n var message = $translate.instant(itemModified ? 'ITEM.UPDATED.UNSAVED_CHANGES' : $scope.isItemEditable ? 'ITEM.UPDATED.NO_CHANGES' : 'ITEM.UPDATED.NO_CHANGES_ANONYMOUS', {\n user: userName\n });\n\n var infoDialog = $dialogs.notify('ITEM.UPDATED.HEADER', message);\n infoDialog.result.then(function() {\n storeItemChanges();\n LocalStorage.setItem(TEMP_TASK, JSON.stringify($scope.task));\n $window.location.reload();\n });\n\n }\n\n }\n\n } else if (eventData.event === ChannelService.ITEM_EDITED_EVENT && eventData.identifier == $scope.item.primaryKey__) {\n\n if (type === ChannelService.SUBSCRIBE_TYPE) {\n\n if (item && userId && userId != $rootScope.user.userId) {\n\n // Stop 'transmit' queue and restart again to prevent sending out the changes\n stopTransmitItemChangesQueue();\n\n // In order to correctly filter collection attributes, we first have to create\n // an \"unfiltered\" item which can be used in the filter function!\n\n var unFilteredItem = angular.copy($scope.item);\n angular.extend(unFilteredItem, item);\n\n // Update current item and filter collection type attributes, if necessary\n angular.forEach(item, function(value, attributeName) {\n\n if (!_.isArray(value)) {\n $scope.item[attributeName] = value;\n return;\n }\n\n var attribute = $rootScope.dataModel.attribute(attributeName);\n if (_.isNil(attribute)) {\n $log.warn(\"edited item attribute '\" + attributeName + \"' was not found in data model\");\n $scope.item[attributeName] = value;\n return;\n }\n\n if (attribute.typeName === 'MultiReference') {\n // Filtering will be done in 'loadItemsForReference'\n $scope.item[attributeName] = value;\n $scope.loadItemsForReference(attribute, $scope.item, attribute.name);\n return;\n }\n\n // Filter collection, if necessary\n if ($scope.isAttributeReadonly(attribute)) {\n value = $rootScope.filterCollection(value, unFilteredItem, attribute);\n }\n\n $scope.item[attributeName] = value;\n\n });\n\n startTransmitItemChangesQueue();\n\n angular.forEach(item, function(value, field) {\n remoteEditedAttributes.addToSet(field);\n var attribute = $rootScope.dataModel.attribute(field);\n\n // Need to use 'sceParameters' sanitizing to keep the \"<\" characters of system users!\n $rootScope.currentItemMessage = $translate.instant($scope.isItemEditable ? 'USER_UPDATED_FIELD' : 'USER_UPDATED_FIELD_ANONYMOUS', {\n user: userName,\n field: attribute.translatedLabel || $rootScope.translateAttribute(attribute)\n }, null, null, \"sceParameters\");\n\n removeAfterTimeout('currentItemMessage');\n });\n\n }\n\n } else if (type === ChannelService.LISTEN_TYPE) {\n\n if (userId && userId !== $rootScope.user.id) {\n\n if (action === ChannelService.REGISTERED_ACTION) {\n\n // Need to use 'sceParameters' sanitizing to keep the \"<\" characters of system users!\n $rootScope.currentItemMessage = $translate.instant('USER_CONNECTED_TO_ITEM', {\n user: userName\n }, null, null, \"sceParameters\");\n\n removeAfterTimeout('currentItemMessage');\n $scope.connectedUserIds.addToSet(userId);\n\n } else if (action === ChannelService.UNREGISTERED_ACTION) {\n\n // Need to use 'sceParameters' sanitizing to keep the \"<\" characters of system users!\n $rootScope.currentItemMessage = $translate.instant('USER_DISCONNECTED_FROM_ITEM', {\n user: userName\n }, null, null, \"sceParameters\");\n\n removeAfterTimeout('currentItemMessage');\n $scope.connectedUserIds.removeFromSet(userId);\n\n }\n\n }\n\n }\n\n } else if (eventData.event === ChannelService.VALIDATION_FINISHED_EVENT && $scope.validationStatus == VALIDATION_STATUS_IS_DIRTY) {\n\n // Check if our item is included in validation finished event\n var validationResults = eventData.data.validationResults;\n if (_.has(validationResults, $scope.item.primaryKey__)) {\n reloadValidationResult();\n }\n\n }\n\n });\n\n function reloadValidationResult() {\n\n var message = $translate.instant('ITEM_EDITOR.RELOAD_VALIDATION_RESULT.MESSAGE');\n var infoDialog = $dialogs.notify('ITEM_EDITOR.RELOAD_VALIDATION_RESULT.HEADER', message);\n infoDialog.result.then(function() {\n\n // Reload validations and continue processing validation queue\n $scope.displayEditor = false;\n ItemResource.getValidationResult({ 'primaryKey': $scope.item.primaryKey__ }, function(itemResult) {\n\n $scope.validations = itemResult.validations;\n $scope.attributeStates = itemResult.attributeStates;\n _.forEach(itemResult.calculations, function (calculatedAttributeValue, attributeName) {\n $scope.item[attributeName] = calculatedAttributeValue;\n });\n setValidationStatus(null);\n\n $scope.categorySelected().then(function() {\n\n // Continue validation processor\n queueManager.getQueue('validateItemQueue').continueProcessor();\n\n }).finally(displayEditor);\n\n }, function() {\n displayEditor();\n });\n\n });\n\n }\n\n function setConnectedAccounts() {\n if (_.isEmpty($scope.connectedUserIds)) {\n $scope.connectedAccounts = [];\n } else {\n $scope.connectedAccounts = _.map($scope.connectedUserIds, function(userId) {\n var user = UsersService.getUser(userId);\n return {\n userId: user ? user.userId : userId,\n name: user ? user.displayName : userId,\n imageUrl: user ? user.imageUrl : null\n };\n });\n }\n }\n\n // Didn't know to make this work in 'karma'\n if ($scope.$watchCollection) {\n $scope.$watchCollection(\"connectedUserIds\", setConnectedAccounts);\n }\n $scope.$on(\"usersLoaded\", setConnectedAccounts);\n\n $scope.hasAttributeState = function(attribute, stateName) {\n if (_.isEmpty($scope.attributeStates)) {\n return false;\n }\n var states = $scope.attributeStates[(_.isObject(attribute) ? attribute.name : attribute)];\n return !_.isEmpty(states) && _.includes(states, stateName);\n };\n\n $scope.isAttributeReadonly = function(attribute) {\n\n // Item is not editable\n if (!$scope.isItemEditable) {\n return true;\n }\n\n // Attribute was set to 'readonly'\n if (_.isObject(attribute) && attribute.readonly) {\n return true;\n }\n\n // Attribute was added to list of readonly attributes (legacy function, rather use 'states' by now!)\n if (!_.isEmpty($scope.item.readonlyAttributes__) &&\n _.includes($scope.item.readonlyAttributes__, (_.isObject(attribute) ? attribute.name : attribute))) {\n return true;\n }\n\n // Attribute state 'readonly' is set\n return $scope.hasAttributeState(attribute, 'readonly');\n };\n\n $scope.isAttributeHidden = function isAttributeHidden(attribute) {\n if (!$scope.isAttributeVisible(attribute)) {\n return true;\n }\n\n // Attribute was set to 'hidden', via LayoutFilters for example.\n if (_.isObject(attribute) && attribute.hidden) {\n return true;\n }\n\n if ($scope.hasAttributeState(attribute, 'hidden')) {\n return true;\n }\n if (attribute.subAttributes && !_.isEmpty(attribute.subAttributes)) {\n return _.every(attribute.subAttributes, function (subAttribute) {\n return isAttributeHidden(subAttribute);\n });\n }\n return false;\n };\n\n $scope.isAllAttributesHidden = function(attributes) {\n if (_.isEmpty(attributes)) {\n return true;\n }\n var allHidden = _.every(attributes, function(attribute) {\n return $scope.isAttributeHidden(attribute);\n });\n return allHidden;\n };\n\n $scope.initAttributesForSearch = function(forceRecalc) {\n if (forceRecalc) {\n $scope.allAttributes = [];\n $scope.searchableSubAttributes = [];\n }\n if (_.isEmpty($scope.allAttributes.length)) {\n var memberAttributes = [];\n // First add the root attributes\n _.forEach($scope.sections, function(section) {\n _.forEach(section.attributes, function(attribute) {\n if (!_.some($scope.allAttributes, {name: attribute.name})) {\n $scope.allAttributes.push(attribute);\n }\n _.forEach(attribute.memberAttributes, function (subAttribute) {\n memberAttributes.push(subAttribute);\n });\n });\n });\n // Then add the sub-attributes\n _.forEach(memberAttributes, function (subAttribute) {\n if (!_.some($scope.allAttributes, {name: subAttribute.name}) &&\n !_.some($scope.searchableSubAttributes, {name: subAttribute.name})) {\n $scope.searchableSubAttributes.push(subAttribute);\n }\n });\n }\n };\n\n $scope.getAttributeSearchList = function (){\n return _.concat($scope.allAttributes, $scope.searchableSubAttributes);\n };\n\n $scope.updateHiddenForSearchAttributes = function() {\n if (_.isEmpty($scope.allAttributes)) {\n return;\n }\n _.forEach($scope.allAttributes, function(attribute) {\n attribute.hidden = $scope.isAttributeHidden(attribute);\n });\n _.forEach($scope.searchableSubAttributes, function(subAttribute) {\n subAttribute.hidden = $scope.isAttributeHidden(subAttribute);\n });\n };\n\n $scope.queryAdditionalCategories = function(query, attribute, leaf, limit) {\n var dataModel = _.get(attribute.params, 'additionalModule');\n var extension = _.get(attribute.params, 'extension');\n leaf = leaf || null;\n var result = $rootScope.queryCategories(query, dataModel, extension, leaf, limit);\n return result;\n };\n\n $scope.updateAdditionalCategoryAttributes = function(item, attributes) {\n return loadAdditionalSectionAttributes($scope.currentLayout, item);\n };\n\n function loadAdditionalSectionAttributes(layout, item) {\n var defer = $q.defer();\n AdditionalCategoryAttributeService.loadAdditionalSectionAttributes(layout, item, function(additionalSectionAttributes) {\n setSections(layout, item, additionalSectionAttributes);\n defer.resolve();\n });\n return defer.promise;\n }\n\n function setSections(layout, item, additionalSectionAttributes) {\n\n UrlRetrievalService.clear();\n\n var sections = [];\n sections = $rootScope.dataModel.filteredSections(layout, item, additionalSectionAttributes);\n var rowLength = 0;\n angular.forEach(sections, function(section) {\n\n section.rows = [];\n var row = [];\n angular.forEach(section.attributes, function(attribute, index) {\n\n // add member-attributes to allowing searching them\n attribute.memberAttributes = [];\n if (_.includes(['Collection', 'MultiDimensional', 'Group'], attribute.typeName)) {\n attribute.memberAttributes = $rootScope.dataModel.getMemberAttributes(attribute);\n }\n\n $rootScope.setInputRenderer(attribute);\n $rootScope.prepareAttribute(attribute, true);\n\n if (item.category__) {\n // Pull 'readonly' and 'hidden' params from 'additionalParams', if any.\n $rootScope.setSectionAttributeParam($scope.currentLayout, section.name, attribute, 'hidden', null, $scope.item);\n $rootScope.setSectionAttributeParam($scope.currentLayout, section.name, attribute, 'readonly', null, $scope.item);\n }\n $rootScope.setSectionAttributeParam($scope.currentLayout, section.name, attribute, 'labelWidth', 4, $scope.item);\n $rootScope.setSectionAttributeParam($scope.currentLayout, section.name, attribute, 'inputWidth', 8, $scope.item);\n $rootScope.setSectionAttributeParam($scope.currentLayout, section.name, attribute, 'iconSize', '1em', $scope.item);\n $rootScope.setSectionAttributeParam($scope.currentLayout, section.name, attribute, 'valuesFormat', ['label', 'key'], $scope.item);\n\n attribute.isComplexType = (attribute.typeName == 'Collection' || attribute.typeName ==\n 'MultiDimensional' || attribute.typeName == 'MultiReference');\n\n var needsFullRowRendering = attribute.isComplexType && attribute.params.rendererParams.type !== 'Group';\n if (needsFullRowRendering) {\n attribute.inputWidth += attribute.labelWidth;\n attribute.labelWidth = 0;\n }\n\n attribute.labelClass = (attribute.labelWidth !== 0) ? 'col-sm-' + attribute.labelWidth : \"\";\n attribute.inputClass = 'col-sm-' + attribute.inputWidth;\n\n $rootScope.filterAttributeParams(attribute, item, $rootScope.user, $scope.organization);\n\n rowLength += (attribute.labelWidth + attribute.inputWidth);\n row.push(attribute);\n\n if (rowLength >= 12) {\n section.rows.push(row);\n rowLength = 0;\n row = [];\n }\n });\n });\n\n if ($scope.sections) {\n\n var scopeIndex = 0;\n var isOpen = false;\n\n // Update the sections array directly to improve performance\n for (var index = 0; index < sections.length; index++) {\n\n var currentSection = sections[index];\n var isEmpty = _.isEmpty(currentSection.attributes);\n\n var scopeSection = $scope.sections[scopeIndex];\n var isEqual = scopeSection && currentSection.name == scopeSection.name;\n\n if (isEqual && !isEmpty) {\n isOpen = (isOpen || scopeSection.isOpen);\n currentSection.isOpen = scopeSection.isOpen;\n $scope.sections[scopeIndex++] = currentSection;\n } else if (isEqual && isEmpty) {\n // Delete section\n $scope.sections.splice(scopeIndex, 1);\n } else if (!isEmpty) {\n // Add section\n $scope.sections.splice(scopeIndex++, 0, currentSection);\n }\n\n }\n\n if (!isOpen && $scope.sections.length > 0) {\n $timeout(function() {\n $scope.sections[0].isOpen = true;\n }, 1);\n }\n\n } else {\n $scope.sections = sections.filter(function(section) {\n return !_.isEmpty(section.attributes);\n });\n if ($scope.sections.length > 0) {\n $timeout(function() {\n $scope.sections[0].isOpen = true;\n }, 1);\n }\n }\n $rootScope.translateAllSections($scope.sections);\n\n $scope.initAttributesForSearch(true);\n $scope.sectionToFocus = $scope.sectionToFocus || $scope.currentSection;\n $scope.attributeToFocus = $scope.attributeToFocus || $scope.currentAttribute;\n\n }\n\n $scope.categorySelected = function() {\n var deferred = $q.defer();\n\n var selectedCategoryName = $scope.item.category__;\n $rootScope.lastSelectedCategory = $scope.item.category__;\n\n // Load and setup layout sections, if either primary key is set, or category and layout is known\n if (!_.isEmpty(selectedCategoryName) &&\n $rootScope.dataModel.hasCategory(selectedCategoryName) &&\n $rootScope.dataModel.hasLayout($scope.currentLayout, $scope.item)) {\n\n // Load default item, if item is new\n if ($scope.isNewItem && !$scope.isCopiedItem) {\n queueManager.getQueue('validateItemQueue').pauseProcessor();\n\n var defaultItem = $rootScope.dataModel.getDefaultItem(selectedCategoryName, $scope.organization.id, $rootScope.user.id);\n\n if (defaultItem) {\n // we need to use this verbose extend syntax here, to ensure that the item-data\n // is not overwritten by the default-item\n $scope.item = angular.extend({}, angular.copy(defaultItem), $scope.item);\n\n loadAdditionalSectionAttributes($scope.currentLayout, $scope.item).then(function() {\n setCategories(selectedCategoryName);\n deferred.resolve();\n });\n\n queueManager.getQueue('validateItemQueue').continueProcessor();\n } else {\n DefaultItemResource.get({\n category: selectedCategoryName\n }, function (defaultItem) {\n $rootScope.dataModel.setDefaultItem(selectedCategoryName, defaultItem.toJSON(), $scope.organization.id, $rootScope.user.id);\n $scope.item = angular.extend({}, defaultItem.toJSON());\n\n loadAdditionalSectionAttributes($scope.currentLayout, $scope.item).then(function() {\n setCategories(selectedCategoryName);\n deferred.resolve();\n });\n\n queueManager.getQueue('validateItemQueue').continueProcessor();\n });\n }\n } else {\n loadAdditionalSectionAttributes($scope.currentLayout, $scope.item).then(function() {\n setCategories(selectedCategoryName);\n deferred.resolve();\n });\n }\n\n } else {\n $scope.sections = [];\n setCategories(selectedCategoryName).then(function() {\n deferred.resolve();\n });\n }\n\n return deferred.promise;\n\n };\n\n function setCategories(selectedCategoryName) {\n\n var callCategorySelected = false;\n\n if (_.isEmpty($scope.allCategories)) {\n var actions = ($scope.isCopiedItem || $scope.isNewItem) ? 'create' : 'edit';\n _.forEach($rootScope.dataModel.allCategories(), function(category) {\n if (selectedCategoryName == category.name ||\n Auth.hasAnyPermission(Auth.OBJECT_TYPE_ITEMS, actions, {category__: category.name})) {\n $scope.allCategories.push(category);\n }\n });\n $rootScope.translateAllCategories($scope.allCategories);\n }\n\n if ($scope.allCategories.length == 1 && !_.isEmpty($scope.allCategories[0].name)) {\n $scope.showCategorySection = false;\n if (_.isNil($scope.item.category__)) {\n $scope.item.category__ = $scope.allCategories[0].name;\n callCategorySelected = true;\n }\n }\n\n if (callCategorySelected) {\n return $scope.categorySelected();\n } else {\n\n // Set the editable state only once\n if (_.isNil($scope.isItemEditable)) {\n $scope.isItemEditable = $scope.isCopiedItem || $scope.isNewItem || $scope.hasEditItemRights();\n }\n\n return $q.resolve();\n }\n\n }\n\n $scope.hasEditItemRights = function() {\n return Auth.hasRights('edit.items', 'create.items', 'copy.items') && Auth.hasItemPermission('edit', $scope.item);\n };\n\n $scope.saveItemForTask = function(item, taskOptions) {\n $scope.saveItem(item, function(result) {\n result.taskOptions = taskOptions;\n executeCloseEditor(result);\n });\n };\n\n $scope.saveWithoutClose = function(item) {\n $scope.saveItem(item, function(result) {\n $scope.item = result.item;\n stopItemChangesQueues();\n startItemChangesQueues();\n });\n };\n\n $scope.saveItem = function(item, callback) {\n\n if (!_.isEmpty($scope.localValidations)) {\n var attributeLabels = $scope.getAttributeLabelsForLocalValidations();\n growl.error($translate.instant('LOCAL_VALIDATION.CAN_NOT_SAVE_ITEM') + attributeLabels);\n return;\n }\n\n if (_.isNil(callback)) {\n callback = function(result) {\n executeCloseEditor(result);\n };\n }\n\n if (!$scope.isItemEditable) {\n executeSave(null, callback);\n return;\n }\n\n var itemModified = $rootScope.hasItemModified();\n if (itemModified) {\n\n $scope.saving = true;\n\n var itemToSave = $rootScope.cleanupItem(item);\n\n // For compatibility with old data models that are not using the group-in-group functionality,\n // we have to make sure that \"Object\" or \"Array\" like values of \"String\" attributes are not stored as such,\n // but rather \"stringified\" before storing!\n itemToSave = $rootScope.stringifyDeepValues(itemToSave);\n\n if ($scope.vm.desiredAuditStatus != itemToSave.audited__) {\n ItemResource.audit({\n primaryKey: itemToSave.primaryKey__,\n status: $scope.vm.desiredAuditStatus\n },\n function(response) {\n itemToSave.audited__ = $scope.vm.desiredAuditStatus;\n executeSave(itemToSave, callback);\n },\n function(error) {\n growl.error('SAVE_ERROR_MESSAGE');\n }\n );\n } else {\n executeSave(itemToSave, callback);\n }\n\n } else {\n executeSave(null, callback);\n }\n\n };\n\n function executeSave(itemToSave, callback) {\n\n var result;\n\n if ($scope.checkItemModified()) {\n var isUnique = $scope.isCopiedItem || $scope.isNewItem;\n ItemResource.save({\n merge: true,\n unique: isUnique\n },\n itemToSave,\n function(item) {\n\n growl.success(\"SAVE_SUCCESS_MESSAGE\");\n if (isUnique) {\n $rootScope.$broadcast('updateOrganizationUsageLimit', 1);\n }\n\n result = {\n action: 'itemChanged',\n item: item\n };\n callback(result);\n\n },\n function(response) {\n $scope.status = response.status;\n if (response.data.message) {\n $scope.errorMessage = $translate.instant(response.data.message, response.data.parameters);\n growl.error($scope.errorMessage);\n } else {\n growl.error(\"SAVE_ERROR_MESSAGE\");\n }\n }\n ).$promise.finally(function() {\n $scope.saving = false;\n });\n } else if (!_.isNil(itemToSave)) {\n growl.success(\"SAVE_SUCCESS_MESSAGE\");\n result = {\n action: 'itemChanged',\n item: itemToSave\n };\n callback(result);\n $scope.saving = false;\n } else {\n result = {\n action: 'itemUnchanged',\n item: null\n };\n callback(result);\n $scope.saving = false;\n }\n\n }\n\n $scope.$on('$routeChangeStart', function($event, next, current) {\n if (next.originalPath === \"/exports\") {\n $modalInstance.dismiss({});\n }\n });\n\n $scope.closeEditor = function(result) {\n $scope.resetEditor();\n\n if ($scope.closing) {\n return;\n }\n $scope.closing = true;\n result = result || {action: 'cancel'};\n\n if (!$scope.isItemEditable || !$rootScope.hasItemModified()) {\n executeCloseEditor(result);\n $scope.closing = false;\n } else {\n var confirmDialog = $dialogs.confirm('MODAL.CONFIRM_HEADER', 'MODAL.DISMISS_WITH_UNSAVED_CHANGES');\n confirmDialog.result.then(function() {\n executeCloseEditor(result);\n }).finally(function() {\n $scope.closing = false;\n });\n }\n\n };\n\n function executeCloseEditor(result) {\n\n close();\n\n $document.unbind(\"keydown keypress\");\n\n if (result.action === 'cancel') {\n $modalInstance.dismiss(result);\n } else {\n $modalInstance.close(result);\n\n if (params.forceCloseTask && result.taskOptions && result.taskOptions.closeTask) {\n var task = params.task;\n task.taskStatus = 'FINISHED';\n TaskResource.save({\n taskId: task.id\n }, task, function(response) {\n growl.success(\"TASK.SAVE_TASK_SUCCESS_MESSAGE\");\n $location.path(\"/tasks\").search('');\n });\n }\n }\n\n $rootScope.$broadcast('itemEditorClosed', result);\n\n }\n\n var closed = false;\n\n function close() {\n\n if (closed) {\n return;\n }\n\n stopItemChangesQueues();\n hopscotch.getCalloutManager().removeAllCallouts();\n\n LocalStorage.removeItem(TEMP_ITEM);\n\n if (!itemChangedEventRegistered) {\n ChannelService.unregister(ChannelService.ITEM_CHANGED_EVENT);\n }\n\n if (itemEditedEventRegistered && !_.isNil(itemEditedEventIdentifier)) {\n ChannelService.unregister(ChannelService.ITEM_EDITED_EVENT, itemEditedEventIdentifier, $scope.isItemEditable);\n }\n\n closed = true;\n\n }\n\n $scope.$on('$destroy', function() {\n close();\n });\n\n function getItem(primaryKey) {\n loadItem(ItemResource.get, {\n 'primaryKey': primaryKey,\n 'validate': LOAD_WITH_VALIDATIONS\n });\n }\n\n function copyItem(primaryKey) {\n loadItem(ItemResource.copy, {\n 'primaryKey': primaryKey,\n 'validate': LOAD_WITH_VALIDATIONS\n });\n }\n\n function loadItem(itemResourceMethod, itemResourceParams) {\n\n $scope.displayEditor = false;\n itemResourceMethod(itemResourceParams,\n function(itemResult) {\n\n stopItemChangesQueues();\n\n $scope.item = itemResult;\n if (itemResourceParams.validate) {\n $scope.attributeStates = itemResult.__attributeStates__ || {};\n delete itemResult.__attributeStates__;\n $scope.validations = itemResult.__validations__ || {};\n delete itemResult.__validations__;\n } else {\n $scope.attributeStates = {};\n $scope.validations = {};\n }\n\n setValidationStatus($scope.item.validation_dirty__ ? VALIDATION_STATUS_IS_DIRTY : null);\n\n $scope.vm.desiredAuditStatus = $scope.item.audited__;\n $scope.originalItem = angular.copy($scope.item);\n var layout = $rootScope.dataModel.layout($scope.currentLayout);\n var hideCategorySection = _.get(layout,'layoutOptions.hideCategorySection');\n $scope.showCategorySection = !hideCategorySection || _.isNil($scope.item.category__);\n var itemEditorService = $rootScope.getService(CUSTOM_ITEM_SERVICE);\n $scope.enableAudit = !itemEditorService || itemEditorService.enableAuditedButton($scope.item, $rootScope.user, $rootScope.organization);\n\n if ($rootScope.isDataModelLoaded) {\n itemLoaded();\n } else {\n $scope.$on('dataModelLoaded', itemLoaded);\n }\n\n },\n function(errorResponse) {\n displayEditor();\n $scope.status = errorResponse.status;\n growl.error(\"ERROR_LOADING_ITEM\");\n }\n );\n\n }\n\n function itemLoaded() {\n $scope.categorySelected()\n .then(startItemChangesQueues)\n .then(initHierarchyTabs)\n .finally(displayEditor);\n }\n\n function setValidationStatus(validationStatus) {\n if (_.isNil(validationStatus)) {\n var levels = _.countBy(_.flatten(_.values($scope.validations)), 'level' );\n $scope.validationErrors = _.toInteger(levels.Failure) + _.toInteger(levels.Error);\n $scope.validationWarnings = _.toInteger(levels.Warning);\n if ($scope.validationErrors > 0) {\n validationStatus = VALIDATION_STATUS_IS_NOT_COMPLIANT;\n } else {\n validationStatus = VALIDATION_STATUS_IS_COMPLIANT;\n }\n }\n $scope.validationStatus = validationStatus;\n }\n\n // Function to call when item changes are transmitted\n function processTransmitItem(itemChanges, item) {\n\n // Remove changed attribute from list of remote edited fields\n angular.forEach(itemChanges, function(value, attribute) {\n remoteEditedAttributes.removeByContent(attribute);\n });\n\n var data = {\n item: itemChanges,\n userId: $rootScope.user.userId\n };\n var broadcast = ChannelService.broadcast(ChannelService.ITEM_EDITED_EVENT, item.primaryKey__, data);\n\n return broadcast;\n }\n\n // Dummy method for old custom templates\n $scope.validateAttributes = function() {};\n\n $scope.undoChanges = [];\n $scope.redoChanges = [];\n $scope.undoChange = false;\n\n function undoRedoChange(popArr, pushArr, key) {\n var lastChange = popArr[popArr.length-1];\n if (!_.isNil(lastChange) && !_.isEmpty(lastChange.attrs)) {\n _.forEach(lastChange.attrs, function(attrName) {\n var attr = _.find($scope.allAttributes, {name : attrName}) || {};\n if ( (attr.typeName == \"Collection\" || attr.typeName == \"MultiDimensional\" || attr.typeName == \"MultiReference\") && _.isNil(lastChange[key][attrName])) {\n var row = _.get($scope.gridApiMap[\"item['\"+ attrName +\"']\"],'grid.rows[0]');\n if (!_.isNil(row)) {\n $scope.removeRow(row,attrName);\n }\n } else {\n $scope.item[attrName] = lastChange[key][attrName];\n if (attr.typeName === 'SingleReference') {\n var lastAttrChange = lastChange[key][attrName];\n // If the last change value is defined, add it using the single reference UI filter\n if (lastAttrChange) {\n $scope.addSingleReference({ primaryKey__: lastAttrChange }, attr, null, 'item[\"' + attr.name + '\"]');\n }\n // If the last change value is undefined, update the temporary model for typeahead\n else {\n $scope.temporaryModelForTypeahead[attrName] = lastAttrChange;\n }\n }\n }\n $scope.undoChange = true;\n });\n } else {\n $scope.undoChange = false;\n }\n pushArr.push(lastChange);\n popArr.pop();\n }\n\n $scope.undo = function() {\n undoRedoChange($scope.undoChanges,$scope.redoChanges,\"redo\");\n };\n\n $scope.redo = function() {\n undoRedoChange($scope.redoChanges,$scope.undoChanges,\"undo\");\n };\n\n // Function to call when item changes are validated\n function processValidateItem(itemChanges, item, previousItem) {\n var attributeNames;\n var change = {};\n if (Object.keys(previousItem).length === 0) {\n // 'previousItem' is empty on the first 'watch' call, so validate the complete item compared to original item\n attributeNames = null;\n previousItem = $scope.originalItem;\n } else if (itemChanges.category__) {\n // validate complete item when category is changed\n attributeNames = null;\n } else {\n // validate changed attributes only\n attributeNames = Object.keys(itemChanges);\n }\n // Checking and removing new option if it has empty content for dimensional types\n if (attributeNames) {\n _.forEach(attributeNames, function(attributeName) {\n var attribute = _.find($scope.allAttributes, function(attr) {\n return attr.name === attributeName;\n });\n if (!$rootScope.isEmpty(attribute) && attribute.typeName == 'Dimensional' && attribute.options && item[attributeName]) {\n _.forEach(item[attributeName], function(lan,key) {\n var option = _.find(attribute.options, {key: key});\n // remove if it is new option and empty\n if (!option && $rootScope.isEmpty(item[attributeName][key])) {\n delete item[attributeName][key];\n }\n });\n }\n if ($scope.undoChange && !$rootScope.isEmpty(attribute) && attribute.typeName == 'AdditionalCategory' && item[attributeName]) {\n $scope.updateAdditionalCategoryAttributes($scope.item, attributeName);\n }\n });\n }\n if (!_.isEmpty(attributeNames) && !$scope.undoChange) {\n change.attrs = attributeNames;\n change.redo = {};\n change.undo = {};\n _.forEach(attributeNames, function(attrName) {\n change.redo[attrName] = previousItem[attrName];\n change.undo[attrName] = item[attrName];\n });\n $scope.undoChanges.push(change);\n $scope.redoChanges = [];\n }\n $scope.undoChange = false;\n\n setValidationStatus(VALIDATION_STATUS_IS_RUNNING);\n var oldAttributeStates = angular.copy($scope.attributeStates);\n var validateItem =\n ValidateItemService.validateItem($scope,\n $scope.item,\n item,\n previousItem,\n $scope.attributeStates,\n $scope.validations,\n attributeNames,\n function() {\n // Pause the validation queue once the validation result is back\n // so we don't register any change due to the validation response (calculated attributes)\n queueManager.getQueue('validateItemQueue').pauseProcessor();\n });\n validateItem.$promise.then(function() {\n setValidationStatus(null);\n\n // Skip a digest cycle to make sure that the item changes due to\n // the validation calculated attributes (if any) are flushed into the queue\n $timeout(function() {\n queueManager.getQueue('validateItemQueue').continueProcessor();\n }, 0);\n\n // Re-render grids to show/hide any member attributes of complex types that\n // has a state change due to the validation\n $scope.rerenderGrid(oldAttributeStates,$scope.attributeStates);\n }, function() {\n setValidationStatus(VALIDATION_STATUS_IS_DIRTY);\n queueManager.getQueue('validateItemQueue').pauseProcessor();\n });\n\n return validateItem.$promise;\n }\n\n function removeReadonlyAttributes(item) {\n\n // Remove readonly attribute values\n _.forEach(item, function(value, attributeName) {\n var attribute = $rootScope.dataModel.attribute(attributeName);\n if ($scope.isAttributeReadonly(attribute || attributeName)) {\n delete item[attributeName];\n }\n });\n\n return item;\n }\n\n function preprocessItemChanges(item) {\n item = angular.copy(item);\n item = removeReadonlyAttributes(item);\n return item;\n }\n\n // Create queues for transmitting, validating and storing changes\n var queueManager = new ItemChangesQueueManager();\n queueManager.createQueue('transmitItemQueue', 300, $scope.isNewItem ? null : processTransmitItem, null, preprocessItemChanges);\n queueManager.createQueue('validateItemQueue', 300, processValidateItem);\n queueManager.createQueue('storeItemQueue', null, null, null, preprocessItemChanges);\n\n function startTransmitItemChangesQueue() {\n queueManager.startQueue('transmitItemQueue', $scope.item);\n }\n\n function stopTransmitItemChangesQueue() {\n queueManager.stopQueue('transmitItemQueue');\n }\n\n function startItemChangesQueues() {\n\n startTransmitItemChangesQueue();\n queueManager.startQueue('validateItemQueue', LOAD_WITH_VALIDATIONS ? $scope.item : {}); // Starting the queue on an empty item also validates the complete item\n if ($scope.isCopiedItem) {\n queueManager.startQueue('storeItemQueue', {}); // Starting the queue on a copied item checks all copied values\n } else {\n queueManager.startQueue('storeItemQueue', $rootScope.cleanupItem($scope.item));\n }\n queueManager.startWatch($scope, 'item', function(item) {\n // Watch on changes of cleaned up item (i.e. remove transient values of multi-ref attributes)\n return $rootScope.cleanupItem(item);\n });\n\n // Pause validation, until item is no longer 'dirty'\n if ($scope.validationStatus == VALIDATION_STATUS_IS_DIRTY) {\n queueManager.getQueue('validateItemQueue').pauseProcessor();\n }\n\n var cachedItem = JSON.parse(LocalStorage.getItem(TEMP_ITEM));\n $log.debug(\"cachedItem:\", cachedItem);\n if (!_.isEmpty(cachedItem) &&\n cachedItem.primaryKey__ == params.itemPrimaryKey) {\n angular.extend($scope.item, cachedItem);\n }\n LocalStorage.removeItem(TEMP_ITEM);\n\n }\n\n function stopItemChangesQueues() {\n queueManager.stop();\n }\n\n $rootScope.hasItemModified = function() {\n return $scope.checkItemModified() || $scope.vm.desiredAuditStatus != $scope.item.audited__;\n };\n\n $scope.checkItemModified = function() {\n if (!$scope.isItemEditable) {\n return false;\n }\n // Check if any changes were made\n var storeItemQueue = queueManager.getQueue('storeItemQueue');\n return storeItemQueue.hasQueuedItemChanges();\n };\n\n var itemEditedEventIdentifier = null;\n\n if (!_.isNil(params.itemPrimaryKey)) {\n itemEditedEventIdentifier = params.itemPrimaryKey;\n getItem(params.itemPrimaryKey);\n } else if (!_.isNil(params.origPrimaryKey)) {\n copyItem(params.origPrimaryKey);\n } else {\n\n $scope.item = new ItemResource();\n $scope.originalItem = {};\n $scope.attributeStates = {};\n $scope.validations = {};\n\n // Start the changes queues before setting the category, so that a modification is detected right away\n startItemChangesQueues();\n\n $scope.item.category__ = params.category || $rootScope.lastSelectedCategory;\n $scope.categorySelected().finally(displayEditor);\n\n }\n\n // Watch on 'displayEditor' variable for a delayed initialization of events.\n // Otherwise $scope.$on('destroy') can be faster when reloading or switching to another item!\n if ($scope.$watch) {\n var deregisterWatchDisplayEditor = $scope.$watch('displayEditor', function(newValue, oldValue) {\n if (newValue && newValue != oldValue) {\n init();\n deregisterWatchDisplayEditor();\n }\n });\n }\n\n var itemChangedEventRegistered = false;\n var itemEditedEventRegistered = false;\n\n function init() {\n\n $document.bind(\"keydown keypress\", function (evt) {\n if (evt.which === 27 && !$rootScope.additionalModalOpen) {\n var form = evt.currentTarget.activeElement.form;\n if (_.isNil(form) || form.name !== 'inputForm') {\n $scope.closeEditor();\n }\n }\n });\n\n itemChangedEventRegistered = ChannelService.isRegistered(ChannelService.ITEM_CHANGED_EVENT);\n if (!itemChangedEventRegistered) {\n ChannelService.register(ChannelService.ITEM_CHANGED_EVENT);\n }\n\n if (!_.isNil(itemEditedEventIdentifier)) {\n\n // Register to edited events and only listen to users connecting/disconnecting if item editable\n ChannelService.register(ChannelService.ITEM_EDITED_EVENT, itemEditedEventIdentifier, $scope.isItemEditable);\n\n // Only set list of editing users, if item is editable\n if ($scope.isItemEditable) {\n ChannelService.getRegistered(ChannelService.ITEM_EDITED_EVENT, itemEditedEventIdentifier).then(function(response) {\n $log.debug(\"getRegistered(ChannelService.ITEM_EDITED_EVENT,\", itemEditedEventIdentifier, \"):\", response);\n $scope.connectedUserIds = _.filter(response, function(userId) {\n return userId != $rootScope.user.id;\n });\n });\n }\n\n itemEditedEventRegistered = true;\n }\n\n }\n\n function checkModel(model, attributeName) {\n if (_.isEqual(\"item[a.name]\", model)) {\n model = \"item['\" + attributeName + \"']\";\n } else if (!_.includes(model, \"'\")) {\n model = model.replace(/\\[/g, \"['\");\n model = model.replace(/\\]/g, \"']\");\n model = model.replace(/\\'\\d+\\'/g, function (x) {\n return x.replace(/\\'/g, \"\");\n });\n }\n return model;\n }\n\n $scope.gridOptionsMap = {}; // Contains all the columnDefs on first/initial render (excluding columns of hidden attribute members), the map\n // key here is the attribute path, ex. `item[\"collection\"]` or `item[\"group\"][0][\"collection\"]`.\n $scope.gridApiMap = {}; // Contains all Angular-UI-Grid instances which are already rendered and are/were in viewport, the map\n // key here is the attribute path, ex. `item[\"collection\"]` or `item[\"group\"][0][\"collection\"]`.\n $scope.gridCache = {}; // Contains all the columnDefs (including hidden columns of attribute members), the cache key\n // here is the attribute name\n $scope.showGrid = {};\n\n $scope.initGridOptions = function(attributeDefinition, item, name, model, config) {\n\n var memberAttributes = $rootScope.dataModel.getMemberAttributes(attributeDefinition, true);\n\n // Nothing to show\n if (_.isEmpty(memberAttributes)){\n return false;\n }\n\n model = checkModel(model, name);\n\n // We can only filter the grid-like attributes when in read-only state so\n // we don't trigger a data change in the editor after the filtration.\n var doFilter = $scope.isAttributeReadonly(attributeDefinition) &&\n !_.includes(attributeDefinition.typeName, 'MultiReference');\n var data = $rootScope.getItemGridData(attributeDefinition, item, name, model, doFilter, $scope);\n var modelEval = $parse(model);\n modelEval.assign($scope, data);\n\n var isNewItem = _.isNil(item.primaryKey__);\n\n var options = $rootScope.getOptions($scope, attributeDefinition, memberAttributes, data, config, model);\n\n // We keep a copy of the columnDefs in case we need to force a re-render of the grid, while\n // keeping one instance of the cached columns. For example in a group, the attribute columns\n // would be defined multiple times, and we only need one.\n if (_.isNil($scope.gridCache[attributeDefinition.name])) {\n $scope.gridCache[attributeDefinition.name] = angular.copy(options);\n }\n\n // Now we can remove the 'hidden' member attributes\n var visibleMemberAttributes = _.filter(memberAttributes, function (memberAttribute) {\n return !$scope.isAttributeHidden(memberAttribute);\n });\n\n options.columnDefs =\n _.filter(options.columnDefs, function(columnDef) {\n\n if (_.isNil(columnDef.attribute)) {\n // non-datamodel based columns, ex: 'Actions' column\n return true;\n }\n\n return _.includes(visibleMemberAttributes, columnDef.attribute && columnDef.attribute.name);\n });\n\n if (data && data.length > 0) {\n if (data.length >= 10) {\n options.minRowsToShow = 10;\n } else {\n options.minRowsToShow = data.length + 1;\n }\n } else {\n options.minRowsToShow = (attributeDefinition.defaultValue && isNewItem) ? attributeDefinition.defaultValue.length : 1;\n }\n\n options.baseOnRegisterApi = options.onRegisterApi || undefined;\n\n options.onRegisterApi = function(gridApi) {\n // If onRegisterApi is already defined, apply it and then apply any further extensions.\n if (!_.isNil(options.baseOnRegisterApi)) {\n options.baseOnRegisterApi(gridApi);\n }\n\n if (gridApi.cellNav) {\n gridApi.cellNav.on.viewPortKeyDown($scope, function($event, rowCol) {\n if ($event.keyCode === 32) {\n $event.preventDefault();\n\n var uiGridCell = gridApi.cellNav.getFocusedCell();\n var id = \"#cell-\" + uiGridCell.col.grid.renderContainers.body.visibleRowCache.indexOf(uiGridCell.row) + \"-\" + uiGridCell.col.grid.renderContainers.body.visibleColumnCache.indexOf(uiGridCell.col);\n var htmlCell = angular.element('body').find(id);\n var checkbox = htmlCell.find('.checkbox-inline');\n\n if (checkbox.length > 0 ) {\n $scope.$emit('laxGridStartCellEdit', uiGridCell.row, uiGridCell.col);\n htmlCell.children().focus();\n checkbox.select();\n checkbox.trigger('click');\n }\n }\n });\n }\n\n $scope.gridApiMap[model] = gridApi;\n\n var gridStateKey = GRID_STATE_KEY_PREFIX + model;\n $rootScope.initGridState($scope, gridApi, gridStateKey, null, options.columnDefs);\n\n };\n\n $scope.gridOptionsMap[model] = options;\n\n $timeout(function() {\n model = checkModel(model, name);\n $scope.showGrid[model] = true;\n }, 1);\n\n return true;\n };\n\n $scope.getGridData = function(model, attribute) {\n model = checkModel(model, attribute.name);\n return $scope.gridOptionsMap[model];\n };\n\n $scope.getShowGrid = function(model, attribute) {\n model = checkModel(model, attribute.name);\n return $scope.showGrid[model];\n };\n\n //Clears the sorting configuration for the specified grid model and updates the grid state.\n $scope.removeSort = function (model) {\n var gridStateKey = GRID_STATE_KEY_PREFIX + model;\n var gridState = JSON.parse(localStorage.getItem(gridStateKey));\n\n if (!gridState || !gridState.columns) {\n return;\n }\n\n gridState.columns.forEach(function (column) {\n if (column.sort) {\n column.sort = {};\n }\n });\n\n localStorage.setItem(gridStateKey, angular.toJson(gridState));\n\n var gridApi = $scope.gridApiMap[model];\n if (!gridApi) {\n return;\n }\n\n gridApi.grid.columns.forEach(function (column) {\n column.sort = undefined;\n });\n\n gridApi.grid.refresh();\n\n $timeout(function () {\n $scope.gridOptionsMap[model].columnDefs = angular.copy($scope.gridOptionsMap[model].columnDefs);\n }, 0);\n };\n\n $scope.addElementToTableModel = function(attributeDefinition, model) {\n model = checkModel(model, attributeDefinition.name);\n\n $scope.removeSort(model);\n\n var modelEval = $parse(model);\n var rows = modelEval($scope)|| [];\n rows.push({});\n if (rows.length < 10) {\n $scope.gridOptionsMap[model].minRowsToShow++;\n }\n\n $timeout(function() {\n var gridApi = $scope.gridApiMap[model];\n if (!gridApi) {\n return;\n }\n var lastElement = rows[rows.length - 1];\n var columnDefsElement = $scope.gridOptionsMap[model].columnDefs[0];\n if (gridApi.cellNav) {\n gridApi.cellNav.scrollToFocus(lastElement, columnDefsElement);\n } else {\n gridApi.core.scrollTo(lastElement, columnDefsElement);\n }\n }, 0);\n };\n\n $scope.removeSingleDimension = function(attributeDefinition, model, dimension) {\n if (!_.isNil(attributeDefinition) && !_.isNil(model) && !_.isNil(dimension)) {\n model = checkModel(model, attributeDefinition.name);\n var modelEval = $parse(model);\n var attribute = modelEval($scope);\n if (attribute) {\n delete attribute[dimension.key];\n if (_.isEmpty(attribute)){\n clearAttribute(attributeDefinition.name, attribute);\n }\n }\n }\n };\n\n $scope.removeAttributeValueConfirmation = function(attr, cbk) {\n var modalInstance = $modal.open({\n templateUrl: 'tpl/confirm-delete-attribute-value-modal.tpl.html',\n controller: 'ModalInstanceCtrl',\n backdrop: true,\n resolve: {\n data: function() {\n var data = {\n attribute: attr,\n scope : $scope\n };\n return data;\n }\n }\n });\n modalInstance.result.then(function(result) {\n if (result) {\n cbk();\n }\n });\n };\n\n $scope.removeRow = function(row, attributeName) {\n var model = row.grid.options.data;\n model = checkModel(model, attributeName);\n var modelEval = $parse(model);\n\n if (!$scope.disableDeleteConfirmation) {\n var attr = $rootScope.dataModel.attribute(attributeName);\n $scope.removeAttributeValueConfirmation(attr,function() {\n\n var rows = modelEval($scope);\n if (rows.length > 0 && rows.length <= 10) {\n $scope.gridOptionsMap[model].minRowsToShow--;\n }\n _.remove(rows, row.entity);\n });\n } else {\n var rows = modelEval($scope);\n if (rows.length > 0 && rows.length <= 10) {\n $scope.gridOptionsMap[model].minRowsToShow--;\n }\n _.remove(rows, row.entity);\n }\n };\n\n $scope.uploadFileForItem = function(attributeName, sectionName, type, model) {\n var config = {};\n switch (type) {\n case \"Image\":\n config = {\n autoUpload: true,\n filters: ['imageFilter'],\n accept: 'image/jpeg,image/gif,image/png,image/svg+xml,image/bmp,image/tiff,image/webp,application/pdf'\n };\n var maxFileSize = $scope.dataModel.sectionAttributeParam($scope.currentLayout, sectionName, attributeName, 'maxFileSize');\n if (maxFileSize) {\n config.filters.push('maxFileSizeFilter');\n config.maxFileSize = maxFileSize;\n }\n break;\n case \"Document\":\n config = {\n autoUpload: true\n };\n break;\n }\n\n var attribute = $scope.dataModel.attribute(attributeName);\n var publicAsset = !(attribute && attribute.params.confidential === true);\n model = checkModel(model, attributeName);\n\n var uploadUrl = AssetFoldersService.getDefaultUploadUrl();\n return angular.extend({\n url: uploadUrl,\n reset: true,\n formData: [],\n noNameEncoding: true,\n useFilename: true,\n disableDragAndDrop: attribute.params.disableDragAndDrop,\n uploadComplete: function(response) {\n var modelEval = $parse(model);\n if (publicAsset) {\n return AssetFoldersService.getPublicAssetUrlAsync(response, response.path)\n .then(function(linkedPublicAsset) {\n modelEval.assign($scope, linkedPublicAsset.publicAssetUrl);\n return linkedPublicAsset; // Return the public asset URL\n })\n .catch(function(error) {\n $log.error(error);\n });\n } else {\n modelEval.assign($scope, response.privateAssetUrl);\n return response; // Resolve with the private asset URL\n }\n },\n onErrorItem: function(item, response, status, headers) {\n $log.error(response);\n\n if (!_.isNil(response.errorCode)) {\n growl.error(response.message, { variables : { name: item.file.name } });\n } else {\n growl.error(\"ASSET_FOLDER.ERROR_OCCURRED\");\n }\n },\n onFileSelected: function(linkedAsset, linkedAssetPath, done) {\n if (publicAsset) {\n AssetFoldersService.getPublicAssetUrlAsync(linkedAsset, linkedAssetPath)\n .then(function(linkedPublicAsset) {\n done(linkedPublicAsset);\n }, function(error) {\n $log.error(error);\n });\n } else {\n done(linkedAsset);\n }\n }\n }, config);\n };\n\n $scope.getSectionValidationMessages = function(section) {\n\n section.validationCount = 0;\n section.validationErrorCount = 0;\n section.validationWarningCount = 0;\n\n var validationErrors = \"\";\n var validationFailures = \"\";\n var validationWarnings = \"\";\n angular.forEach(section.attributes, function(attribute) {\n var validations = $scope.validations[attribute.name];\n if (validations && !$scope.isAttributeHidden(attribute) ) {\n angular.forEach(validations, function(validation) {\n var validationName = attribute.name + \":\" + validation.name;\n var validationLabel = (validation.translatedLabel || $rootScope.translateValidationLabel(validationName));\n var message = \"\\n
  • \" + validationLabel + \"
  • \";\n if(attribute.typeName == \"Group\"){\n message = _.replace(message, attribute.name, validation.path[validation.path.length-1]);\n }\n section.validationCount++;\n if (validation.level === 'Error') {\n validationErrors += message;\n section.validationErrorCount++;\n } else if (validation.level === 'Failure') {\n validationFailures += message;\n section.validationErrorCount++;\n } else if (validation.level === 'Warning') {\n validationWarnings += message;\n section.validationWarningCount++;\n }\n });\n }\n });\n\n return \"\";\n };\n\n $scope.hasValidations = function(section) {\n\n var hasValidations = false;\n\n // use for loop since there is no break for angular.forEach()\n for (var i = 0; i < section.attributes.length; i++) {\n var attribute = section.attributes[i];\n validations = $scope.validations[attribute.name];\n if (validations) {\n if (validations.length !== 0) {\n hasValidations = true;\n // exit loop and show validation icon\n break;\n }\n }\n }\n\n return hasValidations;\n };\n\n $scope.hasOnlyValidationWarnings = function(attributeName) {\n var attributeValidations = $scope.validations[attributeName];\n var hasWarningsOnly = false;\n\n if (attributeValidations) {\n for (var i = 0; i < attributeValidations.length; i++) {\n var validation = attributeValidations[i];\n if (!hasWarningsOnly && validation.level === 'Warning') {\n hasWarningsOnly = true;\n } else if (validation.level === 'Failure' || validation.level === 'Error') {\n hasWarningsOnly = false;\n break;\n }\n }\n }\n\n return hasWarningsOnly;\n };\n\n $scope.currentSection = null;\n $scope.currentAttribute = null;\n\n $scope.focusSection = function(section) {\n\n $log.debug(\"focusSection: section=\", section,\n \", $scope.sectionToFocus=\", $scope.sectionToFocus,\n \", $scope.attributeToFocus=\", $scope.attributeToFocus);\n\n if ($scope.isSectionOpen(section) && $scope.attributeToFocus) {\n $scope.currentSection = section.name;\n focusOn($scope.attributeToFocus);\n }\n\n $scope.sectionToFocus = null;\n $scope.attributeToFocus = null;\n\n };\n\n $scope.isSectionOpen = function(section) {\n\n // Don't focus, if all attributes are hidden\n if ($scope.isAllAttributesHidden(section.attributes)) {\n return false;\n }\n\n var hasSectionToFocus = !_.isNil($scope.sectionToFocus);\n var hasAttributeToFocus = !_.isNil($scope.attributeToFocus);\n\n if (!hasSectionToFocus && !hasAttributeToFocus) {\n\n // Find first non hidden attribute, if available\n attribute = _.find(section.attributes, function(attribute) {\n if (!$scope.isAttributeHidden(attribute)) {\n return attribute;\n }\n });\n\n if (attribute) {\n $scope.sectionToFocus = section.name;\n $scope.attributeToFocus = attribute.name;\n return true;\n }\n\n } else if (!hasSectionToFocus && hasAttributeToFocus) {\n\n // Check if section includes attribute to focus and attribute is not hidden\n attribute = _.find(section.attributes, function(attribute) {\n if (attribute.name == $scope.attributeToFocus && !$scope.isAttributeHidden(attribute.name)) {\n return true;\n }\n });\n\n if (attribute) {\n $scope.sectionToFocus = section.name;\n return true;\n }\n\n } else if (hasSectionToFocus && section.name == $scope.sectionToFocus) {\n\n // Find first non hidden attribute, if available\n attribute = _.find(section.attributes, function(attribute) {\n if ((!hasAttributeToFocus || attribute.name == $scope.attributeToFocus) && !$scope.isAttributeHidden(attribute)) {\n return attribute;\n }\n });\n\n if (attribute) {\n $scope.attributeToFocus = attribute.name;\n return true;\n }\n\n }\n\n return false;\n };\n\n $scope.focusAttribute = function(attributeName) {\n\n // Find all sections containing the attribute to focus on,\n // then either take the first open section, if available,\n // or simply the first non open section\n var sections = _.filter($scope.sections, function(section) {\n return _.some(section.attributes, function (attribute) {\n if (_.isEqual(attribute.name, attributeName)) {\n return true;\n }\n // Also check for memberAttributes\n return _.some(attribute.memberAttributes, function (memberAttribute) {\n if (_.isEqual(memberAttribute.name, attributeName)) {\n // focus on parent attribute\n attributeName = attribute.name;\n return true;\n }\n });\n });\n });\n var section = _.find(sections, function(section) {\n if (section.isOpen) {\n return true;\n }\n });\n section = section || sections[0];\n\n if (section) {\n\n if (section.isOpen) {\n focusOn(attributeName);\n $scope.sectionToFocus = null;\n $scope.attributeToFocus = null;\n } else {\n $scope.sectionToFocus = section.name;\n $scope.attributeToFocus = attributeName;\n section.isOpen = true;\n }\n\n // Some attribute type templates don't set the url, so simply set it again\n $scope.setAttributeUrl(attributeName);\n\n }\n\n };\n\n function focusOn(attributeName) {\n var elemCount = angular.element(document).find(\"#\" + attributeName).length;\n $timeout(function () {\n if (elemCount === 0 && $scope.sectionLoaded) {\n focusOn(attributeName);\n } else {\n $rootScope.$broadcast('focusOn', attributeName);\n }\n }, 200);\n }\n\n $scope.sectionLoaded = false;\n\n $scope.setSectionLoaded = function(value) {\n $scope.sectionLoaded = value;\n };\n\n $scope.setAttributeUrl = function(attribute) {\n var url;\n if (params.origPrimaryKey) {\n url = \"/copy/\" + params.origPrimaryKey;\n } else if ($scope.item.primaryKey__) {\n url = \"/edit/\" + $scope.item.primaryKey__;\n } else {\n url = \"/edit/new\";\n }\n url += \"/attribute/\" + attribute;\n $scope.currentAttribute = attribute;\n $location.displayUrl(url);\n };\n\n $scope.removeCallouts = function() {\n $scope.$broadcast(\"closeAllUiSelect\");\n hopscotch.getCalloutManager().removeAllCallouts();\n };\n\n $scope.resetEditor = function() {\n $rootScope.onShowItemReview = false;\n $rootScope.onShowHistory = false;\n $rootScope.onShowItemGrouping = false;\n $rootScope.onShowItemDetails = false;\n $scope.onEnterViewName = false;\n $scope.onAddView = false;\n $scope.onEditView = false;\n $rootScope.onShowPublicationStatus = false;\n $scope.resetHierarchyShown();\n };\n\n $scope.toggleItemReview = function() {\n $rootScope.onShowItemReview = !$rootScope.onShowItemReview;\n };\n\n $scope.getItemReviews = function() {\n $scope.showItemReviews = !$scope.showItemReviews;\n $scope.showTaskView = false;\n $scope.reviewAttributes = $rootScope.dataModel.getReviewAttributes();\n $rootScope.prepareAttributes($scope.reviewAttributes);\n SupplierReviewResource.get({primaryKey: $scope.item.primaryKey__}, {},\n function(response) {\n $scope.reviews = response;\n });\n };\n\n $scope.showTask = function() {\n $scope.showTaskView = !$scope.showTaskView;\n if (!$scope.task.comments) {\n TaskResource.getComments({\n taskId: $scope.task.id\n }, function(response) {\n $scope.task.comments = response || [];\n });\n }\n $scope.showItemReviews = false;\n };\n\n $scope.enabledItemReview = function() {\n var customService = $rootScope.getService(CUSTOM_ITEM_REVIEW_SERVICE);\n var isEnabledByDatamodel = !customService || customService.enableItemReview($scope.item, $rootScope.user, $rootScope.organization);\n return (!_.isNil($scope.item.channel__) || !_.isNil($scope.item.supplier__)) && isEnabledByDatamodel;\n };\n\n $scope.showItemHistory = function() {\n $scope.resetEditor();\n $rootScope.onShowHistory = !$rootScope.onShowHistory;\n };\n\n $scope.showPublicationStatus = function() {\n $scope.loadPublications($scope.item.primaryKey__);\n $scope.resetEditor();\n $rootScope.onShowPublicationStatus = !$rootScope.onShowPublicationStatus;\n };\n\n $scope.showItemGrouping = function() {\n var itemModified = $rootScope.hasItemModified();\n if (!itemModified) {\n $scope.resetEditor();\n $rootScope.onShowItemGrouping = !$rootScope.onShowItemGrouping;\n } else {\n var confirmDialog = $dialogs.confirm('MODAL.CONFIRM_HEADER', 'MODAL.DISMISS_WITH_UNSAVED_CHANGES');\n confirmDialog.result.then(function() {\n $scope.item = $scope.originalItem;\n $scope.resetEditor();\n $rootScope.onShowItemGrouping = !$rootScope.onShowItemGrouping;\n }, function() {});\n }\n };\n\n $scope.showItemDetails = function() {\n var itemModified = $rootScope.hasItemModified();\n if (!itemModified) {\n $scope.resetEditor();\n $rootScope.onShowItemDetails = !$rootScope.onShowItemDetails;\n } else {\n var confirmDialog = $dialogs.confirm('MODAL.CONFIRM_HEADER', 'MODAL.DISMISS_WITH_UNSAVED_CHANGES');\n confirmDialog.result.then(function() {\n $scope.item = $scope.originalItem;\n $scope.resetEditor();\n\n $rootScope.onShowItemDetails = !$rootScope.onShowItemDetails;\n }, function() {});\n }\n };\n\n $scope.promptAndOpenNewItem = function(item, showItemPrimaryKey) {\n result = {action: 'itemChanged'};\n if (!$scope.isItemEditable || !$rootScope.hasItemModified()) {\n result.showItemPrimaryKey = showItemPrimaryKey;\n executeCloseEditor(result);\n } else {\n var confirmDialog = $dialogs.confirm('MODAL.CONFIRM_HEADER', 'MODAL.DISMISS_WITH_UNSAVED_CHANGES');\n confirmDialog.result.then(function() {\n result.showItemPrimaryKey = showItemPrimaryKey;\n executeCloseEditor(result);},\n function() {\n openEditorWithItem(item, showItemPrimaryKey);\n }\n );\n }\n\n };\n\n $scope.auditItem = function(item) {\n if ($scope.vm.desiredAuditStatus !== null) {\n $scope.vm.desiredAuditStatus = !$scope.vm.desiredAuditStatus;\n } else {\n $scope.vm.desiredAuditStatus = !item.audited__;\n }\n };\n\n $scope.loadPublications = function(primaryKey) {\n if (_.isNil($scope.itemPublications)) {\n ItemResource.getPublications({primaryKey: primaryKey}, function(publications) {\n $scope.itemPublications = _.filter(publications, { publishedStatus : \"PUBLISHED\" });\n loadPublicationDestinations().then(function(data) {\n $scope.isLoading = false;\n _.forEach($scope.itemPublications, function(publication) {\n publication.organization = _.find($scope.organizations, { organizationId : publication.destinationId });\n // Check the destinationType and/or the subDestination (which only exists for communication channel publications!)\n if (publication.destinationType == 'IN_PLATFORM' ||\n (_.isNil(publication.destinationType) && _.isNil(publication.subDestination))) {\n // load organization for publication.destinationId\n publication.organization = _.find($scope.organizations, { organizationId : publication.destinationId });\n } else if (publication.destinationType == 'COMMUNICATION_CHANNEL' ||\n (_.isNil(publication.destinationType) && !_.isNil(publication.subDestination))) {\n // load communicationChannel for publication.destinationId\n publication.communicationChannel = _.find($scope.communicationChannels, function(ch) {\n return (!publication.subDestination || (publication.subDestination == ch.subDestinationKey)) && ch.id == publication.destinationId;\n });\n }\n\n // If still nothing is set, first try to load organization and then communication channel\n if (_.isNil(publication.organzation) && _.isNil(publication.communicationChannel)) {\n // load organization for publication.destinationId,\n // if no organization found, load communicationChannel for publication.destinationId\n publication.organization = _.find($scope.organizations, { organizationId : publication.destinationId });\n if (_.isNil(publication.organization)) {\n publication.communicationChannel = _.find($scope.communicationChannels, function(ch) {\n return (!publication.subDestination || (publication.subDestination == ch.subDestinationKey)) && ch.id == publication.destinationId;\n });\n }\n }\n });\n $scope.itemPublicationsByOrg = _.filter($scope.itemPublications, function(p) {\n return !!p.organization;\n });\n $scope.itemPublicationsByChannel = _.filter($scope.itemPublications, function(p) {\n return !!p.communicationChannel;\n });\n });\n });\n }\n };\n\n $scope.plans = $rootScope.getPreparedCommunicationPlans();\n\n function loadPublicationDestinations() {\n return CommunicationChannelService.loadPublicationDestinations().then(function(result) {\n $scope.communicationChannels = result.communicationChannels;\n $scope.organizations = result.organizations;\n });\n }\n\n $scope.getItemPosition = function(item) {\n return _.indexOf(params.primaryKeys, item.primaryKey__) + 1;\n };\n\n $scope.getItemCount = function() {\n return _.size(params.primaryKeys);\n };\n\n $scope.openNextItem = function(item) {\n openEditorWithItem(item, getNextItemKey(item));\n };\n\n $scope.openPreviousItem = function(item) {\n openEditorWithItem(item, getPreviousItemKey(item));\n };\n\n function getNextItemKey(item) {\n var index = _.indexOf(params.primaryKeys, item.primaryKey__);\n var length = $scope.getItemCount();\n return index < length ? params.primaryKeys[index + 1] : null;\n }\n\n function getPreviousItemKey(item) {\n var index = _.indexOf(params.primaryKeys, item.primaryKey__);\n var length = $scope.getItemCount();\n return index > 0 ? params.primaryKeys[index - 1] : null;\n }\n\n function openEditorWithItem(item, showItemPrimaryKey) {\n $scope.saveItem(item, function(result) {\n result.showItemPrimaryKey = showItemPrimaryKey;\n executeCloseEditor(result);\n });\n }\n\n $scope.formatNavItemIndex = function(item) {\n\n var itemPosition = _.toString($scope.getItemPosition(item));\n var itemCount = _.toString($scope.getItemCount());\n\n // Prepend with \"0\" depending to maximum \"length\" of the numbers\n var length = _.max([itemPosition.length, itemCount.length]);\n var format = _.padStart(itemPosition, length, \"0\") + \" | \" + _.padStart(itemCount, length, \"0\");\n\n return format;\n };\n\n $scope.showItemHierarchy = function(hierarchy) {\n $log.debug(hierarchy + \" is clicked\");\n $scope.resetEditor();\n\n $scope.itemHierarchyStatus.forEach(function(value, key, map) {\n if (key == hierarchy) {\n $scope.itemHierarchyStatus.set(key, true);\n\n } else {\n $scope.itemHierarchyStatus.set(key, false);\n }\n });\n };\n\n // called after item is loaded\n function initHierarchyTabs() {\n var categoryInfo = $rootScope.dataModel.category($scope.item.category__);\n if (categoryInfo && categoryInfo.hierarchies != null){\n\n $scope.itemHierarchyStatus = new Map();\n\n for (i = 0; i < categoryInfo.hierarchies.length; i++) {\n $scope.itemHierarchyStatus.set(categoryInfo.hierarchies[i],false);\n }\n $scope.itemHierarchies = categoryInfo.hierarchies;\n }\n }\n\n $scope.isHierarchyShown = function(hierarchy) {\n if (hierarchy != null) {\n return $scope.itemHierarchyStatus.get(hierarchy);\n } else {\n var shouldHierarchyBeShown = false;\n $scope.itemHierarchyStatus.forEach(function(value, key, map) {\n if (value == true){\n shouldHierarchyBeShown = true;\n }\n });\n return shouldHierarchyBeShown;\n }\n };\n\n $scope.resetHierarchyShown = function() {\n $scope.itemHierarchyStatus.forEach(function(value, key, map) {\n $scope.itemHierarchyStatus.set(key, false);\n });\n };\n\n $scope.currentHierarchy = function() {\n var currentHierarchyName = \"\";\n $scope.itemHierarchyStatus.forEach(function(value, key, map) {\n if (value == true){\n currentHierarchyName = key;\n }\n });\n return currentHierarchyName;\n };\n\n $scope.getChangedAttributeStates = function (oldAttributeStates, newAttributeStates) {\n\n var changedAttributeStates = [];\n var keysOldAttributeStates = Object.keys(oldAttributeStates);\n var keysNewAttributeStates = Object.keys(newAttributeStates);\n\n var allKeysAttributeStates = _.union(keysOldAttributeStates, keysNewAttributeStates);\n\n _.forEach(allKeysAttributeStates, function (key) {\n\n // checking for the attributes whose state is changed from hidden to unhidden\n if (_.includes(keysOldAttributeStates, key) && !_.includes(keysNewAttributeStates, key)) {\n changedAttributeStates.push(key);\n }\n // checking for the attributes whose state is changed from unhidden to hidden\n if (!_.includes(keysOldAttributeStates, key) && _.includes(keysNewAttributeStates, key)) {\n changedAttributeStates.push(key);\n }\n });\n\n return changedAttributeStates;\n\n };\n\n $scope.rerenderGrid = function (oldAttributeStates, newAttributeStates) {\n\n // Got all the attributes whose state has been changed\n var attributesWithChangedState = $scope.getChangedAttributeStates(oldAttributeStates, newAttributeStates);\n\n var allDataModelAttributes = $scope.dataModel.allAttributes();\n _.forEach(allDataModelAttributes, function (datamodelAttribute) {\n // this is only for the sub attribute of the UI grid\n if (_.includes(['Collection', 'MultiDimensional'], datamodelAttribute.typeName)) {\n var memberAttributes = $rootScope.dataModel.getMemberAttributes(datamodelAttribute);\n _.forEach(memberAttributes, function (memberAttribute) {\n if (_.includes(attributesWithChangedState, memberAttribute.name)) {\n $scope.rerenderSpecificGrid(memberAttribute.name, datamodelAttribute.name);\n }\n });\n }\n\n });\n\n };\n\n $scope.getCachedGridColumns = function(attributeName) {\n\n var cacheKey = attributeName;\n\n // Attribute might be a member attribute of a composite one, its cache key\n // might be a path, so we look for these ones too\n var alternateMapKey = \"[\" + cacheKey + \"]\";\n\n var cachedGrid = _.find($scope.gridCache, function(value, key) {\n return key === cacheKey || _.includes(key, alternateMapKey);\n });\n\n if (!_.isNil(cachedGrid)) {\n return cachedGrid.columnDefs;\n } else {\n return null;\n }\n };\n\n $scope.getGridInstances = function(attributeName) {\n\n var mapKey = attributeName;\n\n // Attribute might be a member attribute of a composite one, its map key\n // might be a path, so we look for these ones too\n var alternateMapKey = \"['\" + mapKey + \"']\";\n\n return _.reduce($scope.gridApiMap, function(mapHits, value, key) {\n\n if (key === mapKey || _.includes(key, alternateMapKey)) {\n mapHits.push(value);\n }\n\n return mapHits;\n }, []);\n };\n\n $scope.rerenderSpecificGrid = function (changedMemberAttribute, changedAttribute) {\n\n var changedGridInstances = $scope.getGridInstances(changedAttribute);\n\n if (_.isEmpty(changedGridInstances)) {\n // Intended grid state change is not rendered yet, skipping.\n return;\n }\n\n // We should either (create new column definitions for the appropriate grid) or\n // we should get the current column defs and remove the one hidden or\n // create the ones that should be shown\n var hidden = $scope.isAttributeHidden(changedMemberAttribute);\n if (hidden) {\n\n // We hide all the occurrences of changed attribute, for example when\n // its composite is repeated in a group.\n _.forEach(changedGridInstances, function(gridInstance) {\n\n var changedGridColumnDefs = gridInstance.grid.options.columnDefs;\n\n var columnIndex = _.findIndex(changedGridColumnDefs, { attribute: { name: changedMemberAttribute } });\n changedGridColumnDefs.splice(columnIndex, 1);\n\n });\n\n } else {\n\n // We show (or make sure it's shown) all the occurrences of changed attribute, for example when\n // its composite is repeated in a group.\n _.forEach(changedGridInstances, function(gridInstance) {\n\n var changedGridColumnDefs = gridInstance.grid.options.columnDefs;\n var changedColumnDef = _.find(changedGridColumnDefs, { attribute: { name: changedMemberAttribute } });\n\n // If the column for the attribute already exists, we should not duplicate it\n if (!_.isNil(changedColumnDef)) {\n return;\n }\n\n var cachedGridColumns = $scope.getCachedGridColumns(changedAttribute);\n\n if (_.isNil(cachedGridColumns)) {\n $log.error('Could not find grid cache {} in order to update member attribute {} state', changedAttribute, changedMemberAttribute);\n return;\n }\n\n var columnDef = _.find(cachedGridColumns, function (columnDef) {\n if (!_.isNil(columnDef.attribute) && columnDef.attribute.name === changedMemberAttribute) {\n return true;\n } else {\n return false;\n }\n });\n\n changedGridColumnDefs.push(columnDef);\n\n });\n }\n };\n\n $scope.$on('addLocalValidation', function(event, eventData) {\n if (_.isEmpty(eventData.attributeErrors.errors)) {\n delete $scope.localValidations[eventData.path];\n } else {\n $scope.localValidations[eventData.path] = eventData.attributeErrors;\n }\n });\n\n $scope.getAttributeLabelsForLocalValidations = function() {\n var attributeLabels = '';\n _.forEach($scope.localValidations, function(attributeErrors) {\n\n var attribute = attributeErrors.attribute;\n var translatedLabel = attribute.translatedLabel || $rootScope.translateAttribute(attribute);\n\n attributeLabels += '
  • ' + translatedLabel + '
  • ';\n });\n return attributeLabels;\n };\n $scope.initItemDetailsWithinEditor = function() {\n var urlPath = window.location.pathname;\n var pathSegments = urlPath.split('/');\n var primaryKey = pathSegments[2];\n ReactBridge.mountComponent(\"ItemDetails\", \"#item-details-component\", {\n primaryKey: primaryKey,\n showReviewPanel: $scope.showReviewPanel,\n isInEditorMode: $scope.isInEditorMode\n });\n };\n });\n","angular.module('llax')\n.controller('EditorHistoryController',\n function($scope, $rootScope, $translate, $filter, $location, $timeout, ItemHistoryResource, ItemEventHistoryResource,\n uiGridConstants, gridUtil, TabContainer, ContactsResource, CommunicationChannelResource, OrganizationService) {\n\n var EDITOR_HISTORY_GRID_STATES_KEY = \"editor-history-grid-states-\";\n var DEFAULT_GRID_STATE_KEY = \"default-state\";\n\n $scope.EVENT_ACTOR_TYPES = {\n USER: 'USER',\n ORGANIZATION: 'ORGANIZATION',\n COMM_CHANNEL: 'COMM_CHANNEL',\n OTHER: 'OTHER'\n };\n\n $scope.gridOptions = {};\n $scope.columnDefs = {};\n $scope.historyData = [];\n $scope.enableWrapping = {};\n\n gridUtil.on.mousewheel = function() {};\n\n $scope.createCallout = createCallout;\n $scope.encodeAssetLink = encodeAssetLink;\n\n var channels = [];\n\n var userTemplate =\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' {{row.entity.userDetails.displayName}}\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' {{row.entity.commChannel.name}}\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' {{row.entity.organization.name}}\\n' +\n ' \\n' +\n ' \\n' +\n ' {{row.entity.senderName}}\\n' +\n ' \\n' +\n '
    ';\n\n function onTabActivate(tab) {\n $scope.currentSubUrl = tab.suburl;\n switch (tab.suburl) {\n case 'timeline':\n createTableDefinition('timeline');\n break;\n case 'attributes':\n createTableDefinition('attributes');\n break;\n case 'events':\n createTableDefinition('events');\n break;\n default:\n break;\n }\n }\n\n function initTabs() {\n var location = {\n hash: function(url) {\n return url;\n }\n };\n var tabsConfig = [{\n title: $translate.instant('HISTORY.TAB_TITLE.TIMELINE'),\n suburl: 'timeline',\n template: 'tpl/item-history-timeline.tpl.html'\n }, {\n title: $translate.instant('HISTORY.TAB_TITLE.ATTRIBUTES'),\n suburl: 'attributes',\n template: 'tpl/item-history-attributes.tpl.html'\n }, {\n title: $translate.instant('HISTORY.TAB_TITLE.EVENTS'),\n suburl: 'events',\n template: 'tpl/item-history-events.tpl.html'\n }];\n\n var tabContainer = new TabContainer($scope, location, tabsConfig, 'timeline', onTabActivate);\n tabContainer.openSubview(location.hash());\n }\n\n function getItemHistory(primaryKey) {\n\n ItemHistoryResource.get({\n primaryKey: primaryKey\n },\n function(itemHistory) {\n\n var attributeHistory = [];\n\n _.forEach(itemHistory.history, function(history) {\n\n var updatedAt = history.updatedAt__;\n var updatedBy = history.updatedBy__;\n\n _.forEach(history, function(value, key) {\n\n if (key === \"checksum__\" || key === \"updatedAt__\" || key === \"updatedBy__\") {\n return;\n }\n\n var pos, attribute;\n\n pos = key.indexOf('[');\n if (pos > 0) {\n attribute = $rootScope.dataModel.attribute(key.substring(0, pos));\n } else {\n attribute = $rootScope.dataModel.attribute(key);\n }\n\n var label = $rootScope.translateAttribute(attribute);\n\n var oldValue = value.oldValue__;\n var oldValueClass = value.oldValueClass__;\n oldValue = formatValue(oldValue, oldValueClass);\n var currentValue = value.currentValue__;\n var currentValueClass = value.currentValueClass__;\n currentValue = formatValue(currentValue, currentValueClass);\n\n var entry = {\n user: updatedBy,\n date: updatedAt,\n attributeElement: key,\n attributeLabel: label,\n previousValue: oldValue,\n currentValue: currentValue\n };\n\n if (entry.user) {\n entry.actorType = $scope.EVENT_ACTOR_TYPES.USER;\n\n var user = $rootScope.getUser(entry.user);\n\n // Sometimes, we might have a user but it's no longer defined in the system\n // For example: in a backup restore situation.\n if (!_.isNil(user)) {\n entry.userDetails = {\n userName: user.userId,\n fullName: user.fullName,\n displayName: user.displayName,\n email: user.email,\n lastLogin: $rootScope.getFilter('date')(new Date(user.lastLogin), 'medium'),\n imageUrl: user.imageUrl\n };\n } else {\n entry.actorType = $scope.EVENT_ACTOR_TYPES.OTHER;\n entry.senderName = entry.user;\n }\n } else {\n entry.actorType = $scope.EVENT_ACTOR_TYPES.OTHER;\n }\n\n entry.additionalText = \"Attribute '\" + label + \"' was changed to '\" + currentValue + \"'\";\n entry.additionalText = $rootScope.translate('HISTORY.ATTRIBUTE_CHANGED_TEXT', entry.additionalText, {\n attribute: label,\n value: currentValue\n });\n\n attributeHistory.push(entry);\n\n });\n\n });\n\n function formatValue(value, valueClass) {\n if (valueClass === 'Date' || (_.isNil(valueClass) && _.isInteger(value))) {\n value = $filter('date')(value, 'medium');\n } else if (valueClass === 'Number') {\n value = $filter('formatFloatValue')(value);\n }\n return value;\n }\n\n $scope.historyData.attributes = attributeHistory;\n\n $scope.historyData.timeline = _.map(attributeHistory, function(entry) {\n var additionalText = \"Attribute '\" + entry.attributeLabel + \"' was changed to '\" + entry.currentValue + \"'\";\n additionalText = $rootScope.translate('HISTORY.ATTRIBUTE_CHANGED_TEXT', additionalText, {\n attribute: entry.attributeLabel,\n value: entry.currentValue\n });\n return {\n date: entry.date,\n user: entry.user,\n userName: entry.userName,\n userImageUrl: entry.userImageUrl,\n event: 'ATTRIBUTE_CHANGE',\n status: 'SUCCESS',\n additionalText: additionalText,\n userDetails: entry.userDetails,\n actorType: entry.actorType,\n senderName: entry.senderName\n };\n });\n\n ItemEventHistoryResource.query({\n primaryKey: primaryKey\n }, function(itemEventHistory) {\n\n $scope.historyData.events = _.map(itemEventHistory, function(entry) {\n\n entry.assetLink = createAssetLink(entry);\n\n entry.actorType = getActorType(entry);\n\n if(entry.actorType === $scope.EVENT_ACTOR_TYPES.USER) {\n var user = $rootScope.getUser(entry.user);\n\n // Sometimes, we might have a user but it's no longer defined in the system\n // For example: in a backup restore situation.\n if (!_.isNil(user)) {\n entry.userDetails = {\n userName: user.userId,\n fullName: user.fullName,\n displayName: user.displayName,\n email: user.email,\n lastLogin: $rootScope.getFilter('date')(new Date(user.lastLogin), 'medium'),\n imageUrl: user.imageUrl\n };\n } else {\n entry.actorType = $scope.EVENT_ACTOR_TYPES.OTHER;\n entry.senderName = entry.user;\n }\n } else if (entry.actorType === $scope.EVENT_ACTOR_TYPES.ORGANIZATION) {\n entry.organization = getOrganization(entry.sender);\n } else if (entry.actorType === $scope.EVENT_ACTOR_TYPES.COMM_CHANNEL) {\n var commChannel = getCommChannel(entry.channelId);\n\n // Sometimes a communication channel is no longer defined in the system\n if (!_.isNil(commChannel)) {\n entry.commChannel = commChannel;\n } else {\n entry.actorType = $scope.EVENT_ACTOR_TYPES.OTHER;\n entry.senderName = entry.channelId;\n }\n }\n\n if (entry.recipient) {\n entry.recipientName = getEventPartnerName(entry.transferType,\n entry.recipient,\n entry.channelId,\n entry.subDestination);\n }\n\n return entry;\n });\n\n $scope.historyData.timeline = $scope.historyData.timeline.concat(itemEventHistory);\n\n });\n\n });\n\n }\n\n function createAssetLink(event) {\n if (event.assetPath && event.assetType == 'IMPORT') {\n return lax_rest_url(\"gatherings/\") + event.assetId + event.assetPath + \"?download=true\";\n } else if (event.assetPath && event.assetType == 'MESSAGING') {\n return lax_rest_url(\"messaging/messagingassets/\") + event.assetId + event.assetPath + \"?download=true\";\n }\n }\n\n function loadColumnDefinitions() {\n $scope.columnDefs = {\n 'timeline': [{\n field: 'date',\n displayName: $translate.instant('HISTORY.MODIFIED_WHEN'),\n headerTooltip: true,\n cellTooltip: true,\n cellFilter: \"date:'medium'\",\n width: 150,\n sort: {\n direction: uiGridConstants.DESC\n }\n }, {\n field: 'user',\n displayName: $translate.instant('HISTORY.MODIFIED_BY'),\n headerTooltip: true,\n cellTooltip: true,\n cellTemplate: userTemplate,\n width: 160\n }, {\n field: 'event',\n displayName: $translate.instant('HISTORY.EVENT'),\n headerTooltip: true,\n cellFilter: 'translate',\n cellTooltip: true,\n width: 160\n }, {\n field: 'additionalText',\n displayName: $translate.instant('HISTORY.ADDITIONAL_TEXT'),\n headerTooltip: true,\n cellTooltip: true\n },{\n field: 'assetLink',\n displayName: $translate.instant('HISTORY.LINK'),\n headerTooltip: true,\n width: 140,\n cellTemplate:\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    '\n }],\n 'attributes': [{\n field: 'date',\n displayName: $translate.instant('HISTORY.MODIFIED_WHEN'),\n headerTooltip: true,\n cellTooltip: true,\n cellFilter: \"date:'medium'\",\n width: 150,\n sort: {\n direction: uiGridConstants.DESC\n }\n }, {\n field: 'user',\n displayName: $translate.instant('HISTORY.MODIFIED_BY'),\n headerTooltip: true,\n cellTooltip: true,\n cellTemplate: userTemplate,\n width: 160\n }, {\n field: 'attributeLabel',\n displayName: $translate.instant('HISTORY.ATTRIBUTE_LABEL'),\n headerTooltip: true,\n cellTooltip: true,\n width: 160,\n cellTemplate:\n '
    \\n' +\n '{{COL_FIELD}}\\n' +\n '
    '\n }, {\n field: 'attributeElement',\n displayName: $translate.instant('HISTORY.ATTRIBUTE_ELEMENT'),\n headerTooltip: true,\n cellTooltip: true,\n width: 160,\n cellTemplate:\n '
    \\n' +\n '{{COL_FIELD}}\\n' +\n '
    '\n }, {\n field: 'previousValue',\n displayName: $translate.instant('HISTORY.OLD_VALUE'),\n headerTooltip: true,\n cellTooltip: true,\n type: 'string',\n cellTemplate:\n '
    \\n' +\n '{{COL_FIELD}}\\n' +\n '
    '\n }, {\n field: 'currentValue',\n displayName: $translate.instant('HISTORY.NEW_VALUE'),\n headerTooltip: true,\n cellTooltip: true,\n type: 'string',\n cellTemplate:\n '
    \\n' +\n '{{COL_FIELD}}\\n' +\n '
    '\n }],\n 'events': [{\n field: 'date',\n displayName: $translate.instant('HISTORY.MODIFIED_WHEN'),\n headerTooltip: true,\n cellTooltip: true,\n cellFilter: \"date:'medium'\",\n width: 150,\n sort: {\n direction: uiGridConstants.DESC\n }\n }, {\n field: 'user',\n displayName: $translate.instant('HISTORY.MODIFIED_BY'),\n headerTooltip: true,\n cellTooltip: true,\n cellTemplate: userTemplate,\n width: 160\n }, {\n field: 'recipient',\n displayName: $translate.instant('MESSAGING.RECIPIENT'),\n headerTooltip: true,\n cellTooltip: true,\n cellTemplate:\n '
    \\n' +\n '\\n' +\n '{{row.entity.recipientName}}\\n' +\n '' +\n '
    ',\n width: 140,\n }, {\n field: 'event',\n displayName: $translate.instant('HISTORY.EVENT'),\n headerTooltip: true,\n cellFilter: 'translate',\n cellTooltip: true,\n width: 140\n }, {\n field: 'additionalText',\n displayName: $translate.instant('HISTORY.ADDITIONAL_TEXT'),\n headerTooltip: true,\n cellTooltip: true\n }, {\n field: 'text',\n displayName: $translate.instant('HISTORY.TEXT'),\n headerTooltip: true,\n cellTooltip: true\n },{\n field: 'assetLink',\n displayName: $translate.instant('HISTORY.LINK'),\n headerTooltip: true,\n width: 140,\n cellTemplate:\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    '\n }, {\n field: 'status',\n displayName: $translate.instant('STATUS'),\n headerTooltip: true,\n width: 90,\n headerCellClass: 'text-center',\n cellClass: 'text-center',\n cellTemplate:\n '
    \\n' +\n ' \\n' +\n ' {{COL_FIELD | translate}}\\n' +\n ' \\n' +\n '
    '\n }]\n };\n }\n\n function createTableDefinition(optionId) {\n var gridStatesKey = EDITOR_HISTORY_GRID_STATES_KEY + optionId;\n $scope.gridOptions[optionId] = {\n data: 'historyData.' + optionId,\n columnDefs: $scope.columnDefs[optionId],\n enableColumnMenus: false,\n enableGridMenu: true,\n gridMenuCustomItems : [\n {\n title: $translate.instant('WRAP_CONTENT'),\n active: function() {\n return $scope.enableWrapping[gridStatesKey];\n },\n action: function ($event) {\n toggleWrapping(gridStatesKey);\n },\n order: 210\n }\n ],\n onRegisterApi: function(gridApi) {\n $scope.gridApi = gridApi;\n $rootScope.initGridState($scope, $scope.gridApi, gridStatesKey, DEFAULT_GRID_STATE_KEY, $scope.columnDefs[optionId]);\n }\n };\n }\n\n function toggleWrapping(gridStatesKey) {\n $scope.enableWrapping[gridStatesKey] = !$scope.enableWrapping[gridStatesKey];\n $scope.$broadcast(gridStatesKey);\n }\n\n function getEventPartnerName(transferType, partner, channelId, subDestination) {\n var partnerName;\n if (transferType === 'IN_PLATFORM') {\n var organization = _.find($scope.organizations, function(entry) {\n // In-platform publications can only exist for organiztation contacts,\n // thus we only need to compare the (optional) property 'organizationId'!\n return entry.organizationId == partner;\n });\n if (organization) {\n partnerName = organization.name;\n }\n } else if (transferType === 'COMMUNICATION_CHANNEL') {\n var channel = _.find(channels, {id: channelId});\n if (subDestination) {\n if (channel && channel.subDestinations && channel.subDestinations[subDestination]) {\n partnerName = channel.subDestinations[subDestination] + ' (' + subDestination + ')';\n }\n partnerName = partnerName || subDestination;\n } else if (channel) {\n partnerName = channel.name;\n }\n } else {\n partnerName = $rootScope.getUserName(partner);\n }\n return partnerName ? partnerName : partner;\n }\n\n function loadAllVisibleOrganizations() {\n ContactsResource.query({},\n function(response) {\n $scope.organizations = response;\n }\n );\n }\n\n function loadCommunicationChannels() {\n CommunicationChannelResource.query({}, function(response) {\n channels = response;\n });\n }\n\n function createCallout(target, entity) {\n var customRendererFn;\n var imageElement;\n\n if (entity.actorType === $scope.EVENT_ACTOR_TYPES.USER) {\n imageElement = '
    ';\n if (entity.userDetails.imageUrl) {\n imageElement = '
    \"user
    ';\n }\n\n customRendererFn = function(){\n return '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n imageElement +\n '
    ' +\n '
    ' +\n '

    ' + entity.userDetails.fullName + '

    ' +\n '

    ' + entity.userDetails.userName + '

    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '

    ' + entity.userDetails.email + '

    ' +\n '

    ' + $translate.instant('USER_MANAGEMENT.LAST_LOGGED_IN') + ' ' + entity.userDetails.lastLogin + '

    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '' +\n '';\n };\n } else if (entity.actorType === $scope.EVENT_ACTOR_TYPES.COMM_CHANNEL) {\n customRendererFn = function() {\n return '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '

    ' + entity.commChannel.name + '

    ' +\n '

    ' + $translate.instant('COMMUNICATION_CHANNELS') + '

    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '

    ' + entity.commChannel.partnerAddress + '

    ' +\n '

    ' + entity.commChannel.planLabel + '

    ' +\n '

    ' + entity.commChannel.typeLabel + '

    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '' +\n '';\n };\n } else if (entity.actorType === $scope.EVENT_ACTOR_TYPES.ORGANIZATION) {\n imageElement = '
    ';\n if (entity.organization.imageUrl) {\n imageElement = '
    \"user
    ';\n }\n\n customRendererFn = function () {\n return '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n imageElement +\n '
    ' +\n '
    ' +\n '

    ' + entity.organization.name + '

    ' +\n '

    ' + $translate.instant('CONTACTS') + '

    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '

    ' + entity.organization.email + '

    ' +\n '

    ' + entity.organization.address + '

    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '' +\n '';\n };\n }\n\n var calloutConfig = {\n id: 'callout-' + target,\n target: '.' + target,\n placement: 'bottom',\n content: '',\n customRenderer: customRendererFn\n };\n\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeAllCallouts();\n\n var calloutEle = calloutMgr.createCallout(calloutConfig);\n // Hack: override !important css rules, with inline precedence\n calloutEle.element.style.cssText += 'border: none !important;';\n }\n\n function getActorType(entry) {\n if (entry.user) {\n return $scope.EVENT_ACTOR_TYPES.USER;\n } else if (entry.transferType === 'IN_PLATFORM') {\n return $scope.EVENT_ACTOR_TYPES.ORGANIZATION;\n } else if (entry.transferType === 'COMMUNICATION_CHANNEL') {\n return $scope.EVENT_ACTOR_TYPES.COMM_CHANNEL;\n } else {\n return $scope.EVENT_ACTOR_TYPES.OTHER;\n }\n }\n\n function getOrganization(organizationId) {\n return _.find($scope.organizations, function (entry) {\n // In-platform publications can only exist for organiztation contacts,\n // thus we only need to compare the (optional) property 'organizationId'!\n return entry.organizationId == organizationId;\n });\n }\n\n function getCommChannel(channelId) {\n var channel = _.find(channels, { id: channelId });\n if (!channel) {\n return null;\n }\n channel.planLabel = getChannelPlanLabel(channel.plan);\n channel.typeLabel = getChannelTypeLabel(channel.type);\n return channel;\n }\n\n function getChannelPlanLabel(plan) {\n if (!plan) {\n return \"\";\n }\n\n var planDetails = $rootScope.communicationPlans[plan];\n if (!planDetails) {\n return \"\";\n }\n\n return planDetails.label;\n }\n\n function getChannelTypeLabel(type) {\n if (!type) {\n return \"\";\n }\n\n return $rootScope.translateValue('COMMUNICATION_CHANNELS.TYPES.', type);\n }\n\n function encodeAssetLink(assetLink) {\n return encodeURI(assetLink);\n }\n\n (function init() {\n loadAllVisibleOrganizations();\n loadCommunicationChannels();\n loadColumnDefinitions();\n getItemHistory($scope.item.primaryKey__);\n initTabs();\n })();\n }\n );\n","angular.module('llax')\n .controller('EditorItemGroupingController',\n function($rootScope, $scope, $location, ItemResource,\n Auth, $filter, ExportFormatsResource, ExportMappingResource,\n $modal, SelectionResource, ExportItemResource, $routeParams, $window, growl, ReactBridge) {\n\n var columnDefs = [];\n $scope.groupingData = [];\n $scope.groupingAttributes = [];\n $scope.filterAttributes = [{}];\n\n function createTableDefinition() {\n $scope.groupingAttributes = $rootScope.dataModel.filteredLayoutAttributes('grouping');\n\n var browseAttributes = $rootScope.dataModel.filteredLayoutAttributes('browse');\n var categoryAttributes = $rootScope.dataModel.categoryAttributes($scope.item.category__);\n var layoutAttributes = _.intersection(browseAttributes, categoryAttributes);\n\n _.each(layoutAttributes, function(attr) {\n var col = {\n attribute: attr,\n field: attr.name,\n displayName: $rootScope.translateAttribute(attr),\n headerTooltip: true,\n width: '*',\n minWidth: 120,\n enableCellSelection: true\n };\n columnDefs.push(col);\n });\n\n $scope.groupingGridOptions = {\n data: 'groupingData',\n columnDefs: columnDefs,\n enableColumnMenus: false,\n onRegisterApi: function(gridApi) {\n $scope.gridApi = gridApi;\n gridApi.selection.clearSelectedRows();\n function rowSelectionChangedFn(row, event) {\n $scope.selectedGroupItems = $scope.gridApi.selection.getSelectedRows();\n var customPublicationService = $rootScope.getService(\"CustomPublicationSettings\");\n $scope.hasDepublishRights = !customPublicationService || customPublicationService.enableDepublication($scope.selectedGroupItems, $rootScope.user, $rootScope.organization);\n }\n gridApi.selection.on.rowSelectionChanged($scope, rowSelectionChangedFn);\n gridApi.selection.on.rowSelectionChangedBatch($scope, rowSelectionChangedFn);\n }\n };\n }\n\n $scope.getSelectedFullItems = function() {\n var selectedItems = $scope.gridApi ? $scope.gridApi.selection.getSelectedRows() : null;\n return selectedItems;\n };\n\n $scope.removeGroupingAttribute = function(attribute) {\n _.remove($scope.filterAttributes, attribute);\n if ($scope.filterAttributes.length === 0) {\n $scope.addGroupingAttribute();\n }\n };\n\n $scope.addGroupingAttribute = function() {\n $scope.filterAttributes.push({});\n };\n\n $scope.updateItemList = function(queryAttributes) {\n var keywordQuery = '';\n _.each(queryAttributes, function(attr, index) {\n if (index > 0) {\n keywordQuery += ' AND ';\n }\n keywordQuery += attr.name + ':' + $scope.item[attr.name];\n });\n var queryParam = {\n keyword: keywordQuery\n };\n ItemResource.query(queryParam, function(response) {\n $scope.groupingData = response;\n }, function(errorResponse) {});\n };\n\n $scope.startMassUpdate = function(selection) {\n $scope.closeEditor({action: 'startMassUpdate', selection: selection});\n };\n\n $scope.hasCategoryPermission = function(action, category) {\n return Auth.hasAnyPermission(Auth.OBJECT_TYPE_ITEMS, action, {category__: category});\n };\n\n $scope.hasAnyActionPermission = function(action) {\n var category;\n if (_.isNil($routeParams.category) || $routeParams.category === 'NO_CATEGORY') {\n category = null;\n } else {\n category = $routeParams.category;\n }\n return $scope.hasCategoryPermission(action, category);\n };\n\n $scope.hasAnyCreatePermission = function() {\n return $scope.hasAnyActionPermission('create');\n };\n\n $scope.hasAnyDeletePermission = function() {\n return $scope.hasAnyActionPermission('delete');\n };\n\n $scope.hasAnyEditPermission = function() {\n return $scope.hasAnyActionPermission('edit');\n };\n\n $scope.hasAnyPublishPermission = function() {\n return $scope.hasAnyActionPermission('publish');\n };\n\n $scope.hasAnyReadPermission = function() {\n return $scope.hasAnyActionPermission('read');\n };\n\n $scope.depublishItems = function() {\n $scope.publishItems(\"DEPUBLISH\");\n };\n\n $scope.hasExportPermission = function() {\n return $scope.hasAnyReadPermission() && Auth.hasAnyPermission(Auth.OBJECT_TYPE_UI, 'view.exports');\n };\n\n $scope.hasTasksPermission = function() {\n return Auth.hasAnyPermission(Auth.OBJECT_TYPE_UI, 'view.tasks');\n };\n\n $scope.hasMediaAssetExportPermission = function() {\n var selectedItems = $scope.getSelectedFullItems();\n var hasPermission = true;\n _.forEach(selectedItems, function(item, index, array) {\n var context = { namingPattern: Auth.ANY, item: item };\n if (!Auth.hasPermission('mediaAssetExport', 'show', context)) {\n hasPermission = false;\n }\n });\n return hasPermission;\n };\n\n $scope.checkItemPermission = function(action, item) {\n if (!$scope.hasItemPermission(action, item)) {\n var primaryKey = item.primaryKey__;\n var category = item.category__;\n var variables = {\n action: action\n };\n var message;\n if (!_.isEmpty(primaryKey)) {\n message = \"ITEM_ACTION.FORBIDDEN_FOR_PRIMARY_KEY\";\n variables.primaryKey = primaryKey;\n } else if (!_.isEmpty(category)) {\n message = \"ITEM_ACTION.FORBIDDEN_FOR_CATEGORY\";\n variables.category = category;\n } else {\n message = \"ITEM_ACTION.FORBIDDEN\";\n }\n growl.warning(message, {variables: variables});\n return false;\n }\n return true;\n };\n\n $scope.hasItemPermission = function(action, item) {\n return Auth.hasItemPermission(action, item);\n };\n\n $scope.publishItems = function(config) {\n\n var mode = config || \"PUBLISH\";\n\n if (_.isEmpty($scope.selectedGroupItems)) {\n growl.warning(\"NO_ITEMS_SELECTED\");\n return false;\n }\n\n var customPublicationService = $rootScope.getService(\"CustomPublicationSettings\");\n var isAllowedInvalidItem = false;\n if (!_.isNil(customPublicationService) && !_.isNil(customPublicationService.allowInvalidItem)) {\n isAllowedInvalidItem = customPublicationService.allowInvalidItem();\n }\n\n var item;\n for (var i = 0; i < $scope.selectedGroupItems.length; i++) {\n item = $scope.selectedGroupItems[i];\n if (isAllowedInvalidItem === false) {\n if (item.validation_dirty__ || !_.isEmpty(item.validation__)) {\n growl.warning(\"ITEM_INVALID_BEFORE_PUBLISHING\");\n return false;\n }\n }\n if (!$scope.checkItemPermission('publish', item)) {\n return false;\n }\n }\n\n var primaryKeys = _.map($scope.selectedGroupItems, 'primaryKey__');\n openPublicationsModal({primaryKeys: primaryKeys}, mode);\n\n };\n\n function openPublicationsModal(itemSelection, mode) {\n if ($scope.selectedGroupItems.length >= 1) {\n\n var modalInstance = $modal.open({\n templateUrl: 'tpl/publish-to-recipients-modal.tpl.html',\n controller: 'PublishItemsController',\n backdrop: true,\n windowClass: 'publish-modal',\n resolve: {\n itemSelection: function() {\n return itemSelection;\n },\n mode: function() {\n return mode;\n },\n publicationData: function() {\n return {};\n }\n }\n });\n } else {\n growl.warning(\"NO_ITEMS_SELECTED\");\n }\n }\n\n $scope.filteredExportFormats = function() {\n return $filter('showExportFormatsFilter')($scope.exportFormats , $scope.selectedGroupItems);\n };\n\n $scope.downloadItems = function(exportType) {\n var selectedKeys= $scope.getSelectedItemsKeys();\n if (!selectedKeys || selectedKeys.length === 0) {\n growl.warning(\"NO_ITEMS_SELECTED\");\n } else if (exportType.usesMapping || !_.isEmpty(exportType.attributes)) {\n startMappingEditor(selectedKeys, exportType);\n } else {\n $scope.createExportFromSelection(exportType);\n }\n };\n\n function startMappingEditor(selection, exportType) {\n ExportMappingResource.query(\n function(response) {\n $modal.open({\n templateUrl: 'tpl/export-mapping-editor.tpl.html',\n controller: 'ExportMappingController',\n resolve: {\n data: function() {\n return {\n profiles: response.data || [],\n selectedItems: selection,\n parentscope: $scope,\n exportType: exportType\n };\n }\n },\n backdrop: true,\n windowClass: 'publish-modal'\n });\n });\n }\n\n $scope.getSelectedItemsKeys = function() {\n return _.map($scope.selectedGroupItems, 'primaryKey__');\n };\n\n $scope.createExportFromSelection = function(exportType) {\n var selection = { primaryKeys : $scope.getSelectedItemsKeys() };\n SelectionResource.save(selection, function(response) {\n ExportItemResource.get({\n selectionId: response.selectionId,\n type: exportType.contentType,\n language: $rootScope.language\n }, function(exportResponse) {\n var location = $window.location.protocol + \"//\" + $window.location.host + \"/exports\";\n growl.success(\"ITEM.EXPORT_SUCCESS\", {\n variables: {\n link: location\n },\n ttl: 5000\n });\n });\n });\n };\n\n $scope.updateItems = function() {\n var selection = { primaryKeys : $scope.getSelectedItemsKeys() };\n var selectedItems = $scope.getSelectedItemsKeys();\n if (!selectedItems || selectedItems.length === 0) {\n growl.warning(\"NO_ITEMS_SELECTED\");\n } else {\n var dialog = ReactBridge.mountDialog(\"MassUpdateDialog\", \"#react-mass-update-dialog-grouping-tab\",\n {\n data: {\n selection: selection,\n selectedItems: selectedItems\n },\n item: $scope.item,\n category: $routeParams.category,\n onClose: function(toWait) {\n // Unmount the dialog after waiting if toWait is true, otherwise unmount immediately\n function unmount(){\n dialog.unmount();\n }\n return toWait? ReactBridge.unmountWhenReady(unmount): dialog.unmount();\n }\n });\n }\n };\n\n $scope.showEditorAddTask = function(items) {\n var selectedItems = $scope.getSelectedItemsKeys();\n $modal.open({\n templateUrl: 'tpl/tasks-create-task.tpl.html',\n controller: 'CreateTaskController',\n backdrop: true,\n windowClass: 'publish-modal',\n resolve: {\n data: function() {\n return {\n taskListId: null,\n items: selectedItems\n };\n }\n }\n });\n };\n\n $scope.showMediaAssetExport = function(items) {\n var selectedItems = $scope.getSelectedItemsKeys();\n var selection = { primaryKeys : selectedItems };\n $modal.open({\n templateUrl: 'tpl/media-asset-export.tpl.html',\n controller: 'MediaAssetExportController',\n backdrop: true,\n windowClass: 'publish-modal',\n resolve: {\n selectedItems: function() {\n return selectedItems;\n },\n selection: function() {\n return selection;\n }\n }\n });\n };\n\n (function init() {\n createTableDefinition();\n $scope.exportFormats = [];\n ExportFormatsResource.query({\n returnKeyValueFormat: false\n }, function(response) {\n $scope.exportFormats = $scope.exportFormats.concat(response);\n });\n })();\n\n }\n );\n","angular.module('llax')\n .controller('EditorItemHierarchyController',\n function($rootScope, $scope, $location, $document, $window, $filter, $controller,\n ItemResource, ItemHierarchyResource, OldItemHierarchyResource, $log, $q) {\n\n var CUSTOM_ITEM_HIERARCHY_SETTINGS = \"CustomItemHierarchySettings\";\n\n var dataModelLayoutAttribute = getDataModelLayoutAttributes();\n\n $scope.itemHierarchyLayoutMapping = [];\n $scope.selectedItem = $scope.item;\n\n /** vis.js network-related properties */\n var network = null;\n var nodes = [];\n var edges = [];\n\n var height = \"calc(100vh - 226px - 70px)\";\n\n var selectedNode;\n var items = new Map();\n var nodeSet;\n var options = {\n nodes: {\n shape: 'box',\n size: 16,\n font: {\n size: 18,\n color: 'black',\n multi: true\n },\n borderWidth: 2,\n margin: { top: 20, right: 20, bottom: 20, left: 20 }\n },\n edges: {\n width: 2,\n length: 2,\n font: {\n background: 'white',\n size: 20\n }\n },\n width: '100%',\n height: height,\n interaction: {\n dragNodes: false,\n dragView: true,\n },\n layout: {\n hierarchical: {\n direction: 'UD',\n nodeSpacing: 300,\n blockShifting: false,\n sortMethod: 'directed'\n }\n },\n physics: {\n enabled: false\n }\n\n };\n\n // use \"hierarchy\" layout for displaying item info\n function getDataModelLayoutAttributes() {\n var attributesMap = new Map();\n var attributes = $rootScope.dataModel.filteredLayoutAttributes(\"hierarchy_item_info\");\n $rootScope.prepareAttributes(attributes);\n _.forEach(attributes, function(h_attrs) {\n attributesMap.set(h_attrs.name, h_attrs);\n });\n return attributesMap;\n }\n\n function getItemHierarchy() {\n\n var hierarchyName = $scope.currentHierarchy();\n var useNewHierarchyService = $rootScope.callService(CUSTOM_ITEM_HIERARCHY_SETTINGS, 'useNewHierarchyService', hierarchyName);\n if (!useNewHierarchyService) {\n return getOldItemHierarchy(hierarchyName);\n }\n\n var itemPrimaryKey = $scope.selectedItem.primaryKey__;\n if (_.isEmpty(itemPrimaryKey)) {\n $log.warn(\"'primaryKey__' not set in selected item\");\n return;\n }\n\n var filterChildRelationValues = $rootScope.getServiceFunction(CUSTOM_ITEM_HIERARCHY_SETTINGS, 'filterChildRelationValues');\n\n ItemHierarchyResource.get({ primaryKey: itemPrimaryKey, hierarchyName: hierarchyName },\n function(itemHierarchyResult) {\n\n var itemHierarchy = _.first(itemHierarchyResult);\n if (_.isNil(itemHierarchy)) {\n return;\n }\n\n itemHierarchy = itemHierarchy.toJSON();\n $log.debug(itemHierarchy);\n\n // Convert \"new\" item hierarchy into \"old\" hierarchy graph\n var hierarchyGraph = {\n items: [],\n relations: []\n };\n\n var includedPrimaryKeys = new Set();\n addItemHierarchyToHierarchyGraph(hierarchyGraph,\n itemHierarchy,\n itemHierarchy.rootPrimaryKey,\n 0,\n includedPrimaryKeys,\n filterChildRelationValues);\n\n nodeSet = setOldHierarchyGraph(hierarchyGraph);\n\n // fetch items and init graphs\n fetchItems(nodeSet);\n\n }\n );\n\n }\n\n function addItemHierarchyToHierarchyGraph(hierarchyGraph,\n itemHierarchy,\n parentPrimaryKey,\n level,\n includedPrimaryKeys,\n filterChildRelationValues) {\n\n // Don't continue traversing, if parent was already added\n if (includedPrimaryKeys.has(parentPrimaryKey)) {\n return;\n }\n\n // Add parent\n hierarchyGraph.items.push({ primaryKey: parentPrimaryKey, level: level });\n includedPrimaryKeys.add(parentPrimaryKey);\n\n // Add children, if any\n var childPrimaryKeys = getItemHierarchyChildren(itemHierarchy, parentPrimaryKey);\n if (_.isEmpty(childPrimaryKeys)) {\n return;\n }\n\n level = level + 1;\n _.forEach(childPrimaryKeys, function(childPrimaryKey) {\n\n // Add child\n addItemHierarchyToHierarchyGraph(hierarchyGraph,\n itemHierarchy,\n childPrimaryKey,\n level,\n includedPrimaryKeys,\n filterChildRelationValues);\n\n // Get and filter child relation values, if any\n var childRelationValues = getItemHierarchyChildRelationValues(itemHierarchy, parentPrimaryKey, childPrimaryKey);\n if (!_.isEmpty(childRelationValues) && _.isFunction(filterChildRelationValues)) {\n childRelationValues = filterChildRelationValues(itemHierarchy.hierarchyName,\n parentPrimaryKey,\n childPrimaryKey,\n childRelationValues);\n }\n\n // Old hierarchy implementation can only display one relation attribute,\n // so only show the first one in the map\n var relationAttribute;\n var relationValue;\n if (!_.isEmpty(childRelationValues)) {\n relationAttribute = _.first(_.keys(childRelationValues));\n relationValue = childRelationValues[relationAttribute];\n }\n\n hierarchyGraph.relations.push({\n parentItem: parentPrimaryKey,\n childItem: childPrimaryKey,\n relationAttribute: relationAttribute,\n relationValue: relationValue\n });\n\n });\n\n }\n\n function getItemHierarchyChildren(itemHierarchy, parentPrimaryKey) {\n return itemHierarchy.hierarchyMap[parentPrimaryKey];\n }\n\n function getItemHierarchyChildRelationValues(itemHierarchy, parentPrimaryKey, childPrimaryKey) {\n return (itemHierarchy.relationValuesMap[parentPrimaryKey] || {})[childPrimaryKey] || {};\n }\n\n function getOldItemHierarchy(hierarchyName) {\n\n var itemToViewHierarchy = $rootScope.cleanupItem($scope.selectedItem);\n itemToViewHierarchy = $rootScope.stringifyDeepValues(itemToViewHierarchy);\n\n OldItemHierarchyResource.post({ hierarchyName: hierarchyName },\n itemToViewHierarchy,\n function(itemHierarchyResult) {\n\n var jsonResult = itemHierarchyResult.toJSON();\n $log.debug(jsonResult);\n nodeSet = setOldHierarchyGraph(jsonResult);\n\n // fetch items and init graphs\n fetchItems(nodeSet);\n\n }\n );\n\n }\n\n function setOldHierarchyGraph(hierarchyGraph) {\n\n var nodeSet = new Set();\n\n for (var key in hierarchyGraph) {\n var val = hierarchyGraph[key];\n\n if (key == \"items\") {\n for (var i = 0; i < val.length; i++) {\n // check the type of item to accomdate\n // items with only \"primary key\" as string\n var itemObj = val[i];\n if (typeof itemObj === 'string') {\n nodeSet.add({ \"primaryKey\": itemObj });\n } else if (itemObj !== null && typeof itemObj === 'object') {\n nodeSet.add(itemObj);\n } else {\n $log.warn(\"Unrecognised format of items!\");\n }\n }\n } else if (key == \"relations\") {\n for (var j = 0; j < val.length; j++) {\n mapRelationToEdges(val[j]);\n }\n }\n }\n\n return nodeSet;\n }\n\n // init vis.js-recognisble edges from a list of edges\n mapRelationToEdges = function(relation) {\n if (relation.parentItem == null ||\n relation.childItem == null) {\n $log.warn(\"The relation data is missing one or more \" +\n \"of the following attributes: (parentItem, childItem)!\");\n }\n else {\n var edge = {\n from: relation.parentItem,\n to: relation.childItem\n };\n\n if (relation.relationValue != null && relation.relationAttribute != null) {\n edge.label = relation.relationValue;\n edge.title = relation.relationAttribute;\n }\n edges.push(edge);\n }\n };\n\n fetchItemsCallback = function() {\n $log.debug(\"Size of items \", items.size);\n // Rearranging the items by hierarchies\n var itemsByOrder = new Map();\n nodeSet.forEach(function(node) {\n if (node.primaryKey) {\n itemsByOrder.set(node.primaryKey, items.get(node.primaryKey));\n }\n });\n mapItemsToNodes(itemsByOrder);\n initGraph();\n };\n\n fetchItems = function(itemSet) {\n var promiseChain = [];\n $log.debug(\"Fetching all initial items for the graph...\");\n if (!_.isUndefined(itemSet)) {\n itemSet.forEach(function(item) {\n promiseChain.push(asyncFetchItem(item).$promise);\n });\n }\n $q.all(promiseChain)\n .then(fetchItemsCallback);\n };\n\n asyncFetchItem = function(itemObject) {\n var itemKey = itemObject.primaryKey;\n var deferred = $q.defer();\n\n return ItemResource.get({}, {\n 'primaryKey': itemKey\n },\n function(itemResult) {\n for (var key in itemResult) {\n var val = itemResult[key];\n if (_.isString(val)) {\n try {\n if (_.isObject(val)) {\n itemResult[key] = JSON.parse(val);\n } else {\n itemResult[key] = val;\n }\n } catch (e) { }\n }\n }\n itemResult.level = itemObject.level;\n $log.debug(itemResult);\n if (itemResult.primaryKey__ == $scope.item.primaryKey__) {\n // deep copy of current item to prevent unwanted changes on the item\n var tempCurrentItem = JSON.parse(JSON.stringify($scope.item));\n tempCurrentItem.level = itemObject.level;\n items.set($scope.item.primaryKey__, tempCurrentItem);\n } else {\n items.set(itemResult.primaryKey__, itemResult);\n }\n deferred.resolve(itemResult);\n });\n };\n\n // init vis.js-recognisble nodes from a list of Items\n mapItemsToNodes = function(items) {\n items.forEach(function(item, itemKey, map) {\n var labelString = $rootScope.getItemTitle(\"hierarchy\", item);\n // default label\n if (labelString == \"\") {\n labelString = itemKey.substring(0, itemKey.indexOf(':'));\n labelString = (labelString.length == 0) ? itemKey : labelString;\n labelString = labelString + \"\\n\" + $rootScope.translateCategory(item.category__);\n }\n var node = {\n id: itemKey,\n label: labelString\n };\n if (item.level !== null) {\n node.level = item.level;\n }\n nodes.push(node);\n });\n };\n\n // updates the current item-info panel view upon selection of a node\n updateitemHierarchyLayoutMapping = function() {\n $scope.itemHierarchyLayoutMapping = [];\n dataModelLayoutAttribute.forEach(function(value, key, map) {\n // FIXME: use another way to detect various data types...\n if (!_.isUndefined($scope.selectedItem[key])) {\n var attributeData = {};\n attributeData.attribute = value;\n attributeData.value = $scope.selectedItem[key];\n $scope.itemHierarchyLayoutMapping.push(attributeData);\n }\n });\n $log.debug($scope.itemHierarchyLayoutMapping);\n };\n\n // called whenever a node is selected\n onNodeChosen = function(itemKey) {\n var chosenItem = items.get(itemKey);\n if (chosenItem == null) {\n $log.warn(\"You just selected a node \" + itemKey + \" which cannot be found!\");\n return;\n }\n $scope.selectedItem = chosenItem;\n if (itemKey == $scope.item.primaryKey__) {\n // update the item accordingly for unsaved changes\n tempCurrentItem = JSON.parse(JSON.stringify($scope.item));\n tempCurrentItem.level = chosenItem.level;\n items.set($scope.item.primaryKey__, tempCurrentItem);\n }\n updateitemHierarchyLayoutMapping();\n };\n\n initGraph = function() {\n var container = document.getElementById('visualization');\n var data = {\n nodes: nodes,\n edges: edges\n };\n network = new vis.Network(container, data, options);\n network.on(\"click\", function(params) {\n params.event = \"[original event]\";\n var selectedNodeKey = this.getNodeAt(params.pointer.DOM);\n\n if (selectedNodeKey == undefined) {\n return;\n }\n $log.debug('You have clicked on ' + this.getNodeAt(params.pointer.DOM));\n onNodeChosen(selectedNodeKey);\n });\n\n // programatically select the first node to be the current item\n if (nodes.length != 0) {\n network.selectNodes([$scope.item.primaryKey__]);\n onNodeChosen($scope.item.primaryKey__);\n }\n };\n\n renderItemHierarchy = function() {\n $log.info(\"Switched to hierarchy view '\" + $scope.currentHierarchy() + \"'\");\n getItemHierarchy();\n };\n\n (function init() {\n renderItemHierarchy();\n })();\n });\n","angular.module('llax')\n.controller('EditorViewController', ['$rootScope', '$scope', 'growl', '$dialogs', '$translate', '$window',\n function($rootScope, $scope, growl, $dialogs, $translate, $window) {\n\n $scope.view = {\n 'userId': $scope.user.id,\n 'name': ''\n };\n\n $scope.userViews = [];\n $scope.currentUserViews = [];\n var LocalStorage = $window.localStorage;\n\n $scope.disabledSections = [];\n $scope.disabledAttributes = [];\n $scope.isAllAttributesDisabled = false;\n $scope.currentlySelectedView = null;\n\n $scope.onAddView = false;\n $scope.onEditView = false;\n $scope.onEnterViewName = false;\n $scope.onViewSelected = false;\n\n $scope.loadUserViews = function() {\n if (LocalStorage.getItem(\"userviews\")) {\n var currentUserViews = [];\n $scope.userViews = JSON.parse(LocalStorage.getItem(\"userviews\"));\n if ($scope.userViews.length > 0) {\n for (i = 0; i < $scope.userViews.length; i++) {\n if ($scope.userViews[i].userId == $scope.user.id) {\n currentUserViews.push($scope.userViews[i]);\n }\n }\n }\n $scope.currentUserViews = currentUserViews;\n } else {\n LocalStorage.setItem(\"userviews\", JSON.stringify($scope.userViews));\n }\n };\n\n $scope.loadUserViews();\n\n $scope.saveCurrentView = function(currentView) {\n LocalStorage.setItem(\"currentView\", JSON.stringify(currentView));\n };\n\n $scope.loadCurrentView = function() {\n var currentView = JSON.parse(LocalStorage.getItem(\"currentView\"));\n if (currentView) {\n if (currentView.userId != $scope.user.id) {\n resetView();\n } else {\n $scope.currentlySelectedView = currentView;\n $scope.viewSelected = true;\n $scope.disabledAttributes = currentView.fields;\n }\n }\n };\n\n $scope.loadCurrentView();\n\n $scope.showSettings = function() {\n $scope.onShowSettings = ($scope.onShowSettings) ? false : true;\n };\n\n $scope.createView = function() {\n $scope.onAddView = ($scope.onAddView) ? false : true;\n $scope.onShowSettings = false;\n $scope.disabledAttributes = [];\n $scope.viewSelected = false;\n };\n\n $scope.editView = function(view) {\n $scope.disabledAttributes = angular.copy(view.fields);\n if ($scope.onEditView == false) {\n $scope.onEditView = true;\n }\n $scope.currentlyEditedView = view;\n $scope.onShowSettings = false;\n };\n\n $scope.enterViewName = function() {\n $scope.onEnterViewName = ($scope.onEnterViewName) ? false : true;\n };\n\n $scope.selectView = function(view) {\n $scope.disabledAttributes = view.fields;\n $scope.currentlySelectedView = view;\n $scope.viewSelected = true;\n $scope.onShowSettings = false;\n\n $scope.saveCurrentView(view);\n };\n\n $scope.resetView = function() {\n LocalStorage.removeItem(\"currentView\");\n $scope.disabledAttributes = [];\n $scope.currentlySelectedView = null;\n $scope.viewSelected = false;\n $scope.onShowSettings = false;\n };\n\n $scope.cancelView = function() {\n if ($scope.onEnterViewName) {\n $scope.onEnterViewName = false;\n $scope.view.name = \"\";\n } else {\n if (!$scope.viewSelected) {\n $scope.disabledAttributes = [];\n }\n $scope.onAddView = false;\n $scope.onEditView = false;\n }\n };\n\n $scope.saveView = function(name) {\n var isNew = !name;\n name = name || $scope.view.name;\n var attributes = $scope.disabledAttributes;\n var newAttributes = [];\n\n for (var i = 0; i < attributes.length; i++) {\n newAttributes.push(attributes[i]);\n }\n\n var view = {\n 'userId': $scope.user.id,\n 'name': name,\n 'fields': newAttributes\n };\n\n $scope.onAddView = false;\n $scope.onEditView = false;\n $scope.onEnterViewName = false;\n $scope.view.name = \"\";\n $scope.isAllAttributesDisabled = false;\n $scope.disabledAttributes = [];\n $scope.disableSections = [];\n if (isNew || ($scope.currentlySelectedView && $scope.currentlySelectedView.name == name)) {\n $scope.selectView(view);\n }\n saveView(view, isNew);\n };\n\n $scope.deleteView = function(view) {\n var message = $translate.instant('VIEW.CONFIRM_DELETE_VIEW');\n var confirmDialog = $dialogs.confirm('', message);\n confirmDialog.result.then(function() {\n deleteView(view);\n $scope.onEditView = false;\n if ($scope.currentlySelectedView && $scope.currentlySelectedView.name == name) {\n resetView();\n }\n });\n };\n\n function deleteView(view) {\n var idx = $scope.userViews.indexOf(view);\n var idxCurrent = $scope.currentUserViews.indexOf(view);\n if (idx > -1) {\n $scope.userViews.splice(idx, 1);\n $scope.currentUserViews.splice(idxCurrent, 1);\n LocalStorage.setItem(\"userviews\", JSON.stringify($scope.userViews));\n }\n $scope.currentlyEditedView = null;\n }\n\n function saveView(view, isNew) {\n if (isNew) {\n $scope.currentUserViews.push(view);\n $scope.userViews.push(view);\n } else {\n var userView = _.find($scope.userViews, {name:view.name});\n userView.fields = view.fields;\n }\n if ($scope.viewSelected) {\n $scope.disabledAttributes = angular.copy(view.fields);\n }\n LocalStorage.setItem(\"userviews\", JSON.stringify($scope.userViews));\n $scope.currentlyEditedView = null;\n }\n\n function resetView() {\n LocalStorage.removeItem(\"currentView\");\n $scope.disabledAttributes = [];\n $scope.currentlySelectedView = null;\n $scope.viewSelected = false;\n $scope.onShowSettings = false;\n }\n\n $scope.toggleSelection = function(attribute) {\n var idx = $scope.disabledAttributes.indexOf(attribute.name);\n if (idx > -1) {\n $scope.disabledAttributes.splice(idx, 1);\n } else {\n $scope.disabledAttributes.push(attribute.name);\n }\n };\n\n $scope.isAttributeVisible = function(attribute) {\n if ($scope.onAddView || $scope.onEditView) {\n return true;\n }\n return _.isEmpty($scope.disabledAttributes) ||\n !_.includes($scope.disabledAttributes, (_.isObject(attribute) ? attribute.name : attribute));\n };\n\n $scope.disableAllAttributes = function() {\n if ($scope.isAllAttributesDisabled) {\n $scope.disabledAttributes = [];\n $scope.disabledSections = [];\n } else {\n var sections = $scope.sections;\n for (var i = 0; i < sections.length; i++) {\n var attributes = sections[i].attributes;\n for (var j = 0; j < attributes.length; j++) {\n if ($scope.disabledAttributes.indexOf(attributes[j].name) == -1) {\n $scope.disabledAttributes.push(attributes[j].name);\n }\n }\n if ($scope.disabledSections.indexOf(sections[i].name) == -1) {\n $scope.disabledSections.push(sections[i].name);\n }\n }\n }\n $scope.isAllAttributesDisabled = !$scope.isAllAttributesDisabled;\n };\n\n $scope.disableSection = function(section) {\n var sections = $scope.sections;\n var attributes = [];\n if ($scope.disabledSections.indexOf(section.name) > -1) {\n for (var i = 0; i < sections.length; i++) {\n if (section.name == sections[i].name) {\n attributes = sections[i].attributes;\n var index = -1;\n for (var j = 0; j < attributes.length; j++) {\n index = $scope.disabledAttributes.indexOf(attributes[j].name);\n $scope.disabledAttributes.splice(index, 1);\n }\n index = $scope.disabledSections.indexOf(sections[i].name);\n $scope.disabledSections.splice(index, 1);\n break;\n }\n }\n } else {\n for (var k = 0; k < sections.length; k++) {\n if (section.name == sections[k].name) {\n attributes = sections[k].attributes;\n for (var l = 0; l < attributes.length; l++) {\n if ($scope.disabledAttributes.indexOf(attributes[l].name) == -1) {\n $scope.disabledAttributes.push(attributes[l].name);\n }\n }\n if ($scope.disabledSections.indexOf(sections[k].name) == -1) {\n $scope.disabledSections.push(sections[k].name);\n }\n break;\n }\n }\n }\n };\n }\n ]);\n","angular.module('llax')\n .controller('errorDetailsController', ['$rootScope', '$scope', '$document', '$location', '$sce', '$modalInstance', '$translate', '$filter', '$parse', 'growl', 'row',\n function ($rootScope, $scope, $document, $location, $sce, $modalInstance, $translate, $filter, $parse, growl, row) {\n $scope.error = row;\n $scope.showDetails = false;\n $scope.userName = $rootScope.getUserSalutation($rootScope.user);\n $scope.mailToLink = \"mailto:\" + getSupportEmail() + \"?subject=Import%20Error%3A%20\" + $scope.error.errorType +\n \"&body=Dear%20Support%20Team%2C%0D%0A%0D%0Athe%20following%20Error%20was%20experienced%20when%20importing%20a%20file%3A%0D%0A%0D%0A\" + $scope.error.message +\n \"%0D%0A\" + JSON.stringify($scope.error.errorParameters) + \"%0D%0A%0D%0APlease%20let%20me%20know%20how%20to%20solve%20this%20issue.%0D%0A%0D%0AKind%20Regards%0D%0A%0D%0A\" + $scope.userName;\n\n $scope.cancel = function () {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.upgradePlan = function () {\n $modalInstance.close();\n $location.path(\"/profile\");\n };\n\n //TO-DO: Implement restarting of an import\n // $scope.restartImport = function() {\n // };\n\n $scope.toggleDetails = function () {\n $scope.showDetails = !$scope.showDetails;\n };\n\n function getSupportEmail() {\n if (!_.isNil($rootScope.customSiteSupportEmail)) {\n return $rootScope.customSiteSupportEmail;\n } else {\n return $rootScope.systemSettings.SUPPORT_EMAIL;\n }\n }\n\n }\n ]);\n","angular.module('llax')\n .controller('ExportMappingController',\n function($rootScope, $scope, $modalInstance, growl, data, ExportMappingResource, ExportMappingService, $timeout, $filter, UsersService, $routeParams, $parse) {\n $scope.attributesList = [];\n $scope.allAttributes = [];\n $scope.customValues = {};\n $scope.exportAttributes = [];\n\n $scope.exportProfiles = data.profiles;\n $scope.privateProfiles = false;\n $scope.publicProfiles = false;\n $scope.vm = {\n filteredAttributes: [],\n query: '',\n saveFilledExportAll: false,\n saveFilledExport: false,\n showOnlySelected: false\n };\n $scope.allAttributesConditionFlag = false;\n\n var parentscope = data.parentscope;\n $scope.exportType = data.exportType;\n\n $scope.sortableOptions = {\n handle: '> .export-attributes-handle',\n start: function() {\n $scope.sort = {\n type: '',\n reverse: null\n };\n }\n };\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.clearSearchQuery = function () {\n $scope.vm.query = \"\";\n };\n\n $scope.toggleSelectAll = function(attributes, selectAll) {\n _.forEach(attributes, function(entry) {\n entry.selected = selectAll;\n });\n };\n\n $scope.allSelected = function(entries) {\n return _.every(entries, 'selected');\n };\n\n function getCurrentMapping(reset) {\n return _($scope.attributesList)\n .filter('selected')\n .map(function(entry) {\n return {\n internalName: entry.internalName,\n externalName: entry.externalName || null\n };\n })\n .value();\n }\n\n function getCurrentProfile() {\n var allFieldExportFlag = $scope.vm.saveFilledExportAll;\n\n var mappings = getCurrentMapping();\n if (_.isEmpty(mappings) && $scope.exportType.usesMapping) {\n growl.warning(\"EXPORT.EMPTY_MAPPING\");\n return false;\n }\n\n var profile;\n if (isProfileEqual($scope.activeExportProfile, mappings, $scope.customValues)) {\n profile = $scope.activeExportProfile;\n } else if ($scope.allAttributes.length === $scope.getSelectedCount() &&\n _.isEmpty($scope.customValues)) {\n activeProfile = $scope.activeExportProfile;\n\n if (allFieldExportFlag || (activeProfile && activeProfile.allAttribute === true)) {\n $scope.allAttributesConditionFlag = true;\n profile = {\n name: 'internal__',\n contentType: $scope.exportType.contentType,\n customValues: $scope.customValues,\n mappings: mappings,\n privateMapping: true,\n allAttribute: true\n };\n } else {\n profile = {\n name: 'NO_MAPPING'\n };\n }\n } else {\n profile = {\n name: 'internal__',\n contentType: $scope.exportType.contentType,\n customValues: $scope.customValues,\n mappings: mappings,\n privateMapping: true\n };\n }\n\n return profile;\n }\n\n function isProfileEqual(profile, mappings, customValues) {\n\n if (!profile) {\n return false;\n }\n\n // Check for changed mappings\n if (!_.isEqual(profile.mappings, mappings)) {\n return false;\n }\n\n // Check for changed custom values\n if (!_.isEqual(profile.customValues || {}, customValues || {})) {\n return false;\n }\n\n return true;\n }\n\n $scope.onProfileNameChange = function() {\n $scope.editActiveExportProfile = true;\n };\n\n $scope.runExport = function() {\n if ($scope.vm.saveFilledExport) {\n var validationResult = false;\n if (!$scope.activeExportProfile || $scope.editActiveExportProfile) {\n validationResult = $scope.updateExportProfile($scope.vm.tmpProfile);\n } else if ($scope.activeExportProfile && !$scope.editActiveExportProfile) {\n validationResult = $scope.updateExportProfile($scope.activeExportProfile);\n }\n\n if (!validationResult) {\n return;\n }\n }\n\n var profile = null;\n if (!$scope.exportType.usesMapping && _.isEmpty($scope.exportType.attributes)) {\n profile = { name: 'NO_MAPPING' };\n } else {\n profile = getCurrentProfile();\n if (!profile) {\n return;\n }\n }\n\n var key = profile.key ? profile.key : profile.name;\n\n if (profile.name === 'NO_MAPPING') {\n ExportMappingResource.activate({},\n null,\n function(response) {\n parentscope.createExportFromSelection($scope.exportType);\n $modalInstance.close();\n }\n );\n } else if (profile.name != 'internal__' && $scope.allAttributesConditionFlag === false && !_.isEqual(profile.userId, $scope.$parent.user.userId)) {\n ExportMappingResource.activate({},\n key,\n function(response) {\n parentscope.createExportFromSelection($scope.exportType);\n $modalInstance.close();\n }\n );\n } else {\n ExportMappingResource.save({},\n profile,\n function(response) {\n ExportMappingResource.activate({},\n key,\n function(response) {\n $timeout(function() {\n parentscope.createExportFromSelection($scope.exportType);\n $modalInstance.close();\n }, 250);\n },\n function(errorResponse) {\n growl.error(\"UPLOADED_MAPPING_FAILED\");\n }\n );\n },\n function(errorResponse) {\n growl.error(\"UPLOADED_MAPPING_FAILED\");\n $modalInstance.close();\n }\n );\n }\n };\n\n function getAttributes() {\n var layout = (data.exportType ? data.exportType.layout : null ) || 'mapping';\n return _.map($rootScope.dataModel.filteredLayoutAttributes(layout), function(attr) {\n var dontFilter = $rootScope.dataModel.sectionAttributeParam('mapping', {}, null, attr.name, 'dontFilter');\n return {\n internalName: attr.name,\n label: attr.label,\n dontFilter: dontFilter\n };\n });\n }\n\n $scope.toggleOnlySelected = function() {\n if ($scope.vm.showOnlySelected) {\n $scope.attributesList = $scope.getOnlySelected();\n } else {\n $scope.attributesList = $scope.allAttributes;\n }\n };\n\n $scope.getOnlySelected = function() {\n return _.filter($scope.attributesList, 'selected');\n };\n\n $scope.getSelectedCount = function() {\n return _.filter($scope.attributesList, 'selected').length;\n };\n\n $scope.updateExportProfile = function(profile) {\n\n if (profile) {\n var isNewProfile = !profile.mappings;\n\n if (isNewProfile) {\n profile.privateMapping = !$scope.vm.publicExportMapping;\n profile.userId = $scope.$parent.user.userId;\n profile.key = $scope.vm.publicExportMapping ? profile.name : profile.userId + \"/\" + profile.name;\n\n var existing = _.some($scope.exportProfiles, {\n name: profile.name\n });\n\n if (existing) {\n growl.error('EXPORT.PROFILE_SAVED.ERROR_CONFLICT_MESSAGE',{variables: {profileName: profile.name}});\n angular.element(\"#export-profile-name-input\").focus();\n return false;\n }\n }\n profile.mappings = getCurrentMapping();\n profile.contentType = $scope.exportType.contentType;\n if (!_.isEmpty($scope.customValues)) {\n profile.customValues = $scope.customValues;\n }\n var emptyMapping = _.isEmpty(profile.mappings);\n if (emptyMapping && !profile.usesMapping) {\n growl.warning(\"EXPORT.EMPTY_MAPPING\");\n return false;\n }\n\n var allFieldExportFlag = $scope.vm.saveFilledExportAll;\n var activeProfile = $scope.activeExportProfile;\n\n if (allFieldExportFlag || (activeProfile && activeProfile.allAttribute === true)) {\n profile.allAttribute = true;\n }\n\n saveExportProfile(profile, isNewProfile);\n return true;\n } else {\n growl.warning('EXPORT.EMPTY_PROFILE_NAME');\n return false;\n }\n };\n\n $scope.deleteExportProfile = function(profile, fromUpdate) {\n ExportMappingResource.delete({}, {\n mappingName: profile.name\n },\n function(response) {\n if (!fromUpdate) {\n _.remove($scope.exportProfiles, {\n 'name': profile.name\n });\n growl.success(\"EXPORT.PROFILE_DELETED.SUCCESS_MESSAGE\");\n $scope.activateExportProfile();\n }\n },\n function(response) {\n var message = _.isEqual(response.data.message,'EXPORT.PROFILE_DELETED.ERROR_PERMISSION') ? response.data.message : 'EXPORT.PROFILE_DELETED.ERROR_MESSAGE';\n growl.error(message);\n }\n );\n };\n\n function saveExportProfile(profile, isNewProfile) {\n ExportMappingResource.save({},\n profile,\n function(response) {\n if (isNewProfile) {\n $scope.exportProfiles.push(response);\n } else {\n angular.extend(_.find($scope.exportProfiles, {\n 'name': response.name\n }), response);\n }\n $scope.activateExportProfile(response);\n growl.success('EXPORT.PROFILE_SAVED.SUCCESS_MESSAGE');\n },\n function(response) {\n var message = _.isEqual(response.data.message,'EXPORT.PROFILE_SAVED.ERROR_PERMISSION') ? response.data.message : 'EXPORT.PROFILE_SAVED.ERROR_MESSAGE';\n growl.error(message);\n }\n );\n }\n\n $scope.activateExportProfile = function(profile) {\n $scope.layoutAttributes = getAttributes();\n $scope.attributesList = getFilteredAttributes(profile);\n $scope.allAttributes = $scope.attributesList;\n if (profile) {\n $scope.activeExportProfile = profile;\n $scope.vm.publicExportMapping = profile && !profile.privateMapping ? !profile.privateMapping : false;\n $scope.notCurrentUsersMapping = profile.userId && profile.key ? !_.isEqual(profile.userId, $scope.$parent.user.userId) : false;\n if (!_.isEmpty(profile.customValues)) {\n prepareCustomValues(profile);\n }\n if ($scope.vm.showOnlySelected) {\n $scope.attributesList = _.filter($scope.attributesList, {\n selected: true\n });\n }\n } else {\n $scope.activeExportProfile = null;\n $scope.vm.publicExportMapping = null;\n $scope.notCurrentUsersMapping = null;\n $scope.attributesList = _.forEach(getFilteredAttributes(profile), function(attribute){attribute.selected = true;});\n prepareCustomValues();\n }\n\n if ($scope.getSelectedCount() === $scope.attributesList.length) {\n $scope.selectAllForMapping = true;\n } else {\n $scope.selectAllForMapping = false;\n }\n $scope.sort = {\n type: '',\n reverse: null\n };\n $scope.editActiveExportProfile = false;\n $scope.tmpProfile = null;\n updateDropdown();\n };\n\n $scope.checkInput = function(profile) {\n if(!profile.name){\n $scope.editActiveExportProfile = false;\n }\n };\n\n function getFilteredAttributes(activeProfile) {\n var filteredAttributes = [];\n if (activeProfile) {\n filteredAttributes = _(activeProfile.mappings)\n .map(function(attr) {\n return {\n internalName: attr.internalName,\n label: $rootScope.translateAttribute($rootScope.dataModel.attribute(attr.internalName)),\n externalName: attr.externalName || null,\n selected: true\n };\n })\n .unionBy($scope.layoutAttributes, 'internalName')\n .filter(function(attribute) {\n var layoutAttribute = _.find($scope.layoutAttributes, {'internalName': attribute.internalName});\n\n if (_.isNil(layoutAttribute)) {\n return false;\n } else {\n $rootScope.prepareAttribute(layoutAttribute);\n // Always set layoutAttributes as selected if the export type doesn't useMappings\n if (layoutAttribute.selected || !$scope.exportType.usesMapping) {\n attribute.selected = true;\n }\n return true;\n }\n })\n .value();\n } else {\n var categories = [];\n\n if (!_.isNil($routeParams.category)) {\n categories = [$routeParams.category];\n } else if (!_.isEmpty(data.selectedFullItems) && data.selectedItems != \"ALL\" && _.isNil($routeParams.selectionId)) {\n categories = _.reduce(data.selectedFullItems,function(filtered, option) {\n if (!_.isNil(option.category__)) {\n filtered.push(option.category__);\n }\n return filtered;\n }, []);\n categories = _.uniq(categories);\n }\n\n if (!_.isEmpty(categories)) {\n _.forEach(categories, function(category) {\n var attrs = $rootScope.dataModel.categoryAttributes(category);\n filteredAttributes = filteredAttributes.concat(attrs);\n });\n filteredAttributes = _.map(angular.copy(filteredAttributes), function(attr) {\n return {\n internalName: attr.name,\n label: attr.label,\n };\n });\n var dontFilterAttrs = _.filter(angular.copy($scope.layoutAttributes), { 'dontFilter': true });\n filteredAttributes = filteredAttributes.concat(dontFilterAttrs);\n filteredAttributes = _.uniqBy(filteredAttributes, 'internalName');\n filteredAttributes = _.intersectionBy($scope.layoutAttributes, filteredAttributes, 'internalName');\n } else {\n filteredAttributes = _.map(angular.copy($scope.layoutAttributes), function(attr) {\n return {\n internalName: attr.internalName,\n label: attr.label,\n };\n });\n }\n }\n return filteredAttributes;\n }\n\n function updateDropdown() {\n $scope.privateProfiles = false;\n $scope.publicProfiles = false;\n\n var profilesWithOutInternal = _.filter($scope.exportProfiles,\n function(profile) {\n return !_.includes(profile.key, \"internal__\");\n }\n );\n\n if ($scope.showInternalProfile) {\n $scope.privateProfiles = true;\n } else {\n $scope.privateProfiles = _.some(profilesWithOutInternal, {\n 'userId': $scope.$parent.user.userId,\n 'privateMapping': true\n });\n }\n\n var publicProfiles = _.some(profilesWithOutInternal, {\n 'privateMapping': false\n });\n var oldProfiles = _.filter(profilesWithOutInternal,\n function(profile) {\n return !_.includes(profile.key, \"/\");\n }\n );\n $scope.publicProfiles = publicProfiles || oldProfiles.length > 0;\n }\n\n $scope.checkUserMapping = function(userId) {\n if(_.isEmpty(userId)){\n return true;\n } else {\n return _.isEqual(userId, $scope.$parent.user.userId);\n }\n };\n\n function prepareCustomValues(profile) {\n profile = profile || {};\n var customValues = profile.customValues || {};\n _.forEach($scope.exportAttributes, function(attr) {\n if (profile.contentType == $scope.exportType.contentType) {\n $scope.customValues[attr.name] = customValues[attr.name];\n if (attr.typeName == \"Document\") {\n var elementScope = angular.element(\".\" + attr.name + \"-upload-input\").scope();\n if (!_.isEmpty(elementScope)) {\n elementScope.inputValue = customValues[attr.name];\n elementScope.enterURL(customValues[attr.name]);\n }\n }\n } else {\n $scope.customValues[attr.name] = null;\n $scope.$broadcast('clearAttributeValue', attr.name);\n }\n });\n }\n\n $scope.uploadFileForItem = ExportMappingService.getUploadFileForItemConfiguration($scope);\n\n function init() {\n ExportMappingResource.getActive({},\n function(response) {\n var activeProfile = response.data;\n $scope.layoutAttributes = getAttributes();\n $scope.exportAttributes = _.map(data.exportType.attributes, function(attributeName) {\n return $rootScope.dataModel.attribute(attributeName);\n });\n $rootScope.prepareAttributes($scope.exportAttributes, true);\n if (activeProfile !== \"\") {\n $scope.activeExportProfile = _.find($scope.exportProfiles, {\n 'key': activeProfile.key\n });\n $scope.showInternalProfile = _.includes($scope.activeExportProfile.key,'internal__');\n $scope.vm.publicExportMapping = !$scope.activeExportProfile.privateMapping && !$scope.showInternalProfile ? !$scope.activeExportProfile.privateMapping : false;\n $scope.notCurrentUsersMapping = $scope.activeExportProfile.userId && $scope.activeExportProfile.key ? !_.isEqual($scope.activeExportProfile.userId, $scope.$parent.user.userId) : false;\n $scope.attributesList = getFilteredAttributes(activeProfile);\n } else {\n $scope.attributesList = _.forEach(getFilteredAttributes(activeProfile), function(attribute){attribute.selected = true;});\n }\n $scope.allAttributes = $scope.attributesList;\n prepareCustomValues(activeProfile);\n updateDropdown();\n $scope.sort = {\n type: '',\n reverse: null\n };\n },\n function(response) {\n growl.error('UPLOADED_MAPPING_FAILED');\n }\n );\n }\n init();\n }\n );\n","angular.module('llax')\n .controller('FeatureToggleCtrl', ['$location', '$routeParams', '$scope', 'FeatureToggleService',\n function($location, $routeParams, $scope, FeatureToggleService) {\n if ($routeParams.add) {\n FeatureToggleService.enableFeature($routeParams.add);\n }\n if ($routeParams.remove) {\n FeatureToggleService.disableFeature($routeParams.remove);\n }\n $location.path('/');\n }\n ]);\n","angular.module('llax')\n .controller('FetchItemController',\n function($http, $injector, $location, $modal, $rootScope, $routeParams, $scope, $timeout, $window, growl, uiGridConstants,\n CountItemsResource, ErrorCode, ExportFormatsResource, ExportItemResource, ExportMappingResource,\n HttpHeader, InputTemplatesService, QueryItemResource, SelectionResource, ValidateItemService, WatchlistService, ReactBridge) {\n\n var CUSTOM_PUBLICATION_SERVICE = \"CustomPublicationSettings\";\n\n $scope.canDepublish = true;\n $scope.selectionId = \"\";\n $scope.loadingItems = false;\n\n // This keeps track of the queries running through this controller.\n // It is used to make sure only the most recent request is handled.\n $scope.queryNumber = 0;\n\n $scope.sortOrder = {};\n\n $scope.exportFormats = [];\n ExportFormatsResource.query({\n returnKeyValueFormat: false\n }, function(response) {\n $scope.exportFormats = $scope.exportFormats.concat(response);\n });\n\n $scope.allVisibleItemsSelected = function() {\n var arr = _.map($scope.items, 'primaryKey__');\n var allSelected;\n if (WatchlistService.hasWatchlistItems()) {\n allSelected = _.isEqual(arr.sort(), WatchlistService.getWatchlistPrimaryKeys().sort());\n } else {\n allSelected = $scope.gridApi ? $scope.gridApi.selection.getSelectAllState() : false;\n }\n return allSelected;\n };\n\n $scope.itemsSelected = function() {\n if (!$scope.gridApi) {\n return false;\n }\n if (!_.isUndefined($scope.gridApi.selection)) {\n return ($scope.gridApi.selection.getSelectedCount() > 0);\n }\n };\n\n $scope.getSelectedItems = function() {\n\n // FIXME:\n // We should 'keep' the list of selected items accessible at all time via $scope.selectedItems.\n // That way, this method would not need to be called one million times!\n\n var selectedItems;\n if ($scope.allItemsSelected) {\n selectedItems = 'ALL';\n } else {\n selectedItems = $scope.getSelectedFullItems();\n selectedItems = selectedItems ? _.map(selectedItems, 'primaryKey__') : [];\n }\n\n return selectedItems;\n };\n\n $scope.canDepublish = function() {\n\n var canDepublish = true;\n var customPublicationService = $rootScope.getService(CUSTOM_PUBLICATION_SERVICE);\n if (customPublicationService) {\n var selectedItems = $scope.allItemsSelected ? null : $scope.getSelectedFullItems();\n canDepublish = customPublicationService.enableDepublication(selectedItems, $rootScope.user, $rootScope.organization);\n }\n\n return canDepublish;\n };\n\n $scope.getSelectedFullItems = function() {\n var selectedItems = $scope.gridApi ? $scope.gridApi.selection.getSelectedRows() : null;\n return selectedItems;\n };\n\n $scope.createItemSelection = function() {\n var selection = {};\n if ($scope.itemsSelected() && !$scope.allItemsSelected) {\n var selectedItems = $scope.getSelectedItems();\n selection.primaryKeys = selectedItems;\n } else if ($scope.allItemsSelected || $scope.allVisibleItemsSelected()) {\n selection.itemsQuery = $scope.createItemRestrictions();\n }\n return selection;\n };\n\n function startMappingEditor(selection, exportType) {\n ExportMappingResource.query(\n function(response) {\n $modal.open({\n templateUrl: 'tpl/export-mapping-editor.tpl.html',\n controller: 'ExportMappingController',\n resolve: {\n data: function() {\n return {\n profiles: response.data || [],\n selectedItems: selection,\n parentscope: $scope,\n exportType: exportType,\n selectedFullItems : $scope.getSelectedFullItems()\n };\n }\n },\n backdrop: true,\n size: 'lg',\n windowClass: ''\n });\n });\n }\n\n function startTemplateMappingSelector(selection) {\n $modal.open({\n templateUrl: 'tpl/template-mapping/modal-template-mapping-selector.tpl.html',\n controller: 'TemplateMappingSelectorController',\n resolve: {\n data: function () {\n return {\n parentScope: $scope\n };\n }\n },\n size: 'lg',\n backdrop: true\n });\n }\n\n $scope.validateItems = function(event) {\n // FIXME: Allow validation of selection!\n var selectedItems = $scope.getSelectedItems();\n if (selectedItems && selectedItems.length > 0 && selectedItems !== 'ALL') {\n ValidateItemService.validateItemSelection(selectedItems,\n function (process) {\n // FIXME: In order to know the exact number of items to validate\n // we would need to load the process and the right context.\n // For now, let's only take the number of selected items!\n growl.info(\"ITEMS_VALIDATION_STARTED\", {\n variables: {\n noOfItems: selectedItems.length\n }\n });\n },\n function(response) {\n growl.error(\"ITEMS_VALIDATION_START_FAILED\", {\n ttl: -1\n });\n }\n );\n } else {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n $scope.downloadItems = function(exportType) {\n var selectedItems = $scope.getSelectedItems();\n\n if (!selectedItems || selectedItems.length === 0) {\n growl.warning(\"NO_ITEMS_SELECTED\");\n } else if (exportType === 'template') {\n startTemplateMappingSelector(selectedItems);\n } else if (exportType.usesMapping || !_.isEmpty(exportType.attributes)) {\n startMappingEditor(selectedItems, exportType);\n } else {\n $scope.createExportFromSelection(exportType);\n }\n };\n\n $scope.createExportFromSelection = function(exportType) {\n var selection = $scope.createItemSelection();\n if (selection.itemsQuery && selection.itemsQuery.selectionId) {\n exportItems(selection.itemsQuery.selectionId, exportType.contentType);\n } else {\n SelectionResource.save(selection, function(response) {\n exportItems(response.selectionId, exportType.contentType);\n });\n }\n };\n\n function exportItems(selectionId, contentType) {\n ExportItemResource.get({\n selectionId: selectionId,\n type: contentType,\n language: $rootScope.language\n }, function(exportResponse) {\n var location = $window.location.protocol + \"//\" + $window.location.host + \"/exports\";\n growl.success(\"ITEM.EXPORT_SUCCESS\", {\n variables: {\n link: location\n },\n ttl: 5000\n });\n });\n }\n\n $scope.createExportForExportMapping = function(exportMapping) {\n var selection = $scope.createItemSelection();\n ExportItemResource.save({\n exportMapping: exportMapping,\n selection: selection,\n language: $rootScope.language\n }, function() {\n var location = $window.location.protocol + \"//\" + $window.location.host + \"/exports\";\n growl.success(\"ITEM.EXPORT_SUCCESS\", {\n variables: {\n link: location\n },\n ttl: 5000\n });\n });\n };\n\n $scope.doDownloadItems = function(selectionId, exportType) {\n // we need to use $http instead of resource here, as ngResource is not able to\n // deserialize binary data\n\n $http({\n url: lax_rest_url_complete('items/exports/' + selectionId + '?type=' + exportType.key),\n method: \"GET\",\n headers: {'Content-Type': 'application/json'},\n responseType: 'arraybuffer'\n })\n .then(function(reponse) {\n var hiddenElement = document.createElement('a');\n\n document.body.appendChild(hiddenElement);\n hiddenElement.href = URL.createObjectURL(new Blob([reponse.data], {\n type: exportType.responseType\n }));\n hiddenElement.download = 'ItemExport.xls';\n hiddenElement.click();\n hiddenElement.remove();\n });\n };\n\n $scope.createItemRestrictions = function() {\n var queryParser = $rootScope.dataModel.queryParser('search');\n\n var keywordQuery = '';\n if ($scope.query && !_.isNil($scope.query.keyword)) {\n keywordQuery += $rootScope.escapeSearchTerm($scope.query.keyword);\n } else if ($routeParams.q) {\n if (keywordQuery !== '') {\n keywordQuery += ' AND ';\n }\n keywordQuery += $rootScope.escapeSearchTerm($routeParams.q.split(\"+\").join(\" \"));\n }\n\n if (!_.isUndefined(queryParser)) {\n if (!queryParser.isLegal(keywordQuery)) {\n return;\n }\n keywordQuery = queryParser.parseQuery(keywordQuery);\n }\n\n var itemsQuery = {};\n\n if ($routeParams.selectionId) {\n itemsQuery.selectionId = $routeParams.selectionId;\n } else {\n itemsQuery = {\n keyword: (keywordQuery || undefined),\n recipient: ($routeParams.recipient || undefined),\n compliant: ($routeParams.compliant || undefined),\n category: ($rootScope.escapeSearchTerm($routeParams.category) || undefined),\n publicationTaskId: ($routeParams.publicationTaskId || undefined),\n withPublicationTaskChecksums: ($routeParams.withPublicationTaskChecksums || undefined),\n publicationTaskStates: ($routeParams.publicationTaskStates || undefined),\n publicationDestination: ($routeParams.publicationDestination || undefined),\n publicationStatus: ($routeParams.publicationStatus || undefined),\n taskId: ($routeParams.taskId || undefined),\n tags: ($routeParams.tags || undefined),\n errorKey: ($rootScope.escapeSearchTerm($routeParams.errorKey) || undefined),\n warningKey: ($rootScope.escapeSearchTerm($routeParams.warningKey) || undefined),\n reviewErrorKey: ($rootScope.escapeSearchTerm($routeParams.reviewErrorKey) || undefined),\n reviewWarningKey: ($rootScope.escapeSearchTerm($routeParams.reviewWarningKey) || undefined),\n reviewer: ($routeParams.reviewer || undefined),\n reviewStatus: ($routeParams.reviewStatus || undefined),\n bulkSubscriptionId: ($routeParams.bulkSubscriptionId || undefined),\n bulkSearchId: ($routeParams.bulkSearchId || undefined)\n };\n\n }\n\n return itemsQuery;\n };\n\n $scope.updateItems = function(itemSelection) {\n var selection = {};\n var selectedItems = [];\n if (itemSelection) {\n selection.primaryKeys = _.map(itemSelection, 'primaryKey__');\n selectedItems = selection.primaryKeys;\n } else {\n selection = $scope.createItemSelection();\n selectedItems = $scope.getSelectedItems();\n }\n if (!selectedItems || selectedItems.length === 0) {\n growl.warning(\"NO_ITEMS_SELECTED\");\n } else {\n // startMassUpdateEditor(selection, selectedItems);\n var dialog = ReactBridge.mountDialog(\"MassUpdateDialog\", \"#react-mass-update-dialog\",\n {\n data: {\n selection: selection,\n selectedItems: selectedItems\n },\n item: $scope.item,\n category: $routeParams.category,\n onClose: function(toWait) {\n // Unmount the dialog after waiting if toWait is true, otherwise unmount immediately\n function unmount(){\n dialog.unmount();\n }\n return toWait? ReactBridge.unmountWhenReady(unmount): dialog.unmount();\n }\n });\n }\n };\n\n function loadWatchlistItems() {\n var selectedItems = {\n primaryKeys: WatchlistService.getWatchlistPrimaryKeys()\n };\n SelectionResource.save(selectedItems,\n function(response) {\n $location.search('selectionId', response.selectionId);\n }\n );\n }\n\n $scope.doFetchItems = function(config, fields) {\n\n // Loading items without fields does not make sense\n if (_.isEmpty(fields)) {\n return;\n }\n\n if ($routeParams.selectionId === true) {\n loadWatchlistItems();\n return;\n }\n\n config = config || {};\n\n if (!config.append) {\n $scope.cursor = null;\n $scope.page = 1;\n $scope.searchFinished = false;\n }\n fields = fields.concat($rootScope.dataModel.ADDITIONAL_FIELDS || []);\n\n fields = fields.concat($rootScope.dataModel.filterPrimaryKeyPartAttributes());\n\n $scope.restrictions = $scope.createItemRestrictions();\n if (!$scope.restrictions) { return; }\n\n $scope.loadingItems = true;\n\n $scope.pageParams = {\n fields: fields || null,\n page: ($scope.page || null),\n count: 40\n };\n\n var queryParams = angular.copy($scope.restrictions);\n var queryService = $rootScope.getService('CustomItemQueryService');\n if (queryService) {\n queryParams.keyword = _.invoke(queryService, 'filterQuery', queryParams.keyword, $rootScope.user, $rootScope.organization) || queryParams.keyword;\n }\n\n angular.extend(queryParams, $scope.pageParams, $scope.sortOrder);\n // Update the queryNumber for the upcoming request.\n $scope.queryNumber += 1;\n var queryNumber = $scope.queryNumber;\n\n var queryItemResource = QueryItemResource.createCursorAwareResource($scope.cursor);\n if (queryParams.keyword && queryParams.keyword.length > 2000) {\n var options = {};\n options.queryParams = queryParams;\n var keyword = queryParams.keyword;\n delete queryParams.keyword;\n queryItemResource.search(queryParams, keyword, successFn, errorFn);\n } else {\n queryItemResource.query(queryParams, successFn, errorFn);\n }\n\n function successFn(res, headers) {\n\n // This ensures that changes only happen, if the returned request\n // is the most recent one. I another request has been started before\n // this one returns, $scope.queryNumber will have been increased\n // and we exit this handler.\n if (queryNumber < $scope.queryNumber) {\n return;\n }\n\n $scope.errorMessage = null;\n $scope.errorCode = ErrorCode.NONE;\n $scope.status = res.$promise.$$state.status;\n\n if (res.length === 0) {\n\n // Stop reloading if no items were found\n $scope.cursor = null;\n $scope.numberFound = 0;\n $scope.maxNumberFound = 0;\n $scope.searchFinished = true;\n\n } else {\n\n var cursor = headers(HttpHeader.ITEM_CURSOR);\n $scope.numberFound = parseInt(headers(HttpHeader.ITEMS_FOUND)) || 0;\n $scope.maxNumberFound = parseInt(headers(HttpHeader.ITEMS_MAX)) || 0;\n\n if (cursor) {\n if (cursor === $scope.cursor) {\n $scope.searchFinished = true;\n }\n $scope.cursor = cursor;\n } else {\n $scope.searchFinished = true;\n }\n\n }\n\n if (config.append === true && !$routeParams.selectionId) {\n $scope.items = $scope.items.concat(res);\n if ($scope.gridApi) {\n $timeout(function() {\n $scope.gridApi.infiniteScroll.saveScrollPercentage();\n $scope.gridApi.infiniteScroll.dataLoaded(false, true);\n if (WatchlistService.hasWatchlistItems()) {\n _.forEach(WatchlistService.getWatchlistPrimaryKeys(), function(entry) {\n $scope.gridApi.selection.selectRow(_.find($scope.items, {primaryKey__: entry}));\n });\n }\n if ($scope.allVisibleItemsSelected()) {\n $scope.gridApi.selection.selectAllRows();\n }\n });\n }\n } else {\n $scope.items = res;\n if ($scope.gridApi) {\n $timeout(function() {\n $scope.gridApi.core.scrollToIfNecessary(0, 0);\n $scope.gridApi.infiniteScroll.resetScroll(false, true);\n $scope.gridApi.infiniteScroll.dataLoaded(false, true);\n if (WatchlistService.hasWatchlistItems()) {\n _.forEach(WatchlistService.getWatchlistPrimaryKeys(), function(entry) {\n $scope.gridApi.selection.selectRow(_.find($scope.items, {primaryKey__: entry}));\n });\n }\n if ($scope.allVisibleItemsSelected()) {\n $scope.gridApi.selection.selectAllRows();\n }\n $scope.gridApi.core.notifyDataChange(uiGridConstants.dataChange.COLUMN);\n }, 50);\n }\n }\n $scope.loadingItems = false;\n $scope.$emit('checkUsageLimits');\n }\n\n function errorFn(response) {\n $scope.errorCode = $rootScope.getErrorCode(response);\n if ($scope.errorCode === ErrorCode.SEARCH_QUERY_TOO_LONG) {\n if ($rootScope.hasSettingFeature('BULK_SEARCH')) {\n var queryValues = _.replace($scope.query.keyword, / OR /g, \"\\n\");\n var valueCount = (_.countBy(queryValues)['\\n'] || 0) + 1;\n $scope.newBulkSearch(queryValues, valueCount);\n } else {\n growl.error(\"ERROR_LOADING_ITEMS\");\n }\n } else if ($scope.errorCode !== ErrorCode.SEARCH_QUERY_INVALID) {\n growl.error(\"ERROR_LOADING_ITEMS\");\n }\n $scope.errorMessage = $rootScope.getErrorMessage(response);\n if ($scope.gridApi) {\n $scope.gridApi.infiniteScroll.dataLoaded(false, true);\n }\n $scope.status = response.status;\n $scope.loadingItems = false;\n $scope.searchFinished = true;\n }\n\n };\n\n $scope.countItems = function () {\n var itemsQuery = $scope.createItemRestrictions();\n delete itemsQuery.primaryKeys;\n $scope.countingItems = true;\n CountItemsResource.count({ itemsQuery: itemsQuery }, function(response) {\n $scope.numberFound = response.numberOfItems;\n $scope.maxNumberFound = response.numberOfItems;\n }).$promise.finally(function() {\n $scope.countingItems = false;\n });\n };\n\n $scope.$on('fetchItems', function(event, config, fields) {\n if(!fields) {\n fields = $rootScope.dataModel.filteredLayoutAttributeNames($scope.currentLayout);\n }\n $scope.doFetchItems(config, fields);\n });\n\n });\n","angular.module('llax')\n .controller('InvitationsController',\n function($location, $scope, $rootScope, $translate, $dialogs, $modal, $q, ContactsResource, growl, InvitationResource,\n InviteByEmailResource, TabContainer) {\n\n $scope.query = {\n keyword: '',\n type: '',\n closedVisible: false\n };\n\n $scope.requestTypeFilters = [{\n key: '',\n value: $translate.instant('INVITATIONS.ALL_INVITATIONS')\n }, {\n key: 'CONTACT_REQUEST',\n value: $translate.instant('INVITATIONS.IN_PLATFORM')\n }, {\n key: 'EMAIL_INVITATION',\n value: $translate.instant('INVITATIONS.EMAIL_INVITATIONS')\n }];\n\n function initTabContainer() {\n var tabContainer = new TabContainer($scope, $location, [{\n suburl: \"pending\",\n title: $translate.instant('PENDING_INVITATIONS'),\n template: 'tpl/pending-invitations.tpl.html'\n }, {\n suburl: \"requested\",\n title: $translate.instant('CONTACT_REQUESTS'),\n template: 'tpl/requested-invitations.tpl.html'\n }], 'pending');\n }\n\n function loadPending() {\n InvitationResource.query({\n state: 'PENDING'\n },\n function(pendingInvitations) {\n $scope.pendingInvitations = pendingInvitations;\n });\n }\n\n function loadEmailInvitations() {\n return InviteByEmailResource.query({\n type: ['INVITED_BUYER', 'INVITED_COMMUNITY_MEMBER', 'INVITED_SUPPLIER']\n });\n }\n\n function loadContactInvitations() {\n return ContactsResource.query({\n state: ['INVITED', 'REJECTED', 'ESTABLISHED']\n }\n );\n }\n\n function getDefaultState(state) {\n var states = {\n INVITED: \"PENDING\"\n };\n return _.isUndefined(states[state]) ? state : states[state];\n }\n\n function loadAllInvitations() {\n $q.all([\n loadEmailInvitations().$promise,\n loadContactInvitations().$promise\n ]).then(function(data) {\n var emailInvitations = _.map(data[0], function(contact) {\n return {\n date: contact.date,\n email: contact.invitedEmailAddress,\n organizationId: contact.invitingOrganizationId,\n user: $rootScope.getUserName(contact.user),\n invitationState: getDefaultState(contact.invitationState),\n invitationType: contact.invitationType,\n invitationText: contact.text,\n requestType: 'EMAIL_INVITATION',\n originalEntry__: contact\n };\n });\n var contactRequests = _.map(data[1], function(contact) {\n return {\n name: contact.name,\n address: contact.address,\n email: contact.email,\n date: contact.date,\n acceptanceDate: contact.acceptanceDate,\n organizationId: contact.organizationId,\n invitationText: contact.text,\n invitationState: getDefaultState(contact.state),\n invitationType: contact.invitationType,\n imageUrl: contact.imageUrl,\n requestType: 'CONTACT_REQUEST',\n originalEntry__: contact\n };\n });\n\n $scope.contactRequests = _.orderBy(emailInvitations.concat(contactRequests),\n ['date', 'invitationType'],\n ['desc', 'asc']);\n });\n }\n\n $scope.isPending = function(invitation) {\n return invitation.invitationState === 'PENDING';\n };\n\n $scope.isClosed = function(invitation) {\n return invitation.invitationState === 'ACCEPTED' ||\n invitation.invitationState === 'REJECTED' ||\n invitation.invitationState === 'ESTABLISHED';\n };\n\n $scope.showClosed = function(invitation) {\n if (!$scope.isClosed(invitation)) {\n return true;\n }\n return $scope.query.closedVisible && $scope.isClosed(invitation);\n };\n\n $scope.getStatusTitle = function(state) {\n var text;\n if (state === 'PENDING') {\n text = $translate.instant('WAITING_FOR_ACCEPTANCE');\n } else if (state === 'ACCEPTED' || state === 'ESTABLISHED') {\n text = $translate.instant('INVITATION_ACCEPTED');\n } else if (state === 'REJECTED') {\n text = $translate.instant('INVITATION_REJECTED');\n }\n return text;\n };\n\n $scope.processInvitation = function(organization, action) {\n InvitationResource.save({\n organizationId: organization.organizationId,\n action: action\n },\n function(response) {\n loadPending();\n },\n function(response) {\n loadPending();\n });\n };\n\n $scope.updateInvitation = function(contact) {\n var invitation = contact.originalEntry__;\n InviteByEmailResource.save(invitation, function(response) {\n growl.success('INVITATION_UPDATED');\n loadAllInvitations();\n });\n };\n\n $scope.deleteInvitation = function(contact) {\n var header = 'INVITATION.DELETE_INVITATION.LABEL';\n var message = 'INVITATION.DELETE_INVITATION.TEXT';\n var invitation = contact.originalEntry__;\n\n var confirmDialog = $dialogs.confirm(header, message);\n confirmDialog.result.then(function() {\n InviteByEmailResource.delete({\n invitationId: invitation.id\n }, function(response) {\n growl.success('INVITATION_DELETED');\n loadAllInvitations();\n });\n });\n };\n\n $scope.cancelRequest = function(organizationId) {\n ContactsResource.remove({\n organizationId: organizationId\n },\n function(deletionResponse) {\n growl.success(\"CONTACT_REQUEST_SUCCESSFULLY_CANCELED\");\n $scope.$broadcast('contactDataChanged');\n },\n function(response) {\n growl.success(\"CONTACT_REQUEST_CANCEL_ERROR\");\n });\n };\n\n $scope.inviteByEmail = function() {\n $modal.open({\n templateUrl: 'tpl/send-email-invitation.tpl.html',\n controller: 'ExecuteEmailInvitationController',\n backdrop: true,\n resolve: {\n data: {}\n }\n });\n };\n\n $scope.editInvitation = function(invitation) {\n $modal.open({\n templateUrl: 'tpl/edit-invitation.tpl.html',\n controller: 'ExecuteEmailInvitationController',\n backdrop: true,\n resolve: {\n data: function() {\n return invitation.originalEntry__;\n }\n }\n });\n };\n\n $scope.editContactRequest = function(contactRequest) {\n $modal.open({\n templateUrl: 'tpl/edit-contact-request.tpl.html',\n controller: 'ExecuteEmailInvitationController',\n backdrop: true,\n resolve: {\n data: function() {\n return contactRequest.originalEntry__;\n }\n }\n });\n };\n\n (function init() {\n initTabContainer();\n loadAllInvitations();\n loadPending();\n })();\n }\n );\n","angular.module('llax')\n.controller('ItemReviewController',\n function($scope, $rootScope, $routeParams, growl, ReviewerReviewResource) {\n\n function prepareReviewAttributes() {\n // Set renderer and translations for review attributes\n $scope.reviewAttributes = $rootScope.dataModel.getReviewAttributes();\n $rootScope.prepareAttributes($scope.reviewAttributes);\n var customService = $rootScope.getService('CustomItemReviewSettings');\n if (customService) {\n $scope.review = customService.itemReviewTemplate($scope.item, $scope.validations, $rootScope.user, $rootScope.organization) || {};\n }\n }\n\n $scope.review = {};\n prepareReviewAttributes();\n $scope.review.customValues = {};\n\n _.forEach($scope.reviewAttributes, function(reviewAttribute) {\n if (!_.isEmpty(reviewAttribute.defaultValue)) {\n $scope.review.customValues[reviewAttribute.name] = reviewAttribute.defaultValue;\n }\n });\n\n $scope.reviewStates = ['APPROVED', 'REVIEWED', 'REJECTED', 'RECEIVED'];\n $scope.primaryKey = $routeParams.primaryKey || $scope.item.primaryKey__;\n\n $scope.translateReviewOption = function(option) {\n return $rootScope.translateValue(\"REVIEW.\", option);\n };\n\n $scope.sendItemReview = function(review, primaryKey) {\n review.primaryKey = primaryKey;\n ReviewerReviewResource.save({}, review,\n function(response) {\n growl.success(\"SAVED_REVIEW_SUCCESS_MESSAGE\");\n\n if (_.isFunction($scope.toggleItemReview)) {\n // Some dependers (item-detail-controller) on ItemReviewController\n // might not need to define a 'toggleItemReview()'\n $scope.toggleItemReview();\n }\n },\n function(response) {\n $rootScope.error = response.data;\n $scope.status = response.status;\n growl.error(\"SAVED_REVIEW_ERROR_MESSAGE\");\n });\n };\n\n }\n);\n","angular.module('llax')\n .controller('ItemsController',\n function(\n $rootScope, $scope, $routeParams, $route, $timeout, $modal, $controller, $location, $log, $translate, $window,\n $q, Auth, ChannelService, CommunicationChannelResource, ContactsResource, WatchlistService,\n ItemChangesQueueManager, ItemResource, PublicationMode, ReactBridge,\n SelectionResource, ValidateItemService, growl, $filter, TaskResource, QueryItemResource) {\n\n $controller('FetchItemController', {$scope: $scope});\n\n var LocalStorage = $window.localStorage;\n\n var EDIT_ITEM_URL = \"/edit/\";\n var NEW_ITEM_URL = \"/edit\";\n var COPY_ITEM_URL = \"/copy/\";\n var ITEM_BROWSE_URL = \"/browse\";\n var FOCUS_SECTION_URL = \"/section\";\n var FOCUS_ATTRIBUTE_URL = \"/attribute\";\n\n var GRID_STATES_KEY = \"grid-states\";\n var DEFAULT_GRID_STATE_KEY = \"default-state\";\n\n $scope.currentLayout = 'browse';\n\n $scope.items = [];\n\n $scope.loadingItems = false;\n $scope.columnDefs = $scope.columnDefs || [];\n\n var bulkSearch = LocalStorage.getItem(\"BulkSearch\");\n $rootScope.bulkSearch = !_.isEmpty(bulkSearch) ? angular.fromJson(bulkSearch) : false;\n\n ChannelService.register(ChannelService.ITEM_CHANGED_EVENT);\n\n $scope.hasItemPermission = function(action, item) {\n return Auth.hasItemPermission(action, item);\n };\n\n $scope.hasCategoryPermission = function(action, category) {\n return Auth.hasAnyPermission(Auth.OBJECT_TYPE_ITEMS, action, {category__: category});\n };\n\n $scope.hasExportPermission = function() {\n return $scope.hasAnyReadPermission() && Auth.hasAnyPermission(Auth.OBJECT_TYPE_UI, 'view.exports');\n };\n\n $scope.hasTasksPermission = function() {\n return Auth.hasAnyPermission(Auth.OBJECT_TYPE_UI, 'view.tasks');\n };\n\n $scope.hasMediaAssetExportPermission = function() {\n var selectedItems = $scope.getSelectedFullItems();\n var hasPermission = true;\n _.forEach(selectedItems, function(item, index, array) {\n var context = { namingPattern: Auth.ANY, item: item };\n if (!Auth.hasPermission('mediaAssetExport', 'show', context)) {\n hasPermission = false;\n }\n });\n return hasPermission;\n };\n\n $scope.checkItemPermission = function(action, item) {\n if (!$scope.hasItemPermission(action, item)) {\n var primaryKey = item.primaryKey__;\n var category = item.category__;\n var variables = {\n action: action\n };\n var message;\n if (!_.isEmpty(primaryKey)) {\n message = \"ITEM_ACTION.FORBIDDEN_FOR_PRIMARY_KEY\";\n variables.primaryKey = primaryKey;\n } else if (!_.isEmpty(category)) {\n message = \"ITEM_ACTION.FORBIDDEN_FOR_CATEGORY\";\n variables.category = category;\n } else {\n message = \"ITEM_ACTION.FORBIDDEN\";\n }\n growl.warning(message, {variables: variables});\n return false;\n }\n return true;\n };\n\n $scope.checkItemCategoryPermission = function(action, category) {\n var item = {\n category__: category,\n };\n item[Auth.CONTEXT_DEFAULT_VALUE] = Auth.ANY;\n return $scope.checkItemPermission(action, item);\n };\n\n $scope.hasAnyActionPermission = function(action) {\n var category;\n if (_.isNil($routeParams.category) || $routeParams.category === 'NO_CATEGORY') {\n category = null;\n } else {\n category = $routeParams.category;\n }\n return $scope.hasCategoryPermission(action, category);\n };\n\n $scope.hasAnyCreatePermission = function() {\n return $scope.hasAnyActionPermission('create');\n };\n\n $scope.hasAnyDeletePermission = function() {\n return $scope.hasAnyActionPermission('delete');\n };\n\n $scope.hasAnyEditPermission = function() {\n return $scope.hasAnyActionPermission('edit');\n };\n\n $scope.hasAnyPublishPermission = function() {\n return $scope.hasAnyActionPermission('publish');\n };\n\n $scope.hasAnyReadPermission = function() {\n return $scope.hasAnyActionPermission('read');\n };\n\n $scope.$on('channelMessageReceived', function(event, eventData) {\n\n if (eventData.event === ChannelService.ITEM_CHANGED_EVENT) {\n\n var userId = eventData.data.userId;\n var typeOfChange = eventData.data.typeOfChange;\n if (typeOfChange === 'error' && userId == $rootScope.user.userId) {\n growl.error(eventData.data.message, { variables: eventData.data });\n return;\n }\n\n var primaryKeys = eventData.data.primaryKeys;\n var categories = eventData.data.categories;\n\n if (typeOfChange === 'deleted') {\n WatchlistService.removeWatchlistItems(primaryKeys);\n }\n\n // Check if selected category is in any of the \"updated\" categories\n var hasToUpdate;\n if (_.isEmpty(categories) || (_.isNil($routeParams.selectionId) && _.isNil($routeParams.category))) {\n hasToUpdate = true;\n } else if (!_.isNil($routeParams.selectionId)) {\n var watchlistCategories = WatchlistService.getWatchlistCategories();\n hasToUpdate = !_.isEmpty(watchlistCategories) && _.some(categories, function(category) {\n return _.includes(watchlistCategories, category);\n });\n } else if ($routeParams.category === \"NO_CATEGORY\" && _.includes(categories, null)) {\n hasToUpdate = true;\n } else if (_.includes(categories, $routeParams.category)) {\n hasToUpdate = true;\n }\n\n if (hasToUpdate) {\n\n // Find and delete the items in the list\n if (typeOfChange === 'deleted') {\n _.remove($scope.items, function(item) {\n return _.includes(primaryKeys, item.primaryKey__);\n });\n } else {\n\n // Reload only if the updated items exists in the browse list.\n var updatedItemsinBrowseList = _.find($scope.items, function (item) {\n return _.includes(primaryKeys, item.primaryKey__);\n });\n\n var browseListUpdated = false;\n if (!_.isEmpty(updatedItemsinBrowseList)) {\n browseListUpdated = true;\n }\n\n // Reload also if browse list is empty means on the first time items are getting uploaded.\n if (_.isEmpty($scope.items) || browseListUpdated) {\n reLoadSelectedItems(eventData).then(function (updateAll) {\n if (!updateAll && (userId != $rootScope.user.userId)) {\n // Only notify other users\n growl.warning('ITEM.NOTIFICATION.ITEM_UPDATED', {\n referenceId: 1,\n ttl: -1\n });\n }\n });\n }\n }\n\n }\n\n } else if (eventData.event === ChannelService.MASS_UPDATE_SUMMARY_CHANGED_EVENT) {\n var status = eventData.data.status;\n if (eventData.data.startedBy === $rootScope.user.userId) {\n if (status === 'RUNNING') {\n var totalCount = eventData.data.totalCount;\n var user = eventData.data.startedBy;\n growl.info('MASS_UPDATE_EVENT.STARTED', {\n variables: {count: totalCount, user: user},\n referenceId: 1,\n ttl: -1\n });\n } else if (status === 'FINISHED') {\n var finishedCount = eventData.data.finishedCount;\n growl.info('MASS_UPDATE_EVENT.FINISHED', {\n variables: {count: finishedCount},\n referenceId: 1,\n ttl: -1\n });\n }\n }\n } else if (eventData.event === ChannelService.VALIDATION_FINISHED_EVENT) {\n var validationResults = eventData.data.validationResults;\n for (var primaryKey in validationResults) {\n var originalItem = _.find($scope.items, {primaryKey__: primaryKey});\n if (!_.isNil(originalItem)) {\n originalItem.validation_dirty__ = false;\n originalItem.validation__ = validationResults[primaryKey].validationErrors;\n originalItem.validation_warnings__ = validationResults[primaryKey].validationWarnings;\n originalItem.attributeStates__ = validationResults[primaryKey].attributeStates;\n }\n }\n }\n if (eventData.event === ChannelService.PUBLICATION_TASK_CHANGED_EVENT) {\n if (eventData.data.typeOfChange === \"updated\") {\n\n var publication = eventData.data.publication;\n var publishedItems = publication.publishedItems;\n if (!_.isEmpty(publishedItems)) {\n\n var destinationId = _.toString(publication.destinationId);\n var destinations = [ destinationId ];\n var subDestination = publication.subDestination;\n if (!_.isNil(subDestination)) {\n destinations.push(destinationId + \":\" + subDestination);\n }\n\n _.forEach(publishedItems, function(primaryKey) {\n\n var publishedItem = _.find($scope.items, { primaryKey__: primaryKey });\n if (!_.isNil(publishedItem)) {\n\n // FIXME: The backend only includes items on successful publication,\n // which is BEFORE the task is actually set to 'SUCCESS'\n // Thus, we are now directly setting the status to 'SUCCESS'\n publishedItem.publicationStatus__ = 'SUCCESS';\n publishedItem.publicationStartedAt__ = publication.creationDate;\n\n // The published state is dependent on the type of the publication,\n // i.e. if 'ADD', the state is true always;\n // if 'DELETE', we need to update the 'publications__' of the items\n // and set it to false, if empty\n var publications = publishedItem.publications__ || [];\n if (publication.publicationType === 'ADD') {\n publications = _.union(publications, destinations);\n } else {\n publications = _.difference(publications, destinations);\n }\n publishedItem.publications__ = publications;\n\n if (_.isEmpty(publications)) {\n publishedItem.publishedAt__ = null;\n publishedItem.published__ = false;\n } else {\n publishedItem.publishedAt__ = publication.updatedDate;\n publishedItem.published__ = true;\n }\n\n }\n });\n\n }\n\n }\n }\n });\n function reLoadSelectedItems(eventData) {\n var deferred = $q.defer();\n var primaryKeys = _.get(eventData,'data.primaryKeys');\n if (_.isEmpty(primaryKeys) || primaryKeys.length >= 50) {\n primaryKeys = _.map($scope.items, 'primaryKey__');\n }\n var selectedItems = {\n primaryKeys: primaryKeys\n };\n SelectionResource.save(selectedItems,\n function(response) {\n QueryItemResource.createCursorAwareResource().query({selectionId:response.selectionId}, function(res, headers) {\n var updateAll = true;\n var fields = $rootScope.dataModel.filteredLayoutAttributeNames($scope.currentLayout);\n fields = fields.concat($rootScope.dataModel.ADDITIONAL_FIELDS || []);\n fields = fields.concat($rootScope.dataModel.filterPrimaryKeyPartAttributes());\n _.forEach(res,function(resItem) {\n var item = _.find($scope.items, { 'primaryKey__' : resItem.primaryKey__});\n if (!_.isEmpty(item)) {\n _.forEach(fields, function(field) {\n item[field] = resItem[field];\n });\n } else {\n updateAll = false;\n }\n });\n deferred.resolve(updateAll);\n });\n }\n );\n return deferred.promise;\n }\n\n $scope.hasSelectedItems = function() {\n return $scope.allItemsSelected || WatchlistService.hasWatchlistItems();\n };\n\n $scope.$on('itemSearchQueryChanged', function(event, query) {\n $scope.itemSearchQueryChanged = true;\n if (_.isEmpty(query)) {\n return;\n } else {\n $scope.query = query;\n createItemTableColumnDefinition();\n if (!hasAnySortState()) {\n $scope.sortOrder = {};\n }\n $scope.fetchItems();\n }\n });\n\n $scope.$on('selectedItemsUpdated', function(event, items) {\n if (items === 'ALL') {\n $scope.gridApi.selection.selectAllVisibleRows();\n $scope.allItemsSelected = true;\n } else if (items === 'NONE') {\n $scope.gridApi.selection.clearSelectedRows();\n $scope.allItemsSelected = false;\n WatchlistService.clearWatchlist();\n if ($routeParams.selectionId) {\n $location.search('selectionId', null);\n }\n }\n });\n\n $scope.$on('dataModelLoaded', function() {\n initDependingOnDatamodel();\n });\n\n function initDependingOnDatamodel() {\n createItemTableColumnDefinition();\n $scope.fetchItems();\n startGridCellEditListeners();\n }\n\n $scope.fetchItems = function(config) {\n // Stop queues and reset validations\n if ($scope.rowEditItem) {\n stopItemChangesQueues();\n $scope.rowEditValidations = null;\n }\n\n var fields = $rootScope.dataModel.filteredLayoutAttributeNames($scope.currentLayout);\n $scope.doFetchItems(config, fields);\n };\n\n $scope.hasRestrictions = function() {\n for (var key in $scope.restrictions) {\n if (!_.isUndefined($scope.restrictions[key])) {\n return true;\n }\n }\n return false;\n };\n\n $scope.isRowEditable = function(row) {\n if (_.isUndefined(row.editable)) {\n row.editable = $scope.hasItemPermission('edit', row.entity);\n }\n return row.editable;\n };\n\n $scope.isRowReadable = function(row) {\n if (_.isUndefined(row.readable)) {\n row.readable = $scope.isRowEditable(row) || $scope.isRowReadonly(row);\n }\n return row.readable;\n };\n\n $scope.isRowReadonly = function(row) {\n if (_.isUndefined(row.readonly)) {\n row.readonly = $scope.hasItemPermission('read', row.entity) && !$scope.isRowEditable(row);\n }\n return row.readonly;\n };\n\n function itemCellEditableCondition(scope) {\n\n if (!scope.row.editable) {\n return false;\n }\n\n var item = scope.row.entity;\n var colName = scope.col.colDef.name;\n\n if ($scope.isGridAttributeReadOnly(scope.row, scope.col)) {\n return false;\n }\n\n // We disallow editing cells (double click events) if the attribute is hidden, but actually\n // hiding it, is on the renderer and cell templates.\n if ($scope.isGridAttributeHidden(scope.row, scope.col)) {\n return false;\n }\n\n return true;\n }\n\n function createItemTableColumnDefinition() {\n\n var columnDefs = [];\n\n if ($rootScope.dataModel.hasLayout($scope.currentLayout)) {\n\n var categories = [];\n if (!_.isEmpty($routeParams.category) && $routeParams.category !== \"NO_CATEGORY\") {\n categories.push($routeParams.category);\n } else if (!_.isNil($routeParams.selectionId)) {\n categories = WatchlistService.getWatchlistCategories();\n }\n\n var layoutAttributes = [];\n if (_.isEmpty(categories)) {\n layoutAttributes = $rootScope.dataModel.filteredLayoutAttributes($scope.currentLayout);\n } else {\n var browseAttributes = $rootScope.dataModel.filteredLayoutAttributes($scope.currentLayout);\n var categoryAttributes = [];\n _.forEach(categories, function(category) {\n categoryAttributes = categoryAttributes.concat($rootScope.dataModel.categoryAttributes(category));\n });\n layoutAttributes = _.intersection(browseAttributes, categoryAttributes);\n if (_.isEmpty(layoutAttributes)) {\n layoutAttributes = $rootScope.dataModel.filteredLayoutAttributes($scope.currentLayout);\n }\n }\n\n var length = layoutAttributes.length;\n var attr = null;\n var sectionName = $rootScope.dataModel.sectionAttributes($scope.currentLayout)[0].name;\n\n for (var i = 0; i < length; i++) {\n attr = layoutAttributes[i];\n $rootScope.setSectionAttributeParam($scope.currentLayout, null, attr, 'iconSize', '1em', $scope.item);\n $rootScope.setSectionAttributeParam($scope.currentLayout, null, attr, 'valuesFormat', ['label', '-', 'key'], $scope.item);\n var sortable = attr.typeName !== \"Dimensional\";\n var col = {\n attribute: attr,\n field: attr.name,\n name: attr.name,\n headerTooltip: true,\n width: '*',\n minWidth: 120,\n enableCellEdit: !$rootScope.dataModel.sectionAttributeParam(\n $scope.currentLayout,\n undefined, // item\n sectionName,\n attr.name,\n 'readonly'),\n enableCellSelection: false,\n enableSorting: sortable,\n cellEditableCondition: itemCellEditableCondition\n };\n\n // based on the attribute type different kinds of cell editors are set on the column\n $rootScope.generateCellEditors(attr, col, $scope, {context: $scope.currentLayout, editable: col.enableCellEdit});\n columnDefs[i] = col;\n }\n\n columnDefs.push(\n {\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n name: 'actions',\n enableCellEdit: false,\n enableCellSelection: false,\n allowCellFocus: false,\n cellClass: 'text-right',\n headerCellClass: 'items-action-header',\n enableColumnResizing: true,\n enableSorting: false,\n enableHiding: false,\n pinnedRight: true,\n minWidth: 250,\n cellTemplate: '
    ' +\n '
    ' +\n '' +\n ' ' +\n '!' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n ' 0\">{{row.entity.validation__.length}}' +\n ' 0\">{{row.entity.validation_warnings__.length}}' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
    ' +\n '
    '\n }\n );\n\n if ($scope.gridApi) {\n $rootScope.restoreGridState($scope, $scope.gridApi, GRID_STATES_KEY, getGridStateKey(), columnDefs);\n }\n\n $scope.gridOptions = {\n data: 'items',\n virtualizationThreshold: 200,\n columnDefs: columnDefs,\n enableCellEdit: true,\n enableColumnMenus: false,\n enableColumnMoving : true,\n enableColumnResize: true,\n enableGridMenu: true,\n infiniteScrollDown: true,\n rowHeight: 34,\n onRegisterApi: function(gridApi) {\n\n $scope.gridApi = gridApi;\n gridApi.infiniteScroll.on.needLoadMoreData($scope, $scope.loadMore);\n\n gridApi.core.on.sortChanged($scope, $scope.sortChanged);\n gridApi.selection.clearSelectedRows();\n gridApi.selection.on.rowSelectionChanged($scope, function(row, event) {\n if (row.isSelected) {\n WatchlistService.addWatchlistItem(row.entity);\n } else {\n WatchlistService.removeWatchlistItem(row.entity);\n }\n });\n gridApi.selection.on.rowSelectionChangedBatch($scope, function(rows, event) {\n _.forEach(rows, function(row) {\n if (row.isSelected) {\n WatchlistService.addWatchlistItem(row.entity);\n } else {\n WatchlistService.removeWatchlistItem(row.entity);\n }\n });\n });\n\n // Initialize the grid state with 'dynamic' gridStateKey and columnDefs,\n // otherwise the state would be updated for the wrong category\n // and the 'Reset' menu would reset the wrong columns\n $rootScope.initGridState($scope, $scope.gridApi, GRID_STATES_KEY, getGridStateKey, function() {\n return columnDefs;\n });\n\n $timeout(function() {\n $scope.gridApi.core.handleWindowResize();\n });\n gridApi.core.on.rowsRendered($scope, function () {\n $rootScope.$broadcast('reloadBrowseListFileTypes');\n });\n\n }\n };\n }\n }\n\n function getGridStateKey() {\n\n if (!_.isNil($routeParams.selectionId) || $routeParams.category === 'NO_CATEGORY') {\n return null;\n }\n\n var gridStateKey;\n if (!_.isEmpty($routeParams.category)) {\n gridStateKey = $routeParams.category + '-state';\n } else {\n gridStateKey = DEFAULT_GRID_STATE_KEY;\n }\n\n return gridStateKey;\n }\n\n function hasAnySortState() {\n var hasAny = false;\n var gridStates = angular.fromJson(LocalStorage.getItem(GRID_STATES_KEY)) || {};\n var gridStateKey = getGridStateKey();\n var state = gridStates[gridStateKey];\n if (state && state.columns) {\n hasAny = !_.every(state.columns, function(col) {\n return _.isEmpty(col.sort);\n });\n }\n return hasAny;\n }\n\n $scope.getReviewClass = function(item) {\n\n if (!item.reviewCountTotal__) {\n return \"reviews reviews-none syncons syncons-decline\";\n }\n\n // Only reviews with \"RECEIVED\" status\n if (item.reviewCountTotal__ === item.reviewCountReceived__) {\n return \"reviews reviews-grey syncons syncons-comment\";\n }\n\n // At least one REVIEWED and one APPROVED\n if (item.reviewCountReviewed__ > 0 && item.reviewCountApproved__ > 0) {\n return \"reviews reviews-orange syncons syncons-channels\";\n }\n\n // At least one REVIEWED\n if (item.reviewCountReviewed__ > 0) {\n return \"reviews reviews-red syncons syncons-comment\";\n }\n\n // At lease one APPROVED\n if (item.reviewCountApproved__ > 0) {\n return \"reviews reviews-green syncons syncons-comment\";\n }\n\n // Only REJECTED\n return \"reviews reviews-yellow syncons syncons-comment\";\n };\n\n var sortItemsObserver;\n var sortItemsObservable = rxjs.Observable.create(function(observer) {\n sortItemsObserver = observer;\n });\n\n sortItemsObservable.pipe(rxjs.debounceTime(500)).subscribe(function(order) {\n $scope.sortOrder = order;\n console.log(\"sortOrder\", $scope.sortOrder);\n if (!_.isEmpty($scope.sortOrder.sort)) {\n $scope.fetchItems();\n }\n });\n\n $scope.sortChanged = function(grid, columns) {\n var cols = _.sortBy(columns, 'sort.priority');\n\n var sorting = {\n sort: [],\n direction: []\n };\n\n for (var i = 0; i < cols.length; i++) {\n sorting.sort.push(cols[i].field);\n sorting.direction.push(cols[i].sort.direction);\n }\n sortItemsObserver.next(sorting);\n };\n\n $scope.loadMore = function() {\n if (!$scope.loadingItems && !$scope.searchFinished) {\n $scope.page++;\n console.log(\"loading page \" + $scope.page);\n $scope.fetchItems({append: true});\n }\n };\n\n // Function to call when item changes are transmitted\n function processTransmitItem(itemChanges, item) {\n var broadcast = ChannelService.broadcast(ChannelService.ITEM_EDITED_EVENT, item.primaryKey__, itemChanges);\n return broadcast;\n }\n\n // Function to call when item changes are validated\n function processValidateItem(itemChanges, item, previousItem, originalScopeItem) {\n // Ensure validations map entry exists\n $scope.rowEditValidations = $scope.rowEditValidations || {};\n $scope.rowEditValidations[item.primaryKey__] = $scope.rowEditValidations[item.primaryKey__] || {};\n\n var attributeNames = _.keys(itemChanges);\n var validateItem = ValidateItemService.validateItem($scope,\n originalScopeItem,\n item,\n previousItem,\n null,\n $scope.rowEditValidations[item.primaryKey__],\n attributeNames);\n return validateItem.$promise;\n }\n\n // Function to call when item is saved\n function processSaveItem(itemChanges, item, previousItem, originalItem) {\n if (!$scope.hasItemPermission('edit', item)) {\n var deferred = $q.defer();\n deferred.resolve();\n return deferred.promise;\n }\n var saveItem = ItemResource.save({}, item,\n function(savedItem) {\n stopItemChangesQueues();\n angular.copy(savedItem, originalItem);\n growl.success(\"SAVE_SUCCESS_MESSAGE\");\n },\n function(response) {\n stopItemChangesQueues();\n $scope.status = response.status;\n if (response.data && response.data.message) {\n growl.error(response.data.message, { variables: response.data.parameters });\n } else {\n growl.error(\"SAVE_ERROR_MESSAGE\");\n }\n $route.reload();\n });\n return saveItem.$promise;\n }\n\n // The 'store' queue has to skip saving the item, if a cell is currently being edited\n var rowEditingActive = false;\n function skipSaveItem() {\n return rowEditingActive;\n }\n\n // Create queues for transmitting, validating and saving changes\n var queueManager = new ItemChangesQueueManager();\n queueManager.createQueue('transmitItemQueue', 300, processTransmitItem);\n queueManager.createQueue('validateItemQueue', 600, processValidateItem);\n queueManager.createQueue('storeItemQueue', 2000, processSaveItem, skipSaveItem);\n\n function startItemChangesQueues() {\n queueManager.start($scope, $scope.rowEditItem, 'rowEditItem');\n }\n\n function stopItemChangesQueues() {\n queueManager.stop();\n $scope.rowEditItem = null;\n }\n\n function laxGridStartCellEdit(event, row, col) {\n\n // Restart queues, when different item is edited\n var item = row.entity;\n if (item.primaryKey__) {\n if (!$scope.rowEditItem || $scope.rowEditItem.primaryKey__ != item.primaryKey__) {\n\n if ($scope.rowEditItem) {\n stopItemChangesQueues();\n }\n\n $scope.rowEditItem = item;\n startItemChangesQueues();\n }\n rowEditingActive = true;\n }\n }\n\n function laxGridStopCellEdit(event, row, col) {\n if ($scope.rowEditItem) {\n\n rowEditingActive = false;\n\n // Force processing of item changes in 'store' queue\n var storeItemQueue = queueManager.getQueue('storeItemQueue');\n storeItemQueue.processItemChanges();\n\n }\n }\n\n function startGridCellEditListeners() {\n $log.debug(\"startGridCellEditListeners\");\n $scope.deregisterCellEditListeners = [];\n $scope.deregisterCellEditListeners.push($scope.$on('laxGridStartCellEdit', laxGridStartCellEdit));\n $scope.deregisterCellEditListeners.push($scope.$on('laxGridStopCellEdit', laxGridStopCellEdit));\n }\n\n function stopGridCellEditListeners() {\n $log.debug(\"stopGridCellEditListeners\");\n while ($scope.deregisterCellEditListeners && $scope.deregisterCellEditListeners.length > 0) {\n ($scope.deregisterCellEditListeners.pop())();\n }\n }\n\n function getCellValidations(row, col) {\n if (!$scope.rowEditValidations) {\n return [];\n }\n\n var item = row.entity;\n var itemValidations = $scope.rowEditValidations[item.primaryKey__] || {};\n\n var attributeName = col.field;\n var cellValidations = itemValidations[attributeName] || [];\n\n return cellValidations;\n }\n\n // Define validation methods for grid like 'getCellValidationMessages' and 'getRowValidationMessages'.\n ValidateItemService.defineGridValidationMethods($scope, getCellValidations);\n\n $scope.validationStatus = function(item) {\n if (item.validation_dirty__ === true) {\n return \"dirty\";\n } else if (!_.isEmpty(item.validation__) || !_.isEmpty(item.validation_warnings__)) {\n return \"non-compliant\";\n } else {\n return \"compliant\";\n }\n };\n\n $scope.depublishItems = function() {\n $scope.publishItems({mode: PublicationMode.DEPUBLISH});\n };\n\n $scope.publishItems = function(config) {\n\n var mode = config && config.mode || PublicationMode.PUBLISH;\n var selectedItemEntities = $scope.gridApi.selection.getSelectedRows();\n\n if (_.isEmpty($scope.items) || _.isEmpty(selectedItemEntities)) {\n growl.warning(\"NO_ITEMS_SELECTED\");\n return false;\n }\n\n if (mode === PublicationMode.PUBLISH) {\n\n var customPublicationService = $rootScope.getService(\"CustomPublicationSettings\");\n var isAllowedInvalidItem = false;\n if (!_.isNil(customPublicationService) && !_.isNil(customPublicationService.allowInvalidItem)) {\n isAllowedInvalidItem = customPublicationService.allowInvalidItem();\n }\n\n var item;\n for (var i = 0; i < selectedItemEntities.length; i++) {\n item = selectedItemEntities[i];\n if (isAllowedInvalidItem === false) {\n if (item.validation_dirty__ || !_.isEmpty(item.validation__)) {\n growl.warning(\"ITEM_INVALID_BEFORE_PUBLISHING\");\n return false;\n }\n }\n if (!$scope.checkItemPermission('publish', item)) {\n return false;\n }\n }\n }\n\n $scope.selectedItems = _.map(selectedItemEntities, 'primaryKey__');\n if ($scope.allItemsSelected) {\n openPublicationsModal({itemsQuery: $scope.createItemRestrictions()}, mode);\n } else {\n openPublicationsModal({primaryKeys: $scope.selectedItems}, mode);\n }\n\n };\n\n function openPublicationsModal(itemSelection, mode) {\n if ($scope.selectedItems.length >= 1) {\n stopItemChangesQueues();\n stopGridCellEditListeners();\n\n var modalInstance = $modal.open({\n templateUrl: 'tpl/publish-to-recipients-modal.tpl.html',\n controller: 'PublishItemsController',\n backdrop: true,\n windowClass: 'publish-modal',\n resolve: {\n itemSelection: function() {\n return itemSelection;\n },\n mode: function() {\n return mode;\n },\n publicationData: function() {\n return {};\n }\n }\n });\n modalInstance.result.finally(function() {\n startGridCellEditListeners();\n });\n } else {\n growl.warning(\"NO_ITEMS_SELECTED\");\n }\n }\n\n $scope.deleteItem = function(item) {\n if ($scope.checkItemPermission('delete', item)) {\n deleteItemsBySelection({primaryKeys: [item.primaryKey__]});\n }\n };\n\n $scope.deleteSelectedItems = function() {\n\n var selectedItemEntities = $scope.gridApi.selection.getSelectedRows();\n\n if (_.isEmpty($scope.items) || _.isEmpty(selectedItemEntities)) {\n growl.warning(\"NO_ITEMS_SELECTED\");\n return false;\n }\n\n var item;\n for (var i = 0; i < selectedItemEntities.length; i++) {\n item = selectedItemEntities[i];\n if (!$scope.checkItemPermission('delete', item)) {\n return false;\n }\n }\n\n var selection = $scope.createItemSelection();\n deleteItemsBySelection(selection);\n\n };\n\n function deleteItemsBySelection(selection) {\n if (selection.itemsQuery && selection.itemsQuery.selectionId) {\n stopItemChangesQueues();\n stopGridCellEditListeners();\n var modalInstance = $modal.open({\n templateUrl: 'tpl/confirm-delete-item-modal.tpl.html',\n controller: 'ModalInstanceCtrl',\n backdrop: true,\n resolve: {\n data: function() {\n var data = {\n selectionId: selection.itemsQuery.selectionId\n };\n if (selection.primaryKeys) {\n data.primaryKeys = selection.primaryKeys;\n }\n var itemsQuery = _.omit(selection.itemsQuery, _.isUndefined);\n if (!_.isEmpty(itemsQuery)) {\n data.itemsQuery = itemsQuery;\n }\n return data;\n }\n }\n });\n modalInstance.result.finally(function() {\n if (selection.primaryKeys) {\n $rootScope.$broadcast('updateOrganizationUsageLimit', -selection.primaryKeys.length);\n }\n startGridCellEditListeners();\n });\n } else {\n SelectionResource.save(selection, function(response) {\n stopItemChangesQueues();\n stopGridCellEditListeners();\n var modalInstance = $modal.open({\n templateUrl: 'tpl/confirm-delete-item-modal.tpl.html',\n controller: 'ModalInstanceCtrl',\n backdrop: true,\n resolve: {\n data: function() {\n var data = {\n selectionId: response.selectionId\n };\n if (selection.primaryKeys) {\n data.primaryKeys = selection.primaryKeys;\n }\n var itemsQuery = _.omit(selection.itemsQuery, _.isUndefined);\n if (!_.isEmpty(itemsQuery)) {\n data.itemsQuery = itemsQuery;\n }\n return data;\n }\n }\n });\n modalInstance.result.finally(function() {\n if (selection.primaryKeys) {\n $rootScope.$broadcast('updateOrganizationUsageLimit', -selection.primaryKeys.length);\n }\n startGridCellEditListeners();\n });\n });\n }\n }\n\n function loadOrganizations() {\n return ContactsResource.query({},\n function(response) {\n $scope.organizations = _.sortBy(_.filter(response, function(contact) {\n return !_.isNil(contact.organizationId) &&\n contact.state === 'ESTABLISHED' &&\n (_.isNil(contact.contactRole) || contact.contactRole !== 'DATA_SUPPLIER');\n }), function(contact) {\n return _.toLower(contact.name);\n });\n },\n function(response) {\n $scope.status = response.status;\n }\n );\n }\n\n function loadCommunicationChannels() {\n return CommunicationChannelResource.query({},\n function(response) {\n $scope.communicationChannels = response;\n },\n function(response) {\n $scope.status = response.status;\n }\n );\n }\n\n var deregisterWatchEditorParamsItems;\n\n function setEditorParamsItems(params, items) {\n params.primaryKeys = _.map(items, 'primaryKey__');\n }\n\n $scope.showEditor = function(row, origPrimaryKey, editorState) {\n\n if (!_.isNil(editorState) && editorState.onShowItemDetails) {\n $rootScope.onShowItemDetails = editorState.onShowItemDetails;\n }\n\n // Stop queues and grid listeners\n stopItemChangesQueues();\n stopGridCellEditListeners();\n\n var primaryKey = (row && row.entity ? row.entity.primaryKey__ : null);\n if (row && primaryKey) {\n $location.displayUrl(EDIT_ITEM_URL + primaryKey);\n } else if (origPrimaryKey) {\n $location.displayUrl(COPY_ITEM_URL + origPrimaryKey);\n } else {\n $location.displayUrl(NEW_ITEM_URL);\n }\n\n var params = {\n category: $routeParams.category\n };\n if (origPrimaryKey) {\n params.origPrimaryKey = origPrimaryKey;\n } else if (primaryKey) {\n params.itemPrimaryKey = primaryKey;\n }\n setEditorParamsItems(params, $scope.items);\n if (!_.isEmpty($scope.task)) {\n params.task = $scope.task;\n params.forceCloseTask = true;\n }\n\n if ($scope.$watch) {\n if (deregisterWatchEditorParamsItems) {\n deregisterWatchEditorParamsItems();\n }\n deregisterWatchEditorParamsItems = $scope.$watch('items', function(newValue, oldValue) {\n setEditorParamsItems(params, newValue);\n });\n }\n\n if ((localStorage.getItem('OLD_EDITOR') === 'true') || $rootScope.hasSettingFeature('NEXT_EDITOR')) {\n\n var dialog = ReactBridge.mountDialog('ItemEditorDialog', '#next-item-editor', {\n category: params.category,\n editorState: editorState,\n forceCloseTask: params.forceCloseTask,\n originalPrimaryKey: params.origPrimaryKey,\n primaryKey: params.itemPrimaryKey,\n task: params.task,\n items : $scope.items,\n onClose: function() {\n $timeout(function(result) {\n\n if (result) {\n $scope.items.push(result);\n }\n\n $location.displayUrl(ITEM_BROWSE_URL);\n $scope.rowEditValidations = null;\n startGridCellEditListeners();\n }, 0);\n dialog.unmount();\n },\n });\n\n return;\n }\n\n var editor = $modal.open({\n templateUrl: 'tpl/editor.tpl.html',\n controller: 'EditorController',\n backdrop: true,\n keyboard: false,\n windowClass: 'item-editor',\n resolve: {\n params: function() {\n return params;\n }\n }\n });\n\n var reloadBrowseList = true;\n editor.result.then(function(result) {\n\n if (result.action === 'startMassUpdate' && !_.isNil(result.selection)) {\n $scope.updateItems(result.selection);\n } else if (result.action === 'itemChanged' || result.action === 'itemUnchanged') {\n\n // Update or add the edited item\n // FIXME: We should instead find the grid's row by the item's primary key and update it\n if (!_.isNil(result.item)) {\n if (row) {\n angular.copy(result.item, row.entity);\n } else {\n $scope.items.push(result.item);\n }\n }\n\n // Start the editor with another item\n if (!_.isNil(result.showItemPrimaryKey)) {\n\n // Create a dummy row to start the editor with\n // FIXME: If we were able to find the grid's row by the item's primary, we would not have to do this\n row = {\n entity: {\n primaryKey__: result.showItemPrimaryKey\n }\n };\n\n // No need to reload the browse list\n reloadBrowseList = false;\n\n // Start the editor after exiting the current function call to minimize the call-stack\n $timeout(function() {\n $scope.showEditor(row);\n }, 1);\n\n }\n\n }\n\n }).finally(function() {\n if (reloadBrowseList) {\n $location.displayUrl(ITEM_BROWSE_URL);\n $scope.rowEditValidations = null;\n startGridCellEditListeners();\n }\n });\n\n };\n\n $scope.copyItem = function(item) {\n $scope.showEditor(null, item);\n };\n\n $scope.showEditorAddTask = function(items) {\n var taskObj = {\n taskListId: null\n };\n\n if (items == 'ALL' || (_.isArray(items) && items.length > 25)) {\n var selection = $scope.createItemSelection();\n SelectionResource.save(selection,\n function(response) {\n // $location.search('selectionId', response.selectionId);\n taskObj.selectionId = response.selectionId;\n openTaskEditor(taskObj);\n }\n );\n } else {\n taskObj.items = items;\n openTaskEditor(taskObj);\n }\n };\n\n function openTaskEditor(taskObj) {\n stopItemChangesQueues();\n stopGridCellEditListeners();\n var editor = $modal.open({\n templateUrl: 'tpl/tasks-create-task.tpl.html',\n controller: 'CreateTaskController',\n backdrop: true,\n windowClass: 'publish-modal',\n resolve: {\n data: function() {\n return taskObj;\n }\n }\n });\n editor.result.then(function(task) {\n console.log(task);\n })\n .finally(function() {\n startGridCellEditListeners();\n });\n }\n\n $scope.showMediaAssetExport = function(items) {\n var dialog = ReactBridge.mountDialog(\"ExportMediaAssetDialog\", \"#react-export-media-asset-node\",\n {\n items: items,\n itemsSelection: $scope.createItemSelection(),\n onClose: function(toWait) {\n // Unmount the dialog after waiting if toWait is true, otherwise unmount immediately\n function unmount(){\n dialog.unmount();\n }\n return toWait? ReactBridge.unmountWhenReady(unmount): dialog.unmount();\n }\n });\n };\n\n function prepareReviewAttributes() {\n // Set renderer and translations for review attributes\n $scope.reviewAttributes = $rootScope.dataModel.getReviewAttributes();\n $rootScope.prepareAttributes($scope.reviewAttributes);\n }\n prepareReviewAttributes();\n\n $scope.showItemReview = function(item) {\n stopItemChangesQueues();\n stopGridCellEditListeners();\n\n var modal = $modal.open({\n templateUrl: 'tpl/item-reviews-modal.tpl.html',\n controller: 'SupplierItemReviewController',\n backdrop: true,\n windowClass: 'publish-modal',\n scope: $scope,\n resolve: {\n $attrs: function() {\n return {\n itemPrimaryKey : item.primaryKey__,\n publicationDestination: $routeParams.publicationDestination,\n reviewer: $routeParams.reviewer\n };\n }\n }\n });\n\n $scope.closeItemReviewModal = function () {\n modal.close();\n };\n\n modal.result.finally(function() {\n startGridCellEditListeners();\n });\n };\n\n $scope.compareItems = function(primaryKeys) {\n var selectedItems = {};\n var itemsRequests = [];\n _.forEach(primaryKeys, function(primaryKey) {\n var deferred = $q.defer();\n ItemResource.get({}, {\n 'primaryKey': primaryKey\n },\n function(itemResult) {\n for (var key in itemResult) {\n // try to parse JSON like Strings into JSON Objects\n var val = itemResult[key];\n if (val !== undefined && typeof val == \"string\" && (val.startsWith(\"{\") || val.startsWith(\"[\"))) {\n try {\n itemResult[key] = JSON.parse(val);\n } catch (e) {}\n }\n }\n deferred.resolve(itemResult);\n });\n\n itemsRequests.push(deferred.promise);\n });\n $q.all(itemsRequests).then(function(items){\n selectedItems = items;\n $location.displayUrl(\"/compare/\" + primaryKeys[0] + \"/\" + primaryKeys[1]);\n stopItemChangesQueues();\n stopGridCellEditListeners();\n var dialog = ReactBridge.mountDialog(\"CompareItemsDialog\", \"#react-compare-items-dialog\",\n {\n items: selectedItems,\n rootScope: $rootScope,\n currentLayout: $scope.currentLayout,\n onClose: function() {\n startGridCellEditListeners();\n startItemChangesQueues();\n $location.path(ITEM_BROWSE_URL);\n dialog.unmount();\n }\n });\n });\n };\n\n $scope.filteredExportFormats = function() {\n return $filter('showExportFormatsFilter')($scope.exportFormats , $scope.getSelectedFullItems());\n };\n\n function loadTasks() {\n TaskResource.get({ taskId: $routeParams.taskId }, function(response) {\n $scope.task = response;\n $rootScope.$broadcast('taskLoaded', $scope.task);\n });\n }\n\n $scope.$on('$routeUpdate', function(scope, route) {\n if (_.isNil($routeParams.taskId)) {\n $scope.task = null;\n } else {\n loadTasks();\n }\n });\n\n $scope.newBulkSearch = function(queryValues, queryTooLong) {\n $scope.query= \"\";\n $rootScope.$broadcast('buckSearchPopupOpend');\n var modal = $modal.open({\n templateUrl: 'tpl/bulk-search.tpl.html',\n controller: 'bulkSearchController',\n backdrop: true,\n windowClass: 'bulk-search-modal',\n resolve: {\n queryValues: function() {\n return queryValues;\n },\n queryTooLong: function() {\n return queryTooLong;\n }\n }\n });\n };\n\n $scope.showLastBulkSearch = function() {\n delete $routeParams.tags;\n delete $routeParams.taskId;\n delete $scope.query.taskId;\n $location.url($location.path() + \"?tags=bulkSearch:\" + $rootScope.bulkSearch.id + \"&bulkSearchId=\" + $rootScope.bulkSearch.id);\n };\n\n $scope.showItemReviewTooltip = function(entity) {\n var reviewErrors = _.map(entity.reviewErrors__, function (error) {\n return error.split(':')[3];\n });\n\n var reviewWarnings =_.map(entity.reviewWarnings__, function (warning) {\n return warning.split(':')[3];\n });\n\n var reviewRemarks =_.map(entity.reviewRemarks__, function (remark) {\n return remark.split(':')[3];\n });\n\n var errorsAndWarnings = renderTooltipItems(reviewErrors, 'error')\n .concat(renderTooltipItems(reviewWarnings, 'warning'))\n .concat(renderTooltipItems(reviewRemarks, 'remark')).join(\"\");\n\n // Show only a tooltip if at least one error or one warning is present.\n if (errorsAndWarnings.length > 0) {\n showTooltip(entity.primaryKey__, 'item_review_' + entity.primaryKey__, errorsAndWarnings);\n }\n };\n\n function checkItemRepublication() {\n return ($rootScope.hasSettingFeature('SHOW_DIRTY_PUBLICATIONS') || $rootScope.systemSettings.UI_SHOW_ITEM_REPUBLISH_NEEDED_ICON);\n }\n\n $scope.showItemValidationsTooltip = function (entity) {\n var validationsErrors_ = _.uniq(entity.validation__);\n var validationWarnings_ = _.uniq(entity.validation_warnings__);\n\n var validationErrors = _.map(validationsErrors_, function (error) {\n return $rootScope.translateValidationLabel(error);\n });\n\n var validationWarnings = _.map(validationWarnings_, function (warning) {\n return $rootScope.translateValidationLabel(warning);\n });\n var errorsAndWarnings = renderTooltipItems(validationErrors, 'error')\n .concat(renderTooltipItems(validationWarnings, 'warning')).join(\"\");\n\n showTooltip(entity.primaryKey__, 'item_validations_' + entity.primaryKey__, errorsAndWarnings);\n };\n\n $scope.checkPublicationsDirty = function (entity) {\n var checkFlag = checkItemRepublication();\n var publishTooltip = checkFlag ? !_.isNil(entity.publications_dirty__) : false;\n return publishTooltip;\n };\n\n $scope.showPublishValidationsTooltip = function (entity) {\n var publicationErrors = !_.isNil(entity.publications_dirty__);\n var publishedDate = $filter('date')(new Date(entity.publishedAt__), 'medium');\n\n var publishTooltip = renderTooltipItems([$translate.instant('PUBLICATIONS.ON') + publishedDate], 'success').join(\"\");\n\n var itemRepublicationFlag = checkItemRepublication();\n if (itemRepublicationFlag) {\n publishTooltip = publicationErrors ? renderTooltipItems([$translate.instant('PUBLICATIONS.DIRTY')], 'error').join(\"\") :\n renderTooltipItems([$translate.instant('PUBLICATIONS.ON') + publishedDate], 'success').join(\"\");\n }\n\n showTooltip(entity.primaryKey__, 'publication_' + entity.primaryKey__, publishTooltip);\n };\n\n $scope.hideTooltip = function (entity) {\n $scope.shouldRemoveTooltip = true;\n $timeout(function() {\n hideTooltip('.hopscotch-bubble');\n }, 600);\n };\n\n // FIXME: Tooltip functionality should be replaced in favor for 'hint-tooltip-directive.js'\n function showTooltip(itemPrimaryKey, target, dataList) {\n function customRendererFn() {\n var attributeStart = '
      ';\n var attributeEnd = '
    ' +\n '';\n return attributeStart + dataList + attributeEnd;\n }\n\n var calloutConfig = {\n id: 'callout_' + itemPrimaryKey.replace(/:/g, \"_\"), //normalize id\n target: target,\n placement: 'left',\n content: '',\n customRenderer: customRendererFn\n };\n\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeAllCallouts();\n\n var calloutEle = calloutMgr.createCallout(calloutConfig);\n // Hack: override !important css rules, with inline precedence\n calloutEle.element.style.cssText += 'border: none !important; z-index: 1049;';\n $scope.shouldRemoveTooltip = false;\n }\n\n function hideTooltip(elementClass) {\n if ($(elementClass + ':hover').length == 0 &&\n $scope.shouldRemoveTooltip) {\n $(elementClass + ':hover').off('mouseout');\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeAllCallouts();\n } else {\n $(elementClass).mouseout(function() {\n $timeout(function() {\n hideTooltip(elementClass);\n }, 600);\n });\n }\n }\n\n function renderTooltipItems(items, classNames) {\n return _.map(items, function(item) {\n return '
  • ' + item + '
  • ';\n });\n }\n\n function init() {\n\n var inEditItemMode = _.includes($location.path(), EDIT_ITEM_URL);\n var inNewItemMode = _.includes($location.path(), NEW_ITEM_URL);\n var focusSection = _.includes($location.path(), FOCUS_SECTION_URL);\n var focusAttribute = _.includes($location.path(), FOCUS_ATTRIBUTE_URL);\n var section = focusSection ? FOCUS_SECTION_URL + \"/\" + $routeParams.section : \"\";\n var attribute = focusAttribute ? FOCUS_ATTRIBUTE_URL + \"/\" + $routeParams.attribute : \"\";\n\n $scope.page = $routeParams.page || 1;\n $scope.searchFinished = false;\n $scope.query = {};\n\n $scope.plans = $rootScope.communicationPlans;\n if (inEditItemMode === true) {\n var row = {\n entity: {\n primaryKey__: ($routeParams.primaryKey === 'new') ? undefined : $routeParams.primaryKey\n }\n };\n $scope.showEditor(row);\n $location.displayUrl(EDIT_ITEM_URL + $routeParams.primaryKey + section + attribute);\n } else if (inNewItemMode === true) {\n $scope.showEditor();\n $location.displayUrl(NEW_ITEM_URL);\n }\n\n $q.all([\n loadOrganizations().$promise,\n loadCommunicationChannels().$promise,\n ]).then(function(data) {\n\n var publicationDestinations = _.map($scope.organizations, function(organization) {\n return {\n key: organization.organizationId,\n name: organization.name,\n sortKey: \"1\" + organization.name,\n isOrganization: true\n };\n });\n\n _.forEach($scope.communicationChannels, function(channel) {\n if (!channel.active) {\n return;\n }\n publicationDestinations.push({\n key: channel.id,\n name: channel.name,\n sortKey: \"2\" + channel.name,\n isChannel: true\n });\n var plan = $scope.plans[channel.plan];\n if (plan && plan.supportsSubDestinations && !_.isEmpty(channel.subDestinations)) {\n for (var subDestinationKey in channel.subDestinations) {\n var label = channel.subDestinations[subDestinationKey];\n label = (label && label !== subDestinationKey) ? label + \" (\" + subDestinationKey + \")\" :\n subDestinationKey;\n publicationDestinations.push({\n key: String(channel.id) + \":\" + subDestinationKey,\n name: label,\n sortKey: \"2\" + channel.name + label + subDestinationKey,\n isSubDestination: true\n });\n }\n }\n });\n\n $scope.publicationDestinations = _.sortBy(publicationDestinations, function(destination) {\n return destination.sortKey.toLowerCase();\n });\n });\n\n if ($rootScope.isDataModelLoaded) {\n initDependingOnDatamodel();\n }\n if (!_.isNil($routeParams.taskId)) {\n loadTasks();\n }\n\n }\n\n if ($rootScope.isDataModelLoaded) {\n init();\n } else {\n $scope.$on('dataModelLoaded', function() {\n init();\n });\n $scope.$on('templatesLoaded', function() {\n initDependingOnDatamodel();\n });\n }\n\n $scope.$on('$destroy', function() {\n stopItemChangesQueues();\n stopGridCellEditListeners();\n ChannelService.unregister(ChannelService.ITEM_CHANGED_EVENT);\n });\n\n });\n","angular.module('llax')\n .controller('SearchQueryController',\n function($location, $log, $q, $rootScope, $routeParams, $scope, $translate, $timeout, $window, growl,\n DateTimeHelperService, ItemsSearchFilterResource,\n StatisticsResource, UserResource, WatchlistService, BulkSearchResource, Auth, BulkSubscriptionService) {\n\n $scope.filterGroups = [];\n $scope.dropdownIsOpen = false;\n $scope.activeFilters = $scope.activeFilters || {};\n $scope.itemsSearchFilter = {};\n $scope.invalidFilterName = false;\n $scope.onFilterView = true;\n $scope.hasRightValidateItem = Auth.hasPermission(Auth.OBJECT_TYPE_UI, 'view.validateitems');\n $scope.hasRightBulkSubscriptions = $rootScope.hasSettingFeature('BULK_SUBSCRIPTION');\n\n var FILTER_TYPE_CATEGORY = 'CATEGORY';\n var FILTER_TYPE_DATA_MODEL_DEFINED = 'DATA_MODEL_DEFINED';\n var FILTER_TYPE_ITEM_SELECTION = 'ITEM_SELECTION';\n var FILTER_TYPE_PUBLICATION_TASK = 'PUBLICATION_TASK';\n var FILTER_TYPE_PUBLISHED_TO = 'PUBLISHED_TO';\n var FILTER_TYPE_USER_DEFINED = 'USER_DEFINED';\n var FILTER_TYPE_BULK_SUBSCRIPTION = 'BULK_SUBSCRIPTION';\n // The intention of the below regular expression is to break the string on the basis of AND or OR,\n // One example for below pattern is to break the below query string\n // target_market = \"DE\" AND simple_enum = \"option3\"\n // into three tokens like below\n // target_market = \"DE\"\n // AND\n // simple_enum = \"option3\"\n var LOGICAL_OPERATORS_STRING = '(?<=\\\\s)(AND|OR)(?=\\\\s|$)';\n var FILTER_TYPE_TASK = 'TASK';\n var FILTER_TYPE_VALIDATION_WARNINGS = 'VALIDATION_WARNINGS';\n var FILTER_TYPE_VALIDATION_ERRORS = 'VALIDATION_ERRORS';\n var FILTER_TYPE_REVIEW_ERRORS = 'REVIEW_ERRORS';\n var FILTER_TYPE_REVIEW_WARNINGS = 'REVIEW_WARNINGS';\n var FILTER_TYPE_COMPLIANT_ITEMS = 'COMPLIANT_ITEMS';\n var FILTER_TYPE_NON_COMPLIANT_ITEMS = 'NON_COMPLIANT_ITEMS';\n var FILTER_TYPE_BULK_SEARCH = 'BULK_SEARCH';\n $scope.publicationStatus = [\n { 'key' : \"all\", 'label': \"ALL\"},\n { 'key' : \"APPROVED\", 'label': \"REVIEW.APPROVED\"},\n { 'key' : \"RECEIVED\", 'label': \"REVIEW.RECEIVED\"},\n { 'key' : \"REJECTED\", 'label': \"REVIEW.REJECTED\"},\n { 'key' : \"REVIEWED\", 'label': \"REVIEW.REVIEWED\"},\n { 'key' : \"MISSING\", 'label': \"REVIEW.MISSING\"}\n ];\n\n var LocalStorage = $window.localStorage;\n\n $scope.labelClass = {\n 'DATA_MODEL_DEFINED' : 'label-info',\n 'USER_DEFINED' : 'label-info',\n 'PUBLISHED_TO' : 'label-success',\n 'TASK' : 'label-task',\n 'VALIDATION_WARNINGS' : 'label-validation-warnings',\n 'VALIDATION_ERRORS' : 'label-validation-errors',\n 'REVIEW_WARNINGS' : 'label-validation-warnings',\n 'REVIEW_ERRORS' : 'label-validation-errors',\n \"COMPLIANT_ITEMS\" : 'label-success',\n \"NON_COMPLIANT_ITEMS\" : 'label-validation-errors',\n \"BULK_SEARCH\" : 'label-bulk-search'\n };\n\n var MAX_URL_PARAM_LENGTH = 1024;\n\n $scope.currentLayout = $location.path();\n\n $scope.$on('$routeUpdate', function(scope, route) {\n if (_.isEmpty(route.params)) {\n $scope.resetActiveFilters();\n $scope.$emit('itemSearchQueryChanged', {keyword: \"\"});\n } else {\n checkRouteParams(route.params);\n $scope.$emit('itemSearchQueryChanged', $scope.query);\n }\n $scope.searchFilter.attributes = getSearchFilterAttributes($routeParams.category);\n });\n\n function encodeItemQuery(query) {\n return encodeURIComponent(query)\n .replace(/'/g, \"%27\")\n .replace(/\"/g, \"%22\")\n .replace(/\\(/g, \"%28\")\n .replace(/\\)/g, \"%29\");\n }\n\n $scope.bulkSubscriptions = [];\n\n function loadBulkSubscriptions() {\n BulkSubscriptionService.getBulkSubscriptions(30, '')\n .then(function (response) {\n $scope.bulkSubscriptions = response;\n })\n .catch(function(error) {\n $log.error('Error fetching bulk subscriptions:', error);\n growl.error('BULK_SUBSCRIPTION.FETCH_ERROR');\n });\n }\n\n $scope.fetchItemsForBulkSubscriptionId = function (destination, id) {\n var searchParams = {};\n if (destination) {\n $scope.query = $scope.query || {};\n var filter = {\n name: destination.name,\n itemsQuery: {},\n type: FILTER_TYPE_BULK_SUBSCRIPTION,\n bulkSubscriptionId: id,\n };\n $scope.setActiveFilter(FILTER_TYPE_BULK_SUBSCRIPTION, filter);\n searchParams.bulkSubscriptionId = id;\n filter.name = destination.name + ' : ' + $translate.instant('Id.'+ id);\n } else {\n removeActiveFilter(FILTER_TYPE_BULK_SUBSCRIPTION);\n }\n navigateBySameKey(searchParams);\n };\n\n function decodeItemQuery(query) {\n return decodeURIComponent(query).replace(/:/g, ' = ');\n }\n\n function getSearchFilterAttributes(category) {\n var attributes = $rootScope.dataModel.filteredLayoutAttributes('filter');\n if (_.isEmpty(attributes)) {\n attributes = $rootScope.dataModel.allAttributes();\n }\n if (!_.isNil(category) && category !== 'NO_CATEGORY') {\n var categoryAttributeNames = $rootScope.dataModel.categoryAttributeNames(category);\n attributes = _.filter(attributes, function(attribute) {\n return _.includes(categoryAttributeNames, attribute.name);\n });\n }\n $rootScope.prepareAttributes(attributes);\n return _.uniq(attributes);\n }\n\n $scope.searchFilter = {\n operators: [{\n key: ':',\n value: '='\n }, {\n key: '==',\n value: '=='\n }, {\n key: '<',\n value: '<'\n }, {\n key: '<=',\n value: '<='\n }, {\n key: '>',\n value: '>'\n }, {\n key: '>=',\n value: '>='\n }],\n attributes: getSearchFilterAttributes($routeParams.category)\n };\n\n function loadItemsSearchFilters() {\n $q.all([\n ItemsSearchFilterResource.query().$promise,\n UserResource.filters().$promise,\n StatisticsResource.query({ name: \"__validation_overview\" }).$promise,\n StatisticsResource.query({ name: \"__validation_warnings\" }).$promise\n ])\n .then(function(data) {\n var userFilters = data[0];\n var dataModelFilters = data[1];\n var errors = data[2];\n var warnings = data[3];\n\n _.forEach(userFilters, function(filter) {\n angular.extend(filter, {\n label: filter.name,\n type: FILTER_TYPE_USER_DEFINED\n });\n });\n _.forEach(dataModelFilters, function(filter) {\n angular.extend(filter, {\n label: filter.label || filter.name,\n itemsQuery: {\n keyword: '(' + filter.query + ')'\n },\n type: FILTER_TYPE_DATA_MODEL_DEFINED\n });\n });\n\n $scope.filters = _.concat(userFilters, dataModelFilters);\n\n errors = translateAndSortByText(errors);\n $scope.validationErrors = copyAndMarkFiltersByKey(errors, 'errorKey');\n $scope.reviewErrors = copyAndMarkFiltersByKey(errors, 'reviewErrorKey');\n\n warnings = translateAndSortByText(warnings);\n $scope.validationWarnings = copyAndMarkFiltersByKey(warnings, 'warningKey');\n $scope.reviewWarnings = copyAndMarkFiltersByKey(warnings, 'reviewWarningKey');\n\n if (!_.isNil($scope.query.bulkSearchId)) {\n BulkSearchResource.get({\n bulkSearchId: $scope.query.bulkSearchId\n }, function(response) {\n if (response.status === 'READY') {\n growl.success('BULK_SEARCH.FINISHED');\n $rootScope.bulkSearchStillRunning = false;\n } else if (response.status === 'RUNNING') {\n growl.success('BULK_SEARCH.STILL_RUNNING');\n $rootScope.bulkSearchStillRunning = true;\n }\n });\n }\n\n });\n $scope.compliantFilters = [{\n text : $rootScope.translateValidationLabel('ITEMS_SEARCH_FILTER.MENU.COMPLIANT'),\n val : 'true',\n type : FILTER_TYPE_COMPLIANT_ITEMS\n },{\n text : $rootScope.translateValidationLabel('ITEMS_SEARCH_FILTER.MENU.NON_COMPLIANT'),\n val : 'false',\n type : FILTER_TYPE_NON_COMPLIANT_ITEMS\n }];\n }\n\n function translateAndSortByText(filters) {\n return _.sortBy(_.map(filters, function(filter) {\n filter.text = $rootScope.translateValidationLabel(filter.key);\n return filter;\n }), 'text');\n }\n\n function copyAndMarkFiltersByKey(filters, key) {\n var copy = angular.copy(filters);\n return _.map(copy, function(filter) {\n filter.searchKey = key;\n return filter;\n });\n }\n\n function isDoubleQuoted(value) {\n return _.startsWith(value, '\"') && _.endsWith(value, '\"');\n }\n\n function trimDoubleQuotes(str) {\n if (isDoubleQuoted(str)) {\n return str.slice(1, -1);\n }\n return str;\n }\n\n function getCurrentFilter() {\n var queryString = '';\n _.forEach($scope.filterGroups, function(group, index) {\n var hasAllAttributesEmpty = _.every(group.rules, function(rule) {\n return _.isNil(rule.attribute) || (_.isEmpty(rule.keyword) && !(rule.keyword instanceof Date));\n });\n\n if (!hasAllAttributesEmpty) {\n if (index > 0) {\n queryString += ' ' + group.operator + ' ';\n }\n if (group.notOperator) {\n queryString += 'NOT ';\n }\n queryString += '(';\n _.forEach(group.rules, function(rule, index) {\n if (rule.attribute && (!_.isEmpty(rule.keyword) || rule.keyword instanceof Date)) {\n if (index > 0 && rule.connector && group.rules[index-1].keyword) {\n queryString += ' ' + rule.connector + ' ';\n }\n\n var val;\n if (isDoubleQuoted(rule.keyword)) {\n val = rule.keyword;\n } else {\n val = '\"' + rule.keyword + '\"';\n }\n\n if (!_.isNil(val)) {\n var ruleBaseClass = rule.attribute.baseClass;\n switch (ruleBaseClass) {\n case 'Array':\n val = _.map(val, function (v) { return v; }).join('');\n break;\n case 'DateTime':\n var timestamp = DateTimeHelperService.convertToTimestamp(val);\n val = _.toString(timestamp);\n break;\n }\n\n }\n\n if (val.indexOf(' OR ') > -1 ||val.indexOf(' AND ') > -1) {\n val = '(' + val + ')';\n }\n if (rule.notOperator) {\n queryString += 'NOT ';\n }\n queryString += (rule.attribute.name || rule.attribute) + rule.operator + val;\n }\n });\n queryString += ')';\n }\n });\n return {\n keyword: queryString\n };\n }\n\n $scope.loadWatchlistItems = function() {\n var selectionId = $routeParams.selectionId || true;\n $location.search('selectionId', selectionId);\n };\n\n $scope.selectAllItems = function() {\n $scope.$emit('selectedItemsUpdated', 'ALL');\n };\n\n $scope.clearSelectedItems = function() {\n $scope.$emit('selectedItemsUpdated', 'NONE');\n };\n\n $scope.dropDownToggled = function(open, scope) {\n $scope.dropdownIsOpen = open;\n scope.showValidationErrors = false;\n scope.showBulkSubscriptions = false;\n scope.showValidationWarnings = false;\n _.forEach($scope.publicationDestinations, function(p) {\n p.showStatus = false;\n });\n };\n\n $scope.addFilterRule = function(group) {\n if (group.rules && group.rules.length >= 1) {\n group.operator = 'AND';\n }\n group.push({});\n };\n\n $scope.removeFilterRule = function(group, rule) {\n _.remove(group.rules, rule);\n if (group.rules.length === 0) {\n _.remove($scope.filterGroups, group);\n }\n $scope.updateQuery(rule);\n };\n\n $scope.updateQuery = function(filter) {\n var query = getCurrentFilter();\n if ((filter.operator && !_.isUndefined(filter.keyword)) || (filter.operator && filter.rules) || !_.isEmpty(query.keyword)) {\n $scope.query.keyword = decodeItemQuery(query.keyword);\n } else {\n $scope.query.keyword = '';\n }\n };\n\n $scope.transformSearchQuery = function(text) {\n var option = {\n translatedOption: text\n };\n return option;\n };\n\n $scope.addFilterGroup = function() {\n $scope.filterGroups.push({\n rules: [{}]\n });\n };\n\n $scope.updateAttributeTemplate = function(rowScope, rule, gridOptions) {\n\n // Fix to reload a template with the same name\n var placeholder = {\n template: \"Placeholder\"\n };\n\n if(_.isUndefined(rowScope.$parent.a)) {\n rowScope.$parent.a = angular.copy(rule.attribute);\n rowScope.$parent.a.readonly = false;\n } else {\n rowScope.$parent.a = placeholder;\n $timeout(function() {\n rowScope.$parent.a = angular.copy(rule.attribute);\n rowScope.$parent.a.readonly = false;\n });\n }\n\n rule.keyword = undefined;\n rowScope.$parent.watch = {\n keyword: \"\"\n };\n\n rowScope.$parent.$watch(\"watch.keyword\", function(newKeyword) {\n if (!_.isUndefined(newKeyword)) {\n rule.keyword = newKeyword;\n $scope.updateQuery(rule);\n }\n }, true);\n\n $scope.updateQuery(rule);\n };\n\n // Returns the ResourceKey for the title message to be displayed\n $scope.getTitle = function(filter) {\n if (filter.type === FILTER_TYPE_USER_DEFINED) {\n return filter.readOnly ?\n \"ITEMS_SEARCH_FILTER.PROVIDED_BY_OTHER\" :\n filter.isPublic ?\n \"ITEMS_SEARCH_FILTER.PROVIDED_BY_YOU\" :\n \"ITEMS_SEARCH_FILTER.CREATED_BY_YOU\";\n } else if (filter.type === FILTER_TYPE_DATA_MODEL_DEFINED) {\n return \"ITEMS_SEARCH_FILTER.PROVIDED_BY_DATAMODEL\";\n }\n\n return \"\";\n };\n\n // Preparing the attribute definition and watching the corresponding value\n // If attribute is not defined when loading the template\n $scope.prepareSearchFilterAttribute = function(rowScope,a,rule) {\n if(_.isNil(a)) {\n var currentAttribute = _.find($scope.searchFilter.attributes, function(attr) {\n return attr.name == rule.attribute;\n });\n rowScope.watch = {\n keyword: \"\"\n };\n if (currentAttribute) {\n rowScope.a = angular.copy(currentAttribute);\n rowScope.a.readonly = false;\n rule.attribute = rowScope.a;\n }\n\n if (!_.isNil(currentAttribute) && !_.isNil(rule.keyword)) {\n switch (currentAttribute.baseClass) {\n case 'Array':\n rule.keyword = rule.keyword.match(/(\".*?\"|[^\"\\s]+)(?=\\s*|\\s*$)/g);\n if (_.isArray(rule.keyword)) {\n rule.keyword = _.map(rule.keyword,function(ke) {\n ke = ke.replace(/\"/g, '');\n ke = _.trim(ke);\n return ke;\n });\n }\n break;\n case 'DateTime':\n rule.keyword = DateTimeHelperService.getDateFromTimestamp(rule.keyword);\n break;\n }\n }\n\n if (isDoubleQuoted(rule.keyword)) {\n rule.keyword = trimDoubleQuotes(rule.keyword);\n }\n\n rowScope.watch.keyword = rule.keyword;\n rowScope.$watch(\"watch.keyword\", function(newKeyword) {\n if (!_.isUndefined(newKeyword)) {\n rule.keyword = newKeyword;\n $scope.updateQuery(rule);\n }\n }, true);\n }\n };\n\n $scope.isAllowedTemplate = function(templateName) {\n\n var allowedTemplates = [\n \"Enum\",\n \"EnumSet\",\n \"String\",\n \"Boolean\",\n \"Date\",\n \"DateTime\",\n // With allowing a placeholder, the default Inputfield is not loaded. This prevents ugly flickering.\n \"Placeholder\",\n \"SingleBoolean\",\n \"OpenEnum\",\n \"OpenEnumSet\",\n ];\n\n if (_.includes(allowedTemplates, templateName)) {\n return true;\n } else {\n return false;\n }\n\n };\n\n $scope.onPaste = function(evt, scope) {\n\n var clipboardData = (evt.clipboardData || evt.originalEvent.clipboardData || window.clipboardData);\n var pastedData;\n try {\n pastedData = clipboardData.getData('Text') || clipboardData.getData('text/plain');\n } catch (e) {\n $log.error(\"Could not access clipboard\", e);\n return;\n }\n\n pastedData = _.trim(pastedData);\n if (_.isEmpty(pastedData)) {\n return;\n }\n\n var queryText = evt.originalEvent.target.value;\n var textSelectionStart = evt.originalEvent.target.selectionStart;\n var textSelectionEnd = evt.originalEvent.target.selectionEnd;\n\n var pre = '';\n var post = '';\n\n $timeout(function() {\n\n pre = queryText.substring(0, textSelectionStart);\n post = queryText.substring(textSelectionEnd);\n\n // Split data into words separated by 'newline' or 'return',\n // Join by \" OR \"\n var rows = _.words(pastedData, /[^\\n\\r]+/g);\n var modifiedData = _.join(rows, ' OR ');\n if (scope && _.isObject(scope.watch)) {\n scope.watch.keyword = modifiedData;\n } else {\n $scope.query.keyword = pre + modifiedData + post;\n }\n\n }, 0);\n\n };\n\n function toggleFilter(filter) {\n if (filter.type === FILTER_TYPE_USER_DEFINED) {\n removeActiveFilter(FILTER_TYPE_DATA_MODEL_DEFINED);\n } else if (filter.type === FILTER_TYPE_DATA_MODEL_DEFINED) {\n removeActiveFilter(FILTER_TYPE_USER_DEFINED);\n }\n setActiveFilter(filter);\n }\n\n $scope.setActiveFilter = function(type, itemsSearchFilter) {\n\n if (type && itemsSearchFilter) {\n toggleFilter(itemsSearchFilter);\n } else {\n $scope.resetActiveFilters();\n }\n\n if (itemsSearchFilter.itemsQuery && itemsSearchFilter.itemsQuery.keyword) {\n $scope.query.keyword = decodeItemQuery(itemsSearchFilter.itemsQuery.keyword);\n }\n };\n\n function removeActiveFilter(type) {\n delete $scope.activeFilters[type];\n }\n\n function setActiveFilter(filter) {\n $scope.activeFilters[filter.type] = filter;\n }\n\n $scope.resetActiveFilters = function() {\n $scope.activeFilters = {};\n $scope.query.keyword = '';\n };\n\n $scope.createFilter = function() {\n var category = $scope.activeFilters[FILTER_TYPE_CATEGORY];\n $scope.clearSearchQuery(category);\n $scope.showEditFilter = true;\n $scope.addFilterGroup();\n };\n\n $scope.editFilter = function(itemsSearchFilter) {\n if (itemsSearchFilter.key) {\n return;\n }\n $scope.showEditFilter = true;\n $scope.filterGroups = [];\n $scope.itemsSearchFilter = {\n name: itemsSearchFilter.name,\n isPublic: itemsSearchFilter.isPublic\n };\n\n var regexForValues = new RegExp(LOGICAL_OPERATORS_STRING);\n var regexForOperators = new RegExp(LOGICAL_OPERATORS_STRING,'g');\n var operator = '';\n var groupOperator = '';\n var ruleOperator = '';\n var hasGroupNotOperator = false;\n var queryParts = $rootScope.splitStringByOuterParentheses(itemsSearchFilter.itemsQuery.keyword);\n\n _.forEach(queryParts, function(part, index) {\n var queryPart = _.trim(part);\n if (queryPart === 'AND NOT' || queryPart === 'OR NOT') {\n queryPart = queryPart.replace('NOT','');\n queryPart = _.trim(queryPart);\n hasGroupNotOperator = true;\n }\n if (queryPart !== 'AND' && queryPart !== 'OR') {\n var group = {\n rules: []\n };\n if (groupOperator !== '') {\n group.operator = groupOperator;\n groupOperator = '';\n }\n if (hasGroupNotOperator) {\n group.notOperator = true;\n hasGroupNotOperator = false;\n }\n var components = queryPart.split(regexForValues).filter(function(e) { return e; });\n var operators = queryPart.match(regexForOperators);\n _.forEach(components, function(entity,idx) {\n if (entity !== 'AND' && entity !== 'OR') {\n var ruleArray = [];\n _.forEach($scope.searchFilter.operators, function(op) {\n var splitted = entity.split(op.key);\n if (splitted.length === 2) {\n ruleArray = splitted;\n operator = op.key;\n }\n });\n var hasNotOperator = false;\n if (ruleArray[0] && ruleArray[0].indexOf('NOT') > -1) {\n ruleArray[0] = ruleArray[0].replace('NOT','');\n ruleArray[0] =_.trim(ruleArray[0]);\n hasNotOperator = true;\n }\n var rule = {\n attribute: _.trim(ruleArray[0]),\n operator: operator,\n keyword: _.trim(ruleArray[1]),\n notOperator: hasNotOperator\n };\n if (/\\(*\\)/.test(rule.keyword)) {\n rule.keyword = rule.keyword.replace(/\\(|\\)/g,'');\n }\n if (operators && operators.length && idx>0) {\n rule.connector = _.trim(operators[idx-1] || '');\n }\n group.rules.push(rule);\n } else {\n ruleOperator = entity;\n }\n });\n $scope.filterGroups.push(group);\n } else {\n groupOperator = queryPart;\n }\n });\n };\n\n $scope.saveFilter = function(itemsSearchFilter) {\n $scope.invalidFilterName = false;\n if (!itemsSearchFilter.name) {\n $scope.invalidFilterName = true;\n growl.warning('ITEMS_SEARCH_FILTER.MISSING_FILTER_NAME');\n return false;\n }\n\n angular.extend(itemsSearchFilter, {\n itemsQuery: getCurrentFilter()\n });\n\n if ($scope.activeFilters.USER_DEFINED && $scope.activeFilters.USER_DEFINED.name === itemsSearchFilter.name) {\n ItemsSearchFilterResource.delete({\n identifier: itemsSearchFilter.name\n }, function(response) {\n ItemsSearchFilterResource.save(itemsSearchFilter, function(response) {\n $scope.resetFilterEditor();\n loadItemsSearchFilters();\n angular.extend(itemsSearchFilter, {\n label: itemsSearchFilter.name,\n type: FILTER_TYPE_USER_DEFINED\n });\n $scope.setActiveFilter(FILTER_TYPE_USER_DEFINED, itemsSearchFilter);\n growl.success('ITEMS_SEARCH_FILTER.SAVE_SUCCESS_MESSAGE');\n }, function(errorResponse) {\n growl.error('ITEMS_SEARCH_FILTER.SAVE_ERROR_MESSAGE');\n });\n });\n } else {\n ItemsSearchFilterResource.save(itemsSearchFilter, function(response) {\n $scope.resetFilterEditor();\n loadItemsSearchFilters();\n angular.extend(itemsSearchFilter, {\n label: itemsSearchFilter.name,\n type: FILTER_TYPE_USER_DEFINED\n });\n $scope.setActiveFilter(FILTER_TYPE_USER_DEFINED, itemsSearchFilter);\n growl.success('ITEMS_SEARCH_FILTER.SAVE_SUCCESS_MESSAGE');\n }, function(errorResponse) {\n if (errorResponse.status == 409) {\n growl.error('ITEMS_SEARCH_FILTER.SAVE_ERROR_CONFLICT_MESSAGE', {variables: {filterName: errorResponse.data.data[0]}});\n angular.element(\".filter-new-profile .form-control\").focus();\n } else {\n growl.error('ITEMS_SEARCH_FILTER.SAVE_ERROR_MESSAGE');\n }\n });\n }\n };\n\n $scope.deleteFilter = function(itemsSearchFilter) {\n ItemsSearchFilterResource.delete({\n identifier: itemsSearchFilter.name\n }, function(response) {\n growl.success('ITEMS_SEARCH_FILTER.DELETE_SUCCESS_MESSAGE');\n loadItemsSearchFilters();\n removeActiveFilter(FILTER_TYPE_USER_DEFINED);\n }, function(errorResponse) {\n growl.error('ITEMS_SEARCH_FILTER.DELETE_ERROR_MESSAGE');\n });\n };\n\n $scope.resetFilterEditor = function() {\n $scope.showEditFilter = false;\n $scope.filterGroups = [];\n $scope.itemsSearchFilter = {};\n $scope.invalidFilterName = false;\n };\n\n $scope.clearSearchQuery = function (category) {\n if (!_.isNil(category)) {\n $location.url($location.path() + \"?category=\" + category.name);\n $scope.resetFilterEditor();\n $scope.resetActiveFilters();\n setActiveFilter(category);\n }\n };\n\n $scope.removeFilter = function(filter) {\n if (filter.type === FILTER_TYPE_CATEGORY) {\n $location.search('category', null);\n delete $scope.query.category;\n } else if (filter.type === FILTER_TYPE_ITEM_SELECTION) {\n $location.search('selectionId', null);\n delete $scope.query.selectionId;\n } else if (filter.type === FILTER_TYPE_PUBLISHED_TO) {\n $location.search('publicationDestination', null);\n delete $scope.query.publicationDestination;\n $location.search('reviewStatus', null);\n delete $scope.query.reviewStatus;\n $location.search('reviewer', null);\n delete $scope.query.reviewer;\n } else if (filter.type === FILTER_TYPE_PUBLICATION_TASK) {\n $location.search('publicationTaskId', null);\n $location.search('withPublicationTaskChecksums', null);\n delete $scope.query.publicationTaskId;\n delete $scope.query.withPublicationTaskChecksums;\n } else if (filter.type === FILTER_TYPE_TASK) {\n $location.search('taskId', null);\n $location.search('tags', null);\n delete $scope.query.taskId;\n delete $scope.query.tags;\n } else if (filter.type === FILTER_TYPE_BULK_SEARCH) {\n $location.search('bulkSearchId', null);\n $location.search('tags', null);\n delete $scope.query.bulkSearchId;\n delete $scope.query.tags;\n } else if (filter.type === FILTER_TYPE_BULK_SUBSCRIPTION) {\n $location.search('bulkSubscriptionId', null);\n delete $scope.query.bulkSubscriptionId;\n } else if (!_.isEmpty(filter.searchKey)) {\n $location.search(filter.searchKey, null);\n delete $scope.query[filter.searchKey];\n } else {\n $scope.query.keyword = '';\n $rootScope.$broadcast('itemSearchQueryChanged', {keyword: ''});\n }\n removeActiveFilter(filter.type);\n };\n\n $scope.fetchItemsForPublicationDestination = function(destination, status) {\n if (destination) {\n $scope.query = $scope.query || {};\n var filter = {\n name: destination.name,\n itemsQuery: {},\n type: FILTER_TYPE_PUBLISHED_TO,\n status : status,\n key : destination.name\n };\n var searchParams = {};\n $scope.setActiveFilter(FILTER_TYPE_PUBLISHED_TO, filter);\n if (status && status != 'all') {\n delete $scope.query.publicationDestination;\n searchParams.reviewer = destination.key;\n searchParams.reviewStatus = status;\n filter.name = destination.name + ' : ' + $translate.instant('REVIEW.'+ status);\n } else {\n searchParams = { 'publicationDestination' : destination.key };\n delete $scope.query.reviewStatus;\n delete $scope.query.reviewer;\n }\n navigateBySameKey(searchParams);\n\n } else {\n removeActiveFilter(FILTER_TYPE_PUBLISHED_TO);\n }\n };\n\n function navigateBySameKey(key, val) {\n if ($location.$$search.category || !_.isEmpty($location.$$search.q)) {\n var url = $location.$$url;\n if (_.isObject(key)) {\n _.forEach(key, function(k,v) {\n url = url + \"&\" + v + \"=\" + k;\n });\n $location.url(url);\n } else {\n var urlKey = key + \"=\";\n var index = url.indexOf(urlKey);\n if (index >= 0) {\n index += urlKey.length;\n $location.url(url.substring(0, index) + val);\n } else {\n $location.url(url + \"&\" + key + \"=\" + val);\n }\n }\n\n } else {\n $location.url($location.path());\n if (_.isObject(key)) {\n $location.search(key);\n } else {\n $location.search(key, val);\n }\n }\n }\n\n $scope.filterByValidationFilter = function(val) {\n navigateBySameKey(val.searchKey,val.key);\n };\n\n $scope.fetchItemsByCompliant = function(val) {\n navigateBySameKey('compliant',val);\n };\n\n $rootScope.$on('buckSearchPopupOpend', function(scope) {\n if ($scope.query) {\n delete $scope.query.keyword;\n }\n });\n\n function checkRouteParams(routeParams) {\n\n if (routeParams.q) {\n $scope.query.keyword = routeParams.q.split(\"+\").join(\" \");\n } else if($scope.query.keyword) {\n $location.search('q', $scope.query.keyword);\n }\n if (routeParams.category) {\n delete $scope.query.selectionId;\n } else if (routeParams.selectionId) {\n delete $scope.query.category;\n }\n\n if ($scope.query) {\n _.forEach(Object.keys($scope.query), function(key) {\n if (!routeParams[key] && key != 'keyword') {\n $location.search(key, $scope.query[key]);\n }\n });\n }\n\n var filter;\n if (routeParams.category) {\n var category = routeParams.category;\n filter = {\n name: category,\n itemsQuery: {\n category: category\n },\n type: FILTER_TYPE_CATEGORY\n };\n removeActiveFilter(FILTER_TYPE_ITEM_SELECTION);\n $scope.setActiveFilter(FILTER_TYPE_CATEGORY, filter);\n $scope.query.category = category;\n }\n\n if (routeParams.reviewStatus) {\n $scope.query.reviewStatus = routeParams.reviewStatus;\n }\n\n if (routeParams.bulkSubscriptionId) {\n $scope.query.bulkSubscriptionId = routeParams.bulkSubscriptionId;\n }\n\n if (routeParams.publicationDestination || routeParams.reviewer) {\n if (routeParams.reviewer) {\n $scope.query.reviewer = routeParams.reviewer;\n } else {\n $scope.query.publicationDestination = routeParams.publicationDestination;\n }\n\n $timeout(function () {\n var filter = {\n key: routeParams.publicationDestination || routeParams.reviewer,\n itemsQuery: {},\n type: FILTER_TYPE_PUBLISHED_TO\n };\n var key = isNaN(filter.key) ? filter.key : Number(filter.key);\n var dest = _.find($scope.publicationDestinations, {\n 'key': key\n });\n filter.name = !_.isEmpty(dest) ? dest.name : filter.name;\n if (routeParams.reviewStatus) {\n filter.name += ' : ' + $translate.instant('REVIEW.'+ routeParams.reviewStatus);\n }\n var activeFilter = $scope.activeFilters[filter.type];\n var activeFilterName = activeFilter ? activeFilter.name : \"\";\n if (!_.isEqual(filter.name, activeFilterName)) {\n $scope.setActiveFilter(FILTER_TYPE_PUBLISHED_TO, filter);\n }\n }, 0);\n } else {\n delete $scope.activeFilters[FILTER_TYPE_PUBLISHED_TO];\n }\n\n if (routeParams.publicationTaskId) {\n $scope.query.publicationTaskId = routeParams.publicationTaskId;\n filter = {\n name: routeParams.publicationTaskId,\n itemsQuery: {},\n type: FILTER_TYPE_PUBLICATION_TASK\n };\n $scope.setActiveFilter(FILTER_TYPE_PUBLICATION_TASK, filter);\n }\n\n if (routeParams.firstPrimaryKey && routeParams.secondPrimaryKey) {\n var primaryKeys = [];\n primaryKeys.push(routeParams.firstPrimaryKey);\n primaryKeys.push(routeParams.secondPrimaryKey);\n $scope.compareItems(primaryKeys);\n }\n\n if (routeParams.selectionId) {\n $scope.query.selectionId = routeParams.selectionId;\n filter = {\n name: $translate.instant(FILTER_TYPE_ITEM_SELECTION),\n itemsQuery: {\n primaryKeys: WatchlistService.getWatchlistPrimaryKeys()\n },\n type: FILTER_TYPE_ITEM_SELECTION\n };\n removeActiveFilter(FILTER_TYPE_CATEGORY);\n $scope.setActiveFilter(FILTER_TYPE_ITEM_SELECTION, filter);\n }\n\n if (routeParams.bulkSearchId) {\n delete $scope.query.taskId;\n delete routeParams.taskId;\n delete $routeParams.taskId;\n\n if ($scope.query == \"\") {\n $scope.query = {};\n }\n\n removeActiveFilter(FILTER_TYPE_TASK);\n $scope.query.bulkSearchId = routeParams.bulkSearchId;\n if (routeParams.tags) {\n $scope.query.tags = routeParams.tags;\n }\n var name = $translate.instant(FILTER_TYPE_BULK_SEARCH);\n\n filter = {\n name: name,\n type: FILTER_TYPE_BULK_SEARCH\n };\n\n $scope.activeFilters[FILTER_TYPE_BULK_SEARCH] = filter;\n } else {\n delete $scope.query.bulkSearchId;\n delete $scope.query.tags;\n delete $scope.activeFilters[FILTER_TYPE_BULK_SEARCH];\n }\n\n if (routeParams.taskId) {\n if ($scope.task && $scope.task.$promise) {\n $scope.task.$promise.then(function(res) {\n setTaskFilter(res, routeParams);\n });\n } else {\n $rootScope.$on('taskLoaded', function(scope, task) {\n setTaskFilter(task, routeParams);\n });\n }\n }\n\n var key;\n if (routeParams.errorKey) {\n key = 'errorKey';\n $scope.query[key] = routeParams[key];\n setValidationFilter({text : $rootScope.translateValidationLabel(routeParams.errorKey), searchKey:key});\n } else {\n delete $scope.activeFilters[FILTER_TYPE_VALIDATION_ERRORS];\n }\n\n if (routeParams.warningKey) {\n key = 'warningKey';\n $scope.query[key] = routeParams[key];\n setValidationFilter({text : $rootScope.translateValidationLabel(routeParams.warningKey), searchKey:key});\n } else {\n delete $scope.activeFilters[FILTER_TYPE_VALIDATION_WARNINGS];\n }\n\n if (routeParams.reviewErrorKey) {\n key = 'reviewErrorKey';\n $scope.query[key] = shortenParamString(routeParams[key]);\n setValidationFilter({text : $rootScope.translateValidationLabel(routeParams.reviewErrorKey), searchKey:key});\n } else {\n delete $scope.activeFilters[FILTER_TYPE_REVIEW_ERRORS];\n }\n\n if (routeParams.reviewWarningKey) {\n key = 'reviewWarningKey';\n $scope.query[key] = shortenParamString(routeParams[key]);\n setValidationFilter({text : $rootScope.translateValidationLabel(routeParams.reviewWarningKey), searchKey:key});\n } else {\n delete $scope.activeFilters[FILTER_TYPE_REVIEW_WARNINGS];\n }\n\n if (routeParams.compliant) {\n key = 'compliant';\n $scope.query[key] = routeParams[key];\n setValidationFilter({compliant : routeParams.compliant, searchKey:key});\n } else {\n delete $scope.activeFilters[FILTER_TYPE_COMPLIANT_ITEMS];\n delete $scope.activeFilters[FILTER_TYPE_NON_COMPLIANT_ITEMS];\n }\n }\n\n function setTaskFilter(task, routeParams) {\n $scope.query.taskId = routeParams.taskId;\n if (routeParams.tags) {\n $scope.query.tags = routeParams.tags;\n }\n if (!_.isEmpty(task) && !_.isEmpty(task.title)) {\n var filter = {\n name: task.title,\n type: FILTER_TYPE_TASK\n };\n $scope.activeFilters[FILTER_TYPE_TASK] = filter;\n }\n }\n\n function setValidationFilter(val) {\n if (!_.isEmpty(val)) {\n var type = '';\n if (val.searchKey == 'errorKey') {\n type = FILTER_TYPE_VALIDATION_ERRORS;\n } else if (val.searchKey == 'warningKey') {\n type = FILTER_TYPE_VALIDATION_WARNINGS;\n } else if (val.searchKey == 'reviewErrorKey') {\n type = FILTER_TYPE_REVIEW_ERRORS;\n } else if (val.searchKey == 'reviewWarningKey') {\n type = FILTER_TYPE_REVIEW_WARNINGS;\n } else if (val.searchKey == 'compliant') {\n var comp = _.find($scope.compliantFilters, {val : val.compliant});\n if (comp) {\n type = comp.type;\n val.text = comp.text;\n }\n if (val.compliant == 'true') {\n delete $scope.activeFilters[FILTER_TYPE_NON_COMPLIANT_ITEMS];\n } else if (val.compliant == 'false') {\n delete $scope.activeFilters[FILTER_TYPE_COMPLIANT_ITEMS];\n }\n }\n var filter = {\n name: val.text,\n itemsQuery: {},\n type: type,\n searchKey : val.searchKey\n };\n $scope.activeFilters[type] = filter;\n }\n }\n\n function shortenParamString(param) {\n // This regex returns the first MAX_URL_PARAM_LENGTH(any) characters plus any subsequent non-space characters.\n return param.replace(new RegExp(\"^(.{\" + MAX_URL_PARAM_LENGTH + \"}[^\\s]*).*\"), \"$1\");\n }\n\n (function init() {\n loadItemsSearchFilters();\n loadBulkSubscriptions();\n checkRouteParams($routeParams);\n })();\n }\n );\n","angular.module('llax')\n.controller('JsonEditorController',\n function($scope, $modalInstance, jsonEditorData) {\n\n $scope.config = jsonEditorData.config || {};\n $scope.data = jsonEditorData;\n var configKey = _.get($scope.config,'key');\n var canEditConfigKey = _.get($scope.config,'editKey');\n if (configKey) {\n $scope.json = jsonEditorData.json[configKey] || jsonEditorData.json;\n } else {\n $scope.json = jsonEditorData.json;\n }\n\n $scope.allTypes = {\n \"s\" : \"string\",\n \"o\" : \"object\",\n 'a' : \"array\"\n };\n $scope.allActions = {\n \"a\" : \"append\",\n \"i\" : \"insert\",\n 'r' : \"remove\",\n 'l' : \"load\"\n };\n\n $scope.close = function() {\n $modalInstance.close();\n };\n\n $scope.save = function() {\n $scope.saveJson();\n $modalInstance.close(jsonEditorData.json);\n };\n\n $scope.saveJson = function() {\n var data_i = $scope.jsonData[0];\n var data_o = getEleVal(data_i);\n if (configKey && canEditConfigKey && data_o) {\n delete jsonEditorData.json[configKey];\n jsonEditorData.json[data_i.key] = data_o;\n } else if (configKey && data_o) {\n jsonEditorData.json[configKey] = data_o;\n } else {\n jsonEditorData.json = data_o;\n }\n };\n\n function getEleVal(element) {\n var output;\n if (element.type == $scope.allTypes.a) {\n output = [];\n } else if (element.type == $scope.allTypes.o) {\n output = {};\n } else if (element.type == $scope.allTypes.s) {\n return element.value;\n }\n _.forEach(element.elements, function(e) {\n if (element.type == $scope.allTypes.a) {\n output.push(getEleVal(e));\n } else if (element.type == $scope.allTypes.o) {\n output[e.key] = getEleVal(e);\n }\n });\n return output;\n }\n\n function prepareElement(obj) {\n if (!_.isNil(obj)) {\n obj.show = true;\n obj.allowedTypes = _.values($scope.allTypes);\n obj.allowedActions = _.values($scope.allActions);\n }\n }\n\n var level_0 = {\n type : getType($scope.json),\n expanded : true,\n level : 0,\n show : true,\n allowedActions : [$scope.allActions.i],\n allowedTypes : [$scope.allTypes.o]\n };\n\n if (configKey && canEditConfigKey) {\n level_0.canEditRow = true;\n level_0.canEditKey = true;\n }\n addRestrictions($scope.allActions.l, level_0, $scope.json);\n level_0.key = configKey || level_0.type;\n var elements = [level_0];\n elements[0].elements = prepareElements($scope.json, null, elements[0]);\n prepareOperations(level_0);\n\n function getType(ob) {\n if (_.isArray(ob)) {\n return $scope.allTypes.a;\n } if (_.isPlainObject(ob)) {\n return $scope.allTypes.o;\n } if (_.isString(ob)) {\n return $scope.allTypes.s;\n } else {\n return $scope.allTypes.a;\n }\n }\n\n function prepareElements(obj,l,parent) {\n l = l || 1;\n var innerElements = [];\n var isParentArray = _.isArray(obj);\n\n _.forEach(obj, function(j,i) {\n var element = {\n expanded : true,\n level : l,\n canEditKey : true,\n canEditRow : true,\n key : i,\n isParentArray : isParentArray\n };\n\n prepareElement(element);\n var prepareNext = false;\n\n if (parent) {\n element.parent = parent;\n }\n\n if (_.isArray(j)) {\n element.type = $scope.allTypes.a;\n prepareNext = true;\n } else if (_.isPlainObject(j)) {\n element.type = $scope.allTypes.o;\n prepareNext = true;\n } else {\n element.type = $scope.allTypes.s;\n element.value = j;\n prepareNext = false;\n }\n if (addRestrictions($scope.allActions.l, element, j)) {\n return;\n }\n\n innerElements.push(element);\n elements.push(element);\n\n if (prepareNext) {\n var preparedElements = prepareElements(j, l+1, element);\n if (!_.isUndefined(preparedElements)) {\n element.elements = preparedElements;\n } else {\n var rIdx1 = elements.indexOf(element);\n elements.splice(rIdx1,1);\n var rIdx2 = innerElements.indexOf(element);\n innerElements.splice(rIdx2,1);\n }\n }\n prepareOperations(element);\n });\n return innerElements;\n }\n\n $scope.jsonData = elements;\n $scope.getElementValue = function(t) {\n var length = t.elements ? t.elements.length : '0';\n if (t.type == $scope.allTypes.a) {\n return '[' + length +']';\n } else if (t.type == $scope.allTypes.o) {\n return '{' + length +'}';\n } else {\n return t.value;\n }\n };\n $scope.toggleJson = function(el) {\n el.expanded = !el.expanded;\n toggleRows(el.elements,el.expanded);\n };\n function toggleRows(els,flag) {\n _.forEach(els, function(elm) {\n elm.show = flag;\n if (!_.isUndefined(elm.elements) && elm.expanded) {\n toggleRows(elm.elements,flag);\n }\n });\n }\n $scope.changeType = function(el,type) {\n el.expanded = false;\n el.type = type;\n if (type != $scope.allTypes.s) {\n removeElementsFromMain(el.elements);\n el.elements = [];\n var defaultItem = getDefaultItem(el,el.level+1);\n defaultItem.parent = el;\n if (type == $scope.allTypes.a) {\n defaultItem.key = 0;\n defaultItem.isParentArray = true;\n }\n if (el.level != 0) {\n var insertIdx = $scope.jsonData.indexOf(el) + 1;\n $scope.jsonData.splice(insertIdx, 0, defaultItem);\n } else {\n el.key = el.type;\n }\n el.elements.push(defaultItem);\n el.expanded = true;\n } else {\n el.insertOperation = el.value ? false : true;\n removeElementsFromMain(el.elements);\n delete el.elements;\n }\n prepareOperations(el);\n };\n\n function rearrangIndex(els) {\n _.forEach(els, function(el,i) {\n el.key = i;\n });\n }\n\n $scope.append = function(e) {\n var defaultItem = getDefaultItem(e,e.level);\n defaultItem.parent = e.parent;\n var appendIdx;\n if (_.isEmpty(e.elements)) {\n appendIdx = $scope.jsonData.indexOf(e) + 1;\n } else {\n appendIdx = getIndexRecursive(e.elements);\n }\n\n $scope.jsonData.splice(appendIdx, 0, defaultItem);\n e.parent.elements.splice(e.key + 1, 0, defaultItem);\n if (defaultItem.parent && defaultItem.parent.type == $scope.allTypes.a) {\n var cidx = e.parent.elements.indexOf(e);\n defaultItem.key = cidx + 1;\n defaultItem.isParentArray = true;\n rearrangIndex(e.parent.elements);\n }\n addRestrictions($scope.allActions.a,defaultItem);\n prepareOperations(defaultItem);\n };\n $scope.insert = function(e, defaultValues) {\n var defaultItem = getDefaultItem(e,e.level+1);\n angular.extend(defaultItem,defaultValues);\n defaultItem.parent = e;\n e.elements = e.elements || [];\n if (!e.expanded) {\n $scope.toggleJson(e);\n }\n var insertIdx;\n if (_.isEmpty(e.elements)) {\n insertIdx = $scope.jsonData.indexOf(e) + 1;\n } else {\n insertIdx = getIndexRecursive(e.elements);\n }\n if (e.level == 0 && insertIdx == 0) {\n insertIdx = 1;\n removeElementsFromMain(e.elements);\n e.elements = [];\n }\n if (e.type == $scope.allTypes.a) {\n defaultItem.key = e.elements.length;\n defaultItem.isParentArray = true;\n }\n $scope.jsonData.splice(insertIdx, 0, defaultItem);\n e.elements.push(defaultItem);\n addRestrictions($scope.allActions.i,defaultItem);\n prepareOperations(defaultItem);\n };\n function getIndexRecursive(els) {\n var lastEle = els[els.length -1];\n if (lastEle && lastEle.elements) {\n return getIndexRecursive(lastEle.elements);\n } else {\n var idx = $scope.jsonData.indexOf(lastEle);\n return idx > -1 ? idx + 1 : 0;\n }\n }\n $scope.remove = function(e) {\n removeElementsFromMain(e.elements);\n var idx = $scope.jsonData.indexOf(e);\n $scope.jsonData.splice(idx,1);\n var idx1 = e.parent.elements.indexOf(e);\n e.parent.elements.splice(idx1,1);\n if (e.isParentArray) {\n rearrangIndex(e.parent.elements);\n }\n if (e.parent.elements.length == 0) {\n e.parent.expanded = false;\n }\n };\n function removeElementsFromMain(els) {\n _.forEach(els, function(el) {\n if (!_.isEmpty(el.elements)) {\n removeElementsFromMain(el.elements);\n }\n var idx = $scope.jsonData.indexOf(el);\n if (idx > -1) {\n $scope.jsonData.splice(idx,1);\n }\n });\n }\n $scope.checkDuplicateKey = function(el) {\n if (!el.parent) {\n return;\n }\n var noDup = _.every(el.parent.elements, function(e) {\n return e.key != el.newKey;\n });\n el.hasKeyError = !noDup;\n };\n\n $scope.isJsonInEditMode = function() {\n return !_.every($scope.jsonData, function(d) {\n return !(d.insertOperation || d.editRow);\n });\n };\n\n function prepareOperations(e) {\n if (!_.isEmpty(e.allowedActions) || !_.isEmpty(e.allowedTypes)) {\n e.hideActions = _.isEmpty(e.allowedActions);\n e.hideTypes = _.isEmpty(e.allowedTypes) || (e.type == e.allowedTypes);\n e.hideMenuBtn = e.hideActions && e.hideTypes;\n } else {\n e.hideMenuBtn = true;\n }\n }\n function getDefaultItem(el,l) {\n var de = {\n type : \"string\",\n level : l,\n canEditKey : true,\n canEditRow : true,\n insertOperation : true\n };\n prepareElement(de);\n return de;\n }\n\n function addRestrictions(restriction_on, element, object) {\n if (_.isEmpty(restriction_on) || _.isEmpty(element) || !_.isPlainObject(element) || _.isEmpty($scope.config.levelRestrictions)) {\n return false;\n }\n var l = element.level;\n var levelLimit = _.get($scope.config,'levelRestrictions.levelLimit');\n if (levelLimit && l > (levelLimit+1)) {\n return true;\n }\n\n var level_type = _.get($scope.config,'levelRestrictions.types.'+ l +'.type');\n var level_keys_restriction = _.get($scope.config,'levelRestrictions.types.'+ l +'.keys');\n var parent_level_keys_restriction = _.get($scope.config,'levelRestrictions.types.'+ (l-1) +'.keys');\n\n if (restriction_on == $scope.allActions.l) {\n if (level_type) {\n element.allowedTypes = [level_type];\n }\n if (level_type && element.type !=level_type) {\n element.type = level_type;\n return true;\n }\n if (levelLimit && l > levelLimit) {\n element.allowedTypes = [];\n }\n if (!_.isEmpty(parent_level_keys_restriction)) {\n element.allowedActions = [];\n element.canEditKey = false;\n }\n if (!_.isEmpty(level_keys_restriction)) {\n element.allowedActions = [$scope.allActions.r,$scope.allActions.a];\n _.forEach(object, function(val,key) {\n if (level_keys_restriction.indexOf(key) > -1) {\n object[key] = val || '';\n } else {\n delete object[key];\n }\n });\n }\n } else {\n if (level_type) {\n element.allowedTypes = [level_type];\n if (level_type != $scope.allTypes.s) {\n element.type = level_type;\n element.insertOperation = false;\n element.expanded = true;\n if (!_.isEmpty(level_keys_restriction)) {\n element.allowedActions = [$scope.allActions.r,$scope.allActions.a];\n _.forEach(level_keys_restriction, function(k) {\n $scope.insert(element, {\n key : k,\n canEditKey : false,\n allowedActions : []\n });\n });\n } else {\n $scope.insert(element);\n }\n }\n }\n if (levelLimit && l >= levelLimit) {\n element.allowedTypes = [];\n }\n }\n }\n\n }\n);\n","angular.module('llax')\n .controller('KeyValueMapsController',\n function($scope, $rootScope, $window, $location, $translate, $timeout, $modal, $dialogs, $q, KeyValueMapRessource, InfiniteScrollHelper, QueryKeyValueMapRessource, growl, uiGridEditConstants, ErrorCode) {\n\n var KEY_VALUE_MAP = \"keyValueMap\";\n\n var LocalStorage = $window.localStorage;\n\n $scope.entries = [];\n $scope.creating = false;\n $scope.rowEdit = false;\n $scope.editingRow = null;\n $scope.state = {};\n $scope.keyValueMapsLoading = false;\n\n $scope.columnDefs = [{\n field: 'key',\n displayName: $translate.instant('Key'),\n headerTooltip: true,\n cellTooltip: true,\n cellClass: 'text-center',\n enableCellEdit: true,\n enableCellEditOnFocus: true,\n cellEditableCondition: keyCellEditableCondition,\n width: '*'\n }, {\n field: 'value',\n displayName: $translate.instant('Value'),\n headerTooltip: true,\n cellTooltip: true,\n cellEditableCondition: valueCellEditableCondition,\n width: '*'\n },\n {\n field: 'actions',\n displayName: '',\n enableCellSelection: false,\n allowCellFocus: false,\n enableCellEdit: false,\n cellClass: 'text-right',\n headerCellClass: 'text-right',\n enableColumnResizing: false,\n enableSorting: false,\n pinnedRight: true,\n width: 60,\n cellTemplate: '
    ' +\n '
    ' +\n '' +\n '' +\n '' +\n '
    ' +\n '
    '\n }];\n\n $scope.gridOptions = {\n data: 'entries',\n rowHeight: 34,\n enableColumnMenus: false,\n enableSorting: false,\n columnDefs: $scope.columnDefs,\n infiniteScrollUp: false,\n infiniteScrollDown: true\n };\n\n $scope.queryParams = {\n limit: 20\n };\n\n // Accessor to get/set entries, used in 'InfiniteScrollHelper'\n function entriesAccessor(entries) {\n if (!_.isUndefined(entries)) {\n $scope.entries = _.map(entries, function(entry) {\n return { key:entry.key, value:entry.value };\n });\n }\n $scope.keyValueMapsLoading = false;\n return $scope.entries;\n }\n\n // Error handler used in 'InfiniteScrollHelper'\n function errorHandler(errorStatus, errorData) {\n var errorCode = $rootScope.getErrorCode({ data: errorData });\n if (errorCode !== ErrorCode.UNSPECIFIED) {\n var errorMessage = $rootScope.getErrorMessage({ data: errorData });\n growl.error(errorMessage, {\n ttl: 3000\n });\n }\n $scope.status = errorStatus;\n }\n\n function keyCellEditableCondition () {\n var cell = $scope.gridApi.cellNav.getFocusedCell();\n\n if(cell.row.entity.key == \"\"){\n return true;\n }\n return false;\n }\n\n function valueCellEditableCondition () {\n var cell = $scope.gridApi.cellNav.getFocusedCell();\n\n if ($scope.rowEdit && $scope.creating && cell.row.entity.editing) {\n return true;\n }\n if ($scope.rowEdit && cell.row.entity.editing) {\n return true;\n }\n if ($scope.rowEdit) {\n return false;\n }\n\n return true;\n }\n\n function saveState () {\n var map = $scope.activeKeyValueMap;\n var selection = $scope.gridApi.selection.getSelectedRows();\n var row = null;\n if ($scope.rowEdit && $scope.editingRow) {\n row = $scope.editingRow;\n }\n $scope.state = {map: map, row: row, selection: selection};\n }\n\n function restoreState () {\n if ($scope.activeKeyValueMap != $scope.state.map) {\n return;\n }\n\n $timeout(function () {\n if ($scope.state) {\n var row = $scope.state.row;\n var selection = $scope.state.selection;\n _.forEach(selection, function (row) {\n $scope.gridApi.selection.selectRow(_.find($scope.entries, {\n key: row.key\n }));\n });\n\n if (row) {\n var newCell = _.find($scope.entries, {\n key: row.key\n });\n newCell.editing = true;\n newCell.oldValue = row.oldValue;\n }\n }\n });\n }\n\n function activateInitialMap() {\n KeyValueMapRessource.getAllMapNames(function(keys) {\n $scope.keys = _.map(keys, function(k) {\n return { name : k };\n });\n if ($scope.keys) {\n var storedActiveMap = LocalStorage.getItem(KEY_VALUE_MAP);\n\n var existingActiveMap = _.find($scope.keys, {name: storedActiveMap});\n\n if (existingActiveMap) {\n $scope.selectKeyValueMap(existingActiveMap);\n } else {\n $scope.selectKeyValueMap($scope.keys[0]);\n }\n }\n });\n\n }\n\n // The 'infinite scroll' helper object\n // Simple set the 'resource' object, scope and data and gridApi variable, and call 'addToGridOptions' to enable 'infinite scrolling'\n $scope.scrollHelper = new InfiniteScrollHelper(QueryKeyValueMapRessource, $scope, entriesAccessor, 'gridApi', errorHandler);\n $scope.scrollHelper.addToGridOptions($scope.gridOptions);\n\n $scope.gridHeight = function () {\n var w = angular.element($window);\n if (w.width() < 992) {\n return;\n }\n var footer = angular.element('footer');\n var boxContent = angular.element('.box-content');\n var content = angular.element('#content');\n var boxContentPadding = parseInt(boxContent.css('padding-bottom'), 10);\n var contentPadding = parseInt(content.css('padding-bottom'), 10);\n var offset = angular.element(\"#key-value-maps-grid\").offset().top + footer.innerHeight() + boxContentPadding + contentPadding;\n var newHeight = w.height() - offset;\n\n $scope.gridApi.grid.gridHeight = newHeight;\n\n return {\n height: newHeight + \"px\"\n };\n };\n\n angular.element($window).bind('resize', function(){\n $scope.gridHeight();\n $scope.$digest();\n });\n\n $scope.selectKeyValueMap = function (key) {\n if (!key || !key.name) {\n return;\n }\n\n if($scope.rowEdit || $scope.creating) {\n var promise = $scope.checkUnsavedChanges();\n promise.then(function () {\n $scope.activeKeyValueMap = key.name;\n $scope.activeKey = key;\n $scope.keyValueMapsLoading = true;\n $scope.scrollHelper.reload(_.merge({\n map: key.name\n }, $scope.queryParams));\n\n $scope.creating = false;\n $scope.rowEdit = false;\n });\n } else {\n $scope.activeKeyValueMap = key.name;\n $scope.activeKey = key;\n $scope.keyValueMapsLoading = true;\n $scope.scrollHelper.reload(_.merge({\n map: key.name\n }, $scope.queryParams));\n }\n $scope.state = {};\n $scope.gridApi.selection.clearSelectedRows();\n LocalStorage.setItem(KEY_VALUE_MAP, $scope.activeKeyValueMap);\n };\n\n $scope.saveEntry = function (row) {\n KeyValueMapRessource.updateValue({\n map: $scope.activeKeyValueMap,\n key: row.key\n }, row.value ,function (result) {\n $scope.keyValueMapsLoading = true;\n $scope.scrollHelper.reload(_.merge({ map: $scope.activeKeyValueMap }, $scope.queryParams));\n growl.success('Updated Entry');\n row.editing = false;\n $scope.rowEdit = false;\n $scope.creating = false;\n }, function (response) {\n growl.error(\"Error updating Entry\");\n });\n };\n\n $scope.deleteEntry = function (row) {\n var map = $scope.activeKeyValueMap;\n var modalInstance = $modal.open({\n templateUrl: 'tpl/confirm-delete-key-value-modal.tpl.html',\n controller: 'ModalInstanceCtrl',\n backdrop: true,\n resolve: {\n data: function() {\n var data = [row];\n return data;\n }\n }\n });\n modalInstance.result.then(function() {\n KeyValueMapRessource.delete({\n map: map,\n key: row.key\n },function (result) {\n $scope.keyValueMapsLoading = true;\n $scope.scrollHelper.reload(_.merge({ map: $scope.activeKeyValueMap }, $scope.queryParams));\n growl.success('Deleted Entry from ' + map);\n }, function (response) {\n growl.error(\"Error deleting Entry\");\n });\n });\n };\n\n $scope.deleteSelectedEntries = function() {\n\n var selectedEntries = $scope.gridApi.selection.getSelectedRows();\n\n if (_.isEmpty($scope.entries) || _.isEmpty(selectedEntries)) {\n growl.warning(\"No Entries selected\");\n return false;\n }\n\n var map = $scope.activeKeyValueMap;\n var selection = _.map(selectedEntries, function(entry) {\n return entry.key;\n });\n\n var modalInstance = $modal.open({\n templateUrl: 'tpl/confirm-delete-key-value-modal.tpl.html',\n controller: 'ModalInstanceCtrl',\n backdrop: true,\n resolve: {\n data: function() {\n var data = selectedEntries;\n return data;\n }\n }\n });\n modalInstance.result.then(function() {\n KeyValueMapRessource.delete({\n map: map,\n keys: selection\n },function (result) {\n $scope.keyValueMapsLoading = true;\n $scope.scrollHelper.reload(_.merge({ map: $scope.activeKeyValueMap }, $scope.queryParams));\n growl.success('Deleted ' + selection.length + ' Entries from ' + map);\n }, function (response) {\n growl.error(\"Error deleting Entries\");\n });\n });\n };\n\n $scope.createEntry = function() {\n $scope.creating = true;\n $scope.entries.unshift({ key: '', value: '' });\n\n $timeout(function () {\n $scope.gridApi.cellNav.scrollToFocus($scope.entries[0],$scope.columnDefs[0]);\n });\n };\n\n $scope.cancel = function(row) {\n if (!$scope.creating) {\n row.value = row.oldValue;\n } else {\n $scope.entries = _.remove($scope.entries, function(entry) {\n return entry.$$hashKey != row.$$hashKey;\n });\n $scope.creating = false;\n }\n\n $scope.$emit(uiGridEditConstants.events.CANCEL_CELL_EDIT);\n };\n\n $scope.checkUnsavedChanges = function() {\n var deffered = $q.defer();\n var row = $scope.editingRow;\n if (!row && !$scope.creating) {\n return deffered.reject();\n }\n\n if ($scope.rowEdit && row.oldValue != row.value) {\n var confirmDialog = $dialogs.confirm('MODAL.CONFIRM_HEADER', 'MODAL.DISMISS_WITH_UNSAVED_CHANGES');\n confirmDialog.result.then(function() {\n deffered.resolve();\n }, function() {\n deffered.reject();\n });\n } else {\n deffered.reject();\n }\n return deffered.promise;\n };\n\n $scope.search = function(prefix) {\n $scope.queryParams.prefix = prefix;\n $scope.keyValueMapsLoading = true;\n $scope.scrollHelper.reload(_.merge({ map: $scope.activeKeyValueMap }, $scope.queryParams));\n };\n\n $scope.$on(uiGridEditConstants.events.END_CELL_EDIT, function(event) {\n var row = $scope.editingRow;\n if (!$scope.creating && row.value == row.oldValue) {\n $scope.cancel(row);\n }\n });\n\n $scope.$on(uiGridEditConstants.events.CANCEL_CELL_EDIT, function(event) {\n if (!$scope.creating) {\n var newRow = _.find($scope.entries, {key: $scope.editingRow.key});\n if (newRow) {\n newRow.editing = false;\n }\n $scope.rowEdit = false;\n }\n });\n\n $scope.$on('$locationChangeStart', function(event, next) {\n if($scope.rowEdit || $scope.creating) {\n event.preventDefault();\n var promise = $scope.checkUnsavedChanges();\n promise.then(function () {\n $scope.rowEdit = false;\n $scope.creating = false;\n var url = _.replace($location.absUrl(), $location.path(), \"\");\n url = _.replace(next, url, \"\");\n $location.url(url);\n });\n }\n });\n\n $rootScope.$on(\"infiniteScrollLoadMore\",function() {\n $scope.keyValueMapsLoading = true;\n saveState();\n });\n\n $rootScope.$on(\"infiniteScrollDataLoaded\",function() {\n restoreState();\n });\n\n (function init() {\n activateInitialMap();\n })();\n }\n );\n","angular.module('llax')\n .controller('LayoutTemplateLibraryCtrl',\n function($rootScope, $scope, $translate, $modalInstance, growl, ContactsResource, CommunicationChannelResource,\n DeleteItemsResource, layoutBlockTemplates) {\n\n $scope.layoutBlockTemplates = layoutBlockTemplates;\n $scope.language = $rootScope.language;\n $scope.selected = {};\n\n $scope.addBlock = function() {\n $modalInstance.close($scope.selected);\n };\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.select = function(template) {\n $scope.selected = template;\n };\n\n });\n","angular.module('llax')\n .controller('ManageDataModelsController',\n function($rootScope, $scope, $modalInstance, $translate, $dialogs, growl, DataModelTemplateResource, OrganizationService, ChannelService) {\n\n var organizationData = OrganizationService.getOrganizationSnapshot();\n\n $scope.tableColumns = [];\n $scope.uploadDatamodel = true;\n\n function loadDataModels() {\n $scope.datamodels = DataModelTemplateResource.getOwnTemplates();\n }\n loadDataModels();\n\n function loadTableColumns() {\n var tableColumns = [];\n tableColumns.push({\n label: $translate.instant('ACTIVATEABLE'),\n name: 'activateable'\n });\n tableColumns.push({\n label: $translate.instant('PUBLIC'),\n name: 'publicTemplate'\n });\n if (organizationData.communityManager) {\n tableColumns.push({\n label: $translate.instant('COMMUNITY'),\n name: 'communityTemplate'\n });\n }\n tableColumns.push({\n label: $translate.instant('DATAMODEL_FOR_INVITEES'),\n name: 'datamodelForInvitees'\n }, {\n label: $translate.instant('NAME'),\n name: 'name'\n }, {\n label: $translate.instant('VERSION'),\n name: 'version'\n }, {\n name: 'updatedAt',\n label: $translate.instant('UPDATED_AT'),\n cellFilter: \"date:'medium'\"\n });\n $scope.tableColumns = tableColumns;\n }\n\n function createTableDefinition() {\n var tableColumns = $scope.tableColumns;\n var length = tableColumns.length;\n var columnDefs = [];\n for (var i = 0; i < length; i++) {\n var attr = tableColumns[i];\n var col;\n if ( attr.name == 'communityTemplate' || attr.name == 'datamodelForInvitees') {\n col = {\n field: attr.name,\n displayName: attr.label,\n headerTooltip: true,\n cellTooltip: true,\n enableCellEdit: false,\n width: '10%',\n cellTemplate: '
    ' +\n '' +\n '
    '\n };\n } else if (attr.name == 'publicTemplate'){\n col = {\n field: attr.name,\n displayName: attr.label,\n headerTooltip: true,\n cellTooltip: true,\n enableCellEdit: false,\n width: '10%',\n cellTemplate: '
    ' +\n '' +\n '
    '\n };\n } else if (attr.name == 'activateable'){\n col = {\n field: attr.name,\n displayName: attr.label,\n headerTooltip: true,\n cellTooltip: true,\n enableCellEdit: false,\n width: '10%',\n cellTemplate: '
    ' +\n '' +\n '
    '\n };\n } else if (attr.name == 'name') {\n col = {\n field: attr.name,\n displayName: attr.label,\n headerTooltip: true,\n cellTooltip: true,\n enableCellEdit: false,\n cellTemplate: '
    ' +\n 'Demo Model' +\n '{{COL_FIELD}}' +\n '
    '\n };\n } else {\n col = {\n field: attr.name,\n displayName: attr.label,\n headerTooltip: true,\n cellTooltip: true,\n enableCellEdit: false\n };\n if (attr.cellFilter) {\n col.cellFilter = attr.cellFilter;\n }\n }\n columnDefs[i] = col;\n }\n\n columnDefs.push({\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n field: 'actions',\n width: 76,\n cellTemplate: '
    ' +\n '' +\n '
    '\n });\n\n $scope.getLabel = function(row) {\n var label = \"\";\n if (!_.isEmpty(row.labels)) {\n var langKey = localStorage.getItem(\"languageKey\");\n label = row.labels[langKey] || row.labels[''] || row.name;\n label = label + ' - ';\n }\n return label;\n };\n\n $scope.columnDefs = columnDefs;\n $scope.datamodelsGridOptions = {\n data: 'datamodels',\n columnDefs: $scope.columnDefs,\n enableColumnMenus: false\n };\n }\n\n loadTableColumns();\n createTableDefinition();\n\n $scope.updateDatamodel = function(datamodel) {\n DataModelTemplateResource.save(datamodel, function() {\n growl.success(\"DATA_MODEL.UPDATED_SUCCESSFULLY_MESSAGE\");\n loadDataModels();\n },\n function(err) {\n growl.error(\"DATA_MODEL.UPDATE_ERROR_MESSAGE\");\n });\n console.log(datamodel);\n };\n\n $scope.close = function() {\n $modalInstance.close();\n };\n\n $scope.uploadFile = function() {\n return {\n url: lax_rest_url('assets?public=true'),\n reset: true,\n uploadComplete: function(response) {\n var template = response.map(function(asset) {\n var result = {};\n result.url = asset.url;\n result.gathering = asset.gatheringKey;\n result.path = asset.path;\n result.name = asset.path.substr(1); //remove trailing /\n return result;\n })[0];\n DataModelTemplateResource.save(template, function() {\n loadDataModels();\n });\n growl.success(\"UPLOAD_SUCCESS_MESSAGE\");\n }\n };\n };\n\n $scope.deleteDatamodel = function(datamodel) {\n var message = $translate.instant('DATAMODEL.DELETE');\n var confirmDialog = $dialogs.confirm('', message);\n confirmDialog.result.then(function() {\n DataModelTemplateResource.remove({\n id: datamodel.id\n }, function() {\n loadDataModels();\n });\n });\n };\n\n $scope.$on('laxGridStopCellEdit', function (event, row, col) {\n $scope.updateDatamodel(row.entity);\n });\n\n $scope.$on('channelMessageReceived', function(event, eventData) {\n if (eventData.event === ChannelService.DATA_MODEL_ACTIVATEABLE_EVENT) {\n growl.success(\"DATA_MODEL_TEMPLATE_ACTIVATED_SUCCESS\", {\n variables: { templatename: eventData.data.name },\n ttl: 3000\n });\n\n loadDataModels();\n } else if (eventData.event === ChannelService.DATA_MODEL_TEMPLATE_INVALID_EVENT) {\n growl.error(\"DATA_MODEL_TEMPLATE_ACTIVATED_FAILURE\" , {\n variables: { templatename: eventData.data.name, errorMessage: eventData.data.error}\n });\n\n loadDataModels();\n }\n });\n }\n );\n","angular.module('llax')\n .controller('MassUpdateController',\n function($log, $rootScope, $scope, $modalInstance, $filter, $timeout, $q, $routeParams, growl, data, AssetFoldersService,\n Auth, GroupAttributeService, MassUpdateResource, SelectionResource, ReferenceAttributesService) {\n\n $scope.treeFilter = $filter('uiTreeFilter');\n $scope.supportedFields = ['name', 'label'];\n\n $scope.isAttributesLoading = true;\n $scope.temporaryModelForTypeahead = {};\n $scope.formattedSingleReferences = {};\n $scope.allCategories = [];\n $scope.attributeStates = {};\n $scope.isItemEditable = true;\n $scope.disableDeleteConfirmation = true;\n GroupAttributeService.initializeScope($scope);\n\n _.forEach($rootScope.dataModel.allCategories(), function(category) {\n if (Auth.hasAnyPermission(Auth.OBJECT_TYPE_ITEMS, 'edit', {category__: category.name})) {\n $scope.allCategories.push(category);\n }\n });\n\n $scope.onBeforeStepChange = function(event) {\n if (event.toStepId === 2 && $scope.selectedAttributesList.length < 1) {\n growl.warning('MASS_UPDATE_EDITOR.NO_ATTRIBUTES_SELECTED');\n return false;\n }\n return true;\n };\n\n $scope.onAfterStepChange = function(event) {\n if (event.toStepId === 2) {\n angular.forEach($scope.data.selectedItems, function(primaryKey) {\n $scope.selectedItems[primaryKey] = true;\n });\n var itemToSave = $rootScope.cleanupItem($scope.item);\n itemToSave = $rootScope.stringifyDeepValues(itemToSave);\n\n var itemData = {};\n _.forEach($scope.attributesEditedMap, function(value, key) {\n if (value) {\n if (isDimensional(key)) {\n _.forEach(value, function(d_v, d_k) {\n if (value[d_k]) {\n if (!itemData[key]) {\n itemData[key] = {};\n }\n if (_.hasIn(itemToSave, [key, d_k])) {\n itemData[key][d_k] = itemToSave[key][d_k];\n } else {\n itemData[key][d_k] = null;\n }\n }\n });\n } else {\n itemData[key] = itemToSave[key] || null;\n }\n }\n });\n\n if ($scope.data.selection.primaryKeys) {\n $scope.data.selection.primaryKeys = _.filter($scope.data.selection.primaryKeys, function(primaryKey) {\n return $scope.selectedItems[primaryKey];\n });\n }\n\n SelectionResource.save($scope.data.selection, function(response) {\n $scope.massUpdateOptions = {\n selectionId: response.selectionId,\n itemData: itemData\n };\n if (response.numberOfItems > 0) {\n $scope.numberOfItems = response.numberOfItems;\n $scope.estimatedNumberOfItems = null;\n } else if (response.numberOfItems < 0) {\n $scope.numberOfItems = null;\n $scope.estimatedNumberOfItems = -response.numberOfItems;\n } else {\n $scope.numberOfItems = null;\n $scope.estimatedNumberOfItems = null;\n }\n });\n }\n return true;\n };\n\n $scope.runMassUpdate = function() {\n\n MassUpdateResource.save($scope.massUpdateOptions, function(response) {\n growl.success('MASS_UPDATE_EDITOR.RUN.SUCCESS_MESSAGE');\n $modalInstance.close();\n }, function(response) {\n growl.error('MASS_UPDATE_EDITOR.RUN.FAILED_MESSAGE');\n });\n };\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n function getFilteredAttributesDeferred() {\n var deferred = $q.defer();\n var filteredAttributes;\n var allAttributes = $scope.dataModel.filteredLayoutAttributes('mass_update', $scope.item);\n if (!_.isNil($routeParams.category)) {\n var attrs = $rootScope.dataModel.categoryAttributes($routeParams.category);\n allAttributes = _.intersectionBy(allAttributes, attrs, 'name');\n }\n $rootScope.prepareAttributes(allAttributes);\n var categoryAttribute = $scope.dataModel.attribute('category__');\n categoryAttribute.params = {customRenderer: 'attribute_category.html'};\n\n if (allAttributes.length > 0) {\n filteredAttributes = _.chain(allAttributes)\n .uniq()\n .filter(function(attribute) {\n return !$scope.dataModel.potentialPrimaryKeyPart(attribute.name) &&\n !$scope.dataModel.isMetaAttribute(attribute.name);\n })\n .push(categoryAttribute)\n .forEach(function(attribute) {\n $rootScope.setInputRenderer(attribute);\n attribute.label = $scope.translateAttribute(attribute);\n attribute.description = $rootScope.translateAttributeDescription(attribute);\n\n if (attribute.params && attribute.params.values) {\n angular.forEach(attribute.params.values, function(value) {\n value.translatedValue = $rootScope.translateOption(value, attribute);\n });\n }\n }).value();\n deferred.resolve(filteredAttributes);\n }\n return deferred.promise;\n }\n\n $scope.$watch('item', function(newValue, oldValue) {\n var key = Object.keys(newValue).forEach(function(key) {\n if (newValue[key] != oldValue[key]) {\n if (isDimensional(key)) {\n _.forEach(newValue[key], function(d_v, d_k) {\n if (newValue[key][d_k]) {\n if (!$scope.attributesEditedMap[key]) {\n $scope.attributesEditedMap[key] = {};\n }\n $scope.attributesEditedMap[key][d_k] = true;\n }\n });\n } else {\n $scope.attributesEditedMap[key] = true;\n }\n }\n });\n }, true);\n\n (function init() {\n $scope.data = data;\n $scope.item = {};\n $scope.selectedAttributesList = [];\n $scope.selectedItems = {};\n $scope.attributesEditedMap = {};\n $timeout(function() {\n getFilteredAttributesDeferred().then(function(attributes) {\n $scope.attributeList = attributes;\n if ($scope.selectedAttributesList.length > 0) {\n $scope.attributeList = $scope.attributeList.filter(function(at) {\n return $scope.selectedAttributesList.indexOf(at) < 0;\n });\n }\n $scope.isAttributesLoading = false;\n });\n }, 0);\n })();\n\n $scope.addToReferenceList = function(childItem, a, label, model) {\n var reference = $scope.item[a.name];\n\n reference.push(childItem);\n $scope.gridOptionsMap[a.name].data = $scope.item[a.name];\n\n gridResizeHeight($scope.item[a.name], $scope.gridOptionsMap[a.name], $scope.gridApiMap[a.name].grid);\n\n //add found element to $scope.item\n if (reference.length < 10) {\n $scope.gridOptionsMap[a.name].minRowsToShow++;\n }\n\n //clear input field, when item is added\n delete $scope.temporaryModelForTypeahead[a.name];\n\n };\n\n $scope.addSingleReference = function(referencedItem, a, label, model) {\n ReferenceAttributesService.loadAndFormatItemAsync(referencedItem.primaryKey__, null, a)\n .then(function(result) {\n $timeout(function() {\n ReferenceAttributesService.checkModelAndEval(model, a, referencedItem, $scope);\n // \"Hack\" to bind a descriptive String including all filter elements to the item\n $scope.temporaryModelForTypeahead[a.name] = result;\n }, 0);\n });\n };\n\n $scope.findItems = function(keywordQuery , attribute) {\n return ReferenceAttributesService.loadAndFormatItemsToBeReferencedAsync(keywordQuery, null, attribute);\n };\n\n $scope.loadAndFormatSingleReferences = function(item, attribute) {\n ReferenceAttributesService.loadAndFormatItemAsync(item[attribute.name], item, attribute)\n .then(function(result) {\n $scope.formattedSingleReferences[attribute.name] = result;\n });\n };\n\n $scope.queryAdditionalCategories = function(query, attribute, leaf, limit) {\n var dataModel = _.get(attribute.params, 'additionalModule');\n var extension = _.get(attribute.params, 'extension');\n leaf = leaf || null;\n var result = $rootScope.queryCategories(query, dataModel, extension, leaf, limit);\n return result;\n };\n\n $scope.gridOptionsMap = {};\n $scope.gridApiMap = {};\n $scope.showGrid = {};\n\n $scope.initGridOptions = function(attributeDefinition, item, name, model, config) {\n if(!item[name]) {\n item[name] = [];\n }\n var data = item[name];\n\n var memberAttributes = $rootScope.dataModel.getMemberAttributes(attributeDefinition, true);\n var options = $rootScope.getOptions($scope, attributeDefinition, memberAttributes, data, config);\n\n if (data && data.length > 0) {\n if (data.length >= 10) {\n options.minRowsToShow = 10;\n } else {\n options.minRowsToShow = data.length + 1;\n }\n } else {\n options.minRowsToShow = (attributeDefinition.defaultValue) ? attributeDefinition.defaultValue.length : 1;\n }\n\n options.onRegisterApi = function(gridApi) {\n if (gridApi.cellNav) {\n gridApi.cellNav.on.viewPortKeyDown($scope, function($event, rowCol) {\n if ($event.keyCode === 32) {\n $event.preventDefault();\n }\n });\n }\n $scope.gridApiMap[name] = gridApi;\n };\n\n $scope.gridOptionsMap[name] = options;\n\n $timeout(function() {\n $scope.showGrid[name] = true;\n }, 100);\n\n return true;\n };\n\n function gridResizeHeight(newData, options, grid) {\n\n // Initialize scrollbars (TODO: move to controller??)\n // uiGridCtrl.scrollbars = [];\n if (!_.isEmpty(newData)) {\n if (newData.length >= 10) {\n options.minRowsToShow = 10;\n } else {\n options.minRowsToShow = newData.length;\n }\n } else {\n options.minRowsToShow = 0;\n }\n\n // Figure out the new height\n var contentHeight = options.minRowsToShow * options.rowHeight + (options.rowHeight * 0.5);\n var headerHeight = grid.options.hideHeader ? 0 : options.headerRowHeight;\n var footerHeight = grid.options.showFooter ? options.footerRowHeight : 0;\n var scrollbarHeight = grid.options.enableScrollbars ? gridUtil.getScrollbarWidth() : 0;\n\n // Calculates the maximum number of filters in the columns\n var maxNumberOfFilters = 0;\n angular.forEach(grid.options.columnDefs, function (col) {\n if (col.hasOwnProperty('filter')) {\n if (maxNumberOfFilters < 1) {\n maxNumberOfFilters = 1;\n }\n } else if (col.hasOwnProperty('filters')) {\n if (maxNumberOfFilters < col.filters.length) {\n maxNumberOfFilters = col.filters.length;\n }\n }\n });\n\n var filterHeight = maxNumberOfFilters * headerHeight;\n var newHeight = headerHeight + contentHeight + footerHeight + scrollbarHeight + filterHeight;\n var cssClass = \".grid\" + grid.id;\n var myElement = angular.element( document.querySelector(cssClass));\n myElement.css('height', newHeight + 'px');\n\n grid.gridHeight = $scope.gridHeight = newHeight;\n\n // Run initial canvas refresh\n grid.refreshCanvas();\n\n }\n\n $scope.getGridData = function(model, attribute) {\n return $scope.gridOptionsMap[attribute.name];\n };\n\n $scope.getShowGrid = function(model, attribute) {\n return $scope.showGrid[attribute.name];\n };\n\n $scope.addElementToTableModel = function(attributeDefinition, model) {\n if (!_.isArray($scope.item[attributeDefinition.name])) {\n $scope.item[attributeDefinition.name] = [];\n }\n var rows = $scope.item[attributeDefinition.name];\n rows.push({});\n if (rows.length < 10) {\n $scope.gridOptionsMap[attributeDefinition.name].minRowsToShow++;\n }\n\n $scope.gridApiMap[attributeDefinition.name].grid.options.data = $scope.item[attributeDefinition.name];\n\n gridResizeHeight($scope.item[attributeDefinition.name], $scope.gridOptionsMap[attributeDefinition.name], $scope.gridApiMap[attributeDefinition.name].grid);\n\n $timeout(function() {\n var gridApi = $scope.gridApiMap[attributeDefinition.name];\n if (!gridApi) {\n return;\n }\n var lastElement = rows[rows.length - 1];\n if (gridApi.cellNav) {\n gridApi.cellNav.scrollToFocus(lastElement, $scope.gridOptionsMap[attributeDefinition.name].columnDefs[0]);\n } else {\n gridApi.core.scrollTo(lastElement, $scope.gridOptionsMap[attributeDefinition.name].columnDefs[0]);\n }\n }, 0);\n };\n\n $scope.removeRow = function(row, attributeName) {\n var rows = $scope.item[attributeName];\n if (rows.length > 0 && rows.length <= 10) {\n $scope.gridOptionsMap[attributeName].minRowsToShow--;\n }\n _.remove(rows, row.entity);\n };\n\n $scope.uploadFileForItem = function(attributeName, sectionName, type) {\n var config = {};\n switch (type) {\n case \"Image\":\n config = {\n autoUpload: true,\n filters: ['imageFilter'],\n accept: 'image/jpeg,image/gif,image/png'\n };\n var maxFileSize = $scope.dataModel.sectionAttributeParam($scope.currentLayout, sectionName, attributeName,\n 'maxFileSize');\n if (maxFileSize) {\n config.filters.push('maxFileSizeFilter');\n config.maxFileSize = maxFileSize;\n }\n break;\n case \"Document\":\n config = {\n autoUpload: true\n };\n break;\n }\n\n var attribute = $scope.dataModel.attribute(attributeName);\n var publicAsset = !(attribute && attribute.params.confidential === true);\n\n var uploadUrl = AssetFoldersService.getDefaultUploadUrl();\n return angular.extend({\n url: uploadUrl,\n reset: true,\n formData: [],\n noNameEncoding: true,\n useFilename: true,\n uploadComplete: function(response) {\n if (publicAsset) {\n AssetFoldersService.getPublicAssetUrlAsync(response, response.path)\n .then(function(linkedPublicAsset) {\n $scope.item[attributeName] = linkedPublicAsset.publicAssetUrl;\n }, function(error) {\n $log.error(error);\n });\n } else {\n $scope.item[attributeName] = response.privateAssetUrl;\n }\n },\n onErrorItem: function(item, response, status, headers) {\n $log.error(response);\n\n if (!_.isNil(response.errorCode)) {\n growl.error(response.message, { variables : { name: item.file.name } });\n } else {\n growl.error(\"ASSET_FOLDER.ERROR_OCCURRED\");\n }\n },\n onFileSelected: function(linkedAsset, linkedAssetPath, done) {\n if (publicAsset) {\n AssetFoldersService.getPublicAssetUrlAsync(linkedAsset, linkedAssetPath)\n .then(function(linkedPublicAsset) {\n done(linkedPublicAsset);\n }, function(error) {\n $log.error(error);\n });\n } else {\n done(linkedAsset);\n }\n }\n }, config);\n };\n\n $scope.hasAttributeState = function(attribute, stateName) {\n if (_.isEmpty($scope.attributeStates)) {\n return false;\n }\n var states = $scope.attributeStates[(_.isObject(attribute) ? attribute.name : attribute)];\n return !_.isEmpty(states) && _.includes(states, stateName);\n };\n\n $scope.isAttributeReadonly = function(attribute) {\n\n // Item is not editable\n if (!$scope.isItemEditable) {\n return true;\n }\n\n // Attribute was set to 'readonly'\n if (_.isObject(attribute) && attribute.readonly) {\n return true;\n }\n\n // Attribute was added to list of readonly attributes (legacy function, rather use 'states' by now!)\n if (!_.isEmpty($scope.item.readonlyAttributes__) &&\n _.includes($scope.item.readonlyAttributes__, (_.isObject(attribute) ? attribute.name : attribute))) {\n return true;\n }\n\n // Attribute state 'readonly' is set\n return $scope.hasAttributeState(attribute, 'readonly');\n };\n\n $scope.isAttributeHidden = function(attribute) {\n if (!$scope.isAttributeVisible(attribute)) {\n return true;\n }\n return $scope.hasAttributeState(attribute, 'hidden');\n };\n\n // TODO Dummy function to ignore loading of further attributes\n $scope.updateAdditionalCategoryAttributes = function() {};\n\n function isDimensional(attrName) {\n var a = $rootScope.dataModel.attribute(attrName);\n return a.typeName == 'Dimensional';\n }\n\n }\n );\n","angular.module('llax')\n .controller('MessagingController',\n function($rootScope, $scope, $http, $log, $translate, $timeout, ChannelService, CountMessageResource, HttpHeader, MessagingResource, QueryMessageResource, uiGridConstants) {\n\n $scope.messagingStatus = ['DEFERRED', 'PENDING', 'BLOCKED', 'SENDING', 'DELIVERED', 'SUCCESS', 'EXCEPTION', 'WARNING', 'FATAL',\n 'RECEIVED', 'IMPORTING', 'IMPORTED', 'PENDING_PROCESSING', 'PROCESSING', 'PROCESSED' ,'ERROR'];\n\n $scope.createColumnDefs = function(channelId) {\n return [{\n field: 'direction',\n displayName: $translate.instant('MESSAGING.DIRECTION'),\n width: '*',\n headerCellClass: 'text-center',\n filter: {\n type: uiGridConstants.filter.SELECT,\n selectOptions: [ { value: 'INBOUND', label: 'INBOUND' }, { value: 'OUTBOUND', label: 'OUTBOUND' } ]\n }\n }, {\n field: 'createdAt',\n displayName: $translate.instant('MESSAGING.CREATED_AT'),\n headerTooltip: true,\n cellFilter: \"date:'medium'\",\n headerCellClass: 'text-center',\n filterHeaderTemplate: '
    ' +\n '
    '+\n '' +\n '' +\n ' ' +\n '
    '+\n '
    '+\n '' +\n '' +\n ' ' +\n '
    ' +\n '
    ',\n width: '*'\n }, {\n field: 'changedAt',\n displayName: $translate.instant('MESSAGING.CHANGED_AT'),\n headerTooltip: true,\n cellTooltip: true,\n cellFilter: \"date:'medium'\",\n width: '*',\n headerCellClass: 'text-center',\n enableFiltering: false\n }, {\n field: 'contentType',\n displayName: $translate.instant('MESSAGING.CONTENT_TYPE'),\n headerTooltip: true,\n cellTooltip: true,\n width: '*',\n headerCellClass: 'text-center',\n enableFiltering: false\n }, {\n field: 'path',\n displayName: $translate.instant('MESSAGING.PATH'),\n headerTooltip: true,\n cellTooltip: true,\n width: '*',\n headerCellClass: 'text-center',\n enableFiltering: false\n }, {\n field: 'status',\n displayName: $translate.instant('STATUS'),\n headerTooltip: true,\n width: '*',\n headerCellClass: 'text-center',\n filter: {\n type: uiGridConstants.filter.SELECT,\n selectOptions: _.map($scope.messagingStatus, function(val) {\n return { value: val, label: val };\n })\n },\n cellTemplate: '
    ' +\n '{{grid.appScope.translateStatus(row.entity.status)}}' +\n '
    '\n }, {\n field: 'actions',\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n width: '*',\n headerCellClass: 'text-center',\n cellClass: 'text-right',\n enableColumnMenu: false,\n enableColumnResizing: false,\n enableFiltering: false,\n enableHiding: false,\n enableSorting: false,\n pinnedRight: true,\n resizable: false,\n cellTemplate: '' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    '\n }];\n };\n\n $scope.createChannelMessagesGridOptions = function (channelId) {\n return {\n data: 'channels['+channelId+'].messages',\n enableColumnMenus: false,\n enableColumnMoving : true,\n enableColumnResize: true,\n enableFiltering: true,\n enableGridMenu: true,\n enableRowSelection: false,\n infiniteScrollDown: true,\n useExternalFiltering: true,\n rowHeight: 34,\n columnDefs: $scope.createColumnDefs(channelId),\n onRegisterApi: function(gridApi) {\n $scope.gridApi = gridApi;\n gridApi.infiniteScroll.on.needLoadMoreData($scope, function(){\n $scope.loadMoreMessages(channelId);\n });\n $timeout(function() {\n $scope.gridApi.core.handleWindowResize();\n });\n gridApi.core.on.filterChanged($scope, function() {\n var grid = this.grid;\n var channel = grid.appScope.channels[channelId];\n if (channel) {\n var params = $scope.additionalQueryParams[channel.id];\n var filterColumns = _.filter(grid.columns, function(col) {\n return !_.isEmpty(col.filter);\n });\n _.forEach(filterColumns, function(fCol) {\n if (fCol.filter.term) {\n params[fCol.field] = fCol.filter.term;\n } else {\n delete params[fCol.field];\n }\n });\n $scope.reloadMessages(channel, true);\n }\n }\n );\n }\n };\n };\n\n $scope.channelMessagesGridOptionsMap = {};\n $scope.getChannelMessagesGridOptions = function(id) {\n $scope.channelMessagesGridOptionsMap[id] = angular.copy($scope.createChannelMessagesGridOptions(id));\n };\n\n $scope.customFilterChanges = function(channelId, filter) {\n var channel = $scope.gridApi.grid.appScope.channels[channelId];\n var params = $scope.additionalQueryParams[channel.id];\n if (filter.createdBefore && angular.isDate(filter.createdBefore)) {\n params.createdBefore = filter.createdBefore;\n } else {\n delete params.createdBefore;\n }\n if (filter.createdAfter && angular.isDate(filter.createdAfter)) {\n params.createdAfter = filter.createdAfter;\n } else {\n delete params.createdAfter;\n }\n $scope.reloadMessages(channel, true);\n };\n\n $scope.translateStatus = function(status) {\n status = $rootScope.translateValue('MESSAGING.STATUS.', status);\n return status;\n };\n\n $scope.gridOptionsMap = {};\n\n ChannelService.register(ChannelService.MESSAGING_ASSET_CHANGED_EVENT);\n\n $scope.$on('$destroy', function() {\n ChannelService.unregister(ChannelService.MESSAGING_ASSET_CHANGED_EVENT);\n });\n\n $scope.$on('channelMessageReceived', function(event, eventData) {\n if (eventData.event === ChannelService.MESSAGING_ASSET_CHANGED_EVENT) {\n $log.debug(\"Messaging Asset Changed\", eventData.data.typeOfChange, eventData.data.messagingAsset);\n\n var messagingAsset = eventData.data.messagingAsset;\n var channelId = messagingAsset.channelId;\n var channel = $scope.channels[channelId];\n if (!channel) {\n $log.debug(\"Unknown channel:\", channelId);\n return;\n }\n if (!channel.showDetails.messages) {\n $log.debug(\"Messages not shown for channel:\", channelId);\n return;\n }\n if (eventData.data.typeOfChange == 'uploaded') {\n // FIXME: Add uploaded message\n $scope.reloadMessages(channel, false);\n } else {\n // FIXME: Find message and update it\n $scope.reloadMessages(channel, false);\n }\n\n }\n });\n\n function scopeVarForCreatorData(creatorId, creatorType) {\n return 'messages_' + creatorId + '_' + creatorType;\n }\n\n $scope.getGridOptions = function(creatorId, creatorType) {\n var scopeVariable = scopeVarForCreatorData(creatorId, creatorType);\n $scope[scopeVariable] = [];\n\n var gridOptions = {\n data: $scope[scopeVariable],\n // FIXME: Actually create the columnDefs instead using the \"default\" which tries to determine them by the data!\n // columnDefs: $scope.columnDefs,\n enableColumnMenus: false,\n enableColumnMoving : true,\n enableColumnResize: true,\n enableGridMenu: true,\n enableRowSelection: false,\n rowHeight: 34\n };\n $scope.gridOptionsMap[creatorId] = gridOptions;\n };\n\n $scope.loadMessagesForCreator = function(creatorId, creatorType, channel) {\n var scopeVariable = scopeVarForCreatorData(creatorId, creatorType);\n MessagingResource.query({\n creatorId: creatorId,\n creatorType: creatorType,\n channelId: channel.id\n }, {},\n function(messagingAssets) {\n // FIXME: As long as we do not have proper grid columns, we want to at least see dates as actual dates!\n _.forEach(messagingAssets, function(messagingAsset) {\n messagingAsset.createdAt = new Date(messagingAsset.createdAt).toISOString();\n messagingAsset.changedAt = new Date(messagingAsset.changedAt).toISOString();\n });\n angular.extend($scope[scopeVariable], messagingAssets);\n },\n function(response) {\n $scope.status = response.status;\n });\n };\n\n $scope.countMessages = function(channel) {\n var queryParams = {\n channelId: channel.id,\n };\n\n if (!_.isEmpty($scope.additionalQueryParams[channel.id])) {\n angular.extend(queryParams, $scope.additionalQueryParams[channel.id]);\n }\n\n if (!channel.countingInProgress) {\n channel.countingInProgress = true;\n channel.countErrorMessage = null;\n\n CountMessageResource.get(queryParams, {},\n function (response) {\n channel.countMessage = $rootScope.translate(\"MESSAGING.COUNT\", \"Number of messages: {{response.numberOfMessages}}\", {'messageCount':response.numberOfMessages});\n channel.countErrorMessage = null;\n channel.needsCount = false;\n channel.countingInProgress = false;\n },\n function (response) {\n channel.countErrorMessage = $rootScope.getErrorMessage(response);\n channel.needsCount = false;\n channel.countingInProgress = false;\n }\n );\n }\n };\n\n function fetchCallback(channel, doCount, alsoInAccurateValue) {\n var cnt = channel.messages.length;\n\n if (channel.cursor == null) {\n channel.countMessage = $rootScope.translate(\"MESSAGING.COUNT\", \"Number of messages: {{response.numberOfMessages}}\", {'messageCount':cnt});\n channel.needsCount = false;\n } else {\n if (alsoInAccurateValue) {\n channel.countMessage = $rootScope.translate(\"MESSAGING.COUNT_GREATER\", \"Number of messages: >= {{response.numberOfMessages}}\", {'messageCount':cnt});\n }\n channel.needsCount = true;\n }\n\n channel.countErrorMessage = null;\n\n if (doCount && channel.needsCount) {\n $scope.countMessages(channel);\n }\n }\n\n $scope.reloadMessages = function(channel, doCount) {\n if (!channel.loadingMessages) {\n channel.cursor = null;\n channel.loadingMessages = true;\n config = {append:false};\n $scope.fetchMessagesForChannel(channel, config, function() {\n fetchCallback(channel, doCount, false);\n });\n }\n };\n\n $scope.loadMoreMessages = function(channelId, config, channel) {\n channel = channel || $scope.gridApi.grid.appScope.channels[channelId];\n if (!channel.loadingMessages && !channel.searchComplete) {\n channel.loadingMessages = true;\n config = config || {append:true};\n doCount = (channel.cursor == null);\n\n $scope.fetchMessagesForChannel(channel, config, function() {\n fetchCallback(channel, doCount, true);\n });\n }\n };\n\n $scope.fetchMessagesForChannel = function(channel, config, callback) {\n var queryParams = {\n channelId: channel.id,\n limit: 20\n };\n\n if (!_.isEmpty($scope.additionalQueryParams[channel.id])) {\n angular.extend(queryParams, $scope.additionalQueryParams[channel.id]);\n }\n\n QueryMessageResource.createCursorAwareResource(channel.cursor).query(queryParams,\n function(messagingResponse, headers) {\n var cursor = headers(HttpHeader.MESSAGE_CURSOR);\n\n channel.cursor = cursor;\n\n if (messagingResponse.length === 0) {\n channel.searchComplete = true;\n } else {\n channel.searchComplete = false;\n }\n _.forEach(messagingResponse, function(message) {\n message.translatedStatus = $rootScope.translateValue('MESSAGING.STATUS.', message.status);\n message.translatedCreatorType = $rootScope.translateValue('MESSAGING.CREATOR_TYPE.', message.creatorType);\n });\n if (config.append) {\n channel.messages = channel.messages.concat(messagingResponse);\n } else {\n channel.messages = messagingResponse;\n }\n if ($scope.gridApi) {\n $scope.gridApi.infiniteScroll.dataLoaded(false, true);\n }\n channel.loadingMessages = false;\n\n if (callback) {\n callback();\n }\n }, function(response) {\n if ($scope.gridApi) {\n $scope.gridApi.infiniteScroll.dataLoaded(false, true);\n }\n $scope.status = response.status;\n channel.loadingMessages = false;\n }\n );\n };\n\n $scope.downloadMessage = function(messagingAssetId) {\n return lax_rest_url('messaging/messagingassets/') + messagingAssetId + '?download=true';\n };\n\n $scope.additionalQueryParams = {};\n\n $scope.toggleShowMessages = function(channel) {\n channel.cursor = null;\n $scope.additionalQueryParams[channel.id] = {};\n channel.showDetails.messages = !channel.showDetails.messages;\n if (channel.showDetails.messages) {\n $scope.loadMoreMessages(channel.id, { append: false }, channel);\n }\n };\n\n }\n );\n","angular.module('llax')\n .controller('ModalInstanceCtrl',\n function($rootScope, $scope, $translate, $modalInstance, growl, ContactsResource, CommunicationChannelResource,\n DeleteItemsResource, data) {\n\n $scope.data = data;\n $scope.isSelected = false;\n\n $scope.ok = function() {\n $modalInstance.close();\n };\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.confirmDeleteItem = function() {\n function renderMessage(data) {\n if (!data.selectionId) {\n return;\n }\n if (data.primaryKeys && data.primaryKeys.length == 1) {\n growl.success('ITEM_DELETED');\n } else {\n growl.success('ITEMS_DELETED');\n }\n }\n var data = {\n \"selectionId\": $scope.data.selectionId\n };\n DeleteItemsResource.pass({}, data,\n function() {\n $scope.ok();\n renderMessage($scope.data);\n });\n };\n\n $scope.confirmDeleteContact = function(organizationId) {\n $rootScope.$broadcast('deleteContact', organizationId);\n $scope.ok();\n };\n\n $scope.confirmDeleteAttributeValue = function() {\n $modalInstance.close(true);\n };\n\n $scope.confirmDeactivateChannel = function(channel) {\n $rootScope.$broadcast('deactivateChannel', channel);\n $scope.ok();\n };\n\n $scope.confirmDeleteChannel = function(channel) {\n $rootScope.$broadcast('deleteChannel', channel);\n $scope.ok();\n };\n\n $scope.confirmDeleteTaskList = function(taskList) {\n $rootScope.$broadcast('deleteTaskList', taskList);\n $scope.ok();\n };\n\n $scope.confirmDeleteKeyValue = function() {\n $modalInstance.close(true);\n };\n\n });\n","angular.module('llax')\n .controller('NavigationController',\n function($dialogs, $location, $log, $rootScope, $route, $scope, $translate, $timeout, $window, growl,\n Auth, BillingResource, ChannelService, OrganizationService, SessionDataService,\n UsageLimitsResource, UserResource) {\n\n $scope.usageLimitStatus = \"\";\n // Used for collapsing main navigation in mobile\n $scope.isNavCollapsed = false;\n $scope.isProfileCollapsed = false;\n $scope.allUserOrganizations = [];\n $scope.filteredUserOrganizations = [];\n $scope.isOrganizationLoading = true;\n $scope.userOrganizationFilter = { value: '' };\n\n // IMPORTANT: Replace $scope.activityStreamTime value to ActivityStreamResource GET after backend support is implemented. currentTime here is just a placeholder. ActivityStreamTime service is in services.js\n var currentTime = new Date();\n $scope.activityStreamTime = currentTime.setHours(0);\n\n function updateUsageLimits() {\n var status = \"\";\n UsageLimitsResource.get(function(response) {\n $rootScope.usageLimits = response;\n $rootScope.usageLimits.limits.ITEMS = Math.abs($rootScope.usageLimits.limits.ITEMS);\n var itemCount = $rootScope.usageLimits.usages.ITEMS;\n var itemLimit = $rootScope.usageLimits.limits.ITEMS;\n if (itemCount >= itemLimit) {\n status = 'itemLimitExceeded';\n } else if (itemCount > (itemLimit * 0.9)) {\n status = 'nearItemLimit';\n }\n $scope.usageLimitStatus = status;\n });\n }\n\n $scope.getUsageLimitLabel = function() {\n var label = \"\";\n if ($scope.usageLimitStatus === 'nearItemLimit') {\n label = $translate.instant('USAGE_LIMIT.NEAR_ITEM_LIMIT', { usage: $rootScope.usageLimits.usages.ITEMS, limit: $rootScope.usageLimits.limits.ITEMS });\n } else if ($scope.usageLimitStatus === 'itemLimitExceeded') {\n label = $translate.instant('USAGE_LIMIT.ITEM_LIMIT_EXCEEDED', { usage: $rootScope.usageLimits.usages.ITEMS, limit: $rootScope.usageLimits.limits.ITEMS });\n }\n return label;\n };\n\n $scope.isActive = function(route) {\n return route === $location.path();\n };\n\n $scope.getWebApps = function() {\n var webApps = _.isNil($scope.organization) ? {} : ($scope.organization.webApps || {});\n return _.keys(webApps);\n };\n\n $scope.logout = function() {\n\n if ($rootScope.loggingIn || $rootScope.loggingOut) {\n return;\n }\n\n // Block the main `ng-view` until we have logged out, to prevent flickering of the\n // previous loaded route in the login page, `loggingOut` will be reset upon the browser reload.\n $rootScope.loggingOut = true;\n $scope.ignoreInvalidToken = true;\n\n $log.info(\"Logging out\");\n\n try {\n\n ChannelService.disconnect();\n SessionDataService.clearKeys();\n $rootScope.destroyAllNotifications();\n OrganizationService.logout();\n doLogout().finally(function() {\n\n $scope.ignoreInvalidToken = false;\n\n angular.element('body, #content').removeClass('sidebar-minified');\n\n // Reload system settings which also reloads any customUi settings and re-sets the design\n $rootScope.initializeSettings();\n\n try {\n // Stupid \"hopscotch\" throws exceptions!\n // Why is that here anyway and why did no one test it correctly?\n hopscotch.endTour();\n } catch (e) {\n }\n hopscotch.getCalloutManager().removeAllCallouts();\n\n $rootScope.refreshTranslations();\n\n // TODO: It should be \"safe\" to redirect to /login,\n // because actually the associated controller should take care of proper\n // \"redirection\"!\"\n if (!$rootScope.singleSignOn) {\n // Reset the currently display AngularJs view/route, so we won't have any left overs or dashboard flickering\n $location.path('/login').replace();\n $route.reload();\n // Then, reload the web app instance\n window.location.href = '/login';\n }\n\n });\n\n } catch (error) {\n $rootScope.loggingOut = false;\n $scope.ignoreInvalidToken = false;\n }\n\n };\n\n $scope.$on('InvalidToken', function() {\n if ($scope.ignoreInvalidToken) {\n return;\n }\n $log.warn('Unauthorized');\n $scope.logout();\n });\n\n if ($location.path().startsWith('/confirm') || $location.path().startsWith('/register')) {\n doLogout();\n }\n\n function doLogout() {\n return Auth.logout(function(response, headers) {\n\n $rootScope.user = {\n isLoggedIn: false\n };\n $rootScope.userId = null;\n $rootScope.users = null;\n\n });\n }\n\n $scope.getSupportLink = function() {\n return lax_rest_url('support');\n };\n\n $scope.toggleActivityStream = function() {\n $rootScope.retrieveAllActivities();\n //IMPORTANT: Replace $scope.activityStreamTime value to ActivityStreamResource GET after backend support is implemented. currentTime here is just a placeholder. ActivityStreamTime service is in services.js\n var currentTime = new Date();\n //IMPORTANT: ActivityStreamResource POST method call here. This updates the stream time and marks the activities as \"seen\".\n $scope.activityStreamTime = currentTime;\n console.log(\"Activity Stream Toggled! Stream time is now -->\" + $scope.activityStreamTime);\n $rootScope.newActivities = 0;\n $rootScope.newNotifications = false;\n $rootScope.activityStreamVisible = !$rootScope.activityStreamVisible;\n var presentDate = new Date();\n var reqDateVal = presentDate.toISOString();\n UserResource.updateNotificationsLastRead({ lastRead: reqDateVal }, function(response) {\n $rootScope.user.notificationsLastRead = response.notificationsLastRead;\n if ($rootScope.user.notificationsLastRead) {\n $scope.activityStreamTime = new Date($rootScope.user.notificationsLastRead);\n }\n });\n };\n\n $scope.hide = function(){\n $rootScope.activityStreamVisible = false;\n };\n\n $scope.$on('UserIsLoggedIn', function() {\n OrganizationService.$organization.subscribe(function(organization) {\n $scope.organization = organization;\n });\n if (_.isNil($rootScope.planBillingProfiles)) {\n BillingResource.getPlanBillingProfiles({}, function(response) {\n $rootScope.planBillingProfiles = {};\n _.forEach(response, function(profile) {\n $rootScope.planBillingProfiles[profile.plan] = {\n label: profile.productName,\n limits: profile.limits\n };\n });\n if (_.isEmpty($scope.organization.orderedProfile)) {\n $scope.organization.orderedProfile = response[0].plan;\n }\n });\n }\n if (_.isNil($rootScope.usageLimits)) {\n updateUsageLimits();\n }\n });\n\n $scope.$on('updateOrganizationUsageLimit', function(event, count) {\n OrganizationService.update({ itemCount: $scope.organization.itemCount + count });\n updateUsageLimits();\n });\n\n $scope.$on('dataModelLoaded', function() {\n $scope.documentationUrl = $rootScope.translate(\"DOCUMENTATION.URL\", null);\n $scope.documentationTitle = $rootScope.translate(\"DOCUMENTATION.TITLE\", null);\n $scope.showDashboardSettings = !_.isEmpty($rootScope.dataModel.getDashboardAttributes());\n $scope.showDashboardAdd = !_.isNil($rootScope.dataModelHash);\n });\n\n $scope.$on('toggleSidebarNavigation', function() {\n $scope.$broadcast('toggleSidebar');\n });\n\n $scope.gotoDashboard = function(mode) {\n $location.url('dashboard').search('mode', mode);\n };\n\n $scope.getUserOrganizations = function() {\n UserResource.getAccountOrganizations(function (result) {\n\n var accountOrganizations = result.toJSON();\n\n OrganizationService.getOrganization()\n .subscribe(function(currentOrganization) {\n\n // Subscribe function will be called on each change on the organization, so let's\n // wait until we have one loaded\n if (!_.isNil(currentOrganization)) {\n\n var userOrganizations = [];\n _.forEach(accountOrganizations, function(accountOrganization, organizationId) {\n\n var account = _.get(accountOrganization, \"account\");\n var organization = _.get(accountOrganization, \"organization\");\n\n // Use the actual \"current\" organization instead\n if (organization.id == currentOrganization.id) {\n currentOrganization.isCurrent = true;\n organization = currentOrganization;\n }\n\n // Mark organization according to the type of account\n organization.systemAccount = account.systemAccount;\n organization.managingAccount = account.managingAccount;\n\n if (organization.isCurrent) {\n userOrganizations.unshift(organization);\n } else {\n userOrganizations.push(organization);\n }\n\n });\n\n $scope.allUserOrganizations = userOrganizations;\n\n // Force a digest cycle to update the UI\n $timeout(function() {\n $scope.filteredUserOrganizations = userOrganizations;\n $scope.isOrganizationLoading = false;\n }, 0);\n }\n\n });\n });\n };\n\n $scope.deleteAccount = function($event, organization) {\n\n // Since the \"li\" element is already assigned a \"ng-click\" attribute, we need to prevent the \"delete\" event from being propagated!\n $event.preventDefault();\n $event.stopPropagation();\n\n if (organization == $rootScope.organization.id) {\n return;\n }\n\n var message;\n if (organization.managingAccount) {\n message = $translate.instant('USER.DELETE_MANAGING_ACCOUNT', { organizationName: organization.name });\n } else if (organization.systemAccount) {\n message = $translate.instant('USER.DELETE_SYSTEM_ACCOUNT', { organizationName: organization.name });\n } else {\n $log.warn(\"Account for organization \" + organization.id + \" is neither a managing nor a system acccount\");\n return;\n }\n\n var confirmDialog = $dialogs.confirm('', message);\n confirmDialog.result.then(function() {\n\n UserResource.deleteAccount({\n organizationId: organization.id\n }, function() {\n growl.success('USER.ACCOUNT_DELETED');\n $scope.getUserOrganizations();\n });\n\n });\n\n };\n\n $scope.switchOrganization = function(newOrganization) {\n\n if (newOrganization.id == $rootScope.organization.id) {\n return;\n }\n\n growl.info('USER.SWITCHING_ORGANIZATION', {\n variables: { organizationName: newOrganization.name },\n ttl: -1\n });\n\n $timeout(function() {\n UserResource.switchOrganization({\n organizationId: newOrganization.id\n }, function(result) {\n var host = _.get(result.user, 'customSite');\n $window.location.hostname = host;\n $window.location.href = \"/\";\n });\n }, 2000);\n\n };\n\n $scope.filterUserOrganizations = function() {\n var searchText = _.toLower($scope.userOrganizationFilter.value);\n $scope.filteredUserOrganizations = _.filter($scope.allUserOrganizations, function(organization) {\n if (!_.isEmpty(organization.gln)) {\n return _.includes(_.toLower(organization.name), searchText) || _.includes(_.toLower(organization.gln), searchText);\n } else {\n return _.includes(_.toLower(organization.name), searchText);\n }\n });\n };\n\n $scope.goToOrganizationProfile = function($event) {\n $event.preventDefault();\n $event.stopPropagation();\n $location.path('/organization').replace();\n };\n\n $scope.goToUserProfile = function($event) {\n $event.preventDefault();\n $event.stopPropagation();\n $location.path('/user').replace();\n };\n\n $scope.getAdditionalMenuUrl= function(urlOrUrls) {\n\n if (_.isString(urlOrUrls)) {\n return $translate.instant(urlOrUrls);\n } else {\n var languageSpecificUrl = urlOrUrls[$rootScope.language];\n\n if (!_.isEmpty(languageSpecificUrl)) {\n return languageSpecificUrl;\n } else {\n $log.info(\"Could not get additional menu url '%s', falling back by using the first found key\", JSON.stringify(urlOrUrls));\n var firstKey = _.keys(urlOrUrls)[0];\n return $translate.instant(urlOrUrls[firstKey]);\n }\n }\n };\n\n })\n .directive('clickOutside', function ($document) {\n return {\n restrict: 'A',\n scope: {\n clickOutside: '&'\n },\n link: function (scope, el, attr) {\n $document.on('click', function (e) {\n var $parentElement = document.getElementById(el[0].id);\n var $buttonElement = document.getElementById('activity-feed');\n if (!_.isNil($parentElement) &&\n !$parentElement.contains(e.target) &&\n !el[0].contains(e.target) &&\n !$buttonElement.contains(e.target)) {\n scope.$apply(function () {\n scope.$eval(scope.clickOutside);\n });\n }\n });\n }\n };\n });\n","angular.module('llax')\n .controller('OrderController', ['$rootScope', '$routeParams', '$scope', '$http', '$timeout', '$translate',\n 'growl', '$modal', '$controller', '$location', 'ShoppingCartResource', 'ShoppingCartService', 'ItemResource',\n\n function($rootScope, $routeParams, $scope, $http, $timeout, $translate, growl, $modal, $controller,\n $location, ShoppingCartResource, ShoppingCartService, ItemResource) {\n\n $controller('ShoppingCartController', {\n $scope: $scope\n });\n\n $scope.reAddToShoppingCart = function(shoppingCartItem) {\n ItemResource.get({\n primaryKey: shoppingCartItem.primaryKey\n }, function(item) {\n if (item) {\n $scope.addToShoppingCart(item);\n }\n }, function(error) {\n\n });\n };\n\n var columnDefs = ShoppingCartService.getColumnDefinitions();\n\n columnDefs.push({\n displayName: $scope.translate('ACTIONS'),\n enableCellEdit: false,\n enableCellSelection: false,\n resizable: true,\n width: '80',\n cellTemplate: ''\n });\n\n $scope.orderColumDefs = columnDefs;\n\n $scope.gridOptions = {\n data: 'order.items',\n showSelectionCheckbox: false,\n enableCellSelection: false,\n enableCellEdit: true,\n enableColumnResize: true,\n enableColumnMenus: false,\n multiSelect: false,\n selectWithCheckboxOnly: false,\n columnDefs: 'orderColumDefs',\n rowHeight: '34',\n rowTemplate: '
     
    ',\n afterSelectionChange: $scope.afterSelectionChange\n };\n\n $scope.loadOrder = function(id) {\n\n ShoppingCartResource.get({\n id: id\n }, function(response) {\n $scope.order = response;\n });\n };\n if ($routeParams.orderId !== undefined) {\n $scope.loadOrder($routeParams.orderId);\n }\n }\n ]);\n\nangular.module('llax')\n .controller('OrdersController', ['$rootScope', '$routeParams', '$scope', '$http', '$timeout', 'ItemResource',\n 'FavoritesResource', \"OrdersService\", '$translate', 'growl', '$modal', '$controller', '$location', 'ShoppingCartResource',\n\n function($rootScope, $routeParams, $scope, $http, $timeout, ItemResource, FavoritesResource, OrdersService,\n $translate, growl, $modal, $controller, $location, ShoppingCartResource) {\n\n $scope.columnDefs = $scope.columnDefs || [];\n\n function createCatalogTableColumnDefinition() {\n\n $scope.columnDefs = [];\n var columnDefs = [];\n\n columnDefs.push({\n field: \"orderDate\",\n displayName: $translate.instant('SHOPPING_CART.ORDER_DATE'),\n headerTooltip: true,\n enableCellEdit: false,\n resizable: true,\n cellFilter: 'date'\n });\n columnDefs.push({\n field: \"items.length\",\n displayName: $translate.instant('SHOPPING_CART.ORDER_POSITIONS'),\n headerTooltip: true,\n enableCellEdit: false,\n resizable: true\n });\n columnDefs.push({\n field: \"total\",\n displayName: $translate.instant('SHOPPING_CART.ORDER_TOTAL'),\n headerTooltip: true,\n enableCellEdit: false,\n resizable: true,\n cellFilter: 'currency'\n });\n columnDefs.push({\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n enableCellEdit: false,\n enableCellSelection: false,\n resizable: true,\n width: '80',\n cellTemplate: ''\n });\n\n $scope.columnDefs = columnDefs;\n }\n\n createCatalogTableColumnDefinition();\n\n $scope.orders = [];\n\n ShoppingCartResource.query({}, function(response) {\n $scope.orders = response.filter(function(order) {\n return order.orderDate !== undefined;\n });\n angular.forEach($scope.orders, function(order) {\n if (order.items) {\n var total = 0;\n angular.forEach(order.items, function(item) {\n var totalForItem = parseFloat(item.totalPrice);\n if (totalForItem) {\n total += totalForItem;\n }\n });\n order.total = total;\n }\n });\n });\n\n $scope.gridOptions = {\n data: 'orders',\n showSelectionCheckbox: false,\n enableCellSelection: false,\n enableCellEdit: true,\n enableColumnResize: true,\n enableColumnMenus: false,\n multiSelect: false,\n selectWithCheckboxOnly: false,\n columnDefs: $scope.columnDefs,\n rowHeight: '34',\n rowTemplate: '
     
    ',\n afterSelectionChange: $scope.afterSelectionChange\n };\n\n $rootScope.redirectToOrderDetail = function(order) {\n $location.path('/orders/detail/' + order.id);\n };\n\n $scope.itemsSelected = function() {\n if ($scope.gridOptions.$gridScope !== undefined && $scope.gridOptions.$gridScope.selectedItems !== undefined) {\n return ($scope.gridOptions.$gridScope.selectedItems.length >= 1);\n }\n };\n }\n ]);\n","angular.module('llax')\n .controller('OrganizationsController', function($rootScope, $scope, growl, OrganizationService, BillingResource) {\n $scope.hideOrganizationIcon = false;\n\n function prepareOrganizationAttributes() {\n // Set renderer and translations for organization attributes\n $scope.organizationAttributes = $rootScope.dataModel.getOrganizationAttributes();\n $rootScope.prepareAttributes($scope.organizationAttributes);\n }\n\n function getPlanBillingProfiles() {\n BillingResource.getPlanBillingProfiles(\n function(response) {\n $rootScope.planBillingProfiles = response;\n }\n );\n }\n\n $scope.saveOrganizationData = function(organizationData) {\n\n // Remove all unchanged customValue entries\n var newCustomValues = organizationData.customValues;\n var oldCustomValues = $scope.originalOrganizationData.customValues;\n if (!_.isEmpty(newCustomValues) && !_.isEmpty(oldCustomValues)) {\n newCustomValues = _.omitBy(newCustomValues, function(value, key) {\n var oldValue = oldCustomValues[key];\n return _.isEqual(value, oldValue);\n });\n organizationData = angular.copy(organizationData);\n organizationData.customValues = newCustomValues;\n }\n\n OrganizationService.save(organizationData,\n function(response) {\n growl.success(\"SAVE_SUCCESS_MESSAGE\");\n $rootScope.$broadcast('organizationUpdated');\n },\n function(response) {\n $rootScope.error = response.data;\n $scope.status = response.status;\n growl.error(\"SAVE_ERROR_MESSAGE\");\n });\n };\n\n $scope.uploadOrganizationImage = function() {\n return {\n url: lax_rest_url('organization/image'),\n filters: ['imageFilter'],\n accept: 'image/jpeg,image/gif,image/png',\n queueLimit: 1,\n cropImage: true,\n uploadComplete: function(response) {\n OrganizationService.update({ hasImage: true});\n OrganizationService.update({ imageUrl: lax_rest_url('organization/image')});\n $rootScope.$broadcast('updateOrganizationData');\n growl.success(\"UPLOAD_SUCCESS_MESSAGE\");\n }\n };\n };\n\n function updateOrganizationData() {\n var data = OrganizationService.getOrganization(true);\n $scope.organizationData = angular.copy(_.last(data.q).value);\n }\n\n $scope.$on('updateOrganizationData', function() {\n updateOrganizationData();\n });\n\n $scope.toggleOrganizationIcon = function() {\n $scope.hideOrganizationIcon = !$scope.hideOrganizationIcon;\n };\n\n $scope.$on('toggleFileUpload', function(event, uploadId) {\n if(uploadId == \"organization_upload\") {\n $scope.toggleOrganizationIcon();\n }\n });\n\n (function initOrganizationData() {\n if (!$rootScope.planBillingProfiles) {\n getPlanBillingProfiles();\n }\n OrganizationService.$organization.subscribe(function(organization) {\n $scope.originalOrganizationData = organization;\n $scope.organizationData = angular.copy(organization);\n });\n if ($rootScope.isDataModelLoaded) {\n prepareOrganizationAttributes();\n } else {\n $scope.$on('dataModelLoaded', function() {\n prepareOrganizationAttributes();\n });\n }\n })();\n });\n","angular.module('llax')\n .controller('provideLinkController', ['$rootScope', '$scope', '$document', '$modalInstance', 'CheckURLRessource', '$http', '$translate', '$filter', '$parse', 'growl', 'attribute', 'item', 'model', 'uploader', 'FileUploader', 'filePreviewData',\n function($rootScope, $scope,$document, $modalInstance, CheckURLRessource, $http, $translate, $filter, $parse, growl, attribute, item, model, uploader, FileUploader, filePreviewData) {\n $scope.a = attribute;\n $scope.item = item;\n if (_.isEqual(\"item[a.name]\", model) || _.isEmpty(model)) {\n model = \"item['\" + attribute.name + \"']\";\n }\n var modelEval = $parse(model);\n var modelValue = modelEval($scope);\n var oldValue = angular.copy(modelValue);\n $scope.url = oldValue;\n $scope.urlError = false;\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n $document.off('keydown', keyPressed);\n };\n\n $scope.enterURL = function (link) {\n //check if link is reachable\n CheckURLRessource.get({url: link},\n function(result) {\n $scope.urlError = false;\n if (!filePreviewData) {\n filePreviewData = {};\n }\n var url = link;\n var type = url.split('.').pop().split(/\\?|#/).shift();\n if(_.includes(url, \"/image\")){\n type = 'image';\n }\n filePreviewData.url = url;\n filePreviewData.isImage = false;\n filePreviewData.path = url.slice(url.lastIndexOf('/'));\n switch (type) {\n case 'svg':\n filePreviewData.contentType = \"image/svg+xml\";\n if (!Modernizr.svg) {\n filePreviewData.notSupported = true;\n }\n break;\n case 'webp':\n filePreviewData.isImage = true;\n filePreviewData.contentType = \"image/webp\";\n if (Modernizr.webp.toString() !== 'true') {\n filePreviewData.notSupported = true;\n }\n break;\n case 'tif':\n case 'xlsx':\n case 'xls':\n case 'tiff':\n filePreviewData.contentType = \"image/tiff\";\n filePreviewData.notSupported = true;\n break;\n case 'pdf':\n filePreviewData.contentType = \"application/pdf\";\n break;\n case \"jpg\":\n case \"jpeg\":\n case \"gif\":\n case \"png\":\n case \"bmp\":\n case \"tif\":\n case \"tiff\":\n case \"image\":\n filePreviewData.isImage = true;\n filePreviewData.alt = $filter('fileName', filePreviewData.url);\n break;\n default:\n filePreviewData.alt = $filter('fileName', filePreviewData.url);\n break;\n }\n modelEval.assign($scope, $scope.url);\n $modalInstance.close(filePreviewData);\n $document.off('keydown', keyPressed);\n\n }, function(error){\n modelEval.assign($scope, link);\n $scope.urlError = true;\n switch(error.status){\n case 400:\n growl.error(\"INPUT.MUST_BE_A_VALID_URL_FORMAT\");\n break;\n default:\n growl.error('UPLOAD.PROVIDE_LINK_ERROR');\n break;\n }\n return;\n });\n };\n\n function keyPressed($event) {\n if ($event.keyCode == 13) {\n $event.preventDefault();\n $scope.enterURL($scope.url);\n }\n }\n $document.on('keydown', keyPressed);\n\n }]);\n","angular.module('llax')\n .controller('PublicationStatusController',\n function(CommunicationChannelService, $scope, ItemResource) {\n function loadPublicationDestinations() {\n return CommunicationChannelService.loadPublicationDestinations().then(function(result) {\n $scope.communicationChannels = result.communicationChannels;\n $scope.organizations = result.organizations;\n });\n }\n\n $scope.loadPublications = function(primaryKey) {\n if (_.isNil($scope.itemPublications)) {\n ItemResource.getPublications({primaryKey: primaryKey}, function(publications) {\n $scope.itemPublications = _.filter(publications, { publishedStatus : \"PUBLISHED\" });\n loadPublicationDestinations().then(function(data) {\n $scope.isLoading = false;\n _.forEach($scope.itemPublications, function(publication) {\n publication.organization = _.find($scope.organizations, { organizationId : publication.destinationId });\n // Check the destinationType and/or the subDestination (which only exists for communication channel publications!)\n if (publication.destinationType == 'IN_PLATFORM' ||\n (_.isNil(publication.destinationType) && _.isNil(publication.subDestination))) {\n // load organization for publication.destinationId\n publication.organization = _.find($scope.organizations, { organizationId : publication.destinationId });\n } else if (publication.destinationType == 'COMMUNICATION_CHANNEL' ||\n (_.isNil(publication.destinationType) && !_.isNil(publication.subDestination))) {\n // load communicationChannel for publication.destinationId\n publication.communicationChannel = _.find($scope.communicationChannels, function(ch) {\n return (!publication.subDestination || (publication.subDestination == ch.subDestinationKey)) && ch.id == publication.destinationId;\n });\n }\n\n // If still nothing is set, first try to load organization and then communication channel\n if (_.isNil(publication.organzation) && _.isNil(publication.communicationChannel)) {\n // load organization for publication.destinationId,\n // if no organization found, load communicationChannel for publication.destinationId\n publication.organization = _.find($scope.organizations, { organizationId : publication.destinationId });\n if (_.isNil(publication.organization)) {\n publication.communicationChannel = _.find($scope.communicationChannels, function(ch) {\n return (!publication.subDestination || (publication.subDestination == ch.subDestinationKey)) && ch.id == publication.destinationId;\n });\n }\n }\n });\n $scope.itemPublicationsByOrg = _.filter($scope.itemPublications, function(p) {\n return !!p.organization;\n });\n $scope.itemPublicationsByChannel = _.filter($scope.itemPublications, function(p) {\n return !!p.communicationChannel;\n });\n });\n });\n }\n };\n\n $scope.showPublicationStatus = function() {\n $scope.loadPublications($scope.item.primaryKey__);\n };\n\n });","angular.module('llax')\n .controller('PublicationTasksController', ['$scope', 'PublicationResource', 'growl', 'RepublishResource', '$timeout', '$dialogs',\n '$translate',\n function($scope, PublicationResource, growl, RepublishResource, $timeout, $dialogs, $translate) {\n\n $scope.existingPublicationsMap = {};\n\n $scope.loadExistingPublication = function(recipientId) {\n // FIXME: Enrich with publication type and destination information (channel or organization name and subDestination, if available)\n PublicationResource.query({recipient: recipientId}, function(response) {\n $scope.existingPublicationsMap[recipientId] = response;\n });\n };\n\n $scope.toggleShowPublicationDetails = function(channel) {\n channel.showDetails.publications = !channel.showDetails.publications;\n if (channel.showDetails.publications) {\n $scope.loadExistingPublication(channel.id);\n }\n };\n\n $scope.restartPublication = function(taskId, recipientId) {\n var message = $translate.instant('COMMUNICATION_CHANNELS.RELOAD_SUBSCRIPTION');\n var confirmDialog = $dialogs.confirm('', message);\n confirmDialog.result.then(function() {\n RepublishResource.save({\n taskId: taskId\n },\n function(response) {\n growl.success(\"COMMUNICATION_CHANNELS.REPUBLICATION_STARTED_SUCCESSFULLY\");\n $timeout(function() {\n $scope.loadExistingPublication(recipientId);\n }, 1000);\n },\n function(response) {\n growl.error(\"COMMUNICATION_CHANNELS.ERROR_STARTING_REPUBLICATION\");\n }\n );\n });\n };\n }\n ]);\n","angular.module('llax')\n .controller('PublicationOverviewController', function($modal, $q, $rootScope, $scope, $timeout, $translate, growl, uiGridConstants,\n ChannelService, CommunicationChannelResource, ContactsResource, InfiniteScrollHelper, JobResource, PublicationResource, QueryPublicationResource, SelectionResource, PublicationMode, RepublishResource) {\n\n var PUBLICATION_GRID_STATES_KEY = \"publication-grid-states\";\n var DEFAULT_GRID_STATE_KEY = \"default-state\";\n var JOBS_GRID_STATE_KEY = \"jobs-state\";\n\n $scope.publicationsGridApi = null;\n\n function getCounterTemplate(field, key) {\n return '
    ' +\n ' {{row.entity.' +field+ ' || 0}}' +\n '
    ';\n }\n\n function getWithStatusTemplate(field, key) {\n return '';\n }\n\n function getWithoutStatusTemplate(field) {\n return '';\n }\n\n var columnDefs = [{\n field: 'totalItemsCount',\n displayName: $translate.instant('PUBLICATIONS.ITEMS'),\n headerTooltip: true,\n cellTemplate: '
    \\n' +\n ' {{row.entity.statusCount.itemCounts.SUCCESS || 0}}/{{row.entity.statusCount.itemCounts.VALID || 0}}\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    ',\n cellClass: 'text-center',\n width: 120\n }, {\n field: 'taskStatus',\n displayName: $translate.instant('PUBLICATIONS.STATUS'),\n headerTooltip: true,\n cellClass: 'text-center',\n cellTemplate: '
    \\n' +\n '\\n' +\n ' {{COL_FIELD}}\\n' +\n '\\n' +\n '
    ',\n width: 100\n }, {\n field: 'destinationId',\n displayName: $translate.instant('PUBLICATIONS.DESTINATION'),\n headerTooltip: true,\n cellTooltip: true,\n cellTemplate: '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' {{grid.appScope.getDestinations(row.entity)}}\\n' +\n '
    ' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n ' {{grid.appScope.getDescriptions(row.entity)}} ({{grid.appScope.getDestinations(row.entity)}})\\n' +\n '
    ',\n width: 220,\n minWidth: 180\n }, {\n field: 'successfulItems',\n displayName: $translate.instant('PUBLICATIONS.ITEMS.SUCCESS'),\n headerTooltip: true,\n cellTemplate: getWithStatusTemplate('statusCount.itemCounts.SUCCESS','SUCCESS'),\n cellTooltip: true,\n width: 80\n }, {\n field: 'deliveredItems',\n displayName: $translate.instant('PUBLICATIONS.ITEMS.DELIVERED'),\n headerTooltip: true,\n cellTemplate: getCounterTemplate('statusCount.itemCounts.DELIVERED'),\n cellTooltip: true,\n width: 80\n }, {\n field: 'unchangedItems',\n displayName: $translate.instant('PUBLICATIONS.ITEMS.UNCHANGED'),\n headerTooltip: true,\n cellTemplate: getWithStatusTemplate('statusCount.itemCounts.UNCHANGED','UNCHANGED'),\n cellTooltip: true,\n width: 80\n }, {\n field: 'failedItems',\n displayName: $translate.instant('PUBLICATIONS.ITEMS.FAILED'),\n headerTooltip: true,\n cellTemplate: getWithStatusTemplate('statusCount.itemCounts.ERROR','ERROR'),\n cellTooltip: true,\n width: 80\n }, {\n field: 'invalidItems',\n displayName: $translate.instant('PUBLICATIONS.ITEMS.INVALID'),\n headerTooltip: true,\n cellTemplate: getCounterTemplate('statusCount.itemCounts.INVALID','INVALID'),\n cellTooltip: true,\n width: 80\n }, {\n field: 'skippedItems',\n displayName: $translate.instant('PUBLICATIONS.ITEMS.SKIPPED'),\n headerTooltip: true,\n cellTemplate: getCounterTemplate('statusCount.itemCounts.SKIPPED','SKIPPED'),\n cellTooltip: true,\n visible: false, // initially not visible\n width: 80\n }, {\n field: 'creationDate',\n displayName: $translate.instant('PUBLICATIONS.START'),\n headerTooltip: true,\n cellFilter: \"date:'medium'\",\n width: 180\n }, {\n field: 'finishedDate',\n displayName: $translate.instant('PUBLICATIONS.END'),\n headerTooltip: true,\n cellFilter: \"date:'medium'\",\n width: 180\n }, {\n field: 'user',\n displayName: $translate.instant('PUBLICATIONS.USER'),\n headerTooltip: true,\n cellTooltip: true,\n width: 160\n },{\n field: 'name',\n displayName: $translate.instant('ITEM_LIBRARY_PUBLISH.attribute.name'),\n headerTooltip: true,\n cellTooltip: true,\n cellTemplate: '
    \\n' +\n ' {{::grid.appScope.getJobName(row.entity)}}\\n' +\n '
    ',\n width: 120\n }, {\n field: 'publicationType',\n displayName: $translate.instant('PUBLICATIONS.PUBLICATION_TYPE'),\n headerTooltip: true,\n cellTooltip: true,\n cellTemplate: '
    \\n' +\n ' {{\\'PUBLICATIONS.PUBLICATION_TYPE.\\' + row.entity.publicationType}}\\n' +\n '
    ',\n width: '*',\n minWidth: 120\n }];\n\n columnDefs.push({\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n name: 'actions',\n enableCellEdit: false,\n enableCellSelection: false,\n allowCellFocus: false,\n pinnedRight: true,\n enableColumnResizing: false,\n enableSorting: false,\n enableHiding: false,\n resizable: false,\n headerCellClass: 'text-center',\n cellClass: 'text-right',\n cellTemplate:\n '
    \\n' +\n '
    \\n' +\n '\\n' +\n '
    0 && row.entity.taskStatus != \\'RUNNING\\'\">\\n' +\n '\\n' +\n '' +\n '' +\n '\\n' +\n '\\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    \\n' +\n '
    ',\n width: 120,\n });\n\n $scope.gridOptions = {\n data: 'publications',\n columnDefs: columnDefs,\n enableColumnMenus: false,\n enableGridMenu: true,\n enableSorting: false,\n rowHeight: 34,\n onRegisterApi: function(gridApi) {\n $scope.publicationsGridApi = gridApi;\n }\n };\n\n $scope.getJobName = function(entity) {\n var name = \"\";\n var job = _.find($scope.jobs, {id:entity.jobId});\n if (job) {\n name = job.name;\n }\n return name;\n };\n\n // Default query parameters used in 'scrollHelper.load'\n var DEFAULT_QUERY_PARAMS = {\n limit: 20\n };\n\n // Accessor to get/set publications, used in 'InfiniteScrollHelper'\n $scope.publications = [];\n function publicationsAccessor(publications) {\n if (!_.isUndefined(publications)) {\n // FIXME: Enrich with publication type and destination information (channel or organization name and subDestination, if available)\n $scope.publications = publications;\n }\n return $scope.publications;\n }\n\n $scope.stopPublication = function(entity) {\n PublicationResource.stopPublication({\n taskId: entity.id\n },\n function(response) {\n // Handle success response here\n },\n function(response) {\n // Handle error response here\n }\n );\n };\n\n $scope.reRunPublication = function(entity) {\n RepublishResource.save({\n taskId: entity.id\n },\n function(response) {\n growl.success(\"COMMUNICATION_CHANNELS.REPUBLICATION_STARTED_SUCCESSFULLY\");\n $scope.scrollHelper.load({ queryParams: DEFAULT_QUERY_PARAMS });\n },\n function(response) {\n growl.error($rootScope.getErrorMessage(response, 'COMMUNICATION_CHANNELS.ERROR_STARTING_REPUBLICATION'));\n }\n );\n };\n\n // Error handler used in 'InfiniteScrollHelper'\n function errorHandler(errorStatus, errorData) {\n $scope.status = errorStatus;\n }\n\n // The 'infinite scroll' helper object\n // Simple set the 'resource' object, scope and data and gridApi variable, and call 'addToGridOptions' to enable 'infinite scrolling'\n $scope.scrollHelper = new InfiniteScrollHelper(QueryPublicationResource, $scope, publicationsAccessor, 'publicationsGridApi', errorHandler);\n $scope.scrollHelper.addToGridOptions($scope.gridOptions, function(gridApi) {\n $scope.publicationsGridApi = gridApi;\n $rootScope.initGridState($scope, $scope.publicationsGridApi, PUBLICATION_GRID_STATES_KEY, DEFAULT_GRID_STATE_KEY, columnDefs);\n });\n\n $scope.responseErrors = {};\n $scope.showMessages = function(row) {\n function PublicationErrorMessagesCtrl($rootScope,$modalInstance, $scope,messages) {\n $scope.errorMessages = messages;\n $scope.close = function() {\n $modalInstance.close($scope.channel);\n };\n }\n if ($scope.responseErrors[row.id]) {\n openErrorsModal($scope.responseErrors[row.id]);\n }\n else {\n PublicationResource.getResponseErrors({'taskId':row.id},\n function(result) {\n if (result && result.length > 0) {\n $scope.responseErrors[row.id] = result;\n openErrorsModal(result);\n }\n }\n );\n }\n function openErrorsModal(errors) {\n $modal.open({\n templateUrl: 'tpl/publication-error-messages.tpl.html',\n controller: PublicationErrorMessagesCtrl,\n backdrop: true,\n windowClass: 'publish-modal',\n resolve: {\n messages: function() {\n return errors;\n }\n }\n });\n }\n };\n\n $scope.isAllowed = function(entity, isVerificationRequired) {\n var runJob = false;\n if (!_.isNil($rootScope.organization) && $rootScope.organization.verified) {\n runJob = true;\n } else {\n var destinationChannelIds = _.get(entity, 'destinationChannelIds');\n if (!_.isEmpty(destinationChannelIds)) {\n runJob = !_.find(destinationChannelIds, function(channelId) {\n var channel = _.find($scope.communicationChannels, { 'id': channelId, 'needsVerification': true});\n return !_.isNil(channel);\n });\n }\n }\n return ($rootScope.user.roles.indexOf('admin') > -1 || _.isEmpty(entity.user) ||\n entity.user == $rootScope.user.userId) && (isVerificationRequired ? runJob: true);\n };\n\n function loadScheduleJobs() {\n return JobResource.query({\n type: 'PUBLICATION'\n }, function(response) {\n $scope.jobs = response;\n });\n }\n\n var jobsColumnDefs = [{\n field: 'name',\n displayName: $translate.instant('ITEM_LIBRARY_PUBLISH.attribute.name'),\n headerTooltip: true,\n width: 120\n }, {\n field: 'publicationType',\n displayName: $translate.instant('PUBLICATIONS.PUBLICATION_TYPE'),\n headerTooltip: true,\n cellTemplate: '
    \\n' +\n ' {{\\'PUBLICATIONS.PUBLICATION_TYPE.\\' + row.entity.publicationType}}\\n' +\n '
    ',\n sort: {\n direction: uiGridConstants.ASC,\n priority: 0\n },\n suppressRemoveSort: true,\n width: 120\n }, {\n field: 'schedule.status',\n displayName: $translate.instant('PUBLICATIONS.STATUS'),\n headerTooltip: true,\n cellClass: 'text-center',\n cellTemplate: '
    \\n' +\n ' {{COL_FIELD}}\\n' +\n '
    ',\n width: 100\n }, {\n field: 'user',\n displayName: $translate.instant('PUBLICATIONS.USER'),\n headerTooltip: true,\n width: 160\n }, {\n field: 'destinations',\n displayName: $translate.instant('PUBLICATIONS.DESTINATION'),\n headerTooltip: true,\n enableSorting: false,\n cellTemplate: '
    \\n' +\n ' {{::grid.appScope.getDestinations(row.entity)}}\\n' +\n '
    ',\n width: '*',\n minWidth: 180\n }, {\n field: 'schedule.nextRunDateTime',\n displayName: $translate.instant('ITEM_LIBRARY_PUBLISH.attribute.nextRunDateTime'),\n headerTooltip: true,\n cellFilter: \"date:'medium'\",\n sort: {\n direction: uiGridConstants.ASC,\n priority: 1\n },\n width: 180\n }];\n jobsColumnDefs.push({\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n name: 'actions',\n headerCellClass: 'text-right',\n cellClass: 'text-right',\n enableColumnResizing: false,\n enableSorting: false,\n pinnedRight: true,\n cellTemplate:\n '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    ',\n width: 120\n });\n\n $scope.jobsGridOptions = {\n data: 'jobs',\n columnDefs: jobsColumnDefs,\n enableColumnMenus: false,\n enableGridMenu: true,\n enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,\n enableSorting: true,\n suppressMultiSort: true,\n rowHeight: 34,\n onRegisterApi: function(gridApi) {\n\n $scope.jobsGridApi = gridApi;\n $scope.jobsGridApi.core.on.rowsRendered( $scope, function(data) {\n var gridHeight = ($scope.jobsGridOptions.rowHeight * $scope.jobs.length) + 32;\n if (gridHeight > $scope.jobsGridMaxHeight) {\n $scope.jobsGridOptions.enableVerticalScrollbar = uiGridConstants.scrollbars.ALWAYS;\n } else {\n $scope.jobsGridOptions.enableVerticalScrollbar = uiGridConstants.scrollbars.NEVER;\n }\n });\n\n $rootScope.initGridState($scope, $scope.jobsGridApi, PUBLICATION_GRID_STATES_KEY, JOBS_GRID_STATE_KEY, jobsColumnDefs);\n\n }\n };\n\n $scope.editJob = function(entity) {\n SelectionResource.get({\n selectionId: entity.selectionId\n }, function(response) {\n if (!_.isEmpty(response)) {\n var itemSelection = response;\n var modalInstance = $modal.open({\n templateUrl: 'tpl/publish-to-recipients-modal.tpl.html',\n controller: 'PublishItemsController',\n backdrop: true,\n windowClass: 'publish-modal',\n resolve: {\n itemSelection: function() {\n return itemSelection;\n },\n mode: function() {\n return PublicationMode.PUBLISH;\n },\n publicationData: function() {\n return { job : entity };\n }\n }\n });\n }\n });\n };\n\n $scope.runJob = function(entity) {\n JobResource.run({\n jobId: entity.id\n }, function(response) {\n growl.success(\"JOB_SCHEDULE.PUBLICATION_STARTED_SUCCESSFULLY\");\n loadScheduleJobs();\n }, function(response) {\n growl.error($rootScope.getErrorMessage(response, 'JOB_SCHEDULE.PUBLICATION_STARTED_FAILED'));\n loadScheduleJobs();\n });\n };\n\n $scope.deleteJob = function(entity) {\n JobResource.delete({\n jobId: entity.id\n }, function(response) {\n growl.success(\"JOB_SCHEDULE.JOB_DELETE_SUCCESS\");\n loadScheduleJobs();\n });\n };\n\n $scope.getDestinationIcon = function(entity) {\n if (entity.destinationType === 'COMMUNICATION_CHANNEL') {\n return 'syncons-channels';\n } else if (entity.directPublication) {\n return 'syncons-add-user';\n } else {\n return 'syncons-contacts';\n }\n };\n\n $scope.getDestinations = function(entity) {\n\n // NOTE:\n // This method should best be split into 2:\n // One for the \"jobs\", where an \"entity\" can have multiple destinations,\n // and for the \"publications\" where an \"entity\" can only have ONE single destination!\n // This here is complete crap!\n\n var destinations = [];\n var channelSubDestinations = entity.channelSubDestinations || [];\n var channelIds = entity.destinationChannelIds || [];\n var organizationsIds = entity.destinationOrganizationIds || [];\n var destinationId = entity.destinationId || [];\n var sources = $scope.organizations.concat($scope.communicationChannels);\n var ids = channelIds.concat(organizationsIds).concat(destinationId);\n\n if (entity.subDestination) {\n destinations.push(entity.subDestination);\n } else {\n _.forEach(channelSubDestinations, function(subDestination) {\n var name = subDestination.split(':')[1];\n destinations.push(name);\n });\n _.forEach(ids, function(id) {\n var element = _.find(sources, function(source) {\n return source.id == id || source.organizationId == id;\n });\n if (element) {\n destinations.push(element.name);\n }\n });\n }\n\n return destinations.join(', ');\n };\n\n $scope.getDescriptions = function(entity) {\n sourceId = entity.destinationId;\n sourceCommunicationChannel = _.map($scope.communicationChannels, function(channel) {\n if (channel.id == sourceId) return channel;\n });\n sourceCommunicationChannel = _.without(sourceCommunicationChannel, undefined)[0];\n\n if (sourceCommunicationChannel && sourceCommunicationChannel.subDestinations) {\n return sourceCommunicationChannel.subDestinations[entity.subDestination];\n }\n return \"\";\n };\n\n $scope.toggleActive = function(job) {\n var newJob = angular.copy(job);\n newJob.type = 'PUBLICATION';\n newJob.schedule.active = !newJob.schedule.active;\n JobResource.save(newJob, function(response) {\n angular.extend(job, response);\n });\n };\n\n $scope.$on('channelMessageReceived', function(event, eventData) {\n var typeOfChange = '';\n if (eventData.event === ChannelService.PUBLICATION_TASK_CHANGED_EVENT) {\n typeOfChange = eventData.data.typeOfChange;\n var publication = eventData.data.publication;\n if (typeOfChange === \"created\") {\n $scope.publications.unshift(publication);\n } else if (typeOfChange === \"updated\") {\n var foundPublication = _.find($scope.publications, { 'id': publication.id });\n if (!_.isNil(foundPublication)) {\n _.merge(foundPublication, publication);\n// publicationTask.taskStatus = publication.taskStatus;\n// publicationTask.publishedItemsCount = publication.publishedItemsCount;\n// publicationTask.totalItemsCount = eventData.data.publicationTotalItemsCount;\n// publicationTask.finishedDate = eventData.data.publishedAt;\n// publicationTask.finalStatus = eventData.data.publicationFinalStatus;\n// publicationTask.finished = eventData.data.publicationFinished;\n// publicationTask.finishing = eventData.data.publicationFinishing;\n }\n }\n $scope.publicationsGridApi.core.notifyDataChange(uiGridConstants.dataChange.ALL);\n } else if (eventData.event === ChannelService.PUBLICATION_JOB_CHANGED_EVENT) {\n typeOfChange = eventData.data.typeOfChange;\n var publicationJob = eventData.data.job;\n\n if (typeOfChange === 'updated') {\n var foundJob = _.find($scope.jobs, { 'id': publicationJob.id });\n if (!_.isNil(foundJob)) {\n _.merge(foundJob, publicationJob);\n }\n }\n }\n });\n\n function loadCommunicationChannels() {\n return CommunicationChannelResource.query(\n function(communicationChannelsResponse) {\n $scope.communicationChannels = communicationChannelsResponse;\n }\n );\n }\n\n function loadOrganizations() {\n return ContactsResource.query({},\n function(organizationsResponse) {\n $scope.organizations = organizationsResponse;\n }\n );\n }\n\n function loadDependencies() {\n $q.all([\n loadOrganizations().$promise,\n loadCommunicationChannels().$promise,\n $scope.scrollHelper.load({ queryParams: DEFAULT_QUERY_PARAMS }).$promise,\n loadScheduleJobs().$promise\n ]).then(function(data) {\n $scope.isLoading = false;\n });\n }\n\n $scope.refreshPage = function () {\n $scope.isLoading = true;\n loadDependencies();\n };\n\n (function init() {\n $scope.isLoading = true;\n $scope.jobsGridMaxHeight = 200;\n $scope.jobs = [];\n if ($rootScope.isDataModelLoaded) {\n loadDependencies();\n } else {\n $scope.$on('dataModelLoaded', function() {\n loadDependencies();\n });\n }\n })();\n\n });\n","angular.module('llax')\n .controller('PublishItemsController',\n function($log, $rootScope, $scope, $modalInstance, $translate, $q, $locale, $timeout, itemSelection, mode, publicationData, growl,\n CommunicationChannelService, DefaultItemResource,\n JobResource, SelectionResource, PublicationMode, PublicationResource,\n DePublicationResource) {\n\n $scope.loading = true;\n\n var itemsQuery = itemSelection.primaryKeys ? itemSelection.primaryKeys :\n _.omit(itemSelection.itemsQuery, _.isEmpty);\n\n $scope.data = {\n mode: mode,\n itemsQuery: itemsQuery\n };\n\n $scope.planOptions = {\n action: 'IMMEDIATELY',\n job: {\n schedule: {}\n }\n };\n\n $scope.settings = {\n allRecipientsSelected: false\n };\n\n $scope.allOrganizationsSelected = false;\n\n $scope.ok = function() {\n $modalInstance.close();\n };\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.plans = $rootScope.getPreparedCommunicationPlans();\n\n function loadPublicationData() {\n if (!_.isEmpty(publicationData)) {\n var job = publicationData.job;\n $scope.planOptions.job = job || $scope.planOptions.job;\n $scope.planOptions.job.schedule = $scope.planOptions.job.schedule || {};\n var sch = $scope.planOptions.job.schedule;\n if (!_.isNil(sch.startDateTime)) {\n sch.startDateTime = new Date(sch.startDateTime);\n }\n if (!_.isNil(sch.endDateTime)) {\n sch.endDateTime = new Date(sch.endDateTime);\n }\n if (!_.isNil(sch.nextRunDateTime)) {\n sch.nextRunDateTime = new Date(sch.nextRunDateTime);\n }\n $scope.planOptions.action = \"SCHEDULE_PLAN\";\n $scope.planOptions.actionRepeat = !_.isNil(sch.repeatType || sch.repeatEvery || sch.endDateTime);\n if (!_.isEmpty(job.destinationOrganizationIds)) {\n _.forEach($scope.organizations, function(org) {\n org.isSelected = job.destinationOrganizationIds.indexOf(org.organizationId) > -1;\n });\n }\n if (!_.isEmpty(job.destinationChannelIds)) {\n _.forEach($scope.communicationChannels, function(ch) {\n ch.isSelected = job.destinationChannelIds.indexOf(ch.id) > -1;\n });\n }\n if (!_.isEmpty(job.channelSubDestinations)) {\n _.forEach(job.channelSubDestinations, function(sd) {\n var str = sd.split(':');\n var ch = _.find($scope.communicationChannels, function(c) {\n return c.id == str[0] && c.subDestinationKey == str[1];\n });\n if (!_.isEmpty(ch)) {\n ch.isSelected = true;\n }\n });\n }\n } else {\n // If only *one* destination is available, set it as selected.\n if ($scope.organizations.length === 1 && $scope.communicationChannels.length === 0) {\n $scope.organizations[0].isSelected = true;\n } else if ($scope.communicationChannels.length === 1 && $scope.organizations.length === 0) {\n $scope.communicationChannels[0].isSelected = true;\n }\n }\n }\n\n function loadPublicationDestinations() {\n var customPublicationService = $rootScope.getService(\"CustomPublicationSettings\");\n var config = {\n publicationMode: $scope.data.mode\n };\n return CommunicationChannelService.loadPublicationDestinations(config)\n .then(function(result) {\n\n // Filter the publication targets based on the publication mode\n if (!_.isNil(customPublicationService) && !_.isNil(customPublicationService.filterPublicationTargets)) {\n // Add destinationType to communicationChannels\n var communicationChannelsWithType = _.map(result.communicationChannels, function(channel) {\n channel.destinationType = 'COMMUNICATION_CHANNEL';\n return channel;\n });\n\n // Add destinationType to organizations\n var organizationsWithType = _.map(result.organizations, function(org) {\n org.destinationType = 'IN_PLATFORM';\n return org;\n });\n var publicationTargets = communicationChannelsWithType.concat(organizationsWithType);\n var filteredPublicationTargets = customPublicationService.filterPublicationTargets(publicationTargets, $scope.data.mode, $rootScope.user, $rootScope.organization);\n\n $scope.communicationChannels = _.filter(filteredPublicationTargets, function(target) {\n return target.destinationType === 'COMMUNICATION_CHANNEL';\n });\n\n $scope.organizations = _.filter(filteredPublicationTargets, function(target) {\n return target.destinationType === 'IN_PLATFORM';\n });\n\n } else {\n $scope.communicationChannels = result.communicationChannels;\n $scope.organizations = result.organizations;\n }\n\n if (_.isEmpty($scope.communicationChannels)) {\n $scope.loading = false;\n } else {\n // If at least one communication channel has a plan with a publication category and item, we\n // fill the `$scope.item` with default values from the plan's category default item.\n var publicationCategoryName = _.reduce($scope.communicationChannels, function(foundCategoryName, channel) {\n var categoryName = $scope.getPublicationItemCategoryOfChannel(channel);\n if (!_.isEmpty(categoryName)) {\n foundCategoryName = categoryName;\n }\n\n return foundCategoryName;\n }, null);\n\n if (!_.isEmpty(publicationCategoryName)) {\n var selectedPublicationMode;\n if (!_.isEmpty(publicationData)) {\n var job = publicationData.job;\n if (!_.isEmpty(job.publicationValues) && !_.isEmpty(job.publicationValues.publication_mode)) {\n selectedPublicationMode = job.publicationValues.publication_mode;\n }\n }\n $scope.setPublicationItem(publicationCategoryName, selectedPublicationMode);\n } else {\n $scope.item = {};\n $scope.loading = false;\n }\n }\n });\n }\n loadPublicationDestinations().then(loadPublicationData);\n\n $scope.hasPublicationAttributes = function(planName) {\n var publicationAttributes = $scope.getPublicationAttributes(planName);\n return publicationAttributes.length > 0;\n };\n\n $scope.getPublicationAttributes = function(planName) {\n var plan = $scope.plans[planName];\n return plan ? plan[(mode === 'PUBLISH' ? 'publicationAttributes' : 'unpublicationAttributes')] : [];\n };\n\n $scope.getPublicationItemCategoryOfChannel = function(channel) {\n var plan = $scope.plans[channel.plan];\n var categoryType = (mode === 'PUBLISH' ? 'publicationCategory' : 'unpublicationCategory');\n var categoryName = (plan ? plan[categoryType] : null);\n return categoryName;\n };\n\n $scope.setPublicationItem = function(categoryName, selectedPublicationMode) {\n var defaultItem = $rootScope.dataModel.getDefaultItem(categoryName);\n if (defaultItem) {\n $scope.item = angular.extend({}, angular.copy(defaultItem), $scope.item);\n if (!_.isNil(selectedPublicationMode)) {\n $scope.item.publication_mode = selectedPublicationMode;\n }\n $scope.loading = false;\n } else {\n DefaultItemResource.get({\n category: categoryName\n }, function(defaultItem) {\n $rootScope.dataModel.setDefaultItem(categoryName, defaultItem.toJSON());\n $scope.item = angular.extend({}, defaultItem.toJSON(), $scope.item);\n $scope.loading = false;\n });\n }\n };\n\n $scope.onBeforeStepChange = function(event) {\n var recipients = $scope.organizations.concat($scope.communicationChannels);\n var anySelected = _.some(recipients, 'isSelected');\n if (anySelected) {\n\n // Before moving to the scheduling step, check if it's enabled by the 'CustomPublicationSettings'.\n var customPublicationService = $rootScope.getService(\"CustomPublicationSettings\");\n if (!_.isNil(customPublicationService) && !_.isNil(customPublicationService.enablePublicationSchedule)) {\n var selectedPublicationDestinations = getSelectedPublicationDestinations($scope.organizations, $scope.communicationChannels);\n\n var isScheduleEnabled = customPublicationService.enablePublicationSchedule(itemSelection.primaryKeys, selectedPublicationDestinations, $rootScope.user, $rootScope.organization);\n\n if (!isScheduleEnabled) {\n // In case the schedule is disabled, skip the next step, and publish the items immediately.\n $log.info('Publications scheduling is disabled by \\'enablePublicationSchedule()\\' settings in \\'CustomPublicationSettings\\'.');\n $scope.confirmPublishItems();\n return false;\n }\n }\n\n return true;\n } else {\n growl.warning('NO_ORGANIZATIONS_SELECTED');\n return false;\n }\n };\n\n $scope.confirmPublishItems = function(items) {\n\n var publicationDestinations = getSelectedPublicationDestinations($scope.organizations, $scope.communicationChannels);\n\n if (publicationDestinations.length >= 1) {\n if ($scope.planOptions.action === 'IMMEDIATELY') {\n $rootScope.$broadcast('confirmPublishItems', itemSelection, mode, publicationDestinations, $scope.item);\n $scope.ok();\n } else {\n\n if (!_.isNil(publicationData) && !_.isNil(publicationData.selectionId)) {\n runJob(publicationData.selectionId, mode, publicationDestinations);\n } else {\n itemSelection = (itemSelection.itemsQuery && itemSelection.itemsQuery.primaryKeys) ?\n { primaryKeys: itemSelection.itemsQuery.primaryKeys } :\n itemSelection;\n SelectionResource.save(itemSelection, function(response) {\n runJob(response.selectionId, mode, publicationDestinations);\n }, function(errorResponse) {\n growl.error($rootScope.getErrorMessage(errorResponse, 'PUBLICATION_FAILED'));\n });\n }\n\n }\n } else {\n growl.warning(\"NO_ORGANIZATIONS_SELECTED\");\n }\n };\n\n function getCurrentJob(selectionId, mode, publicationValues, organizationDestinations, channelDestinations,\n publicationDestinations) {\n var selectedOrganizations = _.map(organizationDestinations, 'destinationId');\n var subDestinations = _.chain(publicationDestinations)\n .filter(function(destination) {\n return destination.subDestination !== undefined;\n })\n .map(function(element) {\n return element.destinationId + ':' + element.subDestination;\n })\n .value();\n var selectedChannels = _.chain(channelDestinations)\n .filter(function(channel) {\n return subDestinations.indexOf(channel.destinationId + ':' + channel.subDestination) == -1;\n })\n .map('destinationId')\n .value();\n\n var job = angular.extend($scope.planOptions.job, {\n type: 'PUBLICATION',\n publicationType: mode === 'DEPUBLISH' ? 'DELETE' : 'ADD',\n destinationChannelIds: selectedChannels,\n destinationOrganizationIds: selectedOrganizations,\n channelSubDestinations: subDestinations,\n publicationValues: publicationValues,\n selectionId: selectionId\n });\n job.schedule.active = true;\n if (!$scope.planOptions.actionRepeat) {\n job.schedule = { active: true, startDateTime: job.schedule.startDateTime };\n }\n\n return job;\n }\n\n function runJob(selectionId, mode, publicationDestinations) {\n var organizationDestinations = _.filter(publicationDestinations, function(dest) {\n return dest.destinationType === \"IN_PLATFORM\";\n });\n\n var channelDestinations = _.filter(publicationDestinations, function(dest) {\n return dest.destinationType === \"COMMUNICATION_CHANNEL\";\n });\n\n var job = getCurrentJob(selectionId, mode, $scope.item, organizationDestinations, channelDestinations, publicationDestinations);\n JobResource.save(job,\n function(response) {\n growl.info('PUBLICATION_STARTED');\n $scope.ok();\n },\n function(errorResponse) {\n growl.error($rootScope.getErrorMessage(errorResponse,'PUBLICATION_FAILED'));\n });\n }\n\n function getFilteredDestinations() {\n var ele_org = document.getElementById('organizationsList');\n var ele_ch = document.getElementById('communicationChannelList');\n var scope_org = angular.element(ele_org).scope();\n var scope_ch = angular.element(ele_ch).scope();\n var destinations = [];\n if (scope_org && !_.isEmpty(scope_org.filteredOrganizations)) {\n destinations = scope_org.filteredOrganizations;\n }\n if (scope_ch && !_.isEmpty(scope_ch.filteredChannels)) {\n destinations = destinations.concat(scope_ch.filteredChannels);\n }\n return destinations;\n }\n\n function getSelectedPublicationDestinations(organizations, communicationChannels) {\n var mapOrganizationPublication = function(organization) {\n return {\n destinationId: organization.organizationId,\n destinationType: \"IN_PLATFORM\"\n };\n };\n var mapChannelPublication = function(channel) {\n return {\n destinationId: channel.id,\n destinationType: \"COMMUNICATION_CHANNEL\",\n subDestination: channel.subDestinationKey\n };\n };\n\n var organizationDestinations = _(organizations)\n .filter('isSelected')\n .map(mapOrganizationPublication)\n .value();\n var channelDestinations = _(communicationChannels)\n .filter('isSelected')\n .map(mapChannelPublication)\n .value();\n\n return organizationDestinations.concat(channelDestinations);\n }\n\n $scope.flterChanged = function() {\n $timeout(function() {\n $scope.selectionUpdated(true);\n });\n };\n\n $scope.selectionUpdated = function(searchTextChanged) {\n var recipients = getFilteredDestinations();\n allRecipientsSelected = _.every(recipients, function(r) {\n return r.isSelected;\n });\n if (!searchTextChanged && allRecipientsSelected != $scope.settings.allRecipientsSelected) {\n var allRecipients = $scope.organizations.concat($scope.communicationChannels);\n for (var i = 0; i < allRecipients.length; i++) {\n if (recipients.indexOf(allRecipients[i]) < 0) {\n allRecipients[i].isSelected = false;\n }\n }\n }\n $scope.settings.allRecipientsSelected = allRecipientsSelected;\n };\n\n $scope.selectAllRecipients = function(isSelected) {\n var recipients = getFilteredDestinations();\n var allRecipients = $scope.organizations.concat($scope.communicationChannels);\n for (var i = 0; i < allRecipients.length; i++) {\n allRecipients[i].isSelected = false;\n }\n for (var j = 0; j < recipients.length; j++) {\n recipients[j].isSelected = isSelected;\n }\n };\n\n function doPublishItems(mode, dataToPublish) {\n if (mode === PublicationMode.DEPUBLISH) {\n DePublicationResource.depublish({}, dataToPublish,\n function() {\n growl.success(\"DEPUBLICATION_STARTED\");\n },\n function(response) {\n $scope.status = response.status;\n growl.error(\"DEPUBLICATION_FAILED\");\n });\n } else {\n PublicationResource.publish({}, dataToPublish,\n function() {\n growl.success(\"PUBLICATION_STARTED\");\n },\n function(response) {\n $scope.status = response.status;\n growl.error($rootScope.getErrorMessage(response, \"PUBLICATION_FAILED\"));\n });\n }\n }\n\n $scope.$on('confirmPublishItems', function(scope, itemSelection, mode, publicationDestinations, publicationValues) {\n var dataToPublish = {\n destinations: publicationDestinations,\n publicationValues: publicationValues\n };\n\n if (itemSelection.itemsQuery && itemSelection.itemsQuery.selectionId) {\n dataToPublish.selectionId = itemSelection.itemsQuery.selectionId;\n doPublishItems(mode, dataToPublish);\n } else {\n var selection = (itemSelection.itemsQuery && itemSelection.itemsQuery.primaryKeys) ?\n { primaryKeys: itemSelection.itemsQuery.primaryKeys } :\n itemSelection;\n SelectionResource.save(selection, function(response) {\n dataToPublish.selectionId = response.selectionId;\n doPublishItems(mode, dataToPublish);\n }, function(errorResponse) {\n growl.error($rootScope.getErrorMessage(errorResponse, \"PUBLICATION_FAILED\"));\n });\n }\n });\n\n $scope.onWizardInit = function () {\n\n var customPublicationService = $rootScope.getService(\"CustomPublicationSettings\");\n if (!_.isNil(customPublicationService)) {\n var selectedPublicationDestinations = getSelectedPublicationDestinations($scope.organizations, $scope.communicationChannels);\n if (!_.isNil(customPublicationService.filterPublicationTargets)) {\n selectedPublicationDestinations = customPublicationService.filterPublicationTargets(selectedPublicationDestinations, $scope.data.mode, $rootScope.user, $rootScope.organization);\n }\n if (!_.isNil(customPublicationService.selectPublicationTargets) && !_.isNull(customPublicationService.selectPublicationTargets(itemSelection.primaryKeys, selectedPublicationDestinations, $rootScope.user, $rootScope.organization))) {\n setTimeout(function() {\n $scope.$broadcast('goToStep', 1);\n }, 30);\n }\n }\n\n };\n });\n","angular.module('llax')\n .controller('ReceivedRequestInformationsController', ['$rootScope', '$scope', '$routeParams', '$location', '$translate',\n 'ReceivedRequestResource',\n function($rootScope, $scope, $routeParams, $location, $translate, ReceivedRequestResource) {\n\n function loadRequests() {\n ReceivedRequestResource.query({},\n function(requests) {\n $scope.requests = requests.map(function(request) {\n //create \"Date\" Object from Date String\n if (request.date !== undefined) {\n request.date = new Date(request.date);\n }\n return request;\n });\n },\n function(response) {}\n );\n }\n\n loadRequests();\n }\n ]);\n","angular.module('llax')\n.controller('RegistrationController',\n function ($location, $log, $rootScope, $route, $routeParams, $scope, $timeout, $translate, $q,\n HttpHeader, HttpStatus, SignupResource, StatusResource, UserResource, OrganizationResource) {\n\n $rootScope.isInRegistrationProcess = true;\n $scope.invitationError = null;\n $scope.HttpStatus = HttpStatus;\n $scope.loading = false;\n\n $scope.INVITATIONS_TYPE = {\n USER: 'user',\n ORGANIZATION: 'organization'\n };\n\n $scope.MODE = {\n LOADING: 'LOADING',\n COLLEAGUE: 'COLLEAGUE',\n ORGANIZATION: 'PARTNER_ORGANIZATION',\n NEW: 'NEW'\n };\n $scope.currentMode = $scope.MODE.LOADING;\n\n $scope.ORGANIZATION_SIGNUP_STEPS = {\n IDENTIFY_EMAIL: 'IDENTIFY_EMAIL',\n CREATE_USER: 'CREATE_USER',\n CREATE_ORG_ONLY: 'CREATE_ORG_ONLY',\n SUCCESS: 'SUCCESS'\n };\n\n $scope.COLLEAGUE_SIGNUP_STEPS = {\n IDENTIFY_EMAIL: 'IDENTIFY_EMAIL',\n CONFIRM: 'CONFIRM',\n CREATE_USER: 'CREATE_USER',\n SUCCESS: 'SUCCESS'\n };\n\n // Trying to pull registration params from the url queries\n $scope.invitationReference = $routeParams.ref;\n $scope.organizationName = $routeParams.organizationName;\n $scope.email = $routeParams.email;\n $scope.type = $routeParams.type;\n\n // Form and HTTP request map\n $scope.signupData = {\n companyName: $scope.organizationName\n };\n\n checkStatusAsync()\n .then(function() {\n init();\n })\n .catch(function() {\n // Nothing to do, registration is not allowed\n redirectToStartPage();\n });\n\n $scope.signup = function(signupData) {\n\n $scope.signupClicked = true;\n $scope.signupError = {};\n signupData.invitationReference = $scope.invitationReference;\n\n SignupResource.save({}, signupData,\n function(signupResponse) {\n $scope.signupComplete = true;\n $('span#signUpId').attr('data-lax-signup', signupResponse.id);\n $scope.signupData = {};\n },\n function(response) {\n $log.error(response);\n $scope.signupError = response;\n\n if (!_.isNil(response.data.data) && !_.isNil(response.data.data[0])) {\n $scope.signupErrorKey = response.data.key;\n $scope.signupErrorValue = {\n value: response.data.data[0]\n };\n } else if (!_.isNil(response.data.message)) {\n $scope.signupErrorKey = response.data.message;\n } else {\n $scope.signupErrorKey = 'SIGNUP.GENERIC_ERROR';\n }\n }\n ).$promise.finally(function() {\n $scope.signupClicked = false;\n });\n\n };\n\n $scope.notYourAccountClicked = function() {\n $scope.currentOrganizationSignupStep = $scope.ORGANIZATION_SIGNUP_STEPS.IDENTIFY_EMAIL;\n };\n\n $scope.acceptColleagueInvitation = function() {\n\n SignupResource.save({}, {\n invitationReference: $scope.invitationReference,\n companyName: $scope.organizationName,\n email: $scope.email\n }, function(result) {\n $scope.currentColleagueSignupStep = $scope.COLLEAGUE_SIGNUP_STEPS.SUCCESS;\n $timeout(function() {\n redirectToStartPage();\n }, 4000);\n }, function(error) {\n $log.error(error);\n if (error.data.message) {\n $scope.invitationError = $translate.instant(error.data.message);\n } else {\n $scope.invitationError = $translate.instant('SIGNUP.ERROR_GENERIC');\n }\n });\n };\n\n $scope.identifyEmailAddress = function() {\n\n if (_.isEmpty($scope.signupData.email)) {\n return;\n }\n\n checkUserIfExistsAsync($scope.signupData.email, $scope.invitationReference)\n .then(function(result) {\n\n if (result.userExists && !result.supportsMultiAccounts) {\n $scope.invitationError = $translate.instant('SIGNUP.ERROR_ACCOUNT_IS_LEGACY_IMPLEMENTATION');\n } else if (result.userExists) {\n $scope.currentOrganizationSignupStep = $scope.ORGANIZATION_SIGNUP_STEPS.CREATE_ORG_ONLY;\n } else {\n $scope.currentOrganizationSignupStep = $scope.ORGANIZATION_SIGNUP_STEPS.CREATE_USER;\n }\n })\n .catch(function(error) {\n\n $log.error(error);\n if (error.status === HttpStatus.NOT_FOUND) {\n $scope.invitationError = $translate.instant('SIGNUP.ERROR_INVITATION_EXPIRED');\n } else {\n $scope.invitationError = $translate.instant('SIGNUP.ERROR_GENERIC');\n }\n });\n };\n\n $scope.addNewOrganizationToAccount = function() {\n\n SignupResource.save({}, {\n invitationReference: $scope.invitationReference,\n companyName: $scope.signupData.companyName,\n email: $scope.signupData.email,\n companyEmail: $scope.signupData.companyEmail,\n companyWebsite: $scope.signupData.companyWebsite,\n companyAddress: $scope.signupData.companyAddress\n }, function() {\n $scope.currentOrganizationSignupStep = $scope.ORGANIZATION_SIGNUP_STEPS.SUCCESS;\n $timeout(function() {\n redirectToStartPage();\n }, 4000);\n }, function(error) {\n $log.error(error);\n });\n };\n\n $scope.shouldDisableOrganizationName = function() {\n // We disable the organization/company name when it's provided in the invitation URL\n return !_.isNil($scope.organizationName);\n };\n\n function checkUserIfExistsAsync(email, invitationReference) {\n\n var deferred = $q.defer();\n\n UserResource.existsUser({\n // FIXME: emailOrUsername: encodeURIComponent(email),\n emailOrUsername: email,\n invitationReference: invitationReference\n }, function(result) {\n deferred.resolve(result);\n }, function(error) {\n deferred.reject(error);\n });\n\n return deferred.promise;\n }\n\n function checkOrganizationIfExistsAsync(invitationReference) {\n\n var deferred = $q.defer();\n\n OrganizationResource.existsOrganization({\n invitationReference: invitationReference\n }, function(result) {\n deferred.resolve(result);\n }, function(error) {\n deferred.reject(error);\n });\n\n return deferred.promise;\n }\n\n function redirectToStartPage() {\n $location.path('/');\n }\n\n /**\n * Check if registration is allowed (no SSO).\n */\n function checkStatusAsync() {\n\n var deferred = $q.defer();\n StatusResource.get({},\n function(statusResponse, headers) {\n var isSSO = !_.isEmpty(headers(HttpHeader.SSO_POST)) || !_.isEmpty(headers(HttpHeader.SSO_REDIRECT));\n if (isSSO) {\n deferred.reject();\n } else {\n deferred.resolve();\n }\n },\n function(errorResponse) {\n var isSSO = !_.isEmpty(errorResponse.headers(HttpHeader.SSO_POST)) || !_.isEmpty(errorResponse.headers(HttpHeader.SSO_REDIRECT));\n if (isSSO) {\n deferred.reject();\n } else {\n deferred.resolve();\n }\n }\n );\n\n return deferred.promise;\n }\n\n function init() {\n\n if (_.isEmpty($scope.invitationReference)) {\n\n // No invitation reference => traditional signup\n $scope.currentMode = $scope.MODE.NEW;\n\n } else if ($scope.type === $scope.INVITATIONS_TYPE.ORGANIZATION) {\n\n checkOrganizationIfExistsAsync($scope.invitationReference)\n .then(function(result) {\n if (result.organizationExists) {\n // Organization exists, then convert the current invitation\n // to a COLLEAGUE invitation.\n $route.updateParams({ type: $scope.INVITATIONS_TYPE.USER });\n } else {\n $scope.currentMode = $scope.MODE.ORGANIZATION;\n $scope.currentOrganizationSignupStep = $scope.ORGANIZATION_SIGNUP_STEPS.IDENTIFY_EMAIL;\n }\n })\n .catch(function(error) {\n\n $log.error(error);\n if (error.status === HttpStatus.NOT_FOUND) {\n $scope.invitationError = $translate.instant('SIGNUP.ERROR_INVITATION_EXPIRED');\n } else {\n $scope.invitationError = $translate.instant('SIGNUP.ERROR_GENERIC');\n }\n });\n\n } else {\n // If the invitation type is for a colleague, we need\n // to find first if the user exists or not\n $scope.currentMode = $scope.MODE.COLLEAGUE;\n $scope.loading = false;\n $scope.currentColleagueSignupStep = $scope.COLLEAGUE_SIGNUP_STEPS.IDENTIFY_EMAIL;\n // figure out if user exists or not\n checkUserIfExistsAsync($scope.email, $scope.invitationReference)\n .then(function(result) {\n\n if (result.userExists && !result.supportsMultiAccounts) {\n $scope.invitationError = $translate.instant('SIGNUP.ERROR_ACCOUNT_IS_LEGACY_IMPLEMENTATION');\n } else if (result.userExists) {\n $scope.currentColleagueSignupStep = $scope.COLLEAGUE_SIGNUP_STEPS.CONFIRM;\n } else {\n $scope.signupData.email = $scope.email;\n $scope.currentColleagueSignupStep = $scope.COLLEAGUE_SIGNUP_STEPS.CREATE_USER;\n }\n })\n .catch(function(error) {\n\n $log.error(error);\n if (error.status === HttpStatus.NOT_FOUND) {\n $scope.invitationError = $translate.instant('SIGNUP.ERROR_INVITATION_EXPIRED');\n } else {\n $scope.invitationError = $translate.instant('SIGNUP.ERROR_GENERIC');\n }\n });\n }\n }\n\n});\n","angular.module('llax')\n .controller('ReleaseNotesController', function ($modal, $scope, ReleaseNotesResource) {\n\n var ReleaseNotesModalController = function($modalInstance, $scope, $rootScope) {\n ReleaseNotesResource.get(function(response) {\n $scope.releaseNotes = response;\n });\n $scope.close = function() {\n $modalInstance.close();\n };\n };\n\n var d = new Date();\n var year = d.getFullYear();\n $scope.footerCopyright = \"\\u00A9 2014-\" + year;\n\n $scope.openReleaseNotes = function() {\n $modal.open({\n templateUrl: 'tpl/release-notes.tpl.html',\n controller: ReleaseNotesModalController,\n backdrop: true,\n windowClass: 'publish-modal'\n });\n };\n\n }\n);\n","angular.module('llax')\n .controller('ReportsController',\n function($scope, $translate, $modal, $q, uiGridConstants, ExportSummaryResource, JobResource, FeatureToggleService, growl) {\n\n var jobColumnDefs = [{\n field: 'schedule.startDateTime',\n displayName: $translate.instant('ITEM_LIBRARY_PUBLISH.attribute.startDateTime'),\n headerTooltip: true,\n cellFilter: \"date:'medium'\",\n cellClass: 'text-center',\n width: 140,\n sort: {\n direction: uiGridConstants.DESC,\n priority: 0\n }\n }, {\n field: 'name',\n displayName: $translate.instant('NAME'),\n headerTooltip: true,\n cellTooltip: true,\n minWidth: 120\n }, {\n field: 'schedule.nextRunDateTime',\n displayName: $translate.instant('ITEM_LIBRARY_PUBLISH.attribute.nextRunDateTime'),\n headerTooltip: true,\n cellFilter: \"date:'medium'\",\n cellClass: 'text-center',\n width: 140,\n sort: {\n direction: uiGridConstants.ASC,\n priority: 1\n }\n }, {\n field: 'format',\n displayName: $translate.instant('EXPORT.MAPPING_PROFILES.LABEL'),\n headerTooltip: true,\n cellTooltip: true,\n cellTemplate: '
    \\n' +\n '{{COL_FIELD.split(\"__mappingname__=\")[1]}}\\n' +\n '
    ',\n width: 140\n }, {\n field: 'emailRecipients',\n displayName: $translate.instant('MESSAGING.RECIPIENT'),\n headerTooltip: true,\n cellTooltip: true,\n cellTemplate: '
    \\n' +\n '{{COL_FIELD.join(\\', \\')}}\\n' +\n '
    ',\n width: 180\n }, {\n field: 'schedule.active',\n displayName: $translate.instant('ACTIVE'),\n headerTooltip: true,\n headerCellClass: 'text-center',\n cellClass: 'text-center',\n cellTemplate: '
    \\n' +\n '\\n' +\n '
    ',\n width: 60\n }, {\n field: 'schedule.status',\n displayName: $translate.instant('STATUS'),\n headerTooltip: true,\n headerCellClass: 'text-center',\n cellClass: 'text-center',\n cellTemplate: '
    \\n' +\n '\\n' +\n '{{row.entity.schedule.status | translate}}\\n' +\n '\\n' +\n '
    ',\n width: 100\n }, {\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n name: 'actions',\n headerCellClass: 'text-right',\n cellClass: 'text-right',\n enableColumnResizing: false,\n enableSorting: false,\n pinnedRight: true,\n width: 140,\n cellTemplate: '
    \\n' +\n '
    \\n' +\n '\\n' +\n '\\n' +\n '\\n' +\n '
    \\n' +\n '
    '\n }];\n\n var reportColumnDefs = [{\n field: 'creationDate',\n displayName: $translate.instant('CREATED_AT'),\n headerTooltip: true,\n width: 140,\n cellFilter: \"date:'medium'\"\n }, {\n field: 'creationUser',\n displayName: $translate.instant('USER'),\n headerTooltip: true,\n cellClass: 'text-center',\n width: 120,\n cellTemplate: '
    \\n' +\n ' {{::grid.appScope.getUserName(COL_FIELD)}}\\n' +\n '
    '\n }, {\n field: 'name',\n displayName: $translate.instant('NAME'),\n headerTooltip: true,\n minWidth: 140\n }, {\n field: 'format',\n displayName: $translate.instant('FORMAT'),\n headerTooltip: true,\n minWidth: 160\n }, {\n field: 'status',\n displayName: $translate.instant('STATUS'),\n headerTooltip: true,\n width: 100,\n cellClass: 'text-center',\n cellTemplate: '
    \\n' +\n '\\n' +\n '{{row.entity.status | translate}}\\n' +\n '\\n' +\n '
    '\n }, {\n field: 'actions',\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n width: 100,\n headerCellClass: 'text-right',\n cellClass: 'text-right',\n pinnedRight: true,\n cellTemplate: '
    \\n' +\n '
    \\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    \\n' +\n '
    '\n }];\n\n function loadReports() {\n return ExportSummaryResource.query({\n type: 'EXPORT',\n status: 'FINISHED,ERROR'\n },\n function(response) {\n $scope.reports = response;\n _.forEach($scope.reports, function(entry) {\n var job = _.find($scope.jobs, {\n id: entry.jobId\n });\n entry.creationUser = '';\n entry.name = job ? job.name : '';\n });\n },\n function(response) {\n $scope.reports = [];\n }\n );\n }\n\n function loadExportJobs() {\n return JobResource.query({\n type: 'EXPORT'\n }, function(response) {\n $scope.jobs = response;\n }, function(response) {\n $scope.jobs = [];\n });\n }\n\n $scope.jobGridOptions = {\n data: 'jobs',\n columnDefs: jobColumnDefs,\n enableColumnMenus: false\n };\n\n $scope.gridOptions = {\n data: 'reports',\n columnDefs: reportColumnDefs,\n enableColumnMenus: false\n };\n\n $scope.createReport = function() {\n var modalInstance = $modal.open({\n templateUrl: 'tpl/create-report-modal.tpl.html',\n controller: 'EditReportController',\n backdrop: true,\n windowClass: 'publish-modal',\n resolve: {\n data: {}\n }\n });\n modalInstance.result.then(function(foo) {\n console.log('Saved');\n }, function() {\n console.log('Modal dismissed..');\n });\n };\n\n $scope.toggleActive = function(job) {\n var newJob = angular.copy(job);\n newJob.type = 'EXPORT';\n newJob.schedule.active = !newJob.schedule.active;\n JobResource.save(newJob, function(response) {\n angular.extend(job, response);\n });\n };\n\n $scope.runJob = function(entity) {\n JobResource.run({\n jobId: entity.id\n }, function(response) {\n growl.success(\"Report started successfully!\");\n }, function(errorResponse) {\n growl.success(\"Report could not be run!\");\n });\n };\n\n $scope.deleteJob = function(entity) {\n JobResource.delete({\n jobId: entity.id\n }, function(response) {\n growl.success(\"Report deleted successfully!\");\n _.remove($scope.jobs, {\n id: entity.id\n });\n }, function(errorResponse) {\n growl.error(\"Report could not be deleted!\");\n });\n };\n\n $scope.editJob = function(entity) {\n var modalInstance = $modal.open({\n templateUrl: 'tpl/edit-report-modal.tpl.html',\n controller: 'EditReportController',\n backdrop: true,\n resolve: {\n data: function() {\n return entity;\n }\n }\n });\n modalInstance.result.then(function(foo) {\n console.log('Saved');\n }, function() {\n console.log('Modal dismissed..');\n });\n };\n\n (function init() {\n if (FeatureToggleService.checkFeatureEnabled('reports')) {\n $q.all([\n loadExportJobs().$promise,\n loadReports().$promise\n ]).then(function(data) {\n $scope.isLoading = false;\n });\n }\n })();\n }\n );\n","angular.module('llax')\n .controller('RequestsController',\n function($rootScope, $scope, $routeParams, $location, ReceivedRequestResource, SentRequestResource, growl) {\n\n function loadRequestFromSupplier() {\n SentRequestResource.query({\n requestId: $routeParams.requestId\n },\n function(request) {\n if (request != undefined && request.length > 0) {\n //On receiver Side there is always only one element in the list for a request\n $scope.requestFromSupplier = request[0];\n }\n },\n function(response) {});\n }\n\n loadRequestFromSupplier();\n\n $scope.sendAnswer = function() {\n var data = $scope.requestFromSupplier.questions;\n ReceivedRequestResource.save({\n requestId: $routeParams.requestId\n }, {\n questions: data\n },\n function(response) {\n $location.path(\"received-requests\");\n growl.success(\"REQUEST.ANSWER_CONFIRMATION\");\n\n },\n function(response) {});\n\n };\n\n $scope.cancel = function() {\n $location.path(\"received-requests\");\n };\n }\n );\n","angular.module('llax')\n.controller('ResetPasswordController', ['$rootScope','$scope', '$http', '$location', 'ConfirmResetPasswordResource', 'StatusResource', '$routeParams', '$route',\n function ($rootScope, $scope, $http, $location, ConfirmResetPasswordResource, StatusResource, $routeParams, $route) {\n\n $scope.keyValid = true;\n $scope.confirmed = false;\n $scope.status = '';\n\n $scope.redirectToLogin = function() {\n $location.path('/login').replace();\n };\n\n ConfirmResetPasswordResource.get({}, $routeParams,\n function(loginResponse) {\n console.log(\"confirm-success\");\n $scope.keyValid = true;\n },\n function(response) {\n $scope.keyValid = false;\n console.log(\"confirm-failed\");\n });\n\n $scope.confirmResetPassword = function(resetPasswordData) {\n ConfirmResetPasswordResource.save($routeParams, resetPasswordData,\n function(response) {\n $scope.keyValid = true;\n $scope.confirmed = true;\n },\n function(response) {\n scope.status = response.status;\n if (response.status == '404') {\n $scope.keyValid = false;\n } else {\n $scope.keyValid = true;\n }\n });\n };\n }\n ]);\n","angular.module('llax')\n .controller('SearchCategoryController',\n function($rootScope, $scope, $location) {\n\n $scope.queryLeafCategories = function(value, limit) {\n return $rootScope.queryCategories(value, null, null, true, limit);\n };\n\n $scope.searchCategory = null;\n\n $scope.browseCategory = function(category) {\n $location.path('/browse').search('category', category.id);\n $scope.searchCategory = null;\n };\n\n });\n","angular.module('llax')\n .controller('SendRequestsController',\n function($rootScope, $scope, $location, ContactsResource, SentRequestResource, growl) {\n\n $scope.partners = {};\n $scope.partners.selectedBusinessPartners = [];\n $scope.businessPartners = [];\n\n $scope.form = {\n questions: []\n };\n\n $scope.form.questions.push({});\n\n $scope.addQuestion = function() {\n $scope.form.questions.push({});\n };\n\n $scope.sendRequest = function() {\n\n //create Array of ids of selected Organizations:\n var recipients = $scope.partners.selectedBusinessPartners.map(function(contact) {\n return contact.id;\n });\n\n $scope.form.recipients = recipients;\n\n SentRequestResource.save($scope.form,\n function(response) {\n console.log($scope.form);\n growl.success(\"REQUEST.SUCCESSFULLY_SENT\");\n $location.path(\"sent-requests\");\n },\n function(response) {});\n\n };\n\n $scope.cancel = function() {\n $location.path(\"sent-requests\");\n };\n\n ContactsResource.query({},\n function(contacts) {\n contacts = contacts.filter(function(contact) {\n return contact.organizationId != undefined;\n });\n $scope.businessPartners = contacts.map(function(contact) {\n return {\n id: contact.id,\n text: contact.name\n };\n });\n },\n function(response) {}\n );\n }\n );\n","angular.module('llax')\n .controller('SentRequestsController',\n function($rootScope, $scope, $location, $translate, SentRequestResource, $modal) {\n\n function loadRequests() {\n SentRequestResource.query({},\n function(requests) {\n $scope.requests = _.map(requests, function(request) {\n request.date = new Date(request.date);\n request.progressTooltip = $translate.instant('REQUEST.PROGRESS.TOOLTIP', {count: request.alreadyAnswered, total: request.numberOfRecipients});\n return request;\n });\n });\n }\n\n $scope.getDownloadLink = function(request) {\n return lax_rest_url('requestforinformation/download/' + request.id);\n };\n\n var CatalogAnswers = /*@ngInject*/ function($rootScope, $scope, $modalInstance, $translate, requestId) {\n\n $scope.loadAnswers = function(requestId) {\n SentRequestResource.query({\n requestId: requestId\n },\n function(requests) {\n $scope.requests = requests;\n });\n };\n\n $scope.loadAnswers(requestId);\n\n $scope.close = function() {\n $modalInstance.dismiss('cancel');\n };\n $scope.translate = function(string) {\n return $translate.instant(string);\n };\n };\n\n $scope.viewAnswers = function(requestId) {\n var modalInstance = $modal.open({\n templateUrl: 'tpl/catalog-answers-modal.tpl.html',\n controller: CatalogAnswers,\n resolve: {\n requestId: function() {\n return requestId;\n }\n }\n });\n };\n\n $scope.newRequestInformation = function() {\n $location.path(\"request-information\");\n };\n\n (function init() {\n $rootScope.loadContacts();\n loadRequests();\n })();\n });\n","angular.module('llax')\n.controller('SessionsController',\n function ($controller, $location, $log, $modal, $rootScope, $scope, $timeout, growl,\n Auth, LoginResource, ResendMailResource, ResetPasswordResource, StatusResource,\n UserPreferencesResource) {\n\n $controller('NavigationController', {$scope: $scope});\n\n var MAX_LOGIN_RETRIES = 10;\n var inRevalidationMode = $location.path() === '/revalidateAccount';\n\n function redirectToStartPage() {\n $location.path('/');\n }\n\n function redirectToDeeplink(link) {\n $location.path(link);\n }\n\n $scope.goToRegistration = function(invitationReference, email, organizationName) {\n $location.path('/register');\n };\n\n var ExecuteResetPassword = /*@ngInject*/ function($scope, $modalInstance, data) {\n\n $scope.resetPasswordData = {\n email: data.email\n };\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.resetPassword = function(resetPasswordData) {\n $scope.emailSent = false;\n\n if (!$scope.resetPasswordPending) {\n\n $scope.resetPasswordPending = true;\n\n ResetPasswordResource.save({}, resetPasswordData,\n function(resetPasswordResponse) {\n $('button#reset-password-submit').attr('data-reset-password', resetPasswordResponse.id);\n $scope.emailSent = true;\n $scope.resetPasswordPending = false;\n $scope.status = undefined;\n $scope.resetPasswordData = {};\n },\n function(response) {\n //error callback\n $scope.resetPasswordPending = false;\n $scope.status = response.status;\n });\n }\n };\n };\n\n $scope.openResetPasswordModal = function(email) {\n $modal.open({\n templateUrl: 'tpl/reset-password.tpl.html',\n controller: ExecuteResetPassword,\n resolve: {\n data: function() {\n return {\n email: email\n };\n }\n }\n });\n };\n\n $scope.resendConfirmationMail = function(email) {\n $modal.open({\n templateUrl: 'tpl/resend-confirmation-mail.tpl.html',\n controller: ExecuteResendMail,\n resolve: {\n data: function() {\n return {\n email: email\n };\n }\n }\n });\n };\n\n var ExecuteResendMail = function($scope, $modalInstance, data) {\n\n $scope.resendMailData = {\n email: data.email\n };\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.resendMail = function(resendMailData) {\n $scope.emailSent = false;\n if (!$scope.resendMailPending) {\n $scope.resendMailPending = true;\n\n ResendMailResource.save(resendMailData,\n function(resendMailResponse) {\n $scope.emailSent = true;\n $('button#resend-mail-submit').attr('data-resend-confirmation-mail', resendMailResponse.id);\n $scope.resendMailPending = false;\n $scope.resendMailData = {};\n $scope.resendMailData.email = null;\n },\n function(response) {\n //error callback\n $scope.resendMailPending = false;\n });\n }\n };\n };\n\n $scope.loginClicked = false;\n $scope.login = function(login, password) {\n\n $scope.loginClicked = true;\n $scope.error = null;\n\n $log.debug(\"logging in as:\", login);\n\n var userdata = {\n 'login': login,\n 'password': password\n };\n LoginResource.save({}, userdata,\n function(loginResponse) {\n $log.debug(\"loginResponse:\", loginResponse);\n retryLogin(loginResponse, 0);\n UserPreferencesResource.get({}, function(response) {\n response = response.toJSON();\n angular.forEach(response, function(value, key) {\n localStorage.setItem(key, angular.toJson(value));\n });\n });\n },\n function(errorResponse) {\n $log.debug(\"login errorResponse:\", errorResponse);\n $scope.error = {\n status: errorResponse.status || 0,\n message: (errorResponse.data ? (errorResponse.data.message || errorResponse.data.data || errorResponse.statusText) : 'LOGIN_REQUEST_TIMEOUT')\n };\n $scope.loginClicked = false;\n }\n );\n };\n\n function retryLogin(loginResponse, retryCount) {\n\n if (retryCount > 0) {\n $log.info(\"retryLogin: #\" + retryCount);\n }\n\n StatusResource.get({},\n function(statusResponse) {\n doLogin(loginResponse);\n },\n function(statusErrorResponse) {\n\n if (retryCount >= MAX_LOGIN_RETRIES) {\n $scope.loginClicked = false;\n $scope.error = {\n status: 0,\n message: 'LOGIN_REQUEST_TIMEOUT'\n };\n return;\n }\n\n $timeout(function() {\n retryLogin(loginResponse, retryCount + 1);\n }, 3000);\n\n }\n );\n\n }\n\n function doLogin(loginResponse) {\n\n $scope.error = null;\n\n $rootScope.userId = loginResponse.id;\n $rootScope.$broadcast('updateUserData');\n $rootScope.initOrganization()\n .then(function() {\n if ($rootScope.deeplink) {\n redirectToDeeplink($rootScope.deeplink);\n } else {\n redirectToStartPage();\n if (inRevalidationMode === true) {\n growl.success(\"REVALIDATION.SUCCESSFUL\");\n }\n }\n\n $scope.loginClicked = false;\n });\n\n }\n\n if (Auth.isLoggedIn) {\n $log.info(\"Already logged in\");\n redirectToStartPage();\n return;\n }\n\n StatusResource.get({},\n function(statusResponse, headers) {\n // When 'get' returns successfully we are already logged in\n $log.info(\"Redirecting to start page\");\n redirectToStartPage();\n }\n );\n\n});\n","angular.module('llax')\n .controller('ShoppingCartController',\n function($routeParams, $scope, $location, $translate, ShoppingCartService) {\n\n $scope.query = {\n category: $routeParams.category\n };\n\n var columnDefs = [];\n\n $scope.$on('dataModelLoaded', function() {\n createCatalogTableColumnDefinition();\n });\n\n $scope.addSelectedItems = function() {\n var selectedItems = $scope.gridOptions.$gridScope.selectedItems;\n if (selectedItems) {\n angular.forEach(selectedItems, function(item) {\n ShoppingCartService.addItem(item);\n });\n }\n };\n\n $scope.addToShoppingCart = function(item) {\n ShoppingCartService.addItem(item);\n };\n\n $scope.removeFromShoppingCart = function(item) {\n ShoppingCartService.removeItem(item);\n };\n\n $scope.clearShoppingCart = function() {\n var cartItems = $scope.shoppingCart.items;\n angular.forEach(cartItems, function(item) {\n $scope.removeFromShoppingCart(item);\n });\n };\n\n function createCatalogTableColumnDefinition() {\n columnDefs = ShoppingCartService.getColumnDefinitions();\n\n columnDefs.push({\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n name: 'actions',\n enableCellEdit: false,\n enableCellSelection: false,\n enableSorting: false,\n resizable: false,\n width: 80,\n cellTemplate: '' +\n ''\n }\n );\n\n $scope.gridOptions = {\n data: 'shoppingCart.items',\n showSelectionCheckbox: false,\n enableCellSelection: false,\n enableCellEdit: true,\n enableColumnResize: true,\n enableColumnMenus: false,\n multiSelect: false,\n selectWithCheckboxOnly: false,\n columnDefs: columnDefs,\n rowHeight: 34,\n afterSelectionChange: $scope.afterSelectionChange\n };\n\n $scope.$on('uiGridEventEndCellEdit', function(event) {\n ShoppingCartService.updateTotalPrice(event.targetScope.row.entity);\n });\n\n }\n\n $scope.toDetailPage = function(item){\n $location.path('/items/detail/' + item.primaryKey);\n };\n\n $scope.shoppingCart = ShoppingCartService.shoppingCart;\n\n createCatalogTableColumnDefinition();\n\n }\n );\n","angular.module('llax')\n .controller('showImageController', ['$rootScope', '$scope', '$document', '$modalInstance', '$http', '$translate', '$filter', '$parse', 'growl', 'FileUploader', 'filePreviewData',\n function($rootScope, $scope,$document, $modalInstance, $http, $translate, $filter, $parse, growl, FileUploader, filePreviewData) {\n $scope.filePreviewData = filePreviewData;\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n $rootScope.additionalModalOpen = false;\n $document.off('keydown', keyPressed);\n };\n\n function keyPressed($event) {\n if ($event.keyCode == 27) {\n $event.preventDefault();\n $scope.cancel();\n }\n }\n $document.on('keydown', keyPressed);\n\n }]);\n","angular.module('llax')\n .controller('showYoutubeController', ['$rootScope', '$scope', '$document', '$modalInstance', '$http', '$translate', '$filter', '$parse', 'growl', 'FileUploader', 'videoId',\n function($rootScope, $scope,$document, $modalInstance, $http, $translate, $filter, $parse, growl, FileUploader, videoId) {\n $scope.youtubeUrl = \"https://www.youtube.com/embed/\" + videoId + \"?&autoplay=1\";\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n $rootScope.additionalModalOpen = false;\n $document.off('keydown', keyPressed);\n };\n\n function keyPressed($event) {\n if ($event.keyCode == 27) {\n $event.preventDefault();\n $scope.cancel();\n }\n }\n $document.on('keydown', keyPressed);\n\n }]);\n","angular.module('llax')\n .controller('SubscriptionsController', function($controller, $location, $modal, $rootScope, $scope, $timeout, $translate, growl, HttpStatus, SubscriptionResource) {\n\n $rootScope.loadDataModel();\n\n $scope.loadExistingSubscriptions = function(channelId) {\n $scope.subscriptions = SubscriptionResource.query({\n channelId: channelId\n });\n };\n\n $scope.toggleShowSubscriptionDetails = function(channel) {\n channel.showDetails.subscriptions = !channel.showDetails.subscriptions;\n if (channel.showDetails.subscriptions) {\n $scope.loadExistingSubscriptions(channel.id);\n }\n };\n\n $scope.newSubscription = function(channel) {\n var subscriptionDescription = {\n 'category__': $scope.getSubscriptionCategory(channel),\n 'channelId': channel.id,\n 'subscriptions': []\n };\n $scope.subscriptionValidations = [];\n SubscriptionResource.query({\n 'channelId': channel.id\n },\n function(response) {\n for (var i = 0; i < response.length; i++) {\n var subscription = response[i];\n var validations = {};\n if (subscription.validation__ && subscription.validation__.length > 0) {\n for (var ii = 0; ii < subscription.validation__.length; ii++) {\n var validation = subscription.validation__[ii];\n var error = validation.split(\":\");\n validations[error[0]] = [];\n validations[error[0]].push(error[1]);\n }\n }\n $scope.subscriptionValidations[i] = validations;\n subscriptionDescription.subscriptions[i] = subscription;\n }\n },\n function(response) {\n $rootScope.error = response.data;\n $scope.status = response.status;\n growl.error(\"SUBSCRIPTIONS.LOAD_ERROR_MESSAGE\");\n }\n );\n var modal = $modal.open({\n templateUrl: 'tpl/edit-subscription.tpl.html',\n controller: 'EditSubscriptionsController',\n windowClass: 'communicationchannel-modal',\n scope: $scope,\n resolve: {\n subscriptionDescription: function() {\n return subscriptionDescription;\n },\n channel: function() {\n return channel;\n }\n }\n });\n modal.result.then(function(subscriptionDescription) {\n $scope.saveSubscription(subscriptionDescription);\n }).finally(function() {\n $location.displayUrl(\"/communicationchannels\");\n });\n\n $location.displayUrl(\"/communicationchannels/\" + channel.id + \"/subscriptions\");\n };\n\n $scope.saveSubscription = function(subscriptionDescription) {\n SubscriptionResource.save({}, subscriptionDescription,\n function(subscription) {\n growl.success(\"SAVE_SUCCESS_MESSAGE\");\n // $modalInstance.close(subscription);\n },\n function(response) {\n $scope.status = response.status;\n if (response.status === HttpStatus.BAD_REQUEST) {\n $scope.errorMessage = $translate.instant(response.data.message, response.data.parameters);\n }\n }\n );\n };\n }\n);\n","angular.module('llax')\n .controller('SupplierItemReviewController',\n function ($attrs, $log, $scope, $timeout, $q, CommunicationChannelResource, ContactsResource, GdsnPartiesResource, SupplierReviewResource) {\n var GLN_PATTERN_LENGTH = 13;\n\n $scope.reviews = [];\n $scope.reviewErrors = {};\n $scope.reviewWarnings = {};\n $scope.temporaryModelForPanels = [];\n $scope.gdsnParties = [];\n $scope.showErrors = false;\n $scope.showWarnings = false;\n $scope.VIEW_BY_ERRORS_WARNINGS = 'ByErrorsWarnings';\n $scope.VIEW_BY_REVIEWER = 'ByReviewer';\n $scope.view = $scope.VIEW_BY_REVIEWER;\n $scope.loading = true;\n\n // Ugly hack: getting dependencies from parent controller if not available in injected $attrs\n $scope.itemPrimaryKey = $attrs.itemPrimaryKey || $scope.item.primaryKey__;\n $scope.publicationDestination = $attrs.publicationDestination;\n $scope.reviewer = $attrs.reviewer;\n\n $scope.organizations = [];\n $scope.channels = [];\n\n (function init() {\n // There are 3 possible ways to fetch a reviewer information:\n // 1- If it's an in-platform review i.e. `review.reviewerId` is set, then the reviewer is an active organization.\n // 2- If that wasn't the case, the review might be from one of the communication channels.\n // 3- Communication channels might not define all the sub channels, for example in GDSN. Therefor, if all previous attempts fail,\n // we try to fetch the information from the available GDSN parties.\n\n var reqObj = { primaryKey: $scope.itemPrimaryKey };\n if (!_.isNil($scope.publicationDestination)) {\n reqObj.publicationDestination = $scope.publicationDestination;\n }\n if (!_.isNil($scope.reviewer)) {\n reqObj.reviewer = $scope.reviewer;\n }\n\n SupplierReviewResource.get(reqObj, {},\n function (response) {\n $scope.reviews = response;\n $q.all([\n loadAllVisibleOrganizations(),\n loadCommunicationChannels()\n ]).then(function() {\n loadReviewersDescriptions();\n return loadGDSNReviewerDescriptions($scope.reviews);\n }).then(function() {\n prepareErrorsAndWarnings();\n $timeout(function() {\n $scope.loading = false;\n }, 0);\n });\n });\n\n })();\n\n function prepareErrorsAndWarnings() {\n var reviewEntityAttributes = ['channelId', 'combinedComment', 'comment', 'customValues', 'date',\n 'messagingCreatorType', 'primaryKey', 'reviewStatus', 'reviewer', 'supplier', 'supplierId', 'reviewer__'];\n\n _.forEach($scope.reviews, function (review) {\n _.forEach(review.reviewErrors, function (error) {\n var sanitizedReview = _.pick(review, reviewEntityAttributes);\n if ($scope.reviewErrors[error]) {\n $scope.reviewErrors[error].push(sanitizedReview);\n } else {\n $scope.reviewErrors[error] = [sanitizedReview];\n }\n });\n\n _.forEach(review.reviewWarnings, function (warning) {\n var sanitizedReview = _.pick(review, reviewEntityAttributes);\n if ($scope.reviewWarnings[warning]) {\n $scope.reviewWarnings[warning].push(sanitizedReview);\n } else {\n $scope.reviewWarnings[warning] = [sanitizedReview];\n }\n });\n });\n }\n\n function loadReviewersDescriptions() {\n _.forEach($scope.reviews, function(review) {\n getReviewerDescription(review);\n });\n }\n\n function loadCommunicationChannels() {\n var deferred = $q.defer();\n\n CommunicationChannelResource.query({},\n function (response) {\n $scope.channels = response;\n deferred.resolve();\n },\n function(response){\n $log.error(response);\n deferred.resolve();\n });\n\n return deferred.promise;\n }\n\n function loadAllVisibleOrganizations() {\n var deferred = $q.defer();\n\n ContactsResource.query({},\n function (response) {\n $scope.organizations = response;\n deferred.resolve();\n },\n function(response) {\n $log.error(response);\n deferred.resolve();\n }\n );\n\n return deferred.promise;\n }\n\n $scope.toggleErrors = function() {\n $scope.showErrors = !$scope.showErrors;\n };\n\n $scope.toggleWarnings = function() {\n $scope.showWarnings = !$scope.showWarnings;\n };\n\n $scope.getCount = function (obj) {\n return _.keys(obj).length;\n };\n\n $scope.getAggregatedComments = function (reviews) {\n return _.filter(reviews, function(review) {\n if (review.comment) {\n return review;\n } else {\n return false;\n }\n });\n };\n\n $scope.getReviewerName = function(review) {\n if (!_.isEmpty(review.reviewer__.name)) {\n return review.reviewer__.name;\n } else if (!_.isNil($scope.gdsnParties[review.reviewer__.id])){\n return $scope.gdsnParties[review.reviewer__.id].name;\n }\n\n return null;\n };\n\n $scope.scrollToComment = function($event, id) {\n\n $event.preventDefault();\n\n var commentSectionId = 'comments-' + id;\n document.getElementById(commentSectionId).scrollIntoView({\n behavior: 'smooth'\n });\n document.getElementById(commentSectionId).classList.add('review-comment-highlighted');\n $timeout(function() {\n document.getElementById(commentSectionId).classList.remove('review-comment-highlighted');\n }, 1000);\n\n };\n\n function getReviewerDescription(review) {\n\n review.reviewer__ = {};\n\n if (!_.isNil(review.reviewerId)) {\n review.reviewer__.id = review.reviewId;\n var organization = _.find($scope.organizations, function (entry) {\n // In-platform publications can only exist for organization contacts,\n // thus we only need to compare the (optional) property 'organizationId'!\n return entry.organizationId == review.reviewerId;\n });\n\n if (!_.isNil(organization)) {\n review.reviewer__.name = organization.name;\n }\n } else {\n review.reviewer__.id = review.reviewer;\n var channel = _.find($scope.channels, function (channel) {\n if (!_.isNil(channel.subDestinations) && !_.isNil(channel.subDestinations[review.reviewer])) {\n return true;\n }\n });\n\n if (!_.isNil(channel)) {\n review.reviewer__.name = channel.subDestinations[review.reviewer];\n }\n }\n }\n\n function loadGDSNReviewerDescriptions(reviews) {\n var idsSet = [];\n\n _.forEach(reviews, function(review) {\n if (!review.reviewer__.name && review.reviewer__.id.length == GLN_PATTERN_LENGTH) {\n // We haven't found a name for it, might try with GDSN parties\n idsSet.push(review.reviewer__.id);\n }\n });\n\n var deferred = $q.defer();\n getReviewerDescriptionFromGDSNParties(idsSet, function(response) {\n $scope.gdsnParties = _.mapKeys(response, 'gln');\n deferred.resolve();\n });\n\n return deferred.promise;\n }\n\n function getReviewerDescriptionFromGDSNParties(ids, callback) {\n GdsnPartiesResource.get({\n gln: ids\n }, function(response) {\n callback(response);\n }, function(error) {\n $log.error(error);\n callback([]);\n });\n }\n }\n );\n","angular.module('llax')\n .controller('SupportCtrl', ['$window',\n function($window) {\n $window.location.href = lax_rest_url('support');\n }\n ]);\n","angular.module('llax')\n .controller('TaskListController',\n function($rootScope, $scope, $location, $routeParams, $modal, $controller, $window, $timeout, $translate, growl, HttpHeader, QueryTasksResource, TaskResource, TaskListsResource, Auth) {\n\n $controller('EditorContainerController', {\n $scope: $scope\n });\n\n var LocalStorage = $window.localStorage;\n var TASK_SETTINGS = 'tasks.settings';\n var TRANSLATION_UNASSIGNED = 'TASK.UNASSIGNED';\n\n function setLocalStorageSettings(key, value) {\n var settings = angular.fromJson(LocalStorage.getItem(TASK_SETTINGS)) || {};\n settings[$scope.user.userId] = (settings[$scope.user.userId] || {});\n if (_.isNil(value)) {\n delete settings[$scope.user.userId].value;\n } else {\n settings[$scope.user.userId][key] = value;\n }\n LocalStorage.setItem(TASK_SETTINGS, angular.toJson(settings));\n }\n\n $scope.taskLists = [];\n $scope.filteredTasks = [];\n $scope.newTaskList = {};\n $scope.loadingTasks = false;\n $scope.filesSelected = false;\n $scope.editNewTaskList = false;\n $scope.limit = 20;\n\n $scope.usersWithUnassigned = angular.copy($rootScope.users);\n if (angular.isArray($scope.usersWithUnassigned)) {\n $scope.usersWithUnassigned.push({\n userId: '',\n displayName: $translate.instant(TRANSLATION_UNASSIGNED)\n });\n }\n\n var timeout;\n $scope.$watch('query.assignee', function(newVal, oldVal){\n var label = 'assignee';\n var prefix = 'tasks';\n if (newVal !== oldVal) {\n if (!_.isUndefined(timeout)) {\n $timeout.cancel(timeout);\n }\n timeout = $timeout(function () {\n if (!_.isNil(newVal)) {\n $location.displayUrl(prefix).search(label, newVal);\n }else {\n $location.search(label, null);\n }\n }, 1);\n }\n });\n\n $scope.hasTaskListDeletePermisson = function(list) {\n return Auth.hasTaskListPermission('delete', list);\n };\n\n $scope.dueDateFilter = function(data) {\n return !($scope.query.dueDate && data.dueDate && data.dueDate > Date.parse($scope.query.dueDate));\n };\n\n $scope.taskStatusFilter = function(data) {\n var taskList = $scope.getTaskList(data);\n if (taskList) {\n return !(!$scope.query.showClosed && data.taskStatus !== 'OPEN');\n } else {\n return true;\n }\n };\n\n function formatDateDiff(dateDiff) {\n var vdayDiff;\n var vhourDiff;\n var vminDiff;\n var key = '';\n\n vdayDiff = Math.floor(dateDiff / 1000 / 84600);\n vhourDiff = Math.floor(dateDiff / 1000 / 60 / 60);\n vminDiff = Math.floor(dateDiff / 1000 / 60);\n\n var params = {\n DAYS: vdayDiff,\n HOURS: vhourDiff,\n MINUTES: vminDiff\n };\n\n if (vhourDiff <= 0) {\n key = 'TIME.MINUTES';\n } else if (vhourDiff < 24) {\n key = 'TIME.HOURS';\n } else {\n key = 'TIME.DAYS';\n }\n\n return $rootScope.translate(key, key, params, \"messageformat\");\n }\n\n $scope.timePassed = function(createDate) {\n var currentTimestamp = new Date().getTime();\n var dateDiff = currentTimestamp - createDate;\n\n return formatDateDiff(dateDiff);\n };\n $scope.getTasksCount = function(taskList) {\n if (!taskList || !taskList.tasks || taskList.tasks.length == 0) {\n return '0';\n }\n var tasks = _.filter(taskList.tasks, { taskStatus: 'OPEN' });\n return (tasks.length >= $scope.limit && !taskList.params.allTasksLoaded) ?\n tasks.length + '+' :\n tasks.length;\n };\n\n $scope.resetQuery = function() {\n $scope.query = {};\n _.forEach($routeParams, function(value, key) {\n $location.search(key, null);\n });\n // Clear query in local storage\n setLocalStorageSettings('query', $scope.query);\n };\n\n $scope.updateQuery = function(key, value, takeValue) {\n if (value) {\n var val = 'true';\n if (takeValue) {\n val = value;\n }\n $location.search(key, val);\n } else {\n $location.search(key, null);\n }\n // Set query in local storage\n setLocalStorageSettings('query', $scope.query);\n };\n\n $scope.loadMore = function() {\n if ($scope.loadingTasks || !$scope.activeTaskList || $scope.activeTaskList.params.allTasksLoaded || $scope.locationChangeStart) {\n $scope.locationChangeStart = false;\n return;\n }\n var queryParams = getQuery();\n loadTasks($scope.activeTaskList, {\n append: true,\n queryParams: queryParams\n });\n };\n\n $scope.loadComments = function(taskId) {\n TaskResource.getComments({\n taskId: taskId\n }, function(response) {\n $scope.task.comments = response;\n });\n };\n\n $scope.getTaskList = function(task) {\n return _.find($scope.taskLists, {\n id: task.taskListId\n });\n };\n\n $scope.selectAllTasks = function(tasks) {\n _.forEach(tasks, function(task) {\n task.checked = true;\n });\n };\n\n $scope.closeSelectedTasks = function(tasks, $event) {\n var filteredTasks = _.filter(tasks, 'checked');\n if (filteredTasks.length < 1) {\n growl.warning('TASK.NO_TASKS_SELECTED');\n } else {\n _.forEach(filteredTasks, function(task) {\n $scope.closeTask(task);\n });\n }\n };\n\n $scope.$on('itemEditorClosed', function(event, result) {\n if (result && result.taskOptions && result.taskOptions.closeTask) {\n $scope.task.chosenTransition = result.taskOptions.transition;\n $scope.closeTask($scope.task);\n }\n });\n\n $scope.$on('deleteTaskList', function(event, taskList) {\n if (!taskList) return;\n TaskListsResource.delete({\n taskListId: taskList.id\n }, function(response) {\n loadTaskLists();\n growl.success('TASK.DELETE_TASKLIST.SUCCESS');\n }, function(err) {\n growl.error(\"TASKLISTS.DELETE.ERROR_MESSAGE_NOT_EMPTY\");\n });\n });\n\n $scope.createTask = function(taskListId) {\n $location.displayUrl(\"/tasks/new\");\n $location.search('taskListId', taskListId);\n var taskModal = $modal.open({\n templateUrl: 'tpl/tasks-create-task.tpl.html',\n controller: 'CreateTaskController',\n backdrop: true,\n resolve: {\n data: function() {\n return {\n taskLists: $scope.taskLists,\n taskListId: taskListId\n };\n }\n }\n });\n taskModal.result.then(function(task) {\n $scope.selectTaskList(_.find($scope.taskLists, { id: task.taskListId }));\n }, function() {\n console.log('Modal dismissed at: ' + new Date());\n }).finally(function() {\n $location.displayUrl(\"/tasks\");\n });\n };\n\n $scope.createTaskList = function(newTaskList) {\n if (!newTaskList.title) {\n growl.warning(\"TASK.MISSING_TASK_TITLE\");\n } else {\n var pathParams = {\n taskListId: newTaskList.id\n };\n\n TaskListsResource.save(pathParams, newTaskList, function(response) {\n $scope.newTaskList = {};\n $scope.editNewTaskList = false;\n growl.success(\"TASK.ADDED_TASK_LIST_SUCCESS_MESSAGE\");\n loadTaskLists();\n });\n }\n };\n\n $scope.deleteTaskList = function(list) {\n $modal.open({\n templateUrl: 'tpl/confirm-delete-tasklist-modal.tpl.html',\n controller: 'ModalInstanceCtrl',\n backdrop: true,\n resolve: {\n data: function() {\n return {\n list: list\n };\n }\n }\n });\n };\n\n $scope.$on('$locationChangeStart', function(event, newUrl) {\n $scope.locationChangeStart = true;\n if ($scope.activeTaskList) {\n loadTasks($scope.activeTaskList, { queryParams: getQuery(), force: true });\n }\n });\n\n function loadTaskLists() {\n return TaskListsResource.query({}, function(response) {\n $scope.taskLists = _.map(response, function(list) {\n list.params = {\n allTasksLoaded: false\n };\n list.tasks = loadTasks(list, { queryParams: getQuery(), force: true });\n return list;\n });\n });\n }\n\n $scope.selectTaskList = function(taskList) {\n $scope.activeTaskList = taskList || $scope.taskLists[0];\n setLocalStorageSettings('selectedTaskList', $scope.activeTaskList.id);\n var query = getQuery();\n for (var k in query) {\n if (_.isBoolean(query[k])) {\n query[k] = query[k] ? \"true\" : null;\n }\n }\n var search = angular.extend(query, {'selectedTaskList' : $scope.activeTaskList.id});\n $location.search(search);\n };\n\n $scope.closeTask = function(task) {\n if (task.transitions && !task.chosenTransition) {\n growl.error(\"TASK.CLOSE_TASK.FAILED_MESSAGE\");\n return;\n }\n task.taskStatus = 'FINISHED';\n updateTask(task);\n };\n\n $scope.getLocalUserName = function(userId){\n if (userId === '') {\n return $translate.instant(TRANSLATION_UNASSIGNED);\n }\n return $rootScope.getUserName(userId);\n };\n\n function updateTask(task) {\n TaskResource.save({\n taskId: task.id\n }, task, function(response) {\n task = response;\n var taskList = $scope.getTaskList(task);\n loadTasks(taskList, { force: true });\n growl.success(\"TASK.SAVE_TASK_SUCCESS_MESSAGE\");\n });\n }\n\n function getQuery() {\n var query = {};\n query = $location.search();\n query = angular.extend(\n {},\n query,\n _($scope.query)\n .omitBy(_.isNil) // remove null and undefined params\n .omitBy(function(val){ return val === false; }) //remove falsy params\n .omitBy(function (val, key) { //remove empty string params only if it's not assignee\n if (key !== 'assignee' && _.isEmpty(val)) {\n return true;\n }\n })\n .value()\n );\n return query;\n }\n\n function loadTasks(taskList, config) {\n if (!taskList) {\n return;\n }\n $scope.loadingTasks = true;\n config = config || {};\n var queryParams = angular.copy(config.queryParams) || {};\n if(!_.isNil(config.queryParams) && !config.queryParams.showClosed){\n queryParams.taskStatus = 'OPEN';\n }\n\n queryParams.limit = config.limit || $scope.limit;\n if (config.force) {\n taskList.params.allTasksLoaded = false;\n taskList.params.cursor = '';\n }\n\n QueryTasksResource.createCursorAwareResource(taskList.id, taskList.params.cursor)\n .query(queryParams, function(response, headers) {\n var cursor = headers(HttpHeader.MESSAGE_CURSOR);\n taskList.params.cursor = cursor || '';\n\n if (response.length === 0) {\n taskList.params.allTasksLoaded = true;\n taskList.tasks = config.force ? [] : taskList.tasks;\n } else if (config.force || _.isEmpty(taskList.params.cursor)) {\n taskList.tasks = response;\n } else if (config.append && taskList.tasks) {\n taskList.tasks = _.unionWith(taskList.tasks, response, function(arrVal, othVal) {\n return arrVal.id === othVal.id;\n });\n }\n _.forEach(taskList.tasks, function(t) {\n if (!_.isEmpty(t.assignee)) {\n var user = $rootScope.getUser(t.assignee);\n if (user) {\n t.displayName = user.displayName;\n }\n }\n });\n\n $scope.locationChangeStart = false;\n $scope.loadingTasks = false;\n });\n }\n\n (function init() {\n $rootScope.loadDataModel();\n var settings = angular.fromJson(LocalStorage.getItem(TASK_SETTINGS));\n if (settings) {\n settings = (settings[$scope.user.userId] || {});\n selectedTaskList = _.find($scope.taskLists, { id: settings.selectedTaskList });\n $scope.query = settings.query || {};\n }\n loadTaskLists().$promise.then(function(response) {\n var selectedTaskList;\n if (settings) {\n selectedTaskList = _.find($scope.taskLists, { id: settings.selectedTaskList });\n }\n $scope.selectTaskList(selectedTaskList);\n });\n\n var queryParamNames = ['assignee', 'author', 'dueDate', 'title'];\n\n _.forEach(queryParamNames, function(id) {\n if ($routeParams[id]) {\n $scope.query[id] = $routeParams[id];\n }\n });\n if ($routeParams.taskListId) {\n $scope.createTask($routeParams.taskListId);\n }\n if ($routeParams.taskId) {\n $scope.editTask($routeParams.taskId);\n }\n })();\n });\n","angular.module('llax')\n .controller('UploadsController', function($scope, $rootScope, $translate, $modal, $timeout, $filter, $dialogs, ImportResource, QueryImportResource,\n UploadMappingResource, RunMappingResource, growl, ChannelService, UsageLimitsResource, uiGridConstants, HttpHeader) {\n\n var IMPORT_GRID_STATES_KEY = \"import-grid-states\";\n var DEFAULT_GRID_STATE_KEY = \"default-state\";\n\n $rootScope.loadDataModel();\n $scope.entries = [];\n\n $scope.error = {\n key: \"attribute_required\",\n attribute: \"Category\"\n };\n\n ChannelService.register(ChannelService.ZIP_BOMB_DETECTED_EVENT);\n\n $scope.uploadFile = function() {\n return {\n url: lax_rest_url('gatherings'),\n filters: ['noImageFilter'],\n uploadSuccess: function(response) {\n growl.success(\"UPLOAD_SUCCESS_MESSAGE\");\n },\n uploadCancelled: function(response) {\n growl.error(\"UPLOAD_CANCELLED_MESSAGE\");\n }\n };\n };\n\n UploadMappingResource.query({},\n function(response) {\n $scope.mapping = response;\n },\n function(response) {\n $scope.mapping = null;\n }\n );\n\n function getGatheringsTemplate(field, key) {\n return '';\n }\n\n $scope.columnDefs = [\n {\n field: 'totalImported',\n displayName: $translate.instant('UPLOAD.ITEMS'),\n headerTooltip: true,\n cellTemplate: '
    \\n' +\n ' {{row.entity.totalImported}}/{{row.entity.numberOfItemsToImport}}\\n' +\n ' \\n' +\n ' \\n' +\n ' \\n' +\n '
    ',\n width: 120\n },\n {\n field: 'status',\n displayName: $translate.instant('STATUS'),\n headerTooltip: true,\n width: 90,\n cellTemplate: '
    ' +\n ' \\n' +\n ' {{ row.entity.status | translate}}\\n' +\n ' ' +\n ' \\n' +\n ' {{ row.entity.status | translate}}\\n' +\n ' ' +\n '
    '\n },\n {\n field: 'path',\n headerTooltip: true,\n cellTooltip: true,\n displayName: $translate.instant('FILE'),\n minWidth: 160\n },\n {\n field: 'newItems',\n displayName: $translate.instant('NEW'),\n headerTooltip: true,\n width: 60,\n cellClass: 'text-right',\n cellTemplate: getGatheringsTemplate('newItems','new')\n },\n {\n field: 'failedItems',\n displayName: $translate.instant('FAILED'),\n headerTooltip: true,\n width: 60,\n cellTemplate: ''\n },\n {\n field: 'changedItems',\n displayName: $translate.instant('CHANGED'),\n headerTooltip: true,\n width: 60,\n cellClass: 'text-right',\n cellTemplate: getGatheringsTemplate('changedItems','changed')\n }, {\n field: 'unchangedItems',\n displayName: $translate.instant('UNCHANGED'),\n headerTooltip: true,\n width: 60,\n cellClass: 'text-right',\n cellTemplate: getGatheringsTemplate('unchangedItems','unchanged')\n },\n {\n field: 'creationDate',\n displayName: $translate.instant('PUBLICATIONS.START'),\n cellFilter: \"date:'medium'\",\n headerTooltip: true,\n width: 150\n },\n {\n field: 'finishedDate',\n displayName: $translate.instant('PUBLICATIONS.END'),\n cellFilter: \"date:'medium'\",\n headerTooltip: true,\n width: 150\n }, {\n field: 'creationUser',\n displayName: $translate.instant('USER'),\n headerTooltip: true,\n cellTooltip: true,\n width: '*',\n minWidth: 120,\n cellTemplate: '
    \\n' +\n ' {{grid.appScope.getUserName(COL_FIELD)}}\\n' +\n '
    '\n }];\n\n $scope.columnDefs.push({\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n name: 'actions',\n headerCellClass: 'text-center',\n cellClass: 'text-right',\n enableCellEdit: false,\n enableCellSelection: false,\n allowCellFocus: false,\n pinnedRight: true,\n enableColumnResizing: false,\n enableSorting: false,\n enableHiding: false,\n resizable: false,\n width: 140,\n cellTemplate: ''\n });\n\n _.forEach($scope.columnDefs, function(col) {\n col.cellClass = function(grid, row, col, rowRenderIndex, colRenderIndex) {\n return 'row' + rowRenderIndex + ' col' + colRenderIndex;\n };\n });\n\n $scope.gridOptions = {\n data: 'entries',\n columnDefs: $scope.columnDefs,\n enableColumnMenus: false,\n enableGridMenu: true,\n enableSorting: false,\n infiniteScrollDown: true,\n rowHeight: 34,\n onRegisterApi: function(gridApi) {\n $scope.gridApi = gridApi;\n gridApi.infiniteScroll.on.needLoadMoreData($scope, $scope.loadMoreEntries);\n $rootScope.initGridState($scope, $scope.gridApi, IMPORT_GRID_STATES_KEY, DEFAULT_GRID_STATE_KEY, $scope.columnDefs);\n }\n };\n\n $scope.getPath = function(p) {\n // We should only encode (encodeURIComponent) the URL parameter value i.e. without the '/'\n if (p && p[0] === '/') {\n return '/' + encodeURIComponent(p.slice(1, p.length));\n } else {\n return encodeURIComponent(p);\n }\n };\n\n $scope.loadMoreEntries = function() {\n $scope.loadingItems = true;\n $scope.fetchEntries({append: true});\n };\n\n $scope.fetchEntries = function(config) {\n var queryParams = {};\n if (_.isUndefined(config)) {\n queryParams = {\n limit: 50\n };\n } else if (config.append) {\n queryParams = {\n limit: config.limit || 50\n };\n }\n\n QueryImportResource.createCursorAwareResource($scope.cursor).query(queryParams,\n function(response, headers) {\n var cursor = headers(HttpHeader.MESSAGE_CURSOR);\n if (cursor) {\n $scope.cursor = cursor;\n }\n\n if (response.length > 0) {\n $scope.entries = $scope.entries.concat(response);\n if ($scope.gridApi) {\n $timeout(function() {\n $scope.gridApi.infiniteScroll.saveScrollPercentage();\n $scope.gridApi.infiniteScroll.dataLoaded(false, true);\n });\n }\n }\n });\n };\n\n $scope.$on('channelMessageReceived', function(event, eventData) {\n if (eventData.event === ChannelService.IMPORT_SUMMARY_CHANGED_EVENT) {\n var newEntry = eventData.data.entry;\n if (!_.includes(newEntry.tags, 'upload')) {\n return;\n }\n $scope.entries = $scope.entries || [];\n var existingEntry = _.find($scope.entries, {id: newEntry.id});\n if (!_.isNil(existingEntry)) {\n if (newEntry.updatedDate > existingEntry.updatedDate) {\n angular.extend(existingEntry, newEntry);\n $scope.gridApi.grid.notifyDataChange(uiGridConstants.dataChange.EDIT);\n }\n } else {\n $scope.entries.unshift(newEntry);\n }\n }\n });\n\n var StartMappingEditor = function($rootScope, $scope, $modalInstance, RunMappingResource, growl, data, $location, $anchorScroll) {\n\n var DEFAULT_TARGETS = {\n category: 'category__',\n primaryKey: 'primaryKey__'\n };\n\n $scope.dataModel = $rootScope.dataModel.filteredLayoutAttributes('import_mapping');\n\n var parentscope = data.parentscope;\n\n function getValue(key) {\n\n var target = null;\n\n if (!_.isEmpty(parentscope.mapping)) {\n\n var foundEntry = _.find(parentscope.mapping, function(entry) {\n if (entry.source == key) {\n return true;\n }\n });\n if (!_.isNil(foundEntry)) {\n target = foundEntry.target;\n }\n\n }\n\n if (_.isNil(target)) {\n target = key.indexOf(\"[\") !== -1 ? key.substring(0,key.indexOf(\"[\")) : key;\n }\n\n // Only allow target if it is defined in the data model\n if (!$scope.isModelDefined(target) && !$scope.isModelDefined(DEFAULT_TARGETS[target])) {\n target = null;\n }\n\n return target;\n }\n\n function isIgnored(key) {\n var ignored = false;\n if (parentscope.mapping && parentscope.mapping.length > 0) {\n var i = parentscope.mapping.length;\n while (i--) {\n if (parentscope.mapping[i].source == key) {\n ignored = parentscope.mapping[i].ignored;\n }\n }\n }\n return ignored;\n }\n\n function getOptions() {\n var values = $scope.dataModel.map(function(elem) {\n return {\n name: elem.name,\n label: $rootScope.translateAttribute(elem)\n };\n });\n return values;\n }\n\n $scope.isModelDefined = function(name) {\n return _.find($scope.dataModel, {\n 'name': name\n }, 'name') !== undefined;\n };\n\n $scope.potentialPrimaryKeyPart = function(name) {\n return $rootScope.dataModel.potentialPrimaryKeyPart(name);\n };\n\n function getNonMappedAttributes(entries) {\n return _.filter(entries, function(entry) {\n return !$scope.isModelDefined(entry.source) && !entry.target;\n });\n }\n\n $scope.tagTransform = function(newTag) {\n var item = {\n name: newTag,\n label: newTag\n };\n return item;\n };\n\n $scope.onSelect = function(entry, $select) {\n if ($select.selected.name === \"\") {\n delete $select.selected;\n return false;\n }\n if (entry.oldTarget !== undefined) {\n $scope.alreadyMapped[entry.oldTarget] = false;\n }\n if ($select.selected !== undefined && entry.target !== undefined && entry.target !== \"\") {\n entry.ignored = false;\n $scope.alreadyMapped[entry.target] = true;\n } else {\n entry.ignored = true;\n }\n $scope.nonMappedAttributes = getNonMappedAttributes($scope.data);\n };\n\n $scope.diplaySelected = function(entry, attribute) {\n if (attribute !=null && (entry.source).indexOf(\"[\") !== -1){\n return ((entry.source).indexOf(attribute.name) > -1) ? entry.source : attribute.name ;\n }\n return attribute!=null ? ( attribute.name != null ? attribute.name : attribute ) : attribute ;\n };\n\n $scope.alreadyMapped = {};\n $scope.setMapped = function(entry) {\n if (entry.target) {\n $scope.alreadyMapped[entry.target] = true;\n }\n };\n\n $scope.notMappedAlready = function(option) {\n var attr = _.find($scope.dataModel , { name: option.name});\n if(attr.baseClass==\"Hash\" || attr.baseClass==\"Array\"){\n return true;\n }\n return !$scope.alreadyMapped[option.name];\n };\n\n $scope.entity = data.entity;\n\n $scope.data = [];\n\n $scope.entity.columnNames = $scope.entity.columnNames.filter(function(e,i,s){\n return i == s.indexOf(e);\n });\n\n for (var i = 0; i < $scope.entity.columnNames.length; i++) {\n var name = $scope.entity.columnNames[i];\n var target = getValue(name);\n var ignored = isIgnored(name) && !$scope.potentialPrimaryKeyPart(target);\n var entry = {\n 'source': name,\n 'target': target,\n 'oldTarget': target,\n 'ignored': ignored\n };\n $scope.data.push(entry);\n }\n $scope.options = getOptions();\n $scope.nonMappedAttributes = getNonMappedAttributes($scope.data);\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.run = function() {\n $scope.data = _.reject($scope.data, function(key, value) {\n return key === '$$hashKey';\n });\n\n $scope.data = $scope.data.map(function(entry){\n if ((entry.source).indexOf(\"[\") !== -1 && (entry.source).indexOf(entry.target) !== -1){\n entry.target = entry.source ;\n }\n return entry;\n });\n\n UploadMappingResource.save({},\n $scope.data,\n function(response) {\n growl.success(\"UPLOADED_MAPPING_SUCCESS\");\n parentscope.mapping = $scope.data;\n parentscope.runMapping($scope.entity);\n $modalInstance.close();\n },\n function(response) {\n growl.error(\"UPLOADED_MAPPING_FAILED\");\n $scope.mapping = null;\n $modalInstance.close();\n }\n );\n };\n };\n StartMappingEditor.$inject = [\"$rootScope\", \"$scope\", \"$modalInstance\", \"RunMappingResource\", \"growl\", \"data\", \"$location\"];\n $rootScope.usageLimits = UsageLimitsResource.get();\n\n $scope.limitsOK = function(number) {\n if ($rootScope.usageLimits.$resolved) {\n if ($rootScope.usageLimits.limits.ITEMS_PER_IMPORT_FILE > 0) {\n return $rootScope.usageLimits.limits.ITEMS_PER_IMPORT_FILE > number;\n }\n return $rootScope.usageLimits.limits.ITEMS > number;\n }\n return false;\n };\n\n $scope.getTooManyItemsMessage = function(data) {\n return $translate.instant(\"USAGE_LIMIT.ITEMS_IMPORT_EXCEEDS\");\n };\n\n $scope.canRunMapping = function(entity) {\n // Note: 'UPLOADED' is the old long deprecated status!\n return entity.status === 'READY' || entity.status === 'UPLOADED';\n };\n\n $scope.runMapping = function(entity) {\n RunMappingResource.save({}, entity,\n function(response) {\n growl.success(\"RUN_MAPPING_SUCCESS\");\n entity.status = \"RUNNING\";\n },\n function(response) {\n growl.success(\"RUN_MAPPING_FAILED\");\n });\n };\n\n $scope.canStartMappingEditor = function(entity) {\n return $rootScope.systemSettings.IMPORT_MAPPING_ENABLED && $scope.canRunMapping(entity);\n };\n\n $scope.startMappingEditor = function(entity) {\n ImportResource.get({\n id: entity.id\n }, function(summary) {\n $modal.open({\n templateUrl: 'tpl/import-mapping-editor.tpl.html',\n controller: StartMappingEditor,\n resolve: {\n data: function() {\n return {\n entity: summary,\n parentscope: $scope\n };\n }\n },\n backdrop: true,\n windowClass: 'publish-modal'\n });\n });\n };\n\n $scope.deleteImport = function(entity) {\n var fileName = $filter('fileName')(entity.path) || '';\n var confirmDialog = $dialogs.confirm('CONFIRM_DELETE', 'IMPORTS.DELETE_CONFIRMATION_TEXT',{variables:{name:fileName}});\n confirmDialog.result.then(function() {\n ImportResource.delete({\n id: entity.id\n }, function(data) {\n $scope.cursor = null;\n $scope.entries = [];\n $scope.fetchEntries();\n }, function (error) { });\n });\n };\n\n $scope.showError = function (row) {\n console.log(row);\n var modalPromise = $modal.open({\n templateUrl: 'tpl/error-details.tpl.html',\n controller: 'errorDetailsController',\n backdrop: true,\n resolve: {\n row: function() {\n return row;\n }\n }\n });\n };\n\n (function init() {\n $scope.fetchEntries();\n })();\n });\n","angular.module('llax')\n .controller('UserManagementController',\n function($rootScope, $scope, $translate, $timeout, $dialogs, $modal, $q, ExportUsersResource, UsersService, UsersResource, growl, InviteByEmailResource, UserResource, UsageLimitsResource, RolesService, UsersGroupService, ChannelService) {\n\n $scope.inviteByEmail = function(userAccount) {\n if (userAccount.restrictionFilter && userAccount.restrictionQuery) {\n growl.error(\"USER_MANAGEMENT.ONLY_ONE_RESTRICTION.ERROR\");\n return false;\n }\n\n var invitation = {\n invitationType: \"INVITED_COLLEAGUE\",\n invitedEmailAddress: userAccount.invitationEmail,\n roles: userAccount.roles,\n restrictionFilter: userAccount.restrictionFilter,\n restrictionQuery: userAccount.restrictionQuery\n };\n\n InviteByEmailResource.save(invitation, function() {\n growl.success(\"USER_MANAGEMENT.INVITATION_SENT\");\n $scope.newAccount = {};\n initUsers();\n });\n };\n\n $scope.createUser = function() {\n var createUserModal = $modal.open({\n templateUrl: 'tpl/user-create-user.tpl.html',\n controller: 'CreateUserController',\n backdrop: true,\n resolve: {\n data: function() {\n return {\n allRoles: $scope.roles,\n filters: $scope.filters\n };\n }\n }\n });\n createUserModal.result.then(function(task) {\n\n }, function() {\n console.log('Modal dismissed at: ' + new Date());\n }).finally(function() {\n initUsers();\n });\n };\n\n $scope.editUser = function(user) {\n var editUserModal = $modal.open({\n templateUrl: 'tpl/user-management-modal.tpl.html',\n controller: 'EditUserAccountController',\n backdrop: true,\n resolve: {\n data: function() {\n return {\n filters: $scope.filters,\n userAccount: user,\n allRoles: $scope.roles,\n allGroups: $scope.groups\n };\n }\n }\n });\n editUserModal.result.then(function(result) {\n if (result) {\n initUsers();\n }\n });\n };\n\n $scope.removeUser = function(user) {\n var message = $translate.instant('USER_MANAGEMENT.REMOVE_USER');\n var confirmDialog = $dialogs.confirm('', message);\n confirmDialog.result.then(function() {\n UsersResource.setActive({\n accountId: user.id,\n active: false\n }, function() {\n UsersService.setActive(user, false);\n growl.success(\"USER_MANAGEMENT.MESSAGE_USER_REMOVED\");\n initUsers();\n });\n });\n };\n\n $scope.downloadUsers = function () {\n ExportUsersResource.get({}, function (response) {\n $timeout(function () {\n var a = document.createElement('a');\n a.href = window.URL.createObjectURL(response.blob);\n a.download = response.filename;\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n window.URL.revokeObjectURL(a.href);\n }, 0);\n }, function (error) {\n console.error(error);\n });\n };\n\n $scope.removeInvitation = function(pendingInvitation) {\n var header = 'INVITATION.DELETE_INVITATION.LABEL';\n var message = 'INVITATION.DELETE_INVITATION.TEXT';\n\n var confirmDialog = $dialogs.confirm(header, message);\n confirmDialog.result.then(function() {\n InviteByEmailResource.delete({\n invitationId: pendingInvitation.id\n }, function(response) {\n growl.success('INVITATION_DELETED');\n initUsers();\n });\n });\n };\n\n $scope.updateInvitation = function(pendingInvitation) {\n InviteByEmailResource.save(pendingInvitation, function(response) {\n growl.success('INVITATION_UPDATED');\n initUsers();\n });\n };\n\n $scope.getLabel = function(restrictionFilter) {\n var filter = _.find($scope.filters, { name: restrictionFilter });\n if (filter) {\n return filter.label;\n }\n };\n\n $scope.buyUserLicenses = function() {\n var buyUserLicensesModal = $modal.open({\n templateUrl: 'tpl/user-buy-licenses.tpl.html',\n controller: 'BuyUserLicensesController',\n backdrop: true,\n resolve: {\n data: function() {\n return {\n };\n }\n }\n });\n buyUserLicensesModal.result.then(function(userLimit) {\n $scope.licensesUsed.userLimit = userLimit;\n }, function() {\n console.log('Modal dismissed at: ' + new Date());\n });\n };\n\n $scope.licensesUsed = {};\n\n function getRoles() {\n RolesService.getAllRoles().then(function(roles) {\n $scope.roles = _.map(roles, function(elem) {\n return {\n id: elem,\n text: elem\n };\n });\n });\n }\n\n function getGroups() {\n UsersGroupService.getAll().then(function(groups) {\n $scope.groups = groups;\n $scope.isLoading = false;\n },\n function(response) {\n });\n }\n\n function getFilters() {\n UserResource.filters(function(filters) {\n $scope.filters = _.map(filters, function(filter) {\n return {\n name: filter.name,\n label: filter.label || filter.name\n };\n });\n $scope.filters.unshift({\n name: '',\n label: $translate.instant('MAKE_SELECTION')\n });\n });\n }\n\n function getPendingInvitations() {\n return InviteByEmailResource.query({\n state: 'PENDING',\n type: 'INVITED_COLLEAGUE'\n },\n function(pendingInvitations) {\n $scope.pendingInvitations = pendingInvitations;\n }).$promise;\n }\n\n function initUsers() {\n UsersService.getUsers().subscribe(\n function (x) {\n updateUsers();\n },\n function (err) {\n console.log('Error: ' + err);\n },\n function () {});\n updateUsers();\n }\n\n function updateUsers() {\n $rootScope.users = UsersService.getUsersSnapshot();\n getPendingInvitations().then(function() {\n updateNumberOfUsers();\n });\n }\n\n function updateNumberOfUsers() {\n UsageLimitsResource.get(function(response) {\n activeUsers = _.filter($rootScope.users, function(user) { return user.active && !user.systemAccount && !user.managingAccount; });\n $scope.licensesUsed = {\n numberOfUsers: _.size(activeUsers) + _.size($scope.pendingInvitations),\n userLimit: response.limits.USERS\n };\n });\n }\n\n $scope.$on('userAccountUpdated', function(event, userAccount) {\n updateUsers();\n });\n $rootScope.$on('channelMessageReceived', function(event, eventData) {\n if (hopscotch.getCurrTour()) {\n return;\n }\n if (eventData.event === ChannelService.USERGROUPS_CHANGED) {\n getRoles();\n initUsers();\n getGroups();\n }\n });\n\n (function init() {\n getFilters();\n getRoles();\n initUsers();\n getGroups();\n })();\n })\n .controller('UserGroupsController',\n function($rootScope, $scope, $location, $translate, UsersService, UsersGroupService, ChannelService) {\n\n function initGrid() {\n $scope.isLoading = true;\n var columnDefs = [{\n field: 'groupName',\n displayName: $translate.instant('USER_GROUP.GROUP_NAME'),\n headerTooltip: true,\n cellTooltip: true,\n cellClass: 'text-center',\n cellTemplate: ''\n }, {\n field: 'userIds',\n displayName: $translate.instant('USER_GROUP.USER_COUNT'),\n headerTooltip: true,\n cellTooltip: true,\n cellClass: 'text-center',\n cellTemplate: '
    \\n' +\n ' {{COL_FIELD.length}}\\n' +\n '
    '\n }, {\n field: 'roles',\n displayName:$translate.instant('USER_MANAGEMENT.ROLES'),\n headerTooltip: true,\n cellTooltip: true,\n cellClass: 'text-center',\n cellTemplate: '
    \\n' +\n ' {{role}}\\n' +\n '
    '\n }];\n\n $scope.gridOptions = {\n data: 'groups',\n enableColumnMenus: false,\n columnDefs: columnDefs\n };\n UsersGroupService.getAll().then(function(groups) {\n $scope.groups = groups;\n $scope.isLoading = false;\n },\n function(response) {\n });\n }\n\n $scope.createGroup = function() {\n $location.path('user-group-add');\n };\n\n $rootScope.$on('channelMessageReceived', function(event, eventData) {\n if (hopscotch.getCurrTour()) {\n return;\n }\n if (eventData.event === ChannelService.USERGROUPS_CHANGED) {\n initGrid();\n }\n });\n (function init() {\n initGrid();\n })();\n })\n .controller('AddUserGroupController',\n function($rootScope, $scope, $location, $dialogs, $modal, UsersGroupService, growl, UsersService) {\n\n $scope.group = {};\n $scope.group.userIds = [];\n $scope.group.roles = [];\n $scope.users = [];\n $scope.roles = [];\n $scope.editMode = false;\n $scope.groupCopy = {};\n var params = $location.search();\n $scope.isGroupChanged = true;\n\n if (!_.isEmpty(params)) {\n UsersGroupService.getAll().then(function(groups) {\n if (_.isArray(groups)) {\n var group = _.find(groups, function(g) {\n return g.id == params.groupId;\n });\n if (!_.isNil(group)) {\n UsersService.getUsers().subscribe(function (x) {\n var users = UsersService.getUsersSnapshot();\n $scope.group.roles = group.roles || [];\n $scope.groupCopy = angular.copy(group);\n $scope.groupCopy.roles = $scope.groupCopy.roles || [];\n $scope.users = _.filter(users, function(p) {\n return _.includes(group.userIds, p.id);\n });\n $scope.group.id = group.id;\n $scope.group.groupName = group.groupName;\n $scope.editMode = true;\n });\n }\n }\n });\n }\n $scope.addMember = function() {\n var memberModal = $modal.open({\n templateUrl: 'tpl/add-group-member.tpl.html',\n controller: 'AddMemberController',\n backdrop: true,\n windowClass: 'group-editor',\n resolve: {\n addedUsers: function() {\n return $scope.users;\n }\n }\n });\n memberModal.result.then(function(members) {\n if (members && _.isArray(members)) {\n _.forEach(members, function(user, key) {\n $scope.users.push(user);\n });\n $scope.detectChanges();\n }\n }, function() {\n }).finally(function() {\n });\n };\n\n $scope.addrole = function() {\n var roleModal = $modal.open({\n templateUrl: 'tpl/add-group-role.tpl.html',\n controller: 'AddRoleController',\n backdrop: true,\n resolve: {\n addedRoles: function() {\n return angular.copy($scope.group.roles);\n }\n }\n });\n roleModal.result.then(function(roles) {\n if (roles && _.isArray(roles)) {\n _.forEach(roles, function(role, key) {\n $scope.group.roles.push(role.id);\n });\n $scope.detectChanges();\n }\n }, function() {\n }).finally(function() {\n });\n };\n\n $scope.removeUser = function(user) {\n var idx = $scope.users.indexOf(user);\n $scope.users.splice(idx,1);\n $scope.detectChanges();\n };\n\n $scope.removeRole = function(role) {\n var idx = $scope.group.roles.indexOf(role);\n $scope.group.roles.splice(idx,1);\n $scope.detectChanges();\n };\n\n $scope.saveGroup = function() {\n $scope.group.userIds = $scope.users.map(function(user) {\n return user.id.toString();\n });\n $scope.group.organizationId = $rootScope.organization.id;\n\n if (!$scope.editMode) {\n UsersGroupService.create($scope.group)\n .then(function(response) {\n growl.success(\"USER_GROUP.ADD_SUCCESS\");\n $location.path('user-groups').search('');\n },\n function(errResponse) {\n showErrorMessage(errResponse);\n });\n } else {\n UsersGroupService.update($scope.group)\n .then(function(response) {\n growl.success(\"USER_GROUP.UPDATE_SUCCESS\");\n $location.path('user-groups').search('');\n },\n function(errResponse) {\n showErrorMessage(errResponse);\n });\n }\n function showErrorMessage(errResponse) {\n var error = _.get(errResponse,'data.key') || \"SAVE_ERROR_MESSAGE\";\n var val = _.get(errResponse,'data.data[0]') || \"\";\n growl.error(error, { variables: { value: val } });\n }\n };\n\n $scope.goBack = function() {\n\n if (!$scope.isGroupChanged && $scope.editMode) {\n var confirmDialog = $dialogs.confirm('MODAL.CONFIRM_HEADER', 'MODAL.DISMISS_WITH_UNSAVED_CHANGES');\n confirmDialog.result.then(function() {\n $location.path('user-groups').search('');\n }).finally(function() {\n\n });\n } else {\n $location.path('user-groups').search('');\n }\n };\n\n $scope.deleteGroup = function() {\n var confirmDialog = $dialogs.confirm('CONFIRM_DELETE', 'USER_GROUP.REMOVE_GROUPS');\n confirmDialog.result.then(function() {\n UsersGroupService.delete({ id: $scope.group.id })\n .then(function(response) {\n UsersGroupService.reloadUsersAndGroups();\n growl.success(\"USER_GROUP.DELETE_SUCCESS\");\n $location.path('user-groups').search('');\n },\n function(errResponse) {\n });\n }).finally(function() {\n\n });\n };\n\n function CompareArraysByProperty(a1,a2,param) {\n var isEqual = true;\n if (_.isArray(a1) && _.isArray(a2) && (a1.length == a2.length) && _.isString(param)) {\n _.forEach(a1, function(el, key) {\n var a2El = _.find(a2, function(o) { return o[param] == el[param]; });\n if (!a2El) {\n isEqual = false;\n }\n });\n } else {\n isEqual = false;\n }\n return isEqual;\n }\n $scope.detectChanges = function() {\n if (!_.isEmpty($scope.groupCopy) && $scope.editMode) {\n $scope.isGroupChanged = CompareArraysByProperty($scope.groupCopy.users, $scope.users, 'id') &&\n ($scope.groupCopy.roles.sort().toString() == $scope.group.roles.sort().toString()) &&\n ($scope.groupCopy.groupName === $scope.group.groupName);\n }\n };\n })\n .controller('AddMemberController',\n function($rootScope, $scope, addedUsers, UsersService, $modalInstance) {\n $scope.users = [];\n var users = UsersService.getUsersSnapshot();\n if (_.isNil(users)) {\n UsersService.getUsers().subscribe(\n function (x) {\n updateUsers();\n });\n } else {\n updateUsers();\n }\n\n function updateUsers() {\n $scope.users = UsersService.getUsersSnapshot() || [];\n _.forEach($scope.users, function(user) {\n var existUser = _.find(addedUsers, function(u) { return u.id == user.id; });\n if (!_.isEmpty(existUser)) {\n user.checked = true;\n user.disable = true;\n }\n user.fullName = user.fullName || user.userId || '';\n });\n $scope.users = _.sortBy($scope.users, function(user) {\n return user.fullName.toLowerCase();\n });\n }\n $scope.addUsers = function() {\n var users = $scope.users.filter(function(user) {\n return user.checked && !user.disable;\n });\n $modalInstance.close(users);\n };\n\n $scope.cancel = function() {\n $modalInstance.close(null);\n };\n })\n .controller('AddRoleController',\n function($rootScope, $scope, addedRoles, RolesService, $modalInstance) {\n RolesService.getAllRoles().then(function(roles) {\n $scope.roles = _.map(roles, function(elem) {\n var exists = _.isArray(addedRoles) && addedRoles.indexOf(elem) > -1;\n return {\n id: elem,\n text: elem,\n disable: exists,\n checked: exists\n };\n });\n $scope.roles = _.sortBy($scope.roles, 'text');\n });\n $scope.addRoles = function() {\n var roles = $scope.roles.filter(function(role) {\n return role.checked && !role.disable;\n });\n $modalInstance.close(roles);\n };\n\n $scope.cancel = function() {\n $modalInstance.close(null);\n };\n });\n","angular.module('llax')\n .controller('UsersController', ['$rootScope', '$scope', '$routeParams', '$location', 'UserImageResource', 'SingleSignOnResource', 'UserResource', 'growl',\n function($rootScope, $scope, $routeParams, $location, UserImageResource, SingleSignOnResource, UserResource, growl) {\n\n $scope.hideUserIcon = false;\n $scope.passwordData = {\n oldPassword: '',\n newPassword: '',\n confirmNewPassword: ''\n };\n\n (function init() {\n SingleSignOnResource.get('protocol', {},\n function (response) {\n $scope.isSsoUser = response.protocol ? true : false;\n });\n })();\n\n function prepareUserAttributes() {\n // Set renderer and translations for organization attributes\n $scope.userAttributes = $rootScope.dataModel.getUserAttributes();\n $rootScope.prepareAttributes($scope.userAttributes);\n }\n\n $scope.saveUser = function() {\n UserResource.save($scope.tempUser, function(response) {\n growl.success(\"USER.SAVE_SUCCESS\");\n $scope.getUser().then(function() {\n $rootScope.$broadcast('userAccountUpdated', $rootScope.user);\n });\n }, function(response) {\n growl.error(\"USER.SAVE_ERROR\");\n });\n };\n\n $scope.createTempUser = function() {\n $scope.tempUser = angular.copy($rootScope.user);\n if ($rootScope.isDataModelLoaded) {\n prepareUserAttributes();\n } else {\n $rootScope.$on('dataModelLoaded', function() {\n prepareUserAttributes();\n });\n }\n };\n\n $scope.getUser = function() {\n return UserResource.get({}, function(response) {\n $rootScope.user = $rootScope.user || {};\n angular.extend($rootScope.user, response);\n }, function(response) {\n console.log(response.status);\n }).$promise;\n };\n\n $scope.uploadUserImage = function() {\n return {\n url: lax_rest_url('user/image'),\n filters: ['imageFilter'],\n accept: 'image/jpeg,image/gif,image/png',\n queueLimit: 1,\n cropImage: true,\n uploadComplete: function(response) {\n $scope.hideUserIcon = true;\n $rootScope.$broadcast('updateUserData');\n growl.success(\"UPLOAD_SUCCESS_MESSAGE\");\n }\n };\n };\n\n $scope.toggleUserIcon = function() {\n $scope.hideUserIcon = !$scope.hideUserIcon;\n };\n\n $scope.changePassword = function(passwordData) {\n if($scope.newPasswordForm.$invalid) {\n return;\n }\n\n UserResource.changePassword({\n newPassword: passwordData.newPassword,\n oldPassword: passwordData.oldPassword\n }, function(response) {\n growl.success(\"USER.CHANGE_PASSWORD_SUCCESS\");\n $scope.resetPasswordForm();\n }, function(response) {\n if (response.status === 400) {\n growl.error(\"USER.OLD_PASSWORD_WRONG\");\n } else {\n growl.error(\"USER.SAVE_ERROR\");\n }\n });\n };\n\n $scope.resetPasswordForm = function() {\n $scope.newPasswordForm.$setPristine();\n $scope.passwordData = {};\n };\n\n function updateUserData() {\n $scope.getUser();\n $rootScope.loadContacts();\n }\n\n $scope.$on('updateUserData', function() {\n updateUserData();\n });\n\n $scope.$on('toggleFileUpload', function(event, uploadId) {\n if(uploadId == \"user_upload\") {\n $scope.toggleUserIcon();\n }\n });\n\n }\n ]);\n","angular.module('llax')\n .controller('WebAppController',\n function($rootScope, $scope, $routeParams) {\n $scope.path = lax_rest_url(\"wa\") + '/' + $routeParams.path + '/';\n }\n );\n","angular.module('llax')\n .controller('AssetFoldersController', function ($dialogs, $filter, $http, $log, $modal, $modalInstance, $rootScope, $scope, $timeout, $q,\n $window, AssetFoldersResource, AssetFoldersService, growl, modalParams) {\n\n $scope.LINK_TYPE_FOLDER = AssetFoldersService.LINK_TYPE_FOLDER;\n $scope.LINK_TYPE_ASSET = AssetFoldersService.LINK_TYPE_ASSET;\n\n var LOCAL_STORAGE_MODE_KEY = 'assetFolders.viewMode';\n $scope.VIEW_MODE_GRID = 'GRID';\n $scope.VIEW_MODE_LIST = 'LIST';\n $scope.VIEW_MODE_LARGE_THUMBNAILS = 'LARGE_THUMBNAILS';\n\n $scope.currentPath = \"\";\n $scope.currentPathComponents = [];\n $scope.currentFolder = null;\n $scope.copiedItem = null;\n $scope.copiedMultiSelectedItems = [];\n $scope.selectedItem = null;\n $scope.items = [];\n $scope.filteredItems = [];\n $scope.vm = { query: null };\n $scope.loadingSelectedItemInfo = false;\n $scope.loading = true;\n $scope.initializing = true;\n $scope.forwardPaths = [];\n $scope.multiSelectedItems = [];\n\n $scope.customDamMode = false; // Used to track if we have custom DAM widgets enabled\n\n $scope.refresh = refresh;\n $scope.uploader = getUploader($scope.currentPath, $scope.refresh);\n $scope.decodeFilename = AssetFoldersService.decodeFilename;\n\n if ($window.localStorage.getItem(LOCAL_STORAGE_MODE_KEY)) {\n $scope.currentViewMode = $window.localStorage.getItem(LOCAL_STORAGE_MODE_KEY);\n } else {\n $scope.currentViewMode = $scope.VIEW_MODE_GRID;\n }\n\n if (!_.isNil($modalInstance)) {\n // We are in a modal\n $scope.isModal = true;\n }\n\n $scope.init = function() {\n\n $scope.initializing = true;\n var customAssetFoldersWidgetService = $rootScope.getService('CustomAssetFoldersWidgetService');\n\n if (_.isNil(customAssetFoldersWidgetService)) {\n $scope.initNativeAssetFolders();\n return;\n }\n\n if (_.isNil(customAssetFoldersWidgetService.isWidgetEnabled) ||\n _.isNil(customAssetFoldersWidgetService.initializePageWidgetAsync) ||\n _.isNil(customAssetFoldersWidgetService.initializeBrowseWidgetAsync)) {\n $log.error(\"Misconfigured `CustomAssetFoldersWidgetService`, falling back to the native asset folders management.\");\n $scope.initNativeAssetFolders();\n return;\n }\n\n var isWidgetEnabled = customAssetFoldersWidgetService.isWidgetEnabled($rootScope.user, $rootScope.organization);\n if (!isWidgetEnabled) {\n $scope.initNativeAssetFolders();\n return;\n }\n\n $scope.customDamMode = true;\n var domContainerId = '#dam-container';\n var onSelectedCallback = $scope.isModal ? modalParams.onFileSelected : _.noop;\n var onCloseCallback = $scope.cancel;\n\n if ($scope.isModal) {\n // We are in a modal/dialog, let's initialize the browse widget.\n customAssetFoldersWidgetService.initializeBrowseWidgetAsync(domContainerId, onSelectedCallback, onCloseCallback)\n .then(function() {\n $scope.initializing = false;\n })\n .catch(function(error) {\n $scope.customDamMode = false;\n\n $log.error(\"There was an error initializing browse widget, falling back to the native asset folders management\", error);\n $scope.initNativeAssetFolders();\n });\n } else {\n // We are in a full page mode, let's initialize the page widget.\n customAssetFoldersWidgetService.initializePageWidgetAsync(domContainerId, onSelectedCallback, onCloseCallback)\n .then(function() {\n $scope.initializing = false;\n })\n .catch(function(error) {\n $scope.customDamMode = false;\n\n $log.error(\"There was an error initializing page widget, falling back to the native asset folders management\", error);\n $scope.initNativeAssetFolders();\n });\n }\n\n };\n\n $scope.initNativeAssetFolders = function() {\n AssetFoldersResource().getRootFolderContents(function (response) {\n $scope.currentPath = \"\";\n $scope.currentPathComponents = [];\n $scope.currentFolder = null;\n $scope.selectedItem = null;\n $scope.multiSelectedItems = [];\n\n $scope.items = AssetFoldersService.sortAssetItems(response);\n $scope.setFilteredItems($scope.items, $scope.vm.query);\n $scope.uploader = getUploader($scope.currentPath, $scope.refresh);\n $scope.loading = false;\n $scope.initializing = false;\n });\n };\n\n $scope.getFolderContentsByPath = function(path) {\n if (!_.isEmpty(path) && path[0] === \"/\") {\n path = path.slice(1, path.length);\n }\n\n $scope.loading = true;\n\n AssetFoldersResource(path).getFolderContents(function (response) {\n $scope.currentPath = path;\n resetCurrentPathComponents(path);\n\n $scope.items = AssetFoldersService.sortAssetItems(response);\n $scope.setFilteredItems($scope.items);\n $scope.selectedItem = null;\n $scope.uploader = getUploader($scope.currentPath, $scope.refresh);\n $scope.loading = false;\n $scope.multiSelectedItems = [];\n });\n };\n\n $scope.getFolderContents = function(path, folderName) {\n var fullPath = '';\n if (!_.isEmpty(path)) {\n fullPath = path + \"/\" + folderName;\n } else {\n fullPath = folderName;\n }\n $scope.getFolderContentsByPath(fullPath);\n };\n\n function refresh() {\n if (_.isEmpty($scope.currentPath)) {\n $scope.init();\n } else {\n $scope.getFolderContentsByPath($scope.currentPath);\n }\n }\n\n $scope.handleItemDoubleClick = function(item) {\n if (item.linkType === $scope.LINK_TYPE_ASSET && $scope.isImageFile(item)) {\n $scope.showImageFile($scope.getImageUrl(item));\n } else if (item.linkType === $scope.LINK_TYPE_FOLDER){\n $scope.forwardPaths = [];\n $scope.getFolderContents($scope.currentPath, item.name);\n }\n };\n\n $scope.handleBreadcrumbClick = function(pathComponent) {\n if (_.isEmpty(pathComponent)) {\n $scope.init();\n } else {\n var path = \"\";\n for (var i = 0; i < $scope.currentPathComponents.length; i++) {\n path += \"/\" + $scope.currentPathComponents[i];\n if ($scope.currentPathComponents[i] === pathComponent) {\n break;\n }\n }\n $scope.getFolderContentsByPath(path);\n }\n };\n\n $scope.handleBackClick = function() {\n $scope.forwardPaths.push($scope.currentPath);\n var path = \"\";\n for (var i = 0; i < $scope.currentPathComponents.length - 1; i++) {\n path += \"/\" + $scope.currentPathComponents[i];\n }\n\n if (_.isEmpty(path)) {\n $scope.init();\n } else {\n $scope.getFolderContentsByPath(path);\n }\n };\n\n $scope.handleForwardClick = function() {\n if ($scope.forwardPaths.length !== 0) {\n var previousPath = $scope.forwardPaths.pop();\n $scope.getFolderContentsByPath(previousPath);\n }\n };\n\n $scope.selectItem = function(item) {\n $timeout(function() {\n $scope.selectedItem = item;\n $scope.loadingSelectedItemInfo = false;\n }, 0);\n };\n\n $scope.setFilteredItems = function(items, query) {\n if (!_.isEmpty(query)) {\n $scope.filteredItems = _.filter(items, function(item) {\n return item.name.toLocaleLowerCase().indexOf(query.toLocaleLowerCase()) != -1;\n });\n } else {\n $scope.filteredItems = items;\n }\n };\n\n $scope.showImageFile = function(url) {\n $modal.open({\n templateUrl: 'tpl/editorShowImage.tpl.html',\n controller: 'showImageController',\n windowClass: 'editor-show-image',\n backdrop: true,\n resolve: {\n filePreviewData: function () {\n return {\n isImage: true,\n url: url\n };\n }\n }\n });\n };\n\n $scope.showCreateModal = function() {\n $modal.open({\n templateUrl: 'tpl/asset-folders/modal-create.tpl.html',\n controller: 'AssetFoldersModalCreateFolderController',\n backdrop: true,\n resolve: {\n data: function () {\n return {\n path: $scope.currentPath,\n onDone: $scope.onCreateDone\n };\n }\n }\n });\n };\n\n $scope.showUploadModal = function() {\n $modal.open({\n templateUrl: 'tpl/asset-folders/modal-upload.tpl.html',\n controller: 'AssetFoldersModalUploadController',\n backdrop: true,\n resolve: {\n data: function () {\n return {\n path: $scope.currentPath,\n onCancel: function() {\n $scope.broadcastChildsUpdated($scope.currentPath);\n $scope.refresh();\n }\n };\n }\n }\n });\n };\n\n $scope.showDeleteModal = function() {\n var confirmDialog = $dialogs.confirm('CONFIRM_DELETE');\n\n if ($scope.multiSelectedItems.length === 0) {\n // Delete single asset/folder item\n var itemPath = $scope.currentPath ? $scope.currentPath + \"/\" + $scope.selectedItem.name : $scope.selectedItem.name;\n confirmDialog.result.then(function(){\n $scope.deleting = true;\n AssetFoldersResource(itemPath).delete(function (response) {\n growl.success('ASSET_FOLDER.DELETED_SUCCESSFULLY');\n $scope.deleting = false;\n $scope.refresh();\n $scope.broadcastChildsUpdated($scope.currentPath);\n }, function (error) {\n $scope.deleting = false;\n\n if (error.data.message) {\n growl.error(error.data.message);\n } else {\n growl.error('ASSET_FOLDER.ERROR_OCCURRED');\n }\n });\n });\n } else {\n // Delete multiple assets/folders.\n var itemPaths = $scope.multiSelectedItems.map(function(item) {\n return $scope.currentPath ? $scope.currentPath + \"/\" + item.name : item.name;\n });\n confirmDialog.result.then(function(){\n $scope.deleting = true;\n // FIXME: Solved in angular +1.6.4, as they interpret the specs such that the DELETE request has no body in prior versions.\n $http({\n method: 'DELETE',\n url: lax_rest_url('assetFolders') + '/_deleteItems',\n data: itemPaths,\n headers: {'Content-Type': 'application/json;charset=utf-8'}\n }).then(function(response) {\n growl.success('ASSET_FOLDER.DELETED_SUCCESSFULLY');\n $scope.deleting = false;\n $scope.refresh();\n $scope.broadcastChildsUpdated($scope.currentPath);\n }, function(error) {\n $scope.deleting = false;\n\n if (error.data.message) {\n growl.error(error.data.message);\n } else {\n growl.error('ASSET_FOLDER.ERROR_OCCURRED');\n }\n });\n });\n }\n };\n\n $scope.showRenameModal = function() {\n $modal.open({\n templateUrl: 'tpl/asset-folders/modal-rename.tpl.html',\n controller: 'AssetFoldersRenameFolderController',\n backdrop: true,\n resolve: {\n data: function () {\n return {\n path: $scope.currentPath,\n name: $scope.decodeFilename($scope.selectedItem.name),\n linkType: $scope.selectedItem.linkType,\n onDone: $scope.onRenameDone\n };\n }\n }\n });\n };\n\n $scope.getImageUrl = function(item) {\n return item.privateAssetUrl;\n };\n\n $scope.getFileIcon = function(fileName) {\n return AssetFoldersService.getFileIcon(fileName);\n };\n\n $scope.isImageFile = function(assetFolder) {\n if (_.isNil(assetFolder) || _.isNil(assetFolder.contentType)) {\n return false;\n }\n\n return $filter('isFileType')({ type: assetFolder.contentType }, 'drawable');\n };\n\n $scope.download = function() {\n if ($scope.multiSelectedItems.length > 0) {\n // Download multiple files\n var downloadableUrls = _.reduce($scope.multiSelectedItems, function(result, item) {\n if (item.linkType === $scope.LINK_TYPE_ASSET) {\n var url = $scope.getImageUrl(item);\n result.push(url);\n }\n\n return result;\n }, []);\n\n if (_.isEmpty(downloadableUrls)) {\n return;\n }\n\n _.forEach(downloadableUrls, function(url) {\n $scope.downloadFile(url);\n });\n } else {\n // Download single file\n $scope.downloadFile($scope.getImageUrl($scope.selectedItem));\n }\n };\n\n $scope.downloadFile = function(url) {\n $timeout(function() {\n var anchor = document.createElement('a');\n anchor.setAttribute('href', url);\n anchor.setAttribute('hidden', true);\n anchor.setAttribute('download', '');\n anchor.setAttribute('target', '_blank');\n document.body.appendChild(anchor);\n anchor.click();\n anchor.remove();\n }, 0);\n };\n\n $scope.downloadButtonClick = function() {\n $timeout(function() {\n $('#button-download')[0].click();\n }, 0);\n };\n\n $scope.cancel = function() {\n $modalInstance.close();\n };\n\n $scope.selectFile = function(currentPath, item) {\n\n var assetPath = \"\";\n if (!_.isEmpty(currentPath)) {\n assetPath = currentPath + \"/\" + item.name;\n } else {\n assetPath = item.name;\n }\n\n modalParams.onFileSelected(item, assetPath);\n $scope.cancel();\n };\n\n $scope.isFileTypeAccepted = function(item) {\n if(!_.isNil(modalParams) && !_.isEmpty(modalParams.accept)) {\n if (_.includes(modalParams.accept, item.contentType)) {\n return true;\n } else {\n return false;\n }\n }\n\n return true;\n };\n\n $scope.setActiveViewMode = function(viewMode) {\n $window.localStorage.setItem(LOCAL_STORAGE_MODE_KEY, viewMode);\n $scope.currentViewMode = viewMode;\n };\n\n $scope.broadcastChildsUpdated = function(path) {\n $scope.$broadcast(AssetFoldersService.EVENT_CHILDS_UPDATED, {\n path: path\n });\n };\n\n $scope.broadcastUpdated = function(path, newName) {\n $scope.$broadcast(AssetFoldersService.EVENT_UPDATED, {\n path: path,\n newName: newName\n });\n };\n\n $scope.onRenameDone = function(path, newName) {\n $scope.broadcastUpdated(path, newName);\n $scope.refresh();\n };\n\n $scope.onCreateDone = function() {\n $scope.broadcastChildsUpdated($scope.currentPath);\n $scope.refresh();\n };\n\n $scope.onSearchQueryChange = function() {\n $scope.setFilteredItems($scope.items, $scope.vm.query);\n };\n\n $scope.onItemDragStart = function($event, draggedItem) {\n\n // Note that: this will be called on the DRAGGED item.\n var draggedItems = [];\n if (!_.isEmpty($scope.multiSelectedItems)) {\n draggedItems = $scope.multiSelectedItems;\n } else {\n draggedItems.push(draggedItem);\n }\n\n AssetFoldersService.prepareDragAndDropEvent($event, draggedItems, $scope.currentPath);\n };\n\n $scope.onItemDragFinished = function(droppedItems, droppedOnItem) {\n\n // Ignore drops on asset files\n if (!_.isNil(droppedOnItem) && droppedOnItem.linkType === $scope.LINK_TYPE_ASSET) {\n return;\n }\n\n AssetFoldersService.handleDropEventAsync(droppedItems, droppedOnItem, $scope.currentPath, $scope.onItemMovedSuccessfully)\n .then(function(){\n $scope.multiSelectedItems = [];\n })\n .catch(function(error) {\n $scope.onItemMovedError(error);\n });\n };\n\n $scope.cutItem = function() {\n\n if (!_.isEmpty($scope.multiSelectedItems)) {\n // Cut multiple items\n $scope.copiedMultiSelectedItems = [];\n $scope.copiedItem = null;\n\n _.forEach($scope.multiSelectedItems, function(item) {\n var itemFullPath =\n AssetFoldersService.prependCurrentPath($scope.currentPath, item.name);\n\n var copiedItem = {\n fullPath: itemFullPath,\n item: item\n };\n\n $scope.copiedMultiSelectedItems.push(copiedItem);\n });\n } else if(!_.isNil($scope.selectedItem)) {\n // Cut single item\n $scope.copiedMultiSelectedItems = [];\n $scope.copiedItem = null;\n\n var itemFullPath = AssetFoldersService.prependCurrentPath($scope.currentPath, $scope.selectedItem.name);\n\n $scope.copiedItem = {\n fullPath: itemFullPath,\n item: $scope.selectedItem\n };\n }\n\n };\n\n $scope.handlePasteItemClick = function(selectedItem) {\n\n if(!$scope.isPasteActionEnabled()) {\n return;\n }\n\n if (!_.isEmpty($scope.copiedMultiSelectedItems)) {\n var copiedItems = $scope.copiedMultiSelectedItems;\n $scope.pasteItems(copiedItems, selectedItem);\n } else {\n var copiedItem = $scope.copiedItem;\n $scope.pasteItem(copiedItem, selectedItem);\n }\n };\n\n $scope.pasteItem = function(sourceItem, destinationItem) {\n\n var sourcePath = sourceItem.fullPath;\n var itemType = sourceItem.item.linkType;\n\n var destinationPath = '';\n if (_.isNil(destinationItem)) {\n destinationPath = $scope.currentPath;\n } else {\n destinationPath = AssetFoldersService.prependCurrentPath($scope.currentPath, destinationItem.name);\n }\n\n AssetFoldersService.moveItemAsync(itemType, sourcePath, destinationPath)\n .then(function() {\n $scope.onItemMovedSuccessfully(sourcePath, destinationPath);\n $scope.copiedItem = null;\n }).catch(function(error){\n $scope.onItemMovedError(error);\n });\n };\n\n $scope.pasteItems = function(sourceItems, destinationItem) {\n\n var destinationPath = '';\n if (_.isNil(destinationItem)) {\n destinationPath = $scope.currentPath;\n } else {\n destinationPath = AssetFoldersService.prependCurrentPath($scope.currentPath, destinationItem.name);\n }\n\n var moveRequests = [];\n _.forEach(sourceItems, function(sourceItem) {\n var sourcePath = sourceItem.fullPath;\n var itemType = sourceItem.item.linkType;\n\n var request = AssetFoldersService.moveItemAsync(itemType, sourcePath, destinationPath)\n .then(function() {\n $scope.onItemMovedSuccessfully(sourcePath, destinationPath);\n });\n moveRequests.push(request);\n });\n\n $q.all(moveRequests)\n .then(function() {\n $scope.copiedMultiSelectedItems = [];\n }).catch(function(error){\n $scope.onItemMovedError(error);\n });\n };\n\n $scope.isPasteActionEnabled = function() {\n return !_.isEmpty($scope.copiedMultiSelectedItems) || !_.isNil($scope.copiedItem);\n };\n\n $scope.onItemMovedSuccessfully = function(sourcePath, destinationPath) {\n var sourceParentFolderPath = AssetFoldersService.getParentFolderPath(sourcePath);\n $scope.refresh();\n $scope.broadcastChildsUpdated(sourceParentFolderPath);\n $scope.broadcastChildsUpdated(destinationPath);\n growl.success('ASSET_FOLDER.ASSET_ITEM_MOVED_SUCCESSFULLY');\n };\n\n $scope.onAllItemsMovedSuccessfully = function(path) {\n if (_.isEmpty(path)) {\n $scope.init();\n } else {\n $scope.getFolderContentsByPath(path);\n }\n };\n\n $scope.onItemMovedError = function(error) {\n $log.error(error);\n var errorMessage = 'ASSET_FOLDER.ERROR_OCCURRED';\n if (!_.isNil(error.data) && !_.isNil(error.data.message)) {\n errorMessage = error.data.message;\n }\n growl.error(errorMessage);\n };\n\n $scope.onMultiItemSelected = function(item) {\n if (item.multiSelected) {\n $scope.multiSelectedItems.push(item);\n } else {\n _.remove($scope.multiSelectedItems, { name: item.name });\n }\n $scope.selectItem(item);\n };\n\n $scope.clearMultiSelection = function() {\n $scope.multiSelectedItems = [];\n $scope.selectedItem = null;\n _.forEach($scope.items, function(item) {\n item.multiSelected = false;\n });\n\n if ($scope.currentViewMode === $scope.VIEW_MODE_LIST) {\n $scope.$broadcast('notifyMultiSelectionChanged');\n }\n };\n\n $scope.multiSelectAll = function() {\n $scope.multiSelectedItems = [];\n _.forEach($scope.items, function(item) {\n item.multiSelected = true;\n $scope.multiSelectedItems.push(item);\n });\n\n if ($scope.currentViewMode === $scope.VIEW_MODE_LIST) {\n $scope.$broadcast('notifyMultiSelectionChanged');\n }\n };\n\n function getUploader(path, onComplete) {\n\n function onCompleteAll(uploaderScope) {\n var failed = false;\n for (var i = 0; i < uploaderScope.queue.length; i ++) {\n var item = uploaderScope.queue[i];\n if (item.isUploaded && item.isError) {\n failed = true;\n }\n }\n\n if (!failed) {\n growl.success('ASSET_FOLDER.UPDATED_SUCCESSFULLY');\n onComplete();\n }\n uploaderScope.queue = [];\n }\n\n function onErrorItem(response) {\n var error = 'ASSET_FOLDER.UPLOAD_ITEM_FAILED';\n if (response.message) {\n error = response.message;\n }\n growl.error(error);\n }\n\n return AssetFoldersService.getUploader(path, {\n autoUpload: true,\n reset: true,\n multiple: true,\n useFilename: true,\n onCompleteAll: onCompleteAll,\n onErrorItem: onErrorItem\n });\n }\n\n function resetCurrentPathComponents(path) {\n $scope.currentPathComponents = _.isEmpty(path) ? [] : path.split(\"/\");\n }\n });\n","angular.module('llax')\n .controller('AssetFoldersModalCreateFolderController', function ($modalInstance, $scope, AssetFoldersResource, data, growl) {\n $scope.data = data;\n $scope.path = data.path;\n $scope.onDone = data.onDone;\n $scope.viewModel = {};\n $scope.saving = false;\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.createFolder = function() {\n $scope.saving = true;\n AssetFoldersResource($scope.path).createFolder({\n name: $scope.viewModel.name\n }, function(response) {\n growl.success('ASSET_FOLDER.UPDATED_SUCCESSFULLY');\n $scope.saving = false;\n $scope.onDone();\n $scope.cancel();\n }, function(error) {\n $scope.saving = false;\n if (error.data.message) {\n growl.error(error.data.message);\n } else {\n growl.error('ASSET_FOLDER.ERROR_OCCURRED');\n }\n });\n };\n });\n","angular.module('llax')\n .controller('AssetFoldersRenameFolderController', function ($modalInstance, $scope, AssetFoldersResource, AssetFoldersService, data, growl) {\n var LINK_TYPE_ASSET = AssetFoldersService.LINK_TYPE_ASSET;\n $scope.path = data.path;\n $scope.name = data.name;\n $scope.linkType = data.linkType;\n $scope.viewModel = {\n name: $scope.name\n };\n $scope.saving = false;\n $scope.onDone = data.onDone;\n\n $scope.cancel = function () {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.renameFolder = function () {\n $scope.saving = true;\n var path = '';\n\n // Just add a '/' in case of root folder\n if ($scope.path) {\n path = $scope.path + '/' + $scope.name;\n } else {\n path = $scope.name;\n }\n\n var renameFn = AssetFoldersResource(path).renameFolder;\n if ($scope.linkType == LINK_TYPE_ASSET) {\n renameFn = AssetFoldersResource(path).renameAsset;\n }\n\n renameFn({\n name: $scope.viewModel.name\n }, function (response) {\n $scope.saving = false;\n growl.success('ASSET_FOLDER.UPDATED_SUCCESSFULLY');\n $scope.onDone(path, $scope.viewModel.name);\n $scope.cancel();\n }, function (error) {\n $scope.saving = false;\n\n if (error.data.message) {\n growl.error(error.data.message, { variables: { name: $scope.viewModel.name }});\n } else {\n growl.error('ASSET_FOLDER.ERROR_OCCURRED');\n }\n });\n };\n });\n","angular.module('llax')\n .controller('AssetFoldersModalUploadController', function ($modalInstance, $rootScope, $scope, data, AssetFoldersService, growl) {\n $scope.isArchiveFile = false;\n $scope.inputModel = {\n extractArchive: false\n };\n $scope.uploading = false;\n $scope.done = false;\n $scope.path = data.path;\n $scope.getUploaderOptions = data.getUploaderOptions;\n $scope.onCancel = data.onCancel;\n\n $scope.cancel = function () {\n $scope.onCancel();\n $modalInstance.dismiss('cancel');\n };\n\n $scope.uploadFile = function () {\n if ($scope.uploader.queue.length === 0) {\n return;\n }\n\n if ($scope.inputModel.extractArchive) {\n _.forEach($scope.uploader.queue, function(uploadItem){\n uploadItem.url = lax_rest_url('assetFolders/_uploadArchive/' + encodeURI(data.path));\n });\n }\n\n $scope.uploading = true;\n $scope.uploader.uploadAll();\n };\n\n $scope.onCompleteAll = function(uploaderScope) {\n\n $scope.uploading = false;\n $scope.done = true;\n\n if (!_.isEmpty(uploaderScope.queue)) {\n var hasError = _.filter(uploaderScope.queue, function(item) {\n return item.isError;\n })[0];\n\n if (hasError) {\n return;\n }\n }\n\n growl.success('ASSET_FOLDER.UPLOADED_SUCCESSFULLY');\n $scope.cancel();\n };\n\n $scope.onAfterAddingFile = function (uploaderScope) {\n return function(fileItem) {\n $rootScope.$broadcast('filesSelected');\n $rootScope.uploaderHasFiles = true;\n fileItem.alias = fileItem.file.name;\n };\n };\n\n $scope.onErrorItem = function(item, response, status, headers) {\n if (status === 408) {\n item.error = {\n message: 'ASSET_FOLDER.TOOK_TOO_LONG'\n };\n } else {\n item.error = {\n message: 'ASSET_FOLDER.ERROR_OCCURRED'\n };\n }\n };\n\n $scope.uploaderOptions = AssetFoldersService.getUploader($scope.path, {\n multiple: true,\n autoUpload: false,\n useFilename: true,\n onCompleteAll: $scope.onCompleteAll,\n onAfterAddingFile: $scope.onAfterAddingFile,\n onErrorItem: $scope.onErrorItem\n });\n\n });\n","angular.module('llax')\n .controller('ImportSimpleMappingsController',\n function ($modalInstance, $scope, data, growl, SheetJSService, SimpleMappingsResource) {\n $scope.importing = false;\n\n $scope.cancel = function () {\n if (!$scope.importing) {\n $modalInstance.dismiss('cancel');\n }\n };\n\n $scope.importFile = function(fileName, fileAsArrayBuffer) {\n $scope.importing = true;\n var workbook = SheetJSService.readFile(fileAsArrayBuffer);\n if (!_.isEmpty(workbook.SheetNames)) {\n var sheetName = workbook.SheetNames[0];\n var sheet = workbook.Sheets[sheetName];\n var columns = _.map(SheetJSService.getRowCells(sheet, 0), function(cell) {\n return cell.value;\n });\n var sheetData = SheetJSService.sheetToJson(sheet);\n SimpleMappingsResource.createEntries({\n id: data.simpleMappingId\n }, _.map(sheetData, function(entry) {\n return {\n key: entry[columns[0]],\n value: entry[columns[1]],\n };\n }), function(response) {\n $scope.importing = false;\n $scope.cancel();\n data.onSimpleMappingImported(data.simpleMappingId);\n }, function(response) {\n $scope.importing = false;\n growl.error('SIMPLE_MAPPING.SAVE_FAILED');\n });\n } else {\n $scope.importing = false;\n growl.error('SIMPLE_MAPPING.IMPORT_FILE_INVALID');\n }\n };\n\n $scope.onFileDrop = function(file) {\n var reader = new FileReader();\n\n reader.onload = function(e) {\n var arrayBuffer = e.target.result;\n $scope.importFile(file.name, arrayBuffer);\n };\n\n reader.readAsArrayBuffer(file);\n };\n }\n ).directive('simpleMappingImporter', function() {\n return {\n restrict: 'E',\n scope: {\n onDrop: '='\n },\n replace: true,\n templateUrl: 'tpl/simple-mapping/simple-mappings-uploader.tpl.html',\n link: function($scope, $element, attrs){\n function dragenter($event) {\n $event.stopPropagation();\n $event.preventDefault();\n $element.addClass('dropping');\n }\n\n function dragover($event) {\n $event.stopPropagation();\n $event.preventDefault();\n }\n\n function dragleave($event) {\n $event.stopPropagation();\n $event.preventDefault();\n $element.removeClass('dropping');\n }\n\n function drop($event) {\n $event.stopPropagation();\n $event.preventDefault();\n $element.removeClass('dropping');\n var files = $event.originalEvent.dataTransfer.files;\n var file = files[0];\n $scope.onDrop(file);\n }\n\n $element.bind('dragenter', dragenter);\n $element.bind('dragover', dragover);\n $element.bind('dragleave', dragleave);\n $element.bind('drop', drop);\n\n function change($event){\n var files = $event.target.files;\n var file = files[0];\n $scope.onDrop(file);\n }\n\n var $input = $element[0].querySelector('input');\n $input.onchange = change;\n var $button = $element[0].querySelector('button');\n $button.onclick = function() {\n $input.click();\n };\n }\n };\n });","angular.module('llax')\n .controller('PrefillSimpleMappingsController',\n function ($modalInstance, $rootScope, $scope, data, growl, SimpleMappingsResource, SimpleMappingsService) {\n $scope.MODE_PREFILL = 'PREFILL';\n $scope.MODE_LINK = 'LINK';\n\n if (data.linkMode) {\n $scope.mode = $scope.MODE_LINK;\n } else {\n $scope.mode = $scope.MODE_PREFILL;\n }\n\n $scope.simpleMapping = data.simpleMapping;\n $scope.importing = false;\n $scope.linkableAttributes = data.linkableAttributes;\n $scope.prefillEntities = [];\n $scope.form = { prefillEntities: [] };\n\n $scope.cancel = function () {\n if ($scope.importing) {\n return;\n }\n $modalInstance.dismiss('cancel');\n };\n\n $scope.importFromCodelist = function() {\n $scope.importing = true;\n if ($scope.mode === $scope.MODE_PREFILL) {\n SimpleMappingsService.importModelAttributesIntoSimpleMappingAsync($scope.form.prefillEntities, $scope.simpleMapping.id)\n .then(function(response) {\n var modelAttributes = _.map($scope.form.prefillEntities, 'name');\n return SimpleMappingsService.linkAttributesToSimpleMappingAsync($scope.simpleMapping, modelAttributes);\n }).then(function(response) {\n data.onSimpleMappingImported($scope.simpleMapping.id);\n $scope.importing = false;\n $scope.cancel();\n }).catch(function(error) {\n growl.error('SIMPLE_MAPPING.SAVE_FAILED');\n });\n } else {\n var modelAttributes = _.map($scope.form.prefillEntities, 'name');\n SimpleMappingsService.linkAttributesToSimpleMappingAsync($scope.simpleMapping, modelAttributes)\n .then(function() {\n data.onSimpleMappingImported($scope.simpleMapping.id);\n $scope.importing = false;\n $scope.cancel();\n }).catch(function() {\n growl.error('SIMPLE_MAPPING.SAVE_FAILED');\n });\n }\n };\n\n function prepareLinkableAttributes(linkableAttributes) {\n return _.map(linkableAttributes, function(attribute) {\n attribute.translatedLabel = $rootScope.translateAttribute(attribute.label);\n return attribute;\n });\n }\n\n function init() {\n $scope.prefillEntities =\n _.concat($scope.prefillEntities,\n prepareLinkableAttributes($scope.linkableAttributes));\n\n if (!_.isEmpty($scope.simpleMapping.linkedAttributes) && $scope.mode === $scope.MODE_LINK) {\n $scope.form.prefillEntities = _.filter($scope.prefillEntities, function(attribute){\n return _.includes($scope.simpleMapping.linkedAttributes, attribute.name);\n });\n }\n }\n\n init();\n }\n );"," angular.module('llax')\n .controller('SimpleMappingsController',\n function ($dialogs, $filter, $http, $log, $modal, $modalInstance, $rootScope, $scope, $timeout, $translate,\n $window, data, growl, SheetJSService, SimpleMappingsResource, SimpleMappingsService, uiGridConstants) {\n $scope.MODE_SCREEN = 'screen';\n $scope.MODE_MODAL = 'modal';\n $scope.simpleMappings = [];\n $scope.currentSimpleMapping = null;\n $scope.createNewState = false;\n $scope.editState = {};\n $scope.simpleMappingsInEditState = {};\n $scope.newEntity = {\n name: ''\n };\n $scope.allLinkableAttributes = [];\n\n $scope.mode = $scope.MODE_MODAL;\n if (_.isEmpty($modalInstance)) {\n $scope.mode = $scope.MODE_SCREEN;\n }\n\n $scope.cancel = function () {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.export = function() {\n if (!_.isNil($scope.currentSimpleMapping) && !_.isEmpty($scope.currentSimpleMapping.entries)) {\n SheetJSService.exportXLSX(\n _.map($scope.currentSimpleMapping.entries, function(entry) {\n return _.pick(entry, ['key', 'value']);\n }),\n $scope.currentSimpleMapping.name,\n $scope.currentSimpleMapping.name\n );\n }\n };\n\n $scope.import = function() {\n $modal.open({\n templateUrl: 'tpl/simple-mapping/modal-import-simple-mappings.tpl.html',\n controller: 'ImportSimpleMappingsController',\n resolve: {\n data: function() {\n return {\n simpleMappingId: $scope.currentSimpleMapping.id,\n onSimpleMappingImported: $scope.onSimpleMappingImported\n };\n }\n },\n size: 'lg',\n backdrop: true,\n windowClass: 'import-simple-mapping-modal'\n });\n };\n\n $scope.prefill = function() {\n $modal.open({\n templateUrl: 'tpl/simple-mapping/modal-prefill-simple-mappings.tpl.html',\n controller: 'PrefillSimpleMappingsController',\n resolve: {\n data: function() {\n return {\n simpleMapping: $scope.currentSimpleMapping,\n onSimpleMappingImported: $scope.onSimpleMappingImported,\n linkableAttributes: $scope.allLinkableAttributes\n };\n }\n },\n size: 'lg',\n backdrop: true,\n windowClass: 'prefill-simple-mapping-modal'\n });\n };\n\n $scope.link = function() {\n $modal.open({\n templateUrl: 'tpl/simple-mapping/modal-prefill-simple-mappings.tpl.html',\n controller: 'PrefillSimpleMappingsController',\n resolve: {\n data: function() {\n return {\n simpleMapping: $scope.currentSimpleMapping,\n onSimpleMappingImported: $scope.onSimpleMappingImported,\n linkableAttributes: $scope.allLinkableAttributes,\n linkMode: true\n };\n }\n },\n size: 'lg',\n backdrop: true,\n windowClass: 'prefill-simple-mapping-modal'\n });\n };\n\n $scope.onSimpleMappingImported = function(importedSimpleMapping) {\n growl.success('SIMPLE_MAPPING.IMPORTED_SUCCESSFULLY');\n init(importedSimpleMapping);\n };\n\n $scope.onCurrentMappingsChange = function() {\n $scope.currentSimpleMapping.entries = [];\n SimpleMappingsResource.getEntries({\n id: $scope.currentSimpleMapping.id\n }, function(response) {\n $scope.currentSimpleMapping.entries = response;\n $scope.refreshData();\n }, function(response) {\n growl.error('SIMPLE_MAPPING.LOAD_FAILED');\n });\n };\n\n $scope.setSimpleMappingAsSelected = function(simpleMapping) {\n _.forEach($scope.simpleMappings, function(list) {\n list.selected = false;\n if ($scope.editState[list.id]) {\n $scope.cancelEditState(list);\n }\n });\n\n simpleMapping.selected = true;\n $scope.currentSimpleMapping = simpleMapping;\n $scope.onCurrentMappingsChange();\n };\n\n $scope.toggleCreateState = function() {\n $scope.newEntity.name = null;\n $scope.createNewState = !$scope.createNewState;\n };\n\n $scope.startEditState = function(simpleMapping) {\n $scope.editState[simpleMapping.id] = true;\n $scope.simpleMappingsInEditState[simpleMapping.id] = angular.copy(simpleMapping);\n };\n\n $scope.cancelEditState = function(simpleMapping) {\n $scope.editState[simpleMapping.id] = false;\n if ($scope.simpleMappingsInEditState[simpleMapping.id]) {\n simpleMapping.name = $scope.simpleMappingsInEditState[simpleMapping.id].name;\n }\n };\n\n $scope.cancelCreatingNewList = function() {\n $scope.createNewState = false;\n $scope.newEntity.name = '';\n };\n\n $scope.useSelectedMappingList = function() {\n data.onSimpleMappingSelected(data.entry, $scope.currentSimpleMapping);\n $modalInstance.close();\n };\n\n $scope.refreshData = function (searchTerm) {\n $scope.enrichEntriesWithDefaultValues($scope.currentSimpleMapping);\n if (_.isEmpty(searchTerm)) {\n $scope.filteredEntries = $scope.currentSimpleMapping.entries;\n } else {\n $scope.filteredEntries = $filter('filter')($scope.currentSimpleMapping.entries, searchTerm);\n }\n\n $scope.gridOptions.columnDefs = generateColumnDefinitions();\n if (!_.isNil($scope.gridApi)) {\n $scope.gridApi.core.notifyDataChange(uiGridConstants.dataChange.ALL);\n }\n };\n\n $scope.removeSimpleMappingFromList = function(simpleMapping) {\n $scope.simpleMappings = _.remove($scope.simpleMappings, function(entry) {\n return simpleMapping.id != entry.id;\n });\n\n if (!_.isEmpty($scope.simpleMappings)) {\n $scope.setSimpleMappingAsSelected($scope.simpleMappings[0]);\n } else {\n $scope.currentSimpleMapping = null;\n }\n };\n\n $scope.createNewSimpleMapping = function() {\n if (_.isEmpty($scope.newEntity.name)) {\n return;\n }\n\n SimpleMappingsResource.create({\n name: $scope.newEntity.name\n }, function(response) {\n $scope.createNewState = false;\n $scope.simpleMappings.push(response);\n $scope.setSimpleMappingAsSelected(response);\n growl.success('SIMPLE_MAPPING.CREATE_SUCCESSFUL');\n }, function(response) {\n if (response.data.errorCode) {\n growl.error(response.data.message, {\n variables: {\n mappingName: $scope.newEntity.name\n },\n ttl: -1\n });\n } else {\n growl.error('SIMPLE_MAPPING.SAVE_FAILED');\n }\n });\n };\n\n $scope.updateSimpleMapping = function(simpleMapping) {\n if (_.isEmpty(simpleMapping.name)) {\n return;\n }\n\n SimpleMappingsResource.update({\n id: simpleMapping.id\n },{\n id: simpleMapping.id,\n name: simpleMapping.name\n }, function(response) {\n $scope.editState[simpleMapping.id] = false;\n growl.success('SIMPLE_MAPPING.UPDATE_SUCCESSFUL');\n }, function(response) {\n if (response.data.errorCode) {\n growl.error(response.message);\n } else {\n growl.error('SIMPLE_MAPPING.SAVE_FAILED');\n }\n });\n };\n\n $scope.deleteSimpleMapping = function(simpleMapping) {\n var confirmDialog = $dialogs.confirm('CONFIRM_DELETE', 'TEMPLATE_MAPPINGS.CONFIRM_DELETE');\n confirmDialog.result.then(function(){\n $scope.confirmDeleteSimpleMapping(simpleMapping);\n });\n };\n\n $scope.confirmDeleteSimpleMapping = function(simpleMapping) {\n SimpleMappingsResource.delete({\n id: $scope.currentSimpleMapping.id\n }, function(response) {\n growl.success('SIMPLE_MAPPING.DELETE_SUCCESSFUL');\n $scope.removeSimpleMappingFromList(simpleMapping);\n }, function(response) {\n growl.error('SIMPLE_MAPPING.DELETE_FAILED');\n });\n };\n\n $scope.removeEntryFromEntries = function(entry) {\n $scope.currentSimpleMapping.entries = _.remove($scope.currentSimpleMapping.entries, function(_entry) {\n return entry.key != _entry.key;\n });\n $scope.refreshData();\n };\n\n $scope.createEntry = function () {\n var entry = {\n key: '',\n value: '',\n _new: true\n };\n\n $scope.currentSimpleMapping.entries.unshift(entry);\n $scope.refreshData();\n\n $timeout(function () {\n $scope.gridApi.cellNav.scrollToFocus($scope.currentSimpleMapping.entries[0], $scope.columnDefs[0]);\n });\n };\n\n $scope.saveEntry = function(entry) {\n if (entry._new) {\n SimpleMappingsResource.createEntry({\n id: $scope.currentSimpleMapping.id,\n key: entry.key\n }, {\n key: entry.key,\n value: entry.value\n }, function(response) {\n growl.success('SAVE_SUCCESS_MESSAGE');\n $timeout(function() {\n entry._new = false;\n entry._dirty = false;\n });\n }, function(response) {\n growl.error('SIMPLE_MAPPING.SAVE_FAILED');\n });\n } else {\n SimpleMappingsResource.updateEntry({\n id: $scope.currentSimpleMapping.id,\n key: entry.key\n }, {\n key: entry.key,\n value: entry.value\n }, function(response) {\n growl.success('SAVE_SUCCESS_MESSAGE');\n $timeout(function() {\n entry._new = false;\n entry._dirty = false;\n });\n }, function(response) {\n growl.error('SIMPLE_MAPPING.SAVE_FAILED');\n });\n }\n };\n\n $scope.deleteEntry = function (entry) {\n if (entry._new) {\n $scope.removeEntryFromEntries(entry);\n } else {\n SimpleMappingsResource.deleteEntry({\n id: $scope.currentSimpleMapping.id,\n key: entry.key\n }, function(response) {\n growl.success('SIMPLE_MAPPING.DELETE_SUCCESSFUL');\n $scope.removeEntryFromEntries(entry);\n }, function(response) {\n growl.error('SIMPLE_MAPPING.DELETE_FAILED');\n });\n }\n };\n\n $scope.deleteSelectedEntries = function () {\n var selectedEntries = $scope.gridApi.selection.getSelectedRows();\n\n if (_.isEmpty($scope.currentSimpleMapping.entries) || _.isEmpty(selectedEntries)) {\n return false;\n }\n\n var confirmDialog = $dialogs.confirm('CONFIRM_DELETE', 'TEMPLATE_MAPPINGS.CONFIRM_DELETE');\n confirmDialog.result.then(function(){\n $scope.confirmDeleteSelectedEntries($scope.currentSimpleMapping.id, _.map(selectedEntries, function(entry) { return entry.key; }));\n });\n };\n\n $scope.confirmDeleteSelectedEntries = function(simpleMappingId, keys) {\n // FIXME: Solved in angular +1.6.4, as they interpret the specs such that the DELETE request has no body in prior versions.\n $http({\n method: 'DELETE',\n url: lax_rest_url('simpleMappings') + '/' + simpleMappingId + '/entries',\n data: keys,\n headers: {'Content-Type': 'application/json;charset=utf-8'}\n }).then(function(response) {\n growl.success('SIMPLE_MAPPING.DELETE_SUCCESSFUL');\n $scope.onCurrentMappingsChange();\n }, function(response) {\n $log.error(response);\n growl.error('SIMPLE_MAPPING.DELETE_FAILED');\n });\n };\n\n $scope.gridHeight = function () {\n if ($scope.mode === $scope.MODE_SCREEN) {\n var w = angular.element($window);\n if (w.width() < 992) {\n return;\n }\n var footer = angular.element('footer');\n var boxContent = angular.element('.box-content');\n var content = angular.element('#content');\n var boxContentPadding = parseInt(boxContent.css('padding-bottom'), 10);\n var contentPadding = parseInt(content.css('padding-bottom'), 10);\n var offset = 630;\n if (angular.element(\"#simple-mappings-grid\") && angular.element(\"#simple-mappings-grid\").offset()) {\n offset = angular.element(\"#simple-mappings-grid\").offset().top + footer.innerHeight() + boxContentPadding + contentPadding;\n }\n var newHeight = w.height() - offset;\n\n if ($scope.gridApi) {\n $scope.gridApi.grid.gridHeight = newHeight;\n }\n\n return {\n 'height': newHeight + \"px\"\n };\n }\n };\n\n $scope.showLinkedAttributesTooltip = function() {\n\n if (_.isEmpty($scope.currentSimpleMapping.linkedAttributes)) {\n return;\n }\n\n var linkedAttributesList = [];\n _.forEach($scope.currentSimpleMapping.linkedAttributes, function(attribute){\n linkedAttributesList.push(\n '
  • ' +\n $scope.translateAttributeByName(attribute) +\n '
  • '\n );\n });\n\n function customRendererFn() {\n var attributeStart = '
    ' + '
      ';\n var attributeEnd = '
    ' +\n '
    ' +\n '';\n return attributeStart + _.join(linkedAttributesList, '') + attributeEnd;\n }\n\n var calloutConfig = {\n id: 'callout_' + $scope.currentSimpleMapping.id, //normalize id\n target: 'linked_attributes_btn',\n placement: 'bottom',\n content: '',\n customRenderer: customRendererFn\n };\n\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeAllCallouts();\n\n var calloutEle = calloutMgr.createCallout(calloutConfig);\n // Hack: override !important css rules, with inline precedence\n calloutEle.element.style.cssText += 'border: none !important; z-index: 1049;';\n };\n\n $scope.hideTooltip = function() {\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeAllCallouts();\n };\n\n $scope.translateAttributeByName = function(attributeName) {\n var attribute = _.find($scope.allLinkableAttributes, ['name', attributeName]);\n\n if (!_.isNil(attribute)) {\n return $rootScope.translateAttribute(attribute.label);\n } else {\n return attributeName;\n }\n };\n\n $scope.gridOptions = {\n data: 'filteredEntries',\n columnDefs: generateColumnDefinitions(),\n enableHorizontalScrollbar: 1,\n enableVerticalScrollbar: 1,\n enableColumnMenus: false,\n rowHeight: 34,\n onRegisterApi: function (gridApi) {\n $scope.gridApi = gridApi;\n gridApi.edit.on.afterCellEdit($scope, afterEntriesCellEdit);\n }\n };\n\n $scope.enrichEntriesWithDefaultValues = function(simpleMapping) {\n if (!_.isNil(simpleMapping.linkedAttributes)) {\n simpleMapping.entries = _.map(simpleMapping.entries, function(entry) {\n\n for (var i = 0; i < simpleMapping.linkedAttributes.length; i++) {\n var translatedValue = $rootScope.translateOption(entry.key, simpleMapping.linkedAttributes[i], function() { return null; });\n\n if (!_.isNil(translatedValue)) {\n entry.defaultValue = translatedValue;\n break;\n }\n }\n\n return entry;\n });\n } else {\n return;\n }\n };\n\n function init(simpleMapping) {\n SimpleMappingsResource.getAll(function(response) {\n $scope.simpleMappings = response;\n if ($scope.simpleMappings.length > 0) {\n if (!_.isNil(simpleMapping)) {\n var simpleMappingToSelect = _.find($scope.simpleMappings, function(_simpleMapping){\n return _simpleMapping.name === simpleMapping || _simpleMapping.id == simpleMapping;\n });\n $scope.setSimpleMappingAsSelected(simpleMappingToSelect);\n } else {\n $scope.setSimpleMappingAsSelected($scope.simpleMappings[0]);\n }\n }\n }, function(response) {\n growl.error('SIMPLE_MAPPING.LOAD_FAILED');\n });\n\n SimpleMappingsService.getLinkableAttributes($scope, function(attributes) {\n $scope.allLinkableAttributes = attributes;\n });\n }\n\n function generateColumnDefinitions() {\n var columnDefs = [{\n field: 'key',\n displayName: $translate.instant('SIMPLE_MAPPING.KEY'),\n headerTooltip: true,\n cellTooltip: true,\n enableCellEdit: true,\n enableCellEditOnFocus: true,\n cellEditableCondition: true,\n width: '*',\n editableCellTemplate:\n '
    ' +\n '
    ' +\n ' ' +\n '
    ' +\n '
    '\n }];\n\n if (!_.isNil($scope.currentSimpleMapping) && !_.isEmpty($scope.currentSimpleMapping.linkedAttributes)) {\n columnDefs.push({\n field: 'defaultValue',\n displayName: $translate.instant('SIMPLE_MAPPING.LABEL'),\n headerTooltip: true,\n cellTooltip: true,\n enableCellEdit: false,\n width: '*'\n });\n }\n\n columnDefs.push({\n field: 'value',\n displayName: $translate.instant('SIMPLE_MAPPING.VALUE'),\n headerTooltip: true,\n cellTooltip: true,\n cellEditableCondition: true,\n width: '*',\n editableCellTemplate:\n '
    ' +\n '
    ' +\n ' ' +\n '
    ' +\n '
    '\n });\n\n columnDefs.push({\n field: 'actions',\n displayName: '',\n enableCellSelection: false,\n allowCellFocus: false,\n enableCellEdit: false,\n enableHiding: false,\n cellClass: 'text-right',\n headerCellClass: 'text-right',\n enableColumnResizing: false,\n enableSorting: false,\n pinnedRight: true,\n width: 80,\n cellTemplate:\n '
    ' +\n '
    ' +\n '' +\n '' +\n '
    ' +\n '
    '\n });\n\n return columnDefs;\n }\n\n function afterEntriesCellEdit(rowEntity, colDef, newValue, oldValue) {\n $scope.$apply(function(scope) {\n rowEntity._dirty = true;\n });\n }\n\n if (!_.isNil(data.simpleMappingName)) {\n init(data.simpleMappingName);\n } else {\n init();\n }\n }\n );","angular.module('llax')\n .controller('TemplateMappingEditorController', function ($location, $modal, $rootScope, $routeParams, $scope,\n $timeout, ExportMappingResource, growl, SheetJSService, TemplateMappingService) {\n\n var EXCEL_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n var ZIP_CONTENT_TYPE = 'application/zip';\n\n $scope.TYPE_LIST = 'LIST';\n $scope.TYPE_PAGE = 'PAGE';\n\n $scope.sheets = [];\n $scope.gridApi = null;\n $scope.mappingFunctions = [];\n $scope.filteredLayoutAttributes = [];\n $scope.allAttributes = [];\n $scope.preview = false;\n $scope.filteredMappings__ = [];\n $scope.sheetJSFile = null;\n $scope.spreadsheetViewerInstance = null;\n\n // Load non-AMD dependencies\n requirejs([\n 'assets/codemirror/js/codemirror.js',\n ], function(codemirror) {\n window.CodeMirror = codemirror;\n\n define('assets/lib/codemirror', [], function() { return window.CodeMirror; });\n\n // Once we've defined Codemirror, we can load any language mode\n requirejs(['assets/codemirror/js/ruby.js']);\n });\n\n $scope.addMappingEntry = function(id) {\n $scope.template.mappings.unshift({\n id: getLastEntryId(),\n externalName: '',\n location: '',\n internalName: '',\n mappingFunction: ''\n });\n $scope.filteredMappings__ = filterMappingsOnSheetName();\n };\n\n $scope.saveTemplate = function() {\n if (_.isEmpty($scope.template.name)) {\n growl.error('TEMPLATE_MAPPINGS.TEMPLATE_NAME_REQUIRED');\n return;\n }\n\n var mergedMappings =\n _($scope.template.mappings)\n .keyBy('id')\n .merge(_.keyBy($scope.filteredMappings__, 'id'))\n .values()\n .value();\n\n // TODO: Add a field to let the user decide if mapping should be \"private\" or not!\n var importExportEntity = {\n name: $scope.template.name,\n contentType: contentTypeForTemplateType($scope.template.templateType),\n userId: $rootScope.userId,\n templateType: $scope.template.templateType,\n templateSheets: $scope.sheets,\n templateUrl: $scope.template.templateUrl,\n templateCustomAttributes: $scope.template.templateCustomAttributes,\n mappings: _.map(\n mergedMappings,\n function(mapping) {\n return {\n internalName: mapping.internalName,\n externalName: mapping.externalName,\n location: mapping.location,\n mappingFunction: mapping.mappingFunction__ ? mapping.mappingFunction__.name : '',\n mappingFunctionParams: mapping.mappingFunctionParams\n };\n }\n ),\n privateMapping: $scope.template.privateMapping || false\n };\n\n // TODO: Ensure mapping does not yet exist!\n // I.e. check e.g. \"createdAt\" and \"createdBy\" (set on save)\n // if it is and name was not changed -> fine\n // if it is NOT set OR name was changed -> Load new name to see if it exists and ask user to overwrite!\n\n ExportMappingResource.save({},\n importExportEntity,\n function (response) {\n growl.success(\"SUCCESS\");\n },\n function (errorResponse) {\n growl.error(\"TEMPLATE_MAPPINGS.SAVING_MAPPING_FAILED\");\n }\n );\n };\n\n $scope.onConfigureSimpleMappingList = function(entry) {\n var simpleMappingParamName = TemplateMappingService.getSimpleMappingParameterName(entry.mappingFunction__);\n $modal.open({\n templateUrl: 'tpl/template-mapping/modal-simple-mapping.tpl.html',\n controller: 'SimpleMappingsController',\n resolve: {\n data: function() {\n return {\n entry: entry,\n simpleMappingName: _.get(entry.mappingFunctionParams, simpleMappingParamName),\n onSimpleMappingSelected: $scope.onSimpleMappingSelected\n };\n }\n },\n size: 'lg',\n backdrop: true,\n windowClass: 'template-export-simple-mapping-modal'\n });\n };\n\n $scope.onConfigureMappingFunction = function(entry) {\n $modal.open({\n templateUrl: 'tpl/template-mapping/modal-mapping-function-default.tpl.html',\n controller: 'MappingFunctionDefaultController',\n resolve: {\n data: function () {\n return entry;\n },\n onFunctionParametersSaved: function() {\n return $scope.onFunctionParametersSaved;\n }\n },\n size: 'md',\n backdrop: true,\n windowClass: 'template-export-code-list-modal'\n });\n };\n\n $scope.onConfigureCustomCodeMappingFunction = function(entry) {\n $modal.open({\n templateUrl: 'tpl/template-mapping/modal-mapping-function-custom-code.tpl.html',\n controller: 'MappingFunctionCustomCodeController',\n resolve: {\n data: function () {\n return entry;\n },\n onFunctionParametersSaved: function() {\n return $scope.onFunctionParametersSaved;\n }\n },\n size: 'md',\n backdrop: true,\n windowClass: 'template-export-code-list-modal'\n });\n };\n\n $scope.getUploadConfiguration = function() {\n return {\n url: lax_rest_url('assets'),\n reset: true,\n uploadComplete: function (response) {\n $timeout(function() {\n $scope.preview = true;\n }, 0);\n }\n };\n };\n\n $scope.onSimpleMappingSelected = function(mappingEntry, simpleMapping) {\n mappingEntry.mappingFunctionParams = {};\n mappingEntry.mappingFunctionParams[mappingEntry.mappingFunction__.parameters[0].name] = simpleMapping.name;\n };\n\n $scope.onFunctionParametersSaved = function(entry, params) {\n entry.mappingFunctionParams = {};\n entry.mappingFunctionParams = angular.copy(params);\n };\n\n $scope.onFocusSpreadsheetCell = function(locationString) {\n if (!_.isEmpty(locationString)) {\n var a1NotationLocation = TemplateMappingService.getA1NotationFromLocationString(locationString);\n var numberBasedLocation = TemplateMappingService.convertFromA1Notation(a1NotationLocation);\n $scope.spreadsheetViewerInstance.focusSpreadsheetCell(numberBasedLocation.row, numberBasedLocation.col);\n }\n };\n\n $scope.resetFile = function() {\n $scope.preview = false;\n $scope.filteredMappings__.length = 0;\n $scope.sheets = [];\n $scope.template.templateUrl = null;\n $scope.template.templateSheets = null;\n $scope.template.sheet = null;\n $scope.templateFileName = null;\n $scope.templateFileArrayBuffer = null;\n $scope.filteredMappings__ = filterMappingsOnSheetName();\n };\n\n $scope.goBack = function() {\n $location.path('export-templates').search('');\n };\n\n $scope.enterFocusMode = function() {\n $timeout(function() {\n $rootScope.$broadcast('toggleSidebar');\n }, 500);\n };\n\n $scope.handsontableOnChange = function(fileName, fileAsArrayBuffer) {\n $timeout(function() {\n $scope.preview = true;\n $scope.templateFileArrayBuffer = fileAsArrayBuffer;\n $scope.templateFileName = fileName;\n }, 0);\n };\n\n $scope.onTemplateLoad = function(spreadsheetViewerInstance, sheets) {\n $timeout(function() {\n $scope.spreadsheetViewerInstance = spreadsheetViewerInstance;\n\n if (_.isEmpty($scope.template.templateSheets)) {\n _.forEach(sheets, function(sheetName) {\n $scope.sheets.push({\n name: sheetName,\n headerRow: 1,\n dataRow: 2\n });\n });\n } else {\n // Merge old sheets with new ones extracted from the template\n $scope.sheets = _.filter($scope.template.templateSheets, function(sheet) {\n return sheets.indexOf(sheet.name) != -1;\n });\n }\n\n if ($scope.sheets.length != 0) {\n $scope.template.sheet = $scope.sheets[0];\n }\n\n $scope.$emit('template-file-loaded');\n }, 0);\n };\n\n $scope.onSheetChange = function() {\n $scope.filteredMappings__ = filterMappingsOnSheetName();\n };\n\n $scope.onDropdownSheetChange = function() {\n $scope.spreadsheetViewerInstance.selectSheet($scope.template.sheet.name);\n $scope.onSheetChange();\n };\n\n $scope.onTemplateSheetChange = function(e) {\n $timeout(function() {\n $scope.template.sheet = $scope.sheets[e.detail.sheet];\n $scope.onSheetChange();\n }, 0);\n };\n\n $scope.onTemplateCellChange = function(event) {\n var sheetName = _.get($scope.template.sheet, 'name');\n var templateFileCol = event.detail.range[1];\n var templateFileRow = event.detail.range[0];\n var mappingsRowCol = $scope.gridApi.cellNav.getFocusedCell();\n\n // If the 'location' cell of the mapping entries is selected/focused, then fill the cell's location.\n if (mappingsRowCol != null && mappingsRowCol.col.colDef.name === 'location') {\n $timeout(function() {\n $scope.filteredMappings__[mappingsRowCol.row.index].location =\n sheetName +\n '!' +\n TemplateMappingService.convertToA1Notation(templateFileCol + 1) + (templateFileRow + 1);\n }, 0);\n }\n };\n\n $scope.uploadSheetViaHandsontable = function() {\n $timeout(function() {\n document.getElementById('handsontableFileUploader').click();\n }, 0);\n };\n\n $scope.fillHeader = function() {\n if ($scope.preview && $scope.templateFileArrayBuffer && !_.isNil($scope.template.sheet) && _.isNumber($scope.template.sheet.headerRow)) {\n var workbook = SheetJSService.readFile($scope.templateFileArrayBuffer);\n\n var sheet = workbook.Sheets[$scope.template.sheet.name];\n var headerCells = SheetJSService.getRowCells(sheet, $scope.template.sheet.headerRow - 1);\n _.forEach(headerCells, function(headerCell) {\n var locationString = $scope.template.sheet.name + '!' + headerCell.location;\n\n // Prevent duplication of mapping entry based on its location\n var existingLocation = _.find($scope.template.mappings, { location: locationString });\n if (_.isNil(existingLocation)) {\n $scope.template.mappings.push({\n id: getLastEntryId(),\n externalName: headerCell.value,\n location: locationString,\n internalName: '',\n mappingFunction: ''\n });\n }\n });\n $scope.filteredMappings__ = filterMappingsOnSheetName();\n }\n };\n\n $scope.uploadFile = function() {\n return {\n url: lax_rest_url('assets'),\n reset: true,\n uploadComplete: function(response) {\n var template = response.map(function(asset) {\n var result = {};\n result.url = asset.url;\n result.gathering = asset.gatheringKey;\n result.path = asset.path;\n result.name = asset.path.substr(1); //remove trailing /\n return result;\n })[0];\n\n $scope.template.templateUrl = template.url;\n\n loadTemplateFile($scope.template.templateUrl);\n }\n };\n };\n\n $scope.onDeleteMappingEntry = function(entry) {\n $scope.template.mappings = _.filter($scope.template.mappings, function(mapping) {\n return mapping.id != entry.id;\n });\n $scope.filteredMappings__ = filterMappingsOnSheetName();\n };\n\n $scope.addResetMappingFunctionOption = function() {\n $scope.mappingFunctions.unshift({\n label: 'None'\n });\n };\n\n $scope.addResetModelAttributeOption = function() {\n $scope.filteredLayoutAttributes.unshift({\n name: 'None'\n });\n };\n\n $scope.onLoad = function() {\n $scope.filteredLayoutAttributes = TemplateMappingService.getFilteredLayoutAttributes();\n $scope.allAttributes = TemplateMappingService.getAllModelAttributes();\n $scope.addResetModelAttributeOption();\n if (!_.isEmpty($rootScope.dataModel.getMappingFunctions())) {\n $scope.mappingFunctions = _.values($rootScope.dataModel.getMappingFunctions());\n $scope.translateMappingFunctions($scope.mappingFunctions);\n $scope.addResetMappingFunctionOption();\n } else {\n $scope.mappingFunctions = [];\n }\n getTemplate();\n };\n\n $scope.translateMappingFunctions = function(mappingFunctions) {\n _.forEach(mappingFunctions, function(mappingFunction) {\n mappingFunction.translatedLabel = $rootScope.translateMappingFunction(mappingFunction);\n mappingFunction.translatedDescription = $rootScope.translateMappingFunctionDescription(mappingFunction);\n\n _.forEach(mappingFunction.parameters, function(parameter){\n parameter.translatedLabel = $rootScope.translateMappingFunctionParam(mappingFunction, parameter);\n parameter.translatedDescription = $rootScope.translateMappingFunctionParamDescription(mappingFunction, parameter);\n });\n });\n };\n\n $scope.$on('$destroy', function(){\n $rootScope.$broadcast('toggleSidebar');\n });\n\n function loadTemplateFile(templateUrl) {\n if (_.isNil(templateUrl)) {\n return;\n }\n\n var templateName = extractTemplateNameFromUrl(templateUrl);\n\n var request = new XMLHttpRequest();\n request.responseType = 'blob';\n request.onload = function() {\n var reader = new FileReader();\n\n reader.onload = function (e) {\n var arrayBuffer = e.target.result;\n $scope.handsontableOnChange(templateName, arrayBuffer);\n };\n\n reader.readAsArrayBuffer(request.response);\n };\n request.open(\"GET\", templateUrl, true);\n request.send();\n }\n\n function extractTemplateNameFromUrl(url) {\n return url.substring(url.lastIndexOf('/') + 1);\n }\n\n function init() {\n if ($rootScope.isDataModelLoaded) {\n $scope.onLoad();\n } else {\n $scope.$on('dataModelLoaded', function() {\n $scope.onLoad();\n });\n }\n }\n\n function getTemplate() {\n if (_.isEmpty($routeParams.name) || $routeParams.name === '_new') {\n $scope.template = {\n templateType: $scope.TYPE_LIST,\n templateCustomAttributes: [],\n mappings: []\n };\n } else {\n\n var key = $routeParams.name;\n ExportMappingResource.get({\n key: key\n },function(response) {\n\n $scope.template = response.data;\n $scope.template.mappings = prepareMappings($scope.template.mappings);\n\n if ($scope.template.templateUrl) {\n loadTemplateFile($scope.template.templateUrl);\n }\n\n $scope.filteredMappings__ = filterMappingsOnSheetName();\n }, function(response) {\n growl.error('TEMPLATE_MAPPING.LOAD_FAILED');\n });\n }\n }\n\n function filterMappingsOnSheetName() {\n return _.filter($scope.template.mappings, function(mapping) {\n if (mapping.location === '') {\n return true;\n } else if (_.isNil($scope.template.sheet) || _.isNil($scope.template.sheet.name)) {\n return true;\n } else {\n var sheetName = TemplateMappingService.getSheetNameFromLocationString(mapping.location);\n if (_.isNil(sheetName)) {\n sheetName = $scope.template.sheet.name;\n }\n return sheetName === $scope.template.sheet.name;\n }\n });\n }\n\n function prepareMappings(mappings) {\n return _.map(mappings, function(map, index) {\n if (map.internalName) {\n map.internalName__ = _.find($scope.filteredLayoutAttributes, function(attribute) {\n return map.internalName === attribute.value;\n });\n }\n\n if (map.mappingFunction) {\n map.mappingFunction__ = _.find($scope.mappingFunctions, function(mappingFunction) {\n return mappingFunction.name === map.mappingFunction;\n });\n }\n\n map.id = index + 1;\n return map;\n });\n }\n\n function getLastEntryId() {\n var maxIdEntry = _.maxBy($scope.template.mappings, 'id');\n\n if (maxIdEntry) {\n return maxIdEntry.id + 1;\n } else {\n return 0;\n }\n }\n\n function contentTypeForTemplateType(type) {\n if (type == $scope.TYPE_LIST) {\n return EXCEL_CONTENT_TYPE;\n } else if (type == $scope.TYPE_PAGE) {\n return ZIP_CONTENT_TYPE;\n }\n return null;\n }\n\n init();\n });\n","angular.module('llax')\n .controller('MappingFunctionCustomCodeController',\n function($modalInstance, $scope, $timeout, data, onFunctionParametersSaved) {\n $scope.mappingFunction = data.mappingFunction__;\n $scope.params = data.mappingFunctionParams || {};\n $scope.editorOptions = {\n lineWrapping : true,\n lineNumbers: true,\n mode: 'ruby',\n autoRefresh: true,\n };\n\n $scope.onEditorLoaded = function(editor) {\n $timeout(function() {\n editor.refresh();\n editor.setCursor({ line: 1, ch: 0 });\n }, 0);\n };\n\n $scope.cancel = function () {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.save = function() {\n //TODO: check that all required parameters are selected.\n\n onFunctionParametersSaved(data, $scope.params);\n $scope.cancel();\n };\n }\n );","angular.module('llax')\n .controller('MappingFunctionDefaultController',\n function($log, $modal, $modalInstance, $rootScope, $scope, $timeout, $q, data, growl, onFunctionParametersSaved, SimpleMappingsResource, TemplateMappingService) {\n $scope.mappingFunction = data.mappingFunction__;\n $scope.params = data.mappingFunctionParams || {};\n $scope.tempParamsModel = {};\n $scope.mappingAttributes = [];\n $scope.simpleMappings = [];\n $scope.editorOptions = {\n lineWrapping : true,\n lineNumbers: true,\n mode: 'ruby',\n autoRefresh: true,\n };\n\n $scope.PARAM_TYPES = TemplateMappingService.PARAM_TYPES;\n $scope.getParameterType = TemplateMappingService.getParameterType;\n\n $scope.getSelectFromObject = function(parameter) {\n return TemplateMappingService.parseSelectFrom(parameter);\n };\n\n $scope.getSelectFromValues = function(parameter) {\n // Defines the 'source' to select the values from.\n // type 'object': Used for data model defined objects which includes:\n // 'simple_mappings' -> Select any simple-mapping\n // 'attributes' -> Select any attribute in the data model\n // FIXME: Future uses:\n // 'mapping_attributes' -> Select any attribute in the current mapping layout\n // 'users' -> Select any user\n // 'contacts' -> Select any contact\n // 'codelists' -> Select any codelist\n\n if (_.isString(parameter)) {\n parameter = getParameterMetaData(parameter);\n }\n\n switch($scope.getSelectFromObject(parameter)) {\n case 'attributes':\n return $scope.mappingAttributes;\n case 'simple_mappings':\n return $scope.simpleMappings;\n default:\n $log.error('Unrecognized parameter\\'s selectFrom array', param);\n return [];\n }\n };\n\n $scope.cancel = function () {\n $modalInstance.dismiss('cancel');\n };\n\n $scope.save = function() {\n // Prevent saving if not all required parameters are selected:\n var requiredParameters = _.filter($scope.mappingFunction.parameters, function(parameter) {\n // Required parameters are the ones which are not optional and don't have a default value\n return !parameter.optional && _.isNil(parameter.defaultValue);\n });\n var actualParameters = _.filter(_.keys($scope.params), function(parameterName) {\n return !_.isEmpty($scope.params[parameterName]);\n });\n\n var missingParameters =\n _.differenceWith(\n requiredParameters,\n actualParameters,\n function(firstSetEntry, secondSetEntry) {\n return firstSetEntry.name === secondSetEntry;\n }\n );\n\n if (missingParameters.length === 0) {\n onFunctionParametersSaved(data, $scope.params);\n $scope.cancel();\n } else {\n growl.error('TEMPLATE_MAPPINGS.FILL_REQUIRED_PARAMS');\n }\n };\n\n $scope.onEditSimpleMappingClick = function(param) {\n $modal.open({\n templateUrl: 'tpl/simple-mapping/modal-simple-mapping.tpl.html',\n controller: 'SimpleMappingsController',\n resolve: {\n data: function() {\n return {\n entry: param,\n onSimpleMappingSelected: $scope.onSimpleMappingFromSimpleMappingsModalSelected\n };\n }\n },\n size: 'lg',\n backdrop: true,\n windowClass: 'template-export-simple-mapping-modal'\n });\n };\n\n $scope.onSimpleMappingFromSimpleMappingsModalSelected = function(param, chosenSimpleMapping) {\n $scope.params[param.name] = chosenSimpleMapping.name;\n };\n\n function onLoaded() {\n $scope.mappingAttributes = TemplateMappingService.getFilteredLayoutAttributes();\n\n _.forEach($scope.mappingFunction.parameters, function(parameter) {\n parameter.uiType = $scope.getParameterType(parameter);\n\n var paramValue = $scope.params[parameter.name];\n if (_.isNil(paramValue) && !_.isNil(parameter.defaultValue)) {\n $scope.params[parameter.name] = parameter.defaultValue;\n }\n });\n }\n\n function getParameterMetaData(paramName) {\n return _.find($scope.mappingFunction.parameters, { name: paramName });\n }\n\n function loadSimpleMappings(resolve, reject) {\n SimpleMappingsResource.getAll(function(response) {\n $scope.simpleMappings = _.map(response, function(simpleMapping) {\n return {\n name: simpleMapping.name,\n value: simpleMapping.name\n };\n });\n resolve();\n }, function(response) {\n growl.error('SIMPLE_MAPPING.LOAD_FAILED');\n reject();\n });\n }\n\n function init() {\n $q.all([\n $q(function(resolve, reject) {\n loadSimpleMappings(resolve, reject);\n }),\n $q(function(resolve, reject) {\n if ($rootScope.isDataModelLoaded) {\n resolve();\n } else {\n $scope.mappingAttributes = [];\n $scope.$on('dataModelLoaded', function() {\n resolve();\n });\n }\n })\n ]).then(function() {\n onLoaded();\n });\n }\n\n init();\n }\n );","angular.module('llax')\n .controller('TemplateMappingListController',\n function($dialogs, $location, $log, $scope, $translate, $window, ExportMappingResource, growl) {\n var TYPE_LIST = 'LIST';\n var TYPE_PAGE = 'PAGE';\n $scope.isLoading = true;\n $scope.templates = [];\n\n var columnDefs = [{\n field: 'name',\n displayName: $translate.instant('TEMPLATE_MAPPINGS.NAME'),\n headerTooltip: true,\n cellTooltip: true,\n cellTemplate:\n ''\n }, {\n field: 'templateType',\n displayName: $translate.instant('TEMPLATE_MAPPINGS.TYPE'),\n headerTooltip: true,\n cellTemplate:\n '
    ' +\n 'TEMPLATE_MAPPINGS.TYPE.LIST' +\n 'TEMPLATE_MAPPINGS.TYPE.PAGE' +\n '
    '\n }, {\n field: 'createdBy',\n displayName: $translate.instant('CREATED_BY'),\n headerTooltip: true,\n cellTooltip: true\n }, {\n field: 'createdAt',\n displayName: $translate.instant('CREATED_AT'),\n headerTooltip: true,\n cellTemplate: '
    {{row.entity.createdAt | date: \\'shortDate\\'}}
    '\n }, {\n field: 'updatedBy',\n displayName: $translate.instant('UPDATED_BY'),\n headerTooltip: true,\n cellTooltip: true\n }, {\n field: 'updatedAt',\n displayName: $translate.instant('UPDATED_AT'),\n headerTooltip: true,\n cellTemplate: '
    {{row.entity.updatedAt | date: \\'shortDate\\'}}
    '\n }, {\n field: 'privateMapping',\n displayName: $translate.instant('EXPORT.PRIVATE'),\n headerTooltip: true,\n cellTemplate: '
    '\n }, {\n displayName: $translate.instant('ACTIONS'),\n headerTooltip: true,\n name: 'actions',\n enableCellEdit: false,\n enableCellSelection: false,\n allowCellFocus: false,\n pinnedRight: true,\n enableColumnResizing: false,\n enableSorting: false,\n enableHiding: false,\n resizable: false,\n width: 120,\n cellTemplate:\n '
    ' +\n '' +\n '' +\n '
    '\n }];\n\n $scope.gridOptions = {\n data: 'templates',\n enableColumnMenus: false,\n columnDefs: columnDefs,\n onRegisterApi: function (gridApi) {\n $scope.gridApi = gridApi;\n }\n };\n\n $scope.createExportTemplate = function() {\n $location.path('export-templates/_new');\n };\n\n $scope.deleteTemplate = function(template) {\n var confirmDialog = $dialogs.confirm('CONFIRM_DELETE', 'TEMPLATE_MAPPINGS.CONFIRM_DELETE');\n confirmDialog.result.then(function(){\n ExportMappingResource.delete({}, {\n mappingName: template.name\n },\n function(response) {\n growl.success(\"SUCCESS\");\n init();\n },\n function(response) {\n growl.error(\"TEMPLATE_MAPPINGS.DELETE_TEMPLATE_FAILED\");\n });\n });\n };\n\n $scope.editTemplate = function(template) {\n $location.path('export-templates/' + template.key);\n };\n\n $scope.getEncodedURLComponentString = function(urlComponent) {\n return encodeURIComponent(urlComponent);\n };\n\n $scope.gridHeight = function () {\n var w = angular.element($window);\n if (w.width() < 992) {\n return;\n }\n var footer = angular.element('footer');\n var boxContent = angular.element('.box-content');\n var content = angular.element('#content');\n var boxContentPadding = parseInt(boxContent.css('padding-bottom'), 10);\n var contentPadding = parseInt(content.css('padding-bottom'), 10);\n var offset = 630;\n if (angular.element(\"#templates-grid\") && angular.element(\"#templates-grid\").offset()) {\n offset = angular.element(\"#templates-grid\").offset().top + footer.innerHeight() + boxContentPadding + contentPadding;\n }\n var newHeight = w.height() - offset;\n\n if ($scope.gridApi) {\n $scope.gridApi.grid.gridHeight = newHeight;\n }\n\n return {\n 'height': newHeight + \"px\"\n };\n };\n\n function init() {\n ExportMappingResource.getTemplateMappings(\n function(response) {\n $scope.isLoading = false;\n $scope.templates = response.data;\n },\n function(response) {\n $log.error(response);\n growl.error('TEMPLATE_MAPPINGS.LOAD_FAILED');\n });\n }\n\n init();\n }\n );\n","angular.module('llax')\n .controller('TemplateMappingSelectorController',\n function(ExportMappingResource, ExportMappingService, $modalInstance, $rootScope, $scope, data) {\n\n $scope.templates = [];\n $scope.selectedTemplateCustomAttributes = [];\n $scope.customValues = {};\n\n $scope.form = {\n selectedTemplate: null\n };\n\n $scope.onSelectedTemplateChange = function(template) {\n if(!_.isEmpty(template.templateCustomAttributes)) {\n $scope.customValues = {};\n $scope.selectedTemplateCustomAttributes = _.map(template.templateCustomAttributes, function(attributeName) {\n return $rootScope.dataModel.attribute(attributeName);\n });\n $rootScope.prepareAttributes($scope.selectedTemplateCustomAttributes, true);\n } else {\n $scope.selectedTemplateCustomAttributes = [];\n $scope.customValues = {};\n }\n };\n\n $scope.runExport = function() {\n // TODO:\n // -> Problem: What if the user wants to \"store\" the values as default for additional exports?\n var exportMapping = angular.copy($scope.form.selectedTemplate);\n exportMapping.customValues = $scope.customValues;\n data.parentScope.createExportForExportMapping(exportMapping);\n $modalInstance.close();\n };\n\n $scope.cancel = function() {\n $modalInstance.close();\n };\n\n $scope.uploadFileForItem = ExportMappingService.getUploadFileForItemConfiguration($scope);\n\n function init() {\n ExportMappingResource.getTemplateMappings({},\n function(response) {\n $scope.templates = response.data;\n },\n function(response) {\n growl.error('TEMPLATE_MAPPINGS.LOAD_FAILED');\n });\n }\n\n init();\n });","angular.module('llax.directives', [])\n.directive('fileUpload', ['$translate', '$timeout','$filter','$rootScope', '$parse',\n function($translate, $timeout,$filter, $rootScope, $parse) {\n return {\n restrict: 'A',\n templateUrl: function(elem, attrs) {\n return attrs.templateUrl || 'tpl/file-upload.tpl.html';\n },\n controller: ['$log', '$scope', '$rootScope', '$translate', '$timeout', '$filter', '$modal', 'growl', 'FileUploader', '$window', '$element',\n function($log, $scope, $rootScope, $translate, $timeout, $filter, $modal, growl, FileUploader, $window, $element) {\n\n $scope.dropText = $translate.instant('UPLOAD.DROP_FILES');\n $scope.showFileUpload = false;\n $scope.filePreviewData = null;\n $scope.filePreviewError = false;\n $scope.showThumbnail = false;\n $scope.isLazyLoaded = false;\n if ($scope.attribute && $scope.attribute.params && $scope.attribute.params.custom) {\n $scope.isLazyLoaded = $scope.attribute.params.custom.lazyLoaded;\n }\n $scope.$watch('filePreviewData.url', function(newValue, oldValue) {\n if (newValue !== oldValue && !$scope.isLazyLoaded) {\n $scope.thumbnailToggle(newValue);\n }\n });\n // FIXME: Due to backend limitations, it is not possible to upload file larger than 32MB!\n var MAX_FILE_SIZE = 32 * 1024 * 1024;\n\n var onUpload = $scope.onUpload();\n\n var customFilters = [{\n name: 'imageFilter',\n fn: function(item /*{File|FileLikeObject}*/) {\n var result;\n if ($filter('isFileType')(item, 'image')) {\n result = true;\n } else {\n growl.error('UPLOAD.NO_IMAGE_ERROR');\n result = false;\n }\n return result;\n }\n }, {\n name: 'noImageFilter',\n fn: function(item /*{File|FileLikeObject}*/) {\n var result;\n if ($filter('isFileType')(item, 'image')) {\n result = false;\n growl.error('UPLOAD.IMAGE_ERROR');\n } else {\n result = true;\n }\n return result;\n }\n }, {\n name: 'zipFilter',\n fn: function(item /*{File|FileLikeObject}*/) {\n var result;\n if ($filter('isFileType')(item, '|zip|')) {\n result = true;\n } else {\n growl.error('UPLOAD.FILE_FORMAT_ERROR', {variables: {type: 'zip'}});\n result = false;\n }\n return result;\n }\n }, {\n name: 'xmlFilter',\n fn: function(item /*{File|FileLikeObject}*/) {\n var result;\n if ($filter('isFileType')(item, '|xml|')) {\n result = true;\n } else {\n growl.error('UPLOAD.FILE_FORMAT_ERROR', {variables: {type: 'xml'}});\n result = false;\n }\n return result;\n }\n }, {\n name: 'maxFileSizeFilter',\n fn: function(item /*{File|FileLikeObject}*/) {\n var result;\n var maxFileSize = onUpload.maxFileSize ? Math.min(onUpload.maxFileSize, MAX_FILE_SIZE) : MAX_FILE_SIZE;\n if (item.size < maxFileSize) {\n result = true;\n } else {\n var sizeInMegaByte = Math.floor(maxFileSize / 1024 / 1024);\n growl.error('UPLOAD.FILE_SIZE_ERROR', {variables: {size: sizeInMegaByte + ' MB'}});\n result = false;\n }\n return result;\n }\n }];\n\n /*\n angular-file-upload\n https://github.com/nervgh/angular-file-upload/wiki/Module-API\n */\n var uploader = new FileUploader({\n url: onUpload.url,\n autoUpload: onUpload.autoUpload || false,\n formData: onUpload.formData || '',\n filters: getFilters()\n });\n\n if (onUpload.disableDragAndDrop){\n uploader.filters.push({\n name: \"disableDragAndDrop\",\n fn: function() {\n return false;\n }\n });\n }\n\n if (onUpload.queueLimit) {\n uploader = angular.extend(uploader, { 'queueLimit': onUpload.queueLimit });\n }\n\n uploader.onCancelItem = function(response) {\n if (_.isFunction(onUpload.uploadCancelled)) {\n onUpload.uploadCancelled(response);\n }\n $rootScope.$broadcast('uploadCanceled');\n };\n\n if (onUpload.onErrorItem) {\n uploader.onErrorItem = onUpload.onErrorItem;\n } else {\n uploader.onErrorItem = function(response) {\n $log.error(response);\n };\n }\n\n if (onUpload.onAfterAddingFile) {\n uploader.onAfterAddingFile = function(fileItem) {\n onUpload.onAfterAddingFile(fileItem);\n };\n } else {\n uploader.onAfterAddingFile = function(fileItem) {\n if (fileItem.file.type.startsWith('image')) {\n $scope.croppedImage = '';\n var reader = new FileReader();\n reader.onload = function(event) {\n $scope.$apply(function() {\n $scope.imageToCrop = event.target.result;\n $rootScope.$broadcast('setImageToCrop', $scope.imageToCrop);\n });\n };\n reader.readAsDataURL(fileItem._file);\n }\n $rootScope.$broadcast('filesSelected');\n $rootScope.uploaderHasFiles = true;\n\n var multiple = false;\n var cropImage = false;\n\n if($scope.options){\n multiple = $scope.options.multiple;\n cropImage = $scope.options.cropImage ? true : false;\n }\n\n if (onUpload.useFilename) {\n fileItem.alias = fileItem.file.name;\n }\n\n if (multiple || !cropImage) {\n uploader.uploadAll();\n }\n };\n }\n\n uploader.onBeforeUploadItem = function(fileItem) {\n if (fileItem.file.type.startsWith('image') && onUpload.cropImage) {\n var blob = dataURItoBlob($scope.croppedImage);\n fileItem._file = blob;\n }\n };\n\n $scope.$on('clearAttributeValue', function(data) {\n $scope.filePreviewData = null;\n });\n\n uploader.onSuccessItem = function(fileItem, response, status, headers) {\n\n if (_.isFunction(onUpload.uploadSuccess)) {\n onUpload.uploadSuccess(response);\n }\n\n if (_.isFunction(onUpload.uploadComplete)) {\n\n var deferred = onUpload.uploadComplete(response, fileItem, $scope);\n\n if (!_.isNil(deferred) && _.isFunction(deferred.then)) {\n deferred.then(function(uploadCompleteResponse) {\n handleConvertedResponse(uploadCompleteResponse);\n });\n } else {\n handleConvertedResponse(response);\n }\n }\n };\n\n function handleConvertedResponse(response) {\n var filePreviewData;\n if (_.isArray(response)) {\n if (response.length === 1) {\n filePreviewData = angular.copy(response[0]);\n } else {\n return;\n }\n } else if (_.isObject(response)) {\n filePreviewData = response;\n } else {\n return;\n }\n\n filePreviewData.isImage = false;\n filePreviewData.url = filePreviewData.url || filePreviewData.publicAssetUrl || filePreviewData.privateAssetUrl;\n if (!_.isNil(filePreviewData.contentType)) {\n filePreviewData.isImage = filePreviewData.contentType.indexOf('image') > -1;\n }\n\n if ($scope.options.multiple) {\n if(!$scope.filePreviewData){\n $scope.filePreviewData = [];\n }\n $scope.filePreviewData.push(filePreviewData);\n } else {\n $scope.filePreviewData = filePreviewData;\n }\n }\n\n if (onUpload.onCompleteAll) {\n uploader.onCompleteAll = onUpload.onCompleteAll;\n } else {\n uploader.onCompleteAll = function() {\n $timeout(function() {\n $rootScope.$broadcast('filesUploaded');\n resetUploader();\n }, 2000);\n };\n }\n\n $scope.uploader = uploader;\n\n // LAX-1708 bug fix\n FileUploader.FileSelect.prototype.isEmptyAfterSelection = function() {\n return false;\n };\n\n function getFilters() {\n var newFilters = [];\n var enableFilters = _.union(onUpload.filters, ['maxFileSizeFilter']);\n newFilters = customFilters.filter(function(elem) {\n return _.includes(enableFilters, elem.name);\n });\n return newFilters;\n }\n\n function dataURItoBlob(dataURI) {\n var binary = atob(dataURI.split(',')[1]);\n var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];\n var array = [];\n for (var i = 0; i < binary.length; i++) {\n array.push(binary.charCodeAt(i));\n }\n return new Blob([new Uint8Array(array)], {\n type: mimeString\n });\n }\n\n $scope.toggleFileUpload = function() {\n $scope.showFileUpload = !$scope.showFileUpload;\n $rootScope.$broadcast('toggleFileUpload', $scope.uploadId);\n };\n\n $scope.cancel = function() {\n resetUploader();\n };\n\n function resetUploader() {\n $scope.uploader.cancelAll();\n $scope.uploader.clearQueue();\n $scope.clearInput();\n $scope.imageToCrop = '';\n $scope.toggleFileUpload();\n $rootScope.uploaderHasFiles = false;\n $rootScope.reloadAfterDataModelUpdate();\n }\n\n $scope.provideLinkModal = function (attribute, item, model, uploader, filePreviewData) {\n var modalPromise = $modal.open({\n templateUrl: 'tpl/provide-link.tpl.html',\n controller: 'provideLinkController',\n backdrop: true,\n resolve: {\n attribute: function() {\n return attribute;\n },\n item: function() {\n return item;\n },\n model: function() {\n return model;\n },\n uploader: function() {\n return uploader;\n },\n filePreviewData: function() {\n return filePreviewData;\n }\n }\n });\n\n modalPromise.result.then(function (result) {\n //accecpted\n $scope.filePreviewData = result;\n $rootScope.$broadcast('filesUploaded', $scope.filePreviewData);\n }, function (result) {\n //dismissed\n console.log(\"Link modal dismissed\");\n });\n };\n $scope.removeAttachement = function(file){\n _.remove($scope.filePreviewData, {\n sha1: file.sha1\n });\n $rootScope.$broadcast('removeAttachement', file);\n };\n\n $scope.showImage = function (filePreviewData) {\n $rootScope.additionalModalOpen = true;\n var modalPromise = $modal.open({\n templateUrl: 'tpl/editorShowImage.tpl.html',\n controller: 'showImageController',\n windowClass: 'editor-show-image',\n backdrop: true,\n resolve: {\n filePreviewData: function () {\n return filePreviewData;\n }\n }\n });\n };\n\n $element.on('dragleave', function () {\n $element.find('.drag-over').removeClass(\"drag-over\");\n });\n\n $scope.openYoutubePlayer = function(videoId) {\n $rootScope.additionalModalOpen = true;\n var modalPromise = $modal.open({\n templateUrl: 'tpl/editorShowYoutube.tpl.html',\n controller: 'showYoutubeController',\n windowClass: 'editor-show-youtube',\n backdrop: true,\n resolve: {\n videoId: function () {\n return videoId;\n }\n }\n });\n };\n\n $scope.imageInputClick = function (disableField, url) {\n if (disableField) {\n var win = $window.open(url, '_blank');\n win.focus();\n }\n };\n\n $scope.hiddenInputClick = function($event) {\n if ($scope.useAssetFolders) {\n $event.preventDefault();\n $scope.showAssetFoldersModal();\n }\n };\n\n $scope.showAssetFoldersModal = function () {\n $modal.open({\n templateUrl: 'tpl/asset-folders/modal-asset-folders.tpl.html',\n controller: 'AssetFoldersController',\n backdrop: true,\n size: 'lg',\n windowClass: 'asset-folders-modal',\n resolve: {\n modalParams: function() {\n return {\n accept: onUpload.accept,\n onFileSelected: function(linkedAsset, linkedAssetPath) {\n if (_.isFunction(onUpload.onFileSelected)) {\n onUpload.onFileSelected(linkedAsset, linkedAssetPath, function(response) {\n $rootScope.$broadcast('filesSelected', {\n scopeId: $scope.$id,\n fileName: linkedAsset.name\n });\n\n response.url = response.url || response.publicAssetUrl || response.privateAssetUrl;\n uploader.onSuccessItem(linkedAsset, response, 200, {});\n uploader.onCompleteAll();\n });\n } else {\n $log.error('fileUpload: Trying to select asset file but `onFileSelected` was not defined.');\n }\n }\n };\n }\n }\n });\n };\n\n $scope.isUploadQueueInProgressOrDone = function() {\n return !_.isEmpty(\n _.find(uploader.queue, function(item) {\n return item.isUploading || item.isUploaded;\n })\n );\n };\n $scope.getFileUploaderPlaceholderText = function() {\n if (onUpload.disableDragAndDrop) {\n return $translate.instant(\"UPLOAD.PLACEHOLDER.DISABLED.DND\");\n } else {\n return $translate.instant(\"UPLOAD.PLACEHOLDER.ENABLED.DND\");\n }\n };\n }\n ],\n transclude: true,\n replace: true,\n scope: {\n uploadId: '@uploadId',\n buttonLabel: '@buttonLabel',\n buttonIcon: '@buttonIcon',\n submitLabel: '@submitLabel',\n onUpload: '&onUpload',\n fileType: \"=fileType\",\n itemObj: \"=\",\n model:\"=\",\n modelString:\"=\",\n attribute: \"=\",\n inlineInput: \"=\",\n settings: \"=\",\n ecIndex: \"=\",\n uploader: \"=\",\n useAssetFolders: '='\n },\n link: function (scope, element, attributes) {\n\n if (!_.isNil(scope.attribute)) {\n var tmpString = \"itemObj.\" + scope.attribute.name;\n\n if (!_.isNil(scope.modelString) && !_.isEqual(\"item[a.name]\", scope.modelString)) {\n tmpString = scope.modelString.replace(\"item\", \"itemObj\");\n }\n\n scope.$watch(tmpString, function() {\n start();\n });\n }\n\n scope.$watch('showFileUpload', function() {\n var userImage = element.parent().find('.user-image');\n if (scope.showFileUpload) {\n userImage.hide();\n } else {\n userImage.show();\n }\n });\n\n var hiddenInput = element.find('[id$=_button_hidden]');\n $timeout(function() {\n element.find('.fake-upload-button').click(function() {\n hiddenInput.click();\n });\n });\n\n start();\n\n scope.thumbnailToggle = function (url) {\n scope.showThumbnail = true;\n scope.loading = true;\n $rootScope.checkUrl(url, scope);\n };\n\n scope.clearInput = function() {\n // This seems to be the only way to clear the file input!\n if (hiddenInput && hiddenInput[0] && hiddenInput[0].value) {\n hiddenInput[0].value = '';\n }\n };\n\n function start() {\n scope.options = {\n dragDropUpload: angular.isDefined(attributes.dragDropUpload),\n accept: scope.onUpload().accept,\n cropImage: scope.onUpload().cropImage,\n maxFileSize: scope.onUpload().maxFileSize,\n multiple: angular.isDefined(attributes.multiple)\n };\n if (scope.options.multiple) {\n scope.filePreviewData = [];\n }\n\n var modelEval = $parse(scope.modelString);\n var modelValue = modelEval(scope);\n\n if (scope.model || modelValue) {\n if (_.isEmpty(scope.model)) {\n scope.model = modelValue;\n }\n var url = scope.model;\n scope.filePreviewData = {};\n var type = url.split('.').pop().split(/\\?|#/).shift();\n if (_.includes(url, \"/image\")) {\n type = 'image';\n }\n scope.filePreviewData.url = url;\n scope.filePreviewData.isImage = false;\n scope.filePreviewData.path = url.slice(url.lastIndexOf('/'));\n switch (type) {\n case 'svg':\n scope.filePreviewData.contentType = \"image/svg+xml\";\n if (!Modernizr.svg) {\n scope.filePreviewData.notSupported = true;\n }\n break;\n case 'webp':\n scope.filePreviewData.isImage = true;\n scope.filePreviewData.contentType = \"image/webp\";\n if (Modernizr.webp.toString() !== 'true') {\n scope.filePreviewData.notSupported = true;\n }\n break;\n case 'tif':\n case 'xlsx':\n case 'xls':\n case 'tiff':\n scope.filePreviewData.contentType = \"image/tiff\";\n scope.filePreviewData.notSupported = true;\n break;\n case 'pdf':\n scope.filePreviewData.contentType = \"application/pdf\";\n break;\n case \"jpg\":\n case \"jpeg\":\n case \"gif\":\n case \"png\":\n case \"bmp\":\n case \"tif\":\n case \"tiff\":\n case \"image\":\n scope.filePreviewData.isImage = true;\n scope.filePreviewData.alt = $filter('fileName', scope.filePreviewData.url);\n break;\n default:\n scope.filePreviewData.alt = $filter('fileName', scope.filePreviewData.url);\n break;\n }\n }\n if (attributes.multiple !== undefined) {\n hiddenInput.attr('multiple', 'multiple');\n }\n if (scope.options.accept) {\n hiddenInput.attr('accept', scope.options.accept);\n }\n if (attributes.buttonInline !== undefined) {\n scope.buttonInline = true;\n element.css('display', 'inline-block');\n }\n }\n }\n };\n }\n])\n.directive('gridFileDialog', ['$compile', '$injector', function($compile, $injector){\n return {\n restrict: 'A',\n priority: 1000,\n terminal: true,\n link: function(scope, element) {\n\n var customFileDialog = $injector.has('customGridFileDialogDirective');\n\n if (customFileDialog) {\n element.removeAttr('data-grid-file-dialog');\n element.attr('data-custom-grid-file-dialog', '');\n } else {\n // Remove self so we won't trigger a loop.\n element.removeAttr('data-grid-file-dialog');\n }\n\n $compile(element)(scope);\n },\n /*ngInject*/\n controller: function ($scope, $modal) {\n $scope.showGridFileDialog = function(row, col, appScope) {\n $modal.open({\n templateUrl: 'tpl/grid-file-dialog.tpl.html',\n controller: showGridFileDialogCtrl,\n backdrop: true,\n resolve: {\n row: function() {\n return row;\n },\n col: function() {\n return col;\n },\n appScope: function() {\n return appScope;\n }\n }\n });\n\n };\n var showGridFileDialogCtrl = /*@ngInject*/ function ($log, $scope, $rootScope, $modalInstance, row, col, appScope, AssetFoldersService, growl) {\n\n $scope.item = row.entity;\n $scope.a = col.colDef.attribute;\n $scope.fileType = ($scope.a && $scope.a.typeName) ? $scope.a.typeName.toLowerCase() : '';\n $scope.readonly = col.colDef.readonly || (row.editable === false) || (row.editable === undefined && !appScope.isRowEditable(row));\n\n var originalValue = $scope.item[$scope.a.name];\n if (!$scope.readonly) {\n $scope.$parent.$broadcast('laxGridStartCellEdit', row, col);\n }\n\n $scope.saveAsset = function() {\n $modalInstance.close('asset saved');\n $scope.$parent.$broadcast('laxGridStopCellEdit', row, col);\n };\n\n $scope.cancel = function () {\n $modalInstance.dismiss('cancel');\n if (!$scope.readonly) {\n var newValue = row.entity[col.field];\n if (!angular.equals(newValue, originalValue)) {\n row.entity[col.field] = originalValue;\n // TODO: Delete asset on cancel, when asset was changed\n }\n $scope.$parent.$broadcast('laxGridStopCellEdit', row, col);\n }\n };\n\n var onUpload = function (row, col, newValue) {\n row.entity[col.field] = newValue;\n };\n\n $scope.uploadFileForItem = function() {\n var config = {};\n var currentLayout = $rootScope.getCurrentLayout();\n switch ($scope.a.typeName) {\n case \"Image\":\n config = {\n autoUpload: true,\n filters: ['imageFilter'],\n accept: 'image/jpeg,image/gif,image/png,image/tiff,image/bmp,image/webp,image/svg+xml,application/pdf'\n };\n var maxFileSize = $scope.dataModel.sectionAttributeParam(currentLayout, null, $scope.a.name, 'maxFileSize');\n if (maxFileSize) {\n config.filters.push('maxFileSizeFilter');\n config.maxFileSize = maxFileSize;\n }\n break;\n case \"Document\":\n config = {\n autoUpload: true\n };\n break;\n }\n\n return angular.extend({\n url: AssetFoldersService.getDefaultUploadUrl(),\n reset: true,\n formData: [],\n noNameEncoding: true,\n useFilename:true,\n uploadComplete: function(response) {\n return AssetFoldersService.getPublicAssetUrlAsync(response, response.path)\n .then(function(linkedPublicAsset) {\n onUpload(row, col, linkedPublicAsset.publicAssetUrl);\n return linkedPublicAsset;\n })\n .catch(function(error) {\n $log.error(error);\n });\n },\n onErrorItem: function(item, response, status, headers) {\n $log.error(response);\n\n if (!_.isNil(response.errorCode)) {\n growl.error(response.message, { variables : { name: item.file.name } });\n } else {\n growl.error(\"ASSET_FOLDER.ERROR_OCCURRED\");\n }\n },\n onFileSelected: function(linkedAsset, linkedAssetPath, done) {\n AssetFoldersService.getPublicAssetUrlAsync(linkedAsset, linkedAssetPath)\n .then(function(linkedPublicAsset) {\n onUpload(row, col, linkedPublicAsset.publicAssetUrl);\n done(linkedPublicAsset);\n }, function(error) {\n $log.error(error);\n done(linkedPublicAsset);\n });\n }\n }, config);\n };\n\n };\n\n }\n };\n}])\n.directive('imagePreview', function($compile, $filter) {\n return {\n restrict: 'A',\n link: function(scope, elem, attrs) {\n var params = scope.$eval(attrs.imagePreview);\n var image = params.file;\n var type = image.split('.').pop().split(/\\?|#/).shift();\n var imageElement;\n\n function getImageElement(element) {\n if (element == 'image') {\n imageElement = angular.element('');\n } else if (element == 'object') {\n imageElement = angular.element('');\n imageElement.html(params.placeholder ? params.placeholder : 'FILE_NOT_FOUND');\n imageElement.attr('data', image);\n }\n imageElement.attr('id', params.name + '_image');\n imageElement.attr('class', params.class);\n return imageElement;\n }\n\n switch (type) {\n case 'svg':\n imageElement = getImageElement('object');\n imageElement.attr('type', \"image/svg+xml\");\n if (!Modernizr.svg) {\n imageElement.append('
    {{\\'NOT_SUPPORTED_BY_BROWSER\\' | translate}}');\n }\n break;\n case 'webp':\n imageElement = getImageElement('object');\n imageElement.attr('type', \"image/webp\");\n if (Modernizr.webp.toString() !== 'true') {\n imageElement.append('
    {{\\'NOT_SUPPORTED_BY_BROWSER\\' | translate}}');\n }\n break;\n case 'tif':\n case 'tiff':\n imageElement = getImageElement('object');\n imageElement.attr('type', \"image/tiff\");\n imageElement.append('
    {{\\'NOT_SUPPORTED_BY_BROWSER\\' | translate}}');\n break;\n case 'pdf':\n imageElement = getImageElement('object');\n imageElement.attr('type', \"application/pdf\");\n break;\n default:\n imageElement = getImageElement('image');\n imageElement.attr('src', image);\n // imageElement.attr('data-err-src',\n // \"{type: 'text', value: '{{'IMAGE_NOT_FOUND' | translate}}'}\");\n imageElement.attr('alt', $filter('fileName', image));\n }\n elem.prepend(imageElement);\n $compile(imageElement)(scope);\n }\n };\n})\n.directive('filetype', ['$window','$compile', function($window, $compile) {\n return {\n restrict: 'A',\n link: function(scope, elem, attrs) {\n\n var codes = {\n \"image\" : [\"jpg\", \"jpeg\", \"gif\", \"png\", \"bmp\", \"svg\", \"image\"],\n \"code\" : [\"css\", \"html\", \"rb\", \"js\", \"json\", \"xml\", \"code\"],\n \"text\" : [\"txt\", \"csv\", \"rtf\", \"odt\", \"text\"],\n \"zip\" : [\"zip\", \"gz\", \"archive\"],\n \"excel\" : [\"xls\", \"xlsx\", \"excel\"],\n \"word\" : [\"doc\", \"docx\", \"word\"],\n \"powerpoint\": [\"ppt\", \"pptx\", \"powerpoint\"],\n \"pdf\" : [\"pdf\"]\n };\n\n function getFileType(url) {\n if (url === undefined) {\n return false;\n }\n var fileType = (url).substring((url.lastIndexOf('.') || url.lastIndexOf('/')) + 1);\n return fileType.toLowerCase();\n }\n\n function getClass(fileType) {\n for (var key in codes) {\n var val = codes[key];\n if (val.contains(fileType.toLowerCase())) {\n return key;\n }\n }\n }\n\n function setFileType(filePreviewData) {\n var fileTypeElement;\n var fieldValue = scope.row ? scope.row.entity[scope.$parent.col.field] : null;\n var url = attrs.ngHref ? attrs.ngHref : fieldValue;\n if (filePreviewData) {\n url = filePreviewData.url;\n }\n\n if (scope.row && !_.includes(url, scope.row.entity[scope.$parent.col.field])) {\n url = scope.row.entity[scope.$parent.col.field];\n }\n\n var fileType;\n var type;\n\n if (_.isNil(url)) {\n fileType = getFileType(attrs.filetype);\n type = getClass(fileType);\n if (type) {\n fileTypeElement = '';\n } else {\n fileTypeElement = '' +\n '' + fileType.toUpperCase().substring(0, 3) + '' +\n '' +\n '';\n }\n var childCount = _.get(elem, 'context.childElementCount');\n if (childCount === undefined || childCount > 0) {\n elem.empty();\n }\n elem.append(fileTypeElement);\n return;\n }\n var hostname = url.replace('http://','').replace('https://','').split(/[/?#]/)[0];\n var videoId;\n elem.empty();\n angular.element(elem.context.parentElement).find('.image-preview').remove();\n\n var faviconUrl;\n\n if (_.includes(hostname, $window.location.hostname)) {\n // uploaded file\n fileType = getFileType(attrs.filetype);\n type = getClass(fileType);\n if (type) {\n fileTypeElement = '';\n } else {\n fileTypeElement = '' +\n '' + fileType.toUpperCase().substring(0, 3) + '' +\n '' +\n '';\n }\n } else if (_.includes(hostname, \"youtube\") || _.includes(hostname, \"youtu.be\")) {\n\n videoId = parseYoutubeId(url);\n if (videoId && (typeof (attrs.filetypeDisableVideoPreview) === \"undefined\")) {\n var imgUrl = \"https://img.youtube.com/vi/\" + videoId + \"/0.jpg\";\n fileTypeElement = '
    ';\n } else {\n faviconUrl = \"https://youtube.com/favicon.ico\";\n fileTypeElement = '' +\n '' +\n '' +\n '';\n videoId = undefined;\n }\n\n } else {\n //external link\n fileType = getFileType(attrs.filetype);\n if (!_.includes(url, attrs.filetype)) {\n fileType = getFileType(url);\n }\n type = getClass(fileType);\n if (type) {\n fileTypeElement = '';\n } else {\n faviconUrl = \"https://\"+ hostname + \"/favicon.ico\";\n fileTypeElement = '' +\n '' +\n '' +\n '';\n }\n }\n\n if (videoId) {\n angular.element(elem.context.parentElement).prepend($compile(fileTypeElement)(scope));\n } else {\n elem.append(fileTypeElement);\n }\n\n }\n setFileType();\n\n function parseYoutubeId(url) {\n var regExp = /^.*(youtu\\.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|\\&v=)([^#\\&\\?]*).*/;\n var match = url.match(regExp);\n if (match && match[2].length == 11) {\n return match[2];\n } else {\n return undefined;\n }\n }\n\n scope.$on('filesUploaded', function(event, filePreviewData) {\n setFileType(filePreviewData);\n });\n\n scope.$on('changedURL', function(event, filePreviewData) {\n setFileType(filePreviewData);\n });\n\n scope.$on('reloadBrowseListFileTypes', function(event, result) {\n setFileType();\n });\n }\n };\n}])\n.directive('shortFilename', [function() {\n return {\n restrict: 'A',\n link: function (scope, elem, attrs) {\n var name = attrs.shortFilename;\n var maxLength = attrs.maxLength || 10;\n if (name.length > maxLength) {\n var fileTypeArray = _.split(name, '.');\n if (fileTypeArray.length <= 1) {\n return;\n }\n var filetype = _.last(fileTypeArray);\n if (name.length - (filetype.length + 1) <= 8) {\n return;\n }\n var cutLength = maxLength - filetype.length;\n cutLength = cutLength < (maxLength- 4) ? (maxLength- 4) : cutLength;\n var shortName = _.truncate(name, {\n 'length': cutLength,\n });\n shortName = shortName + name.substring(name.length - (filetype.length + 1) - 3, name.length - (filetype.length + 1));\n shortName = shortName + '.' + filetype;\n elem.empty();\n elem.append(shortName);\n }\n }\n };\n}])\n.directive('imageOnError', function() {\n return {\n restrict: 'A',\n link: function(scope, element, attrs) {\n element.bind('load', function() {\n setTimeout(function() {\n scope.filePreviewError = false;\n scope.$apply();\n }, 10);\n });\n element.bind('error', function(){\n setTimeout(function() {\n scope.filePreviewError = true;\n scope.$apply();\n }, 10);\n });\n }\n };\n})\n.directive('ngThumb', ['$window', '$filter',\n function($window, $filter) {\n var helper = {\n support: !!($window.FileReader && $window.CanvasRenderingContext2D),\n isFile: function(item) {\n return angular.isObject(item) && item instanceof $window.File;\n },\n isImage: function(file) {\n return $filter('isFileType')(file, 'image');\n }\n };\n\n return {\n restrict: 'A',\n template: '',\n link: function(scope, element, attributes) {\n if (!helper.support) return;\n\n var params = scope.$eval(attributes.ngThumb);\n\n if (!helper.isFile(params.file)) return;\n if (!helper.isImage(params.file)) return;\n\n var canvas = element.find('canvas');\n var reader = new FileReader();\n\n reader.onload = onLoadFile;\n reader.readAsDataURL(params.file);\n\n function onLoadFile(event) {\n var img = new Image();\n img.onload = onLoadImage;\n img.src = event.target.result;\n }\n\n function onLoadImage() {\n var width = params.width || this.width / this.height * params.height;\n var height = params.height || this.height / this.width * params.width;\n canvas.attr({\n width: width,\n height: height\n });\n canvas[0].getContext('2d').drawImage(this, 0, 0, width, height);\n }\n }\n };\n }\n])\n.directive('formInput', function() {\n return {\n replace: true,\n restrict: 'AE',\n scope: {},\n templateUrl: 'tpl/form-input.tpl.html',\n transclude: true,\n link: function(scope, element, attrs) {\n\n scope.inputId = attrs.formInput;\n scope.icon = attrs.formInputIcon || attrs.icon;\n scope.label = attrs.formInputLabel || attrs.label;\n scope.clearable = attrs.formInputClearable || attrs.clearable;\n scope.isClearable = !_.isNil(scope.clearable) && (scope.clearable !== 'false');\n\n scope.clearValue = function() {\n if (!_.isNil(scope.inputId)) {\n // FIXME: Check if 'clearValue' method is defined on $parent!\n scope.$parent.clearValue(scope.inputId);\n }\n };\n\n }\n };\n})\n.directive('physicalAttribute', function($rootScope, EnumAttributeService, PhysicalAttributeService) {\n return {\n restrict: 'A',\n require: '?ngModel',\n link: function(scope, element, attributes, ngModelCtrl) {\n\n var dataModelAttribute = scope.$eval(attributes.physicalAttribute);\n scope.getFilteredUnits = function() {\n // 'getTranslatedOptions' gets key-value pairs of the available options (even for option lists)\n var units = $rootScope.getTranslatedOptions(dataModelAttribute);\n var item = $rootScope.getItemInContext(scope.currentLayout, scope, null, dataModelAttribute);\n var filteredUnits = EnumAttributeService.filterOptions(item, dataModelAttribute, null, null, units);\n\n scope.units = filteredUnits;\n return filteredUnits;\n };\n\n scope.parseValue = function(value) {\n value = PhysicalAttributeService.parseValue(value, scope.units);\n ngModelCtrl.$setViewValue(value);\n return value;\n };\n\n scope.formatValue = function(value) {\n return value ? PhysicalAttributeService.formatValue(value, scope.units) : '';\n };\n\n if (ngModelCtrl !== undefined) {\n ngModelCtrl.$parsers.push(scope.parseValue);\n ngModelCtrl.$formatters.push(scope.formatValue);\n }\n\n scope.typeaheadSelected = function(closeEvent) {\n scope.$emit(closeEvent);\n };\n\n // Prepare units for already populated values\n scope.getFilteredUnits();\n }\n };\n})\n.directive('resize', function($window, $timeout) {\n return function(scope, elem) {\n var w = angular.element($window);\n var mh = angular.element('.modal-header');\n var mf = angular.element('.modal-footer');\n var mp = angular.element('.modal-dialog');\n\n var calculateLayout = function() {\n var height = (w.height() - parseInt(mh.css('height'), 10) -\n parseInt(mf.css('height'), 10) -\n parseInt(mp.css('padding-top'), 10) - 125) + 'px';\n elem.css('height', height);\n };\n\n $timeout(function() {\n calculateLayout();\n });\n\n w.bind('resize', _.debounce(calculateLayout, 150));\n\n scope.$on('$destroy()', function() {\n w.off('resize');\n });\n };\n})\n.directive('autoResizeElement', function($window, $timeout) {\n return function(scope, element, attributes) {\n\n var w = angular.element($window);\n var resize = function() {\n if (attributes.disabled || attributes.readonly) {\n var e = element[0];\n element.css({ 'resize': 'none'});\n if(e.scrollHeight <= e.clientHeight) {\n e.style.height = '0px';\n }\n var count = (parseInt(element[0].scrollHeight - 12)/20);\n var rows = attributes.rows ? attributes.rows : 5;\n if (count <= rows) {\n var diff = 0;\n e.style.overflow = 'unset';\n if (e.nodeName == \"DIV\") {\n diff = -4;\n }\n var h = e.scrollHeight + e.offsetHeight - e.clientHeight + diff;\n e.style.height = h +'px';\n } else {\n e.style.height = (rows*20) + 'px';\n e.style.overflow = 'auto';\n }\n }\n };\n\n $timeout(function() {\n resize();\n if (_.has(scope, 'selectedDimension') && (attributes.disabled || attributes.readonly)) {\n scope.$watch('selectedDimension', function(x) {\n resize();\n });\n }\n });\n\n w.bind('resize', _.debounce(resize, 150));\n\n scope.$on('$destroy()', function() {\n w.off('resize');\n });\n };\n})\n.directive('resizeToWindowHeight', function($window, $timeout) {\n return function(scope, elem, attrs) {\n var w = angular.element($window);\n var footer = angular.element('footer');\n var footerHeight = parseInt(footer.css('height'), 10) +\n parseInt(footer.css('padding-top'), 10) +\n parseInt(footer.css('padding-bottom'), 10);\n var toolbar = angular.element('.columnView-tools');\n var buttonsHeight = 75;\n var h_prefix = ['min','max'].indexOf(attrs.resizeToWindowHeight) > -1 ? attrs.resizeToWindowHeight + '-' : \"\";\n var changeInHeight = parseInt(attrs.changeInHeight);\n changeInHeight = isNaN(changeInHeight) ? 0 : changeInHeight;\n var calculateLayout = function() {\n var height = (w.height() - elem.offset().top - footerHeight - toolbar.outerHeight() - buttonsHeight);\n if (height < 400) {\n height = 400;\n }\n height+= changeInHeight;\n elem.css(h_prefix + 'height', height + 'px');\n };\n\n $timeout(function() {\n calculateLayout();\n });\n\n w.bind('resize', _.debounce(calculateLayout, 150));\n\n scope.$on('$destroy()', function() {\n w.off('resize');\n });\n };\n})\n.directive('resizeItemGrid', function($window, $timeout) {\n return function(scope, elem) {\n var w = angular.element($window);\n\n var footer = angular.element('footer');\n var boxContent = angular.element('.box-content');\n var content = angular.element('#content');\n\n var calculateLayout = function () {\n var boxContentPadding = parseInt(boxContent.css('padding-bottom'), 10);\n var contentPadding = parseInt(content.css('padding-bottom'), 10);\n var filter = angular.element('.filter-rules-wrapper');\n var visibleRowHeight = scope.gridApi.core.getVisibleRows().length * 34;\n var height;\n if (filter.length == 0 || _.includes(filter[0].className, 'ng-hide')) {\n var offset = elem.offset().top + footer.innerHeight() + boxContentPadding + contentPadding;\n height = w.height() - offset;\n } else {\n height = w.height()/2;\n }\n elem.css('height', height);\n scope.gridApi.core.handleWindowResize();\n\n if (scope.gridApi.core.getVisibleRows().length > 0 && height > visibleRowHeight) {\n scope.loadMore();\n }\n };\n\n $timeout(function() {\n calculateLayout();\n });\n\n w.bind('resize', _.debounce(calculateLayout, 150));\n scope.$on('$destroy()', function() {\n w.off('resize');\n });\n\n scope.$watch(\"items\",\n function() {\n $timeout(function() {\n calculateLayout();\n });\n }, true);\n };\n})\n.directive('mainMenuToggleIcons', function ($window) {\n return {\n restrict: 'A',\n scope: true,\n link: function (scope, elem, attrs) {\n var w = angular.element($window);\n function mainMenuClick() {\n if(elem.hasClass('full')) {\n collapseSidebar();\n } else {\n expandSidebar();\n }\n }\n\n function collapseSidebar() {\n elem.removeClass('full').addClass('minified').find('i').addClass('syncons-double-arrows-right').removeClass('syncons-double-arrows-left');\n angular.element('body').addClass('sidebar-minified');\n angular.element('#content').addClass('sidebar-minified');\n angular.element('#sidebar-left').addClass('minified');\n angular.element('.dropmenu > .chevron').removeClass('opened').addClass('closed');\n angular.element('.dropmenu').parent().find('ul').hide();\n angular.element('#sidebar-left > aside > ul > li > a > span > .chevron').removeClass('closed').addClass('opened');\n angular.element('#sidebar-left > aside > ul > li > a').addClass('open');\n }\n\n function expandSidebar() {\n elem.removeClass('minified').addClass('full').find('i').addClass('syncons-double-arrows-left').removeClass('syncons-double-arrows-right');\n angular.element('body').removeClass('sidebar-minified');\n angular.element('#content').removeClass('sidebar-minified');\n angular.element('#sidebar-left').removeClass('minified');\n angular.element('#sidebar-left > aside > ul > li > a > span > .chevron').removeClass('opened').addClass('closed');\n angular.element('#sidebar-left > aside > ul > li > a').removeClass('open');\n }\n\n elem.on('click', function() {\n mainMenuClick();\n });\n\n function expandOrCollapse(w) {\n if (w.width() <= '993' && w.width() >= '768' ) {\n collapseSidebar();\n } else if (w.width() <= '767') {\n expandSidebar();\n } else {\n expandSidebar();\n }\n }\n\n w.on('resize', function() {\n expandOrCollapse(w);\n });\n\n setTimeout(function() {\n expandOrCollapse(w);\n angular.element('#sidebar-left').removeClass('hidden');\n });\n\n scope.$on('$destroy()', function() {\n w.off('resize');\n });\n\n scope.$on('toggleSidebar', function() {\n mainMenuClick();\n });\n }\n };\n})\n.directive('mainMenuToggle', function () {\n return {\n restrict: 'A',\n scope: true,\n link: function (scope, elem, attrs) {\n scope.mainMenuToggle = function () {\n if(elem.hasClass('open')) {\n elem.removeClass('open').addClass('close');\n angular.element('#content').addClass('full');\n angular.element('.navbar-brand').addClass('noBg');\n angular.element('#sidebar-left').hide();\n } else {\n elem.removeClass('close').addClass('open');\n angular.element('#content').removeClass('full');\n angular.element('.navbar-brand').removeClass('noBg');\n angular.element('#sidebar-left').show();\n }\n };\n }\n };\n})\n.directive('dropMenuToggle', function () {\n return {\n restrict: 'A',\n scope: true,\n link: function (scope, elem, attrs) {\n scope.dropMenuClick = function (event) {\n event.preventDefault();\n\n if(angular.element('#sidebar-left').hasClass('minified')) {\n if(elem.hasClass('open')) {\n return;\n } else {\n elem.parent().find('ul').first().slideToggle();\n if(elem.find('.chevron').hasClass('closed')) {\n elem.find('.chevron').removeClass('closed').addClass('opened');\n } else {\n elem.find('.chevron').removeClass('opened').addClass('closed');\n }\n }\n } else {\n elem.parent().find('ul').first().slideToggle();\n if(elem.find('.chevron').hasClass('closed')) {\n elem.find('.chevron').removeClass('closed').addClass('opened');\n } else {\n elem.find('.chevron').removeClass('opened').addClass('closed');\n }\n }\n };\n }\n };\n})\n.directive('activeLink', function($location) {\n return {\n restrict: 'A',\n link: function(scope, element, attrs) {\n var activeClass = attrs.activeLink;\n var path = attrs.activeHref || attrs.href || attrs.ngHref;\n var exactMatch = scope.$eval(attrs.activeExact) || false;\n scope.$on('$locationChangeSuccess', function(event, newPath) {\n if (exactMatch && _.endsWith(newPath, path) || !exactMatch && _.includes(newPath, path)) {\n element.parent('li').addClass(activeClass);\n } else {\n element.parent('li').removeClass(activeClass);\n }\n });\n }\n };\n})\n.directive('errSrc', function($compile) {\n return {\n terminal: true,\n link: function(scope, element, attrs) {\n element.on('error', function() {\n\n var params = scope.$eval(attrs.errSrc);\n element.removeAttr(attrs.$attr.errSrc);\n\n switch (params.type) {\n case 'icon':\n var titleString = \"\";\n if (element.attr(\"title\")) {\n titleString = \" title= '\" + element.attr(\"title\") + \"'\";\n }\n var label = '';\n element.parent().prepend(label);\n element.off('error');\n element.remove();\n break;\n case 'image':\n element.attr(\"src\", params.value);\n element.off('error');\n break;\n case 'text':\n var elem = '' + params.value + '';\n if (params.value.startsWith('<')) {\n elem = params.value;\n }\n element.parent().prepend(elem);\n $compile(elem)(scope);\n element.off('error');\n element.remove();\n break;\n default:\n element.off('error');\n break;\n }\n });\n }\n };\n})\n.directive('flotChart', function() {\n return {\n restrict: 'EA',\n link: function(scope, element, attr) {\n var widgetContainer = angular.element(element).closest('.widget-content');\n var cht = widgetContainer.height();\n widgetScope = widgetContainer.scope();\n var statsSpaceRequired = attr.extraHeightRequired;\n var extraHeight = 0;\n if (statsSpaceRequired) {\n extraHeight = statsSpaceRequired;\n }\n element.css('height',(cht-extraHeight)+ 'px');\n\n widgetScope.$on('widgetResized', function(event, data) {\n var cht = widgetContainer.height();\n element.css('height',(cht-extraHeight)+ 'px');\n jQuery.plot(element, scope.value.data, scope.value.options);\n });\n\n scope.$watch(attr.myModel, function(x) {\n if ((!x) || (!x.data) || x.data.length<1) {\n return;\n }\n element.unbind();\n if (x.plotclick) {\n element.bind(\"plotclick\", x.plotclick);\n }\n jQuery.plot(element, x.data, x.options);\n }, true);\n }\n };\n})\n.directive('loadingSpinner', function() {\n return {\n restrict: 'A',\n template: '
    ' +\n '
    ' +\n ' ' +\n '
    ' +\n '
    ',\n link: function(scope, elem, attrs) {\n scope.overlay = attrs.overlay;\n }\n };\n})\n.directive('wizard', function($window) {\n return {\n restrict: 'A',\n template: '
    ' +\n '
    ' +\n '
      ' +\n '' +\n '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n '' +\n '' +\n '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n ' ' +\n ' ' +\n '' +\n '' +\n '
    ' +\n '
    ' +\n '
    ' +\n '
    ',\n transclude: true,\n replace: true,\n scope: {\n onInit: '&',\n onBeforeStepChange: '&',\n onStepChanging: '&',\n onAfterStepChange: '&',\n onLastStepAction: '&',\n onCancelAction: '&',\n onLastStepButtonLabel: '@'\n },\n link: function(scope, element, attrs) {\n scope.currentStepIndex = 0;\n scope.steps[scope.currentStepIndex].currentStep = true;\n if (attrs.onCancelAction) {\n scope.hasCancelAction = true;\n }\n if (attrs.appendActionsTo) {\n angular.element(attrs.appendActionsTo).append(element.find('.actions'));\n }\n if (attrs.wizard) {\n scope.wizardId = attrs.wizard;\n }\n },\n controller: function controller($scope, $element, $attrs) {\n var LocalStorage = $window.localStorage;\n\n $scope.steps = [];\n\n this.registerStep = function(step) {\n $scope.steps.push(step);\n };\n\n var toggleSteps = function(toStepIndex) {\n var event = {event: {stepId: $scope.steps[$scope.currentStepIndex].id, toStepId: toStepIndex}};\n\n var goingBackwards = toStepIndex < $scope.currentStepIndex; // when going backwards validation should not be triggered\n\n if ($scope.onBeforeStepChange) {\n if (goingBackwards || $scope.onBeforeStepChange(event)) {\n\n $scope.steps[$scope.currentStepIndex].currentStep = false;\n\n $scope.currentStepIndex = toStepIndex;\n\n $scope.steps[$scope.currentStepIndex].currentStep = true;\n }\n }\n\n if ($scope.onStepChanging) {\n $scope.onStepChanging(event);\n }\n\n if ($scope.onAfterStepChange) {\n $scope.onAfterStepChange(event);\n }\n };\n\n $scope.nextStep = function() {\n toggleSteps($scope.currentStepIndex + 1);\n };\n\n $scope.previousStep = function() {\n toggleSteps($scope.currentStepIndex - 1);\n };\n\n $scope.isFirstStep = function() {\n return $scope.currentStepIndex === 0;\n };\n\n $scope.isLastStep = function() {\n return $scope.currentStepIndex === ($scope.steps.length - 1);\n };\n\n $scope.goToStep = function(stepIndex) {\n if (stepIndex >= $scope.currentStepIndex) {\n return;\n }\n toggleSteps(stepIndex);\n };\n\n $scope.closeNotification = function() {\n LocalStorage.setItem(\"hideNotifications\", [$scope.wizardId]);\n $scope.notificationClosed = true;\n };\n\n $scope.$on('goToStep', function(event, stepIndex) {\n toggleSteps(stepIndex);\n });\n\n if (!_.isNil($scope.onInit)) {\n $scope.onInit();\n }\n }\n };\n})\n.directive('step', function() {\n return {\n require: '^wizard',\n restrict: 'A',\n scope: {\n id: '@',\n title: '@'\n },\n template: '
    ',\n transclude: true,\n replace: true,\n link: function(scope, element, attrs, wizardController) {\n scope.title = attrs.title;\n scope.notification = attrs.notification;\n wizardController.registerStep(scope);\n }\n };\n})\n.directive('stepbadge', function() {\n return {\n require: '^wizard',\n restrict: 'E',\n scope: '=',\n template: '
  • $index }\"' +\n ' data-ng-click=\"goToStep($index)\"> ' +\n ' ' +\n ' $index\" class=\"syncons syncons-checkmark\">' +\n ' $index\">{{$index+1}}' +\n ' ' +\n ' ' +\n ' {{step.title | translate}}' +\n ' ' +\n '
  • ',\n transclude: true,\n replace: true\n };\n})\n.directive('laxMatch', function() {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function(scope, elem, attrs, ctrl) {\n scope.$watch(function() {\n return (ctrl.$pristine && angular.isUndefined(ctrl.$modelValue)) || scope.$eval(attrs.laxMatch) === ctrl.$modelValue;\n }, function(currentValue) {\n ctrl.$setValidity('match', currentValue);\n });\n }\n };\n})\n.directive('accordionToggle', function($timeout) {\n return {\n restrict: 'C',\n scope: '=',\n link: function(scope, elem, attrs) {\n scope.$watch('isOpen', function(isOpen) {\n\n if (!isOpen) {\n return;\n }\n\n $timeout(function() {\n\n var section = scope.$parent.section;\n var focusSection = scope.$parent.focusSection;\n if (!_.isUndefined(section) && _.isFunction(focusSection)) {\n focusSection(section);\n }\n\n }, 1);\n\n });\n }\n };\n})\n.directive('persistArea', function($timeout, $window) {\n return {\n restrict: 'A',\n priority: Number.MIN_SAFE_INTEGER, // execute last, after all other directives if any.\n replace: true,\n template: '',\n link: function(scope, elem, attrs) {\n var origHeader;\n var w = angular.element($window);\n origHeader = elem.next();\n\n function initTableHeaders() {\n\n scope.updateWidth();\n\n angular.element('.modal-body').on('scroll', function() {\n scope.UpdateTableHeaders();\n });\n\n w.on('resize', function() {\n scope.updateWidth();\n });\n\n scope.$on('$destroy()', function() {\n w.off('resize');\n });\n }\n\n $timeout(function() {\n initTableHeaders();\n }, 0);\n\n scope.UpdateTableHeaders = function () {\n\n var offset = origHeader.position(),\n floatingHeader = elem;\n\n if ( ( scope.section.isOpen ) && ( offset.top < 0 ) && ( offset.top + origHeader.height() >= 0 ) ) {\n floatingHeader.show();\n } else {\n floatingHeader.hide();\n }\n };\n\n scope.updateWidth = function() {\n elem.css(\"width\", origHeader.innerWidth());\n };\n\n scope.toggleOpen = function() {\n $timeout(function() {\n origHeader.find('.accordion-toggle').click();\n }, 10);\n };\n\n }\n };\n})\n.directive(\"laxInput\", function($compile) {\n return {\n restrict: \"AE\",\n terminal: true,\n priority: 1000,\n controller: function($scope, $element) {\n $scope.isReadonlyCapableInput = function(element) {\n return element[0].nodeName === 'INPUT' ||\n element[0].nodeName === 'TEXTAREA' ||\n element[0].nodeName === 'SELECT';\n };\n\n $scope.isPlaceholderCapableInput = function(element) {\n return element[0].nodeName === 'INPUT' ||\n element[0].nodeName === 'TEXTAREA' ||\n element[0].nodeName === 'SELECT';\n };\n\n $scope.isUISelect = function(element) {\n return element[0].nodeName === 'UI-SELECT';\n };\n },\n link: function(scope, elem, attrs) {\n\n var laxInputName = attrs.laxInput;\n\n // Remove directive's attribute\n elem.removeAttr(attrs.$attr.laxInput);\n\n if (!attrs.id) {\n attrs.$set('id', \"{{::a.name}}\");\n }\n if (!attrs.ngClass) {\n attrs.$set('ngClass', \"checkAttributeEditedRemote(a.name);\");\n }\n if (!attrs.ngFocus) {\n attrs.$set('ngFocus', \"setAttributeUrl(a.name)\");\n }\n if (!attrs.ngDisabled) {\n attrs.$set('ngDisabled', \"onAddView || onEditView\");\n }\n if (!attrs.ngReadonly && scope.isReadonlyCapableInput(elem)) {\n attrs.$set('ngReadonly', \"a.readonly\");\n }\n\n if (scope.isPlaceholderCapableInput(elem)) {\n attrs.$set('placeholder', '{{::translatePlaceholder(a.name)}}');\n } else if (scope.isUISelect(elem)) {\n var uiSelectMatch = elem.find('ui-select-match');\n if (uiSelectMatch.length > 0) {\n uiSelectMatch[0].setAttribute('placeholder', '{{::translatePlaceholder(a.name)}}');\n }\n }\n\n attrs.$set('laxFocusOn', laxInputName || \"{{::a.name}}\");\n\n _.forEach(attrs.$attr, function(value, key) {\n var found = attrs[key].indexOf('a.readonly');\n if (found > -1) {\n attrs.$set(key, attrs[key] + ' || ' + (attrs[key][found - 1] === '!' ? '!' : '') + 'isAttributeReadonly(a)');\n }\n });\n $compile(elem)(scope);\n }\n };\n})\n.directive('laxFocusOn', function($timeout, $window) {\n return function(scope, elem, attr) {\n scope.$on('focusOn', function(event, name) {\n if (name === attr.laxFocusOn) {\n $timeout(function() {\n\n var focusable;\n if (elem.is(':focusable')) {\n focusable = elem;\n } else {\n // Find first focusable element, starting from parent of current element.\n // This way, the directive does not necessarily be set on the exact element!\n focusable = elem.parent().find(':focusable');\n }\n\n // Find first html element which is not a SPAN.\n // Unfortunately SPANs are focusable, which leads to problems especially with 'ui-select' components\n var htmlElement = _.find(focusable, function(htmlElement) {\n return htmlElement.nodeName !== 'SPAN';\n });\n\n if (htmlElement) {\n\n // Focusing element automatically scrolls it into view!\n htmlElement.focus();\n\n // Move cursor to start position, if possible\n if (_.isFunction(htmlElement.setSelectionRange) && htmlElement.type !== 'radio' && htmlElement.type !== 'checkbox') {\n htmlElement.setSelectionRange(0, 0);\n }\n\n }\n\n }, 300);\n }\n });\n };\n})\n.directive('laxNormalizeValue', function($parse, $rootScope) {\n return {\n require: 'ngModel',\n priority: 1,\n link: function(scope, element, attrs, ngModelCtrl) {\n\n var valueType = attrs.laxNormalizeValue || '';\n\n // Normalize value on creation\n var ngModelGet = $parse(attrs.ngModel);\n var value = ngModelGet(scope);\n value = $rootScope.parseValue(value, valueType);\n ngModelGet.assign(scope, value);\n\n // Add normalizing parser\n ngModelCtrl.$parsers.push(function(viewValue) {\n return $rootScope.parseValue(viewValue, valueType);\n });\n\n // Re-format value on blur\n function blur(evt) {\n var value = ngModelCtrl.$modelValue;\n for (var i = 0; i < ngModelCtrl.$formatters.length; i++) {\n value = ngModelCtrl.$formatters[i](value);\n }\n ngModelCtrl.$viewValue = value;\n ngModelCtrl.$render();\n }\n element.bind('blur', blur);\n\n }\n };\n})\n.directive('laxDatepicker', function($compile, $parse, $rootScope, $timeout) {\n return {\n restrict: 'A',\n priority: 100,\n terminal: true,\n replace: false,\n link: function(scope, element, attrs) {\n\n // Remove directive's attribute\n element.removeAttr(attrs.$attr.laxDatepicker);\n\n // Add wrapped datepicker popup directive\n var datepickerFormat = attrs.laxDatepicker;\n attrs.$set('datepickerPopup', datepickerFormat || '');\n\n // Set translated button texts\n attrs.$set('currentText', $rootScope.translate('TODAY'));\n attrs.$set('clearText', $rootScope.translate('CLEAR'));\n attrs.$set('closeText', $rootScope.translate('CLOSE'));\n\n // Add lax normalize value directive\n attrs.$set('laxNormalizeValue', 'date');\n\n // ui-bootstrap datepicker needs an \"is-open\" attribute pointing to a state variable.\n // We put this state in a \"global\" object variable, so we can prevent having multiple\n // datepickers open at the same time!\n var uniqueId = 'datepicker-' + scope.$id + Math.floor(Math.random() * 10000);\n if (attrs.laxDatepickerGrid == undefined) {\n attrs.$set('isOpen', \"datepickerOpened['\" + uniqueId + \"']\");\n\n // Toggle datepicker on click\n attrs.$set('ngClick', \"toggleDatepicker($event, '\" + uniqueId + \"')\");\n\n } else {\n attrs.$set('isOpen', \"grid.appScope.datepickerOpened['\" + uniqueId + \"']\");\n\n // Toggle datepicker on click\n attrs.$set('ngClick', \"grid.appScope.toggleDatepicker($event, '\" + uniqueId + \"')\");\n\n // Add 'datepicker-append-to-body=\"true\"' when in grid, otherwise the datepicker is rendered in the grid itself\n attrs.$set('datepickerAppendToBody', true);\n\n // Define an event to have the grid listen to, so it can end cell editing\n attrs.$set('laxGridInput', 'laxDatepickerClosed');\n\n }\n\n // Emit 'laxDatepickerClosed' when neither element is focused, nor datepicker is open\n var isFocused = true;\n function checkDatepickerClosed() {\n $timeout(function() {\n var isOpen = (isFocused === true) || ($rootScope.isDatepickerOpen(uniqueId));\n if (!isOpen) {\n scope.$emit('laxDatepickerClosed');\n\n if (attrs.laxDatepickerOnClose) {\n scope.$eval(attrs.laxDatepickerOnClose);\n }\n }\n }, 1);\n }\n\n function focused() {\n isFocused = true;\n checkDatepickerClosed();\n }\n element.on('focus', focused);\n\n function blurred() {\n isFocused = false;\n checkDatepickerClosed();\n }\n element.on('blur', blurred);\n\n scope.$watch(function() {\n return $rootScope.datepickerOpened[uniqueId];\n }, function() {\n checkDatepickerClosed();\n });\n\n // Toggle datepicker on click on sibling button, if any\n var component = element.siblings('[data-toggle=\"datepicker\"]');\n if (component.length === 0) {\n component = element.siblings().find('[data-toggle=\"datepicker\"]');\n }\n if (component.length) {\n component.on('click', function (evt) {\n if ($rootScope.isDatepickerOpen(uniqueId)) {\n $rootScope.toggleDatepicker(evt, uniqueId);\n $timeout(function() {\n element.trigger('focus');\n }, 1);\n } else {\n $timeout(function() {\n element.trigger('click');\n }, 1);\n }\n });\n component.on('focus', focused);\n component.on('blur', blurred);\n }\n\n $compile(element)(scope);\n\n }\n };\n})\n.directive('laxDatetimePicker', function($compile, $parse, $rootScope, $timeout) {\n return {\n restrict: 'A',\n priority: 100,\n terminal: true,\n replace: false,\n link: function(scope, element, attrs) {\n\n // Remove directive's attribute\n element.removeAttr(attrs.$attr.laxDatetimePicker);\n\n // Add wrapped datepicker popup directive\n var datepickerFormat = attrs.laxDatetimePicker;\n attrs.$set('datetimePicker', datepickerFormat || '');\n\n // Set translated button texts\n attrs.$set('currentText', $rootScope.translate('TODAY'));\n attrs.$set('clearText', $rootScope.translate('CLEAR'));\n attrs.$set('closeText', $rootScope.translate('CLOSE'));\n\n // Add lax normalize value directive\n attrs.$set('laxNormalizeValue', 'dateTime');\n\n // ui-bootstrap datepicker needs an \"is-open\" attribute pointing to a state variable.\n // We put this state in a \"global\" object variable, so we can prevent having multiple\n // datepickers open at the same time!\n var uniqueId = 'datepicker-' + scope.$id + Math.floor(Math.random() * 10000);\n if (attrs.laxDatepickerGrid == undefined) {\n attrs.$set('isOpen', \"datepickerOpened['\" + uniqueId + \"']\");\n\n // Toggle datepicker on click\n attrs.$set('ngClick', \"toggleDatepicker($event, '\" + uniqueId + \"')\");\n\n } else {\n attrs.$set('isOpen', \"grid.appScope.datepickerOpened['\" + uniqueId + \"']\");\n\n // Toggle datepicker on click\n attrs.$set('ngClick', \"grid.appScope.toggleDatepicker($event, '\" + uniqueId + \"')\");\n\n // Add 'datepicker-append-to-body=\"true\"' when in grid, otherwise the datepicker is rendered in the grid itself\n attrs.$set('datepickerAppendToBody', true);\n\n // Define an event to have the grid listen to, so it can end cell editing\n attrs.$set('laxGridInput', 'laxDatepickerClosed');\n\n }\n\n // Emit 'laxDatepickerClosed' when neither element is focused, nor datepicker is open\n var isFocused = true;\n function checkDatepickerClosed() {\n $timeout(function() {\n var isOpen = (isFocused === true) || ($rootScope.isDatepickerOpen(uniqueId));\n if (!isOpen) {\n scope.$emit('laxDatepickerClosed');\n\n if (attrs.laxDatepickerOnClose) {\n scope.$eval(attrs.laxDatepickerOnClose);\n }\n }\n }, 1);\n }\n\n function focused() {\n if (scope.$$childTail) {\n scope.$$childTail.showPicker = 'date';\n }\n isFocused = true;\n checkDatepickerClosed();\n }\n element.on('focus', focused);\n\n function blurred() {\n isFocused = false;\n checkDatepickerClosed();\n }\n element.on('blur', blurred);\n\n scope.$watch(function() {\n return $rootScope.datepickerOpened[uniqueId];\n }, function() {\n checkDatepickerClosed();\n });\n\n // Toggle datepicker on click on sibling button, if any\n var component = element.siblings('[data-toggle=\"datepicker\"]');\n if (component.length === 0) {\n component = element.siblings().find('[data-toggle=\"datepicker\"]');\n }\n if (component.length) {\n component.on('click', function (evt) {\n if ($rootScope.isDatepickerOpen(uniqueId)) {\n $rootScope.toggleDatepicker(evt, uniqueId);\n $timeout(function() {\n element.trigger('focus');\n }, 1);\n } else {\n $timeout(function() {\n element.trigger('click');\n }, 1);\n }\n });\n component.on('focus', focused);\n component.on('blur', blurred);\n }\n\n $compile(element)(scope);\n\n }\n };\n})\n.directive('onArrowKeys', function() {\n return {\n restrict: 'A',\n link: function(scope, element, attrs) {\n function keyPressed($event) {\n if ($event.keyCode == 38 && attrs.arrowUp) {\n $event.preventDefault();\n scope.$eval(attrs.arrowUp);\n } else if ($event.keyCode == 39 && attrs.arrowRight) {\n $event.preventDefault();\n scope.$eval(attrs.arrowRight);\n } else if ($event.keyCode == 40 && attrs.arrowDown) {\n $event.preventDefault();\n scope.$eval(attrs.arrowDown);\n } else if ($event.keyCode == 41 && attrs.arrowLeft) {\n $event.preventDefault();\n scope.$eval(attrs.arrowLeft);\n }\n }\n element.on('keydown', keyPressed);\n }\n };\n})\n.directive('laxGridBoolInput', function(uiGridConstants, uiGridEditConstants) {\n return {\n scope: false,\n link: function(scope, element, attrs){\n\n function leaveField(evt) {\n if (scope.inputForm && !scope.inputForm.$valid) {\n evt.stopPropagation();\n scope.$emit(uiGridEditConstants.events.CANCEL_CELL_EDIT);\n } else {\n scope.$emit(uiGridEditConstants.events.END_CELL_EDIT);\n }\n }\n\n function emitCellEditEvent(eventName) {\n scope.$emit(eventName, scope.row, scope.col);\n }\n\n element.on('mousedown', function(event) {\n element.focus();\n element.select();\n emitCellEditEvent('laxGridStartCellEdit');\n\n });\n\n element.on('click', function(event) {\n emitCellEditEvent('laxGridStopCellEdit');\n });\n\n function keydown(evt) {\n switch (evt.keyCode) {\n case uiGridConstants.keymap.LEFT:\n case uiGridConstants.keymap.UP:\n case uiGridConstants.keymap.RIGHT:\n case uiGridConstants.keymap.DOWN:\n evt.stopPropagation();\n leaveField(evt);\n break;\n case uiGridConstants.keymap.ESC:\n evt.stopPropagation();\n scope.$emit(uiGridEditConstants.events.CANCEL_CELL_EDIT);\n break;\n case uiGridConstants.keymap.ENTER:\n leaveField(evt);\n break;\n case uiGridConstants.keymap.TAB:\n evt.preventDefault();\n leaveField(evt);\n break;\n }\n return true;\n }\n\n element.on('keydown', keydown);\n }\n };\n })\n.directive('laxGridUiSelect', function($window, $document, $timeout, uiGridEditConstants, uiGridConstants, uiGridEditService) {\n return {\n require: ['uiSelect', '?^uiGrid', '?^uiGridRenderContainer', 'ngModel'],\n link: function(scope, element, attrs, controllers) {\n\n if (controllers[0]) { selectCtrl = controllers[0]; }\n if (controllers[1]) { uiGridCtrl = controllers[1]; }\n if (controllers[2]) { renderContainerCtrl = controllers[2]; }\n if (controllers[3]) { ngModel = controllers[3]; }\n\n function leaveField(evt) {\n if (scope.inputForm && !scope.inputForm.$valid) {\n scope.$emit(uiGridEditConstants.events.CANCEL_CELL_EDIT);\n } else {\n scope.$emit(uiGridEditConstants.events.END_CELL_EDIT);\n }\n }\n\n function keydown(evt) {\n switch(evt.keyCode) {\n case uiGridConstants.keymap.TAB:\n // passes the tab and other events on to the grid\n evt.uiGridTargetRenderContainerId = renderContainerCtrl.containerId;\n\n if (uiGridCtrl.cellNav.handleKeyDown(evt) !== null) {\n leaveField(evt);\n }\n $document.off('keydown', keydown);\n break;\n\n case uiGridConstants.keymap.ESC:\n scope.$emit(uiGridEditConstants.events.CANCEL_CELL_EDIT);\n evt.preventDefault();\n evt.stopPropagation();\n break;\n }\n }\n\n selectCtrl.$element.on('keydown', keydown);\n\n function endCellEdit() {\n scope.$emit('laxGridStopCellEdit', scope.row, scope.col);\n $document.off('keydown', keydown);\n }\n\n // BEGIN_CELL_EDIT event is already called, when this directive is loaded. So immediately call the laxGridStartCellEdit event\n scope.$emit('laxGridStartCellEdit', scope.row, scope.col);\n\n scope.$on(uiGridEditConstants.events.CANCEL_CELL_EDIT, function(event) {\n endCellEdit();\n });\n scope.$on(uiGridEditConstants.events.END_CELL_EDIT, function(event) {\n endCellEdit();\n });\n\n // Function to end the edit mode when the user clicks somewhere else\n clickedInsideGrid = function(evt) {\n if($(evt.target).closest('.ui-select-container').size() === 0) {\n scope.$emit(uiGridEditConstants.events.CANCEL_CELL_EDIT);\n }\n };\n uiGridCtrl.grid.api.cellNav.on.navigate(scope, clickedInsideGrid);\n\n scope.$on('uis:close', function() {\n $timeout(function() {\n scope.$emit(uiGridEditConstants.events.END_CELL_EDIT);\n }, 0);\n });\n\n // Function for passing the first keypress to the Ui select and focussing the input field\n var key = \"\";\n if (uiGridCtrl && uiGridCtrl.grid.api.cellNav) {\n var viewPortKeyDownUnregister = uiGridCtrl.grid.api.cellNav.on.viewPortKeyPress(scope, function (evt, rowCol) {\n if (uiGridEditService.isStartEditKey(evt)) {\n var code = typeof evt.which === 'number' ? evt.which : evt.keyCode;\n key = String.fromCharCode(code);\n }\n viewPortKeyDownUnregister();\n });\n // focus the inputfield and use the first key as input\n $timeout(function() {\n selectCtrl.focusSearchInput(key);\n });\n }\n }\n };\n})\n\n.directive('laxGridInput', function($timeout, $document, $rootScope, uiGridEditService, uiGridConstants, uiGridEditConstants) {\n return {\n scope: false,\n require: ['?^uiGrid', '?^uiGridRenderContainer', 'ngModel'],\n link: function(scope, element, attrs, controllers) {\n\n var uiGridCtrl, renderContainerCtrl, ngModel;\n if (controllers[0]) { uiGridCtrl = controllers[0]; }\n if (controllers[1]) { renderContainerCtrl = controllers[1]; }\n if (controllers[2]) { ngModel = controllers[2]; }\n\n function leaveField(evt) {\n if (scope.inputForm && !scope.inputForm.$valid) {\n scope.$emit(uiGridEditConstants.events.CANCEL_CELL_EDIT);\n } else {\n scope.$emit(uiGridEditConstants.events.END_CELL_EDIT);\n }\n }\n $timeout(function() {\n element.focus();\n });\n\n function keydown(evt) {\n switch (evt.keyCode) {\n case uiGridConstants.keymap.LEFT:\n case uiGridConstants.keymap.UP:\n case uiGridConstants.keymap.RIGHT:\n case uiGridConstants.keymap.DOWN:\n evt.stopPropagation();\n break;\n\n case uiGridConstants.keymap.ESC:\n evt.stopPropagation();\n scope.$emit(uiGridEditConstants.events.CANCEL_CELL_EDIT);\n break;\n\n case uiGridConstants.keymap.ENTER:\n leaveField(evt);\n break;\n\n case uiGridConstants.keymap.TAB:\n if (uiGridCtrl && uiGridCtrl.grid.api.cellNav) {\n evt.uiGridTargetRenderContainerId = renderContainerCtrl.containerId;\n if (uiGridCtrl.cellNav.handleKeyDown(evt) !== null) {\n leaveField(evt);\n }\n }\n break;\n }\n return true;\n }\n\n // Feature to call END_CELL_EDIT when the cell loses focus\n clickedOutsideOfCell = function(evt, stuff) {\n scope.$emit(uiGridEditConstants.events.END_CELL_EDIT);\n $document.off('click', clickedOutsideOfCell);\n };\n $document.on('click', clickedOutsideOfCell);\n\n element.on('keydown', keydown);\n\n function click(evt) {\n evt.stopPropagation();\n }\n element.on('click', click);\n\n function mousedown(evt) {\n evt.stopPropagation();\n }\n element.on('mousedown', mousedown);\n\n function blur(evt) {\n scope.$emit(uiGridEditConstants.events.END_CELL_EDIT);\n }\n\n function emitCellEditEvent(eventName) {\n scope.$emit(eventName, scope.row, scope.col);\n }\n\n scope.$on(uiGridEditConstants.events.BEGIN_CELL_EDIT, function(event) {\n emitCellEditEvent('laxGridStartCellEdit');\n });\n\n scope.$on(uiGridEditConstants.events.END_CELL_EDIT, function(event) {\n emitCellEditEvent('laxGridStopCellEdit');\n });\n\n scope.$on(uiGridEditConstants.events.CANCEL_CELL_EDIT, function(event) {\n emitCellEditEvent('laxGridStopCellEdit');\n });\n\n var endCellEditEvent = attrs.laxGridInput;\n if (endCellEditEvent !== '') {\n scope.$on(endCellEditEvent, function(evt) {\n scope.$emit(uiGridEditConstants.events.END_CELL_EDIT);\n });\n } else {\n element.on('blur', blur);\n }\n\n if (uiGridCtrl && uiGridCtrl.grid.api.cellNav) {\n uiGridCtrl.grid.api.cellNav.on.navigate(scope, clickedOutsideOfCell);\n var viewPortKeyDownUnregister = uiGridCtrl.grid.api.cellNav.on.viewPortKeyPress(scope, function (evt, rowCol) {\n if (uiGridEditService.isStartEditKey(evt) && $rootScope.isEmpty(attrs.laxNormalizeValue)) {\n var code = typeof evt.which === 'number' ? evt.which : evt.keyCode;\n\n // Feature to use the first keypress as input\n key = String.fromCharCode(code);\n ngModel.$setViewValue(key, evt);\n ngModel.$render();\n\n // Fix for IE setting the cursor to position 0 after focussing an element\n if (element.length !== 0) {\n elem = element[0];\n var caretPos = ngModel.$viewValue.length;\n if (elem.createTextRange) {\n var range = elem.createTextRange();\n range.move('character', caretPos);\n range.select();\n } else {\n if (elem.setSelectionRange) {\n elem.focus();\n elem.setSelectionRange(caretPos, caretPos);\n } else\n elem.focus();\n }\n }\n }\n viewPortKeyDownUnregister();\n });\n }\n\n scope.$on('$destroy', function() {\n element.off('keydown', keydown);\n element.off('click', click);\n element.off('mousedown', mousedown);\n element.off('blur', blur);\n });\n }\n };\n})\n.directive('uiGridCell',\nfunction () {\n return {\n priority: -100, // run after the actual uiGridCell directive and ui.grid.edit uiGridCell\n restrict: 'A',\n require: ['^uiGrid', '?^uiGridCellnav'],\n scope: false,\n link: function ($scope, $elm, $attrs, controllers) {\n var uiGridCtrl = controllers[0];\n\n $elm.off('mousedown');\n\n //turn on and off for edit events\n if (uiGridCtrl.grid.api.edit) {\n uiGridCtrl.grid.api.edit.on.beginCellEdit($scope, function () {\n $elm.off('mousedown');\n });\n\n uiGridCtrl.grid.api.edit.on.afterCellEdit($scope, function () {\n $elm.off('mousedown');\n });\n\n uiGridCtrl.grid.api.edit.on.cancelCellEdit($scope, function () {\n $elm.off('mousedown');\n });\n }\n }\n };\n})\n.directive('uiGridCustomRowEdit',\nfunction () {\n return {\n priority: -100, // run after the actual uiGridCell directive and ui.grid.edit uiGridCell\n restrict: 'A',\n require: ['^uiGrid', '?^uiGridCellnav'],\n scope: false,\n link: function ($scope, $elm, $attrs, controllers) {\n var uiGridCtrl = controllers[0];\n\n if (uiGridCtrl.grid.api.edit) {\n uiGridCtrl.grid.api.edit.on.beginCellEdit($scope, function (row) {\n $scope.$parent.rowEdit = true;\n $scope.$parent.editingRow = row;\n row.editing = true;\n if (!row.oldValue) {\n row.oldValue = row.value;\n }\n });\n }\n }\n };\n})\n.directive('ckEditor', function($timeout) {\n return {\n require: '?ngModel',\n link: function(scope, elm, attrs, ngModel) {\n if (elm[0].id.indexOf('{{') > -1) {\n elm[0].id = scope[elm[0].id.substring(2, elm[0].id.length-2)];\n } else if (attrs.id.indexOf('{{') > -1) {\n elem[0].id = scope[attrs.id.substring(2, attrs.id.length-2)];\n }\n var ck = {};\n var toolbarName = attrs.toolbar || 'basic';\n if (toolbarName == 'inline') {\n CKEDITOR.disableAutoInline = true;\n ck = CKEDITOR.inline(elm[0], scope[attrs.ckEditor][toolbarName]);\n } else {\n ck = CKEDITOR.replace(elm[0], scope[attrs.ckEditor][toolbarName]);\n }\n\n if (!ngModel) return;\n\n ck.on('instanceReady', function(event) {\n ck.setData(ngModel.$viewValue);\n toggleToolbar(event, 'hide');\n });\n\n function updateModel() {\n $timeout(function() {\n ngModel.$setViewValue(ck.getData());\n }, 0);\n }\n\n function toggleToolbar(event, toggle) {\n if (toggle == 'show') {\n angular.element('#cke_' + event.editor.name + ' .cke_top').show();\n angular.element('#cke_' + event.editor.name + ' .cke_bottom').show();\n } else {\n angular.element('#cke_' + event.editor.name + ' .cke_top').hide();\n angular.element('#cke_' + event.editor.name + ' .cke_bottom').hide();\n }\n }\n\n ck.on('focus', function(event) {\n toggleToolbar(event, 'show');\n });\n ck.on('blur', function(event) {\n toggleToolbar(event, 'hide');\n });\n\n ck.on('change', updateModel);\n ck.on('key', updateModel);\n ck.on('dataReady', updateModel);\n\n ngModel.$render = function(value) {\n ck.setData(ngModel.$viewValue);\n };\n }\n };\n})\n.directive('focusOnLoad', function($timeout) {\n return {\n restrict: 'AC',\n link: function(scope, element) {\n $timeout(function(){\n element[0].focus();\n }, 0);\n }\n };\n})\n.directive('progressButton', function($translate, $timeout) {\n return {\n restrict: 'E',\n transclude: true,\n replace: true,\n scope: {\n value: '&',\n type: '@',\n inProgressText: '@inProgress',\n completionText: '@complete',\n defaultText: '@default'\n },\n template: '{{defaultText}}',\n link: function(scope, element, attrs) {\n var bar = angular.element(element[0].querySelectorAll('.progress-button-bar'));\n var buttonText = angular.element(element[0].querySelectorAll('.progress-button-text'));\n\n attrs.$observe('type', function(value) { scope.type = value || 'horizontal'; });\n attrs.$observe('inProgress', function(value) { scope.inProgressText = $translate.instant(value) || $translate.instant('ITEM.IN_PROGRESS'); });\n attrs.$observe('default', function(value) { scope.defaultText = $translate.instant(value) || $translate.instant('SAVE'); });\n attrs.$observe('complete', function(value) { scope.completionText = $translate.instant(value) || $translate.instant('ITEM.FINISHED'); });\n\n scope.$watch('value()', function(value) {\n if(!value) value = 0;\n if(value > 1.0) value = 1.0;\n\n if(value === 0.0) {\n buttonText.attr('data-progress-button-text', scope.defaultText);\n buttonText.addClass('force-refresh').removeClass('force-refresh');\n bar.css('display', 'none');\n } else if(value === 1.0) {\n buttonText.attr('data-progress-button-text', scope.completionText);\n buttonText.addClass('force-refresh').removeClass('force-refresh');\n bar.css('display', 'block');\n\n $timeout(function() {\n fadeOut(bar);\n }, 500);\n } else {\n buttonText.attr('data-progress-button-text', scope.inProgressText);\n buttonText.addClass('force-refresh').removeClass('force-refresh');\n bar.css('display', 'block');\n }\n\n // Allow ‘display: block’ above to be applied before setting the\n // bar’s width/height. This allows the CSS transition to happen if\n // the original value was zero.\n $timeout(function() {\n if(scope.type === 'vertical') {\n bar.css('height', (value * 100) + '%');\n } else {\n bar.css('width', (value * 100) + '%');\n }\n });\n });\n\n var fadeOut = function(el, callback) {\n el.css('opacity', 1);\n\n var last = +new Date();\n\n var tick = function() {\n el.css('opacity', +el.css('opacity') - (new Date() - last) / 400);\n last = +new Date();\n\n if (+el.css('opacity') > 0) {\n if (!(window.requestAnimationFrame && requestAnimationFrame(tick))) {\n setTimeout(tick, 16);\n }\n } else {\n el.css('display', 'none');\n el.css('opacity', 1);\n if (typeof callback === 'function') {\n callback();\n }\n }\n };\n\n tick();\n };\n }\n };\n})\n.directive(\"autofill\", function () {\n return {\n require: \"ngModel\",\n link: function (scope, element, attrs, ngModel) {\n scope.$on(\"autofill:update\", function() {\n ngModel.$setViewValue(element.val());\n });\n }\n };\n})\n.directive(\"clearableInput\", function() {\n return {\n restrict: 'EA',\n transclude: true,\n template: '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n ' ' +\n ' ' +\n ' ' +\n '
    ' +\n '
    ',\n link: function(scope, element, attrs) {\n scope.showClearBtn = scope.a && !(scope.a.typeName == 'Collection' || scope.a.typeName == 'MultiDimensional' || scope.a.typeName == 'MultiReference');\n scope.clearValue = function() {\n var attributeName = scope.a.name;\n var item = scope.item;\n\n // Allowing clear-button to remove sub key\n if (!_.isEmpty(attrs.itemSubKey)) {\n item = item[scope.a.name];\n attributeName = attrs.itemSubKey;\n }\n\n // We cannot use 'delete' here, because then the ItemChangesQueues would not detect any changes!\n var previousValue = item[attributeName];\n if (_.isArray(previousValue)) {\n item[attributeName] = [];\n if (scope.gridOptionsMap[attributeName]) {\n scope.gridOptionsMap[attributeName].minRowsToShow = 1;\n }\n } else {\n item[attributeName] = null;\n }\n if (scope.a.typeName === 'AdditionalCategory' && !_.isNil(previousValue)) {\n scope.updateAdditionalCategoryAttributes(item, [attributeName]);\n }\n // Broadcast down the hierarchy\n scope.$broadcast('clearAttributeValue', attributeName);\n // Emit up the hierarchy\n scope.$emit('clearAttributeValue', attributeName);\n };\n }\n };\n}).directive(\"clearableGroupInput\", function() {\n return {\n restrict: 'EA',\n transclude: true,\n template: '
    ' +\n '
    ' +\n '
    ' +\n '
    ' +\n ' ' +\n ' ' +\n ' ' +\n '
    ' +\n '
    ',\n link: function(scope, element, attrs) {\n scope.clearGroupValue = function() {\n var attributeName = scope.a.name;\n var reference = scope.$parent.entry;\n var attribute = scope.a;\n\n if (scope.isAttributeReadonly(attribute)) {\n return;\n }\n // We cannot use 'delete' here, because then the ItemChangesQueues would not detect any changes!\n var previousValue = reference[attributeName];\n if (_.isArray(previousValue)) {\n reference[attributeName] = [];\n if (scope.gridOptionsMap[attributeName]) {\n scope.gridOptionsMap[attributeName].minRowsToShow = 1;\n }\n } else {\n reference[attributeName] = null;\n }\n //to-do:check if this works with group attribute?\n if (attribute.typeName === 'AdditionalCategory' && !_.isNil(previousValue)) {\n scope.updateAdditionalCategoryAttributes($scope.item, [attributeName]);\n }\n scope.$broadcast('clearAttributeValue', attributeName);\n };\n }\n };\n})\n.directive('ngCompiledInclude',\n function($compile, $log, $rootScope, $templateCache) {\n\n var TEMPLATE_ALTERNATIVES = {\n 'OpenEnum': 'Enum',\n 'OpenEnumSet': 'EnumSet',\n 'Codelist' : 'Enum',\n 'OpenCodelist': 'Enum',\n 'CodelistSet': 'EnumSet',\n 'OpenCodelistSet': 'EnumSet'\n };\n\n function loadTemplate(scope, element, attrs) {\n\n if (attrs.ngCompiledInclude === '' || attrs.ngCompiledInclude === 'Placeholder') {\n return;\n }\n $rootScope.compiledTemplates = $rootScope.compiledTemplates || {};\n\n var templateName = attrs.ngCompiledInclude;\n var template = $templateCache.get(templateName);\n if (_.isNil(template)) {\n var alternativeName = TEMPLATE_ALTERNATIVES[templateName];\n if (!_.isEmpty(alternativeName)) {\n template = $templateCache.get(alternativeName);\n if (_.isNil(template)) {\n throw \"Alternative template '\" + alternativeName + \"' for template '\" + templateName + \"' was not found\";\n }\n } else {\n throw \"Template '\" + templateName + \"' was not found\";\n }\n }\n\n var customModel = attrs.customModel;\n var customChange = attrs.customChange;\n var customId = attrs.customId;\n\n if (customModel && _.includes(customModel, \"item[a.name]\")) {\n template = template.replace(/item\\[a\\.name\\]/g, customModel);\n } else if (customModel) {\n customModelClean = angular.copy(customModel);\n customModelClean = customModelClean.replace(/\\'/g,\"\");\n template = template.replace(/data\\-model\\=\\\"item\\[a\\.name\\]\\\"/g, 'data-model=' + '\"' + customModel + '\"');\n template = template.replace(/data\\-ng\\-model\\=\\\"item\\[a\\.name\\]\\\"/g, 'data-ng-model=' + '\"' + customModel + '\"');\n template = template.replace(/data\\-model\\-string\\=\\'\\\"item\\[a\\.name\\]\\\"\\'/g, \"data-model-string=\" + \"'\" + '\"' + customModelClean + '\"' + \"'\");\n template = template.replace(/\\\"Document\\\"\\, \\\"item\\[a\\.name\\]\\\"/g, '\"Document\", ' + '\"' + customModelClean + '\"');\n template = template.replace(/\\\"Image\\\"\\, \\\"item\\[a\\.name\\]\\\"/g, '\"Image\", ' + '\"' + customModelClean + '\"');\n template = template.replace(/\\\"item\\[a\\.name\\]\\\"/g, '\"' + customModelClean + '\"');\n template = template.replace(/item\\[a\\.name\\]/g, customModel);\n }\n\n if (customId) {\n template = template.replace(/(id=\")([a-z{}:.]+)\"/i, '$1{{' + customId + '}}\"');\n }\n\n // put a reference of the source in the template as comment\n template = '' + template;\n\n var combinedTemplateName = (customModel ? customModel : 'item[a.name]') + '.' + templateName;\n\n var compiledTemplate = $rootScope.compiledTemplates[combinedTemplateName];\n if (!compiledTemplate) {\n $log.debug(\"Compiling template:\", templateName);\n compiledTemplate = $compile(template);\n $rootScope.compiledTemplates[combinedTemplateName] = compiledTemplate;\n }\n\n compiledTemplate(scope, function(clonedElement, scope) {\n var templateElement = clonedElement;\n element.html(templateElement);\n });\n\n }\n\n return {\n restrict: 'A',\n priority: 400,\n link: function(scope, element, attrs) {\n if (!_.isUndefined(attrs.compileDynamic)) {\n scope.$watch(attrs.ngModel, function(newVal) {\n loadTemplate(scope, element, attrs);\n });\n }\n loadTemplate(scope, element, attrs);\n }\n };\n }\n)\n.directive('feature', function(FeatureToggleService) {\n return {\n restrict: 'A',\n priority: 400,\n link: function(scope, element, attrs) {\n var feature = attrs.feature;\n\n var show = FeatureToggleService.checkFeatureEnabled(feature);\n\n if (!show) {\n element.addClass('hiddenByFeature');\n element.hide();\n } else {\n element.removeClass('hiddenByFeature');\n element.show();\n }\n }\n };\n})\n.directive('hideOnFeature', function(FeatureToggleService) {\n return {\n restrict: 'A',\n priority: 400,\n link: function(scope, element, attrs) {\n var feature = attrs.hideOnFeature;\n\n var show = !FeatureToggleService.checkFeatureEnabled(feature);\n\n if (!show) {\n element.addClass('hiddenByFeature');\n element.hide();\n } else {\n element.removeClass('hiddenByFeature');\n element.show();\n }\n }\n };\n})\n.directive('sessionIf', function(SessionDataService) {\n return {\n restrict: 'A',\n link: function(scope, element, attrs) {\n var key = attrs.sessionIf;\n\n scope.$watch(function() {\n return SessionDataService.get(key);\n }, function(value) {\n if (!value) {\n element.addClass('hiddenByFeature');\n element.hide();\n } else {\n element.removeClass('hiddenByFeature');\n element.show();\n }\n });\n }\n };\n})\n.directive('checkRightsForRoutes', function(Auth, Routes) {\n\n function hideOrShow(element) {\n\n var lis = element.find(\"li\");\n _.forEach(lis, function(li_) {\n\n var li = $(li_);\n var link = angular.element(li).find(\"a\")[0];\n if (link && link.pathname) {\n var url = link.pathname;\n\n var route = Routes.filter(function(route) {\n var found = (route.url === url);\n if (!found && route.urls) {\n found = route.urls.contains(url);\n }\n return found;\n })[0];\n\n if (route && route.rights) {\n var hasRights = Auth.hasRights(route.rights);\n\n if (!hasRights || li.hasClass(\"hiddenByFeature\")) {\n li.addClass(\"hiddenByRoute\");\n li.hide();\n } else {\n li.removeClass(\"hiddenByRoute\");\n if (!li.hasClass(\"hiddenByHasRights\") && !li.hasClass(\"hiddenByFeature\")) {\n li.show();\n }\n }\n }\n }\n\n });\n\n var topLevelLis = element.children();\n for (var i = 0; i < topLevelLis.length; i++) {\n var topLevelLi = topLevelLis[i];\n\n var childs = $(topLevelLi).children().find(\"li\");\n\n if (childs.length !== 0) { // no childs -> no hiding of top level\n var show = false;\n for (var j = 0; j < childs.length; j++) {\n var child = childs[j];\n if (child.className.indexOf(\"hiddenByRoute\") == -1 &&\n child.className.indexOf(\"hiddenByHasRights\") == -1 &&\n child.className.indexOf(\"hiddenByFeature\") == -1) {\n // When there is at least one visible child also show parent\n show = true;\n break;\n }\n }\n if (show) {\n $(topLevelLi).show();\n } else {\n $(topLevelLi).hide();\n }\n }\n }\n }\n\n return {\n restrict: 'A',\n priority: 400,\n link: function(scope, element, attrs){\n\n hideOrShow(element);\n scope.$on(\"userRolesLoaded\", function() {\n hideOrShow(element);\n });\n }\n };\n})\n.directive('hasRights', function(Auth) {\n\n var rights = [];\n\n function hideOrShow(element) {\n var hasRights = Auth.hasRights(rights);\n\n if (!hasRights) {\n element.addClass(\"hiddenByHasRights\");\n element.hide();\n } else if (!element.hasClass(\"hiddenByFeature\")){\n element.removeClass(\"hiddenByHasRights\");\n element.show();\n }\n }\n\n return {\n restrict: 'A',\n priority: 400,\n link: function(scope, element, attrs){\n\n var rightsString = attrs.hasRights;\n rights = rightsString.split(\",\");\n\n hideOrShow(element);\n scope.$on(\"userRolesLoaded\", function() {\n hideOrShow(element);\n });\n }\n };\n})\n .directive('dontHasRights', function(Auth) {\n\n var rights = [];\n\n function hideOrShow(element) {\n var hasRights = Auth.hasRights(rights);\n\n if (hasRights) {\n element.addClass(\"hiddenByHasRights\");\n element.hide();\n } else if (!element.hasClass(\"hiddenByFeature\")){\n element.removeClass(\"hiddenByHasRights\");\n element.show();\n }\n }\n\n return {\n restrict: 'A',\n priority: 400,\n link: function(scope, element, attrs){\n\n var rightsString = attrs.dontHasRights;\n rights = rightsString.split(\",\");\n\n hideOrShow(element);\n scope.$on(\"userRolesLoaded\", function() {\n hideOrShow(element);\n });\n }\n };\n })\n.directive('directCompare', function() {\n return {\n restrict: 'A',\n priority: 10,\n link: function(scope, elm, attrs) {\n var str1 = \"\";\n var str2 = \"\";\n\n function updateDiff() {\n if (str2 == '') {\n elm.text('-');\n } else if ( (str1 && str2) && (str1 !== str2) && (str1 !== '' && str2 !== '') ) {\n elm.html(diffString(str1, str2));\n } else {\n elm.text(str2);\n }\n }\n\n scope.$watch(attrs.strFirst, function(value) {\n str1 = value;\n updateDiff();\n });\n\n scope.$watch(attrs.strSecond, function(value) {\n str2 = value;\n updateDiff();\n });\n }\n };\n})\n.directive('scrollToBottom', function($timeout) {\n return {\n restrict: 'A',\n link: function(scope, elm, attrs) {\n scope.$on('scrollTriggered', function() {\n $timeout(function() {\n elm.scrollTop(elm[0].scrollHeight);\n }, 0);\n });\n }\n };\n})\n.directive('checkAttributes', function($timeout) {\n return {\n restrict: 'AE',\n link: function(scope, element, attrs) {\n $timeout(function () {\n var container = element.find('.panel-body-content').get(0);\n\n if (!_.isNil(container)) {\n var attrCount = container.childElementCount;\n\n if (attrCount < 1) {\n element.addClass('hidden');\n }\n }\n });\n }\n };\n})\n.directive('urlParam', function($location, $timeout) {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function(scope, element, attrs, ctrl) {\n var timeout;\n var label = attrs.urlParam;\n var prefix = _.trim(scope.$eval(attrs.urlParamPrefix), '/');\n\n scope.$watch(attrs.urlParamValue, function(newVal, oldVal) {\n if (newVal !== oldVal) {\n if (!_.isUndefined(timeout)) {\n $timeout.cancel(timeout);\n }\n timeout = $timeout(function() {\n changeUrlParam(label, newVal, prefix);\n }, 1);\n }\n });\n\n function changeUrlParam(label, value, prefix) {\n var hash = prefix.split('#');\n\n if (!_.isEmpty(value)) {\n value = value.split(\" \").join(\"+\");\n\n // TODO: DIRTY HACK to angularjs converting '+' to '%2B' in url parameters\n // please see https://github.com/angular/angular.js/issues/3042 for more info\n var realEncodeURIComponent = window.encodeURIComponent;\n window.encodeURIComponent = function(input) {\n return realEncodeURIComponent(input).split(\"%2B\").join(\"+\");\n };\n\n if (hash.length > 1) {\n $location.displayUrl(hash[0]).search(label, value).hash(hash[1]);\n } else {\n $location.displayUrl(prefix).search(label, value);\n }\n\n // return encodeURIComponent to what it was before the hack.\n window.encodeURIComponent = realEncodeURIComponent;\n } else {\n $location.search(label, null);\n }\n }\n }\n };\n})\n.directive('validateEmail', function() {\n var EMAIL_REGEXP = /^([\\w-]+(?:\\.[\\w-]+)*)\\+?[\\w-]+@((?:[\\w-]+\\.)*\\w[\\w-]{0,66})\\.([a-z]{2,}(?:\\.[a-z]{2})?)$/i;\n return {\n require: 'ngModel',\n link: function(scope, elm, attrs, ctrl) {\n ctrl.$parsers.unshift(function(viewValue) {\n if (EMAIL_REGEXP.test(viewValue)) {\n ctrl.$setValidity('validateEmail', true);\n return viewValue;\n } else {\n ctrl.$setValidity('validateEmail', false);\n return undefined;\n }\n });\n }\n };\n})\n.directive('validateHostname', function($rootScope) {\n return {\n require: 'ngModel',\n link: function(scope, elm, attrs, ctrl) {\n ctrl.$validators.validateHostname = function(modelValue, viewValue) {\n if (_.isEmpty(viewValue)) {\n return true; // Not checking empty hostname\n }\n return $rootScope.isValidHostname(viewValue);\n };\n }\n };\n})\n.directive('uiGridResizeHeight', function (gridUtil, uiGridConstants) {\n return {\n restrict: 'A',\n require: 'uiGrid',\n link: function($scope, $elm, $attrs, uiGridCtrl) {\n\n $scope.$watchCollection(uiGridCtrl.grid.options.data, function(newData) {\n\n var options = uiGridCtrl.grid.options;\n var grid = uiGridCtrl.grid;\n\n // Initialize scrollbars (TODO: move to controller??)\n uiGridCtrl.scrollbars = [];\n if (!_.isEmpty(newData)) {\n if (newData.length >= 10) {\n options.minRowsToShow = 10;\n } else {\n options.minRowsToShow = newData.length;\n }\n } else {\n options.minRowsToShow = 0;\n }\n\n // Figure out the new height\n var contentHeight = options.minRowsToShow * options.rowHeight + (options.rowHeight * 0.5);\n var headerHeight = grid.options.hideHeader ? 0 : options.headerRowHeight;\n var footerHeight = grid.options.showFooter ? options.footerRowHeight : 0;\n var scrollbarHeight = grid.options.enableScrollbars ? gridUtil.getScrollbarWidth() : 0;\n\n // Calculates the maximum number of filters in the columns\n var maxNumberOfFilters = 0;\n angular.forEach(grid.options.columnDefs, function(col) {\n if (col.hasOwnProperty('filter')) {\n if (maxNumberOfFilters < 1) {\n maxNumberOfFilters = 1;\n }\n } else if (col.hasOwnProperty('filters')) {\n if (maxNumberOfFilters < col.filters.length) {\n maxNumberOfFilters = col.filters.length;\n }\n }\n });\n\n var filterHeight = maxNumberOfFilters * headerHeight;\n var newHeight = headerHeight + contentHeight + footerHeight + scrollbarHeight + filterHeight;\n\n $elm.css('height', newHeight + 'px');\n\n grid.gridHeight = $scope.gridHeight = gridUtil.elementHeight($elm);\n\n // Run initial canvas refresh\n grid.refreshCanvas();\n\n });\n }\n };\n})\n.directive('datamodeltemplate', function(ReactBridge) {\n return {\n restrict: 'EA',\n scope: {\n model: '='\n },\n templateUrl: 'tpl/datamodeltemplate.tpl.html',\n replace: true,\n controller: function($modal, $rootScope, $scope, growl, Auth, OrganizationService, UseDatamodelResource) {\n\n $scope.hasActivatePermisson = Auth.hasAnyPermission(Auth.OBJECT_TYPE_DATAMODEL, 'activate');\n $scope.useDataModel = function(dataModel) {\n UseDatamodelResource.save({\n modelId: dataModel.id,\n isSystemDataModel: dataModel.isSystemDataModel\n }, function() {\n growl.success('MODELEXCHANGE.USE_MODEL_SUCCESSFUL');\n $scope.$broadcast(\"closeInfoModel\");\n OrganizationService.update({ isDataModelDeploying: true });\n }, function() {\n growl.error(\"MODELEXCHANGE.USE_MODEL_ERROR\");\n OrganizationService.update({ isDataModelDeploying: false });\n });\n };\n\n var dmInfo = function($scope) {\n var langKey = $rootScope.language;\n var ds = $scope.model.descriptions;\n if (!_.isEmpty(ds)) {\n $scope.model.translatedDescription = ds[langKey] || ds[''] || \"\";\n }\n var rn = $scope.model.releaseNotes;\n if (!_.isEmpty(rn)) {\n $scope.model.translatedReleaseNotes = rn[langKey] || rn[''] || \"\";\n }\n };\n\n $scope.showInfo = function() {\n dmInfo($scope);\n var dialog = ReactBridge.mountDialog(\"DataModelExchangeDialog\", \"#react-data-model-exchange\",\n {\n dataModelInfo: $scope.model,\n hasActivatePermisson: $scope.hasActivatePermisson,\n onClose: function(toWait) {\n return toWait? ReactBridge.unmountWhenReady(dialog.unmount): dialog.unmount();\n }\n });\n };\n\n }\n };\n})\n.directive('gridLimitContent', function($sce, $rootScope) {\n return {\n restrict: 'A',\n template: '
    ' +\n ' ' +\n ' ' +\n ' ' +\n ' ' +\n '
    ',\n replace: true,\n link: function(scope, element, attrs) {\n scope.$watch('row.entity', function(val) {\n var index = attrs.gridContent.indexOf('\\n');\n if (index > 0) {\n scope.row.entity.summary = attrs.gridContent.substr(0, index);\n scope.row.entity.extra = attrs.gridContent.substring(index);\n } else {\n var htmlString = \"\" + attrs.gridContent + \"\";\n scope.row.entity.summary = $sce.trustAsHtml(htmlString);\n }\n });\n }\n };\n})\n.directive('categoriesTypeahead', function($filter, $translate, DataModelRetrievalResource) {\n return {\n restrict: 'A',\n require: 'ngModel',\n scope: '=',\n link: function(scope, elem, attrs, ngModelCtrl) {\n var initValue = scope.item[scope.a.name];\n\n function initAdditionalCategory(attribute, modelValue) {\n return DataModelRetrievalResource.query({\n method: 'categories',\n code: modelValue,\n dataModel: _.get(attribute.params, 'additionalModule'),\n extension: _.get(attribute.params, 'extension'),\n limit: 1\n }\n ).$promise;\n }\n\n function formatCategory(modelValue, selectedAdditionalCategory) {\n if (!modelValue) {\n return;\n }\n var result = modelValue;\n var category = selectedAdditionalCategory || scope.selectedAdditionalCategory;\n if (category) {\n result = $filter('additionalCategoryFormatter')(category, false);\n }\n return result;\n }\n\n if (initValue) {\n initAdditionalCategory(scope.a, initValue).then(function(response) {\n scope.selectedAdditionalCategory = response[0];\n if (response[0]) {\n ngModelCtrl.$setViewValue(formatCategory(scope.selectedAdditionalCategory));\n ngModelCtrl.$render();\n }\n });\n }\n\n ngModelCtrl.$formatters.push(function(modelValue) {\n return formatCategory(modelValue);\n });\n\n ngModelCtrl.$parsers.push(function(modelValue) {\n var found = /\\[(\\w+)\\]/i.exec(modelValue);\n if (found) {\n return found[found.length - 1];\n }\n else {\n return modelValue;\n }\n });\n },\n controller: function($attrs, $log, $modal, $rootScope, $scope, DataModelResource, DataModelRetrievalResource) {\n\n $scope.nodes = [];\n $scope.nodesMap = [];\n $scope.nodeCollapseMap = {};\n\n var alreadyInitialized = null;\n\n $scope.getTopLevelCategories = function() {\n\n $scope.nodeCollapseMap = {};\n\n var attribute = $scope.$eval($attrs.attribute);\n if (alreadyInitialized == attribute.name) {\n openModal(attribute);\n return;\n }\n\n var entries = [];\n DataModelRetrievalResource.query({\n method: 'categories',\n dataModel: attribute.params.additionalModule,\n extension: attribute.params.extension,\n parent: attribute.params.additionalCategory,\n limit: 50\n },\n function(response) {\n entries = _.map(response, function(item) {\n return {\n code: item.code,\n id: item.id,\n leaf: item.leaf,\n level: 0,\n parent: item.parent,\n title: item.title\n };\n });\n $scope.nodes = entries;\n $scope.nodesMap[0] = $scope.nodes[0];\n alreadyInitialized = attribute.name;\n openModal(attribute);\n },\n function(response) {\n $log.error(response);\n });\n\n };\n\n function openModal(attribute) {\n\n var selectedValue = $scope.item[attribute.name];\n\n if (!_.isNil(selectedValue)) {\n\n $scope.displayLoader = true;\n DataModelResource({}).getCategoryPath({\n code : selectedValue,\n dataModel: attribute.params.additionalModule,\n extension: attribute.params.extension\n },\n function(pathNodes) {\n pathNodes = pathNodes.reverse();\n var parentNodes = [];\n _.forEach(pathNodes, function(n) {\n if (n && n.leaf == 'false') {\n parentNodes.push(n.id);\n }\n });\n DataModelRetrievalResource.query({\n method: 'categories',\n dataModel: attribute.params.additionalModule,\n extension: attribute.params.extension,\n parent: parentNodes,\n limit: 500\n },\n function(allLeaves) {\n var nodes = $scope.nodes;\n _.forEach(pathNodes, function(n, i) {\n var leaves;\n sel_root = _.find(nodes, { code: n.code});\n if (sel_root) {\n $scope.nodesMap[i] = sel_root;\n $scope.nodeCollapseMap[sel_root.code] = true;\n leaves = _.filter(allLeaves, {parent:n.id});\n if (!_.isEmpty(leaves)) {\n sel_root.leaves = _.map(leaves, function(sn) {\n sn.level = sel_root.level + 1;\n return sn;\n });\n }\n }\n nodes = leaves;\n });\n $scope.selectedNode = $scope.nodesMap[$scope.nodesMap.length-1];\n $scope.displayLoader = false;\n },\n function(response) {\n $log.info(response);\n });\n },\n function(response) {\n $scope.displayLoader = false;\n $log.info(response);\n });\n }\n\n $rootScope.additionalModalOpen = true;\n $modal.open({\n templateUrl: 'tpl/additionalCategoryNodesRenderer.tpl.html',\n controller: nodesPopupController,\n backdrop: 'static',\n keyboard: true,\n scope: $scope,\n windowClass: 'ac-editor'\n });\n\n }\n\n function nodesPopupController($scope, $modalInstance, $document) {\n var escapePressed = function (evt) {\n if (evt.keyCode == 27) {\n evt.preventDefault();\n evt.stopPropagation();\n $scope.cancel();\n }\n };\n $document.on('keydown keypress', escapePressed);\n\n $scope.cancel = function() {\n $document.off('keydown keypress', escapePressed);\n $rootScope.additionalModalOpen = false;\n $modalInstance.close();\n };\n $scope.nodeSelected = function(attribute) {\n updateCategory($scope.selectedNode, attribute);\n $rootScope.additionalModalOpen = false;\n $modalInstance.close();\n };\n }\n\n $scope.updateNodes = function(node, attribute) {\n $scope.nodesMap[node.level] = node;\n $scope.selectedNode = node;\n $scope.resetToCategory(node);\n if (node.leaf == 'false' && _.isEmpty(node.leaves)) {\n updateSubCategories(node, attribute);\n }\n };\n\n function updateCategory(node, attribute) {\n if (!node || node.leaf == \"false\") {\n return;\n }\n $scope.selectedAdditionalCategory = node;\n $scope.item[attribute.name] = node.code;\n $scope.updateAdditionalCategoryAttributes($scope.item, $scope.a.name);\n }\n\n function updateSubCategories(node, attribute) {\n if (!node || node.emptyDefault) {\n $scope.resetToCategory(node);\n } else if (node.leaf == \"false\") {\n DataModelRetrievalResource.query({\n method: 'categories',\n dataModel: attribute.params.additionalModule,\n extension: attribute.params.extension,\n parent: node.id,\n limit: 500\n },\n function(response) {\n if (response.length > 0) {\n node.leaves = _.map(response, function(sn) {\n sn.level = node.level + 1;\n return sn;\n });\n _.forEach($scope.nodesMap, function(item, ind) {\n if (item.id === node.id) {\n $scope.nodesMap[ind + 1] = node.leaves[0];\n }\n });\n } else if ($scope.nodesMap.length > 1) {\n $scope.resetToCategory(node);\n }\n updateCategory(node, attribute);\n },\n function(response) {\n console.log(response);\n });\n } else {\n updateCategory(node, attribute);\n }\n }\n\n $scope.resetToCategory = function(node) {\n if (!node) return;\n $scope.nodesMap = $scope.nodesMap.slice(0, node.level + 1);\n };\n\n }\n };\n})\n/*\n* http://stackoverflow.com/questions/14968690/sending-event-when-angular-js-finished-loading\n*\n* Really nice directive to watch on expression on a given element\n* used on the item editor to check, whether the item (object) and the editor (DOM Element) have finished loading\n*\n* when-ready: execute when element is fully transcluded\n* ready-check: assert expression repeatedly and call whenReady on truthy\n* wait-for-interpolation: fires when all text nodes have been evaluated\n*\n* With 'requestAnimationFrame' polyfill for phantomjs from https://gist.github.com/paulirish/1579671\n*/\n.directive('whenReady', ['$interpolate', function($interpolate) {\n return {\n restrict: 'A',\n priority: Number.MIN_SAFE_INTEGER, // execute last, after all other directives if any.\n link: function($scope, $element, $attributes) {\n\n // BEGIN polyfill\n var lastTime = 0,\n vendors = ['ms', 'moz', 'webkit', 'o'],\n x;\n\n for (x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] +\n 'CancelRequestAnimationFrame'];\n }\n\n if (!window.requestAnimationFrame) {\n window.requestAnimationFrame = function (callback, element) {\n var currTime = new Date().getTime(),\n timeToCall = Math.max(0, 16 - (currTime - lastTime)),\n id = window.setTimeout(function () {\n callback(currTime + timeToCall);\n }, timeToCall);\n lastTime = currTime + timeToCall;\n return id;\n };\n }\n\n if (!window.cancelAnimationFrame) {\n window.cancelAnimationFrame = function (id) {\n window.clearTimeout(id);\n };\n }\n // END polyfill\n\n var expressions = $attributes.whenReady.split(';');\n var waitForInterpolation = false;\n var hasReadyCheckExpression = false;\n\n function evalExpressions(expressions) {\n expressions.forEach(function(expression) {\n $scope.$eval(expression);\n });\n }\n\n if ($attributes.whenReady.trim().length === 0) {\n return;\n }\n\n if ($attributes.waitForInterpolation && $scope.$eval($attributes.waitForInterpolation)) {\n waitForInterpolation = true;\n }\n\n if ($attributes.readyCheck) {\n hasReadyCheckExpression = true;\n }\n\n if (waitForInterpolation || hasReadyCheckExpression) {\n requestAnimationFrame(function checkIfReady() {\n var isInterpolated = false;\n var isReadyCheckTrue = false;\n\n if (waitForInterpolation && $element.text().indexOf($interpolate.startSymbol()) >= 0) { // if the text still has {{placeholders}}\n isInterpolated = false;\n } else {\n isInterpolated = true;\n }\n\n if (hasReadyCheckExpression && !$scope.$eval($attributes.readyCheck)) { // if the ready check expression returns false\n isReadyCheckTrue = false;\n } else {\n isReadyCheckTrue = true;\n }\n\n if (isInterpolated && isReadyCheckTrue) {\n evalExpressions(expressions);\n } else {\n requestAnimationFrame(checkIfReady);\n }\n\n });\n } else {\n evalExpressions(expressions);\n }\n }\n };\n}])\n.directive('schedulePlan', function($locale, $translate) {\n return {\n restrict: 'AE',\n templateUrl: 'tpl/inputs/SchedulePlanLayout.tpl.html',\n link: function(scope, elem, attrs) {\n scope.labels = scope.$eval(attrs.labels);\n\n function getDaysOfWeek() {\n return _.chain($locale.DATETIME_FORMATS.SHORTDAY)\n .map(function(value, index) {\n return {\n key: (index === 0) ? 7 : index,\n value: value\n };\n })\n .sortBy('key')\n .value();\n }\n\n var sections = [{\n name: 'IMMEDIATELY',\n label: scope.labels.IMMEDIATELY\n }, {\n name: 'SCHEDULE_PLAN',\n label: scope.labels.SCHEDULE_PLAN,\n attributes: [\n [{\n name: 'name',\n label: $translate.instant('ITEM_LIBRARY_PUBLISH.attribute.name'),\n typeName: 'String',\n template: 'String',\n model: 'planOptions.job[a.name]'\n }],\n [{\n name: 'startDateTime',\n label: $translate.instant('ITEM_LIBRARY_PUBLISH.attribute.startDateTime'),\n typeName: 'DateTime',\n template: 'DateTime',\n model: 'planOptions.job.schedule[a.name]'\n }]\n ]\n }, {\n name: 'SCHEDULE_REPEAT',\n label: scope.labels.SCHEDULE_REPEAT,\n attributes: [\n [{\n name: 'repeatEvery',\n label: $translate.instant('ITEM_LIBRARY_PUBLISH.attribute.repeatEvery'),\n typeName: 'Number',\n template: 'NumberRangeSelect',\n model: 'planOptions.job.schedule[a.name]',\n inputWidth: '4',\n params: {\n min: 1,\n max: 31\n }\n }, {\n name: 'repeatType',\n label: $translate.instant('ITEM_LIBRARY_PUBLISH.attribute.repeatType'),\n typeName: 'String',\n template: 'Enum',\n model: 'planOptions.job.schedule[a.name]',\n labelWidth: '0',\n inputWidth: '4',\n valuesFormat: ['label'],\n params: {\n values: [{\n key: 'HOUR',\n value: $translate.instant('DATE.HOUR')\n },\n {\n key: 'DAY',\n value: $translate.instant('DATE.DAY')\n }, {\n key: 'WEEK',\n value: $translate.instant('DATE.WEEK')\n }, {\n key: 'MONTH',\n value: $translate.instant('DATE.MONTH')\n }]\n }\n }],\n [{\n name: 'repeatDaysOfWeek',\n label: $translate.instant('ITEM_LIBRARY_PUBLISH.attribute.repeatDaysOfWeek'),\n typeName: 'Number',\n template: 'CheckboxList',\n model: 'planOptions.job.schedule[a.name]',\n hideOn: 'planOptions.job.schedule.repeatType != \"WEEK\"',\n params: {\n values: getDaysOfWeek()\n }\n }],\n [{\n name: 'repeatDaysOfMonth',\n label: $translate.instant('ITEM_LIBRARY_PUBLISH.attribute.repeatDaysOfMonth'),\n typeName: 'Number',\n template: 'DaysOfMonth',\n model: 'planOptions.job.schedule[a.name]',\n hideOn: \"planOptions.job.schedule.repeatType != 'MONTH'\",\n params: {\n min: 1,\n max: 31\n }\n }],\n [{\n name: 'endDateTime',\n label: $translate.instant('ITEM_LIBRARY_PUBLISH.attribute.endDateTime'),\n typeName: 'DateTime',\n template: 'DateTime',\n model: 'planOptions.job.schedule[a.name]'\n }]\n ]\n }];\n scope.layout = {\n sections: _.filter(sections, function(entry) {\n return !_.isNil(scope.labels[entry.name]);\n })\n };\n\n scope.toggleDisabled = function(section, options) {\n switch (section) {\n case 'SCHEDULE_PLAN':\n return options.action !== section;\n case 'SCHEDULE_REPEAT':\n return !(options.action === 'SCHEDULE_PLAN' && options.actionRepeat);\n default:\n }\n };\n\n scope.toggleSelection = function(attributeName, option) {\n scope.planOptions.job.schedule[attributeName] = scope.planOptions.job.schedule[attributeName] || [];\n var idx = scope.planOptions.job.schedule[attributeName].indexOf(option);\n if (idx > -1) {\n scope.planOptions.job.schedule[attributeName].splice(idx, 1);\n } else {\n scope.planOptions.job.schedule[attributeName].push(option);\n }\n };\n\n scope.updateStartDateTime = function() {\n scope.planOptions.job.schedule.startDateTime = new Date();\n };\n\n scope.tagTransform = function(newTag) {\n // FIXME: Needed, because 'repeatType' is based on a normal Enum, which now has 'tagging' enabled.\n // We still have to ensure, that this method is only called for 'repeatType'!\n return { key: newTag, value: newTag };\n };\n\n (function init() {\n scope.updateStartDateTime();\n })();\n }\n };\n})\n.directive(\"validateNewPassword\", function() {\n return {\n restrict: \"A\",\n require: \"ngModel\",\n link: function(scope, element, attrs, ctrl) {\n ctrl.$parsers.unshift(function(pw) {\n var lower = 0, upper = 0, digit = 0, symbol = 0;\n for (var p = 0; p < pw.length; p++) {\n var ch = pw[p];\n if (ch >= 'a' && ch <= 'z') {\n lower = 1; // at least one lower case\n } else if (ch >= 'A' && ch <= 'Z') {\n upper = 1; // at least one upper case\n } else if (ch >= '0' && ch <= '9') {\n digit = 1; // at least one digit\n } else if (\"!#$%&'()*+,-./:;<=>?@[]_`{|}´°\\\"\\\\\".indexOf(ch) > -1) {\n symbol = 1; // at least one special character\n }\n }\n var pattern_okay = (lower+upper+digit+symbol) >= 3; // three of these criteria is good enough\n var length_okay = (pw.length >= 12);\n ctrl.$setValidity(\"pattern\", pattern_okay);\n ctrl.$setValidity(\"length\", length_okay || !pattern_okay);\n return (length_okay && pattern_okay) ? pw : undefined;\n });\n }\n };\n})\n.directive('floatFormatter', function($filter) {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function(scope, element, attrs, ngModelCtrl) {\n ngModelCtrl.$render = function() {\n element.val(formatFloatValue(ngModelCtrl.$viewValue));\n };\n\n function parseFloatValue(viewValue) {\n if (_.isUndefined(viewValue)) return '';\n\n var cursorPosition = element[0].selectionStart;\n var numberString = viewValue.split(/\\s/);\n var transformedInput = numberString[0].replace(/,/, '.');\n\n if (!attrs.physicalAttribute) {\n transformedInput = transformedInput.replace(/[^-0-9.,]/g, '');\n }\n\n ngModelCtrl.$setViewValue(transformedInput);\n ngModelCtrl.$render();\n\n // Restoring cursor position due to $render() losing it\n element[0].selectionStart = cursorPosition;\n element[0].selectionEnd = cursorPosition;\n\n return transformedInput;\n }\n\n function formatFloatValue(modelValue) {\n return $filter('formatFloatValue')(modelValue);\n }\n\n ngModelCtrl.$parsers.push(parseFloatValue);\n ngModelCtrl.$formatters.push(formatFloatValue);\n }\n };\n})\n.directive('onScroll', function() {\n return {\n scope: {\n onScroll: '&',\n },\n link: function(scope, element, attrs) {\n element.bind(\"wheel\", function() {\n scope.onScroll();\n });\n }\n };\n})\n.directive('sectionRepeat', function($rootScope, $timeout) {\n\n var MAX_ROWS = 10;\n\n function loadNextRow(scope, count, sectionLoadedFn) {\n $timeout(function() {\n if (scope.sectionRepeat.currentRows < count) {\n scope.sectionRepeat.currentRows += 2;\n loadNextRow(scope, count, sectionLoadedFn);\n } else if (!_.isEmpty(sectionLoadedFn)) {\n if ($rootScope.$$phase) {\n scope.$eval(sectionLoadedFn);\n } else {\n scope.$apply(sectionLoadedFn);\n }\n }\n }, 100);\n }\n\n return {\n restrict: 'A',\n link: function(scope, element, attrs) {\n\n scope.sectionRepeat = {};\n scope.sectionRepeat.currentRows = 0;\n\n scope.currentSectionRepeatRows= function() {\n return scope.sectionRepeat.currentRows;\n };\n\n scope.section.rows.some(function(row) {\n var endLoop = row.some(function(attribute) {\n if (attribute.typeName === 'Collection' ||\n attribute.typeName === 'MultiDimensional' ||\n attribute.typeName === 'MultiReference' ||\n scope.sectionRepeat.currentRows >= MAX_ROWS) {\n return true;\n }\n });\n if (endLoop) {\n return true;\n } else {\n scope.sectionRepeat.currentRows++;\n }\n });\n\n var sectionLoadedFn = attrs.sectionRepeat;\n\n var count = scope.section.rows.length;\n loadNextRow(scope, count, sectionLoadedFn);\n\n }\n };\n})\n.directive('selectInfiniteScroll', function($rootScope) {\n\n var DEFAULT_INIT_ITEMS = 20;\n var DEFAULT_ADD_ITEMS = 10;\n var DEFAULT_SCROLL_DISTANCE = 2;\n\n return {\n link: function(scope, elem, attrs) {\n\n function parseInt(value, defaultValue) {\n var result;\n if (!_.isEmpty(value)) {\n result = _.parseInt(value);\n }\n if (!_.isInteger(result)) {\n result = defaultValue;\n }\n return result;\n }\n\n scope.infiniteScroll = {};\n scope.infiniteScroll.currentItems = parseInt(attrs.selectInfiniteScrollInitItems, DEFAULT_INIT_ITEMS);\n scope.infiniteScroll.addItems = parseInt(attrs.selectInfiniteScrollAddItems, DEFAULT_ADD_ITEMS);\n\n scope.currentInfiniteScrollItems = function() {\n var selectedOptionsLength = parseInt(attrs.selectedOptionsLength);\n selectedOptionsLength = !selectedOptionsLength ? 0 : selectedOptionsLength;\n return scope.infiniteScroll.currentItems + selectedOptionsLength;\n };\n scope.addInfiniteScrollItems = function() {\n scope.infiniteScroll.currentItems += scope.infiniteScroll.addItems;\n };\n\n var scrollDistance = parseInt(attrs.selectInfiniteScrollDistance, DEFAULT_SCROLL_DISTANCE);\n var scrollEnabled = attrs.selectInfiniteScrollDisabled !== 'true';\n var scrollFn = attrs.selectInfiniteScroll || 'addInfiniteScrollItems()';\n\n var handler = function() {\n var container = $(elem.children()[0]);\n var elementBottom = elem.offset().top + elem.height();\n var containerBottom = container.offset().top + container.height();\n var remaining = containerBottom - elementBottom ;\n var shouldScroll = remaining <= elem.height() * scrollDistance;\n if (shouldScroll && scrollEnabled) {\n if ($rootScope.$$phase) {\n scope.$eval(scrollFn);\n } else {\n scope.$apply(scrollFn);\n }\n }\n };\n\n elem.css('overflow-y', 'auto');\n elem.css('overflow-x', 'hidden');\n elem.css('height', 'inherit');\n elem.on('scroll', handler);\n scope.$on('$destroy', function() {\n elem.off('scroll', handler);\n });\n\n }\n };\n})\n.directive('objectReloadable', function() {\n var link = function(scope, element, attrs) {\n var currentElement = element;\n var html = '';\n var replacementElement = angular.element(html);\n currentElement.replaceWith(replacementElement);\n currentElement = replacementElement;\n scope.$watch('filePreviewData.url', function(newValue, oldValue) {\n if (newValue !== oldValue) {\n var html = '';\n var replacementElement = angular.element(html);\n currentElement.replaceWith(replacementElement);\n currentElement = replacementElement;\n }\n });\n };\n return {\n restrict: 'E',\n scope: false,\n link: link\n };\n})\n.directive('regexValidator', function() {\n return {\n restrict: 'A',\n link: function(scope, element, attrs) {\n element.bind('keypress',function(e) {\n var inputpattren = attrs.regexValidator;\n var selectionStart = element.prop(\"selectionStart\");\n var selectionEnd = element.prop(\"selectionEnd\");\n if (inputpattren && inputpattren != '') {\n var isValid = true;\n try {\n inputpattren = new RegExp(inputpattren);\n } catch(err) {\n isValid = false;\n }\n if (isValid) {\n var testVal = element.val();\n var len = testVal.length;\n if (selectionStart != selectionEnd) {\n testVal = testVal.substr(0, selectionStart) + testVal.substr(selectionEnd);\n }\n testVal = len == selectionEnd ? testVal + e.key : e.key + testVal;\n if (testVal && testVal.search(inputpattren) === -1) {\n e.preventDefault();\n }\n }\n }\n });\n }\n };\n})\n.directive('minimizeMultilineContent', function($timeout,$compile) {\n return {\n restrict: 'A',\n link: function(scope, element, attrs) {\n var max = 300;\n if (attrs.minimizeMultilineContent != '' && !isNaN(attrs.minimizeMultilineContent)) {\n max = parseInt(attrs.minimizeMultilineContent);\n }\n var moreHtml = angular.element('');\n var lessHtml = angular.element('');\n $timeout(function(){\n var content = element.text();\n if (content.length > max) {\n element.val(content);\n element.text('');\n moreHtml.text(content.substring(0,max) + ' ');\n moreHtml.append('See more..');\n lessHtml.text(content);\n lessHtml.append('See less');\n lessHtml.hide();\n element.append(moreHtml);\n element.append(lessHtml);\n moreHtml.on(\"click\", function(){\n moreHtml.hide();\n lessHtml.show();\n });\n lessHtml.on(\"click\", function(){\n moreHtml.show();\n lessHtml.hide();\n });\n }\n });\n }\n };\n})\n.directive('limitPrecisionScale', function(OrganizationService) {\n return {\n restrict: 'A',\n link: function(scope, element, attrs, $locale) {\n var params = _.get(scope,'$parent.$parent.a.params');\n function keyPressed(e) {\n\n var decimalSeparator = '.';\n if (OrganizationService.getOrganizationSnapshot().localeSpecificNumberFormat) {\n decimalSeparator = $locale.NUMBER_FORMATS.DECIMAL_SEP;\n }\n\n var restrict = false;\n var val = element.val() + e.key;\n if (!_.isNil(params.maxScale)) {\n var regex = new RegExp('^(\\\\d+\\\\.?(\\\\d{1,' + params.maxScale + '})?)$');\n restrict = !regex.test(val);\n }\n if (!_.isNil(params.maxPrecision)) {\n var maxPrecision = val.indexOf(decimalSeparator) > -1 ? (params.maxPrecision + 1) : params.maxPrecision;\n restrict = restrict || (val.length > maxPrecision);\n }\n if (restrict) {\n e.preventDefault();\n }\n }\n if (!_.isNil(params)) {\n element.on('keypress paste', keyPressed);\n }\n }\n };\n})\n.directive('reviewsResizer', function($document) {\n return function($scope, $element, $attrs) {\n $element.on('mousedown', function(event) {\n event.preventDefault();\n $document.on('mousemove', mousemove);\n $document.on('mouseup', mouseup);\n });\n\n function mousemove(event) {\n var y = window.innerHeight - event.pageY - 36;\n if (y < 520) {\n $element.css({\n bottom: y + 'px'\n });\n var t_elem = angular.element($attrs.resizerTarget);\n t_elem.css({\n height: (y-62) + 'px'\n });\n }\n }\n\n function mouseup() {\n $document.unbind('mousemove', mousemove);\n $document.unbind('mouseup', mouseup);\n }\n };\n})\n.directive('dividerResizer', function($document, $timeout) {\n return function($scope, $element, $attrs) {\n $element.on('mousedown', function(event) {\n event.preventDefault();\n $document.on('mousemove', mousemove);\n $document.on('mouseup', mouseup);\n });\n\n var startPoint = 0;\n var widthInPer = 0;\n var content = angular.element($attrs.fullPannel);\n $timeout(function() {\n var width = content.width();\n widthInPer = 100/width;\n });\n\n function mousemove(event) {\n if (!startPoint) {\n startPoint = event.pageX;\n }\n var movement = event.pageX - startPoint;\n var t_elem = angular.element($attrs.leftPannel);\n var codes_elem = angular.element($attrs.rightPannel);\n t_elem.css({\n width: (25+(movement * widthInPer)) + '%'\n });\n codes_elem.css({\n width: (75-(movement * widthInPer)) + '%'\n });\n }\n\n function mouseup(event) {\n $document.unbind('mousemove', mousemove);\n $document.unbind('mouseup', mouseup);\n }\n };\n})\n.directive('laxImageInput', function($document, $window, CheckURLRessource, growl, $filter, $parse) {\n return {\n restrict: 'A',\n require: 'ngModel',\n link: function(scope, elem, attrs, ctrl) {\n\n var $scope = scope.$parent.$parent;\n var a = $scope.attribute;\n var item = $scope.itemObj;\n var filePreviewData = $scope.filePreviewData;\n if (_.isNumber($scope.ecIndex)) {\n $scope.modelString = _.replace(scope.modelString, \"$index\", $scope.ecIndex);\n } else {\n $scope.modelString = checkModel(scope.modelString, a.name);\n }\n var modelEval = $parse($scope.modelString);\n var modelValue = modelEval($scope);\n var oldValue = angular.copy(modelValue);\n if (filePreviewData) {\n $scope.inputValue = $filter('fileName')(filePreviewData.url);\n }\n\n if (!scope.disableField) {\n scope.disableField = [];\n }\n scope.disableField[scope.$id] = modelEval($scope) ? true : false;\n\n function checkModel(model, attributeName) {\n if (_.isEqual(\"item[a.name]\", model)) {\n model = \"itemObj['\" + attributeName + \"']\";\n } else if (_.isEqual(\"customValues[a.name]\", model)) {\n model = \"itemObj['\" + attributeName + \"']\";\n } else if (!_.includes(model, \"'\")) {\n model = model.replace(/\\[/g, \"['\");\n model = model.replace(/\\]/g, \"']\");\n model = model.replace(/\\'\\d+\\'/g, function (x) {\n return x.replace(/\\'/g, \"\");\n });\n model = model.replace(/item/, \"itemObj\");\n }\n return model;\n }\n\n scope.enterURL = function (link) {\n //check if link is reachable\n if (!_.isEmpty(link)) {\n CheckURLRessource.get({url: link},\n function(result) {\n scope.urlError = false;\n if (!filePreviewData) {\n filePreviewData = {};\n }\n var url = link;\n var type = url.split('.').pop().split(/\\?|#/).shift();\n if(_.includes(url, \"/image\")){\n type = 'image';\n }\n filePreviewData.url = url;\n filePreviewData.isImage = false;\n filePreviewData.path = url.slice(url.lastIndexOf('/'));\n switch (type) {\n case 'svg':\n filePreviewData.contentType = \"image/svg+xml\";\n if (!Modernizr.svg) {\n filePreviewData.notSupported = true;\n }\n break;\n case 'webp':\n filePreviewData.isImage = true;\n filePreviewData.contentType = \"image/webp\";\n if (Modernizr.webp.toString() !== 'true') {\n filePreviewData.notSupported = true;\n }\n break;\n case 'tif':\n case 'xlsx':\n case 'xls':\n case 'tiff':\n filePreviewData.contentType = \"image/tiff\";\n filePreviewData.notSupported = true;\n break;\n case 'pdf':\n filePreviewData.contentType = \"application/pdf\";\n break;\n case \"jpg\":\n case \"jpeg\":\n case \"gif\":\n case \"png\":\n case \"bmp\":\n case \"tif\":\n case \"tiff\":\n case \"image\":\n filePreviewData.isImage = true;\n filePreviewData.alt = $filter('fileName', filePreviewData.url);\n break;\n default:\n filePreviewData.alt = $filter('fileName', filePreviewData.url);\n break;\n }\n modelEval.assign($scope, filePreviewData.url);\n scope.disableField[scope.$id] = true;\n scope.filePreviewData = filePreviewData;\n $scope.filePreviewData = filePreviewData;\n scope.inputValue = $filter('fileName')(scope.filePreviewData.url);\n oldValue = filePreviewData.url;\n if (_.isNumber($scope.ecIndex)) {\n $scope.inputValue = filePreviewData.url;\n $scope.model = filePreviewData.url;\n }\n $scope.$broadcast('changedURL', filePreviewData);\n\n }, function(error){\n modelEval.assign($scope, link);\n scope.urlError = true;\n switch(error.status){\n case 400:\n // growl.error(\"INPUT.MUST_BE_A_VALID_URL_FORMAT\");\n break;\n default:\n // growl.error('UPLOAD.PROVIDE_LINK_ERROR');\n break;\n }\n return;\n });\n } else {\n modelEval.assign($scope, null);\n filePreviewData = null;\n scope.filePreviewData = null;\n $scope.filePreviewData = null;\n $scope.$broadcast('clearAttributeValue', a.name);\n }\n };\n\n elem.on('keydown', function(event) {\n if (event.keyCode == 27) {\n if (oldValue) {\n event.preventDefault();\n event.stopPropagation();\n scope.inputValue = oldValue;\n elem.blur();\n } else {\n elem.blur();\n }\n\n }\n\n if (scope.disableField[scope.$id]) {\n event.preventDefault();\n } else if (event.keyCode == 13) {\n elem.blur();\n event.preventDefault();\n }\n });\n\n elem.on('keyup', function (event) {\n if (!scope.inputValue) {\n scope.urlError = false;\n }\n });\n\n elem.on('mousedown', function(event) {\n if (scope.disableField[scope.$id]) {\n event.preventDefault();\n }\n });\n\n $scope.imageInputFocus = function() {\n if (scope.disableField[scope.$id] && !_.isNil(scope.filePreviewData)) {\n scope.inputValue = scope.filePreviewData.url;\n scope.disableField[scope.$id] = false;\n }\n };\n\n $scope.$on('clearAttributeValue', function (data) {\n if (scope.filePreviewData) {\n scope.filePreviewData.url = undefined;\n }\n oldValue = undefined;\n scope.inputValue = undefined;\n scope.disableField[scope.$id] = false;\n scope.urlError = false;\n });\n\n $scope.$on('filesSelected', function(event, data) {\n if (!_.isNil(data)) {\n var uploaderScopeId = scope.$parent.$parent.$id;\n var emitterScopeId = data.scopeId;\n var fileName = data.fileName;\n\n // Should ignore the event if it's not meant for the current directive context\n if (emitterScopeId === uploaderScopeId) {\n scope.disableField[scope.$id] = true;\n scope.urlError = false;\n scope.inputValue = fileName;\n }\n } else if (scope.$parent.$parent.uploader.queue.length == 1) {\n scope.disableField[scope.$id] = true;\n scope.urlError = false;\n scope.inputValue = scope.$parent.$parent.uploader.queue[0]._file.name;\n }\n scope.filePreviewData = null;\n });\n\n $scope.$on('filesUploaded',function() {\n if (scope.$parent.$parent.filePreviewData) {\n scope.filePreviewData = scope.$parent.$parent.filePreviewData;\n scope.inputValue = $filter('fileName')(scope.filePreviewData.url);\n oldValue = scope.filePreviewData.url;\n }\n });\n\n $scope.$on('uploadCanceled', function() {\n scope.filePreviewData = scope.$parent.$parent.filePreviewData;\n scope.inputValue = scope.filePreviewData ? $filter('fileName')(scope.filePreviewData.url) : undefined ;\n });\n\n $scope.imageInputClick = function () {\n elem.focus();\n };\n\n $scope.showFullUrl = function() {\n if (!_.isNil(scope.filePreviewData)) {\n scope.inputValue = scope.filePreviewData.url ;\n }\n };\n\n }\n };\n})\n.directive('laxCheckUrl', function(CheckURLRessource) {\n return {\n strict: 'A',\n scope: {\n url: '=',\n row: '=',\n col: '='\n },\n link: function(scope) {\n function checkUrl(url) {\n\n if (_.isEmpty(url)) {\n return;\n }\n\n if (!_.isNil(scope.row) && _.isNil(scope.row.filePreviewError)) {\n scope.row.filePreviewError = {};\n }\n\n CheckURLRessource.get({url: url},\n function() {\n if (!_.isNil(scope.row) && !_.isNil(scope.col) && !_.isNil(scope.row.filePreviewError)) {\n scope.row.filePreviewError[scope.col.field] = false;\n }\n\n var $parentScope = scope.$parent;\n if(!_.isNil($parentScope.filePreviewData)) {\n $parentScope.filePreviewError = false;\n }\n }, function() {\n if (!_.isNil(scope.row) && !_.isNil(scope.col) && !_.isNil(scope.row.filePreviewError)) {\n scope.row.filePreviewError[scope.col.field] = true;\n }\n\n var $parentScope = scope.$parent;\n if(!_.isNil($parentScope.filePreviewData)) {\n $parentScope.filePreviewError = true;\n }\n });\n }\n\n scope.$watch('url', function(url) {\n checkUrl(url);\n });\n\n if (!_.isNil(scope.row)) {\n scope.$watch('row', function() {\n checkUrl(scope.url);\n });\n }\n }\n };\n})\n.directive('progressbarCustom', function() {\n return {\n restrict: 'EA',\n replace: true,\n transclude: true,\n controller: ['$scope', '$attrs', 'progressConfig', function($scope, $attrs, progressConfig) {\n var self = this, animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate;\n\n this.bars = [];\n $scope.max = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : progressConfig.max;\n\n this.addBar = function(bar, element) {\n if ( !animate ) {\n element.css({'transition': 'none'});\n }\n\n this.bars.push(bar);\n\n bar.$watch('value', function( value ) {\n bar.percent = +(100 * value / $scope.max).toFixed(2);\n });\n\n bar.$watch('max', function( max ) {\n bar.percent = +(100 * $scope.value / max).toFixed(2);\n });\n\n bar.$on('$destroy', function() {\n element = null;\n self.removeBar(bar);\n });\n };\n\n this.removeBar = function(bar) {\n this.bars.splice(this.bars.indexOf(bar), 1);\n };\n }],\n scope: {\n max: '=',\n value: '=',\n type: '@'\n },\n templateUrl: 'template/progressbar/progressbar.html',\n link: function(scope, element, attrs, progressCtrl) {\n progressCtrl.addBar(scope, angular.element(element.children()[0]));\n }\n };\n})\n.directive('framePreview', function($compile) {\n return function($scope, $element) {\n var $body = angular.element($element[0].contentDocument.body),\n template = $compile('
    ')($scope);\n $body.append(template);\n };\n})\n.directive('laxUiSelectCloseOnTab', function() {\n return {\n require: 'uiSelect',\n link: function(scope, element, attrs, $select) {\n var searchInput = element.querySelectorAll('input.ui-select-search');\n\n searchInput.on('keydown', {select: $select}, function(event) {\n if(event.keyCode == 9) {\n event.data.select.close();\n event.data.select.setFocus();\n }\n });\n }\n };\n})\n.directive('autofocus', function($timeout){\n return {\n link : function(scope, element) {\n $timeout(function() {\n element[0].focus();\n }, 0);\n }\n };\n})\n.directive('uiGridBrowserTooltips', function($timeout){\n return {\n priority: -99999, // this needs to run very last\n require: ['^uiGrid'],\n scope: false,\n compile : function() {\n return {\n pre: function() { },\n post: function($scope, $element, $attrs, controllers) {\n var uiGridCtrl = controllers[0];\n var grid = uiGridCtrl.grid;\n\n function setupBrowserTooltips() {\n $timeout(function() {\n $('.ui-grid-cell-contents').each(function() {\n // Only add tooltip for non-action cells\n if($(this).find('.actions').length === 0) {\n this.title = this.innerText.trim();\n }\n });\n }, 1000);\n }\n\n // Register to the following events on top of what is already registered.\n grid.api.core.on.scrollEnd($scope, setupBrowserTooltips);\n grid.api.core.on.rowsRendered( $scope, setupBrowserTooltips);\n }\n };\n }\n };\n})\n.directive('contextMenu', function() {\n return {\n restrict: 'A',\n scope: {\n onContextMenuOpen: '&'\n },\n compile: function($element, $attributes) {\n return {\n post: function(scope, element, attributes, controller) {\n var ul = $('#' + attributes.contextMenuTarget),\n last = null;\n\n ul.css({\n 'display': 'none'\n });\n\n $(element).bind('contextmenu', function(event) {\n event.preventDefault();\n event.stopPropagation();\n $('.context-menu').css('display', 'none');\n var parentModalElement = $(element).closest('.modal-dialog');\n\n if (parentModalElement.length > 0) {\n ul.css({\n position: \"fixed\",\n display: \"block\",\n left: event.clientX - parentModalElement.offset().left + 'px',\n top: event.clientY - parentModalElement.offset().top + 'px'\n });\n } else {\n ul.css({\n position: \"fixed\",\n display: \"block\",\n left: event.clientX + 'px',\n top: event.clientY + 'px'\n });\n }\n last = event.timeStamp;\n\n if(!_.isNil(scope.onContextMenuOpen)) {\n scope.onContextMenuOpen();\n }\n });\n\n $(document).click(function(event) {\n var target = $(event.target);\n if (!target.is(\".popover\") && !target.parents().is(\".popover\")) {\n if (last === event.timeStamp) {\n return;\n }\n ul.css({\n 'display': 'none'\n });\n $('.context-menu').css('display', 'none');\n }\n });\n }\n };\n }\n };\n})\n.factory('RecursiveDirectiveHelper', function($compile){\n return {\n /**\n * FIXME: Angular +v5.x supports this natively, but only with `template` not `templateUrl`.\n * Manually compiles the element, fixing recursion loops of the same directive.\n * For more info check -> https://stackoverflow.com/a/18609594/4653326\n * @param element\n * @param [link] A post-link function, or an object with function(s) registered via pre and post properties.\n * @returns An object containing the linking functions.\n */\n compile: function(element, link){\n // Normalize the link parameter\n if(angular.isFunction(link)){\n link = { post: link };\n }\n\n // Break the recursion loop by removing the contents\n var contents = element.contents().remove();\n var compiledContents;\n return {\n pre: (link && link.pre) ? link.pre : null,\n /**\n * Compiles and re-adds the contents\n */\n post: function(scope, element){\n // Compile the contents\n if(!compiledContents){\n compiledContents = $compile(contents);\n }\n // Re-add the compiled contents to the element\n compiledContents(scope, function(clone){\n element.append(clone);\n });\n\n // Call the post-linking function, if any\n if(link && link.post){\n link.post.apply(null, arguments);\n }\n }\n };\n }\n };\n})\n.directive('flexResizer', function() {\n /**\n * A resizing component horizontally and vertically of two flex-based components.\n * Adapted from https://codesandbox.io/s/sad-butterfly-1fwo4\n * Usage:\n * \n * \n * \n * \n * Note: Inline flex grow styles should be used for cross compatibility.\n */\n return {\n strict: 'E',\n scope: {\n axis: '@',\n maxGrow: '@',\n minGrow: '@'\n },\n template: '
    ',\n link: function($scope) {\n var AXIS = $scope.axis;\n var MAX_GROW = Number($scope.maxGrow);\n var MIN_GROW = Number($scope.minGrow);\n var TAG_NAME = 'DATA-FLEX-RESIZER';\n\n function manageResize(md, target, sizeProp, posProp) {\n var r = target;\n\n var prev = r.previousElementSibling;\n var next = r.nextElementSibling;\n if (!prev || !next) {\n return;\n }\n\n md.preventDefault();\n\n var prevSize = prev[sizeProp];\n var nextSize = next[sizeProp];\n var sumSize = prevSize + nextSize;\n var prevGrow = Number(prev.style.flexGrow);\n var nextGrow = Number(next.style.flexGrow);\n var sumGrow = prevGrow + nextGrow;\n var lastPos = md[posProp];\n\n function onMouseMove(mm) {\n var pos = mm[posProp];\n var d = pos - lastPos;\n prevSize += d;\n nextSize -= d;\n if (prevSize < 0) {\n nextSize += prevSize;\n pos -= prevSize;\n prevSize = 0;\n }\n if (nextSize < 0) {\n prevSize += nextSize;\n pos += nextSize;\n nextSize = 0;\n }\n\n var prevGrowNew = sumGrow * (prevSize / sumSize);\n var nextGrowNew = sumGrow * (nextSize / sumSize);\n\n if (prevGrowNew > MAX_GROW || prevGrowNew < MIN_GROW) {\n return;\n }\n\n prev.style.flexGrow = prevGrowNew;\n next.style.flexGrow = nextGrowNew;\n lastPos = pos;\n }\n\n function onMouseUp(mu) {\n // Change cursor to signal a state's change: stop resizing.\n var html = document.querySelector('html');\n html.style.cursor = 'default';\n\n if (posProp === 'pageX') {\n r.style.cursor = 'ew-resize';\n } else {\n r.style.cursor = 'ns-resize';\n }\n\n window.removeEventListener('mousemove', onMouseMove);\n window.removeEventListener('mouseup', onMouseUp);\n }\n\n window.addEventListener('mousemove', onMouseMove);\n window.addEventListener('mouseup', onMouseUp);\n }\n\n document.body.addEventListener('mousedown', function (md) {\n\n // Used to avoid cursor's flickering\n var html = document.querySelector('html');\n\n var target = md.target;\n if (target.nodeType !== 1) {\n return;\n }\n\n if (target.parentNode.tagName === TAG_NAME) {\n target = target.parentNode;\n } else if (target.tagName !== TAG_NAME) {\n return;\n }\n\n if (_.isEmpty(AXIS)) {\n return;\n } else if (AXIS === 'x') {\n // Change cursor to signal a state's change: begin resizing on H.\n target.style.cursor = 'col-resize';\n html.style.cursor = 'col-resize'; // avoid cursor's flickering\n\n // use offsetWidth versus scrollWidth to avoid splitter's jump on resize when content overflow.\n manageResize(md, target, 'offsetWidth','pageX');\n\n } else if (AXIS === 'y') {\n // Change cursor to signal a state's change: begin resizing on V.\n target.style.cursor = 'row-resize';\n html.style.cursor = 'row-resize'; // avoid cursor's flickering\n\n manageResize(md, target, 'offsetHeight', 'pageY');\n }\n });\n }\n };\n})\n.directive('dmDeploymentInProgress', function() {\n return {\n restrict: 'E',\n scope: { },\n templateUrl: 'tpl/datamodel-deployment-in-progress.tpl.html',\n controller: function() { }\n };\n})\n.directive('widgetTranslatableTitle', function() {\n return {\n restrict: 'A',\n controller: function($scope, $translate) {\n $scope.title = $translate.instant($scope.widget.title);\n\n $scope.$watch('widget.title', function() {\n $scope.title = $translate.instant($scope.widget.title);\n });\n }\n };\n});\n","angular.module('llax.directives')\n.directive('apiBasedCodelist', function factory($http, $log) {\n var directiveDefinitionObject = {\n restrict: 'E',\n scope: {\n attribute: '=attribute',\n item: '='\n },\n replace: false,\n templateUrl: 'APISelect',\n link: function(scope, element, attrs) {\n\n var searchUrl = '/api/v1/datamodel/retrieval/options';\n\n // initialise scope\n scope.api_search_results = [];\n scope.selection = {};\n if (scope.item && scope.item.$promise) {\n scope.item.$promise.then(function() {\n var code = scope.item[scope.attribute.name];\n scope.selection.selected = {\n id: scope.item[scope.attribute.name],\n title: ''\n };\n // try to fetch a given option by searching for its id\n $http\n .get(searchUrl, {\n params: {\n q: code\n }\n })\n .then(function(response) {\n var selectedEntry = _.find(response.data, function(entry) {\n return (entry.id == code);\n });\n\n if (selectedEntry) {\n scope.selection.selected = selectedEntry;\n } else {\n $log.warn('found no options with id ' + code);\n }\n scope.api_search_results = response.data;\n });\n });\n }\n\n scope.$on('clearAttributeValue', function(a) {\n if (_.isNil(scope.item[scope.attribute.name])) {\n scope.selection.selected = null;\n }\n });\n\n // Set the value for the attribute on selection\n scope.onSelected = function(selectionItem, model) {\n scope.item[scope.attribute.name] = selectionItem.id;\n };\n\n // For every entered search term, perform an api call\n scope.refresh = function(term) {\n if (!_.isEmpty(term) && term.length < 3) {\n //scope.api_search_results = [];\n return scope.api_search_results;\n }\n return $http.get(searchUrl, {\n params: {\n q: term\n }\n })\n .then(function(response) {\n scope.api_search_results = response.data;\n });\n };\n }\n };\n return directiveDefinitionObject;\n});\n","angular.module('llax.directives')\n .directive('fileThumbnail', function($compile, $filter, $injector, $log, $q, $timeout, AssetFoldersService) {\n\n function checkURLWithGetRequestAsync(url, signal, onSuccess) {\n\n if (_.isNil(url)) {\n var deferred = $q.defer();\n deferred.resolve();\n return deferred.promise;\n }\n\n var baseUrl = lax_rest_url('getUrlInfo');\n var requestUrl = baseUrl + '?url=' + encodeURIComponent(url);\n return fetch(requestUrl, {\n method: 'GET',\n signal: signal\n })\n .then(function(response) {\n if (response.ok) {\n return response.json();\n } else {\n throw new Error('Failed to fetch');\n }\n })\n .then(function(data) {\n // Assuming data contains the necessary information\n var mimeType = data.contentType ? data.contentType.split(';')[0] : '';\n onSuccess(mimeType, data.url);\n })\n .catch(function(error) {\n if (error && error.status !== 0) {\n $log.error('Error occurred:', error);\n } else {\n $log.info('Request aborted');\n }\n });\n }\n\n function setPreview(contentType, url, $scope, $element) {\n\n var isDrawable = $filter('isFileType')({ type: contentType }, 'drawable');\n\n if (isDrawable) {\n $timeout(function() {\n $scope.loading = false;\n $scope.error = false;\n\n $timeout(function() {\n if (!_.isNil($element)) {\n $element.find('img').on('load', function() {\n if (!_.isNil($scope.onLoad)) {\n $scope.onLoad();\n }\n\n // Allow a smooth transition when we have the image\n $timeout(function() {\n $element.find('img').css('opacity', 1);\n }, 0);\n });\n\n $element.find('img').on('error', function(event, source, lineno, colno, error) {\n $log.debug('Could not preview file in ', url, error);\n this.style.display = 'none';\n\n $timeout(function() {\n $scope.error = true;\n }, 0);\n });\n\n $scope.dataOrUrl = url;\n\n } else {\n $scope.dataOrUrl = url;\n\n if (!_.isNil($scope.onLoad)) {\n $scope.onLoad();\n }\n }\n }, 0);\n }, 0);\n } else {\n // Draw file icon\n $timeout(function() {\n // By default, we will get the icon by mime type\n $scope.fileIcon = AssetFoldersService.getFileIconByMimeType(contentType);\n var isMimeType = _.includes(contentType, \"/\");\n if (!isMimeType) {\n // if not a mime type, we try with file extension\n $scope.fileIcon = AssetFoldersService.getFileIcon(contentType);\n }\n $scope.loading = false;\n\n // Allow a smooth transition when we have loaded the image\n $timeout(function() {\n $element.find('a').css('opacity', 1);\n }, 0);\n\n if (!_.isNil($scope.onLoad)) {\n $scope.onLoad();\n }\n }, 0);\n }\n }\n\n function preview(url, $scope, $element) {\n\n if (_.isNil(url)) {\n return;\n }\n\n $scope.loading = true;\n $scope.error = false;\n $scope.dataOrUrl = null;\n $scope.fileIcon = null;\n\n // First try to figure out the content type from the URL, if it has a file extension, then\n // provide the URL to the directly, bypassing cross-origin restrictions\n var fileType = $filter('fileType')(url);\n if (!_.isEmpty(fileType)) {\n fileType = fileType.toLowerCase();\n setPreview(fileType, url, $scope, $element);\n } else {\n checkURLWithGetRequestAsync(url, $scope.requestController.signal, function(contentType, url) {\n $scope.loading = false;\n return setPreview(contentType, url, $scope, $element);\n });\n }\n }\n\n return {\n strict: 'E',\n scope: {\n url: '=',\n onLoad: '=',\n imgClass: '@',\n iconClass: '@',\n loaderClass: '@',\n layout: '@',\n enableFilePreview: '@'\n },\n templateUrl: 'tpl/file-thumbnail.tpl.html',\n\n link: function(scope, element, attrs) {\n\n var customFilePreview = $injector.has('customFileThumbnailDirective');\n\n if (customFilePreview) {\n var cssClasses = attrs.class;\n var html = '' +\n '';\n\n // Attaching the defaultPreview to the custom directive scope so it can be re-used.\n scope.defaultPreview = preview;\n\n var newElement = $compile(html)(scope);\n element.replaceWith(newElement);\n }\n },\n\n controller: function($element, $modal, $rootScope, $scope) {\n\n var customFilePreview = $injector.has('customFileThumbnailDirective');\n if (customFilePreview) {\n // There is nothing to do in this controller, responsibility\n // is set on the custom directive.\n return;\n }\n\n $scope.dataOrUrl = null;\n $scope.fileIcon = null;\n $scope.error = false;\n\n $scope.requestController = new AbortController();\n\n preview($scope.url, $scope, $element);\n\n $scope.$watch('url', function(value, oldValue) {\n var url = value;\n\n if (!_.isNil(url) && value != oldValue) {\n // Abort any previous requests in case they are still loading.\n $scope.requestController.abort();\n\n $timeout(function() {\n // A new instance to track the fetch request.\n $scope.requestController = new AbortController();\n\n preview(url, $scope, $element);\n }, 0);\n }\n });\n\n $scope.showImage = function() {\n $rootScope.additionalModalOpen = true;\n $modal.open({\n templateUrl: 'tpl/editorShowImage.tpl.html',\n controller: 'showImageController',\n windowClass: 'editor-show-image',\n backdrop: true,\n resolve: {\n filePreviewData: function () {\n return {\n url: $scope.dataOrUrl,\n isImage: true\n };\n }\n }\n });\n };\n\n }\n };\n });","angular.module('llax.directives')\n .directive('hintTooltip', function($log, $timeout) {\n return {\n strict: 'E',\n scope: {\n hintId: '=',\n hintContent: '=',\n showHintIf: '=',\n hintIcon: '=',\n iconColor: '='\n },\n template:\n '' +\n '' +\n '',\n controller: function($scope) {\n $scope.showTooltip = function() {\n if (angular.isArray($scope.hintContent)) {\n var ul = '
      ';\n _.forEach($scope.hintContent, function(hint) {\n ul += '
    • ' + hint + '
    • ';\n });\n ul += '
    ';\n renderTooltip(ul);\n } else if (_.isString($scope.hintContent)) {\n renderTooltip('

    ' + $scope.hintContent + '

    ');\n } else {\n $log.error('hintTooltip: Could not determine hintContent type: ', $scope.hintContent);\n }\n };\n\n $scope.hideTooltip = function removeTooltip() {\n $timeout(function() {\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeCallout('callout_' + $scope.hintId);\n }, 200);\n };\n\n function renderTooltip(content) {\n function customRendererFn() {\n var attributeStart = '
    ';\n var attributeEnd = '
    ' +\n '';\n return attributeStart + content + attributeEnd;\n }\n\n var calloutId = 'callout_' + $scope.hintId;\n var calloutConfig = {\n id: calloutId,\n target: 'hint-' + $scope.hintId,\n placement: 'left',\n content: '',\n customRenderer: customRendererFn\n };\n\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeCallout(calloutId);\n\n var calloutEle = calloutMgr.createCallout(calloutConfig);\n // Hack: override !important css rules, with inline precedence\n calloutEle.element.style.cssText += 'border: none !important; z-index: 1050;';\n }\n\n }\n };\n });","angular.module('llax.directives.itemList', [])\n.directive('updateOnResize', ['$window', function($window) {\n\n function link(scope, element, attrsctrl) {\n\n var w = angular.element($window),\n itemsPerPage = 20;\n\n // Calculate how much items the items-grid can show without paging\n function calcCapacity(){\n try {\n // this can fail if the grid is not yet fully rendert\n var gridOffsetTop = angular.element(element).offset().top,\n footerHeight = angular.element('footer').innerHeight(),\n boxContentPadding = parseInt(angular.element('.box-content').css('padding-bottom'), 10),\n contentPadding = parseInt(angular.element('#content').css('padding-bottom'), 10),\n offset = gridOffsetTop + footerHeight + boxContentPadding + contentPadding,\n myheight = w.height() - offset,\n gridCapacity = 5 * Math.ceil(myheight / 34 / 5); // 5 more\n return gridCapacity;\n }\n catch(e) {\n // fallback calculation based on full window height\n return 5 * Math.ceil(w.height() / 34 / 5);\n }\n }\n\n function checkCapacity() {\n var capacity = calcCapacity();\n return (capacity > scope.items.length && scope.page < capacity / itemsPerPage);\n }\n\n // After increasing window size, try to fetch more items to fill the grid and thus enable scrolling\n w.bind('resize', function () {\n if (!scope.loadingItems && checkCapacity()) {\n scope.loadMore();\n }\n });\n\n // Make sure, grid will get filled initially (or after deletion of items)\n scope.$watch(function() {\n return scope.items ? scope.items.length : 0;\n },\n function onChange(newLength, oldLength) {\n if (checkCapacity()) {\n scope.loadMore();\n }\n },\n true);\n }\n\n return {\n link: link\n };\n}]);\n","angular.module('llax.directives')\n .directive('catalogAttribute', function() {\n return {\n restrict: 'E',\n scope: {\n attribute: '=',\n item: '=',\n rootItem: '=',\n minimalist: '=',\n hideIfEmpty: '=',\n hideLabel: '=?'\n },\n templateUrl: 'tpl/catalog/directive-catalog-attribute.tpl.html',\n controller: function($rootScope, $scope, $timeout, EnumAttributeService, ReferenceAttributesService, uiGridConstants, $q) {\n $scope.translateAttribute = $rootScope.translateAttribute;\n $scope.getValuesFormat = $rootScope.getValuesFormat;\n $scope.translateOption = $rootScope.translateOption;\n $scope.dynamicColumns = {};\n $scope.dynamicDesktopData = [];\n $scope.dynamicMobileData = [];\n $scope.collapse = [];\n $scope.hideLabel = $scope.hideLabel || false;\n $scope.shouldBeHidden = $scope.hideIfEmpty && _.isEmpty($scope.item[$scope.attribute.name]);\n\n // FIX ME: aliasing `a` as `attribute` for legacy implementation in the HTML templates\n $scope.a = $scope.attribute;\n\n $scope.initializeEnumOptions = function(a, values) {\n\n if (_.isEmpty(a.options)) {\n EnumAttributeService.getAttributeOptionsAsync(a, false)\n .then(function(allAttributeOptions) {\n\n // Cache the loaded options by attaching it to the attribute in case of re-renders\n a.options = allAttributeOptions;\n\n prepareSelectedAttributeOptions(a, allAttributeOptions, values);\n });\n } else {\n prepareSelectedAttributeOptions(a, a.options, values);\n }\n };\n\n function prepareSelectedAttributeOptions(a, allAttributeOptions, values) {\n\n $scope.selectedOptions = [];\n\n if (!_.isEmpty(allAttributeOptions) && !_.isEmpty(values)) {\n // Let's filter the options based on any defined data model filter AND add any options\n // needed in case of Open Enums/Codelists\n var options = $rootScope.getContextFilteredOptions(null, $scope, null, a, values);\n\n // We only need the actual selected options as in the attribute value(s)\n options = _.filter(options, function(option) {\n return _.includes(values, option.key);\n });\n\n // We need to force a re-render on the next digest cycle\n $timeout(function() {\n $scope.selectedOptions = options;\n }, 0);\n }\n }\n\n $scope.getColumns = function(attributeDefinition, item) {\n\n var deferreds = [];\n var columns = [];\n var memberAttributes = $rootScope.dataModel.getMemberAttributes(attributeDefinition);\n angular.forEach(memberAttributes, function(memberAttribute) {\n\n var deferred = EnumAttributeService.getAttributeOptionsAsync(memberAttribute)\n .then(function() {\n if (!$scope.isAttributeHidden(memberAttribute)) {\n var column = {\n name: memberAttribute.name,\n typeName: memberAttribute.typeName,\n label: $rootScope.translateAttribute(memberAttribute)\n };\n columns.push(column);\n }\n });\n\n deferreds.push(deferred);\n\n });\n\n $q.all(deferreds)\n .then(function() {\n $scope.dynamicColumns[attributeDefinition.name] = columns;\n $scope.getData(attributeDefinition, item);\n });\n };\n\n // FIX ME: We have an implicit dependency on $scope.a in data-ng-compiled-include of GroupDetail template.\n // This should be fixed by moving the data-ng-compiled-include to the directive scope.\n $scope.getData = function(attributeDefinition, data) {\n var items = data[attributeDefinition.name];\n\n items = sortItems(attributeDefinition, items);\n\n var desktopItems = [];\n $scope.dynamicMobileData[attributeDefinition.name] = [];\n angular.forEach(items, function(item) {\n var desktopItem = {},\n mobileItems = [];\n angular.forEach($scope.dynamicColumns[attributeDefinition.name], function(columnValue, columnKey) {\n var memberAttribute = $rootScope.dataModel.attribute(columnValue.name);\n var value = item[columnValue.name];\n var translatedValue = getTranslatedValue(item, memberAttribute);\n\n var mobileItem = {};\n mobileItem.label = columnValue.label;\n mobileItem.value = \"\";\n desktopItem[columnKey] = \"\";\n if (value != 'undefined') {\n desktopItem[columnKey] = translatedValue ? translatedValue : value;\n mobileItem.value = translatedValue ? translatedValue : value;\n }\n mobileItems.push(mobileItem);\n });\n desktopItems.push(desktopItem);\n $scope.dynamicMobileData[attributeDefinition.name].push(mobileItems);\n });\n $scope.dynamicDesktopData[attributeDefinition.name] = desktopItems;\n };\n\n $scope.getAttributeDimensions = function(attribute) {\n var dimensionsKey = $rootScope.dataModel.getAttributeOptionsParam(attribute);\n var dimensions = attribute.params[dimensionsKey];\n\n if (_.isString(dimensions)) { // i.e. options list\n var optionList = $rootScope.dataModel.optionList(dimensions);\n dimensions = optionList.options;\n }\n\n return dimensions;\n };\n\n $scope.loadGroupData = function (attribute) {\n var groups = $scope.item[attribute.name];\n return groups;\n };\n\n $scope.loadGroupMembers = function (attribute) {\n return $rootScope.dataModel.attribute(attribute.params.valueAttribute).members;\n };\n\n $scope.loadMemberAttribute = function (memberName) {\n return $rootScope.dataModel.attribute(memberName);\n };\n\n $scope.collapseGroup = function (group, id) {\n var key = group + \"_\" + id;\n if (_.isBoolean($scope.collapse[key])) {\n $scope.collapse[key] = !$scope.collapse[key];\n } else {\n $scope.collapse[key] = true;\n }\n };\n\n function getTranslatedValue(item, memberAttribute) {\n var translation;\n var attributeType = memberAttribute.typeName;\n\n if (attributeType === 'Dimensional') {\n var dimensionKey = $rootScope.getFirstFilteredDimensionKey(item, memberAttribute);\n var dimensionValues = item[memberAttribute.name];\n if (!_.isNil(dimensionKey) && !_.isNil(dimensionValues)) {\n translation = dimensionValues[dimensionKey];\n }\n } else {\n translation = $rootScope.formatAttributeValue(item, memberAttribute);\n }\n\n return translation;\n }\n\n $scope.isAttributeHidden = function(attribute) {\n if (!_.isNil(attribute)) {\n var attributeName = attribute.name;\n\n // We try to get the attribute states from the rootItem\n // where the item might reference a group attribute, instead of the actual\n // root item where the state resides\n var attributeStates = {};\n if (!_.isNil($scope.rootItem)) {\n attributeStates = $scope.rootItem.attributeStates__;\n } else {\n attributeStates = $scope.item.attributeStates__;\n }\n\n if (!_.isEmpty(attributeStates) && attributeStates.contains((attributeName + \":hidden\"))) {\n return true;\n }\n\n return false;\n }\n };\n\n /*\n * Sort attribute entries as if they were rendered by angular-ui-grid, since in online catalog\n * we render collection-like attributes simply as HTML tables.\n */\n function sortItems(attributeDefinition, items) {\n\n if (_.isEmpty(items)) {\n return [];\n }\n\n var sortingOptions = [];\n var memberAttributes = $rootScope.dataModel.getMemberAttributes(attributeDefinition);\n\n _.forEach(memberAttributes, function(memberAttribute, index) {\n var sortingOption = $rootScope.getColumnSortingOptions(attributeDefinition, memberAttribute, index);\n\n // We only want to sort the attributes which actually has explicitly a sorting defined\n // in the data model\n if (!_.isNil(sortingOption.sort) && !_.isNil(sortingOption.sortingAlgorithm)) {\n sortingOption.forAttribute = memberAttribute.name;\n sortingOptions.push(sortingOption);\n }\n\n });\n\n // Sort the sorting options :D based on their priority (lower priority gets sorted first)\n sortingOptions = sortingOptions.sort(function(sortingOptionA, sortingOptionB) {\n return sortingOptionB.sort.priority - sortingOptionA.sort.priority;\n });\n\n _.forEach(sortingOptions, function(sortingOption) {\n\n var sortingDirection = uiGridConstants.ASC;\n if (!_.isNil(sortingOption.sort) && !_.isNil(sortingOption.sort.direction)) {\n sortingDirection = sortingOption.sort.direction;\n }\n\n items.sort(function(a, b) {\n // We also need to map the row entities as they are structured\n // using angular-ui-grid.\n var aRowEntity = {\n entity: a\n };\n var bRowEntity = {\n entity: b\n };\n return sortingOption.sortingAlgorithm(\n a[sortingOption.forAttribute],\n b[sortingOption.forAttribute],\n aRowEntity,\n bRowEntity,\n sortingDirection);\n });\n });\n\n return items;\n }\n\n }\n };\n });\n","angular.module('llax.directives')\n .directive('catalogMultiReferenceAttribute', function() {\n return {\n restrict: 'E',\n scope: {\n attribute: '=',\n item: '='\n },\n templateUrl: 'tpl/catalog/directive-catalog-multi-reference-attribute.tpl.html',\n controller: function($filter, $rootScope, $scope, ReferenceAttributesService) {\n $scope.dynamicColumns = {};\n $scope.dynamicDesktopData = {};\n $scope.dynamicMobileData = {};\n\n $scope.loadItemsForReference = function() {\n var attribute = $scope.attribute;\n var item = $scope.item;\n var attributeName = attribute.name;\n var referencedItems = item[attributeName];\n\n if (_.isEmpty(referencedItems)) {\n return;\n }\n\n var fields = ReferenceAttributesService.getAttributeFields(attribute);\n\n var columns = [];\n angular.forEach(fields, function(attrName) {\n var memberAttribute = $rootScope.dataModel.attribute(attrName);\n var column = {\n name: memberAttribute.name,\n typeName: memberAttribute.typeName,\n label: $rootScope.translateAttribute(memberAttribute)\n };\n columns.push(column);\n });\n $scope.dynamicColumns[attribute.name] = columns;\n\n ReferenceAttributesService.extendReferencedItemsAsync(attribute, referencedItems)\n .then(function(result) {\n $scope.prepareGridData(attribute, result);\n });\n };\n\n $scope.prepareGridData = function(attributeDefinition, data) {\n var desktopItems = [];\n $scope.dynamicMobileData[attributeDefinition.name] = [];\n\n angular.forEach(data, function(item) {\n var desktopItem = {},\n mobileItems = [];\n\n angular.forEach($scope.dynamicColumns[attributeDefinition.name], function(columnValue, columnKey) {\n var memberAttribute = $rootScope.dataModel.attribute(columnValue.name);\n var value = item[columnValue.name];\n var translatedValue = getTranslatedValue(item, memberAttribute);\n\n var mobileItem = {};\n mobileItem.label = columnValue.label;\n mobileItem.value = \"\";\n desktopItem[columnKey] = \"\";\n\n if (value != 'undefined') {\n desktopItem[columnKey] = translatedValue ? translatedValue : value;\n mobileItem.value = translatedValue ? translatedValue : value;\n }\n\n mobileItems.push(mobileItem);\n });\n\n desktopItems.push(desktopItem);\n $scope.dynamicMobileData[attributeDefinition.name].push(mobileItems);\n });\n\n $scope.dynamicDesktopData[attributeDefinition.name] = desktopItems;\n };\n\n function getTranslatedValue(item, memberAttribute) {\n var translation;\n var attributeType = memberAttribute.typeName;\n\n if (attributeType === 'Dimensional') {\n var dimensionKey = $rootScope.getFirstFilteredDimensionKey(item, memberAttribute);\n var value = item[memberAttribute.name];\n if (!_.isNil(value)) {\n translation = value[dimensionKey];\n }\n } else {\n translation = $rootScope.formatAttributeValue(item, memberAttribute);\n }\n\n return translation;\n }\n }\n };\n });\n","angular.module('llax.directives')\n .directive('catalogSingleReferenceAttribute', function() {\n return {\n restrict: 'E',\n scope: {\n attribute: '=',\n item: '='\n },\n templateUrl: 'tpl/catalog/directive-catalog-single-reference-attribute.tpl.html',\n controller: function($scope, $timeout, ReferenceAttributesService) {\n $scope.formattedSingleReference = \"\";\n\n $scope.loadAndFormatSingleReference = function() {\n var item = $scope.item;\n var attribute = $scope.attribute;\n return ReferenceAttributesService.loadAndFormatItemAsync(item[attribute.name], item, attribute)\n .then(function(result) {\n $timeout(function(){\n $scope.formattedSingleReference = result;\n }, 0);\n });\n };\n }\n };\n });\n","angular.module('llax.directives')\n .constant('MEDIA_TYPE_ONLINE_CATALOG', {\n IMAGE: 'IMAGE',\n DOCUMENT: 'DOCUMENT'\n })\n .directive('thumbsGallery', function() {\n return {\n restrict: 'E',\n scope: {\n media: '=',\n itemTitle: '='\n },\n templateUrl: 'tpl/catalog/directive-thumbs-gallery.tpl.html',\n controller: function($scope, $timeout, $modal, AssetFoldersService, MEDIA_TYPE_ONLINE_CATALOG) {\n $scope.TYPES = MEDIA_TYPE_ONLINE_CATALOG;\n $scope.getFileIcon = AssetFoldersService.getFileIcon;\n $scope.thumbsSwiper = null;\n $scope.mediaSwiper = null;\n $scope.mouseHoveringOverImage = false;\n\n $scope.openMediaModal = function() {\n\n if ($scope.media.length === 0) {\n return;\n }\n\n $modal.open({\n templateUrl: 'tpl/catalog/modal-media.tpl.html',\n controller: function($modalInstance, $scope, data, AssetFoldersService, MEDIA_TYPE_ONLINE_CATALOG) {\n\n $scope.TYPES = MEDIA_TYPE_ONLINE_CATALOG;\n $scope.media = angular.copy(data.media);\n $scope.itemTitle = data.itemTitle;\n $scope.getFileIcon = AssetFoldersService.getFileIcon;\n $scope.activeMediaType = $scope.TYPES.IMAGE;\n setFilteredMedia();\n\n $scope.close = function() {\n $modalInstance.close();\n };\n\n $scope.setAsActive = function(medium) {\n if (!_.isNil($scope.activeMedia)) {\n $scope.activeMedia.isActive = false;\n }\n\n $scope.activeMedia = medium;\n $scope.activeMedia.isActive = true;\n };\n\n $scope.setAsActive($scope.media[0]);\n\n $scope.setActiveMediaType = function(newActiveType) {\n $scope.activeMediaType = newActiveType;\n setFilteredMedia();\n };\n\n function setFilteredMedia() {\n $scope.filteredMedia = _.filter($scope.media, function(medium) {\n return medium.type === $scope.activeMediaType;\n });\n }\n },\n windowClass: '',\n backdrop: true,\n size: 'lg',\n resolve: {\n data: function () {\n return {\n itemTitle: $scope.itemTitle,\n media: $scope.media\n };\n }\n }\n });\n };\n\n $scope.reInitializeThumbsSwiper = function() {\n if (!_.isNil($scope.thumbsSwiper)) {\n $scope.thumbsSwiper.update();\n }\n };\n\n $scope.reInitializeMediaSwiper = function() {\n if (!_.isNil($scope.mediaSwiper)) {\n $scope.mediaSwiper.update();\n }\n };\n\n $scope.setMouseHoveringOverImage = function(isHovering) {\n $scope.mouseHoveringOverImage = isHovering;\n };\n\n $timeout(function() {\n // This is the only way to load the following dependencies and have a reference to them with the\n // current bundling configurations and requirejs.\n requirejs([\n 'assets/swiper/swiper-bundle.min.js',\n 'assets/swiper/Drift.min.js'], function(Swiper) {\n $scope.thumbsSwiper = new Swiper(\".thumbs-slider\", {\n loop: false,\n spaceBetween: 10,\n slidesPerView: 6,\n freeMode: true,\n watchSlidesProgress: true,\n navigation: {\n nextEl: \".swiper-button-next\",\n prevEl: \".swiper-button-prev\",\n },\n });\n $scope.mediaSwiper = new Swiper(\".media-slider\", {\n loop: false,\n thumbs: {\n swiper: $scope.thumbsSwiper,\n },\n });\n });\n }, 200);\n }\n };\n })\n .directive('catalogZoomableImage', function($timeout){\n return {\n restrict: 'E',\n scope: {\n src: '=',\n width: '@',\n onZoomedImageClick: '='\n },\n replace: true,\n template:\n '
    ' +\n '' +\n '
    ',\n link: function($scope, $element) {\n $scope.onLoad = function() {\n $timeout(function() {\n var imageElement = $element.find('img')[0];\n\n if (!_.isNil(imageElement)) {\n // We show the zoom panel using the URL in the image element\n // in case it has changed in a custom file-thumbnail directive.\n imageElement.setAttribute(\"data-zoom\", imageElement.src);\n new Drift(imageElement, {\n paneContainer: document.querySelector('.primary-section'),\n hoverBoundingBox: true\n });\n }\n }, 500);\n };\n }\n };\n });\n","angular.module('llax.directives')\n .directive('assetDropOverlay', function() {\n /* Drop overlay for asset folders. The drop zone distinguishes between two type of dropped items:\n * 1- An asset/folder item as a moving functionality.\n * 2- An external file to be uploaded.\n *\n * We can distinguish between the two types using the dataTransfer event object, where asset/folder dragged items, should have\n * a specific 'draggable-item' type attached to the event.\n */\n return {\n restrict: 'A',\n scope: false,\n link: function($scope, $element, $attrs){\n $element.bind({\n dragenter: function($event) {\n $event.preventDefault(); // needed to fire the drop event\n\n // Display drop zone overly only for external files:\n if($event.originalEvent.dataTransfer.types &&\n $event.originalEvent.dataTransfer.types.includes('draggable-item')) {\n return;\n }\n\n $element.dropTarget = $event.target;\n var dropContainerElement = document.getElementsByClassName($attrs.dropZoneContainerClass);\n angular.element(dropContainerElement).addClass($attrs.overClass);\n },\n dragleave: function($event) {\n\n if ($event.target === $element.dropTarget) {\n $element.dropTarget = undefined;\n var dropContainerElement = document.getElementsByClassName($attrs.dropZoneContainerClass);\n angular.element(dropContainerElement).removeClass($attrs.overClass);\n }\n },\n dragover: function($event) {\n $event.preventDefault(); // needed to fire the drop event\n },\n drop: function($event) {\n\n if($event.originalEvent.dataTransfer.types &&\n $event.originalEvent.dataTransfer.types.includes('draggable-item')) {\n $event.preventDefault();\n $event.stopPropagation();\n\n var droppedItem = $event.originalEvent.dataTransfer.getData('application/json');\n droppedItem = JSON.parse(droppedItem);\n\n // onItemDragFinished should be defined in the scope of the caller directive/controller.\n $scope.onItemDragFinished(droppedItem);\n return;\n }\n\n $element.dropTarget = undefined;\n var dropContainerElement = document.getElementsByClassName($attrs.dropZoneContainerClass);\n angular.element(dropContainerElement).removeClass($attrs.overClass);\n }\n });\n }\n };\n })\n .directive('draggableAssetItem', function() {\n return {\n restrict: 'A',\n replace: false,\n /*\n * Those are the scope attributes needed for the draggableAssetItem.\n * Commented out to prevent race conditions with other directives on the same element, but they do still exist in the shared scope\n * of the other directives.\n *\n * scope: {\n * item: '&',\n * onItemDragStart: '&',\n * onItemDragFinished: '&'\n * },\n */\n link: function($scope, $element) {\n $element.bind({\n dragstart: function($event) {\n $event.stopPropagation();\n\n // A hack to disable dropping effect on other drop zones in the same viewport.\n $event.originalEvent.dataTransfer.setData('draggable-item', '');\n $event.originalEvent.dataTransfer.effectAllowed = \"move\";\n $event.originalEvent.dataTransfer.dropEffect = \"none\";\n $event.target.style.cursor = 'move';\n $event.target.classList.add('item-multi-dragged');\n\n // Preparing dragged item/items is left for the scope, we just need to pass the current item being dragged.\n $scope.onItemDragStart($event, $scope.item);\n },\n dragenter: function($event) {\n $element.addClass('item-drop-indicator');\n },\n dragleave: function($event) {\n $element.removeClass('item-drop-indicator');\n },\n dragend: function($event) {\n $event.target.style.cursor = 'pointer';\n $event.target.classList.remove('item-multi-dragged');\n $element.removeClass('item-drop-indicator');\n },\n drop: function($event) {\n $event.preventDefault();\n $event.stopPropagation();\n\n var droppedItem = $event.originalEvent.dataTransfer.getData('application/json');\n droppedItem = JSON.parse(droppedItem);\n $scope.onItemDragFinished(droppedItem, $scope.item);\n\n $element.removeClass('item-drop-indicator');\n },\n dragover: function($event) {\n $event.preventDefault();\n }\n });\n }\n };\n });","angular.module('llax.directives')\n .directive('assetFoldersList', function($log, $rootScope, $timeout, $translate, AssetFoldersService, uiGridConstants) {\n return {\n strict: 'E',\n priority: Number.MAX_SAFE_INTEGER,\n scope: {\n parentElementClass: '@',\n currentPath: '@',\n selectedItem: '=',\n items: '=',\n onItemDoubleClick: '=',\n onItemSelect: '=',\n onMultiItemSelected: '=',\n onSelectAll: '=',\n onClearSelection: '=',\n isImageFile: '=',\n getFileIcon: '=',\n getImageUrl: '='\n },\n template:\n '
    ' +\n '
    ',\n controller: function($scope) {\n var ASSET_FOLDERS_GRID_STATES_KEY = \"asset-folders-grid-states\";\n var DEFAULT_GRID_STATE_KEY = \"default-state\";\n\n $scope.LINK_TYPE_FOLDER = AssetFoldersService.LINK_TYPE_FOLDER;\n $scope.LINK_TYPE_ASSET = AssetFoldersService.LINK_TYPE_ASSET;\n $scope.decodeFilename = AssetFoldersService.decodeFilename;\n\n $scope.gridApi = null;\n\n $scope.gridHeight = function () {\n var parentElements = document.getElementsByClassName('items-container');\n var height = parentElements[0].offsetHeight;\n\n return {\n 'height': height + \"px\",\n 'min-height': '0px'\n };\n };\n\n $scope.getCellClass = function(grid, row) {\n if (!_.isNil($scope.selectedItem) && row.entity.name === $scope.selectedItem.name) {\n return 'item-focused';\n }\n };\n\n $scope.$watch('selectedItem', function() {\n if (!_.isNil($scope.gridApi)) {\n $timeout(function() {\n $scope.gridApi.core.notifyDataChange( uiGridConstants.dataChange.COLUMN );\n }, 0);\n }\n });\n\n $scope.getContextMenuTarget = function(item) {\n if (item.linkType === $scope.LINK_TYPE_ASSET) {\n return 'assets-context-menu';\n } else if (item.linkType === $scope.LINK_TYPE_FOLDER) {\n return 'folders-context-menu';\n } else {\n $log.warn('getContextMenuTarget(): Link type not recognized', item);\n return '';\n }\n };\n\n $scope.columnDefs = [{\n displayName: $translate.instant('NAME'),\n name: 'name',\n width: '*',\n minWidth: 120,\n enableCellEdit: false,\n allowCellFocus: false,\n cellClass: $scope.getCellClass,\n cellTemplate:\n '
    ' +\n '
    ' +\n '
    ' +\n '' +\n '
    ' +\n '
    ' +\n '{{row.entity.name}}' +\n '
    '+\n '
    ' +\n '
    ' +\n '
    ' +\n '' +\n '' +\n '
    ' +\n '
    ' +\n '{{row.entity.name}}' +\n '
    ' +\n '
    ' +\n '
    '\n }, {\n displayName: $translate.instant('ASSET_FOLDER.CREATED'),\n name: 'createdAt',\n width: '*',\n minWidth: 120,\n enableCellEdit: false,\n allowCellFocus: false,\n cellClass: $scope.getCellClass,\n cellTemplate:\n '
    {{row.entity.createdAt | date: \\'medium\\'}}
    '\n }, {\n displayName: $translate.instant('ASSET_FOLDER.CREATED_BY'),\n name: 'createdBy',\n width: '*',\n minWidth: 120,\n enableCellEdit: false,\n allowCellFocus: false,\n cellClass: $scope.getCellClass\n }];\n\n $scope.$on('notifyMultiSelectionChanged', function() {\n _.forEach($scope.items, function(item, index){\n if (item.multiSelected) {\n $scope.gridApi.selection.selectRow(item);\n } else {\n $scope.gridApi.selection.unSelectRow(item);\n }\n });\n });\n\n $scope.gridOptions = {\n data: 'items',\n columnDefs: $scope.columnDefs,\n enableRowSelection: true,\n enableSelectAll: true,\n enableColumnMenus: false,\n enableGridMenu: true,\n enableHorizontalScrollbar: 0,\n enableVerticalScrollbar: 1,\n rowHeight: 32,\n rowTemplate: '
    ' +\n '
    ',\n onRegisterApi: function (gridApi) {\n $scope.gridApi = gridApi;\n $rootScope.initGridState($scope, $scope.gridApi, ASSET_FOLDERS_GRID_STATES_KEY, DEFAULT_GRID_STATE_KEY, $scope.columnDefs);\n\n gridApi.selection.on.rowSelectionChanged($scope,function(row){\n\n if (row.isSelected) {\n row.entity.multiSelected = true;\n } else {\n row.entity.multiSelected = false;\n }\n $scope.onMultiItemSelected(row.entity);\n });\n\n gridApi.selection.on.rowSelectionChangedBatch($scope, function() {\n\n var selectedRows = $scope.gridApi.selection.getSelectedRows();\n if (selectedRows.length > 0) {\n $scope.onSelectAll();\n } else {\n $scope.onClearSelection();\n }\n });\n\n $timeout(function(){\n\n _.forEach($scope.items, function(item, index){\n if (item.multiSelected) {\n gridApi.selection.selectRow(item);\n }\n });\n }, 0);\n }\n };\n }\n };\n });","angular.module('llax.directives')\n .directive('assetFoldersTree', function(AssetFoldersResource, AssetFoldersService) {\n return {\n strict: 'E',\n scope: {\n traverseToFolder: '=',\n currentlyViewedPath: '=',\n\n // The following will be passed to child 'Folder':\n onItemMovedSuccessfully: '=',\n onAllItemsMovedSuccessfully: '=',\n onItemMovedError: '='\n },\n templateUrl: 'tpl/asset-folders/directive-asset-folders-tree.tpl.html',\n controller: function($scope) {\n $scope.LINK_TYPE_FOLDER = AssetFoldersService.LINK_TYPE_FOLDER;\n $scope.LINK_TYPE_ASSET = AssetFoldersService.LINK_TYPE_ASSET;\n $scope.decodeFilename = AssetFoldersService.decodeFilename;\n\n $scope.rootFolder = [];\n\n $scope.load = function() {\n AssetFoldersResource().getRootFolderContents(function (response) {\n\n if (_.isEmpty($scope.rootFolder)) {\n $scope.rootFolder = AssetFoldersService.sortAssetItems(response);\n } else {\n var currentItems = $scope.rootFolder;\n var onlyNewItems = _.differenceBy(response, currentItems, function(_item) {\n return _item.name;\n });\n var onlyDeletedItems = _.differenceBy(currentItems, response, function(_item) {\n return _item.name;\n });\n\n // Clear out deleted items\n currentItems = _.filter(currentItems, function(_item) {\n return !_.some(onlyDeletedItems, { name: _item.name});\n });\n\n // Append new items\n currentItems = _.concat(currentItems, onlyNewItems);\n $scope.rootFolder = AssetFoldersService.sortAssetItems(currentItems);\n }\n });\n };\n\n $scope.$on(AssetFoldersService.EVENT_CHILDS_UPDATED, function(event, data) {\n // One of the child folders has been deleted or created.\n if (data.path === '') {\n // Trigger a refresh\n $scope.load();\n }\n });\n\n $scope.load();\n }\n };\n })\n .directive('folder', function($timeout, AssetFoldersResource, AssetFoldersService, RecursiveDirectiveHelper) {\n return {\n strict: 'E',\n scope: {\n item: '=',\n parentPath: '@',\n traverseToFolder: '=',\n currentlyViewedPath: '=',\n onItemMovedSuccessfully: '=',\n onAllItemsMovedSuccessfully: '=',\n onItemMovedError: '='\n },\n templateUrl: 'tpl/asset-folders/directive-folder-tree-entry.tpl.html',\n compile: function(element) {\n return RecursiveDirectiveHelper.compile(element);\n },\n controller: function($scope) {\n $scope.LINK_TYPE_FOLDER = AssetFoldersService.LINK_TYPE_FOLDER;\n $scope.decodeFilename = AssetFoldersService.decodeFilename;\n\n $scope.getCurrentPath = function() {\n if (_.isEmpty($scope.parentPath)) {\n return $scope.item.name;\n } else {\n return $scope.parentPath + '/' + $scope.item.name;\n }\n };\n\n $scope.openFolder = function($event, item) {\n if($event.stopPropagation) {\n $event.stopPropagation();\n }\n\n item.isOpen = true;\n\n var path = $scope.getCurrentPath();\n\n AssetFoldersResource(path).getFolderContents(function (response) {\n $timeout(function() {\n\n if (_.isEmpty(item.childItems)) {\n item.childItems = AssetFoldersService.sortAssetItems(response);\n } else {\n var currentItems = item.childItems;\n var onlyNewItems = _.differenceBy(response, currentItems, function(_item) {\n return _item.name;\n });\n var onlyDeletedItems = _.differenceBy(currentItems, response, function(_item) {\n return _item.name;\n });\n\n // Clear out deleted items\n currentItems = _.filter(currentItems, function(_item) {\n return !_.some(onlyDeletedItems, { name: _item.name});\n });\n\n // Append new items\n currentItems = _.concat(currentItems, onlyNewItems);\n item.childItems = AssetFoldersService.sortAssetItems(currentItems);\n }\n }, 0);\n });\n };\n\n $scope.viewFolder = function($event, item) {\n $scope.openFolder($event, item);\n $scope.traverseToFolder($scope.parentPath, item.name);\n };\n\n $scope.closeFolder = function($event, item) {\n $event.stopPropagation();\n item.isOpen = false;\n };\n\n $scope.$watch('currentlyViewedPath', function(newPath, oldPath) {\n if ($scope.getCurrentPath() === newPath) {\n $scope.item.active = true;\n $scope.openFolder({}, $scope.item);\n } else {\n $scope.item.active = false;\n }\n });\n\n $scope.$on(AssetFoldersService.EVENT_UPDATED, function(event, data) {\n // Current rendered folder has been updated, and currently\n // we only support updating the name.\n if (data.path === $scope.getCurrentPath()) {\n $scope.item.name = data.newName;\n }\n });\n\n $scope.$on(AssetFoldersService.EVENT_CHILDS_UPDATED, function(event, data) {\n // One of the child folders has been deleted or created.\n if (data.path === $scope.getCurrentPath()) {\n // Trigger a refresh\n $scope.openFolder({}, $scope.item);\n }\n });\n\n $scope.onItemDragStart = function($event) {\n // Note: this will be called on the DRAGGED item.\n var parentPath = AssetFoldersService.getParentFolderPath($scope.getCurrentPath());\n\n var draggedItems = [$scope.item];\n AssetFoldersService.prepareDragAndDropEvent($event, draggedItems, parentPath);\n };\n\n $scope.onItemDragFinished = function(droppedItems, droppedOnItem) {\n // Note: this will be called on the item being DROPPED on.\n\n var parentPath = AssetFoldersService.getParentFolderPath($scope.getCurrentPath());\n\n AssetFoldersService.handleDropEventAsync(droppedItems, droppedOnItem, parentPath, $scope.onItemMovedSuccessfully)\n .then(function(){\n $scope.multiSelectedItems = [];\n $scope.onAllItemsMovedSuccessfully($scope.getCurrentPath());\n })\n .catch(function(error) {\n $scope.onItemMovedError(error);\n });\n };\n }\n };\n })\n .filter('onlyFolders', function(AssetFoldersService) {\n // Although we are not mutating the filtered collection, we have to\n // use _.memoize to cache the objects in order to prevent AngularJS from going into a mad loop,\n // where it thinks the filter is returning a new result on each $digest.\n return _.memoize(function(items) {\n return _.filter(items, function(item) {\n return item.linkType === AssetFoldersService.LINK_TYPE_FOLDER;\n });\n });\n });\n","angular.module('llax.directives')\n .directive('mappingEditorResizer', function($document) {\n return function($scope, $element, $attrs) {\n $element.on('mousedown', function(event) {\n event.preventDefault();\n $document.on('mousemove', mousemove);\n $document.on('mouseup', mouseup);\n angular.element($attrs.iframeTarget + ' iframe').css('pointer-events', 'none');\n });\n\n function mousemove(event) {\n var maxHeight = window.innerHeight - 250;\n var minHeight = 180;\n var box = angular.element('.box-content');\n var y = box[0].offsetHeight - event.pageY;\n if (y < maxHeight && y > minHeight) {\n $element.css({\n bottom: y + 'px'\n });\n var t_elem = angular.element($attrs.resizerTarget);\n t_elem.css({\n height: (y + 35) + 'px'\n });\n }\n }\n\n function mouseup() {\n $document.unbind('mousemove', mousemove);\n $document.unbind('mouseup', mouseup);\n angular.element($attrs.iframeTarget + ' iframe').css('pointer-events', 'auto');\n }\n };\n });","angular.module('llax.directives')\n .directive('mappingEntriesGrid', function($timeout, $translate, TemplateMappingService, uiGridConstants) {\n return {\n strict: 'E',\n scope: {\n gridApi: '=',\n mappings: '=',\n templateType: '=',\n attributes: '=',\n mappingFunctions: '=',\n onFocusSpreadsheetCell: '=',\n onDeleteMappingEntry: '=',\n onConfigureSimpleMappingList: '=',\n onConfigureCustomCodeMappingFunction: '=',\n onConfigureMappingFunction: '='\n },\n template:\n '
    ' +\n '
    ',\n link: function($scope) {\n var TYPE_LIST = 'LIST';\n\n $scope.columnDefs = [\n {\n displayName: $translate.instant('TEMPLATE_MAPPINGS.NAME'),\n name: 'externalName',\n enableCellEdit: true,\n enableCellSelection: false,\n allowCellFocus: true,\n enableColumnResizing: false,\n enableSorting: true,\n enableHiding: false,\n pinnedRight: false,\n width: '*',\n minWidth: 120,\n editableCellTemplate:\n '
    ' +\n '
    ' +\n ' ' +\n '
    ' +\n '
    '\n },\n {\n displayName: $translate.instant('TEMPLATE_MAPPINGS.COLUMN'),\n name: 'location',\n enableCellEdit: true,\n enableCellSelection: false,\n allowCellFocus: true,\n enableColumnResizing: false,\n enableSorting: true,\n sortingAlgorithm: function(firstValue, secondValue, firstRow, secondRow, direction) {\n if (_.isEmpty(firstValue) || _.isEmpty(secondValue)) {\n return 0;\n } else {\n var a1OfFirstValue = TemplateMappingService.getA1NotationFromLocationString(firstValue);\n var a1OfSecondValue = TemplateMappingService.getA1NotationFromLocationString(secondValue);\n return TemplateMappingService.convertFromA1Notation(a1OfFirstValue).col - TemplateMappingService.convertFromA1Notation(a1OfSecondValue).col;\n }\n },\n enableHiding: false,\n pinnedRight: false,\n width: '*',\n minWidth: 60,\n cellTemplate:\n '
    ' +\n '{{grid.appScope.formatEntryLocation(row.entity.location)}}' +\n '' +\n '
    ',\n editableCellTemplate:\n '
    ' +\n '
    ' +\n '' +\n '
    ' +\n '
    '\n },\n {\n displayName: $translate.instant('TEMPLATE_MAPPINGS.MODEL_ATTRIBUTE'),\n name: 'internalName__',\n enableCellEdit: true,\n enableCellSelection: false,\n allowCellFocus: true,\n enableColumnResizing: false,\n enableSorting: true,\n sortingAlgorithm: function(firstValue, secondValue, firstRow, secondRow, direction) {\n if (_.isEmpty(firstValue) || _.isEmpty(secondValue)) {\n return 0;\n } else {\n if (!_.isNil(firstValue.translatedName)) {\n return firstValue.translatedName.localeCompare(secondValue.translatedName);\n } else {\n return firstValue.name.localeCompare(secondValue.name);\n }\n }\n },\n enableHiding: false,\n pinnedRight: false,\n width: '*',\n minWidth: 120,\n cellTemplate: '
    {{row.entity.internalName__.name}}
    ',\n editableCellTemplate:\n '
    ' +\n '' +\n '' +\n '{{$select.selected.name}}' +\n '' +\n '' +\n '
    ' +\n '
    ' +\n '
    ' +\n '
    '\n },\n {\n displayName: $translate.instant('TEMPLATE_MAPPINGS.MAPPING_FUNCTION'),\n name: 'mappingFunction__',\n enableCellEdit: true,\n enableCellSelection: false,\n allowCellFocus: true,\n enableColumnResizing: false,\n enableSorting: false,\n enableHiding: false,\n pinnedRight: false,\n width: '*',\n minWidth: 120,\n cellTemplate:\n '
    ' +\n '{{row.entity.mappingFunction__.translatedLabel}}' +\n ' ' +\n '
    ',\n editableCellTemplate:\n '
    ' +\n '' +\n '' +\n '{{$select.selected.name}}' +\n '' +\n '' +\n '
    ' +\n '
    ' +\n '
    ' +\n '
    '\n },\n {\n displayName: '',\n name: 'config',\n enableCellEdit: false,\n enableCellSelection: false,\n allowCellFocus: false,\n enableColumnResizing: false,\n enableSorting: false,\n enableHiding: false,\n pinnedRight: false,\n width: '60',\n minWidth: 30,\n cellTemplate:\n '
    ' +\n '
    ' +\n '' +\n '' +\n '' +\n '
    ' +\n '' +\n '
    '\n },\n ];\n\n $scope.gridOptions = {\n data: 'mappings',\n columnDefs: $scope.columnDefs,\n enableColumnMenus: false,\n enableHorizontalScrollbar: 1, // hide\n enableVerticalScrollbar: 1, // show when needed\n rowHeight: 32,\n onRegisterApi: function(gridApi) {\n $scope.gridApi = gridApi;\n $scope.onTemplateTypeChange($scope.templateType);\n $timeout(function() {\n $scope.removeFocusClass();\n });\n }\n };\n\n $scope.formatEntryLocation = function(location) {\n if (location === '') {\n return location;\n }\n\n if ($scope.templateType === TYPE_LIST) {\n var locationWithoutSheet = TemplateMappingService.getA1NotationFromLocationString(location);\n return TemplateMappingService.convertToA1Notation(\n TemplateMappingService.convertFromA1Notation(locationWithoutSheet).col + 1);\n } else {\n return TemplateMappingService.getA1NotationFromLocationString(location);\n }\n };\n\n $scope.onInternalNameChange = function(rowEntity, selectedAttribute) {\n if (_.isEmpty(selectedAttribute.value)) {\n rowEntity.internalName = null;\n rowEntity.internalName__ = null;\n } else {\n rowEntity.internalName = selectedAttribute.value;\n }\n };\n\n $scope.onMappingFunctionChange = function(rowEntity, selectedMappingFunction) {\n if (_.isEmpty(selectedMappingFunction.name)) {\n rowEntity.mappingFunction = null;\n rowEntity.mappingFunction__ = null;\n rowEntity.mappingFunctionParams = null;\n } else {\n rowEntity.mappingFunctionParams = null;\n rowEntity.mappingFunction = selectedMappingFunction.name;\n }\n };\n\n $scope.onTemplateTypeChange = function(newType) {\n if (newType === TYPE_LIST) {\n $scope.columnDefs[1].displayName = $translate.instant('TEMPLATE_MAPPINGS.COLUMN');\n } else {\n $scope.columnDefs[1].displayName = $translate.instant('TEMPLATE_MAPPINGS.CELL');\n }\n $timeout(function(){\n if (!_.isEmpty($scope.gridApi)) {\n $scope.gridApi.core.notifyDataChange( uiGridConstants.dataChange.COLUMN );\n }\n }, 0);\n };\n\n $scope.getMappingFunctionType = function(mappingFunctionDefinition) {\n return TemplateMappingService.getMappingFunctionType(mappingFunctionDefinition);\n };\n\n $scope.removeFocusClass = function() {\n // Due to the grid not being fully visible in the UI, a UI glitch is happening when focusing the cell.\n // For more info: https://github.com/angular-ui/ui-grid/issues/5980\n $('.ui-grid-focuser').remove();\n };\n\n $scope.gridHeight = function () {\n var newHeight = 32 * ($scope.mappings.length + 2);\n return {\n 'height': newHeight + \"px\",\n 'min-height': '500px'\n };\n };\n\n $scope.$watch('templateType', $scope.onTemplateTypeChange);\n }\n };\n });\n","angular.module('llax.directives')\n // FIXME: Tooltip functionality should be replaced in favor for 'hint-tooltip-directive.js'\n .directive('mappingFunctionHint', function($timeout, $translate) {\n return {\n strict: 'E',\n scope: {\n mappingFunctionDefinition: '=',\n mappingEntry: '=',\n mappingParameters: '='\n },\n template:\n '' +\n '' +\n '' +\n '' +\n '' +\n '',\n link: function($scope) {\n $scope.shouldShowHint = false;\n $scope.isValidSimpleMappingFunction = false;\n\n $scope.$watch('mappingParameters', function(newParameters) {\n $scope.mappingParameters = newParameters;\n update($scope.mappingFunction, newParameters);\n });\n\n $scope.$watch('mappingFunctionDefinition', function(newMappingFunction) {\n $scope.mappingFunction = newMappingFunction;\n update(newMappingFunction, $scope.mappingParameters);\n });\n\n $scope.showIsValidTooltip = function() {\n $scope.showTooltip('

    ' + $translate.instant('TEMPLATE_MAPPINGS.ALL_PARAMS_SET') + '

    ');\n };\n\n $scope.showIsInvalidTooltip = function() {\n var missingParams = getMissingParameters($scope.mappingFunctionDefinition, $scope.mappingParameters);\n var content = '

    ' + $translate.instant('TEMPLATE_MAPPINGS.PARAMS_NOT_SET') + '

    ';\n content += '
      ';\n\n _.forEach(missingParams, function(param) {\n content += '
    • ' + param.name + '
    • ';\n });\n content += '
    ';\n $scope.showTooltip(content);\n };\n\n $scope.showTooltip = function(content) {\n function customRendererFn() {\n var attributeStart = '
    ';\n var attributeEnd = '
    ' +\n '';\n return attributeStart + content + attributeEnd;\n }\n\n var calloutId = 'callout_' + $scope.mappingEntry.id;\n var calloutConfig = {\n id: calloutId,\n target: 'mapping-function-hint-' + $scope.mappingEntry.id,\n placement: 'left',\n content: '',\n customRenderer: customRendererFn\n };\n\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeCallout(calloutId);\n\n var calloutEle = calloutMgr.createCallout(calloutConfig);\n // Hack: override !important css rules, with inline precedence\n calloutEle.element.style.cssText += 'border: none !important; z-index: 1049;';\n };\n\n $scope.hideTooltip = function removeTooltip() {\n $timeout(function() {\n var calloutMgr = hopscotch.getCalloutManager();\n calloutMgr.removeCallout('callout_' + $scope.mappingEntry.id);\n }, 200);\n };\n\n function update(mappingFunctionDefinition, parameters) {\n if (!_.isEmpty(mappingFunctionDefinition)) {\n $scope.shouldShowHint = true;\n\n var missingParameters = getMissingParameters(mappingFunctionDefinition, parameters);\n if (missingParameters.length === 0) {\n $scope.isValidSimpleMappingFunction = true;\n } else {\n $scope.isValidSimpleMappingFunction = false;\n }\n } else {\n // No mapping function is selected, no need for hint\n $scope.shouldShowHint = false;\n }\n }\n\n function getMissingParameters(mappingFunctionDefinition, parameters) {\n var requiredParameters = _.filter(mappingFunctionDefinition.parameters, function(parameter) {\n return !parameter.optional && _.isNil(parameter.defaultValue);\n });\n var actualParameters = _.filter(_.keys(parameters), function(parameterName) {\n return !_.isEmpty(parameters[parameterName]);\n });\n\n return _.differenceWith(\n requiredParameters,\n actualParameters,\n function(firstSetEntry, secondSetEntry) {\n return firstSetEntry.name === secondSetEntry;\n }\n );\n }\n }\n };\n });","angular.module('llax.directives')\n .directive('codeBlockMappingParameter', function($timeout) {\n return {\n strict: 'E',\n scope: {\n bindModel: '=ngModel',\n codeMirrorConfigs: '='\n },\n template: '
    ',\n controller: function($scope) {\n $scope.onEditorLoaded = function(editor) {\n $timeout(function() {\n editor.refresh();\n editor.setCursor({ line: 1, ch: 0 });\n }, 0);\n };\n }\n };\n })\n .directive('textMappingParameter', function() {\n return {\n strict: 'E',\n scope: {\n bindModel: '=ngModel',\n defaultValue: '='\n },\n template: '',\n };\n })\n .directive('multiTextMappingParameter', function() {\n return {\n strict: 'E',\n scope: {\n bindModel: '=ngModel'\n },\n template:\n '' +\n '' +\n '{{::$item}}' +\n '' +\n '' +\n '
    {{::item}}
    ' +\n '
    ' +\n '
    ',\n controller: function($scope) {\n $scope.tempModel = {};\n\n $scope.onParamSelected = function(selected) {\n if (!_.isNil(selected)) {\n $scope.bindModel = selected;\n } else {\n $scope.bindModel = null;\n }\n };\n\n $scope.onChange = function() {\n $scope.tempModel = $scope.bindModel;\n };\n\n $scope.$watch('options', $scope.onChange);\n $scope.$watch('bindModel', $scope.onChange);\n }\n };\n })\n .directive('selectMappingParameter', function() {\n return {\n strict: 'E',\n scope: {\n bindModel: '=ngModel',\n options: '=',\n },\n template:\n '' +\n '' +\n '{{$select.selected.name}}' +\n '' +\n '' +\n '
    ' +\n '
    ' +\n '
    ',\n controller: function($scope) {\n $scope.tempModel = {};\n\n $scope.onParamSelected = function(selected) {\n if (!_.isNil(selected)) {\n $scope.bindModel = selected.value;\n } else {\n $scope.bindModel = null;\n }\n };\n\n $scope.onChange = function() {\n $scope.tempModel = _.find($scope.options, { value: $scope.bindModel });\n };\n\n $scope.$watch('options', $scope.onChange);\n $scope.$watch('bindModel', $scope.onChange);\n }\n };\n })\n .directive('multiSelectMappingParameter', function() {\n return {\n strict: 'E',\n scope: {\n bindModel: '=ngModel',\n options: '='\n },\n template:\n ''+\n '' +\n '{{$item.name}}' +\n '' +\n '' +\n '
    ' +\n '
    ' +\n '
    ',\n controller: function($scope) {\n $scope.tempModel = {};\n\n $scope.onParamSelected = function(selected) {\n $scope.bindModel = _.map(selected, function(entry) { return entry.value; });\n };\n\n $scope.onChange = function() {\n if (_.isArray($scope.bindModel)) {\n $scope.tempModel =\n _.intersectionWith(\n $scope.options,\n $scope.bindModel,\n function(firstEntry, secondEntry) {\n return firstEntry.value === secondEntry;\n }\n );\n }\n };\n\n $scope.$watch('options', $scope.onChange);\n $scope.$watch('bindModel', $scope.onChange);\n }\n };\n })\n .directive('booleanMappingParameter', function() {\n return {\n strict: 'E',\n scope: {\n paramName: '=',\n bindModel: '=ngModel'\n },\n template:\n '' +\n '' +\n '' +\n ''\n };\n });","angular.module('llax.directives')\n .directive('spreadsheetViewerWrapper', function(growl, $log) {\n return {\n restrict: 'A',\n scope: {\n fileAsArrayBuffer: '=',\n fileName: '=',\n assetsUrl: '=',\n onLoad: '=',\n onSheetChange: '=',\n onCellChange: '='\n },\n link: function ($scope, $element) {\n var spreadsheetViewerInstance = null;\n $scope.loaded = false;\n $element[0].addEventListener('activeSheetChanged', activeSheetChanged);\n load();\n\n function load() {\n window.SpreadsheetViewer.SpreadsheetViewer({\n container: $element[0],\n assetsUrl: $scope.assetsUrl\n })\n .then(function(instance) {\n instance.configure({\n licenseKey: 'evaluation',\n themeStylesheet: 'light'\n });\n instance.loadWorkbook($scope.fileAsArrayBuffer, 0, $scope.fileName);\n exposeInstanceApi(instance);\n })\n .catch(function(error) {\n growl.error('TEMPLATE_MAPPINGS.TEMPLATE_COULD_NOT_BE_LOADED');\n $log.error(error.message);\n });\n }\n\n function exposeInstanceApi(instance) {\n instance.selectSheet = selectSheet;\n instance.focusSpreadsheetCell = focusSpreadsheetCell;\n spreadsheetViewerInstance = instance;\n }\n\n function onLoad() {\n var iframeDocument = $element[0].children[0].contentDocument;\n var sheets = _.map(iframeDocument.getElementsByClassName('sv-tab'), function(spreadsheetViewerTab) {\n return spreadsheetViewerTab.innerText;\n });\n $scope.onLoad(spreadsheetViewerInstance, sheets);\n }\n\n function activeSheetChanged(event) {\n // First fire of 'activeSheetChanged' is actually the file being loaded.\n if (!$scope.loaded) {\n $scope.loaded = true;\n\n // We can only register a 'cellSelectionChanged' event after first load of the file.\n $element[0].addEventListener('cellSelectionChanged', cellSelectionChanged);\n\n onLoad();\n } else {\n $scope.onSheetChange(event);\n }\n }\n\n function cellSelectionChanged(event) {\n $scope.onCellChange(event);\n }\n\n function selectSheet(sheetName) {\n var iframeDocument = $element[0].children[0].contentDocument;\n var buttonElement = _.find(iframeDocument.getElementsByClassName('sv-tab'), function(button) {\n return button.innerText === sheetName;\n });\n\n if (!_.isNil(buttonElement)) {\n buttonElement.click();\n } else {\n $log.error('spreadsheetViewerWrapper directive: trying to change sheet `'+ sheetName + '`, but it was not found.');\n }\n }\n\n function focusSpreadsheetCell(row, col) {\n /* `this` is the Spreadsheet Instance: https://github.com/handsontable/spreadsheet-viewer/wiki/JavaScript-API */\n this.selectCells([row, col, row, col]);\n }\n\n function blurSreadsheetDocument() {\n // We can blur the whole spread sheet document by triggering a mousedown on the html element.\n if (!_.isNil(spreadsheetViewerInstance)) {\n var iframeDocument = $element[0].children[0].contentDocument;\n var iframeHtml = iframeDocument.getElementsByTagName('html');\n iframeHtml[0].dispatchEvent(new Event('mousedown'));\n }\n }\n\n // We need this hack to blur the spreadsheet active elements and remove any keyboard listeners that\n // the spreadsheet might have hijacked like DELETE, BACKSPACE and ARROW KEYS, especially when we are out of the\n // spread sheet scope.\n document.addEventListener('click', blurSreadsheetDocument, true);\n\n $scope.$on('$destroy', function() {\n document.removeEventListener('click', blurSreadsheetDocument, true);\n });\n }\n };\n });","angular.module('llax.directives')\n .directive('bannerAd', function() {\n return {\n strict: 'E',\n scope: {\n adUrl: '@',\n adId: '@'\n },\n template:\n '
    ' +\n '' +\n '' +\n '
    ',\n controller: function($element, $sce, $scope) {\n $scope.visible = true;\n $scope.trustUrl = function(url) {\n return $sce.trustAsResourceUrl(url);\n };\n\n window.addEventListener('message', function(event) {\n // Adjust the iframe container height based upon the iframe sizes:\n // the event 'message' is sent from the iframe.\n var $divElement = $element[0].querySelector('div');\n var $iframe = $element[0].querySelector('iframe');\n $divElement.style.height = event.data.height + 'px';\n $iframe.style.height = event.data.height + 'px';\n });\n\n $scope.cancel = function() {\n $scope.visible = false;\n };\n }\n };\n });","angular.module('llax.directives')\n .directive('closeAdButton', function(UpsellingAdsService) {\n return {\n strict: 'E',\n scope: {\n onCancel: '=',\n adId: '@',\n banner: '@'\n },\n template:\n '',\n controller: function($scope) {\n $scope.cancel = function() {\n UpsellingAdsService.setAdAsSeen($scope.adId);\n $scope.onCancel();\n };\n }\n };\n });","angular.module('llax.directives')\n .directive('popupAd', function($modal) {\n return {\n strict: 'E',\n scope: {\n adUrl: '@',\n adId: '@'\n },\n template:\n '
    ',\n controller: function($scope) {\n $modal.open({\n template:\n '
    ' +\n '' +\n '' +\n '
    ',\n controller: function($modalInstance, $sce, $scope, data) {\n $scope.adUrl = data.adUrl;\n $scope.adId = data.adId;\n\n $scope.trustUrl = function(url) {\n return $sce.trustAsResourceUrl(url);\n };\n\n $scope.cancel = function() {\n $modalInstance.dismiss('cancel');\n };\n },\n size: 'lg',\n windowClass: 'ad-popup-modal',\n backdrop: true,\n resolve: {\n data: function () {\n return {\n adUrl: $scope.adUrl,\n adId: $scope.adId\n };\n }\n }\n });\n }\n };\n });","angular.module('llax')\n .factory('DashletRegistry', function($rootScope) {\n\n var dashlets = [];\n\n var defaultWidgets = [];\n\n var fillInDefaults = function(dashlet) {\n dashlet.size = dashlet.size || {\n width: '50%',\n height: '280px'\n };\n dashlet.dataAttrName = dashlet.dataAttrName || 'value';\n return dashlet;\n };\n\n var dashletRegistry = {\n addAll: function(dashlets_) {\n\n dashlets_ = dashlets_.map(function(dashlet) {\n return fillInDefaults(dashlet);\n });\n\n _.forEach(dashlets_, function(dashlet) {\n if (window.location.hostname !== 'localhost' && dashlet.localOnly) {\n return;\n }\n var existingDashlet = _.find(dashlets, { name: dashlet.name });\n if (existingDashlet) {\n // replace dashlet in list\n dashlets.map(function(_dashlet) {\n if (_dashlet.name === dashlet.name){\n return dashlet;\n }\n return _dashlet;\n });\n } else {\n dashlets.push(dashlet);\n }\n });\n },\n getDashlets: function() {\n return dashlets;\n },\n addToDefaultDashlets: function(widgets) {\n defaultWidgets = defaultWidgets.concat(widgets);\n },\n getDefaultDashlets: function() {\n return defaultWidgets;\n }\n\n };\n return dashletRegistry;\n })\n .service('CustomDashletRegistry', function() {\n //This is a Dummy Service, that has to be redefined by the customer\n // needed for injection in DashboardController, if no custom Registry is defined\n return {\n load: function() {\n }\n };\n });\n\n// Dashlet Factories:\nangular.module('llax')\n.factory('CategoriesOverviewFactory', function($location, $rootScope, DashboardService, PieChartFactory, StatisticsResource) {\n\n var getCategoriesOverviewDataLoader = function(name, attributes) {\n\n if (_.isUndefined(attributes)) {\n attributes = _.slice(arguments, 1);\n } else if (_.isString(attributes)) {\n attributes = [attributes];\n }\n\n return function(callback) {\n var dimension = DashboardService.getDimensionValue(attributes);\n StatisticsResource.query({\n name: name,\n dimension: dimension\n }, function(response) {\n\n response = response.filter(function(elem) {\n return elem.count > 0;\n });\n\n var NO_CATEGORY = \"NO_CATEGORY\";\n var noCategoriesEntry = response.filter(function(elem) {\n return elem.key == NO_CATEGORY;\n })[0];\n\n // Always add a \"NO_CATEGORY\" entry\n if (!noCategoriesEntry) {\n response.push({\n categoryName: NO_CATEGORY,\n occurence: 0\n });\n }\n\n var data = response.map(function(elem) {\n return {\n label: elem.key,\n data: elem.count\n };\n });\n\n callback(data);\n\n }, function(errorResponse) {\n callback({});\n });\n };\n };\n\n return {\n create: function(config) {\n\n config = config || {};\n var statisticName = config.statisticName || '__categories_statistic';\n var dimensionAttributes = config.dimensionAttributes || null;\n\n _.defaults(config, {\n labelTranslator: function(label) {\n return $rootScope.translateCategory($rootScope.dataModel.category(label));\n },\n linkFunction: function(label) {\n var link = DashboardService.getBrowseLink({\n 'category': label\n }, dimensionAttributes);\n return link;\n },\n plotClick: function(plot) {\n var location = DashboardService.getBrowseLocation({\n 'category': plot.series.label,\n }, dimensionAttributes);\n $location.search(location).path(\"/browse\");\n },\n dataLoader: getCategoriesOverviewDataLoader(statisticName, dimensionAttributes),\n showLegend: true\n });\n\n return PieChartFactory.create(config);\n }\n };\n})\n.factory('CategoriesListFactory', function($rootScope, DashboardService, GenericDashletFactory, StatisticsResource) {\n\n var getLoadCategoriesList = function(name, attributes) {\n\n if (_.isUndefined(attributes)) {\n attributes = _.slice(arguments, 1);\n } else if (_.isString(attributes)) {\n attributes = [attributes];\n }\n\n return function(callback) {\n var dimension = DashboardService.getDimensionValue(attributes);\n StatisticsResource.query({\n name: name,\n dimension: dimension\n }, function(response) {\n\n var data = _.map(response, function(elem) {\n elem.text = $rootScope.translateCategory(elem.key);\n elem.link = DashboardService.getBrowseLink({\n 'category': elem.key,\n }, attributes);\n return elem;\n });\n callback({\n data: data\n });\n\n }, function(errorResponse) {\n callback({});\n });\n };\n };\n\n return {\n create: function(config) {\n\n config = config || {};\n var statisticName = config.statisticName || '__categories_statistic';\n var dimensionAttributes = config.dimensionAttributes || null;\n\n _.defaults(config, {\n fetchData: getLoadCategoriesList(statisticName, dimensionAttributes)\n });\n\n return GenericDashletFactory.create(config);\n }\n };\n})\n.factory('ComplianceStatisticsFactory', function($location, DashboardService, PieChartFactory, StatisticsResource) {\n\n var complianceBrowseLocation = function(compliant, attributes) {\n\n if (_.isUndefined(attributes)) {\n attributes = _.slice(arguments, 1);\n } else if (_.isString(attributes)) {\n attributes = [attributes];\n }\n\n return DashboardService.getBrowseLocation({\n 'compliant': compliant,\n }, attributes);\n };\n\n var getComplianceDataLoader = function(name, attributes) {\n\n if (_.isUndefined(attributes)) {\n attributes = _.slice(arguments, 1);\n } else if (_.isString(attributes)) {\n attributes = [attributes];\n }\n\n return function(callback) {\n var dimension = DashboardService.getDimensionValue(attributes);\n StatisticsResource.query({\n name: name,\n dimension: dimension\n }, function(response) {\n\n var compliantsData = {\n compliant: 0,\n notCompliant: 0\n };\n\n _.each(response, function(elem) {\n switch (elem.key) {\n case 'compliant':\n compliantsData.compliant += elem.count;\n break;\n case 'non_compliant':\n compliantsData.notCompliant += elem.count;\n break;\n }\n });\n\n var data;\n if (compliantsData.compliant === 0 && compliantsData.notCompliant === 0) {\n data = [];\n } else {\n data = [{\n label: 'Compliant Items',\n data: compliantsData.compliant\n }, {\n label: 'NOT Compliant Items',\n data: compliantsData.notCompliant\n } ];\n }\n\n callback(data);\n\n }, function(errorResponse) {\n callback({});\n });\n };\n };\n\n return {\n create: function(config) {\n\n config = config || {};\n var statisticName = config.statisticName || '__compliance_statistic';\n var dimensionAttributes = config.dimensionAttributes || null;\n var plotFunction = config.plotFunction || function(plot) {\n var compliant = plot.seriesIndex == 0 ? \"true\" : \"false\";\n var location = complianceBrowseLocation(compliant, dimensionAttributes);\n $location.search(location).path(\"/browse\");\n };\n\n _.defaults(config, {\n colors: [\"#7AD09E\", \"#FA9C9C\"],\n plotClick: plotFunction,\n dataLoader: getComplianceDataLoader(statisticName, dimensionAttributes)\n });\n\n return PieChartFactory.create(config);\n }\n };\n})\n.factory('ValidationsOverviewFactory', function($rootScope, GenericDashletFactory, DashboardService, StatisticsResource) {\n\n var getValidationsOverviewList = function(name, attributes) {\n\n if (_.isUndefined(attributes)) {\n attributes = _.slice(arguments, 1);\n } else if (_.isString(attributes)) {\n attributes = [attributes];\n }\n\n return function(callback) {\n var dimension = DashboardService.getDimensionValue(attributes);\n StatisticsResource.query({\n name: name,\n dimension: dimension\n }, function(response) {\n\n var data = response.map(function(element) {\n element.text = $rootScope.translateValidationLabel(element.key);\n element.link = DashboardService.getBrowseLink({\n 'errorKey': element.key,\n }, attributes);\n return element;\n });\n\n callback({\n data: data\n });\n\n }, function(errorResponse) {\n callback({});\n });\n };\n };\n\n return {\n create: function(config) {\n\n config = config || {};\n var statisticName = config.statisticName || '__validations_overview';\n var dimensionAttributes = config.dimensionAttributes || null;\n _.defaults(config, {\n fetchData: getValidationsOverviewList(statisticName, dimensionAttributes)\n });\n\n return GenericDashletFactory.create(config);\n }\n };\n})\n.factory('WarningsOverviewFactory', function($rootScope, GenericDashletFactory, DashboardService, StatisticsResource) {\n\n var getValidationsWarningList = function(name, attributes) {\n\n if (_.isUndefined(attributes)) {\n attributes = _.slice(arguments, 1);\n } else if (_.isString(attributes)) {\n attributes = [attributes];\n }\n\n return function(callback) {\n var dimension = DashboardService.getDimensionValue(attributes);\n StatisticsResource.query({\n name: name,\n dimension: dimension\n }, function(response) {\n\n var data = response.map(function(element) {\n element.text = $rootScope.translateValidationLabel(element.key);\n element.link = DashboardService.getBrowseLink({\n 'warningKey': element.key,\n }, attributes);\n return element;\n });\n\n callback({\n data: data\n });\n\n }, function(errorResponse) {\n callback({});\n });\n };\n };\n\n return {\n create: function(config) {\n\n config = config || {};\n var statisticName = config.statisticName || '__validation_warnings';\n var dimensionAttributes = config.dimensionAttributes || null;\n _.defaults(config, {\n fetchData: getValidationsWarningList(statisticName, dimensionAttributes)\n });\n\n return GenericDashletFactory.create(config);\n }\n };\n})\n.factory('ReviewErrorsOverviewFactory', function($rootScope, GenericDashletFactory, DashboardService, StatisticsResource) {\n\n var getReviewErrorsOverviewList = function(name, attributes) {\n\n if (_.isUndefined(attributes)) {\n attributes = _.slice(arguments, 1);\n } else if (_.isString(attributes)) {\n attributes = [attributes];\n }\n\n return function(callback) {\n var dimension = DashboardService.getDimensionValue(attributes);\n StatisticsResource.query({\n name: name,\n dimension: dimension\n }, function(response) {\n\n var data = response.map(function(element) {\n element.text = $rootScope.translateValidationLabel(element.key);\n element.link = DashboardService.getBrowseLink({\n 'reviewErrorKey': element.key,\n }, attributes);\n return element;\n });\n\n callback({\n data: data\n });\n\n }, function(errorResponse) {\n callback({});\n });\n };\n };\n\n return {\n create: function(config) {\n\n config = config || {};\n var statisticName = config.statisticName || '__review_errors';\n var dimensionAttributes = config.dimensionAttributes || null;\n _.defaults(config, {\n fetchData: getReviewErrorsOverviewList(statisticName, dimensionAttributes)\n });\n\n return GenericDashletFactory.create(config);\n }\n };\n})\n.factory('ReviewWarningsOverviewFactory', function($rootScope, GenericDashletFactory, DashboardService, StatisticsResource) {\n\n var getReviewWarningList = function(name, attributes) {\n\n if (_.isUndefined(attributes)) {\n attributes = _.slice(arguments, 1);\n } else if (_.isString(attributes)) {\n attributes = [attributes];\n }\n\n return function(callback) {\n var dimension = DashboardService.getDimensionValue(attributes);\n StatisticsResource.query({\n name: name,\n dimension: dimension\n }, function(response) {\n\n var data = response.map(function(element) {\n element.text = $rootScope.translateValidationLabel(element.key);\n element.link = DashboardService.getBrowseLink({\n 'reviewWarningKey': element.key,\n }, attributes);\n return element;\n });\n\n callback({\n data: data\n });\n\n }, function(errorResponse) {\n callback({});\n });\n };\n };\n\n return {\n create: function(config) {\n\n config = config || {};\n var statisticName = config.statisticName || '__review_warnings';\n var dimensionAttributes = config.dimensionAttributes || null;\n _.defaults(config, {\n fetchData: getReviewWarningList(statisticName, dimensionAttributes)\n });\n\n return GenericDashletFactory.create(config);\n }\n };\n})\n.factory('LatestItemsDashletFactory', function($rootScope, GenericDashletFactory, ItemResource) {\n return {\n create: function(config) {\n\n config = config || {};\n\n config.fetchData = function(callback) {\n\n var model = {};\n\n model.getItemDescription = function(item) {\n return $rootScope.getItemTitle('dashlet', item);\n };\n\n model.getItemClass = function(item) {\n if (item.createdAt__ == item.updatedAt__) {\n return \"widget-item-new\";\n } else {\n return \"widget-item-updated\";\n }\n };\n\n ItemResource.query({\n primaryKey: 'latest',\n count: 20\n }, function(response) {\n model.items = response;\n callback(model);\n });\n };\n\n return GenericDashletFactory.create(config);\n }\n };\n\n})\n.factory('RubyOutputDashletFactory', function(WidgetDataModel, RubyScriptService) {\n function RubyOutputService() {}\n\n RubyOutputService.prototype = Object.create(WidgetDataModel.prototype);\n RubyOutputService.prototype.constructor = WidgetDataModel;\n\n angular.extend(RubyOutputService.prototype, {\n init: function() {\n var me = this;\n var widgetAttributes = me.widgetScope.widget.attrs; // this is where the custom Settings of the widget instance are stored!\n\n var model = {\n attributes: widgetAttributes\n };\n\n me.widgetScope.$watch(\"widget.attrs\", function(newValue, oldValue) {\n executeRubyScript();\n }, true);\n\n function executeRubyScript() {\n if (widgetAttributes && widgetAttributes.script) {\n RubyScriptService.executeScript(widgetAttributes.script)\n .then(function(data) {\n model.data = data;\n me.updateScope(model);\n });\n }\n }\n\n executeRubyScript();\n }\n });\n return RubyOutputService;\n})\n.factory('DocumentationDashletFactory', function($rootScope, WidgetDataModel) {\n function DocumentationDashletService() {}\n\n DocumentationDashletService.prototype = Object.create(WidgetDataModel.prototype);\n DocumentationDashletService.prototype.constructor = WidgetDataModel;\n\n angular.extend(DocumentationDashletService.prototype, {\n init: function() {\n var me = this;\n var widgetAttributes = me.widgetScope.widget.attrs; // this is where the custom Settings of the widget instance are stored!\n\n var model = {\n attributes: widgetAttributes,\n url: $rootScope.translate(\"DOCUMENTATION.DASHLET.URL\")\n };\n\n function setSize (data) {\n var newHeight = data ? data.height : parseInt(me.widgetScope.widget.size.height, 10);\n newHeight = newHeight - 35; // widget-content padding\n model.height = newHeight + 'px';\n }\n setSize();\n\n me.widgetScope.$on('widgetResized', function(event, data) {\n setSize(data);\n });\n\n me.updateScope(model);\n }\n });\n return DocumentationDashletService;\n})\n.factory('ItemsChangedPerDayFactory', function(GenericDashletFactory) {\n return {\n create: function(barConfig) {\n var config = angular.copy(barConfig || {});\n\n config.fetchData = function(callback) {\n var model = {\n data: [],\n };\n\n var barDataLoadedCallback = function(barData) {\n var options = barConfig.options;\n if (barData.xaxisTicks) {\n options.xaxis.ticks = barData.xaxisTicks;\n }\n\n model.data = barData.data;\n model.options = options;\n model.plotclick = barConfig.plotClick;\n callback(model);\n };\n\n barConfig.dataLoader = barConfig.loadStatisticsData;\n barConfig.dataLoader(barDataLoadedCallback);\n };\n\n return GenericDashletFactory.create(config);\n }\n };\n})\n.factory('StatisticsPieChartFactory', function($rootScope, StatisticsResource, PieChartFactory, $location, $translate) {\n return {\n create: function(pieConfig) {\n\n var loadStatisticsData = function(callback) {\n\n StatisticsResource.query({\n name: pieConfig.statisticsKey,\n limit: pieConfig.count || 20\n }, function(statistics) {\n\n statistics = statistics.filter(function(elem) {\n return elem.count > 0;\n });\n\n var data = statistics\n .map(function(elem, index) {\n return {\n label: elem.key,\n data: elem.count\n };\n });\n\n if (data.length === 1) {\n data.push({\n label: \"WIDGET.OTHER_VALUES\"\n });\n }\n\n callback(data);\n }, function(errorResponse) {\n callback({});\n });\n };\n\n pieConfig.dataLoader = loadStatisticsData;\n\n return PieChartFactory.create(pieConfig);\n }\n };\n})\n.factory('PieChartFactory', function($rootScope, $translate, GenericDashletFactory) {\n return {\n create: function(pieConfig) {\n\n var config = angular.copy(pieConfig || {});\n\n var translateFunction = config.labelTranslator || $translate.instant;\n\n var colors = config.colors || [\"#7AD09E\", \"#93EBE4\", \"#EAD5FA\", \"#FA9C9C\", \"#F8D972\", \"#4777AF\"];\n\n config.fetchData = function(callback) {\n\n var model = {\n data: []\n };\n\n model.plotclick = function(event, pos, obj) {\n if (!obj || !config.plotClick) {\n return;\n }\n $rootScope.$apply(function() {\n config.plotClick(obj);\n });\n };\n\n model.options = {\n series: {\n pie: {\n show: true,\n radius: 1,\n label: {\n show: true,\n radius: 1 / 2,\n formatter: function(label, series) {\n return '
    ' + series.data[0][1] + '
    ';\n }\n }\n }\n },\n grid: {\n hoverable: true,\n clickable: true\n },\n legend: {\n show: config.showLegend || false,\n labelFormatter: function(label, series) {\n var link = \"#\";\n if (config.linkFunction) {\n link = config.linkFunction(label);\n }\n return '' + translateFunction(label) + ' (' + series.data[0][1] +\n ')';\n }\n }\n };\n\n model.loading = true;\n\n var pieDataLoadedCallback = function(pieData) {\n\n pieData = pieData.map(function(elem, index) {\n elem.color = colors[index % colors.length];\n return elem;\n });\n\n model.loading = false;\n model.dataExisting = pieData.length > 0;\n model.data = pieData;\n\n callback(model);\n };\n\n pieConfig.dataLoader(pieDataLoadedCallback);\n\n };\n\n return GenericDashletFactory.create(config);\n }\n };\n})\n.factory('GenericDashletFactory', function($interval, WidgetDataModel) {\n return {\n create: function(config) {\n\n config = config || {};\n\n function GenericDashletFactory() {}\n\n GenericDashletFactory.prototype = Object.create(WidgetDataModel.prototype);\n GenericDashletFactory.prototype.constructor = WidgetDataModel;\n\n function genericLinkFunction(key) {\n return \"/browse?q=\" + key;\n }\n\n angular.extend(GenericDashletFactory.prototype, {\n init: function() {\n\n var me = this;\n\n function dataFetchedCallback(model) {\n me.updateScope(model);\n }\n config.fetchData(dataFetchedCallback);\n },\n\n destroy: function() {\n WidgetDataModel.prototype.destroy.call(this);\n }\n });\n\n return GenericDashletFactory;\n }\n };\n})\n.factory('NewsDashletFactory', function($rootScope, WidgetDataModel,$translate) {\n function NewsDashletService() {}\n\n NewsDashletService.prototype = Object.create(WidgetDataModel.prototype);\n NewsDashletService.prototype.constructor = WidgetDataModel;\n angular.extend(NewsDashletService.prototype, {\n init: function() {\n var me = this;\n var widgetAttributes = me.widgetScope.widget.attrs; // this is where the custom Settings of the widget instance are stored!\n\n var model = {\n attributes: widgetAttributes,\n updateUrl: function(index) {\n this.attributes.selectedUrl = $rootScope.translate(\"DASHLET.NEWS.URL.\" + index,\"\");\n }\n };\n\n function setSize (data) {\n var newHeight = data ? data.height : parseInt(me.widgetScope.widget.size.height, 10);\n newHeight = newHeight - 35; // widget-content padding\n model.height = newHeight + 'px';\n }\n setSize();\n me.widgetScope.$on('widgetResized', function(event, data) {\n setSize(data);\n });\n\n me.updateScope(model);\n }\n });\n return NewsDashletService;\n})\n.factory('PublicationsByDestinationsFactory', function($q, $rootScope, $translate, CommunicationChannelService, GenericDashletFactory, ReviewsAndPublicationsDashletService, StatisticsResource) {\n function getGridOptions() {\n var columnDefs = [{\n field: 'destination',\n displayName: $translate.instant('WIDGET.PUBLICATIONS.DESTINATION'),\n headerTooltip: true,\n width: '*',\n cellTemplate:\n '
    ' +\n '{{row.entity.destination}}' +\n '
    '\n },\n {\n field: 'total_published',\n displayName: $translate.instant('WIDGET.PUBLICATIONS.ITEMS_PUBLISHED'),\n headerTooltip: true,\n width: '*',\n headerCellClass: 'text-center',\n cellTemplate:\n ''\n },\n {\n field: 'total_dirty_publications',\n displayName: $translate.instant('WIDGET.PUBLICATIONS.ITEMS_DIRTY'),\n headerTooltip: true,\n width: '*',\n headerCellClass: 'text-center',\n cellTemplate:\n ''\n },\n {\n field: 'active_publications',\n displayName: $translate.instant('WIDGET.PUBLICATIONS.ITEMS_ACTIVE'),\n headerTooltip: true,\n width: '*',\n headerCellClass: 'text-center',\n cellTemplate:\n ''\n }\n ];\n\n return {\n data: 'gridModel',\n enableColumnMenus: false,\n columnDefs: columnDefs,\n enableColumnResize: true,\n rowHeight: 34\n };\n }\n\n return {\n create: function(config, resource) {\n config = config || {};\n config.fetchData = function(callback) {\n var model = {\n publications: [], // Actual publications\n gridModel: [], // Actual publications + dummy parent channel entries\n gridDataVar: 'gridModel',\n gridOptions: getGridOptions()\n };\n\n CommunicationChannelService.loadPublicationDestinations({\n 'publicationMode' : 'PUBLISH'\n }).then(function(response) {\n var allQueries = [];\n var dimensionMap = {};\n\n if (response.communicationChannels) {\n allQueries = ReviewsAndPublicationsDashletService.getReviewStatisticsForChannels(response.communicationChannels, dimensionMap);\n }\n\n if (response.organizations) {\n allQueries = allQueries.concat(ReviewsAndPublicationsDashletService.getReviewStatisticsForOrganizations(response.organizations, dimensionMap));\n }\n\n StatisticsResource.query({\n name: '__publications_statistic'\n }, function(response) {\n var publicationEntry = [];\n response.forEach(function(item) {\n var dimension = item.dimension; // format: ]>\n var destination = dimensionMap[dimension];\n if (!_.isNil(destination)) {\n var existingItem = publicationEntry.find(function(element) {\n return element.destinationId == dimension;\n });\n\n if (existingItem) {\n // If the found item was a formerly created dummy entry, convert it to a regular one\n if (existingItem.isDummyEntry) {\n existingItem.isDummyEntry = false;\n existingItem.active = 0;\n existingItem.published = 0;\n existingItem.dirty = 0;\n\n StatisticsResource.query({\n name: '__compliance_statistic'\n }, function(response) {\n var published = _.find(response, { 'key': 'published' });\n existingItem.total_published_bar_width = ((existingItem.published/published.count) * 100).toFixed(1);\n existingItem.total_dirty_published_bar_width = ((existingItem.dirty/published.count) * 100).toFixed(1);\n });\n\n }\n existingItem[item.key] = item.count;\n } else {\n var newItem = {\n destination: destination.name,\n destinationId: dimension,\n active : 0,\n published:0,\n dirty: 0\n };\n newItem[item.key] = item.count;\n if (destination.subDestinationKey) {\n newItem.shouldBeDrawnAsSubDestination = true;\n if(!ReviewsAndPublicationsDashletService.isParentChannelInCollection(publicationEntry, destination)) {\n // Add dummy parent channel entry, if there isn't one.\n publicationEntry.push({\n destination: destination.name,\n destinationId: destination.id,\n isDummyEntry: true\n });\n }\n newItem.destination = destination.subDestinationLabel + ' (' + destination.subDestinationKey + ')';\n }\n\n StatisticsResource.query({\n name: '__compliance_statistic'\n }, function(response) {\n var published = _.find(response, { 'key': 'published' });\n newItem.total_published_bar_width = ((newItem.published/published.count) * 100).toFixed(1);\n newItem.total_dirty_published_bar_width = ((newItem.dirty/published.count) * 100).toFixed(1);\n });\n\n publicationEntry.push(newItem);\n }\n }\n });\n\n publicationEntry.sort(function(a,b) {\n destId1 = String(a.destinationId);\n destId2 = String(b.destinationId);\n return destId1.localeCompare(destId2);\n });\n\n model.publications = publicationEntry;\n model.gridModel = publicationEntry;\n callback(model);\n });\n });\n };\n return GenericDashletFactory.create(config);\n }\n };\n})\n.factory('ReviewsFactory', function($q, $rootScope, $translate, CommunicationChannelService, GenericDashletFactory, ReviewsAndPublicationsDashletService, StatisticsResource) {\n var reviewStatusMap = {\n RECEIVED: 'REVIEW.RECEIVED',\n REVIEWED: 'REVIEW.REVIEWED',\n APPROVED: 'REVIEW.APPROVED',\n REJECTED: 'REVIEW.REJECTED'\n };\n\n function getGridOptions() {\n var columnDefs = [{\n field: 'reviewer',\n displayName: $translate.instant('WIDGET.REVIEWS.REVIEWER'),\n headerTooltip: true,\n cellTooltip: true,\n width: '*',\n cellTemplate:\n '
    ' +\n '{{row.entity.reviewer}}' +\n '
    '\n }];\n\n _.forEach(reviewStatusMap, function(label, status) {\n var href;\n if (status === 'total_published') {\n href = '/browse?publicationDestination={{row.entity.destinationId}}';\n } else {\n href = '/browse?reviewer={{row.entity.destinationId}}&&reviewStatus=' + status.toUpperCase();\n }\n\n var cellTemplate =\n '
    ' +\n '
    ' +\n '-' +\n '
    ' +\n '' +\n '
    ';\n columnDefs.push({\n field: status,\n displayName: $translate.instant(label),\n headerTooltip: true,\n width: '*',\n headerCellClass: 'text-center',\n cellTemplate : cellTemplate\n });\n });\n\n return {\n data: 'gridModel',\n enableColumnMenus: false,\n columnDefs: columnDefs,\n enableColumnResize: true,\n rowHeight: 34\n };\n }\n\n return {\n create: function(config, resource) {\n config = config || {};\n config.fetchData = function(callback) {\n var model = {\n reviewsByDimension: [], // Actual publications\n gridModel: [], // Actual publications + dummy parent channel entries\n gridDataVar: 'gridModel',\n gridOptions: getGridOptions()\n };\n var columnDefs = model.gridOptions.columnDefs;\n\n CommunicationChannelService.loadPublicationDestinations({\n 'publicationMode' : 'PUBLISH'\n }).then(function(response) {\n var allQueries = [];\n var dimensionMap = {};\n var reviewEntries = [];\n\n if (response.communicationChannels) {\n allQueries = ReviewsAndPublicationsDashletService.getReviewStatisticsForChannels(response.communicationChannels, dimensionMap);\n }\n if (response.organizations) {\n allQueries = allQueries.concat(ReviewsAndPublicationsDashletService.getReviewStatisticsForOrganizations(response.organizations, dimensionMap));\n }\n\n $q.all(allQueries).then(function(allResponses) {\n _.forEach(allResponses, function(statisticsByDimensions) {\n if (!_.isEmpty(statisticsByDimensions)) {\n var dimension = statisticsByDimensions[0].dimension;\n var destination = dimensionMap[dimension];\n var dimensionEntry = {\n reviewer: destination.name,\n destinationId: dimension,\n total_reviews: 0,\n APPROVED: 0,\n RECEIVED: 0,\n REJECTED: 0,\n REVIEWED: 0\n };\n\n if (destination.subDestinationKey) {\n dimensionEntry.shouldBeDrawnAsSubDestination = true;\n if(!ReviewsAndPublicationsDashletService.isParentChannelInCollection(reviewEntries, destination)) {\n // Add dummy parent channel entry, if there isn't one.\n reviewEntries.push({\n reviewer: destination.name,\n destinationId: destination.id,\n isDummyEntry: true\n });\n }\n dimensionEntry.reviewer = destination.subDestinationLabel + ' (' + destination.subDestinationKey + ')';\n }\n _.forEach(statisticsByDimensions, function(statistic) {\n dimensionEntry[statistic.key] = statistic.count;\n });\n\n _.forEach(dimensionEntry, function(columnValue, columnKey) {\n if (columnKey in reviewStatusMap) {\n dimensionEntry[columnKey + '_bar_width'] = ((columnValue/dimensionEntry.total_published) * 100).toFixed(1);\n }\n });\n\n reviewEntries.push(dimensionEntry);\n }\n });\n\n var sumForEachReviewStatus = ReviewsAndPublicationsDashletService.calculateSumOfReviewsStatus(reviewEntries, reviewStatusMap);\n\n var COLUMN_REVIEWER = 0;\n columnDefs[COLUMN_REVIEWER].displayName += ' (' + model.reviewsByDimension.length + ')';\n\n _.forEach(columnDefs, function(column) {\n if (column.field in reviewStatusMap && column.field in sumForEachReviewStatus) {\n column.displayName += ' (' + sumForEachReviewStatus[column.field] + ')';\n }\n });\n\n reviewEntries.sort(function(a,b) {\n destId1 = String(a.destinationId);\n destId2 = String(b.destinationId);\n return destId1.localeCompare(destId2);\n });\n\n model.reviewsByDimension = reviewEntries;\n model.gridModel = reviewEntries;\n\n callback(model);\n });\n });\n };\n return GenericDashletFactory.create(config);\n }\n };\n});\n\n// Dashlet Services and Wrappers\nangular.module('llax')\n .service('ReviewsAndPublicationsDashletService', function(StatisticsResource) {\n function getReviewStatisticsQuery(dimension) {\n return StatisticsResource.query({\n name: '__review_statistic',\n dimension: dimension\n }).$promise;\n }\n\n this.getReviewStatisticsForChannels = function(channels, dimensionMap) {\n var promises = [];\n _.forEach(channels, function(channel) {\n var key = channel.id;\n if (!_.isNil(channel.subDestinationKey)) {\n key = channel.id + ':' + channel.subDestinationKey;\n }\n dimensionMap[key] = channel;\n promises.push(getReviewStatisticsQuery(key));\n });\n return promises;\n };\n\n this.getReviewStatisticsForOrganizations = function(organizations, dimensionMap) {\n var promises = [];\n _.forEach(organizations, function(organization) {\n var key = organization.organizationId;\n dimensionMap[key] = organization;\n promises.push(getReviewStatisticsQuery(key));\n });\n return promises;\n };\n\n this.calculateSumOfReviewsStatus = function(reviews, reviewStatusMap) {\n return _.reduce(reviews, function(result, review) {\n _.forEach(reviewStatusMap, function(reviewLabel, reviewStatus) {\n if (reviewStatus in review) {\n if (!result[reviewStatus]) {\n result[reviewStatus] = 0;\n }\n result[reviewStatus] += review[reviewStatus];\n }\n });\n return result;\n }, {});\n };\n\n this.isParentChannelInCollection = function(publications, destination) {\n var isPresent = false;\n _.forEach(publications, function(publication) {\n if (publication.destinationId == destination.id) {\n isPresent = true;\n }\n });\n return isPresent;\n };\n });\n\nangular.module('llax')\n .directive('wtLatestItems', function() {\n return {\n restrict: 'A',\n replace: true,\n templateUrl: 'tpl/dashlets/latest-items-widget.tpl.html',\n scope: {\n value: '=value'\n }\n };\n })\n .directive('wtDocumentation', function() {\n return {\n restrict: 'A',\n replace: true,\n templateUrl: 'tpl/dashlets/documentation-widget.tpl.html',\n scope: {\n value: '=value'\n }\n };\n })\n .directive('wtRubyOutput', function() {\n return {\n restrict: 'A',\n replace: true,\n templateUrl: 'tpl/dashlets/ruby-widget.tpl.html',\n scope: {\n value: '=value'\n }\n };\n })\n .directive('wtComplianceStatistics', function() {\n return {\n restrict: 'A',\n replace: true,\n templateUrl: 'tpl/dashlets/compliancestatistics.tpl.html',\n scope: {\n value: '=value'\n }\n };\n })\n .directive('wtPieChart', function() {\n return {\n restrict: 'A',\n replace: true,\n templateUrl: 'tpl/dashlets/generic-pie-chart-widget.tpl.html',\n scope: {\n value: '=value'\n }\n };\n })\n .directive('wtGenericListView', function() {\n return {\n restrict: 'A',\n replace: true,\n templateUrl: 'tpl/dashlets/generic-list-view.tpl.html',\n scope: {\n value: '=value'\n }\n };\n })\n .directive('wtNews', function() {\n return {\n restrict: 'A',\n replace: true,\n templateUrl: 'tpl/dashlets/news-widget.tpl.html',\n scope: {\n value: '=value'\n }\n };\n })\n .directive('wtMyTasks', function() {\n return {\n restrict: 'A',\n replace: true,\n templateUrl: 'tpl/dashlets/my-tasks.tpl.html',\n scope: {\n value: '=value'\n }\n };\n })\n .directive('gridWidget', function() {\n return {\n restrict: 'A',\n replace: true,\n templateUrl: 'tpl/dashlets/publications-by-destinations.tpl.html',\n scope: {\n value: '=value'\n },\n link: function(scope, elem, attrs, ngModelCtrl) {\n scope.$watch('value', function(newValue, oldValue) {\n if (!_.isNil(newValue) && !_.isNil(scope.value) && !_.isNil(scope.value.gridDataVar)) {\n if (!_.isEmpty(scope.value[scope.value.gridDataVar])) {\n scope[scope.value.gridDataVar] = scope.value[scope.value.gridDataVar];\n scope.gridOptions = scope.value.gridOptions;\n scope.value.dataExisting = true;\n } else {\n scope.value.dataExisting = false;\n }\n }\n }, true);\n }\n };\n })\n .directive('widget', function($timeout, $window) {\n return {\n restrict: 'A',\n priority: 1,\n link: function(scope, $element, attrs) {\n var widgetContainer = jQuery($element).find('.widget-content');\n var containerScope = angular.element(widgetContainer).scope();\n // overriding vertical resize functionality\n containerScope.grabSouthResizer = function(e) {\n var widgetElm = $element.find('.widget');\n\n // ignore middle- and right-click\n if (e.which !== 1) {\n return;\n }\n e.stopPropagation();\n e.originalEvent.preventDefault();\n\n // get the starting horizontal position\n var initY = e.clientY;\n\n // Get the current width of the widget and dashboard\n var pixelWidth = widgetElm.width();\n var pixelHeight = widgetElm.height();\n\n // create marquee element for resize action\n var $marquee = angular.element('
    ');\n widgetElm.append($marquee);\n\n // updates marquee with preview of new height\n var mousemove = function(e) {\n var curY = e.clientY;\n var pixelChange = curY - initY;\n var newHeight = pixelHeight + pixelChange;\n $marquee.css('height', newHeight + 'px');\n };\n\n // sets new widget width on mouseup\n var mouseup = function(e) {\n // remove listener and marquee\n jQuery($window).off('mousemove', mousemove);\n $marquee.remove();\n\n // calculate height change\n var curY = e.clientY;\n var pixelChange = curY - initY;\n\n var diff = pixelChange;\n var widgetContainer = widgetElm.find('.widget-content');\n var height = parseInt(widgetContainer.outerHeight(), 10);\n var newHeight = (height + diff);\n var roundHeighht = 20 * Math.round(newHeight / 20);\n\n var chartEl = widgetContainer.find('.chart-div');\n if (chartEl[0]) {\n var divHt = chartEl.height();\n chartEl.css('height',(divHt+diff)+ 'px');\n }\n\n containerScope.widget.setHeight(roundHeighht + 'px');\n\n containerScope.$emit('widgetChanged', containerScope.widget);\n containerScope.$apply(); // make AngularJS to apply style changes\n\n containerScope.$broadcast('widgetResized', {\n height: roundHeighht\n });\n };\n jQuery($window).on('mousemove', mousemove).one('mouseup', mouseup);\n };\n\n // overriding horizantal resize functionality\n containerScope.grabResizer = function(e) {\n var widget = containerScope.widget;\n var widgetElm = $element.find('.widget');\n\n // ignore middle- and right-click\n if (e.which !== 1) {\n return;\n }\n\n e.stopPropagation();\n e.originalEvent.preventDefault();\n\n // get the starting horizontal position\n var initX = e.clientX;\n\n // Get the current width of the widget and dashboard\n var pixelWidth = widgetElm.width();\n var pixelHeight = widgetElm.height();\n var widgetStyleWidth = widget.containerStyle.width;\n var widthUnits = widget.widthUnits;\n var unitWidth = parseFloat(widgetStyleWidth);\n\n // create marquee element for resize action\n var $marquee = angular.element('
    ');\n widgetElm.append($marquee);\n\n // determine the unit/pixel ratio\n var transformMultiplier = unitWidth / pixelWidth;\n\n // updates marquee with preview of new width\n var mousemove = function(e) {\n var curX = e.clientX;\n var pixelChange = curX - initX;\n var newWidth = pixelWidth + pixelChange;\n $marquee.css('width', newWidth + 'px');\n };\n\n // sets new widget width on mouseup\n var mouseup = function(e) {\n // remove listener and marquee\n jQuery($window).off('mousemove', mousemove);\n $marquee.remove();\n\n // calculate change in units\n var curX = e.clientX;\n var pixelChange = curX - initX;\n var unitChange = Math.round(pixelChange * transformMultiplier * 100) / 100;\n\n // add to initial unit width\n var newWidth = unitWidth * 1 + unitChange;\n var roundWidth = 2 * Math.round(newWidth / 2);\n widget.setWidth(roundWidth + widthUnits);\n containerScope.$emit('widgetChanged', widget);\n containerScope.$apply();\n containerScope.$broadcast('widgetResized', {\n width: roundWidth\n });\n };\n\n jQuery($window).on('mousemove', mousemove).one('mouseup', mouseup);\n };\n }\n };\n });\n","angular.module('llax')\n .service('DateTimeHelperService', function() {\n\n this.convertToTimestamp = function(input) {\n\n if (isNaN(input)) {\n // It's an ISO date string\n var dateTime = new Date(input);\n return this.getTimestampFromDate(dateTime);\n } else if (_.isDate(input)) {\n // It's a date object\n return this.getTimestampFromDate(input);\n } else {\n // We default to having the timestamp as is\n return input;\n }\n };\n\n // Convert a date to timestamp without seconds (last 3 digits)\n this.getTimestampFromDate = function(date) {\n date.setSeconds(0, 0);\n return Math.floor(date.getTime() / 1000);\n };\n\n // Convert a timestamp without seconds (last 3 digits) to a date object\n this.getDateFromTimestamp = function(timestamp) {\n timestamp = timestamp + '000';\n return new Date(_.toNumber(timestamp));\n };\n });","angular.module('llax')\n .service('LocalCacheService', function($log, $q, $rootScope) {\n\n var _this = this;\n _this.initialized = false;\n\n //*** Please keep the DB config in sync with useIndexedDB hook in the react app.\n var SCHEMA_VERSION = 4;\n var DATABASE_NAME = 'bManagedCacheStore';\n var db = null;\n var DBOpenRequest = window.indexedDB.open(DATABASE_NAME, SCHEMA_VERSION);\n\n this.STORES = {\n optionLists: {\n objectStoreName: 'optionLists',\n keys: ['name', 'dataModelHash'],\n indexes: {\n optionListName: 'name'\n }\n },\n translations: {\n objectStoreName: 'translations',\n keys: ['languageKey'],\n indexes: {\n languageKey: 'languageKey'\n }\n },\n additionalCategories: {\n objectStoreName: 'additionalCategories',\n keys: ['additionalModule', 'additionalCategoryNameOrCode', 'dataModelHash'],\n indexes: {\n additionalCategoryNameOrCode: 'additionalCategoryNameOrCode'\n }\n }\n };\n\n DBOpenRequest.onsuccess = function(event) {\n $log.debug('LocalCacheService: Created IndexedDB database.');\n\n db = DBOpenRequest.result;\n _this.initialized = true;\n\n // Shared database object with React app\n window.__IDB = db;\n };\n\n DBOpenRequest.onupgradeneeded = function(event) {\n // We can only create object stores in this step, so change the SCHEMA_VERSION every time you change\n // this function (adding new stores or indexes), otherwise `onupgradeneeded` won't be invoked.\n // Make sure to drop any object stores that were introduced in previous versions.\n db = event.target.result;\n\n db.onerror = function(event) {\n $log.error('LocalCacheService: Error loading IndexedDB database.', event);\n };\n\n var optionListsNeedMigration = db.objectStoreNames.contains(_this.STORES.optionLists.objectStoreName);\n var translationsNeedMigration = db.objectStoreNames.contains(_this.STORES.translations.objectStoreName);\n var additionalCategoriesNeedMigration =\n db.objectStoreNames.contains(_this.STORES.additionalCategories.objectStoreName);\n\n if (optionListsNeedMigration) {\n db.deleteObjectStore(_this.STORES.optionLists.objectStoreName);\n }\n if (translationsNeedMigration) {\n db.deleteObjectStore(_this.STORES.translations.objectStoreName);\n }\n if (additionalCategoriesNeedMigration) {\n db.deleteObjectStore(_this.STORES.additionalCategories.objectStoreName);\n }\n\n optionListsObjectStore = db.createObjectStore(_this.STORES.optionLists.objectStoreName, {\n keyPath: _this.STORES.optionLists.keys\n });\n optionListsObjectStore.createIndex(_this.STORES.optionLists.indexes.optionListName,\n _this.STORES.optionLists.indexes.optionListName,\n { unique: false });\n translationsObjectStore = db.createObjectStore(_this.STORES.translations.objectStoreName, {\n keyPath: _this.STORES.translations.keys\n });\n translationsObjectStore.createIndex(_this.STORES.translations.indexes.languageKey,\n _this.STORES.translations.indexes.languageKey,\n { unique: false });\n\n var additionalCategoriesObjectStore = db.createObjectStore(_this.STORES.additionalCategories.objectStoreName, {\n keyPath: _this.STORES.additionalCategories.keys\n });\n additionalCategoriesObjectStore.createIndex(_this.STORES.additionalCategories.indexes.additionalCategoryNameOrCode,\n _this.STORES.additionalCategories.indexes.additionalCategoryNameOrCode,\n { unique: false });\n };\n\n this.isInitialized = function() {\n return _this.initialized;\n };\n\n this.insertEntryAsync = function(storeName, key, entry) {\n\n var deferred = $q.defer();\n\n if (!_this.initialized) {\n $log.error('LocalCacheService: Premature call to insertEntryAsync()', storeName, key, entry);\n deferred.reject();\n return deferred.promise;\n }\n\n var transaction, objectStore, request;\n try {\n transaction = db.transaction([storeName], 'readwrite');\n objectStore = transaction.objectStore(storeName);\n entry.translatedLanguage = $rootScope.language;\n request = objectStore.add(entry);\n } catch (exception) {\n $log.error('LocalCacheService: insertEntryAsync():', key, exception);\n deferred.resolve(null);\n return deferred.promise;\n }\n\n request.onsuccess = function(event) {\n $log.debug('LocalCacheService: Successfully inserted entry with key', key);\n deferred.resolve();\n };\n\n request.onerror = function(event) {\n $log.error('LocalCacheService: Error while trying to insert an entry', event);\n deferred.reject();\n };\n\n return deferred.promise;\n };\n\n this.deleteEntryAsync = function(storeName, key) {\n\n var deferred = $q.defer();\n\n if (!_this.initialized) {\n $log.error('LocalCacheService: Premature call to deleteEntryAsync()', storeName, key);\n deferred.reject();\n return deferred.promise;\n }\n\n var transaction, objectStore, request;\n try {\n transaction = db.transaction([storeName], 'readwrite');\n objectStore = transaction.objectStore(storeName);\n\n request = objectStore.delete(key);\n } catch (exception) {\n $log.error('LocalCacheService: deleteEntryAsync():', key, exception);\n deferred.resolve(null);\n return deferred.promise;\n }\n\n request.onsuccess = function(event) {\n $log.debug('LocalCacheService: Successfully deleted entry with key', key);\n deferred.resolve(request.result);\n };\n\n request.onerror = function(event) {\n $log.error('LocalCacheService: Error while trying to delete an entry with key', key, event);\n deferred.reject();\n };\n\n return deferred.promise;\n };\n\n this.deleteEntriesByIndexAsync = function(storeName, indexName, key) {\n\n var deferred = $q.defer();\n\n if (!_this.initialized) {\n $log.error('LocalCacheService: Premature call to deleteEntriesByIndexAsync()', storeName, indexName, key);\n deferred.reject();\n return deferred.promise;\n }\n\n var index, transaction, objectStore, cursorRequest;\n try {\n transaction = db.transaction([storeName], 'readwrite');\n objectStore = transaction.objectStore(storeName);\n index = objectStore.index(indexName);\n\n cursorRequest = index.openKeyCursor(IDBKeyRange.only(key));\n } catch (exception) {\n $log.error('LocalCacheService: deleteEntriesByIndexAsync():', indexName, key, exception);\n deferred.resolve(null);\n return deferred.promise;\n }\n\n cursorRequest.onsuccess = function(event) {\n var cursor = cursorRequest.result;\n if (!_.isNil(cursor)) {\n objectStore.delete(cursor.primaryKey);\n cursor.continue();\n } else {\n deferred.resolve(null);\n }\n };\n\n cursorRequest.onerror = function(event) {\n $log.error('LocalCacheService: deleteEntriesByIndexAsync()', key, event);\n deferred.resolve(null);\n };\n\n return deferred.promise;\n };\n\n this.getEntryAsync = function(storeName, key) {\n\n var deferred = $q.defer();\n\n if (!_this.initialized) {\n $log.error('LocalCacheService: Premature call to getEntryAsync()', storeName, key);\n\n // Resolve as a cache miss\n deferred.resolve(null);\n return deferred.promise;\n }\n\n var transaction, objectStore, request;\n try {\n transaction = db.transaction([storeName]);\n objectStore = transaction.objectStore(storeName);\n\n request = objectStore.get(key);\n } catch (exception) {\n $log.error('LocalCacheService: getEntryAsync():', key, exception);\n deferred.resolve(null);\n return deferred.promise;\n }\n\n request.onsuccess = function(event) {\n var result = request.result;\n if (_.isNil(result)) {\n $log.debug('LocalCacheService: Cache miss for key', key);\n deferred.resolve(null);\n } else {\n $log.debug('LocalCacheService: Cache hit for key', key);\n deferred.resolve(result);\n }\n };\n\n request.onerror = function(event) {\n // Error event is fired even for non-existing keys\n $log.debug('LocalCacheService: Cache miss for key', key, event);\n\n // Resolve as a cache miss instead of throwing an error, makes it\n // easier for callers to handle cache misses or errors.\n deferred.resolve(null);\n };\n\n return deferred.promise;\n };\n\n this.clearAllByStoreNameAsync = function(storeName) {\n var deferred = $q.defer();\n var transaction, objectStore, cursorRequest;\n\n if (!_this.initialized) {\n $log.error('LocalCacheService: Premature call to clearAllByStoreNameAsync()', storeName);\n deferred.reject();\n return deferred.promise;\n }\n\n try {\n transaction = db.transaction([storeName], 'readwrite');\n objectStore = transaction.objectStore(storeName);\n // Open a cursor to iterate through all entries in the object store\n cursorRequest = objectStore.openCursor();\n } catch (exception) {\n $log.error('LocalCacheService: clearAllByStoreNameAsync() - Error during the transaction:', exception);\n deferred.resolve(null);\n return deferred.promise;\n }\n cursorRequest.onsuccess = function(event) {\n var cursor = event.target.result;\n if (cursor) {\n // Delete each entry in the object store\n objectStore.delete(cursor.primaryKey);\n cursor.continue();\n } else {\n // All entries have been deleted, resolve the promise\n $log.debug('LocalCacheService: Successfully cleared all entries in store:', storeName);\n deferred.resolve();\n }\n };\n cursorRequest.onerror = function(event) {\n $log.error('LocalCacheService: clearAllByStoreNameAsync() - Error during cursor request:', event);\n deferred.resolve(null);\n };\n return deferred.promise;\n };\n\n this.waitForDBInitialization = function() {\n var deferred = $q.defer();\n if (_this.initialized) {\n deferred.resolve();\n } else {\n var interval = setInterval(function() {\n if (_this.initialized) {\n clearInterval(interval);\n deferred.resolve();\n }\n }, 500); // Check every 500 milliseconds\n }\n return deferred.promise;\n };\n });\n","angular.module('llax.services', ['llax.realtimeProvider', 'ngResource'])\n.service('Auth', function($q, $rootScope, LogoutResource, OrganizationService, UserDetails, CheckNotifications) {\n\n var user = null;\n var organization = null;\n var userRoles = null;\n var self = this;\n\n this.ALL = '*';\n this.ANY = '?';\n this.OBJECT_TYPE_UI = 'ui';\n this.OBJECT_TYPE_ITEMS = 'items';\n this.OBJECT_TYPE_COMMUNICATION_CHANNELS = 'communication_channels';\n this.OBJECT_TYPE_CONTACT = 'contacts';\n this.OBJECT_TYPE_DATAMODEL = 'datamodel';\n this.OBJECT_TYPE_TASK_LISTS = 'taskLists';\n this.OBJECT_TYPE_ENHANCED_CONTENTS = 'enhancedContents';\n\n this.CONTEXT_DEFAULT_VALUE = \"__default_value__\";\n\n this.isLoggedIn = false;\n\n this.userDetails = function () {\n var deferred = $q.defer();\n if (organization && user) {\n deferred.resolve({organization: organization, user: user, userRoles: userRoles});\n } else {\n UserDetails.get(function(response) {\n organization = response.organization;\n user = response.loginAccount;\n userRoles = response.roles;\n OrganizationService.setOrganization(organization);\n $rootScope.user = user;\n $rootScope.user.isLoggedIn = true;\n $rootScope.userId = user.userId;\n deferred.resolve(user);\n self.isLoggedIn = true;\n $rootScope.refreshTranslations();\n $rootScope.$broadcast(\"userRolesLoaded\");\n $rootScope.$broadcast(\"userLoggedIn\");\n CheckNotifications.get({}, function(response) {\n $rootScope.newNotifications = response.hasNewNotifications;\n });\n },function(errorReason) {\n user = null;\n userRoles = null;\n self.isLoggedIn = false;\n $rootScope.user = null;\n deferred.reject(errorReason);\n });\n }\n\n return deferred.promise;\n };\n\n this.logout = function(callback) {\n return LogoutResource.save({}, function(response, headers) {\n user = null;\n userRoles = null;\n organization = null;\n self.isLoggedIn = false;\n if (_.isFunction(callback)) {\n callback(response, headers);\n }\n }).$promise;\n };\n\n this.hasLicensedFeature = function(feature) {\n var deferred = $q.defer();\n OrganizationService.getOrganization().subscribe(function(organization) {\n var hasFeature = $rootScope.hasLicensedFeature(feature, organization);\n if (hasFeature) {\n deferred.resolve(feature);\n } else {\n deferred.reject();\n }\n });\n return deferred.promise;\n };\n\n this.hasSettingFeature = function(feature) {\n var deferred = $q.defer();\n OrganizationService.getOrganization().subscribe(function(organization) {\n var hasFeature = $rootScope.hasSettingFeature(feature, organization);\n if (hasFeature) {\n deferred.resolve(feature);\n } else {\n deferred.reject();\n }\n });\n return deferred.promise;\n };\n\n /**\n * Deprecated. Please use 'Auth.hasPermission(Auth.OBJECT_TYPE_UI, rights)' instead!\n */\n this.hasRights = function(rights) {\n return self.hasPermission(self.OBJECT_TYPE_UI, rights);\n };\n\n this.hasItemPermission = function(action, item) {\n return self.hasPermission(self.OBJECT_TYPE_ITEMS, action, item);\n };\n\n this.hasChannelPermission = function(action, channel) {\n return self.hasPermission(self.OBJECT_TYPE_COMMUNICATION_CHANNELS, action, channel);\n };\n\n this.hasSubDestinationPermission = function(action, channel) {\n return self.hasPermission(self.OBJECT_TYPE_EDIT_SUB_DESTINATION, action, channel);\n };\n\n this.hasContactPermission = function(action, contact) {\n return self.hasPermission(self.OBJECT_TYPE_CONTACT, action, contact);\n };\n\n this.hasTaskListPermission = function(action, contact) {\n return self.hasPermission(self.OBJECT_TYPE_TASK_LISTS, action, contact);\n };\n\n this.hasPermission = function(objectType, action, context) {\n\n if (_.isEmpty(userRoles)) {\n return false;\n }\n\n for (var i = 0; i < userRoles.length; i++) {\n if (hasRolePermission(userRoles[i], objectType, action, context)) {\n return true;\n }\n }\n\n return false;\n };\n\n this.hasDeniedOrganizationRoles = function(organizationRolesDenied) {\n return _.includes(organizationRolesDenied, organization.organizationRole);\n };\n\n this.hasAnyPermission = function(objectType, actions, context) {\n if (context) {\n context[self.CONTEXT_DEFAULT_VALUE] = self.ANY;\n }\n if (_.isArray(actions)) {\n for (var i = 0; i < actions.length; i++) {\n if (self.hasPermission(objectType, actions[i], context)) {\n return true;\n }\n }\n return false;\n } else {\n return self.hasPermission(objectType, actions, context);\n }\n };\n\n function hasRolePermission(role, objectType, action, context) {\n\n var permission;\n\n // Find the first matching permission in reverse(!) order\n for (var i = role.permissions.length - 1; i >= 0; i--) {\n permission = role.permissions[i];\n if (matchesPermission(permission, objectType, action, context)) {\n return permission.allowed;\n }\n }\n\n return false;\n }\n\n function matchesPermission(permission, objectType, action, context) {\n\n if (!matchesValue(permission.allowed, permission.objectType, objectType)) {\n return false;\n }\n\n if (!matchesValue(permission.allowed, permission.actions, action)) {\n return false;\n }\n\n if (!_.isEmpty(permission.context) && !_.isNil(context)) {\n var value, testValue, defaultValue;\n defaultValue = context[self.CONTEXT_DEFAULT_VALUE];\n for (var key in permission.context) {\n value = permission.context[key];\n testValue = context[key] || defaultValue;\n if (!matchesValue(permission.allowed, value, testValue)) {\n return false;\n }\n }\n }\n\n return true;\n }\n\n function matchesValue(allowed, value, testValue) {\n\n var matches = false;\n\n if (_.isNil(value) || value === self.ALL || (allowed && testValue === self.ANY) || _.isEqual(value, testValue)) {\n matches = true;\n } else if (_.isArray(value)) {\n if (_.includes(value, self.ALL)) {\n matches = true;\n } else if (_.isArray(testValue)) {\n matches = (allowed && _.includes(testValue, self.ANY)) || _.intersection(value, testValue).length > 0;\n } else if (_.isObject(testValue)){\n matches = true;\n _.forEach(value, function(property) {\n for (var key in property) {\n var partialMatch = _.isMatch(testValue, property) || matchesValue(allowed, property[key], testValue[key]) ;\n matches = (!matches || !partialMatch)? false: true;\n }\n });\n } else {\n matches = (allowed && testValue === self.ANY) || _.includes(value, testValue);\n }\n }\n\n return matches;\n }\n\n})\n.factory('EtagLoader', function($log, $q, $window, HttpHeader, HttpStatus) {\n var EtagLoader = function(tag_key, data_key) {\n\n var self = this;\n var storage = $window.localStorage;\n\n this.loadDataByResource = function(resource, parameters, loadFunction, restoreFunction, errorFunction) {\n\n var tag = storage.getItem(tag_key);\n var data = angular.fromJson(storage.getItem(data_key));\n\n var requestHeader = {};\n if (!_.isEmpty(tag) && !_.isEmpty(data)) {\n requestHeader[HttpHeader.IF_NONE_MATCH] = tag;\n }\n\n var deferred = $q.defer();\n\n resource(requestHeader).get(parameters || {},\n function(response, headers) {\n tag = headers(HttpHeader.ETAG);\n data = response.toJSON();\n if (loadFunction) {\n loadFunction(tag, data, self);\n }\n deferred.resolve(tag, data, self);\n },\n function(errorReason) {\n if (errorReason.status === HttpStatus.NOT_MODIFIED) {\n if (restoreFunction) {\n restoreFunction(tag, data, self);\n }\n deferred.resolve(tag, data, self);\n } else {\n if (errorFunction) {\n errorFunction(errorReason, self);\n }\n deferred.reject(errorReason, self);\n }\n }\n );\n\n return deferred.promise;\n };\n\n this.storeData = function(tag, data) {\n try {\n storage.setItem(tag_key, tag);\n storage.setItem(data_key, angular.toJson(data));\n } catch (e) {\n $log.error(\"Could not store data! Please clear cache or increase cache size!\", e);\n self.removeData();\n }\n };\n\n this.removeData = function() {\n storage.removeItem(tag_key);\n storage.removeItem(data_key);\n };\n\n };\n return EtagLoader;\n})\n.service('OpenETagLoader', function($q, HttpHeader, HttpStatus) {\n var EtagLoader = function() {\n\n var self = this;\n\n this.loadDataByResource = function(resource, parameters, getTagFunctionAsync, getDataFunctionAsync, loadFunction, restoreFunction, errorFunction) {\n function fetchData() {\n return Promise.all([\n getTagFunctionAsync().then(function(tag) {\n return tag;\n }),\n getDataFunctionAsync().then(function(data) {\n return data;\n })\n ]).then(function(results) {\n var tag = results[0];\n var data = results[1];\n return { tag: tag, data: data };\n }).catch(function(error) {\n throw error;\n });\n }\n\n var requestHeader = {};\n var deferred = $q.defer();\n\n fetchData().then(function(result) {\n var tag = result.tag;\n var data = result.data;\n\n if (!_.isEmpty(tag) && !_.isEmpty(data)) {\n requestHeader[HttpHeader.IF_NONE_MATCH] = tag;\n }\n\n resource(requestHeader).get(parameters || {},\n function(response, headers) {\n tag = headers(HttpHeader.ETAG);\n data = response.toJSON();\n if (loadFunction) {\n loadFunction(tag, data, self);\n }\n deferred.resolve(tag, data, self);\n },\n function(errorReason) {\n if (errorReason.status === HttpStatus.NOT_MODIFIED) {\n if (restoreFunction) {\n restoreFunction(tag, data, self);\n }\n deferred.resolve(tag, data, self);\n } else {\n if (errorFunction) {\n errorFunction(errorReason, self);\n }\n deferred.reject(errorReason, self);\n }\n }\n );\n });\n\n return deferred.promise;\n };\n };\n return EtagLoader;\n})\n.service('UrlRetrievalService', function($http, $q) {\n\n var cache = {};\n var activeRequests = {};\n var self = this;\n\n this.clear = function(url) {\n if (!_.isNil(url)) {\n delete cache[url];\n } else {\n cache = {};\n }\n };\n\n this.get = function(url, forceReload) {\n\n var deferred = $q.defer();\n\n var data;\n if (forceReload || !_.has(cache, url)) {\n\n if (_.has(activeRequests, url)) {\n activeRequests[url].push(deferred);\n } else {\n\n activeRequests[url] = [deferred];\n $http.get(url).then(function(response) {\n data = response.data;\n cache[url] = data;\n data = _.cloneDeep(data);\n _.forEach(activeRequests[url], function(activeDeferred) {\n activeDeferred.resolve(data);\n });\n delete activeRequests[url];\n });\n\n }\n\n } else {\n data = _.cloneDeep(cache[url]);\n deferred.resolve(data);\n }\n\n return deferred.promise;\n };\n\n})\n.factory('OrganizationService', function($rootScope, OrganizationResource) {\n var organization_ = null;\n var $organization = new rxjs.ReplaySubject({});\n\n var OrganizationService = {\n $organization: $organization,\n getOrganizationSnapshot: function() {\n return angular.copy(organization_) || {};\n },\n getOrganization: function(force) {\n if (organization_ && !force) {\n $organization.next(angular.copy(organization_));\n } else {\n OrganizationResource.get({},\n function(response) {\n organization_ = response;\n if (organization_.hasImage && _.isNil(organization_.imageUrl)) {\n organization_.imageUrl = lax_rest_url('organization/image');\n }\n $organization.next(angular.copy(organization_));\n },\n function(errorResponse) {\n organization_ = null;\n });\n }\n return $organization;\n },\n update: function(data) {\n angular.extend(organization_, data);\n $organization.next(organization_);\n },\n save: function(organization, callback) {\n OrganizationResource.save({}, organization, function(response) {\n angular.extend(organization_, response);\n $organization.next(organization_);\n callback(response);\n });\n },\n logout: function() {\n organization_ = null;\n $organization.next(organization_);\n },\n setOrganization: function (organization){\n organization_ = organization;\n $rootScope.organization = organization;\n if (organization_.hasImage && _.isNil(organization_.imageUrl)) {\n organization_.imageUrl = lax_rest_url('organization/image');\n }\n $organization.next(angular.copy(organization_));\n }\n };\n return OrganizationService;\n})\n.factory('UsersService', function($rootScope, UsersResource) {\n var users_ = null;\n var $users = new rxjs.ReplaySubject({});\n\n var UsersService = {\n $users: $users,\n getUsersSnapshot: function() {\n return angular.copy(users_);\n },\n reloadAllUsers : function() {\n $users = new rxjs.ReplaySubject({});\n users_ = null;\n this.getUsers(true);\n },\n setActive: function(user, active) {\n if (user) {\n var user_;\n user.active = active;\n user_ = this.getUser(user.userId);\n if (user_) {\n user_.active = active;\n }\n }\n },\n getUser: function(userId) {\n var predicate;\n if (_.isString(userId)) {\n predicate = {'userId': userId};\n } else if (_.isNumber(userId)) {\n predicate = {'id': userId};\n } else {\n return userId;\n }\n return _.find(users_, predicate);\n },\n getUsers: function(force) {\n if (users_ && !force) {\n $users.next(angular.copy(users_));\n } else if (users_ && users_.$promise) {\n users_.$promise.then(function(response) {\n responseCbk(response);\n });\n } else {\n users_ = UsersResource.query({},\n function(response) {\n responseCbk(response);\n },\n function(errorResponse) {\n users_ = null;\n });\n }\n function responseCbk(response) {\n users_ = _(response)\n .map(function(user) {\n user.displayName = $rootScope.getUserSalutation(user);\n if (_.isEqual(user.userId, $rootScope.user.userId)) {\n user.owner = true;\n }\n return user;\n })\n .sortBy(['owner', 'lastName'])\n .value();\n $users.next(angular.copy(users_));\n }\n return $users;\n },\n updateUser: function(data) {\n angular.extend(this.getUser(data.userId), data);\n $users.next(angular.copy(users_));\n }\n };\n return UsersService;\n})\n.factory('CurrencyService', function($rootScope) {\n return {\n getCurrencyKey: function(country) {\n var countryToCurrencyMap = {\n \"AT\": \"EUR\",\n \"BE\": \"EUR\",\n \"CY\": \"EUR\",\n \"DE\": \"EUR\",\n \"EE\": \"EUR\",\n \"ES\": \"EUR\",\n \"FI\": \"EUR\",\n \"FR\": \"EUR\",\n \"GB\": \"GBP\",\n \"GR\": \"EUR\",\n \"IE\": \"EUR\",\n \"IT\": \"EUR\",\n \"LT\": \"EUR\",\n \"LU\": \"EUR\",\n \"LV\": \"EUR\",\n \"MT\": \"EUR\",\n \"NL\": \"EUR\",\n \"PT\": \"EUR\",\n \"SI\": \"EUR\",\n \"SK\": \"EUR\",\n \"UK\": \"GBP\",\n \"US\": \"USD\"\n };\n\n var currency = countryToCurrencyMap[country];\n if (!currency) {\n currency = $rootScope.systemSettings.SUPPORTED_CURRENCIES[0] || 'USD';\n }\n\n return currency;\n },\n getCurrencySymbol: function(currencyKey) {\n var currencySymbols = {\n \"GBP\": \"£\",\n \"EUR\": \"€\",\n \"USD\": \"$\"\n };\n\n return currencySymbols[currencyKey];\n }\n };\n})\n.factory('InfiniteScrollResource', function($resource, HttpHeader) {\n var InfiniteScrollResource = function(url, cursorName, paramDefaults, actionDefaults) {\n\n var self = this;\n\n this.cursorName = cursorName || HttpHeader.CURSOR;\n this.paramDefaults = paramDefaults || {};\n this.actionDefaults = actionDefaults || {};\n\n // Always add a 'query' action, if not already done\n this.actionDefaults.query = this.actionDefaults.query || {\n method: 'GET',\n isArray: true\n };\n\n this.createCursorAwareResource = function(cursor) {\n\n // Set 'cursor' header in all actions\n var actions = _.cloneDeep(self.actionDefaults);\n if (cursor) {\n _.forEach(actions, function(action) {\n action.headers = action.headers || {};\n action.headers[self.cursorName] = cursor;\n });\n }\n\n return $resource(lax_rest_url_escaped(url), self.paramDefaults, actions);\n };\n\n };\n return InfiniteScrollResource;\n})\n.factory('InfiniteScrollHelper', function($rootScope, $log, $timeout) {\n var InfiniteScrollHelper = function(loaderResource, scope, dataVar, gridApiVar, errorHandler) {\n\n var self = this;\n\n this.isLoading = false;\n this.isLoadComplete = false;\n this.cursor = null;\n this.queryParams = {};\n\n this.loaderResource = loaderResource;\n this.scope = scope;\n\n this.dataVar = dataVar || 'data';\n this.gridApiVar = gridApiVar || 'gridApi';\n this.errorHandler = errorHandler || 'errorStatus';\n\n function get(scope, varName) {\n if (_.isFunction(varName)) {\n return varName();\n } else if (_.isFunction(scope[varName])) {\n return scope[varName]();\n } else {\n return scope[varName];\n }\n }\n\n // FIXME: Stupid IE does not support 'rest' or 'spread' arguments,\n // so we have to use this ugly two definition...\n function set(scope, varName, value1, value2) {\n if (_.isFunction(varName)) {\n return varName(value1, value2);\n } else if (_.isFunction(scope[varName])) {\n return scope[varName](value1, value2);\n } else {\n scope[varName] = value1;\n return scope[varName];\n }\n }\n\n this.getData = function() {\n return get(self.scope, self.dataVar);\n };\n\n this.setData = function(data) {\n set(self.scope, self.dataVar, data);\n };\n\n this.getGridApi = function() {\n return get(self.scope, self.gridApiVar);\n };\n\n this.setGridApi = function(gridApi) {\n set(self.scope, self.gridApiVar, gridApi);\n };\n\n this.callErrorHandler = function(errorStatus, errorData) {\n set(self.scope, self.errorHandler, errorStatus, errorData);\n };\n\n this.addToGridOptions = function(gridOptions, onRegisterApiCbk) {\n\n gridOptions.infiniteScrollUp = false;\n gridOptions.infiniteScrollDown = true;\n gridOptions.onRegisterApi = function(gridApi) {\n if (!gridApi.infiniteScroll) {\n $log.warn(\"'gridApi.infiniteScroll' does not exist. Did you forget to add the 'ui-grid-infinite-scroll' tag to the HTML element?\");\n } else {\n gridApi.infiniteScroll.on.needLoadMoreData(self.scope, self.loadMoreData);\n self.setGridApi(gridApi);\n $timeout(function() {\n gridApi.core.handleWindowResize();\n });\n }\n if (onRegisterApiCbk) {\n onRegisterApiCbk(gridApi);\n }\n };\n\n };\n\n this.loadMoreData = function() {\n if (!self.isLoading && !self.isLoadComplete) {\n config = {\n append: true,\n queryParams: self.queryParams\n };\n $rootScope.$broadcast('infiniteScrollLoadMore');\n self.load(config);\n }\n };\n\n this.load = function(config) {\n config = config || {};\n var queryParams = config.queryParams || {};\n self.queryParams = queryParams;\n\n if (!config.append) {\n // Turn off scrolling on initial load\n // FIXME: Is this really necessary?\n var gridApi = self.getGridApi();\n if (gridApi && gridApi.infiniteScroll) {\n gridApi.infiniteScroll.setScrollDirections(false, false);\n }\n self.cursor = null;\n }\n\n self.isLoading = true;\n\n return self.loaderResource\n .createCursorAwareResource(self.cursor)\n .query(queryParams, function(response, headers) {\n self.handleResponse(response, headers, config);\n }, function(errorResponse) {\n self.handleError(errorResponse);\n });\n };\n\n this.reload = function(queryParams) {\n self.isLoading = false;\n self.isLoadComplete = false;\n self.cursor = null;\n self.queryParams = queryParams;\n\n return self.load({ append: false, queryParams: queryParams });\n };\n\n this.setDataLoaded = function() {\n var gridApi = self.getGridApi();\n if (gridApi && gridApi.infiniteScroll) {\n gridApi.infiniteScroll.dataLoaded(false, true);\n }\n self.isLoading = false;\n $rootScope.$broadcast('infiniteScrollDataLoaded');\n };\n\n this.handleResponse = function(response, headers, config) {\n\n var cursor = headers(self.loaderResource.cursorName);\n if (response.length === 0) {\n self.isLoadComplete = true;\n } else {\n if (cursor && cursor != self.cursor) {\n self.cursor = cursor;\n } else {\n self.cursor = null;\n self.isLoadComplete = true;\n }\n }\n\n if (config.append) {\n self.setData(_.concat(self.getData(), response));\n } else {\n self.setData(response);\n }\n\n self.setDataLoaded();\n\n };\n\n this.handleError = function(errorResponse) {\n self.setDataLoaded();\n self.callErrorHandler(errorResponse.status, errorResponse.data);\n };\n\n };\n return InfiniteScrollHelper;\n})\n.factory('UserImageResource', function ($resource) {\n return $resource(lax_rest_url_escaped('user/image'), {}, {\n get: {method: 'GET'},\n save: {method: 'POST',\n isArray: false,\n headers: {'Content-Type': 'multipart/form-data'}\n }\n });\n})\n.factory('UserResource', function ($resource) {\n var url = lax_rest_url_escaped('user');\n return $resource(url, {}, {\n get: {method: 'GET'},\n filters: {method: 'GET', url: url + '/filters', isArray: true},\n roles: {method: 'GET', url: url + '/roles', isArray: true},\n save: {method: 'POST'},\n changePassword: { method: 'POST', url: url + '/password' },\n updateNotificationsLastRead : { method: 'PUT', url: url + '/notificationsLastRead/:lastRead', params: {lastRead:'@lastRead'} },\n getAccountOrganizations: { method: 'GET', url: url + '/accountOrganizations' },\n deleteAccount: { method: 'DELETE', url: url + '/account/:organizationId' },\n switchOrganization: { method: 'PUT', url: url + '/currentOrganization?recreateCookie=true' },\n existsUser: {\n method: 'GET',\n url: lax_rest_url_escaped('signup') + '/existsUser/:emailOrUsername?invitationReference=:invitationReference',\n params: {\n emailOrUsername: '@emailOrUsername',\n invitationReference: '@invitationReference'\n }\n }\n });\n})\n.factory('UserDetails', function ($resource) {\n return $resource(lax_rest_url_escaped('userDetails'), {}, {\n get: {method: 'GET'}\n });\n})\n.factory('UserPreferencesResource', function ($resource) {\n var url = lax_rest_url_escaped('user/preferences');\n return $resource(url, {}, {\n get: {method: 'GET'},\n update: {method: 'PUT', url: url + '/:key', params: {key: '@key'}},\n delete: {method: 'DELETE', url: url + '/:key', params: {key: '@key'}},\n save: {method: 'POST'}\n });\n})\n.factory('UsersGroupResource', function ($resource) {\n var url = lax_rest_url_escaped('userGroups');\n return $resource(url, {}, {\n getAll: {method: 'GET', isArray: true},\n update: {method: 'PUT'},\n save: {method: 'POST'},\n delete: {method: 'DELETE', url: url + '/:id',params: {id: '@id'}}\n });\n})\n.service('UsersGroupService', function($rootScope, $q, $cacheFactory, UsersGroupResource, UsersService) {\n var userGroupsFactory = $cacheFactory('user-groups');\n var groups_ = null;\n var this_ = this;\n\n this.reloadGroups = function() {\n userGroupsFactory.remove('all-user-groups');\n groups_ = null;\n this.getAll().then(function(groups) {\n groups_ = groups;\n });\n };\n\n this.reloadUsersAndGroups = function() {\n this.reloadGroups();\n UsersService.reloadAllUsers();\n };\n\n this.getAll = function() {\n return this.loadAllUserGroups('all-user-groups');\n };\n\n this.create = function(group) {\n return UsersGroupResource.save(group).$promise.then(function(response) {\n return response;\n });\n };\n\n this.update = function(group) {\n return UsersGroupResource.update(group).$promise.then(function(response) {\n return response;\n });\n };\n\n this.delete = function(group) {\n return UsersGroupResource.delete(group).$promise.then(function(response) {\n return response;\n });\n };\n\n this.loadAllUserGroups = function(key) {\n if (_.isEmpty(key)) {\n return $q.when({});\n }\n if (groups_) {\n return $q.when(groups_);\n }\n\n var userGroupsData = userGroupsFactory.get(key);\n\n if (_.isNil(userGroupsData)) {\n\n var query = UsersGroupResource.getAll({});\n\n var promise = query.$promise.then(function(response) {\n groups_ = response;\n userGroupsFactory.put(key, response);\n return response;\n }, function(errorReason) {\n // FIXME: Depending on the error we might want to retry the query\n return {};\n });\n\n // Cache the promise to reduce network traffic\n if (!query.$resolved) {\n userGroupsData = {\n promise: promise\n };\n userGroupsFactory.put(key, userGroupsData);\n }\n\n return promise;\n }\n\n if (userGroupsData.promise) {\n return userGroupsData.promise;\n } else {\n groups_ = userGroupsData;\n return $q.when(userGroupsData);\n }\n };\n})\n.factory('CheckNotifications', function($resource) {\n return $resource(lax_rest_url(\"hasNewNotification\"), {});\n})\n.factory('UserDataModelResource', function ($resource) {\n return function(customHeaders) {\n return $resource(lax_rest_url_escaped('user/datamodel'), {}, {\n get: {method: 'GET', isArray: false, headers: customHeaders || {}}\n });\n };\n})\n.factory('UsersResource', function($resource) {\n var url = lax_rest_url_escaped('users/:accountId');\n return $resource(url, {accountId: '@accountId'}, {\n setActive: {\n method: 'PUT',\n url: url + '/active/:active',\n params: {active: '@active'}\n },\n updateUser: {\n method: 'PUT',\n transformRequest: function(data) {\n return angular.toJson(data.payload);\n },\n isArray: false\n }\n });\n})\n.factory('LogoutResource', function ($resource) {\n return $resource(lax_rest_url_escaped('logout'), {}, {});\n})\n.factory('LoginResource', function ($resource) {\n return $resource(lax_rest_url_escaped('login'), {}, {});\n})\n.factory('SignupResource', function ($resource) {\n return $resource(lax_rest_url_escaped('signup'), {}, {});\n})\n.factory('ResetPasswordResource', function ($resource) {\n return $resource(lax_rest_url_escaped('resetpassword'), {}, {});\n})\n.factory('ResendMailResource', function ($resource) {\n return $resource(lax_rest_url_escaped('signup/resendconfirmation/:email'), {email:'@email'}, {});\n})\n.factory('ItemResource', function ($resource) {\n var url = lax_rest_url_escaped('items') + '/:primaryKey';\n return $resource(url, {primaryKey: '@primaryKey', publicationDestination: '@publicationDestination', status: '@status'}, {\n get: {method: 'GET', isArray: false},\n query: {method: 'GET', isArray: true},\n copy: {method: 'GET', url: url + '/copy', params: {primaryKey: '@primaryKey'}, isArray: false},\n save: {method: 'POST'},\n audit: {method: 'POST', url: url + '/audit', params: {primaryKey: '@primaryKey', status: '@status'}},\n getPublications: {method: 'GET', url: url + '/publications', isArray: true},\n getValidationResult: {method: 'GET', url: url + '/validationResult', isArray: false},\n });\n})\n.factory('ExportItemResource', function($resource) {\n return $resource(lax_rest_url_escaped('items/exports/:selectionId'), {\n selectionId: '@selectionId',\n type: '@type',\n language: '@language'\n }, {\n delete: {method: 'DELETE', params: {before: '@before'}, isArray: true},\n });\n})\n.factory('ValidateItemsResource', function($resource) {\n var url = lax_rest_url_escaped('items/validate');\n return $resource(url, {}, {\n validate: {method: 'POST' },\n });\n})\n.factory('MassUpdateResource', function($resource) {\n return $resource(lax_rest_url_escaped('items/massupdate'), {}, {\n save: {method: 'POST'}\n });\n})\n.factory('ItemsSearchFilterResource', function($resource) {\n return $resource(lax_rest_url_escaped('filterProfiles/:identifier'), {identifier: '@identifier'}, {});\n})\n.factory('QueryItemResource', function(HttpHeader, InfiniteScrollResource) {\n return new InfiniteScrollResource('items', HttpHeader.ITEM_CURSOR, null, {\n search: {\n method: 'POST',\n isArray: true,\n url: lax_rest_url_escaped('items/search')\n }\n });\n})\n.factory('DeleteItemsResource', function ($resource) {\n return $resource(lax_rest_url_escaped('deleteItems'), {}, {\n pass: {method: 'POST', isArray: true}\n });\n})\n.factory('ExportUsersResource', function ($resource) {\n return $resource(lax_rest_url_escaped('exportusers'), {}, {\n get: {\n method: 'GET',\n responseType: 'arraybuffer',\n transformResponse: function (data, headersGetter) {\n\n var headers = headersGetter();\n var filename = headers['content-disposition'].split('=')[1];\n var blob = new Blob([data], { type: 'application/vnd.ms-excel' });\n\n return {\n blob: blob,\n filename: filename\n };\n\n }\n }\n });\n})\n.factory('CurrentOperationsResource', function ($resource) {\n return $resource(lax_rest_url_escaped('currentOperations/:operationKey'), {}, {});\n})\n.factory('FindItemsByPrimaryKeyResource', function ($resource) {\n return $resource(lax_rest_url_escaped('findByPrimaryKey'), {}, {\n find: {method: 'POST', isArray:true }\n });\n})\n.factory('FeedbackResource', function ($resource) {\n return $resource(lax_rest_url_escaped('items')+'/:primaryKey/feedback', {primaryKey: '@primaryKey'}, {});\n})\n.factory('ItemHistoryResource', function ($resource) {\n return $resource(lax_rest_url_escaped('items')+'/:primaryKey/history', {primaryKey: '@primaryKey'}, {\n get: {method: 'GET', isArray: false}\n });\n})\n.factory('ItemEventHistoryResource', function ($resource) {\n return $resource(lax_rest_url_escaped('items')+'/:primaryKey/eventHistory', {primaryKey: '@primaryKey'});\n})\n.factory('PublicationResource', function ($resource) {\n var url = lax_rest_url_escaped('publications');\n return $resource(url, {}, {\n publish: {method: 'POST'},\n stopPublication: {method: 'POST', url: url + '/abort/:taskId', params: {taskId: '@taskId'}},\n getResponseErrors: {method: 'GET', url: url + '/:taskId/messagingResponseErrors', params: {taskId: '@taskId'}, isArray: true}\n });\n})\n.factory('QueryPublicationResource', function(InfiniteScrollResource) {\n return new InfiniteScrollResource('publications');\n})\n.factory('DePublicationResource', function ($resource) {\n return $resource(lax_rest_url_escaped('publications/delete'), {}, {\n depublish: {method: 'POST'}\n });\n})\n.factory('RepublishResource', function ($resource) {\n return $resource(lax_rest_url_escaped('publications/republish/:taskId'), {taskId:'@taskId'}, {\n publish: {method: 'POST'}\n });\n})\n.factory('JobResource', function ($resource) {\n var url = lax_rest_url_escaped('jobs') + '/:jobId';\n return $resource(url, {jobId: '@jobId'}, {\n get: {method: 'GET', isArray: false},\n query: {method: 'GET', isArray: true},\n save: {method: 'POST'},\n delete: {method: 'DELETE', params: {jobId: '@jobId'}},\n run: {method: 'POST', url: url + '/run', params: {jobId: '@jobId'}}\n });\n})\n.factory('BackendValidateItemResource', function ($resource) {\n var url = lax_base_url_escaped('/validation/v1/validateItem');\n return $resource(url, {}, {\n validate: {method: 'POST'}\n });\n})\n.factory('ValidationResource', function ($resource) {\n var url = lax_rest_url_escaped('validate');\n return $resource(url, {}, {\n validate: {method: 'POST'}\n });\n})\n.factory('RevalidateItemsResource', function ($resource) {\n return $resource(lax_rest_url_escaped('revalidateItems'), {}, {});\n})\n.factory('RecalculateStatisticsResource', function ($resource) {\n return $resource(lax_rest_url_escaped('recalculateStatistics'), {}, {});\n})\n.factory('ReindexItemsResource', function ($resource) {\n var url = lax_rest_url_escaped('reindexItems');\n return $resource(url, {}, {\n reindex: {method: 'POST'}\n });\n})\n.factory('CategoryResource', function ($resource) {\n return $resource(lax_rest_url_escaped('categories')+'/:category', {category: '@category'}, {});\n})\n.factory('StatusResource', function ($resource) {\n return $resource(lax_rest_url_escaped('status'), {}, {});\n})\n.factory('LayoutResource', function ($resource) {\n return $resource(lax_rest_url_escaped('layouts')+\"/:layout\", {layout:'@layout'}, {});\n})\n.factory('MonitoringResource', function($resource) {\n return $resource(lax_rest_url_escaped('monitorings'), {\n module: '@module',\n term: '@term',\n datefilter: '@datefilter'\n }, {});\n})\n.factory('QueryMonitoringResource', function(InfiniteScrollResource) {\n return new InfiniteScrollResource('monitorings');\n})\n.factory('DateFilterResource', function ($resource) {\n return $resource(lax_rest_url_escaped('datefilters'), {}, {});\n})\n.factory('ModuleResource', function($resource) {\n return $resource(lax_rest_url_escaped('modules'), {}, {});\n})\n.factory('ConfirmResource', function($resource) {\n return $resource(lax_rest_url_escaped('signup/confirm/:key/:opaque'), {\n key: '@key',\n opaque: '@opaque'\n }, {});\n})\n.factory('ImportResource', function($resource) {\n return $resource(lax_rest_url_escaped('imports/:id'), {id: '@id'}, {});\n})\n.factory('QueryImportResource', function(HttpHeader, InfiniteScrollResource) {\n return new InfiniteScrollResource('imports', HttpHeader.MESSAGE_CURSOR);\n})\n.factory('DashboardResource', function ($resource) {\n var url = lax_rest_url_escaped('user/dashboard');\n return $resource(url, {}, {\n get: {\n method: 'GET',\n isArray: true, // Set isArray to false to expect an object response\n },\n save: { method: 'POST' },\n });\n})\n.service('DashboardService', function($window, $rootScope) {\n\n var dashboardSettings = {};\n var DASHBOARD_SETTINGS = '-dashboardSettings';\n\n this.loadSettings = function(options,callback) {\n // Use options to get settings if require\n\n // Get data from local storage\n var data = $window.localStorage.getItem($rootScope.user.userId + DASHBOARD_SETTINGS);\n if (data) {\n dashboardSettings = JSON.parse(data);\n callback(dashboardSettings);\n } else {\n settings = {};\n callback({});\n }\n };\n\n this.getSettings = function() {\n return dashboardSettings;\n };\n\n this.saveSettings = function(settings) {\n dashboardSettings = settings || {};\n var key = $rootScope.user.userId + DASHBOARD_SETTINGS;\n if (_.isEmpty(dashboardSettings)) {\n $window.localStorage.removeItem(key);\n } else {\n $window.localStorage.setItem(key, JSON.stringify(dashboardSettings));\n }\n };\n\n this.getDimensionValue = function(attributes) {\n\n if (_.isUndefined(attributes)) {\n attributes = _.slice(arguments);\n } else if (_.isString(attributes)) {\n attributes = [attributes];\n }\n\n var dimension;\n if (!_.isEmpty(attributes)) {\n\n var dashboardSettings = this.getSettings();\n\n dimension = \"\";\n _.each(attributes, function(attribute) {\n var value = dashboardSettings[attribute];\n if (!_.isEmpty(value)) {\n if (!_.isEmpty(dimension)) {\n dimension += \":\";\n }\n dimension += value;\n }\n });\n\n } else {\n dimension = null;\n }\n\n return dimension;\n };\n\n this.getBrowseLocation = function(location, attributes) {\n\n if (_.isUndefined(attributes)) {\n attributes = _.slice(arguments, 1);\n } else if (_.isString(attributes)) {\n attributes = [attributes];\n }\n\n location = location || {};\n if (!_.isEmpty(attributes)) {\n\n var dashboardSettings = this.getSettings();\n\n location.q = location.q || '';\n _.each(attributes, function(attribute) {\n var value = dashboardSettings[attribute];\n if (!_.isEmpty(value)) {\n if (!_.isEmpty(location.q)) {\n location.q += \" AND \";\n }\n location.q += attribute + \" = \" + value;\n }\n });\n\n }\n\n return location;\n };\n\n this.getBrowseLink = function(location, attributes) {\n\n if (_.isUndefined(attributes)) {\n attributes = _.slice(arguments);\n } else if (_.isString(attributes)) {\n attributes = [attributes];\n }\n\n location = this.getBrowseLocation(location, attributes);\n\n var link = '/browse';\n if (!_.isEmpty(location)) {\n var c = '?';\n _.each(location, function(value, key) {\n link += c + _.escape(key) + \"=\" + _.escape(value);\n c = '&';\n });\n }\n\n return link;\n };\n})\n.factory('UsageLimitsResource', function($resource) {\n return $resource(lax_rest_url_escaped('usagelimits'), {}, {});\n})\n.factory('OrganizationResource', function($resource) {\n return $resource(lax_rest_url_escaped('organization'), {}, {\n existsOrganization: {\n method: 'GET',\n url: lax_rest_url_escaped('signup') + '/existsOrganization?invitationReference=:invitationReference',\n params: {\n invitationReference: '@invitationReference'\n }\n }\n });\n})\n.factory('OrganizationsResource', function($resource) {\n return $resource(lax_rest_url_escaped('organizations'), {keyword:'@keyword', communityId: '@communityId'});\n})\n.factory('SubscriptionResource', function($resource) {\n return $resource(lax_rest_url_escaped('subscriptions'), {channelId: '@channelId'}, {\n query: { method: 'GET', isArray: true }\n });\n})\n.factory('StatisticsResource', function($resource) {\n return $resource(lax_rest_url_escaped('statistics/dynamic/:name'), {\n countMax: '@countMax',\n countMin: '@countMin',\n dimension: '@dimension',\n keyMax: '@keyMax',\n keyMin: '@keyMin',\n limit: '@limit',\n name: '@name',\n sortBy: '@sortBy'\n }, {});\n})\n.factory('InvitationResource', function($resource) {\n return $resource(lax_rest_url_escaped('contacts/:organizationId/:action'), {\n organizationId: '@organizationId',\n action: '@action'\n }, {});\n})\n.factory('ContactsResource', function($resource) {\n var url = lax_rest_url_escaped('contacts');\n return $resource(url, {}, {\n save: {\n method: 'PUT'\n },\n create : {\n method: 'POST'\n },\n delete : {\n method: 'DELETE',\n url: url + '/:organizationId',\n params: {\n organizationId: '@organizationId'\n }\n },\n invite: {\n method: 'POST',\n params: {\n organizationId: null\n }\n }\n });\n})\n.factory('ContactsResourceByCursor', function(InfiniteScrollResource) {\n return new InfiniteScrollResource('contacts/search', 'x-cursor', {limit: '@limit', keywords:'@keywords', sortby:'@sortby'}, null);\n})\n.factory('InviteByEmailResource', function($resource) {\n return $resource(lax_rest_url_escaped('invitations/:invitationId'), {\n invitationId: '@invitationId'\n }, {});\n})\n.factory('TranslationResource', function($resource) {\n return function(customHeaders) {\n return $resource(lax_rest_url_escaped('translations/:languageKey'), {\n languageKey: '@languageKey'\n }, {\n get: {method: 'GET', isArray: false, headers: customHeaders || {}}\n });\n };\n})\n.factory('DataModelResource', function($resource) {\n return function(customHeaders) {\n var url = lax_rest_url_escaped('datamodel');\n return $resource(url, {}, {\n get: {\n method: 'GET',\n isArray: false,\n url: url + '/current',\n headers: customHeaders || {}\n },\n getCategoryPath: {\n method: 'GET',\n url: url + '/categoryPath/:code',\n isArray: true\n },\n getOptionListOptions: {\n method: 'GET',\n url: url + '/optionLists/:optionListName/options',\n isArray: true\n },\n getOptionListGroups: {\n method: 'GET',\n url: url + '/optionLists/:optionListName/groups',\n isArray: true\n }\n });\n };\n})\n.factory('ResetDataModelResource', function ($resource) {\n return $resource(lax_rest_url_escaped('datamodelManager/reset'), {}, {});\n})\n.factory('UploadCustomDataModelResource', function ($resource) {\n return $resource(lax_rest_url_escaped('datamodelManager/customization'), {}, {\n get: {method: 'GET', isArray: false},\n save: {method: 'POST'}\n });\n})\n.factory('SentRequestResource', function ($resource) {\n return $resource(lax_rest_url_escaped('requestforinformation/sent/:requestId'), {requestId: '@requestId'}, {});\n})\n.factory('UseDatamodelResource', function ($resource) {\n return $resource(lax_rest_url_escaped('models/:modelId'), {modelId: '@modelId', isSystemDataModel: '@isSystemDataModel'}, {});\n})\n.factory('UploadMappingResource', function ($resource) {\n return $resource(lax_rest_url_escaped('uploads/mapping'), {}, {});\n})\n.factory('RunMappingResource', function ($resource) {\n return $resource(lax_rest_url_escaped('uploads/mapping/run'), {}, {});\n})\n.factory('ReceivedRequestResource', function ($resource) {\n return $resource(lax_rest_url_escaped('requestforinformation/received/:requestId'), {requestId: '@requestId'}, {});\n})\n.factory('DownloadRequestResource', function ($resource) {\n return $resource(lax_rest_url_escaped('requestforinformation/download/:requestId'), {requestId: '@requestId'}, {});\n})\n.factory('ConfirmResetPasswordResource', function ($resource) {\n return $resource(lax_rest_url_escaped('resetpassword/confirm/:key/:opaque'), {key: '@key', opaque: '@opaque'}, {});\n})\n.factory('FavoritesResource', function ($resource) {\n return $resource(lax_rest_url_escaped('items/favorites') +'/:primaryKey', {primaryKey: '@primaryKey'}, {\n removeFromFavorite: {method: 'DELETE'},\n addToFavorite: {method: 'POST'}\n });\n})\n.factory('ReviewerReviewResource', function($resource) {\n return $resource(lax_rest_url_escaped('reviewerreviews') + '/:primaryKey', {primaryKey: '@primaryKey'}, {\n 'save': {method: 'POST', params: {primaryKey: null}},\n 'delete': {method: 'DELETE'},\n 'get': {method: 'GET'}\n });\n})\n.factory('SupplierReviewResource', function($resource) {\n return $resource(lax_rest_url_escaped('supplierreviews') + '/:primaryKey', {primaryKey: '@primaryKey'}, {\n 'get': {method: 'GET', isArray: true}\n });\n})\n.factory('SingleSignOnResource', function($resource) {\n return $resource(lax_rest_url_escaped('sso/status') , {}, {\n 'get': {method: 'GET'}\n });\n})\n.factory('CommunicationChannelTypesResource', function($resource) {\n return $resource(lax_rest_url(\"communicationchanneltypes\"), {});\n})\n.factory('CommunicationChannelSubDestinationsAndBlockedReviewersResource', function ($resource) {\n var url = lax_rest_url_escaped('communicationchannels/subdestinations_and_blockedreviewers');\n return $resource(url, {}, {\n 'save': {method: 'POST'}\n });\n})\n.factory('CommunicationChannelResource', function ($resource) {\n var url = lax_rest_url_escaped('communicationchannels') + '/:channelId';\n return $resource(url, {}, {\n 'activate': {method: 'PUT',\n params: {force: true},\n url: url + '/activation',\n isArray: true},\n 'deactivate': {method: 'DELETE',\n url: url + '/activation'},\n 'resetcountkeydate':{method: 'PUT',\n url: url + '/resetcountkeydate'}\n });\n})\n.value(\"PublicationMode\", {\n PUBLISH: \"PUBLISH\",\n DEPUBLISH: \"DEPUBLISH\"\n})\n.service('CommunicationChannelService', function($q, $rootScope, CommunicationChannelResource, CommunicationChannelTypesResource, ContactsResource, PublicationMode) {\n\n function isPlanSupported(plan, channel, mode) {\n if (!plan) {\n return false;\n }\n var actions = plan.planActions || {};\n var channelTypes = actions[(mode === PublicationMode.PUBLISH ? 'publish_action' : 'unpublish_action')] || [];\n return _.includes(channelTypes, channel.type);\n }\n\n this.loadPublicationDestinations = function(config) {\n\n var deferred = $q.defer();\n\n $q.all([\n ContactsResource.query({}).$promise,\n CommunicationChannelResource.query({}).$promise,\n CommunicationChannelTypesResource.get({}).$promise\n ]).then(function(results) {\n\n var contactResult = results[0];\n var channelResult = results[1];\n var channelsVerificationResult = results[2];\n\n var organizations = _.sortBy(_.filter(contactResult, function(contact) {\n return !_.isNil(contact.organizationId) &&\n contact.state === 'ESTABLISHED' &&\n (_.isNil(contact.contactRole) || contact.contactRole !== 'DATA_SUPPLIER');\n }), function(contact) {\n return contact && contact.name ? contact.name.toLowerCase() : -1;\n });\n\n var communicationChannels = [];\n _.forEach(channelResult, function(channel) {\n\n if (!channel.active ||\n !channelsVerificationResult[channel.type] ||\n channel.direction === 'INBOUND_ONLY') {\n return;\n }\n\n var plan;\n if (channel.plan) {\n plan = $rootScope.communicationPlans[channel.plan];\n if (!_.isEmpty(config) && !isPlanSupported(plan, channel, config.publicationMode)) {\n return;\n }\n channel.planLabel = plan.label || plan.name;\n } else if (channel.format) {\n channel.planLabel = $rootScope.translateValue('COMMUNICATION_CHANNELS.FORMATS.',\n channel.format);\n }\n\n communicationChannels.push(channel);\n if (plan && plan.supportsSubDestinations && !_.isEmpty(channel.subDestinations)) {\n for (var subDestinationKey in channel.subDestinations) {\n var subChannel = angular.copy(channel);\n subChannel.subDestinationKey = subDestinationKey;\n subChannel.subDestinationLabel = channel.subDestinations[subDestinationKey];\n delete subChannel.subDestinations;\n communicationChannels.push(subChannel);\n }\n }\n\n });\n\n communicationChannels = _.sortBy(communicationChannels, function(channel) {\n var key = channel.name;\n if (channel.subDestinationLabel) {\n key += channel.subDestinationLabel;\n }\n if (channel.subDestinationKey) {\n key += channel.subDestinationKey;\n }\n return key.toLowerCase();\n });\n\n deferred.resolve({\n organizations: organizations,\n communicationChannels: communicationChannels\n });\n\n }).catch(function(err) {\n deferred.reject(err.status);\n });\n\n return deferred.promise;\n };\n\n})\n.factory('CommunicationPlanResource', function($resource) {\n var url = lax_rest_url_escaped('communicationplans') + '/:planName';\n return $resource(url, {}, {\n 'channeltypes': {\n method: 'GET',\n url: url + '/channeltypes',\n isArray: true\n }\n });\n})\n.factory('CommunityResource', function($resource) {\n var url = lax_rest_url_escaped('communities') + '/:id';\n return $resource(url, {}, {});\n})\n.factory('CommunicationChannelTemplatesResource', function($resource) {\n return $resource(lax_rest_url_escaped('communicationchannelTemplates'), {}, {});\n})\n.factory('BillingResource', function($resource) {\n var url = lax_rest_url_escaped('billing');\n return $resource(url, {}, {\n changePlan: {\n method: 'POST',\n url: url + '/changePlan'\n },\n addAdditionalLicense: {\n method: 'POST',\n url: url + '/addAdditionalLicense'\n },\n getBillingAddress: {\n method: 'GET',\n url: url + '/billingAddress',\n isArray: false\n },\n getPlanBillingProfiles: {\n method: 'GET',\n url: url + '/planProfiles',\n isArray: true\n },\n getAdditionalLicenseProfiles: {\n method: 'GET',\n url: url + '/additionalLicenseProfiles',\n isArray: true\n },\n getOrderedPlanProfile: {\n method: 'GET',\n url: url + '/orderedPlanProfile',\n isArray: false\n },\n getOrderedAdditionalLicenseProfiles: {\n method: 'GET',\n url: url + '/orderedAdditionalLicenseProfiles',\n isArray: true\n }\n });\n})\n.factory('ActivityStreamResource', function($resource) {\n return $resource(lax_rest_url_escaped('activitystreamtime') + '/:userId', {userId: '@userId'}, {\n 'save': {method: 'POST', params: {time: null}},\n 'get': {method: 'GET'}\n });\n})\n.factory('RubyScriptService', function($http) {\n var rubyService = {\n executeScript: function(script) {\n\n var promise = $http({\n method: 'POST',\n url: lax_rest_url('execute/ruby'),\n data: script,\n dataType: 'text',\n headers: {'Content-Type': 'text/plain', 'Accept': 'text/plain'},\n transformResponse: function(data, headers) {\n return data;\n }\n }).then(function(response) {\n return response.data;\n });\n\n return promise;\n }\n };\n return rubyService;\n})\n.factory('TaskResource', function($resource) {\n var url = lax_rest_url_escaped('taskLists/tasks/:taskId');\n return $resource(url, {\n taskId: '@taskId'\n }, {\n saveComment: {\n method: 'POST',\n url: url + '/comments'\n },\n getComments: {\n method: 'GET',\n url: url + '/comments/:commentId',\n params: {\n commentId: '@commentId'\n },\n isArray: true\n },\n getStatus: {\n method: 'GET',\n url: url + '/status'\n },\n setStatus: {\n method: 'POST',\n url: url + '/status/:status',\n params: {\n status: '@status'\n }\n }\n });\n})\n.factory('QueryTasksResource', function($resource, HttpHeader) {\n return {\n createCursorAwareResource: function(taskListId, cursor) {\n var headers = {};\n if (cursor) {\n headers[HttpHeader.MESSAGE_CURSOR] = cursor;\n }\n return $resource(lax_rest_url_escaped('taskLists/' + taskListId), {queryParams: '@queryParams'}, {\n query: {\n method: 'GET',\n isArray: true,\n headers: headers\n }\n });\n }\n };\n})\n.factory('TaskListsResource', function($resource) {\n return $resource(lax_rest_url_escaped('taskLists/:taskListId'), {\n taskListId: '@taskListId'\n }, {});\n})\n.factory('MessagingResource', function ($resource) {\n return $resource(lax_rest_url_escaped('messaging/messagingassets'), {channelId: '@channelId'}, {});\n})\n.factory('QueryMessageResource', function(HttpHeader, InfiniteScrollResource) {\n return new InfiniteScrollResource('messaging/messagingassets', HttpHeader.MESSAGE_CURSOR);\n})\n.factory('NewsResource', function ($resource) {\n return $resource(lax_rest_url_escaped('news'), {}, {});\n})\n.factory('SelectionResource', function ($resource) {\n var url = lax_rest_url_escaped('selections/:selectionId');\n return $resource(url, {selectionId: '@selectionId'}, {});\n})\n.factory('ExportFormatsResource', function ($resource) {\n return $resource(lax_rest_url_escaped('datamodel/exportFormats'), { 'includeExportMappings': false }, {});\n})\n.factory('ExportMappingResource', function ($resource) {\n var baseUrl = lax_rest_url_escaped('export/mappings');\n return $resource(baseUrl, {}, {\n 'getActive': {\n method: 'GET',\n url: baseUrl + '/active',\n interceptor: {\n response: function(response) {\n return response;\n }\n }\n },\n 'activate': {\n method: 'POST',\n url: baseUrl + '/activate'\n },\n 'delete': {\n method: 'DELETE',\n url: baseUrl + '/:mappingName',\n params: {mappingName: '@mappingName'}\n },\n 'query': {\n method: 'GET',\n isArray: true,\n interceptor: {\n response: function(response) {\n return response;\n }\n }\n },\n 'getTemplateMappings': {\n method: 'GET',\n url: baseUrl + '?templateMappings=true',\n isArray: true,\n interceptor: {\n response: function(response) {\n return response;\n }\n }\n },\n 'get': {\n method: 'GET',\n url: baseUrl + '/:key',\n interceptor: {\n response: function(response) {\n return response;\n }\n }\n }\n });\n})\n.factory('ExportSubscriptionsResource', function ($resource) {\n return $resource(lax_rest_url_escaped('exportsubscriptions'), {}, {});\n})\n.factory('ExportSummaryResource', function (HttpHeader, InfiniteScrollResource) {\n return new InfiniteScrollResource('items/exports', HttpHeader.MESSAGE_CURSOR, {type: '@type', status: '@status'});\n})\n.factory('DataModelTemplateResource', function ($resource) {\n var baseUrl = lax_rest_url_escaped('datamodelTemplate');\n var url = baseUrl + \"/:id\";\n return $resource(url, {id: '@id'}, {\n 'getOwnTemplates': {method: 'GET',\n url: baseUrl + '/myTemplates',\n isArray: true}\n });\n})\n.factory('AdditionalDataModelResource', function ($resource) {\n var baseUrl = lax_rest_url_escaped('datamodel/additional');\n return $resource(baseUrl, {}, {\n 'categories': {\n method: 'POST',\n url: baseUrl + '/categories'\n },\n 'attributes': {\n method: 'POST',\n url: baseUrl + '/attributes'\n },\n 'sectionattributes': {\n method: 'POST',\n url: baseUrl + '/sectionattributes',\n params: {layout: '@layout'}\n },\n });\n})\n.factory('MessagingResponsesResource', function ($resource) {\n return $resource(lax_rest_url_escaped('messaging/messagingassets/:messagingAssetId/messagingresponse'), {messagingAssetId: '@messagingAssetId'}, {});\n})\n.factory('ReleaseNotesResource',\n function($http) {\n var url = lax_rest_url('releaseNotes');\n return {\n get: function (callback) {\n $http({method: \"GET\", url: url})\n .success(function(data){\n callback(data);\n });\n }\n };\n }\n)\n.factory('DefaultItemResource', function ($resource) {\n return $resource(lax_rest_url_escaped('datamodel/defaultItem/:category'), {category: '@category'}, {});\n})\n.service('PhysicalAttributeService', function($filter) {\n\n this.splitValue = function(value) {\n if (_.isUndefined(value)) {\n return { inputValue: \"\", unitValue: \"\" };\n }\n var firstChar = value.search(/[ A-Za-z]/g);\n var inputValue = firstChar > -1 ? value.substr(0, firstChar) : value;\n var unitValue = firstChar > -1 ? value.substr(firstChar) : \"\";\n if (unitValue.length > 0 && unitValue[0] == ' ') {\n unitValue = unitValue.substr(1);\n }\n return { inputValue: inputValue, unitValue: unitValue };\n };\n\n this.parseValue = function(value, units) {\n if (_.isUndefined(value)) {\n return value;\n }\n var split = this.splitValue(value);\n var unitValue = replaceUnitValue(split.unitValue, units, 'value', 'key');\n var val = (split.inputValue || \"\") + unitValue;\n val = val.replace(/,/, '.');\n return val;\n };\n\n this.formatValue = function(value, units) {\n if (_.isUndefined(value)) {\n return value;\n }\n var split = this.splitValue(value);\n var unitValue = replaceUnitValue(split.unitValue, units, 'key', 'value');\n var val = \"\";\n if (split.inputValue && unitValue) {\n val = split.inputValue + \" \" + unitValue;\n } else {\n val = (split.inputValue || \"\") + (unitValue || \"\");\n }\n\n val = $filter('formatFloatValue')(val);\n\n return val;\n };\n\n function replaceUnitValue(unitValue, units, search, replace) {\n for ( var i = 0; i < units.length; i++) {\n var unit = units[i];\n if (unitValue == unit[search]) {\n return unit[replace];\n }\n }\n return unitValue;\n }\n\n})\n.service('BulkSubscriptionService', function($http, $q, $log, growl) {\n var END_POINT = 'bulkSubscription';\n\n this.getBulkSubscriptions = function(limit, keywords) {\n var deferred = $q.defer();\n var params = { limit: limit, keywords: keywords };\n $http.get(lax_rest_url(END_POINT), { params: params })\n .then(function(response) {\n deferred.resolve(response.data);\n })\n .catch(function(error) {\n $log.error('Error fetching bulk subscriptions:', error);\n growl.error('Error fetching bulk subscriptions');\n deferred.reject(error);\n });\n return deferred.promise;\n };\n})\n.service('AdditionalCategoryAttributeService', function($log, $rootScope, AdditionalDataModelResource) {\n\n this.loadAdditionalSectionAttributes = function(layoutName, item, callback) {\n\n // Check if additional categories were defined at all\n var itemAdditionalCategories = $rootScope.dataModel.getItemAdditionalCategories(item);\n if ($rootScope.isEmpty(itemAdditionalCategories)) {\n callback();\n }\n\n loadMissingAdditionalCategories(itemAdditionalCategories, function() {\n\n // Get additional section attributes from filter, if specified\n var layout = $rootScope.dataModel.layout(layoutName, item);\n var itemLayoutFilterName = _.get(layout, 'layoutOptions.layoutFilter');\n if (!_.isEmpty(itemLayoutFilterName)) {\n var itemLayoutFilter = $rootScope.getFilter(itemLayoutFilterName);\n if (!_.isFunction(itemLayoutFilter)) {\n $log.warn(\"Item layout filter '\" + itemLayoutFilterName + \"' specified in layout '\" + layoutName + \"' does not exist\");\n } else {\n var additionalSectionAttributes = itemLayoutFilter(layout, item, $rootScope.user, $rootScope.organization);\n callback(additionalSectionAttributes);\n return;\n }\n }\n\n // Get additional section attributes from backend\n AdditionalDataModelResource.sectionattributes({'layout': layoutName}, item, function(additionalSectionAttributes) {\n callback(additionalSectionAttributes);\n });\n\n });\n\n };\n\n function loadMissingAdditionalCategories(itemAdditionalCategories, callback) {\n var missingCategories = $rootScope.dataModel.getMissingAdditionalCategories(itemAdditionalCategories);\n if ($rootScope.isEmpty(missingCategories)) {\n loadMissingAdditionalAttributes(itemAdditionalCategories, callback);\n } else {\n AdditionalDataModelResource.categories(missingCategories, function(additionalCategories) {\n $rootScope.dataModel.addAdditionalCategories(additionalCategories.toJSON());\n loadMissingAdditionalAttributes(itemAdditionalCategories, callback);\n });\n }\n }\n\n function loadMissingAdditionalAttributes(itemAdditionalCategories, callback) {\n var missingAttributes = $rootScope.dataModel.getMissingAdditionalAttributes(itemAdditionalCategories);\n if ($rootScope.isEmpty(missingAttributes)) {\n callback();\n } else {\n AdditionalDataModelResource.attributes(missingAttributes, function(additionalAttributes) {\n $rootScope.dataModel.addAdditionalAttributes(additionalAttributes.toJSON());\n callback();\n });\n }\n }\n\n})\n.factory('RealtimeResource', function ($resource) {\n return $resource(lax_rest_url_escaped('realtime/:action/:event'), {event: '@event', identifier: '@identifier'}, {\n settings: {method: 'GET', params: {action: 'settings'}},\n subscribe: {method: 'POST', params: {action: 'subscribe'}},\n subscribeMultiple: {method: 'POST', params: {action: 'subscribe'}},\n unsubscribe: {method: 'POST', params: {action: 'unsubscribe'}},\n unsubscribeMultiple: {method: 'POST', params: {action: 'unsubscribe'}},\n listen: {method: 'POST', params: {action: 'listen'}},\n unlisten: {method: 'POST', params: {action: 'unlisten'}},\n subscribedUsers: {method: 'GET', params: {action: 'subscribedUsers'}, isArray: true}\n });\n})\n.service('ChannelService', function($log, $q, $rootScope, $timeout, RealtimeResource, RealtimeProvider) {\n\n this.BROADCAST_MESSAGE = \"broadcastMessage\";\n this.BULK_SEARCH_CHANGED_EVENT = \"bulkSearchChanged\";\n this.CHAT_EVENT = \"chat\";\n this.DATA_MODEL_ACTIVATEABLE_EVENT = \"dataModelActivateable\";\n this.DATA_MODEL_CHANGED_EVENT = \"dataModelChanged\";\n this.DATA_MODEL_INVALID_EVENT = \"dataModelInvalid\";\n this.DATA_MODEL_TEMPLATE_INVALID_EVENT = \"dataModelTemplateInvalid\";\n this.EXPORT_SUMMARY_CHANGED_EVENT = \"exportSummaryChanged\";\n this.FINISHED_VIRUS_SCAN_ON_ASSET = \"finishedVirusScanOnAsset\";\n this.IMPORT_SUMMARY_CHANGED_EVENT = \"importSummaryChanged\";\n this.ITEM_CHANGED_EVENT = \"itemChanged\";\n this.ITEM_EDITED_EVENT = \"itemEdited\";\n this.MASS_UPDATE_SUMMARY_CHANGED_EVENT = \"massUpdateSummaryChanged\";\n this.MESSAGING_ASSET_CHANGED_EVENT = \"messagingAssetChanged\";\n this.NEAR_ITEM_LIMIT_EVENT = \"nearItemLimit\";\n this.NEWS_STREAM_CHANGED_EVENT = \"newsStreamChanged\";\n this.PUBLICATION_JOB_CHANGED_EVENT = \"publicationJobChanged\";\n this.PUBLICATION_TASK_CHANGED_EVENT = \"publicationTaskChanged\";\n this.TASK_ASSIGNED_EVENT = \"taskAssigned\";\n this.USERGROUPS_CHANGED = \"userGroupsChanged\";\n this.VALIDATION_FINISHED_EVENT = \"validationFinished\";\n this.VALIDATION_TASK_CHANGED_EVENT = \"validationTaskChanged\";\n this.ZIP_BOMB_DETECTED_EVENT = \"zipBombDetected\";\n\n this.SUBSCRIBE_TYPE = \"subscribe\";\n this.LISTEN_TYPE = \"listen\";\n this.REGISTERED_ACTION = \"registered\";\n this.UNREGISTERED_ACTION = \"unregistered\";\n\n var currentRegistrations = {};\n\n var self = this;\n\n var currentSubscribePromise = null;\n var currentListenPromise = null;\n\n this.connect = function(callback) {\n RealtimeResource.settings({}, function (settings) {\n RealtimeProvider.connect(settings, callback);\n });\n\n };\n\n this.disconnect = function() {\n RealtimeProvider.disconnect();\n currentRegistrations = {};\n navigator.sendBeacon(lax_rest_url(\"realtime/disconnect\"));\n };\n\n this.isConnected = function() {\n return RealtimeProvider.isConnected();\n };\n\n this.isRegistered = function(event, identifier) {\n return _.some(currentRegistrations, function(entry) {\n return entry.event == event && (_.isNil(identifier) || entry.identifier == identifier);\n });\n };\n\n this.register = function(event, identifier, listen) {\n\n self._waitUntilSubscribeIdle(function() {\n $log.debug(\"ChannelService begin register: event=\", event, \", identifier=\", identifier, \", listen=\", listen);\n return RealtimeResource.subscribe({event: event, identifier: identifier}, {}, function(response) {\n $log.debug(\"ChannelService end register: event=\", event, \", identifier=\", identifier, \", listen=\", listen);\n self._subscribe(response.eventName, event, identifier);\n });\n });\n\n if (listen) {\n self._waitUntilListenIdle(function() {\n return RealtimeResource.listen({event: event, identifier: identifier}, {}, function(response) {\n self._subscribe(response.eventName, event, identifier);\n });\n });\n }\n\n };\n\n this.registerMultiple = function(events) {\n self._waitUntilSubscribeIdle(function() {\n $log.debug(\"ChannelService begin registerMultiple: events=\", events);\n return RealtimeResource.subscribeMultiple({}, events, function(response) {\n $log.debug(\"ChannelService end registerMultiple: events=\", events);\n _.forEach(response.toJSON(), function(eventName, event) {\n self._subscribe(eventName, event);\n });\n });\n });\n };\n\n this.unregister = function(event, identifier, listen) {\n\n if (!_.isEmpty(currentRegistrations)) {\n\n self._waitUntilSubscribeIdle(function() {\n $log.debug(\"ChannelService begin unregister: event=\", event, \", identifier=\", identifier, \", listen=\", listen);\n return RealtimeResource.unsubscribe({event: event, identifier: identifier}, {}, function(response) {\n $log.debug(\"ChannelService end unregister: event=\", event, \", identifier=\", identifier, \", listen=\", listen);\n self._unsubscribe(response.eventName, event, identifier);\n });\n });\n\n if (listen) {\n self._waitUntilListenIdle(function() {\n return RealtimeResource.unlisten({event: event, identifier: identifier}, {}, function(response) {\n self._unsubscribe(response.eventName, event, identifier);\n });\n });\n }\n\n }\n };\n\n this.getRegistered = function(event, identifier) {\n var defer = $q.defer();\n self._waitUntilConnected(function() {\n RealtimeResource.subscribedUsers({event: event, identifier: identifier}, function(response) {\n defer.resolve(response);\n });\n });\n return defer.promise;\n };\n\n this.broadcast = function(event, identifier, data) {\n var defer = $q.defer();\n self._waitUntilConnected(function() {\n RealtimeProvider.emit(event, identifier, self.SUBSCRIBE_TYPE, data);\n defer.resolve();\n });\n return defer.promise;\n };\n\n this._waitUntilSubscribeIdle = function(resourceActionCallback) {\n if (currentSubscribePromise && !currentSubscribePromise.$$state.status) {\n currentSubscribePromise = currentSubscribePromise.finally(resourceActionCallback);\n } else {\n currentSubscribePromise = resourceActionCallback().$promise;\n }\n };\n\n this._waitUntilListenIdle = function(resourceActionCallback) {\n if (currentListenPromise && !currentListenPromise.$$state.status) {\n currentListenPromise = currentListenPromise.finally(resourceActionCallback);\n } else {\n currentListenPromise = resourceActionCallback().$promise;\n }\n };\n\n this._subscribe = function(eventName, event, identifier) {\n self._waitUntilConnected(function() {\n RealtimeProvider.subscribe(eventName, self._subscribeCallback);\n currentRegistrations[eventName] = {event: event, identifier: identifier};\n });\n };\n\n this._unsubscribe = function(eventName, event, identifier) {\n self._waitUntilConnected(function() {\n RealtimeProvider.unsubscribe(eventName);\n delete currentRegistrations[eventName];\n });\n };\n\n this._subscribeCallback = function(eventData) {\n $log.debug(\"ChannelService subscribeCallback.eventData:\", eventData);\n $timeout(function() {\n $rootScope.$broadcast('channelMessageReceived', eventData);\n });\n };\n\n this._waitUntilConnected = function(callback) {\n\n if (self.isConnected()) {\n callback();\n return;\n }\n\n var waitUntil = {\n callback: callback\n };\n waitUntil.watch = $rootScope.$watch(self.isConnected, function(newValue, oldValue) {\n if (newValue) {\n self._handleConnected(waitUntil);\n }\n });\n };\n\n this._handleConnected = function(waitUntil) {\n if (waitUntil.watch) {\n waitUntil.watch();\n }\n waitUntil.callback();\n };\n\n})\n.factory('RolesResource', function($rootScope, $http, $resource) {\n return $resource(lax_rest_url(\"rolenames\"), {});\n})\n\n.service('RolesService', function($rootScope, $q, $cacheFactory, RolesResource) {\n\n var rolesFactory = $cacheFactory('roles');\n var roles_ = null;\n\n this.reloadAllRoles = function() {\n rolesFactory.remove('all-roles');\n roles_ = null;\n this.getAllRoles().then(function(roles) {\n roles_ = roles;\n });\n };\n\n this.getAllRoles = function() {\n return this.loadAllRoles('all-roles');\n };\n\n this.loadAllRoles = function(key) {\n if (_.isEmpty(key)) {\n return $q.when({});\n }\n if (roles_) {\n return $q.when(roles_);\n }\n var rolesData = rolesFactory.get(key);\n\n if (_.isNil(rolesData)) {\n\n var query = RolesResource.query({});\n\n var promise = query.$promise.then(function(response) {\n roles_ = response;\n rolesFactory.put(key, response);\n return response;\n }, function(errorReason) {\n // FIXME: Depending on the error we might want to retry the query\n return {};\n });\n\n // Cache the promise to reduce network traffic\n if (!query.$resolved) {\n rolesData = {\n promise: promise\n };\n rolesFactory.put(key, rolesData);\n }\n\n return promise;\n }\n\n if (rolesData.promise) {\n return rolesData.promise;\n } else {\n roles_ = rolesData;\n return $q.when(rolesData);\n }\n };\n})\n.factory('TourService', function($http, $q) {\n this.setTourCompleted = function(user, tour, active) {\n return $http.put(lax_rest_url('users/' + user.id + '/completedTours/' + tour + '/' + active) , {});\n };\n this.loadTours = function() {\n var deferred = $q.defer();\n $http.get(lax_rest_url('tours'), {includeDataModelTours : true, includeReleaseTours: true}).then(function(results) {\n\n var tours = JSON.parse(results.data.tours);\n var datamodelTours = results.data.dataModelTours;\n if (datamodelTours) {\n tours = tours.concat(JSON.parse(datamodelTours));\n }\n\n var releaseTours = results.data.releaseToursTours;\n if (releaseTours) {\n releaseTours = JSON.parse(releaseTours);\n // Hide all release tours and only start the tour for the current version automatically\n angular.forEach(releaseTours, function(releaseTour) {\n if (_.isEmpty(releaseTour.version)) {\n console.log(\"ReleaseTour\", releaseTour.id, \" does not have a version defined! Ignoring it!\");\n return;\n }\n\n releaseTour.hidden = true;\n releaseTour.showCloseButton = true;\n releaseTour.closeWithoutConfirm = true;\n if (releaseTour.version === __laxVersion__) {\n releaseTour.startAutomatically = true;\n } else {\n releaseTour.startAutomatically = false;\n }\n });\n\n tours = tours.concat(releaseTours);\n }\n\n deferred.resolve(tours);\n });\n return deferred.promise;\n };\n return this;\n})\n.factory('InputTemplatesService', function($rootScope, $http, $injector, $log) {\n this.loadTemplates = function(callback) {\n if (!$rootScope.inputTemplatesRegistered) {\n\n // TODO: Add etag 'caching'!\n $log.info(\"Loading 'customTemplates.html'\");\n $http.get(lax_rest_url('datamodel/customTemplates.html'))\n .then(function (response) {\n // compile the response, which will put stuff into the cache\n $injector.get('$compile')(response.data);\n $rootScope.inputTemplatesRegistered = true;\n $log.info(\"Loaded 'customTemplates.html'\");\n $rootScope.$broadcast('templatesLoaded');\n if (callback) {\n callback();\n }\n });\n\n } else {\n if (callback) {\n callback();\n }\n $rootScope.$broadcast('templatesLoaded');\n }\n };\n return this;\n})\n.factory('FeatureToggleService', function(growl) {\n\n var ENABLED_FEATURES = 'enabledFeatures';\n\n var availableFeatures = [\n \"deleteTaskList\",\n \"depublish\",\n \"editorSettingsPreview\",\n \"guided-tour\",\n \"legacyDataModels\",\n \"reports\"\n ];\n\n function featureExists(feature) {\n var exists = availableFeatures.contains(feature);\n if (!exists) {\n var availableFeaturesList = \"
      \";\n for (var i = 0; i < availableFeatures.length; i++) {\n availableFeaturesList += \"
    • \" + availableFeatures[i] + \"
    • \";\n }\n availableFeaturesList += \"
    \";\n growl.error(\"FEATURE.FEATURE_NOT_FOUND_ERROR\", { variables: { feature: feature, list: availableFeaturesList } });\n }\n return exists;\n }\n\n function readFromStorage() {\n return JSON.parse(sessionStorage.getItem(ENABLED_FEATURES) ||'[]');\n }\n function writeToStorage(features) {\n return sessionStorage.setItem(ENABLED_FEATURES, JSON.stringify(features));\n }\n\n this.checkFeatureEnabled = function(feature) {\n var enabledFeatures = readFromStorage();\n return enabledFeatures.contains(feature);\n };\n this.enableFeature = function(feature) {\n if (featureExists(feature)) {\n var enabledFeatures = readFromStorage();\n enabledFeatures.addToSet(feature);\n writeToStorage(enabledFeatures);\n growl.success(\"Feature \" + feature + \" enabled\");\n\n }\n };\n this.disableFeature = function(feature) {\n if (featureExists(feature)) {\n var enabledFeatures = readFromStorage();\n enabledFeatures.removeByContent(feature);\n writeToStorage(enabledFeatures);\n growl.success(\"Feature \" + feature + \" disabled\");\n }\n };\n return this;\n})\n.service('SessionDataService', function() {\n this.put = function(key, value) {\n var keys = JSON.parse(sessionStorage.getItem('keys')) || [];\n keys.addToSet(key);\n keys = JSON.stringify(keys);\n // update keys in sessionStorage\n sessionStorage.setItem('keys', keys);\n // set actual key, value\n sessionStorage.setItem(key, value);\n };\n this.get = function(key) {\n return sessionStorage.getItem(key);\n };\n // clear all user specific data\n // we don't want sessionStorage.clear() here,\n // because we want to keep things like dataModelHash\n this.clearKeys = function() {\n var keys = JSON.parse(sessionStorage.getItem('keys')) || [];\n angular.forEach(keys, function(key, index) {\n sessionStorage.removeItem(key);\n if (index == keys.length-1) {\n sessionStorage.removeItem('keys');\n }\n });\n };\n})\n.factory('$dialogs', ['$modal', function ($modal) {\n return {\n confirm: function (header, msg, options) {\n return $modal.open({\n templateUrl: 'tpl/confirm-dialog.tpl.html',\n controller: 'ConfirmDialogController',\n windowClass: 'confirmation-window',\n backdrop: 'static',\n keyboard: false,\n resolve: {\n header: function () {\n return angular.copy(header);\n },\n msg: function () {\n return angular.copy(msg);\n },\n notification: function () {\n return false;\n },\n options: function () {\n return options;\n }\n }\n });\n },\n notify: function (header, msg, options) {\n return $modal.open({\n templateUrl: 'tpl/confirm-dialog.tpl.html',\n controller: 'ConfirmDialogController',\n resolve: {\n header: function () {\n return angular.copy(header);\n },\n msg: function () {\n return angular.copy(msg);\n },\n notification: function () {\n return true;\n },\n options: function () {\n return options;\n }\n }\n });\n }\n };\n}])\n.factory('ShoppingCartResource', function ($resource) {\n return $resource(lax_rest_url_escaped('shoppingCarts/:id'), { });\n})\n.factory('ShoppingCartItemResource', function ($resource) {\n return $resource(lax_rest_url_escaped('shoppingCarts/shoppingCartItems/:id'), { });\n})\n.factory('ConvertShoppingCartItemResource', function ($resource) {\n return $resource(lax_rest_url_escaped('shoppingCarts/shoppingCartItem/generate/:primaryKey'), { });\n})\n.service('ShoppingCartService', function(ShoppingCartResource, ShoppingCartItemResource, ConvertShoppingCartItemResource, growl, $translate) {\n\n var self = this;\n\n self.shoppingCart = {\n items : []\n };\n\n function getShoppingCartItem(item, quantity, callback) {\n ConvertShoppingCartItemResource.get({primaryKey: item.primaryKey__, quantity:quantity}, function(response) {\n if (!response.primaryKey) {\n growl.error(\"SHOPPING_CART.ERROR_ADDING_ITEM_CALCULATION_ERROR\");\n } else {\n response.shoppingCartId = self.shoppingCart.id;\n growl.success(\"SHOPPING_CART.ADDED_ITEM\");\n callback(response);\n }\n }, function(error) {\n growl.error(\"SHOPPING_CART.ERROR_ADDING_ITEM\", { variables: { error: error.data } } );\n });\n }\n\n this.addItem = function (item, price, quantity) {\n\n quantity = quantity || 1;\n\n var existingItem = self.shoppingCart.items.filter(function (elem) {\n return item.primaryKey__ === elem.primaryKey;\n })[0];\n\n if (existingItem && existingItem.quantity) {\n quantity += parseFloat(existingItem.quantity);\n }\n\n getShoppingCartItem(item, quantity, function (itemToSave) {\n\n itemToSave.id = existingItem ? existingItem.id : null;\n\n ShoppingCartItemResource.save(itemToSave, function (savedItem) {\n\n item.id = savedItem.id;\n\n if (existingItem) {\n angular.extend(existingItem, savedItem);\n } else {\n self.shoppingCart.items.push(savedItem);\n }\n });\n });\n\n };\n\n this.removeItem = function (itemToRemove) {\n ShoppingCartItemResource.remove({id: itemToRemove.id}, function(response){\n self.shoppingCart.items = self.shoppingCart.items.filter(function (item) {\n return item.id !== itemToRemove.id;\n });\n });\n };\n\n this.getTotalPrice = function() {\n var total = self.shoppingCart.items.reduce(function (previousValue, item) {\n // TODO: implement on server side to get precise total price\n return previousValue + item.price * item.quantity;\n }, 0);\n return total.toFixed(2);\n };\n\n this.updateTotalPrice = function (itemToUpdate) {\n var matchedItem = self.shoppingCart.items.filter(function (item) {\n return item.item.primaryKey__ === itemToUpdate.item.primaryKey__;\n })[0];\n if(matchedItem) {\n matchedItem.totalPrice = itemToUpdate.price * itemToUpdate.quantity;\n }\n };\n\n this.getColumnDefinitions = function() {\n var columnDefs = [];\n\n columnDefs.push(\n {\n field: \"description\",\n displayName: $translate.instant('SHOPPING_CART.TRADE_ITEM_DESCRIPTION'),\n headerTooltip: true,\n cellTooltip: true,\n enableCellEdit: false,\n resizable: true\n }\n );\n columnDefs.push(\n {\n field: \"quantity\",\n displayName: $translate.instant('QUANTITY'),\n headerTooltip: true,\n enableCellEdit: true,\n resizable: true\n }\n );\n columnDefs.push(\n {\n field: \"price\",\n displayName: $translate.instant('PRICE'),\n headerTooltip: true,\n enableCellEdit: false,\n resizable: true,\n cellFilter: 'currency'\n }\n );\n columnDefs.push(\n {\n field: \"currency\",\n displayName: $translate.instant('CURRENCY'),\n headerTooltip: true,\n enableCellEdit: false,\n resizable: true,\n cellFilter: 'currency'\n }\n );\n columnDefs.push(\n {\n field: \"totalPrice\",\n displayName: $translate.instant('SHOPPING_CART.TOTAL_PRICE'),\n headerTooltip: true,\n enableCellEdit: false,\n resizable: true,\n cellFilter: 'currency'\n }\n );\n return columnDefs;\n };\n\n})\n.service('OrdersService', function() {\n this.orders = initOrders();\n function Order(id, date, status, remark, positions) {\n this.id = id;\n this.date = date;\n this.status = status;\n this.remark = remark;\n this.positions = positions;\n this.total = this.positions.reduce(function(result, position) {\n return result + position.totalPrice;\n }, 0);\n }\n function OrderPosition(product, price, quantity) {\n this.product = product;\n this.price = price;\n this.quantity = quantity;\n this.totalPrice = price * quantity;\n }\n // TODO: replace this with real data\n function initOrders() {\n return [\n new Order(\"2345\", new Date(), \"In Process\", \"Looking forward\", [\n new OrderPosition(\n {\n primaryKey__: \"3434324324:324324324324:278\",\n supplier: \"UHU\",\n gtin: \"234568\",\n brandName: \"UHU\",\n tradeItemDescription: \"glue stic\"\n },\n 3.99,\n 5\n ),\n new OrderPosition(\n {\n primaryKey__: \"3434324324:324324324324:279\",\n supplier: \"UHU\",\n gtin: \"234568\",\n brandName: \"UHU\",\n tradeItemDescription: \"glue stic\"\n },\n 3.99,\n 5\n )\n ]),\n new Order(\"2346\", new Date(), \"In Process\", \"Looking forward\", [\n new OrderPosition(\n {\n primaryKey__: \"3434324324:324324324324:278\",\n supplier: \"UHU\",\n gtin: \"234568\",\n brandName: \"UHU\",\n tradeItemDescription: \"glue stic\"\n },\n 3.99,\n 5\n ),\n new OrderPosition(\n {\n primaryKey__: \"3434324324:324324324324:279\",\n supplier: \"UHU\",\n gtin: \"234568\",\n brandName: \"UHU\",\n tradeItemDescription: \"glue stic\"\n },\n 3.99,\n 5\n )\n ])\n ];\n }\n this.getOrder = function(orderToFind, callback) {\n console.log(this.orders);\n console.log(orderToFind);\n var ordersFound = $.grep(this.orders, function(order) {\n return order.id === orderToFind.id;\n });\n console.log(\"ordersFound\");\n console.log(ordersFound);\n var result = (ordersFound && ordersFound.length) > 0 ? ordersFound[0] : new Order();\n console.log(result);\n callback(result);\n };\n})\n.factory('ItemChangesQueue', function ($log, $rootScope, $timeout) {\n\n var ItemChangesQueue = function (queueName,\n delay,\n processorFn,\n skipProcessorFn,\n preprocessItemChangesFn) {\n\n var processedItem = null;\n\n var processingItem = null;\n\n var processorTimeout = null;\n\n var processorRunning = false;\n\n var queuedItemChanges = null;\n\n var originalItem = null;\n\n var pauseProcessor = false;\n\n var self = this;\n\n // Starts the queue using the specified item\n this.start = function (item) {\n\n if (self.isQueueRunning()) {\n $log.warn(\"Queue '\" + queueName + \"' is already running\");\n return;\n }\n\n $log.debug(\"Starting queue: \" + queueName);\n\n // Stop processor, if it was still running\n stopProcessorTimeout();\n\n originalItem = item;\n processedItem = angular.copy(item);\n queuedItemChanges = {};\n\n };\n\n // Stops the queue and returns the last processed item and queued changes\n this.stop = function () {\n\n if (!self.isQueueRunning()) {\n $log.warn(\"Queue '\" + queueName + \"' is not running\");\n return;\n }\n\n $log.debug(\"Stopping queue: \" + queueName);\n\n stopProcessorTimeout();\n\n var lastProcessedItem = processedItem;\n var lastQueuedItemChanges = queuedItemChanges;\n\n processedItem = null;\n queuedItemChanges = null;\n\n return {\n 'lastProcessedItem': lastProcessedItem,\n 'lastQueuedItemChanges': lastQueuedItemChanges\n };\n };\n\n function startProcessorTimeout(force) {\n if (self.isQueueRunning() && angular.isFunction(processorFn)) {\n\n // Check if processor timeout should be started\n if (!force && angular.isFunction(skipProcessorFn)) {\n var skipProcessor = skipProcessorFn();\n if (skipProcessor) {\n return;\n }\n }\n\n // Start processor timeout\n processorTimeout = $timeout(function () {\n\n // Check if processor needs to run\n if (!self.hasQueuedItemChanges()) {\n return;\n }\n processorRunning = true;\n\n // Copy item changes and reset queue\n processingItem = angular.copy(processedItem);\n var processingItemChanges = angular.copy(queuedItemChanges);\n angular.extend(processingItem, processingItemChanges);\n queuedItemChanges = {};\n\n // Call processorFn and update processed item\n processorFn(processingItemChanges, processingItem, processedItem, originalItem)\n .then(function successCallback() {\n\n // Update processed item\n if (self.isQueueRunning()) {\n processedItem = processingItem;\n }\n\n }, function errorCallback(reason) {\n\n $log.error(\"Processor function for queue '\" + queueName + \"' failed due to: \", reason);\n\n // Add changes to queue again\n if (self.isQueueRunning()) {\n self.queueItemChanges(processingItemChanges);\n }\n\n })\n ['finally'](function () {\n\n // Check if processor needs to restart\n processorRunning = false;\n if (self.hasQueuedItemChanges()) {\n startProcessorTimeout();\n }\n\n processingItem = null;\n\n });\n\n }, delay || 0);\n\n }\n }\n\n function stopProcessorTimeout() {\n if (processorTimeout) {\n $timeout.cancel(processorTimeout);\n processorTimeout = null;\n }\n }\n\n this.getQueueName = function () {\n return queueName;\n };\n\n this.getProcessedItem = function () {\n return processedItem;\n };\n\n this.getQueuedItemChanges = function () {\n return queuedItemChanges;\n };\n\n this.hasQueuedItemChanges = function () {\n return queuedItemChanges && Object.keys(queuedItemChanges).length > 0;\n };\n\n this.isProcessorRunning = function () {\n return processorRunning;\n };\n\n this.isQueueRunning = function () {\n return (processedItem !== null && queuedItemChanges !== null);\n };\n\n function isEqual(value1, value2) {\n return $rootScope.isEqual(value1, value2);\n }\n\n function isDefaultValue(key, newValue, oldValue) {\n return $rootScope.isDefaultValueForAttribute(key, newValue, oldValue);\n }\n\n function isEmpty(value) {\n return $rootScope.isEmpty(value);\n }\n\n this.queueItemChanges = function (itemChanges) {\n\n if (pauseProcessor) {\n $log.debug('Processor ' + self.getQueueName() + ' is paused, skipping queuing of changes: ', itemChanges);\n return;\n }\n\n if (angular.isFunction(preprocessItemChangesFn)) {\n itemChanges = preprocessItemChangesFn(itemChanges);\n }\n\n if (self.isQueueRunning()) {\n\n // Add item changes to queued changes\n angular.forEach(itemChanges, function (value, key) {\n\n // Ignore angular properties and functions\n if ((angular.isString(key) && key.charAt(0) === '$') || angular.isFunction(value)) {\n return;\n }\n\n if (isEqual(processedItem[key], value) ||\n (!_.isNil(processingItem) && isEqual(processingItem[key], value)) ||\n (isEmpty(processedItem[key]) && isEmpty(value)) ||\n (isDefaultValue(key, value, processedItem[key]))) {\n delete queuedItemChanges[key];\n } else {\n queuedItemChanges[key] = value;\n }\n\n });\n\n // Restart processor, if not currently running\n if (!processorRunning && !pauseProcessor) {\n stopProcessorTimeout();\n if (self.hasQueuedItemChanges()) {\n startProcessorTimeout();\n }\n }\n\n }\n\n };\n\n this.processItemChanges = function () {\n if (!self.isProcessorRunning() && self.hasQueuedItemChanges()) {\n startProcessorTimeout(true);\n }\n };\n\n this.pauseProcessor = function() {\n pauseProcessor = true;\n };\n\n this.continueProcessor = function() {\n pauseProcessor = false;\n stopProcessorTimeout();\n if (self.hasQueuedItemChanges()) {\n startProcessorTimeout();\n }\n };\n\n };\n\n return (ItemChangesQueue);\n})\n.factory('ItemChangesQueueManager', function ($log, ItemChangesQueue) {\n\n var ItemChangesQueueManager = function () {\n\n var queues = {};\n\n var unregisterWatch = null;\n\n this.createQueue = function (queueName,\n delay,\n processorFn,\n skipProcessorFn,\n preprocessItemChangesFn) {\n\n var queue = queues[queueName];\n if (queue) {\n $log.warn(\"Queue '\" + queueName + \"' already exists\");\n return queue;\n }\n queue = new ItemChangesQueue(queueName,\n delay,\n processorFn,\n skipProcessorFn,\n preprocessItemChangesFn);\n queues[queueName] = queue;\n return queue;\n };\n\n this.start = function (scope, item, modelName, preprocessItemChangesFn) {\n\n // Start queues\n angular.forEach(queues, function (queue) {\n if (!queue.isQueueRunning()) {\n queue.start(item);\n }\n });\n\n // Start watch\n if (!unregisterWatch) {\n this.startWatch(scope, modelName, preprocessItemChangesFn);\n }\n\n };\n\n this.startQueue = function (queueName, item) {\n var queue = queues[queueName];\n if (!queue) {\n $log.warn(\"Queue '\" + queueName + \"' to start does not exist\");\n return;\n }\n if (!queue.isQueueRunning()) {\n queue.start(item);\n }\n };\n\n this.startWatch = function (scope, modelName, preprocessItemChangesFn) {\n\n if (unregisterWatch) {\n $log.warn(\"Watch was already started\");\n return;\n }\n\n unregisterWatch = scope.$watch(modelName, function (itemChanges) {\n if (angular.isFunction(preprocessItemChangesFn)) {\n itemChanges = preprocessItemChangesFn(itemChanges);\n }\n angular.forEach(queues, function (queue) {\n queue.queueItemChanges(itemChanges);\n });\n }, true);\n\n };\n\n this.stop = function () {\n this.stopWatch();\n angular.forEach(queues, function (queue) {\n if (queue.isQueueRunning()) {\n queue.stop();\n }\n });\n };\n\n this.stopQueue = function (queueName) {\n var queue = queues[queueName];\n if (!queue) {\n $log.warn(\"Queue '\" + queueName + \"' to stop does not exist\");\n return null;\n } else if (queue.isQueueRunning()) {\n return queue.stop();\n } else {\n return {};\n }\n };\n\n this.stopWatch = function () {\n if (unregisterWatch) {\n unregisterWatch();\n unregisterWatch = null;\n }\n };\n\n this.getQueue = function (queueName) {\n return queues[queueName];\n };\n\n };\n\n return (ItemChangesQueueManager);\n})\n.service('ValidateItemService', function($log, $rootScope, BackendValidateItemResource, ValidationResource, ValidateItemsResource) {\n\n this.validateItem = function (scope, originalScopeItem, newItem, oldItem, itemAttributeStates, itemValidations, attributeNames, doBeforeItemUpdate) {\n\n var validationParams = {\n newItem: newItem,\n oldItem: oldItem,\n attributeNames: attributeNames\n };\n\n var resource = $rootScope.systemSettings.VALIDATION_USE_DEDICATED_BACKEND_SERVICE ? BackendValidateItemResource : ValidationResource;\n\n return resource.validate({}, validationParams,\n function (validationResponse) {\n\n // We can use `doBeforeItemUpdate` to pause any change queues in case\n // we want to update the item due to the calculated attributes\n if(!_.isNil(doBeforeItemUpdate) && _.isFunction(doBeforeItemUpdate)) {\n doBeforeItemUpdate();\n }\n\n $log.debug(\"validationResponse=\", validationResponse);\n\n if (_.isEmpty(attributeNames)) {\n // If we are validating the complete item, we reset all the attribute states.\n // note that we need to clear the properties as the object reference is passed by value!\n clearAllObjectProperties(itemAttributeStates);\n\n // and reset the item validations too\n clearAllObjectProperties(itemValidations);\n\n }\n\n // Merge all attribute states from response\n if (itemAttributeStates) {\n angular.forEach(validationResponse.attributeStates, function (attributeStates, attributeName) {\n updateAttributeStates(itemAttributeStates, attributeStates, attributeName);\n });\n }\n\n // Merge all validations from response\n angular.forEach(validationResponse.validations, function (attributeValidations, attributeName) {\n updateValidations(itemValidations, attributeValidations, attributeName);\n });\n\n // Set all calculated values from response\n if (validationResponse.calculations) {\n angular.forEach(validationResponse.calculations, function (calculatedAttributeValue, attributeName) {\n updateCalculatedAttribute(originalScopeItem, calculatedAttributeValue, attributeName);\n });\n }\n\n scope.$broadcast(\"validation_finished\");\n\n }, function (response) {\n $log.error(\"Got error response with status '\" + response.status + \"': \", response);\n scope.status = response.status;\n });\n };\n\n this.validateItemSelection = function(selectedItems, successFn, errorFn) {\n return ValidateItemsResource.validate({}, selectedItems, successFn, errorFn);\n };\n\n function updateAttributeStates(itemAttributeStates, attributeStates, attributeName) {\n if (!attributeStates || attributeStates.length === 0) {\n delete itemAttributeStates[attributeName];\n } else {\n itemAttributeStates[attributeName] = attributeStates;\n }\n }\n\n function updateValidations(itemValidations, attributeValidations, attributeName) {\n if (!attributeValidations || attributeValidations.length === 0) {\n delete itemValidations[attributeName];\n } else {\n $rootScope.translateAttributeValidations(attributeName, attributeValidations);\n itemValidations[attributeName] = attributeValidations;\n }\n }\n\n function updateCalculatedAttribute(item, calculatedAttributeValue, attributeName) {\n item[attributeName] = calculatedAttributeValue;\n }\n\n function defaultCellValidations(row, col) {\n return [];\n }\n\n this.defineGridValidationMethods = function (scope, cellValidationsFn) {\n\n cellValidationsFn = cellValidationsFn || defaultCellValidations;\n\n scope.isCellInvalid = function (row, col) {\n var cellValidations = cellValidationsFn(row, col);\n return cellValidations && cellValidations.length > 0;\n };\n\n scope.getCellValidationMessages = function (row, col) {\n\n var cellValidations = cellValidationsFn(row, col);\n if (_.isEmpty(cellValidations)) {\n return null;\n }\n\n var message;\n var errorMessages = '';\n var failureMessages = '';\n var warningMessages = '';\n\n angular.forEach(cellValidations, function (validation) {\n message = '\\n
  • ' + (validation.translatedMessage || $rootScope.translateValidationMessage(validation)) + '
  • ';\n if (validation.level === 'Error') {\n errorMessages += message;\n } else if (validation.level === 'Failure') {\n failureMessages += message;\n } else if (validation.level === 'Warning') {\n warningMessages += message;\n }\n });\n\n var messages = '
      ' + errorMessages + failureMessages + warningMessages + '\\n
    ';\n\n return messages;\n };\n\n // Only used for really old stuff unaware of different validation levels!\n scope.isRowInvalid = function (row) {\n return !_.isEmpty(row.entity.validation__);\n };\n\n scope.getRowValidationMessages = function (row) {\n\n if (_.isEmpty(row.entity.validation__) && _.isEmpty(row.entity.validation_warnings__)) {\n return null;\n }\n\n var validationErrors = '';\n var validationWarnings = '';\n\n angular.forEach(row.entity.validation__, function (validation) {\n validationErrors += '\\n
  • ' + $rootScope.translateValidationLabel(validation) + '
  • ';\n });\n angular.forEach(row.entity.validation_warnings__, function (validation) {\n validationWarnings += '\\n
  • ' + $rootScope.translateValidationLabel(validation) + '
  • ';\n });\n\n var messages = '
      ' + validationErrors + validationWarnings + '\\n
    ';\n\n return messages;\n };\n\n };\n\n function clearAllObjectProperties(object) {\n _.forOwn(object, function(_, prop) { delete object[prop]; });\n }\n})\n.factory('DataModelRetrievalResource', function($resource) {\n return $resource(lax_rest_url_escaped('datamodel/retrieval/:method'), {\n method: '@method',\n dataModel: '@dataModel',\n parent: '@parent',\n leaf: '@leaf',\n extension: '@extension',\n limit: '@limit',\n q: '@query'\n }, { query: { method: 'GET', isArray: true } });\n})\n.factory('TabContainer', function() {\n function TabContainer(scope, location, tabs, defaultTab, onTabActivate) {\n var self = this;\n this.scope = scope;\n this.location = location;\n\n this.onTabActivate = onTabActivate;\n\n this.tabs = tabs;\n\n function tabActivateCallback() {\n if (self.onTabActivate) {\n self.onTabActivate(scope.currentTab);\n }\n }\n\n function addTab(tab) {\n self.tabs.push(tab);\n }\n\n function getTabBySuburl(suburl) {\n return tabs.filter(function (tab) {\n return tab.suburl === suburl;\n })[0];\n }\n\n for (var i= 0; i < tabs.length; i++){\n //by default all tabs are visible\n tabs[i].isVisible = tabs[i].isVisible || function() { return true; };\n }\n scope.tabs = tabs;\n\n if (defaultTab) {\n scope.currentTab = getTabBySuburl(defaultTab);\n } else {\n scope.currentTab = tabs[0];\n }\n tabActivateCallback();\n\n scope.onClickTab = function (tab) {\n scope.currentTab = tab;\n tabActivateCallback();\n if (tab.suburl !== undefined){\n location.hash(tab.suburl);\n }\n };\n\n scope.isActiveTab = function(tab) {\n return tab.suburl == scope.currentTab.suburl;\n };\n\n this.openSubview = function(suburl){\n if (suburl === undefined){\n return;\n }\n\n for(var i = 0; i< tabs.length; i++){\n var tab = tabs[i];\n if (tab.suburl === suburl){\n scope.currentTab = getTabBySuburl(tab.suburl);\n tabActivateCallback();\n }\n }\n };\n }\n return TabContainer;\n})\n.factory('MultiMap', function() {\n function MultiMap() {\n\n this.content = {};\n\n this.add = function(key, value) {\n this.content[key] = this.content[key] || [];\n this.content[key].push(value);\n };\n\n this.get = function(key) {\n return this.content[key];\n };\n\n this.keySet = function() {\n return Object.keys(this.content);\n };\n }\n return MultiMap;\n})\n.service('WatchlistService', function($log, $window) {\n\n var ITEM_WATCHLIST = \"itemWatchlist\";\n var LocalStorage = $window.localStorage;\n\n var watchlist = {};\n\n this.getWatchlistPrimaryKeys = function() {\n return watchlist.primaryKeys || [];\n };\n\n this.getWatchlistCategories = function() {\n return watchlist.categories || [];\n };\n\n this.getWatchlistItemCount = function() {\n return _.size(watchlist.primaryKeys);\n };\n\n this.hasWatchlistItems = function() {\n return !_.isEmpty(watchlist.primaryKeys);\n };\n\n this.clearWatchlist = function() {\n _setWatchlist();\n _saveWatchlist();\n };\n\n this.addWatchlistItem = function(item) {\n _addWatchlistItem(item);\n _saveWatchlist();\n };\n\n this.removeWatchlistItem = function(item) {\n _removeWatchlistItem(item);\n _saveWatchlist();\n };\n\n this.removeWatchlistItems = function(items) {\n _.forEach(items, function(item) {\n _removeWatchlistItem(item);\n });\n _saveWatchlist();\n };\n\n this.setWatchlistItems = function(items) {\n setWatchlist({});\n _.forEach(items, function(item) {\n _addWatchlistItem(item);\n });\n _saveWatchlist();\n };\n\n function _addWatchlistItem(item) {\n\n var primaryKey = item.primaryKey__;\n var category = item.category__;\n\n if (_.includes(watchlist.primaryKeys, primaryKey)) {\n\n var oldCategory = watchlist.primaryKeyCategory[primaryKey];\n if (oldCategory == category) {\n return;\n }\n\n _removeCategory(primaryKey, oldCategory);\n\n } else {\n watchlist.primaryKeys.push(primaryKey);\n }\n\n watchlist.primaryKeyCategory[primaryKey] = category;\n watchlist.categoryPrimaryKeys[category] = (watchlist.categoryPrimaryKeys[category] || []);\n if (!_.includes(watchlist.categoryPrimaryKeys[category], primaryKey)) {\n watchlist.categoryPrimaryKeys[category].push(primaryKey);\n }\n if (!_.includes(watchlist.categories, category)) {\n watchlist.categories.push(category);\n }\n\n }\n\n function _removeWatchlistItem(item) {\n\n var primaryKey = _.isObject(item) ? item.primaryKey__ : item;\n if (!_.includes(watchlist.primaryKeys, primaryKey)) {\n return;\n }\n\n _.pull(watchlist.primaryKeys, primaryKey);\n var oldCategory = watchlist.primaryKeyCategory[primaryKey];\n delete watchlist.primaryKeyCategory[primaryKey];\n\n _removeCategory(primaryKey, oldCategory);\n\n }\n\n function _removeCategory(primaryKey, category) {\n _.pull(watchlist.categoryPrimaryKeys[category], primaryKey);\n if (_.isEmpty(watchlist.categoryPrimaryKeys[category])) {\n delete watchlist.categoryPrimaryKeys[category];\n _.pull(watchlist.categories, category);\n }\n }\n\n function _loadWatchlist() {\n var json = LocalStorage.getItem(ITEM_WATCHLIST);\n var items = angular.fromJson(json);\n if (_.isArray(items)) {\n // Watchlist was in old format (array of primary keys)\n items = {};\n }\n _setWatchlist(items);\n }\n\n function _saveWatchlist() {\n var json = angular.toJson(watchlist);\n LocalStorage.setItem(ITEM_WATCHLIST, json);\n }\n\n function _setWatchlist(items) {\n watchlist = (items || {});\n watchlist.primaryKeys = (watchlist.primaryKeys || []);\n watchlist.categories = (watchlist.categories || []);\n watchlist.primaryKeyCategory = (watchlist.primaryKeyCategory || {});\n watchlist.categoryPrimaryKeys = (watchlist.categoryPrimaryKeys || {});\n }\n\n (function () {\n _loadWatchlist();\n })();\n\n})\n.factory('MediaAssetResource', function($resource) {\n var baseUrl = lax_rest_url_escaped('mediaAssets/');\n return $resource(\n baseUrl,\n {},\n {\n getBySelection: {method: 'GET', url: baseUrl + 'selected/:selectionId'},\n getNamingPatterns: {method: 'GET', url: baseUrl + 'namingPatterns'},\n export: {method: 'POST', url: baseUrl + 'export'}\n }\n );\n})\n.factory('ItemHierarchyResource', function($resource) {\n var url = lax_rest_url_escaped('itemHierarchies/byItem') + '/:primaryKey/hierarchies';\n return $resource(url, {primaryKey: '@primaryKey'}, {\n get: {method: 'GET', isArray: true}\n });\n})\n.factory('OldItemHierarchyResource', function($resource) {\n var url = lax_rest_url_escaped('items') + '/:primaryKey' + '/hierarchies';\n return $resource(url, {primaryKey: '@primaryKey', hierarchyName: '@hierarchyName'}, {\n get: {method: 'GET'},\n post: {method: 'POST', params: {hierarchyName: '@hierarchyName'} }\n });\n})\n.factory('MyTasksFactory', function(GenericDashletFactory, TaskListsResource) {\n return {\n create: function(config) {\n config = config || {};\n config.fetchData = function(callback) {\n var model = {};\n model.tasks = [];\n TaskListsResource.query({}, function(response) {\n response.forEach(function(list, index, arr) {\n TaskListsResource.query({\n taskListId: list.id\n }, function(tasks) {\n tasks.forEach(function(task, i2, arr) {\n if (config.user.userId == task.assignee && task.taskStatus !=\n \"FINISHED\") {\n model.tasks.push(task);\n }\n });\n });\n });\n callback(model);\n });\n };\n return GenericDashletFactory.create(config);\n }\n };\n})\n.factory('CheckURLRessource', function($resource) {\n var baseUrl = lax_rest_url('checkUrl');\n return $resource(baseUrl, {\n get: {method: 'GET'}\n });\n})\n.factory('GetUrlInfo', function($resource) {\n var baseUrl = lax_rest_url('getUrlInfo');\n return $resource(baseUrl, {\n get: {method: 'GET'}\n });\n})\n.factory('QueryKeyValueMapRessource', function(InfiniteScrollResource) {\n return new InfiniteScrollResource('keyValueMaps/:map');\n})\n.factory('KeyValueMapRessource', function($resource) {\n var url = lax_rest_url('keyValueMaps');\n return $resource(url, {}, {\n getAllMapNames: {method: 'GET', isArray: true},\n getValue: {method: 'GET', url: url + '/:map/:key'},\n updateValue: {method: 'PUT', url: url + '/:map/:key'},\n delete: {method: 'DELETE', url: url + '/:map/:key'}\n });\n})\n\n.factory('CountItemsResource', function($resource) {\n var url = lax_rest_url('items/count');\n return $resource(url, {}, {\n get: {method: 'GET', url: url + '/:selectionId', isArray: false},\n count: {method: 'POST', isArray: false}\n });\n})\n\n.factory('CountMessageResource', function($resource) {\n var url = lax_rest_url('messaging/messagingassets/count');\n return $resource(url, {}, {\n get: {method: 'GET', isArray: false}\n });\n})\n\n.factory('CodelistRessource', function($resource, $http) {\n var url = lax_rest_url('codelists');\n var resource = $resource(url, {}, {\n getAllCodelists: {method: 'GET', isArray: true},\n getCodelist: {method: 'GET', url: url + '/:id/entries', isArray: true},\n getPairs: {method: 'GET', url: url + '/:name/pairs', isArray: true},\n create: {method: 'POST'},\n createEntry: {method: 'POST', url: url + '/:id/entries', isArray: true},\n update: {method: 'PUT', url: url + '/:id'},\n updateEntry: {method: 'PUT', url: url + '/:id/entries/:key'},\n delete: {method: 'DELETE', url: url + '/:id'},\n deleteEntryByKey: {method: 'DELETE', url: url + '/:id/entries/:key'}\n });\n\n resource.deleteEntries = function(id, body) {\n var delUrl = url + '/' + id + '/entries';\n return $http.delete(delUrl, {data: body, headers: {'Content-Type': 'application/json;charset=utf-8'}});\n };\n\n return resource;\n})\n.factory('QueryCodelistResource', function(InfiniteScrollResource) {\n return new InfiniteScrollResource('codelists/:id/entries');\n})\n.factory('BulkSearchResource', function($resource) {\n var baseUrl = lax_rest_url_escaped('bulkSearch/:bulkSearchId');\n return $resource(baseUrl, {\n name: '@name',\n attributeName: '@attributeName'\n });\n})\n.factory('SystemSettingsResource', function($resource) {\n return $resource(lax_rest_url(\"initializeSettings\"), {});\n})\n.factory('EnhancedContentRessource', function($resource, $http) {\n var url = lax_rest_url('enhancedContent');\n var resource = $resource(url, {}, {\n getAll: {method: 'GET', isArray: true},\n getById: {method: 'GET', url: url + '/:id'},\n create: {method: 'POST'},\n update: {method: 'PUT', url: url + '/:id'},\n delete: {method: 'DELETE', url: url + '/:id'},\n publish: {method: 'POST', url: url + '/:id/publish'},\n getHtml: {method: 'GET',url: url + '/:id/generate'},\n getLayoutBlockTemplates: {method: 'GET', url: url + '/_layoutBlockTemplates', isArray: true},\n getRetailerList: {method: 'GET', url: url + '/_retailers', isArray: true}\n });\n\n resource.generatePreview = function(enhancedContent) {\n var generateUrl = url + '/generate';\n return $http.post(generateUrl, enhancedContent);\n };\n\n return resource;\n})\n.factory('QueryEnhancedContentResource', function(InfiniteScrollResource) {\n return new InfiniteScrollResource('enhancedContent');\n})\n.factory('SimpleMappingsResource', function($resource, $http) {\n var url = lax_rest_url('simpleMappings');\n return $resource(url, {}, {\n getAll: { method: 'GET', isArray: true },\n create: { method: 'POST' },\n delete: { method: 'DELETE', url: url + '/:id' },\n update: { method: 'PUT', url: url + '/:id' },\n getEntries: { method: 'GET', isArray: true, url: url + '/:id/entries?limit=-1' },\n createEntry: { method: 'POST', url: url + '/:id/entries/:key' },\n createEntries: { method: 'POST', isArray: true, url: url + '/:id/entries' },\n updateEntry: { method: 'PUT', url: url + '/:id/entries/:key' },\n deleteEntry: { method: 'DELETE', url: url + '/:id/entries/:key' },\n // FIXME: Solved in angular +1.6.4, as they interpret the specs such that the DELETE request has no body in prior versions.\n deleteEntries: { method: 'DELETE', url: url + '/:id/entries', hasBody: true }\n });\n})\n.factory('GdsnPartiesResource', function($resource, $http) {\n var url = lax_rest_url('gdsn/parties');\n return $resource(url, {}, {\n get: { method: 'GET', isArray: true }\n });\n})\n.factory('AssetFoldersResource', function($resource) {\n return function(path) {\n\n var url = lax_rest_url('assetFolders');\n if (!_.isEmpty(path)) {\n path = encodeURI(path);\n if (!_.startsWith(path, \"/\")) {\n path = \"/\" + path;\n }\n }\n\n var actions = {\n getRootFolderContents: { method: 'GET', isArray: true },\n getFolderContents: { method: 'GET', url: url + path, isArray: true },\n createFolder: { method: 'POST', url: url + path },\n convertToPublicAsset: { method: 'PUT', url: url + '/_convertToPublicAsset' + path },\n moveAsset: { method: 'PUT', url: url + '/_moveAsset' + path },\n moveFolder: { method: 'PUT', url: url + '/_moveFolder' + path },\n renameFolder: { method: 'PUT', url: url + '/_renameFolder' + path },\n renameAsset: { method: 'PUT', url: url + '/_renameAsset' + path },\n delete: { method: 'DELETE', url: url + '/_delete' + path },\n // FIXME: Solved in angular +1.6.4, as they interpret the specs such that the DELETE request has no body in prior versions.\n deleteItems: { method: 'DELETE', url: url + '/_deleteItems', hasBody: true }\n };\n\n return $resource(url, {}, actions);\n };\n})\n.service('ReactBridge', function($modal, $timeout) {\n\n this.mountPage = function(pageName, mountPoint) {\n var node = document.createElement('div');\n var root = window.reactCreateComponent(node);\n root.render(window.reactPages[pageName]());\n $(mountPoint)[0].appendChild(node);\n };\n\n this.mountComponent = function(componentName, mountPoint, props) {\n var node = document.createElement('div');\n var root = window.reactCreateComponent(node, props);\n root.render(window.reactComponents[componentName](props));\n $(mountPoint)[0].appendChild(node);\n };\n\n this.mountDialog = function(dialogName, mountPoint, props) {\n var node = document.createElement('div');\n var root = window.reactCreateComponent(node, props);\n root.render(window.reactDialogs[dialogName](props));\n $(mountPoint)[0].appendChild(node);\n\n return root;\n };\n\n /**\n * Helper function to unmount the React Dialog after displaying the toast for a specified duration.\n */\n this.unmountWhenReady = function(unmount) {\n // Unmount the React Dialog after displaying the toast for a maximum duration of 4 seconds (4000 milliseconds).\n // Ensure unmount is a function before calling it\n if (angular.isFunction(unmount)) {\n $timeout(function() {\n unmount();\n },4000);\n }\n };\n\n this.showAssetFoldersModal = function(onFileSelected, acceptedTypes) {\n $modal.open({\n templateUrl: 'tpl/asset-folders/modal-asset-folders.tpl.html',\n controller: 'AssetFoldersController',\n backdrop: true,\n size: 'lg',\n windowClass: 'asset-folders-modal',\n resolve: {\n modalParams: function() {\n return {\n accept: acceptedTypes,\n onFileSelected: onFileSelected\n };\n }\n }\n });\n };\n})\n.service('FilePreviewService', function($q, $timeout, $log, $filter, AssetFoldersService) {\n // Helper function to perform the GET request and check the URL\n function checkURLWithGetRequestAsync(url, signal, onSuccess) {\n if (_.isNil(url)) {\n var deferred = $q.defer();\n deferred.resolve();\n return deferred.promise;\n }\n\n var baseUrl = lax_rest_url('getUrlInfo');\n var requestUrl = baseUrl + '?url=' + url;\n\n return fetch(requestUrl, {\n method: 'GET',\n signal: signal\n })\n .then(function(response) {\n if (response.ok) {\n return response.json();\n } else {\n throw new Error('Failed to fetch');\n }\n })\n .then(function(data) {\n var mimeType = data.contentType ? data.contentType.split(';')[0] : '';\n onSuccess(mimeType, data.url);\n })\n .catch(function(error) {\n if (error && error.status !== 0) {\n $log.error('Error occurred:', error);\n } else {\n $log.info('Request aborted');\n }\n });\n }\n\n // Function to handle preview generation based on content type\n function setPreview(contentType, url, scope) {\n var isDrawable = $filter('isFileType')({ type: contentType }, 'drawable');\n if (isDrawable) {\n if (!_.isNil(scope.onLoad)) {\n scope.onLoad();\n }\n $timeout(function () {\n scope.dataOrUrl = url;\n }, 0);\n scope.loading = false;\n scope.error = false;\n } else {\n // Default to mime type-based icon\n scope.fileIcon = AssetFoldersService.getFileIconByMimeType(contentType);\n var isMimeType = _.includes(contentType, \"/\");\n if (!isMimeType) {\n $timeout(function () {\n // Fallback to file extension if mime type is not available\n scope.fileIcon = AssetFoldersService.getFileIcon(contentType);\n }, 0);\n }\n scope.loading = false;\n scope.error = false;\n if (!_.isNil(scope.onLoad)) {\n scope.onLoad();\n }\n }\n }\n\n // Main function to preview the file\n function preview(url, scope, $element) {\n if (_.isNil(url)) {\n return;\n }\n\n scope.loading = true;\n scope.error = false;\n scope.dataOrUrl = null;\n scope.fileIcon = null;\n scope.requestController = new AbortController();\n\n var fileType = $filter('fileType')(url);\n\n if (!_.isEmpty(fileType)) {\n fileType = fileType.toLowerCase();\n setPreview(fileType, url, scope, $element);\n } else {\n checkURLWithGetRequestAsync(url, scope.requestController.signal, function (contentType, url) {\n setPreview(contentType, url, scope, $element);\n });\n }\n }\n\n return {\n preview: preview,\n checkURLWithGetRequestAsync: checkURLWithGetRequestAsync,\n setPreview: setPreview\n };\n});\n\n","angular.module('llax.services')\n .service('AssetFoldersService', function($log, $rootScope, $q, AssetFoldersResource, FileUploader) {\n\n this.LINK_TYPE_FOLDER = 'FOLDER';\n this.LINK_TYPE_ASSET = 'ASSET';\n\n this.EVENT_UPDATED = 'assetFolders.updated';\n this.EVENT_CHILDS_UPDATED = 'assetFolders.childsUpdated';\n\n this.getDefaultUploadUrl = function() {\n return lax_rest_url('assetFolders/_uploadFile');\n };\n\n this.getUploadUrl = function(path) {\n path = encodeURI(path);\n return lax_rest_url('assetFolders/_uploadFile/' + path);\n };\n\n this.getUploader = function (path, config) {\n\n return new FileUploader({\n url: this.getUploadUrl(path),\n multiple: config.multiple || false,\n formData: config.formData || [],\n autoUpload: config.autoUpload || false,\n reset: config.reset || false,\n removeAfterUpload: config.removeAfterUpload || false,\n onCompleteAll: function() {\n if (_.isFunction(config.onCompleteAll)) {\n config.onCompleteAll(this);\n }\n },\n onAfterAddingFile: function(fileItem) {\n if (config.useFilename) {\n fileItem.alias = fileItem.file.name;\n }\n\n if (_.isFunction(config.onAfterAddingFile)) {\n config.onAfterAddingFile(fileItem);\n }\n },\n onErrorItem: function(item, response, status, headers) {\n if (_.isFunction(config.onErrorItem)) {\n config.onErrorItem(item, response, status, headers);\n }\n }\n });\n };\n\n this.getPublicAssetUrlAsync = function(linkedAsset, linkedAssetPath) {\n\n var publicAssetUrl = linkedAsset.publicAssetUrl;\n var deferred = $q.defer();\n\n if (_.isEmpty(publicAssetUrl)) {\n AssetFoldersResource(linkedAssetPath).convertToPublicAsset(\n {},\n function(response) {\n deferred.resolve(response);\n }, function(error) {\n deferred.reject(error);\n });\n } else {\n deferred.resolve(linkedAsset);\n }\n\n return deferred.promise;\n };\n\n this.handleDropEventAsync = function(droppedItems, droppedOnItem, contextPathWhenDragged, onItemMoved) {\n\n var _this = this;\n var deferred = $q.defer();\n\n var destinationPath = '';\n if (_.isNil(droppedOnItem)) { // If not dropped on root, i.e. there is no dropped-on item.\n destinationPath = contextPathWhenDragged;\n } else {\n destinationPath = this.prependCurrentPath(contextPathWhenDragged, droppedOnItem.name);\n }\n\n var moveRequests = _.map(droppedItems, function(item) {\n var sourcePath = item.fullPath;\n var itemType = item.item.linkType;\n\n var request = _this.moveItemAsync(itemType, sourcePath, destinationPath)\n .then(function() {\n onItemMoved(sourcePath, destinationPath);\n });\n\n return request;\n });\n\n $q.all(moveRequests)\n .then(function() {\n deferred.resolve();\n }).catch(function(error){\n deferred.reject(error);\n });\n\n return deferred.promise;\n };\n\n this.sortAssetItems = function(items) {\n var _this = this;\n return items.sort(function(a, b) {\n try {\n if (a.linkType === b.linkType) {\n return a.name.toLocaleLowerCase().localeCompare(b.name.toLocaleLowerCase());\n } else {\n // Folders before files\n return a.linkType === _this.LINK_TYPE_FOLDER ? -1 : 1;\n }\n } catch(e) {\n $log.error(e);\n return 0;\n }\n });\n };\n\n this.decodeFilename = function(filename) {\n return decodeURIComponent(filename.replace(/\\+/g, ' '));\n };\n\n this.getParentFolderPath = function(path) {\n if (_.isEmpty(path)) {\n return path;\n } else {\n var pathComponents = path.split('/');\n pathComponents.pop();\n return pathComponents.join('/');\n }\n };\n\n this.moveItemAsync = function(linkType, sourcePath, destinationPath) {\n\n var deferred = $q.defer();\n\n // Ignore if we are moving the same item\n if (sourcePath === destinationPath) {\n deferred.reject('moveItemAsync: Source is the same as the destination');\n return deferred.promise;\n }\n\n if (linkType === this.LINK_TYPE_FOLDER) {\n AssetFoldersResource(sourcePath).moveFolder({\n path: destinationPath\n }, function(response) {\n deferred.resolve();\n }, function(error) {\n deferred.reject(error);\n });\n } else if (linkType === this.LINK_TYPE_ASSET) {\n AssetFoldersResource(sourcePath).moveAsset({\n path: destinationPath\n }, function(response) {\n deferred.resolve();\n }, function(error) {\n deferred.reject(error);\n });\n }\n\n return deferred.promise;\n };\n\n this.prepareDragAndDropEvent = function($event, draggedItems, contextPathWhenDragged) {\n\n var _this = this;\n var eventDataItem = _.map(draggedItems, function(item) {\n var itemFullPath =\n _this.prependCurrentPath(contextPathWhenDragged, item.name);\n\n return {\n fullPath: itemFullPath,\n item: item\n };\n });\n\n $event.originalEvent.dataTransfer.setData('application/json', JSON.stringify(eventDataItem));\n };\n\n this.prependCurrentPath = function(currentPath, path) {\n if (_.isEmpty(currentPath)) {\n return path;\n } else {\n return currentPath + '/' + path;\n }\n };\n\n this.getFileIcon = function(fileName) {\n fileName = fileName.toLowerCase();\n if (fileName.endsWith('pdf')) {\n return 'syncons-file-pdf';\n } else if (fileName.endsWith('csv') || fileName.endsWith('xlsx') || fileName.endsWith('xls')) {\n return 'syncons-file-excel';\n } else if (fileName.endsWith('ppt') || fileName.endsWith('pptx')) {\n return 'syncons-file-powerpoint';\n } else if (fileName.endsWith('json')) {\n return 'syncons-file-code';\n } else if (fileName.endsWith('docx') || fileName.endsWith('doc')) {\n return 'syncons-file-word';\n } else if (fileName.endsWith('zip') || fileName.endsWith('rar') || fileName.endsWith('tar.gz')) {\n return 'syncons-file-zip';\n } else if (fileName.endsWith('txt')) {\n return 'syncons-file-text';\n } else {\n return 'syncons-file';\n }\n };\n\n this.getFileIconByMimeType = function(mimeType) {\n switch(mimeType) {\n case 'application/pdf':\n return 'syncons-file-pdf';\n\n case 'text/csv':\n case 'application/vnd.ms-excel':\n case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':\n case 'application/vnd.ms-excel.sheet.macroenabled':\n return 'syncons-file-excel';\n\n case 'application/vnd.ms-powerpoint':\n case 'application/vnd.openxmlformats-officedocument.presentationml.presentation':\n return 'syncons-file-powerpoint';\n\n case 'application/json':\n return 'syncons-file-code';\n\n case 'application/msword':\n case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':\n return 'syncons-file-word';\n\n case 'application/zip':\n return 'syncons-file-zip';\n\n case 'text/plain':\n return 'syncons-file-text';\n\n default:\n return 'syncons-file';\n }\n };\n\n });\n","angular.module('llax.services')\n .service('AdditionalCategoryService', function($rootScope, $log, $q, DataModelRetrievalResource) {\n\n var _this = this;\n this.memo = {};\n this.statusMap = {};\n this.resolves = [];\n this.rejects = [];\n\n /**\n * Memoizes the additional category loading call (any parallel calls will have the first result):\n * 1- Checks IndexedDB.\n * 2- if not found, fetches the additional category from the backend.\n */\n this.loadAdditionalCategory = function(additionalCategoryNameOrCode,\n additionalModule) {\n\n if (_.isEmpty(additionalCategoryNameOrCode) || _.isEmpty(additionalModule)) {\n return $q.when({});\n }\n\n var memoKey = [additionalCategoryNameOrCode, additionalModule].join(':');\n if (_this.memo[memoKey]) {\n return $q.when(_this.memo[memoKey]());\n }\n\n if (_this.statusMap[memoKey] === \"pending\") {\n return new Promise(function(_res, _rej) {\n _this.resolves.push(_res);\n _this.rejects.push(_rej);\n });\n }\n\n var deferred = $q.defer();\n try {\n _this.statusMap[memoKey] = \"pending\";\n\n var currentDataModelHash = $rootScope.organization.dataModelHash;\n\n $rootScope.dataModel\n .getCachedAdditionalCategory(additionalCategoryNameOrCode, additionalModule, currentDataModelHash)\n .then(function(result) {\n\n if (_.isEmpty(result) || result.dataModelHash !== currentDataModelHash || result.translatedLanguage !== $rootScope.language) {\n\n // Also ensure the cache is busted when the data model hash is different (if exists)\n $rootScope.dataModel\n .deleteCachedAdditionalCategory(additionalCategoryNameOrCode, additionalModule)\n .then(function() {\n\n _this.fetchAndCacheAdditionalCategory(additionalCategoryNameOrCode, additionalModule)\n .then(function(result) {\n result.translatedLanguage = $rootScope.language;\n _this.statusMap[memoKey] = \"success\";\n _this.memo[memoKey] = function get() {\n return result;\n };\n\n _this.resolves.forEach(function(resolve) {\n resolve(result);\n });\n\n deferred.resolve(_this.memo[memoKey]());\n\n });\n\n });\n } else {\n\n _this.statusMap[memoKey] = \"success\";\n _this.memo[memoKey] = function get() {\n return result;\n };\n\n _this.resolves.forEach(function(resolve) {\n resolve(result);\n });\n\n deferred.resolve(_this.memo[memoKey]());\n }\n });\n\n } catch (err) {\n $log.error('AdditionalCategoryService: Could not load additional category entry', memoKey, err);\n _this.statusMap[memoKey] = \"error\";\n _this.rejects.forEach(function(reject) {\n reject(err);\n });\n throw err;\n }\n\n return deferred.promise;\n };\n\n this.fetchAndCacheAdditionalCategory = function(additionalCategoryNameOrCode, additionalModule) {\n\n return DataModelRetrievalResource.query({\n method: 'categories',\n q: additionalCategoryNameOrCode,\n dataModel: additionalModule,\n limit: 1\n }).$promise.then(function(result) {\n\n result = result[0];\n result.additionalCategoryNameOrCode = additionalCategoryNameOrCode;\n result.additionalModule = additionalModule;\n\n var currentDataModelHash = $rootScope.organization.dataModelHash;\n result.dataModelHash = currentDataModelHash;\n\n $rootScope.dataModel.insertCachedAdditionalCategory(additionalCategoryNameOrCode, additionalModule, currentDataModelHash, result);\n return result;\n\n });\n };\n });","angular.module('llax.services')\n .service('EnumAttributeService', function($log, $q, $rootScope, CodelistRessource, DataModelCustomizationConstants, OrganizationService,\n UrlRetrievalService) {\n\n this.isDynamicEnumAttribute = function(attribute) {\n return _.has(attribute.params, 'dynamicValuesUrl');\n };\n\n this.isCodelistAttribute = function(attribute) {\n return _.includes(DataModelCustomizationConstants.CODELIST_TYPES, attribute.typeName);\n };\n\n /**\n * Returns an Enum options and mutate the attribute with the options and other filter parameters.\n */\n this.getAttributeOptionsAsync = function(attribute, forceReloadDynamicEnum) {\n\n var deferred = $q.defer();\n var self = this;\n\n if (_.has(attribute, 'options') && !forceReloadDynamicEnum) {\n deferred.resolve(attribute.options);\n return deferred.promise;\n } else if (!_.has(attribute, 'params')) {\n deferred.resolve(null);\n return deferred.promise;\n }\n\n if (self.isDynamicEnumAttribute(attribute)) {\n if (forceReloadDynamicEnum || _.isNil(attribute.params.values)) {\n\n if (!attribute.loadingDynamicValues) {\n attribute.loadingDynamicValues = true;\n $log.debug(\"Reloading option values for DynamicEnum attribute '%s'\", attribute.name);\n UrlRetrievalService.get(attribute.params.dynamicValuesUrl).then(function(data) {\n attribute.params.values = data;\n delete attribute.options;\n $log.debug(\"Option values loaded for DynamicEnum attribute '%s'\", attribute.name);\n self.getAttributeOptionsFromOptionsParamAsync(attribute, forceReloadDynamicEnum)\n .then(function(options) {\n deferred.resolve(options);\n }).catch(function(error) {\n $log.error(\"Failure when trying to load option values for '%s' '%s'\", attribute.name, error);\n deferred.resolve(null);\n });\n }).finally(function() {\n attribute.loadingDynamicValues = false;\n });\n } else {\n $log.debug(\"Option values loaded for DynamicEnum attribute '%s' are still being loaded from previous calls\", attribute.name);\n deferred.resolve(null);\n }\n\n } else {\n self.getAttributeOptionsFromOptionsParamAsync(attribute)\n .then(function(options) {\n deferred.resolve(options);\n });\n }\n } else if (self.isCodelistAttribute(attribute)) {\n self.getCodelistOptionsAsync(attribute)\n .then(function(options) {\n $rootScope.translateAllOptions(attribute, options);\n deferred.resolve(options);\n });\n } else {\n self.getAttributeOptionsFromOptionsParamAsync(attribute)\n .then(function(options) {\n deferred.resolve(options);\n });\n }\n\n return deferred.promise;\n };\n\n this.getAttributeOptionsFromOptionsParamAsync = function(attribute, forceReloadDynamicEnum) {\n\n var self = this;\n var deferred = $q.defer();\n var options;\n var optionsParam = $rootScope.dataModel.getAttributeOptionsParam(attribute);\n if (_.isEmpty(optionsParam)) {\n\n // Get options from referenced attribute, if no options were defined\n var referencedOptionAttribute = $rootScope.dataModel.getReferencedOptionAttribute(attribute);\n if (_.has(referencedOptionAttribute, 'params')) {\n\n $rootScope.prepareAttribute(referencedOptionAttribute);\n self.getAttributeOptionsAsync(referencedOptionAttribute, forceReloadDynamicEnum)\n .then(function(options) {\n if (!_.isEmpty(options)) {\n\n attribute.options = options;\n\n // Set optionsFilter and createNewOption, overriding the corresponding values of the referenced attribute\n attribute.optionsFilter = attribute.params.uiOptionsFilter || attribute.params.uiCodelistFilter || referencedOptionAttribute.optionsFilter;\n attribute.createNewOption = attribute.params.skipValuesValidation || referencedOptionAttribute.createNewOption;\n\n deferred.resolve(options);\n } else {\n deferred.resolve(null);\n }\n\n });\n\n } else {\n deferred.resolve(null);\n }\n\n } else {\n\n options = _.get(attribute.params, optionsParam);\n var areOptionsLoading = false;\n if (_.isString(options)) {\n\n // Get options from optionList, including filtering by groups\n attribute.optionList = options;\n var groupNames = _.get(attribute.params, optionsParam + 'OptionGroups');\n\n areOptionsLoading = true;\n $rootScope.dataModel.optionListOptionsAsync(attribute.optionList, groupNames)\n .then(function(loadedOptions) {\n\n attribute.optionsFilter = attribute.params.uiOptionsFilter || attribute.params.uiCodelistFilter;\n if (_.isArray(loadedOptions)) {\n attribute.options = loadedOptions;\n attribute.createNewOption = attribute.params.skipValuesValidation;\n attribute.optionsFilter = attribute.params.uiOptionsFilter || attribute.params.uiCodelistFilter;\n }\n\n if (!_.isEmpty(loadedOptions)) {\n $rootScope.translateAllOptions(attribute, loadedOptions);\n deferred.resolve(loadedOptions);\n } else {\n deferred.resolve(null);\n }\n });\n }\n\n if (_.isArray(options)) {\n attribute.options = options;\n attribute.createNewOption = attribute.params.skipValuesValidation;\n attribute.optionsFilter = attribute.params.uiOptionsFilter || attribute.params.uiCodelistFilter;\n }\n\n if (!_.isEmpty(options) && !areOptionsLoading) {\n $rootScope.translateAllOptions(attribute, options);\n deferred.resolve(options);\n } else if (!areOptionsLoading) {\n deferred.resolve(null);\n }\n }\n\n return deferred.promise;\n };\n\n this.getCodelistOptionsAsync = function(attribute) {\n\n var deferred = $q.defer();\n\n CodelistRessource.getPairs({\n name: attribute.params.codelist,\n limit:0\n }, function(data) {\n attribute.params.values = data;\n attribute.createNewOption = attribute.params.skipValuesValidation;\n attribute.optionsFilter = attribute.params.uiOptionsFilter || attribute.params.uiCodelistFilter;\n deferred.resolve(data);\n });\n\n return deferred.promise;\n };\n\n /**\n * Tries to filter attribute options, if:\n * 1- the attribute has 'optionsFilter' defined.\n * 2- the attribute 'params' has an 'uiParamsFilter' defined (legacy).\n *\n * FIXME: 'currentValue' is never used.\n *\n * @param item\n * @param attribute The enum attribute.\n * @param collectionEntry The collection entry, in case the attribute is used as a sub/member attribute of another composite attribute.\n * @param currentValue (DEPRECATED) Used for search functionality.\n * @param options The enum attribute options which are going to be filtered.\n */\n this.filterOptions = function(item, attribute, collectionEntry, currentValue, options) {\n\n var filteredOptions;\n if (!_.isEmpty(attribute.optionsFilter)) {\n filteredOptions = applyOptionsFilter(item, attribute, collectionEntry, currentValue, options, attribute.optionsFilter);\n } else if (!_.has(attribute.params, 'uiParamsFilter') && attribute.typeName === 'Dimensional') {\n\n // For compatibility: Unless a filter was applied, set user's UI language first, if it matches any option key\n var languageOption = _.find(options, { key: $rootScope.language });\n if (!_.isEmpty(languageOption)) {\n filteredOptions = _.concat([languageOption], _.filter(options, function(option) {\n return option.key !== languageOption.key;\n }));\n } else {\n filteredOptions = options;\n }\n\n } else {\n filteredOptions = options;\n }\n\n return filteredOptions;\n };\n\n /**\n * Invokes the AngularJS (customDirective) data model defined filter on the enum options.\n *\n * @param item\n * @param attribute The enum attribute.\n * @param collectionEntry The collection entry, in case the attribute is used as a sub/member attribute of another composite attribute.\n * @param currentValue (DEPRECATED) Used for search functionality.\n * @param options The enum attribute options which are going to be filtered.\n * @param optionsFilter The filter name to be invoked (AngularJS filter name).\n */\n function applyOptionsFilter(item, attribute, collectionEntry, currentValue, options, optionsFilter) {\n\n if (_.isNil(optionsFilter)) {\n return options;\n }\n\n var filter = $rootScope.getFilter(optionsFilter);\n if (_.isNil(filter)) {\n return options;\n }\n\n var user = $rootScope.user;\n var organization = OrganizationService.getOrganizationSnapshot();\n\n var keyBy = _.keyBy(options, 'key');\n var keys = _.keys(keyBy);\n var filteredKeys = filter(keys, item, attribute, user, organization, collectionEntry);\n\n if (!$rootScope.isEqual(keys, filteredKeys)) {\n\n if (attribute.typeName === 'Boolean') {\n // In case of Boolean attribute, we only want to disable the option\n // not returned by the filter, and not hide it completely.\n options = _.map(options, function(option) {\n if (!_.includes(filteredKeys, option.key)) {\n option.disabled = true;\n }\n return option;\n });\n } else {\n // For other attribute types, pick only matching keys\n var picked = _.pick(keyBy, filteredKeys);\n options = _.values(picked);\n }\n }\n\n return options;\n }\n });","angular.module('llax.services')\n .service('GroupAttributeService', function($filter, $rootScope, $parse, $sce, MultiDimensionalAttributeService, $log) {\n\n var self = this;\n\n self.initializeScope = function($scope) {\n self.$scope = $scope;\n $scope.groupStructure = [];\n $scope.groupMemberAttributes = [];\n $scope.showHideGroupData = [];\n $scope.groupAttributeError = [];\n $scope.validationsGroupItem = {};\n\n $scope.getModel = self.getModel;\n $scope.isGroupRendered = self.isGroupRendered;\n $scope.isGroupEmpty = self.isGroupEmpty;\n $scope.isGroupRenderedEntityEmpty = self.isGroupRenderedEntityEmpty;\n $scope.getVisibleMemberAttributes = self.getVisibleMemberAttributes;\n $scope.initGroupAttribute = self.initGroupAttribute;\n $scope.showGroupData = self.showGroupData;\n $scope.initGroup = self.initGroup;\n $scope.initEntry = self.initEntry;\n $scope.getEntryTitle = self.getEntryTitle;\n $scope.newGroup = self.newGroup;\n $scope.addGroup = self.addGroup;\n $scope.groupTitleClick = self.groupTitleClick;\n $scope.copyGroup = self.copyGroup;\n $scope.deleteGroup = self.deleteGroup;\n $scope.clearGroup = self.clearGroup;\n $scope.groupEven = self.groupEven;\n $scope.isGroup = self.isGroup;\n $scope.getGroupTitleError = self.getGroupTitleError;\n $scope.getGroupTitleWarning = self.getGroupTitleWarning;\n $scope.getGroupValidationMessages = self.getGroupValidationMessages;\n $scope.hasGroupValidationMessages = self.hasGroupValidationMessages;\n $scope.checkGroupValidations = self.checkGroupValidations;\n $scope.checkGroupValidation = self.checkGroupValidation;\n $scope.isGroupKeyAttribute = self.isGroupKeyAttribute;\n $scope.checkGroupLocalValidations = self.checkGroupLocalValidations;\n $scope.getLocalValidationErrors = self.getLocalValidationErrors;\n $scope.hasLocalValidationErrors = self.hasLocalValidationErrors;\n $scope.registerLocalValidationsWatcher = self.registerLocalValidationsWatcher;\n };\n\n self.getModel = function(attribute, parentId, parentAttribute) {\n var string = \"item\";\n var pathString = \"\";\n var createPath = function (attr, parentId) {\n var entry = _.find(self.$scope.groupStructure, {\n 'attribute': attr\n });\n pathString = \"['\" + attr.name + \"'][\" + getIndex(entry, parentId, entry.parentAttribute) + \"]\" + pathString;\n if (entry.level > 0) {\n var indexEntry = _.find(self.$scope.groupIndexes, {\n 'id': parentId\n });\n createPath(entry.parentAttribute, indexEntry.parentId);\n }\n };\n createPath(parentAttribute, parentId);\n\n string = string + pathString + \"['\" + attribute.name + \"']\";\n return string;\n };\n\n function getIndex(groupEntry, parentId, parentAttribute) {\n //look up containing group attribute and level and then get index\n var entry = _.find(self.$scope.groupIndexes, {\n 'id': parentId\n });\n var index = entry ? entry.__index__ : -1;\n\n return index;\n }\n\n self.isGroupRendered = function(attribute) {\n return _.isEqual(attribute.params.rendererParams.type, 'Group');\n };\n\n self.isGroupEmpty = function(attribute) {\n if (_.isEqual(attribute.typeName, 'Group')) {\n return _.isEmpty(self.$scope.item[attribute.name]);\n }\n return false;\n };\n\n self.isGroupRenderedEntityEmpty = function(attribute) {\n if (_.isEqual(attribute.params.rendererParams.type, 'Group')) {\n return _.isEmpty(self.$scope.item[attribute.name]);\n }\n return false;\n };\n\n self.getVisibleMemberAttributes = function (attribute) {\n // Only non-hidden attributes\n var memberAttributes = self.$scope.dataModel.getMemberAttributes(attribute);\n memberAttributes = _.filter(memberAttributes, function (memberAttribute) {\n return !self.$scope.isAttributeHidden(memberAttribute);\n });\n return memberAttributes;\n };\n\n self.initGroupAttribute = function (attribute, groupAttribute) {\n //the attribute could be a `string` because of the filter : dynamicFilter\n if (_.isString(attribute)) {\n attribute = self.$scope.dataModel.getMemberAttributes(attribute);\n }\n $rootScope.prepareAttribute(attribute);\n if (attribute) {\n attribute.isComplexType = (attribute.typeName == 'Collection' || attribute.typeName ==\n 'MultiDimensional' || attribute.typeName == 'MultiReference');\n }\n return attribute;\n };\n\n self.showGroupData = function (attributeName, parentId, index) {\n\n var show = false;\n var entry = _.find(self.$scope.showHideGroupData[attributeName], {\n 'parentId': parentId,\n '__index__': index\n });\n if (entry) {\n show = entry.show;\n }\n return show;\n };\n\n function isGroupOrGroupRendered(attribute) {\n if (attribute.typeName === 'Group' || attribute.params.renderer === 'Group') {\n return true;\n } else {\n return false;\n }\n }\n\n self.initGroup = function (attribute, parentId) {\n\n var $scope = self.$scope;\n var checkGroupLevels = [];\n var attributeMembers = [];\n var groupIsReadOnly = [];\n $scope.groupMemberAttributes[attribute.name] =\n $scope.groupMemberAttributes[attribute.name] ? $scope.groupMemberAttributes[attribute.name]: [];\n checkGroupLevels[attribute.name] = false;\n attributeMembers[attribute.name] = self.getVisibleMemberAttributes(attribute);\n groupIsReadOnly[attribute.name] = $scope.isAttributeReadonly(attribute);\n\n _.forEach(attributeMembers[attribute.name], function (member) {\n var a = member;\n $rootScope.setInputRenderer(a);\n $scope.groupMemberAttributes[attribute.name].push(a);\n if (isGroupOrGroupRendered(a)) {\n checkGroupLevels[attribute.name] = true;\n }\n if (groupIsReadOnly[attribute.name] && !$scope.isAttributeHidden(a)) {\n $scope.attributeStates[a.name] = [\"readonly\"];\n }\n });\n\n var groupEntry = _.find($scope.groupStructure, {\n 'attribute': attribute\n });\n\n if (groupEntry && groupEntry.level > 0) {\n return;\n }\n\n if (!groupEntry && !checkGroupLevels[attribute.name]) {\n if (!$scope.item[attribute.name]) {\n $scope.item[attribute.name] = [];\n }\n $scope.groupStructure.push({\n 'attribute': attribute,\n 'parentAttribute': undefined,\n 'level': 0\n });\n }\n\n //check if group contains other group\n if (checkGroupLevels[attribute.name] && !groupEntry) {\n var level = 0;\n var checkGroup = function (containingAttribute) {\n if(level == 0) {\n $scope.groupStructure.push({\n 'attribute': containingAttribute,\n 'parentAttribute': undefined,\n 'level': level\n });\n }\n\n var attributeMembers = self.getVisibleMemberAttributes(containingAttribute);\n _.forEach(attributeMembers, function (member) {\n $rootScope.setInputRenderer(member);\n if (isGroupOrGroupRendered(member)) {\n level++;\n $scope.groupStructure.push({\n 'attribute': member,\n 'parentAttribute': containingAttribute,\n 'level': level\n });\n checkGroup(member);\n }\n });\n };\n checkGroup(attribute);\n }\n };\n\n self.initEntry = function (attribute, id, index, parentId) {\n\n var $scope = self.$scope;\n if (!$scope.groupIndexes) {\n $scope.groupIndexes = [];\n }\n $scope.groupIndexes.push({\n 'id': id,\n '__index__': index,\n 'parentId': parentId\n });\n };\n\n self.getEntryTitle = function(attribute, model, index) {\n\n var $scope = self.$scope;\n var filterName = 'defaultGroupTitleFilter';\n var filterParameters = [];\n\n // Override the 'defaultGroupTitleFilter' if there is one defined in the data model.\n if (!_.isNil(attribute.params.uiGroupTitleFilter)) {\n var uiGroupTitleFilter = attribute.params.uiGroupTitleFilter;\n if (_.isArray(uiGroupTitleFilter)) {\n uiGroupTitleFilter = _.chain(uiGroupTitleFilter)\n .keyBy('key')\n .mapValues('value')\n .value();\n filterName = uiGroupTitleFilter.filter_name;\n filterParameters = uiGroupTitleFilter.filter_parameters;\n } else if (_.isString(uiGroupTitleFilter)) {\n filterName = uiGroupTitleFilter;\n } else {\n $log.warn('Could not parse group title filter', attribute);\n }\n }\n\n var entry = null;\n if (_.isNil(model)) {\n entry = $scope.item[attribute.name][index];\n } else {\n // In case of nested entries.\n entry = $parse(model)($scope)[index];\n }\n\n var title = $filter(filterName)(entry, index, filterParameters, attribute, $scope.item, $rootScope.user, $rootScope.organization);\n return $sce.trustAsHtml(title);\n };\n\n self.newGroup = function(attribute, parentId) {\n\n var $scope = self.$scope;\n var populateGroup = function(attribute){\n var entryTmp = {};\n var attributeMembers = self.getVisibleMemberAttributes(attribute);\n _.forEach(attributeMembers,function(member){\n if(member.typeName == 'Group'){\n entryTmp[member.name] = [];\n } else {\n entryTmp[member.name] = undefined;\n }\n });\n return entryTmp;\n };\n\n var entry = populateGroup(attribute);\n entry.__index__ = 1;\n\n //identify at what recursion level store the value\n var group = _.find($scope.groupStructure, {\n 'attribute': attribute\n });\n if(group){\n var level = group ? group.level : 0;\n if(level <= 0){\n if(!$scope.item[attribute.name]){\n $scope.item[attribute.name] = [];\n }\n $scope.item[attribute.name].push(entry);\n\n } else {\n var model = $parse($scope.getModel(attribute, parentId, group.parentAttribute));\n var tmp = [];\n tmp.push(entry);\n model.assign($scope, tmp);\n }\n }\n };\n\n self.addGroup = function (attribute, parentId, index) {\n\n var $scope = self.$scope;\n var newEntry = {};\n var attributeMembers = self.getVisibleMemberAttributes(attribute);\n _.forEach(attributeMembers, function (member) {\n newEntry[member.name] = undefined;\n });\n\n //identify at what recursion level store the value\n var group = _.find($scope.groupStructure, {\n 'attribute': attribute\n });\n var level = group ? group.level : 0;\n\n if (level <= 0) {\n //to-do: adding in between\n index = $scope.item[attribute.name].length;\n newEntry.__index__ = index + 1;\n\n $scope.item[attribute.name].splice(index + 1, 0, newEntry);\n } else {\n var modelString = $scope.getModel(attribute, parentId, group.parentAttribute);\n var tmp = $scope.$eval(modelString);\n var model = $parse(modelString);\n\n //to-do: adding in between\n index = tmp.length;\n\n tmp.splice(index + 1, 0, newEntry);\n model.assign($scope, tmp);\n }\n };\n\n self.groupTitleClick = function (attribute, parentId, index) {\n var $scope = self.$scope;\n var entry = _.find($scope.showHideGroupData[attribute.name], {\n 'parentId': parentId,\n '__index__': index\n });\n\n if (!entry) {\n if (!$scope.showHideGroupData[attribute.name]) {\n $scope.showHideGroupData[attribute.name] = [];\n }\n entry = {\n 'parentId': parentId,\n '__index__': index,\n show: true\n };\n $scope.showHideGroupData[attribute.name].push(entry);\n } else {\n entry.show = !entry.show;\n }\n return entry.show;\n };\n\n self.copyGroup = function (attribute, parentId, prevEntry, index) {\n\n var $scope = self.$scope;\n var newEntry = {};\n _.forEach(prevEntry, function (value, key) {\n newEntry[key] = _.cloneDeep(value);\n });\n //identify at what recursion level store the value\n var group = _.find($scope.groupStructure, {\n 'attribute': attribute\n });\n var level = group ? group.level : 0;\n\n if (level <= 0) {\n //to-do: adding in between\n index = $scope.item[attribute.name].length;\n\n $scope.item[attribute.name].splice(index + 1, 0, newEntry);\n } else {\n var modelString = $scope.getModel(attribute, parentId, group.parentAttribute);\n var tmp = $scope.$eval(modelString);\n var model = $parse(modelString);\n\n //to-do: adding in between\n index = tmp.length;\n\n tmp.splice(index + 1, 0, newEntry);\n model.assign($scope, tmp);\n }\n };\n\n function deleteGroup($scope, attribute, entry, parentId, index) {\n\n //identify at what recursion level delete the value\n var group = _.find($scope.groupStructure, {\n 'attribute': attribute\n });\n var level = group ? group.level : 0;\n\n if (level <= 0) {\n _.remove($scope.item[attribute.name], function (value, i, array) {\n return i == index;\n });\n } else {\n var modelString = $scope.getModel(attribute, parentId, group.parentAttribute);\n var tmp = $scope.$eval(modelString);\n var model = $parse(modelString);\n _.remove(tmp, function (value, i, array) {\n return i == index;\n });\n model.assign($scope, tmp);\n }\n var showHide = _.find($scope.showHideGroupData[attribute.name], {\n 'parentId': parentId,\n '__index__': index\n });\n _.remove($scope.showHideGroupData[attribute.name], showHide);\n }\n\n self.deleteGroup = function (attribute, entry, parentId, index) {\n\n var $scope = self.$scope;\n if (!$scope.disableDeleteConfirmation) {\n $scope.removeAttributeValueConfirmation(attribute,function() {\n deleteGroup($scope, attribute, entry, parentId, index);\n });\n } else {\n deleteGroup($scope, attribute, entry, parentId, index);\n }\n };\n\n function clearAttribute($scope, attributeName, reference){\n\n var attribute = $scope.dataModel.attribute(attributeName);\n\n if ($scope.isAttributeReadonly(attribute)) {\n return;\n }\n // We cannot use 'delete' here, because then the ItemChangesQueues would not detect any changes!\n var previousValue = reference[attributeName];\n if (_.isArray(previousValue)) {\n reference[attributeName] = [];\n if ($scope.gridOptionsMap[attributeName]) {\n $scope.gridOptionsMap[attributeName].minRowsToShow = 1;\n }\n } else {\n reference[attributeName] = null;\n }\n //to-do:check if this works with group attribute?\n if (attribute.typeName === 'AdditionalCategory' && !_.isNil(previousValue)) {\n $scope.updateAdditionalCategoryAttributes($scope.item, [attributeName]);\n }\n $scope.$broadcast('clearAttributeValue', attributeName);\n }\n\n self.clearGroup = function(attribute, entry, index) {\n var $scope = self.$scope;\n var attributeMembers = $scope.dataModel.attribute(attribute.params.valueAttribute).members;\n _.forEach(attributeMembers,function(member){\n clearAttribute($scope, member,entry);\n });\n };\n\n self.groupEven = function (attribute) {\n\n var $scope = self.$scope;\n var group = _.find($scope.groupStructure, {\n 'attribute': attribute\n });\n var level = group ? group.level : 0;\n level = level + 1;\n\n if (level % 2 == 0) {\n return true;\n }\n return false;\n };\n\n self.isGroup = function(attribute) {\n return _.isEqual(attribute.typeName, 'Group');\n };\n\n function filterGroupPath($scope, path) {\n\n var includesDimensional = false;\n var newPath = _.filter(path, function (o) {\n if (includesDimensional) {\n includesDimensional = false;\n return false;\n }\n var type = $scope.dataModel.attribute(o) ? $scope.dataModel.attribute(o).typeName : null;\n if (type == \"Composite\") {\n return false;\n } else if (type == \"Dimensional\") {\n includesDimensional = true;\n return true;\n } else {\n return true;\n }\n\n });\n newPath = _.forEach(newPath, function (o, index) {\n if (_.isNumber(o)) {\n newPath[index] = o.toString();\n }\n });\n\n return newPath;\n }\n\n function getValidationsModel($scope, attribute, id, parentId, currentIndex) {\n\n var groupEntry = _.find($scope.groupIndexes, {\n 'id': id\n });\n var groupIndex = groupEntry ? groupEntry.__index__ : -1;\n var groupAttributeEntry = _.find($scope.groupStructure, {\n 'attribute': attribute\n });\n groupLevel = groupAttributeEntry ? groupAttributeEntry.level : -1;\n\n var model = \"item[\" + attribute.name + \"][\" + groupIndex + \"]\";\n if (groupLevel > 0) {\n model = $scope.getModel(attribute, parentId, groupAttributeEntry.parentAttribute) + \"[\" + currentIndex + \"]\";\n }\n return model;\n }\n\n function getPathToCheck(model) {\n var shortModel = model.slice(4);\n var pathToCheck = shortModel.match(/\\[(.*?)\\]/g);\n pathToCheck = _.forEach(pathToCheck, function (o, index) {\n pathToCheck[index] = _.replace(o.slice(1, -1), /\\'/g, \"\");\n });\n return pathToCheck;\n }\n\n self.getGroupTitleError = function (attribute, id, parentId, currentIndex) {\n\n var $scope = self.$scope;\n var model = getValidationsModel($scope, attribute, id, parentId, currentIndex);\n var validations = $scope.validations;\n var count = 0;\n if (validations) {\n _.forEach(validations, function (validation) {\n _.forEach(validation, function (validationEntry) {\n if (validationEntry.level == \"Error\" || validationEntry.level === 'Failure') {\n var pathToCheck = getPathToCheck(model);\n var path = filterGroupPath($scope, validationEntry.path);\n var pathIncluded = pathToCheck.length;\n _.forEach(pathToCheck, function (entry, index) {\n if (entry == path[index]) {\n pathIncluded--;\n }\n });\n if (pathIncluded < 1) {\n count++;\n }\n }\n });\n });\n }\n return count;\n };\n\n self.getGroupTitleWarning = function (attribute, id, parentId, currentIndex) {\n\n var $scope = self.$scope;\n var model = getValidationsModel($scope, attribute, id, parentId, currentIndex);\n var validations = $scope.validations;\n var count = 0;\n if (validations) {\n _.forEach(validations, function (validation) {\n _.forEach(validation, function (validationEntry) {\n if (validationEntry.level == \"Warning\") {\n var pathToCheck = getPathToCheck(model);\n var path = filterGroupPath($scope, validationEntry.path);\n var pathIncluded = pathToCheck.length;\n _.forEach(pathToCheck, function (entry, index) {\n if (entry == path[index]) {\n pathIncluded--;\n }\n });\n if (pathIncluded <= 1) {\n count++;\n }\n }\n\n });\n });\n }\n return count;\n };\n\n self.hasGroupValidationMessages = function (index) {\n var $scope = self.$scope;\n if ($scope.validationsGroupItem[index]) {\n return ($scope.validationsGroupItem[index].errors.length > 0 ||\n $scope.validationsGroupItem[index].failures.length > 0 ||\n $scope.validationsGroupItem[index].warnings.length > 0);\n }\n return false;\n };\n\n self.getGroupValidationMessages = function (attribute, id, parentId, currentIndex) {\n var $scope = self.$scope;\n var validationErrors = [];\n var validationFailures = [];\n var validationWarnings = [];\n\n var groupEntry = _.find($scope.groupIndexes, {\n 'id': id\n });\n var groupIndex = groupEntry ? groupEntry.__index__ : -1;\n var group = _.find($scope.groupStructure, {\n 'attribute': attribute\n });\n var groupLevel = group.level;\n var model = \"item[\" + attribute.name + \"][\" + groupIndex + \"]\";\n if (groupLevel > 0) {\n model = $scope.getModel(attribute, parentId, group.parentAttribute) + \"[\" + currentIndex + \"]\";\n }\n\n var validations = $scope.validations;\n var validationsGroupItem = $scope.validationsGroupItem;\n if (validations) {\n _.forEach(validations, function (validation) {\n _.forEach(validation, function (validationEntry) {\n var pathToCheck = getPathToCheck(model);\n path = filterGroupPath($scope, validationEntry.path);\n var pathIncluded = pathToCheck.length;\n _.forEach(pathToCheck, function (entry, index) {\n if (entry == path[index]) {\n pathIncluded--;\n }\n });\n if (pathIncluded < 1) {\n var validationName = attribute.name + \":\" + validationEntry.name;\n var validationLabel = (validation.translatedLabel || $rootScope.translateValidationLabel(validationName));\n var message = validationLabel.replace(attribute.name, path[path.length - 1]);\n var validationObject = {\n message: message,\n parentId: parentId,\n model: model,\n path: path\n };\n if (validationEntry.level === 'Error') {\n validationErrors.push(validationObject);\n } else if (validationEntry.level === 'Failure') {\n validationFailures.push(validationObject);\n } else if (validationEntry.level === 'Warning') {\n validationWarnings.push(validationObject);\n }\n }\n });\n });\n }\n\n if (!validationsGroupItem[currentIndex]) {\n validationsGroupItem[currentIndex] = {\n errors: [],\n failures: [],\n warnings: []\n };\n }\n\n // Append the current validation results to the parent scope object if they do not already exist\n validationErrors.forEach(function(error) {\n if (!_.some(validationsGroupItem[currentIndex].errors, error)) {\n validationsGroupItem[currentIndex].errors.push(error);\n }\n });\n\n validationFailures.forEach(function(failure) {\n if (!_.some(validationsGroupItem[currentIndex].failures, failure)) {\n validationsGroupItem[currentIndex].failures.push(failure);\n }\n });\n\n validationWarnings.forEach(function (warning) {\n // console.log('warning', warning, validationsGroupItem[entryIndex]);\n if (!_.some(validationsGroupItem[currentIndex].warnings, warning)) {\n validationsGroupItem[currentIndex].warnings.push(warning);\n }\n });\n\n function formatValidationMessages(validationList, type) {\n return validationList.map(function (validation) {\n return \"
  • \" + validation.message + \"
  • \";\n }).join('');\n }\n\n var validationErrorsHtml = formatValidationMessages(validationErrors, 'error');\n var validationFailuresHtml = formatValidationMessages(validationFailures, 'failure');\n var validationWarningsHtml = formatValidationMessages(validationWarnings, 'warning');\n\n return \"
      \" + validationErrorsHtml + validationFailuresHtml + validationWarningsHtml + \"\\n
    \";\n\n };\n\n self.loggedWarnings = self.loggedWarnings || new Set();\n\n self.checkGroupValidations = function (parentAttribute, model) {\n var $scope = self.$scope;\n var validations = $scope.validations;\n $scope.groupAttributeError[model] = false;\n\n if (validations) {\n var included = false;\n\n _.forEach(validations, function (validation) {\n _.forEach(validation, function (validationEntry) {\n if (\n validationEntry.path.length <= 1 ||\n _.isNumber(validationEntry.path[validationEntry.path.length - 1])\n ) {\n if (!self.loggedWarnings.has(validationEntry.name)) {\n $log.warn(\"Incorrect validation message path detected for validation name:\", validationEntry.name);\n self.loggedWarnings.add(validationEntry.name);\n }\n } else {\n _.forEach(validationEntry.path, function (entry) {\n if (entry == parentAttribute.name) {\n included = true;\n return false;\n }\n });\n }\n });\n if (included) {\n return false;\n }\n });\n\n return included;\n }\n\n return false;\n };\n\n self.checkGroupValidation = function (validation, model) {\n\n var $scope = self.$scope;\n if (validation) {\n var path = validation.path;\n var shortModel = model.slice(4);\n var pathToCheck = shortModel.match(/\\[(.*?)\\]/g);\n pathToCheck = _.forEach(pathToCheck, function (o, index) {\n pathToCheck[index] = _.replace(o.slice(1, -1), /\\'/g, \"\");\n });\n\n path = filterGroupPath($scope, path);\n\n var groupHasError = true;\n _.forEach(pathToCheck, function (v, index) {\n if (pathToCheck[index] !== path[index]) {\n groupHasError = false;\n }\n });\n\n if(groupHasError) {\n $scope.groupAttributeError[model] = true;\n }\n\n return groupHasError;\n\n }\n return false;\n };\n\n self.registerLocalValidationsWatcher = function($scope, attribute) {\n\n // Local validations are only supported on attributes which has MultiDimensional as base attribute, therefore\n // we will only register the watch on those attributes, in order to not hit the perf too much.\n if (attribute.typeName != 'MultiDimensional') {\n return;\n }\n\n var editorScope = self.$scope;\n var model = '';\n var group = _.find(editorScope.groupStructure, {\n 'attribute': attribute\n });\n\n if (group.level <= 0) {\n model = 'item[\"' + attribute.name + '\"]';\n } else {\n model = $scope.$parent.model;\n }\n\n editorScope.$watch(model, function(newValue) {\n self.checkGroupLocalValidations(attribute, model, newValue);\n }, true);\n\n };\n\n self.checkGroupLocalValidations = function(groupAttribute, path, groupValues) {\n\n var editorScope = self.$scope;\n\n // Map the group structure to the structure of a multi dimensional collection\n var rows = _.map(groupValues, function(entry) {\n return {\n entity: entry\n };\n });\n\n var attributeErrors = _.reduce(rows, function(result, entry) {\n\n MultiDimensionalAttributeService.validateMultiDimensionalEntry(entry, rows, groupAttribute);\n\n if (!_.isEmpty(entry.errors)) {\n var entryErrors = _.uniq(result.errors.concat(entry.errors));\n result = {\n attribute: result.attribute,\n errors: entryErrors\n };\n }\n\n return result;\n }, { attribute: groupAttribute, errors: [] });\n\n editorScope.$emit('addLocalValidation', { path: path, attributeErrors: attributeErrors });\n\n };\n\n self.getLocalValidationErrors = function(attribute, path) {\n\n if (_.isNil(path)) {\n path = 'item[\"' + attribute.name + '\"]';\n }\n\n var editorScope = self.$scope;\n\n var attributeLocalValidations = editorScope.localValidations[path];\n if (!_.isNil(attributeLocalValidations)) {\n return _.defaultTo(attributeLocalValidations.errors, []);\n } else {\n return [];\n }\n };\n\n self.hasLocalValidationErrors = function(attribute, path) {\n\n if (attribute.typeName != 'MultiDimensional') {\n return false;\n }\n\n return !_.isEmpty(self.getLocalValidationErrors(attribute, path));\n };\n\n /**\n * Key attributes are only relevant to Groups when the base\n * attribute is a MultiDimensional that is rendered as a Group.\n */\n self.isGroupKeyAttribute = function (attribute, parentAttribute) {\n if (parentAttribute.typeName === 'MultiDimensional') {\n return MultiDimensionalAttributeService.isKeyAttribute(attribute, parentAttribute);\n } else {\n return false;\n }\n };\n\n });","angular.module('llax.services')\n .service('MultiDimensionalAttributeService', function($translate) {\n\n this.validateMultiDimensionalEntry = function(row, rows, multiDimensionalAttribute) {\n row.errors = [];\n\n var areKeysUnique = this.validateUniqueKeys(row.entity, _.map(rows, 'entity'), multiDimensionalAttribute.keyMembers);\n if (!areKeysUnique) {\n row.errors.push($translate.instant('MULTI_DIMENSIONAL.NOT_UNIQUE_VALIDATION_MESSAGE'));\n }\n\n var atLeastOneKeyAttributeProvided = this.checkAtLeastOnePropertyProvided(row.entity, multiDimensionalAttribute.keyMembers);\n if (!atLeastOneKeyAttributeProvided) {\n row.errors.push($translate.instant('MULTI_DIMENSIONAL.NO_KEYS_VALIDATION_MESSAGE'));\n }\n\n var atLeastOneValueAttributeProvided = this.checkAtLeastOnePropertyProvided(row.entity, multiDimensionalAttribute.valueMembers);\n if (!atLeastOneValueAttributeProvided) {\n row.errors.push($translate.instant('MULTI_DIMENSIONAL.NO_VALUES_VALIDATION_MESSAGE'));\n }\n\n if (atLeastOneValueAttributeProvided &&\n atLeastOneKeyAttributeProvided &&\n areKeysUnique) {\n return true;\n } else {\n return false;\n }\n };\n\n this.validateUniqueKeys = function(entry, allEntries, keyMembers) {\n var _this = this;\n var entriesWithTheSameKeys = _.filter(allEntries, function(rowEntry) {\n return _.isEqualWith(entry, rowEntry, function(firstEntry, secondEntry) {\n return _this.multiDimensionalEntriesComparator(firstEntry, secondEntry, keyMembers);\n });\n });\n\n if (entriesWithTheSameKeys.length > 1) {\n return false;\n } else {\n return true;\n }\n };\n\n this.multiDimensionalEntriesComparator = function(firstEntry, secondEntry, compareProperties) {\n var isEqual = true;\n _.forEach(compareProperties, function(property) {\n var firstValue = _.toString(firstEntry[property]);\n var secondValue = _.toString(secondEntry[property]);\n\n if (firstValue != secondValue) {\n isEqual = false;\n return false; // Break early\n }\n });\n return isEqual;\n };\n\n this.checkAtLeastOnePropertyProvided = function(entity, properties) {\n var atLeastOnePropProvided = false;\n _.forEach(properties, function(property) {\n if (!_.isEmpty(entity[property])) {\n atLeastOnePropProvided = true;\n return false; //break early\n }\n });\n\n return atLeastOnePropProvided;\n };\n\n this.isKeyAttribute = function(memberAttribute, multiDimensionalAttribute) {\n return _.includes(multiDimensionalAttribute.keyMembers, memberAttribute.name);\n };\n });","angular.module('llax.services')\n .service('ReferenceAttributesService', function(FindItemsByPrimaryKeyResource, $http, $log, $parse, $rootScope, $q) {\n\n /**\n *\n * Returns a list of items based on the 'keywordQuery'. Each has 'thisShouldNotBeUsedAsAnAttributeName' property\n * which reflects the formatted item display name.\n *\n * Note that @item parameter can be null in case the filter is called from within Mass Update function.\n */\n this.loadAndFormatItemsToBeReferencedAsync = function(keywordQuery, parentItem, attribute) {\n\n var _this = this;\n var referenceableCategories = attribute.params.references;\n\n if (referenceableCategories !== undefined && referenceableCategories.length > 0) {\n for (var i = 0; i < referenceableCategories.length; i++) {\n var category = $rootScope.escapeSearchTerm(referenceableCategories[i]);\n if (i === 0) {\n keywordQuery += ' AND (';\n } else {\n keywordQuery += ' OR ';\n }\n keywordQuery += 'category__:' + category;\n }\n keywordQuery += ')';\n }\n\n var queryParams = {\n keyword: keywordQuery\n };\n\n return $http.get(lax_rest_url('items'), {\n params: queryParams\n })\n .then(function(res) {\n angular.forEach(res.data, function(item) {\n item.thisShouldNotBeUsedAsAnAttributeName = _this.formatReferenceItem(parentItem, item, attribute);\n });\n return res.data;\n });\n };\n\n /**\n *\n * Extends referenced items by the fields that are configured in the data model, for example, to be shown in a grid, while\n * keeping the transitional properties in the multi-reference attribute which are stored on the parent item.\n */\n this.extendReferencedItemsAsync = function(attribute, referencedItems) {\n var deferred = $q.defer();\n var primaryKeys = _.map(referencedItems, function(item) {\n return item.primaryKey__;\n });\n var fields = this.getAttributeFields(attribute);\n\n FindItemsByPrimaryKeyResource.find({}, {\n 'items': primaryKeys,\n 'fields': fields\n },\n function(itemsResult) {\n var extendedItems = [];\n for (var i = 0; i < referencedItems.length; i++) {\n var referencedItem = referencedItems[i];\n\n var completeItem = _.find(itemsResult, { primaryKey__: referencedItem.primaryKey__ });\n\n var extendedItem = {};\n if (!_.isNil(completeItem)) {\n // We need to keep the 'transitional properties' of the multi-reference attribute, which\n // are only stored on the parent item attribute (referencedItem in our case).\n extendedItem = _.extend({}, completeItem, referencedItem);\n } else {\n // Item was not found in the backend, but we need to display it, and allow the\n // user to delete the reference to it\n extendedItem = _.extend({ deleted__: true }, completeItem, referencedItem);\n }\n extendedItems.push(extendedItem);\n }\n\n deferred.resolve(extendedItems);\n });\n\n return deferred.promise;\n };\n\n /**\n *\n * Returns a formatted single referenced item.\n */\n this.loadAndFormatItemAsync = function(referencedItemPrimaryKey, parentItem, attribute) {\n\n var deferred = $q.defer();\n var _this = this;\n\n FindItemsByPrimaryKeyResource.find({}, {\n 'items': [referencedItemPrimaryKey],\n },\n function (itemResult) {\n if (itemResult.length > 0) {\n var referencedItem = itemResult[0];\n var formattedItem = _this.formatReferenceItem(parentItem, referencedItem, attribute);\n deferred.resolve(formattedItem);\n } else {\n $log.error('loadAndFormatItemAsync(): Could not find item with primary key %s', referencedItemPrimaryKey);\n deferred.reject();\n }\n });\n\n return deferred.promise;\n };\n\n /**\n *\n * Formats/Serializes an item based on the reference attribute (MultiReference/SingleReference) of the parent item.\n * Note that a filter function has higher precedence than filters array.\n *\n * Note that @item parameter can be null in case the filter is called from within Mass Update function.\n */\n this.formatReferenceItem = function(parentItem, referenceItem, attribute) {\n\n var filters = attribute.params.filter;\n var filterFunctionName = attribute.params.uiReferenceFilter;\n\n if (!_.isNil(filterFunctionName)) {\n filterFunction = $rootScope.getFilter(filterFunctionName);\n return filterFunction(referenceItem.primaryKey__, referenceItem, parentItem, attribute, $rootScope.user, $rootScope.organization);\n } else if (!_.isEmpty(filters)) {\n return formatByFilters(referenceItem, filters);\n } else {\n return foundItem.primaryKey__;\n }\n };\n\n function formatByFilters(item, displayNameFilterAttributes) {\n\n var displayNames = [];\n _.forEach(displayNameFilterAttributes, function(attributeName) {\n var referencedFilterAttribute = $rootScope.dataModel.attribute(attributeName);\n var referencedFilterAttributeType = referencedFilterAttribute.typeName;\n var formattedValue = $rootScope.formatAttributeValue(item, referencedFilterAttribute);\n\n if (_.isEmpty(formattedValue)) {\n return;\n } else if (angular.isString(formattedValue)) {\n displayNames.push(formattedValue);\n } else if (angular.isObject(formattedValue) && referencedFilterAttributeType === 'Dimensional') {\n var key = $rootScope.getFirstFilteredDimensionKey(item, referencedFilterAttribute);\n displayNames.push(formattedValue[key]);\n } else {\n $log.error(\"Rendering attribute '%s' of type '%s' as a dropdown item name is not supported.\",\n referencedFilterAttribute.name, referencedFilterAttributeType);\n }\n });\n\n return displayNames.join(', ');\n }\n\n /**\n * Returns the list of filters which are defined for the Single/MultiReference attribute in the parent item.\n */\n this.getAttributeFields = function(attribute) {\n var valueAttribute = $rootScope.dataModel.attribute(attribute.params.valueAttribute);\n var fields = [\"primaryKey__\"].concat(attribute.params.filter || [], valueAttribute.members || []);\n return _.uniq(fields);\n };\n\n /**\n * Returns the names of transient attributes of a multi reference attribute (the attributes that are\n * stored on the link).\n */\n this.getTransientAttributes = function(attribute) {\n var valueAttribute = $rootScope.dataModel.attribute(attribute.params.valueAttribute);\n return valueAttribute.members;\n };\n\n this.getModelEval = function(model, attribute) {\n model = this.parseModelString(model, attribute.name);\n return $parse(model);\n };\n\n this.checkModelAndEval = function(model, attribute, referencedItem, $scope) {\n var modelEval = this.getModelEval(model, attribute);\n modelEval.assign($scope, referencedItem.primaryKey__);\n return modelEval($scope) || {};\n };\n\n this.parseModelString = function(model, attributeName) {\n if (_.isEqual(\"item[a.name]\", model)) {\n model = \"item['\" + attributeName + \"']\";\n } else if (!_.includes(model, \"'\")) {\n model = model.replace(/\\[/g, \"['\");\n model = model.replace(/\\]/g, \"']\");\n model = model.replace(/\\'\\d+\\'/g, function (x) {\n return x.replace(/\\'/g, \"\");\n });\n }\n return model;\n };\n });","angular.module('llax.services')\n .service('ExportMappingService', function($log, $parse, $rootScope, growl) {\n\n this.getUploadFileForItemConfiguration = function($scope) {\n var _this = this;\n return function(attributeName, sectionName, type, model) {\n var config = {};\n switch (type) {\n case \"Image\":\n config = {\n autoUpload: true,\n filters: ['imageFilter'],\n accept: 'image/jpeg,image/gif,image/png,image/svg+xml,image/bmp,image/tiff,image/webp,application/pdf'\n };\n var maxFileSize = $rootScope.dataModel.sectionAttributeParam($rootScope.currentLayout, sectionName, attributeName, 'maxFileSize');\n if (maxFileSize) {\n config.filters.push('maxFileSizeFilter');\n config.maxFileSize = maxFileSize;\n }\n break;\n case \"Document\":\n config = {\n autoUpload: true\n };\n break;\n }\n\n model = _this.checkModel(model, attributeName);\n\n return angular.extend({\n url: lax_rest_url('assets'),\n reset: true,\n formData: [],\n uploadComplete: function(response) {\n var modelEval = $parse(model);\n if (_.isArray(response) && response.length > 0) {\n modelEval.assign($scope, response[0].url);\n } else if (response.hasOwnProperty('privateAssetUrl')) {\n modelEval.assign($scope, response.privateAssetUrl);\n }\n },\n onErrorItem: function(item, response, status, headers) {\n $log.error(response);\n\n if (!_.isNil(response.errorCode)) {\n growl.error(response.message, { variables : { name: item.file.name } });\n } else {\n growl.error(\"ASSET_FOLDER.ERROR_OCCURRED\");\n }\n },\n onFileSelected: function(linkedAsset, linkedAssetPath, done) {\n done(linkedAsset);\n }\n }, config);\n };\n };\n\n this.checkModel = function(model, attributeName) {\n if (_.isEqual(\"customValues[a.name]\", model)) {\n model = \"customValues['\" + attributeName + \"']\";\n } else if (!_.includes(model, \"'\")) {\n model = model.replace(/\\[/g, \"['\");\n model = model.replace(/\\]/g, \"']\");\n model = model.replace(/\\'\\d+\\'/g, function (x) {\n return x.replace(/\\'/g, \"\");\n });\n }\n return model;\n };\n });","angular.module('llax.services')\n .service('SimpleMappingsService', function($log, $rootScope, $q, CodelistRessource, SimpleMappingsResource) {\n\n var LINKABLE_ATTRIBUTE_TYPES = ['Enum', 'EnumSet', 'OpenEnum', 'OpenEnumSet', 'Codelist', 'Dimensional', 'Physical'];\n\n this.linkAttributesToSimpleMappingAsync = function(simpleMapping, modelAttributeNames) {\n var deferred = $q.defer();\n\n simpleMapping.linkedAttributes = modelAttributeNames;\n\n SimpleMappingsResource.update({\n id: simpleMapping.id\n }, simpleMapping, function(response) {\n deferred.resolve(response);\n }, function(error) {\n $log.error(error);\n deferred.reject(error);\n });\n\n return deferred.promise;\n };\n\n this.getLinkableAttributes = function($scope, callback) {\n\n if ($rootScope.isDataModelLoaded) {\n callback(this.filterLinkableAttributes($rootScope.dataModel.allAttributes()));\n } else {\n var _this = this;\n $scope.$on('dataModelLoaded', function() {\n callback(_this.filterLinkableAttributes($rootScope.dataModel.allAttributes()));\n });\n }\n };\n\n this.filterLinkableAttributes = function(attributes) {\n return _.filter(attributes, function(attribute) {\n return _.includes(LINKABLE_ATTRIBUTE_TYPES, attribute.typeName);\n });\n };\n\n this.getCodeLists = function(callback) {\n CodelistRessource.getAllCodelists({}, function(response) {\n callback(response);\n }, function(response) {\n growl.error('SIMPLE_MAPPING.LOAD_FAILED');\n });\n };\n\n this.getCodeListValuesAsync = function(codelistName) {\n var deferred = $q.defer();\n CodelistRessource.getCodelist({\n id: codelistName\n }, function(response) {\n var options = _.map(response, function(entry) {\n return {\n key: entry.code,\n value: entry.defaultLabel\n };\n });\n deferred.resolve(options);\n }, function(response) {\n $log.error(response);\n deferred.reject(response);\n });\n\n return deferred.promise;\n };\n\n this.getAttributeOptionsAsync = function(modelAttribute) {\n var deferred = $q.defer();\n\n if (modelAttribute.typeName === 'Codelist') {\n return this.getCodeListValuesAsync(modelAttribute.params.codelist);\n }\n\n if (!_.isNil(modelAttribute.params.valueAttribute)) {\n modelAttribute = $rootScope.dataModel.getReferencedOptionAttribute(modelAttribute);\n }\n\n var optionsKey = $rootScope.dataModel.getAttributeOptionsParam(modelAttribute);\n var options = modelAttribute.params[optionsKey];\n\n if (_.isString(options)) { // i.e. options list\n var optionList = $rootScope.dataModel.optionList(options);\n options = optionList.options;\n }\n\n deferred.resolve(options);\n return deferred.promise;\n };\n\n this.getAllAttributeOptionsAsync = function(modelAttributes) {\n var _this = this;\n var optionsPromises = [];\n _.forEach(modelAttributes, function(attribute) {\n optionsPromises.push(_this.getAttributeOptionsAsync(attribute));\n });\n\n return $q.all(optionsPromises)\n .then(function(optionsResponses) {\n var options = [];\n _.forEach(optionsResponses, function(result) {\n options = _.concat(options, result);\n });\n\n return options;\n });\n };\n\n this.createSimpleMappingEntriesAsync = function(simpleMappingId, entries) {\n var deferred = $q.defer();\n SimpleMappingsResource.createEntries(\n { id: simpleMappingId },\n entries,\n function(response) {\n deferred.resolve(response);\n },\n function(error) {\n deferred.error(error);\n });\n\n return deferred.promise;\n };\n\n this.importModelAttributesIntoSimpleMappingAsync = function(modelAttributes, simpleMappingId) {\n var _this = this;\n var deferred = $q.defer();\n\n this.getAllAttributeOptionsAsync(modelAttributes)\n .then(function(options) {\n\n var simpleMappingEntries = _.map(options, function(option) {\n return {\n key: option.key,\n value: ''\n };\n });\n\n if (!_.isEmpty(options)) {\n _this.createSimpleMappingEntriesAsync(simpleMappingId, simpleMappingEntries)\n .then(function(){\n deferred.resolve();\n })\n .catch(function(error){\n $log.error(error);\n deferred.reject(error);\n });\n } else {\n deferred.resolve();\n }\n });\n\n return deferred.promise;\n };\n\n });","angular.module('llax.services')\n .service('SheetJSService', function() {\n\n this.readFile = function(fileAsArrayBuffer) {\n return XLSX.read(fileAsArrayBuffer, {\n type: 'binary'\n });\n };\n /*\n * Returns an array of a given row cells in a given sheet object with their content.\n */\n this.getRowCells = function(sheet, row) {\n var headers = [];\n var range = XLSX.utils.decode_range(sheet['!ref']);\n var C = null;\n\n // Walk every column in the range\n for(C = range.s.c; C <= range.e.c; ++C) {\n var location = XLSX.utils.encode_cell({c: C, r: row});\n var cell = sheet[location];\n\n if(_.isNil(cell)) {\n // Cell at `location` was not found, maybe it is part of a merge\n var mergedRange = this.getCellMergedRegion(sheet, row, C);\n if (!_.isNil(mergedRange)) {\n // Taking the `s` (start) of a range because the main cell in a merge is the upper left cell\n location = XLSX.utils.encode_cell({ r: mergedRange.s.r, c: mergedRange.s.c });\n cell = sheet[location];\n }\n }\n\n var value = \"\";\n if(cell && cell.t) { // Pass empty cells\n value = XLSX.utils.format_cell(cell);\n headers.push({\n location: location,\n value: value\n });\n }\n }\n return headers;\n };\n\n this.sheetToJson = function(sheet) {\n return XLSX.utils.sheet_to_json(sheet);\n };\n\n this.exportXLSX = function(jsonObject, fileName, sheetName) {\n var workbook = XLSX.utils.book_new();\n var worksheet = XLSX.utils.json_to_sheet(jsonObject);\n XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);\n XLSX.writeFile(workbook, fileName + '.xlsx');\n };\n\n this.getCellMergedRegion = function(sheet, row, column) {\n return _.find(sheet['!merges'], function(mergedRange) {\n // `s`: Start, `e`: End, `r`: Row, `c`: Column\n return mergedRange.s.r <= row && mergedRange.s.c <= column &&\n mergedRange.e.r >= row && mergedRange.e.c >= column;\n });\n };\n });","angular.module('llax.services')\n .service('TemplateMappingService', function($log, $rootScope) {\n\n var RUBY_CONTENT_TYPES = [\n 'application/x-ruby',\n 'text/ruby',\n 'ruby'\n ];\n\n this.PARAM_TYPES = {\n BOOLEAN: 'Boolean',\n CODE: 'Code',\n MULTI_SELECT: 'MultiSelect',\n MULTI_TEXT: 'MultiText',\n SELECT: 'Select',\n TEXT: 'Text',\n };\n\n this.getFilteredLayoutAttributes = function() {\n return _.map($rootScope.dataModel.filteredLayoutAttributes('mapping'), function(attr) {\n return {\n name: attr.label,\n translatedName: $rootScope.translateAttribute(attr.label),\n value: attr.name\n };\n });\n };\n\n this.getAllModelAttributes = function() {\n return _.map($rootScope.dataModel.allAttributes(), function(attr) {\n return {\n name: attr.label,\n translatedName: $rootScope.translateAttribute(attr.label),\n value: attr.name\n };\n }).filter(function(attr) {\n return !_.isNil(attr.name);\n });\n };\n\n /*\n * Returns the mapping function type based on its parameters types:\n * 'code': A code-based mapping function, if containing only one param with `contentType` `ruby`.\n * 'simple-mappings': Simple mappings, if containing only one param with `selectFrom` `simple-mappings`.\n * 'default': For everything else.\n */\n this.getMappingFunctionType = function(mappingFunctionDefinition) {\n\n // TODO: Don't just check the first parameter!\n // Not for 'contentType' nor for 'selectFrom'!\n // Parameters can be defined at ANY position!\n if (!_.isEmpty(mappingFunctionDefinition.parameters) && mappingFunctionDefinition.parameters.length === 1) {\n\n if (_.includes(RUBY_CONTENT_TYPES, mappingFunctionDefinition.parameters[0].contentType)) {\n return 'code';\n } else if (!_.isEmpty(mappingFunctionDefinition.parameters[0].selectFrom) &&\n this.parseSelectFrom(mappingFunctionDefinition.parameters[0]) === 'simple_mappings') {\n return 'simple_mappings';\n }\n\n }\n\n return 'default';\n };\n\n this.getParameterType = function(parameter) {\n if (_.includes(RUBY_CONTENT_TYPES, parameter.contentType)) {\n return this.PARAM_TYPES.CODE;\n }\n\n if (!_.isEmpty(parameter.selectFrom)) {\n if (parameter.selectMultiple) {\n return this.PARAM_TYPES.MULTI_SELECT;\n } else {\n return this.PARAM_TYPES.SELECT;\n }\n }\n\n switch (parameter.type) {\n case 'String':\n if (parameter.selectMultiple) {\n return this.PARAM_TYPES.MULTI_TEXT;\n } else {\n return this.PARAM_TYPES.TEXT;\n }\n break;\n case 'Boolean':\n return this.PARAM_TYPES.BOOLEAN;\n\n default:\n return this.PARAM_TYPES.TEXT;\n }\n };\n\n this.parseSelectFrom = function(parameter) {\n if (!_.isEmpty(parameter.selectFrom) && !_.isEmpty(parameter.selectFrom[0]) && parameter.selectFrom[0] === 'object') {\n return parameter.selectFrom[1];\n } else {\n $log.error('Error parsing parameter\\'s source selectFrom array', parameter);\n return null;\n }\n };\n\n this.getSimpleMappingParameterName = function(mappingFunctionDefinition) {\n var _this = this;\n var simpleMappingParameter = _.find(mappingFunctionDefinition.parameters, function(parameter) {\n return !_.isNil(parameter.selectFrom) && _this.parseSelectFrom(parameter) === 'simple_mappings';\n });\n\n if (!_.isNil(simpleMappingParameter)) {\n return simpleMappingParameter.name;\n } else {\n return null;\n }\n };\n\n /*\n * Returns the A1 notation location from the location string, which is formatted as:\n * SHEET_NAME!A1_NOTATION_LOCATION\n */\n this.getA1NotationFromLocationString = function(location) {\n var stringParts = location.split('!');\n if (stringParts.length == 2) {\n return stringParts[1];\n } else {\n $log.warn('getA1NotationFromLocationString: wasn\\'t able to get location from location string:' + location);\n return location;\n }\n };\n\n /*\n * Returns the sheet name from the location string, which is formatted as:\n * SHEET_NAME!A1_NOTATION_LOCATION\n */\n this.getSheetNameFromLocationString = function(location) {\n var stringParts = location.split('!');\n if (stringParts.length == 2) {\n return stringParts[0];\n } else {\n $log.warn('getSheetNameFromLocationString: wasn\\'t able to get sheet name from location string:' + location);\n return null;\n }\n };\n\n /*\n * Converts a column index to an A1 notation, for example: column index 27 -> AA\n */\n this.convertToA1Notation = function(index) {\n index = index - 1;\n var orderA = 'A'.charCodeAt(0);\n var orderZ = 'Z'.charCodeAt(0);\n var length = orderZ - orderA + 1;\n\n var string = \"\";\n while(index >= 0) {\n string = String.fromCharCode(index % length + orderA) + string;\n index = Math.floor(index / length) - 1;\n }\n return string;\n };\n\n /*\n * Converts a cell location in A1 notation to its individual row and column indices.\n */\n this.convertFromA1Notation = function(cellLocation) {\n var match = cellLocation.match(/(^[A-Z]+)|([0-9]+$)/gm);\n\n if (match.length != 2) {\n throw new Error('convertFromA1Notation: Invalid cell location was provided.');\n }\n\n var colA1 = match[0];\n var rowA1 = match[1];\n\n return {\n row: rowA1ToIndex(rowA1),\n col: colA1ToIndex(colA1)\n };\n };\n\n function colA1ToIndex(colA1) {\n if (typeof colA1 !== 'string' || colA1.length > 2) {\n throw new Error(\"convertFromA1Notation: Invalid cell location was provided.\");\n }\n\n var A = \"A\".charCodeAt(0);\n\n var number = colA1.charCodeAt(colA1.length-1) - A;\n if (colA1.length == 2) {\n number += 26 * (colA1.charCodeAt(0) - A + 1);\n }\n return number;\n }\n\n function rowA1ToIndex(rowA1) {\n return rowA1 - 1;\n }\n });\n","angular.module('llax.services')\n .service('UpsellingAdsService', function($rootScope, $window) {\n\n var LocalStorage = $window.localStorage;\n var ADS_STORAGE_KEY = 'seenUpsellingAds';\n var self = this;\n\n this.pickRandomAd = function(ads) {\n return _.sample(ads);\n };\n\n /**\n * Returns the eligible ads to be shown (available, and if seen, it fulfills the business requirements to be shown).\n * FIXME: Refactor when 'Set' is available.\n *\n * The format of returned ads is as follows:\n * {\n * \"id\": \"string\",\n * \"name\": \"string\",\n * \"type\": \"POPUP | BANNER\"\n * }\n */\n this.getEligibleAds = function(availableAds) {\n\n var seenAds = this.getSeenAds();\n var eligibleAds = _.reduce(availableAds, function(result, availableAd){\n var seenAd = self.getAdIfSeen(seenAds, availableAd.id);\n if (!_.isNil(seenAd)) {\n var dateSeen = seenAd.date;\n if (self.shouldShowAd(dateSeen)) {\n result.push(availableAd);\n }\n } else {\n // Ad is never seen before.\n result.push(availableAd);\n }\n\n return result;\n }, []);\n\n return eligibleAds;\n };\n\n this.getSeenAds = function() {\n\n var seenAds = LocalStorage.getItem(ADS_STORAGE_KEY);\n if (!_.isNil(seenAds)) {\n seenAds = JSON.parse(seenAds);\n } else {\n seenAds = [];\n }\n\n return seenAds;\n };\n\n this.getAdIfSeen = function(seenAds, adId) {\n\n var seenAd = _.find(seenAds, function(seenAd) {\n return seenAd === adId || seenAd.id === adId;\n });\n\n if (_.isString(seenAd)) {\n // For backward compatibility of stored seen ads, if it's a string\n // we assume that it was never seen before and it will get updated\n // down the flow when we store it again as seen.\n seenAd = {\n id: seenAd,\n date: null\n };\n }\n return seenAd;\n };\n\n this.setAdAsSeen = function(newlySeenAdId) {\n\n var seenAds = this.getSeenAds();\n var newlySeenAd = {\n id: newlySeenAdId,\n date: new Date(Date.now())\n };\n\n if (_.isNil(seenAds)) {\n seenAds = [];\n }\n\n var found = false;\n seenAds = _.map(seenAds, function(seenAd) {\n if (newlySeenAdId === seenAd || newlySeenAdId === seenAd.id) {\n found = true;\n return newlySeenAd;\n } else {\n return seenAd;\n }\n });\n\n if (!found) {\n seenAds.push(newlySeenAd);\n }\n\n LocalStorage.setItem(ADS_STORAGE_KEY, JSON.stringify(seenAds));\n };\n\n /**\n * Returns `true` if an ad is eligible to be shown based on some business requirements, otherwise returns `false`.\n * For now, an eligible ad is an ad that is:\n * 1- Never seen before, i.e. lastSeenDate is null. Or,\n * 2- Its lastSeenDate exceeds `marketingCampaignsFrequencyInterval` organization/community parameter.\n */\n this.shouldShowAd = function(lastSeenDate) {\n\n if (_.isNil(lastSeenDate)) {\n return true;\n }\n\n if (_.isString(lastSeenDate)) {\n lastSeenDate = new Date(lastSeenDate);\n }\n\n var adsFrequencyInterval = $rootScope.organization.marketingCampaignsFrequencyInterval || 0;\n if (adsFrequencyInterval === 0) {\n return true;\n }\n\n var currentDate = Date.now();\n var ONE_DAY = 24 * 60 * 60 * 1000;\n var diffDays = Math.round(Math.abs((lastSeenDate - currentDate) / ONE_DAY));\n\n return diffDays > adsFrequencyInterval;\n };\n });","angular.module('llax.filters', [])\n.filter('formatOptionValue', function($rootScope) {\n return function(value, attribute) {\n if (_.isEmpty(value) || !_.isObject(attribute)) {\n return value;\n }\n var op;\n // FIXME: Instead of \"translating\" the option every time, keep the translated options in the attribute\n angular.forEach(attribute.options, function(option) {\n if (option.key === value) {\n op = option;\n return;\n }\n });\n\n var result = $rootScope.translateOption(op || value, attribute);\n\n // FIXME: Depending on 'attribute.valuesFormat', also show key\n return result;\n };\n})\n.filter('filterPhysicalValues', function(PhysicalAttributeService) {\n return function(units, value) {\n\n var result = [];\n\n var split = PhysicalAttributeService.splitValue(value);\n if (split.inputValue === \"\") {\n return result;\n }\n\n sortedUnits = [];\n tempSortedUnits = [];\n\n _.forEach(units, function(unit) {\n if (unit.value == split.unitValue || unit.key == split.unitValue) {\n sortedUnits.push(unit);\n }\n });\n\n _.forEach(units, function(unit) {\n if (_.startsWith(_.toLower(unit.value), _.toLower(split.unitValue)) === true) {\n sortedUnits.push(unit);\n } else {\n tempSortedUnits.push(unit);\n }\n });\n\n tempSortedUnits = _.sortBy(tempSortedUnits, function(unit) {\n return unit.value;\n });\n _.forEach(tempSortedUnits, function(unit) {\n sortedUnits.push(unit);\n });\n\n sortedUnits = _.uniqBy(sortedUnits, 'key');\n for (var i = 0; i < sortedUnits.length; i++) {\n var unit = sortedUnits[i];\n if (split.unitValue === \"\" || angular.lowercase(unit.value).indexOf(angular.lowercase(split.unitValue)) > -1) {\n result.push({\n key: \"\" + split.inputValue.trim() + \" \" + unit.key,\n value: \"\" + split.inputValue.trim() + \" \" + unit.value\n });\n }\n }\n\n return result;\n };\n})\n.filter('formatPhysicalValue', function($rootScope, PhysicalAttributeService) {\n return function(value, attribute) {\n if (_.isEmpty(value) || !_.isObject(attribute)) {\n return value;\n }\n var units = $rootScope.getTranslatedOptions(attribute);\n var result = PhysicalAttributeService.formatValue(value, units);\n return result;\n };\n})\n.filter('formatFloatValue', function($locale, OrganizationService) {\n return function(value) {\n\n if (_.isNil(value)) {\n return;\n }\n\n var result = _.toString(value);\n\n if ($locale.NUMBER_FORMATS.DECIMAL_SEP !== '.' &&\n OrganizationService.getOrganizationSnapshot().localeSpecificNumberFormat) {\n result = _.replace(result, '.', $locale.NUMBER_FORMATS.DECIMAL_SEP);\n }\n\n return result;\n };\n})\n.filter('objectToArray', function() {\n return function(input) {\n var out = [];\n for (var i in input) {\n out.push(input[i]);\n }\n return out;\n };\n})\n.filter('range', function() {\n return function(input, min, max, padded) {\n var val;\n min = parseInt(min);\n max = parseInt(max);\n for (var i=min; i<=max; i++) {\n val = (padded && i < 10) ? '0' + i : i;\n input.push(val);\n }\n return input;\n };\n})\n.filter('regex', function() {\n return function(input, field, regex) {\n var patt = new RegExp(regex);\n var out = [];\n for (var i = 0; i < input.length; i++){\n if(patt.test(input[i][field]))\n out.push(input[i]);\n }\n return out;\n };\n})\n// FIXME: It's \"filename\"\n.filter('fileName', function($filter) {\n return function(url) {\n if (_.isEmpty(url)) {\n return null;\n }\n var fileName = decodeURI(url.substring(url.lastIndexOf('/') + 1));\n // return full URL when no direct file is provided\n if (_.isEmpty(fileName) || $filter('isFileType')(url, 'website')) {\n fileName = url;\n }\n return fileName;\n };\n})\n// FIXME: There already is a directive \"filetype\"! We have to merge this with the 'fileType' and 'isFileType' filters!\n.filter('fileType', function($filter) {\n return function(url) {\n if (_.isEmpty(url)) {\n return \"\";\n }\n url = decodeURI(url.substring(url.lastIndexOf('/') + 1));\n var index = url.lastIndexOf('.');\n var fileType = index < 0 ? \"\" : url.substring(index + 1);\n\n // Check if there are attributes after the filetype ending\n var specialChars = ['#','?'];\n _.forEach(specialChars, function(specialChar) {\n if ((index = fileType.lastIndexOf(specialChar)) > 0) {\n fileType = fileType.substring(0, index);\n }\n });\n\n return fileType;\n };\n})\n.filter('isFileType', function($filter) {\n return function(file, types) {\n var fileType;\n if (file.type) {\n fileType = file.type.substring(file.type.lastIndexOf('/') + 1);\n } else {\n var fileName = (file.name || file);\n fileType = $filter('fileType')(fileName);\n if (_.isEmpty(fileType)) {\n return false;\n }\n }\n var defaultTypes = {\n // FIXME: PDF is not an image! maybe we should introduce a new default type called 'media'?\n // which combines 'images', 'drawables' and 'documents'..., and keep the image as an actual image.\n image: '|bmp|eps|gif|jpeg|jpg|pdf|png|svg|svg+xml|webp|',\n drawable: '|x-xbitmap|bmp|eps|gif|jpeg|jpg|png|svg|svg+xml|webp|',\n thumbnail: '|bmp|gif|jpeg|jpg|png|webp|',\n website: '|htm|html|shtml|xhtml|php|asp|jsp|',\n };\n if (!types.startsWith('|') && defaultTypes[types]) {\n types = defaultTypes[types];\n }\n var type = '|' + _.toLower(fileType) + '|';\n return type === '||' || (types.indexOf(type) !== -1);\n };\n})\n/**\n * AngularJS default filter with the following expression:\n * \"person in people | filter: {name: $select.search, age: $select.search}\"\n * performs a AND between 'name: $select.search' and 'age: $select.search'.\n * We want to perform a OR.\n *\n * Used for the ui-select component\n */\n.filter('propsFilter', function () {\n return function (items, props, selected) {\n\n var outNormal = [];\n var outPriorized = [];\n var out = [];\n\n var keys = Object.keys(props);\n\n if (_.isArray(items) && !_.isEmpty(props[keys[0]])) {\n items.forEach(function (item) {\n\n for (var i = 0; i < keys.length; i++) {\n\n var prop = keys[i];\n var text = props[prop].toLowerCase();\n\n if (item[prop] && item[prop].toString().toLowerCase().indexOf(text) == 0) {\n outPriorized.push(item);\n break;\n }\n if (item[prop] && item[prop].toString().toLowerCase().indexOf(text) !== -1) {\n outNormal.push(item);\n break;\n }\n }\n });\n outPriorized.forEach(function (prioItem) {\n out.push(prioItem);\n });\n outNormal.forEach(function (normalItem) {\n out.push(normalItem);\n });\n\n } else if (!_.isEmpty(selected) && _.isArray(items)) {\n\n // for normal Enum selected is not an array, but for enumSet it is\n if (!_.isArray(selected)) {\n selected = [selected];\n }\n // set all selected as priorized items in list\n items.forEach(function (item) {\n\n var added = false;\n selected.forEach(function (selectedKey) {\n if (_.isEqual(item.key, selectedKey)) {\n outPriorized.push(item);\n added = true;\n }\n });\n if (!added) {\n outNormal.push(item);\n }\n });\n outPriorized.forEach(function (prioItem) {\n out.push(prioItem);\n });\n outNormal.forEach(function (normalItem) {\n out.push(normalItem);\n });\n } else {\n // Let the output be the input untouched\n out = items;\n }\n return out;\n };\n})\n.filter('additionalCategoryFormatter', function() {\n return function(category) {\n var result = \"\";\n\n if (!category) {\n return result;\n }\n\n switch (typeof category) {\n case 'string':\n result = category;\n break;\n case 'object':\n if (category.code) {\n if (category.title && (category.code != category.title)) {\n result = category.title + ' [' + category.code + ']';\n } else {\n result = category.code;\n }\n }\n break;\n }\n\n return result;\n };\n})\n\n.filter('translateFilter', function($rootScope) {\n return function(filter) {\n var label;\n if (filter.type === 'CATEGORY') {\n if (_.includes(filter.name, '::')) {\n label = $rootScope.translateCategory(filter.name);\n } else {\n label = $rootScope.translate(filter.name);\n }\n } else if (filter.type === 'DATA_MODEL_DEFINED') {\n label = filter.label;\n } else {\n label = filter.name;\n }\n return label;\n };\n})\n\n.filter('categoryNameToLabel', function($rootScope) {\n return function(name) {\n if ($rootScope.dataModel.hasCategory(name)) {\n var category = $rootScope.dataModel.category(name);\n return $rootScope.translateCategory(category);\n } else {\n return name;\n }\n };\n})\n\n.filter('categoryNameToId', function() {\n return function(name) {\n return name.replace(/:/g, '_');\n };\n})\n\n.filter('gridEnumSetFormatter', function() {\n return function(array, options) {\n\n if (!_.isArray(array)) {\n return array;\n }\n\n var values = [];\n var option, translatedOption;\n _.forEach(array, function(value) {\n option = _.find(options, {key: value});\n translatedOption = option ? (option.translatedOption || option.value || value) : value;\n values.push(translatedOption);\n });\n\n return _.join(values, ', ');\n };\n})\n\n.filter('hasChildrenFormatter', function() {\n return function(category) {\n var title = '';\n if (category.emptyDefault) {\n title = category.title;\n } else {\n title = (category.title && category.code) ? (category.title + ' [' + category.code + ']') : category.code;\n }\n return title;\n };\n})\n\n.filter('trustAsResourceUrl', function($sce) {\n return function(val) {\n return $sce.trustAsResourceUrl(val);\n };\n})\n\n.filter('laxCurrency', function($rootScope, CurrencyService) {\n return function(value, currencyKey) {\n if (!value) {\n return;\n }\n if (!currencyKey) {\n var country = $rootScope.user.country || 'US';\n currencyKey = CurrencyService.getCurrencyKey(country);\n }\n var currencySymbol = CurrencyService.getCurrencySymbol(currencyKey);\n return currencySymbol + value[currencyKey];\n };\n})\n\n.filter('filterAttributes', function() {\n return function(attributes, value) {\n\n var searchFields = [\"baseClass\", \"description\", \"label\", \"name\", \"typeName\"];\n var searchFieldObjects = [\"values\", \"keys\"];\n var foundObjects = [];\n var tempAttribute;\n var continueSearch;\n value = value.toLowerCase();\n _.forEach(attributes, function(attribute) {\n continueSearch = true;\n _.forEach(searchFields, function(searchField) {\n if (_.has(attribute, searchField)) {\n if (!_.isEmpty(attribute[searchField])) {\n if (attribute[searchField].toLowerCase().indexOf(value) > -1) {\n foundObjects.push(attribute);\n continueSearch = false;\n return false;\n }\n }\n }\n });\n if (continueSearch) {\n _.forEach(searchFieldObjects, function(searchFieldOption) {\n if (!continueSearch) {\n return false;\n }\n if (_.has(attribute.params, searchFieldOption)) {\n _.forEach(attribute.params[searchFieldOption], function(setValue) {\n if (!continueSearch) {\n return false;\n }\n _.some(_.values(setValue), function(property) {\n if (!continueSearch) {\n return false;\n }\n if (!_.isEmpty(property)) {\n if (property.toLowerCase().indexOf(value) > -1) {\n foundObjects.push(attribute);\n continueSearch = false;\n return false;\n }\n }\n });\n });\n }\n });\n }\n });\n if (value.length <= 2) {\n return foundObjects.slice(0, 30);\n } else {\n return foundObjects;\n }\n\n };\n})\n.filter('sortByVisibleThenHidden', function() {\n return function(attributes, scope) {\n\n if (_.isEmpty(attributes)) {\n return [];\n }\n\n var result = [];\n var hiddenAttributes = [];\n\n _.forEach(attributes, function(attribute) {\n if (attribute.hidden) {\n hiddenAttributes.push(attribute);\n } else {\n result.push(attribute);\n }\n });\n\n Array.prototype.push.apply(result, hiddenAttributes);\n\n return result;\n };\n})\n.filter('showExportFormatsFilter', function(Auth) {\n return function(exportFormats, selectedItems) {\n\n if (_.isEmpty(selectedItems)) {\n return [];\n }\n\n var result = [];\n _.forEach(exportFormats, function(exportFormat, index, array) {\n var hasPermission = true;\n _.forEach(selectedItems, function(item, index, array) {\n var context = { contentType: exportFormat.contentType, item: item };\n if (!Auth.hasPermission('exportFormats', 'show', context)) {\n hasPermission = false;\n }\n });\n if (hasPermission) {\n result.push(exportFormat);\n }\n });\n\n return result;\n };\n})\n.filter('dynamicFilter', function($rootScope) {\n return function(value) {\n var filterName = [].splice.call(arguments, 1, 1)[0];\n var filter = $rootScope.getFilter(filterName);\n if (!_.isEmpty(filter)) {\n return filter.apply(null, arguments);\n } else {\n return value;\n }\n };\n })\n .filter('customNgFilter', function() {\n\n function comparator(actual, expected) {\n if (_.isUndefined(actual)) {\n // No substring matching against `undefined`\n return false;\n }\n if ((actual === null) || (expected === null)) {\n // No substring matching against `null`; only match against `null`\n return actual === expected;\n }\n if (_.isObject(expected) || (_.isObject(actual))) {\n // Should not compare primitives against objects, unless they have custom `toString` method\n return false;\n }\n\n actual = _.lowerCase('' + actual);\n expected = _.lowerCase('' + expected);\n return actual.indexOf(expected) !== -1;\n }\n\n function deepCompare(actual, expected, comparator, options) {\n var actualType = (actual === null) ? 'null' : typeof actual;\n\n if (_.isArray(actual)) {\n // In case `actual` is an array, consider it a match\n // if ANY of it's items matches `expected`\n return actual.some(function(item) {\n return deepCompare(item, expected, comparator, options);\n });\n }\n\n switch (actualType) {\n case 'object':\n var hasKeys = false, keys = [];\n if (!_.isEmpty(options.keys)) {\n hasKeys = true;\n keys = options.keys;\n if (options.exclude) {\n var ex_keys = Object.keys(actual).filter(function(k) {\n return keys.indexOf(k) < 0;\n });\n keys = ex_keys;\n }\n }\n for (var key in actual) {\n var in_options = options[key] || {};\n if ((key.charAt(0) !== '$') && (!hasKeys || keys.indexOf(key) > -1) && deepCompare(actual[key], expected, comparator, in_options)) {\n return true;\n }\n }\n break;\n case 'function':\n return false;\n default:\n return comparator(actual, expected);\n }\n }\n\n return function(value, search, options) {\n options = options || {};\n search = search || '';\n return value.filter(function(e) {\n return deepCompare(e, search, comparator, options);\n });\n };\n\n })\n .filter('formatByte', function () {\n return function (size) {\n var base = 1000;\n var prefixes = ['k','M','G','T','P','E','Z','Y'];\n var exp = Math.log(size) / Math.log(base) | 0;\n return (size / Math.pow(base, exp)).toFixed(1) + ' ' +\n ((exp > 0) ? prefixes[exp - 1] + 'B' : 'Bytes');\n };\n})\n.filter('defaultGroupTitleFilter', function($filter, $rootScope) {\n\n function getTranslatedAttributeValue(attributeValue, attributeName) {\n var TRANSLATABLE_ATTRIBUTES = ['Enum', 'EnumSet', 'OpenEnum', 'OpenEnumSet', 'Dimensional', 'Physical'];\n var attribute = $rootScope.dataModel.attribute(attributeName);\n\n if (!_.isNil(attribute.params.valueAttribute)) {\n attribute = $rootScope.dataModel.getReferencedOptionAttribute(attribute);\n }\n\n if (_.includes(TRANSLATABLE_ATTRIBUTES, attribute.typeName)) {\n return $rootScope.translateOption(attributeValue, attribute);\n } else if (attribute.typeName === 'Date') {\n return $filter('date')(attributeValue, 'mediumDate');\n } else {\n return _.isObject(attributeValue) ? '' : _.toString(attributeValue);\n }\n }\n\n return function(entry, entryIndex, filterParameters, attribute, item, user, organization) {\n\n if (_.isEmpty(filterParameters)) {\n // Construct the title from the first attribute in the group.\n var firstGroupAttribute = null;\n var compositeAttribute = $rootScope.dataModel.getReferencedOptionAttribute(attribute);\n if (!_.isNil(compositeAttribute)) {\n firstGroupAttribute = compositeAttribute.members[0];\n } else {\n var memberAttributes = $rootScope.dataModel.getMemberAttributes(attribute);\n firstGroupAttribute = memberAttributes[0].name;\n }\n\n if (!_.isNil(firstGroupAttribute)) {\n return getTranslatedAttributeValue(entry[firstGroupAttribute], firstGroupAttribute);\n } else {\n return '';\n }\n } else {\n // if filterParameters were given in the data model, then construct the title from them.\n return _.reduce(filterParameters, function(accumulatedResult, parameter) {\n var attributeValue = entry[parameter];\n\n if (_.isNil(attributeValue)) {\n return accumulatedResult;\n } else {\n return accumulatedResult + (accumulatedResult === '' ? '' : ' - ') + getTranslatedAttributeValue(attributeValue, parameter);\n }\n\n }, '');\n }\n };\n});\n"]}