Files
2026-06-06 18:43:00 +08:00

221 lines
6.7 KiB
JavaScript

import { ref } from 'vue';
import axios from 'axios';
export function useChapters() {
const loading = ref(false);
const error = ref(null);
const fetchHierarchy = async ({ chapterId = null } = {}) => {
loading.value = true;
error.value = null;
try {
const response = await axios.post('/Chapters/Hierarchy', { chapter_id: chapterId });
return response.data;
} catch (err) {
error.value = 'Failed to load chapter hierarchy.';
console.error(err);
return { chapters: [], current: null, breadcrumb: [] };
} finally {
loading.value = false;
}
};
const fetchMapData = async ({ level = 'region', parentId = null } = {}) => {
loading.value = true;
error.value = null;
try {
const response = await axios.post('/Chapters/MapData', { level, parent_id: parentId });
return response.data;
} catch (err) {
error.value = 'Failed to load map data.';
console.error(err);
return { chapters: [] };
} finally {
loading.value = false;
}
};
const fetchOrgHierarchy = async ({ chapterId = null, island = null } = {}) => {
loading.value = true;
error.value = null;
try {
const response = await axios.post('/Chapters/OrgHierarchy', { chapter_id: chapterId, island });
return response.data;
} catch (err) {
error.value = 'Failed to load organization hierarchy.';
console.error(err);
return { chapters: [], current: null, breadcrumb: [] };
} finally {
loading.value = false;
}
};
const fetchOrgMapData = async ({ level = 'island_group', parentId = null, island = null } = {}) => {
loading.value = true;
error.value = null;
try {
const response = await axios.post('/Chapters/OrgMapData', { level, parent_id: parentId, island });
return response.data;
} catch (err) {
error.value = 'Failed to load organization map data.';
console.error(err);
return { chapters: [] };
} finally {
loading.value = false;
}
};
const fetchMembers = async (chapterId) => {
loading.value = true;
error.value = null;
try {
const response = await axios.post('/Chapters/Members', { chapter_id: chapterId });
return response.data;
} catch (err) {
error.value = 'Failed to load members.';
console.error(err);
return { members: [] };
} finally {
loading.value = false;
}
};
const assignMember = async ({ userHashkey, chapterId, position = null, isManual = true }) => {
try {
const response = await axios.post('/Chapters/Member/Assign', {
user_hashkey: userHashkey,
chapter_id: chapterId,
position,
is_manual: isManual,
});
return response.data;
} catch (err) {
console.error(err);
throw err;
}
};
const removeMember = async (hashkey) => {
try {
const response = await axios.post('/Chapters/Member/Remove', { hashkey });
return response.data;
} catch (err) {
console.error(err);
throw err;
}
};
const fetchPositions = async () => {
try {
const response = await axios.get('/Chapters/Positions');
return response.data.positions ?? [];
} catch (err) {
console.error(err);
return [];
}
};
const syncAutoAssignments = async () => {
try {
const response = await axios.post('/Chapters/SyncAutoAssignments');
return response.data;
} catch (err) {
console.error(err);
throw err;
}
};
const fetchOrgChart = async ({ chapterId = null } = {}) => {
loading.value = true;
error.value = null;
try {
const response = await axios.post('/Chapters/OrgChart', { chapter_id: chapterId });
return response.data;
} catch (err) {
error.value = 'Failed to load org chart.';
console.error(err);
return { own_chapter: null, children: [] };
} finally {
loading.value = false;
}
};
const fetchOfficerScope = async () => {
loading.value = true;
error.value = null;
try {
const response = await axios.post('/Chapters/Officer/Scope', {});
return response.data;
} catch (err) {
error.value = 'Failed to load chapter scope.';
console.error(err);
return { own_chapter: null, child_chapters: [], cooperative: null, eligible_members: [] };
} finally {
loading.value = false;
}
};
const searchMembers = async (query) => {
loading.value = true;
error.value = null;
try {
const response = await axios.post('/Chapters/Members/Search', { query });
return response.data?.members ?? [];
} catch (err) {
error.value = 'Failed to search members.';
console.error(err);
return [];
} finally {
loading.value = false;
}
};
const assignOfficer = async ({ memberUserHashkey, childChapterId, role }) => {
try {
const response = await axios.post('/Chapters/Officer/Assign', {
member_user_hashkey: memberUserHashkey,
child_chapter_id: childChapterId,
role,
});
return response.data;
} catch (err) {
console.error(err);
throw err;
}
};
const createChapter = async ({ name, locationKey, lat = null, lng = null }) => {
try {
const response = await axios.post('/Chapters/Create', {
name,
location_key: locationKey,
lat,
lng,
});
return response.data;
} catch (err) {
console.error(err);
throw err;
}
};
return {
loading,
error,
fetchHierarchy,
fetchMapData,
fetchOrgHierarchy,
fetchOrgMapData,
fetchMembers,
assignMember,
removeMember,
fetchPositions,
syncAutoAssignments,
fetchOrgChart,
fetchOfficerScope,
searchMembers,
assignOfficer,
createChapter,
};
}