Skip to content
Snippets Groups Projects
Commit 070c0810 authored by srosse's avatar srosse
Browse files

OO-3616: create new portfolio elements in the column of containers

parent 7303d1ca
No related branches found
No related tags found
No related merge requests found
Showing
with 173 additions and 47 deletions
......@@ -44,6 +44,8 @@ public interface Controller extends ComponentEventListener, Disposable {
*/
public void addControllerListener(ControllerEventListener el);
public void removeControllerListener(ControllerEventListener el);
public boolean isControllerListeningTo(ControllerEventListener el);
/**
......
......@@ -154,19 +154,23 @@ public abstract class DefaultController implements Controller, ControllerEventLi
return getWindowControl();
}
/**
* @see org.olat.core.gui.control.Controller#addControllerListener(org.olat.core.gui.control.ControllerEventListener)
*/
@Override
public void addControllerListener(ControllerEventListener el) {
if (listeners == null) {
listeners = new ArrayList<ControllerEventListener>();
listeners = new ArrayList<>();
}
if (!listeners.contains(el)) {
listeners.add(el);
}
}
@Override
public void removeControllerListener(ControllerEventListener el) {
if(listeners != null) {
listeners.remove(el);
}
}
public boolean isControllerListeningTo(ControllerEventListener el) {
return listeners != null && listeners.contains(el);
}
......
......@@ -150,14 +150,8 @@ public abstract class BasicController extends DefaultController {
protected Controller listenTo(Controller controller) {
controller.addControllerListener(this);
if (childControllers == null) {
childControllers = new ArrayList<Controller>(4);
childControllers = new ArrayList<>(4);
}
/*
* REVIEW:pb this is for quality and will be re-enabled after the OLAT
* 6.0.0 Release if(childControllers.contains(controller)){ throw new
* AssertException("already added Controller, this a workflow bug:
* "+controller.getClass().getCanonicalName()); }
*/
childControllers.add(controller);
return controller;
}
......@@ -179,6 +173,7 @@ public abstract class BasicController extends DefaultController {
if(childControllers != null) {
childControllers.remove(controller);
}
controller.removeControllerListener(this);
controller.dispose();
}
}
......
......@@ -30,15 +30,21 @@ import org.olat.modules.ceditor.ui.model.EditorFragment;
*/
public class AddElementInfos {
private final int column;
private final PageElementTarget target;
private final PageElementHandler handler;
private final EditorFragment referenceFragment;
public AddElementInfos(EditorFragment referenceFragment, PageElementHandler handler, PageElementTarget target) {
public AddElementInfos(EditorFragment referenceFragment, PageElementHandler handler, PageElementTarget target, int column) {
this.target = target;
this.handler = handler;
this.column = column;
this.referenceFragment = referenceFragment;
}
public int getColumn() {
return column;
}
public PageElementTarget getTarget() {
return target;
......
......@@ -45,16 +45,29 @@ import org.olat.modules.ceditor.ui.model.EditorFragment;
*/
public class AddElementsController extends BasicController {
private final int containerColumn;
private final PageElementTarget target;
private final EditorFragment referenceFragment;
public AddElementsController(UserRequest ureq, WindowControl wControl, PageEditorProvider provider,
EditorFragment referenceFragment, PageElementTarget target) {
super(ureq, wControl);
this.target = target;
containerColumn = -1;
this.referenceFragment = referenceFragment;
initContainer(provider);
}
public AddElementsController(UserRequest ureq, WindowControl wControl, PageEditorProvider provider,
EditorFragment referenceFragment, PageElementTarget target, int containerColumn) {
super(ureq, wControl);
this.target = target;
this.containerColumn = containerColumn;
this.referenceFragment = referenceFragment;
initContainer(provider);
}
private void initContainer(PageEditorProvider provider) {
VelocityContainer mainVC = createVelocityContainer("add_elements");
List<String> addElements = new ArrayList<>();
......@@ -72,7 +85,6 @@ public class AddElementsController extends BasicController {
mainVC.contextPut("linkNames", addElements);
putInitialPanel(mainVC);
}
@Override
......@@ -81,7 +93,7 @@ public class AddElementsController extends BasicController {
Link link = (Link)source;
if("add.elements".equals(link.getCommand())) {
PageElementHandler handler = (PageElementHandler)link.getUserObject();
fireEvent(ureq, new AddElementEvent(referenceFragment, handler, target));
fireEvent(ureq, new AddElementEvent(referenceFragment, handler, target, containerColumn));
}
}
}
......
......@@ -104,7 +104,7 @@ public class PageEditorController extends BasicController {
}
mainVC.contextPut("addElementLinks", addElements);
editorCmp = new PageEditorComponent("page_editor");
editorCmp = new PageEditorComponent("page_editor", getWindowControl(), provider);
editorCmp.addListener(this);
mainVC.put("page_editor", editorCmp);
......@@ -136,7 +136,8 @@ public class PageEditorController extends BasicController {
if(event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) {
PageElement element = addCtrl.getPageElement();
AddElementInfos uobject = addCtrl.getUserObject();
EditorFragment fragment = doAddPageElement(ureq, element, uobject.getReferenceFragment(), uobject.getTarget());
EditorFragment fragment = doAddPageElement(ureq, element, uobject.getReferenceFragment(),
uobject.getTarget(), uobject.getColumn());
// close editor right away (file upload etc makes more sense)
doSaveElement(ureq, fragment);
}
......@@ -147,7 +148,8 @@ public class PageEditorController extends BasicController {
cleanUp();
if(event instanceof AddElementEvent) {
AddElementEvent aee = (AddElementEvent)event;
doAddElement(ureq, aee.getReferenceFragment(), aee.getHandler(), aee.getTarget());
doAddElement(ureq, aee.getReferenceFragment(), aee.getHandler(),
aee.getTarget(), aee.getContainerColumn());
}
} else if(addCalloutCtrl == source) {
cleanUp();
......@@ -186,7 +188,7 @@ public class PageEditorController extends BasicController {
Link link = (Link)source;
if("add".equals(link.getCommand())) {
PageElementHandler handler = (PageElementHandler)link.getUserObject();
doAddElement(ureq, null, handler, PageElementTarget.atTheEnd);
doAddElement(ureq, null, handler, PageElementTarget.atTheEnd, -1);
}
} else if(editorCmp == source) {
if(event instanceof EditFragmentEvent) {
......@@ -203,6 +205,11 @@ public class PageEditorController extends BasicController {
} else if(event instanceof ContainerColumnEvent) {
ContainerColumnEvent cce = (ContainerColumnEvent)event;
doChangeContainerColumns(ureq, cce.getFragment(), cce.getNumOfColumns());
} else if(event instanceof AddElementEvent) {
// add element in container
AddElementEvent aee = (AddElementEvent)event;
doAddElement(ureq, aee.getReferenceFragment(), aee.getHandler(),
aee.getTarget(), aee.getContainerColumn());
}
}
}
......@@ -305,8 +312,8 @@ public class PageEditorController extends BasicController {
listenTo(addCalloutCtrl);
addCalloutCtrl.activate();
}
private void doAddElement(UserRequest ureq, EditorFragment refenceFragment, PageElementHandler handler, PageElementTarget target) {
private void doAddElement(UserRequest ureq, EditorFragment refenceFragment, PageElementHandler handler, PageElementTarget target, int column) {
if(addCtrl != null) return;
if(handler instanceof InteractiveAddPageElementHandler) {
......@@ -315,7 +322,7 @@ public class PageEditorController extends BasicController {
if(addCtrl == null) {
showWarning("not.implement");
} else {
addCtrl.setUserObject(new AddElementInfos(refenceFragment, handler, target));
addCtrl.setUserObject(new AddElementInfos(refenceFragment, handler, target, column));
listenTo(addCtrl);
String title = translate("add." + handler.getType());
cmc = new CloseableModalController(getWindowControl(), null, addCtrl.getInitialComponent(), true, title, true);
......@@ -324,16 +331,18 @@ public class PageEditorController extends BasicController {
}
} else if(handler instanceof SimpleAddPageElementHandler) {
SimpleAddPageElementHandler simpleHandler = (SimpleAddPageElementHandler)handler;
doAddPageElement(ureq, simpleHandler.createPageElement(getLocale()), refenceFragment, target);
doAddPageElement(ureq, simpleHandler.createPageElement(getLocale()), refenceFragment, target, column);
}
}
private EditorFragment doAddPageElement(UserRequest ureq, PageElement element, EditorFragment referenceFragment, PageElementTarget target) {
private EditorFragment doAddPageElement(UserRequest ureq, PageElement element, EditorFragment referenceFragment,
PageElementTarget target, int column) {
EditorFragment newFragment = null;
if(target == PageElementTarget.atTheEnd) {
newFragment = doAddPageElementAtTheEnd(ureq, referenceFragment, element);
} else if(target == PageElementTarget.within && column >= 0) {
newFragment = doAddPageElementInContainer(ureq, referenceFragment, element, column);
} else if(target == PageElementTarget.above || target == PageElementTarget.below) {
String containerCmpId = editorModel.getContainerOfFragmentCmpId(referenceFragment.getComponentName());
if(containerCmpId != null) {
PageElement pageElement = provider.appendPageElement(element);
......@@ -370,6 +379,20 @@ public class PageEditorController extends BasicController {
return newFragment;
}
private EditorFragment doAddPageElementInContainer(UserRequest ureq, EditorFragment referenceFragment,
PageElement element, int column) {
PageElement pageElement = provider.appendPageElement(element);
EditorFragment fragment = createFragment(ureq, pageElement);
editorModel.add(fragment);
if(referenceFragment != null && referenceFragment.getEditorPart() instanceof ContainerEditorController) {
PageElement updatedElement = ((ContainerEditorController)referenceFragment.getEditorPart())
.setElementAt(fragment.getPageElement().getId(), column, null);
referenceFragment.setPageElement(updatedElement);
}
return fragment;
}
private EditorFragment doAddPageElementAtTheEnd(UserRequest ureq, EditorFragment referenceFragment, PageElement element) {
PageElement pageElement = provider.appendPageElement(element);
......
......@@ -28,6 +28,7 @@ package org.olat.modules.ceditor.ui;
public enum PageElementTarget {
above,
below,
atTheEnd
atTheEnd,
within
}
......@@ -31,8 +31,16 @@ import org.olat.core.gui.components.form.flexible.impl.FormBaseComponentImpl;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.link.LinkFactory;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.ControllerEventListener;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.gui.control.generic.closablewrapper.CloseableCalloutWindowController;
import org.olat.core.gui.render.ValidationResult;
import org.olat.modules.ceditor.PageEditorProvider;
import org.olat.modules.ceditor.ui.AddElementsController;
import org.olat.modules.ceditor.ui.PageElementTarget;
import org.olat.modules.ceditor.ui.event.AddElementEvent;
import org.olat.modules.ceditor.ui.event.ContainerColumnEvent;
import org.olat.modules.ceditor.ui.event.DropFragmentEvent;
import org.olat.modules.ceditor.ui.event.EditFragmentEvent;
......@@ -45,7 +53,7 @@ import org.olat.modules.ceditor.ui.model.EditorFragment;
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class PageEditorComponent extends FormBaseComponentImpl implements ComponentCollection, ComponentEventListener {
public class PageEditorComponent extends FormBaseComponentImpl implements ComponentCollection, ComponentEventListener, ControllerEventListener {
private static final PageEditorComponentRenderer RENDERER = new PageEditorComponentRenderer();
......@@ -55,10 +63,17 @@ public class PageEditorComponent extends FormBaseComponentImpl implements Compon
private final Link container2Columns;
private final Link container3Columns;
private final Link container4Columns;
private final WindowControl wControl;
private AddElementsController addElementsCtrl;
private CloseableCalloutWindowController callout;
private final PageEditorProvider provider;
public PageEditorComponent(String name) {
public PageEditorComponent(String name, WindowControl wControl, PageEditorProvider provider) {
super(name);
this.wControl = wControl;
this.provider = provider;
setDomReplacementWrapperRequired(false);
container1Column = LinkFactory.createLink("container.col.1", "text.column.1", null, this);
......@@ -121,6 +136,8 @@ public class PageEditorComponent extends FormBaseComponentImpl implements Compon
doCloseEditFragment();
} else if("drop_fragment".equals(cmd)) {
processDropFragment(ureq);
} else if("add_to_container".equals(cmd)) {
doAddElementsCallout(ureq);
} else {
EditorFragment editedFragment = editorModel.getEditedFragment();
if(editedFragment != null) {
......@@ -130,6 +147,32 @@ public class PageEditorComponent extends FormBaseComponentImpl implements Compon
}
}
@Override
public void dispatchEvent(UserRequest ureq, Controller source, Event event) {
if(addElementsCtrl == source) {
callout.deactivate();
if(event instanceof AddElementEvent) {
fireEvent(ureq, event);
}
cleanUp();
} else if(callout == source) {
if(CloseableCalloutWindowController.CLOSE_WINDOW_EVENT == event) {
cleanUp();
}
}
}
private void cleanUp() {
if(addElementsCtrl != null) {
addElementsCtrl.removeControllerListener(this);
addElementsCtrl = null;
}
if(callout != null) {
callout.removeControllerListener(this);
callout = null;
}
}
private Link getLink(String cmd, EditorFragment editedFragment) {
if("add.element.above".equals(cmd)) {
return editedFragment.getAddElementAboveLink();
......@@ -177,6 +220,23 @@ public class PageEditorComponent extends FormBaseComponentImpl implements Compon
}
setDirty(true);
}
private void doAddElementsCallout(UserRequest ureq) {
String cmpId = ureq.getParameter("container");
String column = ureq.getParameter("column");
EditorFragment referenceFragment = editorModel.getFragmentByCmpId(cmpId);
String containerId = referenceFragment.getPageElement().getId();
String targetId = "o_ccad_" + containerId + "_" + column;
addElementsCtrl = new AddElementsController(ureq, wControl, provider,
referenceFragment, PageElementTarget.within, Integer.parseInt(column));
addElementsCtrl.addControllerListener(this);
callout = new CloseableCalloutWindowController(ureq, wControl, addElementsCtrl.getInitialComponent(),
targetId, "Filter", true, "o_sel_flexi_filter_callout");
callout.addControllerListener(this);
callout.activate();
}
@Override
public Component getComponent(String name) {
......
......@@ -28,7 +28,9 @@ import java.util.stream.Collectors;
import org.olat.core.gui.components.Component;
import org.olat.core.gui.components.ComponentCollection;
import org.olat.core.gui.components.DefaultComponentRenderer;
import org.olat.core.gui.components.form.flexible.impl.NameValuePair;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.components.velocity.VelocityContainer;
import org.olat.core.gui.render.RenderResult;
import org.olat.core.gui.render.Renderer;
import org.olat.core.gui.render.StringOutput;
......@@ -118,7 +120,7 @@ public class PageEditorComponentRenderer extends DefaultComponentRenderer {
if(fragment.getPageElement() instanceof ContainerElement) {
sb.append(" clearfix'>");
ContainerElement container = (ContainerElement)fragment.getPageElement();
renderContainer(renderer, sb, cmp, container, elementIdToFragments, ubu, translator, renderResult, args);
renderContainer(renderer, sb, cmp, fragment, container, elementIdToFragments, ubu, translator, renderResult, args);
} else {
sb.append("'>");
Component subCmp = fragment.getComponent();
......@@ -235,7 +237,7 @@ public class PageEditorComponentRenderer extends DefaultComponentRenderer {
if(element instanceof ContainerElement) {
sb.append("o_page_container clearfix'>");
ContainerElement container = (ContainerElement)element;
renderContainer(renderer, sb, cmp, container, elementIdToFragments, ubu, translator, renderResult, args);
renderContainer(renderer, sb, cmp, fragment, container, elementIdToFragments, ubu, translator, renderResult, args);
} else {
sb.append(" o_page_drop", fragment.isDroppable()).append("'>");
Component subCmp = fragment.getComponent();
......@@ -246,15 +248,27 @@ public class PageEditorComponentRenderer extends DefaultComponentRenderer {
sb.append("</div>");
}
private void renderContainer(Renderer renderer, StringOutput sb, PageEditorComponent cmp, ContainerElement container, Map<String, EditorFragment> elementIdToFragments,
private void renderContainer(Renderer renderer, StringOutput sb, PageEditorComponent cmp, EditorFragment cmpFragment, ContainerElement container, Map<String, EditorFragment> elementIdToFragments,
URLBuilder ubu, Translator translator, RenderResult renderResult, String[] args) {
ContainerSettings settings = container.getContainerSettings();
ContainerSettings settings = container.getContainerSettings();
List<ContainerColumn> columns = settings.getColumns();
int numOfColumns = settings.getNumOfColumns();
List<String> cssColumns = ContainerCSSColumns.getCssColumns(numOfColumns);
for(int i=0; i<numOfColumns; i++) {
sb.append("<div id='occ_").append(container.getId()).append("_").append(i).append("' class='")
.append(cssColumns.get(i)).append(" o_page_container_slot o_page_drop' data-oo-slot='").append(i).append("'>");
if(cmpFragment != null) {
sb.append("<a id='o_ccad_").append(container.getId()).append("_").append(i).append("' ")
.append("href='#' onclick=\"");// add elements directly in container
ubu.buildXHREvent(sb, "", false, true,
new NameValuePair(VelocityContainer.COMMAND_ID, "add_to_container"),
new NameValuePair("container", cmpFragment.getCmpId()),
new NameValuePair("column", Integer.toString(i)));
sb.append(" return false;\" class='btn btn-default btn-xs o_page_add_in_container'><i class='o_icon o_icon_add'> </i></a>");
}
if(columns != null && i < columns.size()) {
ContainerColumn column = columns.get(i);
for(String elementId:column.getElementIds()) {
......
......@@ -34,14 +34,17 @@ public class AddElementEvent extends Event {
private static final long serialVersionUID = 7073690795238863754L;
private final int containerColumn;
private final PageElementTarget target;
private final PageElementHandler handler;
private final EditorFragment referenceFragment;
public AddElementEvent(EditorFragment referenceFragment, PageElementHandler handler, PageElementTarget target) {
public AddElementEvent(EditorFragment referenceFragment, PageElementHandler handler,
PageElementTarget target, int containerColumn) {
super("pf-add-above-element");
this.target = target;
this.handler = handler;
this.containerColumn = containerColumn;
this.referenceFragment = referenceFragment;
}
......@@ -56,4 +59,8 @@ public class AddElementEvent extends Event {
public EditorFragment getReferenceFragment() {
return referenceFragment;
}
public int getContainerColumn() {
return containerColumn;
}
}
......@@ -149,9 +149,6 @@ public class CollectFileMediaController extends FormBasicController implements P
categoriesEl.setElementCssClass("o_sel_ep_tagsinput");
categoriesEl.setAllowDuplicates(false);
//String source = "Forum";
//uifactory.addStaticTextElement("artefact.source", "artefact.source", source, formLayout);
Date collectDate = mediaReference == null ? new Date() : mediaReference.getCollectionDate();
String date = Formatter.getInstance(getLocale()).formatDate(collectDate);
uifactory.addStaticTextElement("artefact.collect.date", "artefact.collect.date", date, formLayout);
......@@ -194,9 +191,9 @@ public class CollectFileMediaController extends FormBasicController implements P
@Override
protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
if(fileEl == source) {
if (this.titleEl.isEmpty()) {
this.titleEl.setValue(fileEl.getUploadFileName());
this.titleEl.getComponent().setDirty(true);
if (titleEl.isEmpty()) {
titleEl.setValue(fileEl.getUploadFileName());
titleEl.getComponent().setDirty(true);
}
}
super.formInnerEvent(ureq, source, event);
......
......@@ -51,7 +51,8 @@
function initEdit() {
jQuery(".o_page_part").each(function(index, el) {
jQuery(el).on('click', function(e) {
if(jQuery(e.target).closest(".o_popover").length > 0) {
if(jQuery(e.target).closest(".o_popover").length > 0
|| jQuery(e.target).closest(".o_page_add_in_container").length > 0) {
return true;
}
......@@ -75,7 +76,8 @@
} else {
var edited = jQuery(e.target).closest(".o_page_fragment_edit").length > 0
|| jQuery(e.target).closest(".o_page_side_options").length > 0;
var excludedEls = jQuery(e.target).closest(".o_popover").length > 0;
var excludedEls = jQuery(e.target).closest(".o_popover").length > 0
|| jQuery(e.target).closest(".o_page_add_in_container").length > 0;
if(!edited && !excludedEls && jQuery(".o_layered_panel .modal-dialog").length == 0) {
o_XHREvent(componentUrl, false, false, 'cid', 'close_edit_fragment');
}
......
......@@ -232,6 +232,9 @@ div.o_page_content_editor .gu-mirror, .o_page_content_editor .gu-transit {
border: $o-panel-placeholder-border-width dotted $o-editor-hover-border-color;
}
}
.o_page_add_in_container {
float: right;
}
/* d&d styles */
.o_page_drop {
......
source diff could not be displayed: it is too large. Options to address this: view the blob.
source diff could not be displayed: it is too large. Options to address this: view the blob.
source diff could not be displayed: it is too large. Options to address this: view the blob.
source diff could not be displayed: it is too large. Options to address this: view the blob.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment