- Die Attribute der Assoziation zwischen Series und Editor sind jetzt editerbar
- JSP für CCM-driven Homepages V1 git-svn-id: https://svn.libreccm.org/ccm/trunk@759 8810af33-2d31-482b-a856-94f89814c4dfmaster
parent
2dc9b2c093
commit
bcb52e77d4
|
|
@ -118,7 +118,7 @@ public class PublicationAuthorAddForm
|
||||||
if (author == null) {
|
if (author == null) {
|
||||||
s_log.warn("No author selected.");
|
s_log.warn("No author selected.");
|
||||||
|
|
||||||
m_itemSearch.setVisible(state, true);
|
// m_itemSearch.setVisible(state, true);
|
||||||
selectedAuthorLabel.setVisible(state, false);
|
selectedAuthorLabel.setVisible(state, false);
|
||||||
} else {
|
} else {
|
||||||
s_log.warn(String.format("Author is here: %s", author.getFullName()));
|
s_log.warn(String.format("Author is here: %s", author.getFullName()));
|
||||||
|
|
|
||||||
|
|
@ -52,10 +52,14 @@ public class SeriesEditshipAddForm extends BasicItemForm {
|
||||||
private SaveCancelSection m_saveCancelSection;
|
private SaveCancelSection m_saveCancelSection;
|
||||||
private final String ITEM_SEARCH = "editors";
|
private final String ITEM_SEARCH = "editors";
|
||||||
private ItemSelectionModel m_itemModel;
|
private ItemSelectionModel m_itemModel;
|
||||||
|
private SeriesEditshipStep editStep;
|
||||||
|
private Label selectedEditorLabel;
|
||||||
|
|
||||||
public SeriesEditshipAddForm(ItemSelectionModel itemModel) {
|
public SeriesEditshipAddForm(ItemSelectionModel itemModel,
|
||||||
|
SeriesEditshipStep editStep) {
|
||||||
super("EditorsEntryForm", itemModel);
|
super("EditorsEntryForm", itemModel);
|
||||||
m_itemModel = itemModel;
|
m_itemModel = itemModel;
|
||||||
|
this.editStep = editStep;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -68,6 +72,9 @@ public class SeriesEditshipAddForm extends BasicItemForm {
|
||||||
getName()));
|
getName()));
|
||||||
add(m_itemSearch);
|
add(m_itemSearch);
|
||||||
|
|
||||||
|
selectedEditorLabel = new Label("");
|
||||||
|
add(selectedEditorLabel);
|
||||||
|
|
||||||
add(new Label((String) PublicationGlobalizationUtil.globalize(
|
add(new Label((String) PublicationGlobalizationUtil.globalize(
|
||||||
"publications.ui.series.editship.from").localize()));
|
"publications.ui.series.editship.from").localize()));
|
||||||
ParameterModel fromParam = new DateParameter(EditshipCollection.FROM);
|
ParameterModel fromParam = new DateParameter(EditshipCollection.FROM);
|
||||||
|
|
@ -91,6 +98,26 @@ public class SeriesEditshipAddForm extends BasicItemForm {
|
||||||
FormData data = fse.getFormData();
|
FormData data = fse.getFormData();
|
||||||
PageState state = fse.getPageState();
|
PageState state = fse.getPageState();
|
||||||
|
|
||||||
|
GenericPerson editor;
|
||||||
|
Date from;
|
||||||
|
Date to;
|
||||||
|
|
||||||
|
editor = editStep.getSelectedEditor();
|
||||||
|
from = editStep.getSelectedEditorDateFrom();
|
||||||
|
to = editStep.getSelectedEditorDateTo();
|
||||||
|
|
||||||
|
if (editor == null) {
|
||||||
|
selectedEditorLabel.setVisible(state, false);
|
||||||
|
} else {
|
||||||
|
data.put(ITEM_SEARCH, editor);
|
||||||
|
data.put(EditshipCollection.FROM, from);
|
||||||
|
data.put(EditshipCollection.TO, to);
|
||||||
|
|
||||||
|
m_itemSearch.setVisible(state, false);
|
||||||
|
selectedEditorLabel.setLabel(editor.getFullName(), state);
|
||||||
|
selectedEditorLabel.setVisible(state, true);
|
||||||
|
}
|
||||||
|
|
||||||
setVisible(state, true);
|
setVisible(state, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -103,9 +130,31 @@ public class SeriesEditshipAddForm extends BasicItemForm {
|
||||||
|
|
||||||
if (!(this.getSaveCancelSection().
|
if (!(this.getSaveCancelSection().
|
||||||
getCancelButton().isSelected(state))) {
|
getCancelButton().isSelected(state))) {
|
||||||
|
GenericPerson editor;
|
||||||
|
editor = ((SeriesEditshipStep) editStep).getSelectedEditor();
|
||||||
|
|
||||||
|
if (editor == null) {
|
||||||
series.addEditor((GenericPerson) data.get(ITEM_SEARCH),
|
series.addEditor((GenericPerson) data.get(ITEM_SEARCH),
|
||||||
(Date) data.get(EditshipCollection.FROM),
|
(Date) data.get(EditshipCollection.FROM),
|
||||||
(Date) data.get(EditshipCollection.TO));
|
(Date) data.get(EditshipCollection.TO));
|
||||||
|
} else {
|
||||||
|
EditshipCollection editors;
|
||||||
|
|
||||||
|
editors = series.getEditors();
|
||||||
|
|
||||||
|
while (editors.next()) {
|
||||||
|
if (editors.getEditor().equals(editor)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
editors.setFrom((Date) data.get(EditshipCollection.FROM));
|
||||||
|
editors.setTo((Date) data.get(EditshipCollection.TO));
|
||||||
|
|
||||||
|
editStep.setSelectedEditor(null);
|
||||||
|
editStep.setSelectedEditorDateFrom(null);
|
||||||
|
editStep.setSelectedEditorDateTo(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
init(fse);
|
init(fse);
|
||||||
|
|
|
||||||
|
|
@ -19,11 +19,13 @@
|
||||||
*/
|
*/
|
||||||
package com.arsdigita.cms.contenttypes.ui;
|
package com.arsdigita.cms.contenttypes.ui;
|
||||||
|
|
||||||
|
import com.arsdigita.cms.contenttypes.GenericPerson;
|
||||||
import com.arsdigita.cms.ItemSelectionModel;
|
import com.arsdigita.cms.ItemSelectionModel;
|
||||||
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
|
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
|
||||||
import com.arsdigita.cms.ui.authoring.BasicItemForm;
|
import com.arsdigita.cms.ui.authoring.BasicItemForm;
|
||||||
import com.arsdigita.cms.ui.authoring.SimpleEditStep;
|
import com.arsdigita.cms.ui.authoring.SimpleEditStep;
|
||||||
import com.arsdigita.cms.ui.authoring.WorkflowLockedComponentAccess;
|
import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
@ -31,7 +33,10 @@ import com.arsdigita.cms.ui.authoring.WorkflowLockedComponentAccess;
|
||||||
*/
|
*/
|
||||||
public class SeriesEditshipStep extends SimpleEditStep {
|
public class SeriesEditshipStep extends SimpleEditStep {
|
||||||
|
|
||||||
private static final String ADD_EDITOR_SHEET_NAME = "addEditor";
|
public static final String ADD_EDITOR_SHEET_NAME = "addEditor";
|
||||||
|
private GenericPerson selectedEditor;
|
||||||
|
private Date selectedEditorDateFrom;
|
||||||
|
private Date selectedEditorDateTo;
|
||||||
|
|
||||||
public SeriesEditshipStep(
|
public SeriesEditshipStep(
|
||||||
ItemSelectionModel itemModel, AuthoringKitWizard parent) {
|
ItemSelectionModel itemModel, AuthoringKitWizard parent) {
|
||||||
|
|
@ -44,14 +49,40 @@ public class SeriesEditshipStep extends SimpleEditStep {
|
||||||
String prefix) {
|
String prefix) {
|
||||||
super(itemModel, parent, prefix);
|
super(itemModel, parent, prefix);
|
||||||
|
|
||||||
BasicItemForm addEditorSheet = new SeriesEditshipAddForm(itemModel);
|
BasicItemForm addEditorSheet = new SeriesEditshipAddForm(itemModel,
|
||||||
|
this);
|
||||||
add(ADD_EDITOR_SHEET_NAME,
|
add(ADD_EDITOR_SHEET_NAME,
|
||||||
(String) PublicationGlobalizationUtil.globalize(
|
(String) PublicationGlobalizationUtil.globalize(
|
||||||
"publications.ui.series.add_editship").localize(),
|
"publications.ui.series.add_editship").localize(),
|
||||||
new WorkflowLockedComponentAccess(addEditorSheet, itemModel),
|
new WorkflowLockedComponentAccess(addEditorSheet, itemModel),
|
||||||
addEditorSheet.getSaveCancelSection().getCancelButton());
|
addEditorSheet.getSaveCancelSection().getCancelButton());
|
||||||
|
|
||||||
SeriesEditshipTable editorsTable = new SeriesEditshipTable(itemModel);
|
SeriesEditshipTable editorsTable = new SeriesEditshipTable(itemModel,
|
||||||
|
this);
|
||||||
setDisplayComponent(editorsTable);
|
setDisplayComponent(editorsTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public GenericPerson getSelectedEditor() {
|
||||||
|
return selectedEditor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelectedEditor(GenericPerson selectedEditor) {
|
||||||
|
this.selectedEditor = selectedEditor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getSelectedEditorDateFrom() {
|
||||||
|
return selectedEditorDateFrom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelectedEditorDateFrom(Date selectedEditorDateFrom) {
|
||||||
|
this.selectedEditorDateFrom = selectedEditorDateFrom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getSelectedEditorDateTo() {
|
||||||
|
return selectedEditorDateTo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSelectedEditorDateTo(Date selectedEditorDateTo) {
|
||||||
|
this.selectedEditorDateTo = selectedEditorDateTo;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,8 +35,10 @@ import com.arsdigita.cms.ItemSelectionModel;
|
||||||
import com.arsdigita.cms.SecurityManager;
|
import com.arsdigita.cms.SecurityManager;
|
||||||
import com.arsdigita.cms.contenttypes.EditshipCollection;
|
import com.arsdigita.cms.contenttypes.EditshipCollection;
|
||||||
import com.arsdigita.cms.contenttypes.GenericPerson;
|
import com.arsdigita.cms.contenttypes.GenericPerson;
|
||||||
|
import com.arsdigita.cms.contenttypes.Publication;
|
||||||
import com.arsdigita.cms.contenttypes.Series;
|
import com.arsdigita.cms.contenttypes.Series;
|
||||||
import com.arsdigita.cms.dispatcher.Utilities;
|
import com.arsdigita.cms.dispatcher.Utilities;
|
||||||
|
import com.arsdigita.cms.ui.authoring.SimpleEditStep;
|
||||||
import com.arsdigita.util.LockableImpl;
|
import com.arsdigita.util.LockableImpl;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
|
|
@ -50,14 +52,18 @@ public class SeriesEditshipTable extends Table implements TableActionListener {
|
||||||
private static final Logger s_log =
|
private static final Logger s_log =
|
||||||
Logger.getLogger(SeriesEditshipTable.class);
|
Logger.getLogger(SeriesEditshipTable.class);
|
||||||
private final String TABLE_COL_EDIT = "table_col_edit";
|
private final String TABLE_COL_EDIT = "table_col_edit";
|
||||||
|
private final String TABLE_COL_EDIT_EDITSHIP = "table_col_edit_editship";
|
||||||
private final String TABLE_COL_DEL = "table_col_del";
|
private final String TABLE_COL_DEL = "table_col_del";
|
||||||
//private final String TABLE_COL_UP = "table_col_up";
|
//private final String TABLE_COL_UP = "table_col_up";
|
||||||
//private final String TABLE_COL_DOWN = "table_col_down";
|
//private final String TABLE_COL_DOWN = "table_col_down";
|
||||||
private ItemSelectionModel m_itemModel;
|
private ItemSelectionModel m_itemModel;
|
||||||
|
private SimpleEditStep editStep;
|
||||||
|
|
||||||
public SeriesEditshipTable(ItemSelectionModel itemModel) {
|
public SeriesEditshipTable(ItemSelectionModel itemModel,
|
||||||
|
SimpleEditStep editStep) {
|
||||||
super();
|
super();
|
||||||
m_itemModel = itemModel;
|
m_itemModel = itemModel;
|
||||||
|
this.editStep = editStep;
|
||||||
|
|
||||||
setEmptyView(
|
setEmptyView(
|
||||||
new Label(PublicationGlobalizationUtil.globalize(
|
new Label(PublicationGlobalizationUtil.globalize(
|
||||||
|
|
@ -80,16 +86,21 @@ public class SeriesEditshipTable extends Table implements TableActionListener {
|
||||||
colModel.add(new TableColumn(
|
colModel.add(new TableColumn(
|
||||||
3,
|
3,
|
||||||
PublicationGlobalizationUtil.globalize(
|
PublicationGlobalizationUtil.globalize(
|
||||||
|
"publications.ui.series.editship.edit").localize(),
|
||||||
|
TABLE_COL_EDIT_EDITSHIP));
|
||||||
|
colModel.add(new TableColumn(
|
||||||
|
4,
|
||||||
|
PublicationGlobalizationUtil.globalize(
|
||||||
"publications.ui.series.editship.remove").localize(),
|
"publications.ui.series.editship.remove").localize(),
|
||||||
TABLE_COL_DEL));
|
TABLE_COL_DEL));
|
||||||
/* Just in the case someone want's to sort editships manually..." */
|
/* Just in the case someone want's to sort editships manually..." */
|
||||||
/* colModel.add(new TableColumn(
|
/* colModel.add(new TableColumn(
|
||||||
4,
|
5,
|
||||||
PublicationGlobalizationUtil.globalize(
|
PublicationGlobalizationUtil.globalize(
|
||||||
"publications.ui.series.editship.up").localize(),
|
"publications.ui.series.editship.up").localize(),
|
||||||
TABLE_COL_UP));
|
TABLE_COL_UP));
|
||||||
colModel.add(new TableColumn(
|
colModel.add(new TableColumn(
|
||||||
5,
|
6,
|
||||||
PublicationGlobalizationUtil.globalize(
|
PublicationGlobalizationUtil.globalize(
|
||||||
"publications.ui.series.editship.down").localize(),
|
"publications.ui.series.editship.down").localize(),
|
||||||
TABLE_COL_DOWN));*/
|
TABLE_COL_DOWN));*/
|
||||||
|
|
@ -97,9 +108,10 @@ public class SeriesEditshipTable extends Table implements TableActionListener {
|
||||||
setModelBuilder(new SeriesEditshipTableModelBuilder(itemModel));
|
setModelBuilder(new SeriesEditshipTableModelBuilder(itemModel));
|
||||||
|
|
||||||
colModel.get(0).setCellRenderer(new EditCellRenderer());
|
colModel.get(0).setCellRenderer(new EditCellRenderer());
|
||||||
colModel.get(3).setCellRenderer(new DeleteCellRenderer());
|
colModel.get(3).setCellRenderer(new EditEditshipCellRenderer());
|
||||||
//colModel.get(4).setCellRenderer(new UpCellRenderer());
|
colModel.get(4).setCellRenderer(new DeleteCellRenderer());
|
||||||
//colModel.get(5).setCellRenderer(new DownCellRenderer());
|
//colModel.get(5).setCellRenderer(new UpCellRenderer());
|
||||||
|
//colModel.get(6).setCellRenderer(new DownCellRenderer());
|
||||||
}
|
}
|
||||||
|
|
||||||
private class SeriesEditshipTableModelBuilder
|
private class SeriesEditshipTableModelBuilder
|
||||||
|
|
@ -165,6 +177,9 @@ public class SeriesEditshipTable extends Table implements TableActionListener {
|
||||||
case 2:
|
case 2:
|
||||||
return m_editshipCollection.getTo();
|
return m_editshipCollection.getTo();
|
||||||
case 3:
|
case 3:
|
||||||
|
return PublicationGlobalizationUtil.globalize(
|
||||||
|
"publications.ui.series.editship.edit").localize();
|
||||||
|
case 4:
|
||||||
return PublicationGlobalizationUtil.globalize(
|
return PublicationGlobalizationUtil.globalize(
|
||||||
"publications.ui.series.editship.remove").
|
"publications.ui.series.editship.remove").
|
||||||
localize();
|
localize();
|
||||||
|
|
@ -210,6 +225,38 @@ public class SeriesEditshipTable extends Table implements TableActionListener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class EditEditshipCellRenderer
|
||||||
|
extends LockableImpl
|
||||||
|
implements TableCellRenderer {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Component getComponent(Table table,
|
||||||
|
PageState state,
|
||||||
|
Object value,
|
||||||
|
boolean isSelected,
|
||||||
|
Object key,
|
||||||
|
int row,
|
||||||
|
int col) {
|
||||||
|
SecurityManager securityManager =
|
||||||
|
Utilities.getSecurityManager(state);
|
||||||
|
Publication publication = (Publication) m_itemModel.
|
||||||
|
getSelectedObject(state);
|
||||||
|
|
||||||
|
boolean canEdit = securityManager.canAccess(
|
||||||
|
state.getRequest(),
|
||||||
|
SecurityManager.EDIT_ITEM,
|
||||||
|
publication);
|
||||||
|
|
||||||
|
if (canEdit) {
|
||||||
|
ControlLink link = new ControlLink(value.toString());
|
||||||
|
return link;
|
||||||
|
} else {
|
||||||
|
Label label = new Label(value.toString());
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class DeleteCellRenderer
|
private class DeleteCellRenderer
|
||||||
extends LockableImpl
|
extends LockableImpl
|
||||||
implements TableCellRenderer {
|
implements TableCellRenderer {
|
||||||
|
|
@ -312,11 +359,23 @@ public class SeriesEditshipTable extends Table implements TableActionListener {
|
||||||
|
|
||||||
Series series = (Series) m_itemModel.getSelectedObject(state);
|
Series series = (Series) m_itemModel.getSelectedObject(state);
|
||||||
|
|
||||||
//EditshipCollection editors = series.getEditors();
|
EditshipCollection editors = series.getEditors();
|
||||||
|
|
||||||
TableColumn column = getColumnModel().get(event.getColumn().intValue());
|
TableColumn column = getColumnModel().get(event.getColumn().intValue());
|
||||||
|
|
||||||
if (TABLE_COL_EDIT.equals(column.getHeaderKey().toString())) {
|
if (TABLE_COL_EDIT.equals(column.getHeaderKey().toString())) {
|
||||||
|
} else if(TABLE_COL_EDIT_EDITSHIP.equals(column.getHeaderKey().toString())) {
|
||||||
|
while(editors.next()) {
|
||||||
|
if(editors.getEditor().equals(editor)) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
((SeriesEditshipStep)editStep).setSelectedEditor(editor);
|
||||||
|
((SeriesEditshipStep)editStep).setSelectedEditorDateFrom(editors.getFrom());
|
||||||
|
((SeriesEditshipStep)editStep).setSelectedEditorDateTo(editors.getTo());
|
||||||
|
|
||||||
|
editStep.showComponent(state, SeriesEditshipStep.ADD_EDITOR_SHEET_NAME);
|
||||||
} else if (TABLE_COL_DEL.equals(column.getHeaderKey().toString())) {
|
} else if (TABLE_COL_DEL.equals(column.getHeaderKey().toString())) {
|
||||||
series.removeEditor(editor);
|
series.removeEditor(editor);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,48 @@
|
||||||
|
<jsp:root
|
||||||
|
xmlns:jsp="http://java.sun.com/JSP/Page"
|
||||||
|
xmlns:define="/WEB-INF/bebop-define.tld"
|
||||||
|
xmlns:show="/WEB-INF/bebop-show.tld"
|
||||||
|
version="1.2">
|
||||||
|
|
||||||
|
<jsp:directive.page import="com.arsdigita.dispatcher.DispatcherHelper"/>
|
||||||
|
<jsp:directive.page import="com.arsdigita.bebop.parameters.BigDecimalParameter"/>
|
||||||
|
<jsp:directive.page import="com.arsdigita.london.navigation.Navigation"/>
|
||||||
|
<jsp:directive.page import="com.arsdigita.london.navigation.cms.CMSDataCollectionDefinition"/>
|
||||||
|
<jsp:directive.page import="com.arsdigita.london.navigation.cms.CMSDataCollectionRenderer"/>
|
||||||
|
|
||||||
|
<jsp:scriptlet>
|
||||||
|
long age = Navigation.getConfig().getIndexPageCacheLifetime();
|
||||||
|
if (age == 0) {
|
||||||
|
DispatcherHelper.cacheDisable(response);
|
||||||
|
} else {
|
||||||
|
DispatcherHelper.cacheForWorld(response, (int)age);
|
||||||
|
}
|
||||||
|
</jsp:scriptlet>
|
||||||
|
|
||||||
|
<define:page name="publications"
|
||||||
|
application="content"
|
||||||
|
title="Publications4Homepages"
|
||||||
|
cache="true">
|
||||||
|
|
||||||
|
<define:component name="publicationList"
|
||||||
|
classname="com.arsdigita.london.navigation.ui.object.ComplexObjectList"/>
|
||||||
|
<jsp:scriptlet>
|
||||||
|
((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).setDefinition(new CMSDataCollectionDefinition());
|
||||||
|
((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).setRenderer(new CMSDataCollectionRenderer());
|
||||||
|
((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).getDefinition().setObjectType("com.arsdigita.cms.contenttypes.Publication");
|
||||||
|
((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).getRenderer().setSpecializeObjects(true);
|
||||||
|
((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).getDefinition().setDescendCategories(true);
|
||||||
|
if((request.getParameterMap().get("DaBInId") != null) && (((String[])request.getParameterMap().get("DaBInId")).length > 0)) {
|
||||||
|
String[] params = (String[]) request.getParameterMap().get("DaBInId");
|
||||||
|
String dabinid = params[0];
|
||||||
|
((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).setSQLFilter(String.format("authors.pageDescription LIKE '%%DaBInId={%s%%'", dabinid));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
((com.arsdigita.london.navigation.ui.object.ComplexObjectList) publicationList).getRenderer().setPageSize(99999);
|
||||||
|
</jsp:scriptlet>
|
||||||
|
</define:page>
|
||||||
|
|
||||||
|
<show:all/>
|
||||||
|
|
||||||
|
</jsp:root>
|
||||||
Loading…
Reference in New Issue