添加表单打印代码
This commit is contained in:
parent
7b6f73d5e6
commit
a36568cb05
@ -112,6 +112,19 @@ public class FormController extends DefaultBaseController {
|
||||
return new SuccessResult();
|
||||
}
|
||||
|
||||
@ApiOperation(value = "修改打印页面代码", notes = "修改打印页面代码接口")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "formId", value = "表单ID", paramType = "path")
|
||||
})
|
||||
@PutMapping("update-print-page-code/{formId}")
|
||||
public SuccessResult updatePrintPageCode(@PathVariable("formId") String formId, @RequestBody FormVO formVO) {
|
||||
if (StringUtils.isBlank(formVO.getPrintPageCode())) {
|
||||
throw new ParamsException("代码不能为空");
|
||||
}
|
||||
formService.updatePrintPageCode(formId, formVO.getPrintPageCode());
|
||||
return new SuccessResult();
|
||||
}
|
||||
|
||||
@ApiOperation(value = "修改App新增页面代码", notes = "修改App新增页面代码接口")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "formId", value = "表单ID", paramType = "path")
|
||||
@ -219,6 +232,19 @@ public class FormController extends DefaultBaseController {
|
||||
return formDTO;
|
||||
}
|
||||
|
||||
@ApiOperation(value = "打印页面代码", notes = "打印页面代码接口")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "formCode", value = "表单编码", paramType = "path"),
|
||||
@ApiImplicitParam(name = "formVersion", value = "表单版本", paramType = "path")
|
||||
})
|
||||
@ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)})
|
||||
@GetMapping("get-print-page-code/code/{formCode}/version/{formVersion}")
|
||||
public FormDTO getPrintPageCode(@PathVariable("formCode") String formCode, @PathVariable("formVersion") Integer formVersion) {
|
||||
FormDTO formDTO = new FormDTO();
|
||||
formDTO.setPrintPageCode(formService.getPrintPageCodeByCodeAndVersion(formCode, formVersion));
|
||||
return formDTO;
|
||||
}
|
||||
|
||||
@ApiOperation(value = "APP新增页面代码", notes = "APP新增页面代码接口")
|
||||
@ApiImplicitParams({
|
||||
@ApiImplicitParam(name = "formCode", value = "表单编码", paramType = "path"),
|
||||
|
@ -48,6 +48,12 @@ public class FormRouteController {
|
||||
return mv;
|
||||
}
|
||||
|
||||
@GetMapping("get-print-page-code")
|
||||
public ModelAndView getPrintPageCode() {
|
||||
ModelAndView mv = new ModelAndView("form/get-print-page-code");
|
||||
return mv;
|
||||
}
|
||||
|
||||
@GetMapping("get-app-save-page-code")
|
||||
public ModelAndView getAppSavePageCode() {
|
||||
ModelAndView mv = new ModelAndView("form/get-app-save-page-code");
|
||||
|
@ -49,6 +49,8 @@ public interface IFormDao extends IInitBaseTable {
|
||||
|
||||
String getShowPageCodeByCodeAndVersion(Map<String, Object> params) throws SearchException;
|
||||
|
||||
String getPrintPageCodeByCodeAndVersion(Map<String, Object> params) throws SearchException;
|
||||
|
||||
String getAppSavePageCodeByCodeAndVersion(Map<String, Object> params) throws SearchException;
|
||||
|
||||
String getAppUpdatePageCodeByCodeAndVersion(Map<String, Object> params) throws SearchException;
|
||||
|
@ -16,6 +16,7 @@ public class FormPO implements Serializable {
|
||||
private String savePageCode;
|
||||
private String updatePageCode;
|
||||
private String showPageCode;
|
||||
private String printPageCode;
|
||||
private String appSavePageCode;
|
||||
private String appUpdatePageCode;
|
||||
private String appShowPageCode;
|
||||
@ -116,6 +117,14 @@ public class FormPO implements Serializable {
|
||||
this.showPageCode = showPageCode;
|
||||
}
|
||||
|
||||
public String getPrintPageCode() {
|
||||
return printPageCode == null ? "" : printPageCode.trim();
|
||||
}
|
||||
|
||||
public void setPrintPageCode(String printPageCode) {
|
||||
this.printPageCode = printPageCode;
|
||||
}
|
||||
|
||||
public String getAppSavePageCode() {
|
||||
return appSavePageCode == null ? "" : appSavePageCode.trim();
|
||||
}
|
||||
|
@ -28,6 +28,8 @@ public class FormVO {
|
||||
private String updatePageCode;
|
||||
@ApiModelProperty(name = "showPageCode", value = "展示页面代码")
|
||||
private String showPageCode;
|
||||
@ApiModelProperty(name = "printPageCode", value = "打印页面代码")
|
||||
private String printPageCode;
|
||||
@ApiModelProperty(name = "appSavePageCode", value = "APP新增页面代码")
|
||||
private String appSavePageCode;
|
||||
@ApiModelProperty(name = "appUpdatePageCode", value = "APP修改页面代码")
|
||||
@ -125,6 +127,14 @@ public class FormVO {
|
||||
this.showPageCode = showPageCode;
|
||||
}
|
||||
|
||||
public String getPrintPageCode() {
|
||||
return printPageCode == null ? "" : printPageCode.trim();
|
||||
}
|
||||
|
||||
public void setPrintPageCode(String printPageCode) {
|
||||
this.printPageCode = printPageCode;
|
||||
}
|
||||
|
||||
public String getAppSavePageCode() {
|
||||
return appSavePageCode == null ? "" : appSavePageCode.trim();
|
||||
}
|
||||
|
@ -110,6 +110,14 @@ public interface IFormService {
|
||||
*/
|
||||
void updateShowPageCode(String formId, String showPageCode);
|
||||
|
||||
/**
|
||||
* 修改打印页面代码
|
||||
*
|
||||
* @param formId
|
||||
* @param printPageCode
|
||||
*/
|
||||
void updatePrintPageCode(String formId, String printPageCode);
|
||||
|
||||
/**
|
||||
* 修改App新增页面代码
|
||||
*
|
||||
@ -218,6 +226,15 @@ public interface IFormService {
|
||||
*/
|
||||
String getShowPageCodeByCodeAndVersion(String formCode, Integer formVersion);
|
||||
|
||||
/**
|
||||
* 打印页面代码
|
||||
*
|
||||
* @param formCode
|
||||
* @param formVersion
|
||||
* @return
|
||||
*/
|
||||
String getPrintPageCodeByCodeAndVersion(String formCode, Integer formVersion);
|
||||
|
||||
/**
|
||||
* APP新增页面代码
|
||||
*
|
||||
|
@ -129,6 +129,7 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe
|
||||
formVO.setSavePageCode(getSavePageCode(model, formDesignVO.getFormType()));
|
||||
formVO.setUpdatePageCode(getUpdatePageCode(model, formDesignVO.getFormType()));
|
||||
formVO.setShowPageCode(getShowPageCode(model, formDesignVO.getFormType()));
|
||||
formVO.setPrintPageCode(getPrintPageCode(model, formDesignVO.getFormType()));
|
||||
formVO.setAppSavePageCode(getAppSavePageCode(model, formDesignVO.getFormType()));
|
||||
formVO.setAppUpdatePageCode(getAppUpdatePageCode(model, formDesignVO.getFormType()));
|
||||
formVO.setAppShowPageCode(getAppShowPageCode(model, formDesignVO.getFormType()));
|
||||
@ -200,6 +201,23 @@ public class FormDesignServiceImpl extends DefaultBaseService implements IFormDe
|
||||
throw new ParamsException("表单类型错误");
|
||||
}
|
||||
|
||||
/**
|
||||
* 打印页面模板
|
||||
*
|
||||
* @param model
|
||||
* @param formType
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
private String getPrintPageCode(Map<String, Object> model, String formType) throws IOException {
|
||||
if (StringUtils.equals(FormTypeEnum.DEFAULT.getValue(), formType)) {
|
||||
return null;
|
||||
} else if (StringUtils.equals(FormTypeEnum.OA.getValue(), formType)) {
|
||||
return getTemplateCode("/page/web/oa/form-print.ftl", model);
|
||||
}
|
||||
throw new ParamsException("表单类型错误");
|
||||
}
|
||||
|
||||
/**
|
||||
* app新增页面模板
|
||||
*
|
||||
|
@ -190,6 +190,15 @@ public class FormServiceImpl extends DefaultBaseService implements IFormService
|
||||
formDao.update(params);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updatePrintPageCode(String formId, String printPageCode) {
|
||||
Map<String, Object> params = getHashMap(4);
|
||||
params.put("formId", formId);
|
||||
params.put("printPageCode", printPageCode);
|
||||
setUpdateInfo(params);
|
||||
formDao.update(params);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateAppSavePageCode(String formId, String appSavePageCode) {
|
||||
Map<String, Object> params = getHashMap(4);
|
||||
@ -292,6 +301,14 @@ public class FormServiceImpl extends DefaultBaseService implements IFormService
|
||||
return formDao.getShowPageCodeByCodeAndVersion(params);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getPrintPageCodeByCodeAndVersion(String formCode, Integer formVersion) {
|
||||
Map<String, Object> params = getHashMap(4);
|
||||
params.put("formCode", formCode);
|
||||
params.put("formVersion", formVersion);
|
||||
return formDao.getPrintPageCodeByCodeAndVersion(params);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getAppSavePageCodeByCodeAndVersion(String formCode, Integer formVersion) {
|
||||
Map<String, Object> params = getHashMap(4);
|
||||
|
@ -14,6 +14,7 @@
|
||||
<result column="save_page_code" property="savePageCode"/>
|
||||
<result column="update_page_code" property="updatePageCode"/>
|
||||
<result column="show_page_code" property="showPageCode"/>
|
||||
<result column="print_page_code" property="printPageCode"/>
|
||||
<result column="app_save_page_code" property="appSavePageCode"/>
|
||||
<result column="app_update_page_code" property="appUpdatePageCode"/>
|
||||
<result column="app_show_page_code" property="appShowPageCode"/>
|
||||
@ -38,6 +39,7 @@
|
||||
<result column="save_page_code" property="savePageCode"/>
|
||||
<result column="update_page_code" property="updatePageCode"/>
|
||||
<result column="show_page_code" property="showPageCode"/>
|
||||
<result column="print_page_code" property="printPageCode"/>
|
||||
<result column="app_save_page_code" property="appSavePageCode"/>
|
||||
<result column="app_update_page_code" property="appUpdatePageCode"/>
|
||||
<result column="app_show_page_code" property="appShowPageCode"/>
|
||||
@ -61,6 +63,7 @@
|
||||
`save_page_code` longtext COMMENT '新增页面代码',
|
||||
`update_page_code` longtext COMMENT '更新页面代码',
|
||||
`show_page_code` longtext COMMENT '展示页面代码',
|
||||
`print_page_code` longtext COMMENT '打印页面代码',
|
||||
`app_save_page_code` longtext COMMENT 'APP新增页面代码',
|
||||
`app_update_page_code` longtext COMMENT 'APP更新页面代码',
|
||||
`app_show_page_code` longtext COMMENT 'APP展示页面代码',
|
||||
@ -119,6 +122,7 @@
|
||||
save_page_code,
|
||||
update_page_code,
|
||||
show_page_code,
|
||||
print_page_code,
|
||||
app_save_page_code,
|
||||
app_update_page_code,
|
||||
app_show_page_code,
|
||||
@ -141,6 +145,7 @@
|
||||
#{savePageCode},
|
||||
#{updatePageCode},
|
||||
#{showPageCode},
|
||||
#{printPageCode},
|
||||
#{appSavePageCode},
|
||||
#{appUpdatePageCode},
|
||||
#{appShowPageCode},
|
||||
@ -213,6 +218,9 @@
|
||||
<if test="showPageCode != null and showPageCode != ''">
|
||||
show_page_code = #{showPageCode},
|
||||
</if>
|
||||
<if test="printPageCode != null and printPageCode != ''">
|
||||
print_page_code = #{printPageCode},
|
||||
</if>
|
||||
<if test="appSavePageCode != null and appSavePageCode != ''">
|
||||
app_save_page_code = #{appSavePageCode},
|
||||
</if>
|
||||
@ -277,6 +285,7 @@
|
||||
save_page_code,
|
||||
update_page_code,
|
||||
show_page_code,
|
||||
print_page_code,
|
||||
app_save_page_code,
|
||||
app_update_page_code,
|
||||
app_show_page_code,
|
||||
@ -405,6 +414,20 @@
|
||||
form_version = #{formVersion}
|
||||
</select>
|
||||
|
||||
<!-- 代码 -->
|
||||
<select id="getPrintPageCodeByCodeAndVersion" parameterType="map" resultType="java.lang.String">
|
||||
SELECT
|
||||
print_page_code
|
||||
FROM
|
||||
form_form
|
||||
WHERE
|
||||
is_delete = 0
|
||||
AND
|
||||
form_code = #{formCode}
|
||||
AND
|
||||
form_version = #{formVersion}
|
||||
</select>
|
||||
|
||||
<!-- 代码 -->
|
||||
<select id="getAppSavePageCodeByCodeAndVersion" parameterType="map" resultType="java.lang.String">
|
||||
SELECT
|
||||
|
@ -0,0 +1,176 @@
|
||||
<!doctype html>
|
||||
<html xmlns:th="http://www.thymeleaf.org">
|
||||
<head>
|
||||
<base th:href="${#request.getContextPath() + '/'}">
|
||||
<meta charset="utf-8">
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
||||
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
|
||||
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
|
||||
<link rel="stylesheet" href="assets/js/vendor/codemirror/codemirror.css">
|
||||
<link rel="stylesheet" href="assets/js/vendor/codemirror/theme/dracula.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="layui-anim layui-anim-fadein">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-body" style="padding: 0px;">
|
||||
<form class="layui-form layui-form-pane" lay-filter="dataForm">
|
||||
<div class="layui-row">
|
||||
<div id="codeBox" class="layui-col-md12 layui-col-xs12">
|
||||
<textarea id="printPageCode" name="printPageCode" style="display: none"></textarea>
|
||||
</div>
|
||||
<div id="previewBox" class="layui-col-md4 layui-col-xs4" style="display: none;">
|
||||
<iframe id="previewCode" frameborder="0" style="width: 100%;"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layui-form-item layui-layout-admin">
|
||||
<div class="layui-input-block">
|
||||
<div class="layui-footer" style="left: 0;">
|
||||
<button type="button" class="layui-btn" lay-submit lay-filter="submitForm">提交编辑</button>
|
||||
<button type="button" id="previewBtn" class="layui-btn layui-btn-normal">预览</button>
|
||||
<button type="button" class="layui-btn layui-btn-primary close">返回上级</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="assets/js/vendor/codemirror/codemirror.js"></script>
|
||||
<script src="assets/js/vendor/codemirror/mode/css/css.js"></script>
|
||||
<script src="assets/js/vendor/codemirror/mode/javascript/javascript.js"></script>
|
||||
<script src="assets/js/vendor/codemirror/mode/htmlmixed/htmlmixed.js"></script>
|
||||
<script src="assets/layuiadmin/layui/layui.js"></script>
|
||||
<script>
|
||||
layui.config({
|
||||
base: 'assets/layuiadmin/' //静态资源所在路径
|
||||
}).extend({
|
||||
index: 'lib/index' //主入口模块
|
||||
}).use(['index', 'form', 'laydate'], function(){
|
||||
var $ = layui.$;
|
||||
var win = $(window)
|
||||
var form = layui.form;
|
||||
var laytpl = layui.laytpl;
|
||||
var params = top.restAjax.params(window.location.href);
|
||||
var formId = params.formId;
|
||||
var formCode = params.formCode;
|
||||
var formVersion = params.formVersion;
|
||||
var previewTimeout;
|
||||
var isPreview = false;
|
||||
var codeMirrorConfig = {
|
||||
lineNumbers: true,
|
||||
theme: 'dracula',
|
||||
matchBrackets: true,
|
||||
indentUnit : 4,
|
||||
tabSize : 4,
|
||||
smartIndent: true,
|
||||
extraKeys: {
|
||||
'Shift-Tab': function (cm) {
|
||||
if (cm.somethingSelected()) {
|
||||
cm.indentSelection('subtract');
|
||||
} else {
|
||||
cm.indentLine(cm.getCursor().line, "subtract");
|
||||
}
|
||||
return;
|
||||
},
|
||||
}
|
||||
};
|
||||
|
||||
function closeBox() {
|
||||
parent.layer.close(parent.layer.getFrameIndex(window.name));
|
||||
}
|
||||
|
||||
function initPreview(code) {
|
||||
if(!isPreview) {
|
||||
return;
|
||||
}
|
||||
$('#previewCode').attr('srcdoc', code);
|
||||
}
|
||||
|
||||
function initFormHtml(value) {
|
||||
var editor = CodeMirror.fromTextArea(document.getElementById('printPageCode'), codeMirrorConfig);
|
||||
editor.setValue(value);
|
||||
editor.setSize('100%', win.height() - 65);
|
||||
editor.on('change', function(self, changeValue) {
|
||||
$('#printPageCode').val(self.getValue());
|
||||
if(previewTimeout) {
|
||||
clearTimeout(previewTimeout);
|
||||
}
|
||||
previewTimeout = setTimeout(function() {
|
||||
initPreview(self.getValue());
|
||||
}, 1000);
|
||||
});
|
||||
$('#previewCode').height(win.height() - 65);
|
||||
}
|
||||
|
||||
// 初始化
|
||||
function initData() {
|
||||
var loadLayerIndex;
|
||||
top.restAjax.get(top.restAjax.path('api/form/get-print-page-code/code/{formCode}/version/{formVersion}', [formCode, formVersion]), {}, null, function(code, data) {
|
||||
form.val('dataForm', {
|
||||
printPageCode: data.printPageCode,
|
||||
});
|
||||
form.render(null, 'dataForm');
|
||||
|
||||
initFormHtml(data.printPageCode);
|
||||
}, function(code, data) {
|
||||
top.dialog.msg(data.msg);
|
||||
}, function() {
|
||||
loadLayerIndex = top.dialog.msg(top.dataMessage.loading, {icon: 16, time: 0, shade: 0.3});
|
||||
}, function() {
|
||||
top.dialog.close(loadLayerIndex);
|
||||
});
|
||||
}
|
||||
initData();
|
||||
|
||||
// 提交表单
|
||||
form.on('submit(submitForm)', function(formData) {
|
||||
top.dialog.confirm(top.dataMessage.commit, function(index) {
|
||||
top.dialog.close(index);
|
||||
var loadLayerIndex;
|
||||
top.restAjax.put(top.restAjax.path('api/form/update-print-page-code/{formId}', [formId]), formData.field, null, function(code, data) {
|
||||
var layerIndex = top.dialog.msg(top.dataMessage.commitSuccess, {
|
||||
time: 0,
|
||||
btn: [top.dataMessage.button.yes, top.dataMessage.button.no],
|
||||
shade: 0.3,
|
||||
yes: function(index) {
|
||||
top.dialog.close(index);
|
||||
window.location.reload();
|
||||
},
|
||||
btn2: function() {
|
||||
closeBox();
|
||||
}
|
||||
});
|
||||
}, function(code, data) {
|
||||
top.dialog.msg(data.msg);
|
||||
}, function() {
|
||||
loadLayerIndex = top.dialog.msg(top.dataMessage.committing, {icon: 16, time: 0, shade: 0.3});
|
||||
}, function() {
|
||||
top.dialog.close(loadLayerIndex);
|
||||
});
|
||||
});
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.close').on('click', function() {
|
||||
closeBox();
|
||||
});
|
||||
|
||||
$('#previewBtn').on('click', function() {
|
||||
if(isPreview) {
|
||||
$('#codeBox').attr('class', 'layui-col-md12 layui-col-xs12');
|
||||
$('#previewBox').hide();
|
||||
} else {
|
||||
$('#codeBox').attr('class', 'layui-col-md8 layui-col-xs8');
|
||||
$('#previewBox').attr('class', 'layui-col-md4 layui-col-xs4');
|
||||
$('#previewBox').show();
|
||||
}
|
||||
isPreview = !isPreview;
|
||||
initPreview($('#printPageCode').val());
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
@ -126,6 +126,14 @@
|
||||
'</div>';
|
||||
}
|
||||
},
|
||||
|
||||
{field:'printPageCode', width:100, title: '打印代码', align:'center',
|
||||
templet: function(item) {
|
||||
return '<div class="layui-btn-group">' +
|
||||
'<button class="layui-btn layui-btn-xs" lay-event="printPageCodeEvent">打印页面</button>' +
|
||||
'</div>';
|
||||
}
|
||||
},
|
||||
{field:'appPageCode', width:220, title: 'APP端代码', align:'center',
|
||||
templet: function(item) {
|
||||
return '<div class="layui-btn-group">' +
|
||||
@ -285,6 +293,15 @@
|
||||
onClose: function () {
|
||||
}
|
||||
})
|
||||
} else if(event === 'printPageCodeEvent') {
|
||||
top.dialog.open({
|
||||
title: '打印页面模板',
|
||||
url: top.restAjax.path('route/form/get-print-page-code?formId={formId}&formCode={formCode}&formVersion={formVersion}', [data.formId, data.formCode, data.formVersion]),
|
||||
width: '99%',
|
||||
height: '99%',
|
||||
onClose: function () {
|
||||
}
|
||||
})
|
||||
} else if(event === 'appSavePageCodeEvent') {
|
||||
top.dialog.open({
|
||||
title: 'APP新增页面模板',
|
||||
|
@ -0,0 +1,32 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<base href="${r'${contextPath}'}"/>
|
||||
<meta charset="utf-8">
|
||||
<title>${r'${formName}'}</title>
|
||||
<meta name="renderer" content="webkit">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
||||
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
|
||||
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
|
||||
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
|
||||
<style>
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="layui-anim layui-anim-fadein">
|
||||
|
||||
</div>
|
||||
<script src="assets/layuiadmin/layui/layui.js"></script>
|
||||
<script>
|
||||
layui.config({
|
||||
base: 'assets/layuiadmin/'
|
||||
}).extend({
|
||||
index: 'lib/index'
|
||||
}).use(['index'], function () {
|
||||
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user