Skip to content

Commit 0ddc167

Browse files
authored
Merge pull request #673 from contember/headless-upload
headless uploader
2 parents 188f020 + c178652 commit 0ddc167

File tree

143 files changed

+4921
-413
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

143 files changed

+4921
-413
lines changed

build/api/admin.api.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
/// <reference types="react" />
88

9-
import { AccessorErrorsHolder } from '@contember/react-binding-ui';
109
import type { AccessorTreeState } from '@contember/react-binding';
1110
import { AddEntityButtonProps } from '@contember/react-binding-ui';
1211
import { Ancestor } from 'slate';
@@ -52,6 +51,7 @@ import { EntityListSubTreeAdditionalProps } from '@contember/react-binding';
5251
import { EntitySubTreeAdditionalCreationProps } from '@contember/react-binding';
5352
import { EntitySubTreeAdditionalProps } from '@contember/react-binding';
5453
import { Environment } from '@contember/react-binding';
54+
import { ErrorAccessorHolder } from '@contember/react-binding';
5555
import { ErrorCodeDictionary } from '@contember/react-binding-ui';
5656
import { FC } from 'react';
5757
import { FieldAccessor } from '@contember/react-binding';
@@ -1228,7 +1228,7 @@ export interface FileDataExtractor<ExtractedData = unknown, UploadResult = unkno
12281228
// (undocumented)
12291229
extractFileData?: (options: FileDataExtractorExtractFileDataOptions<AcceptArtifacts>) => Promise<ExtractedData> | null;
12301230
// (undocumented)
1231-
getErrorsHolders?: (options: FileDataExtractorGetErrorsOptions) => AccessorErrorsHolder[];
1231+
getErrorsHolders?: (options: FileDataExtractorGetErrorsOptions) => ErrorAccessorHolder[];
12321232
// (undocumented)
12331233
populateFields: (options: FileDataExtractorPopulateFieldsOptions<ExtractedData, UploadResult, AcceptArtifacts>) => void;
12341234
// (undocumented)
@@ -2861,7 +2861,7 @@ export interface ResolvedDiscriminatedDatum<Datum> {
28612861
export type ResolvedFileEntity = {
28622862
parentEntity: EntityAccessor;
28632863
destroy?: () => void;
2864-
getErrorHolders: () => AccessorErrorsHolder[];
2864+
getErrorHolders: () => ErrorAccessorHolder[];
28652865
} & ({
28662866
fileEntity: EntityAccessor;
28672867
fileKind: FullFileKind<any, any>;

build/api/binding.api.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,8 @@ export class EntityListAccessor implements Errorable {
357357
// (undocumented)
358358
getChildEntityById(id: EntityId): EntityAccessor;
359359
// (undocumented)
360+
getParent(): EntityAccessor | undefined;
361+
// (undocumented)
360362
hasEntityId(id: EntityId): boolean;
361363
// (undocumented)
362364
hasEntityOnServer(entityOrItsId: EntityAccessor | EntityId): boolean;
@@ -714,6 +716,12 @@ export namespace ErrorAccessor {
714716
normalizeError: (error: Error | string) => Error;
715717
}
716718

719+
// @public (undocumented)
720+
export interface ErrorAccessorHolder {
721+
// (undocumented)
722+
readonly errors: ErrorAccessor | undefined;
723+
}
724+
717725
// @public (undocumented)
718726
export type ErrorPersistResult = InvalidInputPersistResult | InvalidResponseResult;
719727

@@ -845,6 +853,8 @@ export class FieldAccessor<Value extends FieldValue = FieldValue> implements Err
845853
// (undocumented)
846854
readonly getAccessor: FieldAccessor.GetFieldAccessor<Value>;
847855
// (undocumented)
856+
getParent(): EntityAccessor;
857+
// (undocumented)
848858
readonly hasUnpersistedChanges: boolean;
849859
// (undocumented)
850860
hasValue(candidate: this['value']): boolean;

build/api/interface.api.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { ReactNode } from 'react';
1616
import { RouteMap } from '@contember/react-routing';
1717
import { RoutingLinkTarget } from '@contember/react-routing';
1818
import { SuccessfulPersistResult } from '@contember/react-binding';
19+
import { SugaredRelativeSingleEntity } from '@contember/react-binding';
1920
import { SugaredRelativeSingleField } from '@contember/react-binding';
2021

2122
// @public (undocumented)
@@ -63,6 +64,23 @@ export interface DeleteEntityTriggerProps {
6364
onPersistSuccess?: (result: SuccessfulPersistResult) => void;
6465
}
6566

67+
// @public (undocumented)
68+
export const DisconnectEntityTrigger: ({ immediatePersist, onPersistError, onPersistSuccess, field, ...props }: DisconnectEntityTriggerProps) => JSX_2.Element;
69+
70+
// @public (undocumented)
71+
export interface DisconnectEntityTriggerProps {
72+
// (undocumented)
73+
children: ReactNode;
74+
// (undocumented)
75+
field?: SugaredRelativeSingleEntity['field'];
76+
// (undocumented)
77+
immediatePersist?: true;
78+
// (undocumented)
79+
onPersistError?: (result: ErrorPersistResult) => void;
80+
// (undocumented)
81+
onPersistSuccess?: (result: SuccessfulPersistResult) => void;
82+
}
83+
6684
// @public (undocumented)
6785
export const EntityBeforePersist: ({ listener }: {
6886
listener: EntityAccessor.EntityEventListenerMap['beforePersist'];

build/api/react-binding-ui.api.md

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,6 @@ export type AccessorErrorMessages = [AccessorErrorMessage, ...AccessorErrorMessa
4242
// @public (undocumented)
4343
export function AccessorErrors({ accessor, ...errorListProps }: AccessorErrorsProps): ReactElement | null;
4444

45-
// @public (undocumented)
46-
export interface AccessorErrorsHolder {
47-
// (undocumented)
48-
readonly errors: ErrorAccessor | undefined;
49-
}
50-
5145
// @public (undocumented)
5246
export interface AccessorErrorsProps extends Omit<ErrorListProps, 'errors'> {
5347
// (undocumented)

build/api/react-client.api.md

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -159,34 +159,46 @@ export interface SessionTokenContextValue {
159159
export const SetSessionTokenContext: Context<(token: string | undefined) => void>;
160160

161161
// @public (undocumented)
162-
export type SingleFileUploadState<Result = unknown, Metadata = undefined> = {
163-
readyState: 'initializing';
164-
abortController: AbortController;
162+
export type SingleFileUploadErrorState<Metadata = undefined> = {
163+
readyState: 'error';
164+
errors: FileUploadError[] | undefined;
165+
rawError: any;
165166
file: File;
167+
metadata: Metadata | undefined;
166168
previewUrl: string;
167-
} | {
168-
readyState: 'uploading';
169+
uploader: FileUploader | undefined;
170+
};
171+
172+
// @public (undocumented)
173+
export type SingleFileUploadInitializingState = {
174+
readyState: 'initializing';
169175
abortController: AbortController;
170176
file: File;
171-
metadata: Metadata;
172177
previewUrl: string;
173-
progress: number | undefined;
174-
uploader: FileUploader;
175-
} | {
178+
};
179+
180+
// @public (undocumented)
181+
export type SingleFileUploadState<Result = unknown, Metadata = undefined> = SingleFileUploadInitializingState | SingleFileUploadUploadingState<Metadata> | SingleFileUploadSuccessState<Metadata, Result> | SingleFileUploadErrorState<Metadata>;
182+
183+
// @public (undocumented)
184+
export type SingleFileUploadSuccessState<Metadata = undefined, Result = unknown> = {
176185
readyState: 'success';
177186
file: File;
178187
metadata: Metadata;
179188
previewUrl: string;
180189
result: Result;
181190
uploader: FileUploader;
182-
} | {
183-
readyState: 'error';
184-
errors: FileUploadError[] | undefined;
185-
rawError: any;
191+
};
192+
193+
// @public (undocumented)
194+
export type SingleFileUploadUploadingState<Metadata = undefined> = {
195+
readyState: 'uploading';
196+
abortController: AbortController;
186197
file: File;
187-
metadata: Metadata | undefined;
198+
metadata: Metadata;
188199
previewUrl: string;
189-
uploader: FileUploader | undefined;
200+
progress: number | undefined;
201+
uploader: FileUploader;
190202
};
191203

192204
// @public (undocumented)

build/api/react-repeater.api.md

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
55
```ts
66

7+
import { Context } from 'react';
78
import { EntityAccessor } from '@contember/binding';
89
import { EntityAccessor as EntityAccessor_2 } from '@contember/react-binding';
910
import { EntityListAccessor } from '@contember/binding';
@@ -29,6 +30,9 @@ export const RepeaterAddItemTrigger: ({ children, index }: {
2930
index: RepeaterAddItemIndex;
3031
}) => JSX_2.Element;
3132

33+
// @internal (undocumented)
34+
export const RepeaterCurrentEntityContext: Context<EntityAccessor_2>;
35+
3236
// @public (undocumented)
3337
export const RepeaterEachItem: ({ children }: {
3438
children: ReactNode;
@@ -39,13 +43,19 @@ export const RepeaterEmpty: ({ children }: {
3943
children: ReactNode;
4044
}) => JSX_2.Element | null;
4145

46+
// @internal (undocumented)
47+
export const RepeaterEntityListAccessorContext: Context<EntityListAccessor>;
48+
4249
// @public (undocumented)
4350
export type RepeaterMethods = {
4451
moveItem?: RepeaterMoveItemMethod;
45-
addItem?: RepeaterAddItemMethod;
46-
removeItem?: RepeaterRemoveItemMethod;
52+
addItem: RepeaterAddItemMethod;
53+
removeItem: RepeaterRemoveItemMethod;
4754
};
4855

56+
// @internal (undocumented)
57+
export const RepeaterMethodsContext: Context<RepeaterMethods>;
58+
4959
// @public (undocumented)
5060
export type RepeaterMoveItemIndex = number | 'first' | 'last' | 'previous' | 'next';
5161

@@ -68,13 +78,13 @@ export type RepeaterProps = RepeaterQualifiedProps | RepeaterRelativeProps;
6878

6979
// @public (undocumented)
7080
export type RepeaterQualifiedProps = SugaredQualifiedEntityList & {
71-
children: React_2.ReactNode;
81+
children?: React_2.ReactNode;
7282
sortableBy?: SugaredFieldProps['field'];
7383
};
7484

7585
// @public (undocumented)
7686
export type RepeaterRelativeProps = SugaredRelativeEntityList & {
77-
children: React_2.ReactNode;
87+
children?: React_2.ReactNode;
7888
sortableBy?: SugaredFieldProps['field'];
7989
};
8090

@@ -86,8 +96,14 @@ export const RepeaterRemoveItemTrigger: ({ children }: {
8696
children: ReactNode;
8797
}) => JSX_2.Element;
8898

99+
// @internal (undocumented)
100+
export const RepeaterSortedEntitiesContext: Context<EntityAccessor_2[]>;
101+
102+
// @public (undocumented)
103+
export const useRepeaterCurrentEntity: () => EntityAccessor_2;
104+
89105
// @public (undocumented)
90-
export const useRepeaterEntityListAccessor: () => EntityListAccessor | undefined;
106+
export const useRepeaterEntityListAccessor: () => EntityListAccessor;
91107

92108
// @public (undocumented)
93109
export const useRepeaterMethods: () => RepeaterMethods;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
## API Report File for "@contember/react-uploader-dropzone"
2+
3+
> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).
4+
5+
```ts
6+
7+
import { DropzoneState } from 'react-dropzone';
8+
import { JSX as JSX_2 } from 'react/jsx-runtime';
9+
import { ReactNode } from 'react';
10+
11+
// @public (undocumented)
12+
export const UploaderDropzoneArea: ({ children }: {
13+
children: ReactNode;
14+
}) => JSX_2.Element;
15+
16+
// @public (undocumented)
17+
export const UploaderDropzoneInput: () => JSX_2.Element;
18+
19+
// @public (undocumented)
20+
export const UploaderDropzoneRoot: ({ children, noInput }: {
21+
children: ReactNode;
22+
noInput?: boolean | undefined;
23+
}) => JSX_2.Element;
24+
25+
// @public (undocumented)
26+
export const useUploaderDropzoneState: () => DropzoneState;
27+
28+
// (No @packageDocumentation comment for this package)
29+
30+
```

0 commit comments

Comments
 (0)