diff --git a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/CourseCreationHelper.java b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/CourseCreationHelper.java index ba730ba41c02bce3bf3335b46f15d350981e8630..6bafab4aa632143b64286b222c2abcee29f5c4e9 100644 --- a/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/CourseCreationHelper.java +++ b/src/main/java/de/tuchemnitz/wizard/workflows/coursecreation/CourseCreationHelper.java @@ -273,7 +273,7 @@ public class CourseCreationHelper { CourseAccessAndProperties accessAndProps = courseConfig.getAccessAndProperties(); - addedEntry = repositoryManager.setAccess(accessAndProps.getRepositoryEntry(), accessAndProps.getStatus(), + addedEntry = repositoryManager.setAccess(accessAndProps.getRepositoryEntry(), accessAndProps.isAllUsers(), accessAndProps.isGuests(), accessAndProps.isBookable(), accessAndProps.getSetting(), accessAndProps.getOrganisations()); diff --git a/src/main/java/org/olat/course/editor/PublishProcess.java b/src/main/java/org/olat/course/editor/PublishProcess.java index deceb7be7fb4fe7276dd5ba14f9ed448fe0d829d..ce03083736cea3f0dce2bdf4bc2da05c9a0caaf3 100644 --- a/src/main/java/org/olat/course/editor/PublishProcess.java +++ b/src/main/java/org/olat/course/editor/PublishProcess.java @@ -704,7 +704,7 @@ public class PublishProcess { RepositoryEntry entry = accessAndProps.getRepositoryEntry(); - entry = manager.setAccess(entry, accessAndProps.getStatus(), + entry = manager.setAccess(entry, accessAndProps.isAllUsers(), accessAndProps.isGuests(), accessAndProps.isBookable(), accessAndProps.getSetting(), accessAndProps.getOrganisations()); diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java index 313a27cef016d83b1b138b0c67402fcafe2ab96a..42900b3b909ab7a7e26e91551c6363fde959359e 100644 --- a/src/main/java/org/olat/course/run/CourseRuntimeController.java +++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java @@ -982,15 +982,12 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im if (event == RepositoryEntryLifeCycleChangeController.deletedEvent) { doClose(ureq); cleanUp(); - } else if (event == RepositoryEntryLifeCycleChangeController.closedEvent - || event == RepositoryEntryLifeCycleChangeController.unclosedEvent) { - processClosedUnclosedEvent(ureq); } } else if (currentToolCtr == source) { if (event == Event.DONE_EVENT) { // special check for editor toolControllerDone(ureq); - } + } } else if(source == leaveDialogBox) { if (event.equals(Event.DONE_EVENT)) { doLeave(ureq); @@ -1717,12 +1714,9 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im } } - private void processClosedUnclosedEvent(UserRequest ureq) { - loadRepositoryEntry(); - reSecurity = repositoryManager.isAllowed(getIdentity(), roles, getRepositoryEntry()); - loadRights(reSecurity); - toolbarPanel.popUpToRootController(ureq); - initToolbar(); + @Override + protected void processClosedUnclosedEvent(UserRequest ureq) { + super.processClosedUnclosedEvent(ureq); RunMainController runCtrl = getRunMainController(); if(runCtrl != null && runCtrl.getCurrentCourseNode() != null) { diff --git a/src/main/java/org/olat/repository/RepositoryManager.java b/src/main/java/org/olat/repository/RepositoryManager.java index 1de7e03b4a1b382a960bb75241f500f4da715a6b..132e38980e66c10f3f6e8f53e367027d9ba8e40c 100644 --- a/src/main/java/org/olat/repository/RepositoryManager.java +++ b/src/main/java/org/olat/repository/RepositoryManager.java @@ -668,14 +668,12 @@ public class RepositoryManager { } - public RepositoryEntry setAccess(final RepositoryEntry re, RepositoryEntryStatusEnum status, - boolean allUsers, boolean guests, boolean bookable, + public RepositoryEntry setAccess(final RepositoryEntry re, boolean allUsers, boolean guests, boolean bookable, RepositoryEntryAllowToLeaveOptions leaveSetting, List<Organisation> organisations) { RepositoryEntry reloadedRe = repositoryEntryDao.loadForUpdate(re); if(reloadedRe == null) { return null; } - reloadedRe.setEntryStatus(status); reloadedRe.setAllUsers(allUsers); reloadedRe.setGuests(guests); reloadedRe.setBookable(bookable); diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties index 3c3194fde70333f4a0a69fbdc7ae72f8ca7cd2f2..b5b364f9ee80b73deac69e31d8d4bb0a05de0649 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties @@ -291,7 +291,7 @@ details.label.score=Punkte details.label.status=Status details.launch=Inhalt anzeigen details.layout=Layout -details.lifecycle.change=Lebenszyklus\: beenden/l\u00f6schen +details.lifecycle.change=L\u00F6schen details.members=Mitgliederverwaltung details.metadata=Metadaten details.metadata.title=$\:details.metadata diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties index 6a3194c7569558dc6a3ea5fc2ece3b0f5a2176c3..9adeb7026461e0512b2f5a38c26b740d759b9239 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties @@ -291,7 +291,7 @@ details.label.score=Score details.label.status=Status details.launch=Show content details.layout=Layout -details.lifecycle.change=Life cycle\: finish/delete +details.lifecycle.change=Delete details.members=Members management details.metadata=Metadata details.metadata.title=$\:details.metadata diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties index ae707defc403a571eae9595c38898ed1540ba7a5..f954fc14589f8c2b042cc806fba47cd24ab302df 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties @@ -291,7 +291,7 @@ details.label.score=Points details.label.status=Status details.launch=Afficher details.layout=Agencement -details.lifecycle.change=Cycle de vie\: terminer / effacer +details.lifecycle.change=Effacer details.members=Administration des membres details.metadata=M\u00E9tadonn\u00E9es details.metadata.title=$\:details.metadata diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_it.properties index 90f5720bb6f62cdce7d41d69518fce42f4fd367d..ad4fd556877252b3371f6d859f99df471ed9c857 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_it.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_it.properties @@ -225,7 +225,7 @@ details.label.recent=Ultima visita details.label.score=Punteggio details.label.status=Stato details.launch=Mostrare contenuto -details.lifecycle.change=Ciclo di vita\: disattivare/eliminare +details.lifecycle.change=Eliminare details.members=Gestione dei membri details.noreferenceinfo=Non viene utilizzata in alcun corso. details.notypeinfo=Nessuna informazione tipologica disponibile. diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_pt_BR.properties index bf243222465f2071d68b8e116c50850c322968f2..a03c67e93801ae1917163bb97e6e7be608204e0d 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_pt_BR.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_pt_BR.properties @@ -291,7 +291,7 @@ details.label.score=Pontua\u00E7\u00E3o details.label.status=Status details.launch=Exibir details.layout=Layout -details.lifecycle.change=Ciclo de vida\: desativar/excluir +details.lifecycle.change=Excluir details.members=Administrar membros details.metadata=Metadados details.metadata.title=$\:details.metadata diff --git a/src/main/java/org/olat/repository/ui/RepositoryEntryLifeCycleChangeController.java b/src/main/java/org/olat/repository/ui/RepositoryEntryLifeCycleChangeController.java index 6808b4555087cace32b4dee4b82f166a4d2975f7..f12caf4bffbd218637e137fb02ac614092f44e23 100644 --- a/src/main/java/org/olat/repository/ui/RepositoryEntryLifeCycleChangeController.java +++ b/src/main/java/org/olat/repository/ui/RepositoryEntryLifeCycleChangeController.java @@ -34,22 +34,18 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; -import org.olat.core.gui.control.generic.modal.DialogBoxController; -import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.logging.OLATSecurityException; import org.olat.core.util.Formatter; import org.olat.core.util.Util; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryLifeCycleValue; import org.olat.repository.RepositoryEntryManagedFlag; -import org.olat.repository.RepositoryEntryStatusEnum; import org.olat.repository.RepositoryModule; import org.olat.repository.RepositoryService; import org.olat.repository.controllers.EntryChangedEvent; import org.olat.repository.controllers.EntryChangedEvent.Change; import org.olat.repository.handlers.RepositoryHandler; import org.olat.repository.model.RepositoryEntrySecurity; -import org.olat.repository.ui.author.ConfirmCloseController; import org.olat.repository.ui.author.ConfirmDeleteSoftlyController; import org.springframework.beans.factory.annotation.Autowired; @@ -68,23 +64,19 @@ public class RepositoryEntryLifeCycleChangeController extends BasicController{ public static final Event deletedEvent = new Event("deleted"); public static final Event unclosedEvent = new Event("unclosed"); - private Link closeLink, uncloseLink, deleteLink; + private Link deleteLink; private VelocityContainer lifeCycleVC; private RepositoryEntry re; private final RepositoryEntrySecurity reSecurity; private CloseableModalController cmc; - private DialogBoxController confirmUncloseCtrl; - private ConfirmCloseController confirmCloseCtrl; private ConfirmDeleteSoftlyController confirmDeleteCtrl; @Autowired private DB dbInstance; @Autowired private RepositoryModule repositoryModule; - @Autowired - private RepositoryService repositoryService; public RepositoryEntryLifeCycleChangeController(UserRequest ureq, WindowControl wControl, RepositoryEntry re, RepositoryEntrySecurity reSecurity, RepositoryHandler handler) { super(ureq, wControl); @@ -94,27 +86,6 @@ public class RepositoryEntryLifeCycleChangeController extends BasicController{ lifeCycleVC = createVelocityContainer("lifecycle_change"); putInitialPanel(lifeCycleVC); - - boolean isClosed = re.getEntryStatus() == RepositoryEntryStatusEnum.closed; - boolean closeManaged = RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.close); - if (!closeManaged) { - closeLink = LinkFactory.createButton("close", lifeCycleVC, this); - closeLink.setCustomDisplayText(translate("details.close.ressoure")); - closeLink.setIconLeftCSS("o_icon o_icon-fw o_icon_close_resource"); - closeLink.setElementCssClass("o_sel_repo_close"); - closeLink.setVisible(!isClosed); - - uncloseLink = LinkFactory.createButton("unclose", lifeCycleVC, this); - uncloseLink.setCustomDisplayText(translate("details.unclose.resource")); - uncloseLink.setElementCssClass("o_sel_repo_unclose"); - uncloseLink.setVisible(isClosed); - - RepositoryEntryLifeCycleValue autoCloseVal = repositoryModule.getLifecycleAutoCloseValue(); - if(autoCloseVal != null && re.getLifecycle() != null && re.getLifecycle().getValidTo() != null) { - Date autoCloseDate = autoCloseVal.toDate(re.getLifecycle().getValidTo()); - lifeCycleVC.contextPut("autoCloseDate", Formatter.getInstance(getLocale()).formatDate(autoCloseDate)); - } - } boolean deleteManaged = RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.delete); if (!deleteManaged) { @@ -136,10 +107,6 @@ public class RepositoryEntryLifeCycleChangeController extends BasicController{ protected void event(UserRequest ureq, Component source, Event event) { if (source == deleteLink) { doDelete(ureq); - } else if (source == closeLink) { - doConfirmCloseResource(ureq); - } else if (source == uncloseLink) { - doConfirmUncloseResource(ureq); } } @@ -156,27 +123,6 @@ public class RepositoryEntryLifeCycleChangeController extends BasicController{ EntryChangedEvent e = new EntryChangedEvent(re, getIdentity(), Change.deleted, "runtime"); ureq.getUserSession().getSingleUserEventCenter().fireEventToListenersOf(e, RepositoryService.REPOSITORY_EVENT_ORES); } - } else if(confirmCloseCtrl == source) { - cmc.deactivate(); - if(event == Event.CANCELLED_EVENT) { - cleanUp(); - } else if (event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) { - cleanUp(); - dbInstance.commit();//commit before sending events - doCloseResource(); - fireEvent(ureq, closedEvent); - EntryChangedEvent e = new EntryChangedEvent(re, getIdentity(), Change.closed, "runtime"); - ureq.getUserSession().getSingleUserEventCenter().fireEventToListenersOf(e, RepositoryService.REPOSITORY_EVENT_ORES); - } - } else if(confirmUncloseCtrl == source) { - if(DialogBoxUIFactory.isOkEvent(event) || DialogBoxUIFactory.isYesEvent(event)) { - cleanUp(); - doUncloseResource(); - dbInstance.commit();//commit before sending events - fireEvent(ureq, unclosedEvent); - EntryChangedEvent e = new EntryChangedEvent(re, getIdentity(), Change.unclosed, "runtime"); - ureq.getUserSession().getSingleUserEventCenter().fireEventToListenersOf(e, RepositoryService.REPOSITORY_EVENT_ORES); - } } else if(cmc == source) { cleanUp(); } @@ -184,61 +130,11 @@ public class RepositoryEntryLifeCycleChangeController extends BasicController{ private void cleanUp() { removeAsListenerAndDispose(confirmDeleteCtrl); - removeAsListenerAndDispose(confirmCloseCtrl); removeAsListenerAndDispose(cmc); confirmDeleteCtrl = null; - confirmCloseCtrl = null; cmc = null; } - private void doConfirmCloseResource(UserRequest ureq) { - if (!reSecurity.isEntryAdmin()) { - throw new OLATSecurityException("Trying to close, but not allowed: user = " + ureq.getIdentity()); - } - - List<RepositoryEntry> entryToClose = Collections.singletonList(re); - confirmCloseCtrl = new ConfirmCloseController(ureq, getWindowControl(), entryToClose); - listenTo(confirmCloseCtrl); - - String title = translate("read.only.header", re.getDisplayname()); - cmc = new CloseableModalController(getWindowControl(), "close", confirmCloseCtrl.getInitialComponent(), true, title); - listenTo(cmc); - cmc.activate(); - } - - /** - * Remove close and edit tools, if in edit mode, pop-up-to root - * @param ureq - */ - private void doCloseResource() { - re = repositoryService.loadByKey(re.getKey()); - closeLink.setVisible(false); - uncloseLink.setVisible(true); - lifeCycleVC.setDirty(true); - } - - private void doConfirmUncloseResource(UserRequest ureq) { - if (!reSecurity.isEntryAdmin()) { - throw new OLATSecurityException("Trying to reactivate, but not allowed: user = " + ureq.getIdentity()); - } - - String title = translate("warning.unclose.title"); - String text = translate("warning.unclose.text"); - confirmUncloseCtrl = activateOkCancelDialog(ureq, title, text, confirmUncloseCtrl); - } - - /** - * Remove close and edit tools, if in edit mode, pop-up-to root - * @param ureq - */ - private void doUncloseResource() { - re = repositoryService.uncloseRepositoryEntry(re); - closeLink.setVisible(true); - uncloseLink.setVisible(false); - lifeCycleVC.setDirty(true); - } - - private void doDelete(UserRequest ureq) { if (!reSecurity.isEntryAdmin()) { throw new OLATSecurityException("Trying to delete, but not allowed: user = " + ureq.getIdentity()); @@ -258,5 +154,4 @@ public class RepositoryEntryLifeCycleChangeController extends BasicController{ protected void doDispose() { // nothing to dispose } - } diff --git a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java index ce1f97877beda6f67173c6c70232518bab7a15e5..80298bd853e10bcd499f31f5873dbc29e8fc07d7 100644 --- a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java +++ b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java @@ -324,6 +324,8 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController initStatus(status); toolbarPanel.addTool(status, Align.left, false); } + + toolbarPanel.setDirty(true); } protected void reloadStatus() { @@ -544,6 +546,14 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController // } + protected void processClosedUnclosedEvent(UserRequest ureq) { + loadRepositoryEntry(); + reSecurity = repositoryManager.isAllowed(getIdentity(), roles, getRepositoryEntry()); + loadRights(reSecurity); + toolbarPanel.popUpToRootController(ureq); + initToolbar(); + } + protected void processReloadSettingsEvent(ReloadSettingsEvent event) { if(event.isChangedTitle()) { RepositoryEntry entry = repositoryService.loadByKey(getRepositoryEntry().getKey()); @@ -611,13 +621,13 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController } else if(deleteLink == source) { doDelete(ureq); } else if(preparationLink == source) { - doChangeStatus(RepositoryEntryStatusEnum.preparation); + doChangeStatus(ureq, RepositoryEntryStatusEnum.preparation); } else if(reviewLink == source) { - doChangeStatus(RepositoryEntryStatusEnum.review); + doChangeStatus(ureq, RepositoryEntryStatusEnum.review); } else if(coachPublishLink == source) { - doChangeStatus(RepositoryEntryStatusEnum.coachpublished); + doChangeStatus(ureq, RepositoryEntryStatusEnum.coachpublished); } else if(publishLink == source) { - doChangeStatus(RepositoryEntryStatusEnum.published); + doChangeStatus(ureq, RepositoryEntryStatusEnum.published); } else if(closeLink == source) { doConfirmCloseResource(ureq); } else if(source == toolbarPanel) { @@ -631,7 +641,10 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController protected void processPopEvent(@SuppressWarnings("unused") UserRequest ureq, PopEvent pop) { if(pop.getController() == settingsCtrl && settingsChanged) { - refreshRepositoryEntry(repositoryService.loadByKey(getRepositoryEntry().getKey())); + RepositoryEntry entry = repositoryService.loadByKey(getRepositoryEntry().getKey()); + refreshRepositoryEntry(entry); + reSecurity = repositoryManager.isAllowed(ureq, entry); + loadRights(reSecurity); initToolbar();// add/remove lectures link from the toolbar settingsChanged = false; } @@ -654,11 +667,16 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController } } else if(settingsCtrl == source) { if(event == Event.CHANGED_EVENT) { - + // } else if(event == Event.CLOSE_EVENT) { doClose(ureq); } else if(event instanceof ReloadSettingsEvent) { processReloadSettingsEvent((ReloadSettingsEvent)event); + } else if(event instanceof ReloadSettingsEvent) { + processReloadSettingsEvent((ReloadSettingsEvent)event); + } else if (event == RepositoryEntryLifeCycleChangeController.closedEvent + || event == RepositoryEntryLifeCycleChangeController.unclosedEvent) { + processClosedUnclosedEvent(ureq); } } else if(detailsCtrl == source) { if(event instanceof LeavingEvent) { @@ -754,11 +772,16 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController cleanUp(); } - protected final void doChangeStatus(RepositoryEntryStatusEnum updatedStatus) { + protected final void doChangeStatus(UserRequest ureq, RepositoryEntryStatusEnum updatedStatus) { RepositoryEntry entry = getRepositoryEntry(); RepositoryEntry reloadedEntry = repositoryManager.setStatus(entry, updatedStatus); refreshRepositoryEntry(reloadedEntry); + reSecurity = repositoryManager.isAllowed(ureq, reloadedEntry); + loadRights(reSecurity); initToolbar(); + + EntryChangedEvent e = new EntryChangedEvent(reloadedEntry, getIdentity(), Change.modifiedAccess, "runtime"); + ureq.getUserSession().getSingleUserEventCenter().fireEventToListenersOf(e, RepositoryService.REPOSITORY_EVENT_ORES); } private void doConfirmCloseResource(UserRequest ureq) { @@ -781,7 +804,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController * @param ureq */ private void doCloseResource(UserRequest ureq) { - doChangeStatus(RepositoryEntryStatusEnum.closed); + doChangeStatus(ureq, RepositoryEntryStatusEnum.closed); fireEvent(ureq, RepositoryEntryLifeCycleChangeController.closedEvent); EntryChangedEvent e = new EntryChangedEvent(re, getIdentity(), Change.closed, "runtime"); diff --git a/src/main/java/org/olat/repository/ui/RepositoryEntrySettingsController.java b/src/main/java/org/olat/repository/ui/RepositoryEntrySettingsController.java index a0ff0146f73a367f3e3d1619503a3bc9b9c7f095..a38d538ccb7fd01b515bcccba9007f1c03c87cce 100644 --- a/src/main/java/org/olat/repository/ui/RepositoryEntrySettingsController.java +++ b/src/main/java/org/olat/repository/ui/RepositoryEntrySettingsController.java @@ -19,10 +19,12 @@ */ package org.olat.repository.ui; +import java.util.Collections; import java.util.List; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.dropdown.Dropdown; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.link.LinkFactory; import org.olat.core.gui.components.panel.Panel; @@ -30,10 +32,12 @@ import org.olat.core.gui.components.panel.StackedPanel; import org.olat.core.gui.components.stack.ButtonGroupComponent; import org.olat.core.gui.components.stack.TooledController; import org.olat.core.gui.components.stack.TooledStackedPanel; +import org.olat.core.gui.components.stack.TooledStackedPanel.Align; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; +import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.id.OrganisationRef; import org.olat.core.id.Roles; @@ -42,8 +46,13 @@ import org.olat.core.id.context.StateEntry; import org.olat.core.util.Util; import org.olat.core.util.resource.OresHelper; import org.olat.repository.RepositoryEntry; +import org.olat.repository.RepositoryEntryStatusEnum; +import org.olat.repository.RepositoryManager; import org.olat.repository.RepositoryService; +import org.olat.repository.controllers.EntryChangedEvent; +import org.olat.repository.controllers.EntryChangedEvent.Change; import org.olat.repository.ui.author.AuthoringEditAccessController; +import org.olat.repository.ui.author.ConfirmCloseController; import org.olat.repository.ui.settings.CatalogSettingsController; import org.olat.repository.ui.settings.ReloadSettingsEvent; import org.olat.repository.ui.settings.RepositoryEntryInfoController; @@ -63,12 +72,21 @@ public class RepositoryEntrySettingsController extends BasicController implement private Link accessLink; private Link catalogLink; private Link metadataLink; + private Dropdown status; protected final StackedPanel mainPanel; protected final TooledStackedPanel stackPanel; protected final ButtonGroupComponent buttonsGroup = new ButtonGroupComponent("settings"); - + + private Link preparationLink; + private Link reviewLink; + private Link coachPublishLink; + private Link publishLink; + private Link closeLink; + + private CloseableModalController cmc; private CatalogSettingsController catalogCtrl; private RepositoryEntryInfoController infoCtrl; + private ConfirmCloseController confirmCloseCtrl; private AuthoringEditAccessController accessCtrl; private RepositoryEntryMetadataController metadataCtrl; @@ -76,6 +94,8 @@ public class RepositoryEntrySettingsController extends BasicController implement protected RepositoryEntry entry; private List<OrganisationRef> organisations; + @Autowired + private RepositoryManager repositoryManager; @Autowired protected RepositoryService repositoryService; @@ -85,6 +105,11 @@ public class RepositoryEntrySettingsController extends BasicController implement this.stackPanel = stackPanel; this.entry = entry; mainPanel = putInitialPanel(new Panel("empty")); + + status = new Dropdown("settings.toolbox.status", "cif.status", false, getTranslator()); + status.setElementCssClass("o_sel_repository_status"); + status.setIconCSS("o_icon o_icon_edit"); + initStatus(status); } public List<OrganisationRef> getOrganisations() { @@ -97,9 +122,42 @@ public class RepositoryEntrySettingsController extends BasicController implement @Override public void initTools() { initSegments(); + stackPanel.addTool(status, Align.left, false); stackPanel.addTool(buttonsGroup, true); } + private void initStatus(Dropdown statusDropdown) { + statusDropdown.removeAllComponents(); + + RepositoryEntryStatusEnum entryStatus = entry.getEntryStatus(); + statusDropdown.setI18nKey("details.label.status"); + statusDropdown.setElementCssClass("o_repo_tools_status o_with_labeled"); + statusDropdown.setIconCSS("o_icon o_icon_repo_status_".concat(entryStatus.name())); + statusDropdown.setInnerText(translate(entryStatus.i18nKey())); + statusDropdown.setInnerCSS("o_labeled o_repo_status_".concat(entryStatus.name())); + + if(entryStatus == RepositoryEntryStatusEnum.preparation || entryStatus == RepositoryEntryStatusEnum.review + || entryStatus == RepositoryEntryStatusEnum.coachpublished || entryStatus == RepositoryEntryStatusEnum.published + || entryStatus == RepositoryEntryStatusEnum.closed) { + preparationLink = initStatus(statusDropdown, RepositoryEntryStatusEnum.preparation, entryStatus); + reviewLink = initStatus(statusDropdown, RepositoryEntryStatusEnum.review, entryStatus); + coachPublishLink = initStatus(statusDropdown, RepositoryEntryStatusEnum.coachpublished, entryStatus); + publishLink = initStatus(statusDropdown, RepositoryEntryStatusEnum.published, entryStatus); + closeLink = initStatus(statusDropdown, RepositoryEntryStatusEnum.closed, entryStatus); + } + + stackPanel.setDirty(true); + } + + private Link initStatus(Dropdown statusDropdown, RepositoryEntryStatusEnum entryStatus, RepositoryEntryStatusEnum currentStatus) { + Link statusLink = LinkFactory.createToolLink("status.".concat(entryStatus.name()), translate(entryStatus.i18nKey()), this); + statusLink.setIconLeftCSS("o_icon o_icon-fw o_icon_repo_status_".concat(entryStatus.name())); + statusLink.setElementCssClass("o_labeled o_repo_status_".concat(entryStatus.name())); + statusLink.setVisible(entryStatus != currentStatus); + statusDropdown.addComponent(statusLink); + return statusLink; + } + protected void initSegments() { initInfos(); initAccessAndBooking(); @@ -160,6 +218,16 @@ public class RepositoryEntrySettingsController extends BasicController implement } else if(catalogLink == source) { cleanUp(); doOpenCatalog(ureq); + } else if(preparationLink == source) { + doChangeStatus(ureq, RepositoryEntryStatusEnum.preparation); + } else if(reviewLink == source) { + doChangeStatus(ureq, RepositoryEntryStatusEnum.review); + } else if(coachPublishLink == source) { + doChangeStatus(ureq, RepositoryEntryStatusEnum.coachpublished); + } else if(publishLink == source) { + doChangeStatus(ureq, RepositoryEntryStatusEnum.published); + } else if(closeLink == source) { + doConfirmCloseResource(ureq); } } @@ -175,6 +243,17 @@ public class RepositoryEntrySettingsController extends BasicController implement } else if(metadataCtrl == source) { doOpenMetadata(ureq); } + } else if(confirmCloseCtrl == source) { + if(event == Event.CANCELLED_EVENT ) { + cmc.deactivate(); + cleanUp(); + } else if(event instanceof EntryChangedEvent) { + cmc.deactivate(); + cleanUp(); + doCloseResource(ureq); + } + } else if(cmc == source) { + cleanUp(); } else if(event == Event.CHANGED_EVENT || event instanceof ReloadSettingsEvent) { fireEvent(ureq, event); } @@ -187,14 +266,18 @@ public class RepositoryEntrySettingsController extends BasicController implement } protected void cleanUp() { + removeAsListenerAndDispose(confirmCloseCtrl); removeAsListenerAndDispose(metadataCtrl); removeAsListenerAndDispose(catalogCtrl); removeAsListenerAndDispose(accessCtrl); removeAsListenerAndDispose(infoCtrl); + removeAsListenerAndDispose(cmc); + confirmCloseCtrl = null; metadataCtrl = null; catalogCtrl = null; accessCtrl = null; infoCtrl = null; + cmc = null; } protected void doOpenInfos(UserRequest ureq) { @@ -232,4 +315,38 @@ public class RepositoryEntrySettingsController extends BasicController implement mainPanel.setContent(catalogCtrl.getInitialComponent()); buttonsGroup.setSelectedButton(catalogLink); } + + protected final void doChangeStatus(UserRequest ureq, RepositoryEntryStatusEnum updatedStatus) { + entry = repositoryManager.setStatus(entry, updatedStatus); + initStatus(status); + fireEvent(ureq, new ReloadSettingsEvent(true, true, false, false)); + event(ureq, buttonsGroup.getSelectedButton(), Event.CHANGED_EVENT); + + EntryChangedEvent e = new EntryChangedEvent(entry, getIdentity(), Change.modifiedAccess, "runtime"); + ureq.getUserSession().getSingleUserEventCenter().fireEventToListenersOf(e, RepositoryService.REPOSITORY_EVENT_ORES); + } + + private void doConfirmCloseResource(UserRequest ureq) { + List<RepositoryEntry> entryToClose = Collections.singletonList(entry); + confirmCloseCtrl = new ConfirmCloseController(ureq, getWindowControl(), entryToClose); + listenTo(confirmCloseCtrl); + + String title = translate("read.only.header", entry.getDisplayname()); + cmc = new CloseableModalController(getWindowControl(), "close", confirmCloseCtrl.getInitialComponent(), true, title); + listenTo(cmc); + cmc.activate(); + } + + /** + * Remove close and edit tools, if in edit mode, pop-up-to root + * @param ureq + */ + private void doCloseResource(UserRequest ureq) { + entry = repositoryService.loadByKey(entry.getKey()); + // the runtime will pop this controller + + fireEvent(ureq, RepositoryEntryLifeCycleChangeController.closedEvent); + EntryChangedEvent e = new EntryChangedEvent(entry, getIdentity(), Change.closed, "runtime"); + ureq.getUserSession().getSingleUserEventCenter().fireEventToListenersOf(e, RepositoryService.REPOSITORY_EVENT_ORES); + } } diff --git a/src/main/java/org/olat/repository/ui/_content/lifecycle_change.html b/src/main/java/org/olat/repository/ui/_content/lifecycle_change.html index b89b994efc302d643ae824a674d76ebfcc411c92..3e144b7b9a1c277e772f030bb77b63b11db9494f 100644 --- a/src/main/java/org/olat/repository/ui/_content/lifecycle_change.html +++ b/src/main/java/org/olat/repository/ui/_content/lifecycle_change.html @@ -3,41 +3,7 @@ $r.contextHelpWithWrapper("Course settings#_delete") $r.translate("details.lifecycle.change") </legend> - -#if ($r.visible("close")) - <h4>$r.translate("details.close.ressoure")</h4> - <div class="o_warning"> - <p>$r.translate("details.close.ressoure.desc")</p> - <ul> - <li>$r.translate("details.close.ressoure.desc.1")</li> - <li>$r.translate("details.close.ressoure.desc.2")</li> - <li>$r.translate("details.close.ressoure.desc.3")</li> - <li>$r.translate("details.close.ressoure.desc.4")</li> - </ul> - #if($r.isNotNull($autoCloseDate)) - <p>$r.translate("details.close.ressoure.auto.desc", $autoCloseDate)</p> - #end - <div class="o_button_group o_block_large_top"> - $r.render("close") - </div> - </div> -#end -#if ($r.visible("unclose")) - <h4>$r.translate("details.unclose.resource.title")</h4> - <div class="o_info"> - <p>$r.translate("details.unclose.resource.desc")</p> - <ul> - <li>$r.translate("details.unclose.resource.desc.1")</li> - <li>$r.translate("details.unclose.resource.desc.2")</li> - </ul> - <div class="o_button_group o_block_large_top"> - $r.render("unclose") - </div> - </div> -#end - #if ($r.available("delete")) - <h4>$r.translate("details.delete")</h4> <div class="o_error"> <p>$r.translate("details.delete.soft.desc")</p> <ul> @@ -53,5 +19,4 @@ </div> </div> #end - </fieldset> \ No newline at end of file diff --git a/src/main/java/org/olat/repository/ui/author/AuthoringEditAccessAndBookingController.java b/src/main/java/org/olat/repository/ui/author/AuthoringEditAccessAndBookingController.java index c7c28997242d9804d40dcb9252f71a9af12e5ea2..bd7744fe621123f6c1cc8ab7b0fcd7dbbfb5c961 100644 --- a/src/main/java/org/olat/repository/ui/author/AuthoringEditAccessAndBookingController.java +++ b/src/main/java/org/olat/repository/ui/author/AuthoringEditAccessAndBookingController.java @@ -107,7 +107,7 @@ public class AuthoringEditAccessAndBookingController extends FormBasicController setTranslator(Util.createPackageTranslator(RepositoryService.class, getLocale(), getTranslator())); this.entry = entry; embbeded = false; - status = true; + status = false; initForm(ureq); updateUI(); } @@ -418,7 +418,7 @@ public class AuthoringEditAccessAndBookingController extends FormBasicController public RepositoryEntry commitChanges() { boolean bookable = isBookable(); List<Organisation> organisations = getSelectedOrganisations(); - entry = repositoryManager.setAccess(entry, getEntryStatus(), + entry = repositoryManager.setAccess(entry, isAllUsers(), isGuests(), bookable, getSelectedLeaveSetting(), organisations); diff --git a/src/main/java/org/olat/repository/ui/author/_content/confirm_close.html b/src/main/java/org/olat/repository/ui/author/_content/confirm_close.html index 16cfc524377fd6c53fd64cef8a5b2e16a97d09bd..3ed97d30b433fd6e247f7b9877b0e04f6dc7074e 100644 --- a/src/main/java/org/olat/repository/ui/author/_content/confirm_close.html +++ b/src/main/java/org/olat/repository/ui/author/_content/confirm_close.html @@ -1,4 +1,14 @@ <div class="o_warning"> + <p>$r.translate("details.close.ressoure.desc")</p> + <ul> + <li>$r.translate("details.close.ressoure.desc.1")</li> + <li>$r.translate("details.close.ressoure.desc.2")</li> + <li>$r.translate("details.close.ressoure.desc.3")</li> + <li>$r.translate("details.close.ressoure.desc.4")</li> + </ul> + #if($r.isNotNull($autoCloseDate)) + <p>$r.translate("details.close.ressoure.auto.desc", $autoCloseDate)</p> + #end <i class="o_icon o_icon-lg o_icon_important"> </i> $r.translate("dialog.confirm.close", $numOfMembers) </div> $r.render("confirm") \ No newline at end of file