From f68eee55a1212c95ef88cde2775deefa42718844 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sat, 25 Oct 2025 11:55:28 -0700 Subject: [PATCH] Fix translations --- options/locale/locale_en-US.ini | 7 ++- templates/projects/workflows.tmpl | 3 ++ .../components/projects/ProjectWorkflow.vue | 6 ++- .../js/components/projects/WorkflowStore.ts | 54 ++++++++----------- web_src/js/features/projects/workflow.ts | 3 ++ 5 files changed, 38 insertions(+), 35 deletions(-) diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index ced3c9a697..15a359898a 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -3959,10 +3959,15 @@ workflows.disable = Disable workflows.disabled = Disabled workflows.enable = Enable workflows.enabled = Enabled -workflows.issuesAndPullRequests = Issues and Pull Requests +workflows.issues_and_pull_requests = Issues and Pull Requests workflows.issues_only = Issues only workflows.pull_requests_only = Pull Requests only workflows.select_column = Select column ... +workflows.close_issue = Close issue +workflows.reopen_issue = Reopen issue +workflows.save_workflow_failed = Failed to save workflow +workflows.update_workflow_failed = Failed to update workflow status +workflows.delete_workflow_failed = Failed to delete workflow [git.filemode] changed_filemode = %[1]s → %[2]s diff --git a/templates/projects/workflows.tmpl b/templates/projects/workflows.tmpl index f7d18bf180..76e17bc229 100644 --- a/templates/projects/workflows.tmpl +++ b/templates/projects/workflows.tmpl @@ -36,6 +36,9 @@ data-locale-select-column="{{ctx.Locale.Tr "projects.workflows.select_column"}}" data-locale-close-issue="{{ctx.Locale.Tr "projects.workflows.close_issue"}}" data-locale-reopen-issue="{{ctx.Locale.Tr "projects.workflows.reopen_issue"}}" + data-locale-save-workflow-failed="{{ctx.Locale.Tr "projects.workflows.save_workflow_failed"}}" + data-locale-update-workflow-failed="{{ctx.Locale.Tr "projects.workflows.update_workflow_failed"}}" + data-locale-delete-workflow-failed="{{ctx.Locale.Tr "projects.workflows.delete_workflow_failed"}}" > diff --git a/web_src/js/components/projects/ProjectWorkflow.vue b/web_src/js/components/projects/ProjectWorkflow.vue index 0b61a85063..837eb64213 100644 --- a/web_src/js/components/projects/ProjectWorkflow.vue +++ b/web_src/js/components/projects/ProjectWorkflow.vue @@ -4,7 +4,6 @@ import {createWorkflowStore} from './WorkflowStore.ts'; import {svg} from '../../svg.ts'; import {confirmModal} from '../../features/comp/ConfirmModal.ts'; import {fomanticQuery} from '../../modules/fomantic/base.ts'; -import { locale } from 'dayjs'; const elRoot = useTemplateRef('elRoot'); @@ -46,10 +45,13 @@ const props = defineProps<{ selectColumn: string; closeIssue: string; reopenIssue: string; + saveWorkflowFailed: string; + updateWorkflowFailed: string; + deleteWorkflowFailed: string; }, }>(); -const store = createWorkflowStore(props.projectLink, props.eventID); +const store = createWorkflowStore(props); // Track edit state directly on workflow objects const previousSelection = ref(null); diff --git a/web_src/js/components/projects/WorkflowStore.ts b/web_src/js/components/projects/WorkflowStore.ts index d3827d6272..2d7891e0ff 100644 --- a/web_src/js/components/projects/WorkflowStore.ts +++ b/web_src/js/components/projects/WorkflowStore.ts @@ -1,6 +1,6 @@ import {reactive} from 'vue'; import {GET, POST} from '../../modules/fetch.ts'; -import {showInfoToast, showErrorToast} from '../../modules/toast.ts'; +import {showErrorToast} from '../../modules/toast.ts'; type WorkflowFiltersState = { issue_type: string; @@ -23,7 +23,7 @@ type WorkflowDraftState = { actions: WorkflowActionsState; }; -const createDefaultFilters = (): WorkflowFiltersState => ({issue_type: '', source_column: '',target_column: '', labels: []}); +const createDefaultFilters = (): WorkflowFiltersState => ({issue_type: '', source_column: '', target_column: '', labels: []}); const createDefaultActions = (): WorkflowActionsState => ({column: '', add_labels: [], remove_labels: [], issue_state: ''}); function convertFilters(workflow: any): WorkflowFiltersState { @@ -80,10 +80,10 @@ const cloneActions = (actions: WorkflowActionsState): WorkflowActionsState => ({ issue_state: actions.issue_state, }); -export function createWorkflowStore(projectLink: string, eventID: string) { +export function createWorkflowStore(props: any) { const store = reactive({ workflowEvents: [], - selectedItem: eventID, + selectedItem: props.eventID, selectedWorkflow: null, projectColumns: [], projectLabels: [], // Add labels data @@ -113,19 +113,15 @@ export function createWorkflowStore(projectLink: string, eventID: string) { }, async loadEvents() { - const response = await GET(`${projectLink}/workflows/events`); + const response = await GET(`${props.projectLink}/workflows/events`); store.workflowEvents = await response.json(); return store.workflowEvents; }, async loadProjectColumns() { try { - const response = await GET(`${projectLink}/workflows/columns`); + const response = await GET(`${props.projectLink}/workflows/columns`); store.projectColumns = await response.json(); - console.log('[WorkflowStore] Loaded columns:', store.projectColumns); - if (store.projectColumns.length > 0) { - console.log('[WorkflowStore] First column.id type:', typeof store.projectColumns[0].id, 'value:', store.projectColumns[0].id); - } } catch (error) { console.error('Failed to load project columns:', error); store.projectColumns = []; @@ -159,7 +155,7 @@ export function createWorkflowStore(projectLink: string, eventID: string) { async loadProjectLabels() { try { - const response = await GET(`${projectLink}/workflows/labels`); + const response = await GET(`${props.projectLink}/workflows/labels`); store.projectLabels = await response.json(); } catch (error) { console.error('Failed to load project labels:', error); @@ -192,10 +188,7 @@ export function createWorkflowStore(projectLink: string, eventID: string) { actions: store.workflowActions, }; - // Send workflow data - console.info('Sending workflow data:', postData); - - const response = await POST(`${projectLink}/workflows/${eventId}`, { + const response = await POST(`${props.projectLink}/workflows/${eventId}`, { data: postData, headers: { 'Content-Type': 'application/json', @@ -205,12 +198,11 @@ export function createWorkflowStore(projectLink: string, eventID: string) { if (!response.ok) { const errorText = await response.text(); console.error('Response error:', errorText); - showErrorToast(`Failed to save workflow: ${response.status} ${response.statusText}\n${errorText}`); + showErrorToast(`${props.locale.failedToSaveWorkflow}: ${response.status} ${response.statusText}\n${errorText}`); return; } const result = await response.json(); - console.log('Response result:', result); if (result.success && result.workflow) { // Always reload the events list to get the updated structure // This ensures we have both the base event and the new filtered event @@ -247,18 +239,16 @@ export function createWorkflowStore(projectLink: string, eventID: string) { // Update URL to use the new workflow ID if (wasNewWorkflow) { - const newUrl = `${projectLink}/workflows/${store.selectedWorkflow.event_id}`; + const newUrl = `${props.projectLink}/workflows/${store.selectedWorkflow.event_id}`; window.history.replaceState({eventId: store.selectedWorkflow.event_id}, '', newUrl); } - - showInfoToast('Workflow saved successfully!'); } else { console.error('Unexpected response format:', result); - showErrorToast('Failed to save workflow: Unexpected response format'); + showErrorToast(`${props.locale.failedToSaveWorkflow}: Unexpected response format`); } } catch (error) { - console.error('Error saving workflow:', error); - showErrorToast(`Error saving workflow: ${error.message}`); + console.error('Failed to save workflow:', error); + showErrorToast(`${props.locale.failedToSaveWorkflow}: ${error.message}`); } finally { store.saving = false; } @@ -273,14 +263,14 @@ export function createWorkflowStore(projectLink: string, eventID: string) { // Use workflow ID for status update const workflowId = store.selectedWorkflow.id; - const response = await POST(`${projectLink}/workflows/${workflowId}/status`, { + const response = await POST(`${props.projectLink}/workflows/${workflowId}/status`, { data: formData, }); if (!response.ok) { const errorText = await response.text(); console.error('Failed to update workflow status:', errorText); - showErrorToast(`Failed to update workflow status: ${response.status} ${response.statusText}`); + showErrorToast(`${props.locale.failedToUpdateWorkflowStatus}: ${response.status} ${response.statusText}`); // Revert the status change on error store.selectedWorkflow.enabled = !store.selectedWorkflow.enabled; return; @@ -296,13 +286,13 @@ export function createWorkflowStore(projectLink: string, eventID: string) { } else { // Revert the status change on failure store.selectedWorkflow.enabled = !store.selectedWorkflow.enabled; - showErrorToast('Failed to update workflow status'); + showErrorToast(`${props.locale.failedToUpdateWorkflowStatus}: Unexpected error`); } } catch (error) { - console.error('Error updating workflow status:', error); + console.error('Failed to update workflow status:', error); // Revert the status change on error store.selectedWorkflow.enabled = !store.selectedWorkflow.enabled; - showErrorToast(`Error updating workflow status: ${error.message}`); + showErrorToast(`${props.locale.failedToUpdateWorkflowStatus}: ${error.message}`); } }, @@ -312,14 +302,14 @@ export function createWorkflowStore(projectLink: string, eventID: string) { try { // Use workflow ID for deletion const workflowId = store.selectedWorkflow.id; - const response = await POST(`${projectLink}/workflows/${workflowId}/delete`, { + const response = await POST(`${props.projectLink}/workflows/${workflowId}/delete`, { data: new FormData(), }); if (!response.ok) { const errorText = await response.text(); console.error('Failed to delete workflow:', errorText); - showErrorToast(`Failed to delete workflow: ${response.status} ${response.statusText}`); + showErrorToast(`${props.locale.failedToDeleteWorkflow}: ${response.status} ${response.statusText}`); return; } @@ -331,11 +321,11 @@ export function createWorkflowStore(projectLink: string, eventID: string) { store.workflowEvents.splice(existingIndex, 1); } } else { - showErrorToast('Failed to delete workflow'); + showErrorToast(`${props.locale.failedToDeleteWorkflow}: Unexpected error`); } } catch (error) { console.error('Error deleting workflow:', error); - showErrorToast(`Error deleting workflow: ${error.message}`); + showErrorToast(`${props.locale.failedToDeleteWorkflow}: ${error.message}`); } }, diff --git a/web_src/js/features/projects/workflow.ts b/web_src/js/features/projects/workflow.ts index 67ed01ec64..4ac48fce5b 100644 --- a/web_src/js/features/projects/workflow.ts +++ b/web_src/js/features/projects/workflow.ts @@ -41,6 +41,9 @@ export async function initProjectWorkflow() { selectColumn: workflowDiv.getAttribute('data-locale-select-column'), closeIssue: workflowDiv.getAttribute('data-locale-close-issue'), reopenIssue: workflowDiv.getAttribute('data-locale-reopen-issue'), + saveWorkflowFailed: workflowDiv.getAttribute('data-locale-save-workflow-failed'), + updateWorkflowFailed: workflowDiv.getAttribute('data-locale-update-workflow-failed'), + deleteWorkflowFailed: workflowDiv.getAttribute('data-locale-delete-workflow-failed'), }; console.info('locale:', locale);