Browse Source

Fixed feature management UI failing to validate numeric types

pull/216/head
cKey 5 years ago
parent
commit
bbb6d7d5b4
  1. 1
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/Permissions/AbpOssManagementPermissionDefinitionProvider.cs
  2. BIN
      aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/event-bus-cap.db
  3. 2
      vueJs/src/api/feature-management.ts
  4. 53
      vueJs/src/views/admin/components/FeatureManagement.vue
  5. 38
      vueJs/src/views/oss-management/index.vue

1
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/Permissions/AbpOssManagementPermissionDefinitionProvider.cs

@ -17,6 +17,7 @@ namespace LINGYUN.Abp.OssManagement.Permissions
var ossobject = ossManagement.AddPermission(AbpOssManagementPermissions.OssObject.Default, L("Permission:OssObject")); var ossobject = ossManagement.AddPermission(AbpOssManagementPermissions.OssObject.Default, L("Permission:OssObject"));
ossobject.AddChild(AbpOssManagementPermissions.OssObject.Create, L("Permission:Create")); ossobject.AddChild(AbpOssManagementPermissions.OssObject.Create, L("Permission:Create"));
ossobject.AddChild(AbpOssManagementPermissions.OssObject.Delete, L("Permission:Delete")); ossobject.AddChild(AbpOssManagementPermissions.OssObject.Delete, L("Permission:Delete"));
ossobject.AddChild(AbpOssManagementPermissions.OssObject.Download, L("Permission:Download"));
} }
private static LocalizableString L(string name) private static LocalizableString L(string name)

BIN
aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/event-bus-cap.db

Binary file not shown.

2
vueJs/src/api/feature-management.ts

@ -32,7 +32,7 @@ export class ValueType {
export class Feature { export class Feature {
name!: string name!: string
displayName?: string displayName?: string
value!: string value!: any
description?: string description?: string
valueType?: ValueType valueType?: ValueType
depth?: number depth?: number

53
vueJs/src/views/admin/components/FeatureManagement.vue

@ -36,8 +36,7 @@
v-if="feature.valueType.name === 'ToggleStringValueType'" v-if="feature.valueType.name === 'ToggleStringValueType'"
> >
<el-switch <el-switch
:value="getBooleanValue(feature.value)" v-model="feature.value"
@change="(value) => handleValueChanged(feature, value)"
/> />
</div> </div>
<div <div
@ -46,7 +45,9 @@
<el-input <el-input
v-if="feature.valueType.validator.name === 'NUMERIC'" v-if="feature.valueType.validator.name === 'NUMERIC'"
v-model.number="feature.value" v-model.number="feature.value"
@change="(value) => handleValueChanged(feature, value)" :min="feature.valueType.validator.properties.MinValue"
:max="feature.valueType.validator.properties.MaxValue"
type="number"
/> />
<el-input <el-input
v-else v-else
@ -122,15 +123,9 @@ import { ElForm } from 'element-ui/types/form'
const featureRules: {[key: string]: any}[] = new Array<{[key: string]: any}>() const featureRules: {[key: string]: any}[] = new Array<{[key: string]: any}>()
if (validator.name === 'NUMERIC' && validator.properties) { if (validator.name === 'NUMERIC' && validator.properties) {
const ruleRang: {[key: string]: any} = {} const ruleRang: {[key: string]: any} = {}
// TODO: ruleRang.type = 'number'
// ruleRang.min = validator.properties.MinValue
// 使form-itemrules ruleRang.max = validator.properties.MaxValue
// TODO...
ruleRang.pattern = RegExp('^[^' + validator.properties.MinValue + ']\\d{0,4}$|^' + validator.properties.MaxValue + '$')
// ruleRang.pattern = ^\d{0,11}$
// ruleRang.type = 'number'
// ruleRang.min = validator.properties.MinValue
// ruleRang.max = validator.properties.MaxValue
ruleRang.trigger = 'blur' ruleRang.trigger = 'blur'
ruleRang.message = localizer('AbpFeatureManagement.ThisFieldMustBeBetween{0}And{1}', { 0: validator.properties.MinValue, 1: validator.properties.MaxValue }) ruleRang.message = localizer('AbpFeatureManagement.ThisFieldMustBeBetween{0}And{1}', { 0: validator.properties.MinValue, 1: validator.properties.MaxValue })
featureRules.push(ruleRang) featureRules.push(ruleRang)
@ -196,19 +191,24 @@ export default class extends Vue {
*/ */
private featureGroups = new FeatureGroups() private featureGroups = new FeatureGroups()
get numericValue() {
return (gi: number, fi: number) => {
if (this.featureGroups) {
return Number(this.featureGroups.groups[gi].features[fi].value)
}
return 0
}
}
mounted() { mounted() {
this.handleGetFeatures() this.handleGetFeatures()
} }
@Watch('providerKey') @Watch('loadFeature')
onProviderKeyChanged() { onProviderKeyChanged() {
this.handleGetFeatures() this.handleGetFeatures()
} }
private handleValueChanged(feature: Feature, value: any) {
feature.value = String(value)
}
/** /**
* 重置表单数据 * 重置表单数据
*/ */
@ -226,6 +226,22 @@ export default class extends Vue {
.getFeatures(this.providerName, this.providerKey) .getFeatures(this.providerName, this.providerKey)
.then(res => { .then(res => {
this.featureGroups = res this.featureGroups = res
// , ,
this.featureGroups
.groups
.forEach(group => {
group.features
.forEach(feature => {
switch (feature.valueType?.validator.name) {
case 'BOOLEAN' :
feature.value = feature.value === 'true'
break
case 'NUMERIC' :
feature.value = Number(feature.value)
break
}
})
})
if (this.featureGroups.groups.length > 0) { if (this.featureGroups.groups.length > 0) {
this.selectTab = this.featureGroups.groups[0].name this.selectTab = this.featureGroups.groups[0].name
} }
@ -245,7 +261,8 @@ export default class extends Vue {
this.featureGroups.groups.forEach(group => { this.featureGroups.groups.forEach(group => {
group.features.forEach(feature => { group.features.forEach(feature => {
if (feature.valueType != null) { if (feature.valueType != null) {
updateFeatures.features.push(new Feature(feature.name, feature.value)) // string
updateFeatures.features.push(new Feature(feature.name, String(feature.value)))
} }
}) })
}) })

38
vueJs/src/views/oss-management/index.vue

@ -118,6 +118,7 @@
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
v-permission="['AbpOssManagement.OssObject']"
:label="$t('global.operaActions')" :label="$t('global.operaActions')"
align="center" align="center"
width="200" width="200"
@ -125,21 +126,20 @@
> >
<template slot-scope="{row}"> <template slot-scope="{row}">
<el-button <el-button
v-permission="['AbpOssManagement.FileSystem.FileManager']"
size="mini" size="mini"
type="success" type="success"
icon="el-icon-tickets" icon="el-icon-tickets"
@click="handleShowOssObject(row)" @click="handleShowOssObject(row)"
/> />
<el-button <el-button
v-permission="[row.isFolder ? 'AbpFileManagement.FileSystem.Delete' : 'AbpFileManagement.FileSystem.FileManager.Delete']" v-permission="['AbpOssManagement.OssObject.Delete']"
size="mini" size="mini"
type="danger" type="danger"
icon="el-icon-delete" icon="el-icon-delete"
@click="handleDeleteOssObject(row)" @click="handleDeleteOssObject(row)"
/> />
<el-button <el-button
v-permission="['AbpFileManagement.FileSystem.FileManager.Download']" v-permission="['AbpOssManagement.OssObject.Download']"
:disabled="row.isFolder" :disabled="row.isFolder"
size="mini" size="mini"
type="info" type="info"
@ -293,6 +293,8 @@ export default class OssManagement extends Vue {
private onBucketChanged(bucket: string) { private onBucketChanged(bucket: string) {
this.bucket = bucket this.bucket = bucket
this.fileSystemRoot.length = 1
this.getObjectRequest.prefix = ''
this.handleClearObjects() this.handleClearObjects()
this.handleGetObjects() this.handleGetObjects()
} }
@ -378,9 +380,33 @@ export default class OssManagement extends Vue {
event.preventDefault() event.preventDefault()
$contextmenu({ $contextmenu({
items: [ items: [
{
label: '创建容器',
disabled: !checkPermission(['AbpOssManagement.Container.Create']),
onClick: () => {
this.$prompt(this.$t('global.pleaseInputBy', { key: this.$t('fileSystem.name') }).toString(),
'创建容器', {
showInput: true,
inputValidator: (val) => {
return !(!val || val.length === 0)
},
inputErrorMessage: '名称必须输入',
inputPlaceholder: this.$t('global.pleaseInputBy', { key: this.$t('fileSystem.name') }).toString()
}).then((val: any) => {
const name = val.value + '/'
OssManagerApi
.createBucket(name.replace('//', '/'))
.then(() => {
this.$message.success(this.l('successful'))
this.handleGetBuckets()
this.handleGetObjects()
})
}).catch(_ => _)
}
},
{ {
label: this.$t('fileSystem.addFolder'), label: this.$t('fileSystem.addFolder'),
disabled: !checkPermission(['AbpFileManagement.FileSystem.Create']), disabled: !checkPermission(['AbpOssManagement.OssObject.Create']),
onClick: () => { onClick: () => {
this.$prompt(this.$t('global.pleaseInputBy', { key: this.$t('fileSystem.name') }).toString(), this.$prompt(this.$t('global.pleaseInputBy', { key: this.$t('fileSystem.name') }).toString(),
this.$t('fileSystem.addFolder').toString(), { this.$t('fileSystem.addFolder').toString(), {
@ -405,7 +431,7 @@ export default class OssManagement extends Vue {
}, },
{ {
label: this.$t('fileSystem.upload'), label: this.$t('fileSystem.upload'),
disabled: !checkPermission(['AbpFileManagement.FileSystem.FileManager.Create']), disabled: !checkPermission(['AbpOssManagement.OssObject.Create']),
onClick: () => { onClick: () => {
this.uploadPath = this.getCurrentPath() this.uploadPath = this.getCurrentPath()
this.showUploadOss = true this.showUploadOss = true
@ -414,7 +440,7 @@ export default class OssManagement extends Vue {
}, },
{ {
label: this.$t('fileSystem.bacthDelete'), label: this.$t('fileSystem.bacthDelete'),
disabled: !checkPermission(['AbpFileManagement.FileSystem.FileManager.Delete']), disabled: !checkPermission(['AbpOssManagement.OssObject.Delete']),
onClick: () => { onClick: () => {
// //
const table = this.$refs.ossObjectTable as any const table = this.$refs.ossObjectTable as any

Loading…
Cancel
Save