Fix translations

pull/30205/head
Lunny Xiao 2025-10-25 11:55:28 -07:00
parent 635649d3bd
commit f68eee55a1
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
5 changed files with 38 additions and 35 deletions

View File

@ -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

View File

@ -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"}}"
>
</div>
</div>

View File

@ -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);

View File

@ -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}`);
}
},

View File

@ -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);