@blueprint-ts/core 1.0.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/.editorconfig +508 -0
- package/.eslintrc.cjs +15 -0
- package/.prettierrc.json +8 -0
- package/LICENSE +21 -0
- package/README.md +1 -0
- package/docker-compose.yaml +8 -0
- package/docs/.vitepress/config.ts +68 -0
- package/docs/.vitepress/theme/Layout.vue +14 -0
- package/docs/.vitepress/theme/components/VersionSelector.vue +64 -0
- package/docs/.vitepress/theme/index.js +13 -0
- package/docs/index.md +70 -0
- package/docs/services/laravel/pagination.md +54 -0
- package/docs/services/laravel/requests.md +62 -0
- package/docs/services/requests/index.md +74 -0
- package/docs/vue/forms.md +326 -0
- package/docs/vue/requests/route-model-binding.md +66 -0
- package/docs/vue/state.md +293 -0
- package/env.d.ts +1 -0
- package/eslint.config.js +15 -0
- package/examples/files/7z2404-x64.exe +0 -0
- package/examples/index.html +14 -0
- package/examples/js/app.js +8 -0
- package/examples/js/router.js +22 -0
- package/examples/js/view/App.vue +49 -0
- package/examples/js/view/layout/DemoPage.vue +28 -0
- package/examples/js/view/pagination/Pagination.vue +28 -0
- package/examples/js/view/pagination/components/errorPagination/ErrorPagination.vue +71 -0
- package/examples/js/view/pagination/components/errorPagination/GetProductsRequest.ts +54 -0
- package/examples/js/view/pagination/components/infiniteScrolling/GetProductsRequest.ts +50 -0
- package/examples/js/view/pagination/components/infiniteScrolling/InfiniteScrolling.vue +57 -0
- package/examples/js/view/pagination/components/tablePagination/GetProductsRequest.ts +50 -0
- package/examples/js/view/pagination/components/tablePagination/TablePagination.vue +63 -0
- package/examples/js/view/requests/Requests.vue +34 -0
- package/examples/js/view/requests/components/abortableRequest/AbortableRequest.vue +36 -0
- package/examples/js/view/requests/components/abortableRequest/GetProductsRequest.ts +25 -0
- package/examples/js/view/requests/components/fileDownloadRequest/DownloadFileRequest.ts +15 -0
- package/examples/js/view/requests/components/fileDownloadRequest/FileDownloadRequest.vue +44 -0
- package/examples/js/view/requests/components/getRequestWithDynamicParams/GetProductsRequest.ts +34 -0
- package/examples/js/view/requests/components/getRequestWithDynamicParams/GetRequestWithDynamicParams.vue +59 -0
- package/examples/js/view/requests/components/serverErrorRequest/ServerErrorRequest.ts +21 -0
- package/examples/js/view/requests/components/serverErrorRequest/ServerErrorRequest.vue +53 -0
- package/package.json +81 -0
- package/release-tool.json +7 -0
- package/src/helpers.ts +78 -0
- package/src/service/bulkRequests/BulkRequestEvent.enum.ts +4 -0
- package/src/service/bulkRequests/BulkRequestSender.ts +184 -0
- package/src/service/bulkRequests/BulkRequestWrapper.ts +49 -0
- package/src/service/bulkRequests/index.ts +6 -0
- package/src/service/laravel/pagination/contracts/PaginationParamsContract.ts +4 -0
- package/src/service/laravel/pagination/contracts/PaginationResponseBodyContract.ts +6 -0
- package/src/service/laravel/pagination/dataDrivers/RequestDriver.ts +32 -0
- package/src/service/laravel/pagination/index.ts +7 -0
- package/src/service/laravel/requests/JsonBaseRequest.ts +35 -0
- package/src/service/laravel/requests/PaginationJsonBaseRequest.ts +29 -0
- package/src/service/laravel/requests/index.ts +9 -0
- package/src/service/laravel/requests/responses/JsonResponse.ts +8 -0
- package/src/service/laravel/requests/responses/PaginationResponse.ts +16 -0
- package/src/service/pagination/InfiniteScroller.ts +21 -0
- package/src/service/pagination/Paginator.ts +149 -0
- package/src/service/pagination/contracts/PaginateableRequestContract.ts +13 -0
- package/src/service/pagination/contracts/PaginationDataDriverContract.ts +5 -0
- package/src/service/pagination/contracts/PaginationResponseContract.ts +7 -0
- package/src/service/pagination/contracts/PaginatorLoadDataOptions.ts +4 -0
- package/src/service/pagination/contracts/ViewDriverContract.ts +12 -0
- package/src/service/pagination/contracts/ViewDriverFactoryContract.ts +5 -0
- package/src/service/pagination/dataDrivers/ArrayDriver.ts +28 -0
- package/src/service/pagination/dtos/PaginationDataDto.ts +14 -0
- package/src/service/pagination/factories/VuePaginationDriverFactory.ts +9 -0
- package/src/service/pagination/frontendDrivers/VuePaginationDriver.ts +61 -0
- package/src/service/pagination/index.ts +16 -0
- package/src/service/persistenceDrivers/LocalStorageDriver.ts +22 -0
- package/src/service/persistenceDrivers/NonPersistentDriver.ts +12 -0
- package/src/service/persistenceDrivers/SessionStorageDriver.ts +22 -0
- package/src/service/persistenceDrivers/index.ts +8 -0
- package/src/service/persistenceDrivers/types/PersistenceDriver.ts +5 -0
- package/src/service/requests/BaseRequest.ts +197 -0
- package/src/service/requests/ErrorHandler.ts +64 -0
- package/src/service/requests/RequestEvents.enum.ts +3 -0
- package/src/service/requests/RequestMethod.enum.ts +8 -0
- package/src/service/requests/bodies/FormDataBody.ts +41 -0
- package/src/service/requests/bodies/JsonBody.ts +16 -0
- package/src/service/requests/contracts/AbortableRequestContract.ts +3 -0
- package/src/service/requests/contracts/BaseRequestContract.ts +36 -0
- package/src/service/requests/contracts/BodyContract.ts +7 -0
- package/src/service/requests/contracts/BodyFactoryContract.ts +5 -0
- package/src/service/requests/contracts/DriverConfigContract.ts +7 -0
- package/src/service/requests/contracts/HeadersContract.ts +5 -0
- package/src/service/requests/contracts/RequestDriverContract.ts +15 -0
- package/src/service/requests/contracts/RequestLoaderContract.ts +5 -0
- package/src/service/requests/contracts/RequestLoaderFactoryContract.ts +5 -0
- package/src/service/requests/contracts/ResponseContract.ts +7 -0
- package/src/service/requests/drivers/contracts/ResponseHandlerContract.ts +10 -0
- package/src/service/requests/drivers/fetch/FetchDriver.ts +115 -0
- package/src/service/requests/drivers/fetch/FetchResponse.ts +30 -0
- package/src/service/requests/exceptions/NoResponseReceivedException.ts +3 -0
- package/src/service/requests/exceptions/NotFoundException.ts +3 -0
- package/src/service/requests/exceptions/PageExpiredException.ts +3 -0
- package/src/service/requests/exceptions/ResponseBodyException.ts +15 -0
- package/src/service/requests/exceptions/ResponseException.ts +11 -0
- package/src/service/requests/exceptions/ServerErrorException.ts +3 -0
- package/src/service/requests/exceptions/UnauthorizedException.ts +3 -0
- package/src/service/requests/exceptions/ValidationException.ts +3 -0
- package/src/service/requests/exceptions/index.ts +19 -0
- package/src/service/requests/factories/FormDataFactory.ts +9 -0
- package/src/service/requests/factories/JsonBodyFactory.ts +9 -0
- package/src/service/requests/index.ts +50 -0
- package/src/service/requests/responses/BaseResponse.ts +41 -0
- package/src/service/requests/responses/BlobResponse.ts +19 -0
- package/src/service/requests/responses/JsonResponse.ts +15 -0
- package/src/service/requests/responses/PlainTextResponse.ts +15 -0
- package/src/service/support/DeferredPromise.ts +67 -0
- package/src/service/support/index.ts +3 -0
- package/src/vue/composables/useConfirmDialog.ts +59 -0
- package/src/vue/composables/useGlobalCheckbox.ts +145 -0
- package/src/vue/composables/useIsEmpty.ts +34 -0
- package/src/vue/composables/useIsOpen.ts +37 -0
- package/src/vue/composables/useIsOpenFromVar.ts +61 -0
- package/src/vue/composables/useModelWrapper.ts +24 -0
- package/src/vue/composables/useOnOpen.ts +34 -0
- package/src/vue/contracts/ModelValueOptions.ts +3 -0
- package/src/vue/contracts/ModelValueProps.ts +3 -0
- package/src/vue/forms/BaseForm.ts +1074 -0
- package/src/vue/forms/PropertyAwareArray.ts +78 -0
- package/src/vue/forms/index.ts +11 -0
- package/src/vue/forms/types/PersistedForm.ts +6 -0
- package/src/vue/forms/validation/ValidationMode.enum.ts +14 -0
- package/src/vue/forms/validation/index.ts +12 -0
- package/src/vue/forms/validation/rules/BaseRule.ts +7 -0
- package/src/vue/forms/validation/rules/ConfirmedRule.ts +39 -0
- package/src/vue/forms/validation/rules/MinRule.ts +61 -0
- package/src/vue/forms/validation/rules/RequiredRule.ts +19 -0
- package/src/vue/forms/validation/rules/UrlRule.ts +24 -0
- package/src/vue/forms/validation/types/BidirectionalRule.ts +11 -0
- package/src/vue/index.ts +14 -0
- package/src/vue/requests/factories/VueRequestLoaderFactory.ts +9 -0
- package/src/vue/requests/index.ts +5 -0
- package/src/vue/requests/loaders/VueRequestBatchLoader.ts +30 -0
- package/src/vue/requests/loaders/VueRequestLoader.ts +18 -0
- package/src/vue/router/routeModelBinding/RouteModelRequestResolver.ts +11 -0
- package/src/vue/router/routeModelBinding/defineRoute.ts +31 -0
- package/src/vue/router/routeModelBinding/index.ts +8 -0
- package/src/vue/router/routeModelBinding/installRouteInjection.ts +73 -0
- package/src/vue/router/routeModelBinding/types.ts +46 -0
- package/src/vue/state/State.ts +391 -0
- package/src/vue/state/index.ts +3 -0
- package/tests/service/helpers/mergeDeep.test.ts +53 -0
- package/tests/service/laravel/pagination/dataDrivers/RequestDriver.test.ts +84 -0
- package/tests/service/laravel/requests/JsonBaseRequest.test.ts +43 -0
- package/tests/service/laravel/requests/PaginationJsonBaseRequest.test.ts +58 -0
- package/tests/service/laravel/requests/responses/JsonResponse.test.ts +59 -0
- package/tests/service/laravel/requests/responses/PaginationResponse.test.ts +127 -0
- package/tests/service/pagination/dtos/PaginationDataDto.test.ts +35 -0
- package/tests/service/pagination/factories/VuePaginationDriverFactory.test.ts +32 -0
- package/tests/service/pagination/frontendDrivers/VuePaginationDriver.test.ts +66 -0
- package/tests/service/requests/ErrorHandler.test.ts +141 -0
- package/tsconfig.json +114 -0
- package/vite.config.ts +34 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {BaseRequest, type Paginatable, JsonResponse } from '@hank-it/ui/service/requests'
|
|
2
|
+
import type {PaginationResponseContract} from '@hank-it/ui/service/pagination'
|
|
3
|
+
|
|
4
|
+
export interface ProductResource {
|
|
5
|
+
id: number
|
|
6
|
+
title: string
|
|
7
|
+
description: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface ProductPaginationResource {
|
|
11
|
+
products: ProductResource[]
|
|
12
|
+
total: number
|
|
13
|
+
limit: number
|
|
14
|
+
skip: number
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class GetProductsRequestResponse extends JsonResponse implements PaginationResponseContract {
|
|
18
|
+
public getData() {
|
|
19
|
+
return this.data
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public getTotal(): number {
|
|
23
|
+
return this.body.total
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public dataHandler(data) {
|
|
27
|
+
return data.products
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class GetProductsRequest extends BaseRequest implements Paginatable {
|
|
32
|
+
method() {
|
|
33
|
+
return 'GET'
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
url() {
|
|
37
|
+
return 'https://dummyjson.com/products'
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public setPaginationParams(page: number, size: number): BaseRequest {
|
|
41
|
+
return this.withParams({
|
|
42
|
+
skip: (page - 1) * size,
|
|
43
|
+
limit: size,
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
protected getResponse() {
|
|
48
|
+
return new GetProductsRequestResponse
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="container" @scroll="scroll">
|
|
3
|
+
<div class="item" v-for="row in paginator.getPageData()">
|
|
4
|
+
{{ row }}
|
|
5
|
+
<br>
|
|
6
|
+
</div>
|
|
7
|
+
</div>
|
|
8
|
+
</template>
|
|
9
|
+
|
|
10
|
+
<script setup lang="ts">
|
|
11
|
+
import {GetProductsRequest} from "./GetProductsRequest";
|
|
12
|
+
import {InfiniteScroller, RequestDriver, VuePaginationDriverFactory, Paginator} from '@hank-it/ui/service/pagination'
|
|
13
|
+
import {VueLoaderDriverFactory, BaseRequest, FetchDriver} from '@hank-it/ui/service/requests'
|
|
14
|
+
import {isAtBottom} from '@hank-it/ui/service/helpers'
|
|
15
|
+
import { debounce } from 'lodash'
|
|
16
|
+
|
|
17
|
+
function scroll(event) {
|
|
18
|
+
console.log("scroll")
|
|
19
|
+
|
|
20
|
+
if (isAtBottom(event.target.scrollHeight, event.target.scrollTop, event.target.clientHeight)) {
|
|
21
|
+
loadNextDebounced()
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const loadNextDebounced = debounce(event => {
|
|
26
|
+
paginator.toNextPage()
|
|
27
|
+
}, 100)
|
|
28
|
+
|
|
29
|
+
/* Booting */
|
|
30
|
+
BaseRequest.setRequestDriver(new FetchDriver)
|
|
31
|
+
BaseRequest.setLoaderStateFactory(new VueLoaderDriverFactory)
|
|
32
|
+
Paginator.setViewDriverFactory(new VuePaginationDriverFactory())
|
|
33
|
+
|
|
34
|
+
/* component */
|
|
35
|
+
const getProductsRequest = new GetProductsRequest
|
|
36
|
+
|
|
37
|
+
const paginator = new InfiniteScroller(new RequestDriver(getProductsRequest))
|
|
38
|
+
|
|
39
|
+
paginator.init(1, 10)
|
|
40
|
+
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<style scoped>
|
|
44
|
+
.container {
|
|
45
|
+
overflow: auto;
|
|
46
|
+
border-style: solid;
|
|
47
|
+
border-color: red;
|
|
48
|
+
height: 400px;
|
|
49
|
+
display: flex;
|
|
50
|
+
flex-direction: column;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.item {
|
|
54
|
+
margin-top: 10px;
|
|
55
|
+
margin-bottom: 10px;
|
|
56
|
+
}
|
|
57
|
+
</style>
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {BaseRequest, type Paginatable, JsonResponse } from '@hank-it/ui/service/requests'
|
|
2
|
+
import type {PaginationResponseContract} from '@hank-it/ui/service/pagination'
|
|
3
|
+
|
|
4
|
+
export interface ProductResource {
|
|
5
|
+
id: number
|
|
6
|
+
title: string
|
|
7
|
+
description: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export interface ProductPaginationResource {
|
|
11
|
+
products: ProductResource[]
|
|
12
|
+
total: number
|
|
13
|
+
limit: number
|
|
14
|
+
skip: number
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class GetProductsRequestResponse extends JsonResponse implements PaginationResponseContract {
|
|
18
|
+
public getData() {
|
|
19
|
+
return this.data
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public getTotal(): number {
|
|
23
|
+
return this.body.total
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public dataHandler(data) {
|
|
27
|
+
return data.products
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class GetProductsRequest extends BaseRequest implements Paginatable {
|
|
32
|
+
method() {
|
|
33
|
+
return 'GET'
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
url() {
|
|
37
|
+
return 'https://dummyjson.com/products'
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public setPaginationParams(page: number, size: number): BaseRequest {
|
|
41
|
+
return this.withParams({
|
|
42
|
+
skip: (page - 1) * size,
|
|
43
|
+
limit: size,
|
|
44
|
+
})
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
protected getResponse() {
|
|
48
|
+
return new GetProductsRequestResponse
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<table>
|
|
3
|
+
<tr>
|
|
4
|
+
<th>ID</th>
|
|
5
|
+
<th>Title</th>
|
|
6
|
+
<th>Description</th>
|
|
7
|
+
</tr>
|
|
8
|
+
<tr v-for="row in paginator.getPageData()">
|
|
9
|
+
<td>{{ row.id }}</td>
|
|
10
|
+
<td>{{ row.title }}</td>
|
|
11
|
+
<td>{{ row.description }}</td>
|
|
12
|
+
</tr>
|
|
13
|
+
</table>
|
|
14
|
+
|
|
15
|
+
Current page: {{ paginator.getCurrentPage() }}
|
|
16
|
+
<br>
|
|
17
|
+
Pages: {{ paginator.getPages() }}
|
|
18
|
+
<br>
|
|
19
|
+
Page Size: <input v-model="pageSize" />
|
|
20
|
+
<br>
|
|
21
|
+
Back Page <button @click="paginator.toPreviousPage()">Back</button>
|
|
22
|
+
<br>
|
|
23
|
+
Next Page <button @click="paginator.toNextPage()">Next</button>
|
|
24
|
+
<br>
|
|
25
|
+
Showing {{ paginator.getFromItemNumber() }} to {{ paginator.getToItemNumber() }} of {{ paginator.getTotal() }} items.
|
|
26
|
+
|
|
27
|
+
{{ displayablePages }}
|
|
28
|
+
</template>
|
|
29
|
+
|
|
30
|
+
<script setup lang="ts">
|
|
31
|
+
import {GetProductsRequest} from "./GetProductsRequest";
|
|
32
|
+
import {Paginator, RequestDriver, VuePaginationDriverFactory} from '@hank-it/ui/service/pagination'
|
|
33
|
+
import {VueLoaderDriverFactory, BaseRequest, FetchDriver} from '@hank-it/ui/service/requests'
|
|
34
|
+
import {computed} from 'vue'
|
|
35
|
+
import {getDisplayablePages} from '@hank-it/ui/service/helpers'
|
|
36
|
+
|
|
37
|
+
/* Booting */
|
|
38
|
+
BaseRequest.setRequestDriver(new FetchDriver)
|
|
39
|
+
BaseRequest.setLoaderStateFactory(new VueLoaderDriverFactory)
|
|
40
|
+
Paginator.setViewDriverFactory(new VuePaginationDriverFactory())
|
|
41
|
+
|
|
42
|
+
/* component */
|
|
43
|
+
const getProductsRequest = new GetProductsRequest
|
|
44
|
+
|
|
45
|
+
const paginator = new Paginator(new RequestDriver(getProductsRequest))
|
|
46
|
+
|
|
47
|
+
paginator.init(1, 10)
|
|
48
|
+
|
|
49
|
+
const pageSize = computed({
|
|
50
|
+
set(value) {
|
|
51
|
+
paginator.setPageSize(value)
|
|
52
|
+
},
|
|
53
|
+
get() {
|
|
54
|
+
return paginator.getPageSize()
|
|
55
|
+
}
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
const displayablePages = computed(() => {
|
|
59
|
+
console.log(paginator.getPages())
|
|
60
|
+
|
|
61
|
+
return getDisplayablePages(paginator.getPages().length, paginator.getCurrentPage())
|
|
62
|
+
})
|
|
63
|
+
</script>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<DemoPage :components="components" />
|
|
3
|
+
</template>
|
|
4
|
+
|
|
5
|
+
<script setup lang="ts">
|
|
6
|
+
import GetRequestWithDynamicParams from './components/getRequestWithDynamicParams/GetRequestWithDynamicParams.vue'
|
|
7
|
+
import AbortableRequest from './components/abortableRequest/AbortableRequest.vue'
|
|
8
|
+
import ServerErrorRequest from './components/serverErrorRequest/ServerErrorRequest.vue'
|
|
9
|
+
import FileDownloadRequest from './components/fileDownloadRequest/FileDownloadRequest.vue'
|
|
10
|
+
import DemoPage from '../layout/DemoPage.vue'
|
|
11
|
+
|
|
12
|
+
const components = {
|
|
13
|
+
'get-request-with-dynamic-params': {
|
|
14
|
+
name: 'Get request with dynamic params',
|
|
15
|
+
component: GetRequestWithDynamicParams,
|
|
16
|
+
route: { name: 'requests', params: { component: 'get-request-with-dynamic-params' } },
|
|
17
|
+
},
|
|
18
|
+
'abortable-request': {
|
|
19
|
+
name: 'Abortable request',
|
|
20
|
+
component: AbortableRequest,
|
|
21
|
+
route: { name: 'requests', params: { component: 'abortable-request' } },
|
|
22
|
+
},
|
|
23
|
+
'server-error-request': {
|
|
24
|
+
name: 'Server error request',
|
|
25
|
+
component: ServerErrorRequest,
|
|
26
|
+
route: { name: 'requests', params: { component: 'server-error-request' } },
|
|
27
|
+
},
|
|
28
|
+
'file-download-request': {
|
|
29
|
+
name: 'File download request',
|
|
30
|
+
component: FileDownloadRequest,
|
|
31
|
+
route: { name: 'requests', params: { component: 'file-download-request' } },
|
|
32
|
+
},
|
|
33
|
+
}
|
|
34
|
+
</script>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<h1>Abortable request</h1>
|
|
3
|
+
|
|
4
|
+
<p v-if="request.isLoading()">Lade...</p>
|
|
5
|
+
|
|
6
|
+
<p>Response: {{ data }}</p>
|
|
7
|
+
|
|
8
|
+
<button @click="controller.abort()">Abort</button>
|
|
9
|
+
</template>
|
|
10
|
+
|
|
11
|
+
<script setup lang="ts">
|
|
12
|
+
import {ref} from "vue";
|
|
13
|
+
import {VueLoaderDriverFactory, BaseRequest, FetchDriver} from '@hank-it/ui/service/requests'
|
|
14
|
+
import {GetProductsRequest} from './GetProductsRequest'
|
|
15
|
+
|
|
16
|
+
/* Booting */
|
|
17
|
+
BaseRequest.setRequestDriver(new FetchDriver)
|
|
18
|
+
BaseRequest.setLoaderStateFactory(new VueLoaderDriverFactory)
|
|
19
|
+
|
|
20
|
+
/* Component */
|
|
21
|
+
const controller = new AbortController();
|
|
22
|
+
|
|
23
|
+
const data = ref({})
|
|
24
|
+
|
|
25
|
+
const request = new GetProductsRequest({
|
|
26
|
+
abortSignal: controller.signal,
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
function sendRequest() {
|
|
30
|
+
request.send().then(response => {
|
|
31
|
+
data.value = response.data
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
sendRequest()
|
|
36
|
+
</script>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {BaseRequest, BaseResponse } from '@hank-it/ui/service/requests'
|
|
2
|
+
import DriverConfigContract from '../../../../../../src/service/requests/contracts/DriverConfigContract'
|
|
3
|
+
import JsonResponse from '../../../../../../src/service/requests/responses/JsonResponse'
|
|
4
|
+
|
|
5
|
+
export class GetProductsRequestResponse extends JsonResponse {}
|
|
6
|
+
|
|
7
|
+
export class GetProductsRequest extends BaseRequest implements GetProductsRequest {
|
|
8
|
+
method() {
|
|
9
|
+
return 'GET'
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
url() {
|
|
13
|
+
return 'https://dummyjson.com/products/?delay=5000'
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
protected getConfig(): DriverConfigContract {
|
|
17
|
+
return {
|
|
18
|
+
corsWithCredentials: false,
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
protected getResponse() {
|
|
23
|
+
return new GetProductsRequestResponse
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {BaseRequest, BlobResponse } from '@hank-it/ui/service/requests'
|
|
2
|
+
|
|
3
|
+
export default class DownloadFileRequest extends BaseRequest {
|
|
4
|
+
method() {
|
|
5
|
+
return 'GET'
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
url() {
|
|
9
|
+
return 'http://localhost:5173/files/7z2404-x64.exe'
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
protected getResponse() {
|
|
13
|
+
return new BlobResponse
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
|
|
4
|
+
</div>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import {ref, computed} from 'vue'
|
|
9
|
+
import {VueLoaderDriverFactory, BaseRequest, FetchDriver} from '@hank-it/ui/service/requests'
|
|
10
|
+
import DownloadFileRequest from './DownloadFileRequest'
|
|
11
|
+
|
|
12
|
+
/* Booting */
|
|
13
|
+
BaseRequest.setRequestDriver(new FetchDriver)
|
|
14
|
+
BaseRequest.setLoaderStateFactory(new VueLoaderDriverFactory)
|
|
15
|
+
|
|
16
|
+
/* Component */
|
|
17
|
+
const request = new DownloadFileRequest
|
|
18
|
+
|
|
19
|
+
function sendRequest() {
|
|
20
|
+
request.send().then(response => {
|
|
21
|
+
console.log(response)
|
|
22
|
+
|
|
23
|
+
// saveBlob(response.data, 'test.exe');
|
|
24
|
+
})
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function saveBlob(blob, fileName) {
|
|
28
|
+
const a = document.createElement("a");
|
|
29
|
+
document.body.appendChild(a);
|
|
30
|
+
a.style = "display: none";
|
|
31
|
+
|
|
32
|
+
const url = window.URL.createObjectURL(blob);
|
|
33
|
+
a.href = url;
|
|
34
|
+
a.download = fileName;
|
|
35
|
+
a.click();
|
|
36
|
+
window.URL.revokeObjectURL(url);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
sendRequest()
|
|
40
|
+
</script>
|
|
41
|
+
|
|
42
|
+
<style scoped>
|
|
43
|
+
|
|
44
|
+
</style>
|
package/examples/js/view/requests/components/getRequestWithDynamicParams/GetProductsRequest.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import {BaseRequest, type Paginatable, type DriverConfigContract, JsonResponse } from '@hank-it/ui/service/requests'
|
|
2
|
+
|
|
3
|
+
export class GetProductsRequestResponse extends JsonResponse {
|
|
4
|
+
public dataHandler(data) {
|
|
5
|
+
return data.products
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export class GetProductsRequest extends BaseRequest implements Paginatable {
|
|
10
|
+
method() {
|
|
11
|
+
return 'GET'
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
url() {
|
|
15
|
+
return 'https://dummyjson.com/products/search'
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
public setPaginationParams(page: number, size: number): BaseRequest {
|
|
19
|
+
return this.withParams({
|
|
20
|
+
skip: (page - 1) * size,
|
|
21
|
+
limit: size,
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
protected getConfig(): DriverConfigContract {
|
|
26
|
+
return {
|
|
27
|
+
corsWithCredentials: false,
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
protected getResponse() {
|
|
32
|
+
return new GetProductsRequestResponse
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<h1>Get request with dynamic params</h1>
|
|
3
|
+
|
|
4
|
+
<input placeholder="Search" v-model="search">
|
|
5
|
+
|
|
6
|
+
<p v-if="request.isLoading()">Lade...</p>
|
|
7
|
+
|
|
8
|
+
<table>
|
|
9
|
+
<tr v-for="row in data">
|
|
10
|
+
<td>{{ row.id }}</td>
|
|
11
|
+
<td>{{ row.title }}</td>
|
|
12
|
+
<td>{{ row.description }}</td>
|
|
13
|
+
</tr>
|
|
14
|
+
</table>
|
|
15
|
+
</template>
|
|
16
|
+
|
|
17
|
+
<script setup lang="ts">
|
|
18
|
+
import {ref, computed} from 'vue'
|
|
19
|
+
import {VueLoaderDriverFactory, BaseRequest, FetchDriver} from '@hank-it/ui/service/requests'
|
|
20
|
+
import {GetProductsRequest} from './GetProductsRequest'
|
|
21
|
+
|
|
22
|
+
/* Booting */
|
|
23
|
+
BaseRequest.setRequestDriver(new FetchDriver({
|
|
24
|
+
corsWithCredentials: true,
|
|
25
|
+
}))
|
|
26
|
+
BaseRequest.setLoaderStateFactory(new VueLoaderDriverFactory)
|
|
27
|
+
|
|
28
|
+
/* Component */
|
|
29
|
+
const internalSearch = ref('')
|
|
30
|
+
|
|
31
|
+
const search = computed({
|
|
32
|
+
set(value) {
|
|
33
|
+
internalSearch.value = value
|
|
34
|
+
|
|
35
|
+
sendRequest()
|
|
36
|
+
},
|
|
37
|
+
get() {
|
|
38
|
+
return internalSearch.value
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
const data = ref({})
|
|
43
|
+
|
|
44
|
+
const request = new GetProductsRequest
|
|
45
|
+
|
|
46
|
+
function sendRequest() {
|
|
47
|
+
request.setParams({
|
|
48
|
+
q: search.value,
|
|
49
|
+
}).send().then(response => {
|
|
50
|
+
data.value = response.data
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
sendRequest()
|
|
55
|
+
</script>
|
|
56
|
+
|
|
57
|
+
<style scoped>
|
|
58
|
+
|
|
59
|
+
</style>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {BaseRequest, JsonResponse } from '@hank-it/ui/service/requests'
|
|
2
|
+
|
|
3
|
+
export class GetProductsRequestResponse extends JsonResponse {}
|
|
4
|
+
|
|
5
|
+
export class ServerErrorRequest extends BaseRequest implements ServerErrorRequest {
|
|
6
|
+
method() {
|
|
7
|
+
return 'GET'
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
url() {
|
|
11
|
+
return 'https://dummyjson.com/http/500'
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public getCorsWithCredentials(): boolean {
|
|
15
|
+
return false
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
protected getResponse() {
|
|
19
|
+
return new GetProductsRequestResponse
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<h1>Server error request</h1>
|
|
3
|
+
|
|
4
|
+
<p v-if="request.isLoading()">Lade...</p>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import {ref} from 'vue'
|
|
9
|
+
import { VueLoaderDriverFactory, BaseRequest, FetchDriver, ResponseException, ErrorHandler } from '@hank-it/ui/service/requests'
|
|
10
|
+
import {ServerErrorRequest} from './ServerErrorRequest'
|
|
11
|
+
|
|
12
|
+
/* Booting */
|
|
13
|
+
BaseRequest.setRequestDriver(new FetchDriver({
|
|
14
|
+
corsWithCredentials: false
|
|
15
|
+
}))
|
|
16
|
+
BaseRequest.setLoaderStateFactory(new VueLoaderDriverFactory)
|
|
17
|
+
|
|
18
|
+
/* Component */
|
|
19
|
+
const data = ref({})
|
|
20
|
+
|
|
21
|
+
const request = new ServerErrorRequest()
|
|
22
|
+
|
|
23
|
+
function sendRequest() {
|
|
24
|
+
request.send()
|
|
25
|
+
.then(response => {
|
|
26
|
+
data.value = response.data
|
|
27
|
+
})
|
|
28
|
+
.catch((response: ResponseException) => {
|
|
29
|
+
console.log('Specific error handler')
|
|
30
|
+
|
|
31
|
+
console.log(response.getError().getStatusCode())
|
|
32
|
+
console.log(response.getError().getHeaders())
|
|
33
|
+
console.log(response.getError().getOriginalError())
|
|
34
|
+
response.getError().getBodyPromise().then(body => {
|
|
35
|
+
console.log(body)
|
|
36
|
+
})
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Global error handler
|
|
41
|
+
ErrorHandler.registerHandler(error => {
|
|
42
|
+
console.debug("Registered handler")
|
|
43
|
+
|
|
44
|
+
console.log(error.getStatusCode())
|
|
45
|
+
console.log(error.getHeaders())
|
|
46
|
+
console.log(error.getOriginalError())
|
|
47
|
+
error.getBodyPromise().then(body => {
|
|
48
|
+
console.log(body)
|
|
49
|
+
})
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
sendRequest()
|
|
53
|
+
</script>
|
package/package.json
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@blueprint-ts/core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"type": "module",
|
|
9
|
+
"exports": {
|
|
10
|
+
"./service/pagination": "./src/service/pagination/index.ts",
|
|
11
|
+
"./service/support": "./src/service/support/index.ts",
|
|
12
|
+
"./service/requests": "./src/service/requests/index.ts",
|
|
13
|
+
"./service/bulkRequests": "./src/service/bulkRequests/index.ts",
|
|
14
|
+
"./service/persistenceDrivers": "./src/service/persistenceDrivers/index.ts",
|
|
15
|
+
"./service/requests/exceptions": "./src/service/requests/exceptions/index.ts",
|
|
16
|
+
"./service/laravel/requests": "./src/service/laravel/requests/index.ts",
|
|
17
|
+
"./service/laravel/pagination": "./src/service/laravel/pagination/index.ts",
|
|
18
|
+
"./helpers": "./src/helpers.ts",
|
|
19
|
+
"./vue": "./src/vue/index.ts",
|
|
20
|
+
"./vue/forms": "./src/vue/forms/index.ts",
|
|
21
|
+
"./vue/forms/validation": "./src/vue/forms/validation/index.ts",
|
|
22
|
+
"./vue/requests": "./src/vue/requests/index.ts",
|
|
23
|
+
"./vue/router/routeModelBinding": "./src/vue/router/routeModelBinding/index.ts",
|
|
24
|
+
"./vue/state": "./src/vue/state/index.ts"
|
|
25
|
+
},
|
|
26
|
+
"scripts": {
|
|
27
|
+
"dev": "vite",
|
|
28
|
+
"build": "run-p type-check \"build-only {@}\" --",
|
|
29
|
+
"preview": "vite preview",
|
|
30
|
+
"test": "vitest",
|
|
31
|
+
"test:coverage": "vitest --coverage",
|
|
32
|
+
"build-only": "vite build",
|
|
33
|
+
"lint": "eslint \"src/**/*.{js,vue,ts}\"",
|
|
34
|
+
"lint:fix": "eslint \"src/**/*.{js,vue,ts}\" --fix",
|
|
35
|
+
"format": "prettier --check src/",
|
|
36
|
+
"type-check": "tsc --noEmit",
|
|
37
|
+
"docs:dev": "vitepress dev docs",
|
|
38
|
+
"docs:build": "vitepress build docs",
|
|
39
|
+
"docs:preview": "vitepress preview docs"
|
|
40
|
+
},
|
|
41
|
+
"optionalDependencies": {
|
|
42
|
+
"@rollup/rollup-linux-x64-gnu": "*",
|
|
43
|
+
"@rollup/rollup-linux-x64-musl": "*",
|
|
44
|
+
"@rollup/rollup-win32-x64-gnu": "*",
|
|
45
|
+
"@rollup/rollup-win32-x64-musl": "*"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@rushstack/eslint-patch": "^1.3.3",
|
|
49
|
+
"@tsconfig/node20": "^20.1.2",
|
|
50
|
+
"@types/jsdom": "^21.1.6",
|
|
51
|
+
"@types/lodash-es": "^4.17.12",
|
|
52
|
+
"@types/node": "^20.11.28",
|
|
53
|
+
"@types/qs": "^6.9.18",
|
|
54
|
+
"@typescript-eslint/eslint-plugin": "^8.21.0",
|
|
55
|
+
"@typescript-eslint/parser": "^8.21.0",
|
|
56
|
+
"@typescript-eslint/typescript-estree": "^8.21.0",
|
|
57
|
+
"@vitejs/plugin-vue": "^5.0.4",
|
|
58
|
+
"@vitejs/plugin-vue-jsx": "^3.1.0",
|
|
59
|
+
"@vitest/coverage-v8": "^3.0.4",
|
|
60
|
+
"@vue/eslint-config-typescript": "^14.0.0",
|
|
61
|
+
"autoprefixer": "^10.4.19",
|
|
62
|
+
"eslint": "^9.0.0",
|
|
63
|
+
"eslint-config-prettier": "^10.0.1",
|
|
64
|
+
"eslint-plugin-vue": "^9.31.0",
|
|
65
|
+
"jsdom": "^24.0.0",
|
|
66
|
+
"npm-run-all2": "^6.1.2",
|
|
67
|
+
"prettier": "^3.0.3",
|
|
68
|
+
"typescript": "^5.7.2",
|
|
69
|
+
"typescript-eslint": "^8.21.0",
|
|
70
|
+
"vite": "^5.1.6",
|
|
71
|
+
"vitepress": "^1.6.3",
|
|
72
|
+
"vitest": "^3.0.4",
|
|
73
|
+
"vue": "^3.4.25",
|
|
74
|
+
"vue-router": "^4.3.2"
|
|
75
|
+
},
|
|
76
|
+
"dependencies": {
|
|
77
|
+
"lodash-es": "^4.17.21",
|
|
78
|
+
"qs": "^6.12.0",
|
|
79
|
+
"uuid": "^11.1.0"
|
|
80
|
+
}
|
|
81
|
+
}
|