Подсказка external_id из уже увиденных устройств при добавлении
Поле External ID при создании/изменении устройства теперь input+datalist: можно вписать значение вручную (как раньше) или выбрать из подсказок — идентификаторы устройств, от которых device-control-service уже получал MQTT-телеметрию/ack (Redis-множество devices:known), но которые ещё не зарегистрированы в Postgres. Уже зарегистрированные id из списка подсказок исключаются. DeviceShadow::knownExternalIds() — новый read-метод (SMEMBERS devices:known), зеркалит то же множество, что Go-сервисы уже читают/ пишут для health-check/online-детекции.
This commit is contained in:
@@ -5,6 +5,7 @@ import Form from '@/Pages/Devices/Form.vue';
|
||||
defineProps({
|
||||
zones: { type: Array, required: true },
|
||||
deviceTypes: { type: Array, required: true },
|
||||
unregisteredExternalIds: { type: Array, default: () => [] },
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -17,7 +18,7 @@ defineProps({
|
||||
<div class="py-12">
|
||||
<div class="max-w-xl mx-auto sm:px-6 lg:px-8">
|
||||
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg p-6">
|
||||
<Form :zones="zones" :device-types="deviceTypes" />
|
||||
<Form :zones="zones" :device-types="deviceTypes" :unregistered-external-ids="unregisteredExternalIds" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -6,6 +6,7 @@ defineProps({
|
||||
device: { type: Object, required: true },
|
||||
zones: { type: Array, required: true },
|
||||
deviceTypes: { type: Array, required: true },
|
||||
unregisteredExternalIds: { type: Array, default: () => [] },
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -18,7 +19,7 @@ defineProps({
|
||||
<div class="py-12">
|
||||
<div class="max-w-xl mx-auto sm:px-6 lg:px-8">
|
||||
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg p-6">
|
||||
<Form :device="device" :zones="zones" :device-types="deviceTypes" />
|
||||
<Form :device="device" :zones="zones" :device-types="deviceTypes" :unregistered-external-ids="unregisteredExternalIds" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -6,6 +6,7 @@ const props = defineProps({
|
||||
device: { type: Object, default: null },
|
||||
zones: { type: Array, required: true },
|
||||
deviceTypes: { type: Array, required: true },
|
||||
unregisteredExternalIds: { type: Array, default: () => [] },
|
||||
});
|
||||
|
||||
const isEdit = !!props.device;
|
||||
@@ -76,9 +77,17 @@ function submit() {
|
||||
id="external_id"
|
||||
v-model="form.external_id"
|
||||
type="text"
|
||||
list="unregistered-external-ids"
|
||||
required
|
||||
placeholder="можно ввести вручную или выбрать увиденное устройство"
|
||||
class="mt-1 block w-full font-mono border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm"
|
||||
>
|
||||
<datalist id="unregistered-external-ids">
|
||||
<option v-for="id in unregisteredExternalIds" :key="id" :value="id" />
|
||||
</datalist>
|
||||
<p v-if="unregisteredExternalIds.length" class="mt-1 text-xs text-gray-400">
|
||||
От {{ unregisteredExternalIds.length }} {{ unregisteredExternalIds.length === 1 ? 'устройства' : 'устройств' }} уже приходил сигнал, но они ещё не зарегистрированы — начните вводить, чтобы увидеть подсказки.
|
||||
</p>
|
||||
<div v-if="form.errors.external_id" class="mt-2 text-sm text-red-600">{{ form.errors.external_id }}</div>
|
||||
</div>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user