diff --git a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/AttachmentAwareDatabaseHandler.java b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/AttachmentAwareDatabaseHandler.java index 42d50ad008..076cd224c3 100644 --- a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/AttachmentAwareDatabaseHandler.java +++ b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/AttachmentAwareDatabaseHandler.java @@ -19,6 +19,9 @@ import java.util.function.Supplier; import java.util.stream.Collectors; +import org.apache.thrift.TBase; +import org.apache.thrift.TFieldIdEnum; +import org.eclipse.sw360.datahandler.common.SW360Utils; import org.eclipse.sw360.datahandler.thrift.SW360Exception; import org.eclipse.sw360.datahandler.thrift.Source; import org.eclipse.sw360.datahandler.thrift.attachments.Attachment; @@ -84,4 +87,20 @@ protected void deleteAttachmentUsagesOfUnlinkedReleases(Source usedBy, Set owners = deletedLinkedReleaseIds.stream().map(Source::releaseId).collect(Collectors.toSet()); attachmentDatabaseHandler.deleteUsagesBy(usedBy, owners); } + + protected > void updateModifiedFields(T type, String userEmail) { + if (type instanceof Release) { + Release release = (Release) type; + release.setModifiedBy(userEmail); + release.setModifiedOn(SW360Utils.getCreatedOn()); + } else if (type instanceof Component) { + Component component = (Component) type; + component.setModifiedBy(userEmail); + component.setModifiedOn(SW360Utils.getCreatedOn()); + } else if (type instanceof Project) { + Project project = (Project) type; + project.setModifiedBy(userEmail); + project.setModifiedOn(SW360Utils.getCreatedOn()); + } + } } diff --git a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ComponentDatabaseHandler.java b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ComponentDatabaseHandler.java index aa965edaa0..798fbec45f 100644 --- a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ComponentDatabaseHandler.java +++ b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ComponentDatabaseHandler.java @@ -517,6 +517,7 @@ public AddDocumentRequestSummary addRelease(Release release, User user) throws S } Component oldComponent = component.deepCopy(); updateReleaseDependentFieldsForComponent(component, release); + updateModifiedFields(component, user.getEmail()); componentRepository.update(component); sendMailNotificationsForNewRelease(release, user.getEmail()); @@ -705,6 +706,7 @@ private void updateComponentDependentFieldsForRelease(Component component, List< changes.add(nameFields); changeLog.setChanges(changes); release.setName(name); + updateModifiedFields(release, userEdited); releaseRepository.update(release); referenceDocLogList.add(changeLog); } @@ -728,6 +730,7 @@ private boolean duplicateAttachmentExist(Component component) { private void updateComponentInternal(Component updated, Component current, User user) { + updateModifiedFields(updated, user.getEmail()); // Update the database with the component componentRepository.update(updated); @@ -923,6 +926,7 @@ private void transferReleases(Set releaseIds, Component mergeTarget, Com private void updateReleasesAfterMerge(Set targetComponentReleaseIds, Set srcComponentReleaseIds, Component mergeSelection, Component mergeTarget, User sessionUser) throws SW360Exception { + final String userEmail = sessionUser.getEmail(); // Change release name if appropriate List targetComponentReleases = getReleasesForClearingStateSummary(targetComponentReleaseIds); List srcComponentReleases = getReleasesForClearingStateSummary(srcComponentReleaseIds); @@ -941,7 +945,8 @@ private void updateReleasesAfterMerge(Set targetComponentReleaseIds, Set } r.setComponentId(mergeTarget.getId()); r.setName(mergeSelection.getName()); - dbHandlerUtil.addChangeLogs(r, releaseBefore, sessionUser.getEmail(), Operation.UPDATE, + updateModifiedFields(r, userEmail); + dbHandlerUtil.addChangeLogs(r, releaseBefore, userEmail, Operation.UPDATE, attachmentConnector, Lists.newArrayList(), mergeTarget.getId(), Operation.MERGE_COMPONENT); return r; }).collect(Collectors.toList()); @@ -968,7 +973,7 @@ private void updateComponentCompletely(Component component, User user) throws SW private void updateComponentCompletelyWithoutDeletingAttachment(Component component, User user) throws SW360Exception { // Prepare component for database prepareComponent(component); - + updateModifiedFields(component, user.getEmail()); componentRepository.update(component); sendMailNotificationsForComponentUpdate(component, user.getEmail()); @@ -1033,10 +1038,11 @@ public RequestStatus updateRelease(Release release, User user, Iterable projects = projectClient.searchByReleaseId(mergeSourceId, sessionUser); for(Project project : projects) { // retrieve full document, other method only retrieves summary @@ -1521,9 +1530,10 @@ private void updateReleaseReferencesInProjects(String mergeTargetId, String merg if(!project.getReleaseIdToUsage().containsKey(mergeTargetId)) { project.putToReleaseIdToUsage(mergeTargetId, relationship); } + updateModifiedFields(project, userEmail); projectClient.updateProject(project, sessionUser); - dbHandlerUtil.addChangeLogs(project, projectBefore, sessionUser.getEmail(), Operation.UPDATE, + dbHandlerUtil.addChangeLogs(project, projectBefore, userEmail, Operation.UPDATE, attachmentConnector, Lists.newArrayList(), mergeTargetId, Operation.MERGE_RELEASE); } } @@ -1629,7 +1639,7 @@ public RequestStatus deleteComponent(String id, User user) throws SW360Exception for (Release release : releaseRepository.get(nullToEmptySet(component.releaseIds))) { - component = removeReleaseAndCleanUp(release); + component = removeReleaseAndCleanUp(release, user); } // Remove the component with attachments @@ -1677,11 +1687,11 @@ public boolean checkIfInUse(String releaseId) { return (usingProjects.size() > 0); } - private Component removeReleaseAndCleanUp(Release release) throws SW360Exception { + private Component removeReleaseAndCleanUp(Release release, User user) throws SW360Exception { attachmentConnector.deleteAttachments(release.getAttachments()); attachmentDatabaseHandler.deleteUsagesBy(Source.releaseId(release.getId())); - Component component = updateReleaseDependentFieldsForComponentId(release.getComponentId()); + Component component = updateReleaseDependentFieldsForComponentId(release.getComponentId(), user); //TODO notify using projects!?? Or stop if there are any @@ -1707,7 +1717,7 @@ public RequestStatus deleteRelease(String id, User user) throws SW360Exception { spdxDocumentDatabaseHandler.deleteSPDXDocument(spdxId, user); release = releaseRepository.get(id); } - Component componentAfter=removeReleaseAndCleanUp(release); + Component componentAfter=removeReleaseAndCleanUp(release, user); dbHandlerUtil.addChangeLogs(null, release, user.getEmail(), Operation.DELETE, attachmentConnector, Lists.newArrayList(), null, null); dbHandlerUtil.addChangeLogs(componentAfter, componentBefore, user.getEmail(), Operation.UPDATE, @@ -2250,8 +2260,9 @@ public RequestStatus splitComponent(Component srcComponent, Component targetComp recomputeReleaseDependentFields(srcComponentFromDB, null); targetComponentFromDB.unsetReleases(); srcComponentFromDB.unsetReleases(); + updateModifiedFields(targetComponentFromDB, user.getEmail()); componentRepository.update(targetComponentFromDB); - + updateModifiedFields(srcComponentFromDB, user.getEmail()); componentRepository.update(srcComponentFromDB); updateReleaseAfterComponentSplit(srcComponentFromDBOriginal, targetComponentFromDBOriginal, @@ -2691,6 +2702,7 @@ private void updateReleaseAfterComponentSplit(Component srcComponentFromDB, Comp List srcComponentReleasesMoved = getReleasesForClearingStateSummary(srcComponentReleaseIdsMovedFromSrc); Set targetComponentReleaseVersions = targetComponentReleases.stream().map(Release::getVersion) .collect(Collectors.toSet()); + final String userEmail = user.getEmail(); List releasesToUpdate = srcComponentReleasesMoved.stream().map(r -> { Release releaseBefore = r.deepCopy(); @@ -2701,7 +2713,8 @@ private void updateReleaseAfterComponentSplit(Component srcComponentFromDB, Comp } r.setComponentId(targetComponentFromDB.getId()); r.setName(targetComponentFromDB.getName()); - dbHandlerUtil.addChangeLogs(r, releaseBefore, user.getEmail(), Operation.UPDATE, attachmentConnector, + updateModifiedFields(r, userEmail); + dbHandlerUtil.addChangeLogs(r, releaseBefore, userEmail, Operation.UPDATE, attachmentConnector, Lists.newArrayList(), srcComponentFromDB.getId(), Operation.SPLIT_COMPONENT); return r; }).collect(Collectors.toList()); @@ -2727,4 +2740,10 @@ private void checkSuperAttachmentExists(Release release) { }); } } + + public void sendExportSpreadsheetSuccessMail(String url, String recepient) throws TException { + mailUtil.sendMail(recepient, MailConstants.SUBJECT_SPREADSHEET_EXPORT_SUCCESS, + MailConstants.TEXT_SPREADSHEET_EXPORT_SUCCESS, SW360Constants.NOTIFICATION_CLASS_COMPONENT, "", false, + "component", url); + } } diff --git a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectDatabaseHandler.java b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectDatabaseHandler.java index 3a108b0d36..9e2f61bb21 100644 --- a/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectDatabaseHandler.java +++ b/backend/src-common/src/main/java/org/eclipse/sw360/datahandler/db/ProjectDatabaseHandler.java @@ -411,6 +411,7 @@ public RequestStatus updateProject(Project project, User user) throws SW360Excep setReleaseRelations(project, user, actual); updateProjectDependentLinkedFields(project, actual); project.unsetVendor(); + updateModifiedFields(project, user.getEmail()); repository.update(project); List referenceDocLogList=new LinkedList<>(); @@ -570,6 +571,7 @@ public RequestStatus addLinkedObligations(ObligationList obligation, User user) obligationRepository.add(obligation); Project project = getProjectById(obligation.getProjectId(), user); project.setLinkedObligationId(obligation.getId()); + updateModifiedFields(project, user.getEmail()); repository.update(project); project.unsetLinkedObligationId(); dbHandlerUtil.addChangeLogs(obligation, null, user.getEmail(), Operation.CREATE, attachmentConnector, @@ -1556,7 +1558,7 @@ private void flattenlinkedReleaseOfRelease(Map rele public void sendExportSpreadsheetSuccessMail(String url, String recepient) throws TException { mailUtil.sendMail(recepient, MailConstants.SUBJECT_SPREADSHEET_EXPORT_SUCCESS, MailConstants.TEXT_SPREADSHEET_EXPORT_SUCCESS, SW360Constants.NOTIFICATION_CLASS_PROJECT, "", false, - url); + "project", url); } private Map createProjectCSRow(String relation, Project prj, diff --git a/backend/src-common/src/main/resources/sw360.properties b/backend/src-common/src/main/resources/sw360.properties index b85d7fdc42..b6c079f5eb 100644 --- a/backend/src-common/src/main/resources/sw360.properties +++ b/backend/src-common/src/main/resources/sw360.properties @@ -56,7 +56,7 @@ subjectForRejectedClearingRequest= Your clearing request <%s> has been rejected subjectForUpdatedProjectWithClearingRequest= Project <%s> with clearing request <%s> updated subjectForSuccessfulExport = Spreadsheet Export Successful -textForSuccessfulExport = The project spreadsheet export successfully completed. Please find the download link(%s) here. +textForSuccessfulExport = The %s spreadsheet export successfully completed. Please find the download link(%s) here. textForNewModerationRequest= a new moderation request has been added to your SW360-account.\n\n textForUpdateModerationRequest= \ one of the moderation requests previously added to your \ @@ -83,3 +83,4 @@ enable.sw360.change.log=false sw360changelog.output.path=sw360changelog/sw360changelog auto.set.ecc.status=false send.project.spreadsheet.export.to.mail.enabled=false +send.component.spreadsheet.export.to.mail.enabled=false \ No newline at end of file diff --git a/backend/src/src-components/src/main/java/org/eclipse/sw360/components/ComponentHandler.java b/backend/src/src-components/src/main/java/org/eclipse/sw360/components/ComponentHandler.java index 7b2634d24c..9436c44eec 100644 --- a/backend/src/src-components/src/main/java/org/eclipse/sw360/components/ComponentHandler.java +++ b/backend/src/src-components/src/main/java/org/eclipse/sw360/components/ComponentHandler.java @@ -485,8 +485,10 @@ public boolean componentIsUsed(String componentId) throws TException { } @Override - public Component recomputeReleaseDependentFields(String componentId) throws TException { - return handler.updateReleaseDependentFieldsForComponentId(componentId); + public Component recomputeReleaseDependentFields(String componentId, User user) throws TException { + assertUser(user); + assertId(componentId); + return handler.updateReleaseDependentFieldsForComponentId(componentId, user); } ////////////////////////////////// @@ -658,4 +660,9 @@ public Map> getRecentComponentsSummaryWithPagina PaginationData pageData) throws TException { return handler.getRecentComponentsSummaryWithPagination(user, pageData); } + + @Override + public void sendExportSpreadsheetSuccessMail(String url, String recepient) throws TException { + handler.sendExportSpreadsheetSuccessMail(url, recepient); + } } diff --git a/backend/src/src-vendors/src/main/java/org/eclipse/sw360/vendors/VendorDatabaseHandler.java b/backend/src/src-vendors/src/main/java/org/eclipse/sw360/vendors/VendorDatabaseHandler.java index 1148977dc7..66bed9c123 100644 --- a/backend/src/src-vendors/src/main/java/org/eclipse/sw360/vendors/VendorDatabaseHandler.java +++ b/backend/src/src-vendors/src/main/java/org/eclipse/sw360/vendors/VendorDatabaseHandler.java @@ -182,7 +182,7 @@ private RequestSummary updateReleases(Vendor mergeTarget, Vendor mergeSource, Us // update computed fields of affected components for(String componentId : componentIds) { - componentsClient.recomputeReleaseDependentFields(componentId); + componentsClient.recomputeReleaseDependentFields(componentId, user); } return result; diff --git a/frontend/sw360-portlet/src/main/java/org/eclipse/sw360/portal/common/PortalConstants.java b/frontend/sw360-portlet/src/main/java/org/eclipse/sw360/portal/common/PortalConstants.java index ce97daa66c..7300579205 100644 --- a/frontend/sw360-portlet/src/main/java/org/eclipse/sw360/portal/common/PortalConstants.java +++ b/frontend/sw360-portlet/src/main/java/org/eclipse/sw360/portal/common/PortalConstants.java @@ -46,6 +46,7 @@ public class PortalConstants { public static final String CLEARING_REPORT_TEMPLATE_FORMAT; public static final String DISABLE_CLEARING_REQUEST_FOR_PROJECT_WITH_GROUPS; public static final Boolean SEND_PROJECT_SPREADSHEET_EXPORT_TO_MAIL_ENABLED; + public static final Boolean SEND_COMPONENT_SPREADSHEET_EXPORT_TO_MAIL_ENABLED; public static final String LOAD_OPEN_MODERATION_REQUEST = "loadOpenModerationRequest"; public static final String LOAD_CLOSED_MODERATION_REQUEST = "loadClosedModerationRequest"; @@ -715,6 +716,7 @@ public class PortalConstants { System.getProperty("RunComponentVisibilityRestrictionTest", props.getProperty("component.visibility.restriction.enabled", "false"))); DISABLE_CLEARING_REQUEST_FOR_PROJECT_WITH_GROUPS = props.getProperty("org.eclipse.sw360.disable.clearing.request.for.project.group", ""); SEND_PROJECT_SPREADSHEET_EXPORT_TO_MAIL_ENABLED = Boolean.parseBoolean(props.getProperty("send.project.spreadsheet.export.to.mail.enabled", "false")); + SEND_COMPONENT_SPREADSHEET_EXPORT_TO_MAIL_ENABLED = Boolean.parseBoolean(props.getProperty("send.component.spreadsheet.export.to.mail.enabled", "false")); } private PortalConstants() { diff --git a/frontend/sw360-portlet/src/main/java/org/eclipse/sw360/portal/portlets/components/ComponentPortlet.java b/frontend/sw360-portlet/src/main/java/org/eclipse/sw360/portal/portlets/components/ComponentPortlet.java index c83e80177a..65a3087fad 100644 --- a/frontend/sw360-portlet/src/main/java/org/eclipse/sw360/portal/portlets/components/ComponentPortlet.java +++ b/frontend/sw360-portlet/src/main/java/org/eclipse/sw360/portal/portlets/components/ComponentPortlet.java @@ -233,6 +233,10 @@ public void serveResource(ResourceRequest request, ResourceResponse response) th updateVulnerabilityVerification(request, response); } else if (PortalConstants.EXPORT_TO_EXCEL.equals(action)) { exportExcel(request, response); + } else if (PortalConstants.DOWNLOAD_EXCEL.equals(action)) { + downloadExcel(request, response); + } else if (PortalConstants.EMAIL_EXPORTED_EXCEL.equals(action)) { + exportExcelWithEmail(request, response); } else if (PortalConstants.RELEASE_LINK_TO_PROJECT.equals(action)) { linkReleaseToProject(request, response); } else if (PortalConstants.LOAD_SPDX_LICENSE_INFO.equals(action)) { @@ -307,6 +311,59 @@ private void deleteFileExport(String outputFormat, String releaseId, String file } } + private void exportExcelWithEmail(ResourceRequest request, ResourceResponse response) { + final User user = UserCacheHolder.getUserFromRequest(request); + final String componentId = request.getParameter(Component._Fields.ID.toString()); + ResourceBundle resourceBundle = ResourceBundleUtil.getBundle("content.Language", request.getLocale(), getClass()); + String token = null; + + try { + setSessionMessage(request, LanguageUtil.get(resourceBundle, + "excel.report.generation.has.started.we.will.send.you.an.email.with.download.link.once.completed")); + boolean extendedByReleases = Boolean.valueOf(request.getParameter(PortalConstants.EXTENDED_EXCEL_EXPORT)); + ComponentService.Iface client = thriftClients.makeComponentClient(); + int total = client.getTotalComponentsCount(user); + PaginationData pageData = new PaginationData(); + pageData.setAscending(true); + Map> pageDtToProjects; + Set projects = new HashSet<>(); + int displayStart = 0; + int rowsPerPage = 500; + while (0 < total) { + pageData.setDisplayStart(displayStart); + pageData.setRowsPerPage(rowsPerPage); + displayStart = displayStart + rowsPerPage; + pageDtToProjects = getFilteredComponentList(request, pageData); + projects.addAll(pageDtToProjects.entrySet().iterator().next().getValue()); + total = total - rowsPerPage; + } + List listOfComponent = new ArrayList(projects); + ComponentExporter exporter = new ComponentExporter(thriftClients.makeComponentClient(), listOfComponent, + user, extendedByReleases); + + token = exporter.makeExcelExportForProject(listOfComponent, user); + + String portletId = (String) request.getAttribute(WebKeys.PORTLET_ID); + ThemeDisplay tD = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY); + long plid = tD.getPlid(); + + LiferayPortletURL componentUrl = PortletURLFactoryUtil.create(request, portletId, plid, + PortletRequest.RESOURCE_PHASE); + componentUrl.setParameter("action", PortalConstants.DOWNLOAD_EXCEL); + componentUrl.setParameter("token", token); + componentUrl.setParameter(PortalConstants.EXTENDED_EXCEL_EXPORT, String.valueOf(extendedByReleases)); + + if(!CommonUtils.isNullEmptyOrWhitespace(token)) { + client.sendExportSpreadsheetSuccessMail(componentUrl.toString(), user.getEmail()); + } + } catch (IOException | TException | PortletException e) { + log.error("An error occurred while generating the Excel export", e); + response.setProperty(ResourceResponse.HTTP_STATUS_CODE, + Integer.toString(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)); + } + + } + private void evaluateCLIAttachments(ResourceRequest request, ResourceResponse response) throws IOException { User user = UserCacheHolder.getUserFromRequest(request); String releaseId = request.getParameter(RELEASE_ID); @@ -583,13 +640,47 @@ private void exportExcel(ResourceRequest request, ResourceResponse response) { try { boolean extendedByReleases = Boolean.valueOf(request.getParameter(PortalConstants.EXTENDED_EXCEL_EXPORT)); - List components = getFilteredComponentList(request); - ComponentExporter exporter = new ComponentExporter(thriftClients.makeComponentClient(), components, user, + ComponentService.Iface client = thriftClients.makeComponentClient(); + int total = client.getTotalComponentsCount(user); + PaginationData pageData = new PaginationData(); + pageData.setAscending(true); + Map> pageDtToProjects; + Set projects = new HashSet<>(); + int displayStart = 0; + int rowsPerPage = 500; + while (0 < total) { + pageData.setDisplayStart(displayStart); + pageData.setRowsPerPage(rowsPerPage); + displayStart = displayStart + rowsPerPage; + pageDtToProjects = getFilteredComponentList(request, pageData); + projects.addAll(pageDtToProjects.entrySet().iterator().next().getValue()); + total = total - rowsPerPage; + } + List listOfComponent = new ArrayList(projects); + ComponentExporter exporter = new ComponentExporter(thriftClients.makeComponentClient(), listOfComponent, user, + extendedByReleases); + String filename = String.format("components-%s.xlsx", SW360Utils.getCreatedOn()); + PortletResponseUtil.sendFile(request, response, filename, exporter.makeExcelExport(listOfComponent), + CONTENT_TYPE_OPENXML_SPREADSHEET); + } catch (IOException | TException e) { + log.error("An error occurred while generating the Excel export", e); + response.setProperty(ResourceResponse.HTTP_STATUS_CODE, + Integer.toString(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)); + } + } + + private void downloadExcel(ResourceRequest request, ResourceResponse response) { + final User user = UserCacheHolder.getUserFromRequest(request); + final String token = request.getParameter("token"); + + try { + boolean extendedByReleases = Boolean.valueOf(request.getParameter(PortalConstants.EXTENDED_EXCEL_EXPORT)); + ComponentExporter exporter = new ComponentExporter(thriftClients.makeComponentClient(), user, extendedByReleases); String filename = String.format("components-%s.xlsx", SW360Utils.getCreatedOn()); - PortletResponseUtil.sendFile(request, response, filename, exporter.makeExcelExport(components), + PortletResponseUtil.sendFile(request, response, filename, exporter.downloadExcelSheet(token), CONTENT_TYPE_OPENXML_SPREADSHEET); - } catch (IOException | SW360Exception e) { + } catch (IOException | TException e) { log.error("An error occurred while generating the Excel export", e); response.setProperty(ResourceResponse.HTTP_STATUS_CODE, Integer.toString(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)); diff --git a/frontend/sw360-portlet/src/main/resources/META-INF/resources/html/components/includes/components/editBasicInfo.jspf b/frontend/sw360-portlet/src/main/resources/META-INF/resources/html/components/includes/components/editBasicInfo.jspf index f724f30759..e7b3bd020f 100644 --- a/frontend/sw360-portlet/src/main/resources/META-INF/resources/html/components/includes/components/editBasicInfo.jspf +++ b/frontend/sw360-portlet/src/main/resources/META-INF/resources/html/components/includes/components/editBasicInfo.jspf @@ -130,13 +130,27 @@ - +
-
+ +
+ + " + value="" readonly class="form-control"/> +
+ + +
+ +
+ diff --git a/frontend/sw360-portlet/src/main/resources/META-INF/resources/html/components/includes/components/summary.jspf b/frontend/sw360-portlet/src/main/resources/META-INF/resources/html/components/includes/components/summary.jspf index 28ebe159f1..ed46e3af1a 100644 --- a/frontend/sw360-portlet/src/main/resources/META-INF/resources/html/components/includes/components/summary.jspf +++ b/frontend/sw360-portlet/src/main/resources/META-INF/resources/html/components/includes/components/summary.jspf @@ -46,6 +46,14 @@ : + + : + + + + : + + : diff --git a/frontend/sw360-portlet/src/main/resources/META-INF/resources/html/components/includes/releases/editReleaseInformation.jspf b/frontend/sw360-portlet/src/main/resources/META-INF/resources/html/components/includes/releases/editReleaseInformation.jspf index ea46d9e09c..bad5b65dd3 100644 --- a/frontend/sw360-portlet/src/main/resources/META-INF/resources/html/components/includes/releases/editReleaseInformation.jspf +++ b/frontend/sw360-portlet/src/main/resources/META-INF/resources/html/components/includes/releases/editReleaseInformation.jspf @@ -188,6 +188,25 @@ description="moderators" multiUsers="true" readonly="false"/> + + + +
+ + " + value="" readonly class="form-control"/> +
+ + +
+ +
+ + + +