WEB APP: Панель "Инструкции" (начало)

This commit is contained in:
Mikhail Chechnev 2023-10-21 03:46:03 +03:00
parent 1cb8e6123c
commit 6176387826
27 changed files with 565 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

View File

@ -0,0 +1,16 @@
/*
Парус 8 - Панели мониторинга - ПУП - Работы проектов
Панель мониторинга: Описание макета (пользовательская инструкция)
*/
//---------------------
//Подключение библиотек
//---------------------
import { PrjHelp } from "./prj_help"; //Корневая панель пользовательской инструкции
//----------------
//Интерфейс модуля
//----------------
export const RootClass = PrjHelp;

View File

@ -0,0 +1,491 @@
/*
Парус 8 - Панели мониторинга - ПУП - Работы проектов
Панель мониторинга: Описание макета (пользовательская инструкция)
*/
//---------------------
//Подключение библиотек
//---------------------
import React, { useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента
import {
Box,
Grid,
Typography,
Link,
List,
ListItem,
ListItemButton,
ListItemText,
Divider,
Table,
TableHead,
TableRow,
TableCell,
TableBody
} from "@mui/material"; //Интерфейсные элементы
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
import img211 from "./img/211.png"; //Изображение
import img212 from "./img/212.png"; //Изображение
import img213 from "./img/213.png"; //Изображение
import img214 from "./img/214.png"; //Изображение
import img215 from "./img/215.png"; //Изображение
import img221 from "./img/221.png"; //Изображение
import img222 from "./img/222.png"; //Изображение
import img223 from "./img/223.png"; //Изображение
import img231 from "./img/231.png"; //Изображение
import img232 from "./img/232.png"; //Изображение
import img241 from "./img/241.png"; //Изображение
import img242 from "./img/242.png"; //Изображение
import img243 from "./img/243.png"; //Изображение
import img244 from "./img/244.png"; //Изображение
import img245 from "./img/245.png"; //Изображение
import img31 from "./img/31.png"; //Изображение
import img32 from "./img/32.png"; //Изображение
import img33 from "./img/33.png"; //Изображение
import img34 from "./img/34.png"; //Изображение
import img35 from "./img/35.png"; //Изображение
import img36 from "./img/36.png"; //Изображение
//---------
//Константы
//---------
//Оглавление
const CONTENT = [
{ id: "prg1", caption: "1. Назначение документа" },
{ id: "prg2", caption: "2. Инициация проекта" },
{ id: "prg3", caption: "3. Планирование" },
{ id: "prg4", caption: "4. Исполнение" },
{ id: "prg5", caption: "5. Мониторинг и контроль" },
{ id: "prg6", caption: "6. Корректировка планов" },
{ id: "prg7", caption: "7. Завершение проекта" }
];
//Стили
const STYLES = {
IMG: { textAlign: "center", padding: "10px" },
PRGF_TABLE: { paddingTop: "20px", paddingBottom: "20px", display: "flex", justifyContent: "center" },
TABLE: { width: "80%" },
TABLE_TITLE: { backgroundColor: "lightgray" },
TABLE_SUBTITLE: { textAlign: "center", backgroundColor: "#f3eded", fontWeight: "bold" }
};
//--------------------------------
//Вспомогательные функции и классы
//--------------------------------
//Заголовок первого уровня
const Hdr1 = ({ id, children }) => (
<Typography {...(id ? { id } : {})} variant="h3" color="primary">
{children}
</Typography>
);
//Контроль свойств - Заголовок первого уровня
Hdr1.propTypes = {
id: PropTypes.string,
children: PropTypes.any
};
//Заголовок второго уровня
const Hdr2 = ({ id, children }) => (
<Typography {...(id ? { id } : {})} variant="h4" color="secondary">
{children}
</Typography>
);
//Контроль свойств - Заголовок второго уровня
Hdr2.propTypes = {
id: PropTypes.string,
children: PropTypes.any
};
//Заголовок третьего уровня
const Hdr3 = ({ id, children }) => (
<Typography {...(id ? { id } : {})} variant="h5" color="text.primary">
{children}
</Typography>
);
//Контроль свойств - Заголовок третьего уровня
Hdr3.propTypes = {
id: PropTypes.string,
children: PropTypes.any
};
//Параграф
const Prgf = ({ style, children }) => (
<Typography sx={style} component="div" align="justify">
{children}
</Typography>
);
//Контроль свойств - Параграф
Prgf.propTypes = {
style: PropTypes.object,
children: PropTypes.any
};
//Изображение
const Img = ({ src }) => (
<div style={STYLES.IMG}>
<img src={`./${src}`} />
</div>
);
//Контроль свойств - Изображение
Img.propTypes = {
src: PropTypes.string.isRequired
};
//Ссылка на раздел
const UnitLink = ({ unitCode, children }) => {
//Подключение к контексту приложения
const { pOnlineShowUnit } = useContext(ApplicationСtx);
//Генерация содержимого
return (
<Link component="button" variant="body2" align="left" underline="always" onClick={() => pOnlineShowUnit({ unitCode })}>
{children}
</Link>
);
};
//Контроль свойств - Ссылка на раздел
UnitLink.propTypes = {
unitCode: PropTypes.string.isRequired,
children: PropTypes.any
};
//-----------
//Тело модуля
//-----------
//Корневая панель работ проектов
const PrjHelp = () => {
//Генерация содержимого
return (
<Box>
<Grid container spacing={1}>
<Grid item xs={2}>
<Box p={2}>
<Typography variant="button">Управление экономикой проектов</Typography>
</Box>
<Divider />
<List>
{CONTENT.map((c, i) => (
<ListItem disablePadding key={i}>
<ListItemButton
onClick={() => {
document.getElementById(c.id).scrollIntoView();
}}
>
<ListItemText primary={c.caption} />
</ListItemButton>
</ListItem>
))}
</List>
</Grid>
<Grid item xs={10} sx={{ display: "flex", flexDirection: "column", justifyContent: "center" }}>
<Box p={2} style={{ maxHeight: "91vh", overflow: "auto" }}>
<Hdr1>Управление экономикой проектов</Hdr1>
<Hdr2 id={"prg1"}>1. Назначение документа</Hdr2>
<Prgf>
Документ предназначен для ответственного экономиста по проекту НИОКР и содержит описание порядка применения средств
автоматизации на базе ПП ПАРУС-Предприятие 8 при исполнении процесса управления экономикой проектов НИОКР на каждых его
этапах:
<p>1) Инициация проекта</p>
<p>2) Планирование</p>
<p>3) Исполнение</p>
<p>4) Мониторинг и контроль</p>
<p>5) Корректировка планов</p>
<p>6) Завершение проекта</p>
</Prgf>
<Hdr2 id={"prg2"}>2. Инициация проекта</Hdr2>
<Hdr3>2.1. Регистрация информации о проекте</Hdr3>
<Prgf>
В момент инициации проекта требуется зарегистрировать запись в соответствующем учетном регистре системы, доступ к которому
осуществляется из главного меню Учет &gt; <UnitLink unitCode={"Projects"}>Проекты</UnitLink>.
</Prgf>
<Img src={img211} />
<Prgf>
Система визуализирует окно параметров отбора проектов. При необходимости можно установить нужные фильтры и нажать кнопку
ОК.
</Prgf>
<Img src={img212} />
<Prgf>В открывшемся регистре требуется вызвать контекстное меню правой кнопкой мыши и выбрать пункт Добавить.</Prgf>
<Img src={img213} />
<Prgf>Система визуализирует окно параметров действия.</Prgf>
<Img src={img214} />
<Prgf>Требуется заполнить реквизиты проекта согласно правилам, приведенным ниже в таблице и нажать кнопку ОК.</Prgf>
<Prgf style={STYLES.PRGF_TABLE}>
<Table sx={STYLES.TABLE}>
<TableHead sx={STYLES.TABLE_TITLE}>
<TableRow>
<TableCell> п/п</TableCell>
<TableCell>Наименование реквизита</TableCell>
<TableCell>Правила заполнения</TableCell>
</TableRow>
</TableHead>
<TableBody>
<TableRow>
<TableCell colSpan={3} sx={STYLES.TABLE_SUBTITLE}>
Проект
</TableCell>
</TableRow>
<TableRow>
<TableCell>1</TableCell>
<TableCell>Мнемокод</TableCell>
<TableCell>Внутренний код проекта (номер заказа, шифр работ)</TableCell>
</TableRow>
<TableRow>
<TableCell>2</TableCell>
<TableCell>Наименование</TableCell>
<TableCell>Полное наименование проекта</TableCell>
</TableRow>
<TableRow>
<TableCell>3</TableCell>
<TableCell>Условное наименование</TableCell>
<TableCell>Согласованный с заказчиком код проекта</TableCell>
</TableRow>
<TableRow>
<TableCell>4</TableCell>
<TableCell>Ожидаемые результаты</TableCell>
<TableCell>Заполнить при необходимости</TableCell>
</TableRow>
<TableRow>
<TableCell>5</TableCell>
<TableCell>Идентификатор государственного контракта</TableCell>
<TableCell>Выбрать из словаря ИГК в том случае, если проекта выполняется в рамках ГОЗ</TableCell>
</TableRow>
<TableRow>
<TableCell>6</TableCell>
<TableCell>Документ-основание</TableCell>
<TableCell>
Указать номер договора с заказчиком, номер внутриорганизационного приказа либо иного документа инициации
проекта
</TableCell>
</TableRow>
<TableRow>
<TableCell>7</TableCell>
<TableCell>Тип</TableCell>
<TableCell>Выбрать из словаря подходящий тип проекта</TableCell>
</TableRow>
<TableRow>
<TableCell>8</TableCell>
<TableCell>Внешний заказчик</TableCell>
<TableCell>Выбрать из словаря в том случае, если проект инициирован внешним заказчиком</TableCell>
</TableRow>
<TableRow>
<TableCell>9</TableCell>
<TableCell>Подразделение-заказчик</TableCell>
<TableCell>
Выбрать из словаря в том случае, если проект является внутренним (например, НИОКР для собственных нужд,
инвестиционные проекты )
</TableCell>
</TableRow>
<TableRow>
<TableCell>10</TableCell>
<TableCell>Ответственный</TableCell>
<TableCell>Выбрать из словаря ответственного сотрудника за исполнение проектных работ</TableCell>
</TableRow>
<TableRow>
<TableCell>11</TableCell>
<TableCell>Подразделение-ответственный</TableCell>
<TableCell>Выбрать из словаря ответственное подразделение-исполнитель проектных работ</TableCell>
</TableRow>
<TableRow>
<TableCell>12</TableCell>
<TableCell>Дата начала план</TableCell>
<TableCell>Указать плановую дату начала выполнения проектных работ</TableCell>
</TableRow>
<TableRow>
<TableCell>13</TableCell>
<TableCell>Дата окончания план</TableCell>
<TableCell>Указать плановую дату окончания выполнения проектных работ</TableCell>
</TableRow>
<TableRow>
<TableCell colSpan={3} sx={STYLES.TABLE_SUBTITLE}>
Суммы, трудоемкость
</TableCell>
</TableRow>
<TableRow>
<TableCell>14</TableCell>
<TableCell>Стоимость</TableCell>
<TableCell>Задать плановую стоимость проекта</TableCell>
</TableRow>
<TableRow>
<TableCell>15</TableCell>
<TableCell>ЕИ трудоемкости</TableCell>
<TableCell>Выбрать из словаря единицу измерения трудоемкости проекта</TableCell>
</TableRow>
<TableRow>
<TableCell colSpan={3} sx={STYLES.TABLE_SUBTITLE}>
Настройки
</TableCell>
</TableRow>
<TableRow>
<TableCell>16</TableCell>
<TableCell>Схема калькуляции</TableCell>
<TableCell>Выбрать из словаря подходящую структуру плановой калькуляции по проекту</TableCell>
</TableRow>
</TableBody>
</Table>
</Prgf>
<Prgf>
При начале выполнения проектных работ требуется перевести проект в состояние Открыт посредством соответствующего
действия контекстного меню раздела.
</Prgf>
<Img src={img215} />
<Hdr3>2.2. Регистрация этапов проекта</Hdr3>
<Prgf>Далее необходимо выполнить регистрацию этапов проекта.</Prgf>
<Prgf>
В подчиненной таблице Этапы проекта требуется вызвать контекстное меню правой кнопкой мыши и выбрать пункт Добавить.
</Prgf>
<Img src={img221} />
<Prgf>Система визуализирует окно параметров действия.</Prgf>
<Img src={img222} />
<Prgf>Требуется заполнить реквизиты этапа проекта согласно правилам, приведенным ниже в таблице и нажать кнопку ОК.</Prgf>
<Prgf style={STYLES.PRGF_TABLE}>
<Table sx={STYLES.TABLE}>
<TableHead sx={STYLES.TABLE_TITLE}>
<TableRow>
<TableCell> п/п</TableCell>
<TableCell>Наименование реквизита</TableCell>
<TableCell>Правила заполнения</TableCell>
</TableRow>
</TableHead>
<TableBody>
<TableRow>
<TableCell colSpan={3} sx={STYLES.TABLE_SUBTITLE}>
Этап проекта
</TableCell>
</TableRow>
<TableRow>
<TableCell>1</TableCell>
<TableCell>Номер</TableCell>
<TableCell>Указать номер этапа проекта п/п</TableCell>
</TableRow>
<TableRow>
<TableCell>2</TableCell>
<TableCell>Наименование</TableCell>
<TableCell>Полное наименование этапа проекта</TableCell>
</TableRow>
<TableRow>
<TableCell>3</TableCell>
<TableCell>Ожидаемые результаты</TableCell>
<TableCell>Заполнить при необходимости</TableCell>
</TableRow>
<TableRow>
<TableCell>4</TableCell>
<TableCell>Дата начала план</TableCell>
<TableCell>Указать плановую дату начала выполнения этапа проектных работ</TableCell>
</TableRow>
<TableRow>
<TableCell>5</TableCell>
<TableCell>Дата окончания план</TableCell>
<TableCell>Указать плановую дату окончания выполнения этапа проектных работ</TableCell>
</TableRow>
<TableRow>
<TableCell colSpan={3} sx={STYLES.TABLE_SUBTITLE}>
Суммы, трудоемкость
</TableCell>
</TableRow>
<TableRow>
<TableCell>6</TableCell>
<TableCell>Стоимость этапа</TableCell>
<TableCell>Задать плановую стоимость этапа проекта</TableCell>
</TableRow>
</TableBody>
</Table>
</Prgf>
<Prgf>
При начале выполнения проектных работ по этапу требуется перевести этап проекта проект в состояние Открыт посредством
соответствующего действия контекстного меню раздела.
</Prgf>
<Img src={img223} />
<Hdr3>2.3. Формирование шифра затрат</Hdr3>
<Prgf>
После регистрации этапа проекта требуется выделить запись этапа, вызвать правой кнопкой мыши контекстное меню и выбрать
пункт ЦИТК. Указать шифр затрат.
</Prgf>
<Img src={img231} />
<Prgf>Система визуализирует окно параметров действия.</Prgf>
<Img src={img232} />
<Prgf>
Номер шифра затрат система генерирует автоматически. При необходимости его можно исправить. Далее необходимо нажать копку
ОК.
</Prgf>
<Hdr3>2.4. Регистрация договора с заказчиком</Hdr3>
<Prgf>
После заключения договора с заказчиком необходимо выделить законтрактованные этапы проекта, вызвать правой кнопкой мыши
контекстное меню и выбрать пункт Формирование &gt; Договор с внешним заказчиком.
</Prgf>
<Img src={img241} />
<Prgf>Система визуализирует окно параметров действия.</Prgf>
<Img src={img242} />
<Prgf>Необходимо заполнить параметры действия и нажать кнопку ОК.</Prgf>
<Prgf>
Система сформирует договор с заказчиком в <UnitLink unitCode="Contracts">соответствующем регистре системы</UnitLink>.
Договор связан с записью регистра Проекты посредством штатного механизма взаимосвязей документов.
</Prgf>
<Img src={img243} />
<Prgf>
Запись в регистре Договоры может быть отредактирована посредством штатных действий Исправить контекстного меню
заголовка раздела. Также может быть отредактирован каждый этап договора.
</Prgf>
<Prgf>
В момент двустороннего подписания договора требуется перевести документ в состояние Утвержден посредством
соответствующего действия контекстного меню раздела.
</Prgf>
<Img src={img244} />
<Prgf>
В момент перехода к двустороннему исполнению этапа договора требуется перевести этап в состояние Открыт посредством
соответствующего действия контекстного меню раздела.
</Prgf>
<Img src={img245} />
<Hdr2 id={"prg3"}>3. Планирование</Hdr2>
<Prgf>
При получении плановой калькуляции по этапу от службы ценообразования требуется зарегистрировать данный документ в
соответствующем регистре системы.
</Prgf>
<Img src={img31} />
<Prgf>Система визуализирует окно параметров действия.</Prgf>
<Img src={img32} />
<Prgf>Необходимо заполнить реквизиты плановой калькуляции и нажать кнопку ОК.</Prgf>
<Prgf>
Далее необходимо сформировать перечень статей калькуляции посредством одноименного действия контекстного меню раздела.
</Prgf>
<Img src={img33} />
<Prgf>
Далее необходимо указать плановые суммы прямых статей затрат посредством штатного действия Исправить контекстного меню.
</Prgf>
<Prgf>
Затем необходимо выполнить расчет косвенных статей затрат посредством одноименного действия контекстного меню раздела.
</Prgf>
<Img src={img34} />
<Prgf>
В момент двустороннегго согласования плановой калькуляции необходимо утвердить документ посредством одноименного действия
контекстного меню раздела.
</Prgf>
<Img src={img35} />
<Prgf>Затем документ необходимо пометить как действующий.</Prgf>
<Img src={img36} />
<Hdr2 id={"prg4"}>4. Исполнение</Hdr2>
<Hdr2 id={"prg5"}>5. Мониторинг и контроль</Hdr2>
<Hdr2 id={"prg6"}>6. Корректировка планов</Hdr2>
<Hdr2 id={"prg7"}>7. Завершение проекта</Hdr2>
</Box>
</Grid>
</Grid>
</Box>
);
};
//----------------
//Интерфейс модуля
//----------------
export { PrjHelp };

BIN
img/prj_help.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

49
package-lock.json generated
View File

@ -21,6 +21,7 @@
"eslint-plugin-react": "^7.33.1",
"eslint-plugin-react-hooks": "^4.6.0",
"fast-xml-parser": "^4.2.7",
"file-loader": "^6.2.0",
"query-string": "^8.1.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
@ -1589,6 +1590,14 @@
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"node_modules/big.js": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
"engines": {
"node": "*"
}
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@ -1871,6 +1880,14 @@
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.488.tgz",
"integrity": "sha512-Dv4sTjiW7t/UWGL+H8ZkgIjtUAVZDgb/PwGWvMsCT7jipzUV/u5skbLXPFKb6iV0tiddVi/bcS2/kUrczeWgIQ=="
},
"node_modules/emojis-list": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
"engines": {
"node": ">= 4"
}
},
"node_modules/enhanced-resolve": {
"version": "5.15.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
@ -2483,6 +2500,25 @@
"node": "^10.12.0 || >=12.0.0"
}
},
"node_modules/file-loader": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
"integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
"dependencies": {
"loader-utils": "^2.0.0",
"schema-utils": "^3.0.0"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^4.0.0 || ^5.0.0"
}
},
"node_modules/filter-obj": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-5.1.0.tgz",
@ -3329,6 +3365,19 @@
"node": ">=6.11.5"
}
},
"node_modules/loader-utils": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
"integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dependencies": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
},
"engines": {
"node": ">=8.9.0"
}
},
"node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",

View File

@ -31,6 +31,7 @@
"eslint-plugin-react": "^7.33.1",
"eslint-plugin-react-hooks": "^4.6.0",
"fast-xml-parser": "^4.2.7",
"file-loader": "^6.2.0",
"query-string": "^8.1.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",

View File

@ -1,3 +1,4 @@
/* eslint-disable */
/*
Парус 8 - Панели мониторинга
Настройки упаковщика
@ -40,6 +41,13 @@ module.exports = {
presets: ["@babel/preset-react"]
}
}
},
{
test: /\.(jpg|png|svg)$/,
loader: "file-loader",
options: {
name: "[path][name].[hash].[ext]"
}
}
]
}