import { Injectable } from '@angular/core'; import { HttpRestService } from '@core/services/http-rest.service'; import { PortalDeterminationService } from '@core/services/portal-determination.service'; import { ReferenceFieldAPI } from '@core/typings/api/reference-fields.typing'; import { APIResultData, PaginationOptions } from '@yourcause/common'; type PaginatedResponse = APIResultData; @Injectable({ providedIn: 'root' }) export class ReferenceFieldsResources { apiBase = '/api/manager/forms/ReferenceFields'; constructor ( private http: HttpRestService, private portal: PortalDeterminationService ) { } getReferenceFieldResponses ( applicationId: number, applicationFormId: number ): Promise { const endpoint = `api/${this.portal.isManager ? 'manager' : 'portal'}/applications/${applicationId}/ApplicationForms/${applicationFormId}/ReferenceFields`; return this.http.get(endpoint); } getReferenceFieldsByFormRevisionId ( formRevisionId: number ): Promise { const endpoint = `api/portal/applications/FormRevisions/${formRevisionId}/ReferenceFields`; return this.http.get(endpoint); } searchReferenceFields ( paginationOptions: PaginationOptions, formIds?: number[] ): Promise { const endpoint = this.apiBase + '/Paginated'; return this.http.post(endpoint, { paginationOptions, formIds }); } createOrUpdateField ( referenceFieldId: number, payload: ReferenceFieldAPI.CreateUpdateReferenceField ): Promise { const endpoint = referenceFieldId ? `${this.apiBase}/${referenceFieldId}` : this.apiBase; return this.http.post(endpoint, payload); } removeReferenceField ( fieldId: number ) { return this.http.delete( `${this.apiBase}/${fieldId}` ); } getTableFields (referenceFieldId: number): Promise { const isManager = this.portal.isManager; const endpoint = isManager ? `api/manager/forms/ReferenceFields/${referenceFieldId}/TableColumns` : `api/portal/applications/ReferenceFields/${referenceFieldId}/TableColumns`;; return this.http.get(endpoint); } getSubsetFields (referenceFieldId: number): Promise { const isManager = this.portal.isManager; const endpoint = isManager ? `api/manager/forms/ReferenceFields/${referenceFieldId}/TableColumns` : `api/portal/applications/ReferenceFields/${referenceFieldId}/TableColumns`;; return this.http.get(endpoint); } exportReferenceFields ( ids: number[] ): Promise { return this.http.post('api/manager/forms/export/ReferenceFields', { ids }); } importReferenceFields (referenceFields: ReferenceFieldAPI.ExportReferenceField[]) { const endpoint = 'api/manager/forms/import/ReferenceFields'; return this.http.post(endpoint, { referenceFields }); } getCategories (): Promise { const endpoint = 'api/manager/referencefieldcategory'; return this.http.get(endpoint); } bulkUpdateCategory ( referenceFieldIds: number[], categoryId: number ) { const endpoint = 'api/manager/referencefieldcategory/BulkUpdateReferenceFieldCategory'; return this.http.post(endpoint, { referenceFieldIds, categoryId }); } createOrEditCategory ( categoryId: number, name: string ): Promise { const endpoint = categoryId ? `api/manager/referencefieldcategory/${categoryId}` : 'api/manager/referencefieldcategory'; return this.http.post(endpoint, { name }); } deleteCategory (categoryId: number) { const endpoint = `api/manager/referencefieldcategory/${categoryId}`; return this.http.delete(endpoint); } mergeFields (payload: ReferenceFieldAPI.MergeFormFieldsApi) { const endpoint = 'api/manager/forms/MergeReferenceFields'; return this.http.post(endpoint, payload); } bulkCreateReferenceFields ( fields: ReferenceFieldAPI.BulkCreateReferenceField[] ) { const endpoint = 'api/manager/forms/BulkInsertReferenceFields'; return this.http.post(endpoint, fields); } getReferenceFieldDetail ( referenceFieldId: number ): Promise { const endpoint = `api/manager/forms/ReferenceFields/Details/${referenceFieldId}`; return this.http.get(endpoint); } getApplicationResponsesForMerge ( referenceFieldId1: number, referenceFieldId2: number ): Promise { const endpoint = 'api/manager/forms/GetApplicationResponsesForReferenceFields'; return this.http.post(endpoint, { referenceFieldId1, referenceFieldId2 }); } getCanUpdateRefFieldToSingleResponse ( referenceFieldId: number ) { const endpoint = `api/manager/forms/CanUpdateReferenceFieldToSingleResponse/${referenceFieldId}`; return this.http.get(endpoint); } getTableResponses ( applicationId: number, applicationFormId: number, tableReferenceFieldId: number, perPage = 50000, pageNumber = 1 ): Promise { const endpoint = this.portal.isManager ? `api/manager/applications/${applicationId}/ApplicationForms/${applicationFormId}/ReferenceFields/${tableReferenceFieldId}/TableData?perPage=${perPage}&pageNumber=${pageNumber}&sortReferenceFieldId=&sortAscending=false` : `api/portal/applications/${applicationId}/ApplicationForms/${applicationFormId}/ReferenceFields/${tableReferenceFieldId}/TableData?perPage=${perPage}&pageNumber=${pageNumber}&sortReferenceFieldId=&sortAscending=false`; return this.http.get(endpoint); } importTableRows ( applicationId: number, tableReferenceFieldId: number, file: Blob, formId: number ) { const portal = this.portal.isManager ? 'manager' : 'portal'; const endpoint = `api/${portal}/applications/UploadDataToTableReferenceField?applicationId=${applicationId}&tableReferenceFieldId=${tableReferenceFieldId}&formId=${formId}`; return this.http.postFile(endpoint, file); } canUpdateCdtOnField (referenceFieldId: number): Promise { const endpoint = `api/manager/forms/CanUpdateCustomDataTable/${referenceFieldId}`; return this.http.get(endpoint); } checkMergeForConflicts ( standardProductReferenceFieldId: number, idsToMerge: number[] ) { const endpoint = 'api/manager/forms/CheckReferenceFieldMergeForConflicts'; return this.http.post(endpoint, { standardProductReferenceFieldId, referenceFieldList: idsToMerge.map((referenceFieldId) => { return { referenceFieldId }; }) }); } mergeWithStandardProductField ( standardProductReferenceFieldId: number, idsToMerge: number[] ) { const endpoint = 'api/manager/forms/MergeToStandardProductField'; return this.http.post(endpoint, { standardProductReferenceFieldId, referenceFieldList: idsToMerge.map((referenceFieldId) => { return { referenceFieldId }; }) }); } validateTextToNumberFieldConversion ( referenceFieldId: number ): Promise { const endpoint = `api/manager/forms/CanConvertTextFieldToNumeric/${referenceFieldId}`; return this.http.get(endpoint); } validateNumberToTextFieldConversion ( referenceFieldId: number ): Promise { const endpoint = `api/manager/forms/CanConvertNumericFieldToText/${referenceFieldId}`; return this.http.get(endpoint); } validateTextToDateFieldConversion ( referenceFieldId: number ): Promise { const endpoint = `api/manager/forms/CanConvertTextFieldToDate/${referenceFieldId}`; return this.http.get(endpoint); } validateDateToTextFieldConversion ( referenceFieldId: number ): Promise { const endpoint = `api/manager/forms/CanConvertDateFieldToText/${referenceFieldId}`; return this.http.get(endpoint); } convertNumberFieldToText (referenceFieldId: number) { const endpoint = `api/manager/forms/ChangeNumberReferenceFieldToText/${referenceFieldId}`; // In the future we may want to support other text type fields like textArea, for now we are always sending textField return this.http.post(endpoint, { textType: ReferenceFieldAPI.TextFieldConversionType.TEXT_FIELD }); } convertTextFieldToNumber (referenceFieldId: number) { const endpoint = `api/manager/forms/ChangeTextReferenceFieldToNumber/${referenceFieldId}`; return this.http.post(endpoint, {}); } convertTextFieldToDate (referenceFieldId: number) { const endpoint = `api/manager/forms/ChangeTextReferenceFieldToDate/${referenceFieldId}`; return this.http.post(endpoint, {}); } convertDateFieldToText (referenceFieldId: number) { const endpoint = `api/manager/forms/ChangeDateReferenceFieldToText/${referenceFieldId}`; return this.http.post(endpoint, { textType: ReferenceFieldAPI.TextFieldConversionType.TEXT_FIELD }); } }