sprof 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -0
- package/package.json +101 -0
- package/src/Hooks/Hooks.ts +75 -0
- package/src/assets/img/avatar.webp +0 -0
- package/src/assets/styles/borders.scss +11 -0
- package/src/assets/styles/brandbook.css +227 -0
- package/src/assets/styles/colors.scss +42 -0
- package/src/assets/styles/fonts.scss +15 -0
- package/src/assets/styles/index.css +15 -0
- package/src/assets/styles/index.scss +45 -0
- package/src/assets/styles/platform/android.css +53 -0
- package/src/assets/styles/platform/ios.css +53 -0
- package/src/assets/styles/platform/webdesktop.css +72 -0
- package/src/assets/styles/platform/webdesktop_old.css +65 -0
- package/src/assets/styles/platform/webmobile.css +53 -0
- package/src/assets/styles/platform/webtablet.css +53 -0
- package/src/assets/styles/reset.scss +28 -0
- package/src/assets/styles/shadow.scss +6 -0
- package/src/assets/styles/theme/aquaBlueLight.css +162 -0
- package/src/assets/styles/theme/blueLight.css +187 -0
- package/src/assets/styles/theme/blueLight_test.css +162 -0
- package/src/assets/styles/theme/dark.css +286 -0
- package/src/assets/styles/theme/light.css +151 -0
- package/src/assets/svg/ArrowLeft.svg +5 -0
- package/src/assets/svg/ArrowRight.svg +5 -0
- package/src/assets/svg/Close.svg +7 -0
- package/src/assets/svg/DoubleArrowLeft.svg +5 -0
- package/src/assets/svg/DoubleArrowRight.svg +5 -0
- package/src/assets/svg/Ellipsis.svg +7 -0
- package/src/assets/svg/Filter.svg +10 -0
- package/src/assets/svg/Menu.svg +5 -0
- package/src/assets/svg/Move.svg +5 -0
- package/src/assets/svg/Password.svg +5 -0
- package/src/assets/svg/RightMenu.svg +5 -0
- package/src/assets/svg/Settings.svg +6 -0
- package/src/assets/svg/User.svg +6 -0
- package/src/buildLibrary.ts +59 -0
- package/src/classes/Auth.ts +63 -0
- package/src/classes/AuthButton.ts +64 -0
- package/src/classes/AuthForm.ts +114 -0
- package/src/classes/AuthModal.ts +32 -0
- package/src/classes/AuthStatusesObjects.ts +37 -0
- package/src/classes/AuthTokens.ts +43 -0
- package/src/classes/AuthUser.ts +53 -0
- package/src/classes/CallbackRequest.ts +12 -0
- package/src/classes/Chat.ts +18 -0
- package/src/classes/ChatMessage.ts +48 -0
- package/src/classes/Contact.ts +96 -0
- package/src/classes/Cropper.ts +22 -0
- package/src/classes/DateHelper.ts +29 -0
- package/src/classes/Email.ts +18 -0
- package/src/classes/EmailField.ts +42 -0
- package/src/classes/EmailRules.ts +4 -0
- package/src/classes/FTSPPreset.ts +16 -0
- package/src/classes/FileInfo.ts +86 -0
- package/src/classes/HttpResponse.ts +22 -0
- package/src/classes/Human.ts +106 -0
- package/src/classes/LabelValue.ts +11 -0
- package/src/classes/LocalStore.ts +22 -0
- package/src/classes/M2M.ts +25 -0
- package/src/classes/Menu.ts +102 -0
- package/src/classes/PageSectionImage.ts +19 -0
- package/src/classes/PasswordField.ts +39 -0
- package/src/classes/PasswordRepeatField.ts +37 -0
- package/src/classes/Phone.ts +17 -0
- package/src/classes/PostAddress.ts +11 -0
- package/src/classes/PostAddressRules.ts +1 -0
- package/src/classes/Role.ts +13 -0
- package/src/classes/Schema.ts +13 -0
- package/src/classes/SchemaField.ts +10 -0
- package/src/classes/SearchElement.ts +18 -0
- package/src/classes/SearchElementMeta.ts +10 -0
- package/src/classes/SearchGroup.ts +25 -0
- package/src/classes/SearchGroupMetaColumn.ts +11 -0
- package/src/classes/SearchModel.ts +61 -0
- package/src/classes/SortModel.ts +57 -0
- package/src/classes/SubMenu.ts +56 -0
- package/src/classes/TelephoneNumberRules.ts +9 -0
- package/src/classes/User.ts +17 -0
- package/src/classes/UserAccount.ts +17 -0
- package/src/classes/UserService.ts +20 -0
- package/src/classes/ValidationRules.ts +15 -0
- package/src/classes/ValueType.ts +69 -0
- package/src/classes/Website.ts +11 -0
- package/src/classes/WebsiteRules.ts +4 -0
- package/src/classes/admin/AdminButtonParams.ts +27 -0
- package/src/classes/admin/AdminHeaderParams.ts +34 -0
- package/src/classes/calendar/Calendar.ts +168 -0
- package/src/classes/calendar/Day.ts +15 -0
- package/src/classes/calendar/Month.ts +144 -0
- package/src/classes/calendar/Week.ts +44 -0
- package/src/classes/calendar/Year.ts +130 -0
- package/src/classes/filters/Cursor.ts +43 -0
- package/src/classes/filters/FTSP.ts +99 -0
- package/src/classes/filters/FilterModel.ts +263 -0
- package/src/classes/filters/FilterQuery.ts +187 -0
- package/src/classes/filters/OperatorsOptions.ts +8 -0
- package/src/classes/filters/OperatorsTextOptions.ts +3 -0
- package/src/classes/filters/Pagination.ts +78 -0
- package/src/classes/filters/SelectFilter.ts +15 -0
- package/src/classes/filters/TreeModel.ts +14 -0
- package/src/classes/page/CustomSection.ts +24 -0
- package/src/classes/page/Page.ts +160 -0
- package/src/classes/page/PageDocument.ts +27 -0
- package/src/classes/page/PageImage.ts +15 -0
- package/src/classes/page/PageSection.ts +82 -0
- package/src/classes/page/PageSectionDocument.ts +56 -0
- package/src/classes/page/PageSideMenu.ts +74 -0
- package/src/components/AdaptiveContainer.vue +154 -0
- package/src/components/AdaptiveContainerHorizontal.vue +173 -0
- package/src/components/AdminGallery.vue +238 -0
- package/src/components/AuthModal.vue +16 -0
- package/src/components/CarouselImages.vue +434 -0
- package/src/components/ContactForm.vue +219 -0
- package/src/components/ContextWindow.vue +48 -0
- package/src/components/DateInputRange.vue +66 -0
- package/src/components/DateInputRange_v2.vue +25 -0
- package/src/components/DropList.vue +55 -0
- package/src/components/Edit.svg +10 -0
- package/src/components/EmailForm.vue +180 -0
- package/src/components/FTSPPanel.vue +379 -0
- package/src/components/FilterCheckbox.vue +73 -0
- package/src/components/FilterSelect.vue +104 -0
- package/src/components/FiltersButtonsSelect.vue +126 -0
- package/src/components/GeneralItem.vue +172 -0
- package/src/components/GridContainer.vue +66 -0
- package/src/components/Icons/Filter/IconDownload.vue +55 -0
- package/src/components/Icons/Filter/IconFilter.vue +55 -0
- package/src/components/Icons/IconArrowLeft.vue +36 -0
- package/src/components/Icons/IconCheckDefault.vue +41 -0
- package/src/components/Icons/IconClose.vue +37 -0
- package/src/components/Icons/IconEdit.vue +40 -0
- package/src/components/Icons/IconEmail.vue +36 -0
- package/src/components/Icons/IconMove.vue +53 -0
- package/src/components/Icons/IconPhone.vue +36 -0
- package/src/components/Icons/IconSearch.vue +47 -0
- package/src/components/Icons/IconSelectArrow.vue +41 -0
- package/src/components/Icons/Pagination/ArrowLeft.vue +52 -0
- package/src/components/Icons/Pagination/ArrowRight.vue +52 -0
- package/src/components/Icons/Pagination/DoubleArrowLeft.vue +52 -0
- package/src/components/Icons/Pagination/DoubleArrowRight.vue +52 -0
- package/src/components/Icons/Pagination/EllipsisSvg.vue +58 -0
- package/src/components/ImageCropper.vue +203 -0
- package/src/components/InfoItem.vue +294 -0
- package/src/components/InfoItemSelectButtons.vue +43 -0
- package/src/components/LeftRightContainer.vue +93 -0
- package/src/components/MessageBody.vue +45 -0
- package/src/components/PAutocomplete.vue +93 -0
- package/src/components/PDialog.vue +77 -0
- package/src/components/PLoader.vue +68 -0
- package/src/components/PNotification.vue +79 -0
- package/src/components/PPagination.vue +174 -0
- package/src/components/PhoneForm.vue +180 -0
- package/src/components/RSContainer.vue +262 -0
- package/src/components/RemoteSearch.vue +156 -0
- package/src/components/ResearcheContainer.vue +71 -0
- package/src/components/RightSliderContainer.vue +181 -0
- package/src/components/RightTabsContainer.vue +210 -0
- package/src/components/SelectValueType.vue +39 -0
- package/src/components/SingleNameToggleForm.vue +399 -0
- package/src/components/SortList.vue +101 -0
- package/src/components/SortSelect.vue +93 -0
- package/src/components/SvgIcon.vue +25 -0
- package/src/components/Switch3Pos.vue +173 -0
- package/src/components/ThemeWrapper.vue +19 -0
- package/src/components/ToggleInfoItem.vue +296 -0
- package/src/components/TopSliderContainer.vue +166 -0
- package/src/components/UploaderImage.vue +268 -0
- package/src/components/atoms/PButton/PButton.stories.ts +44 -0
- package/src/components/atoms/PButton/PButton.test.ts +66 -0
- package/src/components/atoms/PButton/PButton.vue +54 -0
- package/src/components/atoms/PButton/skins/p-button_base.css +131 -0
- package/src/components/atoms/PButton/skins/p-button_filter.scss +83 -0
- package/src/components/atoms/PButton/skins/p-button_icon.scss +78 -0
- package/src/components/atoms/PButton/skins/p-button_pag.css +44 -0
- package/src/components/atoms/PButton/skins/p-button_text.css +88 -0
- package/src/components/atoms/PButton/skins/p-button_text_ano.css +88 -0
- package/src/components/atoms/PCheckbox/PCheckBox.test.ts +107 -0
- package/src/components/atoms/PCheckbox/PCheckBox.vue +92 -0
- package/src/components/atoms/PDatePicker/PDatePicker.test.ts +63 -0
- package/src/components/atoms/PDatePicker/PDatePicker.vue +141 -0
- package/src/components/atoms/PFlex/PFlex.test.ts +41 -0
- package/src/components/atoms/PFlex/PFlex.vue +46 -0
- package/src/components/atoms/PInput/PInput.stories.ts +40 -0
- package/src/components/atoms/PInput/PInput.test.ts +92 -0
- package/src/components/atoms/PInput/PInput.vue +133 -0
- package/src/components/atoms/PInputDate/PInputDate.test.ts +55 -0
- package/src/components/atoms/PInputDate/PInputDate.vue +79 -0
- package/src/components/atoms/PInputNumber/PInputNumber.vue +175 -0
- package/src/components/atoms/PLeftSlider/PLeftSlider.test.ts +121 -0
- package/src/components/atoms/PLeftSlider/PLeftSlider.vue +139 -0
- package/src/components/atoms/PList/PList.test.ts +32 -0
- package/src/components/atoms/PList/PList.vue +27 -0
- package/src/components/atoms/PListItem/PListItem.test.ts +61 -0
- package/src/components/atoms/PListItem/PListItem.vue +51 -0
- package/src/components/atoms/PRadio/PRadio.test.ts +110 -0
- package/src/components/atoms/PRadio/PRadio.vue +97 -0
- package/src/components/atoms/PRightSlider/PRightSlider.test.ts +123 -0
- package/src/components/atoms/PRightSlider/PRightSlider.vue +149 -0
- package/src/components/atoms/PSelect/PSelect.test.ts +74 -0
- package/src/components/atoms/PSelect/PSelect.vue +192 -0
- package/src/components/atoms/PSelect/select-arrow-down.svg +4 -0
- package/src/components/atoms/PSticky/PSticky.test.ts +70 -0
- package/src/components/atoms/PSticky/PSticky.vue +37 -0
- package/src/components/atoms/PString/PString.test.ts +58 -0
- package/src/components/atoms/PString/PString.vue +58 -0
- package/src/components/atoms/PTextarea/PTextarea.stories.ts +40 -0
- package/src/components/atoms/PTextarea/PTextarea.test.ts +22 -0
- package/src/components/atoms/PTextarea/PTextarea.vue +123 -0
- package/src/components/atoms/PTopSlider/PTopSlider.test.ts +95 -0
- package/src/components/atoms/PTopSlider/PTopSlider.vue +164 -0
- package/src/components/molecules/Collapse/CollapseContainer.vue +36 -0
- package/src/components/molecules/Collapse/CollapseItem.vue +295 -0
- package/src/components/molecules/Collapse/VerticalCollapseContainer.vue +102 -0
- package/src/components/molecules/PAdd/PAdd.vue +65 -0
- package/src/components/molecules/PAdd/PContainer.vue +65 -0
- package/src/components/molecules/PAdd/PContainerStickyHead.vue +51 -0
- package/src/components/molecules/PDel/PDel.vue +74 -0
- package/src/components/organisms/AuthForm.vue +219 -0
- package/src/components/organisms/PModal.vue +113 -0
- package/src/components/organisms/PTabs/ITab.ts +5 -0
- package/src/components/organisms/PTabs/PTabs.vue +190 -0
- package/src/components/organisms/UploaderFile/UploaderFile.test.ts +23 -0
- package/src/components/organisms/UploaderFile/UploaderFile.vue +202 -0
- package/src/components/pages/AuthPage.vue +22 -0
- package/src/components/pages/PageNotFound.vue +7 -0
- package/src/index.ts +206 -0
- package/src/interfaces/AdminLayout.ts +4 -0
- package/src/interfaces/Animations.ts +5 -0
- package/src/interfaces/AuthStatuses.ts +8 -0
- package/src/interfaces/CalendarScale.ts +6 -0
- package/src/interfaces/Callback.ts +2 -0
- package/src/interfaces/Class.ts +3 -0
- package/src/interfaces/DataTypes.ts +8 -0
- package/src/interfaces/Filter.ts +3 -0
- package/src/interfaces/IAdminMenu.ts +9 -0
- package/src/interfaces/IAuthInfo.ts +0 -0
- package/src/interfaces/ICursor.ts +14 -0
- package/src/interfaces/IEmailPassword.ts +4 -0
- package/src/interfaces/IFIlesList.ts +4 -0
- package/src/interfaces/IFile.ts +7 -0
- package/src/interfaces/IFileAnchor.ts +4 -0
- package/src/interfaces/IFileInfo.ts +22 -0
- package/src/interfaces/IFileInfosGetter.ts +5 -0
- package/src/interfaces/IFiler.ts +7 -0
- package/src/interfaces/IFilter.ts +4 -0
- package/src/interfaces/IFilterQuery.ts +24 -0
- package/src/interfaces/IForm.ts +5 -0
- package/src/interfaces/IHTTPTypes.ts +19 -0
- package/src/interfaces/IMessage.ts +5 -0
- package/src/interfaces/IOption.ts +4 -0
- package/src/interfaces/IOrdered.ts +4 -0
- package/src/interfaces/IPagination.ts +15 -0
- package/src/interfaces/ISearchElement.ts +6 -0
- package/src/interfaces/ISearchObject.ts +6 -0
- package/src/interfaces/ISearchQuery.ts +4 -0
- package/src/interfaces/ISelectFilter.ts +6 -0
- package/src/interfaces/ISortModel.ts +18 -0
- package/src/interfaces/IStorePaginator.ts +4 -0
- package/src/interfaces/ISupposedTimePeriod.ts +4 -0
- package/src/interfaces/ITimePeriod.ts +4 -0
- package/src/interfaces/ITokens.ts +4 -0
- package/src/interfaces/IWithId.ts +3 -0
- package/src/interfaces/IWithImage.ts +9 -0
- package/src/interfaces/IWithName.ts +4 -0
- package/src/interfaces/IWithSupposedTimePeriod.ts +4 -0
- package/src/interfaces/ItemsWithCount.ts +4 -0
- package/src/interfaces/LocalStoreKeys.ts +7 -0
- package/src/interfaces/Operators.ts +11 -0
- package/src/interfaces/Orders.ts +4 -0
- package/src/interfaces/RoleName.ts +4 -0
- package/src/interfaces/SocialTypes.ts +6 -0
- package/src/interfaces/Sort.ts +9 -0
- package/src/interfaces/ValueRelation.ts +7 -0
- package/src/interfaces/canvas/ICanvas.ts +3 -0
- package/src/interfaces/canvas/ICanvasResult.ts +7 -0
- package/src/interfaces/canvas/ICoordinates.ts +6 -0
- package/src/interfaces/types.ts +3 -0
- package/src/services/AdminHead.ts +32 -0
- package/src/services/AdminSideMenu.ts +52 -0
- package/src/services/AdminUI.ts +9 -0
- package/src/services/Arrays.ts +65 -0
- package/src/services/Axios.ts +64 -0
- package/src/services/BaseRoutes.ts +21 -0
- package/src/services/BaseStore.ts +220 -0
- package/src/services/Button.ts +42 -0
- package/src/services/Cache.ts +44 -0
- package/src/services/CacheS.ts +44 -0
- package/src/services/CarouselSwipe.ts +14 -0
- package/src/services/ClassHelper.ts +101 -0
- package/src/services/Color.ts +8 -0
- package/src/services/CreateSortModels.ts +26 -0
- package/src/services/Cursor.ts +51 -0
- package/src/services/DateFormat.ts +102 -0
- package/src/services/DateMask.ts +69 -0
- package/src/services/Dates.ts +41 -0
- package/src/services/DatesFormatter.ts +45 -0
- package/src/services/Dialog.ts +70 -0
- package/src/services/Dragger.ts +22 -0
- package/src/services/Extension.ts +6 -0
- package/src/services/Favourite.ts +62 -0
- package/src/services/HttpClient.ts +199 -0
- package/src/services/HttpClientS.ts +188 -0
- package/src/services/HttpError.ts +58 -0
- package/src/services/Loading.ts +14 -0
- package/src/services/MakeCarousel.ts +10 -0
- package/src/services/Menu.ts +102 -0
- package/src/services/Message.ts +66 -0
- package/src/services/Notification.ts +37 -0
- package/src/services/PHelp.ts +20 -0
- package/src/services/Paginator.ts +22 -0
- package/src/services/Period.ts +29 -0
- package/src/services/PhoneService.ts +46 -0
- package/src/services/Router.ts +85 -0
- package/src/services/RouterGuard.ts +15 -0
- package/src/services/Scheduler.ts +66 -0
- package/src/services/Scroll.ts +19 -0
- package/src/services/SortList.ts +44 -0
- package/src/services/Sorter.ts +6 -0
- package/src/services/Strings.test.ts +30 -0
- package/src/services/Strings.ts +138 -0
- package/src/services/Time.ts +124 -0
- package/src/services/Timer.ts +13 -0
- package/src/services/Token.ts +71 -0
- package/src/services/Visible.ts +16 -0
- package/src/services/WaitElement.ts +19 -0
- package/src/services/WebSocketClient.ts +62 -0
- package/src/services/brandColors.ts +5 -0
- package/src/services/buildNameNumbers.ts +8 -0
- package/src/services/countRating.ts +12 -0
- package/src/services/index.ts +105 -0
- package/src/services/indexNames.ts +55 -0
- package/src/services/moves.ts +17 -0
- package/src/services/useConfirmLeavePage.ts +52 -0
- package/src/services/validate.ts +22 -0
- package/src/store/AuthStore.ts +58 -0
- package/src/store/ContactsStore.ts +11 -0
- package/src/store/CropperStore.ts +20 -0
- package/src/store/EmailsStore.ts +11 -0
- package/src/store/FTSPPresetsStore.ts +11 -0
- package/src/store/FileInfosStore.ts +11 -0
- package/src/store/HumansStore.ts +11 -0
- package/src/store/MenusStore.ts +11 -0
- package/src/store/PhonesStore.ts +11 -0
- package/src/store/SchemasStore.ts +11 -0
- package/src/store/SearchStore.ts +65 -0
- package/src/store/ServicesStores.ts +29 -0
- package/src/store/ServicesStoresNames.ts +17 -0
- package/src/store/UserAccountsStore.ts +11 -0
- package/src/store/ValueTypesStore.ts +11 -0
- package/src/tsconfig.build-lib.json +30 -0
- package/src/types/AuthInfo.ts +6 -0
- package/src/types/HttpHeaders.ts +12 -0
- package/src/types/HttpMethods.ts +6 -0
- package/src/types/Sizes.ts +7 -0
- package/src/types/Statuses.ts +9 -0
- package/src/types/ValueTypes.ts +16 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
const isRemove = (n: number) => n === 8 || n === 46;
|
|
2
|
+
const isDigit = (n: number) => n > 46 && n < 58;
|
|
3
|
+
const isNavigate = (n: number) => n > 34 && n < 41;
|
|
4
|
+
// const isSpace = (n: number) => n === 47;
|
|
5
|
+
const addDot = (val: string) => val + '.';
|
|
6
|
+
|
|
7
|
+
const checkInvalidKey = (e: KeyboardEvent, code: number, len: number) => {
|
|
8
|
+
if (isRemove(code) || isNavigate(code)) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
if (!isDigit(code) || len > 9) {
|
|
12
|
+
e.preventDefault();
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
function replaceDots(val: string, len: number): string {
|
|
17
|
+
if (len > 8) {
|
|
18
|
+
let day = val.substring(0, 2).replace('.', '1');
|
|
19
|
+
if (Number(day) > 31) {
|
|
20
|
+
day = '31';
|
|
21
|
+
}
|
|
22
|
+
let month = val.substring(3, 5).replace('.', '1');
|
|
23
|
+
if (Number(month) > 12) {
|
|
24
|
+
month = '12';
|
|
25
|
+
}
|
|
26
|
+
let year = val.substring(6, 10).replace('.', '1');
|
|
27
|
+
if (Number(year) > 2100) {
|
|
28
|
+
year = '2100';
|
|
29
|
+
}
|
|
30
|
+
val = day + '.' + month + '.' + year;
|
|
31
|
+
}
|
|
32
|
+
return val;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export default function dateFormat(e: KeyboardEvent): void {
|
|
36
|
+
const code = e.keyCode;
|
|
37
|
+
let val = (<HTMLInputElement>e.srcElement).value;
|
|
38
|
+
const len = val.length;
|
|
39
|
+
checkInvalidKey(e, code, len);
|
|
40
|
+
if (!isRemove(code) && (len === 2 || len === 5)) {
|
|
41
|
+
val = addDot(val);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const allValue = (<HTMLInputElement>e.srcElement).value + String.fromCharCode(e.which);
|
|
45
|
+
if (isRemove(code)) {
|
|
46
|
+
(<HTMLInputElement>e.srcElement).value = val;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (val.length === 0 && Number(allValue) > 3) {
|
|
51
|
+
val = '3';
|
|
52
|
+
e.preventDefault();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (val.length === 1 && Number(allValue) > 31) {
|
|
56
|
+
val = '31';
|
|
57
|
+
e.preventDefault();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (allValue.length === 5) {
|
|
61
|
+
const month = Number(allValue.substring(3, 5));
|
|
62
|
+
if (month > 12) {
|
|
63
|
+
val = val.substring(0, 3) + '12';
|
|
64
|
+
e.preventDefault();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
val = replaceDots(val, len);
|
|
68
|
+
(<HTMLInputElement>e.srcElement).value = val;
|
|
69
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import DatesFormatter from './DatesFormatter';
|
|
2
|
+
import Period from './Period';
|
|
3
|
+
|
|
4
|
+
// const SetDays = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'];
|
|
5
|
+
// const SetDaysMobile = ['ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ', 'СБ', 'ВС'];
|
|
6
|
+
// const SetShortDays = ['ВС', 'ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ', 'СБ'];
|
|
7
|
+
|
|
8
|
+
interface IWithDate {
|
|
9
|
+
date: Date;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default abstract class Dates {
|
|
13
|
+
static GetPeriod(start: Date, end: Date): string {
|
|
14
|
+
return Period.Get(DatesFormatter.Format(start), DatesFormatter.Format(end));
|
|
15
|
+
}
|
|
16
|
+
static GetDateOrToday(item?: IWithDate): Date {
|
|
17
|
+
return item ? item.date : new Date();
|
|
18
|
+
}
|
|
19
|
+
static InPeriod(date: Date, start: Date, end: Date): boolean {
|
|
20
|
+
return Period.In(new Date(date), new Date(start), new Date(end));
|
|
21
|
+
}
|
|
22
|
+
static GetDatesFromPeriod(start: Date, end: Date): Date[] {
|
|
23
|
+
const dates: Date[] = [new Date(start)];
|
|
24
|
+
let curDate = start;
|
|
25
|
+
while (curDate <= end) {
|
|
26
|
+
curDate = Dates.AddDays(curDate, 1);
|
|
27
|
+
dates.push(curDate);
|
|
28
|
+
}
|
|
29
|
+
return dates;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static AddDays(date: Date, days: number): Date {
|
|
33
|
+
const res = new Date(date);
|
|
34
|
+
res.setDate(res.getDate() + days);
|
|
35
|
+
return res;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static Eq(d1: Date, d2: Date): boolean {
|
|
39
|
+
return d1.getTime() === d2.getTime();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// const SetDays = ['Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресенье'];
|
|
2
|
+
// const SetDaysMobile = ['ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ', 'СБ', 'ВС'];
|
|
3
|
+
// const SetShortDays = ['ВС', 'ПН', 'ВТ', 'СР', 'ЧТ', 'ПТ', 'СБ'];
|
|
4
|
+
|
|
5
|
+
interface CustomDateTimeFormatOptions {
|
|
6
|
+
localeMatcher?: string;
|
|
7
|
+
weekday?: 'narrow' | 'short' | 'long';
|
|
8
|
+
era?: string;
|
|
9
|
+
year?: 'numeric' | '2-digit' | undefined;
|
|
10
|
+
month?: 'numeric' | '2-digit' | 'narrow' | 'short' | 'long';
|
|
11
|
+
day?: 'numeric' | '2-digit' | undefined;
|
|
12
|
+
hour?: 'numeric' | '2-digit';
|
|
13
|
+
minute?: 'numeric' | '2-digit';
|
|
14
|
+
second?: string;
|
|
15
|
+
timeZoneName?: string;
|
|
16
|
+
formatMatcher?: string;
|
|
17
|
+
hour12?: boolean;
|
|
18
|
+
timeZone?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const locale = 'ru-RU';
|
|
22
|
+
export default abstract class DatesFormatter {
|
|
23
|
+
locale = 'ru-RU';
|
|
24
|
+
|
|
25
|
+
static Format(date?: Date, options?: CustomDateTimeFormatOptions): string {
|
|
26
|
+
if (!date) {
|
|
27
|
+
return '';
|
|
28
|
+
}
|
|
29
|
+
const opt: Intl.DateTimeFormatOptions = { year: 'numeric', month: '2-digit', day: '2-digit', hour: undefined, minute: undefined };
|
|
30
|
+
if (options) {
|
|
31
|
+
opt.year = options.year || options.year === undefined ? options.year : opt.year;
|
|
32
|
+
opt.month = options.month || options.month === undefined ? options.month : opt.month;
|
|
33
|
+
opt.day = options.day || options.day === undefined ? options.day : opt.day;
|
|
34
|
+
opt.hour = options.hour ?? opt.hour;
|
|
35
|
+
opt.minute = options.minute ?? opt.minute;
|
|
36
|
+
}
|
|
37
|
+
return Intl.DateTimeFormat(locale, opt).format(new Date(date));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
static FromRuStr(value: string): Date {
|
|
41
|
+
const parts = value.split('.');
|
|
42
|
+
const date = new Date(`${parts[2]}-${parts[1]}-${parts[0]}`);
|
|
43
|
+
return date;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import Message, { MessageOpts } from './Message';
|
|
2
|
+
|
|
3
|
+
type DialogResultType = 'cancel' | 'submit';
|
|
4
|
+
interface DialogResult {
|
|
5
|
+
type: DialogResultType;
|
|
6
|
+
// eslint-disable-next-line
|
|
7
|
+
[key: string]: any;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
type DialogOpts = MessageOpts & {
|
|
11
|
+
text: string;
|
|
12
|
+
confirmButtonText: string;
|
|
13
|
+
cancelButtonText: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
class DialogConstructor extends Message {
|
|
17
|
+
private confirmButtonText = 'Да';
|
|
18
|
+
private cancelButtonText = 'Нет';
|
|
19
|
+
|
|
20
|
+
// eslint-disable-next-line
|
|
21
|
+
private resolve?: any;
|
|
22
|
+
// eslint-disable-next-line
|
|
23
|
+
private reject?: any;
|
|
24
|
+
|
|
25
|
+
GetConfirmButtonText(): string {
|
|
26
|
+
return this.confirmButtonText;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
GetCancelButtonText(): string {
|
|
30
|
+
return this.cancelButtonText;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
Show(m: string | DialogOpts): Promise<DialogResult> {
|
|
34
|
+
super.show();
|
|
35
|
+
if (typeof m !== 'string') {
|
|
36
|
+
this.confirmButtonText = m.confirmButtonText;
|
|
37
|
+
this.cancelButtonText = m.cancelButtonText;
|
|
38
|
+
}
|
|
39
|
+
return new Promise<DialogResult>((resolve, reject) => {
|
|
40
|
+
this.resolve = resolve;
|
|
41
|
+
this.reject = reject;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
Save(): Promise<DialogResult> {
|
|
46
|
+
return this.Show({
|
|
47
|
+
text: 'У вас есть несохранённые изменения',
|
|
48
|
+
confirmButtonText: 'Сохранить',
|
|
49
|
+
cancelButtonText: 'Не сохранять',
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
Submit() {
|
|
54
|
+
this.resolve(true);
|
|
55
|
+
this.hide();
|
|
56
|
+
}
|
|
57
|
+
Cancel() {
|
|
58
|
+
this.reject();
|
|
59
|
+
this.hide();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
protected hide() {
|
|
63
|
+
this.resolve = undefined;
|
|
64
|
+
this.reject = undefined;
|
|
65
|
+
super.hide();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const Dialog: DialogConstructor = new DialogConstructor();
|
|
70
|
+
export default Dialog;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export default class Dragger {
|
|
2
|
+
private dragged = false;
|
|
3
|
+
private dragImg = new Image();
|
|
4
|
+
|
|
5
|
+
constructor() {
|
|
6
|
+
this.dragImg.src = 'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=';
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
start(e?: DragEvent): void {
|
|
10
|
+
this.dragged = true;
|
|
11
|
+
if (e && e.dataTransfer) {
|
|
12
|
+
e.dataTransfer.setDragImage(this.dragImg, 0, 0);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
end(): void {
|
|
17
|
+
this.dragged = false;
|
|
18
|
+
}
|
|
19
|
+
isDragged(): boolean {
|
|
20
|
+
return this.dragged;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const FavouriteService = (() => {
|
|
2
|
+
function _setFavourite(domain: string, id: (string | undefined)[]) {
|
|
3
|
+
localStorage.setItem(`${domain}_favourite`, id.toString());
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
function _isFavourite(domain: string, id: string): boolean {
|
|
7
|
+
const ids = localStorage.getItem(`${domain}_favourite`);
|
|
8
|
+
if (!ids) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
const idArr = ids.split(',');
|
|
12
|
+
return idArr.includes(id);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function _addToFavourite(domain: string, id: string) {
|
|
16
|
+
const ids = localStorage.getItem(`${domain}_favourite`);
|
|
17
|
+
if (!ids) {
|
|
18
|
+
_setFavourite(domain, [id]);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const idArr = ids!.split(',');
|
|
22
|
+
idArr.push(id);
|
|
23
|
+
_setFavourite(domain, idArr);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function _removeFromFavourite(domain: string, id: string) {
|
|
27
|
+
const ids = localStorage.getItem(`${domain}_favourite`);
|
|
28
|
+
if (!ids) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const idArr = ids.split(',').filter((i: string) => i !== id);
|
|
32
|
+
_setFavourite(domain, idArr);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function _clearFavourite() {
|
|
36
|
+
for (const key in localStorage) {
|
|
37
|
+
if (key.includes('_favourite')) {
|
|
38
|
+
localStorage.removeItem(key);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// function _getAccessToken() {
|
|
43
|
+
// return localStorage.getItem('access_token');
|
|
44
|
+
// }
|
|
45
|
+
// function _getRefreshToken() {
|
|
46
|
+
// return localStorage.getItem('refresh_token');
|
|
47
|
+
// }
|
|
48
|
+
// function _clearTokens() {
|
|
49
|
+
// localStorage.removeItem('access_token');
|
|
50
|
+
// localStorage.removeItem('refresh_token');
|
|
51
|
+
// }
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
addToFavourite: _addToFavourite,
|
|
55
|
+
removeFromFavourite: _removeFromFavourite,
|
|
56
|
+
setFavourite: _setFavourite,
|
|
57
|
+
isFavourite: _isFavourite,
|
|
58
|
+
clearFavourite: _clearFavourite,
|
|
59
|
+
};
|
|
60
|
+
})();
|
|
61
|
+
|
|
62
|
+
export default FavouriteService;
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import HttpEngine from "@/services/Axios";
|
|
2
|
+
import FileInfo from "@/services/classes/FileInfo";
|
|
3
|
+
import {
|
|
4
|
+
IBodilessParams,
|
|
5
|
+
IBodyfulParams,
|
|
6
|
+
} from "@/services/interfaces/IHTTPTypes";
|
|
7
|
+
|
|
8
|
+
import LocalStore from "../classes/LocalStore";
|
|
9
|
+
import LocalStoreKeys from "../interfaces/LocalStoreKeys";
|
|
10
|
+
import HttpHeaders, {
|
|
11
|
+
HttpHeadersKeys,
|
|
12
|
+
HttpHeadersValues,
|
|
13
|
+
} from "../types/HttpHeaders";
|
|
14
|
+
|
|
15
|
+
const baseUrl = import.meta.env.VITE_APP_BASE_URL ?? "";
|
|
16
|
+
const apiVersion = import.meta.env.VITE_APP_API_V1 ?? "";
|
|
17
|
+
const apiHost = import.meta.env.VITE_APP_API_HOST ?? "";
|
|
18
|
+
|
|
19
|
+
export default class HttpClient {
|
|
20
|
+
endpoint: string;
|
|
21
|
+
headers: HttpHeaders;
|
|
22
|
+
|
|
23
|
+
constructor(endpoint = "") {
|
|
24
|
+
this.endpoint = endpoint;
|
|
25
|
+
this.headers = {
|
|
26
|
+
[HttpHeadersKeys.ContentType]: HttpHeadersValues.ApplicationJson,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
newWebSocket(query: string): WebSocket {
|
|
31
|
+
const url =
|
|
32
|
+
apiHost.replace("http", "ws") + "/ws" + "/" + this.endpoint + "/" + query;
|
|
33
|
+
return new WebSocket(url);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
private static download(clientFileName: string | undefined, res: unknown) {
|
|
37
|
+
const fileName = HttpClient.getDownloadFileName(
|
|
38
|
+
clientFileName,
|
|
39
|
+
res.headers
|
|
40
|
+
);
|
|
41
|
+
const url = URL.createObjectURL(res.data);
|
|
42
|
+
|
|
43
|
+
const link = document.createElement("a");
|
|
44
|
+
link.href = url;
|
|
45
|
+
link.setAttribute("download", fileName);
|
|
46
|
+
link.setAttribute("target", "_blank");
|
|
47
|
+
document.body.appendChild(link);
|
|
48
|
+
link.click();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// eslint-disable-next-line
|
|
52
|
+
private static getDownloadFileName(
|
|
53
|
+
clientFileName: string | undefined,
|
|
54
|
+
headers: any
|
|
55
|
+
): string {
|
|
56
|
+
if (clientFileName) {
|
|
57
|
+
return clientFileName;
|
|
58
|
+
}
|
|
59
|
+
const headerLine = headers["content-disposition"];
|
|
60
|
+
const startFileNameIndex = headerLine.indexOf('"') + 1;
|
|
61
|
+
const endFileNameIndex = headerLine.lastIndexOf('"');
|
|
62
|
+
const serverFileName = headerLine.substring(
|
|
63
|
+
startFileNameIndex,
|
|
64
|
+
endFileNameIndex
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
if (serverFileName) {
|
|
68
|
+
return serverFileName;
|
|
69
|
+
}
|
|
70
|
+
return "file";
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
private getHeaders(headers?: HttpHeaders): HttpHeaders {
|
|
74
|
+
const token = LocalStore.Get<string>(LocalStoreKeys.AccessToken);
|
|
75
|
+
if (!headers) {
|
|
76
|
+
headers = this.headers;
|
|
77
|
+
}
|
|
78
|
+
if (token) {
|
|
79
|
+
headers[HttpHeadersKeys.Token] = token;
|
|
80
|
+
}
|
|
81
|
+
return headers ?? this.headers;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private returnResponse<ReturnType, PayloadType>(
|
|
85
|
+
params: IBodilessParams | IBodyfulParams<PayloadType> | undefined,
|
|
86
|
+
res: unknown
|
|
87
|
+
): ReturnType | void {
|
|
88
|
+
if (!res) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
return params?.isBlob
|
|
92
|
+
? HttpClient.download(params.downloadFileName, res)
|
|
93
|
+
: res.data;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async get<ReturnType>(params?: IBodilessParams): Promise<ReturnType | void> {
|
|
97
|
+
return this.returnResponse(
|
|
98
|
+
params,
|
|
99
|
+
await HttpEngine.Get(
|
|
100
|
+
this.buildUrl(params?.query),
|
|
101
|
+
this.getHeaders(params?.headers),
|
|
102
|
+
this.getResponseType(params?.isBlob)
|
|
103
|
+
)
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async post<PayloadType, ReturnType>(
|
|
108
|
+
params: IBodyfulParams<PayloadType>
|
|
109
|
+
): Promise<ReturnType | void> {
|
|
110
|
+
return this.returnResponse(
|
|
111
|
+
params,
|
|
112
|
+
await HttpEngine.Post(
|
|
113
|
+
this.buildUrl(params?.query),
|
|
114
|
+
this.getHeaders(params?.headers),
|
|
115
|
+
this.getResponseType(params.isBlob),
|
|
116
|
+
this.createFormDataPayload<PayloadType>(
|
|
117
|
+
params?.payload,
|
|
118
|
+
params?.fileInfos
|
|
119
|
+
)
|
|
120
|
+
)
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async put<PayloadType, ReturnType>(
|
|
125
|
+
params: IBodyfulParams<PayloadType>
|
|
126
|
+
): Promise<ReturnType | void> {
|
|
127
|
+
return this.returnResponse(
|
|
128
|
+
params,
|
|
129
|
+
await HttpEngine.Put(
|
|
130
|
+
this.buildUrl(params?.query),
|
|
131
|
+
this.getHeaders(params?.headers),
|
|
132
|
+
this.createFormDataPayload<PayloadType>(
|
|
133
|
+
params?.payload,
|
|
134
|
+
params?.fileInfos
|
|
135
|
+
)
|
|
136
|
+
)
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async delete<PayloadType, ReturnType>(
|
|
141
|
+
params: IBodyfulParams<PayloadType>
|
|
142
|
+
): Promise<ReturnType | void> {
|
|
143
|
+
return this.returnResponse(
|
|
144
|
+
params,
|
|
145
|
+
await HttpEngine.Delete(
|
|
146
|
+
this.buildUrl(params?.query),
|
|
147
|
+
this.getHeaders(params?.headers),
|
|
148
|
+
this.createFormDataPayload<PayloadType>(
|
|
149
|
+
params?.payload,
|
|
150
|
+
params?.fileInfos
|
|
151
|
+
)
|
|
152
|
+
)
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async subscribe<PayloadType>(
|
|
157
|
+
params: IBodyfulParams<PayloadType>
|
|
158
|
+
): Promise<EventSource> {
|
|
159
|
+
const { query } = params;
|
|
160
|
+
|
|
161
|
+
const source = new EventSource(this.buildUrl(query));
|
|
162
|
+
return source;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private buildUrl(query?: string): string {
|
|
166
|
+
if (query) {
|
|
167
|
+
const queryString = query ?? "";
|
|
168
|
+
return this.endpoint.length <= 0
|
|
169
|
+
? baseUrl + apiVersion + queryString
|
|
170
|
+
: baseUrl + apiVersion + this.endpoint + "/" + queryString;
|
|
171
|
+
}
|
|
172
|
+
return baseUrl + apiVersion + this.endpoint;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
private getResponseType(blob?: boolean): "blob" | "json" {
|
|
176
|
+
return blob ? "blob" : "json";
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
private createFormDataPayload<PayloadType>(
|
|
180
|
+
payload?: PayloadType,
|
|
181
|
+
fileInfos?: FileInfo[]
|
|
182
|
+
): FormData {
|
|
183
|
+
const data = new FormData();
|
|
184
|
+
data.append("form", JSON.stringify(payload));
|
|
185
|
+
|
|
186
|
+
if (fileInfos) {
|
|
187
|
+
for (const fileInfo of fileInfos) {
|
|
188
|
+
if (fileInfo.file) {
|
|
189
|
+
data.append(
|
|
190
|
+
fileInfo.id ?? "files",
|
|
191
|
+
fileInfo.file,
|
|
192
|
+
fileInfo.originalName
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return data;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import HttpEngine from "@/services/Axios";
|
|
2
|
+
import FileInfo from "@/services/classes/FileInfo";
|
|
3
|
+
import {
|
|
4
|
+
IBodilessParams,
|
|
5
|
+
IBodyfulParams,
|
|
6
|
+
} from "@/services/interfaces/IHTTPTypes";
|
|
7
|
+
|
|
8
|
+
import LocalStore from "../classes/LocalStore";
|
|
9
|
+
import LocalStoreKeys from "../interfaces/LocalStoreKeys";
|
|
10
|
+
import HttpHeaders, {
|
|
11
|
+
HttpHeadersKeys,
|
|
12
|
+
HttpHeadersValues,
|
|
13
|
+
} from "../types/HttpHeaders";
|
|
14
|
+
|
|
15
|
+
const baseUrl = import.meta.env.VITE_APP_BASE_URL ?? "";
|
|
16
|
+
const apiVersion = import.meta.env.VITE_APP_API_V1 ?? "";
|
|
17
|
+
const apiHost = import.meta.env.VITE_APP_API_HOST ?? "";
|
|
18
|
+
|
|
19
|
+
export default abstract class HttpClient {
|
|
20
|
+
static headers: HttpHeaders = {
|
|
21
|
+
[HttpHeadersKeys.ContentType]: HttpHeadersValues.ApplicationJson,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
newWebSocket(query: string): WebSocket {
|
|
25
|
+
const url = apiHost.replace("http", "ws") + "/ws" + "/" + query;
|
|
26
|
+
return new WebSocket(url);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private static download(clientFileName: string | undefined, res: unknown) {
|
|
30
|
+
const fileName = HttpClient.getDownloadFileName(
|
|
31
|
+
clientFileName,
|
|
32
|
+
res.headers
|
|
33
|
+
);
|
|
34
|
+
const url = URL.createObjectURL(res.data);
|
|
35
|
+
|
|
36
|
+
const link = document.createElement("a");
|
|
37
|
+
link.href = url;
|
|
38
|
+
link.setAttribute("download", fileName);
|
|
39
|
+
link.setAttribute("target", "_blank");
|
|
40
|
+
document.body.appendChild(link);
|
|
41
|
+
link.click();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// eslint-disable-next-line
|
|
45
|
+
private static getDownloadFileName(
|
|
46
|
+
clientFileName: string | undefined,
|
|
47
|
+
headers: any
|
|
48
|
+
): string {
|
|
49
|
+
if (clientFileName) {
|
|
50
|
+
return clientFileName;
|
|
51
|
+
}
|
|
52
|
+
const headerLine = headers["content-disposition"];
|
|
53
|
+
const startFileNameIndex = headerLine.indexOf('"') + 1;
|
|
54
|
+
const endFileNameIndex = headerLine.lastIndexOf('"');
|
|
55
|
+
const serverFileName = headerLine.substring(
|
|
56
|
+
startFileNameIndex,
|
|
57
|
+
endFileNameIndex
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
if (serverFileName) {
|
|
61
|
+
return serverFileName;
|
|
62
|
+
}
|
|
63
|
+
return "file";
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
private static getHeaders(headers?: HttpHeaders): HttpHeaders {
|
|
67
|
+
const token = LocalStore.Get<string>(LocalStoreKeys.AccessToken);
|
|
68
|
+
if (!headers) {
|
|
69
|
+
headers = HttpClient.headers;
|
|
70
|
+
}
|
|
71
|
+
if (token) {
|
|
72
|
+
headers[HttpHeadersKeys.Token] = token;
|
|
73
|
+
}
|
|
74
|
+
return headers ?? HttpClient.headers;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
private static returnResponse<ReturnType, PayloadType>(
|
|
78
|
+
params: IBodilessParams | IBodyfulParams<PayloadType> | undefined,
|
|
79
|
+
res: unknown
|
|
80
|
+
): ReturnType | void {
|
|
81
|
+
if (!res) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
return params?.isBlob
|
|
85
|
+
? HttpClient.download(params.downloadFileName, res)
|
|
86
|
+
: res.data;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
static async Get<ReturnType>(
|
|
90
|
+
params?: IBodilessParams
|
|
91
|
+
): Promise<ReturnType | void> {
|
|
92
|
+
return HttpClient.returnResponse(
|
|
93
|
+
params,
|
|
94
|
+
await HttpEngine.Get(
|
|
95
|
+
HttpClient.buildUrl(params?.query ?? ""),
|
|
96
|
+
HttpClient.getHeaders(params?.headers),
|
|
97
|
+
HttpClient.getResponseType(params?.isBlob)
|
|
98
|
+
)
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
static async Post<PayloadType, ReturnType>(
|
|
103
|
+
params: IBodyfulParams<PayloadType>
|
|
104
|
+
): Promise<ReturnType | void> {
|
|
105
|
+
return HttpClient.returnResponse(
|
|
106
|
+
params,
|
|
107
|
+
await HttpEngine.Post(
|
|
108
|
+
HttpClient.buildUrl(params?.query),
|
|
109
|
+
HttpClient.getHeaders(params?.headers),
|
|
110
|
+
HttpClient.getResponseType(params.isBlob),
|
|
111
|
+
HttpClient.createFormDataPayload<PayloadType>(
|
|
112
|
+
params?.payload,
|
|
113
|
+
params?.fileInfos
|
|
114
|
+
)
|
|
115
|
+
)
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
static async Put<PayloadType, ReturnType>(
|
|
120
|
+
params: IBodyfulParams<PayloadType>
|
|
121
|
+
): Promise<ReturnType | void> {
|
|
122
|
+
return HttpClient.returnResponse(
|
|
123
|
+
params,
|
|
124
|
+
await HttpEngine.Put(
|
|
125
|
+
HttpClient.buildUrl(params?.query),
|
|
126
|
+
HttpClient.getHeaders(params?.headers),
|
|
127
|
+
HttpClient.createFormDataPayload<PayloadType>(
|
|
128
|
+
params?.payload,
|
|
129
|
+
params?.fileInfos
|
|
130
|
+
)
|
|
131
|
+
)
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
static async Delete<PayloadType, ReturnType>(
|
|
136
|
+
params: IBodyfulParams<PayloadType>
|
|
137
|
+
): Promise<ReturnType | void> {
|
|
138
|
+
return HttpClient.returnResponse(
|
|
139
|
+
params,
|
|
140
|
+
await HttpEngine.Delete(
|
|
141
|
+
HttpClient.buildUrl(params?.query),
|
|
142
|
+
HttpClient.getHeaders(params?.headers)
|
|
143
|
+
)
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
static async Subscribe<PayloadType>(
|
|
148
|
+
params: IBodyfulParams<PayloadType>
|
|
149
|
+
): Promise<EventSource> {
|
|
150
|
+
const { query } = params;
|
|
151
|
+
|
|
152
|
+
const source = new EventSource(HttpClient.buildUrl(query));
|
|
153
|
+
return source;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
private static buildUrl(query: string): string {
|
|
157
|
+
const queryString = query ?? "";
|
|
158
|
+
return baseUrl + apiVersion + queryString;
|
|
159
|
+
// const queryString = query ? '/' + query : '';
|
|
160
|
+
// return baseUrl + '/' + apiVersion + '/' + queryString;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
private static getResponseType(blob?: boolean): "blob" | "json" {
|
|
164
|
+
return blob ? "blob" : "json";
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
private static createFormDataPayload<PayloadType>(
|
|
168
|
+
payload?: PayloadType,
|
|
169
|
+
fileInfos?: FileInfo[]
|
|
170
|
+
): FormData {
|
|
171
|
+
const data = new FormData();
|
|
172
|
+
data.append("form", JSON.stringify(payload));
|
|
173
|
+
console.log(data, payload, fileInfos);
|
|
174
|
+
|
|
175
|
+
if (fileInfos) {
|
|
176
|
+
for (const fileInfo of fileInfos) {
|
|
177
|
+
if (fileInfo.file) {
|
|
178
|
+
data.append(
|
|
179
|
+
fileInfo.id ?? "files",
|
|
180
|
+
fileInfo.file,
|
|
181
|
+
fileInfo.originalName
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return data;
|
|
187
|
+
}
|
|
188
|
+
}
|