Skip to content

Commit 233c5a5

Browse files
authored
Frontend for Uploads (#78)
1 parent 73ea028 commit 233c5a5

31 files changed

+1461
-126
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<script setup lang="ts">
2+
import { type EditorIncompleteUpload } from '@/lib/editor'
3+
4+
interface Props {
5+
editorIncompleteUpload: EditorIncompleteUpload
6+
}
7+
interface Emits {
8+
(e: 'update:editorIncompleteUpload', ei: EditorIncompleteUpload): void
9+
}
10+
const props = defineProps<Props>()
11+
const emit = defineEmits<Emits>()
12+
13+
const model = computed({
14+
get: () => props.editorIncompleteUpload,
15+
set: (editorIncompleteUpload: EditorIncompleteUpload) => { emit('update:editorIncompleteUpload', editorIncompleteUpload) },
16+
})
17+
</script>
18+
19+
<template>
20+
<div>
21+
<FormEditorField
22+
help-text="The name of this uploaded source file."
23+
:editor-field="model.name"
24+
>
25+
<PVInputText
26+
v-model="model.name.currentValue"
27+
/>
28+
</FormEditorField>
29+
<FormEditorField
30+
help-text="The description of this upload - helpful for record keeping, not used for anything."
31+
:editor-field="model.description"
32+
>
33+
<PVTextarea
34+
v-model="model.description.currentValue"
35+
auto-resize
36+
/>
37+
</FormEditorField>
38+
<FormEditorField
39+
help-text="When enabled, this upload can be accessed by administrators to help with debugging. Only turn this on if you're comfortable with system administrators accessing this data."
40+
:editor-field="model.adminDebugEnabled"
41+
>
42+
<ExplicitInputSwitch
43+
v-model:value="model.adminDebugEnabled.currentValue"
44+
on-label="Administrator Debugging Access Enabled"
45+
off-label="No Administrator Access Enabled"
46+
/>
47+
</FormEditorField>
48+
</div>
49+
</template>
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<script setup lang="ts">
2+
import { type EditorPortfolio } from '@/lib/editor'
3+
4+
interface Props {
5+
editorPortfolio: EditorPortfolio
6+
}
7+
interface Emits {
8+
(e: 'update:editorPortfolio', ei: EditorPortfolio): void
9+
}
10+
const props = defineProps<Props>()
11+
const emit = defineEmits<Emits>()
12+
13+
const model = computed({
14+
get: () => props.editorPortfolio,
15+
set: (editorPortfolio: EditorPortfolio) => { emit('update:editorPortfolio', editorPortfolio) },
16+
})
17+
</script>
18+
19+
<template>
20+
<div>
21+
<FormEditorField
22+
help-text="The name of this portfolio."
23+
:editor-field="model.name"
24+
>
25+
<PVInputText
26+
v-model="model.name.currentValue"
27+
/>
28+
</FormEditorField>
29+
<FormEditorField
30+
help-text="The description of this portfolio - helpful for record keeping, not used for anything."
31+
:editor-field="model.description"
32+
>
33+
<PVTextarea
34+
v-model="model.description.currentValue"
35+
auto-resize
36+
/>
37+
</FormEditorField>
38+
<FormEditorField
39+
help-text="When enabled, this portfolio can be accessed by administrators to help with debugging. Only turn this on if you're comfortable with system administrators accessing this data."
40+
:editor-field="model.adminDebugEnabled"
41+
>
42+
<ExplicitInputSwitch
43+
v-model:value="model.adminDebugEnabled.currentValue"
44+
on-label="Administrator Debugging Access Enabled"
45+
off-label="No Administrator Access Enabled"
46+
/>
47+
</FormEditorField>
48+
</div>
49+
</template>

frontend/composables/useTime.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,9 @@ export const useTime = () => {
3333
})
3434
}
3535

36-
const humanReadableDateLongFromStandardString = (s: string): ComputedRef<string> => {
37-
return humanReadableDateLong(new Date(Date.parse(s)))
38-
}
39-
40-
const humanReadableDateFromStandardString = (s: string): ComputedRef<string> => {
41-
return humanReadableDate(new Date(Date.parse(s)))
42-
}
43-
44-
const humanReadableTimeFromStandardString = (asStr: string): ComputedRef<string> => {
45-
return humanReadableTime(new Date(Date.parse(asStr)))
46-
}
36+
const humanReadableDateLongFromStandardString = (s: string): ComputedRef<string> => humanReadableDateLong(new Date(Date.parse(s)))
37+
const humanReadableDateFromStandardString = (s: string): ComputedRef<string> => humanReadableDate(new Date(Date.parse(s)))
38+
const humanReadableTimeFromStandardString = (asStr: string): ComputedRef<string> => humanReadableTime(new Date(Date.parse(asStr)))
4739

4840
const humanReadableTimeWithSeconds = (t: Date): ComputedRef<string> => {
4941
return computed(() => {
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import { type IncompleteUpload } from '@/openapi/generated/pacta'
2+
import { Validation, type EditorFieldsFor, type EditorComputedValues } from './common'
3+
import { getEditorComputedValues } from './utils'
4+
5+
export type EditorIncompleteUpload = EditorFieldsFor<IncompleteUpload>
6+
7+
const createEditorIncompleteUpload = (incompleteUpload: IncompleteUpload): EditorIncompleteUpload => {
8+
return {
9+
id: {
10+
name: 'id',
11+
label: 'ID',
12+
originalValue: incompleteUpload.id,
13+
currentValue: incompleteUpload.id,
14+
},
15+
name: {
16+
name: 'name',
17+
label: 'Name',
18+
validation: [Validation.NotEmpty],
19+
originalValue: incompleteUpload.name,
20+
currentValue: incompleteUpload.name,
21+
},
22+
description: {
23+
name: 'description',
24+
label: 'Description',
25+
originalValue: incompleteUpload.description,
26+
currentValue: incompleteUpload.description,
27+
},
28+
adminDebugEnabled: {
29+
name: 'adminDebugEnabled',
30+
label: 'Admin Debugging Enabled',
31+
originalValue: incompleteUpload.adminDebugEnabled,
32+
currentValue: incompleteUpload.adminDebugEnabled,
33+
},
34+
holdingsDate: {
35+
name: 'holdingsDate',
36+
label: 'Holdings Date',
37+
originalValue: incompleteUpload.holdingsDate,
38+
currentValue: incompleteUpload.holdingsDate,
39+
},
40+
createdAt: {
41+
name: 'createdAt',
42+
label: 'Created At',
43+
originalValue: incompleteUpload.createdAt,
44+
currentValue: incompleteUpload.createdAt,
45+
},
46+
ranAt: {
47+
name: 'ranAt',
48+
label: 'Ran At',
49+
originalValue: incompleteUpload.ranAt,
50+
currentValue: incompleteUpload.ranAt,
51+
},
52+
completedAt: {
53+
name: 'completedAt',
54+
label: 'Completed At',
55+
originalValue: incompleteUpload.completedAt,
56+
currentValue: incompleteUpload.completedAt,
57+
},
58+
failureMessage: {
59+
name: 'failureMessage',
60+
label: 'Failure Message',
61+
originalValue: incompleteUpload.failureMessage,
62+
currentValue: incompleteUpload.failureMessage,
63+
},
64+
failureCode: {
65+
name: 'failureCode',
66+
label: 'Failure Code',
67+
originalValue: incompleteUpload.failureCode,
68+
currentValue: incompleteUpload.failureCode,
69+
},
70+
}
71+
}
72+
73+
export const incompleteUploadEditor = (i: IncompleteUpload): EditorComputedValues<IncompleteUpload> => {
74+
return getEditorComputedValues(`lib/editor/incompleteUpload[${i.id}]`, i, createEditorIncompleteUpload)
75+
}

frontend/lib/editor/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,5 @@ export * from './common'
22
export * from './initiative'
33
export * from './pacta_version'
44
export * from './user'
5+
export * from './incomplete_upload'
6+
export * from './portfolio'

frontend/lib/editor/portfolio.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { type Portfolio } from '@/openapi/generated/pacta'
2+
import { Validation, type EditorFieldsFor, type EditorComputedValues } from './common'
3+
import { getEditorComputedValues } from './utils'
4+
5+
export type EditorPortfolio = EditorFieldsFor<Portfolio>
6+
7+
const createEditorPortfolio = (portfolio: Portfolio): EditorPortfolio => {
8+
return {
9+
id: {
10+
name: 'id',
11+
label: 'ID',
12+
originalValue: portfolio.id,
13+
currentValue: portfolio.id,
14+
},
15+
name: {
16+
name: 'name',
17+
label: 'Name',
18+
validation: [Validation.NotEmpty],
19+
originalValue: portfolio.name,
20+
currentValue: portfolio.name,
21+
},
22+
description: {
23+
name: 'description',
24+
label: 'Description',
25+
originalValue: portfolio.description,
26+
currentValue: portfolio.description,
27+
},
28+
adminDebugEnabled: {
29+
name: 'adminDebugEnabled',
30+
label: 'Admin Debugging Enabled',
31+
originalValue: portfolio.adminDebugEnabled,
32+
currentValue: portfolio.adminDebugEnabled,
33+
},
34+
holdingsDate: {
35+
name: 'holdingsDate',
36+
label: 'Holdings Date',
37+
originalValue: portfolio.holdingsDate,
38+
currentValue: portfolio.holdingsDate,
39+
},
40+
createdAt: {
41+
name: 'createdAt',
42+
label: 'Created At',
43+
originalValue: portfolio.createdAt,
44+
currentValue: portfolio.createdAt,
45+
},
46+
numberOfRows: {
47+
name: 'numberOfRows',
48+
label: 'Number of Rows',
49+
originalValue: portfolio.numberOfRows,
50+
currentValue: portfolio.numberOfRows,
51+
},
52+
}
53+
}
54+
55+
export const portfolioEditor = (i: Portfolio): EditorComputedValues<Portfolio> => {
56+
return getEditorComputedValues(`lib/editor/portfolio[${i.id}]`, i, createEditorPortfolio)
57+
}

frontend/lib/filesize/index.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export const formatFileSize = (bytes: number): string => {
2+
if (bytes === 0) return 'Empty'
3+
const sizes = ['Bytes', 'kB', 'MB', 'GB', 'TB']
4+
5+
const k = 1000
6+
const i = Math.floor(Math.log(bytes) / Math.log(k))
7+
8+
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
9+
}

frontend/openapi/generated/pacta/index.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ export { CancelablePromise, CancelError } from './core/CancelablePromise';
1010
export { OpenAPI } from './core/OpenAPI';
1111
export type { OpenAPIConfig } from './core/OpenAPI';
1212

13+
export type { CompletePortfolioUploadReq } from './models/CompletePortfolioUploadReq';
14+
export type { CompletePortfolioUploadReqItem } from './models/CompletePortfolioUploadReqItem';
15+
export type { CompletePortfolioUploadResp } from './models/CompletePortfolioUploadResp';
1316
export type { Error } from './models/Error';
17+
export type { HoldingsDate } from './models/HoldingsDate';
18+
export type { IncompleteUpload } from './models/IncompleteUpload';
19+
export type { IncompleteUploadChanges } from './models/IncompleteUploadChanges';
1420
export { Initiative } from './models/Initiative';
1521
export { InitiativeChanges } from './models/InitiativeChanges';
1622
export { InitiativeCreate } from './models/InitiativeCreate';
@@ -19,12 +25,22 @@ export type { InitiativeInvitationCreate } from './models/InitiativeInvitationCr
1925
export type { InitiativeUserRelationship } from './models/InitiativeUserRelationship';
2026
export type { InitiativeUserRelationshipChanges } from './models/InitiativeUserRelationshipChanges';
2127
export { Language } from './models/Language';
28+
export type { ListIncompleteUploadsReq } from './models/ListIncompleteUploadsReq';
29+
export type { ListIncompleteUploadsResp } from './models/ListIncompleteUploadsResp';
30+
export type { ListPortfoliosReq } from './models/ListPortfoliosReq';
31+
export type { ListPortfoliosResp } from './models/ListPortfoliosResp';
2232
export type { NewPortfolioAsset } from './models/NewPortfolioAsset';
2333
export type { PactaVersion } from './models/PactaVersion';
2434
export type { PactaVersionChanges } from './models/PactaVersionChanges';
2535
export type { PactaVersionCreate } from './models/PactaVersionCreate';
2636
export type { ParsePortfolioReq } from './models/ParsePortfolioReq';
2737
export type { ParsePortfolioResp } from './models/ParsePortfolioResp';
38+
export type { Portfolio } from './models/Portfolio';
39+
export type { PortfolioChanges } from './models/PortfolioChanges';
40+
export type { StartPortfolioUploadReq } from './models/StartPortfolioUploadReq';
41+
export type { StartPortfolioUploadReqItem } from './models/StartPortfolioUploadReqItem';
42+
export type { StartPortfolioUploadResp } from './models/StartPortfolioUploadResp';
43+
export type { StartPortfolioUploadRespItem } from './models/StartPortfolioUploadRespItem';
2844
export { User } from './models/User';
2945
export { UserChanges } from './models/UserChanges';
3046

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/* generated using openapi-typescript-codegen -- do no edit */
2+
/* istanbul ignore file */
3+
/* tslint:disable */
4+
/* eslint-disable */
5+
6+
import type { CompletePortfolioUploadReqItem } from './CompletePortfolioUploadReqItem';
7+
8+
export type CompletePortfolioUploadReq = {
9+
/**
10+
* The incomplete uploads that have been successfully uploaded to storage and are ready for parsing.
11+
*/
12+
items: Array<CompletePortfolioUploadReqItem>;
13+
};
14+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/* generated using openapi-typescript-codegen -- do no edit */
2+
/* istanbul ignore file */
3+
/* tslint:disable */
4+
/* eslint-disable */
5+
6+
export type CompletePortfolioUploadReqItem = {
7+
/**
8+
* The unique identifier for the uploaded asset
9+
*/
10+
incomplete_upload_id: string;
11+
};
12+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/* generated using openapi-typescript-codegen -- do no edit */
2+
/* istanbul ignore file */
3+
/* tslint:disable */
4+
/* eslint-disable */
5+
6+
export type CompletePortfolioUploadResp = Record<string, any>;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/* generated using openapi-typescript-codegen -- do no edit */
2+
/* istanbul ignore file */
3+
/* tslint:disable */
4+
/* eslint-disable */
5+
6+
export type HoldingsDate = {
7+
/**
8+
* The time at which the holdings are represented at
9+
*/
10+
time: string;
11+
};
12+

0 commit comments

Comments
 (0)