PageSourceSearch

https://prattcenter.net/assets/gray_matter/modules/status-83b3d1f4…4e22fa319d4769a6939eb639420218d08ba94d4b.js

js prattcenter.net collected 2026-09-24 18:04:36 UTC 3,926 bytes, 113 lines download raw bytes

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.