Commit 3dd182c7 authored by ‘oliver.hui’'s avatar ‘oliver.hui’

x

parent 9b693ad3
Pipeline #30179 failed with stage
in 39 seconds
......@@ -53,6 +53,7 @@ win32 {
include(sysmainwindow/sysmainwindow.pri)
include(sysusermgt/sysusermgt.pri)
include(sysusermgtv1/sysusermgtv1.pri)
include(sysusermgtv2/sysusermgtv2.pri)
include(sysrolemgt/sysrolemgt.pri)
include(sysmoduleconfmgt/sysmoduleconfmgt.pri)
include(sysenumlistmgt/sysenumlistmgt.pri)
......
......@@ -4,7 +4,6 @@
#include <QToolBar>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <Qdebug>
#include <tbaseutil/tdataresponse.h>
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/ttheme.h>
......@@ -92,14 +91,12 @@ SysUser::~SysUser()
void SysUser::reload()
{
qDebug() << "***************reload";
QString uidStr = lastUid().isEmpty() ? uid() : lastUid();
setUid(uidStr, true);
}
void SysUser::copy()
{
qDebug() << "***************copy";
setLastUid(this->uid());
setUid(0, false);
QVariantMap data;
......@@ -114,7 +111,6 @@ void SysUser::copy()
void SysUser::create()
{
qDebug() << "***************create";
setLastUid(this->uid());
setUid(0, true);
QVariantMap defaultValueMap;
......@@ -127,7 +123,6 @@ void SysUser::create()
void SysUser::clearData()
{
qDebug() << "***************clearData";
mUiLoader->loadValues(QVariantMap(), true);
if (mRoleTableView != nullptr) {
mRoleTableView->loadData(QVariantList());
......@@ -136,7 +131,6 @@ void SysUser::clearData()
void SysUser::setData(const QVariantMap &iDataMap)
{
qDebug() << "***************setData";
mUiLoader->loadValues(iDataMap, false);
if (iDataMap.contains("username")) {
setTitle(ttr("User-%1").arg(iDataMap.value("username").toString()));
......@@ -145,7 +139,6 @@ void SysUser::setData(const QVariantMap &iDataMap)
QVariantMap SysUser::getData() const
{
qDebug() << "***************getData";
QVariantMap dataMap = mUiLoader->getAllValues(true).toVariant().toMap();
QStringList keys = dataMap.keys();
for (QString key: keys) {
......@@ -177,7 +170,6 @@ QVariantMap SysUser::getData() const
void SysUser::saveData()
{
qDebug() << "***************saveData";
QVariantList errLst = mUiLoader->validateAll("COMMIT", true, "ERROR");
if (!errLst.isEmpty()) {
QStringList errStrLst;
......@@ -271,7 +263,6 @@ void SysUser::showAddRoleDialog()
void SysUser::uidChangeEvent(const QString &iUidStr)
{
qDebug() << "***************uidChangeEvent";
if (iUidStr.toInt() == 0) {
setTitle(ttr("New User"));
clearData();
......
......@@ -3,7 +3,6 @@
#include <QGraphicsDropShadowEffect>
#include <QToolBar>
#include <QVBoxLayout>
#include <Qdebug>
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/tdataresponse.h>
#include <tbaseutil/tenumlist.h>
......@@ -123,7 +122,6 @@ SysUserMgt::~SysUserMgt()
void SysUserMgt::refresh(bool iResetPageBol)
{
qDebug() << "************************ is refresh";
t::loading(this);
TSqlSelectorV2 selector = getSqlSelector(iResetPageBol);
QVariant data = doThreadWork(new TopClassSqlThread(this), TOPSQLTHREAD_SELECT_ARRAYMAP, QVariant::fromValue(selector));
......@@ -163,32 +161,29 @@ void SysUserMgt::deleteItem(const QVariantList &iIdLst)
QVariantList SysUserMgt::selectedItems()
{
qDebug() << "************************ is selectedItems";
return mSelectedLst;
}
//TopClassAbs *SysUserMgt::openItem(int iUserIdInt)
//{
// qDebug() << "************************open is working";
// QString detailModuleName = "sys-user";
// if (!config("detail_module_name").toString().isEmpty()) {
// detailModuleName = config("detail_module_name").toString();
// }
// SysUser *detail = qobject_cast<SysUser *>(APP->openModule(detailModuleName));
// if (detail != nullptr) {
// detail->setConfig("product_category", this->config("product_category"));
// connect(detail, SIGNAL(dataSaved(QVariant)), this, SLOT(onDetailSaved(QVariant)));
// connect(this, SIGNAL(destroyed()), detail, SLOT(close()));
// detail->setUid(iUserIdInt);
// }
// return detail;
//}
TopClassAbs *SysUserMgt::openItem(int iUserIdInt)
{
QString detailModuleName = "sys-user";
if (!config("detail_module_name").toString().isEmpty()) {
detailModuleName = config("detail_module_name").toString();
}
SysUser *detail = qobject_cast<SysUser *>(APP->openModule(detailModuleName));
if (detail != nullptr) {
detail->setConfig("product_category", this->config("product_category"));
connect(detail, SIGNAL(dataSaved(QVariant)), this, SLOT(onDetailSaved(QVariant)));
connect(this, SIGNAL(destroyed()), detail, SLOT(close()));
detail->setUid(iUserIdInt);
}
return detail;
}
void SysUserMgt::newItem()
{
qDebug() << "************************newItem is selectedItems";
mBodySplitter->cacheSizes();
mDetailView->create();
mDetailView->refreshActionState();
......@@ -196,7 +191,6 @@ void SysUserMgt::newItem()
bool SysUserMgt::canModify()
{
qDebug() << "************************canModify is ";
return !mDetailView->isDataModified();
}
......@@ -255,7 +249,6 @@ void SysUserMgt::onPageChanged()
void SysUserMgt::onSelectionChanged()
{
qDebug() << "************************onSelectionChanged is selectedItems";
if (mTableView != nullptr) {
//因为Action的State函数中用到getSelectedList, 所以TableView选择更改时,
//将其保存至mSelectedLst中, 这样可以加快Action状态的刷新速度;
......@@ -286,7 +279,6 @@ void SysUserMgt::onDetailSaved(const QVariant &iUidStr)
void SysUserMgt::onDetailChanged()
{
qDebug() << "*******************************ondetailchanged is working";
bool isModified = mDetailView->isDataModified();
mTableView->setEnabled(!isModified);
if (isModified) {
......@@ -302,7 +294,6 @@ void SysUserMgt::onDetailChanged()
TSqlSelectorV2 SysUserMgt::getSqlSelector(bool iResetPageBol)
{
qDebug() << "************************getSqlSelector is working";
TSqlSelectorV2 selector;
if (!mTableConf->dbSql.isEmpty()) {
selector.setTable(QString("(%1) _TEMP_TABLE_").arg(mTableConf->dbSql));
......
......@@ -25,7 +25,7 @@ public slots:
void refresh(bool iResetPageBol = true);
void deleteItem(const QVariantList &iIdLst);
QVariantList selectedItems();
// TopClassAbs *openItem(int iUserIdInt);
TopClassAbs *openItem(int iUserIdInt);
void newItem();
bool canModify();
bool isPasswordValidityControl();
......
#include "sysusermgtv1.h"
#include <QDebug>
#include <QDockWidget>
#include <QGraphicsDropShadowEffect>
#include <QToolBar>
......@@ -7,21 +6,21 @@
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/tdataresponse.h>
#include <tbaseutil/tenumlist.h>
#include <tbaseutil/tresource.h>
#include <tbaseutil/ttheme.h>
#include <topcore/topclasshelper.h>
#include <tbaseutil/tresource.h>
#include <topcore/topclasssqlthread.h>
#include <topcore/topcore.h>
#include <topcore/topenummanager.h>
#include <topcore/topmessagecontroller.h>
#include <topcore/topcore.h>
#include <toputil/t.h>
#include <twidget/taccordion.h>
#include <topcore/topmessagecontroller.h>
#include <topcore/topclasshelper.h>
#include <twidget/tmessagebar.h>
#include <twidget/tmessagebox.h>
#include <twidget/tpagetool.h>
#include <twidget/tsearchentry.h>
#include <twidget/tsplitter.h>
#include <twidget/ttableview.h>
#include <twidget/taccordion.h>
#include "sysusermgtv1thread.h"
SysUserMgtV1::SysUserMgtV1(const QString &iModuleNameStr, const QVariantMap iUrlPars, QWidget *iParent)
......@@ -31,18 +30,6 @@ SysUserMgtV1::SysUserMgtV1(const QString &iModuleNameStr, const QVariantMap iUrl
this->setLicenseKey("sys_common");
this->initModule(iModuleNameStr, iUrlPars);
//产品相关 大致明白意思没有具体了解为什么这样做 与sysuser一致
QVariant prodCfg = config("product_category");
if (prodCfg.type() == QVariant::List || prodCfg.type() == QVariant::StringList) {
for (QVariant row : prodCfg.toList()) {
mProductCategoryLst.append(row.toString());
}
} else if (!prodCfg.toString().isEmpty()) {
mProductCategoryLst.append(prodCfg.toString());
}
if (mProductCategoryLst.isEmpty()) {
mProductCategoryLst.append(APP->productCategory());
}
mCenterSplitter = new TSplitter(this);
this->setCentralWidget(mCenterSplitter);
......@@ -94,12 +81,14 @@ void SysUserMgtV1::initNaviView()
naviLabel->setProperty("SS_TYPE", "SUBHEADER");
naviLayout->addWidget(naviLabel, 0);
naviLayout->addSpacing(TTHEME_DP(4));
//ui界面与按钮窗口
QFrame *naviWidget = new QFrame(this);
naviLayout->addWidget(naviWidget);
//垂直布局left包含ui解析窗口 与按钮布局
QVBoxLayout *leftLayout = new QVBoxLayout(naviWidget);
//新建ui解析窗口
mNaviView = new TUiLoader(this);
mNaviView->setSelf(this);
......@@ -107,35 +96,32 @@ void SysUserMgtV1::initNaviView()
mNaviView->setUiStr(ui("navi").toString());
leftLayout->addWidget(mNaviView);
QHBoxLayout *BtnsLayout = new QHBoxLayout();
BtnsLayout->setMargin(0);
BtnsLayout->setSpacing(10);
leftLayout->addLayout(BtnsLayout);
QHBoxLayout *btnsLayout = new QHBoxLayout();
btnsLayout->setMargin(0);
btnsLayout->setSpacing(10);
leftLayout->addLayout(btnsLayout);
//设置取消按钮
QPushButton *resetBtn = new QPushButton(this);
connect(resetBtn, SIGNAL(clicked(bool)), this, SLOT(onNaviReset()));
resetBtn->setText(ttr("Cancel"));
resetBtn->setIcon(TRES->icon("rotate-right"));
BtnsLayout->addWidget(resetBtn);
btnsLayout->addWidget(resetBtn);
//设置确定按钮
QPushButton *filterBtn = new QPushButton(this);
connect(filterBtn, SIGNAL(clicked(bool)), this, SLOT(refresh()));
filterBtn->setText(ttr("Ok"));
filterBtn->setIcon(TRES->icon("filter"));
BtnsLayout->addWidget(filterBtn);
btnsLayout->addWidget(filterBtn);
//添加弹簧均分
leftLayout->addStretch(config("navi.is_expanded", false).toBool());
//添加进入主窗体
mCenterSplitter->insertWidget(0,accordion);
mCenterSplitter->insertWidget(0, accordion);
}
void SysUserMgtV1::initTableView()
{
//布局
//新建表格窗口mbodywidget
mBodyWidget = new QWidget(this);
//表格窗口mbodywidget添加垂直布局vboxlayout
......@@ -145,7 +131,6 @@ void SysUserMgtV1::initTableView()
vboxlayout->setSpacing(10);
//新加表格视图mtableview
mTableView = new TTableView(this);
//新建表头 空白无内容
mTableConf = new TopClassTableConf;
//把view里面的键值对给到mTableConf
......@@ -155,16 +140,14 @@ void SysUserMgtV1::initTableView()
headerItem.prepend(QVariant());
//将表头添加进表格中
mTableView->setHeaderItem(headerItem);
// 给表设置键和主键
mTableView->setDataKeyList(mTableConf->dataKeys);
mTableView->setPrimaryKey(mTableConf->primaryKey);
//创建连接,当用户点击表头图标时,切换数据的正序反序排列顺序
QHeaderView *horizontaHeaderView = mTableView->horizontalHeader();
//对应功能 点击表头排序功能
connect(horizontaHeaderView, SIGNAL(sortIndicatorChanged(int,Qt::SortOrder)),
//点击表头排序功能
connect(horizontaHeaderView, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)),
this, SLOT(refresh()));
//添加 搜索按钮工具TSearchEntry
if (QToolBar *toolbar = qobject_cast<QToolBar*>(uim()->getWidget("MAIN_TOOLBAR"))) {
toolbar->setWindowTitle(ttr("ToolBar"));
......@@ -182,6 +165,7 @@ void SysUserMgtV1::initTableView()
//点击事件切换功能
connect(mTableView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
this, SLOT(onSelectionChanged()));
//添加 右键弹窗工具
if (QMenu *table_popup = qobject_cast<QMenu *>(uim()->getWidget("TABLEVIEW_POPUP"))) {
mTableView->setContextMenu(table_popup);
......@@ -202,7 +186,6 @@ void SysUserMgtV1::initTableView()
connect(mSearchEntry, SIGNAL(search(QString,QVariant)), this, SLOT(refresh()));
this->setFocusProxy(mSearchEntry);
}
//切割界面添加第三窗口mtableview
mCenterSplitter->addWidget(mBodyWidget);
}
......@@ -216,14 +199,11 @@ void SysUserMgtV1::initDetailView()
detailModuleName = "sys-userv1";
}
mDetailView = new SysUserV1(detailModuleName, config(), this);
//功能
connect(mDetailView, SIGNAL(windowModifyChanged(bool)), this, SLOT(onDetailChanged()));
connect(mDetailView, SIGNAL(dataSaved(QVariant)), this, SLOT(onDetailSaved(QVariant)));
connect(mDetailView, SIGNAL(windowModifyChanged(bool)), SLOT(onDetailChanged()));
mDetailView->resize(TTHEME_DP(config("detail.perfect_size.width", mDetailView->perfectSize().width()).toInt()), mDetailView->height());
mCenterSplitter->addWidget(mDetailView);
}
//点击事件模块
......@@ -238,7 +218,6 @@ void SysUserMgtV1::onSelectionChanged()
if (!mSelectedLst.isEmpty()) {
curIdInt = mSelectedLst.value(0).toInt();
}
if (mDetailView->uid().toInt() != curIdInt) {
//设置详情模块的上次Uid为当前选择的ID, 这样当如果详情模块处于编辑状态时点取消后显示的当前择的条目内容;
mDetailView->setLastUid(curIdInt);
......@@ -246,7 +225,6 @@ void SysUserMgtV1::onSelectionChanged()
mDetailView->setUid(curIdInt);
}
}
refreshActionState();
}
}
......@@ -255,21 +233,17 @@ void SysUserMgtV1::onSelectionChanged()
//detelet也会用到,构造函数,newitem,onselectionchangged,ondetailchangged
QVariantList SysUserMgtV1::selectedItems()
{
qDebug() << "****************************selectedItems is working";
return mSelectedLst;
}
bool SysUserMgtV1::canModify()
{
qDebug() << "****************************canModify is working";
//例如 当datamoifed处于修改 则不可切换 取相反
return !mDetailView->isDataModified();
}
//页面变化覆盖模块
void SysUserMgtV1::onDetailChanged(){
qDebug() << "***************************************ondetailchanged is working";
bool isModified = mDetailView->isDataModified();
mTableView->setEnabled(!isModified);
if (isModified) {
......@@ -310,33 +284,20 @@ TSqlSelectorV2 SysUserMgtV1::getSqlSelector(bool iResetPageBol)
}
selector.setReturnRowCount(true);
selector.setField(mTableConf->queryFields);
selector.setFieldFormat("product_category", "array");
TopClassHelper::handleSearchPageOnQuery(mSearchEntry, mPageTool, iResetPageBol, &selector);
if (mNaviView != nullptr && !uiloaderWhere().isEmpty()) {
selector.addWhere(uiloaderWhere());
}
selector.setOrder("id", Qt::DescendingOrder);
QHeaderView *headerView = mTableView->horizontalHeader();
if (headerView != nullptr) {
//sortIndicatorSectiond点击表头进行排序
QString orderField = mTableView->columnName(headerView->sortIndicatorSection());
qDebug() << "sssssssssssssssssssssssssssssssss oderfiled is"<<orderField;
if (!orderField.isEmpty() && orderField != "remark") {
TopClassHelper::handleOrderOnQuery(mTableView, mTableConf, &selector);
}
}
// 当product_category包含 * 时,显示所有
TSqlWhereCompsiteV2 whereCompsite;
if (!mProductCategoryLst.contains("*")) {
whereCompsite.append("product_category", mProductCategoryLst, "@>");
whereCompsite.append("product_category", "{*}");
whereCompsite.setLogic(TSqlWhereCompsiteV2::Logic_Or);
selector.whereRef().append(whereCompsite);
}
return selector;
}
......@@ -359,7 +320,6 @@ QString SysUserMgtV1::uiloaderWhere()
if (userData.contains("field_name")) {
key = userData.value("field_name").toString();
}
//问题
QString operatorStr = "=";
if (userData.contains("operator")) {
operatorStr = userData.value("operator").toString();
......@@ -386,7 +346,6 @@ QString SysUserMgtV1::uiloaderWhere()
void SysUserMgtV1::fillTableData(const TDataResponse &iDataRes)
{
qDebug() << "****************************fillTableData is working";
if (mPageTool != nullptr) {
mPageTool->setRowCount(iDataRes.dataCount(), true);
}
......@@ -398,7 +357,6 @@ void SysUserMgtV1::fillTableData(const TDataResponse &iDataRes)
//新建模块 同时触发内容页变化detailchanged覆盖
void SysUserMgtV1::newItem()
{
qDebug() << "****************************newitem is working";
mCenterSplitter->cacheSizes();
mDetailView->create();
mDetailView->refreshActionState();
......@@ -417,7 +375,6 @@ void SysUserMgtV1::deleteItem(const QVariantList &iIdLst)
alertError(ttr("Admin can not be deleted!"));
return;
}
QVariant data = doThreadWork(new SysUserMgtV1Thread(this), "DELETE_USER", iIdLst);
TDataResponse dataRes(data.toMap());
if (dataRes.hasError()) {
......@@ -440,7 +397,6 @@ QStringList SysUserMgtV1::selectedNames()
//保存按钮模块
void SysUserMgtV1::onDetailSaved(const QVariant &iUidStr)
{
qDebug() << "****************************ondateilsaved is working";
this->refresh(false);
mTableView->selectRow(iUidStr);
}
......@@ -453,6 +409,5 @@ void SysUserMgtV1::onNaviReset()
//翻页功能
void SysUserMgtV1::onPageChanged()
{
qDebug() << "****************************onSelectionChanged is working";
refresh(false);
}
......@@ -41,7 +41,6 @@ private:
QString uiloaderWhere();
void fillTableData(const TDataResponse &iDataRes);
private:
QStringList mProductCategoryLst;
TSplitter *mCenterSplitter = nullptr;
TUiLoader *mNaviView = nullptr;
TTableView *mTableView = nullptr;
......@@ -51,6 +50,6 @@ private:
TPageTool *mPageTool = nullptr;
QVariantList mSelectedLst;
SysUserV1 *mDetailView = nullptr;
};
#endif // SYSUSERMGTV1_H
......@@ -21,19 +21,16 @@ void SysUserMgtV1Thread::run()
void SysUserMgtV1Thread::deleteUser()
{
TDataResponse dataRes;
TSqlQueryV2 sqlQuery(T_SQLCNT_POOL->getSqlDatabase());
sqlQuery.begin();
try {
TSqlDeleterV2 sqlDeleter;
sqlDeleter.setTable("pub_contacts");
// 将传入的值的id与sys_user中的id进行比较,要相等,并且contact_id不能为空,在这种条件下,如果有contcat_id,那么select语句就将它选出来
sqlDeleter.setWhere(QString("id IN (SELECT contcat_id FROM sys_user WHERE id IN (%1) AND contcat_id IS NOT NULL)").arg(invokeParameter().toStringList().join(",")));
sqlQuery.deleteRow(sqlDeleter);
if (sqlQuery.lastError().isValid()) {
throw sqlQuery.lastError();
}
sqlDeleter.clear();
sqlDeleter.setTable("sys_user");
sqlDeleter.setWhere("id", invokeParameter());
......@@ -41,7 +38,6 @@ void SysUserMgtV1Thread::deleteUser()
if (sqlQuery.lastError().isValid()) {
throw sqlQuery.lastError();
}
sqlQuery.commit();
setInvokeResult(dataRes.toVariantMap());
return;
......
#include "sysuserv1.h"
#include <QHBoxLayout>
#include <QGraphicsDropShadowEffect>
#include <QResizeEvent>
#include <QToolBar>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QDebug>
#include <tbaseutil/tdataresponse.h>
#include <tbaseutil/tdataparse.h>
#include <tbaseutil/ttheme.h>
......@@ -25,16 +24,12 @@ SysUserV1::SysUserV1(const QString &iModuleNameStr, const QVariantMap iUrlPars,
{
this->setLicenseKey("sys_common");
this->initModule(iModuleNameStr, iUrlPars);
//初始化布局
initCenterUi();
//初始化窗口尺寸
restoreSizeState();
//初始化id
uidChangeEvent(this->uid());
//刷新当前模块Action状态;
refreshActionState();
}
......@@ -50,21 +45,18 @@ void SysUserV1::initCenterUi()
//主窗口
QWidget *centerWidget = new QWidget(this);
this->setCentralWidget(centerWidget);
//主布局:1,toolbar 2,mbodylayout
QVBoxLayout *centerLayout = new QVBoxLayout(centerWidget);
centerLayout->setMargin(0);
centerLayout->setSpacing(0);
if(QToolBar *toolbar = qobject_cast<QToolBar *>(uim()->getWidget("MAIN_TOOLBAR"))){
centerLayout->addWidget(toolbar,0);
if (QToolBar *toolbar = qobject_cast<QToolBar *>(uim()->getWidget("MAIN_TOOLBAR"))) {
centerLayout->addWidget(toolbar, 0);
}
//局部布局
mBodyLayout = new QHBoxLayout();
mBodyLayout->setMargin(TTHEME_DP(16));
mBodyLayout->setSpacing(0);
centerLayout->addLayout(mBodyLayout, 1);
//TUILoader配置
mUiLoader = new TUiLoader(this);
mUiLoader->setScriptEngine(APP->scriptEngine());
......@@ -74,8 +66,7 @@ void SysUserV1::initCenterUi()
mUiLoader->setProperty("SS_BORDER", 1);
mUiLoader->setUiStr(ui("user-info").toString());
mBodyLayout->addWidget(mUiLoader, 0);
//数据更改关联功能。之前以为initdetail涵盖了数据修改 但uiloader数据修改其实应该具体设置
//数据更改触发屏幕更改状态功能
connect(mUiLoader, SIGNAL(dataChanged()), this, SLOT(setDataModified()));
}
......@@ -97,28 +88,20 @@ void SysUserV1::resizeEvent(QResizeEvent *iEvent)
//uid变化模块
void SysUserV1::uidChangeEvent(const QString &iUidStr)
{
//uid无值为初始0
if(iUidStr.toInt() == 0){
if(iUidStr.toInt() == 0) {
clearData();
}else{
} else {
//uid带值为选中id值
t::loading(this);
QVariant data = doThreadWork(new SysUserV1Thread(this), "LOAD_DATA", QVariant(this->uid()));
unloading();
//获取data.tomap();的回执
TDataResponse dataRes(data.toMap());
if(dataRes.hasError()) {
alertError(ttr("load data failed!"), dataRes.errText());
} else {
clearData();
//猜测:这里应该是对应存储功能中getData分割.字段的相反功能 带.字段载入
QVariantMap dataMap = dataRes.data().toMap();
QVariantMap attrData = dataMap.value("attr_data").toMap();
for(QString key : attrData.keys()) {
dataMap.insert("attr_data." + key, attrData.value(key));
}
setData(dataMap);
alertOk(ttr("Data loaded"));
}
......@@ -137,16 +120,13 @@ void SysUserV1::clearData()
void SysUserV1::setData(const QVariantMap &iDataMap)
{
//载入 形参map 不清原数据 须接收未显示字段 比如product_category
mUiLoader->loadValues(iDataMap, false);
//问题:原代码此处会设置setTitie 为什么需要设置?
}
//衔接mgt->newitem模块
void SysUserV1::create()
{
setLastUid(this->uid());
//问题: true对应false设置效果不明
setUid(0, true);
mUiLoader->setState("status", "disable");
......@@ -161,7 +141,6 @@ void SysUserV1::create()
void SysUserV1::reload()
{
QString uidStr = lastUid().isEmpty() ? uid() : lastUid();
//uidchanged true setid 为真调用uidchangged
setUid(uidStr, true);
}
......@@ -181,18 +160,12 @@ void SysUserV1::saveData()
}
t::saving(this);
QVariantMap saveData = getData();
//问题 意义不明? 对应_hooks_.js
if(isHookExists("handleSaveData")){
saveData = callHooksQuick("handleSaveData", QVariantList() << saveData).toVariant().toMap();
}
//
QVariant data = doThreadWork(new SysUserV1Thread(this), "SAVE_DATA", saveData);
//问题 unloading总是搭配doThreadwork使用?
unloading();
TDataResponse dataRes(data.toMap());
//获取保存错误
if(dataRes.hasError()){
alertError(ttr("Save data failed!"),dataRes.errText());
alertError(ttr("Save data failed!"), dataRes.errText());
}else{
setUid(dataRes.data().toInt());
emit dataSaved(this->uid());
......@@ -201,30 +174,9 @@ void SysUserV1::saveData()
}
}
QVariantMap SysUserV1::getData() const{
//ui获取所有字段
QVariantMap SysUserV1::getData() const
{
QVariantMap dataMap = mUiLoader->getAllValues(true).toVariant().toMap();
QStringList keys = dataMap.keys();
for(QString key : keys){
if(key.contains(".")){
QString keyfirst = key.split('.').first();
QString keylast = key.split('.').last();
QVariantMap map = dataMap.value(keyfirst,QVariantMap()).toMap();
map.insert(keylast, dataMap.value(key));
dataMap.insert(keyfirst, map);
dataMap.remove(key);
}
}
//问题:新建时 为什么要这样做
//猜测:该字段不存在ui页面,mUiLoader->getAllValues无法获取,因此需要手动添加
if (this->uid().toInt() == 0) {
QVariantMap attrData = dataMap.value("attr_data").toMap();
attrData.insert("effective_date", APP->getServerToday());
dataMap.insert("attr_data", attrData);
}
//mUiLoader->getAllValues无法获取id值 手动添加
dataMap.insert("id", this->uid());
return dataMap;
}
......@@ -35,29 +35,15 @@ void SysUserV1Thread::loadData(int iIdInt)
try {
// Selector:查
TSqlSelectorV2 sqlSelector;
//将sys_user取小名为U,左连接pub_contacts表,pub_contacts的小名为C,两表连接的条件是U.contcat_id = C.id
sqlSelector.setTable("sys_user AS U LEFT JOIN pub_contacts AS C ON U.contcat_id = C.id");
//设置要查找的字段,查找的字段是U里面所有表格的C.mail
//这是查的内容
sqlSelector.setField("U.*, C.mail");
//设置查找条件U.id==QVariant(iIdInt)
sqlSelector.setWhere("U.id", QVariant(iIdInt));
//设置表里"product_category"字段的格式为数组
sqlSelector.setFieldFormat("product_category", "array");
sqlSelector.setFieldFormat("attr_data", "json");
//sqlQuery是执行器,用来执行sqlSelector表格,会返回查询结果给dataMap
QVariantMap dataMap = sqlQuery.selectMap(sqlSelector);
//这句话是在看查询语句是否错误,如果错误,抛出错误:可以看到这个错
if (sqlQuery.lastError().isValid()) {
throw sqlQuery.lastError();
}
//提交:把执行结果提交给数据库
sqlQuery.commit();
//dataMap是查询结果,要把dataMap传回给dataRes,然后再
dataRes.setData(dataMap);
//设置结果:把dataRes返回给data
setInvokeResult(dataRes.toVariantMap());
return;
//捕获异常
......@@ -66,9 +52,7 @@ void SysUserV1Thread::loadData(int iIdInt)
} catch (...) {
dataRes.setErrText(ttr("Unknow Error!"));
}
//回滚:改了一个东西,但发现错了,就撤回SQL操作
sqlQuery.rollback();
//再次把结果传给data
setInvokeResult(dataRes.toVariantMap());
}
......@@ -78,6 +62,7 @@ void SysUserV1Thread::saveData(const QVariantMap &iDataMap)
TSqlQueryV2 sqlQuery(T_SQLCNT_POOL->getSqlDatabase());
sqlQuery.begin();
try {
//判断是否重复
TSqlSelectorV2 sqlSelector;
sqlSelector.setTable("sys_user");
sqlSelector.setField("COUNT(1)");
......@@ -101,14 +86,7 @@ void SysUserV1Thread::saveData(const QVariantMap &iDataMap)
}
contactMap.insert("name", name);
contactMap.insert("id", iDataMap.value("contcat_id").toInt());
contactMap.insert("source", "company");
contactMap.insert("status", iDataMap.value("status").toString() == "active" ? "active" : "inactive");
TopClassAbs *parentModule = static_cast<TopClassAbs*>(this->parent());
if (parentModule) {
if (parentModule->isHookExists("handleContactData")) {
contactMap = parentModule->callHooksQuick("handleContactData", QVariantList()<<contactMap<<iDataMap).toVariant().toMap();
}
}
QStringList contactFields = contactMap.keys();
contactFields.removeOne("id");
......@@ -123,37 +101,10 @@ void SysUserV1Thread::saveData(const QVariantMap &iDataMap)
if (sqlQuery.lastError().isValid()) {
throw sqlQuery.lastError();
}
// 更新sys_commu_grp_detail
TSqlUpdaterV2 sqlUpdater;
sqlUpdater.setTable("sys_commu_grp_detail");
sqlUpdater.setField(QStringList() << "address" << "name");
QVariantMap commuGrpDetailDataMap;
commuGrpDetailDataMap.insert("address", iDataMap.value("mail"));
commuGrpDetailDataMap.insert("name", name);
sqlUpdater.setData(commuGrpDetailDataMap);
TSqlWhereCompsiteV2 commuGrpDetailWhere;
commuGrpDetailWhere.append("src_type", "pub_contacts");
commuGrpDetailWhere.append("src_uid", iDataMap.value("contcat_id").toString());
commuGrpDetailWhere.setLogic(TSqlWhereCompsiteV2::Logic_And);
sqlUpdater.setWhere(commuGrpDetailWhere);
sqlQuery.updateRow(sqlUpdater);
if (sqlQuery.lastError().isValid()) {
throw sqlQuery.lastError();
}
// 更新sys_user表
QVariantMap dataMap = iDataMap;
QStringList fieldLst = dataMap.keys();
dataMap.insert("contcat_id", contactId);
QStringList productCategory = dataMap.value("product_category").toStringList();
// 只要产品分类列表中包含有*, 就只存*
if (productCategory.contains("*")) {
productCategory = (QStringList() << "*");
}
dataMap.insert("product_category", productCategory);
if (iDataMap.value("id").toInt() == 0) {
// 新建时插入默认密码
QString password = iDataMap.value("password").toString();
......@@ -166,18 +117,10 @@ void SysUserV1Thread::saveData(const QVariantMap &iDataMap)
}
fieldLst.removeOne("id");
fieldLst.removeOne("mail");
QVariantMap attrDataMap = dataMap.value("attr_data").toMap();
if (attrDataMap.value("password_validity_control") == 0) {
attrDataMap.insert("effective_date", QString(""));
attrDataMap.insert("validity_period", QString(""));
dataMap.insert("attr_data", attrDataMap);
}
qDebug().noquote().nospace()<<TDataParse::variant2JsonStr(dataMap);
sqlInserter.clear();
sqlInserter.setTable("sys_user");
sqlInserter.setData(dataMap);
sqlInserter.setField(fieldLst);
sqlInserter.setUpdatePolicy("attr_data", "json_merge");
sqlInserter.setUniqueField("id");
sqlInserter.setAutoIncrementField("id");
......
#include "sysusermgtv2.h"
SysUserMgtV2::SysUserMgtV2(const QString &iModuleNameStr, const QVariantMap iUrlPars, QWidget *iParent)
:TopClassAbs(iParent)
{
//载入模板
initModule(iModuleName, iUrlPars);
QString licenseKey = config("sys_common").toString();
if (!licenseKey.isEmpty()) {
setLicenseKey(licenseKey);
}
//语言
QStringList langLst = config("sys-userv2").toStringList();
for (const auto &lang : langLst) {
appendLanguage(lang);
}
QVariant prodCfg = config("product_category");
if (prodCfg.type() == QVariant::List || prodCfg.type() == QVariant::StringList) {
for (QVariant row : prodCfg.toList()) {
mProductCategoryLst.append(row.toString());
}
} else if (!prodCfg.toString().isEmpty()) {
mProductCategoryLst.append(prodCfg.toString());
}
if (mProductCategoryLst.isEmpty()) {
mProductCategoryLst.append(APP->productCategory());
}
}
SysUserMgtV2::~SysUserMgtV2()
{
this->saveSizeState();
this->saveObjectState(mTableView);
}
void SysUserMgtV2::initUi(){
}
#ifndef SYSUSERMGTV2_H
#define SYSUSERMGTV2_H
#include <topcore/topclassabs.h>
class SysUserMgtV2 : public TopClassAbs
{
public:
Q_OBJECT
public:
explicit SysUserMgtV2(const QString &iModuleNameStr = QString(""),
const QVariantMap iUrlPars = QVariantMap(),
QWidget *iParent = nullptr);
~SysUserMgtV2();
public slots:
signals:
private slots:
private:
void initUi();
private:
};
#endif // SYSUSERMGTV2_H
HEADERS += \
$$PWD/sysusermgtv2.h
SOURCES += \
$$PWD/sysusermgtv2.cpp
try {
if (this.selectedItems().length > 0) {
var item = this.openItem(this.selectedItems()[0]);
item.show();
}
} catch (e) {
print(e);
}
/*---ACTION---
ICON: "desktop"
LABEL: "Open In New Window"
LABEL_ZHCN: "在新窗口中打开"
LABEL_ZHTW: "在新窗口中打開"
ACCEL: ""
TOOLTIP: "Open In New Window"
TOOLTIP_ZHCN: "在新窗口中打开"
TOOLTIP_ZHTW: "在新窗口中打開"
PERMISSION: "sys-user-read"
CHECKED: ""
GROUP: ""
STYLE: "size=small button_style=both"
LANG: "JavaScript"
STATUS: "Release"
VERSION: "1"
STATEHOOK: "if(this.selectedItems().length > 0){return 'enable'}else{return 'disable'}"
---ACTION---*/
\ No newline at end of file
try {
var ans = TMessageBox.question(this, this.ttr("Are you sure to reset password?"), '', this.ttr('Reset password'),
[this.ttr("Reset") + ":Yes:Yes", this.ttr("Cancel") + ":Cancel:Cancel:Normal"]);
if (ans != 'Yes') {
return;
}
this.resetPassword();
} catch (e) {
print(e);
}
/*---ACTION---
ICON: "reset"
LABEL: "Reset Password"
LABEL_ZHCN: "重置密码"
LABEL_ZHTW: "重置密碼"
ACCEL: ""
TOOLTIP: "Reset Password"
TOOLTIP_ZHCN: "重置密码"
TOOLTIP_ZHTW: "重置密碼"
PERMISSION: "sys-user-reset-password"
CHECKED: ""
GROUP: ""
STYLE: " button_style=both"
LANG: "JavaScript"
STATUS: "Release"
VERSION: "1"
STATEHOOK: "if(this.selectedItems().length > 0 && this.canModify()){return 'enable'}else{return 'disable'}"
---ACTION---*/
\ No newline at end of file
try {
var ans = TMessageBox.question(this, this.ttr("Are you sure the reset password effective date?"), '', this.ttr('Reset password'),
[this.ttr("Reset") + ":Yes:Yes", this.ttr("Cancel") + ":Cancel:Cancel:Normal"]);
if (ans != 'Yes') {
return;
}
this.resetPasswordValidityDate();
} catch (e) {
print(e);
}
/*---ACTION---
ICON: "reset"
LABEL: "Reset Password Validity"
LABEL_ZHCN: "重置密码生效日期"
LABEL_ZHTW: "重置密碼生效日期"
ACCEL: ""
TOOLTIP: "Reset Password Validity"
TOOLTIP_ZHCN: "重置密码生效日期"
TOOLTIP_ZHTW: "重置密碼生效日期"
PERMISSION: "sys-user-password-validity-control"
CHECKED: ""
GROUP: ""
STYLE: " button_style=both"
LANG: "JavaScript"
STATUS: "Release"
VERSION: "1"
STATEHOOK: "if(this.selectedItems().length > 0 && this.canModify() && this.isPasswordValidityControl()){return 'enable'}else{return 'disable'}"
---ACTION---*/
\ No newline at end of file
"Add Role": {en: "Add Role",zhcn: "添加角色",zhtw: "添加角色"}
"Current login user can not be deleted!": {en: "Current login user can not be deleted!",zhcn: "当前登陆的用户不可删除!",zhtw: "當前登錄的用戶不可刪除!"}
"Full Name": {en: "Full Name",zhcn: "全名",zhtw: "全名"}
"Login Name": {en: "Login Name",zhcn: "登录名",zhtw: "登錄名"}
"Mail": {en: "Mail",zhcn: "邮箱",zhtw: "郵箱"}
"New User": {en: "New User",zhcn: "新建用户",zhtw: "新建用戶"}
"Role Name": {en: "Role Name",zhcn: "角色名称",zhtw: "角色名稱"}
"Staff ID": {en: "Staff ID",zhcn: "工号",zhtw: "工號"}
"Status": {en: "Status",zhcn: "状态",zhtw: "狀態"}
"Reset password...": {en: "",zhcn: "重置密码...",zhtw: "重置密碼..."}
"Reset password failed!": {en: "",zhcn: "重置密码失败!",zhtw: "重置密碼失敗!"}
"Reset password success!": {en: "",zhcn: "重置密码成功!",zhtw: "重置密碼成功!"}
"Are you sure to reset password?": {en: "",zhcn: "确认重置密码吗?",zhtw: "確認重置密碼嗎?"}
"Are you sure the reset password effective date?": {en: "",zhcn: "确认重置密码生效日期吗?",zhtw: "確認重置密碼生效日期嗎?"}
"Reset password": {en: "",zhcn: "重置密码",zhtw: "重置密碼"}
"Reset": {en: "Reset",zhcn: "重置",zhtw: "重置"}
"Reset password validity date failed!": {en: "Reset password validity date failed!",zhcn: "重置密码生效日期失败!",zhtw: "重置密碼生效日期失敗!"}
"Reset password validity date success!": {en: "Reset password validity date success!",zhcn: "重置密码生效日期成功!",zhtw: "重置密碼生效日期成功!"}
"Navigation": {en: "Navigation",zhcn: "导航栏",zhtw: "導航欄"}
"Cancel": {en: "Cancel",zhcn: "取消",zhtw: "取消"}
"Ok": {en: "Ok",zhcn: "确认",zhtw: "確認"}
"Show Navigation": {en: "Show Navigation",zhcn: "打开导航栏",zhtw: "打開導航欄"}
"Hide Navigation": {en: "Hide Navigation",zhcn: "关闭导航栏",zhtw: "關閉導航欄"}
\ No newline at end of file
......@@ -4,15 +4,8 @@
"Login Name": {en: "Login Name",zhcn: "登录名",zhtw: "登錄名"}
"Mail": {en: "Mail",zhcn: "邮箱",zhtw: "郵箱"}
"New User": {en: "New User",zhcn: "新建用户",zhtw: "新建用戶"}
"Role Name": {en: "Role Name",zhcn: "角色名称",zhtw: "角色名稱"}
"Staff ID": {en: "Staff ID",zhcn: "工号",zhtw: "工號"}
"Status": {en: "Status",zhcn: "状态",zhtw: "狀態"}
"Reset password...": {en: "",zhcn: "重置密码...",zhtw: "重置密碼..."}
"Reset password failed!": {en: "",zhcn: "重置密码失败!",zhtw: "重置密碼失敗!"}
"Reset password success!": {en: "",zhcn: "重置密码成功!",zhtw: "重置密碼成功!"}
"Are you sure to reset password?": {en: "",zhcn: "确认重置密码吗?",zhtw: "確認重置密碼嗎?"}
"Are you sure the reset password effective date?": {en: "",zhcn: "确认重置密码生效日期吗?",zhtw: "確認重置密碼生效日期嗎?"}
"Reset password": {en: "",zhcn: "重置密码",zhtw: "重置密碼"}
"Reset": {en: "Reset",zhcn: "重置",zhtw: "重置"}
"Reset password validity date failed!": {en: "Reset password validity date failed!",zhcn: "重置密码生效日期失败!",zhtw: "重置密碼生效日期失敗!"}
"Reset password validity date success!": {en: "Reset password validity date success!",zhcn: "重置密码生效日期成功!",zhtw: "重置密碼生效日期成功!"}
......@@ -20,4 +13,5 @@
"Cancel": {en: "Cancel",zhcn: "取消",zhtw: "取消"}
"Ok": {en: "Ok",zhcn: "确认",zhtw: "確認"}
"Show Navigation": {en: "Show Navigation",zhcn: "打开导航栏",zhtw: "打開導航欄"}
"Hide Navigation": {en: "Hide Navigation",zhcn: "关闭导航栏",zhtw: "關閉導航欄"}
\ No newline at end of file
"Hide Navigation": {en: "Hide Navigation",zhcn: "关闭导航栏",zhtw: "關閉導航欄"}
"mail": {en: "mail",zhcn: "邮箱;",zhtw: "郵箱;"}
\ No newline at end of file
......@@ -45,7 +45,6 @@ view: {
"contcat_id",
"remark",
"status",
"department_id"
]
primary_key: "id"
horizontal_header: [
......@@ -99,6 +98,6 @@ view: {
data_set: {
db_table_name: "",
db_sql: "select U.id, U.username, U.staffid, C.mail, U.remark, U.status, U.contcat_id, U.fullname, U.department_id, U.product_category from sys_user AS U LEFT JOIN pub_contacts AS C ON U.contcat_id = C.id"
db_sql: "select U.id, U.username, U.staffid, C.mail, U.remark, U.status, U.contcat_id, U.fullname from sys_user AS U LEFT JOIN pub_contacts AS C ON U.contcat_id = C.id"
}
}
\ No newline at end of file
......@@ -11,6 +11,7 @@
"MAIN_TOOLBAR": [
{"type":"spacing","size":10},
{"type":"toolitem","action":"new"},
{"type":"toolitem","action":"new"},
{"type":"stretcher"},
{"type":"searchentry","name":"SEARCH_ENTRY"},
{"type":"toolitem","action":"refresh"}
......
this.afterViewInit = function () {
var self = this;
var stackup_viewer = self.uiLoader().getObject('stackup');
stackup_viewer.setDrawSetting(self.config("stackup.draw_setting"));
var selector = new TSqlSelectorV2;
selector.setTable("pdm_stkmatlib");
selector.setWhere("class = 'Core'");
selector.setField("DISTINCT family");
selector.setOrder(["family ASC"]);
var cores = self.runSqlQueryOnThreadSync("TOPSQLTHREAD_SELECT_ARRAYMAP", selector);
cores = _.map(cores, function(item) { return { name: item.family, text: item.family } } );
self.naviView().getObject('attr_data.core_family').setData('item_list', cores);
selector.clear();
selector.setTable("pdm_stkmatlib");
selector.setWhere("class = 'Prepreg'");
selector.setField("DISTINCT family");
selector.setOrder(["family ASC"]);
var pps = self.runSqlQueryOnThreadSync("TOPSQLTHREAD_SELECT_ARRAYMAP", selector);
pps = _.map(pps, function(item) { return { name: item.family, text: item.family } } );
self.naviView().getObject('attr_data.pp_family').setData('item_list', pps);
}
this.onNaviReset = function () {
var naviUi = this.naviLoader();
naviUi.clearValues();
this.refresh();
}
\ No newline at end of file
try {
this.reload();
this.reloadItem();
} catch(e) {
print(e);
print(e);
}
/*---ACTION---
ICON: "times"
ICON: "cancel"
LABEL: "Cancel"
LABEL_ZHCN: "取消"
LABEL_ZHTW: "取消"
ACCEL: ""
TOOLTIP: "Cancel Edit"
TOOLTIP_ZHCN: "取消编辑"
TOOLTIP_ZHTW: "刷新編輯"
TOOLTIP: "Cancel the action"
TOOLTIP_ZHCN: "取消动作"
TOOLTIP_ZHTW: "取消動作"
CHECKED: ""
GROUP: ""
STYLE: "button_style=both"
STYLE: "button_style=text"
LANG: "JavaScript"
STATUS: "Release"
VERSION: "1"
STATEHOOK: "return (this.isDataModified() ) ? 'enable' : 'hide';"
STATEHOOK: "return (this.isDetailModified()) ? 'enable' : 'hide';"
---ACTION---*/
\ No newline at end of file
try {
var ans = TMessageBox.question(this, this.ttr("Are you sure to delete selected items?"), '', this.ttr('Delete'),
[this.ttr("Delete") + ":Yes:Yes:Error", this.ttr("Cancel") + ":Cancel:Cancel:Normal"]);
if (ans != 'Yes') {
return;
}
this.deleteItem(this.selectedItems());
var ans = TMessageBox.question(this, this.ttr("Do you want to delete the selected item?"), '', '',
[this.ttr('Delete')+':Yes:Yes:Error', this.ttr('Cancel')+':Cancel:Cancel:Normal']);
if (ans != 'Yes') {
return;
}
this.deleteItems(this.selectedItems());
} catch (e) {
print(e);
print(e);
}
/*---ACTION---
ICON: "times-circle"
LABEL: "Delete"
LABEL_ZHCN: "除"
LABEL_ZHCN: "除"
LABEL_ZHTW: "刪除"
ACCEL: "Delete"
TOOLTIP: "Delete User"
TOOLTIP_ZHCN: "删除用户"
TOOLTIP_ZHTW: "刪除用戶"
TOOLTIP: "Delete"
TOOLTIP_ZHCN: "删除"
TOOLTIP_ZHTW: "刪除"
PERMISSION: "sys-user-delete"
CHECKED: ""
GROUP: ""
......@@ -25,5 +26,5 @@ STYLE: "size=small button_style=both"
LANG: "JavaScript"
STATUS: "Release"
VERSION: "1"
STATEHOOK: "if(this.selectedItems().length > 0 && this.canModify()){return 'enable'}else{return 'disable'}"
STATEHOOK: "if(this.selectedItems().length > 0 && !this.isDetailModified()){return 'enable'}else{return 'disable'}"
---ACTION---*/
\ No newline at end of file
try {
this.newItem();
this.newItem();
} catch (e) {
print(e);
print(e);
}
/*---ACTION---
......@@ -9,7 +9,7 @@ ICON: "plus"
LABEL: "New"
LABEL_ZHCN: "新建"
LABEL_ZHTW: "新建"
ACCEL: "Ctrl+N"
ACCEL: ""
TOOLTIP: "Add new item"
TOOLTIP_ZHCN: "新建条目"
TOOLTIP_ZHTW: "新建條目"
......@@ -20,5 +20,5 @@ STYLE: "button_style=both"
LANG: "JavaScript"
STATUS: "Release"
VERSION: "1"
STATEHOOK: "if(this.canModify()){return 'enable'}else{return 'disable'}"
STATEHOOK: "return (!this.isDetailModified()) ? 'enable' : 'disable';"
---ACTION---*/
\ No newline at end of file
try {
this.refresh(false);
this.refresh();
} catch (e) {
print(e);
print(e);
}
/*---ACTION---
ICON: "refresh"
LABEL: "Refresh"
LABEL_ZHCN: "刷新"
LABEL_ZHTW: "刷新"
ACCEL: "F5"
TOOLTIP: "Reload data from database"
TOOLTIP_ZHCN: "重载数据库数据"
TOOLTIP_ZHTW: "重載數據庫數據"
TOOLTIP: "Refresh"
TOOLTIP_ZHCN: "刷新"
TOOLTIP_ZHTW: "刷新"
CHECKED: ""
GROUP: ""
STYLE: "size=small button_style=icon"
......
try {
this.reload();
this.reloadItem();
} catch(e) {
print(e);
print(e);
}
/*---ACTION---
ICON: "refresh"
LABEL: "Refresh"
......@@ -19,5 +18,5 @@ STYLE: "button_style=icon"
LANG: "JavaScript"
STATUS: "Release"
VERSION: "1"
STATEHOOK: "return (this.isDataModified() || this.uid() == 0) ? 'hide' : 'enable';"
STATEHOOK: "return this.isDetailModified() ? 'hide' : 'enable';"
---ACTION---*/
\ No newline at end of file
try {
this.saveData();
} catch (e) {
print(e);
this.saveItem();
} catch(e) {
print(e);
}
/*---ACTION---
ICON: "save"
LABEL: "Save"
LABEL_ZHCN: "保存"
LABEL_ZHTW: "保存"
ACCEL: "Ctrl+S"
TOOLTIP: "Save data to database"
TOOLTIP_ZHCN: "保存数据至数据库"
TOOLTIP_ZHTW: "保存數據至數據庫"
PERMISSION: "sys-user-edit"
TOOLTIP: "Save"
TOOLTIP_ZHCN: "保存"
TOOLTIP_ZHTW: "保存"
PERMISSION: ""
CHECKED: ""
GROUP: ""
STYLE: " button_style=both"
LANG: "JavaScript"
STATUS: "Release"
VERSION: "1"
STATEHOOK: "return (this.isDataModified() ) ? 'enable' : 'disable';"
STATEHOOK: "return (this.isDetailModified()) ? 'enable' : 'disable';"
---ACTION---*/
\ No newline at end of file
function func(self) {
var ui = {
type: 'TabWidget',
child:
{
type: 'VBoxLayout',
property: {stylesheet:"QTabWidget{background-color:red}"},
pack: { label: self.ttr('User Info') },
child: [
{
type: 'FormGridLayout',
child: [
{
name: 'id',
type: 'LineEdit',
title: self.ttr('ID'),
pack: { label: self.ttr('ID') },
property: { enabled: false },
state: function(obj) {
return "Hide";
}
},
{
name: 'contcat_id',
type: 'LineEdit',
property: { enabled: false },
state: function(obj,self) {
return 'Hide';
}
},
{
name: 'username',
type: 'LineEdit',
pack: { label: self.ttr('Login Name') }
},
{
name: 'password',
type: 'LineEdit',
pack: { label: self.ttr('Password') },
state: function(obj) {
return "Hide";
}
},
{
name: 'fullname',
type: 'LineEdit',
pack: { label: self.ttr('Full Name') }
},
{
name: 'staffid',
type: 'LineEdit',
pack: { label: self.ttr('Staff ID') }
},
{
name: 'mail',
type: 'LineEdit',
pack: { label: self.ttr('Mail') }
},
{
name: 'remark',
type: 'PlainTextEdit',
property: { vertical_scroll_bar_policy: 'ScrollBarAlwaysOff' },
pack: { label: self.ttr('Remark') }
},
{
name: 'status',
type: 'ComboBox',
property: { item_list: TOPENM.enumList("sys-user-status").toComboList() },
pack: { label: self.ttr('Status') }
},
]
},
{
type: 'Stretch'
}
]
}
};
return ui;
}
\ No newline at end of file
"Full Name": {en: "Full Name",zhcn: "全名",zhtw: "全名"}
"Login Name": {en: "Login Name",zhcn: "登录名",zhtw: "登錄名"}
"Staff ID": {en: "Staff ID",zhcn: "工号",zhtw: "工號"}
"Status": {en: "Status",zhcn: "状态",zhtw: "狀態"}
"Search": {en: "Search",zhcn: "搜索",zhtw: "搜索"}
"Do you want to delete the selected item?": {en: "", zhcn: "确定删除选中项?", zhtw: "確定刪除選中項?"}
"Delete": {en: "Delete",zhcn: "删除",zhtw: "刪除"}
"Cancel": {en: "Cancel",zhcn: "取消",zhtw: "取消"}
"Remark": {en: "Remark",zhcn: "备注",zhtw: "備註"}
"Mail": {en: "Mail",zhcn: "邮箱",zhtw: "郵箱"}
"User Info": {en: "User Info",zhcn: "用户信息",zhtw: "用戶信息"}
\ No newline at end of file
......@@ -8,48 +8,46 @@ sys_title_zhtw: "用戶管理"
sys_icon: "user-o"
# 模块对应的插件DLL名称
sys_plugin: "topikm6-topsys-plugin"
sys_plugin: "toptemplateclassplugin"
# 模块对应的类名
sys_class: "SysUserMgt"
sys_class: "TopTemplateClass4"
# 打开模块的权限
sys_open_right: "sys-user-read"
sys_open_right: ""
# 当关闭窗口时,如果提示是否保存,保存调用的action
sys_save_action: ""
# 该模块用到的枚举列表
sys_enum_list: ["sys-user-status"]
sys_enum_list: []
# 该模块用到的除了Action之外的权限列表
sys_permission_list: []
#详情页面的初始大小
detail.perfect_size.width: 600
sys_permission_list: ["sys-user-status"]
# 产品类型,此选项用于当多个产品共用一个数据库时,只想看到自已产品的用户;
# * 表示匹配所有产品
product_category: []
navi: {
is_expanded: "true"
navi {
__type__: "UiLoader"
is_expanded: true
}
view: {
data_keys: [
# 主表格
view {
# 数据项, 默认包含表头中配置的数据项
data_keys: [
"id",
"username",
"fullname",
"contcat_id",
"staffid",
"mail",
"contcat_id",
"remark",
"status",
"department_id"
]
primary_key: "id"
horizontal_header: [
{
"status"
]
# 主键
primary_key: "id"
# 水平表头
horizontal_header: [
{
"name": "username",
"display": "Login Name",
"displayRole": "$username",
......@@ -95,13 +93,20 @@ view: {
"displayRole": "$remark",
"resizeMode": "Interactive",
},
]
data_set: {
db_table_name: "",
db_sql: "select U.id, U.username, U.staffid, C.mail, U.remark, U.status, U.contcat_id, U.fullname, U.department_id, U.product_category from sys_user AS U LEFT JOIN pub_contacts AS C ON U.contcat_id = C.id"
]
# 默认排序列
sort_by: "id DESC"
# 数据集
data_set {
# 数据库表名
db_table_name: ""
# 删除标记
# 若为空表示做物理删除
db_del_flag_key: ""
# 过滤项
db_filter {
}
db_sql: "select U.id, U.username, U.staffid, C.mail, U.remark, U.status, U.contcat_id, U.fullname from sys_user AS U LEFT JOIN pub_contacts AS C ON U.contcat_id = C.id"
}
}
# 多工厂同步(用户的增删改)
multi_plant_sync: false
function func(self) {
return {
type: "FormGridLayout",
type: 'FormGridLayout',
child: [
{
name: "username",
......@@ -34,8 +34,7 @@ function func(self) {
item_list: TOPENM.enumList("sys-user-status").toComboList(),
user_data: { field_name: "status" }
}
},
}
]
};
}
# 工具栏
"MAIN_TOOLBAR": [
{"type":"toolitem","action":"new"},
{"type":"stretcher"},
{"type":"searchentry","name":"SEARCH_ENTRY"}
{"type":"toolitem","action":"refresh"}
]
# 表格的右键菜单
"TABLEVIEW_POPUP": [
{"type":"menuitem","action":"new"},
{"type":"separator"},
{"type":"menuitem","action":"open"},
{"type":"separator"},
{"type":"menuitem","action":"delete"},
{"type":"separator"},
{"type":"menuitem","action":"refresh"},
{"type":"separator"},
{"type":"menuitem","action":"reset_password"},
{"type":"menuitem","action":"reset_password_validity"}
]
# 工具栏
"MAIN_TOOLBAR": [
{"type":"spacing","size":10},
{"type":"toolitem","action":"new"},
{"type":"stretcher"},
{"type":"searchentry","name":"SEARCH_ENTRY"},
{"type":"toolitem","action":"refresh"}
{"type":"menuitem","action":"refresh"}
]
# 底部工具栏
"BOTTOM_TOOLBAR" : [
{"type":"stretcher"},
{"type":"pagetool","name":"PAGE_TOOL"}
]
# 详细信息工具栏
"DETAIL_TOOLBAR": [
{"type":"toolitem","action":"save_detail"},
{"type":"stretcher"},
{"type":"toolitem","action":"cancel_detail"},
{"type":"toolitem","action":"refresh_detail"}
]
\ No newline at end of file
// 保存联系人数据时的额外处理(标准产品中注释掉,项目配置需要时启用)
// this.handleContactData = function (iContactData, iUserData) {
// var data = iContactData;
// data['attr_data'] = {
// staffid: _.toString(iUserData['staffid'])
// };
// print(_.toString(data));
// return data;
// }
// 保存用户数据时的额外处理
// this.handleSaveData = function (iSaveData) {
// var data = iSaveData;
// data['attr_data']['effective_date'] = "";
// return data;
// }
\ No newline at end of file
try {
this.copy();
} catch (e) {
print(e);
}
/*---ACTION---
ICON: "copy"
LABEL: "Copy"
LABEL_ZHCN: "复制"
LABEL_ZHTW: "複製"
ACCEL: ""
TOOLTIP: "Copy selected item"
TOOLTIP_ZHCN: "复制选中条目"
TOOLTIP_ZHTW: "複製選中條目"
PERMISSION: "sys-user-edit"
CHECKED: ""
GROUP: ""
STYLE: "button_style=icon"
LANG: "JavaScript"
STATUS: "Release"
VERSION: "1"
STATEHOOK: "return (this.isDataModified() || this.uid() == 0) ? 'hide' : 'enable';"
---ACTION---*/
\ No newline at end of file
"Add Role": {en: "Add Role",zhcn: "添加角色",zhtw: "添加角色"}
"Admin can not be deleted!": {en: "Admin can not be deleted!",zhcn: "Admin不能被删除!",zhtw: "Admin不能被刪除!"}
"Are you sure to delete selected roles?": {en: "Are you sure to delete selected roles?",zhcn: "确定要删除选择的角色吗?",zhtw: "確定要刪除選擇的角色嗎?"}
"Full Name": {en: "Full Name",zhcn: "全名",zhtw: "全名"}
"Login Name": {en: "Login Name",zhcn: "登录名",zhtw: "登錄名"}
"Mail": {en: "Mail",zhcn: "邮箱",zhtw: "郵箱"}
"New User": {en: "New User",zhcn: "新建用户",zhtw: "新建用戶"}
"Password": {en: "Password",zhcn: "密码",zhtw: "密碼"}
"Remove Role": {en: "Remove Role",zhcn: "移除角色",zhtw: "移除角色"}
"Role": {en: "Role",zhcn: "角色",zhtw: "角色"}
"Role Name": {en: "Role Name",zhcn: "角色名称",zhtw: "角色名稱"}
"Saving data failed!": {en: "Saving data failed!",zhcn: "保存数据失败!",zhtw: "保存數據失敗!"}
"Staff ID": {en: "Staff ID",zhcn: "工号",zhtw: "工號"}
"Status": {en: "Status",zhcn: "状态",zhtw: "狀態"}
"User Information": {en: "User Information",zhcn: "用户信息",zhtw: "用戶信息"}
"User-%1": {en: "User-%1",zhcn: "用户-%1",zhtw: "用戶-%1"}
"invalid mail format": {en: "invalid mail format",zhcn: "无效的邮箱格式;",zhtw: "無效的郵箱格式;"}
"Product Category": {en: "Product Category",zhcn: "产品分类",zhtw: "產品分類"}
"'%1' already exists!": {en: "'%1' already exists!", zhcn: "'%1' 已经存在!", zhtw: "'%1' 已經存在!"}
"Clear All": {en: "Clear All",zhcn: "清除选择",zhtw: "清除選擇"}
"Password Validity Control": {en: "Password Validity Control",zhcn: "密码有效期管控",zhtw: "密碼有效期管控"}
"Validity Period": {en: "Validity Period",zhcn: "有效期",zhtw: "有效期"}
"Month": {en: "Month",zhcn: "月",zhtw: "月"}
\ No newline at end of file
# 模块标题
sys_title: "User"
sys_title_en: ""
sys_title_zhcn: "用户信息"
sys_title_zhtw: "用戶信息"
# 模块图标(普通图标在font awesome中找 http://fontawesome.io/icons/)
sys_icon: "user"
# 模块对应的插件DLL名称
sys_plugin: "topikm6-topsys-plugin"
# 模块对应的类名
sys_class: "SysUser"
# 打开模块的权限
sys_open_right: "sys-user-read"
# 当关闭窗口时,如果提示是否保存,保存调用的action
sys_save_action: "save"
# 该模块用到的枚举列表
sys_enum_list: ["sys-user-status", "sys-product-category"]
# 该模块用到的除了Action之外的权限列表
sys_permission_list: []
# 模块的最佳显示尺寸
perfect_size : {
width: 800
height: 600
}
# 模块的最大尺寸
maximum_size.width: 800
# 新建用户时默认值:
default_value : {
status: "active",
password: "123456",
product_category: "*",
"attr_data.password_validity_control": 1,
"attr_data.validity_period": 6
}
# 工具栏
"MAIN_TOOLBAR": [
{"type":"toolitem","action":"save"},
{"type":"stretcher"},
{"type":"toolitem","action":"copy"},
{"type":"toolitem","action":"cancel"},
{"type":"toolitem","action":"refresh"}
]
function func(self) {
return [
{
name: 'tablewidgt',
type: 'TabWidget',
property: {stylesheet:"QTabWidget{background-color:red}"},
pack: { stretch: 1 },
child: [
{
name: 'userinfo_page',
type: 'ScrollArea',
property: { widget_resizable: true, frame_shape: 'NoFrame'},
pack: { label: self.ttr("User Information") },
child: {
name: 'formlayout',
type: 'FormLayout',
property: { label_alignment: 'AlignRight', margin: 20, vertical_spacing: 10, horizontal_spacing: 20 },
pack: {},
child: [
{
name: 'id',
type: 'LineEdit',
title: self.ttr('ID'),
property: { enabled: false },
pack: { label: self.ttr('ID') },
state: function(obj) {
return "Hide";
}
},
{
name: 'username',
type: 'LineEdit',
title: self.ttr('Login Name'),
property: {},
pack: { label: self.ttr('Login Name') },
validate: function (obj, val, title, moment, self) {
if (val.trim() == '') {
return [title + self.ttr(" can not be null"), 'Error'];
} else if (!val.match(new RegExp('^[A-Za-z0-9_]+$'))) {
return [title + self.ttr(" can only contain [A-Za-z0-9]!"), 'Error'];
}
},
},
{
name: 'password',
type: 'LineEdit',
title: self.ttr('Password'),
property: { echo_mode: 'Password' },
pack: { label: self.ttr('Password') },
state: function(obj,self) {
return 'Hide';
}
},
{
name: 'fullname',
type: 'LineEdit',
title: self.ttr('Full Name'),
property: {},
pack: { label: self.ttr('Full Name') },
validate: 'NOTNULL'
},
{
name: 'staffid',
type: 'LineEdit',
title: self.ttr('Staff ID'),
property: {},
pack: { label: self.ttr('Staff ID') },
},
{
name: 'contcat_id',
type: 'LineEdit',
property: { enabled: false },
state: function(obj,self) {
return 'Hide';
}
},
{
name: 'mail',
type: 'LineEdit',
title: self.ttr('Mail'),
property: {},
validate: function (obj, val, title, moment) {
if (val != '') {
var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
if (!filter.test(val)) {
return [self.ttr("invalid mail format"), 'ERROR']
}
}
},
pack: { label: self.ttr('Mail') },
},
{
name: 'remark',
type: 'PlainTextEdit',
title: self.ttr('Remark'),
property: { vertical_scroll_bar_policy: 'ScrollBarAlwaysOff' },
pack: { label: self.ttr('Remark') },
},
{
name: 'status',
type: 'ComboBox',
title: self.ttr('Status'),
property: { item_list: TOPENM.enumList("sys-user-status").toComboList() },
pack: { label: self.ttr('Status') },
validate: function (obj, val, title, moment, self) {
if (val.trim() == '') {
return [title + self.ttr(" can not be null"), 'Error'];
}
}
},
{
name: 'attr_data.password_validity_control',
type: 'CheckBox',
title: self.ttr('Password Validity Control'),
property: {},
pack: { label: self.ttr('Password Validity Control') },
// getter : function(obj, self) {
// return obj.getData("current_names");
// },
// setter: function(obj,value,self){
// obj.setData("current_names", value);
// },
callback: function (obj, checked, self) {
if (checked) {
this.setState("attr_data.validity_period", "show");
} else {
this.setState("attr_data.validity_period", "hide");
}
},
setter: function (obj, value, self) {
if (value === 1 || value == true || value === 'on' || value === 'yes') {
obj.setIntValue(1);
this.setState("attr_data.validity_period", "show");
} else {
obj.setIntValue(0);
this.setState("attr_data.validity_period", "hide");
}
},
state: function (obj, self) {
if (APP.hasRight("sys-user-password-validity-control")) {
return 'Show';
} else {
return 'Hide';
}
}
},
{
name: 'attr_data.validity_period',
type: 'IntLineEdit',
title: self.ttr('Validity Period'),
property: { min_value: 0 },
pack: { label: self.ttr('Validity Period') },
state: function (obj, self) {
if (APP.hasRight("sys-user-password-validity-control") &&
this.getValue('attr_data.password_validity_control') == 1) {
return 'Show';
} else {
return 'Hide';
}
},
child: [
{
name: "validity_period_unit",
type: "Label",
property: {
text: " " + self.ttr('Month') + " ",
alignment: "HCenter|VCenter",
fixed_height: 26,
stylesheet: "background-color: white;border-left: 1px solid lightgray;"
}
}
]
},
{
name: 'product_category',
type: 'MultiComboBox',
title: self.ttr('Product Category'),
property: { item_list: TOPENM.enumList("sys-product-category").toComboList(), name_format: 'A,B' },
pack: { label: self.ttr('Product Category') },
getter : function(obj, self)
{
return obj.getData("current_names");
},
setter: function(obj,value,self){
obj.setData("current_names", value);
},
state: function(obj, self) {
return 'hide';
}
}
]
}
},
{
name: 'ROLE_PAGE',
type: 'VBoxLayout',
property: { spacing: 0, margin: 0 },
pack: { label: self.ttr("Role") },
child: [
{
name: 'role_toolbar',
type: 'ToolBar',
property: {style:"size=normal" ,spacing: 0, margin: 0},
pack: {},
child: [
{
name: 'plus-circle',
type: 'Action',
property: { text: self.ttr('Add Role'), icon: 'plus-circle', shortcut: '', tooltip: '',style:' button_style=both' },
callback: function (obj, checked, self) {
self.showAddRoleDialog();
},
},
{
name: 'act_remove_role',
type: 'Action',
property: { text: self.ttr('Remove Role'), icon: 'minus-circle', shortcut: '', tooltip: '',style:'button_style=both' },
callback: function (obj, checked, self) {
this.getObject('ROLE_LIST').removeSelectedRows();
},
state: function (obj, self) {
var selectionData = [];
selectionData = this.getObject("ROLE_LIST").selectedRowDataMaps();
if (selectionData.length > 0) {
return 'enable';
} else {
return 'disable';
}
}
},
{
name: 'tool_bar_separator',
type:'Separator'
}
]
},
{
name: 'ROLE_LIST',
type: 'TableView',
property: {},
pack: {},
setter: function (obj, value) {
if (value == null) {
value = [];
}
obj.loadData(value);
},
initCallback: function (obj) {
obj.setHeaderItem(
[
{ name: 'id', displayRole: '$id' },
{ name: 'name', display: self.ttr('Role Name'),resizeMode: 'Interactive',displayRole: '$name',search:'int'},
{ name: 'description', display: self.ttr('Description'),resizeMode: 'Stretch',displayRole: '$description',search:'string'},
]
);
obj.setData('data_keys',["id", "name", "description"]);
obj.setData("sort_indicator_shown", false);
},
}
]
}
]
},
];
}
......@@ -108,86 +108,6 @@ function func(self) {
return [title + self.ttr(" can not be null"), 'Error'];
}
}
},
{
name: 'attr_data.password_validity_control',
type: 'CheckBox',
title: self.ttr('Password Validity Control'),
property: {},
pack: { label: self.ttr('Password Validity Control') },
// getter : function(obj, self) {
// return obj.getData("current_names");
// },
// setter: function(obj,value,self){
// obj.setData("current_names", value);
// },
callback: function (obj, checked, self) {
if (checked) {
this.setState("attr_data.validity_period", "show");
} else {
this.setState("attr_data.validity_period", "hide");
}
},
setter: function (obj, value, self) {
if (value === 1 || value == true || value === 'on' || value === 'yes') {
obj.setIntValue(1);
this.setState("attr_data.validity_period", "show");
} else {
obj.setIntValue(0);
this.setState("attr_data.validity_period", "hide");
}
},
state: function (obj, self) {
if (APP.hasRight("sys-user-password-validity-control")) {
return 'Show';
} else {
return 'Hide';
}
}
},
{
name: 'attr_data.validity_period',
type: 'IntLineEdit',
title: self.ttr('Validity Period'),
property: { min_value: 0 },
pack: { label: self.ttr('Validity Period') },
state: function (obj, self) {
if (APP.hasRight("sys-user-password-validity-control") &&
this.getValue('attr_data.password_validity_control') == 1) {
return 'Show';
} else {
return 'Hide';
}
},
child: [
{
name: "validity_period_unit",
type: "Label",
property: {
text: " " + self.ttr('Month') + " ",
alignment: "HCenter|VCenter",
fixed_height: 26,
stylesheet: "background-color: white;border-left: 1px solid lightgray;"
}
}
]
},
{
name: 'product_category',
type: 'MultiComboBox',
title: self.ttr('Product Category'),
property: { item_list: TOPENM.enumList("sys-product-category").toComboList(), name_format: 'A,B' },
pack: { label: self.ttr('Product Category') },
getter : function(obj, self)
{
return obj.getData("current_names");
},
setter: function(obj,value,self){
obj.setData("current_names", value);
},
state: function(obj, self) {
return 'hide';
}
}
]
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment