@overmap-ai/core 1.0.50-fix-error-messaging.0 → 1.0.51-bulk-form-submission.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.
@@ -1,6 +1,6 @@
1
1
  import { BaseApiService } from "./BaseApiService";
2
2
  import type { OptimisticModelResult } from "../typings";
3
- import { ComponentAttachment, ComponentTypeAttachment, Created, IssueAttachment, MaybeObjectURL, AttachmentPayload, Stored, ProjectAttachment, Project } from "../../typings";
3
+ import { ComponentAttachment, ComponentTypeAttachment, Created, IssueAttachment, MaybeObjectURL, AttachmentPayload, Stored, ProjectAttachment, DocumentAttachment, ProjectDocument } from "../../typings";
4
4
  /**
5
5
  * Handles creation and caching of attachments
6
6
  */
@@ -15,24 +15,25 @@ interface CreatedAttachments {
15
15
  component_attachments: Created<ComponentAttachment>[];
16
16
  component_type_attachments: Created<ComponentTypeAttachment>[];
17
17
  project_attachments: Created<ProjectAttachment>[];
18
+ document_attachments: Created<DocumentAttachment>[];
18
19
  }
19
20
  export declare class AttachmentService extends BaseApiService {
20
21
  fetchAll(projectId: number): [StoredAttachments, Promise<CreatedAttachments>];
21
22
  addIssueAttachment(attachmentPayload: AttachmentPayload<IssueAttachment>): Promise<OptimisticModelResult<IssueAttachment>>;
22
23
  addComponentAttachment(attachmentPayload: AttachmentPayload<ComponentAttachment>): Promise<OptimisticModelResult<ComponentAttachment>>;
23
24
  addComponentTypeAttachment(attachmentPayload: AttachmentPayload<ComponentTypeAttachment>): Promise<OptimisticModelResult<ComponentTypeAttachment>>;
24
- addProjectAttachment(attachmentPayload: AttachmentPayload<ProjectAttachment>): Promise<OptimisticModelResult<ProjectAttachment>>;
25
+ addDocumentAttachment(attachmentPayload: AttachmentPayload<DocumentAttachment>): Promise<OptimisticModelResult<DocumentAttachment>>;
25
26
  /** the outer Promise is needed to await the hashing of each file, which is required before offline use. If wanting to
26
27
  * attach promise handlers to the request to add the attachment in the backend, apply it on the promise returned from the
27
28
  * OptimisticModelResult. */
28
29
  attachFilesToIssue(filesToSubmit: File[], issueId: string): Promise<OptimisticModelResult<IssueAttachment>>[];
29
30
  attachFilesToComponent(filesToSubmit: File[], componentId: string): Promise<OptimisticModelResult<ComponentAttachment>>[];
30
31
  attachFilesToComponentType(filesToSubmit: File[], componentTypeId: string): Promise<OptimisticModelResult<ComponentTypeAttachment>>[];
31
- attachFilesToProject(filesToSubmit: File[], projectId: Project["id"]): Promise<OptimisticModelResult<ProjectAttachment>>[];
32
+ attachFilesToDocument(filesToSubmit: File[], documentId: ProjectDocument["offline_id"]): Promise<OptimisticModelResult<DocumentAttachment>>[];
32
33
  replaceIssueAttachmentFile(attachmentId: string, newFile: MaybeObjectURL<File>): Promise<OptimisticModelResult<IssueAttachment>>;
33
34
  replaceComponentAttachmentFile(attachmentId: string, newFile: MaybeObjectURL<File>): Promise<OptimisticModelResult<ComponentAttachment>>;
34
35
  replaceComponentTypeAttachmentFile(attachmentId: string, newFile: MaybeObjectURL<File>): Promise<OptimisticModelResult<ComponentTypeAttachment>>;
35
- replaceProjectAttachmentFile(attachmentId: string, newFile: MaybeObjectURL<File>): Promise<OptimisticModelResult<ProjectAttachment>>;
36
+ replaceDocumentAttachmentFile(attachmentId: string, newFile: MaybeObjectURL<File>): Promise<OptimisticModelResult<DocumentAttachment>>;
36
37
  /**
37
38
  * Deletes an attachment and associated data in the cloud, in the Redux store and the cache.
38
39
  * @param issueAttachmentId
@@ -40,6 +41,6 @@ export declare class AttachmentService extends BaseApiService {
40
41
  deleteIssueAttachment(issueAttachmentId: string): Promise<undefined>;
41
42
  deleteComponentAttachment(componentAttachmentId: string): Promise<undefined>;
42
43
  deleteComponentTypeAttachment(componentTypeAttachmentId: string): Promise<undefined>;
43
- deleteProjectAttachment(projectAttachmentId: string): Promise<undefined>;
44
+ deleteDocumentAttachment(documentAttachmentId: string): Promise<undefined>;
44
45
  }
45
46
  export {};
@@ -1,11 +1,18 @@
1
1
  import { Offline } from '../../typings/models/base';
2
2
  import { BaseApiService } from "./BaseApiService";
3
3
  import { UserFormSubmission, UserFormSubmissionPayload } from '../../typings/models/forms';
4
- import { OptimisticModelResult } from "../typings";
4
+ import { OptimisticModelResult, OptimisticMultipleModelResult } from "../typings";
5
+ import { FieldValue } from '../../forms';
6
+ import { Stored } from "../../typings";
5
7
  export declare class UserFormSubmissionService extends BaseApiService {
6
8
  private getAttachFilesPromises;
7
9
  add(payload: Offline<UserFormSubmissionPayload>): OptimisticModelResult<UserFormSubmission>;
8
- update(submission: UserFormSubmission): Promise<UserFormSubmission>;
10
+ bulkAdd(args: {
11
+ form_revision: string;
12
+ values: Record<string, FieldValue>;
13
+ componentOfflineIds: string[];
14
+ }): Promise<OptimisticMultipleModelResult<UserFormSubmission>>;
15
+ update(submission: Stored<UserFormSubmission>): OptimisticModelResult<UserFormSubmission>;
9
16
  delete(submissionId: string): Promise<undefined>;
10
17
  refreshStore(): Promise<void>;
11
18
  }
@@ -60,8 +60,10 @@ export declare const selectCategories: ((state: import("redux").EmptyObject & {
60
60
  projectFileReducer: import('..').ProjectFileState;
61
61
  rehydratedReducer: import('..').RehydratedState;
62
62
  settingReducer: import('..').SettingState;
63
- userFormReducer: import('..').UserFormState;
63
+ formReducer: import('..').FormState;
64
64
  userReducer: import('..').UserState;
65
+ formRevisionReducer: import('..').FormRevisionState;
66
+ formSubmissionReducer: import('..').FormSubmissionState;
65
67
  workspaceReducer: import('..').WorkspaceState;
66
68
  emailDomainsReducer: import('..').EmailDomainState;
67
69
  licenseReducer: import('..').LicenseState;
@@ -55,6 +55,7 @@ export declare const selectNumberOfComponentsOfComponentType: SelectorWithArgs<s
55
55
  export declare const selectComponentTypesFromIds: SelectorWithArgs<string[], ComponentType[]>;
56
56
  export declare const selectComponentAttachmentMapping: (state: RootState) => Record<string, Stored<ComponentAttachment>>;
57
57
  export declare const selectAllComponentAttachments: Selector<Stored<ComponentAttachment>[]>;
58
+ export declare const selectComponentAttachment: SelectorWithArgs<string, Stored<ComponentAttachment>>;
58
59
  export declare const selectAttachmentsOfComponent: (args: string) => (state: RootState) => Stored<ComponentAttachment>[];
59
60
  export declare const selectAttachmentsOfComponentByType: (args: string) => (state: RootState) => {
60
61
  fileAttachments: Stored<ComponentAttachment>[];
@@ -56,6 +56,7 @@ export declare const selectComponentTypesByName: SelectorWithArgs<string, Compon
56
56
  export declare const selectHiddenComponentTypeIds: AppSelector<Record<string, boolean | undefined>>;
57
57
  export declare const selectComponentTypeAttachmentMapping: (state: RootState) => Record<string, ComponentTypeAttachment>;
58
58
  export declare const selectAllComponentTypeAttachments: Selector<Stored<ComponentTypeAttachment>[]>;
59
+ export declare const selectComponentTypeAttachment: SelectorWithArgs<string, Stored<ComponentTypeAttachment>>;
59
60
  export declare const selectAttachmentsOfComponentType: (args: string) => (state: RootState) => Stored<ComponentTypeAttachment>[];
60
61
  export declare const selectAttachmentsOfComponentTypeByType: (args: string) => (state: RootState) => {
61
62
  fileAttachments: Stored<ComponentTypeAttachment>[];
@@ -1,9 +1,10 @@
1
1
  /// <reference types="@redux-offline/redux-offline" />
2
2
  import { Reducer } from "@reduxjs/toolkit";
3
- import { MovePosition, ProjectDocument, RootState, Stored, Submitted } from "../../typings";
3
+ import { DocumentAttachment, MovePosition, ProjectDocument, RootState, Selector, SelectorWithArgs, Stored, Submitted } from "../../typings";
4
4
  import { AppSelector } from "./componentTypeSlice";
5
5
  export interface DocumentState {
6
6
  documents: Record<string, Stored<ProjectDocument>>;
7
+ attachments: Record<string, Stored<DocumentAttachment>>;
7
8
  }
8
9
  export interface MoveDocumentPayload {
9
10
  documentId: ProjectDocument["offline_id"];
@@ -26,8 +27,32 @@ export declare const documentSlice: import("@reduxjs/toolkit").Slice<DocumentSta
26
27
  removeDocuments: (state: import("immer/dist/internal.js").WritableDraft<DocumentState>, action: {
27
28
  payload: string[];
28
29
  }) => void;
30
+ setDocumentAttachments: (state: DocumentState, action: {
31
+ payload: import('../../typings/models/issues').Created<DocumentAttachment>[];
32
+ type: string;
33
+ }) => void;
34
+ addDocumentAttachment: (state: DocumentState, action: {
35
+ payload: Submitted<DocumentAttachment>;
36
+ type: string;
37
+ }) => void;
38
+ addDocumentAttachments: (state: DocumentState, action: {
39
+ payload: Submitted<DocumentAttachment>[];
40
+ type: string;
41
+ }) => void;
42
+ updateDocumentAttachment: (state: DocumentState, action: {
43
+ payload: Submitted<DocumentAttachment>;
44
+ type: string;
45
+ }) => void;
46
+ removeDocumentAttachment: (state: DocumentState, action: {
47
+ payload: string;
48
+ type: string;
49
+ }) => void;
50
+ removeDocumentAttachments: (state: DocumentState, action: {
51
+ payload: string[];
52
+ type: string;
53
+ }) => void;
29
54
  }, "documents">;
30
- export declare const setDocuments: import("@reduxjs/toolkit").ActionCreatorWithPayload<ProjectDocument[], "documents/setDocuments">, addDocuments: import("@reduxjs/toolkit").ActionCreatorWithPayload<ProjectDocument[], "documents/addDocuments">, updateDocuments: import("@reduxjs/toolkit").ActionCreatorWithPayload<Submitted<Partial<ProjectDocument>>[], "documents/updateDocuments">, moveDocument: import("@reduxjs/toolkit").ActionCreatorWithPayload<MoveDocumentPayload, "documents/moveDocument">, removeDocuments: import("@reduxjs/toolkit").ActionCreatorWithPayload<string[], "documents/removeDocuments">;
55
+ export declare const setDocuments: import("@reduxjs/toolkit").ActionCreatorWithPayload<ProjectDocument[], "documents/setDocuments">, addDocuments: import("@reduxjs/toolkit").ActionCreatorWithPayload<ProjectDocument[], "documents/addDocuments">, updateDocuments: import("@reduxjs/toolkit").ActionCreatorWithPayload<Submitted<Partial<ProjectDocument>>[], "documents/updateDocuments">, moveDocument: import("@reduxjs/toolkit").ActionCreatorWithPayload<MoveDocumentPayload, "documents/moveDocument">, removeDocuments: import("@reduxjs/toolkit").ActionCreatorWithPayload<string[], "documents/removeDocuments">, setDocumentAttachments: import("@reduxjs/toolkit").ActionCreatorWithPayload<import('../../typings/models/issues').Created<DocumentAttachment>[], "documents/setDocumentAttachments">, addDocumentAttachment: import("@reduxjs/toolkit").ActionCreatorWithPayload<Submitted<DocumentAttachment>, "documents/addDocumentAttachment">, addDocumentAttachments: import("@reduxjs/toolkit").ActionCreatorWithPayload<Submitted<DocumentAttachment>[], "documents/addDocumentAttachments">, updateDocumentAttachment: import("@reduxjs/toolkit").ActionCreatorWithPayload<Submitted<DocumentAttachment>, "documents/updateDocumentAttachment">, removeDocumentAttachment: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "documents/removeDocumentAttachment">, removeDocumentAttachments: import("@reduxjs/toolkit").ActionCreatorWithPayload<string[], "documents/removeDocumentAttachments">;
31
56
  export declare const selectDocumentsMapping: AppSelector<Record<string, Stored<ProjectDocument>>>;
32
57
  export declare const selectDocuments: AppSelector<Stored<ProjectDocument>[]>;
33
58
  export declare const selectDocument: (args: string) => (state: RootState) => Stored<ProjectDocument> | undefined;
@@ -51,8 +76,10 @@ export declare const selectRootDocuments: ((state: import("redux").EmptyObject &
51
76
  projectFileReducer: import('..').ProjectFileState;
52
77
  rehydratedReducer: import('..').RehydratedState;
53
78
  settingReducer: import('..').SettingState;
54
- userFormReducer: import('..').UserFormState;
79
+ formReducer: import('..').FormState;
55
80
  userReducer: import('..').UserState;
81
+ formRevisionReducer: import('..').FormRevisionState;
82
+ formSubmissionReducer: import('..').FormSubmissionState;
56
83
  workspaceReducer: import('..').WorkspaceState;
57
84
  emailDomainsReducer: import('..').EmailDomainState;
58
85
  licenseReducer: import('..').LicenseState;
@@ -64,4 +91,12 @@ export declare const selectRootDocuments: ((state: import("redux").EmptyObject &
64
91
  }> & {
65
92
  clearCache: () => void;
66
93
  };
94
+ export declare const selectDocumentAttachmentMapping: (state: RootState) => Record<string, Stored<DocumentAttachment>>;
95
+ export declare const selectAllDocumentAttachments: Selector<Stored<DocumentAttachment>[]>;
96
+ export declare const selectDocumentAttachment: SelectorWithArgs<string, Stored<DocumentAttachment>>;
97
+ export declare const selectAttachmentsOfDocument: (args: string) => (state: RootState) => Stored<DocumentAttachment>[];
98
+ export declare const selectAttachmentsOfDocumentByType: (args: string) => (state: RootState) => {
99
+ fileAttachments: Stored<DocumentAttachment>[];
100
+ imageAttachments: Stored<DocumentAttachment>[];
101
+ };
67
102
  export declare const documentsReducer: Reducer<DocumentState>;
@@ -0,0 +1,73 @@
1
+ /// <reference types="@redux-offline/redux-offline" />
2
+ import { PayloadAction, Reducer } from "@reduxjs/toolkit";
3
+ import { RootState, Selector, SelectorWithArgs, Stored, UserForm, UserFormRevision, UserFormRevisionAttachment } from "../../typings";
4
+ export interface FormRevisionState {
5
+ formRevisions: Record<UserFormRevision["offline_id"], Stored<UserFormRevision>>;
6
+ attachments: Record<UserFormRevisionAttachment["offline_id"], Stored<UserFormRevisionAttachment>>;
7
+ }
8
+ export declare const formRevisionsSlice: import("@reduxjs/toolkit").Slice<FormRevisionState, {
9
+ setFormRevision: (state: import("immer/dist/internal.js").WritableDraft<FormRevisionState>, action: PayloadAction<Stored<UserFormRevision>>) => void;
10
+ setFormRevisions: (state: import("immer/dist/internal.js").WritableDraft<FormRevisionState>, action: {
11
+ payload: Stored<UserFormRevision>[];
12
+ }) => void;
13
+ addFormRevision: (state: import("immer/dist/internal.js").WritableDraft<FormRevisionState>, action: PayloadAction<Stored<UserFormRevision>>) => void;
14
+ addFormRevisions: (state: import("immer/dist/internal.js").WritableDraft<FormRevisionState>, action: {
15
+ payload: Stored<UserFormRevision>[];
16
+ }) => void;
17
+ deleteFormRevision: (state: import("immer/dist/internal.js").WritableDraft<FormRevisionState>, action: PayloadAction<UserFormRevision["offline_id"]>) => void;
18
+ deleteFormRevisions: (state: import("immer/dist/internal.js").WritableDraft<FormRevisionState>, action: PayloadAction<UserFormRevision["offline_id"][]>) => void;
19
+ setFormRevisionAttachments: (state: import("immer/dist/internal.js").WritableDraft<FormRevisionState>, action: {
20
+ payload: Stored<UserFormRevisionAttachment>[];
21
+ }) => void;
22
+ addFormRevisionAttachment: (state: import("immer/dist/internal.js").WritableDraft<FormRevisionState>, action: PayloadAction<Stored<UserFormRevisionAttachment>>) => void;
23
+ addFormRevisionAttachments: (state: import("immer/dist/internal.js").WritableDraft<FormRevisionState>, action: {
24
+ payload: Stored<UserFormRevisionAttachment>[];
25
+ }) => void;
26
+ deleteFormRevisionAttachment: (state: import("immer/dist/internal.js").WritableDraft<FormRevisionState>, action: PayloadAction<UserFormRevisionAttachment["offline_id"]>) => void;
27
+ deleteFormRevisionAttachments: (state: import("immer/dist/internal.js").WritableDraft<FormRevisionState>, action: PayloadAction<UserFormRevisionAttachment["offline_id"][]>) => void;
28
+ }, "formRevisions">;
29
+ export declare const setFormRevision: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormRevision<import('../../forms').ISerializedField>>, "formRevisions/setFormRevision">, setFormRevisions: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormRevision<import('../../forms').ISerializedField>>[], "formRevisions/setFormRevisions">, addFormRevision: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormRevision<import('../../forms').ISerializedField>>, "formRevisions/addFormRevision">, addFormRevisions: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormRevision<import('../../forms').ISerializedField>>[], "formRevisions/addFormRevisions">, deleteFormRevision: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "formRevisions/deleteFormRevision">, deleteFormRevisions: import("@reduxjs/toolkit").ActionCreatorWithPayload<string[], "formRevisions/deleteFormRevisions">, setFormRevisionAttachments: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormRevisionAttachment>[], "formRevisions/setFormRevisionAttachments">, addFormRevisionAttachment: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormRevisionAttachment>, "formRevisions/addFormRevisionAttachment">, addFormRevisionAttachments: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormRevisionAttachment>[], "formRevisions/addFormRevisionAttachments">, deleteFormRevisionAttachment: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "formRevisions/deleteFormRevisionAttachment">, deleteFormRevisionAttachments: import("@reduxjs/toolkit").ActionCreatorWithPayload<string[], "formRevisions/deleteFormRevisionAttachments">;
30
+ export declare const selectFormRevisionMapping: (state: RootState) => Record<string, Stored<UserFormRevision<import('../../forms').ISerializedField>>>;
31
+ export declare const selectFormRevisions: ((state: import("redux").EmptyObject & {
32
+ versioning: import('../slices/versioningSlice').VersioningState;
33
+ fileReducer: import('..').FileState;
34
+ authReducer: import('..').AuthState;
35
+ categoryReducer: import('..').CategoryState;
36
+ componentReducer: import('..').ComponentState;
37
+ componentStageCompletionReducer: import('..').ComponentStageCompletionState;
38
+ componentStageReducer: import('..').ComponentStageState;
39
+ componentTypeReducer: import('..').ComponentTypeState;
40
+ issueReducer: import('..').IssueState;
41
+ mapReducer: import('..').MapState;
42
+ organizationReducer: import('..').OrganizationState;
43
+ outboxReducer: import('..').OutboxState;
44
+ projectReducer: import('..').ProjectState;
45
+ projectAccessReducer: import('..').ProjectAccessState;
46
+ organizationAccessReducer: import('..').OrganizationAccessState;
47
+ projectFileReducer: import('..').ProjectFileState;
48
+ rehydratedReducer: import('..').RehydratedState;
49
+ settingReducer: import('..').SettingState;
50
+ formReducer: import('..').FormState;
51
+ userReducer: import('..').UserState;
52
+ formRevisionReducer: FormRevisionState;
53
+ formSubmissionReducer: import('..').FormSubmissionState;
54
+ workspaceReducer: import('..').WorkspaceState;
55
+ emailDomainsReducer: import('..').EmailDomainState;
56
+ licenseReducer: import('..').LicenseState;
57
+ documentsReducer: import('..').DocumentState;
58
+ } & {
59
+ offline: import("@redux-offline/redux-offline/lib/types").OfflineState;
60
+ }) => Stored<UserFormRevision<import('../../forms').ISerializedField>>[]) & import("reselect").OutputSelectorFields<(args_0: Record<string, Stored<UserFormRevision<import('../../forms').ISerializedField>>>) => Stored<UserFormRevision<import('../../forms').ISerializedField>>[], {
61
+ clearCache: () => void;
62
+ }> & {
63
+ clearCache: () => void;
64
+ };
65
+ export declare const selectFormRevision: SelectorWithArgs<string, Stored<UserFormRevision>>;
66
+ export declare const _selectLatestFormRevision: (formRevisions: FormRevisionState["formRevisions"], formId: string) => Stored<UserFormRevision>;
67
+ export declare const selectLatestFormRevisionOfForm: SelectorWithArgs<string, Stored<UserFormRevision>>;
68
+ export declare const selectFormRevisionsOfForm: SelectorWithArgs<string, Stored<UserFormRevision>[]>;
69
+ export declare const selectLatestFormRevisionsOfComponentTypes: SelectorWithArgs<string[], Record<string, Stored<UserFormRevision>>>;
70
+ export declare const selectLatestFormRevisionByForm: Selector<Record<Stored<UserForm>["offline_id"], Stored<UserFormRevision>>>;
71
+ export declare const selectUserFormRevisionAttachmentsMapping: Selector<FormRevisionState["attachments"]>;
72
+ export declare const selectAttachmentsOfFormRevision: SelectorWithArgs<string, Stored<UserFormRevisionAttachment>[]>;
73
+ export declare const formRevisionReducer: Reducer<FormRevisionState>;
@@ -0,0 +1,118 @@
1
+ import { Reducer } from "@reduxjs/toolkit";
2
+ import { CachedUserForm, UserForm } from '../../typings/models/forms';
3
+ import { SearchArgs } from '../../typings/search';
4
+ import { Selector, SelectorWithArgs } from '../../typings/store';
5
+ import { Stored, Submitted } from "../../typings";
6
+ export interface FormState {
7
+ forms: Record<string, Stored<UserForm>>;
8
+ }
9
+ export declare const formSlice: import("@reduxjs/toolkit").Slice<FormState, {
10
+ setForms: (state: import("immer/dist/internal.js").WritableDraft<FormState>, action: {
11
+ payload: Submitted<UserForm>[];
12
+ }) => void;
13
+ addForm: (state: import("immer/dist/internal.js").WritableDraft<FormState>, action: {
14
+ payload: Submitted<UserForm>;
15
+ }) => void;
16
+ addForms: (state: import("immer/dist/internal.js").WritableDraft<FormState>, action: {
17
+ payload: Submitted<UserForm>[];
18
+ }) => void;
19
+ favoriteForm: (state: import("immer/dist/internal.js").WritableDraft<FormState>, action: {
20
+ payload: {
21
+ formId: string;
22
+ };
23
+ }) => void;
24
+ unfavoriteForm: (state: import("immer/dist/internal.js").WritableDraft<FormState>, action: {
25
+ payload: {
26
+ formId: string;
27
+ };
28
+ }) => void;
29
+ deleteForm: (state: import("immer/dist/internal.js").WritableDraft<FormState>, action: {
30
+ payload: string;
31
+ }) => void;
32
+ }, "forms">;
33
+ export declare const setForms: import("@reduxjs/toolkit").ActionCreatorWithPayload<((Pick<import('../../typings/models/workspace').WorkspaceIndexedModel, "index_workspace"> & {
34
+ favorite: boolean;
35
+ component_type?: string | undefined;
36
+ } & {
37
+ owner_organization: number;
38
+ owner_user: undefined;
39
+ } & {
40
+ offline_id: string;
41
+ } & import('../../typings/models/base').OfflineModel & {
42
+ created_by: number;
43
+ submitted_at: string;
44
+ }) | (Pick<import('../../typings/models/workspace').WorkspaceIndexedModel, "index_workspace"> & {
45
+ favorite: boolean;
46
+ component_type?: string | undefined;
47
+ } & {
48
+ owner_organization: undefined;
49
+ owner_user: number;
50
+ } & {
51
+ offline_id: string;
52
+ } & import('../../typings/models/base').OfflineModel & {
53
+ created_by: number;
54
+ submitted_at: string;
55
+ }))[], "forms/setForms">, addForm: import("@reduxjs/toolkit").ActionCreatorWithPayload<(Pick<import('../../typings/models/workspace').WorkspaceIndexedModel, "index_workspace"> & {
56
+ favorite: boolean;
57
+ component_type?: string | undefined;
58
+ } & {
59
+ owner_organization: number;
60
+ owner_user: undefined;
61
+ } & {
62
+ offline_id: string;
63
+ } & import('../../typings/models/base').OfflineModel & {
64
+ created_by: number;
65
+ submitted_at: string;
66
+ }) | (Pick<import('../../typings/models/workspace').WorkspaceIndexedModel, "index_workspace"> & {
67
+ favorite: boolean;
68
+ component_type?: string | undefined;
69
+ } & {
70
+ owner_organization: undefined;
71
+ owner_user: number;
72
+ } & {
73
+ offline_id: string;
74
+ } & import('../../typings/models/base').OfflineModel & {
75
+ created_by: number;
76
+ submitted_at: string;
77
+ }), "forms/addForm">, addForms: import("@reduxjs/toolkit").ActionCreatorWithPayload<((Pick<import('../../typings/models/workspace').WorkspaceIndexedModel, "index_workspace"> & {
78
+ favorite: boolean;
79
+ component_type?: string | undefined;
80
+ } & {
81
+ owner_organization: number;
82
+ owner_user: undefined;
83
+ } & {
84
+ offline_id: string;
85
+ } & import('../../typings/models/base').OfflineModel & {
86
+ created_by: number;
87
+ submitted_at: string;
88
+ }) | (Pick<import('../../typings/models/workspace').WorkspaceIndexedModel, "index_workspace"> & {
89
+ favorite: boolean;
90
+ component_type?: string | undefined;
91
+ } & {
92
+ owner_organization: undefined;
93
+ owner_user: number;
94
+ } & {
95
+ offline_id: string;
96
+ } & import('../../typings/models/base').OfflineModel & {
97
+ created_by: number;
98
+ submitted_at: string;
99
+ }))[], "forms/addForms">, favoriteForm: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
100
+ formId: string;
101
+ }, "forms/favoriteForm">, unfavoriteForm: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
102
+ formId: string;
103
+ }, "forms/unfavoriteForm">, deleteForm: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "forms/deleteForm">;
104
+ export type FormSearchArgs = SearchArgs<{
105
+ /** `undefined` means don't filter by favorite. `boolean` filters forms. */
106
+ favorites?: boolean;
107
+ /** organization owner */
108
+ owner_organization?: number;
109
+ /** user owner */
110
+ owner_user?: number;
111
+ }>;
112
+ export declare const selectFilteredForms: SelectorWithArgs<FormSearchArgs, CachedUserForm[]>;
113
+ export declare const selectForm: SelectorWithArgs<string, Stored<UserForm>>;
114
+ export declare const selectFormMapping: Selector<Record<Stored<UserForm>["offline_id"], Stored<UserForm>>>;
115
+ export declare const selectFormOfComponentType: SelectorWithArgs<string, Stored<UserForm>>;
116
+ export declare const selectFormsCount: Selector<number>;
117
+ export declare const selectGeneralFormCount: Selector<number>;
118
+ export declare const formReducer: Reducer<FormState>;
@@ -0,0 +1,47 @@
1
+ import { PayloadAction, Reducer } from "@reduxjs/toolkit";
2
+ import { Selector, SelectorWithArgs, Stored, UserFormSubmission, UserFormSubmissionAttachment } from "../../typings";
3
+ export interface FormSubmissionState {
4
+ formSubmissions: Record<UserFormSubmission["offline_id"], Stored<UserFormSubmission>>;
5
+ attachments: Record<UserFormSubmissionAttachment["offline_id"], Stored<UserFormSubmissionAttachment>>;
6
+ }
7
+ export declare const formSubmissionSlice: import("@reduxjs/toolkit").Slice<FormSubmissionState, {
8
+ setFormSubmission: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: PayloadAction<Stored<UserFormSubmission>>) => void;
9
+ setFormSubmissions: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: {
10
+ payload: Stored<UserFormSubmission>[];
11
+ }) => void;
12
+ addFormSubmission: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: PayloadAction<Stored<UserFormSubmission>>) => void;
13
+ addFormSubmissions: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: {
14
+ payload: Stored<UserFormSubmission>[];
15
+ }) => void;
16
+ updateFormSubmission: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: PayloadAction<Stored<UserFormSubmission>>) => void;
17
+ updateFormSubmissions: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: {
18
+ payload: Stored<UserFormSubmission>[];
19
+ }) => void;
20
+ deleteFormSubmission: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: PayloadAction<UserFormSubmission["offline_id"]>) => void;
21
+ deleteFormSubmissions: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: {
22
+ payload: UserFormSubmission["offline_id"][];
23
+ }) => void;
24
+ addFormSubmissionAttachment: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: PayloadAction<UserFormSubmissionAttachment>) => void;
25
+ addFormSubmissionAttachments: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: {
26
+ payload: UserFormSubmissionAttachment[];
27
+ }) => void;
28
+ setFormSubmissionAttachments: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: {
29
+ payload: UserFormSubmissionAttachment[];
30
+ }) => void;
31
+ updateFormSubmissionAttachments: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: PayloadAction<Stored<UserFormSubmissionAttachment>[]>) => void;
32
+ deleteFormSubmissionAttachment: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: PayloadAction<UserFormSubmissionAttachment["offline_id"]>) => void;
33
+ deleteFormSubmissionAttachments: (state: import("immer/dist/internal.js").WritableDraft<FormSubmissionState>, action: {
34
+ payload: UserFormSubmissionAttachment["offline_id"][];
35
+ }) => void;
36
+ }, "formSubmissions">;
37
+ export declare const setFormSubmission: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormSubmission>, "formSubmissions/setFormSubmission">, setFormSubmissions: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormSubmission>[], "formSubmissions/setFormSubmissions">, addFormSubmission: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormSubmission>, "formSubmissions/addFormSubmission">, addFormSubmissions: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormSubmission>[], "formSubmissions/addFormSubmissions">, updateFormSubmission: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormSubmission>, "formSubmissions/updateFormSubmission">, updateFormSubmissions: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormSubmission>[], "formSubmissions/updateFormSubmissions">, deleteFormSubmission: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "formSubmissions/deleteFormSubmission">, deleteFormSubmissions: import("@reduxjs/toolkit").ActionCreatorWithPayload<string[], "formSubmissions/deleteFormSubmissions">, addFormSubmissionAttachment: import("@reduxjs/toolkit").ActionCreatorWithPayload<UserFormSubmissionAttachment, "formSubmissions/addFormSubmissionAttachment">, addFormSubmissionAttachments: import("@reduxjs/toolkit").ActionCreatorWithPayload<UserFormSubmissionAttachment[], "formSubmissions/addFormSubmissionAttachments">, setFormSubmissionAttachments: import("@reduxjs/toolkit").ActionCreatorWithPayload<UserFormSubmissionAttachment[], "formSubmissions/setFormSubmissionAttachments">, updateFormSubmissionAttachments: import("@reduxjs/toolkit").ActionCreatorWithPayload<Stored<UserFormSubmissionAttachment>[], "formSubmissions/updateFormSubmissionAttachments">, deleteFormSubmissionAttachment: import("@reduxjs/toolkit").ActionCreatorWithPayload<string, "formSubmissions/deleteFormSubmissionAttachment">, deleteFormSubmissionAttachments: import("@reduxjs/toolkit").ActionCreatorWithPayload<string[], "formSubmissions/deleteFormSubmissionAttachments">;
38
+ export declare const selectFormSubmissionsMapping: Selector<FormSubmissionState["formSubmissions"]>;
39
+ export declare const selectFormSubmissions: Selector<Stored<UserFormSubmission>[]>;
40
+ export declare const selectFormSubmission: SelectorWithArgs<string, Stored<UserFormSubmission>>;
41
+ export declare const selectFormSubmissionsOfForm: SelectorWithArgs<string, Stored<UserFormSubmission>[]>;
42
+ export declare const selectFormSubmissionsOfIssue: SelectorWithArgs<string, Stored<UserFormSubmission>[]>;
43
+ export declare const selectFormSubmissionsOfComponent: SelectorWithArgs<string, Stored<UserFormSubmission>[]>;
44
+ export declare const selectFormSubmissionsByComponents: Selector<Record<string, Stored<UserFormSubmission>[]>>;
45
+ export declare const selectFormSubmissionAttachmentsMapping: Selector<FormSubmissionState["attachments"]>;
46
+ export declare const selectAttachmentsOfFormSubmission: SelectorWithArgs<string, Stored<UserFormSubmissionAttachment>[]>;
47
+ export declare const formSubmissionReducer: Reducer<FormSubmissionState>;
@@ -14,7 +14,9 @@ export * from "./projectFileSlice";
14
14
  export * from "./projectSlice";
15
15
  export * from "./rehydratedSlice";
16
16
  export * from "./settingsSlice";
17
- export * from "./userFormSlice";
17
+ export * from "./formSlice";
18
+ export * from "./formSubmissionSlice";
19
+ export * from "./formRevisionSlice";
18
20
  export * from "./userSlice";
19
21
  export * from "./workspaceSlice";
20
22
  export * from "./organizationAccessSlice";
@@ -106,6 +106,7 @@ export declare const selectCommentsOfIssue: (args: string) => (state: RootState)
106
106
  export declare const selectIssueUpdateMapping: (state: RootState) => Record<string, Stored<IssueUpdate>>;
107
107
  export declare const selectIssueUpdatesOfIssue: (args: string) => (state: RootState) => Stored<IssueUpdate>[];
108
108
  export declare const selectAttachmentsOfIssue: (args: string) => (state: RootState) => Stored<IssueAttachment>[];
109
+ export declare const selectIssueAttachment: SelectorWithArgs<string, Stored<IssueAttachment>>;
109
110
  export declare const selectAttachmentsOfIssueByType: (args: string) => (state: RootState) => {
110
111
  fileAttachments: Stored<IssueAttachment>[];
111
112
  imageAttachments: Stored<IssueAttachment>[];
@@ -131,8 +132,10 @@ export declare const selectAllAttachments: ((state: import("redux").EmptyObject
131
132
  projectFileReducer: import('..').ProjectFileState;
132
133
  rehydratedReducer: import('..').RehydratedState;
133
134
  settingReducer: import('..').SettingState;
134
- userFormReducer: import('..').UserFormState;
135
+ formReducer: import('..').FormState;
135
136
  userReducer: import('..').UserState;
137
+ formRevisionReducer: import('..').FormRevisionState;
138
+ formSubmissionReducer: import('..').FormSubmissionState;
136
139
  workspaceReducer: import("./workspaceSlice").WorkspaceState;
137
140
  emailDomainsReducer: import('..').EmailDomainState;
138
141
  licenseReducer: import('..').LicenseState;
@@ -68,8 +68,10 @@ export declare const selectProjectFiles: ((state: import("redux").EmptyObject &
68
68
  projectFileReducer: ProjectFileState;
69
69
  rehydratedReducer: import('..').RehydratedState;
70
70
  settingReducer: import('..').SettingState;
71
- userFormReducer: import('..').UserFormState;
71
+ formReducer: import('..').FormState;
72
72
  userReducer: import('..').UserState;
73
+ formRevisionReducer: import('..').FormRevisionState;
74
+ formSubmissionReducer: import('..').FormSubmissionState;
73
75
  workspaceReducer: import('..').WorkspaceState;
74
76
  emailDomainsReducer: import('..').EmailDomainState;
75
77
  licenseReducer: import('..').LicenseState;
@@ -7,6 +7,7 @@ export declare function setAttachments<TAttachment, TState extends AttachmentSta
7
7
  export declare function addAttachment<TAttachment, TState extends AttachmentState<TAttachment>>(state: TState, action: PayloadAction<Submitted<TAttachment>>): void;
8
8
  export declare function addAttachments<TAttachment, TState extends AttachmentState<TAttachment>>(state: TState, action: PayloadAction<Submitted<TAttachment>[]>): void;
9
9
  export declare function updateAttachment<TAttachment, TState extends AttachmentState<TAttachment>>(state: TState, action: PayloadAction<Submitted<TAttachment>>): void;
10
+ export declare function updateAttachments<TAttachment, TState extends AttachmentState<TAttachment>>(state: TState, action: PayloadAction<Submitted<TAttachment>[]>): void;
10
11
  export declare function removeAttachment<TAttachment, TState extends AttachmentState<TAttachment>>(state: TState, action: PayloadAction<string>): void;
11
12
  export declare function removeAttachments<TAttachment, TState extends AttachmentState<TAttachment>>(state: TState, action: PayloadAction<string[]>): void;
12
13
  export {};
@@ -46,8 +46,10 @@ export declare const selectWorkspaces: ((state: import("redux").EmptyObject & {
46
46
  projectFileReducer: import('..').ProjectFileState;
47
47
  rehydratedReducer: import('..').RehydratedState;
48
48
  settingReducer: import('..').SettingState;
49
- userFormReducer: import('..').UserFormState;
49
+ formReducer: import('..').FormState;
50
50
  userReducer: import('..').UserState;
51
+ formRevisionReducer: import('..').FormRevisionState;
52
+ formSubmissionReducer: import('..').FormSubmissionState;
51
53
  workspaceReducer: WorkspaceState;
52
54
  emailDomainsReducer: import('..').EmailDomainState;
53
55
  licenseReducer: import('..').LicenseState;
@@ -3,7 +3,7 @@ import { AnyAction, Reducer } from "redux";
3
3
  import { Config, OfflineAction, OfflineMetadata, OfflineState } from "@redux-offline/redux-offline/lib/types";
4
4
  import request from "superagent";
5
5
  import { type OfflineMetaEffect, type OvermapSDK, RequestDetails } from "../sdk";
6
- import { AuthState, CategoryState, ComponentStageCompletionState, ComponentStageState, ComponentState, ComponentTypeState, DocumentState, EmailDomainState, FileState, IssueState, LicenseState, MapState, OrganizationAccessState, OrganizationState, OutboxState, ProjectAccessState, ProjectFileState, ProjectState, RehydratedState, SettingState, UserFormState, UserState, WorkspaceState } from "./slices";
6
+ import { AuthState, CategoryState, ComponentStageCompletionState, ComponentStageState, ComponentState, ComponentTypeState, DocumentState, EmailDomainState, FileState, IssueState, LicenseState, MapState, OrganizationAccessState, OrganizationState, OutboxState, ProjectAccessState, ProjectFileState, ProjectState, RehydratedState, SettingState, FormState, FormRevisionState, FormSubmissionState, UserState, WorkspaceState } from "./slices";
7
7
  import { VersioningState } from "./slices/versioningSlice";
8
8
  import { RootState } from "../typings";
9
9
  export declare const overmapReducers: {
@@ -25,8 +25,10 @@ export declare const overmapReducers: {
25
25
  projectFileReducer: Reducer<ProjectFileState>;
26
26
  rehydratedReducer: Reducer<RehydratedState>;
27
27
  settingReducer: Reducer<SettingState>;
28
- userFormReducer: Reducer<UserFormState>;
28
+ formReducer: Reducer<FormState>;
29
29
  userReducer: Reducer<UserState>;
30
+ formRevisionReducer: Reducer<FormRevisionState>;
31
+ formSubmissionReducer: Reducer<FormSubmissionState>;
30
32
  workspaceReducer: Reducer<WorkspaceState>;
31
33
  emailDomainsReducer: Reducer<EmailDomainState>;
32
34
  licenseReducer: Reducer<LicenseState>;
@@ -51,8 +53,10 @@ export declare const overmapReducer: Reducer<import("redux").CombinedState<{
51
53
  projectFileReducer: ProjectFileState;
52
54
  rehydratedReducer: RehydratedState;
53
55
  settingReducer: SettingState;
54
- userFormReducer: UserFormState;
56
+ formReducer: FormState;
55
57
  userReducer: UserState;
58
+ formRevisionReducer: FormRevisionState;
59
+ formSubmissionReducer: FormSubmissionState;
56
60
  workspaceReducer: WorkspaceState;
57
61
  emailDomainsReducer: EmailDomainState;
58
62
  licenseReducer: LicenseState;
@@ -95,8 +99,10 @@ export declare const defaultStore: import("@reduxjs/toolkit/dist/configureStore"
95
99
  projectFileReducer: ProjectFileState;
96
100
  rehydratedReducer: RehydratedState;
97
101
  settingReducer: SettingState;
98
- userFormReducer: UserFormState;
102
+ formReducer: FormState;
99
103
  userReducer: UserState;
104
+ formRevisionReducer: FormRevisionState;
105
+ formSubmissionReducer: FormSubmissionState;
100
106
  workspaceReducer: WorkspaceState;
101
107
  emailDomainsReducer: EmailDomainState;
102
108
  licenseReducer: LicenseState;
@@ -5,7 +5,17 @@ export type MaybeObjectURL<T> = T & {
5
5
  * Represents a file model that has been uploaded to the backend.
6
6
  * A corresponding abstract model exists in the backend (FileModelMixin).
7
7
  */
8
- export type UploadedFileModel = MaybeObjectURL<{
8
+ export type FileModel = MaybeObjectURL<{
9
9
  file_sha1: string;
10
10
  file: string;
11
11
  }>;
12
+ export interface FileWithNameModel extends FileModel {
13
+ file_name: string;
14
+ }
15
+ /** the attributes needed to generate a presigned url for a file that is being attempted to be uploaded */
16
+ export interface FileUploadPayload {
17
+ sha1: string;
18
+ extension: string;
19
+ file_type: string;
20
+ size: number;
21
+ }
@@ -1,30 +1,31 @@
1
1
  import { OfflineModel } from "./base";
2
- import { MaybeObjectURL, UploadedFileModel } from "../files";
2
+ import { MaybeObjectURL, FileModel, FileWithNameModel } from "../files";
3
3
  import { Project } from "./projects";
4
- export interface Attachment extends OfflineModel, UploadedFileModel {
4
+ import { ProjectDocument } from "./documents";
5
+ export interface Attachment extends OfflineModel, FileWithNameModel {
5
6
  description?: string;
6
- file_name: string;
7
7
  file_type: string;
8
8
  submitted_at: string;
9
9
  created_by: number;
10
10
  }
11
- export interface IssueAttachment extends Attachment, UploadedFileModel {
11
+ export interface IssueAttachment extends Attachment {
12
12
  issue: string;
13
13
  }
14
- export interface ComponentAttachment extends Attachment, UploadedFileModel {
14
+ export interface ComponentAttachment extends Attachment {
15
15
  component: string;
16
16
  }
17
- export interface ComponentTypeAttachment extends Attachment, UploadedFileModel {
17
+ export interface ComponentTypeAttachment extends Attachment {
18
18
  component_type: string;
19
19
  }
20
- export interface ProjectAttachment extends Attachment, UploadedFileModel {
20
+ export interface ProjectAttachment extends Attachment {
21
21
  project: Project["id"];
22
22
  }
23
+ export interface DocumentAttachment extends Attachment {
24
+ document: ProjectDocument["offline_id"];
25
+ }
23
26
  /** to get an AttachmentPayload for a specific type, pass in the given AttachmentType
24
27
  * ex. AttachmentPayload<IssueAttachment> */
25
28
  export type AttachmentPayload<TAttachment> = Omit<TAttachment, "file" | "submitted_at" | "created_by"> & {
26
29
  file: MaybeObjectURL<File>;
27
30
  };
28
- export interface ProfilePic extends UploadedFileModel {
29
- file: string;
30
- }
31
+ export type ProfilePic = FileModel;
@@ -4,6 +4,13 @@ export interface Model {
4
4
  export interface OfflineModel extends Model {
5
5
  offline_id: string;
6
6
  }
7
+ export interface SubmittedAtModel extends Model {
8
+ submitted_at: string;
9
+ }
10
+ export interface TimeStampedModel extends Model {
11
+ created_at: string;
12
+ updated_at: string;
13
+ }
7
14
  export type Offline<T> = T & {
8
15
  offline_id: string;
9
16
  };