mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-08-13 16:45:49 -04:00
fixed gxs wiki
git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.6-IdCleaning@7160 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
859bf22468
commit
ff6f32059b
4 changed files with 61 additions and 61 deletions
|
@ -143,8 +143,8 @@ void WikiDialog::checkUpdate()
|
|||
|
||||
void WikiDialog::OpenOrShowAddPageDialog()
|
||||
{
|
||||
std::string groupId = getSelectedGroup();
|
||||
if (groupId == "")
|
||||
RsGxsGroupId groupId = getSelectedGroup();
|
||||
if (groupId.isNull())
|
||||
{
|
||||
std::cerr << "WikiDialog::OpenOrShowAddPageDialog() No Group selected";
|
||||
std::cerr << std::endl;
|
||||
|
@ -159,7 +159,7 @@ void WikiDialog::OpenOrShowAddPageDialog()
|
|||
std::cerr << "WikiDialog::OpenOrShowAddPageDialog() GroupId: " << groupId;
|
||||
std::cerr << std::endl;
|
||||
|
||||
mEditDialog->setupData(groupId, "");
|
||||
mEditDialog->setupData(groupId, RsGxsMessageId());
|
||||
mEditDialog->setNewPage();
|
||||
|
||||
mEditDialog->show();
|
||||
|
@ -185,8 +185,8 @@ void WikiDialog::newGroup()
|
|||
|
||||
void WikiDialog::showGroupDetails()
|
||||
{
|
||||
std::string groupId = getSelectedGroup();
|
||||
if (groupId == "")
|
||||
RsGxsGroupId groupId = getSelectedGroup();
|
||||
if (groupId.isNull())
|
||||
{
|
||||
std::cerr << "WikiDialog::showGroupDetails() No Group selected";
|
||||
std::cerr << std::endl;
|
||||
|
@ -196,8 +196,8 @@ void WikiDialog::showGroupDetails()
|
|||
|
||||
void WikiDialog::editGroupDetails()
|
||||
{
|
||||
std::string groupId = getSelectedGroup();
|
||||
if (groupId == "")
|
||||
RsGxsGroupId groupId = getSelectedGroup();
|
||||
if (groupId.isNull())
|
||||
{
|
||||
std::cerr << "WikiDialog::editGroupDetails() No Group selected";
|
||||
std::cerr << std::endl;
|
||||
|
@ -215,9 +215,9 @@ void WikiDialog::editGroupDetails()
|
|||
|
||||
void WikiDialog::OpenOrShowEditDialog()
|
||||
{
|
||||
std::string groupId;
|
||||
std::string pageId;
|
||||
std::string origPageId;
|
||||
RsGxsGroupId groupId;
|
||||
RsGxsMessageId pageId;
|
||||
RsGxsMessageId origPageId;
|
||||
|
||||
if (!getSelectedPage(groupId, pageId, origPageId))
|
||||
{
|
||||
|
@ -242,9 +242,9 @@ void WikiDialog::OpenOrShowRepublishDialog()
|
|||
{
|
||||
OpenOrShowEditDialog();
|
||||
|
||||
std::string groupId;
|
||||
std::string pageId;
|
||||
std::string origPageId;
|
||||
RsGxsGroupId groupId;
|
||||
RsGxsMessageId pageId;
|
||||
RsGxsMessageId origPageId;
|
||||
|
||||
if (!getSelectedPage(groupId, pageId, origPageId))
|
||||
{
|
||||
|
@ -264,9 +264,9 @@ void WikiDialog::OpenOrShowRepublishDialog()
|
|||
void WikiDialog::groupTreeChanged()
|
||||
{
|
||||
/* */
|
||||
std::string groupId;
|
||||
std::string pageId;
|
||||
std::string origPageId;
|
||||
RsGxsGroupId groupId;
|
||||
RsGxsMessageId pageId;
|
||||
RsGxsMessageId origPageId;
|
||||
|
||||
getSelectedPage(groupId, pageId, origPageId);
|
||||
if (pageId == mPageSelected)
|
||||
|
@ -274,7 +274,7 @@ void WikiDialog::groupTreeChanged()
|
|||
return; /* nothing changed */
|
||||
}
|
||||
|
||||
if (pageId == "")
|
||||
if (pageId.isNull())
|
||||
{
|
||||
/* clear Mods */
|
||||
clearGroupTree();
|
||||
|
@ -327,7 +327,7 @@ void WikiDialog::clearGroupTree()
|
|||
#define WIKI_GROUP_COL_ORIGPAGEID 2
|
||||
|
||||
|
||||
bool WikiDialog::getSelectedPage(std::string &groupId, std::string &pageId, std::string &origPageId)
|
||||
bool WikiDialog::getSelectedPage(RsGxsGroupId &groupId, RsGxsMessageId &pageId, RsGxsMessageId &origPageId)
|
||||
{
|
||||
#ifdef WIKI_DEBUG
|
||||
std::cerr << "WikiDialog::getSelectedPage()" << std::endl;
|
||||
|
@ -347,13 +347,13 @@ bool WikiDialog::getSelectedPage(std::string &groupId, std::string &pageId, std:
|
|||
|
||||
/* check if it has changed */
|
||||
groupId = getSelectedGroup();
|
||||
if (groupId == "")
|
||||
if (groupId.isNull())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
pageId = item->text(WIKI_GROUP_COL_PAGEID).toStdString();
|
||||
origPageId = item->text(WIKI_GROUP_COL_ORIGPAGEID).toStdString();
|
||||
origPageId = RsGxsMessageId(item->text(WIKI_GROUP_COL_ORIGPAGEID).toStdString());
|
||||
|
||||
#ifdef WIKI_DEBUG
|
||||
std::cerr << "WikiDialog::getSelectedPage() PageId: " << pageId << std::endl;
|
||||
|
@ -362,7 +362,7 @@ bool WikiDialog::getSelectedPage(std::string &groupId, std::string &pageId, std:
|
|||
}
|
||||
|
||||
|
||||
std::string WikiDialog::getSelectedGroup()
|
||||
const RsGxsGroupId& WikiDialog::getSelectedGroup()
|
||||
{
|
||||
#ifdef WIKI_DEBUG
|
||||
std::cerr << "WikiDialog::getSelectedGroup(): " << mGroupId << std::endl;
|
||||
|
@ -460,8 +460,8 @@ void WikiDialog::loadPages(const uint32_t &token)
|
|||
|
||||
QTreeWidgetItem *pageItem = new QTreeWidgetItem();
|
||||
pageItem->setText(WIKI_GROUP_COL_PAGENAME, QString::fromStdString(page.mMeta.mMsgName));
|
||||
pageItem->setText(WIKI_GROUP_COL_PAGEID, QString::fromStdString(page.mMeta.mMsgId));
|
||||
pageItem->setText(WIKI_GROUP_COL_ORIGPAGEID, QString::fromStdString(page.mMeta.mOrigMsgId));
|
||||
pageItem->setText(WIKI_GROUP_COL_PAGEID, QString::fromStdString(page.mMeta.mMsgId.toStdString()));
|
||||
pageItem->setText(WIKI_GROUP_COL_ORIGPAGEID, QString::fromStdString(page.mMeta.mOrigMsgId.toStdString()));
|
||||
|
||||
ui.treeWidget_Pages->addTopLevelItem(pageItem);
|
||||
}
|
||||
|
@ -577,7 +577,7 @@ void WikiDialog::unsubscribeToGroup()
|
|||
|
||||
void WikiDialog::wikiSubscribe(bool subscribe)
|
||||
{
|
||||
if (mGroupId.empty()) {
|
||||
if (mGroupId.isNull()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -590,7 +590,7 @@ void WikiDialog::wikiGroupChanged(const QString &groupId)
|
|||
{
|
||||
mGroupId = groupId.toStdString();
|
||||
|
||||
if (mGroupId.empty()) {
|
||||
if (mGroupId.isNull()) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -598,7 +598,7 @@ void WikiDialog::wikiGroupChanged(const QString &groupId)
|
|||
groupIds.push_back(mGroupId);
|
||||
requestPages(groupIds);
|
||||
|
||||
int subscribeFlags = ui.groupTreeWidget->subscribeFlags(QString::fromStdString(mGroupId));
|
||||
int subscribeFlags = ui.groupTreeWidget->subscribeFlags(QString::fromStdString(mGroupId.toStdString()));
|
||||
ui.toolButton_NewPage->setEnabled(IS_GROUP_ADMIN(subscribeFlags));
|
||||
ui.toolButton_Republish->setEnabled(IS_GROUP_ADMIN(subscribeFlags));
|
||||
|
||||
|
@ -608,7 +608,7 @@ void WikiDialog::wikiGroupChanged(const QString &groupId)
|
|||
void WikiDialog::groupListCustomPopupMenu(QPoint /*point*/)
|
||||
{
|
||||
|
||||
int subscribeFlags = ui.groupTreeWidget->subscribeFlags(QString::fromStdString(mGroupId));
|
||||
int subscribeFlags = ui.groupTreeWidget->subscribeFlags(QString::fromStdString(mGroupId.toStdString()));
|
||||
|
||||
QMenu contextMnu(this);
|
||||
|
||||
|
@ -625,13 +625,13 @@ void WikiDialog::groupListCustomPopupMenu(QPoint /*point*/)
|
|||
std::cerr << std::endl;
|
||||
|
||||
QAction *action = contextMnu.addAction(QIcon(IMAGE_SUBSCRIBE), tr("Subscribe to Group"), this, SLOT(subscribeToGroup()));
|
||||
action->setDisabled (mGroupId.empty() || IS_GROUP_SUBSCRIBED(subscribeFlags));
|
||||
action->setDisabled (mGroupId.isNull() || IS_GROUP_SUBSCRIBED(subscribeFlags));
|
||||
|
||||
action = contextMnu.addAction(QIcon(IMAGE_UNSUBSCRIBE), tr("Unsubscribe to Group"), this, SLOT(unsubscribeToGroup()));
|
||||
action->setEnabled (!mGroupId.empty() && IS_GROUP_SUBSCRIBED(subscribeFlags));
|
||||
action->setEnabled (!mGroupId.isNull() && IS_GROUP_SUBSCRIBED(subscribeFlags));
|
||||
|
||||
action = contextMnu.addAction(QIcon(IMAGE_EDIT), tr("Edit Group"), this, SLOT(editGroupDetails()));
|
||||
action->setEnabled (!mGroupId.empty() && IS_GROUP_ADMIN(subscribeFlags));
|
||||
action->setEnabled (!mGroupId.isNull() && IS_GROUP_ADMIN(subscribeFlags));
|
||||
|
||||
/************** NOT ENABLED YET *****************/
|
||||
|
||||
|
@ -736,7 +736,7 @@ void WikiDialog::insertGroupsData(const std::list<RsGroupMetaData> &wikiList)
|
|||
void WikiDialog::GroupMetaDataToGroupItemInfo(const RsGroupMetaData &groupInfo, GroupItemInfo &groupItemInfo)
|
||||
{
|
||||
|
||||
groupItemInfo.id = QString::fromStdString(groupInfo.mGroupId);
|
||||
groupItemInfo.id = QString::fromStdString(groupInfo.mGroupId.toStdString());
|
||||
groupItemInfo.name = QString::fromUtf8(groupInfo.mGroupName.c_str());
|
||||
//groupItemInfo.description = QString::fromUtf8(groupInfo.forumDesc);
|
||||
groupItemInfo.popularity = groupInfo.mPop;
|
||||
|
|
|
@ -78,9 +78,9 @@ void clearGroupTree();
|
|||
|
||||
void updateWikiPage(const RsWikiSnapshot &page);
|
||||
|
||||
bool getSelectedPage(std::string &groupId, std::string &pageId, std::string &origPageId);
|
||||
bool getSelectedPage(RsGxsGroupId &groupId, RsGxsMessageId &pageId, RsGxsMessageId &origPageId);
|
||||
std::string getSelectedPage();
|
||||
std::string getSelectedGroup();
|
||||
const RsGxsGroupId &getSelectedGroup();
|
||||
|
||||
|
||||
// Using GroupTreeWidget.
|
||||
|
@ -106,7 +106,7 @@ void loadWikiPage(const uint32_t &token);
|
|||
WikiEditDialog *mEditDialog;
|
||||
|
||||
std::string mGroupSelected;
|
||||
std::string mPageSelected;
|
||||
RsGxsMessageId mPageSelected;
|
||||
std::string mModSelected;
|
||||
|
||||
|
||||
|
@ -114,7 +114,7 @@ void loadWikiPage(const uint32_t &token);
|
|||
QTreeWidgetItem *mSubscribedGroups;
|
||||
QTreeWidgetItem *mPopularGroups;
|
||||
QTreeWidgetItem *mOtherGroups;
|
||||
std::string mGroupId; // From GroupTreeWidget
|
||||
RsGxsGroupId mGroupId; // From GroupTreeWidget
|
||||
|
||||
/* UI - from Designer */
|
||||
Ui::WikiDialog ui;
|
||||
|
|
|
@ -392,7 +392,7 @@ void WikiEditDialog::setPreviousPage(RsWikiSnapshot &page)
|
|||
mWikiSnapshot = page;
|
||||
|
||||
ui.lineEdit_Page->setText(QString::fromStdString(mWikiSnapshot.mMeta.mMsgName));
|
||||
ui.lineEdit_PrevVersion->setText(QString::fromStdString(mWikiSnapshot.mMeta.mMsgId));
|
||||
ui.lineEdit_PrevVersion->setText(QString::fromStdString(mWikiSnapshot.mMeta.mMsgId.toStdString()));
|
||||
mCurrentText = QString::fromUtf8(mWikiSnapshot.mPage.c_str());
|
||||
|
||||
mIgnoreTextChange = true;
|
||||
|
@ -417,8 +417,8 @@ void WikiEditDialog::setNewPage()
|
|||
ui.groupBox_History->hide();
|
||||
ui.pushButton_History->setText(tr("Show Edit History"));
|
||||
|
||||
ui.headerFrame->setHeaderImage(QPixmap(":/images/appointment-new_64.png"));
|
||||
ui.headerFrame->setHeaderText(tr("Create New Wiki Page"));
|
||||
ui.headerFrame->setHeaderImage(QPixmap(":/images/appointment-new_64.png"));
|
||||
ui.headerFrame->setHeaderText(tr("Create New Wiki Page"));
|
||||
setWindowTitle(tr("Create New Wiki Page"));
|
||||
|
||||
/* no need for for REQUIRED ID */
|
||||
|
@ -495,7 +495,7 @@ void WikiEditDialog::submitEdit()
|
|||
|
||||
// A Child of the current message.
|
||||
bool isFirstChild = false;
|
||||
if (mWikiSnapshot.mMeta.mParentId == "")
|
||||
if (mWikiSnapshot.mMeta.mParentId.isNull())
|
||||
{
|
||||
isFirstChild = true;
|
||||
}
|
||||
|
@ -515,8 +515,8 @@ void WikiEditDialog::submitEdit()
|
|||
mWikiSnapshot.mMeta.mParentId = mWikiSnapshot.mMeta.mOrigMsgId;
|
||||
}
|
||||
|
||||
mWikiSnapshot.mMeta.mMsgId = "";
|
||||
mWikiSnapshot.mMeta.mOrigMsgId = "";
|
||||
mWikiSnapshot.mMeta.mMsgId.clear() ;
|
||||
mWikiSnapshot.mMeta.mOrigMsgId.clear() ;
|
||||
}
|
||||
|
||||
|
||||
|
@ -568,16 +568,16 @@ void WikiEditDialog::submitEdit()
|
|||
hide();
|
||||
}
|
||||
|
||||
void WikiEditDialog::setupData(const std::string &groupId, const std::string &pageId)
|
||||
void WikiEditDialog::setupData(const RsGxsGroupId &groupId, const RsGxsMessageId &pageId)
|
||||
{
|
||||
mRepublishMode = false;
|
||||
mHistoryLoaded = false;
|
||||
if (groupId != "")
|
||||
if (!groupId.isNull())
|
||||
{
|
||||
requestGroup(groupId);
|
||||
}
|
||||
|
||||
if (pageId != "")
|
||||
if (!pageId.isNull())
|
||||
{
|
||||
RsGxsGrpMsgIdPair msgId = std::make_pair(groupId, pageId);
|
||||
requestPage(msgId);
|
||||
|
@ -595,13 +595,13 @@ void WikiEditDialog::setupData(const std::string &groupId, const std::string &pa
|
|||
|
||||
/***** Request / Response for Data **********/
|
||||
|
||||
void WikiEditDialog::requestGroup(const std::string &groupId)
|
||||
void WikiEditDialog::requestGroup(const RsGxsGroupId &groupId)
|
||||
{
|
||||
std::cerr << "WikiEditDialog::requestGroup()";
|
||||
std::cerr << std::endl;
|
||||
|
||||
std::list<std::string> ids;
|
||||
ids.push_back(groupId);
|
||||
std::list<RsGxsGroupId> ids;
|
||||
ids.push_back(groupId);
|
||||
|
||||
RsTokReqOptions opts;
|
||||
opts.mReqType = GXS_REQUEST_TYPE_GROUP_DATA;
|
||||
|
@ -665,7 +665,7 @@ void WikiEditDialog::loadPage(const uint32_t &token)
|
|||
|
||||
/* request the history now */
|
||||
mThreadMsgIdPair.first = page.mMeta.mGroupId;
|
||||
if (page.mMeta.mThreadId.empty())
|
||||
if (page.mMeta.mThreadId.isNull())
|
||||
{
|
||||
mThreadMsgIdPair.second = page.mMeta.mOrigMsgId;
|
||||
}
|
||||
|
@ -727,10 +727,10 @@ void WikiEditDialog::loadBaseHistory(const uint32_t &token)
|
|||
std::cerr << std::endl;
|
||||
|
||||
GxsIdRSTreeWidgetItem *modItem = new GxsIdRSTreeWidgetItem(mThreadCompareRole);
|
||||
modItem->setData(WET_DATA_COLUMN, WET_ROLE_ORIGPAGEID, QString::fromStdString(page.mMeta.mOrigMsgId));
|
||||
modItem->setData(WET_DATA_COLUMN, WET_ROLE_PAGEID, QString::fromStdString(page.mMeta.mMsgId));
|
||||
modItem->setData(WET_DATA_COLUMN, WET_ROLE_ORIGPAGEID, QString::fromStdString(page.mMeta.mOrigMsgId.toStdString()));
|
||||
modItem->setData(WET_DATA_COLUMN, WET_ROLE_PAGEID, QString::fromStdString(page.mMeta.mMsgId.toStdString()));
|
||||
|
||||
modItem->setData(WET_DATA_COLUMN, WET_ROLE_PARENTID, QString::fromStdString(page.mMeta.mParentId));
|
||||
modItem->setData(WET_DATA_COLUMN, WET_ROLE_PARENTID, QString::fromStdString(page.mMeta.mParentId.toStdString()));
|
||||
|
||||
{
|
||||
// From Forum stuff.
|
||||
|
@ -745,7 +745,7 @@ void WikiEditDialog::loadBaseHistory(const uint32_t &token)
|
|||
modItem->setData(WET_COL_DATE, WET_ROLE_SORT, sort);
|
||||
}
|
||||
modItem->setId(page.mMeta.mAuthorId, WET_COL_AUTHORID);
|
||||
modItem->setText(WET_COL_PAGEID, QString::fromStdString(page.mMeta.mMsgId));
|
||||
modItem->setText(WET_COL_PAGEID, QString::fromStdString(page.mMeta.mMsgId.toStdString()));
|
||||
|
||||
ui.treeWidget_History->addTopLevelItem(modItem);
|
||||
}
|
||||
|
@ -805,7 +805,7 @@ void WikiEditDialog::loadEditTreeData(const uint32_t &token)
|
|||
QTreeWidgetItem *item = ui.treeWidget_History->topLevelItem(nIndex);
|
||||
|
||||
/* index by MsgId --> ONLY For Wiki Thread Head Items... SPECIAL HACK FOR HERE! */
|
||||
std::string msgId = item->data(WET_DATA_COLUMN, WET_ROLE_PAGEID).toString().toStdString();
|
||||
RsGxsMessageId msgId ( item->data(WET_DATA_COLUMN, WET_ROLE_PAGEID).toString().toStdString() );
|
||||
items[msgId] = item;
|
||||
}
|
||||
|
||||
|
@ -824,7 +824,7 @@ void WikiEditDialog::loadEditTreeData(const uint32_t &token)
|
|||
std::cerr << " ParentId: " << snapshot.mMeta.mParentId;
|
||||
std::cerr << std::endl;
|
||||
|
||||
if (snapshot.mMeta.mParentId == "")
|
||||
if (snapshot.mMeta.mParentId.isNull())
|
||||
{
|
||||
/* Ignore! */
|
||||
std::cerr << "Ignoring ThreadHead Item";
|
||||
|
@ -842,9 +842,9 @@ void WikiEditDialog::loadEditTreeData(const uint32_t &token)
|
|||
|
||||
/* create an Entry */
|
||||
GxsIdRSTreeWidgetItem *modItem = new GxsIdRSTreeWidgetItem(mThreadCompareRole);
|
||||
modItem->setData(WET_DATA_COLUMN, WET_ROLE_ORIGPAGEID, QString::fromStdString(snapshot.mMeta.mOrigMsgId));
|
||||
modItem->setData(WET_DATA_COLUMN, WET_ROLE_PAGEID, QString::fromStdString(snapshot.mMeta.mMsgId));
|
||||
modItem->setData(WET_DATA_COLUMN, WET_ROLE_PARENTID, QString::fromStdString(snapshot.mMeta.mParentId));
|
||||
modItem->setData(WET_DATA_COLUMN, WET_ROLE_ORIGPAGEID, QString::fromStdString(snapshot.mMeta.mOrigMsgId.toStdString()));
|
||||
modItem->setData(WET_DATA_COLUMN, WET_ROLE_PAGEID, QString::fromStdString(snapshot.mMeta.mMsgId.toStdString()));
|
||||
modItem->setData(WET_DATA_COLUMN, WET_ROLE_PARENTID, QString::fromStdString(snapshot.mMeta.mParentId.toStdString()));
|
||||
|
||||
{
|
||||
// From Forum stuff.
|
||||
|
@ -859,7 +859,7 @@ void WikiEditDialog::loadEditTreeData(const uint32_t &token)
|
|||
modItem->setData(WET_COL_DATE, WET_ROLE_SORT, sort);
|
||||
}
|
||||
modItem->setId(snapshot.mMeta.mAuthorId, WET_COL_AUTHORID);
|
||||
modItem->setText(WET_COL_PAGEID, QString::fromStdString(snapshot.mMeta.mMsgId));
|
||||
modItem->setText(WET_COL_PAGEID, QString::fromStdString(snapshot.mMeta.mMsgId.toStdString()));
|
||||
|
||||
/* find the parent */
|
||||
iit = items.find(snapshot.mMeta.mParentId);
|
||||
|
@ -876,7 +876,7 @@ void WikiEditDialog::loadEditTreeData(const uint32_t &token)
|
|||
|
||||
for(uit = unparented.begin(); uit != unparented.end(); uit++)
|
||||
{
|
||||
std::string parentId = (*uit)->data(WET_DATA_COLUMN, WET_ROLE_PARENTID).toString().toStdString();
|
||||
RsGxsMessageId parentId ( (*uit)->data(WET_DATA_COLUMN, WET_ROLE_PARENTID).toString().toStdString());
|
||||
|
||||
|
||||
iit = items.find(parentId);
|
||||
|
|
|
@ -41,7 +41,7 @@ public:
|
|||
|
||||
void setNewPage();
|
||||
|
||||
void setupData(const std::string &groupId, const std::string &pageId);
|
||||
void setupData(const RsGxsGroupId &groupId, const RsGxsMessageId &pageId);
|
||||
void loadRequest(const TokenQueue *queue, const TokenRequest &req);
|
||||
|
||||
void setRepublishMode(RsGxsMessageId &origMsgId);
|
||||
|
@ -75,7 +75,7 @@ void setPreviousPage(RsWikiSnapshot &page);
|
|||
|
||||
void requestPage(const RsGxsGrpMsgIdPair &msgId);
|
||||
void loadPage(const uint32_t &token);
|
||||
void requestGroup(const std::string &groupId);
|
||||
void requestGroup(const RsGxsGroupId &groupId);
|
||||
void loadGroup(const uint32_t &token);
|
||||
|
||||
void requestBaseHistory(const RsGxsGrpMsgIdPair &origMsgId);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue