From 08539dbcecb7b68919225a981bb12c726690a23e Mon Sep 17 00:00:00 2001 From: bduran Date: Wed, 12 Jun 2024 10:35:45 -0700 Subject: [PATCH 1/9] update model "extracting" logic --- .../model/ModelStatusRollup.svelte.test.ts | 8 +++++- src/utilities/model.test.ts | 27 ++++++++++++++++--- src/utilities/model.ts | 18 ++++++------- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/components/model/ModelStatusRollup.svelte.test.ts b/src/components/model/ModelStatusRollup.svelte.test.ts index 6c8d18d9e1..8d2a0d9f1a 100644 --- a/src/components/model/ModelStatusRollup.svelte.test.ts +++ b/src/components/model/ModelStatusRollup.svelte.test.ts @@ -78,7 +78,13 @@ describe('Model Status Rollup', () => { props: { mode: 'rollup', model: { - refresh_activity_type_logs: [], + refresh_activity_type_logs: [ + { + error: null, + error_message: null, + success: false, + }, + ], refresh_model_parameter_logs: [], refresh_resource_type_logs: [], }, diff --git a/src/utilities/model.test.ts b/src/utilities/model.test.ts index 2e488dd83a..830614c440 100644 --- a/src/utilities/model.test.ts +++ b/src/utilities/model.test.ts @@ -18,7 +18,13 @@ describe('Model util functions', () => { [ 'a activity log extracting', { - refresh_activity_type_logs: [], + refresh_activity_type_logs: [ + { + error: null, + error_message: null, + success: false, + }, + ], refresh_model_parameter_logs: [], refresh_resource_type_logs: [], }, @@ -61,7 +67,13 @@ describe('Model util functions', () => { 'a parameter log extracting', { refresh_activity_type_logs: [], - refresh_model_parameter_logs: [], + refresh_model_parameter_logs: [ + { + error: null, + error_message: null, + success: false, + }, + ], refresh_resource_type_logs: [], }, 'parameterLogStatus', @@ -104,7 +116,13 @@ describe('Model util functions', () => { { refresh_activity_type_logs: [], refresh_model_parameter_logs: [], - refresh_resource_type_logs: [], + refresh_resource_type_logs: [ + { + error: null, + error_message: null, + success: false, + }, + ], }, 'resourceLogStatus', 'extracting', @@ -148,7 +166,7 @@ describe('Model util functions', () => { { error: null, error_message: null, - success: true, + success: false, }, ], refresh_model_parameter_logs: [], @@ -205,6 +223,7 @@ describe('Model util functions', () => { [ 'a activity log none', { + refresh_activity_type_logs: [], refresh_model_parameter_logs: [], refresh_resource_type_logs: [], }, diff --git a/src/utilities/model.ts b/src/utilities/model.ts index f46d1711ab..df6328724c 100644 --- a/src/utilities/model.ts +++ b/src/utilities/model.ts @@ -25,11 +25,11 @@ export function getModelStatusRollup( if (activityLog) { if (activityLog.success) { activityLogStatus = 'complete'; - } else { + } else if (activityLog.error != null) { activityLogStatus = 'error'; + } else { + activityLogStatus = 'extracting'; } - } else { - activityLogStatus = 'extracting'; } } @@ -38,11 +38,11 @@ export function getModelStatusRollup( if (parameterLog) { if (parameterLog.success) { parameterLogStatus = 'complete'; - } else { + } else if (parameterLog.error != null) { parameterLogStatus = 'error'; + } else { + parameterLogStatus = 'extracting'; } - } else { - parameterLogStatus = 'extracting'; } } @@ -51,11 +51,11 @@ export function getModelStatusRollup( if (resourceLog) { if (resourceLog.success) { resourceLogStatus = 'complete'; - } else { + } else if (resourceLog.error != null) { resourceLogStatus = 'error'; + } else { + resourceLogStatus = 'extracting'; } - } else { - resourceLogStatus = 'extracting'; } } From b460bc2460b5457397d8b370d056c5a9628910eb Mon Sep 17 00:00:00 2001 From: bduran Date: Mon, 17 Jun 2024 11:34:03 -0700 Subject: [PATCH 2/9] add retrigger icon to model forms --- src/components/model/ModelForm.svelte | 22 +++++++++++++++++++++- src/components/model/Models.svelte | 26 ++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/src/components/model/ModelForm.svelte b/src/components/model/ModelForm.svelte index 60523d678f..7dc90d2380 100644 --- a/src/components/model/ModelForm.svelte +++ b/src/components/model/ModelForm.svelte @@ -1,6 +1,7 @@
@@ -167,7 +174,7 @@
-
+
@@ -220,14 +227,16 @@ margin: 8px 0; } - .icon-button { + button.icon-button { align-items: center; + background: none; + border: none; color: var(--st-primary-70); cursor: pointer; display: flex; } - .icon-button:hover { + button.icon-button:hover { color: var(--st-primary-100); } diff --git a/src/components/model/Models.svelte b/src/components/model/Models.svelte index 3719f085a9..ae2ee75047 100644 --- a/src/components/model/Models.svelte +++ b/src/components/model/Models.svelte @@ -188,6 +188,12 @@ } } + function onRetriggerModelExtraction() { + if (selectedModel != null) { + effects.retriggerModelExtraction(selectedModel.id, user); + } + } + function selectModel(model: ModelSlim | null) { selectedModel = model; } @@ -260,7 +266,7 @@
-
+
@@ -427,14 +433,16 @@ grid-template-columns: auto min-content; } - .icon-button { + button.icon-button { align-items: center; + background: none; + border: none; color: var(--st-primary-70); cursor: pointer; display: flex; } - .icon-button:hover { + button.icon-button:hover { color: var(--st-primary-100); } diff --git a/src/utilities/effects.ts b/src/utilities/effects.ts index 9205c6b856..5cb5d24886 100644 --- a/src/utilities/effects.ts +++ b/src/utilities/effects.ts @@ -4241,6 +4241,31 @@ const effects = { return false; }, + async retriggerModelExtraction(id: number, user: User | null) { + try { + if (!queryPermissions.UPDATE_MODEL(user)) { + throwPermissionError('retrigger this model extraction'); + } + + const data = await reqHasura>( + gql.UPDATE_MODEL, + { id, model: { mission: '' } }, + user, + ); + + if (data != null) { + showSuccessToast('Model Extraction Retriggered Successfully'); + return data.updateModel; + } else { + throw Error(`Unable to retrigger model extraction with ID: "${id}"`); + } + } catch (e) { + catchError('Model Extraction Failed', e as Error); + showFailureToast('Model Extraction Failed'); + } + return null; + }, + async schedule(analysis_only: boolean = false, plan: Plan | null, user: User | null): Promise { try { if (plan) { From e9477c533214bd1df1ce36682ec58a1541608ead Mon Sep 17 00:00:00 2001 From: bduran Date: Tue, 25 Jun 2024 08:25:39 -0700 Subject: [PATCH 4/9] use gateway endpoint to retrigger model extraction --- src/components/model/ModelForm.svelte | 50 +++++++++++++++++++- src/components/model/Models.svelte | 67 +++++++++++++++++++++++++-- src/types/model.ts | 1 + src/utilities/effects.ts | 23 ++++++--- src/utilities/gql.ts | 27 +++++++---- src/utilities/model.ts | 24 +++++----- 6 files changed, 157 insertions(+), 35 deletions(-) diff --git a/src/components/model/ModelForm.svelte b/src/components/model/ModelForm.svelte index b581dc61cf..b6cbd3f472 100644 --- a/src/components/model/ModelForm.svelte +++ b/src/components/model/ModelForm.svelte @@ -6,6 +6,7 @@ import type { User, UserId } from '../../types/app'; import type { ModelLog, ModelSlim } from '../../types/model'; import effects from '../../utilities/effects'; + import { getModelStatusRollup } from '../../utilities/model'; import { permissionHandler } from '../../utilities/permissionHandler'; import { featurePermissions } from '../../utilities/permissions'; import { getShortISOForDate } from '../../utilities/time'; @@ -40,10 +41,12 @@ const updateModelPermissionError: string = 'You do not have permission to update this model'; const deleteModelPermissionError: string = 'You do not have permission to delete this model'; const createPlanPermissionError: string = 'You do not have permission to create a plan'; + const extractionPermissionError: string = 'You do not have permission to re-trigger a model extraction'; let hasUpdateModelPermission: boolean = false; let hasDeleteModelPermission: boolean = false; let hasCreatePlanPermission: boolean = false; + let hasExtractionPermission: boolean = false; let name: string = ''; let owner: UserId | null = null; let version: string = ''; @@ -51,6 +54,7 @@ let modelLogs: | Pick | undefined = undefined; + let modelHasExtractionError: boolean = false; $: description = initialModelDescription; $: name = initialModelName; @@ -61,11 +65,21 @@ refresh_model_parameter_logs: modelParameterLogs ?? [], refresh_resource_type_logs: resourceTypeLogs ?? [], }; + $: { + const { activityLogStatus, parameterLogStatus, resourceLogStatus } = getModelStatusRollup(modelLogs); + + if (activityLogStatus === 'error' || parameterLogStatus === 'error' || resourceLogStatus === 'error') { + modelHasExtractionError = true; + } else { + modelHasExtractionError = false; + } + } $: if (user) { hasUpdateModelPermission = featurePermissions.model.canUpdate(user); hasDeleteModelPermission = featurePermissions.model.canDelete(user); hasCreatePlanPermission = featurePermissions.plan.canCreate(user); + hasExtractionPermission = featurePermissions.model.canUpdate(user); } $: dispatch('hasModelChanged', { @@ -95,7 +109,24 @@ function onRetriggerModelExtraction() { if (modelId != null) { - effects.retriggerModelExtraction(modelId, user); + const prevLogs = modelLogs; + + modelLogs = { + refresh_activity_type_logs: [{ error: null, error_message: null, pending: true, success: false }], + refresh_model_parameter_logs: [{ error: null, error_message: null, pending: true, success: false }], + refresh_resource_type_logs: [{ error: null, error_message: null, pending: true, success: false }], + } as Pick< + ModelSlim, + 'refresh_activity_type_logs' | 'refresh_model_parameter_logs' | 'refresh_resource_type_logs' + >; + + // introduce delay for UX feedback + setTimeout(async () => { + const extractionResponse = await effects.retriggerModelExtraction(modelId, user); + if (extractionResponse == null) { + modelLogs = prevLogs; + } + }, 200); } } @@ -174,7 +205,22 @@
- + {#if modelHasExtractionError} + + {/if}
diff --git a/src/components/model/Models.svelte b/src/components/model/Models.svelte index ae2ee75047..474ed3d2a3 100644 --- a/src/components/model/Models.svelte +++ b/src/components/model/Models.svelte @@ -19,6 +19,7 @@ import type { DataGridColumnDef, RowId } from '../../types/data-grid'; import type { ModelSlim } from '../../types/model'; import effects from '../../utilities/effects'; + import { getModelStatusRollup } from '../../utilities/model'; import { permissionHandler } from '../../utilities/permissionHandler'; import { featurePermissions } from '../../utilities/permissions'; import { getShortISOForDate } from '../../utilities/time'; @@ -40,6 +41,7 @@ const createModelPermissionError: string = 'You do not have permission to upload a model'; const updateModelPermissionError: string = 'You do not have permission to update this model'; const createPlanPermissionError: string = 'You do not have permission to create a plan'; + const extractionPermissionError: string = 'You do not have permission to re-trigger a model extraction'; const baseColumnDefs: DataGridColumnDef[] = [ { field: 'name', filter: 'text', headerName: 'Name', resizable: true, sortable: true }, @@ -68,8 +70,11 @@ let hasCreatePlanPermission: boolean = false; let hasDeleteModelPermission: boolean = false; let hasUpdateModelPermission: boolean = false; + let hasExtractionPermission: boolean = false; + let modelHasExtractionError: boolean = false; let name = ''; let selectedModel: ModelSlim | null = null; + let selectedModelId: number | null = null; let version = ''; $: createButtonDisabled = !files || name === '' || version === '' || $creatingModel === true; @@ -78,6 +83,7 @@ hasCreatePlanPermission = featurePermissions.plan.canCreate(user); hasDeleteModelPermission = featurePermissions.model.canDelete(user); hasUpdateModelPermission = featurePermissions.model.canUpdate(user); + hasExtractionPermission = featurePermissions.model.canUpdate(user); columnDefs = [ { cellClass: 'action-cell-container', @@ -143,6 +149,18 @@ }, ]; } + $: selectedModel = $models.find(({ id }) => id === selectedModelId) ?? null; + $: if (selectedModel) { + const { activityLogStatus, parameterLogStatus, resourceLogStatus } = getModelStatusRollup(selectedModel); + + if (activityLogStatus === 'error' || parameterLogStatus === 'error' || resourceLogStatus === 'error') { + modelHasExtractionError = true; + } else { + modelHasExtractionError = false; + } + } else { + modelHasExtractionError = false; + } onDestroy(() => { resetModelStores(); @@ -190,12 +208,36 @@ function onRetriggerModelExtraction() { if (selectedModel != null) { - effects.retriggerModelExtraction(selectedModel.id, user); + const prevLogs = { + refresh_activity_type_logs: selectedModel.refresh_activity_type_logs, + refresh_model_parameter_logs: selectedModel.refresh_model_parameter_logs, + refresh_resource_type_logs: selectedModel.refresh_resource_type_logs, + }; + selectedModel = { + ...selectedModel, + refresh_activity_type_logs: [{ error: null, error_message: null, pending: true, success: false }], + refresh_model_parameter_logs: [{ error: null, error_message: null, pending: true, success: false }], + refresh_resource_type_logs: [{ error: null, error_message: null, pending: true, success: false }], + }; + + // introduce delay for UX feedback + setTimeout(async () => { + if (selectedModel) { + const extractionResponse = await effects.retriggerModelExtraction(selectedModel.id, user); + + if (extractionResponse == null) { + selectedModel = { + ...selectedModel, + ...prevLogs, + }; + } + } + }, 200); } } - function selectModel(model: ModelSlim | null) { - selectedModel = model; + function selectModel(modelId: number | null) { + selectedModelId = modelId; } async function submitForm(e: SubmitEvent) { @@ -266,7 +308,22 @@
- + {#if modelHasExtractionError} + + {/if}
@@ -398,7 +455,7 @@ selectedItemId={selectedModel?.id ?? null} on:deleteItem={deleteModelContext} on:editItem={editModelContext} - on:rowClicked={({ detail }) => selectModel(detail.data)} + on:rowClicked={({ detail }) => selectModel(detail.data.id)} /> {:else} No Models Found diff --git a/src/types/model.ts b/src/types/model.ts index a129251c03..44368da652 100644 --- a/src/types/model.ts +++ b/src/types/model.ts @@ -26,6 +26,7 @@ export type ModelLog = { error: string | null; error_message: string | null; // error_type: string | null; + pending: boolean; // status: string | null; success: boolean; // tries: number; diff --git a/src/utilities/effects.ts b/src/utilities/effects.ts index 5cb5d24886..8d8f6511c4 100644 --- a/src/utilities/effects.ts +++ b/src/utilities/effects.ts @@ -4247,15 +4247,24 @@ const effects = { throwPermissionError('retrigger this model extraction'); } - const data = await reqHasura>( - gql.UPDATE_MODEL, - { id, model: { mission: '' } }, - user, - ); - + const data = await reqGateway('/modelExtraction', 'POST', JSON.stringify({ missionModelId: id }), user, false); if (data != null) { + const { + response: { activity_types, model_parameters, resource_types }, + } = data; + + if (activity_types.error) { + throw Error(activity_types.error); + } + if (model_parameters.error) { + throw Error(model_parameters.error); + } + if (resource_types.error) { + throw Error(resource_types.error); + } + showSuccessToast('Model Extraction Retriggered Successfully'); - return data.updateModel; + return data; } else { throw Error(`Unable to retrigger model extraction with ID: "${id}"`); } diff --git a/src/utilities/gql.ts b/src/utilities/gql.ts index 23f9f41c3d..797f7b9405 100644 --- a/src/utilities/gql.ts +++ b/src/utilities/gql.ts @@ -1375,19 +1375,22 @@ const gql = { parameters } refresh_activity_type_logs(order_by: { created_at: desc }, limit: 1) { - success error error_message + pending + success } refresh_resource_type_logs(order_by: { created_at: desc }, limit: 1) { - success error error_message + pending + success } refresh_model_parameter_logs(order_by: { created_at: desc }, limit: 1) { - success error error_message + pending + success } version view { @@ -2196,19 +2199,22 @@ const gql = { id } refresh_activity_type_logs(order_by: { created_at: desc }, limit: 1) { - success error error_message + pending + success } refresh_resource_type_logs(order_by: { created_at: desc }, limit: 1) { - success error error_message + pending + success } refresh_model_parameter_logs(order_by: { created_at: desc }, limit: 1) { - success error error_message + pending + success } scheduling_specification_conditions { condition_id @@ -2257,19 +2263,22 @@ const gql = { } owner refresh_activity_type_logs(order_by: { created_at: desc }, limit: 1) { - success error error_message + pending + success } refresh_resource_type_logs(order_by: { created_at: desc }, limit: 1) { - success error error_message + pending + success } refresh_model_parameter_logs(order_by: { created_at: desc }, limit: 1) { - success error error_message + pending + success } version } diff --git a/src/utilities/model.ts b/src/utilities/model.ts index df6328724c..b5c66a2795 100644 --- a/src/utilities/model.ts +++ b/src/utilities/model.ts @@ -23,12 +23,12 @@ export function getModelStatusRollup( if (activityLogs) { activityLog = activityLogs[0] ?? null; if (activityLog) { - if (activityLog.success) { + if (activityLog.pending) { + activityLogStatus = 'extracting'; + } else if (activityLog.success) { activityLogStatus = 'complete'; - } else if (activityLog.error != null) { - activityLogStatus = 'error'; } else { - activityLogStatus = 'extracting'; + activityLogStatus = 'error'; } } } @@ -36,12 +36,12 @@ export function getModelStatusRollup( if (parameterLogs) { parameterLog = parameterLogs[0] ?? null; if (parameterLog) { - if (parameterLog.success) { + if (parameterLog.pending) { + parameterLogStatus = 'extracting'; + } else if (parameterLog.success) { parameterLogStatus = 'complete'; - } else if (parameterLog.error != null) { - parameterLogStatus = 'error'; } else { - parameterLogStatus = 'extracting'; + parameterLogStatus = 'error'; } } } @@ -49,12 +49,12 @@ export function getModelStatusRollup( if (resourceLogs) { resourceLog = resourceLogs[0] ?? null; if (resourceLog) { - if (resourceLog.success) { + if (resourceLog.pending) { + resourceLogStatus = 'extracting'; + } else if (resourceLog.success) { resourceLogStatus = 'complete'; - } else if (resourceLog.error != null) { - resourceLogStatus = 'error'; } else { - resourceLogStatus = 'extracting'; + resourceLogStatus = 'error'; } } } From ad416ecdca41b0991ebc03bbcecf6efa273dcfae Mon Sep 17 00:00:00 2001 From: bduran Date: Tue, 25 Jun 2024 10:07:53 -0700 Subject: [PATCH 5/9] fix model unit tests --- src/utilities/model.test.ts | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/src/utilities/model.test.ts b/src/utilities/model.test.ts index 830614c440..5355028fbc 100644 --- a/src/utilities/model.test.ts +++ b/src/utilities/model.test.ts @@ -18,13 +18,7 @@ describe('Model util functions', () => { [ 'a activity log extracting', { - refresh_activity_type_logs: [ - { - error: null, - error_message: null, - success: false, - }, - ], + refresh_activity_type_logs: [{ error: null, error_message: null, pending: true, success: false }], refresh_model_parameter_logs: [], refresh_resource_type_logs: [], }, @@ -38,6 +32,7 @@ describe('Model util functions', () => { { error: null, error_message: null, + pending: false, success: true, }, ], @@ -54,6 +49,7 @@ describe('Model util functions', () => { { error: 'error', error_message: 'error', + pending: false, success: false, }, ], @@ -67,13 +63,7 @@ describe('Model util functions', () => { 'a parameter log extracting', { refresh_activity_type_logs: [], - refresh_model_parameter_logs: [ - { - error: null, - error_message: null, - success: false, - }, - ], + refresh_model_parameter_logs: [{ error: null, error_message: null, pending: true, success: false }], refresh_resource_type_logs: [], }, 'parameterLogStatus', @@ -87,6 +77,7 @@ describe('Model util functions', () => { { error: null, error_message: null, + pending: false, success: true, }, ], @@ -103,6 +94,7 @@ describe('Model util functions', () => { { error: 'error', error_message: 'error', + pending: false, success: false, }, ], @@ -116,13 +108,7 @@ describe('Model util functions', () => { { refresh_activity_type_logs: [], refresh_model_parameter_logs: [], - refresh_resource_type_logs: [ - { - error: null, - error_message: null, - success: false, - }, - ], + refresh_resource_type_logs: [{ error: null, error_message: null, pending: true, success: false }], }, 'resourceLogStatus', 'extracting', @@ -136,6 +122,7 @@ describe('Model util functions', () => { { error: null, error_message: null, + pending: false, success: true, }, ], @@ -152,6 +139,7 @@ describe('Model util functions', () => { { error: 'error', error_message: 'error', + pending: false, success: false, }, ], @@ -166,6 +154,7 @@ describe('Model util functions', () => { { error: null, error_message: null, + pending: true, success: false, }, ], @@ -182,6 +171,7 @@ describe('Model util functions', () => { { error: null, error_message: null, + pending: false, success: true, }, ], @@ -189,6 +179,7 @@ describe('Model util functions', () => { { error: null, error_message: null, + pending: false, success: true, }, ], @@ -196,6 +187,7 @@ describe('Model util functions', () => { { error: null, error_message: null, + pending: false, success: true, }, ], @@ -212,6 +204,7 @@ describe('Model util functions', () => { { error: 'error', error_message: 'error', + pending: false, success: false, }, ], @@ -223,7 +216,6 @@ describe('Model util functions', () => { [ 'a activity log none', { - refresh_activity_type_logs: [], refresh_model_parameter_logs: [], refresh_resource_type_logs: [], }, From e90f678a2b59707ed42b68167dc05c820a480ff5 Mon Sep 17 00:00:00 2001 From: bduran Date: Tue, 25 Jun 2024 10:10:56 -0700 Subject: [PATCH 6/9] fix more tests --- .../console/views/ModelErrors.svelte.test.ts | 1 + .../model/ModelStatusRollup.svelte.test.ts | 46 +++++++++++++++++-- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/components/console/views/ModelErrors.svelte.test.ts b/src/components/console/views/ModelErrors.svelte.test.ts index 94afd9a1e8..7a554b617a 100644 --- a/src/components/console/views/ModelErrors.svelte.test.ts +++ b/src/components/console/views/ModelErrors.svelte.test.ts @@ -16,6 +16,7 @@ describe('Model Errors Console', () => { { error: JSON.stringify({ error: 'This is an error' }), error_message: 'This is a Test Error', + pending: false, success: false, }, ], diff --git a/src/components/model/ModelStatusRollup.svelte.test.ts b/src/components/model/ModelStatusRollup.svelte.test.ts index 8d2a0d9f1a..ac24ecb8af 100644 --- a/src/components/model/ModelStatusRollup.svelte.test.ts +++ b/src/components/model/ModelStatusRollup.svelte.test.ts @@ -18,6 +18,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: testError, + pending: false, success: false, }, ], @@ -40,6 +41,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: testError, + pending: false, success: false, }, ], @@ -62,6 +64,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: testError, + pending: false, success: false, }, ], @@ -82,6 +85,7 @@ describe('Model Status Rollup', () => { { error: null, error_message: null, + pending: true, success: false, }, ], @@ -103,6 +107,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: '', + pending: false, success: true, }, ], @@ -110,6 +115,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: '', + pending: false, success: true, }, ], @@ -117,6 +123,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: '', + pending: false, success: true, }, ], @@ -136,6 +143,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: '', + pending: false, success: true, }, ], @@ -143,6 +151,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: 'Test Error', + pending: false, success: false, }, ], @@ -150,6 +159,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: '', + pending: false, success: true, }, ], @@ -170,6 +180,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: testError, + pending: false, success: false, }, ], @@ -192,6 +203,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: testError, + pending: false, success: false, }, ], @@ -214,6 +226,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: testError, + pending: false, success: false, }, ], @@ -230,9 +243,30 @@ describe('Model Status Rollup', () => { props: { mode: 'iconOnly', model: { - refresh_activity_type_logs: [], - refresh_model_parameter_logs: [], - refresh_resource_type_logs: [], + refresh_activity_type_logs: [ + { + error: '', + error_message: '', + pending: true, + success: false, + }, + ], + refresh_model_parameter_logs: [ + { + error: '', + error_message: '', + pending: true, + success: false, + }, + ], + refresh_resource_type_logs: [ + { + error: '', + error_message: '', + pending: true, + success: false, + }, + ], }, }, }); @@ -249,6 +283,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: '', + pending: false, success: true, }, ], @@ -256,6 +291,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: '', + pending: false, success: true, }, ], @@ -263,6 +299,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: '', + pending: false, success: true, }, ], @@ -282,6 +319,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: '', + pending: false, success: true, }, ], @@ -289,6 +327,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: 'Test Error', + pending: false, success: false, }, ], @@ -296,6 +335,7 @@ describe('Model Status Rollup', () => { { error: '', error_message: '', + pending: false, success: true, }, ], From 5de69efdb4a82afc1d6ae8c53dab55175011ce38 Mon Sep 17 00:00:00 2001 From: bduran Date: Mon, 1 Jul 2024 11:54:00 -0700 Subject: [PATCH 7/9] update comments --- src/components/model/ModelForm.svelte | 2 +- src/components/model/Models.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/model/ModelForm.svelte b/src/components/model/ModelForm.svelte index b6cbd3f472..16a53dec19 100644 --- a/src/components/model/ModelForm.svelte +++ b/src/components/model/ModelForm.svelte @@ -120,7 +120,7 @@ 'refresh_activity_type_logs' | 'refresh_model_parameter_logs' | 'refresh_resource_type_logs' >; - // introduce delay for UX feedback + // introduce delay to allow users to see a transition in case retriggering is instantaneous setTimeout(async () => { const extractionResponse = await effects.retriggerModelExtraction(modelId, user); if (extractionResponse == null) { diff --git a/src/components/model/Models.svelte b/src/components/model/Models.svelte index 474ed3d2a3..17de4e85b5 100644 --- a/src/components/model/Models.svelte +++ b/src/components/model/Models.svelte @@ -220,7 +220,7 @@ refresh_resource_type_logs: [{ error: null, error_message: null, pending: true, success: false }], }; - // introduce delay for UX feedback + // introduce delay to allow users to see a transition in case retriggering is instantaneous setTimeout(async () => { if (selectedModel) { const extractionResponse = await effects.retriggerModelExtraction(selectedModel.id, user); From a21e9de53440b1a8d62cff9abfc4afae6ad2d2a0 Mon Sep 17 00:00:00 2001 From: bduran Date: Mon, 1 Jul 2024 12:02:37 -0700 Subject: [PATCH 8/9] fix return type --- src/utilities/effects.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/utilities/effects.ts b/src/utilities/effects.ts index 8d8f6511c4..9414a715fd 100644 --- a/src/utilities/effects.ts +++ b/src/utilities/effects.ts @@ -81,7 +81,7 @@ import type { SeqId, } from '../types/expansion'; import type { Extension, ExtensionPayload } from '../types/extension'; -import type { Model, ModelInsertInput, ModelSchema, ModelSetInput, ModelSlim } from '../types/model'; +import type { Model, ModelInsertInput, ModelLog, ModelSchema, ModelSetInput, ModelSlim } from '../types/model'; import type { DslTypeScriptResponse, TypeScriptFile } from '../types/monaco'; import type { Argument, @@ -4241,7 +4241,16 @@ const effects = { return false; }, - async retriggerModelExtraction(id: number, user: User | null) { + async retriggerModelExtraction( + id: number, + user: User | null, + ): Promise<{ + response: { + activity_types: ModelLog; + model_parameters: ModelLog; + resource_types: ModelLog; + }; + } | null> { try { if (!queryPermissions.UPDATE_MODEL(user)) { throwPermissionError('retrigger this model extraction'); From c9989b6aaaa9a693d0044ebe5e32f240166785e8 Mon Sep 17 00:00:00 2001 From: bduran Date: Mon, 1 Jul 2024 12:07:10 -0700 Subject: [PATCH 9/9] fix conditional check --- src/components/model/ModelForm.svelte | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/components/model/ModelForm.svelte b/src/components/model/ModelForm.svelte index 16a53dec19..12eb49991c 100644 --- a/src/components/model/ModelForm.svelte +++ b/src/components/model/ModelForm.svelte @@ -108,26 +108,23 @@ } function onRetriggerModelExtraction() { - if (modelId != null) { - const prevLogs = modelLogs; + const prevLogs = modelLogs; - modelLogs = { - refresh_activity_type_logs: [{ error: null, error_message: null, pending: true, success: false }], - refresh_model_parameter_logs: [{ error: null, error_message: null, pending: true, success: false }], - refresh_resource_type_logs: [{ error: null, error_message: null, pending: true, success: false }], - } as Pick< - ModelSlim, - 'refresh_activity_type_logs' | 'refresh_model_parameter_logs' | 'refresh_resource_type_logs' - >; + modelLogs = { + refresh_activity_type_logs: [{ error: null, error_message: null, pending: true, success: false }], + refresh_model_parameter_logs: [{ error: null, error_message: null, pending: true, success: false }], + refresh_resource_type_logs: [{ error: null, error_message: null, pending: true, success: false }], + } as Pick; - // introduce delay to allow users to see a transition in case retriggering is instantaneous - setTimeout(async () => { + // introduce delay to allow users to see a transition in case retriggering is instantaneous + setTimeout(async () => { + if (modelId != null) { const extractionResponse = await effects.retriggerModelExtraction(modelId, user); if (extractionResponse == null) { modelLogs = prevLogs; } - }, 200); - } + } + }, 200); }