asb_cloud_front/src/components/factory.ts

127 lines
3.8 KiB
TypeScript
Raw Normal View History

2021-08-13 14:46:22 +05:00
import { Dispatch, SetStateAction } from "react"
import notify from "./notify"
2021-07-30 16:13:26 +05:00
export const RegExpIsFloat = /^[-+]?\d+\.?\d?$/
/*
other - объект с дополнительными свойствами колонки
поддерживаются все базовые свойства из описания https://ant.design/components/table/#Column
плю дополнительные для колонок EditableTable:
editable - редактируемая колонка, bool
input - react компонента редактора (<Input/>, <InputNumber/>, <DatePicker/>...)
2021-07-30 16:13:26 +05:00
isRequired - значение может быть пустым,
formItemClass - css класс для <FormItem/>, если требуется
formItemRules - массив правил валидации значений https://ant.design/components/form/#Rule,
initialValue - дефолтное значение при добавлении новой строки
2021-07-30 16:13:26 +05:00
*/
2021-07-29 11:38:09 +05:00
export const makeColumn = (title:string, key:string, other?:any) => ({
2021-07-29 11:22:25 +05:00
title: title,
key: key,
dataIndex: key,
...other,
})
2021-07-29 11:22:25 +05:00
2021-07-30 16:13:26 +05:00
export const makeColumnsPlanFact = (title:string, key:string|string[], columsOther?:any|any[], gruopOther?:any) =>
2021-07-29 11:22:25 +05:00
{
2021-07-30 15:13:15 +05:00
let keyPlanLocal = key
let keyFactLocal = key
2021-07-29 11:22:25 +05:00
2021-07-30 15:13:15 +05:00
if(key instanceof Array){
keyPlanLocal = key[0]
keyFactLocal = key[1]
}else{
keyPlanLocal = key + 'Plan'
keyFactLocal = key + 'Fact'
2021-07-29 11:22:25 +05:00
}
2021-07-30 15:13:15 +05:00
let columsOtherLoacl :any[2]
if(columsOther instanceof Array)
columsOtherLoacl = [columsOther[0], columsOther[1]]
else
columsOtherLoacl = [columsOther, columsOther]
2021-07-29 11:22:25 +05:00
return {
title: title,
2021-07-30 15:13:15 +05:00
...gruopOther,
children: [
makeColumn('план', keyPlanLocal, columsOtherLoacl[0]),
makeColumn('факт', keyFactLocal, columsOtherLoacl[1]),
2021-07-29 11:22:25 +05:00
]
}
}
2021-08-13 14:46:22 +05:00
type PaginationContainer = {
skip?: number;
take?: number;
count?: number;
items?: any[] | null;
}
type asyncFunction = (...args:any) => Promise<any|void>;
export const makePaginationObject = (paginationContainer:PaginationContainer, ...other:any) => {
let page = 1 + Math.floor((paginationContainer.skip??0) /(paginationContainer.take??1));
return {
...other,
pageSize: paginationContainer.take,
total: paginationContainer.count ?? paginationContainer.items?.length ?? 0,
current: page,
}
}
2021-08-17 10:46:10 +05:00
export const updateFromWebApiWrapperAsync = async (funcAsync: asyncFunction, setShowLoader: Dispatch<SetStateAction<boolean>>, errorNotifyText: string) => {
2021-08-13 14:46:22 +05:00
if(setShowLoader)
setShowLoader(true)
try{
await funcAsync()
} catch (ex) {
if(process.env.NODE_ENV === 'development')
console.log(ex)
if(errorNotifyText)
notify(errorNotifyText, 'error')
} finally{
if(setShowLoader)
setShowLoader(false)
}
2021-08-17 10:46:10 +05:00
}
export const download = async (url:string, fileName?:string) => {
const response = await fetch(url, {
headers: {
Authorization: 'Bearer ' + localStorage['token']
},
method: 'Get'
})
const requestFileName = decodeURI(fileName
??response.headers
.get('content-disposition')
?.split(';')
.splice(-1)[0]
.split("'")
.splice(-1)[0]
?? url.replace('\\','/')
.split('/')
.splice(-1)[0]
?? 'file')
const blob = await response.blob()
const reader = new FileReader();
reader.readAsDataURL(blob);
reader.onload = function (e) {
let a = document.createElement('a');
a.href = (e.target?.result?.toString() ?? '');
a.download = requestFileName;
document.body.appendChild(a); // we need to append the element to the dom -> otherwise it will not work in firefox
a.click();
a.remove();
};
}
export const upload = async (url:string, formData: FormData) => {
await fetch(url, {
headers: {
Authorization: 'Bearer ' + localStorage['token']
},
method: 'Post',
body: formData,
})
2021-08-13 14:46:22 +05:00
}