-
-
- {{ $t('addNewMember') }}
-
-
- {{ $t('selectMemberOptions') }}
-
-
- {{ $t('importCSV') }}
-
-
- {{ $t('exportCSV') }}
-
-
-
-
- +
-
-
-
-
- {{
- $t('addToEvent')
- }}
- {{ $t('delete') }}
+
+
-
+
{{ $t('addNewMember') }}
+
+
+ {{ $t('selectMemberOptions') }}
+
+
+ {{ $t('importCSV') }}
+
+
+ {{ $t('exportCSV') }}
+
+
+
+
+ +
+
+
+
+
+ {{
+ $t('addToEvent')
+ }}
+ {{ $t('delete') }}
+
+
+
+
+
+
{{ $t('selected') }}: {{ selected.length }}
@@ -121,6 +156,21 @@
/>
+
+
+
+
+
([]);
const openSubmenu = ref(false);
const filter = ref('');
const user = useUserStore();
+const localCompareMembers = ref();
+const selectedColumnFilter = ref('');
+const selectedColumnOptions = ref([]);
+const page = ref('members');
const {
- members,
+ allMembers,
+ filteredMembers,
responsibles,
+ groups,
pagination,
loading,
columns,
getRowClass,
updateMembers,
+ setNewFilter,
isXDaysBeforeAnnualDate,
disableColumns,
exportCsv,
@@ -254,6 +312,7 @@ const {
//load on mounting page
onMounted(() => {
+ page.value = 'members';
if (inProps.addAttendees || inProps.addResponsible) {
selectOption.value = true;
disableColumns(
@@ -265,15 +324,21 @@ onMounted(() => {
'email',
'address',
'phone',
- 'group',
'responsiblePerson',
'firstVisit',
'lastVisit',
);
+ page.value = 'attendance';
}
loading.value = true;
+ localCompareMembers.value = inProps.compareMembers;
+ const defaults = getLocalPageDefaults(page.value);
+ selectedColumnFilter.value = defaults?.filteredColumn || '';
+ selectedColumnOptions.value = defaults?.filteredValue ?? [];
+
+ setNewFilter(selectedColumnFilter.value, ...selectedColumnOptions.value);
appApi
.post('database/open', { dbPath: databaseName.value, create: true })
.then(() => {
@@ -320,6 +385,29 @@ function openUploadDialog() {
uploadDialog.value?.open();
}
+function setColumnOptions(columnName: string) {
+ const values = allMembers.value
+ .map((e) => e[columnName as keyof Member]) // could be undefined
+ .filter((v): v is string | number => v !== null && v !== undefined)
+ .map((v) => String(v));
+
+ const selection = [...new Set(values)];
+
+ // Add special option for missing/null/empty values
+ if (allMembers.value.some((e) => !e[columnName as keyof Member])) {
+ selection.unshift('None');
+ }
+
+ return selection;
+}
+
+async function filterMembers(field: string, ...keys: string[]) {
+ setNewFilter(field, ...keys);
+ console.log(66, page.value);
+ setLocalPageDefaults(page.value, field, keys);
+ await updateMembers();
+}
+
//remove member from database
function removeMember(...removeMembers: Members) {
const memberIds: number[] = [];
@@ -391,6 +479,7 @@ async function addMemberTo() {
}
emit('update-event');
}
+
async function updateMemberLastVisit(members: Members) {
const now = new Date();
@@ -416,6 +505,10 @@ async function updateMemberLastVisit(members: Members) {
}
})
.catch((err) => NotifyResponse(err, 'error'));
+ await updateMembers(localCompareMembers.value, inProps.addResponsible)
+ .then(() => localCompareMembers.value?.push(...members))
+ .catch((err) => NotifyResponse(err, 'error'));
+ emit('update-event');
}
diff --git a/src/vueLib/utils/utils.ts b/src/vueLib/utils/utils.ts
new file mode 100644
index 0000000..a134cc3
--- /dev/null
+++ b/src/vueLib/utils/utils.ts
@@ -0,0 +1,12 @@
+export function updateOrAddObject, K extends keyof T>(
+ arr: T[],
+ obj: T,
+ key: K,
+) {
+ const i = arr.findIndex((o) => o[key] === obj[key]);
+ if (i === -1) {
+ arr.push(obj);
+ return;
+ }
+ arr.splice(i, 1, obj);
+}