ui-editor-page, hmmm

This commit is contained in:
2021-12-27 11:32:58 +01:00
parent 0d14ff8622
commit 67f0b336cd
12 changed files with 127 additions and 226 deletions
+18 -3
View File
@@ -53,9 +53,24 @@ public class UsersController : ZeroApiController
//public virtual Task<ActionResult<Result>> Create(ZeroUser saveModel) => CreateModel(saveModel);
//[HttpPut("{id}")]
//[ZeroAuthorize(UserPermissions.Update)]
//public virtual Task<ActionResult<Result>> Update(string id, ZeroUser updateModel, [FromQuery] string changeToken = null) => UpdateModel(id, updateModel, changeToken);
[HttpPut("{id}")]
[ZeroAuthorize(UserPermissions.Update)]
public virtual async Task<ActionResult<Result>> Update(string id, ZeroUser updateModel, [FromQuery] string changeToken = null)
{
if (id != updateModel.Id)
{
return BadRequest(Result.Fail(nameof(id), "@errors.onupdate.noidmatch"));
}
Result<ZeroUser> result = await Users.Save(updateModel);
if (Hints.ResponsePreference == ApiResponsePreference.Minimal)
{
return result.WithoutModel();
}
return result;
}
//[HttpDelete("{id}")]
@@ -53,10 +53,10 @@
}),
watch: {
'$route': function ()
{
this.$emit('load', this);
},
//'$route': function (val)
//{
// this.$emit('load', this);
//},
state(val)
{
this.slotProps.state = val;
@@ -6,4 +6,5 @@ export default function (app: App)
app.component('ui-editor', defineAsyncComponent(() => import('./ui-editor.vue')));
app.component('ui-editor-infos', defineAsyncComponent(() => import('./ui-editor-infos.vue')));
app.component('ui-editor-header', defineAsyncComponent(() => import('./ui-editor-header.vue')));
app.component('ui-editor-page', defineAsyncComponent(() => import('./ui-editor-page.vue')));
};
@@ -0,0 +1,87 @@
<template>
<ui-form ref="form" class="editor-page" v-slot="form" @submit="onSubmit" @load="onLoad" :route="route">
<ui-form-header v-model:value="model" :prefix="prefix" :title="title" :disabled="disabled" :is-create="!id" :state="form.state" :can-delete="meta.canDelete" @delete="onDelete" />
<ui-editor :config="editor" v-model="model" :meta="meta" :disabled="disabled" :scope="true">
<template v-slot:below>
<ui-editor-infos v-model="model" :disabled="disabled" />
</template>
</ui-editor>
</ui-form>
</template>
<script>
import { defineComponent } from 'vue';
export default defineComponent({
name: 'uiEditorPage',
props: {
api: {
type: Object,
required: true
},
editor: {
type: String,
required: true
},
title: {
type: String,
required: true
},
id: {
type: String,
required: false
},
prefix: {
type: String,
required: false
},
route: {
type: String,
required: false
}
},
computed: {
id()
{
return this.$route.params.id;
}
},
data: () => ({
meta: {},
model: {},
disabled: false
}),
methods: {
async onLoad(form)
{
var config = { system: this.$route.query['zero.scope'] == 'system' };
const response = await form.load(() => this.id ? this.api.getById(this.id, undefined, config) : this.api.getEmpty(this.$route.query['zero.flavor'], config));
this.model = response;
},
async onSubmit(form)
{
var config = { system: this.$route.query['zero.scope'] == 'system' };
const response = this.id ? await this.api.update(this.model, config) : await this.api.create(this.model, config);
await form.handle(response);
},
onDelete(item, opts)
{
opts.hide();
var config = { system: this.$route.query['zero.scope'] == 'system' };
this.$refs.form.onDelete(this.api.delete.bind(this, this.id, config));
}
}
})
</script>
@@ -1,57 +1,11 @@
<template>
<ui-form ref="form" class="country" v-slot="form" @submit="onSubmit" @load="onLoad" :route="route">
<ui-form-header v-model:value="model" prefix="@country.list" title="@country.name" :disabled="disabled" :is-create="!id" :state="form.state" :can-delete="meta.canDelete" @delete="onDelete" />
<ui-editor config="countries:edit" v-model="model" :meta="meta" :disabled="disabled">
<template v-slot:below>
<ui-editor-infos v-model="model" :disabled="disabled" />
</template>
</ui-editor>
</ui-form>
<ui-editor-page :api="api" editor="countries:edit" title="@country.name" prefix="@country.list" route="countries-edit" />
</template>
<script>
import api from './api';
export default {
props: ['id'],
data: () => ({
meta: {},
model: { name: null, features: [], domains: [] },
route: 'countries-edit',
disabled: false
}),
methods: {
async onLoad(form)
{
const response = await form.load(() => this.id ? api.getById(this.id) : api.getEmpty(this.$route.query['zero.flavor']));
this.model = response;
},
async onSubmit(form)
{
const response = this.id ? await api.update(this.model) : await api.create(this.model);
await form.handle(response);
},
onDelete(item, opts)
{
opts.hide();
this.$refs.form.onDelete(api.delete.bind(this, this.id));
}
}
data: () => ({ api })
}
</script>
<style lang="scss">
.country .country-flag-input
{
max-width: 80px;
}
</style>
</script>
@@ -1,50 +1,11 @@
<template>
<ui-form ref="form" class="language" v-slot="form" @submit="onSubmit" @load="onLoad" :route="route">
<ui-form-header v-model:value="model" prefix="@language.list" title="@language.name" :disabled="disabled" :is-create="!id" :state="form.state" :can-delete="meta.canDelete" @delete="onDelete" />
<ui-editor config="languages:edit" v-model="model" :meta="meta" :disabled="disabled" :scope="true">
<template v-slot:below>
<ui-editor-infos v-model="model" :disabled="disabled" />
</template>
</ui-editor>
</ui-form>
<ui-editor-page :api="api" editor="languages:edit" title="@language.name" prefix="@language.list" route="languages-edit" />
</template>
<script>
import api from './api';
export default {
props: ['id'],
data: () => ({
meta: {},
model: { },
route: 'languages-edit',
disabled: false
}),
methods: {
async onLoad(form)
{
var config = { system: this.$route.query['zero.scope'] == 'system' };
const response = await form.load(() => this.id ? api.getById(this.id, undefined, config) : api.getEmpty(this.$route.query['zero.flavor'], config));
this.model = response;
},
async onSubmit(form)
{
const response = this.id ? await api.update(this.model) : await api.create(this.model);
await form.handle(response);
},
onDelete(item, opts)
{
opts.hide();
this.$refs.form.onDelete(api.delete.bind(this, this.id));
}
}
data: () => ({ api })
}
</script>
@@ -1,49 +1,10 @@
<template>
<ui-form ref="form" class="mailtemplate" v-slot="form" @submit="onSubmit" @load="onLoad" :route="route">
<ui-form-header v-model:value="model" prefix="@mailtemplate.list" title="@mailtemplate.name" :disabled="disabled" :is-create="!id" :state="form.state" :can-delete="meta.canDelete" @delete="onDelete" />
<ui-editor config="mailtemplates:edit" v-model="model" :meta="meta" :disabled="disabled">
<template v-slot:below>
<ui-editor-infos v-model="model" :disabled="disabled" />
</template>
</ui-editor>
</ui-form>
<ui-editor-page :api="api" editor="mailtemplates:edit" title="@mailtemplate.name" prefix="@mailtemplate.list" route="mailtemplates-edit" />
</template>
<script>
import api from './api';
export default {
props: ['id'],
data: () => ({
meta: {},
model: { name: null },
route: 'mailtemplates-edit',
disabled: false
}),
methods: {
async onLoad(form)
{
const response = await form.load(() => this.id ? api.getById(this.id) : api.getEmpty(this.$route.query['zero.flavor']));
this.model = response;
},
async onSubmit(form)
{
const response = this.id ? await api.update(this.model) : await api.create(this.model);
await form.handle(response);
},
onDelete(item, opts)
{
opts.hide();
this.$refs.form.onDelete(api.delete.bind(this, this.id));
}
}
data: () => ({ api })
}
</script>
@@ -1,52 +1,10 @@
<template>
<ui-form ref="form" class="translation" v-slot="form" @submit="onSubmit" @load="onLoad" :route="route">
<ui-form-header v-model:value="model" prefix="@translation.list" title="@translation.name" :disabled="disabled" :is-create="!id" :state="form.state" :active-disabled="true" :can-delete="meta.canDelete" @delete="onDelete" />
<ui-editor config="translations:edit" v-model="model" :meta="meta" :disabled="disabled" :scope="true">
<template v-slot:below>
<ui-editor-infos v-model="model" :disabled="disabled" />
</template>
</ui-editor>
</ui-form>
<ui-editor-page :api="api" editor="translations:edit" title="@translation.name" prefix="@translation.list" route="translations-edit" />
</template>
<script>
import api from './api';
export default {
props: ['id'],
data: () => ({
meta: {},
model: { },
route: 'translations-edit',
disabled: false
}),
methods: {
async onLoad(form)
{
var config = { system: this.$route.query['zero.scope'] == 'system' };
const response = await form.load(() => this.id ? api.getById(this.id, undefined, config) : api.getEmpty(this.$route.query['zero.flavor'], config));
this.model = response;
},
async onSubmit(form)
{
var config = { system: this.$route.query['zero.scope'] == 'system' };
const response = this.id ? await api.update(this.model, config) : await api.create(this.model, config);
await form.handle(response);
},
onDelete(item, opts)
{
var config = { system: this.$route.query['zero.scope'] == 'system' };
opts.hide();
this.$refs.form.onDelete(api.delete.bind(this, this.id, config));
}
}
data: () => ({ api })
}
</script>
+1 -1
View File
@@ -10,7 +10,7 @@ export default {
//create: (model: any, config?: ApiRequestConfig) => post('countries', model, config),
//update: (model: any, config?: ApiRequestConfig) => put('countries/' + model.id, model, config),
update: (model: any, config?: ApiRequestConfig) => put('users/' + model.id, model, config),
//delete: (id: string, config?: ApiRequestConfig) => del('countries/' + id, null, config),
+2 -40
View File
@@ -1,49 +1,11 @@
<template>
<ui-form ref="form" class="user" v-slot="form" @submit="onSubmit" @load="onLoad" :route="route">
<ui-form-header v-model:value="model" prefix="@user.users" title="@user.name" :disabled="disabled" :is-create="!id" :state="form.state" :can-delete="meta.canDelete" @delete="onDelete" />
<ui-editor config="users:edit" v-model="model" :meta="meta" :disabled="disabled">
<template v-slot:below>
<ui-editor-infos v-model="model" :disabled="disabled" />
</template>
</ui-editor>
</ui-form>
<ui-editor-page :api="api" editor="users:edit" title="@user.name" prefix="@user.list" route="users-edit" />
</template>
<script>
import api from './api';
export default {
props: ['id'],
data: () => ({
meta: {},
model: { name: null },
route: 'users-edit',
disabled: false
}),
methods: {
async onLoad(form)
{
const response = await form.load(() => this.id ? api.getById(this.id) : api.getEmpty(this.$route.query['zero.flavor']));
this.model = response;
},
async onSubmit(form)
{
const response = this.id ? await api.update(this.model) : await api.create(this.model);
await form.handle(response);
},
onDelete(item, opts)
{
opts.hide();
this.$refs.form.onDelete(api.delete.bind(this, this.id));
}
}
data: () => ({ api })
}
</script>
+4 -3
View File
@@ -62,9 +62,10 @@ public class UserService : IUserService
if (!model.Id.IsNullOrEmpty())
{
ZeroUser origin = await GetUserById(model.Id);
isUpdate = origin != null;
updateSecurityStamp = origin != null && model.PasswordHash != origin.PasswordHash;
// TODO throws "Attempted to associate a different object with id ..."
//ZeroUser origin = await GetUserById(model.Id);
isUpdate = true; // origin != null;
updateSecurityStamp = true; // origin != null && model.PasswordHash != origin.PasswordHash;
}
Result<ZeroUser> result = isUpdate ? await Operations.Update(model) : await Operations.Create(model);
+1
View File
@@ -3,6 +3,7 @@
"Logging": {
"LogLevel": {
"Default": "Information",
"zero": "Debug",
"Microsoft.AspNetCore": "Warning"
}
}