Compare commits
6
Commits
cbc1311e9d
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6696cc1027 | ||
|
|
98cb5ab09b | ||
|
|
c501c2bbbf | ||
|
|
a74ea966ad | ||
|
|
0a7d29419f | ||
|
|
a9599d8a1f |
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "no-copy-frontend",
|
"name": "no-copy-frontend",
|
||||||
"version": "0.120.0",
|
"version": "0.122.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev -p 2999",
|
"dev": "next dev -p 2999",
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ export default function Page() {
|
|||||||
<ViolationsStatistic />
|
<ViolationsStatistic />
|
||||||
<ViolationsCheckAllSection />
|
<ViolationsCheckAllSection />
|
||||||
<ViolationsTable />
|
<ViolationsTable />
|
||||||
<ViolationsLastCombinedCases />
|
{/* <ViolationsLastCombinedCases /> */}
|
||||||
{/* <ViolationsMyComplaint />
|
{/* <ViolationsMyComplaint />
|
||||||
<ViolationsMyClaims /> */}
|
<ViolationsMyClaims /> */}
|
||||||
<div className="analytics-grid">
|
<div className="analytics-grid">
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ interface DocumentInfo {
|
|||||||
updatedAt?: string;
|
updatedAt?: string;
|
||||||
uploadSessionId?: string;
|
uploadSessionId?: string;
|
||||||
userId?: number;
|
userId?: number;
|
||||||
|
appealInfos?: any[]; //Не знаю что тут будет
|
||||||
}
|
}
|
||||||
|
|
||||||
export default async function Page({ searchParams }: PageProps) {
|
export default async function Page({ searchParams }: PageProps) {
|
||||||
|
|||||||
@@ -91,18 +91,11 @@ export async function requestFileAsBuffer(fileId: string): Promise<ArrayBuffer |
|
|||||||
|
|
||||||
export async function fetchDocumentInfo(fileId: string) {
|
export async function fetchDocumentInfo(fileId: string) {
|
||||||
const token = await getSessionData('token');
|
const token = await getSessionData('token');
|
||||||
|
console.log('fetchDocumentInfo');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await fetch(`${API_BASE_URL}/api/v1/data`, {
|
const response = await fetch(`${API_BASE_URL}/api/files/public/file-info/${fileId}`, {
|
||||||
method: 'POST',
|
method: 'GET',
|
||||||
body: JSON.stringify({
|
|
||||||
version: 1,
|
|
||||||
msg_id: 20005,
|
|
||||||
message_body: {
|
|
||||||
file_id: fileId,
|
|
||||||
action: 'file_info'
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'Authorization': `Bearer ${token}`
|
'Authorization': `Bearer ${token}`
|
||||||
@@ -111,13 +104,7 @@ export async function fetchDocumentInfo(fileId: string) {
|
|||||||
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
const parsed = await response.json();
|
const parsed = await response.json();
|
||||||
|
return parsed;
|
||||||
if (parsed.message_code === 0) {
|
|
||||||
return parsed.message_body;
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`${response.status}`);
|
throw new Error(`${response.status}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,9 +68,22 @@ type ApiFile = {
|
|||||||
thumbnailFileUrl: string;
|
thumbnailFileUrl: string;
|
||||||
permissions: {
|
permissions: {
|
||||||
DOWNLOAD: boolean;
|
DOWNLOAD: boolean;
|
||||||
}
|
},
|
||||||
|
appealInfos: AppealInfos[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export type AppealInfos = {
|
||||||
|
additionalInfo: string | null;
|
||||||
|
adminComment: null;
|
||||||
|
appealId: string | null;
|
||||||
|
appealReason: string | null;
|
||||||
|
createdAt: string | null;
|
||||||
|
fileId: string | null;
|
||||||
|
fileName: string | null;
|
||||||
|
resolvedAt: string | null;
|
||||||
|
status: string;
|
||||||
|
}
|
||||||
|
|
||||||
type ApiResponse = {
|
type ApiResponse = {
|
||||||
files?: ApiFile[];
|
files?: ApiFile[];
|
||||||
total_count: number;
|
total_count: number;
|
||||||
@@ -709,11 +722,10 @@ export default function TanstakFilesTable({ fileType, showFileLink }: { fileType
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleAppeal = async (file: FileItem) => {
|
const handleAppeal = async (file: FileItem) => {
|
||||||
console.log(file);
|
|
||||||
|
|
||||||
setOpenWindowChildren(() => {
|
setOpenWindowChildren(() => {
|
||||||
return (
|
return (
|
||||||
<FileAppealModalWindow fileId={file.id} setWindowClose={setOpenWindow} setWindowChildren={setOpenWindowChildren} />
|
<FileAppealModalWindow fileId={file.id} appeal={file._original?.appealInfos} setWindowClose={setOpenWindow} setWindowChildren={setOpenWindowChildren} />
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
setOpenWindow(true);
|
setOpenWindow(true);
|
||||||
|
|||||||
@@ -833,6 +833,10 @@
|
|||||||
padding: 15px 16px;
|
padding: 15px 16px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&:has(.column-location) {
|
||||||
|
width: 250px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.column {
|
.column {
|
||||||
@@ -906,6 +910,31 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&:has(.column-document) {
|
||||||
|
width: 35%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:has(.column-viewer-date) {
|
||||||
|
width: 15%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:has(.column-viewer) {
|
||||||
|
width: 25%;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:has(.column-location) {
|
||||||
|
width: 25%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.column-document,
|
||||||
|
.column-viewer-date,
|
||||||
|
.column-viewer,
|
||||||
|
.column-location {
|
||||||
|
/* width: 250px;
|
||||||
|
margin: 0 auto; */
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
.table-item-file-name-image-wrapper {
|
.table-item-file-name-image-wrapper {
|
||||||
width: 40px;
|
width: 40px;
|
||||||
height: 40px;
|
height: 40px;
|
||||||
@@ -3805,6 +3834,10 @@
|
|||||||
min-width: 400px;
|
min-width: 400px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
|
&.appeal-info {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 470px) {
|
@media (max-width: 470px) {
|
||||||
min-width: auto;
|
min-width: auto;
|
||||||
}
|
}
|
||||||
@@ -3936,6 +3969,40 @@
|
|||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.appeal-info {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.appeal-status {
|
||||||
|
display: inline-block;
|
||||||
|
background-color: #f9fafb;
|
||||||
|
padding: 4px 12px;
|
||||||
|
border-radius: 20px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.appeal-reason-text,
|
||||||
|
.appeal-additional-text,
|
||||||
|
.admin-comment-text {
|
||||||
|
background-color: #f9fafb;
|
||||||
|
padding: 12px;
|
||||||
|
border-radius: 6px;
|
||||||
|
line-height: 1.5;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
word-wrap: break-word;
|
||||||
|
}
|
||||||
|
|
||||||
|
.appeal-warning {
|
||||||
|
margin-top: 15px;
|
||||||
|
padding: 12px;
|
||||||
|
background-color: #fef3c7;
|
||||||
|
border-left: 4px solid #d97706;
|
||||||
|
border-radius: 6px;
|
||||||
|
color: #78350f;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -158,13 +158,14 @@ export default function CaseComplaint({ selectedViolation, updateStatusHandler,
|
|||||||
<div
|
<div
|
||||||
className="button-actions"
|
className="button-actions"
|
||||||
>
|
>
|
||||||
<button
|
{/* пока скроем интерфейс с шаблонами */}
|
||||||
|
{/* <button
|
||||||
type="button"
|
type="button"
|
||||||
className="btn-s btn-primary-small"
|
className="btn-s btn-primary-small"
|
||||||
onClick={openTemplateSaveModal}
|
onClick={openTemplateSaveModal}
|
||||||
>
|
>
|
||||||
{t('save-template')}
|
{t('save-template')}
|
||||||
</button>
|
</button> */}
|
||||||
|
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
@@ -176,7 +177,8 @@ export default function CaseComplaint({ selectedViolation, updateStatusHandler,
|
|||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div
|
{/* пока скроем интерфейс с шаблонами */}
|
||||||
|
{/* <div
|
||||||
className="samples-wrapper"
|
className="samples-wrapper"
|
||||||
>
|
>
|
||||||
<h5>Шаблоны</h5>
|
<h5>Шаблоны</h5>
|
||||||
@@ -272,7 +274,7 @@ export default function CaseComplaint({ selectedViolation, updateStatusHandler,
|
|||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div> */}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ModalWindow
|
<ModalWindow
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { convertBytes } from '@/app/lib/convertBytes';
|
|
||||||
import { formatDate, formatDateTime } from '@/app/lib/formatDate';
|
import { formatDate, formatDateTime } from '@/app/lib/formatDate';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
import { FileDetails } from '@/app/[locale]/pages/file/[id]/page';
|
import { FileDetails } from '@/app/[locale]/pages/file/[id]/page';
|
||||||
import { FileAnAppeal } from '@/app/actions/fileEntity';
|
import { FileAnAppeal } from '@/app/actions/fileEntity';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { toast } from 'sonner';
|
import { toast } from 'sonner';
|
||||||
|
import { AppealInfos } from '@/app/components/tanstak-table/TanstakTable';
|
||||||
|
|
||||||
export function FileAppealModalWindow({ fileId, setWindowClose, setWindowChildren }: {
|
export function FileAppealModalWindow({ fileId, appeal, setWindowClose, setWindowChildren }: {
|
||||||
fileId: string,
|
fileId: string,
|
||||||
|
appeal?: AppealInfos[],
|
||||||
setWindowClose: any,
|
setWindowClose: any,
|
||||||
setWindowChildren: any
|
setWindowChildren: any
|
||||||
}) {
|
}) {
|
||||||
@@ -17,6 +18,8 @@ export function FileAppealModalWindow({ fileId, setWindowClose, setWindowChildre
|
|||||||
const [appealReason, setAppealReason] = useState('');
|
const [appealReason, setAppealReason] = useState('');
|
||||||
const [additionalInfo, setAdditionalInfo] = useState('');
|
const [additionalInfo, setAdditionalInfo] = useState('');
|
||||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||||
|
const existingAppeal = appeal && appeal.length > 0 ? appeal[0] : null;
|
||||||
|
const hasActiveAppeal = existingAppeal && existingAppeal.status === 'pending';
|
||||||
|
|
||||||
const handleSubmitAppeal = async () => {
|
const handleSubmitAppeal = async () => {
|
||||||
if (!appealReason.trim()) {
|
if (!appealReason.trim()) {
|
||||||
@@ -49,7 +52,79 @@ export function FileAppealModalWindow({ fileId, setWindowClose, setWindowChildre
|
|||||||
return (
|
return (
|
||||||
<div className="modal-window-view-file">
|
<div className="modal-window-view-file">
|
||||||
<div className="modal-window-view-file-content">
|
<div className="modal-window-view-file-content">
|
||||||
{/* Форма подачи апелляции */}
|
{existingAppeal && (
|
||||||
|
<div className="file-info-card appeal-info">
|
||||||
|
<div className="info-header">
|
||||||
|
<h4>{t('appeal-information')}</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="info-item">
|
||||||
|
<div className="info-label">{t('appeal-status')}</div>
|
||||||
|
<div className="info-value">
|
||||||
|
<span className="appeal-status">
|
||||||
|
{existingAppeal.status}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="info-item">
|
||||||
|
<div className="info-label">{t('appeal-reason')}</div>
|
||||||
|
<div className="info-value">
|
||||||
|
<div className="appeal-reason-text">
|
||||||
|
{existingAppeal.appealReason || t('not-provided')}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{existingAppeal.additionalInfo && (
|
||||||
|
<div className="info-item">
|
||||||
|
<div className="info-label">{t('additional-info')}</div>
|
||||||
|
<div className="info-value">
|
||||||
|
<div className="appeal-additional-text">
|
||||||
|
{existingAppeal.additionalInfo}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{existingAppeal.createdAt && (
|
||||||
|
<div className="info-item">
|
||||||
|
<div className="info-label">{t('appeal-created-at')}</div>
|
||||||
|
<div className="info-value">
|
||||||
|
{formatDate(existingAppeal.createdAt)} {formatDateTime(existingAppeal.createdAt)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{existingAppeal.adminComment && (
|
||||||
|
<div className="info-item">
|
||||||
|
<div className="info-label">{t('admin-comment')}</div>
|
||||||
|
<div className="info-value">
|
||||||
|
<div className="admin-comment-text">
|
||||||
|
{existingAppeal.adminComment}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{existingAppeal.resolvedAt && (
|
||||||
|
<div className="info-item">
|
||||||
|
<div className="info-label">{t('resolved-at')}</div>
|
||||||
|
<div className="info-value">
|
||||||
|
{formatDateTime(existingAppeal.resolvedAt)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{hasActiveAppeal && (
|
||||||
|
<div className="appeal-warning">
|
||||||
|
{t('active-appeal-pending-message')}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
{!hasActiveAppeal && (
|
||||||
<div className="file-info-card appeal-form">
|
<div className="file-info-card appeal-form">
|
||||||
<div className="info-header">
|
<div className="info-header">
|
||||||
<h4>{t('file-an-appeal')}</h4>
|
<h4>{t('file-an-appeal')}</h4>
|
||||||
@@ -83,6 +158,8 @@ export function FileAppealModalWindow({ fileId, setWindowClose, setWindowChildre
|
|||||||
disabled={isSubmitting}
|
disabled={isSubmitting}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="appeal-actions">
|
<div className="appeal-actions">
|
||||||
<button
|
<button
|
||||||
className="btn btn-cancel"
|
className="btn btn-cancel"
|
||||||
@@ -100,7 +177,7 @@ export function FileAppealModalWindow({ fileId, setWindowClose, setWindowChildre
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -96,9 +96,9 @@ export function TrackingHistoryView() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
{t('city')}: <strong>{translatedCity}</strong>
|
{t('city')}: <strong title={translatedCity}>{translatedCity}</strong>
|
||||||
<br />
|
<br />
|
||||||
{t('country')}: <strong>{translatedCountry}</strong>
|
{t('country')}: <strong title={translatedCountry}>{translatedCountry}</strong>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -108,7 +108,7 @@ export function TrackingHistoryView() {
|
|||||||
{
|
{
|
||||||
accessorKey: 'document',
|
accessorKey: 'document',
|
||||||
header: ({ column }) => (
|
header: ({ column }) => (
|
||||||
<div className="column">
|
<div className="column column-document">
|
||||||
<span>
|
<span>
|
||||||
{t('document')}
|
{t('document')}
|
||||||
</span>
|
</span>
|
||||||
@@ -133,7 +133,7 @@ export function TrackingHistoryView() {
|
|||||||
</div>
|
</div>
|
||||||
),
|
),
|
||||||
cell: ({ row }) => (
|
cell: ({ row }) => (
|
||||||
<div className="text-center table-item">
|
<div className="text-center table-item column-document">
|
||||||
{row.original.document}
|
{row.original.document}
|
||||||
</div>
|
</div>
|
||||||
),
|
),
|
||||||
@@ -141,7 +141,7 @@ export function TrackingHistoryView() {
|
|||||||
{
|
{
|
||||||
accessorKey: 'view_date',
|
accessorKey: 'view_date',
|
||||||
header: ({ column }) => (
|
header: ({ column }) => (
|
||||||
<div className="column">
|
<div className="column column-viewer-date">
|
||||||
<span>
|
<span>
|
||||||
{t('date')} / {t('time')}
|
{t('date')} / {t('time')}
|
||||||
</span>
|
</span>
|
||||||
@@ -167,7 +167,7 @@ export function TrackingHistoryView() {
|
|||||||
),
|
),
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
return (
|
return (
|
||||||
<div className="text-center table-item">
|
<div className="text-center table-item column-viewer-date">
|
||||||
{row.original.view_date ? (
|
{row.original.view_date ? (
|
||||||
<>
|
<>
|
||||||
{formatDate(row.original.view_date)}
|
{formatDate(row.original.view_date)}
|
||||||
@@ -186,7 +186,7 @@ export function TrackingHistoryView() {
|
|||||||
{
|
{
|
||||||
accessorKey: 'viewer',
|
accessorKey: 'viewer',
|
||||||
header: ({ column }) => (
|
header: ({ column }) => (
|
||||||
<div className="column">
|
<div className="column column-viewer">
|
||||||
<span>
|
<span>
|
||||||
{t('who-opened')}
|
{t('who-opened')}
|
||||||
</span>
|
</span>
|
||||||
@@ -212,7 +212,7 @@ export function TrackingHistoryView() {
|
|||||||
),
|
),
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
return (
|
return (
|
||||||
<div className="text-center font-semibold table-item">
|
<div className="text-center font-semibold table-item column-viewer">
|
||||||
{row.original.viewer}
|
{row.original.viewer}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
@@ -247,7 +247,7 @@ export function TrackingHistoryView() {
|
|||||||
),
|
),
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
return (
|
return (
|
||||||
<div className="text-center font-semibold table-item">
|
<div className="text-center font-semibold table-item column-location">
|
||||||
{row.original.country === 'unknow/unknow' ? (
|
{row.original.country === 'unknow/unknow' ? (
|
||||||
t('not-defined')
|
t('not-defined')
|
||||||
) : (
|
) : (
|
||||||
@@ -260,7 +260,7 @@ export function TrackingHistoryView() {
|
|||||||
],
|
],
|
||||||
[]
|
[]
|
||||||
);
|
);
|
||||||
/* `${editLocationName(row.original.country)}` */
|
|
||||||
// Создание таблицы
|
// Создание таблицы
|
||||||
const table = useReactTable({
|
const table = useReactTable({
|
||||||
data: tableData,
|
data: tableData,
|
||||||
|
|||||||
@@ -493,7 +493,15 @@
|
|||||||
"enter-additional-info": "Any additional information that may help...",
|
"enter-additional-info": "Any additional information that may help...",
|
||||||
"submit-appeal": "Submit appeal",
|
"submit-appeal": "Submit appeal",
|
||||||
"submitting": "Submitting...",
|
"submitting": "Submitting...",
|
||||||
"active-appeal-already-exists-for-this-file": "Active appeal already exists for this file"
|
"active-appeal-already-exists-for-this-file": "Active appeal already exists for this file",
|
||||||
|
"appeal-information": "Appeal Information",
|
||||||
|
"appeal-status": "Status",
|
||||||
|
"appeal-created-at": "Created at",
|
||||||
|
"appeal-resolution": "Appeal Resolution",
|
||||||
|
"not-provided": "Not provided",
|
||||||
|
"admin-comment": "Admin Comment",
|
||||||
|
"resolved-at": "Resolved at",
|
||||||
|
"active-appeal-pending-message": "You have an active appeal pending review. Please wait for the admin to respond."
|
||||||
},
|
},
|
||||||
"Login-register-form": {
|
"Login-register-form": {
|
||||||
"and": "and",
|
"and": "and",
|
||||||
|
|||||||
@@ -493,7 +493,15 @@
|
|||||||
"enter-additional-info": "Любая дополнительная информация, которая может помочь...",
|
"enter-additional-info": "Любая дополнительная информация, которая может помочь...",
|
||||||
"submit-appeal": "Отправить апелляцию",
|
"submit-appeal": "Отправить апелляцию",
|
||||||
"submitting": "Отправка...",
|
"submitting": "Отправка...",
|
||||||
"active-appeal-already-exists-for-this-file": "По данному делу уже подана активная апелляция"
|
"active-appeal-already-exists-for-this-file": "По данному делу уже подана активная апелляция",
|
||||||
|
"appeal-information": "Информация об апелляции",
|
||||||
|
"appeal-status": "Статус",
|
||||||
|
"appeal-created-at": "Дата создания",
|
||||||
|
"appeal-resolution": "Результат апелляции",
|
||||||
|
"not-provided": "Не указано",
|
||||||
|
"admin-comment": "Комментарий администратора",
|
||||||
|
"resolved-at": "Дата решения",
|
||||||
|
"active-appeal-pending-message": "У вас есть активная апелляция на рассмотрении. Пожалуйста, дождитесь ответа администратора."
|
||||||
},
|
},
|
||||||
"Login-register-form": {
|
"Login-register-form": {
|
||||||
"and": "и",
|
"and": "и",
|
||||||
|
|||||||
Reference in New Issue
Block a user