From 835f3393a2bf02bf25ddd61ab653775a3bf76b00 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Tue, 19 May 2015 08:47:37 +0200 Subject: [PATCH] OO-1536: inline the user's visiting card in the different member list, add a tool in the list as in author list, add close button for the visinting card (if opened in the main window), add close button to the business groups tabs --- .../ChecklistManageCheckpointsController.java | 2 +- .../securitygroup/gui/GroupController.java | 3 +- .../user/UsermanagerUserSearchController.java | 3 +- .../user/course/CourseOverviewController.java | 2 +- .../olat/basesecurity/ui/GroupController.java | 4 +- .../fullWebApp/BaseFullWebappDTabs.java | 38 ++ .../elements/table/FlexiTableElementImpl.java | 7 +- .../elements/table/FlexiTableSearchEvent.java | 11 +- .../SortableFlexiTableModelDelegate.java | 4 + .../core/gui/control/generic/dtabs/DTabs.java | 9 + .../id/context/BusinessControlFactory.java | 9 +- .../assessment/AssessmentEditController.java | 3 +- .../assessment/AssessmentMainController.java | 9 +- .../IdentityAssessmentEditController.java | 32 +- .../course/member/MemberListController.java | 29 +- .../MemberListWithOriginFilterController.java | 82 ++- .../course/member/MemberSearchController.java | 43 +- .../olat/course/member/MemberSearchForm.java | 52 +- .../MembersManagementMainController.java | 7 +- .../member/MembersOverviewController.java | 29 +- .../member/_content/all_member_list.html | 19 +- .../_content/member_list_origin_filter.html | 23 +- .../member/_content/search_member_list.html | 2 +- .../AssessedIdentityOverviewController.java | 3 +- ...TACoachedParticipantGradingController.java | 3 +- .../ProjectDetailsDisplayController.java | 4 +- .../course/run/CourseRuntimeController.java | 2 +- .../ui/edit/BusinessGroupEditController.java | 5 +- .../edit/BusinessGroupMembersController.java | 6 +- .../group/ui/edit/MemberListController.java | 11 +- .../ui/edit/_content/all_member_list.html | 13 +- .../ui/main/AbstractMemberListController.java | 511 ++++++++++++------ .../group/ui/main/CourseRoleCellRenderer.java | 77 +-- .../main/EditSingleMembershipController.java | 4 +- .../olat/group/ui/main/GroupCellRenderer.java | 39 +- .../group/ui/main/MemberInfoController.java | 29 +- .../group/ui/main/MemberListTableModel.java | 84 ++- .../group/ui/main/MemberListTableSort.java | 53 ++ .../org/olat/group/ui/main/MemberView.java | 34 +- .../group/ui/main/SearchMembersParams.java | 9 + .../group/ui/main/_content/edit_member.html | 2 +- .../group/ui/main/_content/info_member.html | 10 +- .../olat/group/ui/main/_content/tools.html | 9 + .../ui/main/_i18n/LocalStrings_de.properties | 1 + .../ui/main/_i18n/LocalStrings_en.properties | 1 + .../run/BusinessGroupMainRunController.java | 45 +- .../EfficiencyStatementDetailsController.java | 3 +- .../modules/fo/FilterForUserController.java | 3 +- .../_i18n/LocalStrings_ar.properties | 1 + .../_i18n/LocalStrings_bg.properties | 1 + .../_i18n/LocalStrings_cs.properties | 1 + .../_i18n/LocalStrings_da.properties | 1 + .../_i18n/LocalStrings_de.properties | 2 +- .../_i18n/LocalStrings_el.properties | 1 + .../_i18n/LocalStrings_en.properties | 2 +- .../_i18n/LocalStrings_es.properties | 1 + .../_i18n/LocalStrings_et_EE.properties | 1 + .../_i18n/LocalStrings_fa.properties | 1 + .../_i18n/LocalStrings_fr.properties | 2 +- .../_i18n/LocalStrings_it.properties | 1 + .../_i18n/LocalStrings_jp.properties | 1 + .../_i18n/LocalStrings_lt.properties | 1 + .../_i18n/LocalStrings_nl_NL.properties | 1 + .../_i18n/LocalStrings_pl.properties | 1 + .../_i18n/LocalStrings_pt_BR.properties | 2 +- .../_i18n/LocalStrings_pt_PT.properties | 1 + .../_i18n/LocalStrings_ru.properties | 1 + .../_i18n/LocalStrings_sq.properties | 1 + .../_i18n/LocalStrings_zh_CN.properties | 2 +- .../_i18n/LocalStrings_zh_TW.properties | 1 + .../ui/RepositoryEntryRuntimeController.java | 30 +- .../author/RepositoryMembersController.java | 50 +- .../ui/author/_content/all_member_list.html | 35 +- .../olat/user/DisplayPortraitController.java | 3 +- ...HomePageContextEntryControllerCreator.java | 2 +- ...IdentityContextEntryControllerCreator.java | 2 +- .../org/olat/user/UserInfoMainController.java | 46 +- .../static/themes/light/modules/_icons.scss | 1 + src/main/webapp/static/themes/light/theme.css | 2 +- .../themes/light/theme_ie_completions.css | 2 +- 80 files changed, 1135 insertions(+), 448 deletions(-) create mode 100644 src/main/java/org/olat/group/ui/main/MemberListTableSort.java create mode 100644 src/main/java/org/olat/group/ui/main/_content/tools.html diff --git a/src/main/java/de/bps/olat/modules/cl/ChecklistManageCheckpointsController.java b/src/main/java/de/bps/olat/modules/cl/ChecklistManageCheckpointsController.java index 98feca15c1f..f8682bd2a54 100644 --- a/src/main/java/de/bps/olat/modules/cl/ChecklistManageCheckpointsController.java +++ b/src/main/java/de/bps/olat/modules/cl/ChecklistManageCheckpointsController.java @@ -429,7 +429,7 @@ public class ChecklistManageCheckpointsController extends BasicController { private void openVisitingCard(UserRequest ureq) { removeAsListenerAndDispose(uimc); - uimc = new UserInfoMainController(ureq, getWindowControl(), selectedIdentity); + uimc = new UserInfoMainController(ureq, getWindowControl(), selectedIdentity, false, false); listenTo(uimc); removeAsListenerAndDispose(cmc); diff --git a/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java b/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java index 3a2663649ff..fdefd0a6300 100644 --- a/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java +++ b/src/main/java/org/olat/admin/securitygroup/gui/GroupController.java @@ -287,8 +287,9 @@ public class GroupController extends BasicController { if (actionid.equals(COMMAND_VCARD)) { //get identity and open new visiting card controller in new window ControllerCreator userInfoMainControllerCreator = new ControllerCreator() { + @Override public Controller createController(UserRequest lureq, WindowControl lwControl) { - return new UserInfoMainController(lureq, lwControl, identity); + return new UserInfoMainController(lureq, lwControl, identity, true, false); } }; //wrap the content controller into a full header layout diff --git a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java index 9491ac7dd91..7c558fc0b9f 100644 --- a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java +++ b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java @@ -473,8 +473,9 @@ public class UsermanagerUserSearchController extends BasicController implements int rowid = te.getRowId(); final Identity identity = tdm.getObject(rowid); ControllerCreator userInfoMainControllerCreator = new ControllerCreator() { + @Override public Controller createController(UserRequest lureq, WindowControl lwControl) { - return new UserInfoMainController(lureq, lwControl, identity); + return new UserInfoMainController(lureq, lwControl, identity, true, false); } }; // wrap the content controller into a full header layout diff --git a/src/main/java/org/olat/admin/user/course/CourseOverviewController.java b/src/main/java/org/olat/admin/user/course/CourseOverviewController.java index d734808b9b6..897d015c46d 100644 --- a/src/main/java/org/olat/admin/user/course/CourseOverviewController.java +++ b/src/main/java/org/olat/admin/user/course/CourseOverviewController.java @@ -386,7 +386,7 @@ public class CourseOverviewController extends BasicController { private void doOpenEdit(UserRequest ureq, CourseMemberView member) { RepositoryEntry repoEntry = repositoryManager.lookupRepositoryEntry(member.getRepoKey()); - editSingleMemberCtrl = new EditSingleMembershipController(ureq, getWindowControl(), editedIdentity, repoEntry, null); + editSingleMemberCtrl = new EditSingleMembershipController(ureq, getWindowControl(), editedIdentity, repoEntry, null, true); listenTo(editSingleMemberCtrl); cmc = new CloseableModalController(getWindowControl(), translate("close"), editSingleMemberCtrl.getInitialComponent(), true, translate("edit.member")); diff --git a/src/main/java/org/olat/basesecurity/ui/GroupController.java b/src/main/java/org/olat/basesecurity/ui/GroupController.java index f4cdea58751..1100d0807e7 100644 --- a/src/main/java/org/olat/basesecurity/ui/GroupController.java +++ b/src/main/java/org/olat/basesecurity/ui/GroupController.java @@ -286,6 +286,7 @@ public class GroupController extends BasicController { * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, * org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event) */ + @Override public void event(UserRequest ureq, Controller sourceController, Event event) { if (sourceController == tableCtr) { if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) { @@ -296,8 +297,9 @@ public class GroupController extends BasicController { if (actionid.equals(COMMAND_VCARD)) { //get identity and open new visiting card controller in new window ControllerCreator userInfoMainControllerCreator = new ControllerCreator() { + @Override public Controller createController(UserRequest lureq, WindowControl lwControl) { - return new UserInfoMainController(lureq, lwControl, identity); + return new UserInfoMainController(lureq, lwControl, identity, true, false); } }; //wrap the content controller into a full header layout diff --git a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappDTabs.java b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappDTabs.java index e90c94855f8..28d83195b4f 100644 --- a/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappDTabs.java +++ b/src/main/java/org/olat/core/commons/fullWebApp/BaseFullWebappDTabs.java @@ -21,11 +21,19 @@ package org.olat.core.commons.fullWebApp; import java.util.List; +import org.olat.NewControllerFactory; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.dtabs.DTab; import org.olat.core.gui.control.generic.dtabs.DTabs; import org.olat.core.id.OLATResourceable; +import org.olat.core.id.context.BusinessControl; +import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.id.context.ContextEntry; +import org.olat.core.id.context.HistoryPoint; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.StringHelper; /** * @@ -35,6 +43,8 @@ import org.olat.core.id.context.ContextEntry; */ class BaseFullWebappDTabs implements DTabs { + private static final OLog log = Tracing.createLoggerFor(BaseFullWebappDTabs.class); + private final BaseFullWebappController webappCtrl; public BaseFullWebappDTabs(BaseFullWebappController webappCtrl) { @@ -70,4 +80,32 @@ class BaseFullWebappDTabs implements DTabs { public void removeDTab(UserRequest ureq, DTab dt) { webappCtrl.removeDTab(ureq, dt); } + + @Override + public void closeDTab(UserRequest ureq, OLATResourceable ores, HistoryPoint launchedFromPoint) { + // Now try to go back to place that is attached to (optional) root back business path + if (launchedFromPoint != null && StringHelper.containsNonWhitespace(launchedFromPoint.getBusinessPath()) + && launchedFromPoint.getEntries() != null && launchedFromPoint.getEntries().size() > 0) { + BusinessControl bc = BusinessControlFactory.getInstance().createFromPoint(launchedFromPoint); + if(bc.hasContextEntry()) { + WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(bc, webappCtrl.getWindowControl()); + try { + //make the resume secure. If something fail, don't generate a red screen + NewControllerFactory.getInstance().launch(ureq, bwControl); + } catch (Exception e) { + log.error("Error while resuming with root level back business path::" + launchedFromPoint.getBusinessPath(), e); + } + } + } + + // Navigate beyond the stack, our own layout has been popped - close this tab + DTabs tabs = webappCtrl.getWindowControl().getWindowBackOffice().getWindow().getDTabs(); + if (tabs != null) { + + DTab tab = tabs.getDTab(ores); + if (tab != null) { + tabs.removeDTab(ureq, tab); + } + } + } } \ No newline at end of file diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java index e50f08f1560..396f52e6885 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableElementImpl.java @@ -756,6 +756,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle if(StringHelper.containsNonWhitespace(selectedRowIndex)) { doSelect(ureq, col.getAction(), Integer.parseInt(selectedRowIndex)); select = true; + break; } } } @@ -1106,7 +1107,7 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle doSearch(ureq, search, null); getRootForm().fireFormEvent(ureq, new FlexiTableEvent(this, search)); } else { - doResetSearch(); + doResetSearch(ureq); } } @@ -1187,13 +1188,15 @@ public class FlexiTableElementImpl extends FormItemImpl implements FlexiTableEle return Arrays.equals(orderBy , sortKeys); } - protected void doResetSearch() { + protected void doResetSearch(UserRequest ureq) { conditionalQueries = null; currentPage = 0; if(dataSource != null) { resetInternComponents(); dataSource.clear(); dataSource.load(null, null, 0, getPageSize()); + } else { + getRootForm().fireFormEvent(ureq, new FlexiTableSearchEvent(this, FormEvent.ONCLICK)); } } diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableSearchEvent.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableSearchEvent.java index b143334c07c..43b24745e49 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableSearchEvent.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/FlexiTableSearchEvent.java @@ -33,16 +33,23 @@ import org.olat.core.gui.components.form.flexible.impl.FormEvent; public class FlexiTableSearchEvent extends FormEvent { private static final long serialVersionUID = -1977791683080030187L; - public static final String CMD = "ftSearch"; + public static final String SEARCH = "ftSearch"; + public static final String RESET = "ftResetSearch"; private final String search; private final List<String> condQueries; public FlexiTableSearchEvent(FormItem source, String search, List<String> condQueries, int action) { - super(CMD, source, action); + super(SEARCH, source, action); this.search = search; this.condQueries = condQueries; } + + public FlexiTableSearchEvent(FormItem source, int action) { + super(RESET, source, action); + this.search = null; + this.condQueries = null; + } public String getSearch() { return search; diff --git a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/SortableFlexiTableModelDelegate.java b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/SortableFlexiTableModelDelegate.java index e613fa34d2a..f2cb4f22ffb 100644 --- a/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/SortableFlexiTableModelDelegate.java +++ b/src/main/java/org/olat/core/gui/components/form/flexible/impl/elements/table/SortableFlexiTableModelDelegate.java @@ -68,6 +68,10 @@ public class SortableFlexiTableModelDelegate<T> { return columnIndex; } + public Collator getCollator() { + return collator; + } + public List<T> sort() { int rowCount = tableModel.getRowCount(); List<T> rows = new ArrayList<>(rowCount); diff --git a/src/main/java/org/olat/core/gui/control/generic/dtabs/DTabs.java b/src/main/java/org/olat/core/gui/control/generic/dtabs/DTabs.java index 4658cbc2537..7ba83e45a63 100644 --- a/src/main/java/org/olat/core/gui/control/generic/dtabs/DTabs.java +++ b/src/main/java/org/olat/core/gui/control/generic/dtabs/DTabs.java @@ -31,6 +31,7 @@ import java.util.List; import org.olat.core.gui.UserRequest; import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.ContextEntry; +import org.olat.core.id.context.HistoryPoint; /** * Description:<br> @@ -79,6 +80,14 @@ public interface DTabs { * @param dt Remove this tab */ public void removeDTab(UserRequest ureq, DTab dt); + + /** + * + * @param ureq + * @param tab + * @param lastPoint + */ + public void closeDTab(UserRequest ureq, OLATResourceable ores, HistoryPoint lastPoint); } diff --git a/src/main/java/org/olat/core/id/context/BusinessControlFactory.java b/src/main/java/org/olat/core/id/context/BusinessControlFactory.java index 545f7d2217c..7000806bd19 100644 --- a/src/main/java/org/olat/core/id/context/BusinessControlFactory.java +++ b/src/main/java/org/olat/core/id/context/BusinessControlFactory.java @@ -176,7 +176,6 @@ public class BusinessControlFactory { * @param wControl * @return */ - //fxdiff BAKS-7 Resume function public WindowControl createBusinessWindowControl(final OLATResourceable ores, StateEntry state, WindowControl wControl) { WindowControl bwControl; ContextEntry ce = BusinessControlFactory.getInstance().createContextEntry(ores); @@ -196,7 +195,6 @@ public class BusinessControlFactory { * @param wControl * @return */ - //fxdiff BAKS-7 Resume function public WindowControl createBusinessWindowControl(UserRequest ureq, final OLATResourceable ores, StateEntry state, WindowControl wControl, boolean addToHistory) { WindowControl bwControl = createBusinessWindowControl(ores, state, wControl); @@ -206,7 +204,6 @@ public class BusinessControlFactory { return bwControl; } - //fxdiff BAKS-7 Resume function public void addToHistory(UserRequest ureq, WindowControl wControl) { if(wControl == null || wControl.getBusinessControl() == null) return; ureq.getUserSession().addToHistory(ureq, wControl.getBusinessControl()); @@ -485,8 +482,7 @@ public class BusinessControlFactory { } return date; } - - //fxdiff BAKS-7 Resume function + public String getPath(ContextEntry entry) { String path = entry.getOLATResourceable().getResourceableTypeName(); path = path.endsWith(":0") ? path.substring(0, path.length() - 2) : path; @@ -575,7 +571,6 @@ class MyContextEntry implements ContextEntry, Serializable { private static final long serialVersionUID = 949522581806327579L; private OLATResourceable olatResourceable; - //fxdiff BAKS-7 Resume function private StateEntry state; MyContextEntry(OLATResourceable ores) { @@ -595,13 +590,11 @@ class MyContextEntry implements ContextEntry, Serializable { } @Override - //fxdiff BAKS-7 Resume function public StateEntry getTransientState() { return state; } @Override - //fxdiff BAKS-7 Resume function public void setTransientState(StateEntry state) { this.state = state; } diff --git a/src/main/java/org/olat/course/assessment/AssessmentEditController.java b/src/main/java/org/olat/course/assessment/AssessmentEditController.java index 9ac8de72198..3b271e22542 100644 --- a/src/main/java/org/olat/course/assessment/AssessmentEditController.java +++ b/src/main/java/org/olat/course/assessment/AssessmentEditController.java @@ -101,7 +101,7 @@ public class AssessmentEditController extends BasicController { */ public AssessmentEditController(UserRequest ureq, WindowControl wControl, BreadcrumbPanel stackPanel, ICourse course, AssessableCourseNode courseNode, AssessedIdentityWrapper assessedIdentityWrapper, - boolean showCourseNodeDetails, boolean saveAndCloseButton) { + boolean showCourseNodeDetails, boolean saveAndCloseButton, boolean showBackLink) { super(ureq, wControl); this.assessedIdentityWrapper = assessedIdentityWrapper; this.courseNode = courseNode; @@ -125,6 +125,7 @@ public class AssessmentEditController extends BasicController { hideLogButton = LinkFactory.createButtonSmall("command.hidelog", detailView, this); showLogButton = LinkFactory.createButtonSmall("command.showlog", detailView, this); backLink = LinkFactory.createLinkBack(detailView, this); + backLink.setVisible(showBackLink); // Add the user object to the view Identity assessedIdentity = assessedIdentityWrapper.getIdentity(); diff --git a/src/main/java/org/olat/course/assessment/AssessmentMainController.java b/src/main/java/org/olat/course/assessment/AssessmentMainController.java index 3abef2031e9..7afc0a109fc 100644 --- a/src/main/java/org/olat/course/assessment/AssessmentMainController.java +++ b/src/main/java/org/olat/course/assessment/AssessmentMainController.java @@ -368,7 +368,8 @@ public class AssessmentMainController extends MainLayoutBasicController implemen // select user assessedIdentityWrapper = AssessmentHelper.wrapIdentity(focusOnIdentity, localUserCourseEnvironmentCache, initialLaunchDates, course, null); - identityAssessmentController = new IdentityAssessmentEditController(getWindowControl(), ureq, stackPanel, assessedIdentityWrapper.getIdentity(), course, true); + identityAssessmentController = new IdentityAssessmentEditController(getWindowControl(), ureq, stackPanel, + assessedIdentityWrapper.getIdentity(), course, true, true, false); listenTo(identityAssessmentController); setContent(identityAssessmentController.getInitialComponent()); } @@ -805,12 +806,14 @@ public class AssessmentMainController extends MainLayoutBasicController implemen private void initIdentityEditController(UserRequest ureq, ICourse course) { if (currentCourseNode == null) { removeAsListenerAndDispose(identityAssessmentController); - identityAssessmentController = new IdentityAssessmentEditController(getWindowControl(),ureq, stackPanel, assessedIdentityWrapper.getIdentity(), course, true); + identityAssessmentController = new IdentityAssessmentEditController(getWindowControl(),ureq, stackPanel, + assessedIdentityWrapper.getIdentity(), course, true, true, false); listenTo(identityAssessmentController); setContent(identityAssessmentController.getInitialComponent()); } else { removeAsListenerAndDispose(assessmentEditController); - assessmentEditController = new AssessmentEditController(ureq, getWindowControl(), stackPanel, course, currentCourseNode, assessedIdentityWrapper, true, false); + assessmentEditController = new AssessmentEditController(ureq, getWindowControl(), stackPanel, course, currentCourseNode, + assessedIdentityWrapper, true, false, true); listenTo(assessmentEditController); main.setContent(assessmentEditController.getInitialComponent()); } diff --git a/src/main/java/org/olat/course/assessment/IdentityAssessmentEditController.java b/src/main/java/org/olat/course/assessment/IdentityAssessmentEditController.java index 35ec4aedc56..77f13d21e31 100644 --- a/src/main/java/org/olat/course/assessment/IdentityAssessmentEditController.java +++ b/src/main/java/org/olat/course/assessment/IdentityAssessmentEditController.java @@ -71,7 +71,8 @@ import org.olat.course.run.userview.UserCourseEnvironment; */ public class IdentityAssessmentEditController extends BasicController { - private boolean mayEdit; + private final boolean mayEdit; + private final boolean pushToStackPanel; private final VelocityContainer identityAssessmentVC; private StackedPanel main; private AssessmentEditController assessmentEditCtr; @@ -91,20 +92,18 @@ public class IdentityAssessmentEditController extends BasicController { * @param assessedUserCourseEnvironment The assessed identitys user course environment * @param course * @param mayEdit true: user may edit the assessment, false: readonly view (user view) - */ - public IdentityAssessmentEditController(WindowControl wControl, UserRequest ureq, BreadcrumbPanel stackPanel, - Identity assessedIdentity, ICourse course, boolean mayEdit) { - this(wControl, ureq, stackPanel, assessedIdentity, course, mayEdit, true); - } - + * @param headers + */ public IdentityAssessmentEditController(WindowControl wControl, UserRequest ureq, BreadcrumbPanel stackPanel, - Identity assessedIdentity, ICourse course, boolean mayEdit, boolean headers) { - + Identity assessedIdentity, ICourse course, boolean mayEdit, boolean headers, boolean pushToStackPanel) { super(ureq, wControl); - this.stackPanel = stackPanel; + this.mayEdit = mayEdit; - assessedUserCourseEnvironment = AssessmentHelper.createAndInitUserCourseEnvironment(assessedIdentity, course); + this.stackPanel = stackPanel; this.ores = OresHelper.clone(course); + this.pushToStackPanel = pushToStackPanel; + + assessedUserCourseEnvironment = AssessmentHelper.createAndInitUserCourseEnvironment(assessedIdentity, course); identityAssessmentVC = createVelocityContainer("identityassessment"); if(headers) { @@ -193,9 +192,16 @@ public class IdentityAssessmentEditController extends BasicController { UserCourseInformationsManager userCourseInformationsManager = CoreSpringFactory.getImpl(UserCourseInformationsManager.class); Date initialLaunchDate = userCourseInformationsManager.getInitialLaunchDate(ores.getResourceableId(), assessedUserCourseEnvironment.getIdentityEnvironment().getIdentity()); AssessedIdentityWrapper assessedIdentityWrapper = AssessmentHelper.wrapIdentity(assessedUserCourseEnvironment, initialLaunchDate, courseNode); - assessmentEditCtr = new AssessmentEditController(ureq, getWindowControl(), stackPanel, course, courseNode, assessedIdentityWrapper, true, false); + assessmentEditCtr = new AssessmentEditController(ureq, getWindowControl(), stackPanel, course, courseNode, + assessedIdentityWrapper, true, false, !pushToStackPanel); listenTo(assessmentEditCtr); - main.setContent(assessmentEditCtr.getInitialComponent()); + + if(stackPanel != null && pushToStackPanel) { + stackPanel.pushController(courseNode.getShortTitle(), assessmentEditCtr); + } else { + main.setContent(assessmentEditCtr.getInitialComponent()); + } + } else { throw new OLATSecurityException("doEditNodeAssessment() called but controller configured with mayEdit=false"); } diff --git a/src/main/java/org/olat/course/member/MemberListController.java b/src/main/java/org/olat/course/member/MemberListController.java index 208ad1eb05b..7226d139f1b 100644 --- a/src/main/java/org/olat/course/member/MemberListController.java +++ b/src/main/java/org/olat/course/member/MemberListController.java @@ -20,9 +20,15 @@ package org.olat.course.member; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.control.WindowControl; +import org.olat.core.id.Identity; import org.olat.core.util.StringHelper; +import org.olat.course.CourseFactory; +import org.olat.course.ICourse; +import org.olat.course.assessment.IdentityAssessmentEditController; import org.olat.group.ui.main.AbstractMemberListController; +import org.olat.group.ui.main.MemberView; import org.olat.group.ui.main.SearchMembersParams; import org.olat.repository.RepositoryEntry; @@ -31,19 +37,36 @@ import org.olat.repository.RepositoryEntry; * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ public class MemberListController extends AbstractMemberListController { + + private IdentityAssessmentEditController identityAssessmentController; private final SearchMembersParams searchParams; - public MemberListController(UserRequest ureq, WindowControl wControl, + public MemberListController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, RepositoryEntry repoEntry, SearchMembersParams searchParams, String infos) { - super(ureq, wControl, repoEntry, "all_member_list"); + super(ureq, wControl, repoEntry, "all_member_list", stackPanel); this.searchParams = searchParams; if(StringHelper.containsNonWhitespace(infos)) { - mainVC.contextPut("infos", infos); + flc.contextPut("infos", infos); } } + @Override + protected void doOpenAssessmentTool(UserRequest ureq, MemberView member) { + removeAsListenerAndDispose(identityAssessmentController); + + Identity assessedIdentity = securityManager.loadIdentityByKey(member.getIdentityKey()); + ICourse course = CourseFactory.loadCourse(repoEntry.getOlatResource()); + + identityAssessmentController = new IdentityAssessmentEditController(getWindowControl(),ureq, toolbarPanel, + assessedIdentity, course, true, false, true); + listenTo(identityAssessmentController); + + String displayName = userManager.getUserDisplayName(assessedIdentity); + toolbarPanel.pushController(displayName, identityAssessmentController); + } + @Override public SearchMembersParams getSearchParams() { return searchParams; diff --git a/src/main/java/org/olat/course/member/MemberListWithOriginFilterController.java b/src/main/java/org/olat/course/member/MemberListWithOriginFilterController.java index 2c471565a21..092fd7925b3 100644 --- a/src/main/java/org/olat/course/member/MemberListWithOriginFilterController.java +++ b/src/main/java/org/olat/course/member/MemberListWithOriginFilterController.java @@ -20,11 +20,20 @@ package org.olat.course.member; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.SingleSelection; +import org.olat.core.gui.components.form.flexible.impl.FormEvent; +import org.olat.core.gui.components.stack.TooledStackedPanel; 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.id.Identity; import org.olat.core.util.StringHelper; +import org.olat.course.CourseFactory; +import org.olat.course.ICourse; +import org.olat.course.assessment.IdentityAssessmentEditController; import org.olat.group.ui.main.AbstractMemberListController; +import org.olat.group.ui.main.MemberView; import org.olat.group.ui.main.SearchMembersParams; import org.olat.repository.RepositoryEntry; @@ -34,38 +43,73 @@ import org.olat.repository.RepositoryEntry; */ public class MemberListWithOriginFilterController extends AbstractMemberListController { + private static final String[] originKeys = new String[]{"all", "repo", "group"}; + + private SingleSelection originEl; + + private IdentityAssessmentEditController identityAssessmentController; + private final SearchMembersParams searchParams; - private final OriginFilterController filterController; - public MemberListWithOriginFilterController(UserRequest ureq, WindowControl wControl, + public MemberListWithOriginFilterController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, RepositoryEntry repoEntry, SearchMembersParams searchParams, String infos) { - super(ureq, wControl, repoEntry, "member_list_origin_filter"); + super(ureq, wControl, repoEntry, "member_list_origin_filter", toolbarPanel); this.searchParams = searchParams; - filterController = new OriginFilterController(ureq, wControl); - listenTo(filterController); - mainVC.put("originFilter", filterController.getInitialComponent()); - if(StringHelper.containsNonWhitespace(infos)) { - mainVC.contextPut("infos", infos); + flc.contextPut("infos", infos); } } @Override - public SearchMembersParams getSearchParams() { - return searchParams; + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + super.initForm(formLayout, listener, ureq); + + String[] openValues = new String[originKeys.length]; + for(int i=originKeys.length; i-->0; ) { + openValues[i] = translate("search." + originKeys[i]); + } + originEl = uifactory.addRadiosHorizontal("originFilter", "search.origin.alt", formLayout, originKeys, openValues); + originEl.select("all", true); + originEl.addActionListener(FormEvent.ONCHANGE); } @Override - protected void event(UserRequest ureq, Controller source, Event event) { - if(source == filterController) { - if(event instanceof SearchOriginParams) { - SearchOriginParams filter = (SearchOriginParams)event; - searchParams.setRepoOrigin(filter.isRepoOrigin()); - searchParams.setGroupOrigin(filter.isGroupOrigin()); - reloadModel(); + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(originEl == source) { + if(!originEl.isOneSelected() || originEl.isSelected(0)) { + searchParams.setRepoOrigin(true); + searchParams.setGroupOrigin(true); + } else if(originEl.isSelected(1)) { + searchParams.setRepoOrigin(true); + searchParams.setGroupOrigin(false); + } else if(originEl.isSelected(2)) { + searchParams.setRepoOrigin(false); + searchParams.setGroupOrigin(true); } + reloadModel(); + } else { + super.formInnerEvent(ureq, source, event); } - super.event(ureq, source, event); + } + + @Override + protected void doOpenAssessmentTool(UserRequest ureq, MemberView member) { + removeAsListenerAndDispose(identityAssessmentController); + + Identity assessedIdentity = securityManager.loadIdentityByKey(member.getIdentityKey()); + ICourse course = CourseFactory.loadCourse(repoEntry.getOlatResource()); + + identityAssessmentController = new IdentityAssessmentEditController(getWindowControl(),ureq, toolbarPanel, + assessedIdentity, course, true, false, true); + listenTo(identityAssessmentController); + + String displayName = userManager.getUserDisplayName(assessedIdentity); + toolbarPanel.pushController(displayName, identityAssessmentController); + } + + @Override + public SearchMembersParams getSearchParams() { + return searchParams; } } \ No newline at end of file diff --git a/src/main/java/org/olat/course/member/MemberSearchController.java b/src/main/java/org/olat/course/member/MemberSearchController.java index 43951776a31..59308eb7c18 100644 --- a/src/main/java/org/olat/course/member/MemberSearchController.java +++ b/src/main/java/org/olat/course/member/MemberSearchController.java @@ -20,10 +20,17 @@ package org.olat.course.member; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.stack.TooledStackedPanel; 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.id.Identity; +import org.olat.course.CourseFactory; +import org.olat.course.ICourse; +import org.olat.course.assessment.IdentityAssessmentEditController; import org.olat.group.ui.main.AbstractMemberListController; +import org.olat.group.ui.main.MemberView; import org.olat.group.ui.main.SearchMembersParams; import org.olat.repository.RepositoryEntry; @@ -34,16 +41,25 @@ import org.olat.repository.RepositoryEntry; public class MemberSearchController extends AbstractMemberListController { private SearchMembersParams searchParams = new SearchMembersParams(); - private final MemberSearchForm searchForm; - public MemberSearchController(UserRequest ureq, WindowControl wControl, + private MemberSearchForm searchForm; + private IdentityAssessmentEditController identityAssessmentController; + + public MemberSearchController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, RepositoryEntry repoEntry) { - super(ureq, wControl, repoEntry, "search_member_list"); + super(ureq, wControl, repoEntry, "all_member_list", toolbarPanel); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + super.initForm(formLayout, listener, ureq); - searchForm = new MemberSearchForm(ureq, wControl); + searchForm = new MemberSearchForm(ureq, getWindowControl(), mainForm); + searchForm.setEnabled(true); listenTo(searchForm); - - mainVC.put("searchForm", searchForm.getInitialComponent()); + membersTable.setSearchEnabled(true); + membersTable.setExtendedSearch(searchForm); + membersTable.expandExtendedSearch(ureq); } @Override @@ -61,4 +77,19 @@ public class MemberSearchController extends AbstractMemberListController { } super.event(ureq, source, event); } + + @Override + protected void doOpenAssessmentTool(UserRequest ureq, MemberView member) { + removeAsListenerAndDispose(identityAssessmentController); + + Identity assessedIdentity = securityManager.loadIdentityByKey(member.getIdentityKey()); + ICourse course = CourseFactory.loadCourse(repoEntry.getOlatResource()); + + identityAssessmentController = new IdentityAssessmentEditController(getWindowControl(),ureq, toolbarPanel, + assessedIdentity, course, true, false, true); + listenTo(identityAssessmentController); + + String displayName = userManager.getUserDisplayName(assessedIdentity); + toolbarPanel.pushController(displayName, identityAssessmentController); + } } diff --git a/src/main/java/org/olat/course/member/MemberSearchForm.java b/src/main/java/org/olat/course/member/MemberSearchForm.java index 902ba545899..4742da57dab 100644 --- a/src/main/java/org/olat/course/member/MemberSearchForm.java +++ b/src/main/java/org/olat/course/member/MemberSearchForm.java @@ -20,19 +20,24 @@ package org.olat.course.member; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; import org.olat.core.gui.components.form.flexible.elements.SingleSelection; import org.olat.core.gui.components.form.flexible.elements.TextElement; +import org.olat.core.gui.components.form.flexible.impl.Form; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.ExtendedFlexiTableSearchController; +import org.olat.core.gui.components.link.Link; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.StringHelper; @@ -41,12 +46,13 @@ import org.olat.group.ui.main.SearchMembersParams; import org.olat.user.UserManager; import org.olat.user.propertyhandlers.EmailProperty; import org.olat.user.propertyhandlers.UserPropertyHandler; +import org.springframework.beans.factory.annotation.Autowired; /** * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ -public class MemberSearchForm extends FormBasicController { +public class MemberSearchForm extends FormBasicController implements ExtendedFlexiTableSearchController { private String[] roleKeys = {"owner", "tutor", "attendee", "waiting"}; private String[] originKeys = new String[]{"all", "repo", "group"}; @@ -54,17 +60,19 @@ public class MemberSearchForm extends FormBasicController { private TextElement login; private SingleSelection originEl; private MultipleSelectionElement rolesEl; + private FormLink searchButton; private Map<String,FormItem> propFormItems; private List<UserPropertyHandler> userPropertyHandlers; - - private final UserManager userManager; - public MemberSearchForm(UserRequest ureq, WindowControl wControl) { - super(ureq, wControl, "search_form", Util.createPackageTranslator(UserPropertyHandler.class, ureq.getLocale())); - - userManager = CoreSpringFactory.getImpl(UserManager.class); + private boolean enabled = true; + + @Autowired + private UserManager userManager; + public MemberSearchForm(UserRequest ureq, WindowControl wControl, Form rootForm) { + super(ureq, wControl, LAYOUT_CUSTOM, "search_form", rootForm); + setTranslator(Util.createPackageTranslator(UserPropertyHandler.class, ureq.getLocale(), getTranslator())); initForm(ureq); } @@ -121,7 +129,8 @@ public class MemberSearchForm extends FormBasicController { FormLayoutContainer buttonLayout = FormLayoutContainer.createDefaultFormLayout("button_layout", getTranslator()); formLayout.add(buttonLayout); - uifactory.addFormSubmitButton("search", "search", buttonLayout); + searchButton = uifactory.addFormLink("search", buttonLayout, Link.BUTTON); + searchButton.setCustomEnabledLinkCSS("btn btn-primary"); } @Override @@ -129,8 +138,33 @@ public class MemberSearchForm extends FormBasicController { // } + @Override + public void setEnabled(boolean enable) { + this.enabled = enable; + } + + @Override + public List<String> getConditionalQueries() { + return Collections.emptyList(); + } + @Override protected void formOK(UserRequest ureq) { + if(enabled) { + fireSearchEvent(ureq); + } + } + + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(enabled) { + if (source == searchButton) { + fireSearchEvent(ureq); + } + } + } + + private void fireSearchEvent(UserRequest ureq) { SearchMembersParams params = new SearchMembersParams(); //roles Collection<String> selectedKeys = rolesEl.getSelectedKeys(); diff --git a/src/main/java/org/olat/course/member/MembersManagementMainController.java b/src/main/java/org/olat/course/member/MembersManagementMainController.java index 40ebedbf66f..291998ea7a1 100644 --- a/src/main/java/org/olat/course/member/MembersManagementMainController.java +++ b/src/main/java/org/olat/course/member/MembersManagementMainController.java @@ -24,6 +24,7 @@ import java.util.List; import org.olat.core.commons.fullWebApp.LayoutMain3ColsController; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.tree.GenericTreeModel; import org.olat.core.gui.components.tree.GenericTreeNode; import org.olat.core.gui.components.tree.MenuTree; @@ -70,6 +71,7 @@ public class MembersManagementMainController extends MainLayoutBasicController private final MenuTree menuTree; private final VelocityContainer mainVC; + private final TooledStackedPanel toolbarPanel; private final LayoutMain3ColsController columnLayoutCtr; private OrdersAdminController ordersController; @@ -85,9 +87,10 @@ public class MembersManagementMainController extends MainLayoutBasicController @Autowired private AccessControlModule acModule; - public MembersManagementMainController(UserRequest ureq, WindowControl wControl, RepositoryEntry re) { + public MembersManagementMainController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, RepositoryEntry re) { super(ureq, wControl); this.repoEntry = re; + this.toolbarPanel = toolbarPanel; //logging getUserActivityLogger().setStickyActionType(ActionType.admin); @@ -192,7 +195,7 @@ public class MembersManagementMainController extends MainLayoutBasicController Controller selectedCtrl = null; if(CMD_MEMBERS.equals(cmd)) { if(membersOverviewCtrl == null) { - membersOverviewCtrl = new MembersOverviewController(ureq, bwControl, repoEntry); + membersOverviewCtrl = new MembersOverviewController(ureq, bwControl, toolbarPanel, repoEntry); listenTo(membersOverviewCtrl); } else if(membersDirty) { membersOverviewCtrl.reloadMembers(); diff --git a/src/main/java/org/olat/course/member/MembersOverviewController.java b/src/main/java/org/olat/course/member/MembersOverviewController.java index 3e52d2e090d..c591f963693 100644 --- a/src/main/java/org/olat/course/member/MembersOverviewController.java +++ b/src/main/java/org/olat/course/member/MembersOverviewController.java @@ -21,7 +21,6 @@ package org.olat.course.member; import java.util.List; -import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; @@ -30,6 +29,7 @@ import org.olat.core.gui.components.link.LinkFactory; import org.olat.core.gui.components.segmentedview.SegmentViewComponent; import org.olat.core.gui.components.segmentedview.SegmentViewEvent; import org.olat.core.gui.components.segmentedview.SegmentViewFactory; +import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; @@ -65,6 +65,7 @@ import org.olat.repository.RepositoryEntryManagedFlag; import org.olat.repository.RepositoryManager; import org.olat.repository.model.RepositoryEntryPermissionChangeEvent; import org.olat.util.logging.activity.LoggingResourceable; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -84,6 +85,7 @@ public class MembersOverviewController extends BasicController implements Activa private final Link allMembersLink, ownersLink, tutorsLink, participantsLink, waitingListLink, searchLink; private final SegmentViewComponent segmentView; private final VelocityContainer mainVC; + private final TooledStackedPanel toolbarPanel; private AbstractMemberListController allMemberListCtrl; private AbstractMemberListController ownersCtrl; @@ -99,15 +101,16 @@ public class MembersOverviewController extends BasicController implements Activa private DedupMembersConfirmationController dedupCtrl; private final RepositoryEntry repoEntry; - private final RepositoryManager repositoryManager; - private final BusinessGroupService businessGroupService; + @Autowired + private RepositoryManager repositoryManager; + @Autowired + private BusinessGroupService businessGroupService; - public MembersOverviewController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry) { + public MembersOverviewController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, RepositoryEntry repoEntry) { super(ureq, wControl); this.repoEntry = repoEntry; - repositoryManager = CoreSpringFactory.getImpl(RepositoryManager.class); - businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class); - + this.toolbarPanel = toolbarPanel; + mainVC = createVelocityContainer("members_overview"); segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this); @@ -365,7 +368,7 @@ public class MembersOverviewController extends BasicController implements Activa ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); SearchMembersParams searchParams = new SearchMembersParams(true, true, true, true, true, false, true); - allMemberListCtrl = new MemberListWithOriginFilterController(ureq, bwControl, repoEntry, searchParams, null); + allMemberListCtrl = new MemberListWithOriginFilterController(ureq, bwControl, toolbarPanel, repoEntry, searchParams, null); listenTo(allMemberListCtrl); } @@ -382,7 +385,7 @@ public class MembersOverviewController extends BasicController implements Activa WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); SearchMembersParams searchParams = new SearchMembersParams(true, false, false, false, false, false, false); String infos = translate("owners.infos"); - ownersCtrl = new MemberListController(ureq, bwControl, repoEntry, searchParams, infos); + ownersCtrl = new MemberListController(ureq, bwControl, toolbarPanel, repoEntry, searchParams, infos); listenTo(ownersCtrl); } @@ -399,7 +402,7 @@ public class MembersOverviewController extends BasicController implements Activa WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); SearchMembersParams searchParams = new SearchMembersParams(false, true, false, true, false, false, false); String infos = translate("tutors.infos"); - tutorsCtrl = new MemberListWithOriginFilterController(ureq, bwControl, repoEntry, searchParams, infos); + tutorsCtrl = new MemberListWithOriginFilterController(ureq, bwControl, toolbarPanel, repoEntry, searchParams, infos); listenTo(tutorsCtrl); } @@ -416,7 +419,7 @@ public class MembersOverviewController extends BasicController implements Activa WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); SearchMembersParams searchParams = new SearchMembersParams(false, false, true, false, true, false, true); String infos = translate("participants.infos"); - participantsCtrl = new MemberListWithOriginFilterController(ureq, bwControl, repoEntry, searchParams, infos); + participantsCtrl = new MemberListWithOriginFilterController(ureq, bwControl, toolbarPanel, repoEntry, searchParams, infos); listenTo(participantsCtrl); } @@ -433,7 +436,7 @@ public class MembersOverviewController extends BasicController implements Activa WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); SearchMembersParams searchParams = new SearchMembersParams(false, false, false, false, false, true, false); String infos = translate("waiting.infos"); - waitingCtrl = new MemberListController(ureq, bwControl, repoEntry, searchParams, infos); + waitingCtrl = new MemberListController(ureq, bwControl, toolbarPanel, repoEntry, searchParams, infos); listenTo(waitingCtrl); } @@ -448,7 +451,7 @@ public class MembersOverviewController extends BasicController implements Activa OLATResourceable ores = OresHelper.createOLATResourceableInstance(SEG_SEARCH_MEMBERS, 0l); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); - searchCtrl = new MemberSearchController(ureq, bwControl, repoEntry); + searchCtrl = new MemberSearchController(ureq, bwControl, toolbarPanel, repoEntry); listenTo(searchCtrl); } diff --git a/src/main/java/org/olat/course/member/_content/all_member_list.html b/src/main/java/org/olat/course/member/_content/all_member_list.html index ecbac69a75c..b5d935a6a4e 100644 --- a/src/main/java/org/olat/course/member/_content/all_member_list.html +++ b/src/main/java/org/olat/course/member/_content/all_member_list.html @@ -1,10 +1,15 @@ #if($infos) - <br/> - <div class="clearfix"> - <p class="o_info">$infos</p> - </div> + <div class="o_info">$infos</div> #end - -<div class="clearfix"> - $r.render("memberList") +<div class="o_block">$r.render("memberList")</div> +<div class="o_button_group"> + #if($r.available("edit.members")) + $r.render("edit.members") + #end + #if($r.available("table.header.mail")) + $r.render("table.header.mail") + #end + #if($r.available("table.header.remove")) + $r.render("table.header.remove") + #end </div> \ No newline at end of file diff --git a/src/main/java/org/olat/course/member/_content/member_list_origin_filter.html b/src/main/java/org/olat/course/member/_content/member_list_origin_filter.html index 00460bb1dc1..3537dde3f9f 100644 --- a/src/main/java/org/olat/course/member/_content/member_list_origin_filter.html +++ b/src/main/java/org/olat/course/member/_content/member_list_origin_filter.html @@ -1,11 +1,18 @@ #if($infos) - <div class="o_block clearfix"> - <p class="o_info">$infos</p> - </div> + <div class="o_info ">$infos</div> #end -<div class="clearfix" style="position:relative;"> - <div class="o_button_group o_button_group_right"> - $r.render("originFilter") - </div> - $r.render("memberList") +<div class="o_button_group o_button_group_right"> + $r.render("originFilter") +</div> +$r.render("memberList") +<div class="o_button_group"> + #if($r.available("edit.members")) + $r.render("edit.members") + #end + #if($r.available("table.header.mail")) + $r.render("table.header.mail") + #end + #if($r.available("table.header.remove")) + $r.render("table.header.remove") + #end </div> \ No newline at end of file diff --git a/src/main/java/org/olat/course/member/_content/search_member_list.html b/src/main/java/org/olat/course/member/_content/search_member_list.html index dec88523032..5f4163056c5 100644 --- a/src/main/java/org/olat/course/member/_content/search_member_list.html +++ b/src/main/java/org/olat/course/member/_content/search_member_list.html @@ -1,4 +1,4 @@ -$r.render("searchForm") + <div class="clearfix"> $r.render("memberList") </div> \ No newline at end of file diff --git a/src/main/java/org/olat/course/nodes/cl/ui/AssessedIdentityOverviewController.java b/src/main/java/org/olat/course/nodes/cl/ui/AssessedIdentityOverviewController.java index 125a4e032f5..9dda96d3e84 100644 --- a/src/main/java/org/olat/course/nodes/cl/ui/AssessedIdentityOverviewController.java +++ b/src/main/java/org/olat/course/nodes/cl/ui/AssessedIdentityOverviewController.java @@ -161,7 +161,8 @@ public class AssessedIdentityOverviewController extends BasicController { ICourse course = CourseFactory.loadCourse(courseOres); UserCourseEnvironment uce = AssessmentHelper.createAndInitUserCourseEnvironment(assessedIdentity, course); AssessedIdentityWrapper idWrapper = AssessmentHelper.wrapIdentity(uce, null, courseNode); - assessmentCtrl = new AssessmentEditController(ureq, getWindowControl(), null, course, courseNode, idWrapper, false, true); + assessmentCtrl = new AssessmentEditController(ureq, getWindowControl(), null, course, courseNode, + idWrapper, false, true, true); assessmentCtrl.setIdentityInfos(false); assessmentCtrl.setCourseNodeInfos(false); assessmentCtrl.setTitleInfos(false); diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantGradingController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantGradingController.java index 88b0c287183..9566773e8eb 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantGradingController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachedParticipantGradingController.java @@ -138,7 +138,8 @@ public class GTACoachedParticipantGradingController extends BasicController { UserCourseEnvironment uce = AssessmentHelper.createAndInitUserCourseEnvironment(assessedIdentity, course); AssessedIdentityWrapper assessedIdentityWrapper = AssessmentHelper.wrapIdentity(uce, null, gtaNode); - assessmentForm = new AssessmentEditController(ureq, getWindowControl(), null, course, gtaNode, assessedIdentityWrapper, false, true); + assessmentForm = new AssessmentEditController(ureq, getWindowControl(), null, course, gtaNode, + assessedIdentityWrapper, false, true, true); listenTo(assessmentForm); String title = translate("grading"); diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectDetailsDisplayController.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectDetailsDisplayController.java index 681b4c0848d..656825d21e8 100644 --- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectDetailsDisplayController.java +++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectDetailsDisplayController.java @@ -226,6 +226,7 @@ public class ProjectDetailsDisplayController extends BasicController { /** * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, org.olat.core.gui.components.Component, org.olat.core.gui.control.Event) */ + @Override public void event(UserRequest ureq, Component source, Event event) { if ( projectBrokerManager.existsProject(project.getKey()) ) { if (source == editProjectButton) { @@ -244,8 +245,9 @@ public class ProjectDetailsDisplayController extends BasicController { Link projectLeaderLink = (Link)source; final Identity identity = (Identity)projectLeaderLink.getUserObject(); ControllerCreator ctrlCreator = new ControllerCreator() { + @Override public Controller createController(UserRequest lureq, WindowControl lwControl) { - return new UserInfoMainController(lureq, lwControl, identity); + return new UserInfoMainController(lureq, lwControl, identity, true, false); } }; // wrap the content controller into a full header layout diff --git a/src/main/java/org/olat/course/run/CourseRuntimeController.java b/src/main/java/org/olat/course/run/CourseRuntimeController.java index 31027f4a306..bcd80211d40 100644 --- a/src/main/java/org/olat/course/run/CourseRuntimeController.java +++ b/src/main/java/org/olat/course/run/CourseRuntimeController.java @@ -981,7 +981,7 @@ public class CourseRuntimeController extends RepositoryEntryRuntimeController im OLATResourceable ores = OresHelper.createOLATResourceableInstance("MembersMgmt", 0l); ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ores)); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ores, null, getWindowControl()); - MembersManagementMainController ctrl = new MembersManagementMainController(ureq, addToHistory(ureq, bwControl), getRepositoryEntry()); + MembersManagementMainController ctrl = new MembersManagementMainController(ureq, addToHistory(ureq, bwControl), toolbarPanel, getRepositoryEntry()); listenTo(ctrl); membersCtrl = pushController(ureq, translate("command.opensimplegroupmngt"), ctrl); setActiveTool(membersLink); diff --git a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditController.java b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditController.java index 7b6422b48af..b8561fcb7b9 100644 --- a/src/main/java/org/olat/group/ui/edit/BusinessGroupEditController.java +++ b/src/main/java/org/olat/group/ui/edit/BusinessGroupEditController.java @@ -31,6 +31,7 @@ import org.apache.commons.lang.StringEscapeUtils; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.panel.Panel; +import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.tabbedpane.TabbedPane; import org.olat.core.gui.components.tabbedpane.TabbedPaneChangedEvent; import org.olat.core.gui.components.velocity.VelocityContainer; @@ -107,7 +108,7 @@ public class BusinessGroupEditController extends BasicController implements Cont * controller does no type specific stuff implicit just by looking at * the group type. Type specifig features must be flagged. */ - public BusinessGroupEditController(UserRequest ureq, WindowControl wControl, BusinessGroup businessGroup) { + public BusinessGroupEditController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, BusinessGroup businessGroup) { super(ureq, wControl); // OLAT-4955: setting the stickyActionType here passes it on to any controller defined in the scope of the editor, @@ -139,7 +140,7 @@ public class BusinessGroupEditController extends BasicController implements Cont collaborationToolsController = new BusinessGroupToolsController(ureq, getWindowControl(), businessGroup); listenTo(collaborationToolsController); - membersController = new BusinessGroupMembersController(ureq, getWindowControl(), businessGroup); + membersController = new BusinessGroupMembersController(ureq, getWindowControl(), toolbarPanel, businessGroup); listenTo(membersController); //fxdiff VCRP-1,2: access control of resources diff --git a/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java b/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java index 0453b5bac69..fd5924eace2 100644 --- a/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java +++ b/src/main/java/org/olat/group/ui/edit/BusinessGroupMembersController.java @@ -25,6 +25,7 @@ import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.components.link.LinkFactory; +import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.velocity.VelocityContainer; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; @@ -68,7 +69,8 @@ public class BusinessGroupMembersController extends BasicController { @Autowired private BusinessGroupService businessGroupService; - public BusinessGroupMembersController(UserRequest ureq, WindowControl wControl, BusinessGroup businessGroup) { + public BusinessGroupMembersController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbarPanel, + BusinessGroup businessGroup) { super(ureq, wControl); this.businessGroup = businessGroup; @@ -96,7 +98,7 @@ public class BusinessGroupMembersController extends BasicController { mainVC.put("configMembers", configForm.getInitialComponent()); SearchMembersParams searchParams = new SearchMembersParams(false, false, false, true, true, true, true); - membersController = new MemberListController(ureq, getWindowControl(), businessGroup, searchParams); + membersController = new MemberListController(ureq, getWindowControl(), toolbarPanel, businessGroup, searchParams); listenTo(membersController); membersController.reloadModel(); diff --git a/src/main/java/org/olat/group/ui/edit/MemberListController.java b/src/main/java/org/olat/group/ui/edit/MemberListController.java index 6d7333fa376..596461b55d3 100644 --- a/src/main/java/org/olat/group/ui/edit/MemberListController.java +++ b/src/main/java/org/olat/group/ui/edit/MemberListController.java @@ -20,9 +20,11 @@ package org.olat.group.ui.edit; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.control.WindowControl; import org.olat.group.BusinessGroup; import org.olat.group.ui.main.AbstractMemberListController; +import org.olat.group.ui.main.MemberView; import org.olat.group.ui.main.SearchMembersParams; /** @@ -33,11 +35,16 @@ public class MemberListController extends AbstractMemberListController { private final SearchMembersParams searchParams; - public MemberListController(UserRequest ureq, WindowControl wControl, + public MemberListController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, BusinessGroup group, SearchMembersParams searchParams) { - super(ureq, wControl, group, "all_member_list"); + super(ureq, wControl, group, "all_member_list", stackPanel); this.searchParams = searchParams; } + + @Override + protected void doOpenAssessmentTool(UserRequest ureq, MemberView member) { + // + } @Override public SearchMembersParams getSearchParams() { diff --git a/src/main/java/org/olat/group/ui/edit/_content/all_member_list.html b/src/main/java/org/olat/group/ui/edit/_content/all_member_list.html index a3ff625a617..b4fe28a70ec 100644 --- a/src/main/java/org/olat/group/ui/edit/_content/all_member_list.html +++ b/src/main/java/org/olat/group/ui/edit/_content/all_member_list.html @@ -1,4 +1,15 @@ #if($infos) <div class="o_info">$infos</div> #end -$r.render("memberList") \ No newline at end of file +$r.render("memberList") +<div class="o_button_group"> + #if($r.available("edit.members")) + $r.render("edit.members") + #end + #if($r.available("table.header.mail")) + $r.render("table.header.mail") + #end + #if($r.available("table.header.remove")) + $r.render("table.header.remove") + #end +</div> \ No newline at end of file diff --git a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java index a337a5cc150..573788d2908 100644 --- a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java +++ b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java @@ -19,7 +19,6 @@ */ package org.olat.group.ui.main; -import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -29,37 +28,49 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import org.olat.basesecurity.BaseSecurity; import org.olat.basesecurity.BaseSecurityModule; import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.SearchIdentityParams; -import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; -import org.olat.core.gui.components.table.ColumnDescriptor; -import org.olat.core.gui.components.table.CustomCellRenderer; -import org.olat.core.gui.components.table.CustomRenderColumnDescriptor; -import org.olat.core.gui.components.table.DefaultColumnDescriptor; -import org.olat.core.gui.components.table.StaticColumnDescriptor; -import org.olat.core.gui.components.table.Table; -import org.olat.core.gui.components.table.TableController; -import org.olat.core.gui.components.table.TableEvent; -import org.olat.core.gui.components.table.TableGuiConfiguration; -import org.olat.core.gui.components.table.TableMultiSelectEvent; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.FlexiTableElement; +import org.olat.core.gui.components.form.flexible.elements.FormLink; +import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormEvent; +import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableSearchEvent; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent; +import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.TextFlexiCellRenderer; +import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.components.link.LinkFactory; +import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.velocity.VelocityContainer; 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.CloseableCalloutWindowController; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.gui.control.generic.modal.DialogBoxController; import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; +import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; +import org.olat.core.id.UserConstants; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.util.StringHelper; @@ -67,6 +78,7 @@ import org.olat.core.util.Util; import org.olat.core.util.mail.ContactList; import org.olat.core.util.mail.ContactMessage; import org.olat.core.util.mail.MailPackage; +import org.olat.core.util.resource.OresHelper; import org.olat.core.util.session.UserSessionManager; import org.olat.course.member.MemberListController; import org.olat.group.BusinessGroup; @@ -92,86 +104,94 @@ import org.olat.repository.model.RepositoryEntryPermissionChangeEvent; import org.olat.resource.OLATResource; import org.olat.resource.accesscontrol.ACService; import org.olat.resource.accesscontrol.model.ResourceReservation; +import org.olat.user.UserInfoMainController; import org.olat.user.UserManager; import org.olat.user.propertyhandlers.UserPropertyHandler; +import org.springframework.beans.factory.annotation.Autowired; /** * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ -public abstract class AbstractMemberListController extends BasicController implements Activateable2 { +public abstract class AbstractMemberListController extends FormBasicController implements Activateable2 { protected static final String USER_PROPS_ID = MemberListController.class.getCanonicalName(); + public static final int USER_PROPS_OFFSET = 500; + public static final String TABLE_ACTION_EDIT = "tbl_edit"; public static final String TABLE_ACTION_MAIL = "tbl_mail"; public static final String TABLE_ACTION_REMOVE = "tbl_remove"; public static final String TABLE_ACTION_GRADUATE = "tbl_graduate"; public static final String TABLE_ACTION_IM = "tbl_im"; + public static final String TABLE_ACTION_HOME = "tbl_home"; + public static final String TABLE_ACTION_CONTACT = "tbl_contact"; + public static final String TABLE_ACTION_ASSESSMENT = "tbl_assessment"; + + protected FlexiTableElement membersTable; + protected MemberListTableModel memberListModel; + protected final TooledStackedPanel toolbarPanel; + private FormLink editButton, mailButton, removeButton; - protected final TableController memberListCtr; - protected final VelocityContainer mainVC; - + private ToolsController toolsCtrl; protected CloseableModalController cmc; - private EditMembershipController editMembersCtrl; - private EditSingleMembershipController editSingleMemberCtrl; private ContactFormController contactCtrl; - private MemberLeaveConfirmationController leaveDialogBox; private DialogBoxController confirmSendMailBox; + private UserInfoMainController visitingCardCtrl; + private EditMembershipController editMembersCtrl; + private MemberLeaveConfirmationController leaveDialogBox; + private CloseableCalloutWindowController toolsCalloutCtrl; + private EditSingleMembershipController editSingleMemberCtrl; private final List<UserPropertyHandler> userPropertyHandlers; - private final RepositoryEntry repoEntry; + private final AtomicInteger counter = new AtomicInteger(); + protected final RepositoryEntry repoEntry; private final BusinessGroup businessGroup; private final boolean isLastVisitVisible; private final boolean isAdministrativeUser; private final boolean chatEnabled; private final boolean globallyManaged; - private final UserManager userManager; - - private final BaseSecurity securityManager; - private final BaseSecurityModule securityModule; - private final RepositoryService repositoryService; - private final RepositoryManager repositoryManager; - private final BusinessGroupService businessGroupService; - private final BusinessGroupModule groupModule; - private final ACService acService; - private final InstantMessagingModule imModule; - private final InstantMessagingService imService; - private final UserSessionManager sessionManager; - - private final GroupMemberViewComparator memberViewComparator; - private static final CourseMembershipComparator MEMBERSHIP_COMPARATOR = new CourseMembershipComparator(); - + @Autowired + protected UserManager userManager; + @Autowired + protected BaseSecurity securityManager; + @Autowired + private BaseSecurityModule securityModule; + @Autowired + private RepositoryService repositoryService; + @Autowired + private RepositoryManager repositoryManager; + @Autowired + private BusinessGroupService businessGroupService; + @Autowired + private BusinessGroupModule groupModule; + @Autowired + private ACService acService; + @Autowired + private InstantMessagingModule imModule; + @Autowired + private InstantMessagingService imService; + @Autowired + private UserSessionManager sessionManager; + public AbstractMemberListController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry, - String page) { - this(ureq, wControl, repoEntry, null, page, Util.createPackageTranslator(AbstractMemberListController.class, ureq.getLocale())); + String page, TooledStackedPanel stackPanel) { + this(ureq, wControl, repoEntry, null, page, stackPanel, Util.createPackageTranslator(AbstractMemberListController.class, ureq.getLocale())); } public AbstractMemberListController(UserRequest ureq, WindowControl wControl, BusinessGroup group, - String page) { - this(ureq, wControl, null, group, page, Util.createPackageTranslator(AbstractMemberListController.class, ureq.getLocale())); + String page, TooledStackedPanel stackPanel) { + this(ureq, wControl, null, group, page, stackPanel, Util.createPackageTranslator(AbstractMemberListController.class, ureq.getLocale())); } protected AbstractMemberListController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry, BusinessGroup group, - String page, Translator translator) { - super(ureq, wControl, Util.createPackageTranslator(UserPropertyHandler.class, ureq.getLocale(), translator)); + String page, TooledStackedPanel stackPanel, Translator translator) { + super(ureq, wControl, page, Util.createPackageTranslator(UserPropertyHandler.class, ureq.getLocale(), translator)); this.businessGroup = group; this.repoEntry = repoEntry; - - userManager = CoreSpringFactory.getImpl(UserManager.class); - securityManager = CoreSpringFactory.getImpl(BaseSecurity.class); - securityModule = CoreSpringFactory.getImpl(BaseSecurityModule.class); - repositoryManager = CoreSpringFactory.getImpl(RepositoryManager.class); - repositoryService = CoreSpringFactory.getImpl(RepositoryService.class); - businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class); - groupModule = CoreSpringFactory.getImpl(BusinessGroupModule.class); - acService = CoreSpringFactory.getImpl(ACService.class); - imModule = CoreSpringFactory.getImpl(InstantMessagingModule.class); - imService = CoreSpringFactory.getImpl(InstantMessagingService.class); - sessionManager = CoreSpringFactory.getImpl(UserSessionManager.class); - memberViewComparator = new GroupMemberViewComparator(Collator.getInstance(getLocale())); + this.toolbarPanel = stackPanel; globallyManaged = calcGloballyManaged(); @@ -179,32 +199,31 @@ public abstract class AbstractMemberListController extends BasicController imple chatEnabled = imModule.isEnabled() && imModule.isPrivateEnabled(); isAdministrativeUser = securityModule.isUserAllowedAdminProps(roles); isLastVisitVisible = securityModule.isUserLastVisitVisible(roles); - mainVC = createVelocityContainer(page); - - //table - TableGuiConfiguration tableConfig = new TableGuiConfiguration(); - tableConfig.setPreferencesOffered(true, this.getClass().getSimpleName()); - tableConfig.setTableEmptyMessage(translate("nomembers")); + userPropertyHandlers = userManager.getUserPropertyHandlersFor(USER_PROPS_ID, isAdministrativeUser); - memberListCtr = new TableController(tableConfig, ureq, getWindowControl(), getTranslator(), true); - listenTo(memberListCtr); + initForm(ureq); + } + + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel(); + initColumns(columnsModel); + + memberListModel = new MemberListTableModel(columnsModel, imModule.isOnlineStatusEnabled()); + membersTable = uifactory.addTableElement(getWindowControl(), "memberList", memberListModel, 20, false, getTranslator(), formLayout); + membersTable.setMultiSelect(true); + membersTable.setEmtpyTableMessageKey("nomembers"); + membersTable.setAndLoadPersistedPreferences(ureq, this.getClass().getSimpleName()); + membersTable.setSearchEnabled(true); - userPropertyHandlers = userManager.getUserPropertyHandlersFor(USER_PROPS_ID, isAdministrativeUser); - initColumns(); - MemberListTableModel memberListModel = new MemberListTableModel(userPropertyHandlers); - memberListCtr.setTableDataModel(memberListModel); - memberListCtr.setMultiSelect(true); if(!globallyManaged) { - memberListCtr.addMultiSelectAction("edit.members", TABLE_ACTION_EDIT); + editButton = uifactory.addFormLink("edit.members", formLayout, Link.BUTTON); } - memberListCtr.addMultiSelectAction("table.header.mail", TABLE_ACTION_MAIL); + mailButton = uifactory.addFormLink("table.header.mail", formLayout, Link.BUTTON); if(!globallyManaged) { - memberListCtr.addMultiSelectAction("table.header.remove", TABLE_ACTION_REMOVE); + removeButton = uifactory.addFormLink("table.header.remove", formLayout, Link.BUTTON); } - - mainVC.put("memberList", memberListCtr.getInitialComponent()); - - putInitialPanel(mainVC); } private boolean calcGloballyManaged() { @@ -229,59 +248,49 @@ public abstract class AbstractMemberListController extends BasicController imple // } - protected void initColumns() { - int offset = Cols.values().length; + protected void initColumns(FlexiTableColumnModel columnsModel) { if(chatEnabled) { - memberListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.online.i18n(), Cols.online.ordinal(), TABLE_ACTION_IM, getLocale(), - ColumnDescriptor.ALIGNMENT_LEFT, new OnlineIconRenderer())); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.online.i18n(), Cols.online.ordinal())); } if(isAdministrativeUser) { - memberListCtr.addColumnDescriptor(new DefaultColumnDescriptor(Cols.username.i18n(), Cols.username.ordinal(), null, getLocale())); + FlexiCellRenderer renderer = new StaticFlexiCellRenderer(TABLE_ACTION_EDIT, new TextFlexiCellRenderer()); + columnsModel.addFlexiColumnModel(new StaticFlexiColumnModel(Cols.username.i18n(), Cols.username.ordinal(), TABLE_ACTION_EDIT, + true, Cols.username.name(), renderer)); } - int i=0; + + int colPos = USER_PROPS_OFFSET; for (UserPropertyHandler userPropertyHandler : userPropertyHandlers) { if (userPropertyHandler == null) continue; + + String propName = userPropertyHandler.getName(); boolean visible = UserManager.getInstance().isMandatoryUserProperty(USER_PROPS_ID , userPropertyHandler); - memberListCtr.addColumnDescriptor(visible, userPropertyHandler.getColumnDescriptor(i++ + offset, null, getLocale())); + if(visible) { + FlexiColumnModel col; + if(UserConstants.FIRSTNAME.equals(propName) + || UserConstants.LASTNAME.equals(propName)) { + col = new StaticFlexiColumnModel(userPropertyHandler.i18nColumnDescriptorLabelKey(), + colPos++, TABLE_ACTION_EDIT, true, propName, + new StaticFlexiCellRenderer(TABLE_ACTION_EDIT, new TextFlexiCellRenderer())); + } else { + col = new DefaultFlexiColumnModel(true, userPropertyHandler.i18nColumnDescriptorLabelKey(), colPos++, true, propName); + } + columnsModel.addFlexiColumnModel(col); + } } - - memberListCtr.addColumnDescriptor(new DefaultColumnDescriptor(Cols.firstTime.i18n(), Cols.firstTime.ordinal(), null, getLocale())); + + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.firstTime.i18n(), Cols.firstTime.ordinal(), true, Cols.firstTime.name())); if(isLastVisitVisible) { - memberListCtr.addColumnDescriptor(new DefaultColumnDescriptor(Cols.lastTime.i18n(), Cols.lastTime.ordinal(), null, getLocale())); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.lastTime.i18n(), Cols.lastTime.ordinal(), true, Cols.lastTime.name())); } - CustomCellRenderer roleRenderer = new CourseRoleCellRenderer(getLocale()); - memberListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.role.i18n(), Cols.role.ordinal(), null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, roleRenderer) { - @Override - public int compareTo(final int rowa, final int rowb) { - Object a = table.getTableDataModel().getValueAt(rowa,dataColumn); - Object b = table.getTableDataModel().getValueAt(rowb,dataColumn); - if(a instanceof CourseMembership && b instanceof CourseMembership) { - return MEMBERSHIP_COMPARATOR.compare((CourseMembership)a, (CourseMembership)b); - } - return super.compareTo(rowa, rowb); - } - }); + CourseRoleCellRenderer roleRenderer = new CourseRoleCellRenderer(getLocale()); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.role.i18n(), Cols.role.ordinal(), true, Cols.role.name(), roleRenderer)); if(repoEntry != null) { - CustomCellRenderer groupRenderer = new GroupCellRenderer(); - memberListCtr.addColumnDescriptor(new CustomRenderColumnDescriptor(Cols.groups.i18n(), Cols.groups.ordinal(), null, getLocale(), ColumnDescriptor.ALIGNMENT_LEFT, groupRenderer) { - @Override - public int compareTo(final int rowa, final int rowb) { - Object a = table.getTableDataModel().getValueAt(rowa,dataColumn); - Object b = table.getTableDataModel().getValueAt(rowb,dataColumn); - if(a instanceof MemberView && b instanceof MemberView) { - return memberViewComparator.compare((MemberView)a, (MemberView)b); - } - return super.compareTo(rowa, rowb); - } - }); + GroupCellRenderer groupRenderer = new GroupCellRenderer(); + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.groups.i18n(), Cols.groups.ordinal(), true, Cols.groups.name(), groupRenderer)); } - memberListCtr.addColumnDescriptor(new GraduateColumnDescriptor("table.header.graduate", TABLE_ACTION_GRADUATE, getTranslator())); - memberListCtr.addColumnDescriptor(new StaticColumnDescriptor(TABLE_ACTION_EDIT, "table.header.edit", translate("table.header.edit"))); - if(!globallyManaged) { - memberListCtr.addColumnDescriptor(new LeaveColumnDescriptor("table.header.remove", TABLE_ACTION_REMOVE, getTranslator())); - } + columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(Cols.tools.i18n(), Cols.tools.ordinal())); } @Override @@ -290,42 +299,73 @@ public abstract class AbstractMemberListController extends BasicController imple } @Override - protected void event(UserRequest ureq, Component source, Event event) { + protected void formOK(UserRequest ureq) { // } @Override - protected void event(UserRequest ureq, Controller source, Event event) { - if (source == memberListCtr) { - if (event.getCommand().equals(Table.COMMANDLINK_ROWACTION_CLICKED)) { - TableEvent te = (TableEvent) event; - String actionid = te.getActionId(); - - MemberView member = (MemberView)memberListCtr.getTableDataModel().getObject(te.getRowId()); - if(TABLE_ACTION_EDIT.equals(actionid)) { - openEdit(ureq, member); - } else if(TABLE_ACTION_REMOVE.equals(actionid)) { - confirmDelete(ureq, Collections.singletonList(member)); - } else if(TABLE_ACTION_GRADUATE.equals(actionid)) { - doGraduate(Collections.singletonList(member)); - } else if(TABLE_ACTION_IM.equals(actionid)) { - doIm(ureq, member); + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if(source == membersTable) { + if(event instanceof SelectionEvent) { + SelectionEvent se = (SelectionEvent)event; + String cmd = se.getCommand(); + MemberView row = memberListModel.getObject(se.getIndex()); + if(TABLE_ACTION_IM.equals(cmd)) { + doIm(ureq, row); + } else if(TABLE_ACTION_EDIT.equals(cmd)) { + openEdit(ureq, row); } - } else if (event instanceof TableMultiSelectEvent) { - TableMultiSelectEvent te = (TableMultiSelectEvent)event; - @SuppressWarnings("unchecked") - List<MemberView> selectedItems = memberListCtr.getObjects(te.getSelection()); - if(TABLE_ACTION_REMOVE.equals(te.getAction())) { - confirmDelete(ureq, selectedItems); - } else if(TABLE_ACTION_EDIT.equals(te.getAction())) { - openEdit(ureq, selectedItems); - } else if(TABLE_ACTION_MAIL.equals(te.getAction())) { - doSendMail(ureq, selectedItems); - } else if(TABLE_ACTION_GRADUATE.equals(te.getAction())) { - doGraduate(selectedItems); + } else if(event instanceof FlexiTableSearchEvent) { + if(FlexiTableSearchEvent.SEARCH.equals(event.getCommand())) { + FlexiTableSearchEvent se = (FlexiTableSearchEvent)event; + String search = se.getSearch(); + doSearch(search); + } else if(FlexiTableSearchEvent.RESET.equals(event.getCommand())) { + doResetSearch(); + } + } + } else if(editButton == source) { + List<MemberView> selectedItems = getMultiSelectedRows(); + openEdit(ureq, selectedItems); + } else if(mailButton == source) { + List<MemberView> selectedItems = getMultiSelectedRows(); + doSendMail(ureq, selectedItems); + } else if(removeButton == source) { + List<MemberView> selectedItems = getMultiSelectedRows(); + confirmDelete(ureq, selectedItems); + } else if(source instanceof FormLink) { + FormLink link = (FormLink)source; + String cmd = link.getCmd(); + if("tools".equals(cmd)) { + MemberView row = (MemberView)link.getUserObject(); + doOpenTools(ureq, row, link); + } else if("im".equals(cmd)) { + MemberView row = (MemberView)link.getUserObject(); + doIm(ureq, row); + } + } + super.formInnerEvent(ureq, source, event); + } + + private List<MemberView> getMultiSelectedRows() { + Set<Integer> selections = membersTable.getMultiSelectedIndex(); + List<MemberView> rows = new ArrayList<>(selections.size()); + if(selections.isEmpty()) { + //do nothing + } else { + for(Integer i:selections) { + MemberView row = memberListModel.getObject(i.intValue()); + if(row != null) { + rows.add(row); } } - } else if (source == leaveDialogBox) { + } + return rows; + } + + @Override + protected void event(UserRequest ureq, Controller source, Event event) { + if (source == leaveDialogBox) { if (Event.DONE_EVENT == event) { List<Identity> members = leaveDialogBox.getIdentities(); doLeave(members, leaveDialogBox.isSendMail()); @@ -341,6 +381,7 @@ public abstract class AbstractMemberListController extends BasicController imple } } else if(source == editSingleMemberCtrl) { cmc.deactivate(); + cleanUpPopups(); if(event instanceof MemberPermissionChangeEvent) { MemberPermissionChangeEvent e = (MemberPermissionChangeEvent)event; doConfirmChangePermission(ureq, e, null); @@ -357,6 +398,11 @@ public abstract class AbstractMemberListController extends BasicController imple } else if (source == contactCtrl) { cmc.deactivate(); cleanUpPopups(); + } else if(toolsCtrl == source) { + if(event == Event.DONE_EVENT) { + toolsCalloutCtrl.deactivate(); + cleanUpPopups(); + } } else if (source == cmc) { cleanUpPopups(); } @@ -406,8 +452,10 @@ public abstract class AbstractMemberListController extends BasicController imple } protected void openEdit(UserRequest ureq, MemberView member) { + if(editSingleMemberCtrl != null) return; + Identity identity = securityManager.loadIdentityByKey(member.getIdentityKey()); - editSingleMemberCtrl = new EditSingleMembershipController(ureq, getWindowControl(), identity, repoEntry, businessGroup); + editSingleMemberCtrl = new EditSingleMembershipController(ureq, getWindowControl(), identity, repoEntry, businessGroup, false); listenTo(editSingleMemberCtrl); cmc = new CloseableModalController(getWindowControl(), translate("close"), editSingleMemberCtrl.getInitialComponent(), true, translate("edit.member")); @@ -426,6 +474,29 @@ public abstract class AbstractMemberListController extends BasicController imple listenTo(cmc); } + protected void doSearch(String search) { + getSearchParams().setSearchString(search); + reloadModel(); + } + + protected void doResetSearch() { + getSearchParams().setSearchString(null); + reloadModel(); + } + + private void doOpenTools(UserRequest ureq, MemberView row, FormLink link) { + removeAsListenerAndDispose(toolsCtrl); + removeAsListenerAndDispose(toolsCalloutCtrl); + + toolsCtrl = new ToolsController(ureq, getWindowControl(), row); + listenTo(toolsCtrl); + + toolsCalloutCtrl = new CloseableCalloutWindowController(ureq, getWindowControl(), + toolsCtrl.getInitialComponent(), link.getFormDispatchId(), "", true, ""); + listenTo(toolsCalloutCtrl); + toolsCalloutCtrl.activate(); + } + /** * Open private chat * @param ureq @@ -561,6 +632,37 @@ public abstract class AbstractMemberListController extends BasicController imple reloadModel(); } + protected void doOpenVisitingCard(UserRequest ureq, MemberView member) { + removeAsListenerAndDispose(visitingCardCtrl); + Identity choosenIdentity = securityManager.loadIdentityByKey(member.getIdentityKey()); + visitingCardCtrl = new UserInfoMainController(ureq, getWindowControl(), choosenIdentity, false, false); + listenTo(visitingCardCtrl); + + String fullname = userManager.getUserDisplayName(choosenIdentity); + toolbarPanel.pushController(fullname, visitingCardCtrl); + } + + protected void doOpenContact(UserRequest ureq, MemberView member) { + removeAsListenerAndDispose(contactCtrl); + + Identity choosenIdentity = securityManager.loadIdentityByKey(member.getIdentityKey()); + String fullname = userManager.getUserDisplayName(choosenIdentity); + + ContactMessage cmsg = new ContactMessage(ureq.getIdentity()); + ContactList emailList = new ContactList(fullname); + emailList.add(choosenIdentity); + cmsg.addEmailTo(emailList); + + OLATResourceable ores = OresHelper.createOLATResourceableType("Contact"); + WindowControl bwControl = addToHistory(ureq, ores, null); + contactCtrl = new ContactFormController(ureq, bwControl, true, false, false, cmsg); + listenTo(contactCtrl); + + toolbarPanel.pushController(fullname, contactCtrl); + } + + protected abstract void doOpenAssessmentTool(UserRequest ureq, MemberView member); + protected List<Long> getMemberKeys(List<MemberView> members) { List<Long> keys = new ArrayList<Long>(members.size()); if(members != null && !members.isEmpty()) { @@ -613,14 +715,24 @@ public abstract class AbstractMemberListController extends BasicController imple List<Identity> identities; if(identityKeys.isEmpty()) { identities = new ArrayList<Identity>(0); - } else { + } else { SearchIdentityParams idParams = new SearchIdentityParams(); - - if(params.getUserPropertiesSearch() != null && !params.getUserPropertiesSearch().isEmpty()) { - idParams.setUserProperties(params.getUserPropertiesSearch()); - } - if(StringHelper.containsNonWhitespace(params.getLogin())) { - idParams.setLogin(params.getLogin()); + if(StringHelper.containsNonWhitespace(params.getSearchString())) { + String searchString = params.getSearchString(); + + Map<String,String> propertiesSearch = new HashMap<>(); + for(UserPropertyHandler handler:userPropertyHandlers) { + propertiesSearch.put(handler.getName(), searchString); + } + idParams.setLogin(searchString); + idParams.setUserProperties(propertiesSearch); + } else { + if(params.getUserPropertiesSearch() != null && !params.getUserPropertiesSearch().isEmpty()) { + idParams.setUserProperties(params.getUserPropertiesSearch()); + } + if(StringHelper.containsNonWhitespace(params.getLogin())) { + idParams.setLogin(params.getLogin()); + } } List<Long> identityKeyList = new ArrayList<>(identityKeys); @@ -658,11 +770,11 @@ public abstract class AbstractMemberListController extends BasicController imple MemberView member = new MemberView(identity, userPropertyHandlers, locale); member.getMembership().setPending(true); memberList.add(member); + forgeLinks(member); keyToMemberMap.put(identity.getKey(), member); } } - Long me = getIdentity().getKey(); Set<Long> loadStatus = new HashSet<Long>(); for(Identity identity:identities) { @@ -677,6 +789,7 @@ public abstract class AbstractMemberListController extends BasicController imple } } memberList.add(member); + forgeLinks(member); keyToMemberMap.put(identity.getKey(), member); } @@ -738,14 +851,29 @@ public abstract class AbstractMemberListController extends BasicController imple //the order of the filter is important filterByRoles(memberList, params); filterByOrigin(memberList, params); - ((MemberListTableModel)memberListCtr.getTableDataModel()).setObjects(memberList); - memberListCtr.modelChanged(); + + memberListModel.setObjects(memberList); + membersTable.reset(); return memberList; } + protected void forgeLinks(MemberView row) { + FormLink toolsLink = uifactory.addFormLink("tools_" + counter.incrementAndGet(), "tools", "", null, null, Link.NONTRANSLATED); + toolsLink.setIconLeftCSS("o_icon o_icon_actions o_icon-lg"); + toolsLink.setTitle(translate("tools")); + toolsLink.setUserObject(row); + row.setToolsLink(toolsLink); + + FormLink chatLink = uifactory.addFormLink("tools_" + counter.incrementAndGet(), "im", "", null, null, Link.NONTRANSLATED); + chatLink.setIconLeftCSS("o_icon o_icon_status_unavailable"); + chatLink.setTitle(" "); + chatLink.setUserObject(row); + row.setChatLink(chatLink); + } + private void filterByOrigin(List<MemberView> memberList, SearchMembersParams params) { if(params.isGroupOrigin() && params.isRepoOrigin()) { - //do ntohing not very useful :-) + //do nothing not very useful :-) } else if(params.isGroupOrigin()) { for(Iterator<MemberView> it=memberList.iterator(); it.hasNext(); ) { CourseMembership m = it.next().getMembership(); @@ -849,4 +977,77 @@ public abstract class AbstractMemberListController extends BasicController imple return e; } } + + private class ToolsController extends BasicController { + + private final MemberView row; + + private final VelocityContainer mainVC; + + public ToolsController(UserRequest ureq, WindowControl wControl, MemberView row) { + super(ureq, wControl); + this.row = row; + + mainVC = createVelocityContainer("tools"); + List<String> links = new ArrayList<>(); + + //links + addLink("home", TABLE_ACTION_HOME, "o_icon o_icon_home", links); + addLink("contact", TABLE_ACTION_CONTACT, "o_icon o_icon_mail", links); + if(repoEntry != null && "CourseModule".equals(repoEntry.getOlatResource().getResourceableTypeName())) { + addLink("assessment", TABLE_ACTION_ASSESSMENT, "o_icon o_icon_certificate", links); + } + + links.add("-"); + + if(row.getMembership().isGroupWaiting()) { + addLink("table.header.graduate", TABLE_ACTION_GRADUATE, "o_icon o_icon_graduate", links); + } + + addLink("edit.member", TABLE_ACTION_EDIT, "o_icon o_icon_edit", links); + + if(!globallyManaged) { + addLink("table.header.remove", TABLE_ACTION_REMOVE, "o_icon o_icon_remove", links); + } + + mainVC.contextPut("links", links); + putInitialPanel(mainVC); + } + + private void addLink(String name, String cmd, String iconCSS, List<String> links) { + Link link = LinkFactory.createLink(name, cmd, getTranslator(), mainVC, this, Link.LINK); + if(iconCSS != null) { + link.setIconLeftCSS(iconCSS); + } + mainVC.put(name, link); + links.add(name); + } + + @Override + protected void doDispose() { + // + } + + @Override + protected void event(UserRequest ureq, Component source, Event event) { + fireEvent(ureq, Event.DONE_EVENT); + if(source instanceof Link) { + Link link = (Link)source; + String cmd = link.getCommand(); + if(TABLE_ACTION_GRADUATE.equals(cmd)) { + doGraduate(Collections.singletonList(row)); + } else if(TABLE_ACTION_EDIT.equals(cmd)) { + openEdit(ureq, row); + } else if(TABLE_ACTION_REMOVE.equals(cmd)) { + confirmDelete(ureq, Collections.singletonList(row)); + } else if(TABLE_ACTION_HOME.equals(cmd)) { + doOpenVisitingCard(ureq, row); + } else if(TABLE_ACTION_CONTACT.equals(cmd)) { + doOpenContact(ureq, row); + } else if(TABLE_ACTION_ASSESSMENT.equals(cmd)) { + doOpenAssessmentTool(ureq, row); + } + } + } + } } diff --git a/src/main/java/org/olat/group/ui/main/CourseRoleCellRenderer.java b/src/main/java/org/olat/group/ui/main/CourseRoleCellRenderer.java index b1557bd1762..d94a565272b 100644 --- a/src/main/java/org/olat/group/ui/main/CourseRoleCellRenderer.java +++ b/src/main/java/org/olat/group/ui/main/CourseRoleCellRenderer.java @@ -21,9 +21,12 @@ package org.olat.group.ui.main; import java.util.Locale; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent; import org.olat.core.gui.components.table.CustomCellRenderer; import org.olat.core.gui.render.Renderer; import org.olat.core.gui.render.StringOutput; +import org.olat.core.gui.render.URLBuilder; import org.olat.core.gui.translator.Translator; import org.olat.core.util.Util; @@ -31,48 +34,58 @@ import org.olat.core.util.Util; * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ -public class CourseRoleCellRenderer implements CustomCellRenderer { +public class CourseRoleCellRenderer implements CustomCellRenderer, FlexiCellRenderer { private final Translator translator; public CourseRoleCellRenderer(Locale locale) { translator = Util.createPackageTranslator(CourseRoleCellRenderer.class, locale); } + + @Override + public void render(Renderer renderer, StringOutput target, Object cellValue, int row, + FlexiTableComponent source, URLBuilder ubu, Translator translator) { + if (cellValue instanceof CourseMembership) { + render(target, (CourseMembership) cellValue); + } + } @Override public void render(StringOutput sb, Renderer renderer, Object val, Locale locale, int alignment, String action) { if (val instanceof CourseMembership) { - CourseMembership membership = (CourseMembership)val; - - boolean and = false; - if(membership.isOwner()) { - and = and(sb, and); - sb.append(translator.translate("role.repo.owner")); - } - if(membership.isRepoTutor()) { - and = and(sb, and); - sb.append(translator.translate("role.repo.tutor")); - } - if(membership.isGroupTutor()) { - and = and(sb, and); - sb.append(translator.translate("role.group.tutor")); - } - if(membership.isRepoParticipant()) { - and = and(sb, and); - sb.append(translator.translate("role.repo.participant")); - } - if(membership.isGroupParticipant()) { - and = and(sb, and); - sb.append(translator.translate("role.group.participant")); - } - if(membership.isWaiting()) { - and = and(sb, and); - sb.append(translator.translate("role.group.waiting")); - } - if(membership.isPending()) { - and = and(sb, and); - sb.append(translator.translate("role.pending")); - } + render(sb, (CourseMembership) val); + } + } + + private void render(StringOutput sb, CourseMembership membership) { + boolean and = false; + if(membership.isOwner()) { + and = and(sb, and); + sb.append(translator.translate("role.repo.owner")); + } + if(membership.isRepoTutor()) { + and = and(sb, and); + sb.append(translator.translate("role.repo.tutor")); + } + if(membership.isGroupTutor()) { + and = and(sb, and); + sb.append(translator.translate("role.group.tutor")); + } + if(membership.isRepoParticipant()) { + and = and(sb, and); + sb.append(translator.translate("role.repo.participant")); + } + if(membership.isGroupParticipant()) { + and = and(sb, and); + sb.append(translator.translate("role.group.participant")); + } + if(membership.isWaiting()) { + and = and(sb, and); + sb.append(translator.translate("role.group.waiting")); + } + if(membership.isPending()) { + and = and(sb, and); + sb.append(translator.translate("role.pending")); } } diff --git a/src/main/java/org/olat/group/ui/main/EditSingleMembershipController.java b/src/main/java/org/olat/group/ui/main/EditSingleMembershipController.java index fd44590f0b9..ceaa72e52e7 100644 --- a/src/main/java/org/olat/group/ui/main/EditSingleMembershipController.java +++ b/src/main/java/org/olat/group/ui/main/EditSingleMembershipController.java @@ -44,13 +44,13 @@ public class EditSingleMembershipController extends BasicController { private final RepositoryEntry repoEntry; public EditSingleMembershipController(UserRequest ureq, WindowControl wControl, Identity identity, - RepositoryEntry repoEntry, BusinessGroup group) { + RepositoryEntry repoEntry, BusinessGroup group, boolean withUserLinks) { super(ureq, wControl); this.repoEntry = repoEntry; VelocityContainer mainVC = createVelocityContainer("edit_single_member"); - infoCtrl = new MemberInfoController(ureq, wControl, identity, repoEntry); + infoCtrl = new MemberInfoController(ureq, wControl, identity, repoEntry, withUserLinks); listenTo(infoCtrl); mainVC.put("infos", infoCtrl.getInitialComponent()); diff --git a/src/main/java/org/olat/group/ui/main/GroupCellRenderer.java b/src/main/java/org/olat/group/ui/main/GroupCellRenderer.java index d347313672e..ff004d30fd7 100644 --- a/src/main/java/org/olat/group/ui/main/GroupCellRenderer.java +++ b/src/main/java/org/olat/group/ui/main/GroupCellRenderer.java @@ -22,9 +22,13 @@ package org.olat.group.ui.main; import java.util.List; import java.util.Locale; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent; import org.olat.core.gui.components.table.CustomCellRenderer; import org.olat.core.gui.render.Renderer; import org.olat.core.gui.render.StringOutput; +import org.olat.core.gui.render.URLBuilder; +import org.olat.core.gui.translator.Translator; import org.olat.core.util.StringHelper; import org.olat.group.BusinessGroupShort; @@ -32,22 +36,33 @@ import org.olat.group.BusinessGroupShort; * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ -public class GroupCellRenderer implements CustomCellRenderer { +public class GroupCellRenderer implements CustomCellRenderer, FlexiCellRenderer { + + @Override + public void render(Renderer renderer, StringOutput target, Object cellValue, int row, + FlexiTableComponent source, URLBuilder ubu, Translator translator) { + if (cellValue instanceof MemberView) { + render(target, (MemberView) cellValue); + } + } @Override public void render(StringOutput sb, Renderer renderer, Object val, Locale locale, int alignment, String action) { if (val instanceof MemberView) { - MemberView member = (MemberView)val; - List<BusinessGroupShort> groups = member.getGroups(); - if(groups != null && !groups.isEmpty()) { - boolean and = false; - for(BusinessGroupShort group:groups) { - and = and(sb, and); - if(group.getName() == null) { - sb.append(group.getKey()); - } else { - sb.append(StringHelper.escapeHtml(group.getName())); - } + render(sb, (MemberView) val); + } + } + + private void render(StringOutput sb, MemberView member) { + List<BusinessGroupShort> groups = member.getGroups(); + if(groups != null && !groups.isEmpty()) { + boolean and = false; + for(BusinessGroupShort group:groups) { + and = and(sb, and); + if(group.getName() == null) { + sb.append(group.getKey()); + } else { + sb.append(StringHelper.escapeHtml(group.getName())); } } } diff --git a/src/main/java/org/olat/group/ui/main/MemberInfoController.java b/src/main/java/org/olat/group/ui/main/MemberInfoController.java index ed970b8587e..e37cbd8643a 100644 --- a/src/main/java/org/olat/group/ui/main/MemberInfoController.java +++ b/src/main/java/org/olat/group/ui/main/MemberInfoController.java @@ -60,6 +60,8 @@ public class MemberInfoController extends FormBasicController { private Long repoEntryKey; private UserCourseInformations courseInfos; + private final boolean withLinks; + @Autowired private UserManager userManager; @Autowired @@ -68,11 +70,12 @@ public class MemberInfoController extends FormBasicController { private UserCourseInformationsManager userCourseInfosMgr; public MemberInfoController(UserRequest ureq, WindowControl wControl, Identity identity, - RepositoryEntry repoEntry) { + RepositoryEntry repoEntry, boolean withLinks) { super(ureq, wControl, "info_member"); setTranslator(Util.createPackageTranslator(UserPropertyHandler.class, ureq.getLocale(), getTranslator())); this.identity = identity; + this.withLinks = withLinks; if(repoEntry != null){ repoEntryKey = repoEntry.getKey(); @@ -132,17 +135,19 @@ public class MemberInfoController extends FormBasicController { } //links - homeLink = uifactory.addFormLink("home", formLayout, Link.BUTTON); - homeLink.setIconLeftCSS("o_icon o_icon_home"); - formLayout.add("home", homeLink); - contactLink = uifactory.addFormLink("contact", formLayout, Link.BUTTON); - contactLink.setIconLeftCSS("o_icon o_icon_mail"); - formLayout.add("contact", contactLink); - - if(repoEntryKey != null) { - assessmentLink = uifactory.addFormLink("assessment", formLayout, Link.BUTTON); - assessmentLink.setIconLeftCSS("o_icon o_icon_certificate"); - formLayout.add("assessment", assessmentLink); + if(withLinks) { + homeLink = uifactory.addFormLink("home", formLayout, Link.BUTTON); + homeLink.setIconLeftCSS("o_icon o_icon_home"); + formLayout.add("home", homeLink); + contactLink = uifactory.addFormLink("contact", formLayout, Link.BUTTON); + contactLink.setIconLeftCSS("o_icon o_icon_mail"); + formLayout.add("contact", contactLink); + + if(repoEntryKey != null) { + assessmentLink = uifactory.addFormLink("assessment", formLayout, Link.BUTTON); + assessmentLink.setIconLeftCSS("o_icon o_icon_certificate"); + formLayout.add("assessment", assessmentLink); + } } } diff --git a/src/main/java/org/olat/group/ui/main/MemberListTableModel.java b/src/main/java/org/olat/group/ui/main/MemberListTableModel.java index 7bd2def0348..8471a9cc7a8 100644 --- a/src/main/java/org/olat/group/ui/main/MemberListTableModel.java +++ b/src/main/java/org/olat/group/ui/main/MemberListTableModel.java @@ -19,50 +19,87 @@ */ package org.olat.group.ui.main; -import java.util.Collections; import java.util.List; -import org.olat.core.gui.components.table.DefaultTableDataModel; -import org.olat.user.propertyhandlers.UserPropertyHandler; +import org.olat.core.commons.persistence.SortKey; +import org.olat.core.gui.components.form.flexible.elements.FormLink; +import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableDataModel; +import org.olat.instantMessaging.model.Presence; /** * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ -public class MemberListTableModel extends DefaultTableDataModel<MemberView> { +public class MemberListTableModel extends DefaultFlexiTableDataModel<MemberView> implements SortableFlexiTableDataModel<MemberView> { - private final List<UserPropertyHandler> userPropertyHandlers; + private final boolean onlineStatusEnabled; - public MemberListTableModel(List<UserPropertyHandler> userPropertyHandlers) { - super(Collections.<MemberView>emptyList()); - this.userPropertyHandlers = userPropertyHandlers; + public MemberListTableModel(FlexiTableColumnModel columnModel, boolean onlineStatusEnabled) { + super(columnModel); + this.onlineStatusEnabled = onlineStatusEnabled; } @Override - public int getColumnCount() { - return 4 + userPropertyHandlers.size(); + public void sort(SortKey orderBy) { + if(orderBy != null) { + List<MemberView> views = new MemberListTableSort(orderBy, this, null).sort(); + super.setObjects(views); + } } @Override public Object getValueAt(int row, int col) { MemberView member = getObject(row); - switch(col) { - case 0:return member.getIdentityName(); - case 1: return member.getFirstTime(); - case 2: return member.getLastTime(); - case 3: return member.getMembership(); - case 4: return member; - case 5:return member.getOnlineStatus(); - default: { - int propPos = col - Cols.values().length; - return member.getIdentityProp(propPos); + return getValueAt(member, col); + } + + @Override + public Object getValueAt(MemberView row, int col) { + if(col >= 0 && col < Cols.values().length) { + switch(Cols.values()[col]) { + case username: return row.getIdentityName(); + case firstTime: return row.getFirstTime(); + case lastTime: return row.getLastTime(); + case role: return row.getMembership(); + case groups: return row; + case online: { + FormLink chatLink = row.getChatLink(); + if(chatLink != null) { + String onlineStatus = row.getOnlineStatus(); + if ("me".equals(onlineStatus)) { + //no icon + } else if (!onlineStatusEnabled) { + // don't show the users status when not configured, only an icon to start a chat/message + chatLink.setIconLeftCSS("o_icon o_icon_status_chat"); + } + // standard case: available or unavailable (offline or dnd) + else if(Presence.available.name().equals(onlineStatus)) { + chatLink.setIconLeftCSS("o_icon o_icon_status_available"); + } else if(Presence.dnd.name().equals(onlineStatus)) { + chatLink.setIconLeftCSS("o_icon o_icon_status_dnd"); + } else { + chatLink.setIconLeftCSS("o_icon o_icon_status_unavailable"); + } + if(chatLink.getComponent() != null) { + chatLink.getComponent().setDirty(false); + } + } + return chatLink; + } + case tools: return row.getToolsLink(); + default: return "ERROR"; } } + + int propPos = col - AbstractMemberListController.USER_PROPS_OFFSET; + return row.getIdentityProp(propPos); } @Override - public Object createCopyWithEmptyList() { - return new MemberListTableModel(userPropertyHandlers); + public MemberListTableModel createCopyWithEmptyList() { + return new MemberListTableModel(getTableColumnModel(), onlineStatusEnabled); } public enum Cols { @@ -71,7 +108,8 @@ public class MemberListTableModel extends DefaultTableDataModel<MemberView> { lastTime("table.header.lastTime"), role("table.header.role"), groups("table.header.groups"), - online("table.header.online"); + online("table.header.online"), + tools("tools"); private final String i18n; diff --git a/src/main/java/org/olat/group/ui/main/MemberListTableSort.java b/src/main/java/org/olat/group/ui/main/MemberListTableSort.java new file mode 100644 index 00000000000..4ef5dc89e5a --- /dev/null +++ b/src/main/java/org/olat/group/ui/main/MemberListTableSort.java @@ -0,0 +1,53 @@ +package org.olat.group.ui.main; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Locale; + +import org.olat.core.commons.persistence.SortKey; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableDataModel; +import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate; +import org.olat.group.ui.main.MemberListTableModel.Cols; + +/** + * + * Initial date: 18.05.2015<br> + * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com + * + */ +public class MemberListTableSort extends SortableFlexiTableModelDelegate<MemberView> { + + + + public MemberListTableSort(SortKey orderBy, SortableFlexiTableDataModel<MemberView> tableModel, Locale locale) { + super(orderBy, tableModel, locale); + } + + @Override + protected void sort(List<MemberView> rows) { + int columnIndex = getColumnIndex(); + Cols column = Cols.values()[columnIndex]; + switch(column) { + case role: + Collections.sort(rows, new RoleMemberViewComparator()); + break; + case groups: + Collections.sort(rows, new GroupMemberViewComparator(getCollator())); + break; + default: { + super.sort(rows); + } + } + } + + private static class RoleMemberViewComparator implements Comparator<MemberView> { + + private final CourseMembershipComparator comparator = new CourseMembershipComparator(); + + @Override + public int compare(MemberView o1, MemberView o2) { + return comparator.compare(o1.getMembership(), o2.getMembership()); + } + } +} diff --git a/src/main/java/org/olat/group/ui/main/MemberView.java b/src/main/java/org/olat/group/ui/main/MemberView.java index 4f1da69392c..e7fdf035b58 100644 --- a/src/main/java/org/olat/group/ui/main/MemberView.java +++ b/src/main/java/org/olat/group/ui/main/MemberView.java @@ -24,46 +24,44 @@ import java.util.Date; import java.util.List; import java.util.Locale; +import org.olat.core.gui.components.form.flexible.elements.FormLink; import org.olat.core.id.Identity; import org.olat.group.BusinessGroupManagedFlag; import org.olat.group.BusinessGroupShort; +import org.olat.user.UserPropertiesRow; import org.olat.user.propertyhandlers.UserPropertyHandler; /** * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ -public class MemberView { +public class MemberView extends UserPropertiesRow { - private final Long identityKey; - private final String identityName; - private final String[] identityProps; private Date firstTime; private Date lastTime; private final CourseMembership membership = new CourseMembership(); private List<BusinessGroupShort> groups; private String onlineStatus; + private FormLink toolsLink, chatLink; public MemberView(Identity identity, List<UserPropertyHandler> userPropertyHandlers, Locale locale) { - this.identityKey = identity.getKey(); - this.identityName = identity.getName(); - - identityProps = new String[userPropertyHandlers.size()]; - for(int i=userPropertyHandlers.size(); i-->0; ) { - identityProps[i] = userPropertyHandlers.get(i).getUserProperty(identity.getUser(), locale); - } + super(identity, userPropertyHandlers, locale); } - public Long getIdentityKey() { - return identityKey; + public FormLink getToolsLink() { + return toolsLink; } - public String getIdentityName() { - return identityName; + public void setToolsLink(FormLink toolsLink) { + this.toolsLink = toolsLink; } - - public String getIdentityProp(int index) { - return identityProps[index]; + + public FormLink getChatLink() { + return chatLink; + } + + public void setChatLink(FormLink chatLink) { + this.chatLink = chatLink; } public String getOnlineStatus() { diff --git a/src/main/java/org/olat/group/ui/main/SearchMembersParams.java b/src/main/java/org/olat/group/ui/main/SearchMembersParams.java index b02d84acad4..e6cbeb9fe05 100644 --- a/src/main/java/org/olat/group/ui/main/SearchMembersParams.java +++ b/src/main/java/org/olat/group/ui/main/SearchMembersParams.java @@ -42,6 +42,7 @@ public class SearchMembersParams extends Event { private boolean groupOrigin = true; private String login; + private String searchString; private Map<String, String> userPropertiesSearch; public SearchMembersParams() { @@ -141,6 +142,14 @@ public class SearchMembersParams extends Event { this.login = login; } + public String getSearchString() { + return searchString; + } + + public void setSearchString(String searchString) { + this.searchString = searchString; + } + public Map<String, String> getUserPropertiesSearch() { return userPropertiesSearch; } diff --git a/src/main/java/org/olat/group/ui/main/_content/edit_member.html b/src/main/java/org/olat/group/ui/main/_content/edit_member.html index 2bde8eae942..e1ae7b03c7f 100644 --- a/src/main/java/org/olat/group/ui/main/_content/edit_member.html +++ b/src/main/java/org/olat/group/ui/main/_content/edit_member.html @@ -11,5 +11,5 @@ </fieldset> #end #if($r.available("buttonLayout")) - $r.render("buttonLayout") + <div class="o_button_group">$r.render("buttonLayout")</div> #end \ No newline at end of file diff --git a/src/main/java/org/olat/group/ui/main/_content/info_member.html b/src/main/java/org/olat/group/ui/main/_content/info_member.html index 65976bd4777..83eb98753fa 100644 --- a/src/main/java/org/olat/group/ui/main/_content/info_member.html +++ b/src/main/java/org/olat/group/ui/main/_content/info_member.html @@ -1,12 +1,18 @@ <div class="o_header_with_buttons"> <h3>$fullname</h3> + #if($r.available("home") || $r.available("contact") || $r.available("assessment")) <div class="o_button_group o_button_group_right"> - $r.render("home") - $r.render("contact") + #if($r.available("home")) + $r.render("home") + #end + #if($r.available("contact")) + $r.render("contact") + #end #if($r.available("assessment")) $r.render("assessment") #end </div> + #end </div> <div class="o_user_infos"> <div class="o_user_portrait">$r.render("image")</div> diff --git a/src/main/java/org/olat/group/ui/main/_content/tools.html b/src/main/java/org/olat/group/ui/main/_content/tools.html new file mode 100644 index 00000000000..ee364a66e11 --- /dev/null +++ b/src/main/java/org/olat/group/ui/main/_content/tools.html @@ -0,0 +1,9 @@ +<ul class="o_dropdown list-unstyled"> +#foreach($link in $links) + #if($link == "-") + <li class="divider"></li> + #else + <li>$r.render($link)</li> + #end +#end +</ul> \ No newline at end of file diff --git a/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_de.properties index c62240ca633..7c2a25eef40 100644 --- a/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_de.properties @@ -72,6 +72,7 @@ search.resources=In Kursen verwendet search.headless=Orphans search.headless.check=Gruppen ohne Mitglieder und Ressourcen search.id.format=Keine g\u00FCltige Gruppen-ID +tools=<i class="o_icon o_icon_actions o_icon-lg"> </i> cif.displayname=Name cif.description=Beschreibung cif.owner=Betreuer diff --git a/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_en.properties index add1eb7445f..832370e7cca 100644 --- a/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/group/ui/main/_i18n/LocalStrings_en.properties @@ -167,6 +167,7 @@ table.leave=Leave table.merge=Merge table.users.management=Manage members tbl_graduate=$\:table.header.graduate +tools=<i class="o_icon o_icon_actions o_icon-lg"> </i> tools.add.buddygroup=Group tools.add.header=Create tools.delete.header=Delete diff --git a/src/main/java/org/olat/group/ui/run/BusinessGroupMainRunController.java b/src/main/java/org/olat/group/ui/run/BusinessGroupMainRunController.java index 0743a445bb3..682cefa6288 100644 --- a/src/main/java/org/olat/group/ui/run/BusinessGroupMainRunController.java +++ b/src/main/java/org/olat/group/ui/run/BusinessGroupMainRunController.java @@ -44,6 +44,7 @@ import org.olat.core.commons.services.notifications.SubscriptionContext; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.panel.Panel; +import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.table.Table; import org.olat.core.gui.components.table.TableController; import org.olat.core.gui.components.table.TableEvent; @@ -65,6 +66,7 @@ import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.id.context.ContextEntry; +import org.olat.core.id.context.HistoryPoint; import org.olat.core.id.context.StateEntry; import org.olat.core.logging.AssertException; import org.olat.core.logging.activity.OlatResourceableType; @@ -177,6 +179,7 @@ public class BusinessGroupMainRunController extends MainLayoutBasicController im private Panel mainPanel; private VelocityContainer main, vc_sendToChooserForm, resourcesVC; + private final TooledStackedPanel toolbarPanel; private Translator resourceTrans; private BusinessGroup businessGroup; @@ -216,6 +219,7 @@ public class BusinessGroupMainRunController extends MainLayoutBasicController im private BusinessGroupService businessGroupService; private EventBus singleUserEventBus; private String adminNodeId; // reference to admin menu item + private HistoryPoint launchedFromPoint; // not null indicates tool is enabled private GenericTreeNode nodeFolder, nodeForum, nodeWiki, nodeCal, nodePortfolio, nodeOpenMeetings; @@ -241,6 +245,27 @@ public class BusinessGroupMainRunController extends MainLayoutBasicController im super(ureq, control); assessmentEventOres = OresHelper.createOLATResourceableType(AssessmentEvent.class); + + toolbarPanel = new TooledStackedPanel("courseStackPanel", getTranslator(), this); + toolbarPanel.setInvisibleCrumb(0); // show root (course) level + toolbarPanel.setToolbarEnabled(false); + toolbarPanel.setShowCloseLink(true, true); + + UserSession session = ureq.getUserSession(); + if(session != null && session.getHistoryStack() != null && session.getHistoryStack().size() >= 2) { + // Set previous business path as back link for this course - brings user back to place from which he launched the course + List<HistoryPoint> stack = session.getHistoryStack(); + for(int i=stack.size() - 2; i-->0; ) { + HistoryPoint point = stack.get(stack.size() - 2); + if(point.getEntries().size() > 0) { + OLATResourceable ores = point.getEntries().get(0).getOLATResourceable(); + if(!OresHelper.equals(bGroup, ores) && !OresHelper.equals(bGroup.getResource(), ores)) { + launchedFromPoint = point; + break; + } + } + } + } /* * lastUsage, update lastUsage if group is run if you can acquire the lock @@ -298,17 +323,17 @@ public class BusinessGroupMainRunController extends MainLayoutBasicController im mainPanel = new Panel("p_buddygroupRun"); mainPanel.setContent(main); - // + bgTree = new MenuTree("bgTree"); TreeModel trMdl = buildTreeModel(); bgTree.setTreeModel(trMdl); bgTree.addListener(this); - // + columnLayoutCtr = new LayoutMain3ColsController(ureq, getWindowControl(), bgTree, mainPanel, "grouprun"); + toolbarPanel.pushController(bGroup.getName(), columnLayoutCtr); listenTo(columnLayoutCtr); // cleanup on dispose + putInitialPanel(toolbarPanel); - // - putInitialPanel(columnLayoutCtr.getInitialComponent()); // register for AssessmentEvents triggered by this user singleUserEventBus = ureq.getUserSession().getSingleUserEventCenter(); singleUserEventBus.registerFor(this, ureq.getIdentity(), assessmentEventOres); @@ -413,6 +438,10 @@ public class BusinessGroupMainRunController extends MainLayoutBasicController im handleTreeActions(ureq, ACTIVITY_MENUSELECT_OVERVIEW); this.showError("grouprun.disabled"); } + } else if(source == toolbarPanel) { + if (event == Event.CLOSE_EVENT) { + doClose(ureq); + } } } @@ -732,7 +761,7 @@ public class BusinessGroupMainRunController extends MainLayoutBasicController im //fxdiff BAKS-7 Resume function ThreadLocalUserActivityLogger.addLoggingResourceInfo(LoggingResourceable.wrapBusinessPath(ORES_TOOLADMIN)); WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(ORES_TOOLADMIN, null, getWindowControl()); - collabToolCtr = bgEditCntrllr = new BusinessGroupEditController(ureq, bwControl, businessGroup); + collabToolCtr = bgEditCntrllr = new BusinessGroupEditController(ureq, bwControl, toolbarPanel, businessGroup); listenTo(bgEditCntrllr); mainPanel.setContent(bgEditCntrllr.getInitialComponent()); } @@ -798,6 +827,12 @@ public class BusinessGroupMainRunController extends MainLayoutBasicController im collabToolCtr = null; addToHistory(ureq, ORES_TOOLMEMBERS, null); } + + protected final void doClose(UserRequest ureq) { + OLATResourceable ores = businessGroup.getResource(); + getWindowControl().getWindowBackOffice().getWindow() + .getDTabs().closeDTab(ureq, ores, launchedFromPoint); + } /** * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) diff --git a/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java b/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java index ec75f7985a6..0de9ad93cc8 100644 --- a/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java +++ b/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java @@ -94,7 +94,8 @@ public class EfficiencyStatementDetailsController extends BasicController implem if(entry != null) { try { ICourse course = CourseFactory.loadCourse(entry.getOlatResource()); - assessmentCtrl = new IdentityAssessmentEditController(wControl, ureq, null, assessedIdentity, course, true, false); + assessmentCtrl = new IdentityAssessmentEditController(wControl, ureq, null, + assessedIdentity, course, true, false, false); listenTo(assessmentCtrl); segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this); diff --git a/src/main/java/org/olat/modules/fo/FilterForUserController.java b/src/main/java/org/olat/modules/fo/FilterForUserController.java index 86a8267b170..ba33f14ca12 100644 --- a/src/main/java/org/olat/modules/fo/FilterForUserController.java +++ b/src/main/java/org/olat/modules/fo/FilterForUserController.java @@ -347,8 +347,9 @@ public class FilterForUserController extends BasicController { showMessages(ureq, selectedInfo); } else if (te.getActionId().equals(CMD_HOMEPAGE)) { ControllerCreator ctrlCreator = new ControllerCreator() { + @Override public Controller createController(UserRequest lureq, WindowControl lwControl) { - return new UserInfoMainController(lureq, lwControl, selectedInfo.getIdentity()); + return new UserInfoMainController(lureq, lwControl, selectedInfo.getIdentity(), true, false); } }; // wrap the content controller into a full header layout diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_ar.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_ar.properties index b74154b0499..2b27d07310b 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_ar.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_ar.properties @@ -363,6 +363,7 @@ table.subject.telPrivate=\u0631\u0642\u0645 \u0647\u0627\u062A\u0641 \u0627\u064 table.subject.zipCode=\u0627\u0644\u0631\u0645\u0632 \u0627\u0644\u0628\u0631\u064A\u062F\u0649 table.user.login=\u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645 title.prefix.closed=\u062A\u0645 \u0625\u063A\u0644\u0627\u0642\u0647 +tools=$\:table.header.actions tools.add.blog=\u0645\u062F\u0648\u0646\u0629 tools.add.course=\u0645\u0642\u0631\u0631 tools.add.cp=\u0645\u062D\u062A\u0648\u0649 \u062D\u0632\u0645\u0629 \u062A\u0639\u0644\u064A\u0645 diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_bg.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_bg.properties index b7c5c59a917..0756db6543c 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_bg.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_bg.properties @@ -352,6 +352,7 @@ table.subject.telPrivate=\u0414\u043E\u043C\u0430\u0448\u0435\u043D \u0442\u0435 table.subject.zipCode=\u041F\u043E\u0449\u0435\u043D\u0441\u043A\u0438 \u043A\u043E\u0434 table.user.login=\u041F\u043E\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043B\u0441\u043A\u043E \u0438\u043C\u0435 title.prefix.closed=\u0417\u0430\u0442\u0432\u043E\u0440\u0435\u043D +tools=$\:table.header.actions tools.add.course=\u041A\u0443\u0440\u0441 tools.add.cp=CP \u0443\u0447\u0435\u0431\u043D\u043E \u0441\u044A\u0434\u044A\u0440\u0436\u0430\u043D\u0438\u0435 tools.add.glossary=\u0420\u0435\u0447\u043D\u0438\u043A diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_cs.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_cs.properties index 5fbf6bf1aef..0b64598f745 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_cs.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_cs.properties @@ -327,6 +327,7 @@ table.subject.telOffice=Telefon pr\u00E1ce table.subject.telPrivate=Telefon dom\u016F table.subject.zipCode=PS\u010C table.user.login=U\u017Eivatelsk\u00E9 jm\u00E9no +tools=$\:table.header.actions tools.add.course=Kurz tools.add.cp=CP studijn\u00ED materi\u00E1l tools.add.glossary=Slovn\u00EDk diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_da.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_da.properties index eb28e78afeb..0a39ef45aa3 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_da.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_da.properties @@ -272,6 +272,7 @@ table.subject.telOffice=Telefon arbejde table.subject.telPrivate=Telefon privat table.subject.zipCode=Postnummer table.user.login=Brugernavn +tools=$\:table.header.actions tools.add.course=Kursus tools.add.cp=CP l\u00E6ringsindhold tools.add.glossary=Ordliste 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 57f23584af4..e5e6703fd4f 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_de.properties @@ -618,7 +618,7 @@ table.switch.list=Liste table.switch.table=Tabelle table.user.login=Benutzername title.prefix.closed=beendet -tools=Werkzeuge und Aktionen +tools=$\:table.header.actions tools.add.blog=Blog tools.add.course=Kurs tools.add.cp=CP-Lerninhalt diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_el.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_el.properties index 9b35dd5dde9..180e52fbb7d 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_el.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_el.properties @@ -376,6 +376,7 @@ table.subject.telPrivate=\u03A4\u03B7\u03BB\u03AD\u03C6\u03C9\u03BD\u03BF \u03C0 table.subject.zipCode=\u03A4\u03B1\u03C7\u03C5\u03B4\u03C1\u03BF\u03BC\u03B9\u03BA\u03CC\u03C2 \u03BA\u03CE\u03B4\u03B9\u03BA\u03B1\u03C2 table.user.login=\u038C\u03BD\u03BF\u03BC\u03B1 \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7 title.prefix.closed=\u03BA\u03BB\u03B5\u03B9\u03C3\u03C4\u03CC +tools=$\:table.header.actions tools.add.blog=Blog tools.add.course=\u039C\u03AC\u03B8\u03B7\u03BC\u03B1 tools.add.cp=\u03A0\u03B5\u03C1\u03B9\u03B5\u03C7\u03CC\u03BC\u03B5\u03BD\u03BF \u03BC\u03AC\u03B8\u03B7\u03C3\u03B7\u03C2 CP 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 6f1f7681487..c2a778f0ada 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_en.properties @@ -618,7 +618,7 @@ table.switch.list=List table.switch.table=Table table.user.login=User name title.prefix.closed=closed -tools=Tools and actions +tools=$\:table.header.actions tools.add.blog=Blog tools.add.course=Course tools.add.cp=CP learning content diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_es.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_es.properties index 9dbb911d5b1..90743485a0e 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_es.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_es.properties @@ -350,6 +350,7 @@ table.subject.telPrivate=N\u00B0 tel\u00E9fono privado table.subject.zipCode=C\u00F3digo postal table.user.login=Nombre de usuario title.prefix.closed=cerrado +tools=$\:table.header.actions tools.add.course=Curso tools.add.cp=Contenido did\u00E1ctico CP tools.add.glossary=Glosario diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_et_EE.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_et_EE.properties index ffd4a14e9e6..445595d587b 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_et_EE.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_et_EE.properties @@ -39,6 +39,7 @@ table.subject.street=T\u00E4nav table.subject.telMobile=Mobiiltelefon table.subject.zipCode=Postiindeks table.user.login=Kasutajanimi +tools=$\:table.header.actions tools.add.glossary=S\u00F5nastik tools.add.survey=K\u00FCsimustik tools.add.test=Test diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_fa.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_fa.properties index b09fdec7525..638404dba62 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_fa.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_fa.properties @@ -240,6 +240,7 @@ table.subject.telOffice=\u0634\u0645\u0627\u0631\u0647 \u062A\u0644\u0641\u0646 table.subject.telPrivate=\u0634\u0645\u0627\u0631\u0647 \u062A\u0645\u0627\u0633 \u0634\u062E\u0635\u06CC table.subject.zipCode=\u06A9\u062F \u0634\u0647\u0631 table.user.login=\u0646\u0627\u0645 \u06A9\u0627\u0631\u0628\u0631\u06CC +tools=$\:table.header.actions tools.add.course=\u062F\u0648\u0631\u0647 tools.add.cp=CP \u0645\u062D\u062A\u0648\u0627\u06CC \u0622\u0645\u0648\u0632\u0634\u06CC tools.add.header=\u0627\u0641\u0632\u0648\u062F\u0646 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 3d0d28c907e..ee8372076c3 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_fr.properties @@ -612,7 +612,7 @@ table.switch.list=Liste table.switch.table=Table table.user.login=Nom d'utilisateur title.prefix.closed=termin\u00E9 -tools=Outils et actions +tools=$\:table.header.actions tools.add.blog=Blog tools.add.course=Cours tools.add.cp=Contenu did. CP 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 a37f88c892a..47cdb2be121 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_it.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_it.properties @@ -381,6 +381,7 @@ table.subject.telPrivate=Telefono privato table.subject.zipCode=Codice di avviamento postale table.user.login=Nome d'utente title.prefix.closed=terminato +tools=$\:table.header.actions tools.add.blog=Blog tools.add.course=Corso tools.add.cp=Contenuto CP diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_jp.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_jp.properties index ae6d7464813..8299a519fb2 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_jp.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_jp.properties @@ -252,6 +252,7 @@ table.header.typeimg=\u30BF\u30A4\u30D7 table.preview=<i class='o_icon o_icon-lg o_icon_preview' title='$\:preview.header'> </i> table.select=<i class='o_icon o_icon-lg o_icon_select'> </i> table.subject.institutionalUserIdentifier=\u30A4\u30F3\u30B9\u30C6\u30A3\u30C6\u30E5\u30FC\u30B7\u30E7\u30F3ID (\u767B\u9332\u756A\u53F7) +tools=$\:table.header.actions tools.add.blog=\u30D6\u30ED\u30B0 tools.add.course=\u30B3\u30FC\u30B9 tools.add.cp=CP\u5B66\u7FD2\u30B3\u30F3\u30C6\u30F3\u30C4 diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_lt.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_lt.properties index 73360d57781..7c055175c01 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_lt.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_lt.properties @@ -288,6 +288,7 @@ table.subject.telOffice=Telefono nr. (darbo) table.subject.telPrivate=Telefono nr. (nam\u0173) table.subject.zipCode=Pa\u0161to indeksas table.user.login=Vartotojo vardas +tools=$\:table.header.actions tools.add.course=Kursas tools.add.cp=CP mokymosi turinys tools.add.header=Prid\u0117ti diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_nl_NL.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_nl_NL.properties index 1ae41c94656..16523174b19 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_nl_NL.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_nl_NL.properties @@ -381,6 +381,7 @@ table.subject.telPrivate=Telefoonnummer (priv\u00E9) table.subject.zipCode=Postcode table.user.login=Gebruikersnaam title.prefix.closed=Be\u00EBindigd +tools=$\:table.header.actions tools.add.blog=Blog tools.add.course=Cursus tools.add.cp=CP-leerinhoud diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_pl.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_pl.properties index eb953d5befc..931b59c6c3b 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_pl.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_pl.properties @@ -429,6 +429,7 @@ table.subject.telPrivate=Numer stacjonarnego telefonu prywatnego table.subject.zipCode=Kod table.user.login=Nazwa u\u017Cytkownika title.prefix.closed=zamkni\u0119ty +tools=$\:table.header.actions tools.add.blog=Blog tools.add.course=Kurs tools.add.cp=Pakiet CP 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 5348e795052..51b4dd2e837 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 @@ -611,7 +611,7 @@ table.switch.list=Lista table.switch.table=Tabela table.user.login=Nome do usu\u00E1rio title.prefix.closed=Fechado -tools=Ferramentas e a\u00E7\u00F5es +tools=$\:table.header.actions tools.add.blog=Blog tools.add.course=Curso tools.add.cp=M\u00F3dulo IMS-CP diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_pt_PT.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_pt_PT.properties index 3cdb7af3f78..3e0f8d1c542 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_pt_PT.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_pt_PT.properties @@ -323,6 +323,7 @@ table.subject.telOffice=Telefone comercial table.subject.telPrivate=Telefone residencial table.subject.zipCode=CEP table.user.login=Nome do usu\u00E1rio +tools=$\:table.header.actions tools.add.course=Curso tools.add.cp=M\u00F3dulo IMS-CP tools.add.glossary=Gloss\u00E1rio diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_ru.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_ru.properties index 0703b0fe547..e3d040ac48d 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_ru.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_ru.properties @@ -299,6 +299,7 @@ table.subject.telPrivate=\u0414\u043E\u043C\u0430\u0448\u043D\u0438\u0439 \u0442 table.subject.zipCode=\u0418\u043D\u0434\u0435\u043A\u0441 \u043F\u043E\u0447\u0442\u043E\u0432\u043E\u0433\u043E \u043E\u0442\u0434\u0435\u043B\u0435\u043D\u0438\u044F table.user.login=\u0418\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F title.prefix.closed=\u0437\u0430\u043A\u043E\u043D\u0447\u0435\u043D +tools=$\:table.header.actions tools.add.course=\u041A\u0443\u0440\u0441 tools.add.cp=\u0423\u0447\u0435\u0431\u043D\u043E\u0435 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0435 CP tools.add.glossary=\u0421\u043B\u043E\u0432\u0430\u0440\u044C diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_sq.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_sq.properties index 2a0d0888583..6195c10fbe8 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_sq.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_sq.properties @@ -273,6 +273,7 @@ table.subject.telOffice=Nr. telefonit zyre table.subject.telPrivate=Nr. telefonit privat table.subject.zipCode=Kodi postal table.user.login=Emri i shfryt\u00EBzuesit +tools=$\:table.header.actions tools.add.course=Kurs tools.add.cp=CP p\u00EBrmbajtje m\u00EBsimi tools.add.glossary=P\u00EBrmbledhje diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_zh_CN.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_zh_CN.properties index 315a1f888d5..82d32ffc284 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_zh_CN.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_zh_CN.properties @@ -488,7 +488,7 @@ table.switch.list=\u5217\u8868 table.switch.table=\u8868\u683C table.user.login=\u7528\u6237\u540D\u79F0 title.prefix.closed=\u5173\u95ED -tools=\u5DE5\u5177\u548C\u52A8\u4F5C +tools=$\:table.header.actions tools.add.blog=\u535A\u5BA2 tools.add.course=\u8BFE\u7A0B tools.add.cp=CP\u8BFE\u4EF6 diff --git a/src/main/java/org/olat/repository/_i18n/LocalStrings_zh_TW.properties b/src/main/java/org/olat/repository/_i18n/LocalStrings_zh_TW.properties index e47b9e715a4..32ad8c5ed98 100644 --- a/src/main/java/org/olat/repository/_i18n/LocalStrings_zh_TW.properties +++ b/src/main/java/org/olat/repository/_i18n/LocalStrings_zh_TW.properties @@ -313,6 +313,7 @@ table.subject.telPrivate=\u4F4F\u5B85\u96FB\u8A71 table.subject.zipCode=\u90F5\u905E\u5340\u865F table.user.login=\u4F7F\u7528\u8005\u540D\u7A31 title.prefix.closed=\u95DC\u9589\u7684 +tools=$\:table.header.actions tools.add.blog=\u90E8\u843D\u683C tools.add.course=\u8AB2\u7A0B tools.add.cp=CP \u5B78\u7FD2\u5167\u5BB9 diff --git a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java index 9e4406023df..b8b2d68340c 100644 --- a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java +++ b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java @@ -41,8 +41,6 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.MainLayoutBasicController; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.control.generic.dtabs.Activateable2; -import org.olat.core.gui.control.generic.dtabs.DTab; -import org.olat.core.gui.control.generic.dtabs.DTabs; import org.olat.core.gui.control.generic.layout.MainLayoutController; import org.olat.core.gui.control.generic.wizard.Step; import org.olat.core.gui.control.generic.wizard.StepRunnerCallback; @@ -50,8 +48,6 @@ import org.olat.core.gui.control.generic.wizard.StepsMainRunController; import org.olat.core.gui.media.MediaResource; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Roles; -import org.olat.core.id.context.BusinessControl; -import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.HistoryPoint; import org.olat.core.id.context.StateEntry; @@ -635,28 +631,8 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController protected final void doClose(UserRequest ureq) { // Now try to go back to place that is attacked to (optional) root back business path - if (launchedFromPoint != null && StringHelper.containsNonWhitespace(launchedFromPoint.getBusinessPath()) - && launchedFromPoint.getEntries() != null && launchedFromPoint.getEntries().size() > 0) { - BusinessControl bc = BusinessControlFactory.getInstance().createFromPoint(launchedFromPoint); - if(bc.hasContextEntry()) { - WindowControl bwControl = BusinessControlFactory.getInstance().createBusinessWindowControl(bc, getWindowControl()); - try { - //make the resume secure. If something fail, don't generate a red screen - NewControllerFactory.getInstance().launch(ureq, bwControl); - } catch (Exception e) { - logError("Error while resuming with root level back business path::" + launchedFromPoint.getBusinessPath(), e); - } - } - } - - // Navigate beyond the stack, our own layout has been popped - close this tab - DTabs tabs = getWindowControl().getWindowBackOffice().getWindow().getDTabs(); - if (tabs != null) { - DTab tab = tabs.getDTab(re.getOlatResource()); - if (tab != null) { - tabs.removeDTab(ureq, tab); - } - } + getWindowControl().getWindowBackOffice().getWindow().getDTabs() + .closeDTab(ureq, re.getOlatResource(), launchedFromPoint); } protected void doEdit(UserRequest ureq) { @@ -710,7 +686,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController protected Activateable2 doMembers(UserRequest ureq) { if(!reSecurity.isEntryAdmin()) return null; - RepositoryMembersController ctrl = new RepositoryMembersController(ureq, getWindowControl(), re); + RepositoryMembersController ctrl = new RepositoryMembersController(ureq, getWindowControl(), toolbarPanel ,re); listenTo(ctrl); membersEditController = pushController(ureq, translate("details.members"), ctrl); currentToolCtr = membersEditController; diff --git a/src/main/java/org/olat/repository/ui/author/RepositoryMembersController.java b/src/main/java/org/olat/repository/ui/author/RepositoryMembersController.java index 417ccba510d..676f508bc70 100644 --- a/src/main/java/org/olat/repository/ui/author/RepositoryMembersController.java +++ b/src/main/java/org/olat/repository/ui/author/RepositoryMembersController.java @@ -22,9 +22,12 @@ package org.olat.repository.ui.author; import java.util.List; import org.olat.core.gui.UserRequest; -import org.olat.core.gui.components.Component; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.FormLink; +import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.link.Link; -import org.olat.core.gui.components.link.LinkFactory; +import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; @@ -44,6 +47,7 @@ import org.olat.group.BusinessGroupService; import org.olat.group.model.BusinessGroupMembershipChange; import org.olat.group.ui.main.AbstractMemberListController; import org.olat.group.ui.main.MemberPermissionChangeEvent; +import org.olat.group.ui.main.MemberView; import org.olat.group.ui.main.SearchMembersParams; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryEntryManagedFlag; @@ -60,8 +64,7 @@ import org.springframework.beans.factory.annotation.Autowired; public class RepositoryMembersController extends AbstractMemberListController { private final SearchMembersParams params; - private final RepositoryEntry repoEntry; - private Link importMemberLink, addMemberLink; + private FormLink importMemberLink, addMemberLink; private StepsMainRunController importMembersWizard; @Autowired @@ -69,21 +72,27 @@ public class RepositoryMembersController extends AbstractMemberListController { @Autowired private BusinessGroupService businessGroupService; - public RepositoryMembersController(UserRequest ureq, WindowControl wControl, RepositoryEntry repoEntry) { - super(ureq, wControl, repoEntry, null, "all_member_list", - Util.createPackageTranslator(RepositoryService.class, ureq.getLocale(), Util.createPackageTranslator(AbstractMemberListController.class, ureq.getLocale()))); + public RepositoryMembersController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, RepositoryEntry repoEntry) { + super(ureq, wControl, repoEntry, null, "all_member_list", stackPanel, + Util.createPackageTranslator(RepositoryService.class, ureq.getLocale(), + Util.createPackageTranslator(AbstractMemberListController.class, ureq.getLocale()))); + + params = new SearchMembersParams(true, true, true, true, true, true, true); + reloadModel(); + } + + @Override + protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + super.initForm(formLayout, listener, ureq); - this.repoEntry = repoEntry; boolean managed = RepositoryEntryManagedFlag.isManaged(repoEntry, RepositoryEntryManagedFlag.membersmanagement); - addMemberLink = LinkFactory.createButton("add.member", mainVC, this); + addMemberLink = uifactory.addFormLink("add.member", formLayout, Link.BUTTON); + addMemberLink.setIconLeftCSS("o_icon o_icon-fw o_icon_add"); addMemberLink.setVisible(!managed); - mainVC.put("addMembers", addMemberLink); - importMemberLink = LinkFactory.createButton("import.member", mainVC, this); - importMemberLink.setVisible(!managed); - mainVC.put("importMembers", importMemberLink); - params = new SearchMembersParams(true, true, true, true, true, true, true); - reloadModel(); + importMemberLink = uifactory.addFormLink("import.member", formLayout, Link.BUTTON); + importMemberLink.setIconLeftCSS("o_icon o_icon-fw o_icon_import"); + importMemberLink.setVisible(!managed); } @Override @@ -92,13 +101,13 @@ public class RepositoryMembersController extends AbstractMemberListController { } @Override - protected void event(UserRequest ureq, Component source, Event event) { - if (source == addMemberLink) { + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if (source == addMemberLink) { doChooseMembers(ureq); } else if (source == importMemberLink) { doImportMembers(ureq); } else { - super.event(ureq, source, event); + super.formInnerEvent(ureq, source, event); } } @@ -118,6 +127,11 @@ public class RepositoryMembersController extends AbstractMemberListController { } } + @Override + protected void doOpenAssessmentTool(UserRequest ureq, MemberView member) { + // + } + private void doChooseMembers(UserRequest ureq) { removeAsListenerAndDispose(importMembersWizard); diff --git a/src/main/java/org/olat/repository/ui/author/_content/all_member_list.html b/src/main/java/org/olat/repository/ui/author/_content/all_member_list.html index 212414af16e..ea9ad56e5fa 100644 --- a/src/main/java/org/olat/repository/ui/author/_content/all_member_list.html +++ b/src/main/java/org/olat/repository/ui/author/_content/all_member_list.html @@ -1,20 +1,27 @@ -#if($r.available("addMembers") || $r.available("importMembers")) +#if($infos) + <div class="o_info">$infos</div> +#end +#if($r.available("add.member") || $r.available("import.member")) <div class="o_button_group o_button_group_right"> - #if($r.available("addMembers")) - $r.render("addMembers") + #if($r.available("add.member") && $r.available("import.member"))<div class="btn-group">#end + #if($r.available("add.member")) + $r.render("add.member") #end - #if($r.available("importMembers")) - $r.render("importMembers") + #if($r.available("import.member")) + $r.render("import.member") #end + #if($r.available("add.member") && $r.available("import.member"))</div>#end </div> #end - -#if($infos) - <div class="o_block clearfix"> - <p class="o_info">$infos</p> - </div> -#end - -<div class="clearfix"> - $r.render("memberList") +$r.render("memberList") +<div class="o_button_group"> + #if($r.available("edit.members")) + $r.render("edit.members") + #end + #if($r.available("table.header.mail")) + $r.render("table.header.mail") + #end + #if($r.available("table.header.remove")) + $r.render("table.header.remove") + #end </div> \ No newline at end of file diff --git a/src/main/java/org/olat/user/DisplayPortraitController.java b/src/main/java/org/olat/user/DisplayPortraitController.java index a46c5b92b2c..75698deea60 100644 --- a/src/main/java/org/olat/user/DisplayPortraitController.java +++ b/src/main/java/org/olat/user/DisplayPortraitController.java @@ -216,8 +216,9 @@ public class DisplayPortraitController extends BasicController implements Generi */ public void showUserInfo(UserRequest ureq) { ControllerCreator ctrlCreator = new ControllerCreator() { + @Override public Controller createController(UserRequest lureq, WindowControl lwControl) { - return new UserInfoMainController(lureq, lwControl, portraitIdent); + return new UserInfoMainController(lureq, lwControl, portraitIdent, true, false); } }; //wrap the content controller into a full header layout diff --git a/src/main/java/org/olat/user/HomePageContextEntryControllerCreator.java b/src/main/java/org/olat/user/HomePageContextEntryControllerCreator.java index 52e3cf97b81..cff2ce7041b 100644 --- a/src/main/java/org/olat/user/HomePageContextEntryControllerCreator.java +++ b/src/main/java/org/olat/user/HomePageContextEntryControllerCreator.java @@ -61,7 +61,7 @@ public class HomePageContextEntryControllerCreator extends DefaultContextEntryCo public Controller createController(List<ContextEntry> ces, UserRequest ureq, WindowControl wControl) { Identity identity = extractIdentity(ces.get(0)); if (identity == null) return null; - return new UserInfoMainController(ureq, wControl, identity); + return new UserInfoMainController(ureq, wControl, identity, false, true); } /** diff --git a/src/main/java/org/olat/user/IdentityContextEntryControllerCreator.java b/src/main/java/org/olat/user/IdentityContextEntryControllerCreator.java index 494f90e7544..9cc213a054c 100644 --- a/src/main/java/org/olat/user/IdentityContextEntryControllerCreator.java +++ b/src/main/java/org/olat/user/IdentityContextEntryControllerCreator.java @@ -68,7 +68,7 @@ public class IdentityContextEntryControllerCreator extends DefaultContextEntryCo if (id == null) { return null; } - return new UserInfoMainController(ureq, wControl, id); + return new UserInfoMainController(ureq, wControl, id, false, true); } @Override diff --git a/src/main/java/org/olat/user/UserInfoMainController.java b/src/main/java/org/olat/user/UserInfoMainController.java index af9f06977f2..10f37c8e0e2 100644 --- a/src/main/java/org/olat/user/UserInfoMainController.java +++ b/src/main/java/org/olat/user/UserInfoMainController.java @@ -45,6 +45,7 @@ import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.panel.Panel; +import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.components.tree.GenericTreeModel; import org.olat.core.gui.components.tree.GenericTreeNode; import org.olat.core.gui.components.tree.MenuTree; @@ -57,8 +58,10 @@ import org.olat.core.gui.control.generic.dtabs.Activateable2; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.context.ContextEntry; +import org.olat.core.id.context.HistoryPoint; import org.olat.core.id.context.StateEntry; import org.olat.core.util.StringHelper; +import org.olat.core.util.UserSession; import org.olat.core.util.mail.ContactList; import org.olat.core.util.mail.ContactMessage; import org.olat.core.util.resource.OresHelper; @@ -94,6 +97,7 @@ public class UserInfoMainController extends MainLayoutBasicController implements private MenuTree menuTree; private Panel main; + private TooledStackedPanel toolbarPanel; public static final OLATResourceable BUSINESS_CONTROL_TYPE_FOLDER = OresHelper.createOLATResourceableTypeWithoutCheck(FolderRunController.class .getSimpleName()); @@ -106,6 +110,7 @@ public class UserInfoMainController extends MainLayoutBasicController implements private final Identity chosenIdentity; private final String firstLastName; + private HistoryPoint launchedFromPoint; @Autowired private UserManager userManager; @@ -117,10 +122,27 @@ public class UserInfoMainController extends MainLayoutBasicController implements * @param wControl * @param chosenIdentity */ - public UserInfoMainController(UserRequest ureq, WindowControl wControl, Identity chosenIdentity) { + public UserInfoMainController(UserRequest ureq, WindowControl wControl, Identity chosenIdentity, + boolean showRootNode, boolean showToolbar) { super(ureq, wControl); this.chosenIdentity = chosenIdentity; + + UserSession session = ureq.getUserSession(); + if(showToolbar && session != null && session.getHistoryStack() != null && session.getHistoryStack().size() >= 2) { + // Set previous business path as back link for this course - brings user back to place from which he launched the course + List<HistoryPoint> stack = session.getHistoryStack(); + for(int i=stack.size() - 2; i-->0; ) { + HistoryPoint point = stack.get(stack.size() - 2); + if(point.getEntries().size() > 0) { + OLATResourceable ores = point.getEntries().get(0).getOLATResourceable(); + if(!chosenIdentity.getKey().equals(ores.getResourceableId())) { + launchedFromPoint = point; + break; + } + } + } + } main = new Panel("userinfomain"); Controller homeCtrl = createComponent(ureq, CMD_HOMEPAGE); @@ -133,6 +155,7 @@ public class UserInfoMainController extends MainLayoutBasicController implements menuTree.setTreeModel(tm); menuTree.setSelectedNodeId(tm.getRootNode().getChildAt(0).getIdent()); menuTree.addListener(this); + menuTree.setRootVisible(showRootNode); // override if user is guest, don't show anything if (ureq.getUserSession().getRoles().isGuestOnly()) { @@ -142,7 +165,17 @@ public class UserInfoMainController extends MainLayoutBasicController implements LayoutMain3ColsController columnLayoutCtr = new LayoutMain3ColsController(ureq, getWindowControl(), menuTree, main, "userinfomain"); listenTo(columnLayoutCtr); - putInitialPanel(columnLayoutCtr.getInitialComponent()); + + if(showToolbar) { + toolbarPanel = new TooledStackedPanel("courseStackPanel", getTranslator(), this); + toolbarPanel.setInvisibleCrumb(0); // show root level + toolbarPanel.setToolbarEnabled(false); + toolbarPanel.setShowCloseLink(true, true); + toolbarPanel.pushController(firstLastName, columnLayoutCtr); + putInitialPanel(toolbarPanel); + } else { + putInitialPanel(columnLayoutCtr.getInitialComponent()); + } } @Override @@ -161,6 +194,10 @@ public class UserInfoMainController extends MainLayoutBasicController implements main.setContent(controller.getInitialComponent()); } } + } else if(source == toolbarPanel) { + if (event == Event.CLOSE_EVENT) { + doClose(ureq); + } } } @@ -345,4 +382,9 @@ public class UserInfoMainController extends MainLayoutBasicController implements listenTo(portfolioController); return portfolioController; } + + protected final void doClose(UserRequest ureq) { + OLATResourceable ores = OresHelper.createOLATResourceableInstance("HomeSite", chosenIdentity.getKey()); + getWindowControl().getWindowBackOffice().getWindow().getDTabs().closeDTab(ureq, ores, launchedFromPoint); + } } \ No newline at end of file diff --git a/src/main/webapp/static/themes/light/modules/_icons.scss b/src/main/webapp/static/themes/light/modules/_icons.scss index c96918e6300..e00eda63f09 100644 --- a/src/main/webapp/static/themes/light/modules/_icons.scss +++ b/src/main/webapp/static/themes/light/modules/_icons.scss @@ -97,6 +97,7 @@ $fa-css-prefix: "o_icon" !default; .o_icon_external_link:before { content: $fa-var-external-link } .o_icon_failed:before { content: $fa-var-times-circle;} .o_icon_filter:before { content: $fa-var-filter;} +.o_icon_graduate:before { content: $fa-var-graduation-cap; } .o_icon_group:before, .o_BusinessGroup_icon:before { content: $fa-var-users; } .o_icon_header:before { content: $fa-var-header;} .o_icon_help:before { content: $fa-var-question-circle; cursor: help;} diff --git a/src/main/webapp/static/themes/light/theme.css b/src/main/webapp/static/themes/light/theme.css index 5fa43b45e1e..3c19746542c 100644 --- a/src/main/webapp/static/themes/light/theme.css +++ b/src/main/webapp/static/themes/light/theme.css @@ -58,7 +58,7 @@ fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100% @media (max-width: 767px){.hidden-xs{display:none !important}}@media (min-width: 768px) and (max-width: 991px){.hidden-sm{display:none !important}}@media (min-width: 992px) and (max-width: 1199px){.hidden-md{display:none !important}}@media (min-width: 1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}} .visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}} .visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}} -@media print{.hidden-print{display:none !important}}body .modal{position:absolute;overflow:visible}body div.tooltip-inner{max-width:400px}body div.popover{max-width:450px}body .modal-body.alert{border-radius:0}body .progress{margin-bottom:0}.panel-body:nth-child(n+2){border-top:1px solid #ddd}.panel .panel-heading[data-toggle="collapse"]{cursor:pointer}#o_ajax_busy_backdrop{bottom:0;z-index:1020}.form-control-feedback{top:10px}.form-horizontal .has-feedback .form-control-feedback{top:10px}.btn.btn-primary.o_disabled{color:#fff !important}body .progress-bar[aria-valuenow="1"],body .progress-bar[aria-valuenow="2"]{min-width:1px}@-moz-document url-prefix(){fieldset{display:table-cell}}@font-face{font-family:'openolat';src:url("../light/fonts/openolat/openolat.eot?4yacgg");src:url("../light/fonts/openolat/openolat.eot?#iefix4yacgg") format("embedded-opentype"),url("../light/fonts/openolat/openolat.woff?4yacgg") format("woff"),url("../light/fonts/openolat/openolat.ttf?4yacgg") format("truetype"),url("../light/fonts/openolat/openolat.svg?4yacgg#openolat") format("svg");font-weight:normal;font-style:normal}@font-face{font-family:'FontAwesome';src:url("../../font-awesome/fonts/fontawesome-webfont.eot?v=4.2.0");src:url("../../font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.2.0") format("embedded-opentype"),url("../../font-awesome/fonts/fontawesome-webfont.woff?v=4.2.0") format("woff"),url("../../font-awesome/fonts/fontawesome-webfont.ttf?v=4.2.0") format("truetype"),url("../../font-awesome/fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.o_icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.o_icon-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.o_icon-2x{font-size:2em}.o_icon-3x{font-size:3em}.o_icon-4x{font-size:4em}.o_icon-5x{font-size:5em}.o_icon-fw{width:1.28571em;text-align:center}.o_icon-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.o_icon-ul>li{position:relative}.o_icon-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.o_icon-li.o_icon-lg{left:-1.85714em}.o_icon-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.o_icon.pull-left{margin-right:.3em}.o_icon.pull-right{margin-left:.3em}.o_icon-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.o_icon-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.o_icon-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.o_icon-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.o_icon-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.o_icon-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .o_icon-rotate-90,:root .o_icon-rotate-180,:root .o_icon-rotate-270,:root .o_icon-flip-horizontal,:root .o_icon-flip-vertical{filter:none}.o_icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.o_icon-stack-1x,.o_icon-stack-2x{position:absolute;left:0;width:100%;text-align:center}.o_icon-stack-1x{line-height:inherit}.o_icon-stack-2x{font-size:2em}.o_icon-inverse{color:#fff}.o_icon_accessibility:before{content:"\f193"}.o_icon_actions:before{content:"\f085"}.o_icon_archive_tool:before{content:"\f019"}.o_icon_assessment_mode:before{content:"\f044"}.o_icon_assessment_tool:before{content:"\f091"}.o_icon_attempt_limit:before{content:"\f021"}.o_icon_accept:before{content:"\f00c";color:#5cb85c}.o_icon_add:before{content:"\f055"}.o_icon_add_search:before{content:"\f00e"}.o_icon_audio:before{content:"\f028"}.o_icon_back:before{content:"\f053"}.o_icon_back_history:before{content:"\f1da"}.o_icon_banned:before{content:"\f0c3";color:#d9534f}.o_icon_bold:before{content:"\f032"}.o_icon_booking:before{content:"\f07a"}.o_icon_bookmark:before{content:"\f02e";color:#bc2d0c}.o_icon_bookmark_add:before{content:"\f097"}.o_icon_bookmark_header:before{content:"\f02e"}.o_icon_browse:before{content:"\f00e"}.o_icon_browsercheck:before{content:"\f164"}.o_icon_busy:before{content:"\f110"}.o_icon_calendar:before{content:"\f073"}.o_icon_calendar_enabled:before{content:"\f05d"}.o_icon_calendar_disabled:before{content:"\f10c"}.o_icon_calendar:before{content:"\f073"}.o_icon_caret:before{content:"\f0d7"}.o_icon_caret_right:before{content:"\f0da"}.o_icon_catalog:before{content:"\f0e8"}.o_icon_catalog_sub:before{content:"\f07b"}.o_icon_certificate:before{content:"\f0a3"}.o_icon_chat:before{content:"\f0e5"}.o_icon_check:before{content:"\f00c"}.o_icon_check_off:before{content:"\f096"}.o_icon_check_on:before{content:"\f046"}.o_icon_checkbox:before{content:"\f096"}.o_icon_checkbox_checked:before{content:"\f14a"}.o_icon_cleanup:before{content:"\f0f9"}.o_icon_close:before{content:"\f00d"}.o_icon_close_resource:before{content:"\f011"}.o_icon_close_tab:before{content:"\f00d"}.o_icon_close_tool:before{content:"\f00d"}.o_icon_close_tree:before{content:"\f0d7"}.o_icon_close_togglebox:before,.o_togglebox_wrapper .o_opener.o_in i:before{content:"\f0d7"}.o_icon_code:before{content:"\f121"}.o_icon_color_picker:before{content:"\f043"}.o_icon_copy:before{content:"\f0c5"}.o_icon_courseareas:before{content:"\f1db"}.o_icon_coursedb:before{content:"\f1c0"}.o_icon_courseeditor:before{content:"\f044"}.o_icon_coursefolder:before{content:"\f114"}.o_icon_courserun:before{content:"\f1b2"}.o_icon_comments:before{content:"\f086"}.o_icon_comments_none:before{content:"\f0e5"}.o_icon_content_popup:before{content:"\f08e"}.o_icon_correct_answer:before{content:"\f00c";color:#5cb85c}.o_icon_customize:before{content:"\f013"}.o_icon_delete_item:before{content:"\f1f8"}.o_icon_delete:before{content:"\f056";color:#A87E7E}.o_icon_details:before{content:"\f0eb"}.o_icon_description:before{content:"\f05a"}.o_icon_dev:before{content:"\f188"}.o_icon_disabled:before{content:"\f10c"}.o_icon_download:before{content:"\f019"}.o_icon_edit:before{content:"\f044"}.o_icon_edit_file:before{content:"\f044"}.o_icon_edit_metadata:before{content:"\f013"}.o_icon_enabled:before{content:"\f111"}.o_icon_enlarge:before{content:"\f00e"}.o_icon_eportfolio_add:before{content:"\f12e"}.o_icon_eportfolio_link:before{content:"\f12e"}.o_icon_error:before{content:"\f06a";color:#d9534f}.o_icon_expenditure:before{content:"\f017"}.o_icon_export:before{content:"\f045"}.o_icon_external_link:before{content:"\f08e"}.o_icon_failed:before{content:"\f057"}.o_icon_filter:before{content:"\f0b0"}.o_icon_group:before,.o_BusinessGroup_icon:before{content:"\f0c0"}.o_icon_header:before{content:"\f1dc"}.o_icon_help:before{content:"\f059";cursor:help}.o_icon_home:before{content:"\f015"}.o_icon_impress:before{content:"\f05a"}.o_icon_important:before{content:"\f071";color:#f0ad4e}.o_icon_import:before{content:"\f093"}.o_icon_info:before{content:"\f05a";color:#5bc0de}.o_icon_info_msg:before{content:"\f06a";color:#d9534f}.o_icon_inline_editable:before{content:"\f044"}.o_icon_institution:before{content:"\f19c"}.o_icon_italic:before{content:"\f033"}.o_icon_landingpage:before{content:"\f140"}.o_icon_language:before{content:"\f0ac"}.o_icon_layout:before{content:"\f1c5"}.o_icon_link:before{content:"\f0c1"}.o_icon_link_extern:before{content:"\f08e"}.o_icon_list:before{content:"\f03a"}.o_icon_list_num :before{content:"\f0cb"}.o_icon_lifecycle:before{content:"\f073"}.o_icon_locked:before{content:"\f023"}.o_icon_login:before{content:"\f090"}.o_icon_logout:before{content:"\f08b"}.o_icon_mandatory:before{content:"\f069";color:#f0ad4e}.o_icon_managed:before{content:"\f079";color:#777}.o_icon_manual:before{content:"\f02d";cursor:help}.o_icon_mail:before{content:"\f003"}.o_icon_math:before{content:"\f198"}.o_icon_membersmanagement:before{content:"\f0c0"}.o_icon_menuhandel:before{content:"\f0c9"}.o_icon_message:before{content:"\f0e0"}.o_icon_mobile:before{content:"\f10b"}.o_icon_move:before{content:"\f047"}.o_icon_move_down:before{content:"\f103"}.o_icon_move_left:before{content:"\f100"}.o_icon_move_right:before{content:"\f101"}.o_icon_move_up:before{content:"\f102"}.o_icon_new:before{content:"\f069";color:#5cb85c}.o_icon_new_document:before{content:"\f15c"}.o_icon_new_folder:before{content:"\f07b"}.o_icon_news:before{content:"\f05a"}.o_icon_next:before{content:"\f138"}.o_icon_next_page:before{content:"\f101"}.o_icon_next_toolbar:before{content:"\f0da"}.o_icon_node_after:before{content:"\f175"}.o_icon_node_before:before{content:"\f176"}.o_icon_node_under:before{content:"\f112"}.o_icon_notes:before{content:"\f1e8"}.o_icon_notification:before{content:"\f09e"}.o_icon_open_tree:before{content:"\f0da"}.o_icon_open_togglebox:before,.o_togglebox_wrapper .o_opener i:before{content:"\f0da"}.o_icon_openolat:before,.o_icon_provider_olat:before{content:"\E600";font-family:openolat;font-size:10px}.o_icon_options:before{content:"\f205"}.o_icon_pageing:before{content:"\f141"}.o_icon_passed:before{content:"\f058"}.o_icon_password:before{content:"\f023"}.o_icon_pending:before{content:"\f110"}.o_icon_phone:before{content:"\f095"}.o_icon_post:before{content:"\f0e5"}.o_icon_preview:before{content:"\f06e"}.o_icon_previous:before{content:"\f137"}.o_icon_previous_page:before{content:"\f100"}.o_icon_previous_toolbar:before{content:"\f0d9"}.o_icon_print:before{content:"\f02f"}.o_icon_private:before{content:"\f02f"}.o_icon_provider_adfs:before{content:"\f17a"}.o_icon_provider_facebook:before{content:"\f09a"}.o_icon_provider_google:before{content:"\f0d5"}.o_icon_provider_guest:before{content:"\f1ae"}.o_icon_provider_ldap:before{content:"\f19c"}.o_icon_provider_linkedin:before{content:"\f0e1"}.o_icon_provider_oauth:before{content:"\f0c2"}.o_icon_provider_shibboleth:before{content:"\f19c"}.o_icon_provider_twitter:before{content:"\f099"}.o_icon_publish:before{content:"\f064"}.o_icon_qrcode:before{content:"\f029"}.o_icon_quickview:before{content:"\f06e"}.o_icon_radio_off:before{content:"\f10c"}.o_icon_radio_on:before{content:"\f05d"}.o_icon_rating_on:before,.o_rating .o_rating_items.o_enabled .o_icon:hover:before{content:"\f005"}.o_icon_rating_off:before{content:"\f006"}.o_icon_read:before{content:"\f10c"}.o_icon_readonly:before{content:"\f044";color:red}.o_icon_readwrite:before{content:"\f044"}.o_icon_recycle:before{content:"\f1b8"}.o_icon_refresh:before{content:"\f021"}.o_icon_reject:before{content:"\f00d";color:#d9534f}.o_icon_reminder:before{content:"\f0a6"}.o_icon_remove:before{content:"\f00d"}.o_icon_replace:before{content:"\f0c5"}.o_icon_reply:before{content:"\f112"}.o_icon_reply_with_quote:before{content:"\f122"}.o_icon_response_feedback:before{content:"\f021"}.o_icon_review:before{content:"\f06e"}.o_icon_rss:before{content:"\f09e"}.o_icon_rss_unsubscribe:before{content:"\f09e";color:#996633}.o_icon_search:before{content:"\f002"}.o_icon_select:before{content:"\f00c"}.o_icon_send:before{content:"\f0e0"}.o_icon_settings:before{content:"\f085"}.o_icon_share:before{content:"\f064"}.o_icon_show_more:before{content:"\f150"}.o_icon_show_less:before{content:"\f151"}.o_icon_show_send:before{content:"\f1d9"}.o_icon_sign_out:before{content:"\f08b"}.o_icon_spacer:before{content:"\f07e"}.o_icon_split:before{content:"\f127"}.o_icon_sort:before{content:"\f0dc"}.o_icon_sort_asc:before{content:"\f0de"}.o_icon_sort_desc:before{content:"\f0dd"}.o_icon_sort_menu:before{content:"\f160"}.o_icon_start:before{content:"\f054"}.o_icon_status_available:before{content:"\f111";color:#063}.o_icon_status_chat:before{content:"\f075"}.o_icon_status_dnd:before{content:"\f192";color:#cc3}.o_icon_status_unavailable:before{content:"\f05c";color:#963}.o_icon_statistics_tool:before{content:"\f080"}.o_icon_submit:before{content:"\f00c"}.o_icon_table:before{content:"\f0ce"}.o_icon_table_large:before{content:"\f009"}.o_icon_tags:before{content:"\f02c"}.o_icon_timelimit:before{content:"\f1e2"}.o_icon_toggle:before{content:"\f111"}.o_icon_to_read:before{content:"\f111"}.o_icon_tool:before{content:"\f013"}.o_icon_tools:before{content:"\f0ad"}.o_icon_top:before{content:"\f077"}.o_icon_translation_item:before{content:"\f1c9"}.o_icon_translation_package:before{content:"\f115"}.o_icon_user:before{content:"\f007"}.o_icon_user_vip:before{content:"\f19d"}.o_icon_user_anonymous:before{content:"\f128"}.o_icon_upload:before{content:"\f093"}.o_icon_version:before{content:"\f1da"}.o_icon_video:before{content:"\f008"}.o_icon_waiting:before{content:"\f017"}.o_icon_warn:before{content:"\f071";color:#f0ad4e}.o_icon_wizard:before{content:"\f0d0"}.o_CourseModule_icon:before,.o_course_icon:before{content:"\f1b2"}.o_EPStructuredMapTemplate_icon:before{content:"\f12e"}.o_FileResource-BLOG_icon:before{content:"\f0a1"}.o_FileResource-IMSCP_icon:before{content:"\f187"}.o_FileResource-PODCAST_icon:before{content:"\f03d"}.o_FileResource-SHAREDFOLDER:before{content:"\f08e"}.o_FileResource-SCORMCP_icon:before{content:"\f187"}.o_FileResource-SURVEY_icon:before{content:"\f11a"}.o_FileResource-TEST_icon:before{content:"\f044"}.o_FileResource-WIKI_icon:before{content:"\f0ac"}.o_FileResource-SHAREDFOLDER_icon:before{content:"\f115"}.o_FileResource-GLOSSARY_icon:before{content:"\f19d"}.o_FileResource-PDF_icon:before{content:"\f1c1"}.o_FileResource-XLS_icon:before{content:"\f1c3"}.o_FileResource-PPT_icon:before{content:"\f1c4"}.o_FileResource-DOC_icon:before{content:"\f1c2"}.o_FileResource-ANIM_icon:before{content:"\f1c8"}.o_FileResource-IMAGE_icon:before{content:"\f1c5"}.o_FileResource-SOUND_icon:before{content:"\f1c7"}.o_FileResource-MOVIE_icon:before{content:"\f1c8"}.o_FileResource-FILE_icon:before{content:"\f016"}.o_CourseModule_icon_closed:before{content:"\f05e"}.o_sp_icon:before{content:"\f0f6"}.o_st_icon:before{content:"\f1b3"}.o_tu_icon:before{content:"\f08e"}.o_bc_icon:before{content:"\f115"}.o_lti_icon:before{content:"\f08e"}.o_cp_icon:before{content:"\f187"}.o_cp_item:before{content:"\f0f6"}.o_scorm_icon:before{content:"\f187"}.o_en_icon:before{content:"\f090"}.o_fo_icon:before{content:"\f0e6"}.o_co_icon:before{content:"\f003"}.o_infomsg_icon:before{content:"\f05a"}.o_cal_icon:before{content:"\f073"}.o_wiki_icon:before{content:"\f0ac"}.o_podcast_icon:before{content:"\f03d"}.o_blog_icon:before{content:"\f0a1"}.o_ep_icon:before{content:"\f12e"}.o_iqtest_icon:before{content:"\f044"}.o_iqself_icon:before{content:"\f044"}.o_iqsurv_icon:before{content:"\f11a"}.o_ta_icon:before{content:"\f0ae"}.o_gta_icon:before{content:"\f0ae"}.o_ms_icon:before{content:"\f087"}.o_dialog_icon:before{content:"\f0c5"}.o_projectbroker_icon:before{content:"\f10c"}.o_ll_icon:before{content:"\f0c1"}.o_den_icon:before{content:"\f133"}.o_cmembers_icon:before{content:"\f0c0"}.o_cl_icon:before{content:"\f046"}.o_vc_icon:before{content:"\f108"}.o_vitero_icon:before{content:"\f108"}.o_openmeetings_icon:before{content:"\f108"}.o_portlet_infomsg_icon:before{content:"\f05a"}.o_portlet_quickstart_icon:before{content:"\f1d9"}.o_portlet_bookmark_icon:before{content:"\f02e"}.o_portlet_groups_icon:before{content:"\f0c0"}.o_portlet_notes_icon:before{content:"\f1e8"}.o_portlet_noti_icon:before{content:"\f09e"}.o_portlet_eff_icon:before{content:"\f0a3"}.o_portlet_repository_student_icon:before{content:"\f1b3"}.o_portlet_repository_teacher_icon:before{content:"\f19d"}.o_portlet_iframe_icon:before{content:"\f005"}.o_portlet_sysinfo_icon:before{content:"\f0e4"}.o_portlet_dyk_icon:before{content:"\f0eb"}.o_portlet_infomessages_icon:before{content:"\f0e5"}.o_portlet_cal_icon:before{content:"\f073"}.o_portlet_institutions_icon:before{content:"\f19c"}.o_portlet_links_icon:before{content:"\f0c1"}.o_portlet_shibboleth_icon:before{content:"\f090"}.o_icon_qpool:before{content:"\f19c"}.o_icon_pool_private:before{content:"\f096"}.o_icon_pool_public:before{content:"\f046"}.o_icon_pool_my_items:before{content:"\f007"}.o_icon_pool_favorits:before{content:"\f02e"}.o_icon_pool_collection:before{content:"\f03a"}.o_icon_pool_pool:before{content:"\f1e1"}.o_icon_pool_share:before{content:"\f0c0"}.o_forum_message_icon:before{content:"\f0e5"}.o_calendar_icon:before{content:"\f073"}.o_forum_status_thread_icon:before{content:"\f0e6"}.o_forum_status_sticky_closed_icon:before{content:"\f05e"}.o_forum_status_sticky_icon:before{content:"\f086"}.o_forum_status_closed_icon:before{content:"\f05e";color:#a94442}.o_forum_status_opened_icon:before{content:"\f05e";color:#3c763d}.o_forum_status_hidden_icon:before{content:"\f070";color:#a94442}.o_forum_status_visible_icon:before{content:"\f06e";color:#3c763d}.o_mi_qpool_import:before{content:"\f1c0"}.o_mi_qtisection:before{content:"\f1b3"}.o_mi_qtisc:before{content:"\f192"}.o_mi_qtimc:before{content:"\f046"}.o_mi_qtikprim:before{content:"\f14a"}.o_mi_qtifib:before{content:"\f141"}.o_mi_qtiessay:before{content:"\f036"}.o_as_mode_leadtime:before{content:"\f017"}.o_as_mode_assessment:before{content:"\f04b"}.o_as_mode_followup:before{content:"\f05e"}.o_as_mode_closed:before{content:'-'}.o_black_led:before{content:"\f111";color:#337ab7}.o_green_led:before{content:"\f111";color:#5cb85c}.o_yellow_led:before{content:"\f111";color:#f0ad4e}.o_red_led:before{content:"\f111";color:#d9534f}.o_ac_token_icon:before{content:"\f084"}.o_ac_free_icon:before{content:"\f06b"}.o_ac_group_icon:before{content:"\f0c0"}.o_ac_membersonly_icon:before{content:"\f023"}.o_ac_paypal_icon:before{content:"\f1f4"}.o_ac_status_canceled_icon:before{content:"\f068";color:#f0ad4e}.o_ac_status_error_icon:before{content:"\f00d";color:#d9534f}.o_ac_status_new_icon:before{content:"\f069";color:#337ab7}.o_ac_status_succes_icon:before{content:"\f00c";color:#5cb85c}.o_ac_status_waiting_icon:before{content:"\f017";color:#337ab7}.o_ac_order_status_new_icon:before{content:"\f069";color:#337ab7}.o_ac_order_status_prepayment_icon:before{content:"\f0d6";color:#5bc0de}.o_ac_order_status_payed_icon:before{content:"\f00c";color:#5cb85c}.o_ac_order_status_canceled_icon:before{content:"\f068";color:#f0ad4e}.o_ac_order_status_error_icon:before{content:"\f00d";color:#d9534f}.o_ac_order_status_warning_icon:before{content:"\f12a";color:#f0ad4e}.o_scorm_org:before{content:"\f187"}.o_scorm_item:before{content:"\f016"}.o_scorm_completed:before,.o_scorm_passed:before{content:"\f058"}.o_scorm_failed:before{content:"\f071"}.o_scorm_incomplete:before{content:"\f071"}.o_scorm_not_attempted:before{background:none}.o_midpub:before{content:"\f058"}.o_midwarn:before{content:"\f071"}.o_midlock:before{content:"\f023"}.o_miderr:before{content:"\f071"}.o_middel:before{content:"\f12d"}.o_filetype_file:before,.o_filetype_ico:before{content:"\f016"}.o_filetype_folder:before{content:"\f114"}.o_filetype_folder_open:before{content:"\f115"}.o_filetype_zip:before,.o_filetype_gz:before,.o_filetype_tar:before,.o_filetype_tgz:before{content:"\f1c6"}.o_filetype_css:before,.o_filetype_js:before,.o_filetype_java:before,.o_filetype_numbers:before,.o_filetype_ods:before,.o_filetype_xml:before,.o_filetype_xsl:before{content:"\f1c9"}.o_filetype_bat_icon:before,.o_filetype_bat:before,.o_filetype_exe:before,.o_filetype_app:before,.o_filetype_sh:before{content:"\f1c9"}.o_filetype_xls:before,.o_filetype_xlsx:before{content:"\f1c3"}.o_filetype_png:before,.o_filetype_tiff:before,.o_filetype_webp:before,.o_filetype_gif:before,.o_filetype_ico:before,.o_filetype_jpeg:before,.o_filetype_bmp:before,.o_filetype_odg:before,.o_filetype_eps:before,.o_filetype_jpg:before{content:"\f1c5"}.o_filetype_psd:before,.o_filetype_avi:before,.o_filetype_dvi:before,.o_filetype_mp4:before,.o_filetype_m4v:before,.o_filetype_webm:before,.o_filetype_ogg:before,.o_filetype_video:before,.o_filetype_mov:before,.o_filetype_mpeg:before,.o_filetype_mpg:before,.o_filetype_qt:before,.o_filetype_ra:before,.o_filetype_ram:before,.o_filetype_swf:before,.o_filetype_flv:before{content:"\f1c8"}.o_filetype_midi:before,.o_filetype_audio:before,.o_filetype_mp3:before,.o_filetype_m3u:before,.o_filetype_wav:before{content:"\f1c7"}.o_filetype_ps:before,.o_filetype_pdf:before{content:"\f1c1"}.o_filetype_key:before,.o_filetype_odp:before,.o_filetype_ppt:before,.o_filetype_pptx:before{content:"\f1c4"}.o_filetype_odf:before,.o_filetype_rtf:before,.o_filetype_readme:before,.o_filetype_README:before,.o_filetype_log:before,.o_filetype_txt:before,.o_filetype_htm:before,.o_filetype_html:before{content:"\f0f6"}.o_filetype_odt:before,.o_filetype_pages:before,.o_filetype_doc:before,.o_filetype_docx:before{content:"\f1c2"}.o_icon_share_social:before{content:"\f14d"}.o_icon_apple:before{content:"\f179"}.o_icon_facebook:before{content:"\f082"}.o_icon_twitter:before{content:"\f081"}.o_icon_google:before{content:"\f0d4"}.o_icon_delicious:before{content:"\f1a5"}.o_icon_digg:before{content:"\f1a6"}.o_icon_mailto:before{content:"\f199"}.o_icon_link:before{content:"\f0c1"}.o_icon_yahoo:before{content:"\f19e"}a.o_icon:hover,a.o_icon:focus{text-decoration:none}img.o_emoticons_angel{background:url(../light/images/emoticons/smiley-angel.png);width:16px;height:16px}img.o_emoticons_angry{background:url(../light/images/emoticons/smiley-mad.png);width:16px;height:16px}img.o_emoticons_blushing{background:url(../light/images/emoticons/smiley-red.png);width:16px;height:16px}img.o_emoticons_confused{background:url(../light/images/emoticons/smiley-confuse.png);width:16px;height:16px}img.o_emoticons_cool{background:url(../light/images/emoticons/smiley-cool.png);width:16px;height:16px}img.o_emoticons_cry{background:url(../light/images/emoticons/smiley-cry.png);width:16px;height:16px}img.o_emoticons_devil{background:url(../light/images/emoticons/smiley-evil.png);width:16px;height:16px}img.o_emoticons_grin{background:url(../light/images/emoticons/smiley-grin.png);width:16px;height:16px}img.o_emoticons_kiss{background:url(../light/images/emoticons/smiley-kiss.png);width:16px;height:16px}img.o_emoticons_ohoh{background:url(../light/images/emoticons/smiley-eek.png);width:16px;height:16px}img.o_emoticons_sad{background:url(../light/images/emoticons/smiley-sad.png);width:16px;height:16px}img.o_emoticons_sick{background:url(../light/images/emoticons/smiley-sad-blue.png);width:16px;height:16px}img.o_emoticons_smile{background:url(../light/images/emoticons/smiley.png);width:16px;height:16px}img.o_emoticons_tongue{background:url(../light/images/emoticons/smiley-razz.png);width:16px;height:16px}img.o_emoticons_ugly{background:url(../light/images/emoticons/smiley-money.png);width:16px;height:16px}img.o_emoticons_weird{background:url(../light/images/emoticons/smiley-nerd.png);width:16px;height:16px}img.o_emoticons_wink{background:url(../light/images/emoticons/smiley-wink.png);width:16px;height:16px}img.o_emoticons_worried{background:url(../light/images/emoticons/smiley-roll-blue.png);width:16px;height:16px}img.o_emoticons_up{background:url(../light/images/emoticons/thumb-up.png);width:16px;height:16px}img.o_emoticons_down{background:url(../light/images/emoticons/thumb.png);width:16px;height:16px}.o_block_bottom,.o_block,.o_button_group,.o_block_with_datecomp .o_content,.o_course_run .o_toc .o_entry,.o_header_with_buttons,.o_search_result{margin-bottom:1em}.o_block_top,.o_block,.o_button_group,.o_block_with_datecomp .o_content,.o_course_run .o_toc .o_entry{margin-top:1em}.o_block_large_bottom,.o_block_large,.o_block_with_datecomp,.o_login .o_login_footer_wrapper,.o_portlet{margin-bottom:2em}.o_block_large_top,.o_block_large,.o_block_with_datecomp,.o_login .o_login_footer_wrapper,.o_portlet{margin-top:2em}.o_scrollblock,div.b_scrollblock{overflow-x:auto;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.o_button_group{text-align:center}.o_button_group a,.o_button_group input,.o_button_group button,.o_button_group .btn-group{margin-right:5px;margin-bottom:0.5em}.o_button_group a:last-child,.o_button_group input:last-child,.o_button_group button:last-child,.o_button_group .btn-group:last-child{margin-right:0}.o_button_group .btn-group a,.o_button_group .btn-group input,.o_button_group .btn-group button{margin-right:0;margin-bottom:0}.o_button_group .dropdown-menu{text-align:left}.o_button_group_left{text-align:left}.o_button_group_right{text-align:right}.o_button_group_top{margin-top:0}.o_header_with_buttons:before,.o_header_with_buttons:after{content:" ";display:table}.o_header_with_buttons:after{clear:both}.o_header_with_buttons h1,.o_header_with_buttons h3,.o_header_with_buttons h4,.o_header_with_buttons .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_header_with_buttons h2{display:inline-block}.o_header_with_buttons .o_button_group{margin-top:10px;margin-bottom:0;float:right}.panel-heading.o_header_with_buttons{margin-bottom:0}.o_xsmall,.b_xsmall,p.b_xsmall,div.b_xsmall{font-size:12px}.o_small,.b_small,p.b_small,div.b_small,.o_comments .o_comment_wrapper h5,.o_comments .o_comment_wrapper .o_comment,.o_bc_meta,.tooltip,.o_htmleditor .o_metadata .o_lastmodified,.o_noti,.o_block_with_datecomp .o_meta,.o_togglebox_wrapper div.o_togglebox_content .o_hide,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_state,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_label,.o_course_run .o_toc .o_entry{font-size:12px}.o_large,.b_large,p.b_large,div.b_large{font-size:18px}.o_xlarge,.b_xlarge,p.b_xlarge,div.b_xlarge{font-size:18px}.o_disabled,.b_disabled,p.b_disabled,div.b_disabled{color:#777 !important;cursor:default}.o_disabled:hover,.b_disabled:hover{color:#777 !important}.o_dimmed,.b_dimmed,p.b_dimmed,div.b_dimmed{opacity:0.4;filter:alpha(opacity=40)}.o_selected,.b_selected,p.b_selected,div.b_selected{font-weight:bold}.o_deleted,.b_deleted,p.b_deleted,div.b_deleted{text-decoration:line-through}.o_clickable{cursor:pointer}.o_ochre{color:#c8a959}.o_blue{color:#12223F}.o_undecorated:hover,.o_undecorated:focus,.o_disabled:hover,.b_disabled:hover,#o_main_wrapper #o_toplink:hover,#o_footer_powered a:hover,#o_share a:hover,#o_share_social_container a:hover,.o_toolbar .o_tools_container a:hover,.o_button_toggle:hover,.o_im_message_group .o_im_from:hover,.o_noti .o_label:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_comments:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:hover,.o_catalog .o_level .o_meta .o_title a:hover,.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:hover,.o_repo_details .o_social .o_comments:hover,.o_login .o_login_register:hover,.o_disabled:focus,.b_disabled:focus,#o_main_wrapper #o_toplink:focus,#o_footer_powered a:focus,#o_share a:focus,#o_share_social_container a:focus,.o_toolbar .o_tools_container a:focus,.o_button_toggle:focus,.o_im_message_group .o_im_from:focus,.o_noti .o_label:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_comments:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:focus,.o_catalog .o_level .o_meta .o_title a:focus,.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:focus,.o_repo_details .o_social .o_comments:focus,.o_login .o_login_register:focus{text-decoration:none}.o_copy_code,.b_copy_code,p.b_copy_code,div.b_copy_code,code,pre{overflow-x:auto;overflow-y:auto;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}.o_nowrap,.b_copy_code,p.b_copy_code,div.b_copy_code,code{white-space:nowrap}.o_titled_wrapper .o_content{margin-top:20px}.o_video,.b_video{display:inline-block;max-width:100%;height:auto}.o_image,img,.b_image{display:inline-block;max-width:100%;height:auto}.o_with_hyphens{-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}h1{color:#337ab7}h2{color:#337ab7}h3{color:#337ab7}h4,.o_cal .fc-header-title h2{color:#337ab7}h5{color:#337ab7}h5{color:#337ab7}fieldset legend{color:#333}.b_border_box,p.b_border_box,div.b_border_box{border:1px solid #777;padding:1em;border-top-right-radius:3px;border-top-left-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}table td{vertical-align:top}table.b_grid{width:99.5%;background:transparent;border-collapse:separate}table.b_grid td,table.b_grid th{padding:1px 5px;border:1px solid #777}table.b_grid th{background:#eee}table.b_border{width:99.5%;background:transparent;border-collapse:collapse}table.b_border td,table.b_border th{padding:1px 5px;border:1px solid #777}table.b_border th{background:#eee}table.b_borderless{width:99.5%;background:transparent;border-collapse:separate}table.b_borderless td,table.b_borderless th{padding:1px 5px;border:0}table.b_full{width:99.5%}table.b_middle{background:transparent}table.b_middle td{vertical-align:middle}.b_align_normal{text-align:left}.b_align_center{text-align:center}.b_align_inverse{text-align:right}.b_align_justified{text-align:justify}a.b_link_extern{color:#337ab7}a.b_link_extern:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:"\f08e"}a.b_link_mailto{color:#337ab7}a.b_link_mailto:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:"\f003"}a.b_link_forward{color:#337ab7}a.b_link_forward:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:"\f064"}img.b_float_left{float:left;margin:0 2em 2em 0}img.b_float_left_clear{clear:both;margin:0 2em 2em 0;display:block}img.b_float_right{float:right;margin:0 0 2em 2em}img.b_float_right_clear{clear:both;display:block;margin:0 0 2em auto}img.b_centered{clear:both;display:block;margin:0 auto 2em auto}img.b_circle{border-radius:50%}img.b_with_border{border:1px solid #ddd;padding:3px;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}span.olatFlashMovieViewer{max-width:100%;height:auto !important}.mejs-container,.mejs-mediaelement video,.mejs-layers div{max-width:100%}.b_clear_float,p.b_clear_float,div.b_clear_float{clear:both}html{position:relative;min-height:100%}body{min-height:100%;margin-bottom:80px}#o_main_wrapper{background:#fff;z-index:3}#o_main_wrapper #o_main_container{background:#fff}#o_main_wrapper #o_main_container #o_main_left{float:left;z-index:2;position:relative;background:#fff}#o_main_wrapper #o_main_container #o_main_left #o_main_left_content{padding:0 0 0 15px}#o_main_wrapper #o_main_container #o_main_left #o_main_left_toggle{position:absolute;display:none;right:0;top:70px;margin-right:-30px;font-size:25px;line-height:35px;text-align:center;width:30px;height:35px;z-index:3;border:1px solid #ddd;border-left:none;border-bottom-right-radius:4px;border-top-right-radius:4px;background-color:#fbfbfb;-webkit-box-shadow:2px 0px 4px 1px rgba(0,0,0,0.15);box-shadow:2px 0px 4px 1px rgba(0,0,0,0.15);color:#337ab7}#o_main_wrapper #o_main_container #o_main_left.o_offcanvas{background:#fbfbfb;-webkit-box-shadow:0px 0px 6px 1px rgba(0,0,0,0.2);box-shadow:0px 0px 6px 1px rgba(0,0,0,0.2);min-width:250px}#o_main_wrapper #o_main_container #o_main_left.o_offcanvas #o_main_left_content{padding:0 0 0 0}#o_main_wrapper #o_main_container #o_main_right{float:right;z-index:2;position:relative;background:inherit}#o_main_wrapper #o_main_container #o_main_right #o_main_right_content{padding:0 15px 0 0}#o_main_wrapper #o_main_container #o_main_center{position:relative;z-index:1;background:inherit}#o_main_wrapper #o_main_container #o_main_center h2:first-child{margin-top:0}@media screen and (max-width: 767px){#o_main_wrapper #o_main_container #o_main_center{margin-left:0 !important}}#o_main_wrapper #o_main_container #o_main_center #o_main_center_content{padding:0 15px}#o_main_wrapper #o_main_container #o_main_center #o_main_center_content #o_main_center_content_inner{padding-bottom:15px}#o_main_wrapper #o_toplink{position:absolute;bottom:0;right:15px;text-align:center;z-index:3}@media (max-width: 767px){#o_main_wrapper #o_main_container #o_main_center #o_main_center_content{padding:15px}} +@media print{.hidden-print{display:none !important}}body .modal{position:absolute;overflow:visible}body div.tooltip-inner{max-width:400px}body div.popover{max-width:450px}body .modal-body.alert{border-radius:0}body .progress{margin-bottom:0}.panel-body:nth-child(n+2){border-top:1px solid #ddd}.panel .panel-heading[data-toggle="collapse"]{cursor:pointer}#o_ajax_busy_backdrop{bottom:0;z-index:1020}.form-control-feedback{top:10px}.form-horizontal .has-feedback .form-control-feedback{top:10px}.btn.btn-primary.o_disabled{color:#fff !important}body .progress-bar[aria-valuenow="1"],body .progress-bar[aria-valuenow="2"]{min-width:1px}@-moz-document url-prefix(){fieldset{display:table-cell}}@font-face{font-family:'openolat';src:url("../light/fonts/openolat/openolat.eot?4yacgg");src:url("../light/fonts/openolat/openolat.eot?#iefix4yacgg") format("embedded-opentype"),url("../light/fonts/openolat/openolat.woff?4yacgg") format("woff"),url("../light/fonts/openolat/openolat.ttf?4yacgg") format("truetype"),url("../light/fonts/openolat/openolat.svg?4yacgg#openolat") format("svg");font-weight:normal;font-style:normal}@font-face{font-family:'FontAwesome';src:url("../../font-awesome/fonts/fontawesome-webfont.eot?v=4.2.0");src:url("../../font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.2.0") format("embedded-opentype"),url("../../font-awesome/fonts/fontawesome-webfont.woff?v=4.2.0") format("woff"),url("../../font-awesome/fonts/fontawesome-webfont.ttf?v=4.2.0") format("truetype"),url("../../font-awesome/fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.o_icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.o_icon-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.o_icon-2x{font-size:2em}.o_icon-3x{font-size:3em}.o_icon-4x{font-size:4em}.o_icon-5x{font-size:5em}.o_icon-fw{width:1.28571em;text-align:center}.o_icon-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.o_icon-ul>li{position:relative}.o_icon-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.o_icon-li.o_icon-lg{left:-1.85714em}.o_icon-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.o_icon.pull-left{margin-right:.3em}.o_icon.pull-right{margin-left:.3em}.o_icon-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.o_icon-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.o_icon-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.o_icon-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.o_icon-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.o_icon-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .o_icon-rotate-90,:root .o_icon-rotate-180,:root .o_icon-rotate-270,:root .o_icon-flip-horizontal,:root .o_icon-flip-vertical{filter:none}.o_icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.o_icon-stack-1x,.o_icon-stack-2x{position:absolute;left:0;width:100%;text-align:center}.o_icon-stack-1x{line-height:inherit}.o_icon-stack-2x{font-size:2em}.o_icon-inverse{color:#fff}.o_icon_accessibility:before{content:"\f193"}.o_icon_actions:before{content:"\f085"}.o_icon_archive_tool:before{content:"\f019"}.o_icon_assessment_mode:before{content:"\f044"}.o_icon_assessment_tool:before{content:"\f091"}.o_icon_attempt_limit:before{content:"\f021"}.o_icon_accept:before{content:"\f00c";color:#5cb85c}.o_icon_add:before{content:"\f055"}.o_icon_add_search:before{content:"\f00e"}.o_icon_audio:before{content:"\f028"}.o_icon_back:before{content:"\f053"}.o_icon_back_history:before{content:"\f1da"}.o_icon_banned:before{content:"\f0c3";color:#d9534f}.o_icon_bold:before{content:"\f032"}.o_icon_booking:before{content:"\f07a"}.o_icon_bookmark:before{content:"\f02e";color:#bc2d0c}.o_icon_bookmark_add:before{content:"\f097"}.o_icon_bookmark_header:before{content:"\f02e"}.o_icon_browse:before{content:"\f00e"}.o_icon_browsercheck:before{content:"\f164"}.o_icon_busy:before{content:"\f110"}.o_icon_calendar:before{content:"\f073"}.o_icon_calendar_enabled:before{content:"\f05d"}.o_icon_calendar_disabled:before{content:"\f10c"}.o_icon_calendar:before{content:"\f073"}.o_icon_caret:before{content:"\f0d7"}.o_icon_caret_right:before{content:"\f0da"}.o_icon_catalog:before{content:"\f0e8"}.o_icon_catalog_sub:before{content:"\f07b"}.o_icon_certificate:before{content:"\f0a3"}.o_icon_chat:before{content:"\f0e5"}.o_icon_check:before{content:"\f00c"}.o_icon_check_off:before{content:"\f096"}.o_icon_check_on:before{content:"\f046"}.o_icon_checkbox:before{content:"\f096"}.o_icon_checkbox_checked:before{content:"\f14a"}.o_icon_cleanup:before{content:"\f0f9"}.o_icon_close:before{content:"\f00d"}.o_icon_close_resource:before{content:"\f011"}.o_icon_close_tab:before{content:"\f00d"}.o_icon_close_tool:before{content:"\f00d"}.o_icon_close_tree:before{content:"\f0d7"}.o_icon_close_togglebox:before,.o_togglebox_wrapper .o_opener.o_in i:before{content:"\f0d7"}.o_icon_code:before{content:"\f121"}.o_icon_color_picker:before{content:"\f043"}.o_icon_copy:before{content:"\f0c5"}.o_icon_courseareas:before{content:"\f1db"}.o_icon_coursedb:before{content:"\f1c0"}.o_icon_courseeditor:before{content:"\f044"}.o_icon_coursefolder:before{content:"\f114"}.o_icon_courserun:before{content:"\f1b2"}.o_icon_comments:before{content:"\f086"}.o_icon_comments_none:before{content:"\f0e5"}.o_icon_content_popup:before{content:"\f08e"}.o_icon_correct_answer:before{content:"\f00c";color:#5cb85c}.o_icon_customize:before{content:"\f013"}.o_icon_delete_item:before{content:"\f1f8"}.o_icon_delete:before{content:"\f056";color:#A87E7E}.o_icon_details:before{content:"\f0eb"}.o_icon_description:before{content:"\f05a"}.o_icon_dev:before{content:"\f188"}.o_icon_disabled:before{content:"\f10c"}.o_icon_download:before{content:"\f019"}.o_icon_edit:before{content:"\f044"}.o_icon_edit_file:before{content:"\f044"}.o_icon_edit_metadata:before{content:"\f013"}.o_icon_enabled:before{content:"\f111"}.o_icon_enlarge:before{content:"\f00e"}.o_icon_eportfolio_add:before{content:"\f12e"}.o_icon_eportfolio_link:before{content:"\f12e"}.o_icon_error:before{content:"\f06a";color:#d9534f}.o_icon_expenditure:before{content:"\f017"}.o_icon_export:before{content:"\f045"}.o_icon_external_link:before{content:"\f08e"}.o_icon_failed:before{content:"\f057"}.o_icon_filter:before{content:"\f0b0"}.o_icon_graduate:before{content:"\f19d"}.o_icon_group:before,.o_BusinessGroup_icon:before{content:"\f0c0"}.o_icon_header:before{content:"\f1dc"}.o_icon_help:before{content:"\f059";cursor:help}.o_icon_home:before{content:"\f015"}.o_icon_impress:before{content:"\f05a"}.o_icon_important:before{content:"\f071";color:#f0ad4e}.o_icon_import:before{content:"\f093"}.o_icon_info:before{content:"\f05a";color:#5bc0de}.o_icon_info_msg:before{content:"\f06a";color:#d9534f}.o_icon_inline_editable:before{content:"\f044"}.o_icon_institution:before{content:"\f19c"}.o_icon_italic:before{content:"\f033"}.o_icon_landingpage:before{content:"\f140"}.o_icon_language:before{content:"\f0ac"}.o_icon_layout:before{content:"\f1c5"}.o_icon_link:before{content:"\f0c1"}.o_icon_link_extern:before{content:"\f08e"}.o_icon_list:before{content:"\f03a"}.o_icon_list_num :before{content:"\f0cb"}.o_icon_lifecycle:before{content:"\f073"}.o_icon_locked:before{content:"\f023"}.o_icon_login:before{content:"\f090"}.o_icon_logout:before{content:"\f08b"}.o_icon_mandatory:before{content:"\f069";color:#f0ad4e}.o_icon_managed:before{content:"\f079";color:#777}.o_icon_manual:before{content:"\f02d";cursor:help}.o_icon_mail:before{content:"\f003"}.o_icon_math:before{content:"\f198"}.o_icon_membersmanagement:before{content:"\f0c0"}.o_icon_menuhandel:before{content:"\f0c9"}.o_icon_message:before{content:"\f0e0"}.o_icon_mobile:before{content:"\f10b"}.o_icon_move:before{content:"\f047"}.o_icon_move_down:before{content:"\f103"}.o_icon_move_left:before{content:"\f100"}.o_icon_move_right:before{content:"\f101"}.o_icon_move_up:before{content:"\f102"}.o_icon_new:before{content:"\f069";color:#5cb85c}.o_icon_new_document:before{content:"\f15c"}.o_icon_new_folder:before{content:"\f07b"}.o_icon_news:before{content:"\f05a"}.o_icon_next:before{content:"\f138"}.o_icon_next_page:before{content:"\f101"}.o_icon_next_toolbar:before{content:"\f0da"}.o_icon_node_after:before{content:"\f175"}.o_icon_node_before:before{content:"\f176"}.o_icon_node_under:before{content:"\f112"}.o_icon_notes:before{content:"\f1e8"}.o_icon_notification:before{content:"\f09e"}.o_icon_open_tree:before{content:"\f0da"}.o_icon_open_togglebox:before,.o_togglebox_wrapper .o_opener i:before{content:"\f0da"}.o_icon_openolat:before,.o_icon_provider_olat:before{content:"\E600";font-family:openolat;font-size:10px}.o_icon_options:before{content:"\f205"}.o_icon_pageing:before{content:"\f141"}.o_icon_passed:before{content:"\f058"}.o_icon_password:before{content:"\f023"}.o_icon_pending:before{content:"\f110"}.o_icon_phone:before{content:"\f095"}.o_icon_post:before{content:"\f0e5"}.o_icon_preview:before{content:"\f06e"}.o_icon_previous:before{content:"\f137"}.o_icon_previous_page:before{content:"\f100"}.o_icon_previous_toolbar:before{content:"\f0d9"}.o_icon_print:before{content:"\f02f"}.o_icon_private:before{content:"\f02f"}.o_icon_provider_adfs:before{content:"\f17a"}.o_icon_provider_facebook:before{content:"\f09a"}.o_icon_provider_google:before{content:"\f0d5"}.o_icon_provider_guest:before{content:"\f1ae"}.o_icon_provider_ldap:before{content:"\f19c"}.o_icon_provider_linkedin:before{content:"\f0e1"}.o_icon_provider_oauth:before{content:"\f0c2"}.o_icon_provider_shibboleth:before{content:"\f19c"}.o_icon_provider_twitter:before{content:"\f099"}.o_icon_publish:before{content:"\f064"}.o_icon_qrcode:before{content:"\f029"}.o_icon_quickview:before{content:"\f06e"}.o_icon_radio_off:before{content:"\f10c"}.o_icon_radio_on:before{content:"\f05d"}.o_icon_rating_on:before,.o_rating .o_rating_items.o_enabled .o_icon:hover:before{content:"\f005"}.o_icon_rating_off:before{content:"\f006"}.o_icon_read:before{content:"\f10c"}.o_icon_readonly:before{content:"\f044";color:red}.o_icon_readwrite:before{content:"\f044"}.o_icon_recycle:before{content:"\f1b8"}.o_icon_refresh:before{content:"\f021"}.o_icon_reject:before{content:"\f00d";color:#d9534f}.o_icon_reminder:before{content:"\f0a6"}.o_icon_remove:before{content:"\f00d"}.o_icon_replace:before{content:"\f0c5"}.o_icon_reply:before{content:"\f112"}.o_icon_reply_with_quote:before{content:"\f122"}.o_icon_response_feedback:before{content:"\f021"}.o_icon_review:before{content:"\f06e"}.o_icon_rss:before{content:"\f09e"}.o_icon_rss_unsubscribe:before{content:"\f09e";color:#996633}.o_icon_search:before{content:"\f002"}.o_icon_select:before{content:"\f00c"}.o_icon_send:before{content:"\f0e0"}.o_icon_settings:before{content:"\f085"}.o_icon_share:before{content:"\f064"}.o_icon_show_more:before{content:"\f150"}.o_icon_show_less:before{content:"\f151"}.o_icon_show_send:before{content:"\f1d9"}.o_icon_sign_out:before{content:"\f08b"}.o_icon_spacer:before{content:"\f07e"}.o_icon_split:before{content:"\f127"}.o_icon_sort:before{content:"\f0dc"}.o_icon_sort_asc:before{content:"\f0de"}.o_icon_sort_desc:before{content:"\f0dd"}.o_icon_sort_menu:before{content:"\f160"}.o_icon_start:before{content:"\f054"}.o_icon_status_available:before{content:"\f111";color:#063}.o_icon_status_chat:before{content:"\f075"}.o_icon_status_dnd:before{content:"\f192";color:#cc3}.o_icon_status_unavailable:before{content:"\f05c";color:#963}.o_icon_statistics_tool:before{content:"\f080"}.o_icon_submit:before{content:"\f00c"}.o_icon_table:before{content:"\f0ce"}.o_icon_table_large:before{content:"\f009"}.o_icon_tags:before{content:"\f02c"}.o_icon_timelimit:before{content:"\f1e2"}.o_icon_toggle:before{content:"\f111"}.o_icon_to_read:before{content:"\f111"}.o_icon_tool:before{content:"\f013"}.o_icon_tools:before{content:"\f0ad"}.o_icon_top:before{content:"\f077"}.o_icon_translation_item:before{content:"\f1c9"}.o_icon_translation_package:before{content:"\f115"}.o_icon_user:before{content:"\f007"}.o_icon_user_vip:before{content:"\f19d"}.o_icon_user_anonymous:before{content:"\f128"}.o_icon_upload:before{content:"\f093"}.o_icon_version:before{content:"\f1da"}.o_icon_video:before{content:"\f008"}.o_icon_waiting:before{content:"\f017"}.o_icon_warn:before{content:"\f071";color:#f0ad4e}.o_icon_wizard:before{content:"\f0d0"}.o_CourseModule_icon:before,.o_course_icon:before{content:"\f1b2"}.o_EPStructuredMapTemplate_icon:before{content:"\f12e"}.o_FileResource-BLOG_icon:before{content:"\f0a1"}.o_FileResource-IMSCP_icon:before{content:"\f187"}.o_FileResource-PODCAST_icon:before{content:"\f03d"}.o_FileResource-SHAREDFOLDER:before{content:"\f08e"}.o_FileResource-SCORMCP_icon:before{content:"\f187"}.o_FileResource-SURVEY_icon:before{content:"\f11a"}.o_FileResource-TEST_icon:before{content:"\f044"}.o_FileResource-WIKI_icon:before{content:"\f0ac"}.o_FileResource-SHAREDFOLDER_icon:before{content:"\f115"}.o_FileResource-GLOSSARY_icon:before{content:"\f19d"}.o_FileResource-PDF_icon:before{content:"\f1c1"}.o_FileResource-XLS_icon:before{content:"\f1c3"}.o_FileResource-PPT_icon:before{content:"\f1c4"}.o_FileResource-DOC_icon:before{content:"\f1c2"}.o_FileResource-ANIM_icon:before{content:"\f1c8"}.o_FileResource-IMAGE_icon:before{content:"\f1c5"}.o_FileResource-SOUND_icon:before{content:"\f1c7"}.o_FileResource-MOVIE_icon:before{content:"\f1c8"}.o_FileResource-FILE_icon:before{content:"\f016"}.o_CourseModule_icon_closed:before{content:"\f05e"}.o_sp_icon:before{content:"\f0f6"}.o_st_icon:before{content:"\f1b3"}.o_tu_icon:before{content:"\f08e"}.o_bc_icon:before{content:"\f115"}.o_lti_icon:before{content:"\f08e"}.o_cp_icon:before{content:"\f187"}.o_cp_item:before{content:"\f0f6"}.o_scorm_icon:before{content:"\f187"}.o_en_icon:before{content:"\f090"}.o_fo_icon:before{content:"\f0e6"}.o_co_icon:before{content:"\f003"}.o_infomsg_icon:before{content:"\f05a"}.o_cal_icon:before{content:"\f073"}.o_wiki_icon:before{content:"\f0ac"}.o_podcast_icon:before{content:"\f03d"}.o_blog_icon:before{content:"\f0a1"}.o_ep_icon:before{content:"\f12e"}.o_iqtest_icon:before{content:"\f044"}.o_iqself_icon:before{content:"\f044"}.o_iqsurv_icon:before{content:"\f11a"}.o_ta_icon:before{content:"\f0ae"}.o_gta_icon:before{content:"\f0ae"}.o_ms_icon:before{content:"\f087"}.o_dialog_icon:before{content:"\f0c5"}.o_projectbroker_icon:before{content:"\f10c"}.o_ll_icon:before{content:"\f0c1"}.o_den_icon:before{content:"\f133"}.o_cmembers_icon:before{content:"\f0c0"}.o_cl_icon:before{content:"\f046"}.o_vc_icon:before{content:"\f108"}.o_vitero_icon:before{content:"\f108"}.o_openmeetings_icon:before{content:"\f108"}.o_portlet_infomsg_icon:before{content:"\f05a"}.o_portlet_quickstart_icon:before{content:"\f1d9"}.o_portlet_bookmark_icon:before{content:"\f02e"}.o_portlet_groups_icon:before{content:"\f0c0"}.o_portlet_notes_icon:before{content:"\f1e8"}.o_portlet_noti_icon:before{content:"\f09e"}.o_portlet_eff_icon:before{content:"\f0a3"}.o_portlet_repository_student_icon:before{content:"\f1b3"}.o_portlet_repository_teacher_icon:before{content:"\f19d"}.o_portlet_iframe_icon:before{content:"\f005"}.o_portlet_sysinfo_icon:before{content:"\f0e4"}.o_portlet_dyk_icon:before{content:"\f0eb"}.o_portlet_infomessages_icon:before{content:"\f0e5"}.o_portlet_cal_icon:before{content:"\f073"}.o_portlet_institutions_icon:before{content:"\f19c"}.o_portlet_links_icon:before{content:"\f0c1"}.o_portlet_shibboleth_icon:before{content:"\f090"}.o_icon_qpool:before{content:"\f19c"}.o_icon_pool_private:before{content:"\f096"}.o_icon_pool_public:before{content:"\f046"}.o_icon_pool_my_items:before{content:"\f007"}.o_icon_pool_favorits:before{content:"\f02e"}.o_icon_pool_collection:before{content:"\f03a"}.o_icon_pool_pool:before{content:"\f1e1"}.o_icon_pool_share:before{content:"\f0c0"}.o_forum_message_icon:before{content:"\f0e5"}.o_calendar_icon:before{content:"\f073"}.o_forum_status_thread_icon:before{content:"\f0e6"}.o_forum_status_sticky_closed_icon:before{content:"\f05e"}.o_forum_status_sticky_icon:before{content:"\f086"}.o_forum_status_closed_icon:before{content:"\f05e";color:#a94442}.o_forum_status_opened_icon:before{content:"\f05e";color:#3c763d}.o_forum_status_hidden_icon:before{content:"\f070";color:#a94442}.o_forum_status_visible_icon:before{content:"\f06e";color:#3c763d}.o_mi_qpool_import:before{content:"\f1c0"}.o_mi_qtisection:before{content:"\f1b3"}.o_mi_qtisc:before{content:"\f192"}.o_mi_qtimc:before{content:"\f046"}.o_mi_qtikprim:before{content:"\f14a"}.o_mi_qtifib:before{content:"\f141"}.o_mi_qtiessay:before{content:"\f036"}.o_as_mode_leadtime:before{content:"\f017"}.o_as_mode_assessment:before{content:"\f04b"}.o_as_mode_followup:before{content:"\f05e"}.o_as_mode_closed:before{content:'-'}.o_black_led:before{content:"\f111";color:#337ab7}.o_green_led:before{content:"\f111";color:#5cb85c}.o_yellow_led:before{content:"\f111";color:#f0ad4e}.o_red_led:before{content:"\f111";color:#d9534f}.o_ac_token_icon:before{content:"\f084"}.o_ac_free_icon:before{content:"\f06b"}.o_ac_group_icon:before{content:"\f0c0"}.o_ac_membersonly_icon:before{content:"\f023"}.o_ac_paypal_icon:before{content:"\f1f4"}.o_ac_status_canceled_icon:before{content:"\f068";color:#f0ad4e}.o_ac_status_error_icon:before{content:"\f00d";color:#d9534f}.o_ac_status_new_icon:before{content:"\f069";color:#337ab7}.o_ac_status_succes_icon:before{content:"\f00c";color:#5cb85c}.o_ac_status_waiting_icon:before{content:"\f017";color:#337ab7}.o_ac_order_status_new_icon:before{content:"\f069";color:#337ab7}.o_ac_order_status_prepayment_icon:before{content:"\f0d6";color:#5bc0de}.o_ac_order_status_payed_icon:before{content:"\f00c";color:#5cb85c}.o_ac_order_status_canceled_icon:before{content:"\f068";color:#f0ad4e}.o_ac_order_status_error_icon:before{content:"\f00d";color:#d9534f}.o_ac_order_status_warning_icon:before{content:"\f12a";color:#f0ad4e}.o_scorm_org:before{content:"\f187"}.o_scorm_item:before{content:"\f016"}.o_scorm_completed:before,.o_scorm_passed:before{content:"\f058"}.o_scorm_failed:before{content:"\f071"}.o_scorm_incomplete:before{content:"\f071"}.o_scorm_not_attempted:before{background:none}.o_midpub:before{content:"\f058"}.o_midwarn:before{content:"\f071"}.o_midlock:before{content:"\f023"}.o_miderr:before{content:"\f071"}.o_middel:before{content:"\f12d"}.o_filetype_file:before,.o_filetype_ico:before{content:"\f016"}.o_filetype_folder:before{content:"\f114"}.o_filetype_folder_open:before{content:"\f115"}.o_filetype_zip:before,.o_filetype_gz:before,.o_filetype_tar:before,.o_filetype_tgz:before{content:"\f1c6"}.o_filetype_css:before,.o_filetype_js:before,.o_filetype_java:before,.o_filetype_numbers:before,.o_filetype_ods:before,.o_filetype_xml:before,.o_filetype_xsl:before{content:"\f1c9"}.o_filetype_bat_icon:before,.o_filetype_bat:before,.o_filetype_exe:before,.o_filetype_app:before,.o_filetype_sh:before{content:"\f1c9"}.o_filetype_xls:before,.o_filetype_xlsx:before{content:"\f1c3"}.o_filetype_png:before,.o_filetype_tiff:before,.o_filetype_webp:before,.o_filetype_gif:before,.o_filetype_ico:before,.o_filetype_jpeg:before,.o_filetype_bmp:before,.o_filetype_odg:before,.o_filetype_eps:before,.o_filetype_jpg:before{content:"\f1c5"}.o_filetype_psd:before,.o_filetype_avi:before,.o_filetype_dvi:before,.o_filetype_mp4:before,.o_filetype_m4v:before,.o_filetype_webm:before,.o_filetype_ogg:before,.o_filetype_video:before,.o_filetype_mov:before,.o_filetype_mpeg:before,.o_filetype_mpg:before,.o_filetype_qt:before,.o_filetype_ra:before,.o_filetype_ram:before,.o_filetype_swf:before,.o_filetype_flv:before{content:"\f1c8"}.o_filetype_midi:before,.o_filetype_audio:before,.o_filetype_mp3:before,.o_filetype_m3u:before,.o_filetype_wav:before{content:"\f1c7"}.o_filetype_ps:before,.o_filetype_pdf:before{content:"\f1c1"}.o_filetype_key:before,.o_filetype_odp:before,.o_filetype_ppt:before,.o_filetype_pptx:before{content:"\f1c4"}.o_filetype_odf:before,.o_filetype_rtf:before,.o_filetype_readme:before,.o_filetype_README:before,.o_filetype_log:before,.o_filetype_txt:before,.o_filetype_htm:before,.o_filetype_html:before{content:"\f0f6"}.o_filetype_odt:before,.o_filetype_pages:before,.o_filetype_doc:before,.o_filetype_docx:before{content:"\f1c2"}.o_icon_share_social:before{content:"\f14d"}.o_icon_apple:before{content:"\f179"}.o_icon_facebook:before{content:"\f082"}.o_icon_twitter:before{content:"\f081"}.o_icon_google:before{content:"\f0d4"}.o_icon_delicious:before{content:"\f1a5"}.o_icon_digg:before{content:"\f1a6"}.o_icon_mailto:before{content:"\f199"}.o_icon_link:before{content:"\f0c1"}.o_icon_yahoo:before{content:"\f19e"}a.o_icon:hover,a.o_icon:focus{text-decoration:none}img.o_emoticons_angel{background:url(../light/images/emoticons/smiley-angel.png);width:16px;height:16px}img.o_emoticons_angry{background:url(../light/images/emoticons/smiley-mad.png);width:16px;height:16px}img.o_emoticons_blushing{background:url(../light/images/emoticons/smiley-red.png);width:16px;height:16px}img.o_emoticons_confused{background:url(../light/images/emoticons/smiley-confuse.png);width:16px;height:16px}img.o_emoticons_cool{background:url(../light/images/emoticons/smiley-cool.png);width:16px;height:16px}img.o_emoticons_cry{background:url(../light/images/emoticons/smiley-cry.png);width:16px;height:16px}img.o_emoticons_devil{background:url(../light/images/emoticons/smiley-evil.png);width:16px;height:16px}img.o_emoticons_grin{background:url(../light/images/emoticons/smiley-grin.png);width:16px;height:16px}img.o_emoticons_kiss{background:url(../light/images/emoticons/smiley-kiss.png);width:16px;height:16px}img.o_emoticons_ohoh{background:url(../light/images/emoticons/smiley-eek.png);width:16px;height:16px}img.o_emoticons_sad{background:url(../light/images/emoticons/smiley-sad.png);width:16px;height:16px}img.o_emoticons_sick{background:url(../light/images/emoticons/smiley-sad-blue.png);width:16px;height:16px}img.o_emoticons_smile{background:url(../light/images/emoticons/smiley.png);width:16px;height:16px}img.o_emoticons_tongue{background:url(../light/images/emoticons/smiley-razz.png);width:16px;height:16px}img.o_emoticons_ugly{background:url(../light/images/emoticons/smiley-money.png);width:16px;height:16px}img.o_emoticons_weird{background:url(../light/images/emoticons/smiley-nerd.png);width:16px;height:16px}img.o_emoticons_wink{background:url(../light/images/emoticons/smiley-wink.png);width:16px;height:16px}img.o_emoticons_worried{background:url(../light/images/emoticons/smiley-roll-blue.png);width:16px;height:16px}img.o_emoticons_up{background:url(../light/images/emoticons/thumb-up.png);width:16px;height:16px}img.o_emoticons_down{background:url(../light/images/emoticons/thumb.png);width:16px;height:16px}.o_block_bottom,.o_block,.o_button_group,.o_block_with_datecomp .o_content,.o_course_run .o_toc .o_entry,.o_header_with_buttons,.o_search_result{margin-bottom:1em}.o_block_top,.o_block,.o_button_group,.o_block_with_datecomp .o_content,.o_course_run .o_toc .o_entry{margin-top:1em}.o_block_large_bottom,.o_block_large,.o_block_with_datecomp,.o_login .o_login_footer_wrapper,.o_portlet{margin-bottom:2em}.o_block_large_top,.o_block_large,.o_block_with_datecomp,.o_login .o_login_footer_wrapper,.o_portlet{margin-top:2em}.o_scrollblock,div.b_scrollblock{overflow-x:auto;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.o_button_group{text-align:center}.o_button_group a,.o_button_group input,.o_button_group button,.o_button_group .btn-group{margin-right:5px;margin-bottom:0.5em}.o_button_group a:last-child,.o_button_group input:last-child,.o_button_group button:last-child,.o_button_group .btn-group:last-child{margin-right:0}.o_button_group .btn-group a,.o_button_group .btn-group input,.o_button_group .btn-group button{margin-right:0;margin-bottom:0}.o_button_group .dropdown-menu{text-align:left}.o_button_group_left{text-align:left}.o_button_group_right{text-align:right}.o_button_group_top{margin-top:0}.o_header_with_buttons:before,.o_header_with_buttons:after{content:" ";display:table}.o_header_with_buttons:after{clear:both}.o_header_with_buttons h1,.o_header_with_buttons h3,.o_header_with_buttons h4,.o_header_with_buttons .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_header_with_buttons h2{display:inline-block}.o_header_with_buttons .o_button_group{margin-top:10px;margin-bottom:0;float:right}.panel-heading.o_header_with_buttons{margin-bottom:0}.o_xsmall,.b_xsmall,p.b_xsmall,div.b_xsmall{font-size:12px}.o_small,.b_small,p.b_small,div.b_small,.o_comments .o_comment_wrapper h5,.o_comments .o_comment_wrapper .o_comment,.o_bc_meta,.tooltip,.o_htmleditor .o_metadata .o_lastmodified,.o_noti,.o_block_with_datecomp .o_meta,.o_togglebox_wrapper div.o_togglebox_content .o_hide,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_state,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_label,.o_course_run .o_toc .o_entry{font-size:12px}.o_large,.b_large,p.b_large,div.b_large{font-size:18px}.o_xlarge,.b_xlarge,p.b_xlarge,div.b_xlarge{font-size:18px}.o_disabled,.b_disabled,p.b_disabled,div.b_disabled{color:#777 !important;cursor:default}.o_disabled:hover,.b_disabled:hover{color:#777 !important}.o_dimmed,.b_dimmed,p.b_dimmed,div.b_dimmed{opacity:0.4;filter:alpha(opacity=40)}.o_selected,.b_selected,p.b_selected,div.b_selected{font-weight:bold}.o_deleted,.b_deleted,p.b_deleted,div.b_deleted{text-decoration:line-through}.o_clickable{cursor:pointer}.o_ochre{color:#c8a959}.o_blue{color:#12223F}.o_undecorated:hover,.o_undecorated:focus,.o_disabled:hover,.b_disabled:hover,#o_main_wrapper #o_toplink:hover,#o_footer_powered a:hover,#o_share a:hover,#o_share_social_container a:hover,.o_toolbar .o_tools_container a:hover,.o_button_toggle:hover,.o_im_message_group .o_im_from:hover,.o_noti .o_label:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_comments:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:hover,.o_catalog .o_level .o_meta .o_title a:hover,.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:hover,.o_repo_details .o_social .o_comments:hover,.o_login .o_login_register:hover,.o_disabled:focus,.b_disabled:focus,#o_main_wrapper #o_toplink:focus,#o_footer_powered a:focus,#o_share a:focus,#o_share_social_container a:focus,.o_toolbar .o_tools_container a:focus,.o_button_toggle:focus,.o_im_message_group .o_im_from:focus,.o_noti .o_label:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_comments:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:focus,.o_catalog .o_level .o_meta .o_title a:focus,.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:focus,.o_repo_details .o_social .o_comments:focus,.o_login .o_login_register:focus{text-decoration:none}.o_copy_code,.b_copy_code,p.b_copy_code,div.b_copy_code,code,pre{overflow-x:auto;overflow-y:auto;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}.o_nowrap,.b_copy_code,p.b_copy_code,div.b_copy_code,code{white-space:nowrap}.o_titled_wrapper .o_content{margin-top:20px}.o_video,.b_video{display:inline-block;max-width:100%;height:auto}.o_image,img,.b_image{display:inline-block;max-width:100%;height:auto}.o_with_hyphens{-webkit-hyphens:auto;-moz-hyphens:auto;-ms-hyphens:auto;hyphens:auto}h1{color:#337ab7}h2{color:#337ab7}h3{color:#337ab7}h4,.o_cal .fc-header-title h2{color:#337ab7}h5{color:#337ab7}h5{color:#337ab7}fieldset legend{color:#333}.b_border_box,p.b_border_box,div.b_border_box{border:1px solid #777;padding:1em;border-top-right-radius:3px;border-top-left-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}table td{vertical-align:top}table.b_grid{width:99.5%;background:transparent;border-collapse:separate}table.b_grid td,table.b_grid th{padding:1px 5px;border:1px solid #777}table.b_grid th{background:#eee}table.b_border{width:99.5%;background:transparent;border-collapse:collapse}table.b_border td,table.b_border th{padding:1px 5px;border:1px solid #777}table.b_border th{background:#eee}table.b_borderless{width:99.5%;background:transparent;border-collapse:separate}table.b_borderless td,table.b_borderless th{padding:1px 5px;border:0}table.b_full{width:99.5%}table.b_middle{background:transparent}table.b_middle td{vertical-align:middle}.b_align_normal{text-align:left}.b_align_center{text-align:center}.b_align_inverse{text-align:right}.b_align_justified{text-align:justify}a.b_link_extern{color:#337ab7}a.b_link_extern:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:"\f08e"}a.b_link_mailto{color:#337ab7}a.b_link_mailto:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:"\f003"}a.b_link_forward{color:#337ab7}a.b_link_forward:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;padding-right:0.5em;content:"\f064"}img.b_float_left{float:left;margin:0 2em 2em 0}img.b_float_left_clear{clear:both;margin:0 2em 2em 0;display:block}img.b_float_right{float:right;margin:0 0 2em 2em}img.b_float_right_clear{clear:both;display:block;margin:0 0 2em auto}img.b_centered{clear:both;display:block;margin:0 auto 2em auto}img.b_circle{border-radius:50%}img.b_with_border{border:1px solid #ddd;padding:3px;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}span.olatFlashMovieViewer{max-width:100%;height:auto !important}.mejs-container,.mejs-mediaelement video,.mejs-layers div{max-width:100%}.b_clear_float,p.b_clear_float,div.b_clear_float{clear:both}html{position:relative;min-height:100%}body{min-height:100%;margin-bottom:80px}#o_main_wrapper{background:#fff;z-index:3}#o_main_wrapper #o_main_container{background:#fff}#o_main_wrapper #o_main_container #o_main_left{float:left;z-index:2;position:relative;background:#fff}#o_main_wrapper #o_main_container #o_main_left #o_main_left_content{padding:0 0 0 15px}#o_main_wrapper #o_main_container #o_main_left #o_main_left_toggle{position:absolute;display:none;right:0;top:70px;margin-right:-30px;font-size:25px;line-height:35px;text-align:center;width:30px;height:35px;z-index:3;border:1px solid #ddd;border-left:none;border-bottom-right-radius:4px;border-top-right-radius:4px;background-color:#fbfbfb;-webkit-box-shadow:2px 0px 4px 1px rgba(0,0,0,0.15);box-shadow:2px 0px 4px 1px rgba(0,0,0,0.15);color:#337ab7}#o_main_wrapper #o_main_container #o_main_left.o_offcanvas{background:#fbfbfb;-webkit-box-shadow:0px 0px 6px 1px rgba(0,0,0,0.2);box-shadow:0px 0px 6px 1px rgba(0,0,0,0.2);min-width:250px}#o_main_wrapper #o_main_container #o_main_left.o_offcanvas #o_main_left_content{padding:0 0 0 0}#o_main_wrapper #o_main_container #o_main_right{float:right;z-index:2;position:relative;background:inherit}#o_main_wrapper #o_main_container #o_main_right #o_main_right_content{padding:0 15px 0 0}#o_main_wrapper #o_main_container #o_main_center{position:relative;z-index:1;background:inherit}#o_main_wrapper #o_main_container #o_main_center h2:first-child{margin-top:0}@media screen and (max-width: 767px){#o_main_wrapper #o_main_container #o_main_center{margin-left:0 !important}}#o_main_wrapper #o_main_container #o_main_center #o_main_center_content{padding:0 15px}#o_main_wrapper #o_main_container #o_main_center #o_main_center_content #o_main_center_content_inner{padding-bottom:15px}#o_main_wrapper #o_toplink{position:absolute;bottom:0;right:15px;text-align:center;z-index:3}@media (max-width: 767px){#o_main_wrapper #o_main_container #o_main_center #o_main_center_content{padding:15px}} #o_back_wrapper,#o_preview_wrapper{margin-top:10px}#o_back_wrapper.o_toolbar .o_breadcrumb .breadcrumb,#o_preview_wrapper.o_toolbar .o_breadcrumb .breadcrumb{font-size:14px}#o_footer_wrapper{position:absolute;bottom:0;width:100%;height:70px;overflow:hidden;background-color:#f5f5f5;color:#999;line-height:16px;font-size:12px}#o_footer_wrapper a{color:#999}#o_footer_wrapper a:hover{color:#000}#o_footer_container{position:relative;padding-top:10px;min-height:70px;background:#f5f5f5;z-index:1}#o_footer_user{position:absolute;left:15px;top:10px;z-index:1}#o_footer_user #o_counter{white-space:nowrap}#o_footer_user #o_username{white-space:nowrap;margin-right:1em}#o_footer_version{position:absolute;right:15px;top:10px;text-align:right;z-index:1}@media (max-width: 767px){#o_footer_version{padding-top:10px;text-align:left}} #o_footer_powered{position:absolute;top:30px;right:15px;z-index:1}#o_footer_powered img{opacity:0.6;filter:alpha(opacity=60)}#o_footer_powered img:hover{opacity:1;filter:alpha(opacity=100)}#o_footer_impressum{position:absolute;top:10px;width:100%;text-align:center;z-index:-1}#o_footer_impressum i{display:none}#o_footer_textline{position:absolute;top:30px;width:100%;text-align:center;z-index:-1}#o_share{margin-top:10px}#o_share a{opacity:0.6;filter:alpha(opacity=60)}#o_share a:hover{opacity:1;filter:alpha(opacity=100)}#o_share a,#o_share_social_container a{color:#999;margin:0 0.25em 0 0}#o_share a:hover,#o_share_social_container a:hover{color:#000}@media (max-width: 767px){#o_counter,#o_footer_version,#o_share{display:none}#o_footer_impressum{top:30px;text-align:left}#o_footer_textline{top:50px;text-align:left}#o_footer_powered{top:10px}#o_footer_powered a:after{content:"\221E";font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:bold;font-size:14px}#o_footer_powered img{display:none}}#o_navbar_wrapper{z-index:4;border-top:1px solid #e7e7e7;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1)}#o_navbar_wrapper #o_navbar_container{position:relative}a.o_disabled.navbar-text{margin:0}.o_navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid #e7e7e7;background-color:#f8f8f8}.o_navbar:before,.o_navbar:after{content:" ";display:table}.o_navbar:after{clear:both}.o_navbar .o_navbar_tabs li{max-width:150px}.o_navbar .o_navbar_tabs li a{padding-right:30px}.o_navbar .o_navbar_tabs li a:first-child span{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o_navbar .o_navbar_tabs .o_icon-fw{position:absolute;top:15px;left:0.5em;padding-top:3px;width:1em;height:1em;display:none}.o_navbar .o_navbar_tabs .o_navbar_tab_close{position:absolute;top:15px;right:0.5em;padding:0;width:1em;height:1em}.o_navbar .o_navbar_tabs .o_navbar_tab_close i:before{color:#d9534f}.o_navbar .o_navbar_tabs .o_navbar_tab_close:hover i:before{color:#c9302c}.o_navbar .o_custom_navbar-brand{background-position:5px 0;background-repeat:no-repeat;height:50px;width:120px}.o_navbar #o_navbar_langchooser{color:#777;padding:7px 15px}.o_navbar #o_navbar_langchooser form span+div{display:inline}.o_navbar #o_navbar_tools_permanent #o_navbar_print a,.o_navbar #o_navbar_tools_permanent #o_navbar_impress a,.o_navbar #o_navbar_tools_permanent #o_navbar_help a{color:#777;padding-right:0}.o_navbar #o_navbar_tools_permanent #o_navbar_login a{color:#f0ad4e}.o_navbar .o_navbar_tools>#o_navbar_tools_permanent>li>a>span{display:none}@media (min-width: 768px){.o_navbar .o_navbar_tools li.o_portrait>a>span{display:inline}}.o_navbar #o_navbar_tools_personal .o_navbar_tool a,.o_navbar #o_navbar_tools_permanent .o_navbar_tool a{padding-right:5px}.o_navbar #o_navbar_tools_personal #o_navbar_my_menu a,.o_navbar #o_navbar_tools_permanent #o_navbar_my_menu a{padding-left:45px}.o_navbar #o_navbar_tools_personal #o_navbar_my_menu .dropdown-menu a,.o_navbar #o_navbar_tools_permanent #o_navbar_my_menu .dropdown-menu a{padding-left:15px}.o_navbar #o_navbar_tools_personal #o_navbar_my_menu .o_portrait,.o_navbar #o_navbar_tools_permanent #o_navbar_my_menu .o_portrait{position:absolute;left:7px;top:10px}.o_navbar #o_navbar_tools_personal .o_logout,.o_navbar #o_navbar_tools_permanent .o_logout{color:#d9534f}.o_navbar.o_navbar-offcanvas .o_navbar_tab_close{top:10px;right:10px}.o_navbar.o_navbar-offcanvas .o_navbar-right a{padding:3px 20px;color:#9d9d9d}.o_navbar.o_navbar-offcanvas .o_navbar-right a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-right a:focus{color:#fff;background-color:transparent}.o_navbar.o_navbar-offcanvas .o_navbar-right a.o_logout{color:#d9534f}.o_navbar.o_navbar-offcanvas .o_navbar-right a.o_logout:hover,.o_navbar.o_navbar-offcanvas .o_navbar-right a.o_logout:focus{color:#c9302c}.o_navbar.o_navbar-offcanvas .o_navbar-right a .o_icon-lg{font-size:1.0em;vertical-align:baseline}.o_navbar.o_navbar-offcanvas .o_navbar-right .divider{height:1px;margin:9px 0;overflow:hidden;background-color:none}.o_navbar.o_navbar-offcanvas .o_navbar-right .dropdown-header{padding-left:15px}.o_navbar.o_navbar-offcanvas .o_navbar-right .dropdown-toggle{display:none}.o_navbar.o_navbar-offcanvas .o_navbar-right .dropdown-menu{box-shadow:none;position:relative;top:0;left:0;display:block;float:none;background-color:#222;color:#9d9d9d;font-size:14px;border:none}.o_navbar.o_navbar-offcanvas .o_navbar-right .dropdown-menu .divider{background:none}.o_navbar.o_navbar-offcanvas .o_navbar-nav a{color:#9d9d9d;text-shadow:none}.o_navbar.o_navbar-offcanvas .o_navbar-nav a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav a:focus{background-color:transparent;color:#fff}.o_navbar.o_navbar-offcanvas .o_navbar-nav .active a,.o_navbar.o_navbar-offcanvas .o_navbar-nav .active a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav .active a:focus{background-color:#090909;color:#fff}.o_navbar.o_navbar-offcanvas .o_navbar-nav .o_navbar-link{color:#9d9d9d}.o_navbar.o_navbar-offcanvas .o_navbar-nav .o_navbar-link:hover{color:#fff}.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>li>a{color:#777}.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>li>a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.active>a,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.active>a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.disabled>a,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.disabled>a:hover,.o_navbar.o_navbar-offcanvas .o_navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}#o_navbar_impress a span,#o_navbar_search_opener a span{display:none}body.o_dmz #o_navbar_print a span,body.o_dmz #o_navbar_impress a span,body.o_dmz #o_navbar_help a span,body.o_dmz #o_navbar_search_opener a span{display:inline}.o_navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;-webkit-overflow-scrolling:touch}.o_navbar-collapse:before,.o_navbar-collapse:after{content:" ";display:table}.o_navbar-collapse:after{clear:both}.o_navbar-collapse.o_collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.o_navbar-offcanvas .o_navbar-collapse{width:auto;box-shadow:none;margin-top:10px;margin-right:-15px;margin-left:-15px}.o_navbar-brand{float:left;font-size:18px;line-height:20px;height:50px;color:#777}.o_navbar-brand:hover,.o_navbar-brand:focus{text-decoration:none;color:#5e5e5e;background-color:transparent}.o_navbar-toggle{position:relative;margin-right:15px;margin-left:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;border:1px solid #ddd;border-radius:4px;background-color:transparent;background-image:none}.o_navbar-toggle:hover,.o_navbar-toggle:focus{outline:none;background-color:#ddd}.o_navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px;background-color:#888}.o_navbar-toggle .icon-bar+.icon-bar{margin-top:4px}#o_navbar_left-toggle{float:left}#o_navbar_right-toggle{float:right}.o_navbar-link{color:#777}.o_navbar-link:hover{color:#333}.o_navbar-nav{margin:7.5px -15px}.o_navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px;color:#777}.o_navbar-nav>li>a:hover,.o_navbar-nav>li>a:focus{color:#333;background-color:transparent}.o_navbar-nav>.active>a,.o_navbar-nav>.active>a:hover,.o_navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.o_navbar-nav>.disabled>a,.o_navbar-nav>.disabled>a:hover,.o_navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.o_navbar-nav>.open>a,.o_navbar-nav>.open>a:hover,.o_navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}.o_collapse .o_navbar-nav{float:left;margin:0}.o_collapse .o_navbar-nav>li{float:left}.o_collapse .o_navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.o_collapse .o_navbar-nav.o_navbar-right:last-child{margin-right:-15px}.o_collapse.o_navbar-collapse .o_navbar-left{float:left !important}.o_collapse.o_navbar-collapse .o_navbar-right{float:right !important}.o_navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid #e7e7e7;border-bottom:1px solid #e7e7e7;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (max-width: 767px){.o_navbar-form .form-group{margin-bottom:5px}} .o_collapse .o_navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.o_collapse .o_navbar-form.o_navbar-right:last-child{margin-right:-15px}.o_navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.o_navbar-fixed-bottom .o_navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.o_navbar-btn{margin-top:8px;margin-bottom:8px}.o_navbar-btn.btn-sm,.btn-group-sm>.o_navbar-btn.btn{margin-top:10px;margin-bottom:10px}.o_navbar-btn.btn-xs,.btn-group-xs>.o_navbar-btn.btn{margin-top:14px;margin-bottom:14px}.o_navbar-text{margin-top:15px;margin-bottom:15px;color:#777}.o_collapse .o_navbar-text{float:left;margin-left:15px;margin-right:15px}.o_collapse .o_navbar-text.o_navbar-right:last-child{margin-right:0}.o_dropdown_tab{position:relative}.o_dropdown_tab>a:first-child{padding-right:30px}.o_dropdown_tab>a:first-child .o_icon-fw{display:none;position:absolute;top:0;left:10px;padding-top:3px;line-height:20px}.o_dropdown_tab>a:first-child span{display:block;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.o_dropdown_tab .o_navbar_tab_close{position:absolute;top:0px;right:10px;padding-left:0px;padding-right:0px;color:#d9534f;background-color:inherit}.o_dropdown_tab .o_navbar_tab_close:focus,.o_dropdown_tab .o_navbar_tab_close:hover{color:#c9302c;background-color:inherit}#o_navbar_more .dropdown-menu .divider:last-child{display:none}@media (min-width: 768px){#o_navbar_more .dropdown-menu{max-width:300px}}@media (max-width: 767px){#o_navbar_more>li{position:inherit}#o_navbar_more .dropdown-menu{left:0px;right:0px}#o_navbar_more .dropdown-menu a,#o_navbar_more .dropdown-menu i{line-height:30px}#o_navbar_more .dropdown-menu .o_navbar_tab_close{line-height:inherit}}.o_body_popup #o_topnav_printview{display:inline-block}.o_body_popup #o_topnav_close{float:right}.o_body_popup #o_topnav_close span{display:block}.o_body_popup #o_navbar_tools_permanent li>a{background-color:transparent}.o_toolbar{position:relative;margin-bottom:20px;margin-top:-10px;border:1px solid #e7e7e7}.o_toolbar:before,.o_toolbar:after{content:" ";display:table}.o_toolbar:after{clear:both}@media (min-width: 768px){.o_toolbar{border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}}.o_toolbar .o_breadcrumb:before,.o_toolbar .o_breadcrumb:after{content:" ";display:table}.o_toolbar .o_breadcrumb:after{clear:both}.o_toolbar .o_breadcrumb .breadcrumb{margin-bottom:0;padding:5px 9px;font-size:11px;line-height:15px;border-radius:0;background:#f5f5f5;border-top-right-radius:4px;border-top-left-radius:4px}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close{float:right;position:relative;margin:0 0 0 15px;vertical-align:middle}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close a{line-height:15px;color:#d9534f}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close a:hover{color:#b52b27}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close a i{font-size:16px}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close a span{display:none}.o_toolbar .o_breadcrumb .breadcrumb .o_breadcrumb_close:before{content:none}.o_toolbar .o_tools_container{text-align:center;min-height:37px;position:realtive;background-color:#f8f8f8;border-bottom-right-radius:4px;border-bottom-left-radius:4px;border-top:1px solid #e7e7e7}.o_toolbar .o_tools_container:before,.o_toolbar .o_tools_container:after{content:" ";display:table}.o_toolbar .o_tools_container:after{clear:both}@media (max-width: 991px){.o_toolbar .o_tools_container{min-height:35px}}@media (max-width: 767px){.o_toolbar .o_tools_container{min-height:22px;text-align:left}}.o_toolbar .o_tools_container a{color:#777;display:inline-block}.o_toolbar .o_tools_container a:hover{color:#333}.o_toolbar .o_tools_container a.o_disabled{color:#aaa !important}.o_toolbar .o_tools_container a.o_disabled:hover{color:#aaa !important}.o_toolbar .o_tools_container a.active{color:#337ab7;background-color:transparent}.o_toolbar .o_tools_container .dropdown-menu a{display:block}.o_toolbar .o_tools_container .dropdown-menu a.active{color:#337ab7;background-color:transparent}.o_toolbar .o_tools{margin-top:8px;margin-bottom:5px}.o_toolbar .o_tool,.o_toolbar .o_text{position:relative;margin:0 10px}.o_toolbar .o_tool:first-child,.o_toolbar .o_text:first-child{margin-left:0}.o_toolbar .o_tool:last-child,.o_toolbar .o_text:last-child{margin-right:0}.o_toolbar .o_tool a i,.o_toolbar .o_tool .o_disabled i,.o_toolbar .o_text a i,.o_toolbar .o_text .o_disabled i{font-size:18px}.o_toolbar .o_tool a span,.o_toolbar .o_tool .o_disabled span,.o_toolbar .o_text a span,.o_toolbar .o_text .o_disabled span{display:block;font-size:12px}.o_toolbar .o_tool a span.badge,.o_toolbar .o_tool .o_disabled span.badge,.o_toolbar .o_text a span.badge,.o_toolbar .o_text .o_disabled span.badge{position:absolute;right:50%;top:-18px;margin-right:-12px;font-size:13px}@media (min-width: 767px) and (max-width: 991px){.o_toolbar .o_tool a i,.o_toolbar .o_tool .o_disabled i,.o_toolbar .o_text a i,.o_toolbar .o_text .o_disabled i{font-size:16px}.o_toolbar .o_tool a span,.o_toolbar .o_tool .o_disabled span,.o_toolbar .o_text a span,.o_toolbar .o_text .o_disabled span{font-size:11px}.o_toolbar .o_tool a span.badge,.o_toolbar .o_tool .o_disabled span.badge,.o_toolbar .o_text a span.badge,.o_toolbar .o_text .o_disabled span.badge{top:-16.5px;margin-right:-11px;font-size:12px}}@media (max-width: 767px){.o_toolbar .o_tool a i,.o_toolbar .o_tool .o_disabled i,.o_toolbar .o_text a i,.o_toolbar .o_text .o_disabled i{font-size:20px}.o_toolbar .o_tool a span,.o_toolbar .o_tool .o_disabled span,.o_toolbar .o_text a span,.o_toolbar .o_text .o_disabled span{display:none}.o_toolbar .o_tool a span.badge,.o_toolbar .o_tool .o_disabled span.badge,.o_toolbar .o_text a span.badge,.o_toolbar .o_text .o_disabled span.badge{display:block;position:relative;top:0;left:0;margin-right:0}}.o_toolbar .o_tool .o_chelp,.o_toolbar .o_text .o_chelp{position:relative;top:-1em;vertical-align:top}.o_toolbar .o_tool_next,.o_toolbar .o_tool_previous{padding:0;margin-top:5px;border:1px solid #ccc;background-color:#eee}.o_toolbar .o_tool_next a,.o_toolbar .o_tool_previous a{color:#777}.o_toolbar .o_tool_next a:hover,.o_toolbar .o_tool_previous a:hover{color:#333}.o_toolbar .o_tool_next a.o_disabled,.o_toolbar .o_tool_previous a.o_disabled{color:#aaa !important}.o_toolbar .o_tool_next a.o_disabled:hover,.o_toolbar .o_tool_previous a.o_disabled:hover{color:#aaa !important}.o_toolbar .o_tool_next i,.o_toolbar .o_tool_previous i{font-size:21px}@media (min-width: 767px) and (max-width: 991px){.o_toolbar .o_tool_next,.o_toolbar .o_tool_previous{margin-top:4px}.o_toolbar .o_tool_next i,.o_toolbar .o_tool_previous i{font-size:18px}}@media (max-width: 767px){.o_toolbar .o_tool_next,.o_toolbar .o_tool_previous{margin-top:0}.o_toolbar .o_tool_next i,.o_toolbar .o_tool_previous i{font-size:20px}}.o_toolbar .o_tool_previous{margin-left:10px;border-bottom-left-radius:4px;border-top-left-radius:4px;border-right:0}.o_toolbar .o_tool_next{border-bottom-right-radius:4px;border-top-right-radius:4px}.o_toolbar .o_tool_dropdown{margin:0 10px}.o_toolbar .o_tool_dropdown:first-child{margin-left:0}.o_toolbar .o_tool_dropdown:last-child{margin-right:0}.o_toolbar .o_tool_dropdown a.dropdown-toggle{position:relative}.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:18px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span{display:block;font-size:12px}.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{position:absolute;right:50%;top:4px;margin-right:-20px;font-size:14px}@media (min-width: 767px) and (max-width: 991px){.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:16px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span,.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{font-size:11px}.o_toolbar .o_tool_dropdown a.dropdown-toggle .o_icon_caret{top:4px;margin-right:-18px;font-size:12px}}@media (max-width: 767px){.o_toolbar .o_tool_dropdown a.dropdown-toggle{padding:0 10px 0 5px}.o_toolbar .o_tool_dropdown a.dropdown-toggle i{font-size:20px}.o_toolbar .o_tool_dropdown a.dropdown-toggle span{display:none}}.o_toolbar .o_tool_dropdown .dropdown-menu{text-align:left}.o_toolbar .o_tools_left{float:left}.o_toolbar .o_tools_right{float:right}.o_toolbar .o_tools_right_edge{float:right}@media (max-width: 991px){.o_toolbar .o_tools{margin-top:6px;margin-bottom:4px}.o_toolbar .o_tool span{max-width:10em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_toolbar .o_tool,.o_toolbar .o_text,.o_toolbar .o_tool_dropdown{margin:0 5px}}@media (max-width: 767px){.o_toolbar .o_tools{margin-top:6px;margin-bottom:4px}.o_toolbar .o_tools .o_chelp{top:0;vertical-align:top}.o_toolbar .o_tools_center{float:left}.o_toolbar .o_tool,.o_toolbar .o_text,.o_toolbar .o_tool_dropdown{margin:0 0;position:static}.o_toolbar .o_tool_dropdown .dropdown-menu{left:0px;right:0px}.o_toolbar .o_tool_dropdown .dropdown-menu a,.o_toolbar .o_tool_dropdown .dropdown-menu i{line-height:30px}.o_toolbar .o_tool_dropdown .dropdown-menu .o_navbar_tab_close{line-height:inherit}} diff --git a/src/main/webapp/static/themes/light/theme_ie_completions.css b/src/main/webapp/static/themes/light/theme_ie_completions.css index 70ee073bef6..7711310eaad 100644 --- a/src/main/webapp/static/themes/light/theme_ie_completions.css +++ b/src/main/webapp/static/themes/light/theme_ie_completions.css @@ -1,4 +1,4 @@ -ul.o_certificates li a.o_sel_certificate_delete{padding-left:2em}.o_cal_toptoolbar{margin-bottom:6px}.o_cal_toptoolbar .o_cal_toptoolbar_sub,.o_cal_toptoolbar .o_cal_toptoolbar_help{float:left;margin-right:12px}.o_feed .o_date,.o_feed .o_author{color:#777}.o_feed .o_subscription a{margin-right:1.5em}.o_feed .o_subscription .form-group{margin-bottom:5px}.o_feed .o_subscription .form-control{border:0;background:none;padding:0;height:auto;-webkit-box-shadow:none;box-shadow:none}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper{float:left}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_title,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_explanation,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_legend{display:none}.o_feed .o_blog_posts .o_ratings_and_comments a.o_comments span{display:none}.o_feed .o_content:before,.o_feed .o_content:after{content:" ";display:table}.o_feed .o_content:after{clear:both}.o_glossary .o_register{text-align:center}.o_glossary .o_meta{font-size:90%;color:#777;font-style:italic}.o_glossary dl dt:first-letter{font-size:21px}.o_glossary dl dt small{color:#777}.o_tm_glossary{border-bottom:1px dotted #666699 !important}.o_tm_yellow{background-color:#FFFF66}.o_tm_blue{background-color:#33FFFF}.o_tm_red{background-color:#FF3333}.o_tm_green{background-color:#99FF00}.o_reminder_rule{padding:5px 0}.o_segments_content{margin-top:20px}.o_tabbed_pane .o_tabbed_pane_content{padding:20px 0 6px 0}.o_togglebox_wrapper .o_opener{position:relative;left:-0.5em}.o_togglebox_wrapper div.o_togglebox_content{position:relative;margin:0}.o_togglebox_wrapper div.o_togglebox_content .o_hide{position:absolute;bottom:0.5em;right:1em}.o_toolboxes ul{margin:0 0 1.5em 0;padding:0 0 0 1.5em}.o_qrcode{width:256px;height:256px}#o_ajax_busy{position:absolute;left:50%;top:20em;margin-left:-2.5em;height:5em;width:5em;color:#fff;z-index:1201;display:none}#o_body.o_ajax_busy{cursor:busy}.o_exception .o_visual{position:relative;background-image:url("../light/images/lion-500x333.jpg");filter:grayscale(50%);-webkit-filter:grayscale(50%);-moz-filter:grayscale(50%);-ms-filter:grayscale(50%);-o-filter:grayscale(50%);width:500px;height:333px;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;margin:0 0 10px 16px}@media (min-width: 768px) and (max-width: 991px){.o_exception .o_visual{width:375px;height:249px}}@media (min-width: 500px) and (max-width: 767px){.o_exception .o_visual{width:250px;height:166px}}@media (max-width: 500px){.o_exception .o_visual{background-size:cover}}.o_exception .jumbotron h1,.o_exception .o_repo_details .o_lead h1,.o_repo_details .o_exception .o_lead h1{color:#d9534f}.tt-input{width:400px}.tt-dropdown-menu{width:400px;margin-top:6px;padding:0 0 0;color:#555;background-color:#fff;border:1px solid #66afe9;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;-webkit-box-shadow:0 0 8px rgba(102,175,233,0.6);box-shadow:0 0 8px rgba(102,175,233,0.6)}.tt-suggestion{padding:6px 12px;font-size:14px;line-height:1.42857}.tt-suggestion.tt-cursor{color:#fff;background-color:#337ab7}.tt-suggestion p{margin:0}.o_search_link_extended,.o_search_link_simple{margin-top:12px;display:inline-block}.o_search_results_stats{color:#777;padding-left:1.5em}.o_search_highlight{margin-left:12px;font-size:12px}.o_search_result_title h4,.o_search_result_title .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_search_result_title h2{display:inline-block;margin-right:12px;margin-bottom:6px}.o_search_result_highlight{font-weight:bold}.o_search_result_context{color:#3c763d}.o_search_result_excerpt{color:#555}.o_search_result_details .o_togglebox_wrapper.o_block{margin-top:0;margin-bottom:0}.o_search_result_details .o_togglebox_wrapper .o_togglebox_content{color:#777;font-size:12px;background:#fff;padding:6px 12px}@media (max-width: 767px){.o_search_result_details{display:none}} +ul.o_certificates li{padding:5px 0}ul.o_certificates li a.o_sel_certificate_delete{padding-left:2em}.o_cal_toptoolbar{margin-bottom:6px}.o_cal_toptoolbar .o_cal_toptoolbar_sub,.o_cal_toptoolbar .o_cal_toptoolbar_help{float:left;margin-right:12px}.o_feed .o_date,.o_feed .o_author{color:#777}.o_feed .o_subscription a{margin-right:1.5em}.o_feed .o_subscription .form-group{margin-bottom:5px}.o_feed .o_subscription .form-control{border:0;background:none;padding:0;height:auto;-webkit-box-shadow:none;box-shadow:none}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper{float:left}.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_title,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_rating_explanation,.o_feed .o_blog_posts .o_ratings_and_comments .o_rating_wrapper .o_legend{display:none}.o_feed .o_blog_posts .o_ratings_and_comments a.o_comments span{display:none}.o_feed .o_content:before,.o_feed .o_content:after{content:" ";display:table}.o_feed .o_content:after{clear:both}.o_glossary .o_register{text-align:center}.o_glossary .o_meta{font-size:90%;color:#777;font-style:italic}.o_glossary dl dt:first-letter{font-size:21px}.o_glossary dl dt small{color:#777}.o_tm_glossary{border-bottom:1px dotted #666699 !important}.o_tm_yellow{background-color:#FFFF66}.o_tm_blue{background-color:#33FFFF}.o_tm_red{background-color:#FF3333}.o_tm_green{background-color:#99FF00}.o_reminder_rule{padding:5px 0}.o_segments_content{margin-top:20px}.o_tabbed_pane .o_tabbed_pane_content{padding:20px 0 6px 0}.o_togglebox_wrapper .o_opener{position:relative;left:-0.5em}.o_togglebox_wrapper div.o_togglebox_content{position:relative;margin:0}.o_togglebox_wrapper div.o_togglebox_content .o_hide{position:absolute;bottom:0.5em;right:1em}.o_toolboxes ul{margin:0 0 1.5em 0;padding:0 0 0 1.5em}.o_qrcode{width:256px;height:256px}#o_ajax_busy{position:absolute;left:50%;top:20em;margin-left:-2.5em;height:5em;width:5em;color:#fff;z-index:1201;display:none}#o_body.o_ajax_busy{cursor:busy}.o_exception .o_visual{position:relative;background-image:url("../light/images/lion-500x333.jpg");filter:grayscale(50%);-webkit-filter:grayscale(50%);-moz-filter:grayscale(50%);-ms-filter:grayscale(50%);-o-filter:grayscale(50%);width:500px;height:333px;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;margin:0 0 10px 16px}@media (min-width: 768px) and (max-width: 991px){.o_exception .o_visual{width:375px;height:249px}}@media (min-width: 500px) and (max-width: 767px){.o_exception .o_visual{width:250px;height:166px}}@media (max-width: 500px){.o_exception .o_visual{background-size:cover}}.o_exception .jumbotron h1,.o_exception .o_repo_details .o_lead h1,.o_repo_details .o_exception .o_lead h1{color:#d9534f}.tt-input{width:400px}.tt-dropdown-menu{width:400px;margin-top:6px;padding:0 0 0;color:#555;background-color:#fff;border:1px solid #66afe9;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;-webkit-box-shadow:0 0 8px rgba(102,175,233,0.6);box-shadow:0 0 8px rgba(102,175,233,0.6)}.tt-suggestion{padding:6px 12px;font-size:14px;line-height:1.42857}.tt-suggestion.tt-cursor{color:#fff;background-color:#337ab7}.tt-suggestion p{margin:0}.o_search_link_extended,.o_search_link_simple{margin-top:12px;display:inline-block}.o_search_results_stats{color:#777;padding-left:1.5em}.o_search_highlight{margin-left:12px;font-size:12px}.o_search_result_title h4,.o_search_result_title .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_search_result_title h2{display:inline-block;margin-right:12px;margin-bottom:6px}.o_search_result_highlight{font-weight:bold}.o_search_result_context{color:#3c763d}.o_search_result_excerpt{color:#555}.o_search_result_details .o_togglebox_wrapper.o_block{margin-top:0;margin-bottom:0}.o_search_result_details .o_togglebox_wrapper .o_togglebox_content{color:#777;font-size:12px;background:#fff;padding:6px 12px}@media (max-width: 767px){.o_search_result_details{display:none}} .wizard{border:1px solid #d4d4d4;border-radius:2px;background-color:#f9f9f9;position:relative;overflow:hidden;margin-bottom:15px}.wizard ul{list-style:none outside none;padding:0;margin:0;width:4000px}.wizard ul li{float:left;margin:0;padding:0 20px 0 30px;height:46px;line-height:46px;position:relative;background:#ededed;color:#333;font-size:16px;cursor:default}.wizard ul li .chevron{border:24px solid transparent;border-left:14px solid #d4d4d4;border-right:0;display:block;position:absolute;right:-14px;top:0;z-index:1}.wizard ul li .chevron:before{border:24px solid transparent;border-left:14px solid #ededed;border-right:0;content:"";display:block;position:absolute;right:1px;top:-24px}.wizard ul li.active{background:#f1f6fc;color:#333}.wizard ul li.active .chevron:before{border-left:14px solid #f1f6fc}.wizard ul li .badge{margin-right:8px}.wizard ul li:first-child{border-radius:4px 0 0 4px;padding-left:20px}.o_process{position:relative;padding-left:25px}.o_process .o_step{position:relative;height:auto;padding-top:10px;padding-left:30px;padding-bottom:10px}.o_process .o_bar{position:absolute;top:10px;left:8px;height:100%;border-left:4px solid #777}.o_process .o_bar:after{position:absolute;top:0;left:-10px;height:16px;width:16px;border:4px solid #777;border-radius:16px;background:#fff;content:" "}.o_process .o_title{margin-top:-1px;color:#777 !important}.o_process .o_step.o_active .o_bar,.o_process .o_step.o_active .o_bar:after{border-color:#337ab7}.o_process .o_step.o_active .o_title{color:#337ab7 !important}.o_process .o_step.o_active .o_title:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f0a4"}.o_process .o_step.o_done .o_bar,.o_process .o_step.o_done .o_bar:after{border-color:#5094ce}.o_process .o_step.o_done .o_title{color:#5094ce !important}.o_process .o_step.o_done .o_title:before{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;content:"\f00c"}.o_process .o_meta{color:#777;font-size:12px;margin-top:-0.5em}.o_cal_orange{background:#ffc266;border-color:#ff9900;color:#5D5D5D}.o_cal_orange .o_cal_wv_event_header{background:#ff9900}.o_cal_orange a{color:#5d5d5d !important}.o_cal_green{background:#66c266;border-color:#009900;color:#FFF}.o_cal_green .o_cal_wv_event_header{background:#009900}.o_cal_green a{color:#fff !important}.o_cal_blue{background:#4d6e9f;border-color:#2e5894;color:#FFF}.o_cal_blue .o_cal_wv_event_header{background:#2e5894}.o_cal_blue a{color:#fff !important}.o_cal_yellow{background:#ffe066;border-color:#ffcc00;color:#5D5D5D}.o_cal_yellow .o_cal_wv_event_header{background:#ffcc00}.o_cal_yellow a{color:#5d5d5d !important}.o_cal_red{background:#c26666;border-color:#990000;color:#FFF}.o_cal_red .o_cal_wv_event_header{background:#990000}.o_cal_red a{color:#fff !important}.o_cal_rebeccapurple{background:#663399;border-color:#663399;color:#FFF}.o_cal_rebeccapurple .o_cal_wv_event_header{background:#663399}.o_cal_rebeccapurple a{color:#fff !important}.o_cal_grey{background:#DDDAAA;border-color:#5D5D5D;color:#FFF}.o_cal_grey .o_cal_wv_event_header{background:#5D5D5D}.o_cal_grey a{color:#fff !important}.o_cal_config_enabled,.o_cal_config_disabled{position:relative;float:left;display:inline}.o_cal_config_calendar{margin:0 5px;padding:1px 6px 1px 4px;position:relative;width:200px;overflow:hidden;float:left;display:inline}.o_cal_colorchooser_selected:before{content:"\f00c"}#o_cal_colorchooser div{border:1px solid #337ab7;margin:5px;display:inline-block}#o_cal_colorchooser div:hover{border:1px solid #333}#o_cal_colorchooser a{width:20px;height:20px;display:inline-block}.fc-button{color:#333;background-color:#fff;border-color:#ccc}.fc-button:hover,.fc-button:focus,.fc-button.focus,.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{color:#333;background-color:#e6e6e6;border-color:#adadad}.fc-button:active,.fc-button.active,.open>.fc-button.dropdown-toggle{background-image:none}.fc-button.disabled,.fc-button.disabled:hover,.fc-button.disabled:focus,.fc-button.disabled.focus,.fc-button.disabled:active,.fc-button.disabled.active,.fc-button[disabled],.fc-button[disabled]:hover,.fc-button[disabled]:focus,.fc-button[disabled].focus,.fc-button[disabled]:active,.fc-button[disabled].active,fieldset[disabled] .fc-button,fieldset[disabled] .fc-button:hover,fieldset[disabled] .fc-button:focus,fieldset[disabled] .fc-button.focus,fieldset[disabled] .fc-button:active,fieldset[disabled] .fc-button.active{background-color:#fff;border-color:#ccc}.fc-button .badge{color:#fff;background-color:#333}.fc-button.fc-state-default{text-shadow:none}.fc-button.fc-state-active{color:#fff;background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active:hover,.fc-button.fc-state-active:focus,.fc-button.fc-state-active.focus,.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.fc-button.fc-state-active:active,.fc-button.fc-state-active.active,.open>.fc-button.fc-state-active.dropdown-toggle{background-image:none}.fc-button.fc-state-active.disabled,.fc-button.fc-state-active.disabled:hover,.fc-button.fc-state-active.disabled:focus,.fc-button.fc-state-active.disabled.focus,.fc-button.fc-state-active.disabled:active,.fc-button.fc-state-active.disabled.active,.fc-button.fc-state-active[disabled],.fc-button.fc-state-active[disabled]:hover,.fc-button.fc-state-active[disabled]:focus,.fc-button.fc-state-active[disabled].focus,.fc-button.fc-state-active[disabled]:active,.fc-button.fc-state-active[disabled].active,fieldset[disabled] .fc-button.fc-state-active,fieldset[disabled] .fc-button.fc-state-active:hover,fieldset[disabled] .fc-button.fc-state-active:focus,fieldset[disabled] .fc-button.fc-state-active.focus,fieldset[disabled] .fc-button.fc-state-active:active,fieldset[disabled] .fc-button.fc-state-active.active{background-color:#337ab7;border-color:#2e6da4}.fc-button.fc-state-active .badge{color:#337ab7;background-color:#fff}.o_visual{position:absolute;top:0;left:0;overflow:hidden;height:120px;width:180px;vertical-align:middle}@media (min-width: 768px) and (max-width: 991px){.o_visual{height:80px;width:120px}}@media (max-width: 767px){.o_visual{height:50px;width:75px}}.o_visual img{width:100%;height:auto}.o_visual .o_visual_not_available{width:100%;height:100%;background-image:url("../light/images/no_preview.png");background-repeat:no-repeat;background-position:50% 50%;background-size:contain}.o_coursetable.o_rendertype_custom .o_table_row{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_coursetable.o_rendertype_custom .o_table_row .o_visual{border-right:1px solid #337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_access{position:absolute;top:0;right:0;height:120px;width:180px;overflow:hidden;border-left:1px solid #337ab7;padding-top:0.25em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_state,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{padding:0 1em;height:20px;line-height:20px;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score{position:relative;left:2px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score .o_label{color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social{position:absolute;width:100%;bottom:32px;height:20px;padding-left:1em}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_title,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating o_rating_legend,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_social .o_rating .o_rating_explanation{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings{padding:0 0 0 1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_label{margin-bottom:1em;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_bookings .o_methods{color:#5bc0de}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{position:absolute;display:block;bottom:0;width:90px;height:30px;line-height:30px;text-align:center}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{right:0}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start{color:#fff;background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{color:#fff;background-color:#286090;border-color:#204d74}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start.active{background-color:#337ab7;border-color:#2e6da4}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start .badge{color:#337ab7;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book{color:#fff;background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{color:#fff;background-color:#ec971f;border-color:#d58512}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book.active{background-color:#f0ad4e;border-color:#eea236}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book .badge{color:#f0ad4e;background-color:#fff}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:90px;color:#fff;background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{color:#fff;background-color:#449d44;border-color:#398439}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active,.open>.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.dropdown-toggle{background-image:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.disabled.active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled],.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:hover,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].focus,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled]:active,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details[disabled].active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:hover,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.focus,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details:active,fieldset[disabled] .o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details.active{background-color:#5cb85c;border-color:#4cae4c}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details .badge{color:#5cb85c;background-color:#fff}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{height:80px;width:120px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_score,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_comments,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_label{display:none}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_start,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_book,.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{width:60px}.o_coursetable.o_rendertype_custom .o_table_row .o_access .o_details{right:60px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_access{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:120px;margin:0 180px 0 180px;position:relative;padding:1em 0.5em 0.25em 1em;overflow:hidden}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{margin:0;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{display:block;color:#337ab7}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a:hover{color:#286090}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author{margin-top:0.5em;line-height:1em;font-size:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle{position:absolute;top:5px;right:40px;font-size:90%;line-height:1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#777}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active{color:#3c763d}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle.o_active:hover{color:#2b542c}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{margin-top:0.5em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark{position:absolute;top:-1px;right:15px}@media (min-width: 768px) and (max-width: 991px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:80px;margin:0 120px}}@media (max-width: 767px){.o_coursetable.o_rendertype_custom .o_table_row .o_meta{height:50px;margin:0 0 0 75px;padding:0 0 0 1em}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title{line-height:50px}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_title a{border-right:37px solid transparent;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_author,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_bookmark,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_lifecycle,.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_desc{display:none}}.o_coursetable.o_rendertype_custom .o_table_row .o_meta .o_go_xs{position:absolute;top:0;right:0;padding:0 1em;height:50px;width:37px;line-height:50px;color:#fff;background-color:#337ab7}.o_coursetable.o_rendertype_classic .o_rating_explanation{display:none}.o_coursetable.o_rendertype_classic .o_start,.o_coursetable.o_rendertype_classic .o_book{white-space:nowrap}.o_coursetable.o_rendertype_classic .o_repoentry_type{color:#555}.o_coursetable.o_rendertype_classic .o_repoentry_ac{color:#555}.o_catalog .o_level{position:relative;margin-bottom:10px;padding:0;border-top:1px solid #337ab7;border-bottom:1px solid #337ab7}.o_catalog .o_level .o_visual{height:180px}.o_catalog .o_level .o_meta{position:relative;min-height:180px;height:180px;overflow:hidden;margin:0 0 0 180px;padding:1em 0.5em 0.5em 2em}.o_catalog .o_level .o_meta .o_title{margin:0}.o_catalog .o_level .o_meta .o_title a{display:block;color:#337ab7}.o_catalog .o_level .o_meta .o_title a:hover{color:#286090}.o_catalog .o_level .o_meta .o_desc{padding:1em 0 0.5em 0}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_level .o_visual{height:120px}.o_catalog .o_level .o_meta{min-height:120px;height:120px;margin:0 0 0 120px}}@media (max-width: 767px){.o_catalog .o_level .o_visual{height:75px}.o_catalog .o_level .o_meta{min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em}.o_catalog .o_level .o_meta .o_title{line-height:75px}.o_catalog .o_level .o_meta .o_desc{display:none}}.o_catalog .o_sublevels_list .o_sublevel{position:relative;border:1px solid #337ab7;margin-bottom:10px}.o_catalog .o_sublevels_list .o_sublevel .o_visual{height:75px;width:75px}.o_catalog .o_sublevels_list .o_sublevel .o_title{margin:0}.o_catalog .o_sublevels_list .o_sublevel .o_meta{border-left:1px solid #337ab7;min-height:75px;height:75px;margin:0 0 0 75px;padding:0 0 0 1em}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_title{line-height:75px}.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_desc{display:none}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a{font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels_list .o_sublevel .o_meta h4.o_title>a>i,.o_catalog .o_sublevels_list .o_sublevel .o_meta .o_cal .fc-header-title h2.o_title>a>i,.o_cal .fc-header-title .o_catalog .o_sublevels_list .o_sublevel .o_meta h2.o_title>a>i{display:none}.o_catalog .o_sublevels{position:relative;margin-bottom:20px}.o_catalog .o_sublevels:before,.o_catalog .o_sublevels:after{content:" ";display:table}.o_catalog .o_sublevels:after{clear:both}.o_catalog .o_sublevels .o_sublevel{position:relative;float:left;margin:0 20px 20px 0;width:180px}.o_catalog .o_sublevels .o_sublevel:last-child{margin-right:0}.o_catalog .o_sublevels .o_sublevel .o_visual{border:1px solid #337ab7;position:relative;height:180px}.o_catalog .o_sublevels .o_sublevel .o_meta{position:absolute;left:0;bottom:0;width:100%;border:1px solid #337ab7;border-top:0;background-color:rgba(255,255,255,0.8)}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title{margin:0;text-align:center;line-height:2em;height:2em;width:100%;overflow:hidden}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a{display:block;color:#337ab7;font-family:inherit;font-weight:inherit}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a:hover{color:#286090}.o_catalog .o_sublevels .o_sublevel .o_meta .o_title a>i{display:none}@media (min-width: 768px) and (max-width: 991px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 10px 10px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (max-width: 767px){.o_catalog .o_sublevels .o_sublevel{width:120px;margin:0 1px 1px 0}.o_catalog .o_sublevels .o_sublevel .o_visual{height:120px;width:120px}.o_catalog .o_sublevels .o_sublevel .o_title{font-size:90%}}@media (min-width: 768px){.o_catalog .o_sublevels_list,.o_catalog .o_sublevels_compact{-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2;columns:2}} .o_repo_details{position:relative}.o_repo_details .o_lead{margin-bottom:10px}.o_repo_details .o_lead .o_author{margin-top:0.5em;margin-bottom:1em;font-size:120%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#3c763d}.o_repo_details .o_lead .o_media{float:right;margin-left:2em;margin-bottom:2em}.o_repo_details .o_lead h1 i{display:none}.o_repo_details .o_overview i{margin-right:0.5em}.o_repo_details .o_overview div{margin-bottom:0.25em}.o_repo_details .o_start,.o_repo_details .o_book{margin:2em 0}.o_repo_details .o_social:before,.o_repo_details .o_social:after{content:" ";display:table}.o_repo_details .o_social:after{clear:both}.o_repo_details .o_social .o_rating_wrapper{float:left}.o_repo_details .o_social .o_comments{margin-left:1em}@media (max-width: 767px){.o_repo_details .o_lead p{font-size:16px}.o_repo_details .o_lead .o_media{margin-left:0;float:none;text-align:center}}@media (max-width: 613px){.o_repo_details .o_subcolumn{width:100%}} .o_meta .o_closed{padding:2px 5px;margin:5px 0}.o_overview .o_closed{padding:12px 15px;margin:15px 0}.o_ac_configuration span.o_ac_infos{font-weight:normal;color:grey}.badge.o_midpub{background-color:#3c763d}.badge.o_midwarn{background-color:#8a6d3b}.badge.o_midlock{background-color:#31708f}.badge.o_miderr{background-color:#a94442}.badge.o_middel{background-color:#777}.o_course_editor_legend .badge{font-size:80%}.o_course_editor_legend .badge:before{content:none}.o_passed{color:#3c763d;font-weight:bold}.o_passed a:hover{color:#2b542c}.o_passed th{color:#333}.o_failed{color:#a94442;font-weight:bold}.o_failed a:hover{color:#66512c}.o_failed th{color:#333}.o_unknown{color:#8a6d3b;font-weight:bold}.o_unknown a:hover{color:#66512c}.o_unknown th{color:#333}.o_noinfo{color:#777}.o_course_run .o_toc .o_entry .o_shorttitle{border-bottom:1px solid #777}.o_course_run .o_toc .o_entry .o_displaytitle{margin-top:5px;color:#777}.o_course_run .o_toc .o_entry .o_objectives{margin-top:10px;font-style:italic}.o_course_run.o_titled_wrapper>h2 i{display:none}.o_tree.o_course_menu div.o_tree_l0>a:first-child{background-color:none}.o_st_peekview ul li{margin-bottom:0.5em}.o_cl_line{margin-bottom:10px;padding-bottom:5px}.o_cl_line.o_even{background-color:#f9f9f9}.o_ll_container h5{margin-bottom:5px}.o_ll_container h5 a.o_desc{color:#337ab7}.o_ll_container h5 a.o_desc small{display:none}.o_ll_container h5 a.o_desc:hover{color:#286090;text-decoration:none}.o_ll_container h5 a.o_desc:hover small{color:#5e5e5e;display:inline}.o_ll_container div.o_comment{color:#777}.o_cmembers .o_cmember{margin:12px 0}.o_cmembers .o_cmember .o_portrait{margin-right:10px}.o_cmembers .o_cmember .o_portrait img{width:50px;height:50px}.o_cmembers .o_cmember .o_cmember_info_wrapper{line-height:50px}.o_cmembers .o_cmember .o_cmember_info_wrapper .o_mail{margin-left:6px}table.table.o_qti_item_kprim>thead>tr>th,table.table.o_qti_item_kprim>tbody>tr>td{border:none}td.o_qti_item_kprim_input,th.o_qti_item_kprim_input{text-align:center}td.o_qti_item_kprim_input .radio,th.o_qti_item_kprim_input .radio{display:inline}div.o_qti_menu_section,div.o_qti_menu_section_clickable,div.o_qti_menu_section_active{margin-top:10px}div.o_qti_menu_item a,div.o_qti_menu_section a{text-decoration:none}div.o_qti_menu_item{padding:.1em}div.o_qti_menu_item_active{padding:.1em;font-weight:bold}div.o_qti_item_itemfeedback{background-color:#ffffff;border-color:#000000}div.o_qti_item_choice_option_flow{display:inline-block;padding:.5em;border:1px solid transparent}.d3chart .bar_green{fill:#5cb85c}.d3chart .bar_red{fill:#d9534f}.d3chart .bar_grey{fill:lightgrey}div.o_qti_statistics ul{list-style-type:none;padding:0;margin:0;font-size:90%}div.o_qti_statistics ul strong{font-weight:normal}div.o_qti_statistics ul li{padding-left:48px;margin-left:0;margin-bottom:10px}div.o_qti_statistics ul li.o_qti_statistics-ncorrect:before{font-size:125%;content:'\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-correct:before{font-size:125%;content:'\2713\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kplus:before{font-size:125%;content:'\2713\00A0\2A2F\00A0\00A0'}div.o_qti_statistics ul li.o_qti_statistics-kminus:before{font-size:125%;content:'\2A2F\00A0\2713\00A0\00A0'}div.o_qti_statistics ul li img{vertical-align:top}div.o_qti_statistics table.o_qti_statistics_figures tr{float:left}div.o_qti_statistics table.o_qti_statistics_figures tr:nth-child(2n+1){clear:left;padding-right:20px}div.o_qti_statistics table.o_qti_statistics_figures td{width:200px;padding-left:0}div.o_qti_statistics table.o_qti_statistics_figures td+td{width:100px}div.o_qti_statistics .o_qti_statistics_answer{background:#F5F5F5;padding:1px 2px;width:90%}div.o_qti_statistics div.o_qti_statistics_legend{padding-top:10px;width:470px;border:1px solid #ddd;border-radius:4px}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_green{background-color:#9dd53a}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_red{background-color:#f85032}div.o_qti_statistics div.o_qti_statistics_legend ul li .bar_grey{background-color:lightgrey}div.o_qti_metadatas .panel-body{border-top:none}.o_qti_menu_item_attempts:after,.o_qti_menu_item_attempts_marked:after{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.o_qti_menu_item_attempts:after{content:"\f11d"}.o_qti_menu_item_attempts_marked:after{content:"\f024";color:#337ab7}.onyx_iframe{width:100%;height:100%;border:none;min-height:60em}.o_qti_print div.o_qti_statistics{width:680px}@media print{div.o_qti_statistics{width:680px}}#o_dev_tool #o_dev_tool_mode{width:1em;height:1em;float:left;border:1px solid #000;margin-right:5px}a.o_dev{position:absolute;left:0;top:0;z-index:4000;background:#f0ad4e;border:1px solid #d59645;border-top:none;border-left:none;border-radius:0 0 4px 0;color:#fff}a.o_dev:hover{color:#d9534f}.o_dev_w{margin:1px}.o_dev_w .o_dev_h{color:#000;font-size:8px;line-height:10px;margin:0}.o_dev_w .o_dev_h span{background:#f4c37d;border:1px solid #f0ad4e;border-bottom:0}.o_dev_w .o_dev_c{position:relative;border:1px dotted #eee}.o_dev_w .o_dev_c .o_dev_i{position:absolute;top:0px;left:24px;height:auto;width:auto;padding:5px;border:1px solid black;display:none;margin:0px;z-index:999;font-size:11px;background-color:#BBF}.o_dev_w.o_dev_m>.o_dev_c{border:1px solid #f0ad4e;margin:0px;background-color:#f8e9d4}.o_wikimod_nav .o_noti{margin:0}.o_wikimod_editform_wrapper{margin-top:30px}.o_wiki-file-deleted{text-decoration:line-through}.o_ep_icon_map:before{content:"\f0b1"}.o_ep_icon_collection:before{content:"\f0b1"}.o_ep_icon_page:before{content:"\f016"}.o_ep_icon_struct:before{content:"\f1b3"}.o_ep_icon_liveblog:before{content:"\f0a1"}.o_artefact_closed:before{content:"\f023"}.o_portfolio_toc .o_ep_link{float:right;margin-right:0px}.o_portfolio_toc .o_ep_commentlink{float:right;margin-right:10%}.o_portfolio_toc li.level1{font-size:1.2em;margin:1.2em 0 0.2em 0;border-bottom:1px solid #ddd}.o_portfolio_toc li.level2{padding-left:20px;font-size:1.1em;border-bottom:1px dotted #ddd}.o_portfolio_toc li.level3{padding-left:40px}.o_eportfolio_page .o_eportfolio_structure>h5{border-bottom:1px solid #ddd;margin-top:1.2em}.o_eportfolio_maps .panel{font-family:'Century Gothic', 'Apple Gothic', sans-serif;box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .panel-heading{padding:5px 10px}.o_eportfolio_maps h4,.o_eportfolio_maps .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps h2{padding:11px 15px;background:rgba(255,255,230,0.7) none;border-radius:6px}.o_eportfolio_maps .table>tbody>tr>td{border-top:none}.o_eportfolio_maps .panel-body{border-top:none}.o_eportfolio_maps .panel>.panel-body+.table{border-top:none}.panel-footer .o_ep_options{display:inline-block}.o_eportfolio_map{padding:0 20px 2px 3px;border-radius:6px 10px 6px 0;font-family:'Century Gothic', 'Apple Gothic', sans-serif}.o_map_header{padding-left:5px}.o_eportfolio_map ul.nav-tabs li:not(.active) a{background-color:rgba(240,240,240,0.7);border-radius:4px 4px 0 0}.o_eportfolio_edit{border-radius:4px 4px 0 0}.o_ep_actualpage,.o_eportfolio_edit{padding:15px;background-color:#fff}.o_ep_content{margin-top:15px}.o_ep_filter .o_date.form-inline .form-group,.o_ep_filter .o_date.o_navbar-form .form-group{margin-left:8px}.o_eportfolio_share_policy_wrapper{border:1px solid #ddd;border-radius:4px}.o_eportfolio_share_header{padding:10px 15px;border-bottom:1px solid #ddd;background-color:#f5f5f5}.o_eportfolio_share_policy{padding:10px 15px}.o_map-default{background:#fafafa;background:#fafafa -webkit-gradient(linear, 37% 20%, 53% 100%, from(#fafafa), to(#efefef));background:#fafafa -moz-linear-gradient(43% 71% 101deg, #efefef, #fafafa);background:#fafafa -o-linear-gradient(#fafafa, #efefef);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#fafafa', EndColorStr='#efefef');border:1px solid #efefef;border-left:3px solid rgba(188,188,188,0.8)}.o_eportfolio_maps .o_map-default h4,.o_eportfolio_maps .o_map-default .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-default h2{color:#444;background:none}.o_eportfolio_maps .o_map-default .panel-body,.o_eportfolio_maps .o_map-default td,.o_eportfolio_maps .o_map-default a{color:#000}.o_map-comic{background:#a2c3e8 none;font-family:'Comic Sans MS', 'Comic Sans', fantasy;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_map-leather{background-color:#957352;background-image:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(248,248,248,0.7)), color-stop(100%, rgba(193,193,193,0.5))),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-webkit-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-moz-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-ms-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:-o-linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");background-image:linear-gradient(top, rgba(248,248,248,0.7), rgba(193,193,193,0.5)),url("../light/images/portfolio/white-leather-tile.jpg");font-family:Palatino, Georgia, serif;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-leather h4,.o_eportfolio_maps .o_map-leather .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-leather h2{background:rgba(243,230,225,0.3) none}.o_eportfolio_maps .o_map-leather .panel-body,.o_eportfolio_maps .o_map-leather td{color:#333}.o_eportfolio_maps .o_map-leather a{color:#fad9a4}.o_eportfolio_map.o_map-leather .o_map_header h4,.o_eportfolio_map.o_map-leather .o_map_header .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_map.o_map-leather .o_map_header h2,.o_eportfolio_map.o_map-leather .o_map_header p,.o_eportfolio_map.o_map-leather .o_map_header a,.o_eportfolio_map.o_map-leather .o_map_header span,.o_eportfolio_map.o_map-leather .o_map_header label{color:#333}.o_map-epmst-green{background-color:#ecf69a;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-green h4,.o_eportfolio_maps .o_map-epmst-green .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green h2{color:#444}.o_eportfolio_maps .o_map-epmst-green .panel-body,.o_eportfolio_maps .o_map-epmst-green td,.o_eportfolio_maps .o_map-epmst-green a{color:#000}.o_map-epmst-green2{background:#99e44d;background:#99e44d -webkit-gradient(linear, 37% 20%, 53% 100%, from(#99e44d), to(#cbf1a5));background:#99e44d -moz-linear-gradient(43% 71% 101deg, #cbf1a5, #99e44d);background:#99e44d -o-linear-gradient(#99e44d, #cbf1a5);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#99e44d', EndColorStr='#cbf1a5');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green2 h4,.o_eportfolio_maps .o_map-epmst-green2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green2 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green2 .panel-body,.o_eportfolio_maps .o_map-epmst-green2 td,.o_eportfolio_maps .o_map-epmst-green2 a{color:#000}.o_map-epmst-green3{background:#dff0c1;background:#dff0c1 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#dff0c1), to(#a0d346));background:#dff0c1 -moz-linear-gradient(43% 71% 101deg, #a0d346, #dff0c1);background:#dff0c1 -o-linear-gradient(#dff0c1, #a0d346);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#dff0c1', EndColorStr='#a0d346');border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green3 h4,.o_eportfolio_maps .o_map-epmst-green3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green3 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green3 .panel-body,.o_eportfolio_maps .o_map-epmst-green3 td,.o_eportfolio_maps .o_map-epmst-green3 a{color:#000}.o_map-epmst-green4{background-color:#d7dbb5;border:1px solid #bbb;border-left:3px solid rgba(136,136,136,0.8)}.o_eportfolio_maps .o_map-epmst-green4 h4,.o_eportfolio_maps .o_map-epmst-green4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-green4 h2{color:#555}.o_eportfolio_maps .o_map-epmst-green4 .panel-body,.o_eportfolio_maps .o_map-epmst-green4 td,.o_eportfolio_maps .o_map-epmst-green4 a{color:#000}.o_map-epmst-red{background:#ffba71;background:#ffba71 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#ffba71), to(#ffba99));background:#ffba71 -moz-linear-gradient(43% 71% 101deg, #ffba99, #ffba71);background:#ffba71 -o-linear-gradient(#ffba71, #ffba99);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffba71', EndColorStr='#ffba99');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red h4,.o_eportfolio_maps .o_map-epmst-red .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red h2{color:#444}.o_eportfolio_maps .o_map-epmst-red .panel-body,.o_eportfolio_maps .o_map-epmst-red td,.o_eportfolio_maps .o_map-epmst-red a{color:#000}.o_map-epmst-red2{background:#ff9772;background:#ff9772 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#ff9772), to(#ff9780));background:#ff9772 -moz-linear-gradient(43% 71% 101deg, #ff9780, #ff9772);background:#ff9772 -o-linear-gradient(#ff9772, #ff9780);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#ff9772', EndColorStr='#ff9780');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red2 h4,.o_eportfolio_maps .o_map-epmst-red2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red2 .panel-body,.o_eportfolio_maps .o_map-epmst-red2 td,.o_eportfolio_maps .o_map-epmst-red2 a{color:#000}.o_map-epmst-red3{background:#e8afbb;background:#e8afbb -webkit-gradient(linear, 37% 20%, 53% 100%, from(#e8afbb), to(#e8afa0));background:#e8afbb -moz-linear-gradient(43% 71% 101deg, #e8afa0, #e8afbb);background:#e8afbb -o-linear-gradient(#e8afbb, #e8afa0);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#e8afbb', EndColorStr='#e8afa0');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red3 h4,.o_eportfolio_maps .o_map-epmst-red3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red3 .panel-body,.o_eportfolio_maps .o_map-epmst-red3 td,.o_eportfolio_maps .o_map-epmst-red3 a{color:#000}.o_map-epmst-red4{background:#ffa800;background:#ffa800 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#ffa800), to(#ffaf00));background:#ffa800 -moz-linear-gradient(43% 71% 101deg, #ffaf00, #ffa800);background:#ffa800 -o-linear-gradient(#ffa800, #ffaf00);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#ffa800', EndColorStr='#ffaf00');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-red4 h4,.o_eportfolio_maps .o_map-epmst-red4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-red4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-red4 .panel-body,.o_eportfolio_maps .o_map-epmst-red4 td,.o_eportfolio_maps .o_map-epmst-red4 a{color:#000}.o_map-epmst-blue{background:#00d2f8;background:#00d2f8 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#00d2f8), to(#4a9ead));background:#00d2f8 -moz-linear-gradient(43% 71% 101deg, #4a9ead, #00d2f8);background:#00d2f8 -o-linear-gradient(#00d2f8, #4a9ead);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#00d2f8', EndColorStr='#4a9ead');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue h4,.o_eportfolio_maps .o_map-epmst-blue .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue .panel-body,.o_eportfolio_maps .o_map-epmst-blue td,.o_eportfolio_maps .o_map-epmst-blue a{color:#000}.o_map-epmst-blue2{background-color:#c4f6ff;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue2 h4,.o_eportfolio_maps .o_map-epmst-blue2 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue2 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue2 .panel-body,.o_eportfolio_maps .o_map-epmst-blue2 td,.o_eportfolio_maps .o_map-epmst-blue2 a{color:#000}.o_map-epmst-blue3{background-color:#b3e2f7;border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue3{box-shadow:3px 3px 4px rgba(20,20,20,0.4)}.o_eportfolio_maps .o_map-epmst-blue3 h4,.o_eportfolio_maps .o_map-epmst-blue3 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue3 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue3 .panel-body,.o_eportfolio_maps .o_map-epmst-blue3 td,.o_eportfolio_maps .o_map-epmst-blue3 a{color:#000}.o_map-epmst-blue4{background:#dee7f7;background:#dee7f7 -webkit-gradient(linear, 37% 20%, 53% 100%, from(#dee7f7), to(#c1e9fd));background:#dee7f7 -moz-linear-gradient(43% 71% 101deg, #c1e9fd, #dee7f7);background:#dee7f7 -o-linear-gradient(#dee7f7, #c1e9fd);filter:progid:DXImageTransform.Microsoft.gradient(startColorStr='#dee7f7', EndColorStr='#c1e9fd');border:1px solid #888;border-left:3px solid rgba(85,85,85,0.8)}.o_eportfolio_maps .o_map-epmst-blue4 h4,.o_eportfolio_maps .o_map-epmst-blue4 .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_eportfolio_maps .o_map-epmst-blue4 h2{color:#444}.o_eportfolio_maps .o_map-epmst-blue4 .panel-body,.o_eportfolio_maps .o_map-epmst-blue4 td,.o_eportfolio_maps .o_map-epmst-blue4 a{color:#000}.o_userbulk_changedcell{font-style:italic;font-weight:bold}body.o_dmz{background:transparent}body.o_dmz #o_bg{position:absolute;top:0;left:0;width:100%;height:100%;border-top:50px solid transparent;border-bottom:70px solid transparent;background:url("../light/images/learn-bg.jpg");background:linear-gradient(to right, rgba(255,255,255,0.1) 0.2%, rgba(255,255,255,0.6) 60%, rgba(255,255,255,0.8) 100%),url("../light/images/learn-bg.jpg");background-size:cover, cover;background-position:center center,center center;background-repeat:no-repeat}body.o_dmz #o_main_wrapper,body.o_dmz #o_main_wrapper #o_main_container{background:transparent}.o_login{padding-bottom:20px;padding-left:10%;padding-right:10%;text-align:right}.o_login .o_login_intro{padding-left:10%}.o_login .o_login_intro h1{margin-bottom:40px;color:#337ab7}.o_login .o_login_intro .lead{color:#333}.o_login .o_login_intro .lead h1,.o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h3,.o_login .o_login_intro .lead h4,.o_login .o_login_intro .lead .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_login .o_login_intro .lead h2,.o_login .o_login_intro .lead h5{margin-bottom:20px;color:#337ab7}.o_login .o_login_messages,.o_login .o_login_box{display:inline-block;width:400px;text-align:left}.o_login .o_login_messages .o_infomessage_wrapper{background:rgba(255,255,255,0.5);border:1px solid transparent;border-radius:4px;padding:6px 12px}.o_login .o_login_messages .o_infomessage_wrapper .o_info,.o_login .o_login_messages .o_infomessage_wrapper .o_warning,.o_login .o_login_messages .o_infomessage_wrapper .o_note{margin:0}.o_login .o_login_box{padding-top:10px}.o_login .o_login_providers{margin-bottom:6px;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_providers a span{display:block;font-size:9px;padding-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.o_login .o_login_providers .o_icon_provider_olat{font-size:1em}.o_login .o_login_provider{background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3);box-shadow:0px 1px 10px -1px rgba(0,0,0,0.3)}.o_login .o_login_form{position:relative;padding:10px 12px}.o_login .o_login_form .o_login_pwd{position:absolute;bottom:2em;right:12px}.o_login .o_login_form .o_form .o_desc{margin:0 0 30px 0;padding:0;border-left:0;background-color:transparent}.o_login .o_login_register{display:block;line-height:2em;font-size:18px;text-align:center;color:#fff;background-color:#5bc0de;border-color:#46b8da;border-radius:4px;margin-top:16px;padding:10px 12px}.o_login .o_login_register:hover,.o_login .o_login_register:focus,.o_login .o_login_register.focus,.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{color:#fff;background-color:#31b0d5;border-color:#269abc}.o_login .o_login_register:active,.o_login .o_login_register.active,.open>.o_login .o_login_register.dropdown-toggle{background-image:none}.o_login .o_login_register.disabled,.o_login .o_login_register.disabled:hover,.o_login .o_login_register.disabled:focus,.o_login .o_login_register.disabled.focus,.o_login .o_login_register.disabled:active,.o_login .o_login_register.disabled.active,.o_login .o_login_register[disabled],.o_login .o_login_register[disabled]:hover,.o_login .o_login_register[disabled]:focus,.o_login .o_login_register[disabled].focus,.o_login .o_login_register[disabled]:active,.o_login .o_login_register[disabled].active,fieldset[disabled] .o_login .o_login_register,fieldset[disabled] .o_login .o_login_register:hover,fieldset[disabled] .o_login .o_login_register:focus,fieldset[disabled] .o_login .o_login_register.focus,fieldset[disabled] .o_login .o_login_register:active,fieldset[disabled] .o_login .o_login_register.active{background-color:#5bc0de;border-color:#46b8da}.o_login .o_login_register .badge{color:#5bc0de;background-color:#fff}.o_login .o_login_register small{font-size:14px}.o_login .o_login_social{position:relative;padding:10px 12px}.o_login .o_login_social li{padding:10px 12px}.o_login .o_login_social li>a{display:block;line-height:2em;text-align:center;font-size:18px;border-radius:4px;padding:10px 12px}.o_login .o_login_social .btn-default.o_sel_auth_facebook{color:#fff;background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{color:#fff;background-color:#37538d;border-color:#2d4374}.o_login .o_login_social .btn-default.o_sel_auth_facebook:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_facebook.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled],.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_facebook[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_facebook.active{background-color:#4568b2;border-color:#3e5da0}.o_login .o_login_social .btn-default.o_sel_auth_facebook .badge{color:#4568b2;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_twitter{color:#fff;background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{color:#fff;background-color:#00b4f8;border-color:#009ad4}.o_login .o_login_social .btn-default.o_sel_auth_twitter:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_twitter.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled],.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_twitter[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_twitter.active{background-color:#2cc5ff;border-color:#13beff}.o_login .o_login_social .btn-default.o_sel_auth_twitter .badge{color:#2cc5ff;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_google{color:#fff;background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google:hover,.o_login .o_login_social .btn-default.o_sel_auth_google:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.focus,.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{color:#fff;background-color:#d83825;border-color:#ba3120}.o_login .o_login_social .btn-default.o_sel_auth_google:active,.o_login .o_login_social .btn-default.o_sel_auth_google.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_google.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_google.disabled,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_google.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled],.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_google[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_google.active{background-color:#e15f4f;border-color:#dd4b39}.o_login .o_login_social .btn-default.o_sel_auth_google .badge{color:#e15f4f;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_linkedin{color:#fff;background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{color:#fff;background-color:#015e8a;border-color:#014667}.o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_linkedin.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled],.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_linkedin[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_linkedin.active{background-color:#0181bd;border-color:#0170a4}.o_login .o_login_social .btn-default.o_sel_auth_linkedin .badge{color:#0181bd;background-color:#fff}.o_login .o_login_social .btn-default.o_sel_auth_adfs{color:#fff;background-color:#1a1a1a;border-color:#0d0d0d}.o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{color:#fff;background-color:#000;border-color:#000}.o_login .o_login_social .btn-default.o_sel_auth_adfs:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.active,.open>.o_login .o_login_social .btn-default.o_sel_auth_adfs.dropdown-toggle{background-image:none}.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs.disabled.active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled],.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:hover,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].focus,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled]:active,.o_login .o_login_social .btn-default.o_sel_auth_adfs[disabled].active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:hover,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.focus,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs:active,fieldset[disabled] .o_login .o_login_social .btn-default.o_sel_auth_adfs.active{background-color:#1a1a1a;border-color:#0d0d0d}.o_login .o_login_social .btn-default.o_sel_auth_adfs .badge{color:#1a1a1a;background-color:#fff}@media (max-width: 767px){body.o_dmz #o_bg{background:none;display:none}.o_login{padding:0}.o_login .o_login_intro{padding:0;text-align:left}.o_login .o_login_box_wrapper{text-align:center;padding:0}.o_login .o_login_box{padding-left:0;padding-right:0}.o_login .o_login_box .o_login_providers,.o_login .o_login_box .o_login_provider{-webkit-box-shadow:none;box-shadow:none}.o_login .o_login_messages,.o_login .o_login_box{width:100%;display:block}}.o_home_main h1{text-align:center}.o_home_main .o_icon_rss{line-height:20px;vertical-align:middle}.o_showall{font-size:12px;text-align:right;margin-bottom:5px;margin-top:10px}.o_portlet{position:relative;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.1);box-shadow:0 1px 1px rgba(0,0,0,0.1)}.o_portlet .o_header{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:6px 12px;border-bottom:1px solid #ddd;background-color:#f5f5f5;border-top-right-radius:4px;border-top-left-radius:4px}.o_portlet .o_content{padding:6px 12px}.o_portlet .o_portlet_table{margin:-12px;margin-bottom:-6px;margin-top:0}.o_portlet .o_table_empty.o_info{padding:6px}.o_portlet .o_toolbox{position:absolute;top:-1px;right:-1px;z-index:2;background-color:#fff;border:1px solid #faebcc;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:4px;border-bottom-left-radius:4px;padding:6px 12px}.o_portlet .o_toolbox div{display:inline}.o_portlet .o_edit_shim{position:absolute;height:100%;width:100%;z-index:1;background:#fcf8e3;opacity:0.8}.o_inactive .o_header a{float:right;margin-left:12px;margin-top:10px}.o_portlet_dyk_q{margin-top:5px;font-style:italic}.o_portlet_dyk_a{margin:5px 0}.o_portlet_dyk_next{margin:5px 0;text-align:right}.o_library_icon:before{content:"\f19c"}.o_library ul{list-style:none;margin:0 0 15px 0;padding:0}.o_library ul ul{margin:0}.o_library_overview .o_library_newest_files ul li{float:left;margin-right:15px}.o_library_item{margin-bottom:10px;position:relative}.o_library_item .o_library_visual,.o_library_item .o_library_extra,.o_library_item .o_library_meta{margin-top:15px}.o_library_item .o_library_visual{float:left;background-color:#fff;border-radius:4px;border:1px solid #ddd}.o_library_item .o_library_visual .o_thumbnail_available,.o_library_item .o_library_visual .o_thumbnail_unavailable{background-size:146px auto;width:150px !important;height:150px !important;background-repeat:no-repeat;background-position:50% 50%}.o_library_item .o_library_visual .o_thumbnail_available:before,.o_library_item .o_library_visual .o_thumbnail_unavailable:before{content:none}.o_library_item .o_library_visual .o_thumbnail_available{background-size:146px auto}.o_library_item .o_library_visual .o_thumbnail_unavailable{display:none}.o_library_item .o_library_extra{float:right;width:200px}.o_library_item .o_library_meta{clear:both}.o_library_item .o_library_meta .o_library_desc{padding-bottom:10px}.o_library_item .o_library_meta small{display:block;word-wrap:break-word}.o_library_item h4,.o_library_item .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item h2{margin:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:normal}.o_library_item .btn{display:block;margin-bottom:0.5em}.o_library_item .o_comments{display:inline-block}.o_library_item .table{table-layout:fixed;word-wrap:break-word;margin-bottom:0}.o_library_item p.o_library_show_more{text-align:right;margin:0;padding-top:20px}.o_library_item .o_library_more{padding-top:20px;display:none}.o_library_folder{margin-top:-20px}.o_ratings_and_comments .o_rating_title,.o_ratings_and_comments .o_rating_explanation{display:none}@media (min-width: 768px){.o_library_item .o_library_meta{clear:none;margin-left:150px;margin-right:200px;padding:0 10px}.o_library_item .o_library_more{display:none}.o_library_item .o_library_more table tbody{vertical-align:top}.o_library_item .o_library_more table tr,.o_library_item .o_library_more table th,.o_library_item .o_library_more table td{display:inline-block}.o_library_item .o_library_more table tr{width:49%}.o_library_item .o_library_more table th{width:30%}.o_library_item .o_library_more table td{width:70%}}.o_library_item_compact .o_library_extra{width:auto}.o_library_item_compact .o_library_meta{padding:0 10px 0 0;margin:0;overflow:hidden}.o_library_item_compact .btn{display:inline-block}.o_library_item_compact h4,.o_library_item_compact .o_cal .fc-header-title h2,.o_cal .fc-header-title .o_library_item_compact h2{overflow:hidden;margin-right:70px}.o_library_item_compact h4 a,.o_library_item_compact .o_cal .fc-header-title h2 a,.o_cal .fc-header-title .o_library_item_compact h2 a{text-overflow:ellipsis;white-space:nowrap}.o_library_item_compact p.o_library_show_more{padding:20px;position:absolute;top:0;right:0}span.o_translation_i18nitem{position:relative !important}span.o_translation_i18nitem a.o_translation_i18nitem_launcher{position:absolute !important;z-index:100 !important;width:18px !important;height:20px !important;top:0 !important;left:5px !important;background:#fff;border:1px solid #337ab7 !important;border-radius:3px;text-align:center;padding:0 !important}.o_user_infos{position:relative}.o_user_infos .o_user_portrait{position:absolute;top:0;left:15px;width:100px;height:100px}.o_user_infos .o_user_infos_inner{margin:0 30px 0 100px}.o_user_infos .o_user_infos_inner table{margin:0 30px 15px 30px}.o_members_pagination{text-align:center}.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:66px;height:66px;margin-right:10px}@media (max-width: 767px){.o_visitingcard .o_portrait_avatar,.o_visitingcard .o_portrait_dummy,.o_visitingcard .o_portrait_dummy_female_big,.o_visitingcard .o_portrait_dummy_male_big,.o_visitingcard .o_portrait_anonymous{width:50px;height:50px;margin:5px 5px 0 0}}.ui-widget{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:100%}.ui-widget-header{border-top:none;border-left:none;border-right:none;border-bottom:1px solid #eee;background:#fff;font-weight:bold}.ui-icon,.ui-widget-content .ui-icon,.ui-widget-header .ui-icon,.ui-state-default .ui-icon,.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-state-active .ui-icon,.ui-state-highlight .ui-icon,.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background:none;background-image:none}.ui-dialog{-webkit-box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);box-shadow:0px 1px 8px -1px rgba(0,0,0,0.35);background-color:#fefefe}.ui-dialog .ui-widget-header .ui-dialog-title{color:#337ab7;font-weight:500;font-family:inherit;line-height:1.1}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close:before{content:"\f00d" !important}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;font-size:100%;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ui-dialog .ui-widget-header .ui-dialog-titlebar-close span{display:none}.ui-dialog .ui-widget-header .ui-button.ui-corner-all{border:none !important;background:#fff !important;float:right}.ui-dialog .ui-widget-content{border-color:#fff;padding:5px;overflow:auto;background:white !important}.ui-dialog .ui-dialog-titlebar{padding:4px 7px 4px 7px;background-color:#eee !important}.ui-dialog.ui-corner-all{border-radius:4px}.ui-dialog.ui-widget-content{border:1px solid transparent}.ui-dialog.o_modal-ui div.ui-dialog-buttonpane{display:none}.ui-datepicker{z-index:2000 !important;-webkit-box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15);box-shadow:0px 1px 5px -1px rgba(0,0,0,0.15)}.ui-datepicker .ui-widget-header .ui-corner-all,.ui-datepicker .ui-widget-header .ui-datepicker-next.ui-corner-all{border:none !important;background:#fff !important}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e:before{content:"\f061";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w:before{content:"\f060";font-weight:normal;color:black}.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-e,.ui-datepicker .ui-widget-header .ui-icon.ui-icon-circle-triangle-w{font-family:'FontAwesome';display:inline-block;background-image:none;background-position:0 0;font-weight:normal;text-indent:0;color:white}.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-widget-header .ui-datepicker .ui-datepicker-next-hover{top:2px}.ui-datepicker .ui-state-default{background:#eee}.ui-datepicker .ui-state-highlight,.ui-datepicker .ui-widget-content .ui-state-highlight{border:1px solid #2e6da4;background:#337ab7;color:#fff}.ui-datepicker.ui-corner-all{border-radius:4px}.ui-datepicker.ui-widget-content{border:1px solid transparent}label.mce-label{display:inline;max-width:150px;margin-bottom:0;font-weight:normal}@media print{a[href]:after{content:""}#o_header_wrapper,#o_offcanvas_right,#o_navbar_wrapper,#o_footer_wrapper,#o_toplink,#o_main_left,#o_main_right,#o_main_toolbar,#jsMath_PrintWarning,.o_noti,.o_opener,.o_hide,.o_noprint{display:none !important}.o_print_break_avoid{page-break-inside:avoid}.o_print_break_before{page-break-before:always}body.o_dmz{background:white !important}.progress{-webkit-print-color-adjust:exact;background-color:rgba(0,0,0,0.1) !important;border:1px solid rgba(0,0,0,0.5)}.progress-bar{-webkit-print-color-adjust:exact;background-color:#000 !important;border:10px solid #000}}body.o_browser_ie7 #o_offcanvas_right,body.o_browser_ie8 #o_offcanvas_right{right:0px} \ No newline at end of file -- GitLab