diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a69cf9..8c53aa6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,109 @@ All notable changes to this project are documented in this file. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 1.0.12 – 2026-08-10 + +### Added +- Leave requests can be **approved straight from the notification**. The four + notifications that ask for a decision — a new request, an escalation to HR, the + overdue reminder and a withdrawal — now carry Approve, Decline and Review + buttons; approving is a single click and never opens the app. Declining is + deliberately not a one-click verdict, because a decline requires a reason: its + button opens the request with the reason box already unfolded. A withdrawal + asks the opposite question, so its buttons read *Approve withdrawal* and *Keep + leave*. The overdue reminder previously carried no buttons at all, which is + exactly the notification where an answer is most overdue +- The request dialog names the **colleagues already off** during the dates being + picked, and warns when booking would take the team to the concurrent-absence + limit. Managers have always seen this when reviewing; now the person choosing + the dates sees it while they can still cheaply choose others. It never blocks + the request, and it is only shown for your own leave — the overlap query + answers for your team, so HR recording an absence for somebody else would + otherwise be shown the wrong names +- The *next break* hero counts down **second by second over the final 48 hours** + instead of rounding to "1 day to go", which is a poor description of an + afternoon. The empty-state palm illustration now **follows the seasons** — + blossom, full sun, falling leaves, snow — flipped for the southern hemisphere + from the country already chosen for public holidays. All motion still stops + under `prefers-reduced-motion` + +### Fixed +- *My leave* left open overnight no longer freezes on yesterday: the day count + and the reported year were captured once at render, so a tab open across + midnight — or New Year — kept showing the previous day's numbers + +## 1.0.11 – 2026-08-10 + +### Added +- **Expected notice period** (admin setting, default 14 calendar days, `0` + disables). A request whose leave starts sooner is flagged as short notice to + the line manager and to HR — on the request's Details tab, in the notification + and in the subject line of the email asking for a decision, including the + escalation and the pending reminder, by which point the notice given has shrunk + further. It informs a decision and blocks nothing. Calendar days, not working + days: "two weeks' notice" is a fortnight on the wall calendar. Never shown for + leave with no approval step — nobody can give notice of falling ill + +### Fixed +- Day boundaries are no longer computed in UTC. Nextcloud pins PHP's timezone to + UTC for the whole request, so "today" answered in UTC wherever you are: at + 09:00 on 2 January in Auckland an employee booking leave for that day was told + it was "entirely in the past", and Berlin had the same fault for the last hour + of every day. Dates an employee is judged against now resolve in **their own** + timezone, while company-wide policy and background jobs — short-notice + measurement, carry-over expiry, the year rollover — use the **server's**, so + one request gets the same answer for the employee, the manager and HR. Stored + timestamps stay UTC, which is what a timestamp means + +## 1.0.10 – 2026-08-10 + +### Fixed +- The bottom row of the *Who's off* / *Team* timeline is no longer clipped by the + horizontal scrollbar. Overlay scrollbars (the macOS default) are painted over + the content instead of taking space of their own, and the leave pills sat only + 8px clear of the track's bottom edge, so the last row's pill — and its + selection ring — was sliced in half + +## 1.0.9 – 2026-08-10 + +### Fixed +- Selecting a leave request no longer navigates away. The list row's underlying + anchor fell through to `#`, which this app's hash routing resolves to *My + leave* — so opening somebody's absence threw you back to your own overview + instead of showing their record. Affected the HR absence list and Approvals + +### Changed +- Requests now identify people by name instead of user id: the absence list, and + the detail sidebar's Employee row (with avatar). Viewing somebody else's leave + names them under the sidebar title, so it is clear whose record is open + +## 1.0.8 – 2026-08-10 + +### Changed +- Guest accounts are no longer treated as employees. They have no entitlement + and take no leave, so they no longer appear in balances, statistics, the + sick-leave overview, exports, the who's-off calendar, the HR absence list or + any employee picker, and they can no longer be nominated as a replacement or + resolved as a line manager. Leave cannot be recorded for a guest, not even by + HR. Instances without the Guests app are unaffected + +## 1.0.7 – 2026-08-10 + +### Added +- **Absences** — a new HR view listing every recorded absence, filterable by + employee, leave type, status and year. Selecting one opens the usual detail + sidebar, so HR can now correct or cancel any vacation or sick day, not just + record new ones. HR could always do this through the API; there was simply no + screen that made an individual record reachable +- Absences in HR's *Who's off* timeline can be selected to open their details +- The *Sick leave* overview drills down: selecting an employee opens their + individual sick days for that year + +### Fixed +- HR editing an HR-recorded absence (e.g. sick leave) can now pick that type in + the leave-type picker; previously the preselected type was missing from the + list and could not be chosen again once changed + ## 1.0.6 – 2026-07-19 ### Fixed diff --git a/README.md b/README.md index 151da6f..e365a68 100644 --- a/README.md +++ b/README.md @@ -2,112 +2,385 @@ - SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors - SPDX-License-Identifier: AGPL-3.0-or-later --> +
+ # Absence 🌴 -A vacation-approval workflow for Nextcloud: employees apply for leave, line managers -approve or reject, and HR gets a company-wide overview with statistics and exports. - -Built to the specification in [SPECIFICATION.md](./SPECIFICATION.md). - -## Features - -- **Apply** for annual, sick, unpaid or special leave (configurable types) with a live - balance preview. The working-day count is prefilled from your availability and - public holidays in personal settings. -- **Approve / reject** as a line manager, with team-coverage conflict warnings and a - short-notice warning when the leave starts sooner than the notice period the admin - expects (default two weeks). -- **Escalation**: pending requests a manager ignores are automatically escalated to HR. -- **Full balance tracking**: entitlement, used, pending, remaining and carry-over, - with a configurable year-rollover policy. *My leave* shows each balance as an - animated ring with a breakdown ledger (base + carry-over ± adjustment → available) - and monthly charts of leave taken and sick days for the current year. -- **HR area**: a filterable list of all recorded absences (correct or cancel any of - them), per-employee balances, company-wide statistics, a who's-off calendar, - and CSV export. -- **Calendar sync**: approved leave is written to a personal and a shared team calendar - via CalDAV. -- **Notifications, email and activity** for every step — including whatever the - employee, manager or HR wrote: the reason on the request, the decision comment and - new comments are quoted in the notification and the email, so nobody has to open - the app to find out what was said. -- Native Nextcloud UI (Vue 3 + `@nextcloud/vue`), dark-mode aware, translatable. - -## Screenshots - -### Employee - -**My leave** — next-break hero, balance ring with breakdown ledger, monthly leave & sick-day charts, and the request list: +### Vacation approval that lives where your company already works + +**Employees apply. Managers approve in one click. HR sees everything.** +No spreadsheets, no per-seat SaaS bill, no employee data leaving your server. + +[![Nextcloud 34–36](https://img.shields.io/badge/Nextcloud-34%E2%80%9336-0082c9?logo=nextcloud&logoColor=white)](https://nextcloud.com) +[![Licence: AGPL-3.0](https://img.shields.io/badge/licence-AGPL--3.0-blue)](LICENSE) +[![Built to a spec](https://img.shields.io/badge/built%20to-SPECIFICATION.md-success)](./SPECIFICATION.md) ![My leave](screenshots/2.png) -**Request time off** — leave type, replacement picker, dates and prefilled (editable) working days: +
+ +--- + +## Why a leave app on Nextcloud + +Leave management is one of the few HR processes that touches **every** employee, +every year — and it is usually the one still run on a shared spreadsheet, an email +thread, or a €4-per-user-per-month product that wants your entire staff directory. + +Absence puts it on infrastructure you already run and already trust: + +- **Your data stays on your server.** Who is off, who is sick, and why they asked — + none of it is replicated to a third party. For many companies that alone decides + the question. +- **No per-seat licence.** AGPL-3.0, free for as many employees as you have. +- **It already knows your company.** Employees are your Nextcloud users, HR is a + Nextcloud group, and line managers come from the `manager` account property your + LDAP or Active Directory already fills in. There is no second org chart to + maintain and no import to keep in sync. +- **It lands where people already look.** Approvals arrive as Nextcloud + notifications and email, approved leave appears in Nextcloud Calendar, and the + balance sits on the Nextcloud dashboard. Nobody has to remember a new tool exists. +- **It is auditable by design.** Every decision is written to the request's own + history, the Activity feed, and `nextcloud.log` — always, regardless of your log + level. + +--- + +## Contents + +- [At a glance](#at-a-glance) +- [On the dashboard](#on-the-dashboard) +- [For employees](#for-employees) +- [For line managers](#for-line-managers) +- [For HR](#for-hr) +- [For administrators](#for-administrators) +- [Roles](#roles) +- [Privacy, security & compliance](#privacy-security--compliance) +- [Requirements & installation](#requirements--installation) +- [Configuration](#configuration) +- [Audit logging](#audit-logging) +- [What is not in the box](#what-is-not-in-the-box-yet) +- [Architecture](#architecture) +- [Development](#development) + +--- + +## At a glance + +| | | +|---|---| +| 🌴 **Leave types you define** | Annual, sick, unpaid and special leave are seeded; add your own with colour, emoji, and flags for balance-counting, approval, mandatory note and mandatory replacement | +| ⚖️ **Real balance tracking** | Entitlement, used, pending, remaining, carry-over and manual adjustments — per employee, per type, per year | +| ✅ **One-click approval** | Approve straight from the notification, without opening the app | +| ⏰ **Nothing gets stuck** | Ignored requests are reminded, then automatically escalated to HR | +| 👥 **Coverage warnings** | Both the employee booking and the manager approving are told who else is already off | +| 📅 **Calendar sync** | Approved leave written to the employee's personal calendar and a shared team calendar over CalDAV | +| 🔔 **Four channels** | Notification, email, Activity feed and audit log — carrying what people actually wrote | +| 📊 **HR overview** | Company-wide balances, statistics, sick-leave ranking, who's-off timeline and CSV export | +| 🔁 **Year rollover** | Carry-over computed automatically, with a cap and an optional expiry date | +| 🌍 **Localised** | Every string translatable; dates, numbers and week-start follow the user's locale | +| 🌗 **Native and beautiful** | Vue 3 built on `@nextcloud/vue`, so it looks and behaves like the rest of your Nextcloud — dark-mode aware, and every animation stops under `prefers-reduced-motion` | + +--- + +## On the dashboard + +![Dashboard widget](screenshots/1.png) + +Most people should not have to open a leave app to use one. The **dashboard widget** +is role-aware and shows each person exactly what is theirs to know: every employee +sees their balance and upcoming leave, line managers additionally see the requests +waiting on their decision, and HR sees the escalated queue across the company. + +For a lot of employees, that widget *is* the app — right next to their files and +calendar, on the page they already open every morning. + +--- + +## For employees + +> *"How many days do I have left, and can I take them in August?"* — answered on one +> screen, in about three seconds. ![Request time off dialog](screenshots/3.png) -**Dashboard widget** — balance summary, upcoming leave and (for managers) requests awaiting a decision: +**Booking leave takes four fields and tells you everything you need before you send +it.** Pick a type and a date range, and the app: -![Dashboard widget](screenshots/1.png) +- **prefills the working-day count** from your availability and your country's public + holidays — weekends and bank holidays are already excluded, and the number stays + editable because only you know about that Tuesday you owe the office; +- shows a **live balance preview** — `18 → 13 days available` with a fill bar — so you + never submit blind; +- **names the colleagues already off** during those dates while you can still cheaply + pick different ones, and warns you if booking would leave the team thin; +- warns — but never blocks — if you would go past your balance. HR may still approve + it, and the app does not pretend otherwise; +- remembers the **replacement colleague** you nominated last time. + +**My leave** is the home screen: a *next break* hero that counts the days down — and +ticks second by second over the final 48 hours — above one animated **balance ring** +per leave type, each with a full breakdown ledger (base + carry-over ± adjustment → +available), monthly charts of leave taken and sick days, and your request history. -### Line managers +You can **edit or cancel** a pending request outright. Withdrawing leave that has +already been approved politely asks your manager first, because they planned around it. -**Approving a request** — detail sidebar with progress stepper, coverage and history: +--- + +## For line managers ![Request detail with approve/decline](screenshots/4.png) -**Team timeline** — who's off this month, pending requests hatched: +**The common answer costs one click.** A request arrives as a Nextcloud notification +with **Approve**, **Decline** and **Review** buttons; approving happens in place and +the notification disappears. Declining opens the request with the reason box ready — +because a decline needs a reason, and a manager should not be able to reject somebody's +holiday from a toast without giving one. + +When you do open a request, the sidebar gives you the whole picture: + +- a **progress stepper** — Requested → Review → Approved / Declined / Withdrawing; +- a **coverage panel**: exactly who else on the team is off during those dates, and a + warning when approving would take the team to the concurrent-absence limit you set; +- a **short-notice warning** when the leave starts sooner than the notice period your + company expects — leading the notification, the email subject line and the Details + tab, because how little warning you were given bears on the answer; +- the employee's **reason**, the full **comment thread**, and a complete **history** + of every edit, escalation and decision. ![Team timeline](screenshots/5.png) -### HR +**Team timeline** is a Gantt-style month view of your direct reports: continuous +leave pills, hatched while still pending, with weekend shading and a *today* line — +the view you want open when somebody asks "can I take that week?" + +Everything a manager needs sits on the request itself — coverage, notice, reason, +history — so approving never means going looking for context elsewhere. + +--- + +## For HR -**Record absence** — book sick leave (or any type) for an employee directly, without an approval step: +HR sees the whole company and can correct anything — with every correction on the record. + +### Every absence, filterable and correctable + +Filter by employee, leave type, status and year. Selecting a record opens the same +detail sidebar, where HR can fix the dates, type or working days, or cancel it. +**Cancelling keeps the record and its history** for the audit trail — there is +deliberately no delete. + +### Record absences directly ![Record absence dialog](screenshots/6.png) -**Absences** — every recorded absence, filterable by employee, type, status and year. -Selecting one opens its details, where HR can correct the dates, type or working days, -or cancel it. Cancelling keeps the record and its history for the audit trail, so -there is no delete. The sick-leave overview and the who's-off timeline both link here. +Sick leave is not something anyone applies for in advance. HR books it (or any type) +on an employee's behalf, straight to approved, with no approval step — and the +employee, their manager and their replacement are told. -**Balances** — per-employee entitlement, used, pending, remaining and available: +### Balances and entitlements ![HR balances table](screenshots/7.png) -**Edit entitlement** — base days plus a manual adjustment with a note: +Per-employee entitlement, used, pending, remaining and available, per year and type, +filterable by group. Set entitlements individually or **in bulk for a whole group**. ![Edit entitlement dialog](screenshots/8.png) -**Who's off** — company-wide absence timeline: - -![Company-wide who's off timeline](screenshots/9.png) +Every entitlement is a **base allowance plus an explicit adjustment with a note**, so +"why does Ada have 27 days?" always has an answer written down next to the number. -**Statistics** — stat tiles, absence-days trend and days by leave type: +### Statistics ![HR statistics](screenshots/11.png) -**Exports** — leave requests and balances as CSV: +Stat tiles, an absence-days trend over time, and days by leave type — hand-written, +theme-aware SVG charts that follow your Nextcloud theme and look right in dark mode, +with no charting dependency shipped. A separate **sick-leave overview** ranks +employees by days lost for a chosen year and drills down to the individual days. + +### Who's off, company-wide + +![Company-wide who's off timeline](screenshots/9.png) + +The same timeline as the team view, across the entire organisation — and each pill +opens the record behind it. + +### Export ![CSV exports](screenshots/10.png) -**Requesting leave works the same from the HR area:** +Leave requests and balances as CSV, with date-range and group filters, for payroll or +an external HR system. + +**And HR requests their own leave like everybody else:** ![Request dialog in the HR area](screenshots/12.png) -### Administration +--- -**Admin settings** — HR group, entitlements, escalation, carry-over policy and CalDAV targets: +## For administrators ![Admin settings](screenshots/13.png) +Everything is configured from **Administration settings → Absence** — a declarative +settings form, so there is no bespoke admin UI to learn. + +| Setting | Default | What it does | +|---|---|---| +| HR group | `hr` | Which Nextcloud group holds HR powers | +| Default annual entitlement | 25 days | Seed for new entitlement rows | +| Escalation window | 3 working days | How long a manager may sit on a request before HR is pulled in | +| Reminder lead time | 1 day | How long before escalation the manager is nudged | +| Carry-over policy | `capped` | `none`, `unlimited` or `capped` | +| Carry-over cap | 5 days | Used when the policy is `capped` | +| Carry-over expiry | none | Optional date (e.g. 31 March) after which carried days are zeroed | +| Max concurrent team absences | 2 | The coverage-warning threshold | +| Expected notice period | 14 calendar days | Short-notice threshold; `0` switches it off | +| CalDAV: personal events | on | Write approved leave to the employee's own calendar | +| CalDAV: shared team calendar | on | Write approved leave to a shared company calendar | +| Shared calendar type-visibility | neutral | Whether colleagues see *"Absent"* or *"Sick leave"* | +| Leave types | seeded | Add, edit, enable or disable types, with colours and flags | + +**Three background jobs** keep it running unattended, all idempotent and safe to +re-run: escalation (hourly), reminders (daily) and the year rollover (daily, acting +once per year). + +**Personal settings** are deliberately tiny: a small section appended to the built-in +**Availability** page that feeds the working-day prefill (working weekdays, and a +country/region for public holidays). Notification preferences defer to Nextcloud's own. + +--- + ## Roles -| Role | How it's assigned | -|------|-------------------| -| Employee | every user | -| Line manager | the account `manager` property (from LDAP or set on the account) | -| HR | membership of a configurable group (default `hr`, see admin settings) | -| Admin | Nextcloud server admins configure the app | +| Role | How it is assigned | What it unlocks | +|---|---|---| +| **Employee** | every user account | Apply for leave, see own balances and history | +| **Line manager** | the `manager` account property, from LDAP/AD or set on the account | Approve/decline reports' requests, team coverage and timeline | +| **HR** | membership of a configurable group (default `hr`) | Company-wide view, record and correct absences, entitlements, statistics, export | +| **Administrator** | Nextcloud server admin | App configuration and leave types | + +Guest accounts are **not** employees: they have no entitlement, take no leave, appear +in no report or picker, and cannot be nominated as a replacement — enforced by the +API, not merely hidden in the UI. + +--- + +## Privacy, security & compliance + +Built for a European works council to be comfortable with: + +- **Authorisation on every endpoint**, centralised in one `PermissionService` — an + employee reads only their own data, a manager only their reports', HR everything. + Enforced server-side; the UI merely reflects it. +- **Sensitive text stays sensitive.** Reasons and notes are never shown to peers. The + nominated replacement is told the dates only — covering for someone does not come + with a right to read why they are away. Whether a colleague's leave *type* is + visible on the shared calendar and the who's-off timeline is an admin decision, and + the default is a neutral *"Absent"*. +- **A three-level audit trail**: per-request history, the Nextcloud Activity feed, + and a structured JSON entry per action in `nextcloud.log` that is written + regardless of your log level. +- **GDPR deletion.** When a user account is deleted, their events are removed from + the shared calendar, they are detached as anybody's replacement, and their personal + data is purged — with the purge itself recorded. +- **Rate limiting and input validation** on every create/edit endpoint. +- **No surprise presence signals.** The app deliberately does not touch the built-in + out-of-office auto-responder or user status. Calendar busy state is the only + presence it sets, and you can switch that off too. +- **Correctness under concurrency.** Requests are written under a per-employee lock, + so two edits racing each other cannot both be approved into an overlapping, + double-counted absence. +- **Tested.** 17 unit-test suites covering the state machine, balances, entitlements, + permissions, notifications and reporting, plus frontend unit tests — run in CI + alongside Psalm static analysis, PHP-CS, ESLint, Stylelint and a REUSE licence check. + +--- + +## Requirements & installation + +- **Nextcloud 34, 35 or 36** +- The **Guests** app is optional; instances without it are unaffected + +Install from the Nextcloud App Store, or enable a checkout with: + +```bash +occ app:enable absence +``` + +On install the app seeds four leave types — **Annual leave 🌴**, **Sick leave 🤒**, +**Unpaid leave 💸** and **Special leave 🕊️** — and switches on its own audit logging. +Then: + +1. Create (or pick) the **HR group** and put your HR people in it. +2. Set the **default annual entitlement** in Administration settings → Absence. +3. Make sure the **`manager` property** is populated on your accounts — from LDAP/AD + if you have it, or set by hand. Employees with no manager escalate straight to HR, + so the app still works while you fill this in. + +That is the whole setup. Employees can book leave immediately. + +--- + +## Configuration + +Admin settings live under **Administration settings → Absence** (see the +[table above](#for-administrators)). + +Personal settings are appended to the built-in **Personal settings → Availability** +page. They prefill the *Working days* field on new requests: working weekdays come +from your Availability (overridable), and a chosen country/region marks the public +holidays that should not be counted. The last replacement you nominated is remembered +too. **Every prefilled value stays editable on the request itself** — the app suggests, +the employee decides, and the manager verifies. + +--- + +## Audit logging + +Every important action — request created / edited / approved / rejected / cancelled, +withdrawal requested/approved/rejected, escalation, comments, entitlement changes, +carry-over rollover and expiry, leave-type and holiday changes, admin-config changes, +and GDPR user-data purge — is written to **`nextcloud.log`** as a structured JSON +entry tagged `"app":"absence"` with a machine-readable `action` and full context +(actor, request id, employee, type, dates, working days, status). Where the action +carried free text, the text is part of the entry: `detail` holds a comment body or a +decision comment, `reason` holds the note the applicant wrote. + +These entries are **always written regardless of the instance log level**. On install +(and every update) the app adds `absence` to the system `log.condition.apps` list, +which Nextcloud honours by forcing DEBUG-level capture for the app's tagged messages. +The existing condition is merged, never replaced, and the entry is removed again on +uninstall. + +```bash +grep '"app":"absence"' nextcloud.log # everything +grep '"action":"request_approved"' nextcloud.log # one kind of decision +``` + +--- + +## What is not in the box (yet) + +Stated plainly, because a feature list you cannot trust is worth nothing: + +- **Half-days and hourly leave.** Full days only. The schema already reserves room + for half-days, so adding them will not need a migration. +- **File attachments** for doctor's notes. A free-text note field stands in for now. +- **ICS holiday import.** Public holidays come from a bundled country/region database. +- **XLSX export.** CSV only — it opens in Excel, LibreOffice and every payroll system + we know of. +- **Balances for managers.** Every balance view is HR-only today: a manager sees + their team's coverage and timeline, but not how many days a report has left. +- **Payroll integration, time tracking and shift planning.** Deliberately out of + scope: this app manages *leave*, and does that one thing properly. + +Absence is built to [SPECIFICATION.md](./SPECIFICATION.md), which documents every +rule, workflow and design decision — including the ones deliberately not taken. + +--- ## Architecture @@ -115,15 +388,20 @@ there is no delete. The sick-leave overview and the who's-off timeline both link - `lib/Db` — entities + QBMappers (`absence_requests`, `absence_leave_types`, `absence_entitlements`, `absence_comments`, `absence_request_events`). - `lib/Service` — the domain logic. `RequestService` owns the state machine; - `BalanceService`, `CoverageService`, `EntitlementService`, - `CalendarService`, `NotificationService`, `ReportService`, `ExportService`, - `PermissionService`, `ManagerResolver`, `ConfigService`, `SessionService`, - `ActivityPublisher`. + `BalanceService`, `CoverageService`, `EntitlementService`, `CalendarService`, + `NotificationService`, `NoticeService`, `ReportService`, `ExportService`, + `PermissionService`, `ManagerResolver`, `EmployeeDirectory`, `ClockService`, + `ConfigService`, `SessionService`, `PersonalDefaultsService`, `ActivityPublisher`. - `lib/Controller` — thin JSON controllers behind `appinfo/routes.php`. - `lib/BackgroundJob` — `EscalationJob` (hourly), `ReminderJob` (daily), `YearRolloverJob` (daily, idempotent per year). - - `lib/Notification`, `lib/Activity`, `lib/Settings`, `lib/Listener`, `lib/Migration`. + - `lib/Notification`, `lib/Activity`, `lib/Dashboard`, `lib/Settings`, + `lib/Listener`, `lib/Migration`. - **Frontend** — Vue 3 SPA in `src/`, built with `@nextcloud/vite-config` into `js/`. + Charts and illustrations are hand-written SVG components with no charting + dependency. + +--- ## Development @@ -132,11 +410,14 @@ there is no delete. The sick-leave overview and the who's-off timeline both link composer install composer cs:check composer psalm +composer test:unit # Frontend npm install --legacy-peer-deps # ecosystem peer ranges require this flag -npm run build # → js/absence-*.mjs, css/* +npm run build # → js/absence-*.mjs npm run watch # rebuild on change during development +npm run test # vitest +npm run lint && npm run stylelint ``` Enable the app: @@ -145,45 +426,15 @@ Enable the app: occ app:enable absence ``` -The default leave types (annual, sick, unpaid, special) are seeded on install. - -## Configuration +Contributions are welcome — please read [SPECIFICATION.md](./SPECIFICATION.md) first; +it is the source of truth for behaviour, and it is kept current with the code. -Admin settings live under **Administration settings → Absence** (HR group, default -entitlement, escalation window, carry-over policy, coverage threshold, expected notice -period, CalDAV targets). +--- -Personal settings are appended to the built-in **Personal settings → Availability** -page. They prefill the "Working days" field on new requests: working weekdays come -from the user's Availability (overridable), and a chosen country/region marks the -public holidays that should not be counted as working days. The last replacement is -also remembered and prefilled. Every prefilled value stays editable on the request -itself. Notification preferences defer to the global Nextcloud notification settings. +
-## Audit logging - -Every important action — request created / edited / approved / rejected / cancelled, -withdrawal requested/approved/rejected, escalation, comments, entitlement changes, -carry-over rollover/expiry, leave-type and holiday changes, admin-config changes, and -GDPR user-data purge — is written to **`nextcloud.log`** as a structured JSON entry -tagged `"app":"absence"` with a machine-readable `action` and full context (actor, -request id, employee, type, dates, working days, status). Where the action carried -free text, the text is part of the entry too: `detail` holds a comment body or a -decision comment, `reason` holds the note the applicant wrote when creating the -request. - -These entries are **always written regardless of the instance log level**: on install -(and every update) the app adds `absence` to the system `log.condition.apps` list, -which Nextcloud honours by forcing DEBUG-level capture for the app's tagged messages. -The existing condition is merged, never replaced, and the entry is removed again on -uninstall. Filter the log with e.g. `grep '"app":"absence"' nextcloud.log` or by a -specific `"action"`. +**Absence** is part of the Nextcloud ecosystem · [Report an issue](https://github.com/nextcloud/absence/issues) · AGPL-3.0-or-later -## Status vs. specification +🌴 -Phase 1 (per the spec's "definition of done") is implemented, plus a role-aware -**Dashboard widget**: every employee sees their own balance and upcoming/pending -leave, line managers additionally see team requests awaiting their decision, and HR -sees the escalated queue across the company. Phase-2 items — file attachments for -doctor's notes, ICS holiday import, and half-day granularity — are intentionally left -as follow-ups; the schema already reserves room for half-days. +
diff --git a/SPECIFICATION.md b/SPECIFICATION.md index e1d237c..72a2c13 100644 --- a/SPECIFICATION.md +++ b/SPECIFICATION.md @@ -253,6 +253,35 @@ For doctor's notes: allow attaching a file reference stored in the user's Files. Model as a nullable `attachment_file_id` on `absence_requests` pointing at a Nextcloud file id. **Phase 2** — for phase 1 a free-text `attachment_note` suffices. +### 3.9 Which "today" applies (`ClockService`) + +Leave is stored as **dates**, not instants: `start_date` and `end_date` are the days +the employee typed on a calendar. Comparing them against "now" therefore needs a *day +boundary*, and a day boundary only exists relative to a timezone. + +Nextcloud pins PHP's default timezone to UTC for the whole request, so a bare +`date('Y-m-d')` answers in UTC wherever anybody is. For a timestamp that is correct. +For a day boundary it is a bug: at 09:00 on 2 January in Auckland it is still +1 January in UTC, so an employee booking leave for today would be told it "is +entirely in the past" for a day that has not finished where they live. Berlin has the +same fault in the other direction for the last hour of every day. + +Which boundary is right depends on **who is asking**, so `ClockService` exposes the +two separately rather than one ambiguous `today()`, and every caller has to choose: + +| | Used for | Examples | +|---|---|---| +| `userToday()` / `userYear()` | anything an employee sees or is judged against, in *their* timezone | the "not entirely in the past" validation (§5.1), the dashboard widget's upcoming leave, the default year for balances, reports and exports | +| `serverToday()` / `serverYear()` | company-wide policy and background jobs, where there is no user to ask | short-notice measurement (§8), carry-over expiry and the year rollover (§6.2, §9) | +| `now()` | stored timestamp columns (`created_at`, `decided_at`, …) | deliberately UTC — a timestamp records *when* something happened, which is the same moment for everyone | + +Company-wide policy uses the server's clock on purpose: one request must get one +answer whether the manager, HR or the job that mails them is asking, and a warning +that changed depending on the reader's timezone would be worse than no warning. + +The instant itself comes from `ITimeFactory` so tests can pin it — `new \DateTime()` +cannot be frozen. + --- ## 4. Request Status State Machine @@ -307,7 +336,8 @@ HR** on an employee's behalf (§5.6) — employees don't self-record it. (`NcSelect` + core autocomplete), excluding the employee themselves. Submit is blocked until one is chosen. Sick leave (HR-recorded) needs none. 4. On submit, backend: - - Validates dates (`start ≤ end`, not entirely in the past unless HR, not + - Validates dates (`start ≤ end`, not entirely in the past — in the *employee's* + timezone, §3.9 — unless HR, not overlapping an existing non-terminal request for the same user — reject overlap with a clear error). - Enforces `requires_note`, **`requires_replacement`** (the `replacement_uid` must be @@ -476,12 +506,26 @@ is what counts (§7). that asks for a decision (§11) — including the escalation to HR and the pending reminder, by which point the notice given has shrunk further. - Calendar days, not working days: "two weeks' notice" is a fortnight on the wall - calendar. Measured against the *server's* today, so one request gets one answer - for the manager, for HR and for the job that mails them. + calendar. Measured against the *server's* today (§3.9), so one request gets one + answer for the manager, for HR and for the job that mails them. - Only while a decision is outstanding (`PENDING` / `ESCALATED`), and so never for leave with no approval workflow — sick leave is recorded after the fact and auto-approved types are booked straight through (§4.1), so nobody is weighing the notice, and nobody can give notice of falling ill. +- **Before the ask, not only after it:** the request dialog runs the same team-scope + overlap query as the dates are picked and names the colleagues already off then, + as an `info` note — or a `warning` when booking would take the team to the + concurrency threshold. It is advisory in the strongest sense: it never disables + submit, a failed lookup simply omits the hint, and the employee stays free to book + a clash they have already agreed with their team. The point is that the person + choosing the dates learns what the manager will see at the moment they can still + cheaply choose differently. + - Shown only for one's *own* leave. The endpoint answers for the caller's team, so + HR recording an absence for somebody else would otherwise be shown the wrong + team's names, and no hint beats a misleading one. + - Leave *types* are neutralised by the same shared-calendar visibility policy that + governs the timeline — a colleague's sick leave does not become visible because + somebody opened the booking form. - Provide an API endpoint to query overlaps for a date range + scope (team/company). --- @@ -541,8 +585,24 @@ All four channels are required. never back to the comment's own author), **replacement assigned** (→ replacement, on approval) and **replacement cancelled** (→ replacement, when approved leave is cancelled) — §5.1. These are pushed (a standard NC notification is - delivered to push automatically). Provide actionable notifications (Approve/Reject - buttons where feasible) linking into the app. + delivered to push automatically). +- **Actionable where the recipient owes an answer.** The four notifications that ask + for a decision — new request, escalation, reminder, withdrawal — carry three + buttons: **Approve**, **Decline** and **Review**. + - *Approve* is a `POST` straight to `request#approve`, the same endpoint the app + uses, so the common answer costs one click and no page load. The notification + dismisses itself on success; a request whose state moved on in the meantime + fails the same way it would in the app. + - *Decline* is deliberately **not** a one-click verdict. A decline requires a + reason (§5.2), and a manager able to reject somebody's holiday from a toast + without saying why would be a worse app, not a faster one. It is a `WEB` link + to `#/requests/{id}?decide=decline`, which opens the request with the reason + box already unfolded — a step better than *Review* for someone who has decided + to say no, and still a decision they have to confirm. + - A withdrawal asks the opposite question, so its buttons read **Approve + withdrawal** / **Keep leave**, matching the sidebar's wording (§15.2). + - Notifications that merely report an outcome (approved, declined, comment, + replacement) carry no decision buttons: nothing is owed on them. - **Email:** via `OCP\Mail\IMailer` with templated messages (`OCP\Mail\IEMailTemplate`) for each of the above events. Respect the user's configured email + language. @@ -631,7 +691,11 @@ The HR area (visible only to HR-group members) provides: native PHP; XLSX via a bundled library (e.g. PhpSpreadsheet) or a documented CSV fallback if a dependency is undesirable. -Managers get a scoped version (their reports only) of the balances table and who's-off calendar. +Managers get a scoped version (their reports only) of the who's-off calendar — the +Team timeline. **The scoped balances table is specified but not yet built:** every +balance view is HR-only today, and `report#balances` asserts HR. `balance#forEmployee` +already authorises a manager to read one report's balance (`canViewBalanceOf`), so the +gap is a UI one; no frontend calls it yet. --- @@ -756,7 +820,15 @@ NcContent(app-name="absence") ### 15.2 Views - **My leave** (`#/my`) — a **"next break" hero** (gradient card with a countdown to, - or "enjoy your leave!" during, the soonest upcoming approved leave), then one compact + or "enjoy your leave!" during, the soonest upcoming approved leave). The countdown + is in whole days until the leave is **under 48 hours away**, at which point it ticks + in seconds (`H:MM:SS`, tabular figures) under the eyebrow *Almost there* — "1 day to + go" is a poor description of an afternoon. The ticking element carries `role="timer"`, + which is silent by default: an `aria-live` region here would read the clock aloud + every second. The page's clock also keeps the day count honest across midnight for a + tab left open, and only commits a new value when the rendered text can have changed, + so a hero reading "12 days to go" does not re-render the request list once a second + all year. Then one compact **balance card** per counting leave type: an animated **balance ring** (the remaining number **counts up** on load) beside a **breakdown ledger** (base allowance + carry-over ± adjustment = entitlement, minus used and pending → **available**). @@ -777,7 +849,9 @@ NcContent(app-name="absence") (`NcSelect` + org-wide user autocomplete, self excluded) appears. Optional reason (`NcTextArea`, labelled "(optional)" unless the type requires a note) and conditional note. Submit disabled until valid; negative `available` - shows an inline `NcNoteCard type="warning"` (warn, don't block). + shows an inline `NcNoteCard type="warning"` (warn, don't block). A second inline + note names the **colleagues already off** during the picked dates (§8) — debounced + as the dates move, one entry per person, "and N more" past three. - **Record absence** (HR only) — the *same* dialog opened in **HR mode** from the HR nav: adds an **employee search** (`NcSelect` with user autocomplete) and offers *all* enabled types (including sick); the balance preview is hidden (it's another person's @@ -898,7 +972,12 @@ Signature components built on top of `@nextcloud/vue`: - **`RequestSidebar`** — master-detail sidebar with Details (stepper + facts + actions), Coverage, Comments, and History (§3.7) tabs. - **`SkeletonList`** — shimmer placeholder shown while lists load (instead of a spinner). -- **`PalmIllustration`** — animated empty-state SVG (swaying palm, bobbing sun). +- **`PalmIllustration`** — animated empty-state SVG (swaying palm, bobbing sun) that + **follows the calendar**: blossom and a passing bird in spring, full sun in summer, + fronds turning and shedding in autumn, a snow-capped island and snowfall in winter. + Meteorological seasons, flipped for southern-hemisphere users off the country + already chosen for public holidays — no new setting, and no snow in a Sydney + January. A `season` prop forces one for screenshots and tests. - **`DonutChart` / `LineChart`** — dependency-free, theme-aware SVG charts for HR stats (by-type donut with legend; monthly-trend area line). **`BarChart`** (same family) powers the monthly leave-taken and sick-days charts on My leave. diff --git a/appinfo/info.xml b/appinfo/info.xml index efec2cd..3080136 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -7,20 +7,56 @@ xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd"> absence Absence - Vacation approval workflow for your company + Vacation and sick-leave management for your whole company - 1.0.6 + 1.0.12 agpl Frank Karlitschek Absence @@ -29,10 +65,15 @@ exports. https://github.com/nextcloud/absence https://github.com/nextcloud/absence/issues https://github.com/nextcloud/absence.git - https://raw.githubusercontent.com/nextcloud/absence/main/screenshots/1.png https://raw.githubusercontent.com/nextcloud/absence/main/screenshots/2.png + https://raw.githubusercontent.com/nextcloud/absence/main/screenshots/1.png https://raw.githubusercontent.com/nextcloud/absence/main/screenshots/3.png https://raw.githubusercontent.com/nextcloud/absence/main/screenshots/4.png + https://raw.githubusercontent.com/nextcloud/absence/main/screenshots/5.png + https://raw.githubusercontent.com/nextcloud/absence/main/screenshots/11.png + https://raw.githubusercontent.com/nextcloud/absence/main/screenshots/7.png + https://raw.githubusercontent.com/nextcloud/absence/main/screenshots/9.png + https://raw.githubusercontent.com/nextcloud/absence/main/screenshots/13.png diff --git a/js/NcCheckboxRadioSwitch-DVdt5Hkq-1FsQoma4.chunk.mjs.map b/js/NcCheckboxRadioSwitch-DVdt5Hkq-1FsQoma4.chunk.mjs.map deleted file mode 100644 index cad1229..0000000 --- a/js/NcCheckboxRadioSwitch-DVdt5Hkq-1FsQoma4.chunk.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"mappings":"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","names":["url","params","options","version","getBaseUrl","_build","text","vars","r","allOptions","baseOrRootURL","getRootUrl","webroot","pos","index","_arrayLikeToArray","a","e","n","_arrayWithHoles","_iterableToArrayLimit","t","f","i","l","o","u","_nonIterableRest","serializedHTML","SAFE_FOR_TEMPLATES","_stripTemplateExpressions","RETURN_TRUSTED_TYPE","_createTrustedHTML","DOMPurify","message","msg","context","level","LogLevel","buildConsoleLogger","LoggerBuilder","factory","appId","user","self","onLoaded","getLoggerBuilder","isRtl","candidateSelector","candidateSelectors","NoElement","matches","_element$getRootNode","element","_isInert","node","lookUp","_node$getAttribute","inertAtt","inert","result","attValue","_node$getAttribute2","getCandidates","filter","candidates","includeContainer","_getCandidatesIteratively","elements","assigned","nestedCandidates","content","shadowRoot","validShadowRoot","_nestedCandidates","elementsToCheck","isContentEditable","getSortOrderTabIndex","isScope","getTabIndex","tabIndex","hasTabIndex","sortOrderedTabbables","b","isHiddenInput","isDetailsWithSummary","child","getCheckedRadio","nodes","radioScope","getRootNode","queryRadios","name","radioSet","err","checked","isInput","isRadio","isTabbableRadio","nodeRoot","_nodeRoot","_nodeRootHost","_nodeRootHost$ownerDo","attached","nodeRootHost","_node$ownerDocument","_nodeRoot2","_nodeRootHost2","_nodeRootHost2$ownerD","_node$getBoundingClie","width","isHidden","_ref","displayCheck","visible","_getComputedStyle","visibility","isDirectSummary","getShadowRoot","parentElement","rootNode","isZeroArea","isNodeAttached","isDisabledFromFieldset","parentNode","isNodeMatchingSelectorFocusable","isNodeMatchingSelectorTabbable","isNonTabbableRadio","shadowHostNode","_sortByOrder","orderedTabbables","item","candidateTabindex","regularTabbables","acc","sortable","tabbable","isShadowRootTabbable","focusable","container","focusableCandidateSelector","_arrayWithoutHoles","F","_iterableToArray","option","sortAndStringify","warn","label","search","value","clearSearchOnSelect","component","top","left","dropdownList","open","uniqueId","listSlot","limitOptions","options2","optionList","createdOption","newOptions","shouldReset","val","isOpen","nextDeselect","index2","deselectToFocus","event","targetIsNotSearch","ref","predicate","match","_option","line","key","ignoreDuplicateOf","parsed","start","end","str","code","INVALID_UNICODE_HEADER_VALUE_CHARS","invalidChars","utils","sanitizeValue","trimSPorHTAB","thing","first","targets","target","$internals","defineAccessor","_header","accessors","buildAccessors","prototype","lHeader","AxiosHeaders","REDACTED","hasOwnOrPrototypeToJSON","source","config","lowerKeys","visit","seen","v","reducedValue","AxiosError","customProps","axiosError","error","response","request","redactKeys","serializedConfig","redactConfig","DEFAULT_FORM_DATA_MAX_DEPTH","isVisitable","removeBrackets","renderKey","path","token","dots","arr","predicates","toFormData","obj","formData","metaTokens","visitor","indexes","_Blob","useBlob","stack","convertValue","Buffer","depth","maxDepth","stringifyWithDepthLimit","ancestors","_key","currentValue","build","throwIfMaxDepthExceeded","el","exposedHelpers","AxiosURLSearchParams","encoder","_encode","encode","pair","buildURL","_options","serializeFn","serializedParams","fulfilled","id","fn","h","transitionalDefaults","FormData$1","Blob$1","platform$1","_navigator","hasStandardBrowserEnv","hasBrowserEnv","hasStandardBrowserWebWorkerEnv","origin","platform","toURLEncodedForm","data","throwIfDepthExceeded","MAX_DEPTH","parsePropPath","len","keys","formDataToJSON","buildPath","isNumericKey","isLast","arrayToObject","own","rawValue","defaults","headers","isObjectPayload","hasJSONContentType","isFileList","formSerializer","contentType","env","_FormData","transitional","forcedJSONParsing","JSONRequested","responseType","strictJSONParsing","status","transformData","fns","isCancel","reject","validateStatus","resolve","parseProtocol","speedometer","samplesCount","min","bytes","firstSampleTS","head","now","startedAt","bytesCount","throttle","freq","timestamp","threshold","invoke","args","lastArgs","timer","passed","bytesNotified","_speedometer","total","loaded","rawLoaded","progressBytes","progressEventDecorator","throttled","lengthComputable","asyncDecorator","isURLSameOrigin","isMSIE","cookies","expires","sameSite","cookie","secure","eq","relativeURL","malformedHttpProtocol","stripLeadingC0ControlOrSpace","normalizeURLForProtocolCheck","httpProtocolControlCharacters","assertValidHttpProtocolURL","buildFullPath","baseURL","requestedURL","allowAbsoluteUrls","isRelativeUrl","isAbsoluteURL","combineURLs","headersToObject","config1","config2","prop","mergeDeepProperties","getMergedValue","valueFromConfig2","defaultToConfig2","getMergedTransitionalOption","transitional2","transitional1","mergeDirectKeys","merge","mergeMap","configValue","FORM_DATA_CONTENT_HEADERS","setFormDataHeaders","formHeaders","policy","encodeUTF8","hex","resolveConfig","mergeConfig","newConfig","xsrfCookieName","auth","username","_config","requestData","requestHeaders","onUploadProgress","onDownloadProgress","onCanceled","uploadThrottled","downloadThrottled","done","flushUpload","onloadend","responseHeaders","timeoutErrorMessage","toByteStringHeaderObject","flushDownload","progressEventReducer","cancel","protocol","composeSignals","signals","timeout","aborted","onabort","reason","controller","CanceledError","signal","unsubscribe","chunk","chunkSize","iterable","readStream","streamChunk","stream","reader","trackStream","onFinish","iterator","readBytes","onProgress","loadedBytes","isHexDigit","charCode","isPercentEncodedByte","estimateDataURLDecodedBytes","meta","body","effectiveLen","pad","tailIsPct3D","j","idx","c","next","VERSION","DEFAULT_CHUNK_SIZE","isFunction","_","decodeURIComponentSafe","test","protocolIndex","urlToCheck","globalObject","ReadableStream","TextEncoder","envFetch","Request","Response","isFetchSupported","isRequestSupported","isResponseSupported","supportsRequestStream","duplexAccessed","hasContentType","supportsResponseStream","isReadableStreamSupported","res","type","resolvers","method","getBodyLength","encodeText","resolveBodyLength","cancelToken","withCredentials","fetchOptions","maxContentLength","hasMaxContentLength","hasMaxBodyLength","maxBodyLength","_fetch","composedSignal","requestContentLength","pendingBodyError","maxBodyLengthError","configAuth","maybeWithAuthCredentials","parsedURL","urlUsername","urlPassword","outboundLength","mustEnforceStreamBody","trackRequestStream","flush","_request","contentTypeHeader","isCredentialsSupported","resolvedOptions","declaredLength","isStreamResponse","responseContentLength","bytesRead","materializedSize","responseData","settle","canceledError","networkError","seedCache","getFetch","map","knownAdapters","httpAdapter","fetchAdapter.getFetch","renderReason","isResolvedHandle","adapter","getAdapter","adapters","length","rejectedReasons","nameOrAdapter","state","s","reasons","throwIfCancellationRequested","dispatchRequest","validators","deprecatedWarnings","opt","validator","opts","correctSpelling","assertOptions","schema","allowUnknown","Axios$1","instanceConfig","InterceptorManager","configOrUrl","dummy","firstNewlineIndex","secondNewlineIndex","stackWithoutTwoTopLines","paramsSerializer","requestInterceptorChain","synchronousRequestInterceptors","interceptor","responseInterceptorChain","chain","promise","onRejected","onFulfilled","fullPath","Axios","generateHTTPMethod","isForm"],"ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],"sources":["../node_modules/@nextcloud/router/dist/index.mjs","../node_modules/dompurify/dist/purify.es.mjs","../node_modules/@nextcloud/logger/dist/index.mjs","../node_modules/@nextcloud/vue/dist/chunks/logger-D3RVzcfQ.mjs","../node_modules/@nextcloud/vue/dist/chunks/rtl-v0UOPAM7.mjs","../node_modules/tabbable/dist/index.esm.js","../node_modules/focus-trap/dist/focus-trap.esm.js","../node_modules/@nextcloud/dialogs/dist/chunks/index.mjs","../node_modules/@nextcloud/vue-select/dist/index.mjs","../node_modules/axios/lib/helpers/parseHeaders.js","../node_modules/axios/lib/helpers/sanitizeHeaderValue.js","../node_modules/axios/lib/core/AxiosHeaders.js","../node_modules/axios/lib/core/AxiosError.js","../node_modules/axios/lib/helpers/null.js","../node_modules/axios/lib/helpers/toFormData.js","../node_modules/axios/lib/helpers/AxiosURLSearchParams.js","../node_modules/axios/lib/helpers/buildURL.js","../node_modules/axios/lib/core/InterceptorManager.js","../node_modules/axios/lib/defaults/transitional.js","../node_modules/axios/lib/platform/browser/classes/URLSearchParams.js","../node_modules/axios/lib/platform/browser/classes/FormData.js","../node_modules/axios/lib/platform/browser/classes/Blob.js","../node_modules/axios/lib/platform/browser/index.js","../node_modules/axios/lib/platform/common/utils.js","../node_modules/axios/lib/platform/index.js","../node_modules/axios/lib/helpers/toURLEncodedForm.js","../node_modules/axios/lib/helpers/formDataToJSON.js","../node_modules/axios/lib/defaults/index.js","../node_modules/axios/lib/core/transformData.js","../node_modules/axios/lib/cancel/isCancel.js","../node_modules/axios/lib/cancel/CanceledError.js","../node_modules/axios/lib/core/settle.js","../node_modules/axios/lib/helpers/parseProtocol.js","../node_modules/axios/lib/helpers/speedometer.js","../node_modules/axios/lib/helpers/throttle.js","../node_modules/axios/lib/helpers/progressEventReducer.js","../node_modules/axios/lib/helpers/isURLSameOrigin.js","../node_modules/axios/lib/helpers/cookies.js","../node_modules/axios/lib/helpers/isAbsoluteURL.js","../node_modules/axios/lib/helpers/combineURLs.js","../node_modules/axios/lib/core/buildFullPath.js","../node_modules/axios/lib/core/mergeConfig.js","../node_modules/axios/lib/helpers/resolveConfig.js","../node_modules/axios/lib/adapters/xhr.js","../node_modules/axios/lib/helpers/composeSignals.js","../node_modules/axios/lib/helpers/trackStream.js","../node_modules/axios/lib/helpers/estimateDataURLDecodedBytes.js","../node_modules/axios/lib/env/data.js","../node_modules/axios/lib/adapters/fetch.js","../node_modules/axios/lib/adapters/adapters.js","../node_modules/axios/lib/core/dispatchRequest.js","../node_modules/axios/lib/helpers/validator.js","../node_modules/axios/lib/core/Axios.js","../node_modules/@nextcloud/vue/dist/chunks/NcIconToggleSwitch-CRvGt4su.mjs"],"sourcesContent":["function linkTo(app, file) {\n return generateFilePath(app, \"\", file);\n}\nconst linkToRemoteBase = (service) => \"/remote.php/\" + service;\nconst generateRemoteUrl = (service, options) => {\n const baseURL = options?.baseURL ?? getBaseUrl();\n return baseURL + linkToRemoteBase(service);\n};\nconst generateOcsUrl = (url, params, options) => {\n const allOptions = Object.assign({\n ocsVersion: 2\n }, options || {});\n const version = allOptions.ocsVersion === 1 ? 1 : 2;\n const baseURL = options?.baseURL ?? getBaseUrl();\n return baseURL + \"/ocs/v\" + version + \".php\" + _generateUrlPath(url, params, options);\n};\nconst _generateUrlPath = (url, params, options) => {\n const allOptions = Object.assign({\n escape: true\n }, options || {});\n const _build = function(text, vars) {\n vars = vars || {};\n return text.replace(\n /{([^{}]*)}/g,\n function(a, b) {\n const r = vars[b];\n if (allOptions.escape) {\n return typeof r === \"string\" || typeof r === \"number\" ? encodeURIComponent(r.toString()) : encodeURIComponent(a);\n } else {\n return typeof r === \"string\" || typeof r === \"number\" ? r.toString() : a;\n }\n }\n );\n };\n if (url.charAt(0) !== \"/\") {\n url = \"/\" + url;\n }\n return _build(url, params || {});\n};\nconst generateUrl = (url, params, options) => {\n const allOptions = Object.assign({\n noRewrite: false\n }, options || {});\n const baseOrRootURL = options?.baseURL ?? getRootUrl();\n if (window?.OC?.config?.modRewriteWorking === true && !allOptions.noRewrite) {\n return baseOrRootURL + _generateUrlPath(url, params, options);\n }\n return baseOrRootURL + \"/index.php\" + _generateUrlPath(url, params, options);\n};\nconst imagePath = (app, file) => {\n if (!file.includes(\".\")) {\n return generateFilePath(app, \"img\", `${file}.svg`);\n }\n return generateFilePath(app, \"img\", file);\n};\nconst generateFilePath = (app, type, file) => {\n const isCore = window?.OC?.coreApps?.includes(app) ?? false;\n const isPHP = file.slice(-3) === \"php\";\n let link = getRootUrl();\n if (isPHP && !isCore) {\n link += `/index.php/apps/${app}`;\n if (type) {\n link += `/${encodeURI(type)}`;\n }\n if (file !== \"index.php\") {\n link += `/${file}`;\n }\n } else if (!isPHP && !isCore) {\n link = getAppRootUrl(app);\n if (type) {\n link += `/${type}/`;\n }\n if (link.at(-1) !== \"/\") {\n link += \"/\";\n }\n link += file;\n } else {\n if ((app === \"settings\" || app === \"core\" || app === \"search\") && type === \"ajax\") {\n link += \"/index.php\";\n }\n if (app) {\n link += `/${app}`;\n }\n if (type) {\n link += `/${type}`;\n }\n link += `/${file}`;\n }\n return link;\n};\nconst getBaseUrl = () => window.location.protocol + \"//\" + window.location.host + getRootUrl();\nfunction getRootUrl() {\n let webroot = window._oc_webroot;\n if (typeof webroot === \"undefined\") {\n webroot = location.pathname;\n const pos = webroot.indexOf(\"/index.php/\");\n if (pos !== -1) {\n webroot = webroot.slice(0, pos);\n } else {\n const index = webroot.indexOf(\"/\", 1);\n webroot = webroot.slice(0, index > 0 ? index : void 0);\n }\n }\n return webroot;\n}\nfunction getAppRootUrl(app) {\n const webroots = window._oc_appswebroots ?? {};\n return webroots[app] ?? \"\";\n}\n/*!\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: GPL-3.0-or-later\n */\nfunction generateAvatarUrl(user, options) {\n const size = (options?.size || 64) <= 64 ? 64 : 512;\n const guestUrl = options?.isGuestUser ? \"/guest\" : \"\";\n const themeUrl = options?.isDarkTheme ? \"/dark\" : \"\";\n return generateUrl(`/avatar${guestUrl}/{user}/{size}${themeUrl}`, {\n user,\n size\n });\n}\nexport {\n generateAvatarUrl,\n generateFilePath,\n generateOcsUrl,\n generateRemoteUrl,\n generateUrl,\n getAppRootUrl,\n getBaseUrl,\n getRootUrl,\n imagePath,\n linkTo\n};\n//# sourceMappingURL=index.mjs.map\n","/*! @license DOMPurify 3.4.12 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.12/LICENSE */\n\nfunction _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nfunction _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = true,\n o = false;\n try {\n if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = true, n = r;\n } finally {\n try {\n if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _slicedToArray(r, e) {\n return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nconst entries = Object.entries,\n setPrototypeOf = Object.setPrototypeOf,\n isFrozen = Object.isFrozen,\n getPrototypeOf = Object.getPrototypeOf,\n getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nlet freeze = Object.freeze,\n seal = Object.seal,\n create = Object.create; // eslint-disable-line import/no-mutable-exports\nlet _ref = typeof Reflect !== 'undefined' && Reflect,\n apply = _ref.apply,\n construct = _ref.construct;\nif (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n}\nif (!seal) {\n seal = function seal(x) {\n return x;\n };\n}\nif (!apply) {\n apply = function apply(func, thisArg) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return func.apply(thisArg, args);\n };\n}\nif (!construct) {\n construct = function construct(Func) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n return new Func(...args);\n };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst arrayIsArray = Array.isArray;\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString = typeof BigInt === 'undefined' ? null : unapply(BigInt.prototype.toString);\nconst symbolToString = typeof Symbol === 'undefined' ? null : unapply(Symbol.prototype.toString);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n return function (thisArg) {\n if (thisArg instanceof RegExp) {\n thisArg.lastIndex = 0;\n }\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n return apply(func, thisArg, args);\n };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n return function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n return construct(Func, args);\n };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n if (!arrayIsArray(array)) {\n return set;\n }\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n element = lcElement;\n }\n }\n set[element] = true;\n }\n return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n for (let index = 0; index < array.length; index++) {\n const isPropertyExist = objectHasOwnProperty(array, index);\n if (!isPropertyExist) {\n array[index] = null;\n }\n }\n return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n const newObject = create(null);\n for (const _ref2 of entries(object)) {\n var _ref3 = _slicedToArray(_ref2, 2);\n const property = _ref3[0];\n const value = _ref3[1];\n const isPropertyExist = objectHasOwnProperty(object, property);\n if (isPropertyExist) {\n if (arrayIsArray(value)) {\n newObject[property] = cleanArray(value);\n } else if (value && typeof value === 'object' && value.constructor === Object) {\n newObject[property] = clone(value);\n } else {\n newObject[property] = value;\n }\n }\n }\n return newObject;\n}\n/**\n * Convert non-node values into strings without depending on direct property access.\n *\n * @param value - The value to stringify.\n * @returns A string representation of the provided value.\n */\nfunction stringifyValue(value) {\n switch (typeof value) {\n case 'string':\n {\n return value;\n }\n case 'number':\n {\n return numberToString(value);\n }\n case 'boolean':\n {\n return booleanToString(value);\n }\n case 'bigint':\n {\n return bigintToString ? bigintToString(value) : '0';\n }\n case 'symbol':\n {\n return symbolToString ? symbolToString(value) : 'Symbol()';\n }\n case 'undefined':\n {\n return objectToString(value);\n }\n case 'function':\n case 'object':\n {\n if (value === null) {\n return objectToString(value);\n }\n const valueAsRecord = value;\n const valueToString = lookupGetter(valueAsRecord, 'toString');\n if (typeof valueToString === 'function') {\n const stringified = valueToString(valueAsRecord);\n return typeof stringified === 'string' ? stringified : objectToString(stringified);\n }\n return objectToString(value);\n }\n default:\n {\n return objectToString(value);\n }\n }\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n object = getPrototypeOf(object);\n }\n function fallbackValue() {\n return null;\n }\n return fallbackValue;\n}\nfunction isRegex(value) {\n try {\n regExpTest(value, '');\n return true;\n } catch (_unused) {\n return false;\n }\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'command', 'commandfor', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dominant-baseline', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-orientation', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lquote', 'lspace', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\nconst MUSTACHE_EXPR = seal(/{{[\\w\\W]*|^[\\w\\W]*}}/g);\nconst ERB_EXPR = seal(/<%[\\w\\W]*|^[\\w\\W]*%>/g);\nconst TMPLIT_EXPR = seal(/\\${[\\w\\W]*/g);\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n// Markup-significant character probes used by _sanitizeElements.\n// Shared module-level instances are safe despite the sticky /g flags:\n// unapply() resets lastIndex for RegExp receivers before every call.\nconst ELEMENT_MARKUP_PROBE = seal(/<[/\\w!]/g);\nconst COMMENT_MARKUP_PROBE = seal(/<[/\\w]/g);\nconst FALLBACK_TAG_CLOSE = seal(/<\\/no(script|embed|frames)/i);\nconst SELF_CLOSING_TAG = seal(/\\/>/i);\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n element: 1,\n attribute: 2,\n text: 3,\n cdataSection: 4,\n entityReference: 5,\n // Deprecated\n entityNode: 6,\n // Deprecated\n processingInstruction: 7,\n comment: 8,\n document: 9,\n documentType: 10,\n documentFragment: 11,\n notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n }\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n suffix = purifyHostElement.getAttribute(ATTR_NAME);\n }\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n};\nconst _createHooksMap = function _createHooksMap() {\n return {\n afterSanitizeAttributes: [],\n afterSanitizeElements: [],\n afterSanitizeShadowDOM: [],\n beforeSanitizeAttributes: [],\n beforeSanitizeElements: [],\n beforeSanitizeShadowDOM: [],\n uponSanitizeAttribute: [],\n uponSanitizeElement: [],\n uponSanitizeShadowNode: []\n };\n};\n/**\n * Resolve a set-valued configuration option: a fresh set built from\n * cfg[key] when it is an own array property (seeded with a clone of\n * options.base when given, case-normalized via options.transform),\n * the fallback set otherwise.\n *\n * @param cfg the cloned, prototype-free configuration object\n * @param key the configuration property to read\n * @param fallback the set to use when the option is absent or not an array\n * @param options transform and optional base set to merge into\n * @returns the resolved set\n */\nconst _resolveSetOption = function _resolveSetOption(cfg, key, fallback, options) {\n return objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key]) ? addToSet(options.base ? clone(options.base) : {}, cfg[key], options.transform) : fallback;\n};\nfunction createDOMPurify() {\n let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n const DOMPurify = root => createDOMPurify(root);\n DOMPurify.version = '3.4.12';\n DOMPurify.removed = [];\n if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n let document = window.document;\n const originalDocument = document;\n const currentScript = originalDocument.currentScript;\n window.DocumentFragment;\n const HTMLTemplateElement = window.HTMLTemplateElement,\n Node = window.Node,\n Element = window.Element,\n NodeFilter = window.NodeFilter,\n _window$NamedNodeMap = window.NamedNodeMap;\n _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap;\n window.HTMLFormElement;\n const DOMParser = window.DOMParser,\n trustedTypes = window.trustedTypes;\n const ElementPrototype = Element.prototype;\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const remove = lookupGetter(ElementPrototype, 'remove');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n const getShadowRoot = lookupGetter(ElementPrototype, 'shadowRoot');\n const getAttributes = lookupGetter(ElementPrototype, 'attributes');\n const getNodeType = Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeType') : null;\n const getNodeName = Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeName') : null;\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n let trustedTypesPolicy;\n let emptyHTML = '';\n // The instance's own internal Trusted Types policy. Unlike a caller-supplied\n // `TRUSTED_TYPES_POLICY`, this is created at most once — Trusted Types throws\n // on duplicate policy names — and is the only policy allowed to persist\n // across configurations and survive `clearConfig()`.\n let defaultTrustedTypesPolicy;\n let defaultTrustedTypesPolicyResolved = false;\n // Tracks whether we are already inside a call to the configured Trusted Types\n // policy (`createHTML` or `createScriptURL`). If a supplied policy callback\n // itself calls `DOMPurify.sanitize` (the cause of #1422), `sanitize` would\n // re-enter the policy and recurse until the stack overflows. We detect that\n // re-entry and throw a clear, actionable error instead. The guard is shared\n // across both callbacks, because either one re-entering `sanitize` triggers\n // the same unbounded recursion.\n let IN_TRUSTED_TYPES_POLICY = 0;\n const _assertNotInTrustedTypesPolicy = function _assertNotInTrustedTypesPolicy() {\n if (IN_TRUSTED_TYPES_POLICY > 0) {\n throw typeErrorCreate('A configured TRUSTED_TYPES_POLICY callback (createHTML or ' + 'createScriptURL) must not call DOMPurify.sanitize, as that causes ' + 'infinite recursion. Do not pass a policy whose callbacks wrap ' + 'DOMPurify as TRUSTED_TYPES_POLICY; see the \"DOMPurify and Trusted ' + 'Types\" section of the README.');\n }\n };\n const _createTrustedHTML = function _createTrustedHTML(html) {\n _assertNotInTrustedTypesPolicy();\n IN_TRUSTED_TYPES_POLICY++;\n try {\n return trustedTypesPolicy.createHTML(html);\n } finally {\n IN_TRUSTED_TYPES_POLICY--;\n }\n };\n const _createTrustedScriptURL = function _createTrustedScriptURL(scriptUrl) {\n _assertNotInTrustedTypesPolicy();\n IN_TRUSTED_TYPES_POLICY++;\n try {\n return trustedTypesPolicy.createScriptURL(scriptUrl);\n } finally {\n IN_TRUSTED_TYPES_POLICY--;\n }\n };\n // Lazily resolve (and cache) the instance's internal default policy.\n // Resolution is attempted at most once: a successful `createPolicy` cannot be\n // repeated (Trusted Types throws on duplicate names), and a failed or\n // unsupported attempt must not be retried on every parse.\n const _getDefaultTrustedTypesPolicy = function _getDefaultTrustedTypesPolicy() {\n if (!defaultTrustedTypesPolicyResolved) {\n defaultTrustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n defaultTrustedTypesPolicyResolved = true;\n }\n return defaultTrustedTypesPolicy;\n };\n const _document = document,\n implementation = _document.implementation,\n createNodeIterator = _document.createNodeIterator,\n createDocumentFragment = _document.createDocumentFragment,\n getElementsByTagName = _document.getElementsByTagName;\n const importNode = originalDocument.importNode;\n let hooks = _createHooksMap();\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n const MUSTACHE_EXPR$1 = MUSTACHE_EXPR,\n ERB_EXPR$1 = ERB_EXPR,\n TMPLIT_EXPR$1 = TMPLIT_EXPR,\n DATA_ATTR$1 = DATA_ATTR,\n ARIA_ATTR$1 = ARIA_ATTR,\n IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE$1 = ATTR_WHITESPACE,\n CUSTOM_ELEMENT$1 = CUSTOM_ELEMENT;\n let IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n /*\n * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false\n }\n }));\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n tagCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n }\n }));\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n /* Decide if document with ... should be returned */\n let WHOLE_DOCUMENT = false;\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n /* Pristine allowlist bindings captured at setConfig() time. On the\n * persistent-config path sanitize() restores the sets from these before\n * the per-walk hook clone-guard, so a hook's in-call widening cannot\n * carry across calls. Null until setConfig() is called; reset by\n * clearConfig(). */\n let SET_CONFIG_ALLOWED_TAGS = null;\n let SET_CONFIG_ALLOWED_ATTR = null;\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script',\n // mirrors the selected