@overmap-ai/core 1.0.63-form-submission-fix.3 → 1.0.63-org-projs-only.1

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.
@@ -5348,23 +5348,17 @@ var __publicField = (obj, key, value) => {
5348
5348
  * @throws An APIError if the server returns an error, or any other error that may occur.
5349
5349
  */
5350
5350
  async add(project) {
5351
- if (!project.organization_owner && !project.user_owner) {
5352
- throw new Error("Project type was not chosen when trying to create a project");
5353
- }
5354
5351
  if (!project.bounds && !project.canvas_bounds) {
5355
5352
  throw new Error("Project must either have bounds or canvas_bounds set");
5356
5353
  }
5357
- const isOrganizationProject = !!project.organization_owner;
5358
- const url = isOrganizationProject ? `/organizations/${project.organization_owner}/projects/` : "/projects/";
5359
- const projectType = isOrganizationProject ? { organization_owner: project.organization_owner } : { user_owner: project.user_owner };
5360
5354
  return await this.enqueueRequest({
5361
5355
  description: "Create project",
5362
5356
  method: HttpMethod.POST,
5363
- url,
5357
+ url: "/projects/",
5364
5358
  payload: {
5365
5359
  name: project.name,
5366
5360
  bounds: project.bounds,
5367
- ...projectType
5361
+ organization_owner: project.organization_owner
5368
5362
  },
5369
5363
  blockers: [],
5370
5364
  blocks: []
@@ -5491,67 +5485,36 @@ var __publicField = (obj, key, value) => {
5491
5485
  }
5492
5486
  return { fields: newFields, images };
5493
5487
  };
5494
- class FormService extends BaseUploadService {
5495
- async bulkAddRevisionAttachments(revisionId, files) {
5496
- const submittedAt = (/* @__PURE__ */ new Date()).toISOString();
5497
- const createdBy = this.client.store.getState().userReducer.currentUser.id;
5498
- const filePayloads = {};
5499
- const offlineFormRevisionAttachments = [];
5500
- const attachmentPayloads = [];
5501
- for (const [fieldIdentifier, file] of Object.entries(files)) {
5502
- const sha1 = await hashFile(file);
5503
- if (!(sha1 in filePayloads)) {
5504
- filePayloads[sha1] = {
5505
- sha1,
5506
- file_type: file.type,
5507
- extension: file.name.split(".").pop(),
5508
- size: file.size
5488
+ class FormService extends BaseApiService {
5489
+ constructor() {
5490
+ super(...arguments);
5491
+ // Attach images to revision, after uploading them to S3
5492
+ __publicField(this, "getAttachImagePromises", (images, offlineRevisionId) => {
5493
+ return Object.entries(images).map(async ([key, image]) => {
5494
+ const sha1 = await hashFile(image);
5495
+ await this.client.files.addCache(image, sha1);
5496
+ const [fileProps] = await this.client.files.uploadFileToS3(sha1);
5497
+ const revisionAttachmentPayload = offline({
5498
+ ...fileProps,
5499
+ revision: offlineRevisionId,
5500
+ field_identifier: key
5501
+ });
5502
+ const attach = await this.enqueueRequest({
5503
+ description: "Attach image to form revision field",
5504
+ method: HttpMethod.POST,
5505
+ url: `/forms/revisions/${offlineRevisionId}/attachments/`,
5506
+ payload: revisionAttachmentPayload,
5507
+ blockers: [revisionAttachmentPayload.revision],
5508
+ blocks: [revisionAttachmentPayload.offline_id]
5509
+ });
5510
+ const offlinePayload = {
5511
+ ...revisionAttachmentPayload,
5512
+ file: URL.createObjectURL(image)
5509
5513
  };
5510
- await this.client.files.addCache(file, sha1);
5511
- }
5512
- const offlineFormRevisionAttachment = offline({
5513
- file: URL.createObjectURL(file),
5514
- file_type: file.type,
5515
- file_name: file.name,
5516
- file_sha1: sha1,
5517
- created_by: createdBy,
5518
- revision: revisionId,
5519
- submitted_at: submittedAt,
5520
- field_identifier: fieldIdentifier
5514
+ this.dispatch(addFormRevisionAttachment(offlinePayload));
5515
+ return attach;
5521
5516
  });
5522
- offlineFormRevisionAttachments.push(offlineFormRevisionAttachment);
5523
- const attachmentPayload = {
5524
- offline_id: offlineFormRevisionAttachment.offline_id,
5525
- name: file.name,
5526
- field_identifier: fieldIdentifier,
5527
- sha1
5528
- };
5529
- attachmentPayloads.push(attachmentPayload);
5530
- }
5531
- this.dispatch(addFormRevisionAttachments(offlineFormRevisionAttachments));
5532
- const promise = this.enqueueRequest({
5533
- description: "Attach files to form revision",
5534
- method: HttpMethod.POST,
5535
- url: `/forms/revisions/${revisionId}/attachments/bulk/`,
5536
- payload: {
5537
- submitted_at: submittedAt,
5538
- attachments: attachmentPayloads,
5539
- files: Object.values(filePayloads)
5540
- },
5541
- blockers: [revisionId],
5542
- blocks: offlineFormRevisionAttachments.map((attachment) => attachment.offline_id)
5543
5517
  });
5544
- promise.then((result) => {
5545
- this.processPresignedUrls(result.presigned_urls);
5546
- this.dispatch(updateFormRevisionAttachments(result.attachments));
5547
- }).catch(() => {
5548
- this.dispatch(
5549
- deleteFormRevisionAttachments(
5550
- offlineFormRevisionAttachments.map((attachment) => attachment.offline_id)
5551
- )
5552
- );
5553
- });
5554
- return [offlineFormRevisionAttachments, promise.then(({ attachments }) => attachments)];
5555
5518
  }
5556
5519
  async add(ownerId, form, initialRevision, urlPrefix) {
5557
5520
  const { fields, images } = await separateImageFromFields(initialRevision.fields);
@@ -5584,16 +5547,14 @@ var __publicField = (obj, key, value) => {
5584
5547
  blockers: [ownerId],
5585
5548
  blocks: [form.offline_id, offlineFormRevision.offline_id]
5586
5549
  });
5587
- const [offlineFormRevisionAttachments, attachmentsPromise] = await this.bulkAddRevisionAttachments(
5588
- offlineFormRevision.offline_id,
5589
- images
5590
- );
5550
+ const attachImagesPromises = this.getAttachImagePromises(images, offlineFormRevision.offline_id);
5591
5551
  void formPromise.catch((e) => {
5592
5552
  this.dispatch(deleteForm(form.offline_id));
5593
5553
  this.dispatch(deleteFormRevision(offlineFormRevision.offline_id));
5594
5554
  throw e;
5595
5555
  });
5596
- return [form, offlineFormRevision, offlineFormRevisionAttachments, formPromise, attachmentsPromise];
5556
+ const settledPromise = Promise.all([formPromise, ...attachImagesPromises]).then(() => formPromise);
5557
+ return [form, offlineFormRevision, formPromise, settledPromise];
5597
5558
  }
5598
5559
  addForOrganization(organizationId, initialRevision) {
5599
5560
  const state = this.client.store.getState();
@@ -5675,16 +5636,14 @@ var __publicField = (obj, key, value) => {
5675
5636
  blockers: [formId],
5676
5637
  blocks: [offlineRevision.offline_id]
5677
5638
  });
5678
- const [offlineFormRevisionAttachments, attachmentsPromise] = await this.bulkAddRevisionAttachments(
5679
- fullRevision.offline_id,
5680
- images
5681
- );
5639
+ const attachImagesPromises = this.getAttachImagePromises(images, offlineRevision.offline_id);
5682
5640
  void promise.then((result) => {
5683
5641
  this.dispatch(setFormRevision(result));
5684
5642
  }).catch(() => {
5685
5643
  this.dispatch(deleteFormRevision(fullRevision.offline_id));
5686
5644
  });
5687
- return [fullRevision, offlineFormRevisionAttachments, promise, attachmentsPromise];
5645
+ const settledPromise = Promise.all([promise, ...attachImagesPromises]).then(() => promise);
5646
+ return [fullRevision, settledPromise];
5688
5647
  }
5689
5648
  async favorite(formId) {
5690
5649
  const { store } = this.client;
@@ -5847,71 +5806,46 @@ var __publicField = (obj, key, value) => {
5847
5806
  return { values: newValues, files };
5848
5807
  };
5849
5808
  class FormSubmissionService extends BaseUploadService {
5850
- async bulkAddSubmissionAttachments(submissionId, files) {
5851
- const submittedAt = (/* @__PURE__ */ new Date()).toISOString();
5852
- const createdBy = this.client.store.getState().userReducer.currentUser.id;
5853
- const filePayloads = {};
5854
- const offlineFormSubmissionAttachments = [];
5855
- const attachmentPayloads = [];
5856
- for (const [fieldIdentifier, filesArray] of Object.entries(files)) {
5857
- for (const file of filesArray) {
5858
- const sha1 = await hashFile(file);
5859
- if (!(sha1 in filePayloads)) {
5860
- filePayloads[sha1] = {
5861
- sha1,
5862
- file_type: file.type,
5863
- extension: file.name.split(".").pop(),
5864
- size: file.size
5865
- };
5809
+ constructor() {
5810
+ super(...arguments);
5811
+ // Attach files to submission, after uploading them to S3
5812
+ __publicField(this, "getAttachFilesPromises", (files, submission) => {
5813
+ return Object.entries(files).map(async ([key, fileArray]) => {
5814
+ const attachResults = [];
5815
+ for (const file of fileArray) {
5816
+ const sha1 = await hashFile(file);
5866
5817
  await this.client.files.addCache(file, sha1);
5818
+ const [fileProps] = await this.client.files.uploadFileToS3(sha1);
5819
+ const submissionAttachmentPayload = offline({
5820
+ ...fileProps,
5821
+ submission: submission.offline_id,
5822
+ field_identifier: key
5823
+ });
5824
+ const attach = await this.enqueueRequest({
5825
+ description: "Attach file to form submission",
5826
+ method: HttpMethod.POST,
5827
+ url: `/forms/submission/${submission.offline_id}/attachments/`,
5828
+ payload: submissionAttachmentPayload,
5829
+ blockers: [
5830
+ submission.asset,
5831
+ submission.asset_stage,
5832
+ submission.issue,
5833
+ submission.form_revision
5834
+ ].filter((x) => x !== void 0),
5835
+ blocks: [submissionAttachmentPayload.offline_id]
5836
+ });
5837
+ const offlinePayload = {
5838
+ ...submissionAttachmentPayload,
5839
+ file: URL.createObjectURL(file)
5840
+ };
5841
+ this.dispatch(addFormSubmissionAttachment(offlinePayload));
5842
+ attachResults.push(attach);
5867
5843
  }
5868
- const offlineFormSubmissionAttachment = offline({
5869
- file: URL.createObjectURL(file),
5870
- file_type: file.type,
5871
- file_name: file.name,
5872
- file_sha1: sha1,
5873
- created_by: createdBy,
5874
- submission: submissionId,
5875
- submitted_at: submittedAt,
5876
- field_identifier: fieldIdentifier
5877
- });
5878
- offlineFormSubmissionAttachments.push(offlineFormSubmissionAttachment);
5879
- const attachmentPayload = {
5880
- offline_id: offlineFormSubmissionAttachment.offline_id,
5881
- name: file.name,
5882
- sha1,
5883
- field_identifier: fieldIdentifier
5884
- };
5885
- attachmentPayloads.push(attachmentPayload);
5886
- }
5887
- }
5888
- this.dispatch(addFormSubmissionAttachments(offlineFormSubmissionAttachments));
5889
- const promise = this.enqueueRequest({
5890
- description: "Attach files to form submission",
5891
- method: HttpMethod.POST,
5892
- url: `/forms/submissions/${submissionId}/attachments/bulk/`,
5893
- payload: {
5894
- submitted_at: submittedAt,
5895
- attachments: attachmentPayloads,
5896
- files: Object.values(filePayloads)
5897
- },
5898
- blockers: [submissionId],
5899
- blocks: offlineFormSubmissionAttachments.map((attachment) => attachment.offline_id)
5900
- });
5901
- promise.then((result) => {
5902
- this.processPresignedUrls(result.presigned_urls);
5903
- this.dispatch(updateFormSubmissionAttachments(result.attachments));
5904
- }).catch(() => {
5905
- this.dispatch(
5906
- deleteFormSubmissionAttachments(
5907
- offlineFormSubmissionAttachments.map((attachment) => attachment.offline_id)
5908
- )
5909
- );
5844
+ return attachResults;
5845
+ });
5910
5846
  });
5911
- return [offlineFormSubmissionAttachments, promise.then(({ attachments }) => attachments)];
5912
5847
  }
5913
- // Outer promise is for hashing and caching files for submission attachments
5914
- async add(payload) {
5848
+ add(payload) {
5915
5849
  const { store } = this.client;
5916
5850
  const state = store.getState();
5917
5851
  const activeProjectId = state.projectReducer.activeProjectId;
@@ -5919,12 +5853,12 @@ var __publicField = (obj, key, value) => {
5919
5853
  throw new Error("Expected an active project");
5920
5854
  }
5921
5855
  const { values, files } = separateFilesFromValues(payload.values);
5922
- const offlineSubmission = offline({
5856
+ const offlineSubmission = {
5923
5857
  ...payload,
5924
5858
  values,
5925
5859
  created_by: state.userReducer.currentUser.id,
5926
5860
  submitted_at: (/* @__PURE__ */ new Date()).toISOString()
5927
- });
5861
+ };
5928
5862
  const promise = this.enqueueRequest({
5929
5863
  description: "Respond to form",
5930
5864
  method: HttpMethod.POST,
@@ -5933,22 +5867,20 @@ var __publicField = (obj, key, value) => {
5933
5867
  blockers: [payload.issue, payload.asset, payload.asset_stage, "add-form-entry"].filter(
5934
5868
  (x) => x !== void 0
5935
5869
  ),
5936
- blocks: [offlineSubmission.offline_id]
5870
+ blocks: [payload.offline_id]
5937
5871
  });
5872
+ const attachFilesPromises = this.getAttachFilesPromises(files, offlineSubmission);
5938
5873
  this.dispatch(addFormSubmission(offlineSubmission));
5939
- const [offlineFormSubmissionAttachments, attachmentsPromise] = await this.bulkAddSubmissionAttachments(
5940
- offlineSubmission.offline_id,
5941
- files
5942
- );
5943
- promise.then((result) => {
5874
+ void promise.then((result) => {
5944
5875
  this.dispatch(addActiveProjectFormSubmissionsCount(1));
5945
5876
  this.dispatch(setFormSubmission(result));
5946
5877
  return result;
5947
5878
  }).catch(() => {
5948
- this.dispatch(deleteFormSubmission(offlineSubmission.offline_id));
5879
+ this.dispatch(deleteFormSubmission(payload.offline_id));
5949
5880
  this.dispatch(addActiveProjectFormSubmissionsCount(-1));
5950
5881
  });
5951
- return [offlineSubmission, offlineFormSubmissionAttachments, promise, attachmentsPromise];
5882
+ const settledPromise = Promise.all([promise, ...attachFilesPromises]).then(() => promise);
5883
+ return [offlineSubmission, settledPromise];
5952
5884
  }
5953
5885
  // Note currently the bulkAdd method is specific to form submissions for assets
5954
5886
  // TODO: adapt the support bulk adding to any model type
@@ -6049,6 +5981,36 @@ var __publicField = (obj, key, value) => {
6049
5981
  });
6050
5982
  return batchPromises;
6051
5983
  }
5984
+ update(submission) {
5985
+ const { store } = this.client;
5986
+ const { values, files } = separateFilesFromValues(submission.values);
5987
+ const attachFilesPromises = this.getAttachFilesPromises(files, submission);
5988
+ const offlineSubmission = {
5989
+ ...submission,
5990
+ values
5991
+ };
5992
+ const submissionToBeUpdated = selectFormSubmission(submission.offline_id)(store.getState());
5993
+ if (!submissionToBeUpdated) {
5994
+ throw new Error(`Expected submission with offline_id ${submission.offline_id} to exist`);
5995
+ }
5996
+ this.dispatch(updateFormSubmission(offlineSubmission));
5997
+ const promise = this.enqueueRequest({
5998
+ description: "Patch form submission",
5999
+ method: HttpMethod.PATCH,
6000
+ url: `/forms/submissions/${submission.offline_id}/`,
6001
+ payload: offlineSubmission,
6002
+ blockers: [offlineSubmission.issue, offlineSubmission.asset, offlineSubmission.asset_stage].filter(
6003
+ (x) => x !== void 0
6004
+ ),
6005
+ blocks: [offlineSubmission.offline_id]
6006
+ });
6007
+ promise.then((createdSubmission) => {
6008
+ this.dispatch(setFormSubmission(createdSubmission));
6009
+ }).catch(() => {
6010
+ this.dispatch(setFormSubmission(submissionToBeUpdated));
6011
+ });
6012
+ return [offlineSubmission, Promise.all([promise, ...attachFilesPromises]).then(() => promise)];
6013
+ }
6052
6014
  async delete(submissionId) {
6053
6015
  const { store } = this.client;
6054
6016
  const state = store.getState();
@@ -6519,9 +6481,7 @@ var __publicField = (obj, key, value) => {
6519
6481
  method: HttpMethod.GET,
6520
6482
  url: `/billing/${license.offline_id}/`,
6521
6483
  isAuthNeeded: true,
6522
- blockers: [
6523
- license.organization_owner ? license.organization_owner.toString() : license.user_owner ? license.user_owner.toString() : ""
6524
- ],
6484
+ blockers: [license.organization_owner ? license.organization_owner.toString() : ""],
6525
6485
  blocks: []
6526
6486
  });
6527
6487
  this.dispatch(updateLicense(result));
@@ -6533,9 +6493,7 @@ var __publicField = (obj, key, value) => {
6533
6493
  method: HttpMethod.DELETE,
6534
6494
  url: `/billing/${license.offline_id}/suspend/`,
6535
6495
  isAuthNeeded: true,
6536
- blockers: [
6537
- license.organization_owner ? license.organization_owner.toString() : license.user_owner ? license.user_owner.toString() : ""
6538
- ],
6496
+ blockers: [license.organization_owner ? license.organization_owner.toString() : ""],
6539
6497
  blocks: []
6540
6498
  });
6541
6499
  this.dispatch(updateLicense(result));
@@ -6547,9 +6505,7 @@ var __publicField = (obj, key, value) => {
6547
6505
  method: HttpMethod.PATCH,
6548
6506
  url: `/billing/${license.offline_id}/suspend/`,
6549
6507
  isAuthNeeded: true,
6550
- blockers: [
6551
- license.organization_owner ? license.organization_owner.toString() : license.user_owner ? license.user_owner.toString() : ""
6552
- ],
6508
+ blockers: [license.organization_owner ? license.organization_owner.toString() : ""],
6553
6509
  blocks: []
6554
6510
  });
6555
6511
  this.dispatch(updateLicense(result));
@@ -6561,9 +6517,7 @@ var __publicField = (obj, key, value) => {
6561
6517
  method: HttpMethod.DELETE,
6562
6518
  url: `/billing/${license.offline_id}/`,
6563
6519
  isAuthNeeded: true,
6564
- blockers: [
6565
- license.organization_owner ? license.organization_owner.toString() : license.user_owner ? license.user_owner.toString() : ""
6566
- ],
6520
+ blockers: [license.organization_owner ? license.organization_owner.toString() : ""],
6567
6521
  blocks: []
6568
6522
  });
6569
6523
  this.dispatch(updateLicense(result));
@@ -6577,7 +6531,7 @@ var __publicField = (obj, key, value) => {
6577
6531
  isAuthNeeded: true,
6578
6532
  payload: { project: project.id },
6579
6533
  blockers: [
6580
- license.organization_owner ? license.organization_owner.toString() : license.user_owner ? license.user_owner.toString() : "",
6534
+ license.organization_owner ? license.organization_owner.toString() : "",
6581
6535
  project.id ? project.id.toString() : ""
6582
6536
  ],
6583
6537
  blocks: ["add-issue", "add-form-entry", "change-access-level", "add-workspace"]
@@ -6591,9 +6545,7 @@ var __publicField = (obj, key, value) => {
6591
6545
  method: HttpMethod.DELETE,
6592
6546
  url: `/billing/${license.offline_id}/project/`,
6593
6547
  isAuthNeeded: true,
6594
- blockers: [
6595
- license.organization_owner ? license.organization_owner.toString() : license.user_owner ? license.user_owner.toString() : ""
6596
- ],
6548
+ blockers: [license.organization_owner ? license.organization_owner.toString() : ""],
6597
6549
  blocks: ["add-issue", "add-form-entry", "change-access-level", "add-workspace"]
6598
6550
  });
6599
6551
  this.dispatch(updateLicense(result));