# Voile v0.1.23 - Table of Contents

Voile — a GLAM (Gallery, Library, Archive, Museum) management system built on Phoenix.

## Pages

- [Voile, the Magic Library](readme.md)
- [Changelog](changelog.md)

## Modules

- [CSVParser](CSVParser.md)
- [Client.Storage](Client.Storage.md): Main storage interface that delegates to configured storage adapter.
- [Client.Storage.AWSHTTPClient](Client.Storage.AWSHTTPClient.md): HTTP client adapter for AWS SDK that uses Req instead of hackney.
- [Client.Storage.Behaviour](Client.Storage.Behaviour.md): Behaviour for storage adapters.

- [Client.Storage.Local](Client.Storage.Local.md): Local filesystem storage adapter.

- [Client.Storage.S3](Client.Storage.S3.md): S3-compatible storage adapter (works with AWS S3, Backblaze B2, MinIO, etc.)
- [Client.Xendit](Client.Xendit.md): Client for interacting with Xendit Payment Gateway API.
Primarily uses the Payment Link API for fine payments.
- [Voile](Voile.md): Voile keeps the contexts that define your domain
and business logic.
- [Voile.Analytics.Dashboard](Voile.Analytics.Dashboard.md): Dashboard analytics context for retrieving GLAM system statistics.

- [Voile.Analytics.SearchAnalytics](Voile.Analytics.SearchAnalytics.md): Analytics module for tracking search patterns and usage statistics.
Provides insights into user search behavior and popular content.

- [Voile.Catalog.AttachmentAccess](Voile.Catalog.AttachmentAccess.md): Context module for handling attachment access control.
Provides functions to check permissions, manage access lists, and handle embargos.

- [Voile.Catalog.CollectionCsvImporter](Voile.Catalog.CollectionCsvImporter.md): Simplified CSV importer for collections with dynamic property columns.
- [Voile.Clearance](Voile.Clearance.md): Context for managing clearance letters (Surat Keterangan Bebas Perpustakaan).
- [Voile.ExternalBookSearch](Voile.ExternalBookSearch.md): External book search module that aggregates results from OpenLibrary, Google Books, and OpenAlex.
- [Voile.ExternalBookSearch.Book](Voile.ExternalBookSearch.Book.md): External book data structure.

- [Voile.ExternalBookSearch.GoogleBooks](Voile.ExternalBookSearch.GoogleBooks.md): Google Books API adapter for book search.

- [Voile.ExternalBookSearch.OpenAlex](Voile.ExternalBookSearch.OpenAlex.md): OpenAlex API adapter for book search.

- [Voile.ExternalBookSearch.OpenLibrary](Voile.ExternalBookSearch.OpenLibrary.md): OpenLibrary API adapter for book search.

- [Voile.GLAM.CollectionHelper](Voile.GLAM.CollectionHelper.md): Helper functions for working with GLAM collections and curator permissions.
- [Voile.Hooks](Voile.Hooks.md): Action and filter hook system for Voile plugins.
- [Voile.Mailer](Voile.Mailer.md)
- [Voile.Mailer.GmailApiAdapter](Voile.Mailer.GmailApiAdapter.md): Custom Swoosh adapter for Gmail API using OAuth2 authentication.
- [Voile.Mailer.GmailAuth](Voile.Mailer.GmailAuth.md): Helper module for Gmail OAuth2 authentication flow.
- [Voile.Migration.BiblioImporter](Voile.Migration.BiblioImporter.md): Imports bibliography/collection data from CSV files with optimized streaming and batch processing.
- [Voile.Migration.Common](Voile.Migration.Common.md): Common utilities and helpers for data migration.

- [Voile.Migration.DataSource](Voile.Migration.DataSource.md): Abstraction layer for data sources (CSV files or MySQL database).
- [Voile.Migration.DebugBiblioImport](Voile.Migration.DebugBiblioImport.md): Debug script to check which biblio records from CSV are missing from database

- [Voile.Migration.FineImporter](Voile.Migration.FineImporter.md): Imports fines data from CSV files to lib_fines table.
- [Voile.Migration.ItemImporter](Voile.Migration.ItemImporter.md): Imports item data from CSV files with optimized streaming and batch processing.
- [Voile.Migration.LeftoverBiblioImporter](Voile.Migration.LeftoverBiblioImporter.md): Imports leftover bibliography/collection data for items that couldn't be imported.
- [Voile.Migration.LeftoverItemImporter](Voile.Migration.LeftoverItemImporter.md): Imports leftover item data from a CSV list of item_codes that were not imported initially.
- [Voile.Migration.LoanHistoryImporter](Voile.Migration.LoanHistoryImporter.md): Imports loan history data from CSV files to lib_circulation_history table.
- [Voile.Migration.LoanImporter](Voile.Migration.LoanImporter.md): Imports loan data from CSV files to lib_transactions table.
- [Voile.Migration.MasterImporter](Voile.Migration.MasterImporter.md): Imports master data including authors/creators and publishers from CSV files with optimized streaming and batch processing.
- [Voile.Migration.MemberImporter](Voile.Migration.MemberImporter.md): Imports member data from CSV files with optimized streaming and batch processing.
- [Voile.Migration.MySQLAdapter](Voile.Migration.MySQLAdapter.md): MySQL/MariaDB database adapter for reading SLiMS data directly from MySQL or MariaDB database.
- [Voile.Migration.PerformanceTest](Voile.Migration.PerformanceTest.md): Performance testing utilities for migration importers.

- [Voile.Migration.UserImporter](Voile.Migration.UserImporter.md): Imports user data from CSV files with optimized streaming and batch processing.
- [Voile.Migration.Validator](Voile.Migration.Validator.md): Validation script to check the migration results and data integrity.

- [Voile.Notifications.EmailQueue](Voile.Notifications.EmailQueue.md): Email queue for sending emails with configurable delays to avoid spam filters.
- [Voile.Notifications.LoanReminderEmail](Voile.Notifications.LoanReminderEmail.md): Email templates for loan due date reminders.
Generates and sends reminder emails to members about upcoming due dates.

- [Voile.Notifications.LoanReminderNotifier](Voile.Notifications.LoanReminderNotifier.md): Handles broadcasting and subscribing to loan due date reminder notifications.
Members get notified via PubSub when they have loans due soon.
- [Voile.Notifications.ReservationNotifier](Voile.Notifications.ReservationNotifier.md): Handles broadcasting and subscribing to reservation notifications.
Staff and admin users can subscribe to get notified when members request reservations.

- [Voile.OaiPmh](Voile.OaiPmh.md): Context module for OAI-PMH (Open Archives Initiative Protocol for Metadata Harvesting) v2.0.
- [Voile.OaiPmh.XmlBuilder](Voile.OaiPmh.XmlBuilder.md): Builds XML responses for OAI-PMH protocol requests.
Follows OAI-PMH v2.0 specification for XML structure.

- [Voile.Plugin](Voile.Plugin.md): The behaviour that every Voile plugin must implement.
- [Voile.Plugin.Migrator](Voile.Plugin.Migrator.md): Macro that generates a Migrator for a plugin.
- [Voile.PluginManager](Voile.PluginManager.md): Manages the full lifecycle of plugins in Voile.
- [Voile.PluginRecord](Voile.PluginRecord.md): Persists the state of each plugin installation.
Allows Voile to know which plugins are installed and active
across server restarts.

- [Voile.Plugins](Voile.Plugins.md): Context for managing plugin records in the Voile database.
- [Voile.PromEx](Voile.PromEx.md)
- [Voile.RateLimiter](Voile.RateLimiter.md): Rate limiter using Hammer 7.x with ETS backend.

- [Voile.Release](Voile.Release.md): Used for executing DB release tasks when run in production without Mix
installed.

- [Voile.Repo](Voile.Repo.md)
- [Voile.Schema.Accounts](Voile.Schema.Accounts.md): The Accounts context.

- [Voile.Schema.Accounts.AuditLog](Voile.Schema.Accounts.AuditLog.md)
- [Voile.Schema.Accounts.CollectionPermission](Voile.Schema.Accounts.CollectionPermission.md)
- [Voile.Schema.Accounts.Permission](Voile.Schema.Accounts.Permission.md)
- [Voile.Schema.Accounts.Role](Voile.Schema.Accounts.Role.md)
- [Voile.Schema.Accounts.RolePermission](Voile.Schema.Accounts.RolePermission.md)
- [Voile.Schema.Accounts.Scope](Voile.Schema.Accounts.Scope.md): Defines the scope of the caller to be used throughout the app.
- [Voile.Schema.Accounts.User](Voile.Schema.Accounts.User.md)
- [Voile.Schema.Accounts.UserNotifier](Voile.Schema.Accounts.UserNotifier.md)
- [Voile.Schema.Accounts.UserPermission](Voile.Schema.Accounts.UserPermission.md)
- [Voile.Schema.Accounts.UserRoleAssignment](Voile.Schema.Accounts.UserRoleAssignment.md)
- [Voile.Schema.Accounts.UserToken](Voile.Schema.Accounts.UserToken.md)
- [Voile.Schema.Catalog](Voile.Schema.Catalog.md): The Catalog context.

- [Voile.Schema.Catalog.Attachment](Voile.Schema.Catalog.Attachment.md)
- [Voile.Schema.Catalog.AttachmentRoleAccess](Voile.Schema.Catalog.AttachmentRoleAccess.md): Schema for role-based access control on attachments.
Links attachments to roles that can access them when access_level is "limited".

- [Voile.Schema.Catalog.AttachmentUserAccess](Voile.Schema.Catalog.AttachmentUserAccess.md): Schema for user-specific access control on attachments.
Links attachments to specific users that can access them when access_level is "limited".

- [Voile.Schema.Catalog.Collection](Voile.Schema.Catalog.Collection.md)
- [Voile.Schema.Catalog.CollectionField](Voile.Schema.Catalog.CollectionField.md)
- [Voile.Schema.Catalog.Item](Voile.Schema.Catalog.Item.md)
- [Voile.Schema.Catalog.ItemFieldValue](Voile.Schema.Catalog.ItemFieldValue.md)
- [Voile.Schema.Catalog.TransferRequest](Voile.Schema.Catalog.TransferRequest.md)
- [Voile.Schema.Library.Circulation](Voile.Schema.Library.Circulation.md)
- [Voile.Schema.Library.CirculationHistory](Voile.Schema.Library.CirculationHistory.md)
- [Voile.Schema.Library.ClearanceLetter](Voile.Schema.Library.ClearanceLetter.md)
- [Voile.Schema.Library.Feats](Voile.Schema.Library.Feats.md): The Library Features context.
- [Voile.Schema.Library.Fine](Voile.Schema.Library.Fine.md)
- [Voile.Schema.Library.LoanRuleResolver](Voile.Schema.Library.LoanRuleResolver.md): Resolves loan rules with proper precedence:
1. Node-level rules (if override_loan_rules is true)
2. Member type rules
3. System defaults
- [Voile.Schema.Library.Payment](Voile.Schema.Library.Payment.md): Schema for library fine payments via payment gateway (Xendit).

- [Voile.Schema.Library.ReadOnSpot](Voile.Schema.Library.ReadOnSpot.md)
- [Voile.Schema.Library.Requisition](Voile.Schema.Library.Requisition.md)
- [Voile.Schema.Library.Reservation](Voile.Schema.Library.Reservation.md)
- [Voile.Schema.Library.Transaction](Voile.Schema.Library.Transaction.md)
- [Voile.Schema.Master](Voile.Schema.Master.md): The Master context.

- [Voile.Schema.Master.Creator](Voile.Schema.Master.Creator.md)
- [Voile.Schema.Master.Frequency](Voile.Schema.Master.Frequency.md)
- [Voile.Schema.Master.Location](Voile.Schema.Master.Location.md)
- [Voile.Schema.Master.MemberType](Voile.Schema.Master.MemberType.md)
- [Voile.Schema.Master.Places](Voile.Schema.Master.Places.md)
- [Voile.Schema.Master.Publishers](Voile.Schema.Master.Publishers.md)
- [Voile.Schema.Master.Topic](Voile.Schema.Master.Topic.md)
- [Voile.Schema.Metadata](Voile.Schema.Metadata.md): The Metadata context.

- [Voile.Schema.Metadata.Property](Voile.Schema.Metadata.Property.md)
- [Voile.Schema.Metadata.ResourceClass](Voile.Schema.Metadata.ResourceClass.md)
- [Voile.Schema.Metadata.ResourceTemplate](Voile.Schema.Metadata.ResourceTemplate.md)
- [Voile.Schema.Metadata.ResourceTemplateProperty](Voile.Schema.Metadata.ResourceTemplateProperty.md)
- [Voile.Schema.Metadata.Vocabulary](Voile.Schema.Metadata.Vocabulary.md)
- [Voile.Schema.Search](Voile.Schema.Search.md): The Search context for handling search operations across the application.
Provides search functionality for both librarians and patrons with role-based filtering.

- [Voile.Schema.StockOpname](Voile.Schema.StockOpname.md): The StockOpname context for inventory checking functionality.
- [Voile.Schema.StockOpname.Item](Voile.Schema.StockOpname.Item.md)
- [Voile.Schema.StockOpname.LibrarianAssignment](Voile.Schema.StockOpname.LibrarianAssignment.md)
- [Voile.Schema.StockOpname.Notifier](Voile.Schema.StockOpname.Notifier.md): Delivers notifications for stock opname events.

- [Voile.Schema.StockOpname.Session](Voile.Schema.StockOpname.Session.md)
- [Voile.Schema.System](Voile.Schema.System.md): The System context.

- [Voile.Schema.System.CollectionLog](Voile.Schema.System.CollectionLog.md)
- [Voile.Schema.System.LibHoliday](Voile.Schema.System.LibHoliday.md)
- [Voile.Schema.System.LibHolidays](Voile.Schema.System.LibHolidays.md): Context module for managing library holidays and weekly schedules for business day calculations.
- [Voile.Schema.System.Node](Voile.Schema.System.Node.md)
- [Voile.Schema.System.Setting](Voile.Schema.System.Setting.md)
- [Voile.Schema.System.SystemLog](Voile.Schema.System.SystemLog.md)
- [Voile.Schema.System.UserApiToken](Voile.Schema.System.UserApiToken.md)
- [Voile.Schema.System.VisitorLog](Voile.Schema.System.VisitorLog.md)
- [Voile.Schema.System.VisitorSurvey](Voile.Schema.System.VisitorSurvey.md)
- [Voile.Search.Collections](Voile.Search.Collections.md): Search context for collections with GLAM categorization support.
Handles autocomplete suggestions and search functionality.

- [Voile.Task.Catalog.Collection](Voile.Task.Catalog.Collection.md): Task module for Collection-related business logic and data operations.

- [Voile.Task.Catalog.Items](Voile.Task.Catalog.Items.md): Task module for Items-related business logic and data operations.

- [Voile.Task.LoanReminderScheduler](Voile.Task.LoanReminderScheduler.md): Scheduled task that checks for loans due soon and sends reminders.
- [Voile.Task.SuspensionExpiryScheduler](Voile.Task.SuspensionExpiryScheduler.md): Scheduled task that automatically unsuspends users when their suspension period ends.
- [Voile.Utils.CollectionLogger](Voile.Utils.CollectionLogger.md): Audit logging utilities for Collection operations.
- [Voile.Utils.DateHelper](Voile.Utils.DateHelper.md): Helper functions for date and time formatting and conversion across the application.
Enhanced with Indonesian localization and country-specific formatting.

- [Voile.Utils.ItemHelper](Voile.Utils.ItemHelper.md)
- [Voile.Utils.SearchHelper](Voile.Utils.SearchHelper.md): Helper functions for search functionality across the application

- [VoileWeb](VoileWeb.md): The entrypoint for defining your web interface, such
as controllers, components, channels, and so on.
- [VoileWeb.API.ErrorJSON](VoileWeb.API.ErrorJSON.md)
- [VoileWeb.API.FallbackController](VoileWeb.API.FallbackController.md)
- [VoileWeb.API.InfoController](VoileWeb.API.InfoController.md)
- [VoileWeb.API.V1.Circulation.CirculationApiController](VoileWeb.API.V1.Circulation.CirculationApiController.md)
- [VoileWeb.API.V1.Circulation.CirculationApiJSON](VoileWeb.API.V1.Circulation.CirculationApiJSON.md)
- [VoileWeb.API.V1.CirculationHistory.CirculationHistoryApiController](VoileWeb.API.V1.CirculationHistory.CirculationHistoryApiController.md)
- [VoileWeb.API.V1.CirculationHistory.CirculationHistoryApiJSON](VoileWeb.API.V1.CirculationHistory.CirculationHistoryApiJSON.md)
- [VoileWeb.API.V1.CollectionTypes.CollectionTypeApiController](VoileWeb.API.V1.CollectionTypes.CollectionTypeApiController.md)
- [VoileWeb.API.V1.CollectionTypes.CollectionTypeApiJSON](VoileWeb.API.V1.CollectionTypes.CollectionTypeApiJSON.md)
- [VoileWeb.API.V1.Collections.CollectionApiController](VoileWeb.API.V1.Collections.CollectionApiController.md)
- [VoileWeb.API.V1.Collections.CollectionApiJSON](VoileWeb.API.V1.Collections.CollectionApiJSON.md)
- [VoileWeb.API.V1.Fines.FineApiController](VoileWeb.API.V1.Fines.FineApiController.md)
- [VoileWeb.API.V1.Fines.FineApiJSON](VoileWeb.API.V1.Fines.FineApiJSON.md)
- [VoileWeb.API.V1.Items.ItemApiController](VoileWeb.API.V1.Items.ItemApiController.md)
- [VoileWeb.API.V1.Items.ItemApiJSON](VoileWeb.API.V1.Items.ItemApiJSON.md)
- [VoileWeb.API.V1.Unit.UnitApiController](VoileWeb.API.V1.Unit.UnitApiController.md)
- [VoileWeb.API.V1.Unit.UnitApiJSON](VoileWeb.API.V1.Unit.UnitApiJSON.md)
- [VoileWeb.API.V1.UserApiTokenController](VoileWeb.API.V1.UserApiTokenController.md)
- [VoileWeb.API.V1.UserApiTokenJson](VoileWeb.API.V1.UserApiTokenJson.md)
- [VoileWeb.API.V1.Users.UserApiController](VoileWeb.API.V1.Users.UserApiController.md)
- [VoileWeb.API.V1.Users.UserApiJSON](VoileWeb.API.V1.Users.UserApiJSON.md)
- [VoileWeb.Api.ChangesetJSON](VoileWeb.Api.ChangesetJSON.md)
- [VoileWeb.Auth.Authorization](VoileWeb.Auth.Authorization.md): Authorization module for checking user permissions in the Voile application.

- [VoileWeb.Auth.ControllerHelpers](VoileWeb.Auth.ControllerHelpers.md): Helper functions for authorization in Phoenix controllers.

- [VoileWeb.Auth.GLAMAuthorization](VoileWeb.Auth.GLAMAuthorization.md): GLAM-specific authorization helpers for Gallery, Library, Archive, and Museum curators.
- [VoileWeb.Auth.LiveHelpers](VoileWeb.Auth.LiveHelpers.md): Helper functions for authorization in Phoenix LiveView.

- [VoileWeb.Auth.PermissionManager](VoileWeb.Auth.PermissionManager.md): Module for managing permissions and roles in the system.
Provides functions to create, update, and query permissions and roles.

- [VoileWeb.Auth.StockOpnameAuthorization](VoileWeb.Auth.StockOpnameAuthorization.md): Authorization helpers specific to Stock Opname functionality.

- [VoileWeb.Collection.AttachmentController.Download](VoileWeb.Collection.AttachmentController.Download.md)
- [VoileWeb.Components.ImageUpload](VoileWeb.Components.ImageUpload.md)
- [VoileWeb.Components.LabelComponents](VoileWeb.Components.LabelComponents.md): Label printing components for library items

- [VoileWeb.Components.SearchBar](VoileWeb.Components.SearchBar.md): A simple search bar component that matches the Voile dashboard styling

- [VoileWeb.Components.SearchWidget](VoileWeb.Components.SearchWidget.md): Reusable search widget component for embedding in other pages

- [VoileWeb.Components.VirtualKeyboard](VoileWeb.Components.VirtualKeyboard.md)
- [VoileWeb.CoreComponents](VoileWeb.CoreComponents.md): Provides core UI components.
- [VoileWeb.Dashboard.Catalog.AssetVault.Index](VoileWeb.Dashboard.Catalog.AssetVault.Index.md)
- [VoileWeb.Dashboard.Catalog.Attachment.AccessComponent](VoileWeb.Dashboard.Catalog.Attachment.AccessComponent.md)
- [VoileWeb.Dashboard.Catalog.Attachment.Index](VoileWeb.Dashboard.Catalog.Attachment.Index.md)
- [VoileWeb.Dashboard.Catalog.CollectionLive.Attachments](VoileWeb.Dashboard.Catalog.CollectionLive.Attachments.md)
- [VoileWeb.Dashboard.Catalog.CollectionLive.FormCollectionHelper](VoileWeb.Dashboard.Catalog.CollectionLive.FormCollectionHelper.md)
- [VoileWeb.Dashboard.Catalog.CollectionLive.FormComponent](VoileWeb.Dashboard.Catalog.CollectionLive.FormComponent.md)
- [VoileWeb.Dashboard.Catalog.CollectionLive.Import](VoileWeb.Dashboard.Catalog.CollectionLive.Import.md)
- [VoileWeb.Dashboard.Catalog.CollectionLive.ImportExport](VoileWeb.Dashboard.Catalog.CollectionLive.ImportExport.md): Combined import / export LiveView for collections.
- [VoileWeb.Dashboard.Catalog.CollectionLive.Index](VoileWeb.Dashboard.Catalog.CollectionLive.Index.md)
- [VoileWeb.Dashboard.Catalog.CollectionLive.Review](VoileWeb.Dashboard.Catalog.CollectionLive.Review.md)
- [VoileWeb.Dashboard.Catalog.CollectionLive.Show](VoileWeb.Dashboard.Catalog.CollectionLive.Show.md)
- [VoileWeb.Dashboard.Catalog.CollectionLive.Submitted](VoileWeb.Dashboard.Catalog.CollectionLive.Submitted.md)
- [VoileWeb.Dashboard.Catalog.CollectionLive.TreeComponents](VoileWeb.Dashboard.Catalog.CollectionLive.TreeComponents.md)
- [VoileWeb.Dashboard.Catalog.Components.AttachmentUpload](VoileWeb.Dashboard.Catalog.Components.AttachmentUpload.md)
- [VoileWeb.Dashboard.Catalog.Index](VoileWeb.Dashboard.Catalog.Index.md)
- [VoileWeb.Dashboard.Catalog.ItemLive.FormComponent](VoileWeb.Dashboard.Catalog.ItemLive.FormComponent.md)
- [VoileWeb.Dashboard.Catalog.ItemLive.Index](VoileWeb.Dashboard.Catalog.ItemLive.Index.md)
- [VoileWeb.Dashboard.Catalog.ItemLive.Labels](VoileWeb.Dashboard.Catalog.ItemLive.Labels.md)
- [VoileWeb.Dashboard.Catalog.ItemLive.Show](VoileWeb.Dashboard.Catalog.ItemLive.Show.md)
- [VoileWeb.Dashboard.Catalog.TransferRequestLive.FormComponent](VoileWeb.Dashboard.Catalog.TransferRequestLive.FormComponent.md)
- [VoileWeb.Dashboard.Catalog.TransferRequestLive.Index](VoileWeb.Dashboard.Catalog.TransferRequestLive.Index.md)
- [VoileWeb.Dashboard.Catalog.TransferRequestLive.Show](VoileWeb.Dashboard.Catalog.TransferRequestLive.Show.md)
- [VoileWeb.Dashboard.Glam.Archive.Index](VoileWeb.Dashboard.Glam.Archive.Index.md)
- [VoileWeb.Dashboard.Glam.Gallery.Index](VoileWeb.Dashboard.Glam.Gallery.Index.md)
- [VoileWeb.Dashboard.Glam.Index](VoileWeb.Dashboard.Glam.Index.md)
- [VoileWeb.Dashboard.Glam.Library.Circulation.CirculationHistory.Index](VoileWeb.Dashboard.Glam.Library.Circulation.CirculationHistory.Index.md)
- [VoileWeb.Dashboard.Glam.Library.Circulation.CirculationHistory.Show](VoileWeb.Dashboard.Glam.Library.Circulation.CirculationHistory.Show.md)
- [VoileWeb.Dashboard.Glam.Library.Circulation.Components](VoileWeb.Dashboard.Glam.Library.Circulation.Components.md): Shared components for the circulation dashboard.

- [VoileWeb.Dashboard.Glam.Library.Circulation.Fine.Index](VoileWeb.Dashboard.Glam.Library.Circulation.Fine.Index.md)
- [VoileWeb.Dashboard.Glam.Library.Circulation.Fine.Show](VoileWeb.Dashboard.Glam.Library.Circulation.Fine.Show.md)
- [VoileWeb.Dashboard.Glam.Library.Circulation.Helpers](VoileWeb.Dashboard.Glam.Library.Circulation.Helpers.md): Helper functions for the circulation dashboard components.

- [VoileWeb.Dashboard.Glam.Library.Circulation.Index](VoileWeb.Dashboard.Glam.Library.Circulation.Index.md)
- [VoileWeb.Dashboard.Glam.Library.Circulation.LoanReminderLive](VoileWeb.Dashboard.Glam.Library.Circulation.LoanReminderLive.md): LiveView for librarians to manually send loan reminders to members.
- [VoileWeb.Dashboard.Glam.Library.Circulation.Report](VoileWeb.Dashboard.Glam.Library.Circulation.Report.md)
- [VoileWeb.Dashboard.Glam.Library.Circulation.Requisition.Index](VoileWeb.Dashboard.Glam.Library.Circulation.Requisition.Index.md)
- [VoileWeb.Dashboard.Glam.Library.Circulation.Requisition.Show](VoileWeb.Dashboard.Glam.Library.Circulation.Requisition.Show.md)
- [VoileWeb.Dashboard.Glam.Library.Circulation.Reservation.Index](VoileWeb.Dashboard.Glam.Library.Circulation.Reservation.Index.md)
- [VoileWeb.Dashboard.Glam.Library.Circulation.Reservation.Show](VoileWeb.Dashboard.Glam.Library.Circulation.Reservation.Show.md)
- [VoileWeb.Dashboard.Glam.Library.Circulation.Transaction.Index](VoileWeb.Dashboard.Glam.Library.Circulation.Transaction.Index.md)
- [VoileWeb.Dashboard.Glam.Library.Circulation.Transaction.Show](VoileWeb.Dashboard.Glam.Library.Circulation.Transaction.Show.md)
- [VoileWeb.Dashboard.Glam.Library.Index](VoileWeb.Dashboard.Glam.Library.Index.md)
- [VoileWeb.Dashboard.Glam.Library.Ledger.Index](VoileWeb.Dashboard.Glam.Library.Ledger.Index.md)
- [VoileWeb.Dashboard.Glam.Library.Ledger.Transact](VoileWeb.Dashboard.Glam.Library.Ledger.Transact.md)
- [VoileWeb.Dashboard.Glam.Library.ReadOnSpotLive.Add](VoileWeb.Dashboard.Glam.Library.ReadOnSpotLive.Add.md)
- [VoileWeb.Dashboard.Glam.Library.ReadOnSpotLive.Index](VoileWeb.Dashboard.Glam.Library.ReadOnSpotLive.Index.md)
- [VoileWeb.Dashboard.Glam.Library.ReadOnSpotLive.Report](VoileWeb.Dashboard.Glam.Library.ReadOnSpotLive.Report.md)
- [VoileWeb.Dashboard.Glam.Library.ReadOnSpotLive.ReportDetail](VoileWeb.Dashboard.Glam.Library.ReadOnSpotLive.ReportDetail.md)
- [VoileWeb.Dashboard.Glam.Library.Requisition.Index](VoileWeb.Dashboard.Glam.Library.Requisition.Index.md)
- [VoileWeb.Dashboard.Glam.Library.Requisition.Show](VoileWeb.Dashboard.Glam.Library.Requisition.Show.md)
- [VoileWeb.Dashboard.Glam.Museum.Index](VoileWeb.Dashboard.Glam.Museum.Index.md)
- [VoileWeb.Dashboard.Master.CreatorLive.FormComponent](VoileWeb.Dashboard.Master.CreatorLive.FormComponent.md)
- [VoileWeb.Dashboard.Master.CreatorLive.Index](VoileWeb.Dashboard.Master.CreatorLive.Index.md)
- [VoileWeb.Dashboard.Master.CreatorLive.Show](VoileWeb.Dashboard.Master.CreatorLive.Show.md)
- [VoileWeb.Dashboard.Master.FrequencyLive.Edit](VoileWeb.Dashboard.Master.FrequencyLive.Edit.md)
- [VoileWeb.Dashboard.Master.FrequencyLive.FormComponent](VoileWeb.Dashboard.Master.FrequencyLive.FormComponent.md)
- [VoileWeb.Dashboard.Master.FrequencyLive.Index](VoileWeb.Dashboard.Master.FrequencyLive.Index.md)
- [VoileWeb.Dashboard.Master.LocationsLive.Edit](VoileWeb.Dashboard.Master.LocationsLive.Edit.md)
- [VoileWeb.Dashboard.Master.LocationsLive.FormComponent](VoileWeb.Dashboard.Master.LocationsLive.FormComponent.md)
- [VoileWeb.Dashboard.Master.LocationsLive.Index](VoileWeb.Dashboard.Master.LocationsLive.Index.md)
- [VoileWeb.Dashboard.Master.MasterLive](VoileWeb.Dashboard.Master.MasterLive.md)
- [VoileWeb.Dashboard.Master.MemberTypeLive.Edit](VoileWeb.Dashboard.Master.MemberTypeLive.Edit.md)
- [VoileWeb.Dashboard.Master.MemberTypeLive.FormComponent](VoileWeb.Dashboard.Master.MemberTypeLive.FormComponent.md)
- [VoileWeb.Dashboard.Master.MemberTypeLive.Index](VoileWeb.Dashboard.Master.MemberTypeLive.Index.md)
- [VoileWeb.Dashboard.Master.PlacesLive.Edit](VoileWeb.Dashboard.Master.PlacesLive.Edit.md)
- [VoileWeb.Dashboard.Master.PlacesLive.FormComponent](VoileWeb.Dashboard.Master.PlacesLive.FormComponent.md)
- [VoileWeb.Dashboard.Master.PlacesLive.Index](VoileWeb.Dashboard.Master.PlacesLive.Index.md)
- [VoileWeb.Dashboard.Master.PublisherLive.FormComponent](VoileWeb.Dashboard.Master.PublisherLive.FormComponent.md)
- [VoileWeb.Dashboard.Master.PublisherLive.Index](VoileWeb.Dashboard.Master.PublisherLive.Index.md)
- [VoileWeb.Dashboard.Master.PublisherLive.Show](VoileWeb.Dashboard.Master.PublisherLive.Show.md)
- [VoileWeb.Dashboard.Master.TopicLive.Edit](VoileWeb.Dashboard.Master.TopicLive.Edit.md)
- [VoileWeb.Dashboard.Master.TopicLive.FormComponent](VoileWeb.Dashboard.Master.TopicLive.FormComponent.md)
- [VoileWeb.Dashboard.Master.TopicLive.Index](VoileWeb.Dashboard.Master.TopicLive.Index.md)
- [VoileWeb.Dashboard.Members.Clearance.Index](VoileWeb.Dashboard.Members.Clearance.Index.md)
- [VoileWeb.Dashboard.Members.Clearance.Settings](VoileWeb.Dashboard.Members.Clearance.Settings.md)
- [VoileWeb.Dashboard.Members.Clearance.Show](VoileWeb.Dashboard.Members.Clearance.Show.md)
- [VoileWeb.Dashboard.Members.Clearance.Verify](VoileWeb.Dashboard.Members.Clearance.Verify.md)
- [VoileWeb.Dashboard.Members.Index](VoileWeb.Dashboard.Members.Index.md)
- [VoileWeb.Dashboard.Members.Management.Component](VoileWeb.Dashboard.Members.Management.Component.md)
- [VoileWeb.Dashboard.Members.Management.ImportExport](VoileWeb.Dashboard.Members.Management.ImportExport.md): Import members from CSV.
- [VoileWeb.Dashboard.Members.Management.Index](VoileWeb.Dashboard.Members.Management.Index.md)
- [VoileWeb.Dashboard.Members.Management.Show](VoileWeb.Dashboard.Members.Management.Show.md)
- [VoileWeb.Dashboard.Members.Reports.Expiring](VoileWeb.Dashboard.Members.Reports.Expiring.md)
- [VoileWeb.Dashboard.Members.Reports.Index](VoileWeb.Dashboard.Members.Reports.Index.md)
- [VoileWeb.Dashboard.Members.Reports.Overdue](VoileWeb.Dashboard.Members.Reports.Overdue.md)
- [VoileWeb.Dashboard.MetaResource.ResourceTemplateLive.Edit](VoileWeb.Dashboard.MetaResource.ResourceTemplateLive.Edit.md)
- [VoileWeb.Dashboard.MetaResource.ResourceTemplateLive.FormComponent](VoileWeb.Dashboard.MetaResource.ResourceTemplateLive.FormComponent.md)
- [VoileWeb.Dashboard.MetaResource.ResourceTemplateLive.New](VoileWeb.Dashboard.MetaResource.ResourceTemplateLive.New.md)
- [VoileWeb.Dashboard.Metaresource.MetaresourceLive](VoileWeb.Dashboard.Metaresource.MetaresourceLive.md)
- [VoileWeb.Dashboard.Plugins.Index](VoileWeb.Dashboard.Plugins.Index.md): Plugin management admin page.
- [VoileWeb.Dashboard.Plugins.Settings](VoileWeb.Dashboard.Plugins.Settings.md): Per-plugin settings form.
- [VoileWeb.Dashboard.Settings.ApiManager](VoileWeb.Dashboard.Settings.ApiManager.md)
- [VoileWeb.Dashboard.Settings.AppProfileSettingsLive](VoileWeb.Dashboard.Settings.AppProfileSettingsLive.md)
- [VoileWeb.Dashboard.Settings.HolidayLive](VoileWeb.Dashboard.Settings.HolidayLive.md)
- [VoileWeb.Dashboard.Settings.ReservationNotificationLive](VoileWeb.Dashboard.Settings.ReservationNotificationLive.md)
- [VoileWeb.Dashboard.Settings.SettingLive](VoileWeb.Dashboard.Settings.SettingLive.md)
- [VoileWeb.Dashboard.Settings.SystemNodeLive](VoileWeb.Dashboard.Settings.SystemNodeLive.md)
- [VoileWeb.Dashboard.Settings.SystemNodeRulesLive](VoileWeb.Dashboard.Settings.SystemNodeRulesLive.md)
- [VoileWeb.Dashboard.Settings.TokenFormComponent](VoileWeb.Dashboard.Settings.TokenFormComponent.md)
- [VoileWeb.Dashboard.Settings.TokenManagerLive](VoileWeb.Dashboard.Settings.TokenManagerLive.md)
- [VoileWeb.Dashboard.StockOpnameLive.Index](VoileWeb.Dashboard.StockOpnameLive.Index.md)
- [VoileWeb.Dashboard.StockOpnameLive.New](VoileWeb.Dashboard.StockOpnameLive.New.md)
- [VoileWeb.Dashboard.StockOpnameLive.Report](VoileWeb.Dashboard.StockOpnameLive.Report.md)
- [VoileWeb.Dashboard.StockOpnameLive.Review](VoileWeb.Dashboard.StockOpnameLive.Review.md)
- [VoileWeb.Dashboard.StockOpnameLive.Scan](VoileWeb.Dashboard.StockOpnameLive.Scan.md)
- [VoileWeb.Dashboard.StockOpnameLive.Show](VoileWeb.Dashboard.StockOpnameLive.Show.md)
- [VoileWeb.Dashboard.Visitor.Logs](VoileWeb.Dashboard.Visitor.Logs.md)
- [VoileWeb.Dashboard.Visitor.LogsExportController](VoileWeb.Dashboard.Visitor.LogsExportController.md)
- [VoileWeb.Dashboard.Visitor.Statistics](VoileWeb.Dashboard.Visitor.Statistics.md)
- [VoileWeb.Dashboard.Visitor.StatisticsNode](VoileWeb.Dashboard.Visitor.StatisticsNode.md)
- [VoileWeb.Dashboard.Visitor.Surveys](VoileWeb.Dashboard.Visitor.Surveys.md)
- [VoileWeb.DashboardLive](VoileWeb.DashboardLive.md)
- [VoileWeb.EmailComponent.Template](VoileWeb.EmailComponent.Template.md): Centralized HTML email templates for Voile system notifications.

- [VoileWeb.Endpoint](VoileWeb.Endpoint.md)
- [VoileWeb.ErrorHTML](VoileWeb.ErrorHTML.md): This module is invoked by your endpoint in case of errors on HTML requests.
- [VoileWeb.ErrorJSON](VoileWeb.ErrorJSON.md): This module is invoked by your endpoint in case of errors on JSON requests.
- [VoileWeb.Frontend.Atrium.AtriumHelper](VoileWeb.Frontend.Atrium.AtriumHelper.md): Helper functions for the Atrium (member self-service portal).
- [VoileWeb.Frontend.Atrium.Clearance.Index](VoileWeb.Frontend.Atrium.Clearance.Index.md)
- [VoileWeb.Frontend.Atrium.Clearance.Verify](VoileWeb.Frontend.Atrium.Clearance.Verify.md)
- [VoileWeb.Frontend.Atrium.FineDetail.Show](VoileWeb.Frontend.Atrium.FineDetail.Show.md)
- [VoileWeb.Frontend.Atrium.Index](VoileWeb.Frontend.Atrium.Index.md)
- [VoileWeb.Frontend.Atrium.Requisition.Index](VoileWeb.Frontend.Atrium.Requisition.Index.md)
- [VoileWeb.Frontend.Atrium.Requisition.New](VoileWeb.Frontend.Atrium.Requisition.New.md)
- [VoileWeb.Frontend.Clearance.ShowLetter](VoileWeb.Frontend.Clearance.ShowLetter.md)
- [VoileWeb.Frontend.ClearanceQrController](VoileWeb.Frontend.ClearanceQrController.md)
- [VoileWeb.Frontend.Collections.Index](VoileWeb.Frontend.Collections.Index.md): Frontend LiveView for displaying collections to library members

- [VoileWeb.Frontend.Collections.Show](VoileWeb.Frontend.Collections.Show.md): Frontend LiveView for displaying individual collection details to library members

- [VoileWeb.Frontend.EbookReader.Show](VoileWeb.Frontend.EbookReader.Show.md): Simple LiveView to render a PDF e-book either from a local static path
(e.g. `/uploads/...`) or from a public S3 URL.
- [VoileWeb.Frontend.Items.Index](VoileWeb.Frontend.Items.Index.md): Frontend LiveView for displaying items to library members

- [VoileWeb.Frontend.Items.Show](VoileWeb.Frontend.Items.Show.md): Frontend LiveView for displaying individual item details to library members

- [VoileWeb.Gettext](VoileWeb.Gettext.md): A module providing Internationalization with a gettext-based API.
- [VoileWeb.GmailCallbackController](VoileWeb.GmailCallbackController.md)
- [VoileWeb.GoogleAuthController](VoileWeb.GoogleAuthController.md)
- [VoileWeb.Layouts](VoileWeb.Layouts.md): This module holds different layouts used by your application.
- [VoileWeb.Live.AuthHooks](VoileWeb.Live.AuthHooks.md): LiveView hooks for handling authentication and authorization.
- [VoileWeb.Live.Hooks.CurrentPath](VoileWeb.Live.Hooks.CurrentPath.md): LiveView on-mount hook that ensures `:current_path` and `:current_uri` are
available in assigns for all LiveViews, and kept up-to-date on navigation.
- [VoileWeb.Live.Hooks.LocaleHook](VoileWeb.Live.Hooks.LocaleHook.md): LiveView hook to maintain locale across LiveView mount/remount cycles.
This ensures the locale set by the Locale plug persists during LiveView updates.

- [VoileWeb.Live.Hooks.NotificationHook](VoileWeb.Live.Hooks.NotificationHook.md): LiveView hook that adds reservation notification support to all dashboard pages.

- [VoileWeb.MagicLinkController](VoileWeb.MagicLinkController.md)
- [VoileWeb.NotificationComponent](VoileWeb.NotificationComponent.md): LiveComponent for displaying reservation notifications to staff/admin.
Receives notifications from parent LiveView via assigns.

- [VoileWeb.OaiPmhController](VoileWeb.OaiPmhController.md): Controller for handling OAI-PMH (Open Archives Initiative Protocol for Metadata Harvesting) requests.
- [VoileWeb.OaiViewerController](VoileWeb.OaiViewerController.md): Controller for serving OAI-PMH viewer HTML pages.
Provides human-friendly interfaces to browse OAI-PMH metadata.

- [VoileWeb.PageLive.About](VoileWeb.PageLive.About.md)
- [VoileWeb.PageLive.Ebook](VoileWeb.PageLive.Ebook.md)
- [VoileWeb.PageLive.Home](VoileWeb.PageLive.Home.md)
- [VoileWeb.PausAuthController](VoileWeb.PausAuthController.md)
- [VoileWeb.PluginRouterLive](VoileWeb.PluginRouterLive.md): Dynamic plugin route dispatcher.
- [VoileWeb.Plugs.APIAuthorization](VoileWeb.Plugs.APIAuthorization.md)
- [VoileWeb.Plugs.APIRateLimiter](VoileWeb.Plugs.APIRateLimiter.md): Rate limiter plug using Hammer 7.0+ for API endpoints.
- [VoileWeb.Plugs.Authorization](VoileWeb.Plugs.Authorization.md): Plug for authorization in Phoenix controllers.
- [VoileWeb.Plugs.Authorize](VoileWeb.Plugs.Authorize.md): Controller plug to authorize actions based on permissions.
- [VoileWeb.Plugs.GetCurrentPath](VoileWeb.Plugs.GetCurrentPath.md)
- [VoileWeb.Plugs.Locale](VoileWeb.Plugs.Locale.md): Plug for setting the locale based on:
1. Query parameter (?locale=id)
2. Session
3. Accept-Language header
4. Default locale (id - Indonesian)

- [VoileWeb.Plugs.RequireResourceAccess](VoileWeb.Plugs.RequireResourceAccess.md): Plug for checking if user can access any operation on a resource.
Note: RBAC system removed - this now allows access for all authenticated users.

- [VoileWeb.PropertyController](VoileWeb.PropertyController.md)
- [VoileWeb.PropertyHTML](VoileWeb.PropertyHTML.md)
- [VoileWeb.ResourceClassController](VoileWeb.ResourceClassController.md)
- [VoileWeb.ResourceClassHTML](VoileWeb.ResourceClassHTML.md)
- [VoileWeb.ResourceTemplateController](VoileWeb.ResourceTemplateController.md)
- [VoileWeb.ResourceTemplateHTML](VoileWeb.ResourceTemplateHTML.md)
- [VoileWeb.ResourceTemplatePropertyController](VoileWeb.ResourceTemplatePropertyController.md)
- [VoileWeb.ResourceTemplatePropertyHTML](VoileWeb.ResourceTemplatePropertyHTML.md)
- [VoileWeb.Router](VoileWeb.Router.md)
- [VoileWeb.SearchController](VoileWeb.SearchController.md)
- [VoileWeb.SearchDashboardComponent](VoileWeb.SearchDashboardComponent.md): Component for search dashboard with analytics

- [VoileWeb.SearchHTML](VoileWeb.SearchHTML.md): This module contains pages rendered by SearchController.

- [VoileWeb.SearchLive](VoileWeb.SearchLive.md): LiveView component for real-time search functionality

- [VoileWeb.Telemetry](VoileWeb.Telemetry.md)
- [VoileWeb.UserAuth](VoileWeb.UserAuth.md)
- [VoileWeb.UserAuthGoogle](VoileWeb.UserAuthGoogle.md)
- [VoileWeb.UserAuthPaus](VoileWeb.UserAuthPaus.md): PAuS (Padjadjaran Authentication System) OAuth 2.0 integration
Following the same pattern as UserAuthGoogle using Assent

- [VoileWeb.UserConfirmationInstructionsLive](VoileWeb.UserConfirmationInstructionsLive.md)
- [VoileWeb.UserConfirmationLive](VoileWeb.UserConfirmationLive.md)
- [VoileWeb.UserForgotPasswordLive](VoileWeb.UserForgotPasswordLive.md)
- [VoileWeb.UserInitialPasswordLive](VoileWeb.UserInitialPasswordLive.md)
- [VoileWeb.UserLoginLive](VoileWeb.UserLoginLive.md)
- [VoileWeb.UserOnboardingLive](VoileWeb.UserOnboardingLive.md)
- [VoileWeb.UserPendingConfirmationLive](VoileWeb.UserPendingConfirmationLive.md)
- [VoileWeb.UserRegistrationLive](VoileWeb.UserRegistrationLive.md)
- [VoileWeb.UserResetPasswordLive](VoileWeb.UserResetPasswordLive.md)
- [VoileWeb.UserSessionController](VoileWeb.UserSessionController.md)
- [VoileWeb.UserSettingsLive](VoileWeb.UserSettingsLive.md)
- [VoileWeb.Users.Manage.Dashboard](VoileWeb.Users.Manage.Dashboard.md)
- [VoileWeb.Users.Permission.ManageLive](VoileWeb.Users.Permission.ManageLive.md)
- [VoileWeb.Users.Permission.ManageLive.Edit](VoileWeb.Users.Permission.ManageLive.Edit.md)
- [VoileWeb.Users.Permission.ManageLive.FormComponent](VoileWeb.Users.Permission.ManageLive.FormComponent.md)
- [VoileWeb.Users.Permission.ManageLive.Show](VoileWeb.Users.Permission.ManageLive.Show.md)
- [VoileWeb.Users.Role.ManageLive](VoileWeb.Users.Role.ManageLive.md)
- [VoileWeb.Users.Role.ManageLive.Edit](VoileWeb.Users.Role.ManageLive.Edit.md)
- [VoileWeb.Users.Role.ManageLive.FormComponent](VoileWeb.Users.Role.ManageLive.FormComponent.md)
- [VoileWeb.Users.Role.ManageLive.Show](VoileWeb.Users.Role.ManageLive.Show.md)
- [VoileWeb.Utils.DateUtils](VoileWeb.Utils.DateUtils.md)
- [VoileWeb.Utils.FormatIndonesiaTime](VoileWeb.Utils.FormatIndonesiaTime.md)
- [VoileWeb.Utils.Locale](VoileWeb.Utils.Locale.md): Helper functions for locale management

- [VoileWeb.Utils.SaltGenerator](VoileWeb.Utils.SaltGenerator.md)
- [VoileWeb.Utils.SaveRequestUri](VoileWeb.Utils.SaveRequestUri.md)
- [VoileWeb.Utils.SideBarMenuMaster](VoileWeb.Utils.SideBarMenuMaster.md)
- [VoileWeb.Utils.Slugify](VoileWeb.Utils.Slugify.md)
- [VoileWeb.Utils.StringHelper](VoileWeb.Utils.StringHelper.md)
- [VoileWeb.Utils.UnpadNodeList](VoileWeb.Utils.UnpadNodeList.md)
- [VoileWeb.Visitor.CheckIn](VoileWeb.Visitor.CheckIn.md)
- [VoileWeb.Visitor.CheckOut](VoileWeb.Visitor.CheckOut.md)
- [VoileWeb.VisitorLogsCSV](VoileWeb.VisitorLogsCSV.md)
- [VoileWeb.VocabularyController](VoileWeb.VocabularyController.md)
- [VoileWeb.VocabularyHTML](VoileWeb.VocabularyHTML.md)
- [VoileWeb.VoileComponents](VoileWeb.VoileComponents.md): Centralized UI components for the Voile frontend

- [VoileWeb.VoileDashboardComponents](VoileWeb.VoileDashboardComponents.md)
- [VoileWeb.XenditWebhookController](VoileWeb.XenditWebhookController.md)

- Exceptions
  - [VoileWeb.Auth.Authorization.UnauthorizedError](VoileWeb.Auth.Authorization.UnauthorizedError.md)

## Mix Tasks

- [mix voile.gen_token](Mix.Tasks.Voile.GenToken.md)
- [mix voile.migrate](Mix.Tasks.Voile.Migrate.md): Migration task for importing data from SLiMS to Voile.

