diff --git a/README.md b/README.md
index e940f42..60b1e40 100755
--- a/README.md
+++ b/README.md
@@ -1 +1,61 @@
-Проект веб части ASB cloud
\ No newline at end of file
+![ASB Logo](concept/ImagesSrc/logo_Asb.svg)
+# Проект веб части ASB cloud
+
+# Порядок запуска
+## 1. Установка пакетов
+Для запуска установки необходимо иметь уже установленый [NPM](https://www.npmjs.com).
+
+Установка выполняется одной командой:
+```bash
+npm i
+```
+
+## 2. Автогенерация сервисов
+Для корректной работы веб-приложения необходимо наличие сервисов работы с RestAPI.
+
+Для их автогенерации требуется уже запущенная серверная часть.
+
+Автогенерацию можно запустить с помощью уже прописанных в [package.json](package.json) скриптов, либо вручную.
+
+Если сервер запущен на текущей машине достаточно написать:
+```bash
+npm run update_openapi
+```
+
+Для получения сервисов с основного сервера:
+```bash
+npm run update_openapi_server
+```
+
+или же ручной вариант:
+```bash
+npx openapi -i http://{IP_ADDRESS}:{PORT}/swagger/v1/swagger.json -o src/services/api
+```
+
+где ***IP_ADDRESS*** и ***PORT*** это соответственно IP-адрес и порт сервера.
+
+На данный момент имеются следующие IP-адреса:
+| IP-адрес | Описание |
+|:-|:-|
+| 127.0.0.1:5000 | Локальный адрес вашей машины (привязан к `update_openapi`) |
+| 192.168.1.70:5000 | Локальный адрес development-сервера (привязан к `update_openapi_server`) |
+| 46.146.209.148:89 | Внешний адрес development-сервера |
+| 46.146.209.148 | Внешний адрес production-сервера |
+
+## 3. Компиляция production-версии приложения
+После выполнения вышеописанных пунктов приложение готово к компиляции.
+
+Для компиляции досточно выполнить команду:
+```bash
+npm run build
+```
+
+После завершения этой команды скомпилированное приложение будет находиться в появившейся директории [build/](build/).
+
+## 4. Запуск development-версии приложения
+В [package.json](package.json) необходимо проверить и при необходимости изменить значение в поле ***proxy*** (пара адрес-порт сервера с RestAPI) на актуальное.
+
+После чего выполнить запуск командой:
+```bash
+npm start
+```
diff --git a/TODO.md b/TODO.md
deleted file mode 100755
index 3d2733d..0000000
--- a/TODO.md
+++ /dev/null
@@ -1 +0,0 @@
-env params prod/dev
\ No newline at end of file
diff --git a/public/index.html b/public/index.html
index aeeddf7..affdf4a 100755
--- a/public/index.html
+++ b/public/index.html
@@ -1,13 +1,15 @@
-
+
-
+
+
+
АСБ Vision
diff --git a/src/utils/datetime.ts b/src/utils/datetime.ts
index 74090a8..9977f60 100755
--- a/src/utils/datetime.ts
+++ b/src/utils/datetime.ts
@@ -19,7 +19,7 @@ export function isRawDate(value: unknown): value is RawDate {
return !isNaN(Date.parse(String(value)))
}
-export const formatDate = (date: unknown, utc = false, format = defaultFormat) => {
+export const formatDate = (date: unknown, utc: boolean = false, format: string = defaultFormat) => {
if (!isRawDate(date)) return null
const out = utc ? moment.utc(date).local() : moment(date)
return out.format(format)
@@ -40,8 +40,8 @@ export const periodToString = (time?: number) => {
return `${days > 0 ? days : ''} ${toFixed(hours)}:${toFixed(minutes)}:${toFixed(seconds)}`
}
-export const calcDuration = (start: unknown, end: unknown) => {
- if (!isRawDate(start) || !isRawDate(end)) return
+export const calcDuration = (start: unknown, end: unknown): number | undefined => {
+ if (!isRawDate(start) || !isRawDate(end)) return undefined
return (+new Date(end) - +new Date(start)) * timeInS.millisecond / timeInS.day
}
diff --git a/src/utils/functions.tsx b/src/utils/functions.tsx
index a6751d2..cc377e8 100755
--- a/src/utils/functions.tsx
+++ b/src/utils/functions.tsx
@@ -1,20 +1,25 @@
import { OperationStatService, WellOperationDto, WellOperationDtoPlanFactPredictBase } from '@api'
-const maxPrefix = 'isMax'
-const minPrefix = 'isMin'
+const maxPrefix: string = 'isMax'
+const minPrefix: string = 'isMin'
-export const getPrecision = (number: number) => Number.isFinite(number) ? number.toFixed(2) : '-'
+export const getPrecision = (number: number): string => Number.isFinite(number) ? number.toFixed(2) : '-'
export type KeyType = number | string
-export const nwtIdCategory = 1043
+export const nwtIdCategory: number = 1043
export type SaubData = WellOperationDto & {
- isNPT?: boolean // Относится ли операция к НПВ
- key?: number // ID операции
- depth?: number // Глубина
- date?: string // Дата
- nptHours?: number // Колличество часов НПВ с начала бурения до текущего момента
+ /** Относится ли операция к НПВ */
+ isNPT?: boolean
+ /** ID операции */
+ key?: number
+ /** Глубина */
+ depth?: number
+ /** Дата */
+ date?: string
+ /** Колличество часов НПВ с начала бурения до текущего момента */
+ nptHours?: number
}
export const getOperations = async (idWell: number): Promise<{
@@ -25,11 +30,13 @@ export const getOperations = async (idWell: number): Promise<{
}> => {
const ops = await OperationStatService.getTvd(idWell)
- if (!ops) return {
- operations: [],
- plan: [],
- fact: [],
- predict: [],
+ if (!ops) {
+ return {
+ operations: [],
+ plan: [],
+ fact: [],
+ predict: [],
+ }
}
const convert = (operation?: WellOperationDto): SaubData => ({
diff --git a/src/utils/index.ts b/src/utils/index.ts
index 7e84db5..49517b9 100755
--- a/src/utils/index.ts
+++ b/src/utils/index.ts
@@ -1,25 +1,62 @@
-export type { RawDate, timeInS } from './datetime'
export { isRawDate, formatDate, defaultFormat, periodToString } from './datetime'
+export type { RawDate, timeInS } from './datetime'
-export const headerHeight = 64
+export const headerHeight: number = 64
export const mainFrameSize = () => ({
width: window.innerWidth,
height: window.innerHeight - headerHeight
})
+/**
+ * Возвращает
+ *
+ * @param arr Входящие данные
+ * @param def Значение по-умолчанию
+ *
+ * @returns Если `arr` - массив будет возвращено оно, иначе `def`
+ */
export const arrayOrDefault = (arr?: unknown, def: T[] = []): T[] => Array.isArray(arr) ? arr : def
+/**
+ * Копирует данные в глубину.
+ *
+ * @remarks
+ * При копированиий объектов, содержащих функций может возникнуть исключение.
+ * Не предназначено для копирования функций.
+ *
+ * @param data Копируемые данные
+ * @returns Полная копия `data`
+ */
export const deepCopy = (data: T): T => JSON.parse(JSON.stringify(data ?? null))
+/**
+ * Маппинг полей объекта
+ *
+ * @param data Входящие данные
+ * @param handler Обработчик
+ *
+ * @returns Объект с обработанными полями
+ */
export const wrapValues = (data: Record, handler: (data: T, key: string, object: Record) => R): Record =>
Object.fromEntries(Object.entries(data).map(([key, value]) => [key, handler(value, key, data)]))
+/**
+ * Генерирует массив чисел в заданном диапазоне
+ *
+ * @param end Конечное значение
+ * @param start Начальное значение
+ *
+ * @returns Массив чисел в диапазоне от `start` до `end`
+ */
export const range = (end: number, start: number = 0) => Array.from({ length: end - start }, (_, i) => start + i)
/**
- * Объединить типы, исключив совпадающие поля справа
- * @param T Тип, передаваемый полностью
- * @param R Аддитивный тип
+ * Объединить типы, исключив совпадающие поля справа.
+ *
+ * @typeParam T - Тип, передаваемый полностью
+ * @typeParam R - Аддитивный тип
+ *
+ * @returns Общий тип с полным `T` и несовпадающими полями из `R`
*/
export type OmitExtends = T & Omit
diff --git a/src/utils/string.ts b/src/utils/string.ts
index debbcf3..ae27338 100755
--- a/src/utils/string.ts
+++ b/src/utils/string.ts
@@ -1,7 +1,7 @@
-export const makeStringCutter = (maxLength = 100, separator = ' ', suffix = '...') => (comment?: string) => {
+export const makeStringCutter = (maxLength: number = 100, separator: string = ' ', suffix: string = '...') => (comment?: string) => {
if (!comment || comment.length < maxLength)
return comment
- let lastSep = comment.lastIndexOf(separator, maxLength)
+ const lastSep = comment.lastIndexOf(separator, maxLength)
if (lastSep < 0)
return comment.substring(0, maxLength - suffix.length) + suffix
return comment.substring(0, lastSep)