* Added a new Conference page under Extension Settings
where PBX subscribers can manage their own
conference_max_participants and conference_pin
* Page and fields are gated through subscriber profile
attributes for administrative purposes
* Restricted the route and menu entry to PBX admin users
and added the new Conference entry to the
Extension Settings menu
Change-Id: I002c79ce6653e1183c6348775184a5a92ea8f737
* Added Seat as a call forwarding destination option
* Enabled editing existing seat destinations in forwarding rules
* Seat search matches partial text and calls api on every stroke
Change-Id: I3b57406185167392380d2ec2d65db4447937229b
* Replaces PROFILE_ATTRIBUTES_MAP.* lookups for
PROFILE_ATTRIBUTE_MAP.managerSecretary and
PROFILE_ATTRIBUTE_MAP.autoAttendant one the
Manager Secretary and Auto Attendant submenu checks
Change-Id: I4b5395afa037bcd043357965a4f56d7d8d92de7a
- Removed "Hide number within own PBX" from PBX Seat creation form
- Removed "Hide number within own PBX" from PBX Seats actions menu
- Removed "Music on hold" from PBX Seats actions menu
These preferences are now only configurable in the PBX Seat details to avoid duplication and simplify the UI.
Change-Id: I8c9c8967bf4039f02b5848dea33285d04b0451c1
* Reworked call forwarding group item text to show
Forwarded to X for N seconds from the current timeout
* Added the necessary translations
* Refactors update logic for changedDestinationTimeout
with the use of a watcher
Change-Id: Ie0b4b8194c68b5cc3f5ddfac2a091be308e0e910
Fix default value for CQ part:
If the subscriber has call queue activated, use their wrap-up time
as the default value; otherwise, set the default value to 10.
Change-Id: I1e11417690d4119ce396939721cbc96f6c5ef9b8
* Fixes missing translation for "If not available"
in german
* Call back button on the subscriber phonebook
was moved before the more menu
Change-Id: I6daa0623173c0251c2c72149419bc8f122687473
* Created two PBX configuration fields for both
seat and group preferences
* Admin users can now specify the maximum number
of conference participants as well as the conference
pin if they so desire
* Fixes the PATCH flow so that it follows the following structure
1. create new: PATCH add
2. amend entry: PATCH replace
3. remove entry: PATCH remove
* We no longer use PATCH replace with an empty payload
to remove an entry
* Added label translations
Change-Id: I3e349c0d0cc896c6dcbb2ada0a9588e3b96c945a
- Convert all actions from .then()/.catch() chains to async/await
- Extract savePreference() helper to centralise error handling and
state commits, avoiding repetition across every action
- Extract updateBooleanPreference() helper. It covers the following
scenarios:
* new value is false: remove PATCH property in DB
* new value is true: add PATCH property in DB
* new value is true AND the value already exist in the
customer preferences: replace PATCH to amend property in DB
(added to avoid regression introduced by previous code, which
saved a property as false instead of removing it)s
- Add proper add/set/remove logic to updateBlockInList,
updateBlockOutList and updateBlockOutOverridePin: previously all
three always called setCustomerPreference regardless of whether the
preference existed or was empty
- Split logic to add, remove and edit customer preferences
Change-Id: Ie419de31631b9ef1b06653446dfbe1a33a10c225
When toggling multiple CFs on/off in quick succession,
the PATCH request returns inconsistent results,
randomly multiplying resources.
To avoid this, we now retrieve the updated mappings
using cfLoadMappings() after the PATCH request and
we disable the toggle while other
csc-cf-mappings-full actions are performed
This is a temporary fix while the backend team resolves
the root cause, as the work is already in the pipeline.
The fix has been applied only to the setMappingEnabled
method, as it appears to be the only one affected due
to the possibility of multiple consecutive calls.
The fix has been applied only to the setMappingEnabled method, as it appears to be the only one affected due to the possibility of multiple consecutive calls.
Change-Id: Ideb999e3871ea6b7f8a0d1a3b5979cd2ad88706e
* Created buttons to change the order of movable call
forwarding destinations
* Only destinations with DestinationType = Number are movable
* Moving a destination automatically patches the priority in
the backend
* Buttons show up only when destination is movable
Change-Id: Ie33091da291a1108aae10d7c00c72a1187854e5e
Introduces a new form to create a Call Forward and select its destination
in a single step. Applies to Call Settings > Forwarding and Seats/Groups CF.
UI:
- Creation button is disabled until destination type is selected and all
required fields are filled
- "Number" type requires a destination number
- "Custom Announcement" type requires a custom announcement
- Form shows a loading state until all backend resources are created and loaded
- 3 dots menus are disabled until loading is done
- Destination Options list changes depending on platform type (CE/pro)
and PBX feature
Creation flow:
1. rewrite destination based on type and input
2. Create destination → receive ID from API
3. Create mapping using the destination ID
Improvements:
- Add try/catch blocks to CF actions and remove them from API file
- Remove use of 'common.js' methods from CF actions
- Rename 'toggleMapping' to 'setEnableMapping'
- Rename 'createSpecificDestination' to 'resolveSubscriberDestination'
- Update deleteMapping
- Replace duplicate destinationSets, sourceSets, timeSets arrays with maps
for faster lookup and single source of truth. Create relevant getters
when needed.
- Remove use of cloneDeep from lodash to gain better performance
(shallow copies instead of deep clones) and be consistent with Vuex
best practices (immutability with spread operator)
Change-Id: I99ba019ac3995ddaa118f9a523f8adcd47db5a35
* depends on: "node": "node": ">=24.14.0 < 25"
* updates debian rules and control file
* update the ENV syntax to avoid the deprecation warning
Change-Id: I74e7961f5163e1eebfef8ca8ec3446333a548f5f
- Removed `crypto-browserify` from package.json and quasar.config.js
(unused webpack polyfill that was bundling vulnerable bn.js and
elliptic into the production build)
Bumped up packages:
* glob
* globals
* jest
* @quasar/app-webpack
Yarn resolutions added
- `serialize-javascript: ^7.0.3` — fixes high-severity RCE vulnerability
via RegExp.flags/Date.toISOString() (CVE in terser-webpack-plugin and
@quasar/ssr-helpers paths)
- `**/postcss-svgo/svgo: ^4.0.1` — fixes high-severity Billion Laughs
DoS (XML entity expansion) in cssnano's SVG optimization pipeline
- `dot-object/minimatch: ^3.1.2` — fixes high-severity ReDoS in
dot-object's glob dependency
- `**/flatted: 3.4.0` — fixes high-severity unbounded recursion DoS
in eslint and eslint-webpack-plugin's caching layer
What remains (30 vulnerabilities — all upstream-blocked)
The remaining vulnerabilities are entirely confined to dev-only
tooling and cannot be fixed without upstream releases:
- minimatch ReDoS across jest, @vue/test-utils, jest-serializer-vue,
@quasar/app-webpack, @quasar/quasar-app-extension-testing-unit-jest
- ajv ReDoS across eslint, eslint-webpack-plugin, @quasar/app-webpack
- webpack SSRF (buildHttp feature, not used in this project)
- qs DoS in webpack-dev-server's express (local dev only)
- esbuild dev server CORS issue (local dev only)
- vue-template-compiler XSS (no patch available upstream)
- tmp symlink issue, @tootallnate/once control flow (test tooling only)
Change-Id: I72f34757538f97bb3495a57d7f0263df58102f1e
Remove unused code:
* Removed Application destination type as it is unused
* Comment removed from destinations helpers
* Provider for composition api removed because it
was duplication the store
* Remove DestinationType from Destination mixings
Refactor call forwarding api and actions:
* Add try/catch blocks to CF actions and remove them from API file
and components for more centralised approach
* Remove use of 'common.js' methods from CF actions
* Rename 'toggleMapping' to 'setEnableMapping'
* Rename 'createSpecificDestination' to 'resolveSubscriberDestination'
* Improve deleteMapping
* Replace duplicate destinationSets, sourceSets, timeSets arrays with maps
for faster lookup and single source of truth. Create relevant getters
when needed and update components.
* Remove use of cloneDeep from lodash to gain better performance
Change-Id: I8ad368eb8be0231138fbd44c18e2f74fd490f1d8
* Implemented priority flow as sort -> normalize to 0..n-1
across fetch/create/edit/remove
* On creation handles priority incrementally
* On edit, arranges and normalizes (if needed) priority values
* Enforced the same move rules in store action (moveDestination)
to block invalid reorders.
* Removes references to LocalSubscriber
* Fixes unit tests
Change-Id: Ib64cc30ea75141692085ec38df5c528565389469
We need to also drop the dependency on yarnpkg in env/Dockerfile, to
match the behavior within Debian/control, which was updated in commit
bd8a150825
("MT#55813 MT#55391 Use bundled yarn").
But there's no need to duplicate the Dockerfile usage with t/Dockerfile
*and* env/Dockerfile, so let's drop the unused ngcp-csc-ui-env-* one, to
avoid any further confusion.
While at it, update the ENV syntax to avoid the deprecation warning.
Change-Id: I0c098c52737c4119b625214347939374e3160273
The CF to Local Subscriber feature has been removed
in ticket MT#59011 but never deleted from CSC.
Change-Id: I1ed32c4db3e4ee2e0be8ab2218efe0ec48c3a098
- Add "On no answer" option to the "Add forwarding" dropdown menu
to create CFT mappings directly
- Update forwarding actions to support the new CFT creation flow
- Reset cft_ringtimeout to null when cft mappings become empty
This change introduces a dedicated menu option for creating
"On no answer" (CFT) call forwarding rules, improving
the user experience by making this common use case more accessible.
Change-Id: I8570e63a292dcbe6ae1c2e37a0846c581b7887b6
* fix updateSharedValue to be less flacky: it was using
the reference of row, mutated, to make the backend request.
It now use a value stored in a variable.
* amend getList to make sure we pass the default page (1)
when looking for all rows with api v1.
Change-Id: Ia8c4fcb1547c16a6a3e862f864fbc5aecda3e065
Our nightly tests flagged the fact that
the feature was unstable and unrealiable.
Changes:
* Extract subscriber phonebook api and state
* Change direct use of http in the sub-phonebook
method to use the relevant method in common.js
* Simplify logic to PATCH single properties
with a unique PUT in the Phonebook entry form
* Amend getList, handleResponseError and
put to allow use with API v2 endpoints
* Amend translations and methods to replace
"phonebook" with "phonebook entry" where
necessary
Change-Id: I189d45fe426a1ded400a251d7efdfa72f76f9061
- Replace disabled flag in 3-dot menu with a visible toggle
- Keep normal text colors when CF is enabled
- Allow full configuration even when CF is disabled
- Set newly created CF as disabled by default
Change-Id: I9c5bfdd178d07ca5ba5705ccc7622b7a17a7c65c
Update axios to version 1.13.5 to fix a
denial‑of‑service issue in mergeConfig when
using malicious config object.
Change-Id: I4c1d2b3de42d7ab854ffaaee07e30fcb98d4cadc
- Keep callNumberInput getter returning full input for display purposes
- Use callNumberNormalized getter to strip domain before making calls
- Add callNumberNormalized to component's mapped getters
- Update startCall validation to use normalized number
Change-Id: I4172a4f426bf7f827e3ff717a901b8a64f4264d1
e2e-testing.js automatically generates data-cy attributes for Vue components
used in Cypress E2E tests.
Component names were lost during the Vue 3 syntax migration, which broke
automatic data-cy generation. This change restores component names so the
test suite works again.
Change-Id: Ia643bdf3989970243101eb7c0c275b5323a9224d
- force @isaacs/brace-expansion 5.0.1 (patches minimatch/glob issue)
- force qs 6.14.1 (patches express/body-parser issue from quasar tooling)
- force tar 7.5.7 (patches node-gyp/tar issue pulled via npm)
- note: npm itself has no patch plus the dep was not used so we
removed it.
Change-Id: Ic145cbc509d80cf9d96b9a053de1ce0a7d8dc5a8
* Add testEnvironment: 'jsdom' to provide browser-like
globals (DOM APIs) that Vue and test-utils need
* Add explicit module path mapping in jest.config.js
to force Jest to use the CommonJS bundle instead of
the browser bundle.
Change-Id: I659b122ed3884c229b5f6dab1f08e135bcb8c03d
Modernize vue-wait initialization and usage patterns to support Vue 3
Composition API while preserving Vue 2 Options API functionality.
Changes:
- Migrate App.vue to Vue 3 <script setup> syntax
- Convert Options API to Composition API
- Use defineComponent and reactive state management
- Maintain existing functionality and lifecycle hooks
- Refactor vue-wait initialization (boot/vue-wait.js)
- Move initialization from App.vue mounted() to boot phase
- Create initializeWait() function for explicit setup
- Register $wait globally before component mounting
- Add Vue 3 composable support (composables/useWait.js)
- Create useWait() composable for Composition API components
- Access $wait via getCurrentInstance() for proper Vue 3 patterns
- Enable gradual migration from Options to Composition API
- Update documentation (doc/architectural-overview.md)
- Add "Loading State Management (vue-wait)" section
- Document usage patterns for both Vue 2 and Vue 3
- Clarify migration strategy and coexistence
Note:
All existing Vue 2 components using this.$wait continue working unchanged
while new Vue 3 components can use useWait() composable.
Change-Id: I62c9eaa81336a1ae115f1b326676497dcac262b2