Skip to content
Snippets Groups Projects
Commit 5a9db568 authored by srosse's avatar srosse
Browse files

OO-4439: add same metadata general, item analyse, technical as in pool

parent d0a64e90
No related branches found
No related tags found
No related merge requests found
Showing
with 931 additions and 160 deletions
......@@ -70,6 +70,8 @@ import org.olat.ims.qti21.ui.editor.interactions.MultipleChoiceEditorController;
import org.olat.ims.qti21.ui.editor.interactions.SingleChoiceEditorController;
import org.olat.ims.qti21.ui.editor.interactions.TrueFalseEditorController;
import org.olat.ims.qti21.ui.editor.interactions.UploadEditorController;
import org.olat.ims.qti21.ui.editor.metadata.MetadataChangedEvent;
import org.olat.ims.qti21.ui.editor.metadata.MetadataController;
import org.olat.modules.assessment.AssessmentEntry;
import org.olat.modules.assessment.AssessmentService;
import org.olat.modules.qpool.QPoolService;
......@@ -211,11 +213,9 @@ public class AssessmentItemEditorController extends BasicController implements A
tabbedPane.addTab(translate("form.pool"), poolEditor);
}
metadataCtrl = new MetadataController(ureq, getWindowControl(), metadataBuilder);
metadataCtrl = new MetadataController(ureq, getWindowControl(), metadataBuilder, readOnly);
listenTo(metadataCtrl);
if(metadataCtrl.hasMetadata()) {
tabbedPane.addTab(translate("form.metadata"), metadataCtrl);
}
tabbedPane.addTab(translate("form.metadata"), metadataCtrl);
}
putInitialPanel(mainVC);
......@@ -597,6 +597,11 @@ public class AssessmentItemEditorController extends BasicController implements A
if(event instanceof DetachFromPoolEvent) {
fireEvent(ureq, event);
}
} else if(metadataCtrl == source) {
if(event instanceof MetadataChangedEvent) {
doBuildAndCommitMetadata();
fireEvent(ureq, event);
}
}
super.event(ureq, source, event);
}
......
......@@ -121,6 +121,7 @@ import org.olat.ims.qti21.ui.editor.events.AssessmentTestPartEvent;
import org.olat.ims.qti21.ui.editor.events.DetachFromPoolEvent;
import org.olat.ims.qti21.ui.editor.events.SelectEvent;
import org.olat.ims.qti21.ui.editor.events.SelectEvent.SelectionTarget;
import org.olat.ims.qti21.ui.editor.metadata.MetadataChangedEvent;
import org.olat.ims.qti21.ui.editor.overview.AssessmentTestOverviewConfigurationController;
import org.olat.imscp.xml.manifest.FileType;
import org.olat.imscp.xml.manifest.ResourceType;
......@@ -473,6 +474,8 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
} else if(event instanceof DetachFromPoolEvent) {
DetachFromPoolEvent dfpe = (DetachFromPoolEvent)event;
doDetachItemFromPool(ureq, dfpe.getItemRef());
} else if(event instanceof MetadataChangedEvent) {
doSaveManifest();
} else if(selectQItemCtrl == source) {
cmc.deactivate();
cleanUp();
......
/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.ims.qti21.ui.editor.metadata;
import org.olat.modules.qpool.MetadataSecurityCallback;
/**
* Allow to change metadata and taxonomy.
*
* Initial date: 8 janv. 2020<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
class AssessmentItemEditorMetadataSecurityCallback implements MetadataSecurityCallback {
private final boolean readOnly;
AssessmentItemEditorMetadataSecurityCallback(boolean readOnly) {
this.readOnly = readOnly;
}
@Override
public boolean canEditMetadata() {
return !readOnly;
}
@Override
public boolean canRemoveTaxonomy() {
return !readOnly;
}
@Override
public boolean canChangeVersion() {
return false;
}
@Override
public boolean canEditAuthors() {
return false;
}
@Override
public boolean canViewReviews() {
return false;
}
}
/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.ims.qti21.ui.editor.metadata;
import org.olat.core.id.Roles;
import org.olat.modules.qpool.QPoolSecurityCallback;
/**
*
* Initial date: 8 janv. 2020<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class AssessmentItemEditorQPoolSecurityCallback implements QPoolSecurityCallback {
@Override
public void setRoles(Roles roles) {
//
}
@Override
public boolean canUseCollections() {
return false;
}
@Override
public boolean canUsePools() {
return false;
}
@Override
public boolean canUseGroups() {
return false;
}
@Override
public boolean canUseReviewProcess() {
return false;
}
@Override
public boolean canUseTaxonomy() {
return true;
}
@Override
public boolean canUseEducationalContext() {
return true;
}
@Override
public boolean canCreateTest() {
return false;
}
@Override
public boolean canEditAllQuestions() {
return false;
}
@Override
public boolean canConfigReviewProcess() {
return false;
}
@Override
public boolean canConfigTaxonomies() {
return false;
}
@Override
public boolean canConfigPools() {
return false;
}
@Override
public boolean canConfigItemTypes() {
return false;
}
@Override
public boolean canConfigEducationalContext() {
return false;
}
}
\ No newline at end of file
/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.ims.qti21.ui.editor.metadata;
import java.math.BigDecimal;
import java.util.Date;
import org.olat.core.CoreSpringFactory;
import org.olat.core.util.StringHelper;
import org.olat.ims.qti.qpool.QTIMetadataConverter;
import org.olat.ims.qti21.QTI21Constants;
import org.olat.ims.qti21.model.xml.ManifestMetadataBuilder;
import org.olat.modules.qpool.QPoolService;
import org.olat.modules.qpool.QuestionItem;
import org.olat.modules.qpool.QuestionItemEditable;
import org.olat.modules.qpool.QuestionStatus;
import org.olat.modules.qpool.manager.QEducationalContextDAO;
import org.olat.modules.qpool.manager.QItemTypeDAO;
import org.olat.modules.qpool.model.QEducationalContext;
import org.olat.modules.qpool.model.QItemType;
import org.olat.modules.qpool.model.QLicense;
import org.olat.modules.taxonomy.TaxonomyLevel;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Manifest based implementation of QuestionItem, editable.
*
* Initial date: 8 janv. 2020<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
class ManifestMetadataItemized implements QuestionItem, QuestionItemEditable {
private final ManifestMetadataBuilder metadataBuilder;
private final QTIMetadataConverter metadataConverter;
private String lang;
private String directory;
private QItemType itemType;
private QEducationalContext context;
private TaxonomyLevel taxonomyLevel;
@Autowired
private QItemTypeDAO itemTypeDao;
@Autowired
private QPoolService qpoolService;
@Autowired
private QEducationalContextDAO educationalContextDao;
public ManifestMetadataItemized(ManifestMetadataBuilder metadataBuilder, String lang) {
CoreSpringFactory.autowireObject(this);
this.metadataBuilder = metadataBuilder;
this.lang = lang;
metadataConverter = new QTIMetadataConverter(itemTypeDao, educationalContextDao, qpoolService);
if(StringHelper.containsNonWhitespace(metadataBuilder.getClassificationTaxonomy())) {
taxonomyLevel = metadataConverter.toTaxonomy(metadataBuilder.getClassificationTaxonomy());
}
if(StringHelper.containsNonWhitespace(metadataBuilder.getEducationContext())) {
context = metadataConverter.toEducationalContext(metadataBuilder.getEducationContext());
}
if(StringHelper.containsNonWhitespace(metadataBuilder.getOpenOLATMetadataQuestionType())) {
itemType = metadataConverter.toType(metadataBuilder.getOpenOLATMetadataQuestionType());
}
}
@Override
public Long getKey() {
return null;
}
@Override
public String getIdentifier() {
return metadataBuilder.getOpenOLATMetadataIdentifier();
}
@Override
public String getMasterIdentifier() {
return metadataBuilder.getOpenOLATMetadataMasterIdentifier();
}
@Override
public String getTitle() {
return metadataBuilder.getTitle();
}
@Override
public String getLanguage() {
return lang;
}
@Override
public String getKeywords() {
return metadataBuilder.getGeneralKeywords();
}
@Override
public void setKeywords(String keywords) {
metadataBuilder.setGeneralKeywords(keywords, lang);
}
@Override
public void setLanguage(String language) {
this.lang = language;
metadataBuilder.setLanguage(language, language);
}
@Override
public String getTaxonomyLevelName() {
if(taxonomyLevel != null) {
return taxonomyLevel.getDisplayName();
}
return metadataBuilder.getClassificationTaxonomy();
}
@Override
public String getTaxonomicPath() {
if(taxonomyLevel != null) {
return taxonomyLevel.getMaterializedPathIdentifiers();
}
return metadataBuilder.getClassificationTaxonomy();
}
@Override
public String getTopic() {
return metadataBuilder.getOpenOLATMetadataTopic();
}
@Override
public void setTopic(String topic) {
metadataBuilder.setOpenOLATMetadataTopic(topic);
}
@Override
public String getEducationalContextLevel() {
if(context != null) {
return context.getLevel();
}
return metadataBuilder.getEducationContext();
}
@Override
public String getEducationalLearningTime() {
return metadataBuilder.getEducationalLearningTime();
}
@Override
public void setEducationalLearningTime(String time) {
metadataBuilder.setEducationalLearningTime(time);
}
@Override
public String getItemType() {
return metadataBuilder.getOpenOLATMetadataQuestionType();
}
@Override
public BigDecimal getDifficulty() {
Double val = metadataBuilder.getOpenOLATMetadataDifficulty();
return val == null ? null : BigDecimal.valueOf(val.doubleValue());
}
@Override
public void setDifficulty(BigDecimal difficulty) {
metadataBuilder.setOpenOLATMetadataDifficulty(difficulty);
}
@Override
public BigDecimal getStdevDifficulty() {
Double val = metadataBuilder.getOpenOLATMetadataStandardDeviation();
return val == null ? null : BigDecimal.valueOf(val.doubleValue());
}
@Override
public void setStdevDifficulty(BigDecimal stdevDifficulty) {
metadataBuilder.setOpenOLATMetadataStandardDeviation(stdevDifficulty);
}
@Override
public BigDecimal getDifferentiation() {
Double val = metadataBuilder.getOpenOLATMetadataDiscriminationIndex();
return val == null ? null : BigDecimal.valueOf(val.doubleValue());
}
@Override
public void setDifferentiation(BigDecimal differentiation) {
metadataBuilder.setOpenOLATMetadataDiscriminationIndex(differentiation);
}
@Override
public int getNumOfAnswerAlternatives() {
Integer val = metadataBuilder.getOpenOLATMetadataDistractors();
return val == null ? 0 : val.intValue();
}
@Override
public void setNumOfAnswerAlternatives(int numOfAnswerAlternatives) {
metadataBuilder.setOpenOLATMetadataDistractors(Integer.valueOf(numOfAnswerAlternatives));
}
@Override
public int getUsage() {
Integer usage = metadataBuilder.getOpenOLATMetadataUsage();
return usage == null ? 0 : usage.intValue();
}
@Override
public void setUsage(int numOfUsage) {
metadataBuilder.setOpenOLATMetadataUsage(Integer.valueOf(numOfUsage));
}
@Override
public QuestionStatus getQuestionStatus() {
return null;
}
@Override
public Date getQuestionStatusLastModified() {
return null;
}
@Override
public String getFormat() {
return QTI21Constants.QTI_21_FORMAT;
}
@Override
public Integer getCorrectionTime() {
return metadataBuilder.getOpenOLATMetadataCorrectionTime();
}
@Override
public void setCorrectionTime(Integer timeInMinute) {
metadataBuilder.setOpenOLATMetadataCorrectionTime(timeInMinute);
}
@Override
public Date getLastModified() {
return null;
}
@Override
public void setLastModified(Date date) {
//
}
@Override
public Date getCreationDate() {
return null;
}
@Override
public String getResourceableTypeName() {
return null;
}
@Override
public Long getResourceableId() {
return null;
}
@Override
public String getDescription() {
return metadataBuilder.getDescription();
}
@Override
public String getCoverage() {
return metadataBuilder.getCoverage();
}
@Override
public void setCoverage(String coverage) {
metadataBuilder.setCoverage(coverage, lang);
}
@Override
public String getAdditionalInformations() {
return metadataBuilder.getOpenOLATMetadataAdditionalInformations();
}
@Override
public void setAdditionalInformations(String informations) {
metadataBuilder.setOpenOLATMetadataAdditionalInformations(informations);
}
@Override
public void setTaxonomyLevel(TaxonomyLevel taxonomyLevel) {
this.taxonomyLevel = taxonomyLevel;
metadataBuilder.setClassificationTaxonomy(getTaxonomicPath(), lang);
}
@Override
public TaxonomyLevel getTaxonomyLevel() {
return taxonomyLevel;
}
@Override
public QEducationalContext getEducationalContext() {
return context;
}
@Override
public void setEducationalContext(QEducationalContext context) {
this.context = context;
metadataBuilder.setEducationalContext(context.getLevel(), lang);
}
@Override
public QItemType getType() {
return itemType;
}
@Override
public String getAssessmentType() {
return metadataBuilder.getOpenOLATMetadataAssessmentType();
}
@Override
public void setAssessmentType(String type) {
metadataBuilder.setOpenOLATMetadataAssessmentType(type);
}
@Override
public String getItemVersion() {
return metadataBuilder.getLifecycleVersion();
}
@Override
public QLicense getLicense() {
return null;
}
@Override
public String getCreator() {
return metadataBuilder.getOpenOLATMetadataCreator();
}
@Override
public String getEditor() {
return metadataBuilder.getQtiMetadaToolVendor();
}
@Override
public String getEditorVersion() {
return metadataBuilder.getQtiMetadataToolVersion();
}
@Override
public String getDirectory() {
return directory;
}
}
/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.ims.qti21.ui.editor.metadata;
import org.olat.core.gui.control.Event;
/**
*
* Initial date: 8 janv. 2020<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class MetadataChangedEvent extends Event {
private static final long serialVersionUID = 978018182214795733L;
private static final String METADATA_CHANGED = "metadata-changed";
public MetadataChangedEvent() {
super(METADATA_CHANGED);
}
}
......@@ -17,19 +17,24 @@
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.ims.qti21.ui.editor;
package org.olat.ims.qti21.ui.editor.metadata;
import java.util.Locale;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItemContainer;
import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
import org.olat.core.gui.components.Component;
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.util.StringHelper;
import org.olat.core.gui.control.controller.BasicController;
import org.olat.core.util.Util;
import org.olat.ims.qti21.model.xml.ManifestMetadataBuilder;
import org.olat.modules.qpool.manager.MetadataConverterHelper;
import org.olat.modules.qpool.model.LOMDuration;
import org.olat.modules.qpool.MetadataSecurityCallback;
import org.olat.modules.qpool.QPoolSecurityCallback;
import org.olat.modules.qpool.QuestionItem;
import org.olat.modules.qpool.ui.QuestionsController;
import org.olat.modules.qpool.ui.events.QItemEdited;
import org.olat.modules.qpool.ui.metadata.MetadatasController;
/**
*
......@@ -37,52 +42,23 @@ import org.olat.modules.qpool.ui.QuestionsController;
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class MetadataController extends FormBasicController {
public class MetadataController extends BasicController {
private MetadatasController metadataCtrl;
private final ManifestMetadataBuilder metadataBuilder;
public MetadataController(UserRequest ureq, WindowControl wControl, ManifestMetadataBuilder metadataBuilder) {
public MetadataController(UserRequest ureq, WindowControl wControl,
ManifestMetadataBuilder metadataBuilder, boolean readOnly) {
super(ureq, wControl, Util.createPackageTranslator(QuestionsController.class, ureq.getLocale()));
this.metadataBuilder = metadataBuilder;
initForm(ureq);
}
@Override
protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
String learningTime = metadataBuilder.getEducationalLearningTime();
LOMDuration duration = MetadataConverterHelper.convertDuration(learningTime);
String formattedLearningTime = formatLearningTime(duration);
uifactory.addStaticTextElement("educational.learningTime", formattedLearningTime, formLayout);
Integer correctionTime = metadataBuilder.getOpenOLATMetadataCorrectionTime();
String correctionTimeStr = null;
if(correctionTime != null) {
correctionTimeStr = translate("question.correctionTime.inMinutes", new String[] { correctionTime.toString() });
}
uifactory.addStaticTextElement("question.correctionTime", correctionTimeStr, formLayout);
}
public boolean hasMetadata() {
return StringHelper.containsNonWhitespace(metadataBuilder.getEducationalLearningTime())
|| metadataBuilder.getOpenOLATMetadataCorrectionTime() != null;
}
private String formatLearningTime(LOMDuration duration) {
StringBuilder sb = new StringBuilder(32);
boolean started = appendFormatLearningTime(duration.getDay(), "educational.learningTime.day", sb, false);
started |= appendFormatLearningTime(duration.getHour(), "educational.learningTime.hour", sb, started);
appendFormatLearningTime(duration.getMinute(), "educational.learningTime.minute", sb, started);
appendFormatLearningTime(duration.getSeconds(), "educational.learningTime.second", sb, false);
return sb.toString();
}
private boolean appendFormatLearningTime(int value, String unit, StringBuilder sb, boolean append) {
if(append || value > 0) {
if(sb.length() > 0) sb.append(" ");
sb.append(value)
.append(translate(unit));
}
return value > 0;
Locale locale = getLocale();
QuestionItem item = new ManifestMetadataItemized(metadataBuilder, locale.getLanguage());
QPoolSecurityCallback qPoolSecurityCallback = new AssessmentItemEditorQPoolSecurityCallback();
MetadataSecurityCallback metadataScurityCallback = new AssessmentItemEditorMetadataSecurityCallback(readOnly);
metadataCtrl = new MetadatasController(ureq, wControl, qPoolSecurityCallback, item, metadataScurityCallback, false, true);
listenTo(metadataCtrl);
putInitialPanel(metadataCtrl.getInitialComponent());
}
@Override
......@@ -91,10 +67,17 @@ public class MetadataController extends FormBasicController {
}
@Override
protected void formOK(UserRequest ureq) {
protected void event(UserRequest ureq, Component source, Event event) {
//
}
@Override
protected void event(UserRequest ureq, Controller source, Event event) {
if(metadataCtrl == source) {
if(event instanceof QItemEdited) {
fireEvent(ureq, new MetadataChangedEvent());
}
}
super.event(ureq, source, event);
}
}
/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.modules.qpool;
import java.math.BigDecimal;
import org.olat.modules.qpool.model.QEducationalContext;
import org.olat.modules.taxonomy.TaxonomyLevel;
/**
*
* Initial date: 8 janv. 2020<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public interface QuestionItemEditable {
public void setTopic(String topic);
public void setKeywords(String keywords);
public void setCoverage(String coverage);
public void setAdditionalInformations(String informations);
public void setLanguage(String language);
public void setAssessmentType(String type);
public void setEducationalContext(QEducationalContext context);
public void setTaxonomyLevel(TaxonomyLevel taxonomyLevel);
public void setEducationalLearningTime(String time);
public void setCorrectionTime(Integer timeInMinutes);
public void setDifficulty(BigDecimal difficulty);
public void setStdevDifficulty(BigDecimal stdevDifficulty);
public void setDifferentiation(BigDecimal differentiation);
public void setNumOfAnswerAlternatives(int numOfAnswerAlternatives);
public void setUsage(int usage);
}
......@@ -41,6 +41,7 @@ import org.olat.basesecurity.SecurityGroup;
import org.olat.basesecurity.SecurityGroupImpl;
import org.olat.core.id.Persistable;
import org.olat.core.util.StringHelper;
import org.olat.modules.qpool.QuestionItemEditable;
import org.olat.modules.qpool.QuestionItemFull;
import org.olat.modules.qpool.QuestionStatus;
import org.olat.modules.taxonomy.TaxonomyLevel;
......@@ -54,7 +55,7 @@ import org.olat.modules.taxonomy.model.TaxonomyLevelImpl;
@Entity(name="questionitem")
@Table(name="o_qp_item")
@NamedQuery(name="loadQuestionItemByKey", query="select item from questionitem item where item.key=:itemKey")
public class QuestionItemImpl implements QuestionItemFull, Persistable {
public class QuestionItemImpl implements QuestionItemFull, QuestionItemEditable, Persistable {
private static final long serialVersionUID = 6264601750280239307L;
......@@ -216,6 +217,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return topic;
}
@Override
public void setTopic(String topic) {
this.topic = topic;
}
......@@ -234,6 +236,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return coverage;
}
@Override
public void setCoverage(String coverage) {
this.coverage = coverage;
}
......@@ -243,6 +246,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return additionalInformations;
}
@Override
public void setAdditionalInformations(String additionalInformations) {
this.additionalInformations = additionalInformations;
}
......@@ -252,6 +256,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return taxonomyLevel;
}
@Override
public void setTaxonomyLevel(TaxonomyLevel taxonomyLevel) {
this.taxonomyLevel = taxonomyLevel;
}
......@@ -278,6 +283,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return educationalContext;
}
@Override
public void setEducationalContext(QEducationalContext educationalContext) {
this.educationalContext = educationalContext;
}
......@@ -295,6 +301,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return educationalLearningTime;
}
@Override
public void setEducationalLearningTime(String educationalLearningTime) {
this.educationalLearningTime = educationalLearningTime;
}
......@@ -304,6 +311,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return difficulty;
}
@Override
public void setDifficulty(BigDecimal difficulty) {
this.difficulty = difficulty;
}
......@@ -313,6 +321,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return stdevDifficulty;
}
@Override
public void setStdevDifficulty(BigDecimal stdevDifficulty) {
this.stdevDifficulty = stdevDifficulty;
}
......@@ -322,6 +331,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return differentiation;
}
@Override
public void setDifferentiation(BigDecimal differentiation) {
this.differentiation = differentiation;
}
......@@ -331,6 +341,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return numOfAnswerAlternatives;
}
@Override
public void setNumOfAnswerAlternatives(int numOfAnswerAlternatives) {
this.numOfAnswerAlternatives = numOfAnswerAlternatives;
}
......@@ -340,6 +351,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return usage;
}
@Override
public void setUsage(int usage) {
this.usage = usage;
}
......@@ -349,6 +361,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return assessmentType;
}
@Override
public void setAssessmentType(String assessmentType) {
this.assessmentType = assessmentType;
}
......@@ -386,6 +399,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return language;
}
@Override
public void setLanguage(String language) {
this.language = language;
}
......@@ -420,6 +434,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return correctionTime;
}
@Override
public void setCorrectionTime(Integer correctionTime) {
this.correctionTime = correctionTime;
}
......@@ -429,6 +444,7 @@ public class QuestionItemImpl implements QuestionItemFull, Persistable {
return keywords;
}
@Override
public void setKeywords(String keywords) {
this.keywords = keywords;
}
......
......@@ -19,7 +19,6 @@
*/
package org.olat.modules.qpool.security;
import org.olat.modules.qpool.QPoolService;
import org.olat.modules.qpool.QuestionItemSecurityCallback;
import org.olat.modules.qpool.QuestionItemView;
import org.olat.modules.qpool.QuestionPoolModule;
......@@ -45,8 +44,6 @@ public class ProcesslessSecurityCallback implements QuestionItemSecurityCallback
@Autowired
private QuestionPoolModule qpoolModule;
@Autowired
private QPoolService qpoolService;
@Override
public void setQuestionItemView(QuestionItemView itemView) {
......
......@@ -170,7 +170,7 @@ public class QuestionItemDetailsController extends BasicController implements To
private void setMetadatasController(UserRequest ureq, QuestionItem item, QuestionItemSecurityCallback securityCallback) {
metadatasCtrl = new MetadatasController(ureq, getWindowControl(), qPoolSecurityCallback, item, securityCallback,
itemSource.isAdminItemSource());
itemSource.isAdminItemSource(), false);
mainVC.put("metadatas", metadatasCtrl.getInitialComponent());
listenTo(metadatasCtrl);
}
......
......@@ -60,7 +60,7 @@ public class QuickViewMetadataController extends BasicController {
metadataPanel.setContent(null);
} else {
removeAsListenerAndDispose(metadataCtrl);
metadataCtrl = new MetadatasController(ureq, getWindowControl(), qPoolSecurityCallback, item, metadataSecurityCallback, false);
metadataCtrl = new MetadatasController(ureq, getWindowControl(), qPoolSecurityCallback, item, metadataSecurityCallback, false, false);
metadataPanel.setContent(metadataCtrl.getInitialComponent());
}
}
......
......@@ -40,6 +40,7 @@ import org.olat.modules.qpool.QPoolService;
import org.olat.modules.qpool.QuestionItem;
import org.olat.modules.qpool.QuestionItemAuditLog.Action;
import org.olat.modules.qpool.QuestionItemAuditLogBuilder;
import org.olat.modules.qpool.QuestionItemEditable;
import org.olat.modules.qpool.model.QEducationalContext;
import org.olat.modules.qpool.model.QuestionItemImpl;
import org.olat.modules.qpool.ui.QuestionsController;
......@@ -78,8 +79,8 @@ public class GeneralMetadataEditController extends FormBasicController {
public GeneralMetadataEditController(UserRequest ureq, WindowControl wControl,
QPoolSecurityCallback qPoolSecurityCallback, QuestionItem item, MetadataSecurityCallback securityCallback,
boolean ignoreCompetences) {
super(ureq, wControl, LAYOUT_VERTICAL);
boolean ignoreCompetences, boolean wideLayout) {
super(ureq, wControl, wideLayout ? LAYOUT_DEFAULT : LAYOUT_VERTICAL);
setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
this.qPoolSecurityCallback = qPoolSecurityCallback;
......@@ -144,8 +145,8 @@ public class GeneralMetadataEditController extends FormBasicController {
buttonsCont.setElementCssClass("o_sel_qpool_metadata_buttons");
buttonsCont.setRootForm(mainForm);
formLayout.add(buttonsCont);
uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
}
private void buildTaxonomyLevelEl() {
......@@ -153,26 +154,25 @@ public class GeneralMetadataEditController extends FormBasicController {
String[] selectableKeys = qpoolTaxonomyTreeBuilder.getSelectableKeys();
String[] selectableValues = qpoolTaxonomyTreeBuilder.getSelectableValues();
taxonomyLevelEl.setKeysAndValues(selectableKeys, selectableValues, null);
if (item instanceof QuestionItemImpl) {
QuestionItemImpl itemImpl = (QuestionItemImpl) item;
TaxonomyLevel selectedTaxonomyLevel = itemImpl.getTaxonomyLevel();
if(selectedTaxonomyLevel != null) {
String selectedTaxonomyLevelKey = String.valueOf(selectedTaxonomyLevel.getKey());
for(String taxonomyKey: qpoolTaxonomyTreeBuilder.getSelectableKeys()) {
if(taxonomyKey.equals(selectedTaxonomyLevelKey)) {
taxonomyLevelEl.select(taxonomyKey, true);
}
TaxonomyLevel selectedTaxonomyLevel = item.getTaxonomyLevel();
if(selectedTaxonomyLevel != null) {
String selectedTaxonomyLevelKey = String.valueOf(selectedTaxonomyLevel.getKey());
for(String taxonomyKey: qpoolTaxonomyTreeBuilder.getSelectableKeys()) {
if(taxonomyKey.equals(selectedTaxonomyLevelKey)) {
taxonomyLevelEl.select(taxonomyKey, true);
}
if (!taxonomyLevelEl.isOneSelected() && itemImpl.getTaxonomyLevel() != null) {
if (selectableKeys.length == 0) {
selectableKeys = new String[] {"dummy"};
selectableValues = new String[1];
}
selectableValues[0] = itemImpl.getTaxonomyLevel().getDisplayName();
taxonomyLevelEl.setEnabled(false);
}
if (!taxonomyLevelEl.isOneSelected() && selectedTaxonomyLevel != null) {
if (selectableKeys.length == 0) {
selectableKeys = new String[] {"dummy"};
selectableValues = new String[1];
}
selectableValues[0] = selectedTaxonomyLevel.getDisplayName();
taxonomyLevelEl.setEnabled(false);
}
}
taxonomyLevelEl.addActionListener(FormEvent.ONCHANGE);
setTaxonomicPath();
}
......@@ -240,11 +240,13 @@ public class GeneralMetadataEditController extends FormBasicController {
@Override
protected void formOK(UserRequest ureq) {
if(item instanceof QuestionItemImpl) {
QuestionItemImpl itemImpl = (QuestionItemImpl)item;
if(item instanceof QuestionItemEditable) {
QuestionItemEditable itemImpl = (QuestionItemEditable)item;
QuestionItemAuditLogBuilder builder = qpoolService.createAuditLogBuilder(getIdentity(),
Action.UPDATE_QUESTION_ITEM_METADATA);
builder.withBefore(itemImpl);
if(item instanceof QuestionItemImpl) {
builder.withBefore(item);
}
itemImpl.setTopic(topicEl.getValue());
......@@ -284,9 +286,11 @@ public class GeneralMetadataEditController extends FormBasicController {
String assessmentType = assessmentTypeEl.isOneSelected()? assessmentTypeEl.getSelectedKey(): null;
itemImpl.setAssessmentType(assessmentType);
item = qpoolService.updateItem(item);
builder.withAfter(itemImpl);
qpoolService.persist(builder.create());
if(item instanceof QuestionItemImpl) {
item = qpoolService.updateItem(item);
builder.withAfter(item);
qpoolService.persist(builder.create());
}
fireEvent(ureq, new QItemEdited(item));
}
}
......
......@@ -331,7 +331,7 @@ public class MetadataBulkChangeController extends FormBasicController {
@Override
protected boolean validateFormLogic(UserRequest ureq) {
boolean allOk = true;
boolean allOk = super.validateFormLogic(ureq);
//general
allOk &= validateElementLogic(topicEl, topicEl.getMaxLength(), false, isEnabled(topicEl));
......@@ -352,7 +352,7 @@ public class MetadataBulkChangeController extends FormBasicController {
//rights
allOk &= validateElementLogic(licensorEl, 1000, false, isEnabled(licensorEl));
return allOk & super.validateFormLogic(ureq);
return allOk;
}
private boolean isEnabled(FormItem item) {
......
......@@ -57,7 +57,7 @@ public class MetadatasController extends BasicController {
private QuestionItem item;
public MetadatasController(UserRequest ureq, WindowControl wControl, QPoolSecurityCallback qPoolSecurityCallback,
QuestionItem item, MetadataSecurityCallback metadataScurityCallback, boolean ignoreCompetences) {
QuestionItem item, MetadataSecurityCallback metadataScurityCallback, boolean ignoreCompetences, boolean wideLayout) {
super(ureq, wControl);
setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
......@@ -65,19 +65,21 @@ public class MetadatasController extends BasicController {
mainVC = createVelocityContainer("item_metadatas");
generalEditCtrl = new GeneralMetadataEditController(ureq, wControl, qPoolSecurityCallback, item,
metadataScurityCallback, ignoreCompetences);
metadataScurityCallback, ignoreCompetences, wideLayout);
listenTo(generalEditCtrl);
mainVC.put("details_general", generalEditCtrl.getInitialComponent());
questionEditCtrl = new QuestionMetadataEditController(ureq, wControl, item, metadataScurityCallback);
questionEditCtrl = new QuestionMetadataEditController(ureq, wControl, item, metadataScurityCallback, wideLayout);
listenTo(questionEditCtrl);
mainVC.put("details_question", questionEditCtrl.getInitialComponent());
rightsEditCtrl = new RightsMetadataEditController(ureq, wControl, item, metadataScurityCallback);
listenTo(rightsEditCtrl);
mainVC.put("details_rights", rightsEditCtrl.getInitialComponent());
if(item.getResourceableId() != null) {
rightsEditCtrl = new RightsMetadataEditController(ureq, wControl, item, metadataScurityCallback, wideLayout);
listenTo(rightsEditCtrl);
mainVC.put("details_rights", rightsEditCtrl.getInitialComponent());
}
technicalEditCtrl = new TechnicalMetadataEditController(ureq, wControl, item, metadataScurityCallback);
technicalEditCtrl = new TechnicalMetadataEditController(ureq, wControl, item, metadataScurityCallback, wideLayout);
listenTo(technicalEditCtrl);
mainVC.put("details_technical", technicalEditCtrl.getInitialComponent());
......@@ -150,7 +152,9 @@ public class MetadatasController extends BasicController {
this.item = item;
generalEditCtrl.setItem(item, metadataSecurityCallback);
questionEditCtrl.setItem(item, metadataSecurityCallback);
rightsEditCtrl.setItem(item, metadataSecurityCallback);
if(rightsEditCtrl != null) {
rightsEditCtrl.setItem(item, metadataSecurityCallback);
}
technicalEditCtrl.setItem(item, metadataSecurityCallback);
if (ratingMetadataCtrl != null) {
ratingMetadataCtrl.setItem(item);
......@@ -173,14 +177,14 @@ public class MetadatasController extends BasicController {
Preferences guiPrefs = ureq.getUserSession().getGuiPreferences();
String guiPref = (String) guiPrefs.get(MetadatasController.class, GUIPREF_KEY_OPEN_PANEL);
String openPanel = guiPref != null? guiPrefToPanel(guiPref): "general";
mainVC.contextRemove("inGeneral");
mainVC.contextRemove("inQuestion");
mainVC.contextRemove("inRights");
mainVC.contextRemove("inTechnical");
mainVC.contextRemove("inRatings");
mainVC.contextRemove("inPools");
mainVC.contextRemove("inShares");
mainVC.contextPut("in-" + openPanel, "in");
mainVC.contextRemove("ingeneral");
mainVC.contextRemove("inquestion");
mainVC.contextRemove("inrights");
mainVC.contextRemove("intechnical");
mainVC.contextRemove("inratings");
mainVC.contextRemove("inpools");
mainVC.contextRemove("inshares");
mainVC.contextPut("in" + openPanel.toLowerCase(), "in");
}
private String guiPrefToPanel(String guiPref) {
......
......@@ -113,7 +113,7 @@ public class PoolsMetadataController extends FormBasicController {
public Object getValueAt(int row, int col) {
QuestionItem2Pool info = getObject(row);
if(col == 0) {
return new Boolean(info.isEditable());
return Boolean.valueOf(info.isEditable());
}
return info.getPoolName();
}
......
......@@ -45,6 +45,7 @@ import org.olat.modules.qpool.QPoolService;
import org.olat.modules.qpool.QuestionItem;
import org.olat.modules.qpool.QuestionItemAuditLog.Action;
import org.olat.modules.qpool.QuestionItemAuditLogBuilder;
import org.olat.modules.qpool.QuestionItemEditable;
import org.olat.modules.qpool.manager.MetadataConverterHelper;
import org.olat.modules.qpool.model.LOMDuration;
import org.olat.modules.qpool.model.QItemType;
......@@ -80,8 +81,8 @@ public class QuestionMetadataEditController extends FormBasicController {
private QPoolService qpoolService;
public QuestionMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item,
MetadataSecurityCallback securityCallback) {
super(ureq, wControl, LAYOUT_VERTICAL);
MetadataSecurityCallback securityCallback, boolean wideLayout) {
super(ureq, wControl, wideLayout ? LAYOUT_DEFAULT : LAYOUT_VERTICAL);
setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
this.item = item;
......@@ -173,8 +174,8 @@ public class QuestionMetadataEditController extends FormBasicController {
buttonsCont.setElementCssClass("o_sel_qpool_metadata_buttons");
buttonsCont.setRootForm(mainForm);
formLayout.add(buttonsCont);
uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
}
private void setReadOnly(MetadataSecurityCallback securityCallback) {
......@@ -223,11 +224,13 @@ public class QuestionMetadataEditController extends FormBasicController {
@Override
protected void formOK(UserRequest ureq) {
if(item instanceof QuestionItemImpl) {
QuestionItemImpl itemImpl = (QuestionItemImpl)item;
if(item instanceof QuestionItemEditable) {
QuestionItemEditable itemImpl = (QuestionItemEditable)item;
QuestionItemAuditLogBuilder builder = qpoolService.createAuditLogBuilder(getIdentity(),
Action.UPDATE_QUESTION_ITEM_METADATA);
builder.withBefore(itemImpl);
if(itemImpl instanceof QuestionItemImpl) {
builder.withBefore(item);
}
int day = learningTimeDayElement.getIntValue();
int hour = learningTimeHourElement.getIntValue();
......@@ -256,9 +259,11 @@ public class QuestionMetadataEditController extends FormBasicController {
itemImpl.setCorrectionTime(Integer.valueOf(correctionTimeMinuteElement.getValue()));
}
item = qpoolService.updateItem(itemImpl);
builder.withAfter(item);
qpoolService.persist(builder.create());
if(item instanceof QuestionItemImpl) {
item = qpoolService.updateItem(item);
builder.withAfter(item);
qpoolService.persist(builder.create());
}
fireEvent(ureq, new QItemEdited(item));
}
}
......
......@@ -103,8 +103,8 @@ public class RightsMetadataEditController extends FormBasicController {
private QuestionPoolLicenseHandler licenseHandler;
public RightsMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item,
MetadataSecurityCallback securityCallback) {
super(ureq, wControl, LAYOUT_VERTICAL);
MetadataSecurityCallback securityCallback, boolean wideLayout) {
super(ureq, wControl, wideLayout ? LAYOUT_DEFAULT : LAYOUT_VERTICAL);
setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
this.item = item;
......@@ -128,37 +128,47 @@ public class RightsMetadataEditController extends FormBasicController {
authorCont.put("manage.owners", managerOwners);
if (licenseModule.isEnabled(licenseHandler)) {
license = licenseService.loadOrCreateLicense(item);
LicenseSelectionConfig licenseSelectionConfig = LicenseUIFactory
.createLicenseSelectionConfig(licenseHandler, license.getLicenseType());
licenseEl = uifactory.addDropdownSingleselect("rights.license", formLayout,
licenseSelectionConfig.getLicenseTypeKeys(),
licenseSelectionConfig.getLicenseTypeValues(getLocale()));
licenseEl.setElementCssClass("o_sel_repo_license");
licenseEl.setMandatory(licenseSelectionConfig.isLicenseMandatory());
if (licenseSelectionConfig.getSelectionLicenseTypeKey() != null) {
licenseEl.select(licenseSelectionConfig.getSelectionLicenseTypeKey(), true);
}
licenseEl.addActionListener(FormEvent.ONCHANGE);
license = loadLicense();
licensorEl = uifactory.addTextElement("rights.licensor", 1000, license.getLicensor(), formLayout);
String freetext = licenseService.isFreetext(license.getLicenseType()) ? license.getFreetext() : "";
licenseFreetextEl = uifactory.addTextAreaElement("rights.freetext", 4, 72, freetext, formLayout);
LicenseUIFactory.updateVisibility(licenseEl, licensorEl, licenseFreetextEl);
licenseTextEl = uifactory.addStaticTextElement("rights.licenseText", "", "", formLayout);
updateLicenseText();
buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
buttonsCont.setRootForm(mainForm);
formLayout.add(buttonsCont);
okButton = uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
if(license != null) {
LicenseSelectionConfig licenseSelectionConfig = LicenseUIFactory
.createLicenseSelectionConfig(licenseHandler, license.getLicenseType());
licenseEl = uifactory.addDropdownSingleselect("rights.license", formLayout,
licenseSelectionConfig.getLicenseTypeKeys(),
licenseSelectionConfig.getLicenseTypeValues(getLocale()));
licenseEl.setElementCssClass("o_sel_repo_license");
licenseEl.setMandatory(licenseSelectionConfig.isLicenseMandatory());
if (licenseSelectionConfig.getSelectionLicenseTypeKey() != null) {
licenseEl.select(licenseSelectionConfig.getSelectionLicenseTypeKey(), true);
}
licenseEl.addActionListener(FormEvent.ONCHANGE);
licensorEl = uifactory.addTextElement("rights.licensor", 1000, license.getLicensor(), formLayout);
String freetext = licenseService.isFreetext(license.getLicenseType()) ? license.getFreetext() : "";
licenseFreetextEl = uifactory.addTextAreaElement("rights.freetext", 4, 72, freetext, formLayout);
LicenseUIFactory.updateVisibility(licenseEl, licensorEl, licenseFreetextEl);
licenseTextEl = uifactory.addStaticTextElement("rights.licenseText", "", "", formLayout);
updateLicenseText();
buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
buttonsCont.setRootForm(mainForm);
formLayout.add(buttonsCont);
uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
okButton = uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
}
}
}
private ResourceLicense loadLicense() {
ResourceLicense resourceLicense = null;
if(item.getResourceableId() != null) {
resourceLicense = licenseService.loadOrCreateLicense(item);
}
return resourceLicense;
}
private void updateLicenseText() {
if (licenseTextEl != null && licenseEl != null && licenseEl.isOneSelected()) {
String selectedKey = licenseEl.getSelectedKey();
......@@ -217,13 +227,15 @@ public class RightsMetadataEditController extends FormBasicController {
}
private void reloadAuthors() {
List<Identity> authors = qpoolService.getAuthors(item);
List<String> authorLinks = new ArrayList<>(authors.size());
for(Identity author:authors) {
String name = userManager.getUserDisplayName(author);
authorLinks.add(name);
if(item.getKey() != null) {
List<Identity> authors = qpoolService.getAuthors(item);
List<String> authorLinks = new ArrayList<>(authors.size());
for(Identity author:authors) {
String name = userManager.getUserDisplayName(author);
authorLinks.add(name);
}
authorCont.contextPut("authors", authorLinks);
}
authorCont.contextPut("authors", authorLinks);
}
@Override
......@@ -245,8 +257,6 @@ public class RightsMetadataEditController extends FormBasicController {
qpoolService.removeAuthors(list, Collections.<QuestionItemShort>singletonList(item));
}
reloadAuthors();
//cmc.deactivate();
//cleanUp();
} else if(source == cmc) {
fireEvent(ureq, new QItemEdited(item));
cleanUp();
......@@ -288,7 +298,7 @@ public class RightsMetadataEditController extends FormBasicController {
@Override
protected boolean validateFormLogic(UserRequest ureq) {
boolean allOk = true;
boolean allOk = super.validateFormLogic(ureq);
if (licenseEl != null) {
licenseEl.clearError();
......@@ -298,7 +308,7 @@ public class RightsMetadataEditController extends FormBasicController {
}
}
return allOk &= super.validateFormLogic(ureq);
return allOk;
}
@Override
......
......@@ -31,6 +31,7 @@ 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.util.Formatter;
import org.olat.core.util.StringHelper;
import org.olat.core.util.Util;
import org.olat.modules.qpool.MetadataSecurityCallback;
import org.olat.modules.qpool.QPoolService;
......@@ -55,7 +56,7 @@ public class TechnicalMetadataEditController extends FormBasicController {
private StaticTextElement formatEl;
private StaticTextElement editorVersionEl;
private StaticTextElement lastModifiedEl;
private StaticTextElement statusLastMdifiedEl;
private StaticTextElement statusLastModifiedEl;
private TextElement versionEl;
private FormLayoutContainer buttonsCont;
......@@ -65,8 +66,8 @@ public class TechnicalMetadataEditController extends FormBasicController {
private QPoolService qpoolService;
public TechnicalMetadataEditController(UserRequest ureq, WindowControl wControl, QuestionItem item,
MetadataSecurityCallback securityCallback) {
super(ureq, wControl, LAYOUT_VERTICAL);
MetadataSecurityCallback securityCallback, boolean wideLayout) {
super(ureq, wControl, wideLayout ? LAYOUT_DEFAULT : LAYOUT_VERTICAL);
setTranslator(Util.createPackageTranslator(QuestionsController.class, getLocale(), getTranslator()));
this.item = item;
......@@ -89,19 +90,21 @@ public class TechnicalMetadataEditController extends FormBasicController {
Formatter formatter = Formatter.getInstance(getLocale());
String creationDate = formatter.formatDateAndTime(item.getCreationDate());
uifactory.addStaticTextElement("technical.creation", creationDate, formLayout);
if(StringHelper.containsNonWhitespace(creationDate)) {
uifactory.addStaticTextElement("technical.creation", creationDate, formLayout);
}
lastModifiedEl = uifactory.addStaticTextElement("technical.lastModified", "", formLayout);
versionEl = uifactory.addTextElement("lifecycle.version", "lifecycle.version", 50, "", formLayout);
statusLastMdifiedEl = uifactory.addStaticTextElement("technical.statusLastModified", "", formLayout);
statusLastModifiedEl = uifactory.addStaticTextElement("technical.statusLastModified", "", formLayout);
buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
buttonsCont.setRootForm(mainForm);
formLayout.add(buttonsCont);
uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl());
uifactory.addFormSubmitButton("ok", "ok", buttonsCont);
}
private void setReadOnly(MetadataSecurityCallback securityCallback) {
......@@ -124,12 +127,14 @@ public class TechnicalMetadataEditController extends FormBasicController {
String lastModified = formatter.formatDateAndTime(item.getLastModified());
lastModifiedEl.setValue(lastModified);
lastModifiedEl.setVisible(StringHelper.containsNonWhitespace(lastModified));
versionEl.setValue(item.getItemVersion());
String statusLastModified = formatter.formatDateAndTime(item.getQuestionStatusLastModified());
statusLastModified = statusLastModified != null? statusLastModified: "";
statusLastMdifiedEl.setValue(statusLastModified);
statusLastModified = statusLastModified != null ? statusLastModified: "";
statusLastModifiedEl.setValue(statusLastModified);
statusLastModifiedEl.setVisible(StringHelper.containsNonWhitespace(statusLastModified));
}
public void setItem(QuestionItem item, MetadataSecurityCallback securityCallback) {
......
......@@ -2,11 +2,11 @@
<div class="panel panel-default o_sel_qpool_metadata_general">
<div class="panel-heading">
<h4 class="panel-title">
<i id="collapseGeneralToggler" class="o_icon o_icon-fw #if($inGeneral) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<i id="collapseGeneralToggler" class="o_icon o_icon-fw #if($ingeneral) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<a data-toggle="collapse" data-parent="#accordion" href="#general">$r.translate("general")</a>
</h4>
</div>
<div id="general" class="panel-collapse collapse $!inGeneral">
<div id="general" class="panel-collapse collapse $!ingeneral">
<div class="panel-body">
$r.render("details_general")
</div>
......@@ -24,11 +24,11 @@
<div class="panel panel-default o_sel_qpool_metadata_item_analyse">
<div class="panel-heading">
<h4 class="panel-title">
<i id="collapseQuestionToggler" class="o_icon o_icon-fw #if($inQuestion) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<i id="collapseQuestionToggler" class="o_icon o_icon-fw #if($inquestion) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<a data-toggle="collapse" data-parent="#accordion" href="#question">$r.translate("question")</a>
</h4>
</div>
<div id="question" class="panel-collapse collapse $!inQuestion">
<div id="question" class="panel-collapse collapse $!inquestion">
<div class="panel-body">
$r.render("details_question")
</div>
......@@ -43,42 +43,42 @@
})
</script>
</div>
#if($r.available("details_rights"))
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<i id="collapseRightsToggler" class="o_icon o_icon-fw #if($inRights) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<i id="collapseRightsToggler" class="o_icon o_icon-fw #if($inrights) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<a data-toggle="collapse" data-parent="#accordion" href="#rights">
$r.translate("rights")
</a>
</h4>
</div>
<div id="rights" class="panel-collapse collapse $!inRights">
<div id="rights" class="panel-collapse collapse $!inrights">
<div class="panel-body">
$r.render("details_rights")
</div>
</div>
<script>
/* <![CDATA[ */
jQuery('#rights').on('hide.bs.collapse', function () {
jQuery('#collapseRightsToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
})
jQuery('#rights').on('show.bs.collapse', function () {
jQuery('#collapseRightsToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
$r.backgroundCommand("show","panel","rights")
})
/* ]]> */
jQuery('#rights').on('hide.bs.collapse', function () {
jQuery('#collapseRightsToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
})
jQuery('#rights').on('show.bs.collapse', function () {
jQuery('#collapseRightsToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
$r.backgroundCommand("show","panel","rights")
})
</script>
</div>
#end
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<i id="collapseTechnicalToggler" class="o_icon o_icon-fw #if($inTechnical) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<i id="collapseTechnicalToggler" class="o_icon o_icon-fw #if($intechnical) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<a data-toggle="collapse" data-parent="#accordion" href="#technical">
$r.translate("technical")
</a>
</h4>
</div>
<div id="technical" class="panel-collapse collapse $!inTechnical">
<div id="technical" class="panel-collapse collapse $!intechnical">
<div class="panel-body">
$r.render("details_technical")
</div>
......@@ -99,27 +99,25 @@
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<i id="collapsRatingsToggler" class="o_icon o_icon-fw #if($inRatings) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<i id="collapsRatingsToggler" class="o_icon o_icon-fw #if($inratings) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<a data-toggle="collapse" data-parent="#accordion" href="#ratings">
$r.translate("menu.ratings")
</a>
</h4>
</div>
<div id="ratings" class="panel-collapse collapse $!inRatings">
<div id="ratings" class="panel-collapse collapse $!inratings">
<div class="panel-body">
$r.render("details_ratings")
</div>
</div>
<script>
/* <![CDATA[ */
jQuery('#ratings').on('hide.bs.collapse', function () {
jQuery('#collapsRatingsToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
})
jQuery('#ratings').on('show.bs.collapse', function () {
jQuery('#collapsRatingsToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
$r.backgroundCommand("show","panel","ratings")
})
/* ]]> */
jQuery('#ratings').on('hide.bs.collapse', function () {
jQuery('#collapsRatingsToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
})
jQuery('#ratings').on('show.bs.collapse', function () {
jQuery('#collapsRatingsToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
$r.backgroundCommand("show","panel","ratings")
})
</script>
</div>
#end
......@@ -127,27 +125,25 @@
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<i id="collapsePoolsToggler" class="o_icon o_icon-fw #if($inPools) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<i id="collapsePoolsToggler" class="o_icon o_icon-fw #if($inpools) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<a data-toggle="collapse" data-parent="#accordion" href="#pools">
$r.translate("menu.pools")
</a>
</h4>
</div>
<div id="pools" class="panel-collapse collapse $!inPools">
<div id="pools" class="panel-collapse collapse $!inpools">
<div class="panel-body">
$r.render("details_pools")
</div>
</div>
<script>
/* <![CDATA[ */
jQuery('#pools').on('hide.bs.collapse', function () {
jQuery('#collapsePoolsToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
})
jQuery('#pools').on('show.bs.collapse', function () {
jQuery('#collapsePoolsToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
$r.backgroundCommand("show","panel","pools")
})
/* ]]> */
jQuery('#pools').on('hide.bs.collapse', function () {
jQuery('#collapsePoolsToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
})
jQuery('#pools').on('show.bs.collapse', function () {
jQuery('#collapsePoolsToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
$r.backgroundCommand("show","panel","pools")
})
</script>
</div>
#end
......@@ -155,27 +151,25 @@
<div class="panel panel-default">
<div class="panel-heading">
<h4 class="panel-title">
<i id="collapseSharesToggler" class="o_icon o_icon-fw #if($inShares) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<i id="collapseSharesToggler" class="o_icon o_icon-fw #if($inshares) o_icon_close_togglebox #else o_icon_open_togglebox #end"> </i>
<a data-toggle="collapse" data-parent="#accordion" href="#shares">
$r.translate("sharing.shares")
</a>
</h4>
</div>
<div id="shares" class="panel-collapse collapse $!inShares">
<div id="shares" class="panel-collapse collapse $!inshares">
<div class="panel-body">
$r.render("details_shares")
</div>
</div>
<script>
/* <![CDATA[ */
jQuery('#shares').on('hide.bs.collapse', function () {
jQuery('#collapseSharesToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
})
jQuery('#shares').on('show.bs.collapse', function () {
jQuery('#collapseSharesToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
$r.backgroundCommand("show","panel","shares")
})
/* ]]> */
jQuery('#shares').on('hide.bs.collapse', function () {
jQuery('#collapseSharesToggler').removeClass('o_icon_close_togglebox').addClass('o_icon_open_togglebox');
})
jQuery('#shares').on('show.bs.collapse', function () {
jQuery('#collapseSharesToggler').removeClass('o_icon_open_togglebox').addClass('o_icon_close_togglebox');
$r.backgroundCommand("show","panel","shares")
})
</script>
</div>
#end
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment