0
0
mirror of https://github.com/go-gitea/gitea.git synced 2026-05-16 21:17:26 +02:00

add translations

This commit is contained in:
Lunny Xiao 2025-10-24 23:59:13 -07:00
parent 3d081b300f
commit 635649d3bd
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
6 changed files with 225 additions and 70 deletions

View File

@ -16,19 +16,21 @@ import (
type WorkflowEvent string type WorkflowEvent string
const ( const (
WorkflowEventItemOpened WorkflowEvent = "item_opened" WorkflowEventItemOpened WorkflowEvent = "item_opened"
WorkflowEventItemAddedToProject WorkflowEvent = "item_added_to_project" WorkflowEventItemAddedToProject WorkflowEvent = "item_added_to_project"
WorkflowEventItemReopened WorkflowEvent = "item_reopened" WorkflowEventItemRemovedFromProject WorkflowEvent = "item_removed_from_project"
WorkflowEventItemClosed WorkflowEvent = "item_closed" WorkflowEventItemReopened WorkflowEvent = "item_reopened"
WorkflowEventItemColumnChanged WorkflowEvent = "item_column_changed" WorkflowEventItemClosed WorkflowEvent = "item_closed"
WorkflowEventCodeChangesRequested WorkflowEvent = "code_changes_requested" WorkflowEventItemColumnChanged WorkflowEvent = "item_column_changed"
WorkflowEventCodeReviewApproved WorkflowEvent = "code_review_approved" WorkflowEventCodeChangesRequested WorkflowEvent = "code_changes_requested"
WorkflowEventPullRequestMerged WorkflowEvent = "pull_request_merged" WorkflowEventCodeReviewApproved WorkflowEvent = "code_review_approved"
WorkflowEventPullRequestMerged WorkflowEvent = "pull_request_merged"
) )
var workflowEvents = []WorkflowEvent{ var workflowEvents = []WorkflowEvent{
WorkflowEventItemOpened, WorkflowEventItemOpened,
WorkflowEventItemAddedToProject, WorkflowEventItemAddedToProject,
WorkflowEventItemRemovedFromProject,
WorkflowEventItemReopened, WorkflowEventItemReopened,
WorkflowEventItemClosed, WorkflowEventItemClosed,
WorkflowEventItemColumnChanged, WorkflowEventItemColumnChanged,
@ -56,6 +58,8 @@ func (we WorkflowEvent) LangKey() string {
return "projects.workflows.event.item_opened" return "projects.workflows.event.item_opened"
case WorkflowEventItemAddedToProject: case WorkflowEventItemAddedToProject:
return "projects.workflows.event.item_added_to_project" return "projects.workflows.event.item_added_to_project"
case WorkflowEventItemRemovedFromProject:
return "projects.workflows.event.item_removed_from_project"
case WorkflowEventItemReopened: case WorkflowEventItemReopened:
return "projects.workflows.event.item_reopened" return "projects.workflows.event.item_reopened"
case WorkflowEventItemClosed: case WorkflowEventItemClosed:
@ -122,6 +126,10 @@ func GetWorkflowEventCapabilities() map[WorkflowEvent]WorkflowEventCapabilities
AvailableFilters: []WorkflowFilterType{WorkflowFilterTypeIssueType, WorkflowFilterTypeLabels}, AvailableFilters: []WorkflowFilterType{WorkflowFilterTypeIssueType, WorkflowFilterTypeLabels},
AvailableActions: []WorkflowActionType{WorkflowActionTypeColumn, WorkflowActionTypeAddLabels, WorkflowActionTypeRemoveLabels, WorkflowActionTypeIssueState}, AvailableActions: []WorkflowActionType{WorkflowActionTypeColumn, WorkflowActionTypeAddLabels, WorkflowActionTypeRemoveLabels, WorkflowActionTypeIssueState},
}, },
WorkflowEventItemRemovedFromProject: {
AvailableFilters: []WorkflowFilterType{WorkflowFilterTypeIssueType, WorkflowFilterTypeLabels},
AvailableActions: []WorkflowActionType{WorkflowActionTypeAddLabels, WorkflowActionTypeRemoveLabels, WorkflowActionTypeIssueState},
},
WorkflowEventItemReopened: { WorkflowEventItemReopened: {
AvailableFilters: []WorkflowFilterType{WorkflowFilterTypeIssueType, WorkflowFilterTypeLabels}, AvailableFilters: []WorkflowFilterType{WorkflowFilterTypeIssueType, WorkflowFilterTypeLabels},
AvailableActions: []WorkflowActionType{WorkflowActionTypeColumn, WorkflowActionTypeAddLabels, WorkflowActionTypeRemoveLabels}, AvailableActions: []WorkflowActionType{WorkflowActionTypeColumn, WorkflowActionTypeAddLabels, WorkflowActionTypeRemoveLabels},

View File

@ -3924,12 +3924,45 @@ workflows = Workflows
exit_fullscreen = Exit Fullscreen exit_fullscreen = Exit Fullscreen
workflows.event.item_opened = Item opened workflows.event.item_opened = Item opened
workflows.event.item_added_to_project = Item added to project workflows.event.item_added_to_project = Item added to project
workflows.event.item_removed_from_project = Item removed from project
workflows.event.item_reopened = Item reopened workflows.event.item_reopened = Item reopened
workflows.event.item_closed = Item closed workflows.event.item_closed = Item closed
workflows.event.item_column_changed = Item column changed workflows.event.item_column_changed = Item column changed
workflows.event.code_changes_requested = Code changes requested workflows.event.code_changes_requested = Code changes requested
workflows.event.code_review_approved = Code review approved workflows.event.code_review_approved = Code review approved
workflows.event.pull_request_merged = Pull request merged workflows.event.pull_request_merged = Pull request merged
workflows.view_workflow_configuration = View workflow configuration
workflows.configure_workflow = Configure automated actions for this workflow
workflows.when = When
workflows.run_when = This workflow will run when:
workflows.filters = Filters
workflows.apply_to = Apply to
workflows.when_moved_from_column = When moved from column
workflows.when_moved_to_column = When moved to column
workflows.only_if_has_labels = Only if has labels
workflows.default_workflows = Default Workflows
workflows.actions = Actions
workflows.move_to_column = Move to column
workflows.add_labels = Add labels
workflows.remove_labels = Remove labels
workflows.any_label = Any label
workflows.any_column = Any column
workflows.issue_state = Issue state
workflows.none = None
workflows.no_change = No change
workflows.edit = Edit
workflows.delete = Delete
workflows.save = Save
workflows.clone = Clone
workflows.cancel = Cancel
workflows.disable = Disable
workflows.disabled = Disabled
workflows.enable = Enable
workflows.enabled = Enabled
workflows.issuesAndPullRequests = Issues and Pull Requests
workflows.issues_only = Issues only
workflows.pull_requests_only = Pull Requests only
workflows.select_column = Select column ...
[git.filemode] [git.filemode]
changed_filemode = %[1]s → %[2]s changed_filemode = %[1]s → %[2]s

View File

@ -2,6 +2,40 @@
<div id="project-workflows" <div id="project-workflows"
data-project-link="{{.ProjectLink}}" data-project-link="{{.ProjectLink}}"
data-event-id="{{.workflowIDStr}}" data-event-id="{{.workflowIDStr}}"
data-locale-default-workflows="{{ctx.Locale.Tr "projects.workflows.default_workflows"}}"
data-locale-view-workflow-configuration="{{ctx.Locale.Tr "projects.workflows.view_workflow_configuration"}}"
data-locale-configure-workflow="{{ctx.Locale.Tr "projects.workflows.configure_workflow"}}"
data-locale-when="{{ctx.Locale.Tr "projects.workflows.when"}}"
data-locale-run-when="{{ctx.Locale.Tr "projects.workflows.run_when"}}"
data-locale-filters="{{ctx.Locale.Tr "projects.workflows.filters"}}"
data-locale-apply-to="{{ctx.Locale.Tr "projects.workflows.apply_to"}}"
data-locale-when-moved-from-column="{{ctx.Locale.Tr "projects.workflows.when_moved_from_column"}}"
data-locale-when-moved-to-column="{{ctx.Locale.Tr "projects.workflows.when_moved_to_column"}}"
data-locale-only-if-has-labels="{{ctx.Locale.Tr "projects.workflows.only_if_has_labels"}}"
data-locale-actions="{{ctx.Locale.Tr "projects.workflows.actions"}}"
data-locale-move-to-column="{{ctx.Locale.Tr "projects.workflows.move_to_column"}}"
data-locale-add-labels="{{ctx.Locale.Tr "projects.workflows.add_labels"}}"
data-locale-remove-labels="{{ctx.Locale.Tr "projects.workflows.remove_labels"}}"
data-locale-any-label="{{ctx.Locale.Tr "projects.workflows.any_label"}}"
data-locale-any-column="{{ctx.Locale.Tr "projects.workflows.any_column"}}"
data-locale-issue-state="{{ctx.Locale.Tr "projects.workflows.issue_state"}}"
data-locale-none="{{ctx.Locale.Tr "projects.workflows.none"}}"
data-locale-no-change="{{ctx.Locale.Tr "projects.workflows.no_change"}}"
data-locale-edit="{{ctx.Locale.Tr "projects.workflows.edit"}}"
data-locale-delete="{{ctx.Locale.Tr "projects.workflows.delete"}}"
data-locale-save="{{ctx.Locale.Tr "projects.workflows.save"}}"
data-locale-clone="{{ctx.Locale.Tr "projects.workflows.clone"}}"
data-locale-cancel="{{ctx.Locale.Tr "projects.workflows.cancel"}}"
data-locale-disable="{{ctx.Locale.Tr "projects.workflows.disable"}}"
data-locale-disabled="{{ctx.Locale.Tr "projects.workflows.disabled"}}"
data-locale-enable="{{ctx.Locale.Tr "projects.workflows.enable"}}"
data-locale-enabled="{{ctx.Locale.Tr "projects.workflows.enabled"}}"
data-locale-issues-and-pull-requests="{{ctx.Locale.Tr "projects.workflows.issues_and_pull_requests"}}"
data-locale-issues-only="{{ctx.Locale.Tr "projects.workflows.issues_only"}}"
data-locale-pull-requests-only="{{ctx.Locale.Tr "projects.workflows.pull_requests_only"}}"
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"}}"
> >
</div> </div>
</div> </div>

View File

@ -4,15 +4,52 @@ import {createWorkflowStore} from './WorkflowStore.ts';
import {svg} from '../../svg.ts'; import {svg} from '../../svg.ts';
import {confirmModal} from '../../features/comp/ConfirmModal.ts'; import {confirmModal} from '../../features/comp/ConfirmModal.ts';
import {fomanticQuery} from '../../modules/fomantic/base.ts'; import {fomanticQuery} from '../../modules/fomantic/base.ts';
import { locale } from 'dayjs';
const elRoot = useTemplateRef('elRoot'); const elRoot = useTemplateRef('elRoot');
const props = defineProps({ const props = defineProps<{
projectLink: {type: String, required: true}, projectLink: string;
eventID: {type: String, required: true}, eventID: string;
}); locale: {
defaultWorkflows: string;
moveToColumn: string;
viewWorkflowConfiguration: string;
configureWorkflow: string;
when: string;
runWhen: string;
filters: string;
applyTo: string;
whenMovedFromColumn: string;
whenMovedToColumn: string;
onlyIfHasLabels: string;
actions: string;
addLabels: string;
removeLabels: string;
anyLabel: string;
anyColumn: string;
issueState: string;
none: string;
noChange: string;
edit: string;
delete: string;
save: string;
clone: string;
cancel: string;
disable: string;
disabled: string;
enabled: string;
enable: string;
issuesAndPullRequests: string;
issuesOnly: string;
pullRequestsOnly: string;
selectColumn: string;
closeIssue: string;
reopenIssue: string;
},
}>();
const store = createWorkflowStore(props); const store = createWorkflowStore(props.projectLink, props.eventID);
// Track edit state directly on workflow objects // Track edit state directly on workflow objects
const previousSelection = ref(null); const previousSelection = ref(null);
@ -648,7 +685,7 @@ onUnmounted(() => {
<!-- Left Sidebar - Workflow List --> <!-- Left Sidebar - Workflow List -->
<div class="workflow-sidebar"> <div class="workflow-sidebar">
<div class="sidebar-header"> <div class="sidebar-header">
<h3>Default Workflows</h3> <h3>{{ locale.defaultWorkflows }}</h3>
</div> </div>
<div class="sidebar-content"> <div class="sidebar-content">
@ -692,8 +729,6 @@ onUnmounted(() => {
<div class="placeholder-icon"> <div class="placeholder-icon">
<i class="huge settings icon"/> <i class="huge settings icon"/>
</div> </div>
<h3>Select a workflow to configure</h3>
<p>Choose an event from the left sidebar to create or configure workflows.</p>
</div> </div>
</div> </div>
@ -709,12 +744,12 @@ onUnmounted(() => {
class="workflow-status" class="workflow-status"
:class="store.selectedWorkflow.enabled ? 'status-enabled' : 'status-disabled'" :class="store.selectedWorkflow.enabled ? 'status-enabled' : 'status-disabled'"
> >
{{ store.selectedWorkflow.enabled ? 'Enabled' : 'Disabled' }} {{ store.selectedWorkflow.enabled ? locale.enabled : locale.disabled }}
</span> </span>
</h2> </h2>
<p v-if="store.selectedWorkflow.id === 0">Configure automated actions for this workflow</p> <p v-if="store.selectedWorkflow.id === 0">{{ locale.configureWorkflow }}</p>
<p v-else-if="isInEditMode">Configure automated actions for this workflow</p> <p v-else-if="isInEditMode">{{ locale.configureWorkflow }}</p>
<p v-else>View workflow configuration</p> <p v-else>{{ locale.viewWorkflowConfiguration }}</p>
</div> </div>
<div class="editor-actions-header"> <div class="editor-actions-header">
<!-- Edit Mode Buttons --> <!-- Edit Mode Buttons -->
@ -726,7 +761,7 @@ onUnmounted(() => {
@click="toggleEditMode" @click="toggleEditMode"
> >
<i class="times icon"/> <i class="times icon"/>
Cancel {{ locale.cancel }}
</button> </button>
<!-- Save Button --> <!-- Save Button -->
@ -736,7 +771,7 @@ onUnmounted(() => {
:disabled="store.saving" :disabled="store.saving"
> >
<i class="save icon"/> <i class="save icon"/>
Save {{ locale.save }}
</button> </button>
<!-- Delete Button (only for configured workflows) --> <!-- Delete Button (only for configured workflows) -->
@ -746,7 +781,7 @@ onUnmounted(() => {
@click="deleteWorkflow" @click="deleteWorkflow"
> >
<i class="trash icon"/> <i class="trash icon"/>
Delete {{ locale.delete }}
</button> </button>
</template> </template>
@ -758,7 +793,7 @@ onUnmounted(() => {
@click="toggleEditMode" @click="toggleEditMode"
> >
<i class="edit icon"/> <i class="edit icon"/>
Edit {{ locale.edit }}
</button> </button>
<!-- Enable/Disable Button --> <!-- Enable/Disable Button -->
@ -766,10 +801,9 @@ onUnmounted(() => {
class="btn" class="btn"
:class="store.selectedWorkflow.enabled ? 'btn-outline-danger' : 'btn-success'" :class="store.selectedWorkflow.enabled ? 'btn-outline-danger' : 'btn-success'"
@click="toggleWorkflowStatus" @click="toggleWorkflowStatus"
:title="store.selectedWorkflow.enabled ? 'Disable workflow' : 'Enable workflow'"
> >
<i :class="store.selectedWorkflow.enabled ? 'pause icon' : 'play icon'"/> <i :class="store.selectedWorkflow.enabled ? 'pause icon' : 'play icon'"/>
{{ store.selectedWorkflow.enabled ? 'Disable' : 'Enable' }} {{ store.selectedWorkflow.enabled ? locale.disable : locale.enable }}
</button> </button>
<!-- Clone Button --> <!-- Clone Button -->
@ -779,7 +813,7 @@ onUnmounted(() => {
title="Clone this workflow" title="Clone this workflow"
> >
<i class="copy icon"/> <i class="copy icon"/>
Clone {{ locale.clone }}
</button> </button>
</template> </template>
</div> </div>
@ -788,77 +822,77 @@ onUnmounted(() => {
<div class="editor-content"> <div class="editor-content">
<div class="form" :class="{ 'readonly': !isInEditMode }"> <div class="form" :class="{ 'readonly': !isInEditMode }">
<div class="field"> <div class="field">
<label>When</label> <label>{{ locale.when }}</label>
<div class="segment"> <div class="segment">
<div class="description"> <div class="description">
This workflow will run when: <strong>{{ store.selectedWorkflow.display_name }}</strong> {{ locale.runWhen }}<strong>{{ store.selectedWorkflow.display_name }}</strong>
</div> </div>
</div> </div>
</div> </div>
<!-- Filters Section --> <!-- Filters Section -->
<div class="field" v-if="hasAvailableFilters"> <div class="field" v-if="hasAvailableFilters">
<label>Filters</label> <label>{{ locale.filters }}</label>
<div class="segment"> <div class="segment">
<div class="field" v-if="hasFilter('issue_type')"> <div class="field" v-if="hasFilter('issue_type')">
<label>Apply to</label> <label>{{ locale.applyTo }}</label>
<select <select
v-if="isInEditMode" v-if="isInEditMode"
class="column-select" class="column-select"
v-model="store.workflowFilters.issue_type" v-model="store.workflowFilters.issue_type"
> >
<option value="">Issues And Pull Requests</option> <option value="">{{ locale.issuesAndPullRequests }}</option>
<option value="issue">Issues</option> <option value="issue">{{ locale.issuesOnly }}</option>
<option value="pull_request">Pull requests</option> <option value="pull_request">{{ locale.pullRequestsOnly }}</option>
</select> </select>
<div v-else class="readonly-value"> <div v-else class="readonly-value">
{{ store.workflowFilters.issue_type === 'issue' ? 'Issues' : {{ store.workflowFilters.issue_type === 'issue' ? locale.issuesOnly :
store.workflowFilters.issue_type === 'pull_request' ? 'Pull requests' : store.workflowFilters.issue_type === 'pull_request' ? locale.pullRequestsOnly :
'Issues And Pull Requests' }} locale.issuesAndPullRequests }}
</div> </div>
</div> </div>
<div class="field" v-if="hasFilter('source_column')"> <div class="field" v-if="hasFilter('source_column')">
<label>When moved from column</label> <label>{{ locale.whenMovedFromColumn }}</label>
<select <select
v-if="isInEditMode" v-if="isInEditMode"
v-model="store.workflowFilters.source_column" v-model="store.workflowFilters.source_column"
class="column-select" class="column-select"
> >
<option value="">Any column</option> <option value="">{{ locale.anyColumn }}</option>
<option v-for="column in store.projectColumns" :key="column.id" :value="String(column.id)"> <option v-for="column in store.projectColumns" :key="column.id" :value="String(column.id)">
{{ column.title }} {{ column.title }}
</option> </option>
</select> </select>
<div v-else class="readonly-value"> <div v-else class="readonly-value">
{{ store.projectColumns.find(c => String(c.id) === store.workflowFilters.source_column)?.title || 'Any column' }} {{ store.projectColumns.find(c => String(c.id) === store.workflowFilters.source_column)?.title || locale.anyColumn }}
</div> </div>
</div> </div>
<div class="field" v-if="hasFilter('target_column')"> <div class="field" v-if="hasFilter('target_column')">
<label>When moved to column</label> <label>{{ locale.whenMovedToColumn }}</label>
<select <select
v-if="isInEditMode" v-if="isInEditMode"
v-model="store.workflowFilters.target_column" v-model="store.workflowFilters.target_column"
class="column-select" class="column-select"
> >
<option value="">Any column</option> <option value="">{{ locale.anyColumn }}</option>
<option v-for="column in store.projectColumns" :key="column.id" :value="String(column.id)"> <option v-for="column in store.projectColumns" :key="column.id" :value="String(column.id)">
{{ column.title }} {{ column.title }}
</option> </option>
</select> </select>
<div v-else class="readonly-value"> <div v-else class="readonly-value">
{{ store.projectColumns.find(c => String(c.id) === store.workflowFilters.target_column)?.title || 'Any column' }} {{ store.projectColumns.find(c => String(c.id) === store.workflowFilters.target_column)?.title || locale.anyColumn }}
</div> </div>
</div> </div>
<div class="field" v-if="hasFilter('labels')"> <div class="field" v-if="hasFilter('labels')">
<label>Only if has labels</label> <label>{{ locale.onlyIfHasLabels }}</label>
<div v-if="isInEditMode" class="ui fluid multiple search selection dropdown label-dropdown"> <div v-if="isInEditMode" class="ui fluid multiple search selection dropdown label-dropdown">
<input type="hidden" :value="store.workflowFilters.labels.join(',')"> <input type="hidden" :value="store.workflowFilters.labels.join(',')">
<i class="dropdown icon"></i> <i class="dropdown icon"></i>
<div class="text" :class="{ default: !store.workflowFilters.labels?.length }"> <div class="text" :class="{ default: !store.workflowFilters.labels?.length }">
<span v-if="!store.workflowFilters.labels?.length">Any labels</span> <span v-if="!store.workflowFilters.labels?.length">{{ locale.anyLabel }}</span>
<template v-else> <template v-else>
<span v-for="labelId in store.workflowFilters.labels" :key="labelId" <span v-for="labelId in store.workflowFilters.labels" :key="labelId"
class="ui label" class="ui label"
@ -892,27 +926,27 @@ onUnmounted(() => {
<!-- Actions Section --> <!-- Actions Section -->
<div class="field"> <div class="field">
<label>Actions</label> <label>{{ locale.actions }}</label>
<div class="segment"> <div class="segment">
<div class="field" v-if="hasAction('column')"> <div class="field" v-if="hasAction('column')">
<label>Move to column</label> <label>{{ locale.moveToColumn }}</label>
<select <select
v-if="isInEditMode" v-if="isInEditMode"
v-model="store.workflowActions.column" v-model="store.workflowActions.column"
class="column-select" class="column-select"
> >
<option value="">Select column...</option> <option value="">{{ locale.selectColumn }}</option>
<option v-for="column in store.projectColumns" :key="column.id" :value="String(column.id)"> <option v-for="column in store.projectColumns" :key="column.id" :value="String(column.id)">
{{ column.title }} {{ column.title }}
</option> </option>
</select> </select>
<div v-else class="readonly-value"> <div v-else class="readonly-value">
{{ store.projectColumns.find(c => String(c.id) === store.workflowActions.column)?.title || 'None' }} {{ store.projectColumns.find(c => String(c.id) === store.workflowActions.column)?.title || locale.none }}
</div> </div>
</div> </div>
<div class="field" v-if="hasAction('add_labels')"> <div class="field" v-if="hasAction('add_labels')">
<label>Add labels</label> <label>{{ locale.addLabels }}</label>
<div v-if="isInEditMode" class="ui fluid multiple search selection dropdown label-dropdown"> <div v-if="isInEditMode" class="ui fluid multiple search selection dropdown label-dropdown">
<input type="hidden" :value="store.workflowActions.add_labels.join(',')"> <input type="hidden" :value="store.workflowActions.add_labels.join(',')">
<i class="dropdown icon"></i> <i class="dropdown icon"></i>
@ -948,7 +982,7 @@ onUnmounted(() => {
</div> </div>
<div class="field" v-if="hasAction('remove_labels')"> <div class="field" v-if="hasAction('remove_labels')">
<label>Remove labels</label> <label>{{ locale.removeLabels }}</label>
<div v-if="isInEditMode" class="ui fluid multiple search selection dropdown label-dropdown"> <div v-if="isInEditMode" class="ui fluid multiple search selection dropdown label-dropdown">
<input type="hidden" :value="store.workflowActions.remove_labels.join(',')"> <input type="hidden" :value="store.workflowActions.remove_labels.join(',')">
<i class="dropdown icon"></i> <i class="dropdown icon"></i>
@ -984,20 +1018,20 @@ onUnmounted(() => {
</div> </div>
<div class="field" v-if="hasAction('issue_state')"> <div class="field" v-if="hasAction('issue_state')">
<label for="issue-state-action">Issue state</label> <label for="issue-state-action">{{ locale.issueState }}</label>
<select <select
v-if="isInEditMode" v-if="isInEditMode"
id="issue-state-action" id="issue-state-action"
class="column-select" class="column-select"
v-model="store.workflowActions.issue_state" v-model="store.workflowActions.issue_state"
> >
<option value="">No change</option> <option value="">{{ locale.noChange }}</option>
<option value="close">Close issue</option> <option value="close">{{ locale.closeIssue }}</option>
<option value="reopen">Reopen issue</option> <option value="reopen">{{ locale.reopenIssue }}</option>
</select> </select>
<div v-else class="readonly-value"> <div v-else class="readonly-value">
{{ store.workflowActions.issue_state === 'close' ? 'Close issue' : {{ store.workflowActions.issue_state === 'close' ? locale.closeIssue :
store.workflowActions.issue_state === 'reopen' ? 'Reopen issue' : 'No change' }} store.workflowActions.issue_state === 'reopen' ? locale.reopenIssue : locale.noChange }}
</div> </div>
</div> </div>
</div> </div>

View File

@ -80,10 +80,10 @@ const cloneActions = (actions: WorkflowActionsState): WorkflowActionsState => ({
issue_state: actions.issue_state, issue_state: actions.issue_state,
}); });
export function createWorkflowStore(props: {projectLink: string, eventID: string}) { export function createWorkflowStore(projectLink: string, eventID: string) {
const store = reactive({ const store = reactive({
workflowEvents: [], workflowEvents: [],
selectedItem: props.eventID, selectedItem: eventID,
selectedWorkflow: null, selectedWorkflow: null,
projectColumns: [], projectColumns: [],
projectLabels: [], // Add labels data projectLabels: [], // Add labels data
@ -113,14 +113,14 @@ export function createWorkflowStore(props: {projectLink: string, eventID: string
}, },
async loadEvents() { async loadEvents() {
const response = await GET(`${props.projectLink}/workflows/events`); const response = await GET(`${projectLink}/workflows/events`);
store.workflowEvents = await response.json(); store.workflowEvents = await response.json();
return store.workflowEvents; return store.workflowEvents;
}, },
async loadProjectColumns() { async loadProjectColumns() {
try { try {
const response = await GET(`${props.projectLink}/workflows/columns`); const response = await GET(`${projectLink}/workflows/columns`);
store.projectColumns = await response.json(); store.projectColumns = await response.json();
console.log('[WorkflowStore] Loaded columns:', store.projectColumns); console.log('[WorkflowStore] Loaded columns:', store.projectColumns);
if (store.projectColumns.length > 0) { if (store.projectColumns.length > 0) {
@ -159,7 +159,7 @@ export function createWorkflowStore(props: {projectLink: string, eventID: string
async loadProjectLabels() { async loadProjectLabels() {
try { try {
const response = await GET(`${props.projectLink}/workflows/labels`); const response = await GET(`${projectLink}/workflows/labels`);
store.projectLabels = await response.json(); store.projectLabels = await response.json();
} catch (error) { } catch (error) {
console.error('Failed to load project labels:', error); console.error('Failed to load project labels:', error);
@ -195,7 +195,7 @@ export function createWorkflowStore(props: {projectLink: string, eventID: string
// Send workflow data // Send workflow data
console.info('Sending workflow data:', postData); console.info('Sending workflow data:', postData);
const response = await POST(`${props.projectLink}/workflows/${eventId}`, { const response = await POST(`${projectLink}/workflows/${eventId}`, {
data: postData, data: postData,
headers: { headers: {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
@ -247,7 +247,7 @@ export function createWorkflowStore(props: {projectLink: string, eventID: string
// Update URL to use the new workflow ID // Update URL to use the new workflow ID
if (wasNewWorkflow) { if (wasNewWorkflow) {
const newUrl = `${props.projectLink}/workflows/${store.selectedWorkflow.event_id}`; const newUrl = `${projectLink}/workflows/${store.selectedWorkflow.event_id}`;
window.history.replaceState({eventId: store.selectedWorkflow.event_id}, '', newUrl); window.history.replaceState({eventId: store.selectedWorkflow.event_id}, '', newUrl);
} }
@ -273,7 +273,7 @@ export function createWorkflowStore(props: {projectLink: string, eventID: string
// Use workflow ID for status update // Use workflow ID for status update
const workflowId = store.selectedWorkflow.id; const workflowId = store.selectedWorkflow.id;
const response = await POST(`${props.projectLink}/workflows/${workflowId}/status`, { const response = await POST(`${projectLink}/workflows/${workflowId}/status`, {
data: formData, data: formData,
}); });
@ -312,7 +312,7 @@ export function createWorkflowStore(props: {projectLink: string, eventID: string
try { try {
// Use workflow ID for deletion // Use workflow ID for deletion
const workflowId = store.selectedWorkflow.id; const workflowId = store.selectedWorkflow.id;
const response = await POST(`${props.projectLink}/workflows/${workflowId}/delete`, { const response = await POST(`${projectLink}/workflows/${workflowId}/delete`, {
data: new FormData(), data: new FormData(),
}); });

View File

@ -5,8 +5,54 @@ export async function initProjectWorkflow() {
const workflowDiv = document.querySelector('#project-workflows'); const workflowDiv = document.querySelector('#project-workflows');
if (!workflowDiv) return; if (!workflowDiv) return;
createApp(ProjectWorkflow, { try {
projectLink: workflowDiv.getAttribute('data-project-link'), const locale = {
eventID: workflowDiv.getAttribute('data-event-id'), defaultWorkflows: workflowDiv.getAttribute('data-locale-default-workflows'),
}).mount(workflowDiv); moveToColumn: workflowDiv.getAttribute('data-locale-move-to-column'),
viewWorkflowConfiguration: workflowDiv.getAttribute('data-locale-view-workflow-configuration'),
configureWorkflow: workflowDiv.getAttribute('data-locale-configure-workflow'),
when: workflowDiv.getAttribute('data-locale-when'),
runWhen: workflowDiv.getAttribute('data-locale-run-when'),
filters: workflowDiv.getAttribute('data-locale-filters'),
applyTo: workflowDiv.getAttribute('data-locale-apply-to'),
whenMovedFromColumn: workflowDiv.getAttribute('data-locale-when-moved-from-column'),
whenMovedToColumn: workflowDiv.getAttribute('data-locale-when-moved-to-column'),
onlyIfHasLabels: workflowDiv.getAttribute('data-locale-only-if-has-labels'),
actions: workflowDiv.getAttribute('data-locale-actions'),
addLabels: workflowDiv.getAttribute('data-locale-add-labels'),
removeLabels: workflowDiv.getAttribute('data-locale-remove-labels'),
anyLabel: workflowDiv.getAttribute('data-locale-any-label'),
anyColumn: workflowDiv.getAttribute('data-locale-any-column'),
issueState: workflowDiv.getAttribute('data-locale-issue-state'),
none: workflowDiv.getAttribute('data-locale-none'),
noChange: workflowDiv.getAttribute('data-locale-no-change'),
edit: workflowDiv.getAttribute('data-locale-edit'),
delete: workflowDiv.getAttribute('data-locale-delete'),
save: workflowDiv.getAttribute('data-locale-save'),
clone: workflowDiv.getAttribute('data-locale-clone'),
cancel: workflowDiv.getAttribute('data-locale-cancel'),
disable: workflowDiv.getAttribute('data-locale-disable'),
disabled: workflowDiv.getAttribute('data-locale-disabled'),
enabled: workflowDiv.getAttribute('data-locale-enabled'),
enable: workflowDiv.getAttribute('data-locale-enable'),
issuesAndPullRequests: workflowDiv.getAttribute('data-locale-issues-and-pull-requests'),
issuesOnly: workflowDiv.getAttribute('data-locale-issues-only'),
pullRequestsOnly: workflowDiv.getAttribute('data-locale-pull-requests-only'),
selectColumn: workflowDiv.getAttribute('data-locale-select-column'),
closeIssue: workflowDiv.getAttribute('data-locale-close-issue'),
reopenIssue: workflowDiv.getAttribute('data-locale-reopen-issue'),
};
console.info('locale:', locale);
const View = createApp(ProjectWorkflow, {
projectLink: workflowDiv.getAttribute('data-project-link'),
eventID: workflowDiv.getAttribute('data-event-id'),
locale,
});
View.mount(workflowDiv);
} catch (err) {
console.error('Project Workflow failed to load', err);
workflowDiv.textContent = 'Project Workflow failed to load';
}
} }