diff --git a/routers/web/web.go b/routers/web/web.go index 0c4b145722..9352a51942 100644 --- a/routers/web/web.go +++ b/routers/web/web.go @@ -1049,7 +1049,7 @@ func registerWebRoutes(m *web.Router) { m.Post("/{workflow_id}/status", projects.WorkflowsStatus) m.Post("/{workflow_id}/delete", projects.WorkflowsDelete) }, reqUnitAccess(unit.TypeProjects, perm.AccessModeWrite, true)) - m.Group("", func() { //nolint:dupl // duplicates lines 1421-1441 + m.Group("", func() { m.Get("/new", org.RenderNewProject) m.Post("/new", web.Bind(forms.CreateProjectForm{}), org.NewProjectPost) m.Group("/{id}", func() { @@ -1437,7 +1437,7 @@ func registerWebRoutes(m *web.Router) { m.Group("/{username}/{reponame}/projects", func() { m.Get("", repo.Projects) m.Get("/{id}", repo.ViewProject) - m.Group("", func() { //nolint:dupl // duplicates lines 1034-1054 + m.Group("", func() { m.Get("/new", repo.RenderNewProject) m.Post("/new", web.Bind(forms.CreateProjectForm{}), repo.NewProjectPost) m.Group("/{id}", func() { diff --git a/web_src/js/components/projects/ProjectWorkflow.vue b/web_src/js/components/projects/ProjectWorkflow.vue index 355bd5c182..23bd515945 100644 --- a/web_src/js/components/projects/ProjectWorkflow.vue +++ b/web_src/js/components/projects/ProjectWorkflow.vue @@ -83,14 +83,14 @@ const showCancelButton = computed(() => { return typeof eventId === 'string' && eventId.startsWith('clone-'); }); -const isTemporaryWorkflow = (workflow) => { +const isTemporaryWorkflow = (workflow: any) => { if (!workflow) return false; if (workflow.id > 0) return false; const eventId = typeof workflow.event_id === 'string' ? workflow.event_id : ''; return eventId.startsWith('clone-') || eventId.startsWith('new-'); }; -const removeTemporaryWorkflow = (workflow) => { +const removeTemporaryWorkflow = (workflow: any) => { if (!isTemporaryWorkflow(workflow)) return; const eventId = workflow.event_id; @@ -221,7 +221,7 @@ const deleteWorkflow = async () => { setEditMode(false); }; -const cloneWorkflow = (sourceWorkflow) => { +const cloneWorkflow = (sourceWorkflow: any) => { if (!sourceWorkflow) return; // Generate a unique temporary ID for the cloned workflow @@ -274,7 +274,7 @@ const cloneWorkflow = (sourceWorkflow) => { window.history.pushState({eventId: tempId}, '', newUrl); }; -const selectWorkflowEvent = async (event) => { +const selectWorkflowEvent = async (event: any) => { // Prevent rapid successive clicks if (store.loading) return; @@ -314,32 +314,11 @@ const saveWorkflow = async () => { setEditMode(false); }; -const isWorkflowConfigured = (event) => { +const isWorkflowConfigured = (event: any) => { // Check if the event_id is a number (saved workflow ID) or if it has id > 0 return !Number.isNaN(parseInt(event.event_id)) || (event.id !== undefined && event.id > 0); }; -// Generate filter description for display name -const getFilterDescription = (workflow) => { - if (!workflow.filters || !Array.isArray(workflow.filters) || workflow.filters.length === 0) { - return ''; - } - - const descriptions = []; - for (const filter of workflow.filters) { - if (filter.type === 'issue_type' && filter.value) { - if (filter.value === 'issue') { - descriptions.push('Issues'); - } else if (filter.value === 'pull_request') { - descriptions.push('Pull Requests'); - } - } - // Add more filter types here as needed - } - - return descriptions.length > 0 ? ` (${descriptions.join(', ')})` : ''; -}; - // Get flat list of all workflows - use cached data to prevent frequent recomputation const workflowList = computed(() => { // Use a stable reference to prevent unnecessary DOM updates @@ -355,7 +334,7 @@ const workflowList = computed(() => { })); }); -const createNewWorkflow = (eventType, capabilities, displayName) => { +const createNewWorkflow = (eventType: any, capabilities: any, displayName: any) => { // Store current selection before creating new workflow if (!isInEditMode.value) { previousSelection.value = { @@ -370,8 +349,8 @@ const createNewWorkflow = (eventType, capabilities, displayName) => { event_id: tempId, display_name: displayName, capabilities, - filters: [], - actions: [], + filters: [] as any[], + actions: [] as any[], filter_summary: '', workflow_event: eventType, enabled: true, // Ensure new workflows are enabled by default @@ -385,9 +364,9 @@ const createNewWorkflow = (eventType, capabilities, displayName) => { }; // Add debounce mechanism -let selectTimeout = null; +let selectTimeout: ReturnType | null = null; -const selectWorkflowItem = async (item) => { +const selectWorkflowItem = async (item: any) => { // Prevent rapid successive clicks with debounce if (store.loading || selectTimeout) return; @@ -428,15 +407,15 @@ const hasAvailableFilters = computed(() => { return store.selectedWorkflow?.capabilities?.available_filters?.length > 0; }); -const hasFilter = (filterType) => { +const hasFilter = (filterType: any) => { return store.selectedWorkflow?.capabilities?.available_filters?.includes(filterType); }; -const hasAction = (actionType) => { +const hasAction = (actionType: any) => { return store.selectedWorkflow?.capabilities?.available_actions?.includes(actionType); }; -const getStatusClass = (item) => { +const getStatusClass = (item: any) => { if (!item.isConfigured) { return 'status-inactive'; // Gray dot for unconfigured } @@ -449,7 +428,7 @@ const getStatusClass = (item) => { return 'status-active'; // Green dot for enabled }; -const isItemSelected = (item) => { +const isItemSelected = (item: any) => { if (!store.selectedItem) return false; if (item.isConfigured || item.id === 0) { @@ -461,7 +440,7 @@ const isItemSelected = (item) => { }; // Get display name for workflow with numbering for same types -const getWorkflowDisplayName = (item, index) => { +const getWorkflowDisplayName = (item: any, _index: any) => { const list = workflowList.value; // Find all workflows of the same type @@ -486,12 +465,12 @@ const getWorkflowDisplayName = (item, index) => { }; // Toggle label selection for add_labels, remove_labels, or filter_labels -const toggleLabel = (type, labelId) => { +const toggleLabel = (type: string, labelId: any) => { let labels; if (type === 'filter_labels') { labels = store.workflowFilters.labels; } else { - labels = store.workflowActions[type]; + labels = (store.workflowActions as any)[type]; } const index = labels.indexOf(labelId); if (index > -1) { @@ -502,7 +481,7 @@ const toggleLabel = (type, labelId) => { }; // Calculate text color based on background color for better contrast -const getLabelTextColor = (hexColor) => { +const getLabelTextColor = (hexColor: any) => { if (!hexColor) return '#000'; // Remove # if present const color = hexColor.replace('#', ''); @@ -566,7 +545,7 @@ onMounted(async () => { await nextTick(); const workflowItemsContainer = elRoot.value.querySelector('.workflow-items'); if (workflowItemsContainer) { - workflowClickHandler = (e) => { + workflowClickHandler = (e: any) => { const workflowItem = e.target.closest('.workflow-item'); if (workflowItem) { e.preventDefault(); @@ -638,7 +617,7 @@ onMounted(async () => { }); // Define popstateHandler at component level -const popstateHandler = (e) => { +const popstateHandler = (e: any) => { if (e.state?.eventId) { // Handle browser back/forward navigation const event = store.workflowEvents.find((ev) => ev.event_id === e.state.eventId); @@ -658,7 +637,7 @@ const popstateHandler = (e) => { }; // Store reference to cleanup event listener -let workflowClickHandler = null; +let workflowClickHandler: ((e: any) => void) | null = null; onUnmounted(() => { // Clean up resources @@ -697,10 +676,8 @@ onUnmounted(() => {
- + +
@@ -886,22 +863,26 @@ onUnmounted(() => {