Resolving place in edit form.
This commit is contained in:
parent
f8aa903817
commit
2c49e0f9fe
2
common
2
common
|
@ -1 +1 @@
|
|||
Subproject commit 3bf8ce6e23a1c6c4c909b1a56b201903bad5b26e
|
||||
Subproject commit 1122b4198f2c5bc27f9f4e3f3aedea6c81f09ba1
|
|
@ -230,6 +230,10 @@ const timeline = computed(() => {
|
|||
font-weight: bold;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
&:before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -54,6 +54,7 @@
|
|||
"redis": "^4.6.12",
|
||||
"sharp": "^0.32.6",
|
||||
"sirv": "^2.0.3",
|
||||
"unprint": "^0.14.1",
|
||||
"video.js": "^8.10.0",
|
||||
"vike": "^0.4.150",
|
||||
"vite": "^4.5.1",
|
||||
|
|
|
@ -706,8 +706,11 @@
|
|||
@change="(checked) => apply = checked"
|
||||
/>
|
||||
|
||||
<Ellipsis v-if="submitting" />
|
||||
|
||||
<!-- we don't want the return key to submit the form -->
|
||||
<button
|
||||
v-else
|
||||
class="button button-primary"
|
||||
type="button"
|
||||
:disabled="editing.size === 0"
|
||||
|
@ -728,6 +731,7 @@ import { format } from 'date-fns';
|
|||
|
||||
import Avatar from '#/components/edit/avatar.vue';
|
||||
import Checkbox from '#/components/form/checkbox.vue';
|
||||
import Ellipsis from '#/components/loading/ellipsis.vue';
|
||||
|
||||
import {
|
||||
// get,
|
||||
|
@ -965,6 +969,7 @@ const editing = ref(new Set());
|
|||
const edits = ref(Object.fromEntries(fields.value.map((field) => [field.key, field.value])));
|
||||
const comment = ref(null);
|
||||
const apply = ref(user.role !== 'user');
|
||||
const submitting = ref(false);
|
||||
const submitted = ref(false);
|
||||
|
||||
const sizeUnits = ref('metric');
|
||||
|
@ -1006,6 +1011,8 @@ const groupMap = {
|
|||
|
||||
async function submit() {
|
||||
try {
|
||||
submitting.value = true;
|
||||
|
||||
await post('/revisions/actors', {
|
||||
actorId: actor.value.id,
|
||||
edits: {
|
||||
|
@ -1041,6 +1048,7 @@ async function submit() {
|
|||
appendErrorMessage: true,
|
||||
});
|
||||
|
||||
submitting.value = false;
|
||||
editing.value = new Set();
|
||||
edits.value = {};
|
||||
comment.value = null;
|
||||
|
|
|
@ -5,9 +5,11 @@ import { MerkleJson } from 'merkle-json';
|
|||
import moment from 'moment';
|
||||
import omit from 'object.omit';
|
||||
import convert from 'convert';
|
||||
import unprint from 'unprint';
|
||||
|
||||
import initLogger from './logger.js';
|
||||
import { knexOwner as knex, knexManticore } from './knex.js';
|
||||
import redis from './redis.js';
|
||||
import { utilsApi } from './manticore.js';
|
||||
import { HttpError } from './errors.js';
|
||||
import { fetchCountriesByAlpha2 } from './countries.js';
|
||||
|
@ -18,6 +20,7 @@ import escape from '../utils/escape-manticore.js';
|
|||
import slugify from '../utils/slugify.js';
|
||||
import { curateRevision } from './revisions.js';
|
||||
import { interpolateProfiles } from '../common/actors.mjs'; // eslint-disable-line import/namespace
|
||||
import { resolvePlace } from '../common/geo.mjs'; // eslint-disable-line import/namespace
|
||||
|
||||
const logger = initLogger();
|
||||
const mj = new MerkleJson();
|
||||
|
@ -816,14 +819,48 @@ export async function createActorRevision(actorId, {
|
|||
return [key, values];
|
||||
}).filter(Boolean));
|
||||
|
||||
const deltas = Object.entries(edits).map(([key, value]) => {
|
||||
const deltas = await Promise.all(Object.entries(edits).map(async ([key, value]) => {
|
||||
if (baseActor[key] === value || typeof value === 'undefined') {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (['originPlace', 'residencePlay'].includes(key)) {
|
||||
console.log(key, value);
|
||||
throw new Error('must be converted first!');
|
||||
if (['originPlace', 'residencePlace'].includes(key)) {
|
||||
if (!value) {
|
||||
return [
|
||||
// { key: key.includes('origin') ? 'originCountry' : 'residenceCountry', value: null },
|
||||
{ key: key.includes('origin') ? 'originState' : 'residenceState', value: null },
|
||||
{ key: key.includes('origin') ? 'originCity' : 'residenceCity', value: null },
|
||||
];
|
||||
}
|
||||
|
||||
const resolvedLocation = await resolvePlace(value, {
|
||||
knex,
|
||||
redis,
|
||||
logger,
|
||||
slugify,
|
||||
unprint,
|
||||
}, {
|
||||
userAgent: 'contact via https://traxxx.me/',
|
||||
});
|
||||
|
||||
if (!resolvedLocation) {
|
||||
throw new Error(`Failed to resolve ${key} ${value}`);
|
||||
}
|
||||
|
||||
return [
|
||||
{
|
||||
key: key.includes('origin') ? 'originCountry' : 'residenceCountry',
|
||||
value: resolvedLocation.country,
|
||||
},
|
||||
{
|
||||
key: key.includes('origin') ? 'originState' : 'residenceState',
|
||||
value: resolvedLocation.state,
|
||||
},
|
||||
{
|
||||
key: key.includes('origin') ? 'originCity' : 'residenceCity',
|
||||
value: resolvedLocation.city,
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
if (['cup', 'bust', 'waist', 'hip'].includes(key)) {
|
||||
|
@ -902,7 +939,7 @@ export async function createActorRevision(actorId, {
|
|||
}
|
||||
|
||||
return { key, value };
|
||||
}).filter(Boolean);
|
||||
})).then((rawDeltas) => rawDeltas.flat().filter(Boolean));
|
||||
|
||||
const deltaComments = deltas.map((delta) => delta.comment);
|
||||
const curatedComment = [comment, ...deltaComments].filter(Boolean).join(' | ');
|
||||
|
|
Loading…
Reference in New Issue