Загрузка данных


Порядок типов операций и перевод должен быть соблюден по таблице:

RU	US
Все	All
Вход	Entrance
Выход	Exit
Регистрация пользователя	User registration
Обновление пользователя	User update
Удаление пользователя	User delete
Создание контроллера	Controller create
Обновление контроллера	Controller update
Удаление контроллера	Controller delete
Создание модели контроллера	Controller model create
Обновление модели контроллера	Controller model update
Удаление модели контроллера	Controller model delete
Создание типа контроллера	Controller type create
Обновление типа контроллера	Controller type update
Удаление типа контроллера	Controller type delete
Создание устройства	Device create
Обновление устройства	Device update
Удаление устройства	Device delete
Создание типа устройства	Device type create
Обновление типа устройства	Device type update
Удаление типа устройства	Device type delete
Создание модели устройства	Device model create
Обновление модели устройства	Device model update
Удаление модели устройства	Device model delete
Создание самостоятельного сетевого устройства	Independent network device create
Обновление самостоятельного сетевого устройства	Independent network device update
Удаление самостоятельного сетевого устройства	Independent network device delete
Создание панели SmartRoom	Panel Smartroom create
Обновление панели SmartRoom	Panel Smartroom update
Удаление панели SmartRoom	Panel Smartroom delete
Создание типа панели SmartRoom	Panel Smartroom type create
Обновление типа панели SmartRoom	Panel Smartroom type update
Удаление типа панели SmartRoom	Panel Smartroom type delete
Создание модели панели SmartRoom	Panel Smartroom model create
Обновление модели панели SmartRoom	Panel Smartroom model update
Удаление модели панели SmartRoom	Panel Smartroom model delete
Создание самостоятельного несетевого устройства	Independent non-network device create
Обновление самостоятельного несетевого устройства	Independent non-network device update
Удаление самостоятельного несетевого устройства	Independent non-network device delete
Создание локации	Location create
Обновление локации	Location update
Удаление локации	Location delete
Создание заметки локации	Location note create
Обновление заметки локации	Location note update
Удаление заметки локации	Location note delete
Создание заявки для локации	Location request create
Обновление заявки для локации	Location request update
Удаление заявки для локации	Location request delete 
Архивирование заявки для локации	Location request archive
Обновление сервисного статуса локации	Location service status update
Добавление владельца локации	Location owner add
Удаление владельца локации	Location owner delete
Перевод локации в учет	Transfer location to accounting
Вывод локации из учета	Removing location from accounting
Перевод оборудования в учет	Transfer equipment to accounting
Вывод оборудования из учета	Removing equipment from accounting
Создание производителя	Manufacturer create
Обновление производителя	Manufacturer update
Удаление производителя	Manufacturer delete
Создание подрядчика	Contractor create
Обновление подрядчика	Contractor update
Удаление подрядчика	Contractor delete
Создание имени интерфейса	Interface name create
Обновление имени интерфейса	Interface name update
Удаление имени интерфейса	Interface name delete
Создание значения интерфейса	Interface value create
Обновление значения интерфейса	Interface value update
Удаление значения интерфейса	Interface value delete
Прочтение уведомления	Notification read
Прочтение всех уведомлений	All notifications read
Архивирование уведомления	Notification archive
Архивирование всех уведомлений	All notification archive
Вывод из статуса "Нестабильно"	Removing the "Unstable" status
Открытия окна аутентификации	Opening the authentication window
Добавление токена оборудования	Equipment token add
Обновление токена оборудования	Equipment token update
Удаление токена оборудования	Equipment token delete



en/audit.json
{
  "sign_in": "Sign in",
  "log_out": "Log out",
  "user_register": "User registration",
  "user_update": "User update",
  "user_delete": "User delete",
  "manufacturer_create": "Manufacturer create",
  "manufacturer_update": "Manufacturer update",
  "manufacturer_delete": "Manufacturer delete",
  "controller_create": "Controller create",
  "controller_update": "Controller update",
  "controller_delete": "Controller delete",
  "controller_model_create": "Controller model create",
  "controller_model_update": "Controller model update",
  "controller_model_delete": "Controller model delete",
  "controller_type_create": "Controller type create",
  "controller_type_update": "Controller type update",
  "controller_type_delete": "Controller type delete",
  "device_create": "Device create",
  "device_update": "Device update",
  "device_delete": "Device delete",
  "device_type_create": "Device type create",
  "device_type_update": "Device type update",
  "device_type_delete": "Device type delete",
  "device_model_create": "Device model create",
  "device_model_update": "Device model update",
  "device_model_delete": "Device model delete",
  "location_create": "Location create",
  "location_update": "Location update",
  "location_delete": "Location delete",
  "location_note_create": "Location note create",
  "location_note_update": "Location note update",
  "location_note_delete": "Location note delete",
  "location_ticket_create": "Location ticket create",
  "location_ticket_update": "Location ticket update",
  "location_ticket_delete": "Location ticket delete",
  "location_ticket_archive": "Location ticket archive",
  "service_status_create": "Location Service Status Update",
  "interface_name_create": "Interface name create",
  "interface_name_update": "Interface name update",
  "interface_name_delete": "Interface name delete",
  "interface_value_create": "Interface value create",
  "interface_value_update": "Interface value update",
  "interface_value_delete": "Interface value delete",
  "contractor_create": "Contractor create",
  "contractor_update": "Contractor update",
  "contractor_delete": "Contractor delete",
  "network_device_create": "Independent Network equipment create",
  "network_device_update": "Independent Network equipment update",
  "network_device_delete": "Independent Network equipment delete",
  "offline_device_create": "Independent Offline equipment create",
  "offline_device_update": "Independent Offline equipment update",
  "offline_device_delete": "Independent Offline equipment delete",
  "notification_archive": "Notification archived",
  "notification_archive_all": "All notifications archived",
  "notification_read": "Notification read",
  "notification_read_all": "All notifications read",
  "equipment_disable": "Equipment disable",
  "equipment_enable": "Equipment enable",
  "location_disable": "Location disable",
  "location_enable": "Location enable",
  "call_start": "Call start",
  "call_end": "Call end",
  "call_start_vip": "VIP call start",
  "call_end_vip": "VIP call end",
  "call_start_common": "Common call start",
  "call_end_common": "Common call end",
  "equipment_token_create": "Equipment token created",
  "equipment_token_update": "Equipment token updated",
  "equipment_token_delete": "Equipment token deleted",
  "equipment_window_create": "Equipment window created",
  "location_owner_add": "Location owner added",
  "location_owner_delete": "Location owner removed",
  "padlet_create": "Panel SmartRoom created",
  "padlet_update": "Panel SmartRoom updated",
  "padlet_delete": "Panel SmartRoom deleted",
  "padlet_type_create": "Panel SmartRoom type created",
  "padlet_type_update": "Panel SmartRoom type updated",
  "padlet_type_delete": "Panel SmartRoom type deleted",
  "padlet_model_create": "Panel SmartRoom model created",
  "padlet_model_update": "Panel SmartRoom model updated",
  "padlet_model_delete": "Panel SmartRoom model deleted",
  "flapping_resolved": "Flapping resolved",

  "call_start": "Start a call from a Skill",
  "call_end": "Ending a call from a Skill",
  "call_start_vip": "Start of a VIP call from SberCom",
  "call_end_vip": "Ending a VIP call from SberCom",
  "call_start_common": "Start of a regular call from SberCom",
  "call_end_common": "Ending a regular call from SberCom",

  "actionType": "Action type",
  "actionDetails": "Action details",

  "sortBy": {
    "status": "by status",
    "created_at": "by date created",
    "updated_at": "by date updated"
  },

  "destination": "Destination",
  "location_id": "Location ID"
}



{
  "sign_in": "Вход",
  "log_out": "Выход",
  "user_register": "Регистрация пользователя",
  "user_update": "Обновление пользователя",
  "user_delete": "Удаление пользователя",
  "manufacturer_create": "Создание производителя",
  "manufacturer_update": "Обновление производителя",
  "manufacturer_delete": "Удаление производителя",
  "controller_create": "Создание контроллера",
  "controller_update": "Обновление контроллера",
  "controller_delete": "Удаления контроллера",
  "controller_model_create": "Создание модели контроллера",
  "controller_model_update": "Обновление модели контроллера",
  "controller_model_delete": "Удаление модели контроллера",
  "controller_type_create": "Создание типа контроллера",
  "controller_type_update": "Обновление типа контроллера",
  "controller_type_delete": "Удаление типа контроллера",
  "device_create": "Создание устройства",
  "device_update": "Обновление устройства",
  "device_delete": "Удаление устройства",
  "device_type_create": "Создание типа устройства",
  "device_type_update": "Обновление типа устройства",
  "device_type_delete": "Удаление типа устройства",
  "device_model_create": "Создание модели устройства",
  "device_model_update": "Обновление модели устройства",
  "device_model_delete": "Удаление модели устройства",
  "location_create": "Создание локации",
  "location_update": "Обновление локации",
  "location_delete": "Удаление локации",
  "location_note_create": "Создание заметки локации",
  "location_note_update": "Обновление заметки локации",
  "location_note_delete": "Удаление заметки локации",
  "location_ticket_create": "Создание заявки для локации",
  "location_ticket_update": "Обновление заявки для локации",
  "location_ticket_delete": "Удаление заявки для локации",
  "location_ticket_archive": "Архивирование заявки для локации",
  "service_status_create": "Обновление сервисного статуса локации",
  "interface_name_create": "Создание имени интерфейса",
  "interface_name_update": "Обновление имени интерфейса",
  "interface_name_delete": "Удаление имени интерфейса",
  "interface_value_create": "Создание значения интерфейса",
  "interface_value_update": "Обновление значения интерфейса",
  "interface_value_delete": "Удаление значения интерфейса",
  "contractor_create": "Создание подрядчика",
  "contractor_update": "Обновление подрядчика",
  "contractor_delete": "Удаление подрядчика",
  "network_device_create": "Создание самостоятельного сетевого устройства",
  "network_device_update": "Обновление самостоятельного сетевого устройства",
  "network_device_delete": "Удаление самостоятельного сетевого устройства",
  "offline_device_create": "Создание самостоятельного несетевого устройства",
  "offline_device_update": "Обновление самостоятельного несетевого устройства",
  "offline_device_delete": "Удаление самостоятельного несетевого устройства",
  "notification_archive": "Архивирование уведомления",
  "notification_archive_all": "Архивирование всех уведомлений",
  "notification_read": "Прочтение уведомления",
  "notification_read_all": "Прочтение всех уведомлений",
  "equipment_disable": "Отключение оборудования",
  "equipment_enable": "Включение оборудования",
  "location_disable": "Отключение локации",
  "location_enable": "Включение локации",
  "call_start": "Начало вызова",
  "call_end": "Завершение вызова",
  "call_start_vip": "Начало VIP-вызова",
  "call_end_vip": "Завершение VIP-вызова",
  "call_start_common": "Начало обычного вызова",
  "call_end_common": "Завершение обычного вызова",
  "equipment_token_create": "Создание токена оборудования",
  "equipment_token_update": "Обновление токена оборудования",
  "equipment_token_delete": "Удаление токена оборудования",
  "equipment_window_create": "Создание окна оборудования",
  "location_owner_add": "Добавление владельца локации",
  "location_owner_delete": "Удаление владельца локации",
  "padlet_create": "Создание панели SmartRoom",
  "padlet_update": "Обновление панели SmartRoom",
  "padlet_delete": "Удаление панели SmartRoom",
  "padlet_type_create": "Создание типа панели SmartRoom",
  "padlet_type_update": "Обновление типа панели SmartRoom",
  "padlet_type_delete": "Удаление типа панели SmartRoom",
  "padlet_model_create": "Создание модели панели SmartRoom",
  "padlet_model_update": "Обновление модели панели SmartRoom",
  "padlet_model_delete": "Удаление модели панели SmartRoom",
  "flapping_resolved": "Колебания состояния устранены",

  "call_start": "Начало вызова из Навыка",
  "call_end": "Завершение вызова из Навыка",
  "call_start_vip": "Начало VIP вызова из SberCom",
  "call_end_vip": "Завершение VIP вызова из SberCom",
  "call_start_common": "Начало обычного вызова из SberCom",
  "call_end_common": "Завершение обычного вызова из SberCom",

  "actionType": "Тип действия",
  "actionDetails": "Детали события",

  "sortBy": {
    "status": "по статусу",
    "created_at": "по дате создания",
    "updated_at": "по дате обновления"
  },

  "destination": "Номер ВКС",
  "location_id": "ID локации"
}


import { AppConsts } from '@/shared';
import {
  Button,
  Column,
  DateTimeField,
  Select,
  TextField,
} from '@/shared/components';
import { SearchSelect } from '@/shared/components/SearchSelect';
import { useTranslation } from 'react-i18next';
import { useAuditSideFilter } from '../controller';

export const AuditSideFilter = () => {
  const { t } = useTranslation('common');

  const {
    searchParams,
    isFetchingUsers,
    userOptions,
    typeOptions,
    smartRoomId,
    smartRoomIdError,

    setSearchUser,
    resetFilters,
    refetchQuery,

    handleChangeTimeFrom,
    handleChange,
    handleChangeTimeMax,
    handleChangeUser,
    handleSmartRoomIdChange,
  } = useAuditSideFilter();

  return (
    <Column minWidth={330} maxWidth={330}>
      <DateTimeField
        label={t('timeFrom')}
        onChange={handleChangeTimeFrom}
        value={searchParams.tmMin && searchParams.tmMin * AppConsts.THOUSAND}
      />
      <DateTimeField
        label={t('timeTo')}
        onChange={handleChangeTimeMax}
        value={searchParams.tmMax && searchParams.tmMax * AppConsts.THOUSAND}
      />

      <Select
        label={t('type')}
        onChange={handleChange('type')}
        options={typeOptions}
        margin='normal'
        value={searchParams.type}
      />

      <SearchSelect
        label={t('user')}
        placeholder={t('user:placeholders.searchByFullName')}
        loading={isFetchingUsers}
        value={searchParams?.userId || ''}
        setValue={setSearchUser}
        options={userOptions}
        margin='normal'
        onChangeCallback={handleChangeUser}
      />

      <Select
        label={t('source')}
        onChange={handleChange('source')}
        value={searchParams.source}
        margin='normal'
        // TO DO backend options
        options={[
          { label: t('common:all'), value: undefined },
          { label: t('monitoring'), value: 'smartroom-monitoring' },
          { label: t('authentication'), value: 'smartroom-auth' },
          {
            label: t('notifications:notifications'),
            value: 'smartroom-notifications',
          },
        ]}
      />

      <TextField
        label='Smartroom ID'
        value={smartRoomId}
        onChange={handleSmartRoomIdChange}
        margin='normal'
        error={smartRoomIdError}
        helperText={
          smartRoomIdError ? t('common:messages.invalidUUIDMessage') : ''
        }
      />

      <Column gridGap={16}>
        <Button onClick={resetFilters} color='error'>
          {t('buttons.reset')}
        </Button>
        <Button onClick={refetchQuery} color='primary'>
          {t('buttons.update')}
        </Button>
      </Column>
    </Column>
  );
};



import { auditRoute } from '@/app/router/routes/audit';
import { AppConsts } from '@/shared';
import {
  useGetApiV1MessageQuery,
  useGetApiV1MessageTypesQuery,
} from '@/shared/api/audit/client';
import {
  useGetUserByIdQuery,
  useGetUsersQuery,
} from '@/shared/api/user/client';
import { RouterConsts } from '@/shared/consts/RouterConsts';
import { useUpdateSearchParams } from '@/shared/hooks';
import { Helpers } from '@/shared/lib';
import { ChangeEvent, useEffect, useMemo, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { AuditLib } from '../../lib/AuditLib';

export const useAuditSideFilter = () => {
  const { t } = useTranslation('common');
  const updateSearchParams = useUpdateSearchParams();
  const searchParams = auditRoute.useSearch();
  const { refetch } = useGetApiV1MessageQuery(searchParams);

  const [searchUser, setSearchUser] = useState('');
  const [smartRoomId, setSmartRoomId] = useState(
    searchParams.smartroomId || '',
  );
  const [smartRoomIdError, setSmartRoomIdError] = useState(false);

  const { data: auditTypesData } = useGetApiV1MessageTypesQuery();
  const { data: usersData, isFetching: isFetchingUsers } = useGetUsersQuery({
    limit: 10,
    sortType: 'asc',
    sortColumn: 'full_name',
    search: searchUser,
  });

  const { data: user } = useGetUserByIdQuery(
    { userId: searchParams.userId ?? '' },
    { skip: false },
  );

  const hasFetchedUser = useRef(false);
  useEffect(() => {
    if (searchParams.userId && user) {
      hasFetchedUser.current = true;
    }
  }, [user, searchParams.userId]);

  const resetPage = () => {
    updateSearchParams({ paramName: 'offset', value: 0 });
  };

  const handleChange =
    (paramName: string) =>
    (event: ChangeEvent<{ name?: string | undefined; value: unknown }>) => {
      const { value } = event.target;

      updateSearchParams({ paramName, value });
      resetPage();
    };

  const handleChangeUser = (value: string) => {
    updateSearchParams({ paramName: 'userId', value });
    resetPage();
  };

  const handleChangeTimeFrom = (time: Date) => {
    const dateMs = new Date(time).getTime() / AppConsts.THOUSAND;
    updateSearchParams({ paramName: 'tmMin', value: dateMs });
    resetPage();
  };

  const handleChangeTimeMax = (time: Date) => {
    const dateMs = new Date(time).getTime() / AppConsts.THOUSAND;
    updateSearchParams({ paramName: 'tmMax', value: dateMs });
    resetPage();
  };

  useEffect(() => {
    const valid = Helpers.isUUID(smartRoomId);
    setSmartRoomIdError(smartRoomId !== '' && !valid);

    if (valid || smartRoomId === '') {
      updateSearchParams({ paramName: 'smartroomId', value: smartRoomId });
      resetPage();
      return;
    }

    updateSearchParams({ paramName: 'smartroomId', value: '' });
  }, [smartRoomId]);

  const handleSmartRoomIdChange = (e: ChangeEvent<HTMLInputElement>) => {
    const value = e.target.value;
    setSmartRoomId(value);
  };

  const typeOptions = useMemo(() => {
    if (!auditTypesData || !Array.isArray(auditTypesData.types)) {
      return [];
    }

    return [
      { label: t('common:all'), value: undefined },
      ...auditTypesData.types.map((type: string) => ({
        value: type,
        label: t(`audit:${type}`) || type,
      })),
    ];
  }, [auditTypesData]);

  const userOptions = useMemo(() => {
    let options = usersData?.users
      ? AuditLib.mapUsersToOptions(usersData.users)
      : [];

    if (searchParams.userId && user) {
      options = [...options, { label: user.fullName!, value: user.id! }];
    }

    return options;
  }, [usersData, user]);

  const resetFilters = () => {
    updateSearchParams({
      queryObject: { ...RouterConsts.AUDIT_DEFAULT_QUERY },
    });
    setSmartRoomId('');
    setSmartRoomIdError(false);
  };

  const refetchQuery = () => {
    refetch();
  };

  return {
    searchParams,
    isFetchingUsers,
    typeOptions,
    userOptions,
    searchUser,
    smartRoomId,
    smartRoomIdError,
    hasFetchedUser,

    setSearchUser,
    refetchQuery,
    resetFilters,

    handleChange,
    handleChangeUser,
    handleChangeTimeFrom,
    handleChangeTimeMax,
    handleSmartRoomIdChange,
  };
};