diff --git a/announcements/src/org/labkey/announcements/AnnouncementModule.java b/announcements/src/org/labkey/announcements/AnnouncementModule.java index 2be171e4985..4967d394f2c 100644 --- a/announcements/src/org/labkey/announcements/AnnouncementModule.java +++ b/announcements/src/org/labkey/announcements/AnnouncementModule.java @@ -22,8 +22,6 @@ import org.labkey.announcements.model.AnnouncementDigestProvider; import org.labkey.announcements.model.AnnouncementManager; import org.labkey.announcements.model.AnnouncementType; -import org.labkey.announcements.model.DiscussionServiceImpl; -import org.labkey.announcements.model.DiscussionWebPartFactory; import org.labkey.announcements.model.InsertMessagePermission; import org.labkey.announcements.model.MessageBoardContributorRole; import org.labkey.announcements.model.SecureMessageBoardReadPermission; @@ -31,30 +29,23 @@ import org.labkey.announcements.query.AnnouncementSchema; import org.labkey.api.admin.FolderSerializationRegistry; import org.labkey.api.announcements.CommSchema; -import org.labkey.api.announcements.DiscussionService; import org.labkey.api.announcements.api.AnnouncementService; import org.labkey.api.attachments.AttachmentService; import org.labkey.api.audit.AuditLogService; import org.labkey.api.audit.provider.MessageAuditProvider; -import org.labkey.api.data.CompareType; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerManager; -import org.labkey.api.data.SimpleFilter; import org.labkey.api.data.SqlExecutor; -import org.labkey.api.data.TableSelector; import org.labkey.api.message.digest.DailyMessageDigest; import org.labkey.api.message.settings.MessageConfigService; import org.labkey.api.module.DefaultModule; import org.labkey.api.module.ModuleContext; -import org.labkey.api.query.FieldKey; import org.labkey.api.rss.RSSService; import org.labkey.api.search.SearchService; import org.labkey.api.security.UserManager; import org.labkey.api.security.roles.EditorRole; import org.labkey.api.security.roles.Role; import org.labkey.api.security.roles.RoleManager; -import org.labkey.api.settings.LookAndFeelProperties; -import org.labkey.api.usageMetrics.UsageMetricsService; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.emailTemplate.EmailTemplateService; import org.labkey.api.view.AlwaysAvailableWebPartFactory; @@ -65,12 +56,9 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.Date; import java.util.List; -import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; /** * NOTE: Wiki handles some of the shared Communications module stuff. @@ -108,7 +96,6 @@ protected void init() AnnouncementService.setInstance(new AnnouncementServiceImpl()); AnnouncementSchema.register(this); - DiscussionService.setInstance(new DiscussionServiceImpl()); EmailTemplateService.get().registerTemplate(AnnouncementManager.NotificationEmailTemplate.class); EmailTemplateService.get().registerTemplate(AnnouncementDigestProvider.DailyDigestEmailTemplate.class); @@ -128,8 +115,7 @@ public WebPartView getWebPartView(@NotNull ViewContext parentCtx, @NotNull Po { return new AnnouncementsController.AnnouncementListWebPart(parentCtx); } - }, - new DiscussionWebPartFactory() + } ); } @@ -179,17 +165,6 @@ public void doStartup(ModuleContext moduleContext) { fsr.addFactories(new NotificationSettingsWriterFactory(), new NotificationSettingsImporterFactory()); } - - UsageMetricsService.get().registerUsageMetrics(NAME, () -> Map.of("discussions", Map.of( - "rootEnabled", LookAndFeelProperties.getInstance(ContainerManager.getRoot()).isDiscussionEnabled(), - "projectsEnabled", ContainerManager.getProjects().stream() - .filter(project -> LookAndFeelProperties.getInstance(project).isDiscussionEnabled()) - .count(), - "createdByYear", new TableSelector(CommSchema.getInstance().getTableInfoAnnouncements(), Collections.singleton("Created"), - new SimpleFilter(FieldKey.fromString("DiscussionSrcUrl"), null, CompareType.NONBLANK), null - ).stream(Date.class) - .collect(Collectors.groupingBy(date -> date.getYear() + 1900, Collectors.counting())) - ))); } diff --git a/announcements/src/org/labkey/announcements/AnnouncementsController.java b/announcements/src/org/labkey/announcements/AnnouncementsController.java index 4a1f9ed47bd..42637b9a1f2 100644 --- a/announcements/src/org/labkey/announcements/AnnouncementsController.java +++ b/announcements/src/org/labkey/announcements/AnnouncementsController.java @@ -29,10 +29,10 @@ import org.labkey.announcements.model.AnnouncementManager; import org.labkey.announcements.model.AnnouncementModel; import org.labkey.announcements.model.DailyDigestEmailPrefsSelector; -import org.labkey.announcements.model.DiscussionServiceImpl; import org.labkey.announcements.model.IndividualEmailPrefsSelector; import org.labkey.announcements.model.InsertMessagePermission; import org.labkey.announcements.model.Permissions; +import org.labkey.announcements.model.Settings; import org.labkey.announcements.query.AnnouncementSchema; import org.labkey.api.action.ApiResponse; import org.labkey.api.action.ApiSimpleResponse; @@ -50,9 +50,6 @@ import org.labkey.api.action.SpringActionController; import org.labkey.api.admin.AdminUrls; import org.labkey.api.announcements.CommSchema; -import org.labkey.api.announcements.DiscussionService; -import org.labkey.api.announcements.DiscussionService.Settings; -import org.labkey.api.announcements.DiscussionService.StatusOption; import org.labkey.api.announcements.EmailOption; import org.labkey.api.announcements.api.AnnouncementService; import org.labkey.api.announcements.api.DiscussionSrcTypeProvider; @@ -832,17 +829,8 @@ public boolean handlePost(AnnouncementForm form, BindException errors) if (null != insert.getParent()) thread = AnnouncementManager.getAnnouncement(getContainer(), insert.getParent()); - if (form.isFromDiscussion() && null != thread.getDiscussionSrcIdentifier()) - { - returnUrl = DiscussionServiceImpl.fromSaved(thread.getDiscussionSrcURL()); - returnUrl.addParameter("discussion.id", "" + thread.getRowId()); - returnUrl.addParameter("_anchor", "discussionArea"); // TODO: insert.getRowId() instead? -- target just inserted response - } - else - { - String threadId = thread.getEntityId(); - returnUrl = getThreadURL(c, threadId, insert.getRowId()); - } + String threadId = thread.getEntityId(); + returnUrl = getThreadURL(c, threadId, insert.getRowId()); } _attachmentErrorView = AttachmentService.get().getErrorView(files, errors, returnUrl); @@ -873,18 +861,6 @@ public static ActionURL getInsertURL(Container c) @RequiresAnyOf({InsertMessagePermission.class, InsertPermission.class}) public class InsertAction extends BaseInsertAction { - @Override - public void validateCommand(AnnouncementForm form, Errors errors) - { - super.validateCommand(form, errors); - - if (form.isFromDiscussion() && !form.allowMultipleDiscussions()) - { - if (DiscussionService.get().hasDiscussions(getContainer(), form.getBean().getDiscussionSrcIdentifier())) - errors.reject(ERROR_MSG, "Can't post a new discussion -- a discussion already exists and multiple discussions are not allowed"); - } - } - @Override public ModelAndView getInsertUpdateView(AnnouncementForm form, boolean reshow, BindException errors) { @@ -897,7 +873,7 @@ public ModelAndView getInsertUpdateView(AnnouncementForm form, boolean reshow, B throw new UnauthorizedException(); } - InsertMessageView insertView = new InsertMessageView(form, "New " + settings.getConversationName(), errors, reshow, form.getReturnUrlHelper(), false, true); + InsertMessageView insertView = new InsertMessageView(form, "New " + settings.getConversationName(), errors, reshow, form.getReturnUrlHelper()); insertView.setShowTitle(false); getPageConfig().setFocusId("title"); @@ -958,7 +934,7 @@ public ModelAndView getInsertUpdateView(AnnouncementForm form, boolean reshow, B ThreadView threadView = new ThreadView(c, getActionURL(), parent, perm); threadView.setFrame(WebPartView.FrameType.DIV); - HttpView respondView = new RespondView(c, parent, form, form.getReturnUrlHelper(), errors, reshow, false); + HttpView respondView = new RespondView(c, parent, form, form.getReturnUrlHelper(), errors, reshow); getPageConfig().setFocusId("body"); _parent = parent; @@ -981,7 +957,7 @@ public void addNavTrail(NavTree root) private static SelectBuilder getStatusSelect(String currentValue) { return new SelectBuilder().name("status").id("status").className(null).selected(currentValue) - .addOptions(Arrays.stream(StatusOption.values()).map(Enum::name)); + .addOptions(Arrays.stream(AnnouncementService.StatusOption.values()).map(Enum::name)); } @@ -1081,7 +1057,7 @@ private static ActionURL getInsertURL(Container c, @Nullable ActionURL returnUrl public abstract static class BaseInsertView extends JspView { - public BaseInsertView(String page, InsertBean bean, AnnouncementForm form, URLHelper cancelURL, String title, BindException errors, @Nullable AnnouncementModel latestPost, boolean reshow, boolean fromDiscussion) + public BaseInsertView(String page, InsertBean bean, AnnouncementForm form, URLHelper cancelURL, String title, BindException errors, @Nullable AnnouncementModel latestPost, boolean reshow) { super(page, bean, errors); setTitle(title); @@ -1135,7 +1111,6 @@ else if (null == latestPost) bean.memberList = getMemberList(u, c, latestPost, reshow ? form.get("memberList") : null); bean.form = form; bean.cancelURL = cancelURL; - bean.fromDiscussion = fromDiscussion; // If default email option is "all messages" (or "all messages daily digest") then gently warn // that a bunch of users are about to be emailed. @@ -1158,8 +1133,6 @@ public static class InsertBean public AnnouncementForm form; public URLHelper cancelURL; public AnnouncementModel parentAnnouncementModel; // Used by RespondView only... move to subclass? - public boolean fromDiscussion; - public boolean allowMultipleDiscussions = true; public Integer emailUsers = null; } } @@ -1167,29 +1140,21 @@ public static class InsertBean public static class InsertMessageView extends BaseInsertView { - public InsertMessageView(AnnouncementForm form, String title, BindException errors, boolean reshow, URLHelper cancelURL, boolean fromDiscussion, boolean allowMultipleDiscussions) + public InsertMessageView(AnnouncementForm form, String title, BindException errors, boolean reshow, URLHelper cancelURL) { - super("/org/labkey/announcements/insert.jsp", new InsertBean(), form, cancelURL, title, errors, null, reshow, fromDiscussion); - - InsertBean bean = getModelBean(); - bean.allowMultipleDiscussions = allowMultipleDiscussions; + super("/org/labkey/announcements/insert.jsp", new InsertBean(), form, cancelURL, title, errors, null, reshow); } } public static class RespondView extends BaseInsertView { - public RespondView(Container c, AnnouncementModel parent, AnnouncementForm form, URLHelper cancelURL, BindException errors, boolean reshow, boolean fromDiscussion) + public RespondView(Container c, AnnouncementModel parent, AnnouncementForm form, URLHelper cancelURL, BindException errors, boolean reshow) { - super("/org/labkey/announcements/respond.jsp", new InsertBean(), form, cancelURL, "Response", errors, AnnouncementManager.getLatestPost(c, parent), reshow, fromDiscussion); + super("/org/labkey/announcements/respond.jsp", new InsertBean(), form, cancelURL, "Response", errors, AnnouncementManager.getLatestPost(c, parent), reshow); getModelBean().parentAnnouncementModel = parent; } - - public RespondView(Container c, AnnouncementModel parent, URLHelper cancelURL, boolean fromDiscussion) - { - this(c, parent, new AnnouncementForm(), cancelURL, null, false, fromDiscussion); - } } @@ -1387,27 +1352,6 @@ public void addNavTrail(NavTree root) } } - - @RequiresPermission(ReadPermission.class) - public class ThreadBareAction extends ThreadAction - { - @Override - public ThreadView getView(AnnouncementForm form, BindException errors) throws Exception - { - getPageConfig().setTemplate(PageConfig.Template.None); - ThreadView tv = super.getView(form, errors); - tv.setFrame(WebPartView.FrameType.NONE); - tv.getModelBean().embedded = true; - return tv; - } - - @Override - public void addNavTrail(NavTree root) - { - } - } - - @RequiresPermission(ReadPermission.class) public class RssAction extends SimpleViewAction { @@ -1736,19 +1680,8 @@ public void validate(Errors errors) errors.reject(ERROR_MSG, "Expires must be blank or a valid date."); } } - - public boolean isFromDiscussion() - { - return Boolean.parseBoolean(get("fromDiscussion")); - } - - public boolean allowMultipleDiscussions() - { - return Boolean.parseBoolean(get("allowMultipleDiscussions")); - } } - public static class EmailOptionsForm extends ViewForm { private int _emailPreference = EmailOption.MESSAGES_NONE.getValue(); @@ -2318,7 +2251,6 @@ public static class ThreadViewBean public URLHelper currentURL; public boolean print = false; public boolean includeGroups; - public boolean embedded; } @@ -2329,12 +2261,6 @@ private ThreadView() super("/org/labkey/announcements/announcementThread.jsp", new ThreadViewBean()); } - public ThreadView(Container c, URLHelper currentURL, User user, String rowId, String entityId) - { - this(); - init(c, findThread(c, rowId, entityId), currentURL, getPermissions(c, user, getSettings(c)), false, false); - } - public ThreadView(Container c, ActionURL url, AnnouncementModel ann, Permissions perm) { this(); @@ -2370,9 +2296,8 @@ protected void init(Container c, AnnouncementModel ann, URLHelper currentURL, Pe bean.printURL = null == currentURL ? null : currentURL.clone().replaceParameter(ActionURL.Param._print.name(), "1"); bean.print = print; bean.includeGroups = perm.includeGroups(); - bean.embedded = (null != ann.getDiscussionSrcURL() && !getViewContext().getActionURL().getController().equalsIgnoreCase("announcements")); // TODO: Should have explicit flag for discussion case - if (!bean.print && !bean.embedded) + if (!bean.print) { NavTree buttons = new NavTree(); if (null != bean.listURL) diff --git a/announcements/src/org/labkey/announcements/announcementThread.jsp b/announcements/src/org/labkey/announcements/announcementThread.jsp index 78ddd926c94..b636af6df12 100644 --- a/announcements/src/org/labkey/announcements/announcementThread.jsp +++ b/announcements/src/org/labkey/announcements/announcementThread.jsp @@ -22,13 +22,11 @@ <%@ page import="org.labkey.announcements.AnnouncementsController.ThreadViewBean" %> <%@ page import="org.labkey.announcements.model.AnnouncementManager" %> <%@ page import="org.labkey.announcements.model.AnnouncementModel" %> -<%@ page import="org.labkey.announcements.model.DiscussionServiceImpl" %> -<%@ page import="org.labkey.api.announcements.DiscussionService" %> +<%@ page import="org.labkey.announcements.model.Settings" %> <%@ page import="org.labkey.api.attachments.Attachment" %> <%@ page import="org.labkey.api.data.Container" %> <%@ page import="org.labkey.api.security.User" %> <%@ page import="org.labkey.api.security.permissions.AdminPermission" %> -<%@ page import="org.labkey.api.util.URLHelper" %> <%@ page import="org.labkey.api.view.ActionURL" %> <%@ page import="org.labkey.api.view.HttpView" %> <%@ page import="org.springframework.web.servlet.mvc.Controller" %> @@ -41,7 +39,7 @@ User user = getUser(); ThreadViewBean bean = me.getModelBean(); AnnouncementModel announcementModel = bean.announcementModel; - DiscussionService.Settings settings = bean.settings; + Settings settings = bean.settings; if (null == announcementModel) { @@ -54,20 +52,6 @@ if (null != bean.message) %><%=h(bean.message)%><% } -// is this an embedded discussion? -ActionURL discussionSrc = null; - -if (!bean.embedded && null != announcementModel.getDiscussionSrcURL()) -{ - discussionSrc = DiscussionServiceImpl.fromSaved(announcementModel.getDiscussionSrcURL()); - discussionSrc.replaceParameter("discussion.id", announcementModel.getRowId()); -} - -if (!bean.print && null != discussionSrc) -{ - %>

"> This is a <%=h(settings.getConversationName().toLowerCase())%> about another page. <%=link("view page", discussionSrc)%><% -} - if (announcementModel.isSpam()) { %>

"> This <%=h(settings.getConversationName().toLowerCase())%> is marked as spam.<% @@ -84,11 +68,6 @@ else if (null == announcementModel.getApproved() && c.hasPermission(user, AdminP <%=AnnouncementManager.getUserDetailsLink(c, user, announcementModel.getCreatedBy(), bean.includeGroups, false)%> <% -if (false && !bean.print && null != discussionSrc) -{ - %><%=link("view in context", discussionSrc)%> <% -} - if (bean.perm.allowUpdate(announcementModel) && !bean.print) { ActionURL update = AnnouncementsController.getUpdateURL(c, announcementModel.getEntityId(), bean.currentURL); @@ -257,38 +236,17 @@ if (!bean.isResponse && !bean.print) { if (bean.perm.allowResponse(announcementModel)) { - // There are two cases here.... I'm in the wiki controller or I'm not (e.g. I'm a discussion) - if (bean.embedded) - { - // UNDONE: respond in place - URLHelper url = bean.currentURL.clone(); - url.replaceParameter("discussion.id", announcementModel.getRowId()); - url.replaceParameter("discussion.reply", "1"); - %> - <%= button("Respond").href(url) %> <% - } - else - { - ActionURL respond = announcementURL(c, RespondAction.class, "parentId", announcementModel.getEntityId()); - respond.addReturnUrl(bean.currentURL); - %> - <%= button("Respond").href(respond) %> <% - } + ActionURL respond = announcementURL(c, RespondAction.class, "parentId", announcementModel.getEntityId()); + respond.addReturnUrl(bean.currentURL); + %><%= button("Respond").href(respond) %> <% } + if (bean.perm.allowDeleteMessage(announcementModel)) { ActionURL deleteThread = announcementURL(c, DeleteAction.class, "entityId", announcementModel.getEntityId()); deleteThread.addCancelURL(bean.currentURL); - if (bean.embedded) - { - URLHelper redirect = bean.currentURL.clone().deleteScopeParameters("discussion"); - deleteThread.addReturnUrl(redirect); - } - else - { - deleteThread.addReturnUrl(bean.messagesURL); - } - %> + deleteThread.addReturnUrl(bean.messagesURL); + %> <%= button("Delete " + settings.getConversationName()).href(deleteThread) %> <% } } diff --git a/announcements/src/org/labkey/announcements/api/AnnouncementServiceImpl.java b/announcements/src/org/labkey/announcements/api/AnnouncementServiceImpl.java index 2872015d602..4196d1f0002 100644 --- a/announcements/src/org/labkey/announcements/api/AnnouncementServiceImpl.java +++ b/announcements/src/org/labkey/announcements/api/AnnouncementServiceImpl.java @@ -23,7 +23,7 @@ import org.labkey.announcements.model.AnnouncementManager; import org.labkey.announcements.model.AnnouncementModel; import org.labkey.announcements.model.Permissions; -import org.labkey.api.announcements.DiscussionService; +import org.labkey.announcements.model.Settings; import org.labkey.api.announcements.api.Announcement; import org.labkey.api.announcements.api.AnnouncementService; import org.labkey.api.announcements.api.DiscussionSrcTypeProvider; @@ -40,6 +40,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -65,7 +66,7 @@ public Announcement insertAnnouncement(Container c, User u, String title, String public Announcement insertAnnouncement(Container c, User u, String title, String body, boolean sendEmailNotification, @Nullable Integer parentRowId, @Nullable String status, @Nullable List memberList) { - DiscussionService.Settings settings = AnnouncementsController.getSettings(c); + Settings settings = AnnouncementsController.getSettings(c); Permissions perm = AnnouncementsController.getPermissions(c, u, settings); if (!perm.allowInsert()) @@ -76,7 +77,7 @@ public Announcement insertAnnouncement(Container c, User u, String title, String AnnouncementModel insert = new AnnouncementModel(); insert.setTitle(title); insert.setBody(body); - if (status != null && EnumUtils.getEnum(DiscussionService.StatusOption.class, status, null) != null) + if (status != null && EnumUtils.getEnum(StatusOption.class, status, null) != null) { insert.setStatus(status); } @@ -132,7 +133,7 @@ public Announcement insertAnnouncement(Container c, User u, String title, String public Announcement getAnnouncement(Container container, User user, int RowId) { AnnouncementModel model = new AnnouncementModel(); - DiscussionService.Settings settings = AnnouncementsController.getSettings(container); + Settings settings = AnnouncementsController.getSettings(container); Permissions perm = AnnouncementsController.getPermissions(container, user, settings); if (RowId != 0) @@ -157,7 +158,7 @@ public List getAnnouncements(Container... containers) for (AnnouncementModel announcementModel : announcementModels) { Announcement announcement = new AnnouncementImpl(announcementModel); - DiscussionService.Settings settings = AnnouncementsController.getSettings(announcement.getContainer()); + Settings settings = AnnouncementsController.getSettings(announcement.getContainer()); Permissions perm = AnnouncementsController.getPermissions(announcement.getContainer(), HttpView.getRootContext().getUser(), settings); if (!perm.allowRead(announcementModel)) @@ -185,7 +186,7 @@ public List getAnnouncements(Container... containers) public Announcement updateAnnouncement(int RowId, Container c, User u, String title, String body) { AnnouncementModel model; - DiscussionService.Settings settings = AnnouncementsController.getSettings(c); + Settings settings = AnnouncementsController.getSettings(c); Permissions perm = AnnouncementsController.getPermissions(c, u, settings); model = AnnouncementManager.getAnnouncement(c, RowId); @@ -221,7 +222,7 @@ public int updateContainer(List discussionSrcIds, Container targetContai public void deleteAnnouncement(Announcement announcement) { Container container = announcement.getContainer(); - DiscussionService.Settings settings = AnnouncementsController.getSettings(container); + Settings settings = AnnouncementsController.getSettings(container); Permissions perm = AnnouncementsController.getPermissions(container, HttpView.getRootContext().getUser(), settings); if (!perm.allowDeleteAnyThread()) @@ -232,6 +233,22 @@ public void deleteAnnouncement(Announcement announcement) AnnouncementManager.deleteAnnouncement(container, announcement.getRowId()); } + @Override + public Collection getDiscussions(Container container, String identifier, boolean includeResponses) + { + final List ret = new LinkedList<>(); + + for (AnnouncementModel ann : AnnouncementManager.getDiscussions(container, identifier)) + { + ret.add(new AnnouncementImpl(ann)); + + if (includeResponses) + ann.getResponses().forEach(x -> ret.add(new AnnouncementImpl(x))); + } + + return ret; + } + @Override public @Nullable DiscussionSrcTypeProvider getDiscussionSrcTypeProvider(@Nullable String type) { diff --git a/announcements/src/org/labkey/announcements/customize.jsp b/announcements/src/org/labkey/announcements/customize.jsp index c7110fb1014..1fa65227e59 100644 --- a/announcements/src/org/labkey/announcements/customize.jsp +++ b/announcements/src/org/labkey/announcements/customize.jsp @@ -20,9 +20,9 @@ <%@ page import="org.labkey.announcements.AnnouncementsController.ModeratorReviewAction" %> <%@ page import="org.labkey.announcements.model.AnnouncementManager" %> <%@ page import="org.labkey.announcements.model.ModeratorReview" %> +<%@ page import="org.labkey.announcements.model.Settings" %> +<%@ page import="org.labkey.announcements.model.Settings.SortOrder" %> <%@ page import="org.labkey.api.admin.AdminUrls" %> -<%@ page import="org.labkey.api.announcements.DiscussionService" %> -<%@ page import="org.labkey.api.announcements.DiscussionService.Settings.SortOrder" %> <%@ page import="org.labkey.api.data.ContainerManager" %> <%@ page import="org.labkey.api.view.HttpView" %> <%@ taglib prefix="labkey" uri="http://www.labkey.org/taglib" %> @@ -30,7 +30,7 @@ <% HttpView me = HttpView.currentView(); CustomizeBean bean = me.getModelBean(); - DiscussionService.Settings settings = bean.settings; + Settings settings = bean.settings; %> <%=generateReturnUrlFormField(bean.returnUrl)%> @@ -76,15 +76,15 @@ - + - + - +
>> Off - Conversations are visible to anyone with read permissions, content can be modified after posting, content will be sent via email
>> On with email - Only editors and those on the notify list can view conversations, content can't be modified after posting, content is sent via email
>> On without email - Identical to behavior described above, with the exception that content is never sent via email
diff --git a/announcements/src/org/labkey/announcements/customizeDiscussionWebPart.jsp b/announcements/src/org/labkey/announcements/customizeDiscussionWebPart.jsp deleted file mode 100644 index a3ce2ebfd49..00000000000 --- a/announcements/src/org/labkey/announcements/customizeDiscussionWebPart.jsp +++ /dev/null @@ -1,40 +0,0 @@ -<% -/* - * Copyright (c) 2008-2019 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -%> -<%@ page import="org.labkey.api.view.HttpView"%> -<%@ page import="org.labkey.api.view.Portal" %> -<%@ page import="java.util.Map" %> -<%@ page extends="org.labkey.api.jsp.JspBase" %> -<%@ taglib prefix="labkey" uri="http://www.labkey.org/taglib" %> -<% - HttpView me = HttpView.currentView(); - Portal.WebPart part = me.getModelBean(); - Map props = part.getPropertyMap(); -%> -This webpart displays a single discussion. It's designed to work in conjunction with custom pages built using the JavaScript API, though it could be placed on a portal page to display a single, specific discussion.

- - - - - - - - - - -
Entity Id:">
-
\ No newline at end of file diff --git a/announcements/src/org/labkey/announcements/discussionMenu.jsp b/announcements/src/org/labkey/announcements/discussionMenu.jsp deleted file mode 100644 index fad656fe91d..00000000000 --- a/announcements/src/org/labkey/announcements/discussionMenu.jsp +++ /dev/null @@ -1,98 +0,0 @@ -<% -/* - * Copyright (c) 2008-2019 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -%> -<%@ page import="org.jetbrains.annotations.NotNull" %> -<%@ page import="org.labkey.announcements.model.AnnouncementModel" %> -<%@ page import="org.labkey.announcements.model.DiscussionServiceImpl" %> -<%@ page import="org.labkey.api.data.Container" %> -<%@ page import="org.labkey.api.security.User" %> -<%@ page import="org.labkey.api.security.permissions.AdminPermission" %> -<%@ page import="org.labkey.api.security.permissions.InsertPermission" %> -<%@ page import="org.labkey.api.util.PageFlowUtil" %> -<%@ page import="org.labkey.api.util.URLHelper" %> -<%@ page import="org.labkey.api.view.HttpView" %> -<%@ page import="org.labkey.api.view.NavTree" %> -<%@ page import="org.labkey.api.view.PopupMenuView" %> -<%@ page import="java.util.List" %> -<%@ page extends="org.labkey.api.jsp.JspBase" %> -<% - DiscussionServiceImpl.PickerView me = HttpView.currentView(); - Container c = getContainer(); - User user = getUser(); - - boolean isGuest = user.isGuest(); - boolean isAdmin = !isGuest && c.hasPermission(user, AdminPermission.class); - boolean canInsert = !isGuest && c.hasPermission(user, InsertPermission.class); - - @NotNull List discussions = me.discussions; - URLHelper pageURL = me.pageURL; - - String toggleId = "discussionAreaToggle" + getRequestScopedUID(); - URLHelper clonedUrl = pageURL.clone().deleteScopeParameters("discussion"); - String emailUrl = "mailto:?subject=" + PageFlowUtil.encodeURIComponent(me.title) + "&body=" + PageFlowUtil.encodeURIComponent(me.pageURL.getURIString()); - String emailPreferencesUrl = me.emailPreferencesURL.getLocalURIString(); - String adminEmailUrl = me.adminEmailURL.getLocalURIString(); - String customizeUrl = me.customizeURL.getLocalURIString(); - String hideUrl = pageURL.deleteScopeParameters("discussion").addParameter("discussion.hide", "true").getLocalURIString(); - - NavTree menu = new NavTree(); - if (me.allowMultipleDiscussions) - { - for (AnnouncementModel a : discussions) - { - String title = a.getTitle(); - menu.addChild(title, clonedUrl.clone().addParameter("discussion.id", String.valueOf(a.getRowId())) + "#discussionArea"); - } - } - else if (!discussions.isEmpty()) - { - if (null == request.getParameter("discussion.hide")) - { - menu.addChild("Hide discussion", hideUrl); - } - else - { - AnnouncementModel a = discussions.get(0); - menu.addChild("Show discussion", clonedUrl.clone().addParameter("discussion.id", String.valueOf(a.getRowId())) + "#discussionArea"); - } - } - if ((me.allowMultipleDiscussions || discussions.isEmpty()) && canInsert) - { - menu.addChild("Start" + (me.allowMultipleDiscussions ? " new " : "") + "discussion", clonedUrl.clone().addParameter("discussion.start", true) + "#discussionArea", null, "fa fa-comments"); - } - menu.addChild("Start email discussion", emailUrl, null, "fa fa-envelope"); - menu.addSeparator(); - - if (!isGuest) - { - menu.addChild("Email preferences", emailPreferencesUrl); - } - if (isAdmin) - { - menu.addChild("Email Admin", adminEmailUrl); - menu.addChild("Admin", customizeUrl); - } -%> - - diff --git a/announcements/src/org/labkey/announcements/insert.jsp b/announcements/src/org/labkey/announcements/insert.jsp index d8bf4266edc..0c206146d6f 100644 --- a/announcements/src/org/labkey/announcements/insert.jsp +++ b/announcements/src/org/labkey/announcements/insert.jsp @@ -20,7 +20,7 @@ <%@ page import="org.labkey.announcements.AnnouncementsController.BaseInsertView.InsertBean" %> <%@ page import="org.labkey.announcements.AnnouncementsController.CompleteUserAction" %> <%@ page import="org.labkey.announcements.model.ModeratorReview" %> -<%@ page import="org.labkey.api.announcements.DiscussionService" %> +<%@ page import="org.labkey.announcements.model.Settings" %> <%@ page import="org.labkey.api.data.Container" %> <%@ page import="org.labkey.api.security.User" %> <%@ page import="org.labkey.api.util.URLHelper" %> @@ -43,7 +43,7 @@ Container c = getContainer(); User user = getUser(); - DiscussionService.Settings settings = bean.settings; + Settings settings = bean.settings; AnnouncementForm form = bean.form; URLHelper cancelURL = bean.cancelURL; ActionURL insertUrl = AnnouncementsController.getInsertURL(c); @@ -62,8 +62,6 @@ <%=generateReturnUrlFormField(cancelURL)%> - - <% ModeratorReview mr = ModeratorReview.get(settings.getModeratorReview()); @@ -167,7 +165,7 @@ else %><%= generateBackButton("Cancel") %><% } %> - +

<% diff --git a/announcements/src/org/labkey/announcements/model/AnnouncementDigestProvider.java b/announcements/src/org/labkey/announcements/model/AnnouncementDigestProvider.java index 96a1fc80557..7f51f8b7c25 100644 --- a/announcements/src/org/labkey/announcements/model/AnnouncementDigestProvider.java +++ b/announcements/src/org/labkey/announcements/model/AnnouncementDigestProvider.java @@ -15,11 +15,12 @@ */ package org.labkey.announcements.model; +import jakarta.mail.Message; +import jakarta.mail.internet.InternetAddress; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.labkey.announcements.AnnouncementsController; import org.labkey.api.announcements.CommSchema; -import org.labkey.api.announcements.DiscussionService; import org.labkey.api.announcements.api.AnnouncementService; import org.labkey.api.announcements.api.DiscussionSrcTypeProvider; import org.labkey.api.data.Container; @@ -40,8 +41,6 @@ import org.labkey.api.util.emailTemplate.EmailTemplateService; import org.labkey.api.view.ActionURL; -import jakarta.mail.Message; -import jakarta.mail.internet.InternetAddress; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -93,7 +92,7 @@ public void sendDigestForAllContainers(Date start, Date end) throws Exception private void sendDigest(Container c, Date start, Date end) throws Exception { - DiscussionService.Settings settings = AnnouncementManager.getMessageBoardSettings(c); + Settings settings = AnnouncementManager.getMessageBoardSettings(c); Collection announcements = getRecentAnnouncementsInContainer(c, start, end); DailyDigestEmailPrefsSelector sel = new DailyDigestEmailPrefsSelector(c); @@ -134,7 +133,7 @@ private static Collection getRecentAnnouncementsInContainer(C } } - private static MailHelper.MultipartMessage getDailyDigestMessage(Container c, DiscussionService.Settings settings, Permissions perm, List announcementModels, User recipient) throws Exception + private static MailHelper.MultipartMessage getDailyDigestMessage(Container c, Settings settings, Permissions perm, List announcementModels, User recipient) throws Exception { DailyDigestBean bean = new DailyDigestBean(c, recipient, settings, perm, announcementModels); DailyDigestEmailTemplate template = EmailTemplateService.get().getEmailTemplate(DailyDigestEmailTemplate.class, c); @@ -305,14 +304,14 @@ public static class DailyDigestBean private final User recipient; private final List announcementModels; private final String conversationName; - private final DiscussionService.Settings settings; + private final Settings settings; private final ActionURL boardURL; private final String boardPath; private final String siteUrl; private final ActionURL removeURL; private final boolean includeGroups; - public DailyDigestBean(Container c, User recipient, DiscussionService.Settings settings, Permissions perm, List announcementModels) + public DailyDigestBean(Container c, User recipient, Settings settings, Permissions perm, List announcementModels) { this.c = c; this.recipient = recipient; diff --git a/announcements/src/org/labkey/announcements/model/AnnouncementManager.java b/announcements/src/org/labkey/announcements/model/AnnouncementManager.java index 8fd49a60518..28b20cb1b58 100644 --- a/announcements/src/org/labkey/announcements/model/AnnouncementManager.java +++ b/announcements/src/org/labkey/announcements/model/AnnouncementManager.java @@ -27,8 +27,6 @@ import org.labkey.announcements.api.AnnouncementImpl; import org.labkey.announcements.config.AnnouncementEmailConfig; import org.labkey.api.announcements.CommSchema; -import org.labkey.api.announcements.DiscussionService; -import org.labkey.api.announcements.DiscussionService.Settings; import org.labkey.api.announcements.EmailOption; import org.labkey.api.announcements.api.AnnouncementService; import org.labkey.api.announcements.api.DiscussionSrcTypeProvider; @@ -96,7 +94,6 @@ import java.lang.reflect.InvocationTargetException; import java.sql.Timestamp; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -194,12 +191,6 @@ public static Pair, Boolean> getAnnouncements(Cont return getAnnouncements(c, filter, new Sort("Created")); } - public static @NotNull Collection getDiscussions(Container c, String[] identifiers) - { - SimpleFilter filter = new SimpleFilter(FieldKey.fromParts("discussionSrcIdentifier"), Arrays.asList(identifiers), CompareType.IN); - return getAnnouncements(c, filter, new Sort("Created")); - } - public static Collection getResponses(AnnouncementModel parent) { // assert null == parent.getParent(); // TODO: Either assert or short circuit with empty collection @@ -560,7 +551,7 @@ private static boolean updateApproved(Container c, AnnouncementModel ann, Date d private static void sendNotificationEmails(final AnnouncementModel a, final WikiRendererType currentRendererType, final Container c, final User user) { Thread renderAndEmailThread = new Thread(() -> { - Settings settings = DiscussionService.get().getSettings(c); + Settings settings = getMessageBoardSettings(c); boolean isResponse = null != a.getParent(); AnnouncementModel parent = a; diff --git a/announcements/src/org/labkey/announcements/model/AnnouncementModel.java b/announcements/src/org/labkey/announcements/model/AnnouncementModel.java index 3a1e2ad5960..571069630b8 100644 --- a/announcements/src/org/labkey/announcements/model/AnnouncementModel.java +++ b/announcements/src/org/labkey/announcements/model/AnnouncementModel.java @@ -26,7 +26,7 @@ import org.json.JSONObject; import org.labkey.announcements.AnnouncementsController; import org.labkey.announcements.AnnouncementsController.ThreadAction; -import org.labkey.api.announcements.DiscussionService.StatusOption; +import org.labkey.api.announcements.api.AnnouncementService.StatusOption; import org.labkey.api.attachments.Attachment; import org.labkey.api.attachments.AttachmentParent; import org.labkey.api.attachments.AttachmentService; @@ -75,7 +75,6 @@ public class AnnouncementModel extends Entity implements Serializable // for discussions private String _discussionSrcIdentifier = null; private String _discussionSrcEntityType = null; - private String _discussionSrcURL = null; private int _responseCount = 0; @@ -340,16 +339,6 @@ public void setDiscussionSrcEntityType(String discussionSrcEntityType) _discussionSrcEntityType = discussionSrcEntityType; } - public String getDiscussionSrcURL() - { - return _discussionSrcURL; - } - - public void setDiscussionSrcURL(String discussionSrcURL) - { - _discussionSrcURL = discussionSrcURL; - } - @JsonIgnore public int getResponseCount() { diff --git a/announcements/src/org/labkey/announcements/model/DiscussionServiceImpl.java b/announcements/src/org/labkey/announcements/model/DiscussionServiceImpl.java deleted file mode 100644 index ca3127caaab..00000000000 --- a/announcements/src/org/labkey/announcements/model/DiscussionServiceImpl.java +++ /dev/null @@ -1,438 +0,0 @@ -/* - * Copyright (c) 2008-2019 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.labkey.announcements.model; - -import org.apache.commons.lang3.StringUtils; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.labkey.announcements.AnnouncementsController; -import org.labkey.announcements.AnnouncementsController.InsertMessageView; -import org.labkey.announcements.api.AnnouncementImpl; -import org.labkey.api.announcements.DiscussionService; -import org.labkey.api.announcements.api.Announcement; -import org.labkey.api.data.Container; -import org.labkey.api.data.ContainerManager; -import org.labkey.api.security.User; -import org.labkey.api.settings.AppProps; -import org.labkey.api.settings.LookAndFeelProperties; -import org.labkey.api.util.HtmlString; -import org.labkey.api.util.URLHelper; -import org.labkey.api.util.UniqueID; -import org.labkey.api.view.ActionURL; -import org.labkey.api.view.HtmlView; -import org.labkey.api.view.HttpView; -import org.labkey.api.view.JspView; -import org.labkey.api.view.VBox; -import org.labkey.api.view.ViewContext; -import org.labkey.api.view.WebPartFrame; -import org.labkey.api.view.WebPartView; -import org.springframework.web.servlet.ModelAndView; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; -import java.util.Collection; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -/** - * User: matthewb - * Date: Feb 6, 2007 - * Time: 12:37:45 PM - */ -public class DiscussionServiceImpl implements DiscussionService -{ - @Override - public WebPartView startDiscussion(Container c, User user, String identifier, ActionURL pageURL, URLHelper cancelURL, String title, String summary, boolean allowMultipleDiscussions) - { - if (!allowMultipleDiscussions) - { - List discussions = AnnouncementManager.getDiscussions(c, identifier); - - if (!discussions.isEmpty()) - return getDiscussion(c, cancelURL, discussions.get(0), user); // TODO: cancelURL is probably not right - } - - String viewTitle = "New Discussion"; - AnnouncementsController.AnnouncementForm form = new AnnouncementsController.AnnouncementForm(); - form.setUser(user); - form.setContainer(c); - form.set("title", title); - form.set("discussionSrcIdentifier", identifier); - form.set("discussionSrcURL", toSaved(pageURL)); - - return new InsertMessageView(form, viewTitle, null, false, cancelURL, true, allowMultipleDiscussions); - } - - - public static String toSaved(ActionURL url) - { - Container c = ContainerManager.getForURL(url); - ActionURL saveURL = url.clone(); - if (null != c) - saveURL.setContainer(c); - String saved=saveURL.getLocalURIString(); - - String contextPath = AppProps.getInstance().getContextPath(); - if (saved.startsWith(contextPath)) - saved = "~" + saved.substring(contextPath.length()); - return saved; - } - - - public static ActionURL fromSaved(String saved) - { - if (saved.startsWith("~/")) - saved = AppProps.getInstance().getContextPath() + saved.substring(1); - ActionURL url = new ActionURL(saved); - String id = StringUtils.strip(url.getExtraPath(), "/"); - Container c = ContainerManager.getForId(id); - if (null != c) - url.setContainer(c); - return url; - } - - - public WebPartView getDiscussion(Container c, URLHelper currentURL, AnnouncementModel ann, User user) - { - // NOTE: don't pass in AnnouncementModel, it came from getBareAnnouncements() - return new AnnouncementsController.ThreadView(c, currentURL, user, null, ann.getEntityId()); - } - - - @Override - @Nullable - public DiscussionService.DiscussionView getDiscussionArea(ViewContext context, String objectId, ActionURL pageURL, String newDiscussionTitle, boolean allowMultipleDiscussions, boolean displayFirstDiscussionByDefault) - { - Container c = context.getContainer(); - User user = context.getUser(); - ActionURL currentURL = context.getActionURL(); - - return getDiscussionArea(c, user, currentURL, objectId, pageURL, newDiscussionTitle, allowMultipleDiscussions, displayFirstDiscussionByDefault); - } - - @Override - @Nullable - public DiscussionService.DiscussionView getDiscussionArea(Container c, User user, URLHelper currentURL, String objectId, ActionURL pageURL, String newDiscussionTitle, boolean allowMultipleDiscussions, boolean displayFirstDiscussionByDefault) - { - if (!LookAndFeelProperties.getInstance(c).isDiscussionEnabled() || !AppProps.getInstance().isOptionalFeatureEnabled(AppProps.DEPRECATED_OBJECT_LEVEL_DISCUSSIONS)) - return null; - - // get discussion parameters - Map params = currentURL.getScopeParameters("discussion"); - List discussions = AnnouncementManager.getDiscussions(c, objectId); - - int discussionId = 0; - try - { - String id = params.get("id"); - if (null != id) - { - discussionId = Integer.parseInt(id); - } - else if (displayFirstDiscussionByDefault && params.isEmpty() && !discussions.isEmpty()) - { - discussionId = discussions.get(0).getRowId(); - } - } - catch (Exception x) {/* */} - - // often, but not necessarily the same as pageURL, assume we want to return to current page - URLHelper adjustedCurrentURL = currentURL.clone().deleteScopeParameters("discussion"); - if (0 != discussionId) - adjustedCurrentURL.addParameter("discussion.id", "" + discussionId); - - ThreadWrapper discussionBox = null; - String focusId = null; - - if (params.get("start") != null) - { - pageURL = pageURL.clone(); - // clean up discussion parameters (in case caller didn't) - pageURL.deleteScopeParameters("discussion"); - - WebPartView start = startDiscussion(c, user, objectId, pageURL, adjustedCurrentURL, newDiscussionTitle, "", allowMultipleDiscussions); - String title; - - if (start instanceof AnnouncementsController.ThreadView) - { - title = "Discussion"; - } - else - { - title = "Start a new discussion"; - focusId = "body"; - } - - start.setFrame(WebPartView.FrameType.NONE); - discussionBox = new ThreadWrapper(adjustedCurrentURL, title, start); - } - else - { - AnnouncementModel selected = null; - - WebPartView discussionView = null; - HttpView respondView = null; - - if (discussionId != 0) - { - for (AnnouncementModel ann : discussions) - { - if (ann.getRowId() == discussionId) - { - selected = ann; - break; - } - } - - if (selected != null) - { - discussionView = getDiscussion(c, adjustedCurrentURL, selected, user); - discussionView.setFrame(WebPartView.FrameType.NONE); - if (params.get("reply") != null) - { - ((AnnouncementsController.ThreadView)discussionView).getModelBean().isResponse = true; - respondView = new AnnouncementsController.RespondView(c, selected, adjustedCurrentURL, true); - focusId = "body"; - } - } - } - - if (discussionView != null) - discussionBox = new ThreadWrapper(adjustedCurrentURL, "Discussion", discussionView, respondView); - } - - if (discussionBox == null) - discussionBox = new ThreadWrapper(currentURL, "Discussion"); - - ModelAndView pickerView = new PickerView(c, discussionBox.getId(), adjustedCurrentURL, newDiscussionTitle, discussions, true, allowMultipleDiscussions, objectId); - DiscussionService.DiscussionView view = new DiscussionService.DiscussionView(pickerView); - - view.addView(discussionBox); - view.addClientDependencies(discussionBox.getClientDependencies()); - view.setFocusId(focusId); - - return view; - } - - - @Override - public void deleteDiscussions(Container c, User user, String... identifiers) - { - Collection discussions = AnnouncementManager.getDiscussions(c, identifiers); - for (AnnouncementModel ann : discussions) - { - AnnouncementManager.deleteAnnouncement(c, ann.getRowId()); - } - } - - @Override - public void deleteDiscussions(Container container, User user, Collection identifiers) - { - Collection discussions = AnnouncementManager.getDiscussions(container, identifiers.toArray(new String[0])); - for (AnnouncementModel ann : discussions) - { - AnnouncementManager.deleteAnnouncement(container, ann.getRowId()); - } - } - - @Override - public void unlinkDiscussions(Container c, String identifier, User user) - { - Collection discussions = AnnouncementManager.getDiscussions(c, identifier); - for (AnnouncementModel ann : discussions) - { - try - { - ann.setDiscussionSrcURL(null); - AnnouncementManager.updateAnnouncement(user, ann, Collections.emptyList()); - } - catch (IOException e) - { - throw new RuntimeException(e); - } - } - } - - @Override - public boolean hasDiscussions(Container container, String identifier) - { - return !AnnouncementManager.getDiscussions(container, identifier).isEmpty(); - } - - @Override - public Collection getDiscussions(Container container, String identifier, boolean includeResponses) - { - final List ret = new LinkedList<>(); - - for (AnnouncementModel ann : AnnouncementManager.getDiscussions(container, identifier)) - { - ret.add(new AnnouncementImpl(ann)); - - if (includeResponses) - ann.getResponses().forEach(x -> ret.add(new AnnouncementImpl(x))); - } - - return ret; - } - - @Override - public DiscussionService.Settings getSettings(Container container) - { - try - { - return AnnouncementManager.getMessageBoardSettings(container); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } - - @Override - public void setSettings(Container container, DiscussionService.Settings settings) - { - try - { - AnnouncementManager.saveMessageBoardSettings(container, settings); - } - catch (Exception e) - { - throw new RuntimeException(e); - } - } - - public static class AnchorView extends HtmlView - { - AnchorView() - { - super(HtmlString.unsafe("")); - } - } - - - public static class ThreadWrapper extends WebPartView - { - String _id; - String _class = "labkey-hidden"; - VBox _vbox; - - ThreadWrapper(URLHelper currentURL, String caption, HttpView... views) - { - super(FrameType.NONE); - _vbox = new VBox(); - for (HttpView v : views) - { - if (v != null) - { - _vbox.addView(v); - _class = ""; - } - } - _vbox.addView(new AnchorView()); - _vbox.setTitle(caption); - _vbox.setFrame(WebPartView.FrameType.DIALOG); - URLHelper closeURL = getCloseURL(currentURL); - _vbox.setCloseURL(closeURL); - - _id = "discussionBox" + UniqueID.getRequestScopedUID(HttpView.currentRequest()); - - for (HttpView view : views) - { - if (view != null) - addClientDependencies(view.getClientDependencies()); - } - } - - public ThreadWrapper() - { - super(FrameType.NONE); - } - - String getId() - { - return _id; - } - - @Override - protected void renderView(Object model, HttpServletRequest request, HttpServletResponse response) throws Exception - { - _vbox.render(request, response); - } - - - @Override - public WebPartFrame getWebPartFrame() - { - return new WebPartFrame() - { - @Override - public void doStartTag(PrintWriter out) - { - out.write("

"); - } - - @Override - public void doEndTag(PrintWriter out) - { - out.write("
"); - } - }; - } - } - - - public static class PickerView extends JspView - { - final public String discussionAreaId; - final public URLHelper pageURL; - final public ActionURL emailPreferencesURL; - final public ActionURL adminEmailURL; - final public ActionURL customizeURL; - final public @NotNull List discussions; - final public boolean isDiscussionVisible; - final public boolean allowMultipleDiscussions; - final public String title; - - PickerView(Container c, String discussionAreaId, URLHelper pageURL, String title, @NotNull List discussions, boolean isDiscussionVisible, boolean allowMultipleDiscussions, String objectId) - { - super("/org/labkey/announcements/discussionMenu.jsp"); - setFrame(FrameType.NONE); - this.discussionAreaId = discussionAreaId; - this.pageURL = pageURL.clone(); - this.title = title; - this.emailPreferencesURL = AnnouncementsController.getEmailPreferencesURL(c, pageURL, objectId); - this.adminEmailURL = AnnouncementsController.getAdminEmailURL(c, pageURL); - this.customizeURL = AnnouncementsController.getAdminURL(c, pageURL); - this.discussions = discussions; - this.isDiscussionVisible = isDiscussionVisible; - this.allowMultipleDiscussions = allowMultipleDiscussions; - } - } - - - private static URLHelper getCloseURL(URLHelper currentURL) - { - URLHelper closeURL = currentURL.clone(); - closeURL.deleteScopeParameters("discussion"); - closeURL.addParameter("discussion.hide", "true"); - return closeURL; - } -} diff --git a/announcements/src/org/labkey/announcements/model/DiscussionWebPartFactory.java b/announcements/src/org/labkey/announcements/model/DiscussionWebPartFactory.java deleted file mode 100644 index 80ccb9ec7a8..00000000000 --- a/announcements/src/org/labkey/announcements/model/DiscussionWebPartFactory.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (c) 2008-2018 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.labkey.announcements.model; - -import org.jetbrains.annotations.NotNull; -import org.labkey.api.announcements.DiscussionService; -import org.labkey.api.data.BooleanFormat; -import org.labkey.api.data.Container; -import org.labkey.api.security.User; -import org.labkey.api.util.URLHelper; -import org.labkey.api.view.ActionURL; -import org.labkey.api.view.BaseWebPartFactory; -import org.labkey.api.view.HttpView; -import org.labkey.api.view.JspView; -import org.labkey.api.view.Portal; -import org.labkey.api.view.ViewContext; -import org.labkey.api.view.WebPartConfigurationException; -import org.labkey.api.view.WebPartView; - -import java.net.URISyntaxException; -import java.text.ParseException; -import java.util.Map; - -/** - * User: adam - * Date: Sep 11, 2008 - * Time: 10:21:48 AM - */ -public class DiscussionWebPartFactory extends BaseWebPartFactory -{ - public DiscussionWebPartFactory() - { - super("Discussion", true, false); - } - - @Override - public boolean isAvailable(Container c, String scope, String location) - { - return false; // This webpart is used via JavaScript, not from the portal page. See #7431 - } - - @Override - public HttpView getEditView(Portal.WebPart webPart, ViewContext context) - { - return new JspView<>("/org/labkey/announcements/customizeDiscussionWebPart.jsp", webPart); - } - - @Override - public WebPartView getWebPartView(@NotNull ViewContext portalCtx, @NotNull Portal.WebPart webPart) throws WebPartConfigurationException - { - Container c = portalCtx.getContainer(); - User user = portalCtx.getUser(); - Map props = webPart.getPropertyMap(); - - String entityId = webPart.getPropertyMap().get("entityId"); - - if (null == entityId) - throw new WebPartConfigurationException(this, "parameter 'entityId' is required"); - - String pageUrlString = props.get("pageURL"); - - ActionURL pageURL; - - try - { - pageURL = null != pageUrlString ? new ActionURL(pageUrlString) : portalCtx.getActionURL(); - } - catch (Exception e) - { - throw new WebPartConfigurationException(this, "invalid 'pageURL' parameter"); - } - - String currentUrlString = props.get("currentURL"); - URLHelper currentURL; - - try - { - currentURL = (null != currentUrlString ? new URLHelper(currentUrlString) : portalCtx.getActionURL()); - } - catch (URISyntaxException e) - { - throw new WebPartConfigurationException(this, "invalid 'currentURL' parameter"); - } - - String newDiscussionTitle = props.get("newDiscussionTitle"); - if (null == newDiscussionTitle) - newDiscussionTitle = "New Discussion"; - - boolean allowMultipleDiscussions; - - try - { - String allowMultipleDiscussionsString = props.get("allowMultipleDiscussions"); - allowMultipleDiscussions = (null != allowMultipleDiscussionsString && new BooleanFormat().parseObject(allowMultipleDiscussionsString).booleanValue()); - } - catch (ParseException e) - { - throw new WebPartConfigurationException(this, "invalid 'allowMultipleDiscussions' parameter"); - } - - WebPartView view = DiscussionService.get().getDiscussionArea(c, user, currentURL, entityId, pageURL, newDiscussionTitle, allowMultipleDiscussions, true); - if (view == null) - throw new WebPartConfigurationException(this, "object-level discussions may not be enabled in project settings"); - - view.setTitle("Discussion"); - view.setFrame(WebPartView.FrameType.PORTAL); - - return view; - } -} diff --git a/announcements/src/org/labkey/announcements/model/EmailPrefsSelector.java b/announcements/src/org/labkey/announcements/model/EmailPrefsSelector.java index c668a16ccd9..fa1131a56b8 100644 --- a/announcements/src/org/labkey/announcements/model/EmailPrefsSelector.java +++ b/announcements/src/org/labkey/announcements/model/EmailPrefsSelector.java @@ -18,7 +18,6 @@ import org.jetbrains.annotations.Nullable; import org.labkey.announcements.AnnouncementsController; -import org.labkey.api.announcements.DiscussionService; import org.labkey.api.announcements.EmailOption; import org.labkey.api.announcements.api.AnnouncementService; import org.labkey.api.announcements.api.DiscussionSrcTypeProvider; @@ -35,11 +34,6 @@ import java.util.Map; import java.util.Set; -/** - * User: adam - * Date: Mar 4, 2007 - * Time: 9:14:51 PM - */ public abstract class EmailPrefsSelector { // This map contains one or more email preferences for each user who has read permissions to this folder. If the @@ -117,7 +111,7 @@ public boolean shouldSend(@Nullable AnnouncementModel ann, User user) if (!user.isActive()) return false; - DiscussionService.Settings settings = AnnouncementsController.getSettings(_c); + Settings settings = AnnouncementsController.getSettings(_c); int emailPreference = up.getEmailOptionId(); DiscussionSrcTypeProvider typeProvider = null; diff --git a/announcements/src/org/labkey/announcements/model/NormalMessageBoardPermissions.java b/announcements/src/org/labkey/announcements/model/NormalMessageBoardPermissions.java index fd14e210af0..30d4775c269 100644 --- a/announcements/src/org/labkey/announcements/model/NormalMessageBoardPermissions.java +++ b/announcements/src/org/labkey/announcements/model/NormalMessageBoardPermissions.java @@ -17,7 +17,6 @@ package org.labkey.announcements.model; import org.jetbrains.annotations.Nullable; -import org.labkey.api.announcements.DiscussionService; import org.labkey.api.data.Container; import org.labkey.api.data.SimpleFilter; import org.labkey.api.security.User; @@ -44,9 +43,9 @@ public class NormalMessageBoardPermissions implements Permissions { protected final Container _c; protected final User _user; - protected final DiscussionService.Settings _settings; + protected final Settings _settings; - public NormalMessageBoardPermissions(Container c, User user, DiscussionService.Settings settings) + public NormalMessageBoardPermissions(Container c, User user, Settings settings) { _c = c; _user = user; diff --git a/announcements/src/org/labkey/announcements/model/SecureMessageBoardPermissions.java b/announcements/src/org/labkey/announcements/model/SecureMessageBoardPermissions.java index a38858ff59c..8786d5db29f 100644 --- a/announcements/src/org/labkey/announcements/model/SecureMessageBoardPermissions.java +++ b/announcements/src/org/labkey/announcements/model/SecureMessageBoardPermissions.java @@ -18,7 +18,6 @@ import org.jetbrains.annotations.Nullable; import org.labkey.api.announcements.CommSchema; -import org.labkey.api.announcements.DiscussionService; import org.labkey.api.data.Container; import org.labkey.api.data.SimpleFilter; import org.labkey.api.security.User; @@ -31,7 +30,7 @@ */ public class SecureMessageBoardPermissions extends NormalMessageBoardPermissions { - public SecureMessageBoardPermissions(Container c, User user, DiscussionService.Settings settings) + public SecureMessageBoardPermissions(Container c, User user, Settings settings) { super(c, user, settings); } diff --git a/announcements/src/org/labkey/announcements/model/Settings.java b/announcements/src/org/labkey/announcements/model/Settings.java new file mode 100644 index 00000000000..4556e1a973a --- /dev/null +++ b/announcements/src/org/labkey/announcements/model/Settings.java @@ -0,0 +1,249 @@ +package org.labkey.announcements.model; + +import org.labkey.api.action.ReturnUrlForm; +import org.labkey.api.data.Sort; + +public class Settings extends ReturnUrlForm +{ + public static final String SECURE_OFF = "secureOff"; + public static final String SECURE_WITHOUT_EMAIL = "secureWithoutEmail"; + public static final String SECURE_WITH_EMAIL = "secureWithEmail"; + + String _boardName = "Messages"; + String _conversationName = "Message"; + String _secure = SECURE_OFF; + boolean _status = false; + boolean _expires = false; + boolean _assignedTo = false; + Integer _defaultAssignedTo = null; + boolean _formatPicker = false; + boolean _memberList = false; + boolean _titleEditable = false; + boolean _includeGroups = false; + SortOrder _sortOrder = SortOrder.getDefaultSortOrder(); + String _moderatorReview = "None"; + + public enum SortOrder + { + CreationDate(0, "-Created"), LatestResponseDate(1, "-ResponseCreated"); + + private final int _index; + private final String _sortString; + + SortOrder(int index, String sortString) + { + _index = index; + _sortString = sortString; + } + + public int getIndex() + { + return _index; + } + + public Sort getSort() + { + return new Sort(_sortString); + } + + public static SortOrder getByIndex(int index) + { + for (SortOrder so : values()) + { + if (index == so.getIndex()) + return so; + } + return getDefaultSortOrder(); // Bad index -- just return default + } + + public static SortOrder getDefaultSortOrder() + { + return CreationDate; + } + + + // For convenience, used in customize.jsp + @Override + public String toString() + { + return String.valueOf(_index); + } + } + + // Set the defaults that will be used for un-customized message boards. We must set them to false above to + // work around the "checkbox doesn't post if false" problem. + public void setDefaults() + { + _formatPicker = true; + _titleEditable = true; + } + + public String getBoardName() + { + return _boardName; + } + + public void setBoardName(String boardName) + { + _boardName = boardName; + } + + public String getConversationName() + { + return _conversationName; + } + + public void setConversationName(String itemName) + { + _conversationName = itemName; + } + + public String getSecure() + { + return _secure; + } + + public void setSecure(String secure) + { + _secure = secure; + } + + public boolean isSecureOff() + { + return (SECURE_OFF).equals(_secure); + } + + public boolean isSecureOn() + { + return (SECURE_WITHOUT_EMAIL).equals(_secure) || (SECURE_WITH_EMAIL).equals(_secure); + } + + public boolean isSecureWithoutEmailOn() + { + return (SECURE_WITHOUT_EMAIL).equals(_secure); + } + + public boolean isSecureWithEmailOn() + { + return (SECURE_WITH_EMAIL).equals(_secure); + } + + public boolean hasExpires() + { + return _expires; + } + + public void setExpires(boolean expires) + { + _expires = expires; + } + + public boolean hasFormatPicker() + { + return _formatPicker; + } + + public void setFormatPicker(boolean formatPicker) + { + _formatPicker = formatPicker; + } + + public boolean hasAssignedTo() + { + return _assignedTo; + } + + public void setAssignedTo(boolean assignedTo) + { + _assignedTo = assignedTo; + } + + public Integer getDefaultAssignedTo() + { + return _defaultAssignedTo; + } + + public void setDefaultAssignedTo(Integer defaultAssignedTo) + { + _defaultAssignedTo = defaultAssignedTo; + } + + public boolean hasStatus() + { + return _status; + } + + public void setStatus(boolean status) + { + _status = status; + } + + public boolean hasMemberList() + { + return _memberList; + } + + public void setMemberList(boolean memberList) + { + _memberList = memberList; + } + + // Keep this for backward compatibility with message boards that saved a "userList" setting. These settings are loaded by reflection. + @Deprecated + public boolean hasUserList() + { + return hasMemberList(); + } + + // Keep this for backward compatibility with message boards that saved a "userList" setting. These settings are loaded by reflection. + @Deprecated + public void setUserList(boolean memberList) + { + setMemberList(memberList); + } + + public int getSortOrderIndex() + { + return _sortOrder.getIndex(); + } + + public void setSortOrderIndex(int index) + { + _sortOrder = SortOrder.getByIndex(index); + } + + public Sort getSort() + { + return _sortOrder.getSort(); + } + + public boolean isTitleEditable() + { + return _titleEditable; + } + + public void setTitleEditable(boolean titleEditable) + { + _titleEditable = titleEditable; + } + + public boolean includeGroups() + { + return _includeGroups; + } + + public void setIncludeGroups(boolean includeGroups) + { + _includeGroups = includeGroups; + } + + public String getModeratorReview() + { + return _moderatorReview; + } + + public void setModeratorReview(String moderatorReview) + { + _moderatorReview = moderatorReview; + } +} diff --git a/announcements/src/org/labkey/announcements/query/AnnouncementSchema.java b/announcements/src/org/labkey/announcements/query/AnnouncementSchema.java index 2d1daf1a95b..ec2b93eaf2c 100644 --- a/announcements/src/org/labkey/announcements/query/AnnouncementSchema.java +++ b/announcements/src/org/labkey/announcements/query/AnnouncementSchema.java @@ -166,7 +166,7 @@ private AnnouncementTable createFilteredAnnouncementTable(ContainerFilter cf, Si { AnnouncementTable table = new AnnouncementTable(this, cf, filter); - for (String name : Arrays.asList("Expires", "RendererType", "Status", "AssignedTo", "DiscussionSrcIdentifier", "DiscussionSrcURL", "Folder", "LastIndexed")) + for (String name : Arrays.asList("Expires", "RendererType", "Status", "AssignedTo", "DiscussionSrcIdentifier", "Folder", "LastIndexed")) table.getMutableColumnOrThrow(name).setHidden(true); return table; diff --git a/announcements/src/org/labkey/announcements/query/AnnouncementTable.java b/announcements/src/org/labkey/announcements/query/AnnouncementTable.java index d41446d4091..1c709f3b1c1 100644 --- a/announcements/src/org/labkey/announcements/query/AnnouncementTable.java +++ b/announcements/src/org/labkey/announcements/query/AnnouncementTable.java @@ -20,7 +20,6 @@ import org.labkey.announcements.model.AnnouncementManager; import org.labkey.announcements.model.AnnouncementModel; import org.labkey.api.announcements.CommSchema; -import org.labkey.api.announcements.DiscussionService; import org.labkey.api.data.CompareType; import org.labkey.api.data.Container; import org.labkey.api.data.ContainerFilter; @@ -46,10 +45,6 @@ import java.util.Collections; import java.util.Map; -/** - * User: jeckels - * Date: Feb 5, 2012 - */ public class AnnouncementTable extends FilteredTable { private Boolean _secure; @@ -129,7 +124,7 @@ private boolean isSecure() { if (_secure == null) { - _secure = DiscussionService.get().getSettings(_userSchema.getContainer()).isSecureOn(); + _secure = AnnouncementManager.getMessageBoardSettings(_userSchema.getContainer()).isSecureOn(); } return _secure; } diff --git a/announcements/src/org/labkey/announcements/respond.jsp b/announcements/src/org/labkey/announcements/respond.jsp index 3537753d8e5..43df10ae78e 100644 --- a/announcements/src/org/labkey/announcements/respond.jsp +++ b/announcements/src/org/labkey/announcements/respond.jsp @@ -21,7 +21,7 @@ <%@ page import="org.labkey.announcements.AnnouncementsController.BaseInsertView" %> <%@ page import="org.labkey.announcements.AnnouncementsController.CompleteUserAction" %> <%@ page import="org.labkey.announcements.model.ModeratorReview" %> -<%@ page import="org.labkey.api.announcements.DiscussionService" %> +<%@ page import="org.labkey.announcements.model.Settings" %> <%@ page import="org.labkey.api.data.Container" %> <%@ page import="org.labkey.api.security.User" %> <%@ page import="org.labkey.api.view.ActionURL" %> @@ -40,7 +40,7 @@ HttpView me = HttpView.currentView(); BaseInsertView.InsertBean bean = me.getModelBean(); - DiscussionService.Settings settings = bean.settings; + Settings settings = bean.settings; AnnouncementForm form = bean.form; Container c = getContainer(); @@ -63,7 +63,6 @@ <%=generateReturnUrlFormField(bean.cancelURL)%> -
<% diff --git a/announcements/src/org/labkey/announcements/update.jsp b/announcements/src/org/labkey/announcements/update.jsp index 484c959e0b5..1797588ed54 100644 --- a/announcements/src/org/labkey/announcements/update.jsp +++ b/announcements/src/org/labkey/announcements/update.jsp @@ -19,7 +19,7 @@ <%@ page import="org.labkey.announcements.AnnouncementsController.AnnouncementUpdateView"%> <%@ page import="org.labkey.announcements.AnnouncementsController.AnnouncementUpdateView.UpdateBean" %> <%@ page import="org.labkey.announcements.model.AnnouncementModel" %> -<%@ page import="org.labkey.api.announcements.DiscussionService" %> +<%@ page import="org.labkey.announcements.model.Settings" %> <%@ page import="org.labkey.api.attachments.Attachment" %> <%@ page import="org.labkey.api.util.DateUtil" %> <%@ page import="org.labkey.api.view.ActionURL" %> @@ -40,7 +40,7 @@ UpdateBean bean = me.getModelBean(); AnnouncementModel ann = bean.annModel; - DiscussionService.Settings settings = bean.settings; + Settings settings = bean.settings; ActionURL baseUrl = getViewContext().cloneActionURL().deleteParameters(); ActionURL completeUserUrl = new ActionURL(AnnouncementsController.CompleteUserAction.class, getContainer()); %> diff --git a/api/src/org/labkey/api/announcements/DiscussionService.java b/api/src/org/labkey/api/announcements/DiscussionService.java deleted file mode 100644 index 7b6046e15c4..00000000000 --- a/api/src/org/labkey/api/announcements/DiscussionService.java +++ /dev/null @@ -1,362 +0,0 @@ -/* - * Copyright (c) 2008-2019 LabKey Corporation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.labkey.api.announcements; - -import org.jetbrains.annotations.Nullable; -import org.labkey.api.action.ReturnUrlForm; -import org.labkey.api.announcements.api.Announcement; -import org.labkey.api.data.Container; -import org.labkey.api.data.Sort; -import org.labkey.api.security.User; -import org.labkey.api.services.ServiceRegistry; -import org.labkey.api.util.URLHelper; -import org.labkey.api.view.ActionURL; -import org.labkey.api.view.VBox; -import org.labkey.api.view.ViewContext; -import org.labkey.api.view.WebPartView; -import org.springframework.web.servlet.ModelAndView; - -import java.util.Collection; - -/** - * Discussion service is a wrapper for the Announcements controller used as a forum for discussing objects/pages - * - * CONSIDER: ideas for future extensions - * + understand versioning (e.g. for wiki pages) - * + implement a resolver interface for generating links - * - * User: matthewb - * Date: Feb 1, 2007 - * Time: 2:33:22 PM - */ -public interface DiscussionService -{ - enum StatusOption - { - Active, - Closed - } - - /* CONSIDER: provide for resolvers rather than (or in addition to) hardcoded url back links - public interface Resolver - { - public ActionURL resolve(Container c, String id, String url) - } - registerResolver(String name, Resolver resolver); - */ - - static void setInstance(DiscussionService serviceImpl) - { - ServiceRegistry.get().registerService(DiscussionService.class, serviceImpl); - } - - static DiscussionService get() - { - return ServiceRegistry.get().getService(DiscussionService.class); - } - - /** - * @return WebPartView with a form to start a new discussion, will post directly to Announcements controller - */ - WebPartView startDiscussion(Container c, User user, String identifier, ActionURL pageURL, URLHelper cancelURL, String title, String summary, boolean allowMultipleDiscussions); - - /** show links, and forms, do it all (wrapper for other methods) - * @param displayFirstDiscussionByDefault if true and no discussion parameters are present, display the first - * discussion associated with this object. - * @return DiscussionView if EnableDiscussion flag in LookAndFeelProperties is true. If false, null. - */ - @Nullable - DiscussionView getDiscussionArea(ViewContext context, String objectId, ActionURL pageURL, String newDiscussionTitle, boolean allowMultipleDiscussions, boolean displayFirstDiscussionByDefault); - - @Nullable - DiscussionView getDiscussionArea(Container c, User user, URLHelper currentURL, String objectId, ActionURL pageURL, String newDiscussionTitle, boolean allowMultipleDiscussions, boolean displayFirstDiscussionByDefault); - - void deleteDiscussions(Container container, User user, String... identifier); - - void deleteDiscussions(Container container, User user, Collection identifiers); - - boolean hasDiscussions(Container container, String identifier); - - Collection getDiscussions(Container container, String identifier, boolean includeResponses); - - void unlinkDiscussions(Container container, String identifier, User user); - - Settings getSettings(Container container); - - void setSettings(Container container, Settings settings); - - class DiscussionView extends VBox - { - private String _focusId; - - public DiscussionView(ModelAndView... views) - { - super(views); - } - - public String getFocusId() - { - return _focusId; - } - - public void setFocusId(String focusId) - { - _focusId = focusId; - } - } - - class Settings extends ReturnUrlForm - { - public static final String SECURE_OFF = "secureOff"; - public static final String SECURE_WITHOUT_EMAIL = "secureWithoutEmail"; - public static final String SECURE_WITH_EMAIL = "secureWithEmail"; - - String _boardName = "Messages"; - String _conversationName = "Message"; - String _secure = SECURE_OFF; - boolean _status = false; - boolean _expires = false; - boolean _assignedTo = false; - Integer _defaultAssignedTo = null; - boolean _formatPicker = false; - boolean _memberList = false; - boolean _titleEditable = false; - boolean _includeGroups = false; - SortOrder _sortOrder = SortOrder.getDefaultSortOrder(); - String _moderatorReview = "None"; - - public enum SortOrder - { - CreationDate(0, "-Created"), LatestResponseDate(1, "-ResponseCreated"); - - private final int _index; - private final String _sortString; - - SortOrder(int index, String sortString) - { - _index = index; - _sortString = sortString; - } - - public int getIndex() - { - return _index; - } - - public Sort getSort() - { - return new Sort(_sortString); - } - - public static SortOrder getByIndex(int index) - { - for (SortOrder so : values()) - { - if (index == so.getIndex()) - return so; - } - return getDefaultSortOrder(); // Bad index -- just return default - } - - public static SortOrder getDefaultSortOrder() - { - return CreationDate; - } - - - // For convenience, used in customize.jsp - @Override - public String toString() - { - return String.valueOf(_index); - } - } - - // Set the defaults that will be used for un-customized message boards. We must set them to false above to - // workaround the "checkbox doesn't post if false" problem. - public void setDefaults() - { - _formatPicker = true; - _titleEditable = true; - } - - public String getBoardName() - { - return _boardName; - } - - public void setBoardName(String boardName) - { - _boardName = boardName; - } - - public String getConversationName() - { - return _conversationName; - } - - public void setConversationName(String itemName) - { - _conversationName = itemName; - } - - public String getSecure() - { - return _secure; - } - - public void setSecure(String secure) - { - _secure = secure; - } - - public boolean isSecureOff() { - return (SECURE_OFF).equals(_secure); - } - - public boolean isSecureOn() { - return (SECURE_WITHOUT_EMAIL).equals(_secure) || (SECURE_WITH_EMAIL).equals(_secure); - } - - public boolean isSecureWithoutEmailOn() { - return (SECURE_WITHOUT_EMAIL).equals(_secure); - } - - public boolean isSecureWithEmailOn() { - return (SECURE_WITH_EMAIL).equals(_secure); - } - - public boolean hasExpires() - { - return _expires; - } - - public void setExpires(boolean expires) - { - _expires = expires; - } - - public boolean hasFormatPicker() - { - return _formatPicker; - } - - public void setFormatPicker(boolean formatPicker) - { - _formatPicker = formatPicker; - } - - public boolean hasAssignedTo() - { - return _assignedTo; - } - - public void setAssignedTo(boolean assignedTo) - { - _assignedTo = assignedTo; - } - - public Integer getDefaultAssignedTo() - { - return _defaultAssignedTo; - } - - public void setDefaultAssignedTo(Integer defaultAssignedTo) - { - _defaultAssignedTo = defaultAssignedTo; - } - - public boolean hasStatus() - { - return _status; - } - - public void setStatus(boolean status) - { - _status = status; - } - - public boolean hasMemberList() - { - return _memberList; - } - - public void setMemberList(boolean memberList) - { - _memberList = memberList; - } - - // Keep this for backward compatibility with message boards that saved a "userList" setting. These settings are loaded by reflection. - @Deprecated - public boolean hasUserList() - { - return hasMemberList(); - } - - // Keep this for backward compatibility with message boards that saved a "userList" setting. These settings are loaded by reflection. - @Deprecated - public void setUserList(boolean memberList) - { - setMemberList(memberList); - } - - public int getSortOrderIndex() - { - return _sortOrder.getIndex(); - } - - public void setSortOrderIndex(int index) - { - _sortOrder = SortOrder.getByIndex(index); - } - - public Sort getSort() - { - return _sortOrder.getSort(); - } - - public boolean isTitleEditable() - { - return _titleEditable; - } - - public void setTitleEditable(boolean titleEditable) - { - _titleEditable = titleEditable; - } - - public boolean includeGroups() - { - return _includeGroups; - } - - public void setIncludeGroups(boolean includeGroups) - { - _includeGroups = includeGroups; - } - - public String getModeratorReview() - { - return _moderatorReview; - } - - public void setModeratorReview(String moderatorReview) - { - _moderatorReview = moderatorReview; - } - } -} diff --git a/api/src/org/labkey/api/announcements/api/AnnouncementService.java b/api/src/org/labkey/api/announcements/api/AnnouncementService.java index 47f889749d7..7d517322389 100644 --- a/api/src/org/labkey/api/announcements/api/AnnouncementService.java +++ b/api/src/org/labkey/api/announcements/api/AnnouncementService.java @@ -20,13 +20,9 @@ import org.labkey.api.security.User; import org.labkey.api.services.ServiceRegistry; +import java.util.Collection; import java.util.List; -/** - * User: Nick - * Date: Jun 30, 2010 - * Time: 5:50:52 PM - */ public interface AnnouncementService { static AnnouncementService get() @@ -71,8 +67,16 @@ Announcement insertAnnouncement(Container container, User u, String title, Strin // Delete void deleteAnnouncement(Announcement announcement); + Collection getDiscussions(Container container, String identifier, boolean includeResponses); + @Nullable DiscussionSrcTypeProvider getDiscussionSrcTypeProvider(@Nullable String type); void registerDiscussionSrcTypeProvider(String type, DiscussionSrcTypeProvider typeProvider); + + enum StatusOption + { + Active, + Closed + } } diff --git a/api/src/org/labkey/api/exp/list/ListDefinition.java b/api/src/org/labkey/api/exp/list/ListDefinition.java index 95bc37c1a25..69d4473c22b 100644 --- a/api/src/org/labkey/api/exp/list/ListDefinition.java +++ b/api/src/org/labkey/api/exp/list/ListDefinition.java @@ -135,46 +135,6 @@ protected KeyConversionException(Object key, KeyType type, Throwable cause) } } - enum DiscussionSetting - { - None(0, "None"), - OnePerItem(1, "Allow one discussion per item"), - ManyPerItem(2, "Allow multiple discussions per item"); - - private final int _value; - private final String _text; - - DiscussionSetting(int value, String text) - { - _value = value; - _text = text; - } - - public static DiscussionSetting getForValue(int value) - { - for (DiscussionSetting s : DiscussionSetting.values()) - if (s.getValue() == value) - return s; - - return null; - } - - public boolean isLinked() - { - return _value > 0; - } - - public String getText() - { - return _text; - } - - public int getValue() - { - return _value; - } - } - enum Category { PrivatePicklist, @@ -347,9 +307,6 @@ default boolean isPicklist() return getCategory() == Category.PrivatePicklist || getCategory() == Category.PublicPicklist; } - DiscussionSetting getDiscussionSetting(); - void setDiscussionSetting(DiscussionSetting discussionSetting); - boolean getAllowDelete(); void setAllowDelete(boolean allowDelete); diff --git a/api/src/org/labkey/api/settings/AppProps.java b/api/src/org/labkey/api/settings/AppProps.java index 40c2d6d0f65..6395044aeb2 100644 --- a/api/src/org/labkey/api/settings/AppProps.java +++ b/api/src/org/labkey/api/settings/AppProps.java @@ -47,7 +47,6 @@ public interface AppProps String EXPERIMENTAL_NO_GUESTS = "disableGuestAccount"; String EXPERIMENTAL_BLOCKER = "blockMaliciousClients"; String EXPERIMENTAL_RESOLVE_PROPERTY_URI_COLUMNS = "resolve-property-uri-columns"; - String DEPRECATED_OBJECT_LEVEL_DISCUSSIONS = "deprecatedObjectLevelDiscussions"; String ADMIN_PROVIDED_ALLOWED_EXTERNAL_RESOURCES = "allowedExternalResources"; String QUANTITY_COLUMN_SUFFIX_TESTING = "quantityColumnSuffixTesting"; String GENERATE_CONTROLLER_FIRST_URLS = "generateControllerFirstUrls"; diff --git a/api/src/org/labkey/api/settings/LookAndFeelProperties.java b/api/src/org/labkey/api/settings/LookAndFeelProperties.java index 91069e1bd4b..be20a026cb6 100644 --- a/api/src/org/labkey/api/settings/LookAndFeelProperties.java +++ b/api/src/org/labkey/api/settings/LookAndFeelProperties.java @@ -35,7 +35,6 @@ import static org.labkey.api.settings.LookAndFeelProperties.Properties.customLogin; import static org.labkey.api.settings.LookAndFeelProperties.Properties.customWelcome; import static org.labkey.api.settings.LookAndFeelProperties.Properties.dateParsingMode; -import static org.labkey.api.settings.LookAndFeelProperties.Properties.discussionEnabled; import static org.labkey.api.settings.LookAndFeelProperties.Properties.folderDisplayMode; import static org.labkey.api.settings.LookAndFeelProperties.Properties.helpMenuEnabled; import static org.labkey.api.settings.LookAndFeelProperties.Properties.logoHref; @@ -70,7 +69,6 @@ public enum Properties implements StartupProperty, SafeToRenderEnum folderDisplayMode("Show project and folder navigation. Valid values: " + Arrays.toString(FolderDisplayMode.values())), applicationMenuDisplayMode("Show application selection menu. Valid values: " + Arrays.toString(FolderDisplayMode.values())), helpMenuEnabled("Show LabKey Help menu item"), - discussionEnabled("Enable object-level discussions"), logoHref("Logo link (specifies page to which header logo links)"), reportAProblemPath("Support link (specifies page where users can request support)"), supportEmail("Support email (shown to users if they don't have permission to see a page, or are having trouble logging in)"), @@ -259,22 +257,6 @@ public Boolean isHelpMenuEnabledStored() return null == stored ? null : "TRUE".equals(stored); } - public boolean isDiscussionEnabled() - { - // Prefer correctly spelled property name, but fall-back to the old, misspelled one - String enabled = lookupStringValue(discussionEnabled.name(), null); - return enabled != null ? "TRUE".equalsIgnoreCase(enabled) : lookupBooleanValue("dicussionEnabled", true); - } - - public Boolean isDiscussionEnabledStored() - { - // Prefer correctly spelled property name, but fall-back to the old, misspelled one - String enabled = getStoredValue(discussionEnabled); - if (enabled == null) - enabled = getStoredValue(_settingsContainer, "dicussionEnabled"); - return null == enabled ? null : "TRUE".equalsIgnoreCase(enabled); - } - public String getUnsubstitutedLogoHref() { return lookupStringValue(logoHref, AppProps.getInstance().getHomePageActionURL().getLocalURIString().replaceAll("^" + AppProps.getInstance().getContextPath(), "\\${contextPath}")); diff --git a/api/src/org/labkey/api/settings/WriteableLookAndFeelProperties.java b/api/src/org/labkey/api/settings/WriteableLookAndFeelProperties.java index da996de2c0d..77d21c6a35e 100644 --- a/api/src/org/labkey/api/settings/WriteableLookAndFeelProperties.java +++ b/api/src/org/labkey/api/settings/WriteableLookAndFeelProperties.java @@ -32,7 +32,20 @@ import java.util.List; import java.util.Map; -import static org.labkey.api.settings.LookAndFeelProperties.Properties.*; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.applicationMenuDisplayMode; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.companyName; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.customLogin; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.customWelcome; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.dateParsingMode; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.folderDisplayMode; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.helpMenuEnabled; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.logoHref; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.reportAProblemPath; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.supportEmail; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.systemDescription; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.systemEmailAddress; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.systemShortName; +import static org.labkey.api.settings.LookAndFeelProperties.Properties.themeName; // Handles all the properties that can be set at the project or site level public class WriteableLookAndFeelProperties extends WriteableFolderLookAndFeelProperties @@ -136,16 +149,6 @@ public void clearHelpMenuEnabled() remove(helpMenuEnabled); } - public void setDiscussionEnabled(boolean enabled) - { - storeBooleanValue(discussionEnabled, enabled); - } - - public void clearDiscussionEnabled() - { - remove(discussionEnabled); - } - public void setLogoHref(String href) { storeStringValue(logoHref, href); diff --git a/assay/api-src/org/labkey/api/assay/nab/RenderAssayBean.java b/assay/api-src/org/labkey/api/assay/nab/RenderAssayBean.java index 2da6f00d071..abcddfd6674 100644 --- a/assay/api-src/org/labkey/api/assay/nab/RenderAssayBean.java +++ b/assay/api-src/org/labkey/api/assay/nab/RenderAssayBean.java @@ -15,16 +15,18 @@ */ package org.labkey.api.assay.nab; -import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; -import org.jetbrains.annotations.Nullable; -import org.labkey.api.announcements.DiscussionService; +import org.apache.logging.log4j.Logger; +import org.labkey.api.assay.AbstractAssayProvider; +import org.labkey.api.assay.AssayProtocolSchema; +import org.labkey.api.assay.AssayService; import org.labkey.api.assay.dilution.DilutionAssayProvider; import org.labkey.api.assay.dilution.DilutionAssayRun; import org.labkey.api.assay.dilution.DilutionDataHandler; import org.labkey.api.assay.dilution.DilutionSummary; import org.labkey.api.assay.nab.view.DuplicateDataFileRunView; import org.labkey.api.assay.nab.view.RunDetailOptions; +import org.labkey.api.assay.plate.AbstractPlateBasedAssayProvider; import org.labkey.api.data.CompareType; import org.labkey.api.data.Container; import org.labkey.api.data.SimpleFilter; @@ -32,11 +34,9 @@ import org.labkey.api.data.statistics.FitFailedException; import org.labkey.api.exp.ExpQCFlag; import org.labkey.api.exp.ExperimentRunListView; -import org.labkey.api.exp.Lsid; import org.labkey.api.exp.PropertyDescriptor; import org.labkey.api.exp.PropertyType; import org.labkey.api.exp.api.ExpProtocol; -import org.labkey.api.exp.api.ExpRun; import org.labkey.api.exp.api.ExperimentService; import org.labkey.api.exp.query.ExpRunTable; import org.labkey.api.query.FieldKey; @@ -44,10 +44,6 @@ import org.labkey.api.query.QueryView; import org.labkey.api.security.User; import org.labkey.api.security.UserManager; -import org.labkey.api.assay.AbstractAssayProvider; -import org.labkey.api.assay.plate.AbstractPlateBasedAssayProvider; -import org.labkey.api.assay.AssayProtocolSchema; -import org.labkey.api.assay.AssayService; import org.labkey.api.util.DateUtil; import org.labkey.api.util.PageFlowUtil; import org.labkey.api.util.Pair; @@ -77,6 +73,9 @@ public class RenderAssayBean extends RenderAssayForm { private static final Logger LOG = LogManager.getLogger(RenderAssayBean.class); + private static final int DEFAULT_MAX_SAMPLE_PER_GRAPH = 8; + private static final int DEFAULT_GRAPHS_PER_ROW = 2; + private ViewContext _context; private DilutionAssayRun _assay; private boolean _printView; @@ -93,9 +92,6 @@ public class RenderAssayBean extends RenderAssayForm private String _plateDataFormat; private RunDetailOptions.DataIdentifier _dataIdentifier = RunDetailOptions.DataIdentifier.DefaultFormat; - private static final int DEFAULT_MAX_SAMPLE_PER_GRAPH = 8; - private static final int DEFAULT_GRAPHS_PER_ROW = 2; - public RenderAssayBean() { _hiddenRunColumns = new HashSet<>(); @@ -306,19 +302,6 @@ public boolean isPrintView() return _printView; } - @Nullable - public HttpView getDiscussionView(ViewContext context) - { - ExpRun run = _assay.getRun(); - ActionURL pageUrl = context.getActionURL().clone(); - pageUrl.replaceParameter("rowId", run.getRowId()); - String discussionTitle = "Discuss Run " + run.getRowId() + ": " + run.getName(); - String entityId = run.getLSID(); - DiscussionService service = DiscussionService.get(); - return service.getDiscussionArea(context, - entityId, pageUrl, discussionTitle, true, false); - } - public long getRunId() { return _assay.getRun().getRowId(); diff --git a/assay/src/org/labkey/api/assay/nab/view/runDetails.jsp b/assay/src/org/labkey/api/assay/nab/view/runDetails.jsp index 299c4396501..10f3c4ae0cd 100644 --- a/assay/src/org/labkey/api/assay/nab/view/runDetails.jsp +++ b/assay/src/org/labkey/api/assay/nab/view/runDetails.jsp @@ -18,8 +18,6 @@ <%@ page import="org.labkey.api.assay.dilution.DilutionAssayRun" %> <%@ page import="org.labkey.api.assay.nab.RenderAssayBean" %> <%@ page import="org.labkey.api.security.permissions.InsertPermission" %> -<%@ page import="org.labkey.api.settings.AppProps" %> -<%@ page import="org.labkey.api.settings.LookAndFeelProperties" %> <%@ page import="org.labkey.api.view.HttpView" %> <%@ page import="org.labkey.api.view.JspView" %> <%@ page import="org.labkey.api.view.template.ClientDependencies" %> @@ -83,23 +81,3 @@ <% me.include(bean.getPlateDataView(), out); %> - -<% - if ( - !bean.isPrintView() - && writer - && AppProps.getInstance().isOptionalFeatureEnabled(AppProps.DEPRECATED_OBJECT_LEVEL_DISCUSSIONS) - && LookAndFeelProperties.getInstance(getContainer()).isDiscussionEnabled() - ) - { -%> - - <% - HttpView discussion = bean.getDiscussionView(getViewContext()); - if (discussion != null) - me.include(discussion, out); - %> - -<% - } -%> diff --git a/core/src/org/labkey/core/CoreModule.java b/core/src/org/labkey/core/CoreModule.java index 6414f3b94f4..e34f0060987 100644 --- a/core/src/org/labkey/core/CoreModule.java +++ b/core/src/org/labkey/core/CoreModule.java @@ -542,10 +542,6 @@ public QuerySchema createSchema(DefaultSchema schema, Module module) "Short-circuit robots", "Save resources by not rendering pages marked as 'noindex' for robots. This is experimental as not all robots are search engines.", false); - OptionalFeatureService.get().addFeatureFlag(new OptionalFeatureFlag(AppProps.DEPRECATED_OBJECT_LEVEL_DISCUSSIONS, - "Restore Object-Level Discussions", - "This option and all support for Object-Level Discussions will be removed in LabKey Server v25.11.", - false, false, FeatureType.Deprecated)); OptionalFeatureService.get().addFeatureFlag(new OptionalFeatureFlag(SimpleTranslator.DEPRECATED_NULL_MISSING_VALUE_RESOLUTION, "Resolve Missing Lookup Values to Null", "When Lookup Validation for a field is not selected and lookup by alternate key is enabled, resolves missing lookup values to null instead of throwing an error. This option will be removed in LabKey Server v25.11.", @@ -1489,7 +1485,6 @@ public JSONObject getPageContextJson(ContainerUser context) JSONObject json = new JSONObject(getDefaultPageContextJson(context.getContainer())); json.put("productFeatures", ProductRegistry.getProductFeatureSet()); json.put("primaryApplicationId", ProductRegistry.get().getPrimaryApplicationId(context.getContainer())); - json.put(AppProps.DEPRECATED_OBJECT_LEVEL_DISCUSSIONS, AppProps.getInstance().isOptionalFeatureEnabled(AppProps.DEPRECATED_OBJECT_LEVEL_DISCUSSIONS)); return json; } diff --git a/core/src/org/labkey/core/admin/AdminController.java b/core/src/org/labkey/core/admin/AdminController.java index 8a7e96e1afb..a24b9b65076 100644 --- a/core/src/org/labkey/core/admin/AdminController.java +++ b/core/src/org/labkey/core/admin/AdminController.java @@ -433,10 +433,10 @@ public class AdminController extends SpringActionController { private static final DefaultActionResolver _actionResolver = new DefaultActionResolver( - AdminController.class, - FileListAction.class, - FilesSiteSettingsAction.class, - UpdateFilePathsAction.class + AdminController.class, + FileListAction.class, + FilesSiteSettingsAction.class, + UpdateFilePathsAction.class ); private static final Logger LOG = LogHelper.getLogger(AdminController.class, "Admin-related UI and APIs"); @@ -1865,8 +1865,6 @@ public static class ProjectSettingsForm extends FolderSettingsForm private boolean _applicationMenuDisplayModeInherited; private boolean _helpMenuEnabled; private boolean _helpMenuEnabledInherited; - private boolean _discussionEnabled; - private boolean _discussionEnabledInherited; private String _logoHref; private boolean _logoHrefInherited; private String _companyName; @@ -2049,28 +2047,6 @@ public void setHelpMenuEnabledInherited(boolean helpMenuEnabledInherited) _helpMenuEnabledInherited = helpMenuEnabledInherited; } - public boolean isDiscussionEnabled() - { - return _discussionEnabled; - } - - @SuppressWarnings({"UnusedDeclaration"}) - public void setDiscussionEnabled(boolean discussionEnabled) - { - _discussionEnabled = discussionEnabled; - } - - public boolean isDiscussionEnabledInherited() - { - return _discussionEnabledInherited; - } - - @SuppressWarnings({"UnusedDeclaration"}) - public void setDiscussionEnabledInherited(boolean discussionEnabledInherited) - { - _discussionEnabledInherited = discussionEnabledInherited; - } - public String getLogoHref() { return _logoHref; @@ -11520,7 +11496,6 @@ private static boolean saveProjectSettings(Container c, User user, ProjectSettin setProperty(form.isFolderDisplayModeInherited(), props::clearFolderDisplayMode, () -> props.setFolderDisplayMode(FolderDisplayMode.fromString(form.getFolderDisplayMode()))); setProperty(form.isApplicationMenuDisplayModeInherited(), props::clearApplicationMenuDisplayMode, () -> props.setApplicationMenuDisplayMode(FolderDisplayMode.fromString(form.getApplicationMenuDisplayMode()))); setProperty(form.isHelpMenuEnabledInherited(), props::clearHelpMenuEnabled, () -> props.setHelpMenuEnabled(form.isHelpMenuEnabled())); - setProperty(form.isDiscussionEnabledInherited(), props::clearDiscussionEnabled, () -> props.setDiscussionEnabled(form.isDiscussionEnabled())); // a few properties on this page should be restricted to operational permissions (i.e. site admin) if (hasAdminOpsPerm) diff --git a/core/src/org/labkey/core/admin/lookAndFeelProperties.jsp b/core/src/org/labkey/core/admin/lookAndFeelProperties.jsp index d018784815d..4c8af28fa42 100644 --- a/core/src/org/labkey/core/admin/lookAndFeelProperties.jsp +++ b/core/src/org/labkey/core/admin/lookAndFeelProperties.jsp @@ -23,7 +23,6 @@ <%@ page import="org.labkey.api.security.SecurityManager" %> <%@ page import="org.labkey.api.security.permissions.AdminOperationsPermission" %> <%@ page import="org.labkey.api.security.permissions.ApplicationAdminPermission" %> -<%@ page import="org.labkey.api.settings.AppProps" %> <%@ page import="org.labkey.api.settings.DateParsingMode" %> <%@ page import="org.labkey.api.settings.LookAndFeelProperties" %> <%@ page import="org.labkey.api.settings.Theme" %> @@ -204,23 +203,6 @@ <%=inheritCheckbox(inherited, helpMenuEnabled)%> -<% - if (AppProps.getInstance().isOptionalFeatureEnabled(AppProps.DEPRECATED_OBJECT_LEVEL_DISCUSSIONS)) - { -%> - - <% - String enableDiscussionHelp = "Some items within LabKey Server, like reports and wiki pages, support discussions " + - "that are scoped directly to that report or wiki page. Administrators can disable this feature."; - inherited = isInherited(laf.isDiscussionEnabledStored()); - %> - - <%=inheritCheckbox(inherited, discussionEnabled)%> - - -<% - } -%> <% inherited = isInherited(laf.getUnsubstitutedLogoHrefStored()); %> diff --git a/devtools/src/org/labkey/devtools/ToolsController.java b/devtools/src/org/labkey/devtools/ToolsController.java index a3bc063861f..1d3902d05b9 100644 --- a/devtools/src/org/labkey/devtools/ToolsController.java +++ b/devtools/src/org/labkey/devtools/ToolsController.java @@ -738,8 +738,9 @@ public ModelAndView getView(Object o, boolean reshow, BindException errors) multiMap.get(type).stream() .map(overlap -> DOM.TR( DOM.TD(DOM.at(style, "width:120px;"), overlap.schemaName()), - DOM.TD(type.getMessage(overlap))) - ) + DOM.TD(type.getMessage(overlap)), + "\n" + )) ) ) ) diff --git a/list/src/org/labkey/list/controllers/ListController.java b/list/src/org/labkey/list/controllers/ListController.java index 78a641ffec7..fc4330249e1 100644 --- a/list/src/org/labkey/list/controllers/ListController.java +++ b/list/src/org/labkey/list/controllers/ListController.java @@ -40,7 +40,6 @@ import org.labkey.api.admin.FolderArchiveDataTypes; import org.labkey.api.admin.FolderExportContext; import org.labkey.api.admin.StaticLoggerGetter; -import org.labkey.api.announcements.DiscussionService; import org.labkey.api.attachments.AttachmentForm; import org.labkey.api.attachments.AttachmentParent; import org.labkey.api.attachments.BaseDownloadAction; @@ -65,7 +64,6 @@ import org.labkey.api.exp.list.ListUrls; import org.labkey.api.exp.property.Domain; import org.labkey.api.exp.property.DomainAuditProvider; -import org.labkey.api.exp.property.DomainProperty; import org.labkey.api.gwt.client.AuditBehaviorType; import org.labkey.api.lists.permissions.DesignListPermission; import org.labkey.api.lists.permissions.ManagePicklistsPermission; @@ -91,8 +89,6 @@ import org.labkey.api.security.permissions.PlatformDeveloperPermission; import org.labkey.api.security.permissions.ReadPermission; import org.labkey.api.security.permissions.UpdatePermission; -import org.labkey.api.settings.AppProps; -import org.labkey.api.settings.LookAndFeelProperties; import org.labkey.api.util.FileStream; import org.labkey.api.util.FileUtil; import org.labkey.api.util.GUID; @@ -632,36 +628,6 @@ public ModelAndView getView(ListDetailsForm form, BindException errors) view.addView(new HtmlView(LinkBuilder.labkeyLink("show item history", getViewContext().cloneActionURL().addParameter("showHistory", "1")).build())); } - if ( - _list.getDiscussionSetting().isLinked() - && AppProps.getInstance().isOptionalFeatureEnabled(AppProps.DEPRECATED_OBJECT_LEVEL_DISCUSSIONS) - && LookAndFeelProperties.getInstance(getContainer()).isDiscussionEnabled() - && DiscussionService.get() != null - ) - { - String entityId = item.getEntityId(); - - DomainProperty titleProperty = null; - Domain d = _list.getDomain(); - if (null != d) - titleProperty = d.getPropertyByName(table.getTitleColumn()); - - Object title = (null != titleProperty ? item.getProperty(titleProperty) : null); - String discussionTitle = (null != title ? title.toString() : "Item " + tableForm.getPkVal()); - - ActionURL linkBackURL = _list.urlFor(ResolveAction.class).addParameter("entityId", entityId); - DiscussionService service = DiscussionService.get(); - boolean multiple = _list.getDiscussionSetting() == ListDefinition.DiscussionSetting.ManyPerItem; - - // Display discussion by default in single-discussion case, #4529 - DiscussionService.DiscussionView discussion = service.getDiscussionArea(getViewContext(), entityId, linkBackURL, discussionTitle, multiple, !multiple); - if (discussion != null) - { - view.addView(discussion); - getPageConfig().setFocusId(discussion.getFocusId()); - } - } - return view; } diff --git a/list/src/org/labkey/list/model/ListDef.java b/list/src/org/labkey/list/model/ListDef.java index 6387de7e15f..f12ad7e15df 100644 --- a/list/src/org/labkey/list/model/ListDef.java +++ b/list/src/org/labkey/list/model/ListDef.java @@ -23,7 +23,6 @@ import org.labkey.api.data.ObjectFactory; import org.labkey.api.exp.list.ListDefinition.BodySetting; import org.labkey.api.exp.list.ListDefinition.Category; -import org.labkey.api.exp.list.ListDefinition.DiscussionSetting; import org.labkey.api.exp.list.ListDefinition.IndexSetting; import org.labkey.api.security.User; import org.labkey.api.util.UnexpectedException; @@ -43,7 +42,6 @@ public class ListDef extends Entity implements Cloneable, ListIndexingSettings protected Date _lastIndexed; protected Category _category = null; - protected DiscussionSetting _discussionSetting = DiscussionSetting.None; protected boolean _allowDelete = true; protected boolean _allowUpload = true; protected boolean _allowExport = true; @@ -106,16 +104,6 @@ public Category getCategory() return _category; } - public int getDiscussionSetting() - { - return _discussionSetting.getValue(); - } - - public DiscussionSetting getDiscussionSettingEnum() - { - return _discussionSetting; - } - public boolean getAllowDelete() { return _allowDelete; @@ -232,7 +220,6 @@ protected void copyTo(ListDef to) to._description = _description; to._lastIndexed = _lastIndexed; to._category = _category; - to._discussionSetting = _discussionSetting; to._allowDelete = _allowDelete; to._allowUpload = _allowUpload; to._allowExport = _allowExport; @@ -271,7 +258,6 @@ public boolean equals(Object o) if (!Objects.equals(_description, listDef._description)) return false; if (!Objects.equals(_lastIndexed, listDef._lastIndexed)) return false; if (_category != listDef._category) return false; - if (_discussionSetting != listDef._discussionSetting) return false; if (_entireListIndexSetting != listDef._entireListIndexSetting) return false; if (!Objects.equals(_entireListTitleTemplate, listDef._entireListTitleTemplate)) return false; if (_entireListBodySetting != listDef._entireListBodySetting) return false; @@ -294,7 +280,6 @@ public int hashCode() result = 31 * result + (_description != null ? _description.hashCode() : 0); result = 31 * result + (_lastIndexed != null ? _lastIndexed.hashCode() : 0); result = 31 * result + (_category != null ? _category.hashCode() : 0); - result = 31 * result + (_discussionSetting != null ? _discussionSetting.hashCode() : 0); result = 31 * result + (_allowDelete ? 1 : 0); result = 31 * result + (_allowUpload ? 1 : 0); result = 31 * result + (_allowExport ? 1 : 0); @@ -382,15 +367,6 @@ public void setLastIndexed(Date lastIndexed) _lastIndexed = lastIndexed; } public void setCategory(Category category) { _category = category; } - @SuppressWarnings("unused") // Invoked by reflection, e.g., ObjectFactory that retrieves ListDefs via TableSelector - public void setDiscussionSetting(int value) - { - _discussionSetting = DiscussionSetting.getForValue(value); - } - public void setDiscussionSettingEnum(DiscussionSetting discussionSetting) - { - _discussionSetting = discussionSetting; - } public void setAllowDelete(boolean allowDelete) { _allowDelete = allowDelete; diff --git a/list/src/org/labkey/list/model/ListDefinitionImpl.java b/list/src/org/labkey/list/model/ListDefinitionImpl.java index d341b032912..764607d36b3 100644 --- a/list/src/org/labkey/list/model/ListDefinitionImpl.java +++ b/list/src/org/labkey/list/model/ListDefinitionImpl.java @@ -65,7 +65,6 @@ import java.util.Collection; import java.util.Collections; import java.util.Date; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.concurrent.locks.ReentrantLock; @@ -224,18 +223,6 @@ public void setCategory(Category category) @Override public int getCreatedBy() { return _def.getCreatedBy(); } - @Override - public DiscussionSetting getDiscussionSetting() - { - return _def.getDiscussionSettingEnum(); - } - - @Override - public void setDiscussionSetting(DiscussionSetting discussionSetting) - { - edit().setDiscussionSettingEnum(discussionSetting); - } - @Override public boolean getAllowDelete() { diff --git a/list/src/org/labkey/list/model/ListDomainKind.java b/list/src/org/labkey/list/model/ListDomainKind.java index 6c38b91460a..acf70af615a 100644 --- a/list/src/org/labkey/list/model/ListDomainKind.java +++ b/list/src/org/labkey/list/model/ListDomainKind.java @@ -637,7 +637,6 @@ private ListDomainKindProperties updateListProperties(ListDomainKindProperties e updatedListProps.setAllowDelete(newListProps.isAllowDelete()); updatedListProps.setAllowUpload(newListProps.isAllowUpload()); updatedListProps.setAllowExport(newListProps.isAllowExport()); - updatedListProps.setDiscussionSetting(newListProps.getDiscussionSetting()); updatedListProps.setCategory(newListProps.getCategory()); updatedListProps.setEntireListTitleTemplate(newListProps.getEntireListTitleTemplate()); updatedListProps.setEntireListIndexSetting(newListProps.getEntireListIndexSetting()); diff --git a/list/src/org/labkey/list/model/ListDomainKindProperties.java b/list/src/org/labkey/list/model/ListDomainKindProperties.java index 9d3a1b82084..af28ecdcdcd 100644 --- a/list/src/org/labkey/list/model/ListDomainKindProperties.java +++ b/list/src/org/labkey/list/model/ListDomainKindProperties.java @@ -25,7 +25,6 @@ public class ListDomainKindProperties implements Cloneable, ListIndexingSettings private boolean allowExport = true; private String category = null; - private int discussionSetting = ListDefinition.DiscussionSetting.None.getValue(); //Index Entire List as a Single Document private String entireListTitleTemplate = ""; @@ -59,7 +58,6 @@ public ListDomainKindProperties(ListDomainKindProperties copyFrom) description = copyFrom.description; lastIndexed = copyFrom.lastIndexed; category = copyFrom.category; - discussionSetting = copyFrom.discussionSetting; allowDelete = copyFrom.allowDelete; allowUpload = copyFrom.allowUpload; allowExport = copyFrom.allowExport; @@ -195,16 +193,6 @@ public void setCategory(String category) this.category = category; } - public int getDiscussionSetting() - { - return discussionSetting; - } - - public void setDiscussionSetting(int discussionSetting) - { - this.discussionSetting = discussionSetting; - } - @Override public String getEntireListTitleTemplate() { @@ -326,7 +314,6 @@ public Map getAuditRecordMap() map.put("AllowDelete", isAllowDelete()); map.put("AllowUpload", isAllowUpload()); map.put("AllowExport", isAllowExport()); - map.put("DiscussionSetting", getDiscussionSetting()); if (!StringUtils.isEmpty(getCategory())) map.put("Category", getCategory()); if (!StringUtils.isEmpty(getEntireListTitleTemplate())) diff --git a/list/src/org/labkey/list/model/ListImporter.java b/list/src/org/labkey/list/model/ListImporter.java index 43bc7e488d7..fb7e140e05e 100644 --- a/list/src/org/labkey/list/model/ListImporter.java +++ b/list/src/org/labkey/list/model/ListImporter.java @@ -77,11 +77,6 @@ import java.util.Set; import java.util.stream.Collectors; -/* -* User: adam -* Date: Aug 27, 2009 -* Time: 2:12:01 PM -*/ public class ListImporter { private static final String TYPE_NAME_COLUMN = "ListName"; @@ -426,7 +421,6 @@ private boolean createNewList(Container c, User user, String listName, Collectio if (listSettingsXml.isSetId()) preferredListIds.add(listSettingsXml.getId()); - list.setDiscussionSetting(ListDefinition.DiscussionSetting.getForValue(listSettingsXml.getDiscussions())); list.setAllowDelete(listSettingsXml.getAllowDelete()); list.setAllowUpload(listSettingsXml.getAllowUpload()); list.setAllowExport(listSettingsXml.getAllowExport()); diff --git a/list/src/org/labkey/list/model/ListQueryUpdateService.java b/list/src/org/labkey/list/model/ListQueryUpdateService.java index 44787baad7b..75b679af3ae 100644 --- a/list/src/org/labkey/list/model/ListQueryUpdateService.java +++ b/list/src/org/labkey/list/model/ListQueryUpdateService.java @@ -18,7 +18,6 @@ import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.labkey.api.announcements.DiscussionService; import org.labkey.api.attachments.AttachmentFile; import org.labkey.api.attachments.AttachmentParent; import org.labkey.api.attachments.AttachmentParentFactory; @@ -746,10 +745,6 @@ protected Map deleteRow(User user, Container container, Map // Build up set of entityIds and AttachmentParents List attachmentParents = new ArrayList<>(); - // Delete Discussions - if (_list.getDiscussionSetting() != ListDefinition.DiscussionSetting.None && DiscussionService.get() != null) - DiscussionService.get().deleteDiscussions(container, user, entityIds); - // Delete Attachments if (hasAttachmentProperties()) { diff --git a/list/src/org/labkey/list/model/ListWriter.java b/list/src/org/labkey/list/model/ListWriter.java index e161128d659..d24af3d794c 100644 --- a/list/src/org/labkey/list/model/ListWriter.java +++ b/list/src/org/labkey/list/model/ListWriter.java @@ -77,11 +77,6 @@ import java.util.Set; import java.util.stream.Collectors; -/* -* User: adam -* Date: Aug 25, 2009 -* Time: 10:11:16 AM -*/ public class ListWriter { static final String SCHEMA_FILENAME = "lists.xml"; @@ -249,7 +244,6 @@ private void writeSettings(ListsDocument.Lists.List settings, ListDefinition def settings.setName(def.getName()); settings.setId(def.getListId()); - if (def.getDiscussionSetting().getValue() != 0) settings.setDiscussions(def.getDiscussionSetting().getValue()); if (!def.getAllowDelete()) settings.setAllowDelete(def.getAllowDelete()); if (!def.getAllowUpload()) settings.setAllowUpload(def.getAllowUpload()); if (!def.getAllowExport()) settings.setAllowExport(def.getAllowExport()); diff --git a/query/src/org/labkey/query/reports/ReportsController.java b/query/src/org/labkey/query/reports/ReportsController.java index 0e94e8e0bf3..de1862784f1 100644 --- a/query/src/org/labkey/query/reports/ReportsController.java +++ b/query/src/org/labkey/query/reports/ReportsController.java @@ -42,7 +42,6 @@ import org.labkey.api.action.SimpleViewAction; import org.labkey.api.action.SpringActionController; import org.labkey.api.admin.notification.NotificationService; -import org.labkey.api.announcements.DiscussionService; import org.labkey.api.attachments.Attachment; import org.labkey.api.attachments.AttachmentFile; import org.labkey.api.attachments.AttachmentForm; @@ -1029,17 +1028,6 @@ public ModelAndView getView(ReportDesignBean form, BindException errors) thro return HtmlView.err(message); } - if (!isPrint() && DiscussionService.get() != null) - { - DiscussionService service = DiscussionService.get(); - String title = "Discuss report - " + _report.getDescriptor().getReportName(); - DiscussionService.DiscussionView discussion = service.getDiscussionArea(getViewContext(), _report.getEntityId(), new ActionURL(CreateScriptReportAction.class, getContainer()), title, true, false); - if (discussion != null) - { - reportView = new VBox(reportView, discussion); - } - } - return reportView; } @@ -1172,18 +1160,7 @@ public ModelAndView getView(ReportDesignBean form, BindException errors) thro Report report = form.getReport(getViewContext()); if (null != report) { - VBox box = new VBox(new JspView<>("/org/labkey/query/reports/view/reportDetails.jsp", form)); - - DiscussionService service = DiscussionService.get(); - if (service != null) - { - String title = "Discuss report - " + report.getDescriptor().getReportName(); - DiscussionService.DiscussionView discussion = service.getDiscussionArea(getViewContext(), report.getEntityId(), new ActionURL(CreateScriptReportAction.class, getContainer()), title, true, false); - if (discussion != null) - box.addView(discussion); - } - - return box; + return new JspView<>("/org/labkey/query/reports/view/reportDetails.jsp", form); } else return new HtmlView(HtmlString.of("Specified report not found")); @@ -2580,17 +2557,7 @@ public ModelAndView getView(ReportDesignBean form, BindException errors) { _reportName = report.getDescriptor().getReportName(); - VBox view = new VBox(new JspView<>("/org/labkey/api/reports/report/view/renderQueryReport.jsp", report)); - - if (!isPrint() && DiscussionService.get() != null) - { - DiscussionService service = DiscussionService.get(); - String title = "Discuss report - " + _reportName; - DiscussionService.DiscussionView discussion = service.getDiscussionArea(getViewContext(), report.getEntityId(), new ActionURL(CreateScriptReportAction.class, getContainer()), title, true, false); - if (discussion != null) - view.addView(discussion); - } - return view; + return new VBox(new JspView<>("/org/labkey/api/reports/report/view/renderQueryReport.jsp", report)); } } return new HtmlView(HtmlString.unsafe("Invalid report identifier, unable to render report.")); diff --git a/study/src/org/labkey/study/controllers/StudyController.java b/study/src/org/labkey/study/controllers/StudyController.java index 87b2ce68691..4cd599b94ee 100644 --- a/study/src/org/labkey/study/controllers/StudyController.java +++ b/study/src/org/labkey/study/controllers/StudyController.java @@ -57,7 +57,6 @@ import org.labkey.api.admin.AdminUrls; import org.labkey.api.admin.ImportException; import org.labkey.api.admin.notification.NotificationService; -import org.labkey.api.announcements.DiscussionService; import org.labkey.api.assay.AssayUrls; import org.labkey.api.attachments.AttachmentFile; import org.labkey.api.attachments.AttachmentForm; @@ -1032,28 +1031,6 @@ else if (report == null && (null==table || !table.hasPermission(getUser(),ReadPe { return HtmlView.of("User does not have read permission on this dataset."); } - else if (DiscussionService.get() != null) - { - // add discussions - DiscussionService service = DiscussionService.get(); - - if (report != null) - { - // discuss the report - String title = "Discuss report - " + report.getDescriptor().getReportName(); - HttpView discussion = service.getDiscussionArea(getViewContext(), report.getEntityId(), getViewContext().getActionURL(), title, true, false); - if (discussion != null) - view.addView(discussion); - } - else - { - // discuss the dataset - String title = "Discuss dataset - " + def.getLabel(); - HttpView discussion = service.getDiscussionArea(getViewContext(), def.getEntityId(), getViewContext().getActionURL(), title, true, false); - if (discussion != null) - view.addView(discussion); - } - } return view; } diff --git a/visualization/src/org/labkey/visualization/VisualizationController.java b/visualization/src/org/labkey/visualization/VisualizationController.java index 9cfda2eb1cb..bab9adabf6f 100644 --- a/visualization/src/org/labkey/visualization/VisualizationController.java +++ b/visualization/src/org/labkey/visualization/VisualizationController.java @@ -43,7 +43,6 @@ import org.labkey.api.action.ReadOnlyApiAction; import org.labkey.api.action.SimpleViewAction; import org.labkey.api.action.SpringActionController; -import org.labkey.api.announcements.DiscussionService; import org.labkey.api.attachments.DocumentConversionService; import org.labkey.api.attachments.SvgSource; import org.labkey.api.cache.Cache; @@ -95,7 +94,6 @@ import org.labkey.api.util.Pair; import org.labkey.api.util.ResponseHelper; import org.labkey.api.view.ActionURL; -import org.labkey.api.view.HttpView; import org.labkey.api.view.JspView; import org.labkey.api.view.NavTree; import org.labkey.api.view.NotFoundException; @@ -1159,16 +1157,6 @@ public ModelAndView getView(ChartWizardReportForm form, BindException errors) th if (report != null) { _navTitle = report.getDescriptor().getReportName(); - - // check if the report is shared and if not, whether the user has access to the report - if (report.getDescriptor().isShared() || (report.getDescriptor().getOwner() == getUser().getUserId())) - { - String title = "Discuss report - " + report.getDescriptor().getReportName(); - DiscussionService service = DiscussionService.get(); - HttpView discussion = service.getDiscussionArea(getViewContext(), report.getEntityId(), getViewContext().getActionURL(), title, true, false); - if (discussion != null) - boxView.addView(discussion); - } } return boxView; diff --git a/wiki/src/org/labkey/wiki/WikiController.java b/wiki/src/org/labkey/wiki/WikiController.java index ba44a15aa15..a26266905d8 100644 --- a/wiki/src/org/labkey/wiki/WikiController.java +++ b/wiki/src/org/labkey/wiki/WikiController.java @@ -35,7 +35,6 @@ import org.labkey.api.action.SimpleViewAction; import org.labkey.api.action.SpringActionController; import org.labkey.api.admin.AdminUrls; -import org.labkey.api.announcements.DiscussionService; import org.labkey.api.attachments.Attachment; import org.labkey.api.attachments.AttachmentForm; import org.labkey.api.attachments.AttachmentParent; @@ -1229,22 +1228,7 @@ else if (isPrint()) } else { - WikiView v = new WikiView(_wiki, _wikiversion, existing); - - // get discussion view - if (existing && DiscussionService.get() != null) - { - ActionURL pageUrl = new PageAction(getViewContext(), _wiki, _wikiversion).getUrl(); - String discussionTitle = "discuss page - " + _wikiversion.getTitle(); - DiscussionService.DiscussionView discussionView = getDiscussionView(_wiki.getEntityId(), pageUrl, discussionTitle); - if (discussionView != null) - { - v.setView("discussion", discussionView); - v.setShowTitle(false); - } - } - - return v; + return new WikiView(_wiki, _wikiversion, existing); } } @@ -1278,13 +1262,6 @@ public static ActionURL getPageURL(Wiki wiki, Container c) return url.addParameter("name", wiki.getName()); } - @Nullable - private DiscussionService.DiscussionView getDiscussionView(String objectId, ActionURL pageURL, String title) - { - DiscussionService service = DiscussionService.get(); - return service.getDiscussionArea(getViewContext(), objectId, pageURL, title, true, false); - } - private ActionURL getVersionURL(String name) { ActionURL url = new ActionURL(VersionAction.class, getContainer()); diff --git a/wiki/src/org/labkey/wiki/WikiManager.java b/wiki/src/org/labkey/wiki/WikiManager.java index 8a20fc586cc..4cc65405268 100644 --- a/wiki/src/org/labkey/wiki/WikiManager.java +++ b/wiki/src/org/labkey/wiki/WikiManager.java @@ -24,7 +24,6 @@ import org.junit.Before; import org.junit.Test; import org.labkey.api.announcements.CommSchema; -import org.labkey.api.announcements.DiscussionService; import org.labkey.api.attachments.Attachment; import org.labkey.api.attachments.AttachmentFile; import org.labkey.api.attachments.AttachmentParent; @@ -147,11 +146,6 @@ SearchService getSearchService() return SearchService.get(); } - DiscussionService getDiscussionService() - { - return DiscussionService.get(); - } - // Used to verify that entityId is a wiki and belongs in the specified container public Wiki getWikiByEntityId(Container c, String entityId) { @@ -392,9 +386,6 @@ public void deleteWiki(User user, Container c, Wiki wiki, boolean isDeletingSubt getAttachmentService().deleteAttachments(wiki.getAttachmentParent()); - if (null != getDiscussionService()) - getDiscussionService().deleteDiscussions(c, user, wiki.getEntityId()); - transaction.commit(); } finally
<%=disabled(inherited)%>>
<%=helpPopup("Enable Discussion", enableDiscussionHelp)%><%=disabled(inherited)%>>