1// Copyright (c) 2021-2025 GrayBits LLC 2 3import * as Notification from 'gray_matter/utility/notification' 4import AsyncForm from 'gray_matter/forms/async_form' 5import Confirmation from 'gray_matter/utility/confirmation' 6import axios from 'axios' 7 8export function init(container){ 9 let source = container || document; 10 source.querySelectorAll('.set_item_status form').forEach((e) => { 11 e.confirmation = confirmation; 12 e.postSubmit = updateStatuses; 13 }); 14 source.querySelectorAll('.delete_status').forEach((e) => e.addEventListener('click', removeStatus)); 15} 16 17function confirmation(async_form){ 18 let items = getBatchItemIds(getFormItemId(async_form)); 19 async_form.form.querySelector('input[name="ids"]').value = items.join(','); 20 21 if (items.length > 1){ 22 return 'Are you sure you want to set this status for all selected items?'; 23 } else { 24 return 'Are you sure you want to set this status?'; 25 } 26} 27 28function getFormItemId(async_form){ 29 let form_item = async_form.form.closest('#index tr'); 30 if (!form_item) form_item = async_form.form.closest('.status_container').querySelector('.item_statuses'); 31 32 return form_item.dataset.id; 33} 34 35function getBatchItemIds(row_id){ 36 let batch_item_ids = []; 37 row_id = row_id * 1; 38 document.querySelectorAll('#index tr.selected').forEach((e) => { 39 batch_item_ids.push(e.dataset.id * 1); 40 }); 41 if (batch_item_ids.indexOf(row_id) == -1){ 42 batch_item_ids.push(row_id) 43 } 44 return batch_item_ids; 45} 46 47function updateStatuses(event, async_form, response){ 48 updateInterfaces(response.data, async_form.form.closest('.status_container')); 49} 50 51async function removeStatus(e){ 52 let confirmation_message = 'Are you sure you want to remove this status?' 53 let container = e.target.closest('.status_container'); 54 let statuses = container.querySelector('.item_statuses'); 55 let batch_item_ids = getBatchItemIds(statuses.dataset.id); 56 57 if (batch_item_ids.length > 1){ 58 confirmation_message = 'Are you sure you want to remove this status for all selected items?' 59 } 60 let confirmation = new Confirmation(e.target, confirmation_message, {right: true}); 61 let confirmed = await confirmation.response(); 62 63 if (confirmed){ 64 try{ 65 const response = await axios.delete( 66 `/gray_matter/${statuses.dataset.engine}/${statuses.dataset.type}` + 67 `/items/status/${e.target.dataset.name}/${batch_item_ids.join(',')}`, 68 ); 69 updateInterfaces(response.data, container); 70 } catch(error){ 71 if (error.response && error.response.data.error){ 72 Notification.showError(error.response.data.error); 73 } else { 74 Notification.showError('Could not remove status'); 75 } 76 } 77 } 78} 79 80function updateInterfaces(response, container){ 81 if (document.getElementById('index')){ 82 let ids = Object.keys(response.items); 83 for (let i = 0; i < ids.length; i++){ 84 updateInterface(document.querySelector(`#index tr[data-id="${ids[i]}"] td.status_column`), response.items[ids[i]]); 85 } 86 } else { 87 updateInterface(container, response.items[Object.keys(response.items)[0]]); 88 } 89} 90 91function updateInterface(container, response){ 92 let item_statuses = container.querySelector('.item_statuses'); 93 if (item_statuses){ 94 item_statuses.classList.toggle('empty', !response.statuses); 95 } 96 97 conditionalUpate(container, 'item_statuses', response.statuses); 98 conditionalUpate(container, 'set_item_status', response.set_status); 99 conditionalUpate(container, 'current_statuses', response.current_statuses); 100 let close_button = container.querySelector('.index_statuses button.close'); 101 if (close_button) close_button.click(); 102 setupContainerStatus(container); 103} 104 105function conditionalUpate(container, css_class, content){ 106 let item = container.querySelector('.' + css_class); 107 if (item) item.innerHTML = content; 108} 109 110export function setupContainerStatus(container){ 111 init(container); 112 AsyncForm.initAllInstances(container); 113};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.