Compare commits

...

500 Commits

Author SHA1 Message Date
Alex 48a0990d51
Dashboard - Fix device keys and call center agents background color (#7352)
* Fix background color on device keys and call center agent widgets

* Update call_center_agents.php

* Update index.php

* Update index.php

* Update device_keys.php

* Update call_center_agents.php

* Update call_center_agents.php

* Update device_keys.php

* Update config.php

* Update index.php

* Update device_keys.php

* Update call_center_agents.php

* Update index.php

* Update index.php

* Update device_keys.php

* Update call_center_agents.php

* Update call_center_agents.php

* Update device_keys.php
2025-04-04 11:23:22 -06:00
chansizzle 6e171710f6
Add yealink_backlight_time to default settings -> provision section (#7353)
This variable allows automatic provisioned Yealink devices to dim the backlight after X seconds. Disabled by default.
2025-04-03 15:56:24 -06:00
FusionPBX edb6e43462
Create the token once for Active Calls
Improve efficiency by using one token for active calls.
When token generated inside the include it would generate many tokens.
2025-04-01 12:16:17 -06:00
frytimo b01bf7d08c
Add clear settings object cache when modifying or adding setting (#7351)
When a setting is modified, the settings cache can be reloaded allowing the setting that was modified or added to take immediate effect. The call to allow any other clear cache methods to be called will allow any new features to have their settings also take effect. The settings are first cleared though so that any of the other classes that may require updated settings to work with, ensure that they have the newest default setting values.
2025-04-01 10:19:37 -06:00
FusionPBX 4f4a1f9c15
Update switch.php 2025-04-01 09:13:41 -06:00
Antonio Fernandez 7040635baf
Bug Fix - music on hold path (#7349) 2025-04-01 09:10:53 -06:00
frytimo 5ed20f1c2f
Fix plugin class name mismatch in auto loader (#7350)
* Fix plugin class name mismatch in auto loader
When matching the file name of the plugins in the authentication plugin folder they do not match. This causes auto loader not to find and load the class.

* Update auto_loader.php

---------

Co-authored-by: FusionPBX <markjcrane@gmail.com>
2025-04-01 09:07:26 -06:00
frytimo 5c1be1a318
Update clear cache method for settings object (#7348)
* update clear cache method for settings object

* re-use the database object from settings object
2025-03-31 10:04:33 -06:00
FusionPBX 7d51c8cdd5
Update text for Unregistered, Provisioned, and Rebooted 2025-03-29 15:13:38 -06:00
FusionPBX 98d7fd025c
Fix the registration reboot message 2025-03-29 14:50:07 -06:00
FusionPBX f9bd89ef78
Fixed the response when the result is an array 2025-03-29 14:48:45 -06:00
FusionPBX 091dca3ceb
Update footer.php 2025-03-29 13:39:24 -06:00
FusionPBX 0b9fd924a9
Add not empty check on the domains session 2025-03-29 13:20:38 -06:00
FusionPBX e5e63a3846
Update extension_edit.php 2025-03-29 11:29:58 -06:00
chansizzle 590e58c388
Update extension_edit to populate device servers (#7347)
This pull request fixes the code for adding extensions and a device is added to the extension.

These device fields are populated if they are defined and enabled in default setttings. This works if the data types = text (the default) and it works if the data types = array (very useful for server clusters)
2025-03-29 11:27:03 -06:00
FusionPBX efd9f8979e
Use standard time GMT offset 2025-03-28 17:45:13 -06:00
Alex 7148ba3c66
Prevent date time picker from getting clipped (#7345) 2025-03-28 15:50:39 -06:00
chansizzle c6ecf73fa6
add firmware for yealink T19P (#7344) 2025-03-28 15:21:40 -06:00
FusionPBX c6dd43cff0
Update code to use the server_address_secondary 2025-03-28 12:37:01 -06:00
frytimo 0882b148ec
Check outbound_proxy and server_address for array with drop-down field (#7343)
- Check the outbound_proxy_primary and outbound_proxy_secondary default value for an array value so the drop-down field on the device edit page can be filled.
- Use a variable to get the value from the settings class for server_address_primary and server_address_secondary instead of calling the settings class three times for each value.
2025-03-28 10:50:43 -06:00
frytimo 0e143764e8
Sets the default value for Limit Max field when adding a new extension (#7342) 2025-03-28 10:49:47 -06:00
FusionPBX d1d24a0a9c
Add yealink_force_voice_ring_volume
Forced ringer volume: 0 - 15
2025-03-27 17:44:10 -06:00
Alex aceb77d70e
Dashboard Edit - Only show target, width, and height if needed (#7341) 2025-03-27 16:18:50 -06:00
Alex c305685d23
Fix dashboard edit defaults (#7340)
* Fix dashboard edit defaults

* Update app_defaults.php

* Update config.php
2025-03-27 15:41:38 -06:00
frytimo 00c6befb70
Add missing file path when cache miss in auto_loader (#7339) 2025-03-27 13:33:36 -06:00
FusionPBX 7fe291dfcf
Update xml_cdr.php
Use the permission_exists and is_uuid conditions at the top of the download class method. If false use return to prevent running code without the right permission and a valid uuid.
2025-03-26 18:34:54 -06:00
Alex 5f7ef8848e
Fix typo (#7337) 2025-03-26 14:57:24 -06:00
frytimo b5af974d34
Add backslash to the trim command (#7338) 2025-03-26 14:56:55 -06:00
frytimo c165afc53e
Fix trim command on interface name (#7336) 2025-03-26 13:11:37 -06:00
FusionPBX 288f693c12
Increase the delay when database is not connected 2025-03-26 11:48:18 -06:00
FusionPBX 90b774e86d
Add default setting daylight_savings_auto 2025-03-26 11:44:17 -06:00
FusionPBX 67da2f2a3d
Make sure the database connection is available 2025-03-26 11:30:34 -06:00
frytimo 2ae77071e2
Fix call recordings maintenance path (#7334) 2025-03-25 14:44:20 -06:00
FusionPBX ba413775c7
Get the login destination from the settings 2025-03-24 19:06:09 -06:00
FusionPBX 9d43254603
Set enabled to true by default 2025-03-24 18:29:09 -06:00
FusionPBX 9ee9aa4023
Update xml_cdr.php 2025-03-22 21:03:19 -06:00
FusionPBX f58ed065fc
cdr http_enabled default to false
Using the file system by default instead of HTTP POST
2025-03-22 17:09:51 -06:00
FusionPBX 7fae8eefca
Update xml_cdr.php 2025-03-22 17:03:37 -06:00
Brett@NGEN cf55ca59ed
Corrected case errors in provisioning template for Grandstream GHP6xx Series (#7203)
* Corrected case errors for Grandstream GHP6xx Series

* Corrected case - remotecontrol

* Update {$mac}.xml

* Replaced all camel case within XML element names

* Found a few more

Matching pattern: name=".*[a-z][A-Z].*"
2025-03-22 16:45:14 -06:00
FusionPBX f420a08802
Add grandstream_random_port #6055 2025-03-22 16:34:30 -06:00
FusionPBX 62877b7aab
Add grandstream_random_port 2025-03-22 16:29:36 -06:00
FusionPBX 5b77e3d62b
Ring Ready support disabling it in dialplan #6536 2025-03-22 16:06:18 -06:00
FusionPBX 48661c3aa6
Update sip_status.php 2025-03-22 15:45:19 -06:00
emak-Corey efed19ef1c
Sort the 'sofia xmlstatus' profiles alphabetically (#6091)
* Sort the 'sofia xmlstatus' profiles alphabetically

Added function to sort the 'sofia xmlstatus' SIP profiles alphabetically to match the sort order lower down in the page.
2025-03-22 15:43:58 -06:00
Ahron Greenberg (agree) 0e2b083807
Fix adding duplicate device error (#6490)
* [extensions] Fix adding duplicate device error
2025-03-22 12:55:15 -06:00
FusionPBX 0706b52427
Update destinations.php 2025-03-22 12:33:45 -06:00
mbarvoipdrs d44e7c0c5f
Yealink W60B Updates (#5600)
Adding Alarm server lines to be used with ver 85 firmware and the W59R handset.
2025-03-21 21:02:20 -06:00
FusionPBX cd5693dbd4
Update check for duplicate destinations
Account for destination_prefix
2025-03-21 21:00:37 -06:00
frytimo 52d8f436e4
Replace session variables with the settings class (#7271) 2025-03-21 20:11:44 -06:00
FusionPBX 1778963607
Calculate the daylight savings settings 2025-03-21 19:51:27 -06:00
frytimo d3cedcf17f
Add wifi function enabled (#7333)
* add wifi function enabled
2025-03-21 18:02:54 -06:00
frytimo 449b689840
Fix wifi function enabled (#7332) 2025-03-21 17:50:01 -06:00
frytimo a5e63e0fce
unset the parameters array (#7331) 2025-03-21 10:53:46 -06:00
Stephen Forster 1f2d7e1ceb
Show to superadmin group that has dialplan_all permission (#5458)
If permissions to dialplans is given to anyone other than superadmin then they should not be able to see GLOBAL dialpans unless they have dialplan_all permission as well.

* Update dialplans.php
2025-03-21 10:49:41 -06:00
frytimo b82d9f17a7
Fix exception thrown for order by used in count devices clause (#7330) 2025-03-21 10:33:22 -06:00
frytimo 891e9e3dfa
Use auth_id instead of user_id for pcode 36 (#7329) 2025-03-21 09:44:36 -06:00
frytimo 64a8715245
Fix user id instead of auth id used in grandstream template (#7326) 2025-03-20 23:51:03 -06:00
fusionate e460c4f180
Access Control - Edit: Remove unintended single-quotes when dig domain used as Description. 2025-03-20 17:26:42 -06:00
fusionate 5d37e2a570
Access Control - Edit: Add additional sanitization on dig value. 2025-03-20 17:20:14 -06:00
fusionate 7b8340f021
Access Control - Edit: Escape submitted values in dig command. 2025-03-20 09:51:37 -06:00
FusionPBX a6a39e6d8a
Add fax to the add fax_files table if the file exists 2025-03-19 13:26:31 -06:00
fusionate 7787c4fd73
Default/Domain/User Settings - Edit: Correct Google Fonts URL. 2025-03-18 18:08:26 -06:00
fusionate a482326930
Default/Domain/User Settings - List & Edit: Do not mask new input_text_font_password setting. 2025-03-18 18:04:49 -06:00
fusionate 42c96239c8
Theme: Set select password fields to monospace font when revealed. New input_text_font_password setting to control default font. 2025-03-18 17:55:41 -06:00
FusionPBX 0bec2b9aef
Remove empty XML CDR files 2025-03-18 13:40:47 -06:00
FusionPBX dce8f1ba8a
Update algom{$mac}.conf 2025-03-18 13:25:31 -06:00
Antonio Fernandez c8699a5797
bug fix for voicemail edit transcription (#7324)
* bug fix for voicemail edit transcription

* Update voicemail_edit.php
2025-03-18 09:36:24 -06:00
frytimo 6d356194ba
Ensure apcu_cache_info function is available before calling (#7323) 2025-03-17 14:58:36 -06:00
frytimo 1572c76963
Use regex in autoloader instead of include (#7322) 2025-03-17 10:01:11 -06:00
frytimo ad1ba95566
Fix undefined constant error when flushing cache (#7321) 2025-03-17 10:00:25 -06:00
frytimo 0a42d8f198
Add caching to the auto_loader for interfaces (#7320)
* update auto loader to load and cache interfaces

* use new method to update the auto loader cache

* use new interface

* use new interface to trigger a cache flush

* update the console upgrade menu

* update the missing implements syntax

* add the clear_cache to the flush cache button
2025-03-15 09:13:36 -06:00
frytimo 99b3100ee9
fix typo in require.php file (#7319) 2025-03-14 22:55:00 -06:00
FusionPBX 8a1421eb97
Fix call timeout for ring strategy enterprise
Call timeout ignored with enterprise adjust the destinaton_timeout to honor the call timeout
2025-03-14 20:31:06 -06:00
Alex 89eeeb84ae
Use settings object in css.php (#7317)
* Use settings object in css.php

* Update css.php
2025-03-14 16:57:29 -06:00
Alex 1e96df6e95
Change $setting to $settings (#7318)
* Change $setting to $settings

* Update app_defaults.php

* Update fax_queue.php

* Update xml_cdr.php

* Update email_queue.php

* Update transcribe.php

* Update send.php

* Update fax_queue.php

* Update fax_send.php

* Update app_defaults.php

* Update email_queue.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php

* Update app_defaults.php
2025-03-14 16:19:49 -06:00
Alex 7639f0755c
Update xml_cdr.php (#7315)
* Update xml_cdr.php

* Update css.php

* Update template.php
2025-03-13 14:58:15 -06:00
Alex 5dffd4d6e0
Add CDR column_overflow default setting (#7314)
* Add cdr column_overflow default setting

* Update app_config.php

* Update xml_cdr.php

* Update default_setting_edit.php

* Update template.php

* Update app_languages.php

* Update css.php
2025-03-13 14:49:30 -06:00
frytimo 77d2b3099a
Create get methods for domain_uuid and user_uuid (#7144)
* create get methods for domain_uuid and user_uuid
2025-03-13 14:32:51 -06:00
FusionPBX 17b938698e
Start with the require.php 2025-03-13 13:08:36 -06:00
chansizzle e6bfaf21ee
Remove escaping character typo (#7311)
escaping character not needed on the template_subject
2025-03-13 11:30:42 -06:00
FusionPBX b0a630e80a
Use no-wrap class 2025-03-13 11:25:15 -06:00
Alex b5592e84c7
Fix fatal error on fax send (#7313) 2025-03-13 11:04:40 -06:00
FusionPBX ee28c6d203
Fix Call Detail Records with invalid xml 2025-03-13 10:06:36 -06:00
FusionPBX 6c6814b29e
Remove syntax that breaks older PHP
Removed :static to support PHP 7.4
2025-03-12 23:39:24 -06:00
frytimo bed7c8827f
fix missing quotes on parameter default value (#7310) 2025-03-12 20:50:14 -06:00
chansizzle 95761621a6
improve emergency emailing (#7309)
* improve emergency emailing

1. set emergency CID name & number to the outbound CID name & number if emergency CID name & number are not set
2. remove duplicate item in email body
3. change the hardcoded email subject '911 Emergency Call' to be dynamically provided from the event. I do not like seeing the subject '911 Emergency Call' when it is an TEST call.

* improve emergency emailing

1. change the hardcoded email subject '911 Emergency Call' to be dynamically provided from the event. I do not like seeing the subject '911 Emergency Call' when it is an TEST call.
2. fix email template misspelling
3. improved email template with bold fonts
2025-03-12 17:39:05 -06:00
FusionPBX 31a88e3a15
Update auto_loader.php 2025-03-12 14:48:33 -06:00
FusionPBX 7897ff5b9e
Clear the cache 2025-03-12 14:42:50 -06:00
frytimo 08001488f4
Allow namespace in auto loader (#7307)
* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove class_exists wrapper for class definitions

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove include statement of class file

* remove closing tag

* remove invalid method params

* remove closing tag

* remove closing tag

* Update auto_loader to load each class file in the project
Update the auto_loader class to use an include statement on each file in the project to load the class within the file. This will allow mismatched names within the file to be loaded and mapped according to the declaration instead of the filename. The class is then checked against the parsed classes from the PHP engine so that namespaces are available and mapped to the file they were declared in. An update was also made to the search algorithm used to find a file that was not already loaded by collapsing the array to have only valid matches to increase performance on a cache miss. Logging within the auto_loader has been moved to a function.
Multiple files were modified to allow the include statement. When the class has the `if(class_exists())` statement, the auto_loader is called to check for the class. This caused an infinite loop scenario so all wrappers have been removed. The auto_loader will now break the loop by directly modifying the internal classes array instead of trying to restart with the 'reload_classes' method.

- APCu is used to cache classes so any loading of the classes is done only once. To clear the APCu cache, restart php-fpm or call the auto_loader::clear_cache() function.
- Cache file is used when APCu is not available. To clear the cache remove it from the tmp folder or call the auto_loader::clear_cache() function.
- All classes must no longer have a class_exists wrapper to benefit from the performance boost.
- Classes should not be directly included when the auto_loader is used.

* remove include statement of class file

* Update destinations.php
2025-03-12 13:55:47 -06:00
Alex abb95e38bb
Add content card to outbound route add and pin number export (#7308)
* Add content card to outbound route add and pin number export

* Add content card
2025-03-12 13:37:26 -06:00
Alex 43edc82cbe
Fix header user menu when using inline or static menu style (#7306)
* Fix header user menu when using inline or static menu

* Update template.php
2025-03-12 13:15:38 -06:00
FusionPBX 7a167f70af
Get emergency emails from both default and domain settings 2025-03-12 11:37:27 -06:00
FusionPBX 81ab295059
Update template.php 2025-03-12 10:41:39 -06:00
chansizzle 20f3c4eb71
Add CDR Details, Call Recordings Play, and Call Recordings Download to emergency logs (#7301)
* Create download.php

download.php is required to play and download call recordings

* add CDR Details and Call Recording to emergency logs

* add CDR Details and Call Recording to emergency logs

* combine call details column and call status column

removed the call details column
make the call status column be the hyperlink to the cdr details page

* combine call details column and call status column

removed the call details column
make the call status column be the hyperlink to the cdr details page
2025-03-12 09:40:44 -06:00
Alex 3167a8ce49
Use scroll bar if there are too many columns in a content card (#7300) 2025-03-12 09:40:02 -06:00
FusionPBX af9691ff41
Fix missed_call use as boolean 2025-03-11 19:54:54 -06:00
FusionPBX c3e5647c03
Update app_defaults.php 2025-03-11 19:36:56 -06:00
Alex 885df6b3fb
Add count div to domain selector (#7305)
* Add count div to domain selector
2025-03-11 16:11:40 -06:00
frytimo da6471df5f
Optimize require.php (#7286)
Load the auto_loader first
Use config object to find config.conf file and declare global
Use database object and declare global
Use settings object and declare global
2025-03-11 14:37:31 -06:00
Alex d9827f8800
Use table_row_text settings for domain selector text size and font (#7302) 2025-03-11 14:32:50 -06:00
FusionPBX 1be15d7d9c
Update responsive design 2025-03-11 14:27:45 -06:00
Antonio Fernandez ca2b0b22dd
Update algom{$mac}.conf (#7299)
admin password is now added via provisioning
2025-03-10 17:34:43 -06:00
Alex 5ff0af430f
Fix domain settings content cards (#7298) 2025-03-10 11:34:31 -06:00
Alex 35aa781c90
Add content card to device export and pin numbers (#7297)
* Add content card to device export and pin numbers

* Update pin_numbers.php

* Update pin_number_edit.php

* Update device_download.php
2025-03-10 10:26:27 -06:00
FusionPBX 8ef90b9dcc
Update xml_cdr.php 2025-03-08 14:42:35 -07:00
FusionPBX a099de0c6f
Fix the contact import 2025-03-08 14:37:15 -07:00
FusionPBX 5391745155
Update abstraction.conf.xml 2025-03-08 08:59:22 -07:00
chansizzle 8f5d5b58b3
add call status to emergency logs page (#7278)
* add call status to emergency logs page
2025-03-08 07:20:39 -07:00
Alex bb5320e6ca
Change menu multi column dropdown width based on text size (#7296) 2025-03-07 16:27:21 -07:00
fusionate da19ca7a7c
Login: Display Cancel link to reset form if failure using database authentication. 2025-03-07 12:10:52 -07:00
fusionate dd3288585c
Menu: Add setting to reload menu when changing domains. 2025-03-06 20:08:48 -07:00
chansizzle 8f354b54de
add new active calls permissions (#7294)
Add new permissions to the active calls page so the fields can be removed from an admin permissions group to simplify the page, hiding more technical fields they probably will not find helpful.
2025-03-06 18:54:57 -07:00
chansizzle a1c03c364a
add new active calls permissions (#7295)
Add new permissions to the active calls page so the fields can be removed from an admin permissions group to simplify the page, hiding more technical fields they probably will not find helpful.
2025-03-06 18:54:43 -07:00
fusionate fce7a9401a
Dashboard - Edit: Display domain after domain-specific group names. 2025-03-06 16:17:53 -07:00
frytimo fbeb65428e
fix bug for registration count (#7293) 2025-03-06 15:46:17 -07:00
Alex 8b95f62d39
Fix logout icon alignment (#7291) 2025-03-06 15:38:31 -07:00
Alex 941ec9c060
Add input_height default setting (#7292)
* Add input_height default setting

* Update app_config.php
2025-03-06 15:38:12 -07:00
Alex 397db90533
Add content card div to call block recent calls (#7290) 2025-03-06 10:17:41 -07:00
fusionate 03030465d9
Audio Waveform: Boolean adjustments. 2025-03-05 16:09:17 -07:00
Alex b418a892e3
Align action bar text to the left (#7289) 2025-03-05 15:39:05 -07:00
FusionPBX 7ac2f76804
Use audio_player_waveform_enabled as boolean 2025-03-05 15:23:13 -07:00
frytimo e9739d2b06
Use single event socket object in registrations class (#7288)
* Use single event socket object in registrations class
Allow passing an event_socket in the constructor
Ensure the event_socket is connected before using it in loops
2025-03-05 10:08:08 -07:00
AdSecIT b714d25150
Update device.php (#7287)
Spelling correction.
2025-03-05 09:58:00 -07:00
FusionPBX 0fa87760cb
Update fifo_edit.php
Add validation
Use the event_socket object
2025-03-04 18:18:04 -07:00
frytimo 1aa1eb6159
Use text instead of boolean for ace editor settings (#7285) 2025-03-04 16:30:17 -07:00
FusionPBX cd3ff91f9a
Update app_defaults.php 2025-03-04 16:27:59 -07:00
FusionPBX 167cc94f18
Move editor settings used
Used in multiple features for this reason moved to core.
2025-03-04 16:17:16 -07:00
frytimo d529021b3f
Use boolean setting as true boolean (#7284)
* use boolean setting as true boolean

* Update settings class to use the php filter_var function for boolean
Using the built-in filter type for boolean seems like a better option as they are faster, already hardened, and more widely tested.
I found this better method used originally by Mark J. Crane in 2022 in the content.php page so I included it here.

* Update settings class to use the php filter_var function for boolean
Using the built-in filter type for boolean seems like a better option as they are faster, already hardened, and more widely tested.
I found this better method used originally by Mark J. Crane in 2022 in the content.php page so I included it here.
2025-03-04 11:25:47 -07:00
Antonio Fernandez 1b19e40be4
Consistent email wording (#7283) 2025-03-04 10:53:23 -07:00
FusionPBX bb02c97c64
Add grandstream_transfer_mode_via_vpk 2025-03-03 18:51:19 -07:00
FusionPBX c47eac110a
Add grandstream_transfer_mode_via_vpk 2025-03-03 18:50:58 -07:00
FusionPBX 9fcfc7276a
Add grandstream_transfer_mode_via_vpk 2025-03-03 18:50:44 -07:00
FusionPBX 6baa6973f3
Add grandstream_transfer_mode_via_vpk 2025-03-03 18:47:28 -07:00
FusionPBX 150eeccd5e
Add grandstream_transfer_mode_via_vpk 2025-03-03 18:43:29 -07:00
fusionate 7b3b3aa5f9
Menu: New option to set icon colors. 2025-03-03 14:08:05 -07:00
FusionPBX 7d62cc1e63
Fix the server 2 address and sip transport 2025-03-03 12:29:56 -07:00
FusionPBX a15488a708
Update the condition for validate certificate for a boolean value 2025-03-02 10:45:31 -07:00
FusionPBX 48e44814de
Update email_send.php 2025-03-02 10:38:34 -07:00
FusionPBX 06c20ef292
Fix contact notes with line feeds.
When saving contact notes, it would add extra line feeds. The escaping caused this issue.
2025-03-01 22:25:06 -07:00
FusionPBX de516ed210
Minor version update 5.4.2 2025-03-01 20:59:48 -07:00
chansizzle e4ddb4561e
fix email category mispelling (#7280) 2025-02-28 17:22:22 -07:00
FusionPBX b4de6f5e4b
Use status voicemail
Moved voicemail status after missed calls. This way, it will show the status of voicemail when it goes to voicemail.

There is still a field in the CDR for missed_call and this will still be set to true.
2025-02-28 17:09:35 -07:00
fusionate 06e69bf5df
Contact - Attachments: Prevent access without authentication. 2025-02-28 14:36:41 -07:00
fusionate f6df4fd0b3
Contacts - List: Only retrieve a single Primary attachment, in the chance that multiple exist. 2025-02-28 11:03:05 -07:00
fusionate 3de202b987
Contact - Attachment: Store image files in same format as uploaded. 2025-02-28 09:36:42 -07:00
FusionPBX c1296f26e0
Update users.php 2025-02-27 23:16:42 -07:00
frytimo f8e1e81546
fix wrong logical check (#7282)
Forgot to remove the '!' (not) operator from the cache check when re-organizing the update cache function
2025-02-27 21:09:31 -07:00
frytimo 863de97270
Update grandstream template loop (#7281) 2025-02-27 19:47:27 -07:00
FusionPBX f3986290ea
Add enable-rfc-5626 to the internal profile 2025-02-27 10:48:29 -07:00
FusionPBX c3bc265ff0
Show contact details 2025-02-26 12:24:37 -07:00
FusionPBX 1fba94d92b
Add contact note to users 2025-02-26 12:01:20 -07:00
markjcrane 9591ce0cbd Change the path in the menu to use core 2025-02-26 10:30:39 -07:00
markjcrane bd54c07e50 Move email_templates to core 2025-02-26 10:29:45 -07:00
frytimo d919a3cc1b
Add the apcu caching ability for performance (#7276)
* add the apcu caching ability for performance
When the PHP extension APCu is loaded, the settings class and the auto_loader will cache their results across requests in RAM. For more information about the APCu extension visit the PHP page: https://www.php.net/apcu

* use global instead of default terminology
2025-02-25 17:21:41 -07:00
Alex 305f585b17
Add missing counter divs (#7277)
* Add counter div to voicemail messages and domain settings

* Update domain_settings.php

* Update menu_item_list.php

* Update domain_settings.php

* Update voicemail_messages.php
2025-02-25 16:24:16 -07:00
Alex 2f955d4fef
Fix queue edit content alignment (#7274) 2025-02-25 13:23:06 -07:00
FusionPBX c22080d2fc
Fix an unclosed {if} tag
Caused by Commit 40f78c3
2025-02-25 13:09:49 -07:00
Alex e08a79e64d
Add missing required class to required fields (#7273)
* Add missing required class to required fields

* Update destination_edit.php

* Update device_edit.php

* Update voicemail_edit.php

* Update dashboard_edit.php

* Update call_block_edit.php

* Update destination_edit.php
2025-02-25 12:48:50 -07:00
Alex ba48d186a9
Add content card div to contact email edit and module edit (#7272)
* Add content card div to contact email edit and module edit

* Update module_edit.php
2025-02-25 12:35:23 -07:00
FusionPBX bbe7b76673
Add more FIFO Queue features
- Ring Strategy
- Queue
- Exit Key
- Exit Action
2025-02-24 22:07:34 -07:00
FusionPBX 6f26f3d386
Fix item overflow affected
This problem didn't affect all screen resolutions.
2025-02-24 10:05:03 -07:00
n0obHere bb0386e952
Align search input text field with buttons (#7251) 2025-02-22 20:39:08 -07:00
wouam31200 dde61fdeeb
Add template sip server (#7270)
* W80 Sip Server Template

* Update Template Sip Server
2025-02-22 08:36:12 -07:00
FusionPBX eb26156159
Remove the !empty(voicemail_mail_to) condition
The toggle for keeps local after email harms nothing. So we don't need to restrict it.
2025-02-21 13:16:11 -07:00
Alex 7707b9853c
Fix bridges redirect to correct domain when using show all (#7269) 2025-02-21 10:58:53 -07:00
Alex d78c726d9b
Fix call forward show all button (#7267) 2025-02-21 10:23:46 -07:00
fusionate b85eaaac73
Upgrade - Source: Move Preview styles to theme CSS file, style after modal. 2025-02-21 08:51:52 -07:00
chansizzle 3adcad3e5e
date column before time column (#7266)
change the order of the columns
2025-02-20 21:28:22 -07:00
Alex 8cfc221da4
Redirect to the correct domain if using show all (#7265)
* Redirect to the correct domain if using show all

* Update bridges.php

* Update call_recordings.php

* Update conference_controls.php

* Update conference_profile_params.php

* Update conference_profiles.php

* Update email_queue.php

* Update event_guard_logs.php

* Update fax_queue.php

* Update user_settings.php

* Update require.php
2025-02-20 16:30:09 -07:00
FusionPBX c2fe9d32f7
Fix a voicemail bug
Fix the voicemail link
Use only one keep local feature
Deprecate the voicemail_local_after_forward
2025-02-20 15:01:28 -07:00
Alex 036731202e
Remove unnecessary if statement (#7264) 2025-02-20 11:33:06 -07:00
Alex e416e74c30
Add domain change to require.php (#7263) 2025-02-20 11:25:36 -07:00
frytimo fd34a000a6
Add old search method for auto loading classes (#7261)
Adding this commit to ensure backwards compatibility and a fail-safe mechanism for loading a class
2025-02-20 11:24:39 -07:00
FusionPBX 37840abb98
Fix the cdr http_enabled boolean condition 2025-02-20 09:51:08 -07:00
Mendel 83cf184452
Yealink provioning files fix (#7236)
* multiple changes to the and for the yealink t58W

Added the variable for Bluetooth so that it won't be disabled every time the phone is provisioned.
Added what is needed for the wallpaper and firmware.

* Update app_config.php

* Added the Call Waiting Variable to the yealink config files
2025-02-20 09:31:10 -07:00
wouam31200 a18c2edf24
Add Yealink W80 Dect (#7258)
* Update {$mac}.cfg

* Update {$mac}.cfg

* Update {$mac}.cfg

BLF Not Showing Correct Status When Using DNS-SRV

* Update y000000000095.cfg

 yealink_language

* Update y000000000097.cfg

Add {$yealink_enhanced_dss_keys}

* Update y000000000096.cfg

Add {$yealink_enhanced_dss_keys}

* Update y000000000095.cfg

Add {$yealink_enhanced_dss_keys}

* Update y000000000070.cfg

Add {$yealink_enhanced_dss_keys}

* Add features.enhanced_dss_keys.enable = {$yealink_enhanced_dss_keys}

* Add features.enhanced_dss_keys.enable = {$yealink_enhanced_dss_keys}

* Added some default settings

Added some default settings

* Update y000000000146.cfg

* add w80 dect
2025-02-20 09:18:02 -07:00
chansizzle 3c9720ee36
Add CID Name prefix to destinations.php (#7262) 2025-02-20 09:13:36 -07:00
FusionPBX 7503ff40de
Add 922 as another emergency test number 2025-02-19 10:37:40 -07:00
frytimo 679b407562
bug fix domain name when using devices showall (#7259)
When the 'Show All' button is clicked the display of devices is using the current domain name instead of the domain name that belongs to the device
2025-02-18 15:01:19 -07:00
FusionPBX 2661ad7bf0
Allow the @ in the Caller ID name 2025-02-17 11:56:01 -07:00
FusionPBX 8b54dd8b61
Fix invalid XML CDR 2025-02-15 18:56:12 -07:00
FusionPBX abd2077ede
Send CDR with invalid xml to failed/invalid_xml 2025-02-15 18:21:14 -07:00
FusionPBX 535d0395e6
Update {$mac}.cfg
required for firmware .160 and newer
account.{$row.line_number}.sip_server.1.address

required for firmware .125 and older
account.{$row.line_number}.sip_server_host
2025-02-15 14:38:39 -07:00
FusionPBX 7c25ad1ed7
Disable vad for flying voice by default 2025-02-15 12:09:46 -07:00
frytimo 5e6ec475df
update auto_loader cache file when updating (#7255) 2025-02-15 10:44:46 -07:00
frytimo dc0f146485
fix php warning in menu class (#7256)
initialize variable before use
2025-02-15 10:43:03 -07:00
FusionPBX 27e32e8f34
Send the fax with primary and alternative routes 2025-02-14 15:50:51 -07:00
FusionPBX 9d3dd2a831
Add two fax variables 2025-02-14 13:08:19 -07:00
FusionPBX f11c792c2f
Fix the fifo agent delete 2025-02-13 21:51:50 -07:00
FusionPBX c4aa9e9b02
Update the cache after loading classes array 2025-02-13 15:05:27 -07:00
fusionate bd5002ca32
Voicemail: Rename voicemail filesystem folder if Voicemail ID changes. 2025-02-13 15:02:53 -07:00
frytimo 0931197137
build array in auto_loader constructor (#7158)
* Build an array in the auto_loader constructor

* Update auto_loader.php

* Update auto_loader.php

* minor adjustment to name and comment and remove trailing closing tag

* use best practices for the loader method
Allowing the loader method:
- Should Never Be Called Manually
- Prevents External Modification
- Hides Implementation Details

* cache array in the temp folder and load if available

* re-organize functions within the class

* add cache recreation for auto_loader in upgrade_menu

* add cache recreation for auto_loader in upgrade_menu

* Update app_languages.php
2025-02-13 14:48:40 -07:00
frytimo 9b0eead911
Fix incorrect name on disk usage chart (#7237)
* fix incorrect name on disk usage chart

* put correct information in disk usage for Linux and FreeBSD systems

* Update system_disk_usage.php

* Update system_disk_usage.php
2025-02-13 14:18:36 -07:00
frytimo f03803f113
use settings object where possible (#7246)
* use settings object where possible

* use $user_uuid instead of $_SESSION['user_uuid']

* use extension_uuid when counting for performance
2025-02-13 14:12:48 -07:00
frytimo 056ddc93ca
remove the automatic setting of server connection port in provisioning (#7243)
* remove the automatic setting of the server connection port in provisioning
2025-02-13 14:09:03 -07:00
fusionate 68e3b4c187
Fax - New: Add cover_message, cover_message_height Default Settings to define a default Message and the height of the message box on the cover page, respectively. 2025-02-13 11:56:07 -07:00
frytimo 0cf387f306
do not save event_guard logs to transactions (#7254)
Event Guard already has a log table so no need to duplicate the transactions in another table
2025-02-13 09:10:33 -07:00
frytimo 0a5c377ae6
Remove Extra Line Ending (#7252) 2025-02-13 09:09:52 -07:00
frytimo 5c9eeb1956
Remove Extra Line Ending (#7253) 2025-02-13 09:09:34 -07:00
fusionate 5b1697fc17
Menu - Fixed: Change to submenu item links to hopefully resolve random submenu closure on click bug. 2025-02-11 18:02:16 -07:00
FusionPBX cd5ed73602
Allow # and * in the sanitized caller ID 2025-02-11 13:26:32 -07:00
Ahron Greenberg (agree) 3603711d77
fix destination_condition_field gets overwritten by default setting (#7242) 2025-02-11 08:41:25 -07:00
Ahron Greenberg (agree) 2ef400aefd
validate domain before change (#7244) 2025-02-11 08:39:47 -07:00
FusionPBX a91e2ac547
Fix password when the permission is not assigned 2025-02-07 17:32:09 -07:00
Alex 1237b94cc4
remove duplicates (#7250) 2025-02-07 12:02:44 -07:00
fusionate d51eb0892b
Theme: Reapply changes from yesterday. 2025-02-07 11:55:18 -07:00
Alex a07ca55da5
Update css.php (#7249) 2025-02-07 11:42:59 -07:00
fusionate f056e82740
Theme: Additional settings to better control border and now outline styles. 2025-02-06 14:37:33 -07:00
FusionPBX 0ce6f3c956
Update language French vm 2025-02-06 14:33:11 -07:00
Alex 0a75229a43
Fix input toggle switch handle color default setting (#7247) 2025-02-06 13:45:38 -07:00
Alex 3088bb188f
Fix login input default settings (#7248) 2025-02-06 13:45:26 -07:00
FusionPBX 7f7ca70210
Change value of yealink_voice_vad to 0
A value of 0 disables voice activity detection. VAD when enabled on a Yealink T54W made the audio at the beginning of the call start at the beginning of the call and sometimes took 1 to 30 seconds to start.

Recommend changing this value on all systems using Yealink to use 0 to disable voice activity detection. Currently yealink_voice_vad is used in t46s, t41s, and t54w
2025-02-06 12:11:24 -07:00
FusionPBX 9b0292f3d2
Fix the destination login alternate path 2025-02-05 18:09:08 -07:00
Ahron Greenberg (agree) e21650fe4a
fix unset var (#7245) 2025-02-05 13:56:35 -07:00
FusionPBX 574ec7a5b3
Fax queue setting prefer_local default false
This allows control over whether to prefer sending to the voip provider or attempt local fax call.
2025-02-04 18:37:58 -07:00
Alex 5f2a6eed09
Fix dashboard number background color not showing (#7241)
* Fix dashboard number background color not showing

* Update missed_calls.php

* Update recent_calls.php

* Update voicemails.php

* Update registrations.php
2025-02-03 16:27:09 -07:00
frytimo 1c29addf08
fix spelling mistake in xml_cdr function name (#7240) 2025-02-03 13:21:47 -07:00
FusionPBX ca2e72e6f4
Fix the call recording length 2025-02-02 18:27:03 -07:00
FusionPBX 793e5b5e00
Fix the devices domain names column 2025-02-02 18:01:27 -07:00
FusionPBX bb0e23354a
Add uuid to the custom recording name 2025-02-01 00:22:56 -07:00
FusionPBX d655fa0ba6
Use the settings class use database::new() 2025-01-31 21:40:35 -07:00
FusionPBX 55fa668765
Use one database connection 2025-01-30 22:51:20 -07:00
chansizzle e8f8e2cfc5
add missing semicolons (#7238) 2025-01-30 22:40:21 -07:00
FusionPBX a2fc7dff1d
Update email_send.php 2025-01-30 16:11:33 -07:00
FusionPBX 3ab848e8c0
Minor version update 5.4.1 2025-01-29 22:26:47 -07:00
FusionPBX 0c48569c71
record_extension default to mp3 2025-01-29 21:43:24 -07:00
FusionPBX 355c0e692c
Update call details
- Add pass objects into the constructor
- details show local source and destination extensions
2025-01-28 21:57:41 -07:00
FusionPBX 65aeefaea4
update voicemail_main_menu phrase 2025-01-28 20:27:24 -07:00
FusionPBX d2294f76f3
Update voicemail_listen_file_options phrase 2025-01-28 20:18:16 -07:00
FusionPBX e0c7a8a9b5
Add voicemail_deleted_message_count phrase 2025-01-28 20:05:03 -07:00
fusionate 41556744ff
Contact - View: Tighten up speed dial icon and number, make no wrap. 2025-01-28 17:21:42 -07:00
fusionate cf22444a64
Contact - View: Apply card styles to contact-detail grid boxes. 2025-01-28 17:19:14 -07:00
fusionate bc22ab8cc4
Contact - View: Show speed dial prefix and number after a Contact's number, if defined. 2025-01-28 17:18:28 -07:00
frytimo d6f9b25283
format schema class (#7145)
- format schema class using autoformat
2025-01-28 17:05:00 -07:00
simplecoder732 77f9161408
Add a voicemail deletion queue (#7221)
* Add a deleted messages option to voicemail.
Messages are only deleted after a certain amount of time instead of immediately.
The queue can be turned off or on with the default setting "use_deletion_queue" in the "voicemail" category.
Changed deleted phrase and added a deleted messages count phrase
Added a program to delete messages that are due for deletion. Also small changes to phrases.

* Added a remove_deleted_messages function that runs on voicemail main menu log in. With this method, the deletion queue is handled per mailbox vs system-wide as in the cron-triggered script. It also allows us to adjust the retention hours on a per-domain basis.
2025-01-28 16:57:50 -07:00
Alex b2349060b5
Fix number text and background color not applying (#7235)
* Fix number text and background color not applying

* Update registrations.php

* Update voicemails.php

* Update missed_calls.php

* Update recent_calls.php

* Update domains.php
2025-01-28 16:39:35 -07:00
denisent bb1006aca8
Add serial number to the device edit page (#7234)
* add device serial number

* add device serial number field

* add device serial number field
2025-01-28 16:26:32 -07:00
chansizzle 964865ae63
add xml statistics mouse over text and use languages variables (#7211)
* add xml statistics mouse over text and use languages variables

* add xml statistics mouse over text and use languages variables

* xml statistics - remove English words from non-English languages
2025-01-28 16:22:02 -07:00
frytimo 3144036ae0
add new menu upgrade option to reset file permissions (#7232)
* add new menu upgrade option to reset file permissions
2025-01-28 16:20:43 -07:00
fusionate 9106c7fbfe
Contact - Phone: Adjust to even check same contact for duplicate speed dial numbers. 2025-01-28 16:11:21 -07:00
FusionPBX fe0680f9b1
Handle columns in the table that may not exist
The old v_device_keys column device_profile_uuid is deprecated. It will exist on systems that were upgraded from an older version before the change was made.

The app default code here moves data from the old format to the newer one. This is useful for upgrades. Newer installs will not have this deprecated field in the device_keys and device_settings table.
2025-01-28 15:59:04 -07:00
fusionate 42a1625daa
Contact - Phone: Prevent duplicate speed dial numbers. 2025-01-28 15:54:35 -07:00
FusionPBX b8b796316e
Add method column_exists to the database class 2025-01-28 15:35:02 -07:00
FusionPBX a4f83539ba
Update login.php 2025-01-28 12:54:09 -07:00
fusionate 14288772d5
Yealink App: Replace an invalid UUID. 2025-01-28 12:53:32 -07:00
frytimo 7c887184ff
adjust system service dashboard widget to not show by default (#7233) 2025-01-28 12:17:04 -07:00
fusionate aa75be76e7
Yealink App: Fix UUID in a previous commit.
This was preventing the App Defaults to run properly, because the database was rejecting the UUID value.
2025-01-28 11:58:32 -07:00
frytimo 96da9967e0
create system services dashboard item (#7231)
* create system services dashboard item

* update internationalization language file used in system_services
2025-01-28 10:20:36 -07:00
FusionPBX 88b35835b0
logged in direct to the dashboard 2025-01-27 13:58:06 -07:00
chansizzle ecc9361b68
remove device_label duplicates (#7215)
removed device_label duplicated in 2 locations
2025-01-27 11:12:00 -07:00
chansizzle bf84789f64
yealink power savings description clarity (#7220)
It was unclear as to what 'saving enabled' is. Updated to 'power saving enabled'. Yealink setting `features.power_saving.enable`
2025-01-26 19:28:58 -07:00
Mendel 43612a5049
multiple changes to the and for the yealink t58W,and images for yealinks in general. (#7223)
* multiple changes to the and for the yealink t58W

Added the variable for Bluetooth so that it won't be disabled every time the phone is provisioned.
Added what is needed for the wallpaper and firmware.
2025-01-25 19:32:25 -07:00
Norman King a87bdc997e
Add wp8x6 provisioning template. (#7224)
* added 8x6 template

* Add files via upload

* 8x6 phonebook

* Update {$mac}.xml

* Deleted wp8x6/${mac}.xml

* added TR69 variable

* added tr69 url and interval

* Update {$mac}.xml

changed asc variable

* added gs variables to wp8x6

* removed hard code settings

* remove additionall hard code settings

* wifi, ringtone, and dhcp settings

* bluetooth

---------

Co-authored-by: unknown <rweiler93@gmail.com>
2025-01-25 19:24:47 -07:00
frytimo da1da92d01
fix missing variable in default template (#7222)
When 'dev' or 'all' error level is set in the config.conf file, the menu will fail to expand or contract. This commit adds the missing variable causing a PHP warning responsible for the behavior.
2025-01-24 16:05:37 -07:00
FusionPBX 965b245794
Use lowercase matching domain name #7230
When the domain name has upper and lower case letters. The domain UUID results in not found in app/provision
2025-01-24 16:03:53 -07:00
frytimo d77b69b4d5
fix provision edit to use text type instead of numeric (#7229) 2025-01-24 10:15:36 -07:00
frytimo f6adc9bdd0
suppress access on null php notice in new is_connected method (#7227) 2025-01-23 12:38:03 -07:00
frytimo 95faf83337
add is_connected method to database (#7225) 2025-01-23 11:42:19 -07:00
FusionPBX 18bce0437d
Add more debug details and return false 2025-01-22 20:35:53 -07:00
FusionPBX 7e4f82f840
Enhance message array debug details 2025-01-22 20:07:02 -07:00
FusionPBX 8ea79e56e7
Replace exit; with return false; 2025-01-22 19:26:25 -07:00
fusionate e58a55df97
Password Reset: Adjustment to re-enable password match indication. 2025-01-20 09:10:04 -07:00
FusionPBX 8b59ef881b
Use the settings array to pass database connection
Improve efficiency by using one database connection
2025-01-18 15:47:56 -07:00
FusionPBX b6386ada32
Add table xml_cdr_extensions 2025-01-17 23:30:06 -07:00
frytimo 62039c300a
fix menu php warning when restoring default menu (#7219) 2025-01-17 13:39:17 -07:00
frytimo 50125527de
fix php warning for ini set (#7217)
The ini setting can only be modified when the session has not already started. This moves the ini_set function call inside the if block
2025-01-17 12:48:49 -07:00
frytimo dc22e87fc2
fix dashboard php warnings (#7218) 2025-01-17 12:48:11 -07:00
simplecoder732 5b9e82480d
Add Algo 8103 and 8196 provision templates (#7213)
* Add Algo 8103 and 8196 provision templates

* Added admin password setting to algo 8103 & 8196 templates. Also checked for existence of algo_timezone setting or set to New York time
2025-01-17 08:24:28 -07:00
FusionPBX afe511c403
Add forgot password translations 2025-01-16 21:54:27 -07:00
FusionPBX 3f186d90cc
Fix the forget password feature 2025-01-16 21:49:56 -07:00
FusionPBX 11f250191d
Add call recordings record_extension
Call recording file format options: wav, mp3
2025-01-16 19:59:32 -07:00
FusionPBX 31adc0883a
Update destination_edit.php
- Use the settings class to get the default settings
- Use call recordings variable record_extension wav or mp3
2025-01-16 19:56:32 -07:00
FusionPBX 590e4fb072
Add record_stereo and record_stereo_swap 2025-01-16 18:24:22 -07:00
frytimo 24ecfa16a0
update voicemails to use settings object where possible (#7212) 2025-01-16 12:49:00 -07:00
fusionate edf2efb517
Voicemails - List: Restore search functionality. 2025-01-16 10:51:41 -07:00
FusionPBX df90b758bb
Fix issue with sending local faxes
When sip_to_user or sip_req_user are used then we need to add these variables so that it can find the correct inbound route.
2025-01-15 19:44:56 -07:00
FusionPBX d49e8e4d2c
Add a default for paging 2025-01-15 15:42:11 -07:00
fusionate 93309e17f9
Side Menu: Improved behavior for Expanded and Hidden states when clicking on the content body. 2025-01-15 13:56:02 -07:00
FusionPBX 4e99779bc5
Fix server_address_primary
This was showing as a select box instead of input-type text .
2025-01-13 12:59:11 -07:00
FusionPBX 405a335ffb
Removed domain_enabled to fix a bug for those using BDR
An issue occurs if the domain_enabled data type was text rather than boolean. The upgrade schema data types will correct the data type except when using BDR. The alter table for changing data types doesn't work because of BDR.
2025-01-13 11:10:34 -07:00
fusionate a118cd658e
Voicemail - Edit: Change boolean select elements to toggle switches. 2025-01-09 23:04:03 -07:00
frytimo 79b0767343
fix xml_cdr import failing to move a zero byte record to failed folder (#7210)
When an XML CDR record is zero bytes that is recorded in the /var/log/freeswitch/xml_cdr directory, the xml_cdr class would fail to move the file. This causes the record files to eventually build up to where the files can exceed the import limit. This adjustment moves the sanity checking for `filesize` to before the import attempt and checks for over limit and zero bytes. If those conditions match the file is moved to the "failed" folder.
2025-01-09 11:47:28 -07:00
FusionPBX f121c16931
Update access control export add node_type 2025-01-09 00:16:21 -07:00
FusionPBX c388194721
Add Access Control Export 2025-01-09 00:06:52 -07:00
FusionPBX 106fc33459
Remove the pdo.php include
The pdo.php file was replaced by the database class
2025-01-08 12:14:38 -07:00
FusionPBX 1ada27a5b8
Add the settings_array to the class constructor
- More efficient to pass in the database object
- Added an option to pass in the domain_name
2025-01-07 22:20:57 -07:00
FusionPBX 75e7e9b71b Add multi-cast settings to all yealinks 2025-01-07 20:50:57 +00:00
FusionPBX 43d57fce14
Change the agent.contact size from 255 to 1024 2025-01-03 16:53:23 -07:00
FusionPBX 2aae8635db
Fix the device line default values and use the settings class 2025-01-03 14:41:08 -07:00
FusionPBX 5e8271ecc6
Use the domain_name as the context 2025-01-03 09:01:03 -07:00
FusionPBX eb7645772a
Update the context for the operator
Use the domain_name as the context.
2025-01-03 09:00:17 -07:00
FusionPBX 5c9c872c99
Show newest emails first 2025-01-01 11:26:44 -07:00
frytimo 76af096f52
xml_cdr catch edge case of failed import when no start stamp is present (#7207)
* xml_cdr catch edge case of failed import when no start stamp is present

* xml_cdr catch edge case of failed import when no start stamp is present
2025-01-01 10:32:12 -07:00
fusionate 5ace1902e3
Recordings: Restore audio playback. 2024-12-30 12:33:54 -07:00
chansizzle 9203fa0ed9
update cpm_ans to be cpm_answered (#7204)
The sql aliases the calculation as cpm_answered. Without this change the CDR Statistics Call Per Minute will always be zero.
2024-12-27 09:55:26 -07:00
FusionPBX ff95ada636
Fix the duration by use the created_epoch
Also used the settings class
2024-12-26 10:57:45 -07:00
FusionPBX 803b8755b2
Use the settings class and change date and time handling
- Use the settings class
- Fix the date and time
2024-12-25 22:08:10 -07:00
FusionPBX 6524cdcd0b
Fix greeting when using phrases
After saving a phrase for the greeting it would save but it wouldn't show the correct label. It would continue to play the phrase but show the UUID.
2024-12-23 12:22:44 -07:00
FusionPBX b6e1a2f775
Fix greeting when using phrases
After saving a phrase for the greeting it would save but it wouldn't show the correct label. It would continue to play the phrase but show the UUID.
2024-12-23 12:15:38 -07:00
FusionPBX 640b9f3184
Update the contacts path
Moved contacts from app to core
2024-12-22 10:40:41 -07:00
FusionPBX 67582a0f90
Update presence.php 2024-12-22 10:13:18 -07:00
shing6326 fb719cf331
Add grandstream wp826 template (#7201) 2024-12-21 14:37:50 -07:00
FusionPBX aecf84c6b6
Allow wrap on the action bar
This is needed to fit better on tablets and mobile screens.
2024-12-21 14:35:26 -07:00
FusionPBX eab081e253
Fix log viewer overflow for log content using word wrap 2024-12-21 11:32:15 -07:00
FusionPBX 2b22a15bf9
Update permission to hide hangup cause by default
This call detail records permission was assigned to the superadmin group by default. The Status replaces it with a simpler message. The hangup cause status will remain as an option for those that want it.
2024-12-21 10:56:15 -07:00
FusionPBX afaf31c3a2
Sanitize the caller ID name and number 2024-12-20 11:07:05 -07:00
FusionPBX 257066f4d0
Fix a typo in the description 2024-12-17 12:49:49 -07:00
FusionPBX d9f401f577
Use the settings class 2024-12-16 18:48:44 -07:00
frytimo 38b02f11d5
fix missing slash '/' at end of link tag (#7200) 2024-12-16 13:53:33 -07:00
FusionPBX 2cd94a93a5
Fix the device ADD button.
Also, permission_exists function uses the permission::new() method and this made it efficient enough to continue to use the permission_exists function.
2024-12-13 10:35:36 -07:00
frytimo 075cc4824a
Security, Use the same number of characters for the masked password (#7198)
* security set display asterisks to constant number
Harder to guess when length is also hidden
2024-12-12 10:03:21 -07:00
chansizzle 8feb150dba
rename extension summary csv export (#7179)
rename extension summary export/download from 'user-summary.csv. to 'extension-summary.csv'
2024-12-11 22:15:28 -07:00
FusionPBX 7e5ac499ef
Update {$mac}.xml 2024-12-11 22:08:07 -07:00
FusionPBX 7a33e79f4a
Add the spa_router_mode 2024-12-11 22:06:44 -07:00
FusionPBX a9b2076fbe
Update the cisco 192 template 2024-12-11 22:00:18 -07:00
Alex 9fc82c02cb
Add dashboard icon color setting (#7197)
* Add dashboard icon color setting

* Update index.php

* Update app_languages.php

* Update app_defaults.php

* Update app_config.php

* Update dashboard_edit.php

* Update index.php

* Update app_languages.php

* Update app_defaults.php

* Update app_config.php

* Update config.php

* Update domains.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update registrations.php

* Update config.php

* Update config.php

* Update config.php

* Update config.php

* Update voicemails.php

* Update config.php

* Update missed_calls.php

* Update recent_calls.php

* Update index.php

* Update index.php

* Update index.php
2024-12-11 21:28:45 -07:00
frytimo 3d4fe6e5c1
fix call forward back button on save (#7196)
* fix call forward back button on save
2024-12-11 14:53:55 -07:00
Antonio Fernandez 975f0755ea
fix-sms/mms-to-email-en-us (#7194) 2024-12-10 16:53:35 -07:00
Alex 02aacd2c40
Fix menu_side_brand_image_contracted not showing (#7195) 2024-12-10 16:51:36 -07:00
FusionPBX 414c85eef8
Fix a bug where transfer is part of recording name 2024-12-10 13:44:49 -07:00
FusionPBX 3095bb5a30 Removed messages and providers
These are optional and have the own repositories
2024-12-09 17:13:22 +00:00
anthony-ricci 7993e2ad1b
messages-to-email (#7193) 2024-12-09 10:10:15 -07:00
FusionPBX e1cfb7931e
Active Calls responsive design update 2024-12-07 13:28:27 -07:00
Alex f0bc1cfe33
Update contacts path (#7192)
* Update contacts path

* Update menu.php

* Update contact_edit.php

* Update contact_relation_edit.php

* Update config.php

* Update authentication.php

* Update database.php

* Update totp.php

* Update email.php
2024-12-06 11:55:41 -07:00
chansizzle 014adb461b
add call duration to the active calls page (#7191)
* add call duration to the active calls page

* add duration label for active calls
2024-12-04 15:13:25 -07:00
FusionPBX f0837e173b
Add function_exists for posix_getsid
Used to support operating systems that don't support posix_getsid
2024-12-02 18:34:49 -07:00
markjcrane 78306a1a68 Add execute permission 2024-12-02 18:05:26 -07:00
FusionPBX 57a792dccd
Use the PHP_BINARY constant 2024-12-02 17:58:07 -07:00
FusionPBX efdc007eb2
Use the PHP_BINARY constant 2024-12-02 17:55:35 -07:00
FusionPBX 6f1c595b1f
Use the PHP_BINARY constant 2024-12-02 17:54:49 -07:00
FusionPBX 642d4cd8d7
Set the Yealink default to 4 PAI-RPID-FROM 2024-12-02 11:56:35 -07:00
frytimo bb76878156
fix voicemail message count when viewing all domains (#7186) 2024-11-30 12:10:58 -07:00
frytimo 58cfa404b7
fix voicemail message length and size display (#7185) 2024-11-30 11:40:52 -07:00
FusionPBX cd8d5302ac
Fix temporary permissions 2024-11-29 13:57:01 -07:00
FusionPBX 4db95658c3
Method new allow null
Needed to support temporary permissions
2024-11-29 13:50:14 -07:00
FusionPBX 77ec211020
Update functions.php
Remove closing PHP tag
2024-11-29 13:45:40 -07:00
frytimo 91dcc94e82
Fix typo in filename (#7180) 2024-11-27 14:24:03 -07:00
frytimo 7133d4bff1
parse windows 1256 encoding type in email to fax (#7182) 2024-11-27 14:21:45 -07:00
FusionPBX 8563df387f
Start the session in the header.php 2024-11-27 09:26:10 -07:00
FusionPBX c88378a4fe
Default dashboard_label_background_color to empty 2024-11-27 09:23:04 -07:00
FusionPBX 790d1ff137
Use the permissions::new method 2024-11-27 00:14:18 -07:00
FusionPBX 3a14a19800
Create a singleton method called new 2024-11-27 00:11:58 -07:00
FusionPBX 5757f2c9ee
Fix CSS missing characters
Disable the ob_gzhandler
2024-11-26 23:53:32 -07:00
FusionPBX 6e1d52e6b8
Update permissions.php 2024-11-26 22:49:23 -07:00
FusionPBX 5d7a124a79
Fix permissions when not using a session 2024-11-26 21:48:08 -07:00
frytimo b7afc086ec
Update the menu class (#7181)
* fix php warnings in the menu class

* remove an unreachable statement

* update the menu_horizontal function to use settings

* use a single text object

* update menu_side_state to use the default value of contracted

* remove unused variable

* use variables for menu_side_state

* remove unused variable

* remove whitespace

* remove unused variable

* check for user UUID and domain UUID passed to the constructor

* update docs
2024-11-25 10:34:16 -07:00
FusionPBX 2a41ccfebd
Return an empty array if there are no groups 2024-11-20 13:52:58 -07:00
FusionPBX 8655c792a3
Fix ring group missed call to show in CDR 2024-11-19 13:42:25 -07:00
FusionPBX c3c1b18358
Contacts has been moved to the core
This means the contacts should always be avaialble.
2024-11-19 11:39:18 -07:00
FusionPBX 9cb1217995
Update app_defaults.php 2024-11-19 10:13:31 -07:00
FusionPBX 075dcfd96f
Update the path to contacts 2024-11-16 21:11:07 -07:00
FusionPBX 00c4dd374e
Update app_menu.php 2024-11-16 21:08:40 -07:00
markjcrane 9b843bbff0 Move contacts from the app to core directory 2024-11-16 21:06:29 -07:00
FusionPBX cbcc47d47b
Create conference transfer.lua 2024-11-15 15:39:52 -07:00
FusionPBX 7f527aba07
Fix the sql query 2024-11-15 14:32:45 -07:00
FusionPBX d562d11528
Create three_way.lua 2024-11-15 14:16:22 -07:00
fusionate cb9c79bf86
Fax Server - Sent List: Fix Destination value. 2024-11-14 18:56:15 -07:00
FusionPBX caba7800d1
Updated Call Flow Summary for outbound calls 2024-11-14 17:06:41 -07:00
fusionate 15cad2369c
Fax Server - Fax to Email: Fix population of cover page labels. 2024-11-14 13:21:14 -07:00
FusionPBX aae7cbdc5a
Fix the voicemail transcribe title 2024-11-13 17:46:53 -07:00
FusionPBX 33354ff5c7
Update ring_group_edit.php 2024-11-13 16:23:43 -07:00
FusionPBX 5cb5f97743
IVR Menu direct_dial_digits_max set default to 8 2024-11-12 15:39:26 -07:00
FusionPBX 8f08303a82
Add bittel to device vendors 2024-11-12 15:06:38 -07:00
FusionPBX 0a33e58b87
Add vendor Bittel 2024-11-12 14:53:14 -07:00
FusionPBX fc5f10acfa
Add vendor bittel 2024-11-12 14:50:18 -07:00
ijaron 06a6646acb
Updated gxv3240/phonebook.xml (#7153)
Creates groups based on contact type. groups contacts with more then number into one contact.
Sets FirstName to contact_organization if there is no given or family name but contact_organization is set

Labels work, home, and mobile numbers with all others set as other

Sets Primary to line with phone_primary set (will set Primary for each if multiple lines have phone_primary set even though phone  will likely only use one of the tags)
2024-11-09 18:45:30 -07:00
ijaron 8f8caaede7
Update dp750/phonebook.xml (#7151)
Fixes phonebook.xml to work with current contacts.
Sets contact_organization to FirstName if  contact_name_given and contact_name_family are not set but contact_organization is

sets Phone type for home and mobile, sets all others to work

Loads category == "extensions" as well
2024-11-09 18:42:19 -07:00
ijaron 40f78c3c28
Update dp750/mac.xml (#7152)
* Update dp750/mac.xml

Use $grandstream_ring_timeout for Ring time rather then hardcode
Use $grandstream_dial_plan for every account rather then only first
set Station name to DP750-{$mac}
Add option for Automatic Reboot (Firmware 1.0.17.1+)
Allow $grandstream_stun_server and use stun if $grandstream_nat_traversal == 1
$grandstream_accept_sip_from_proxy_only to set Disable Direct IP Call
Turn off 3CX Auto Provision
Use $grandstream_automatic_provisioning and convert to values used in DP750 vs other grandstream heardware
Allow $grandstream_automatic_provisioning_minutes $grandstream_automatic_provisioning_hour $grandstream_automatic_provisioning_day

use $grandstream_phonebook_download_interval rather then just disabling
2024-11-09 18:40:36 -07:00
Antonio Fernandez 9e5116b8fb
contacts appear by default in templates (#7154) 2024-11-09 18:30:03 -07:00
frytimo 773ecc96cc
pass database object to settings object (#7178)
Use the singleton database object with database::new syntax
Pass the connected database object to the settings object so settings object does not have to create another connection
2024-11-09 18:29:22 -07:00
FusionPBX fca029b7df
Use include internal on answered, missed and voicemail
This hides local calls which could also be calls to feature codes. Only add these feature code calls to the count if directed to show internal calls.
2024-11-08 18:09:32 -07:00
FusionPBX 318953bddf
Fix the destination summary when server using UTC
Set the PHP time zone to fix the destination summary report. Without the time zone set it would use the server operating system time zone.  If the time zone is set to UTC when it rolled over to a new date ahead of the local time zone it would make the report show 0 results.
2024-11-08 17:44:09 -07:00
FusionPBX 139867815f
Fix the extension summary and call flow summary
Set the time zone in PHP so that it is correct inside the class method for the extension summary and the call flow summary
2024-11-08 17:21:18 -07:00
FusionPBX 2ad7f5df6d
Yealink boolean and numeric use text
The provisioning template delivers the value as a string
2024-11-04 10:19:58 -07:00
FusionPBX 6b3251ea67
Use yealink_trust_certificates directly
Value should be 0 or 1
2024-11-04 10:09:24 -07:00
FusionPBX baed3947d4
Make sure the origination_uuid is set 2024-11-04 08:21:03 -07:00
Mendel 0757245b75
Update device.php (#7175)
With the help of Tim, he found this typo that has now been resolved.
2024-11-03 19:43:15 -07:00
FusionPBX afdb029a25
Update http_auth to use boolean 2024-11-01 14:17:32 -06:00
FusionPBX 175e88e15a
Fix for the device template
If the device vendor matches then use the alternate device template
2024-11-01 12:33:34 -06:00
Antonio Fernandez fab9a6bbc9
Ring Group search in CDR (#7177)
* Adding Ring Group dropdown in cdr search

* 2nd commit

* remove unused permission
2024-11-01 10:06:23 -06:00
FusionPBX b55e542cbd
Fix lua stream file 2024-10-31 19:33:38 -06:00
fusionate 37ff548fa8
Side / Fixed Menu: Image placeholder tool tip. 2024-10-31 11:49:31 -06:00
fusionate b766ad7f27
Side / Fixed Menu: Image placeholder for User Menu in Body Header / menu bar. 2024-10-31 11:37:17 -06:00
FusionPBX 42d634dc76
Allow adding a large list of emails 2024-10-30 14:11:46 -06:00
fusionate d627db10a6
Devices [Class]: Fix typo. 2024-10-30 13:27:39 -06:00
Antonio Fernandez 3714dc73f4
fix call screen saving (#7174) 2024-10-29 15:52:40 -06:00
FusionPBX 34b8679917
Update the version 5.4.0
This version change seperates it from the current release version.
2024-10-29 15:19:49 -06:00
FusionPBX 7fe9ad5c77
Fix page load time for call_recordings
The page load time was slow when there were no call recordings for the domain.

Remove domain_uuid is null as this isn't needed for call recordings.
2024-10-28 11:00:24 -06:00
FusionPBX 3a0d5fb512
Remove the session when the password is changed 2024-10-27 18:04:35 -06:00
FusionPBX c81e6482a8
Replace the empty function with isset
Don't use empty when value can be 0
2024-10-27 11:08:37 -06:00
FusionPBX f44f9636db
Cast to integer
This prevents an error that was seen on FreeBSD
2024-10-26 22:16:35 -06:00
FusionPBX fbb254c3db
Update and rename 500_ring-group-forward.xml to 495_ring-group-forward.xml 2024-10-25 15:30:39 -06:00
FusionPBX 575db5c918
Create 895_call-forward-no-answer.xml
Add new way to handle call forward no answer
2024-10-25 13:09:17 -06:00
FusionPBX 6e1ef36821
Correct the use of the settings class 2024-10-25 12:44:05 -06:00
FusionPBX ebaf1f909f
Use boolean in conditional statement 2024-10-24 14:37:26 -06:00
frytimo f86214f61e
Fix email send breaks transcribe when php 7.1 is used (#7170)
Ensured the values are of boolean type as PHP 7.1 treats them strange
2024-10-24 14:11:25 -06:00
FusionPBX 11cc01a79a
Provision settings adjust types
If the type is boolean with a value of 0 or 1, use type text; if it is numeric, use type text.

 The template default setting uses a string for the template values, and a boolean type is used with conditions.
2024-10-23 15:10:31 -06:00
FusionPBX adf3ac9aab
Use boolean in the if statement 2024-10-23 13:56:09 -06:00
FusionPBX 9bd77856b8
Fix the condition for smtp_from 2024-10-23 11:32:44 -06:00
FusionPBX e49e2f01ce
Remove redundant code
Handled in the constructor
2024-10-23 10:54:52 -06:00
frytimo 56f3135f21
Update template to match new boolean in settings (#7166) 2024-10-22 20:04:27 -06:00
FusionPBX 2765c1d229
Extension directory order by first name 2024-10-22 19:11:07 -06:00
FusionPBX d28a98bbb1
Update provision.php
Remove debug info
2024-10-22 19:06:45 -06:00
Antonio Fernandez 2f30694ead
Fix Avaya BLF issue on reSUBSCRIBE (#7164)
* Fix Avaya BLF issue on reSUBSCRIBE

* fix an accidental modification
2024-10-22 19:01:50 -06:00
FusionPBX 3415d57751
Provision enabled setting default boolean 2024-10-22 19:00:05 -06:00
FusionPBX fa596c94a4
Provision setting enabled use boolean 2024-10-22 18:58:03 -06:00
frytimo 557de4b744
Update settings using real boolean (#7165)
* update settings using real boolean
2024-10-22 18:55:19 -06:00
FusionPBX 7db445f825
Update boolean devices.php 2024-10-22 18:40:58 -06:00
FusionPBX 23acd611c2
Boolean settings as type boolean
PHP 7.1 and 8.1 handled boolean string differently. Changed the type to a proper boolean to resolve this issue.
2024-10-22 18:23:49 -06:00
FusionPBX 56c59289d4
Update boolean settings
Settings of type boolean need to be set as boolean.
2024-10-22 18:15:35 -06:00
FusionPBX f24847d1c4
Update index.php 2024-10-21 15:25:45 -06:00
Antonio Fernandez b801b8a5c9
fix search when pressing enter in textbox (#7162) 2024-10-18 20:57:15 -06:00
fusionate 9af1f46079
Voicemail Messages - List: Remove unused parameters from the recording_seek() function call. 2024-10-18 19:25:59 -06:00
fusionate 35d097913f
Voicemail Greetings - List: Remove unused parameters from recording_seek() function call, remove additional <td>...</td> tag, add another column count increment. 2024-10-18 19:22:54 -06:00
fusionate b2426a52f4
Recordings - List: Remove extra </td> tag. 2024-10-18 19:18:06 -06:00
fusionate c812dfb58b
Music On Hold: Remove unused parameters from the recording_seek() function call. 2024-10-18 19:07:19 -06:00
fusionate bc3e032efc
IVR Menu - Edit: Remove unused parameters from the recording_seek() function. 2024-10-18 19:05:08 -06:00
fusionate 5d5fbbc83d
Template: Remove unused parameters from recording_seek() function. 2024-10-18 19:02:21 -06:00
fusionate e0fe291da0
CDR - Recording Playback: Fix seeking for chromium based browsers. 2024-10-18 18:58:44 -06:00
anthony-ricci 7122ecc154
Recording Seek (#7163) 2024-10-18 18:45:21 -06:00
FusionPBX 81fc86fc01
Handle country code, trunk prefix and area code 2024-10-17 13:15:26 -06:00
FusionPBX 644bcd5c4c
Update hangup_rx.lua 2024-10-17 13:10:05 -06:00
FusionPBX a1976b2aec
Add contact string to hover 2024-10-17 11:59:39 -06:00
FusionPBX ed836aa41e
Update fax_send.php
- Optimize the database connection
- Use loopback for local FAX destinations
2024-10-17 02:39:03 -06:00
FusionPBX 75a2f5ffd9
Prevent a nil error 2024-10-17 02:32:48 -06:00
FusionPBX 581c6177cf
Update hangup_rx.lua
Prevent an error if the value of x is nil.
2024-10-17 02:29:23 -06:00
fusionate 5459bca44b
CDR - Recording Playback: Fix progress indicator in chromium based browsers. 2024-10-16 17:29:10 -06:00
FusionPBX 9c68c183f2
Fix play recording in CDR 2024-10-16 16:18:13 -06:00
FusionPBX 531aad8baa
Update index.lua 2024-10-16 15:49:39 -06:00
FusionPBX 5c9658334c
Update app_defaults.php 2024-10-16 11:53:45 -06:00
Antonio Fernandez 3b8309af11
fix waveform image background (#7160) 2024-10-15 15:19:04 -06:00
FusionPBX 7b025e490f
Update fax sending order 2024-10-15 12:06:02 -06:00
FusionPBX c21a6cad4c
Add login_background_image 2024-10-11 11:15:29 -06:00
FusionPBX d309ffc1cf
Update the condition for boolean 2024-10-10 17:22:59 -06:00
FusionPBX fc4f75f30c
User logs fix failed 2024-10-10 16:21:03 -06:00
frytimo 949d407604
change include to require once (#7157)
Co-authored-by: Tim Fry <tim@fusionpbx.com>
2024-10-09 09:19:08 -06:00
anthony-ricci 6b49a92f76
Update xml_cdr.php (#7156)
Fixed CDR recording playback - casting an empty string to an int breaks the if statement.
2024-10-08 17:27:54 -06:00
Antonio Fernandez 71b8767d21
Added support for Snom C620 DECT conference phone (#7155)
* Added support for Snom C620 DECT conference phone

* added base firmware option

* added base ds

* added speakerphone firmware
2024-10-08 09:45:03 -06:00
fusionate b498af4cf4
Theme - Fixed Menu: Add new user menu to menu bar. 2024-10-07 14:36:55 -06:00
FusionPBX 1134341635
Before using is_numeric cast the value to int
Without this cc_queue_joined_epoch, cc_queue_answered_epoch, and other values were seen as a string
2024-10-07 14:28:41 -06:00
FusionPBX ab8108e3b7
fixed call center agent save 2024-10-07 13:07:03 -06:00
FusionPBX 7ecfe96381
Add agent state to indicate wrap up time 2024-10-07 11:39:28 -06:00
FusionPBX b9a0cdf4e7
Update authentication.php 2024-10-06 10:32:57 -06:00
FusionPBX 2a9798b370
Fix the FIFO lag time
This is also known as the wrap-up time after the call ends with the agent.
2024-10-04 01:37:25 -06:00
FusionPBX e186958006
Delete app/dialplans/resources/classes/dialplan.better.php 2024-10-04 00:26:06 -06:00
FusionPBX 2c0c8e5a93
Update the database connection 2024-10-04 00:16:40 -06:00
frytimo 1bd7dc1687
Add ability to set a default ringback on ivr menu (#7149)
* add ability to set a default ringback on ivr menu
2024-10-03 23:39:35 -06:00
frytimo aa7c618325
Add ability to set a default ringback on ring group (#7150) 2024-10-03 23:28:36 -06:00
fusionate 0d8d2aacc7
Fax - Sent: Add time sent to cover sheet. 2024-10-02 17:17:26 -06:00
FusionPBX bb2232e62d
Fix valet_park use sip_refer_to
The referred-by domain can't be used as some phones use the domain of the tenant and some their own IP address. For this reason, replaced with sip_refer_to.
2024-10-02 13:37:00 -06:00
FusionPBX 8ce9643901
Removed for better backwards compatibility 2024-10-02 11:35:54 -06:00
FusionPBX 519627b8e5
Fix valet park when call is sent to a different domain
When crossing domains we need to use park with the correct domain. This change uses the referred by to get the proper domain name.
2024-10-01 16:32:09 -06:00
Andy-Seattle a232176717
Update app_config.php (#7147)
Added a permission for call recording transcription as currently the transcribe button is displayed by default whenever a recording is selected. It should be controlled by a permission.
2024-09-30 17:45:08 -06:00
Andy-Seattle c33b5ba2b7
Update call_recordings.php (#7148)
Use the new call_recording_transcribe permission to determine if the Transcribe button should appear.
2024-09-30 17:44:52 -06:00
FusionPBX 3ad177e6c1
Fix call screen to end recording with dtmf and silence 2024-09-30 10:05:00 -06:00
fusionate ae15319487
Body Header User Image and Menu, Domain Selector, Contact Attachment improvements. 2024-09-28 16:37:36 -06:00
FusionPBX 7f2bd7d53a
Fix provision auto_insert_enabled 2024-09-28 11:01:39 -06:00
fusionate b9ebdf673e
Side Menu - Body Header: Show User's assigned primary Contact Attachment image, if exists. 2024-09-27 17:14:42 -06:00
fusionate 8ffbcd09f3
Users - Edit: Minor visual adjustment to API Key Generate and View buttons. 2024-09-27 12:43:45 -06:00
fusionate 21ca2c4761
Contacts - Edit: Better QR Code positioning and sizing. 2024-09-27 12:25:48 -06:00
fusionate 0e39d35a0b
Contacts - List: Better image view position (always centered on viewport). 2024-09-27 12:25:05 -06:00
fusionate 778acbe551
Contacts - List: Better image view position (always centered on viewport). 2024-09-27 12:24:16 -06:00
fusionate 86d018009e
Fax Server: Better view position (always centered on viewport). 2024-09-27 12:23:11 -06:00
fusionate 9ebf0f7bca
Contact - Attachments: Preserve image transparency, large viewing on edit page, other minor adjustments. 2024-09-27 11:56:38 -06:00
fusionate afa0b91b15
Contacts - Attachments: Fix download and image display. 2024-09-27 11:30:53 -06:00
frytimo 28ddb69fe1
add existing multicast options from default settings to yealink t46s (#7146)
Comparing the t46s to the t54w, there were a lot of missing settings beyond the original multicast options that were missing. The two templates have been reconciled with differences and any missing options already available to the t46s that were defined in the t54w have been added.
2024-09-27 07:55:04 -06:00
Alex 84950065aa
Add content card to voicemail greetings (#7142)
* Add content card to voicemail greetings

* Update voicemail_greeting_edit.php
2024-09-26 15:57:32 -06:00
FusionPBX ced8c16a28
Allow right click open in new window 2024-09-26 09:47:12 -06:00
FusionPBX 5a8ab2dd8f
Add the domain_name variable
Without the domain_name variable in some cases the confirm option doesn't work.
2024-09-26 08:44:43 -06:00
frytimo 1762dabfab
add detect audio length of recording (#7140)
* add detect audio length of recording

* Update page.lua
2024-09-26 07:59:31 -06:00
frytimo 4f32833e30
fix dashboard break when app removed (#7141)
Places a guard to check for the file existing before the file is included. Without the guard, PHP will stop with a fatal error.
2024-09-26 07:53:30 -06:00
fusionate 4e17e9e920
Fax Server - Edit: Add period to Confirmation Email description. 2024-09-24 16:35:43 -06:00
fusionate 183e5d652d
Fax Server - Edit: Adjust style for Email & Confirmation Email fields. 2024-09-24 16:33:46 -06:00
FusionPBX 64a95a972e
More efficient use of the database object 2024-09-23 19:19:19 -06:00
FusionPBX 50a1ed145c
Fix voicemail greeting for base64
- Use the settings class
- Re-use the database object
- Update the indentation
2024-09-23 18:17:44 -06:00
FusionPBX 0c9329b119
Restore previous caller ID behavior
If the caller ID was updated then update the caller ID
2024-09-23 13:00:46 -06:00
FusionPBX 095d0d836f
Add translations for email confirmation 2024-09-23 09:40:51 -06:00
anthony-ricci 4df5253b64
Fax Server changes (#7136)
* Added the ability to send out successful and failed fax notifications to a separate list of email addresses (confirmation emails), in addition to the email address of the originator of the fax.
 * Added new fax_email_confirmation permission
* Check the Session variable for the user's email first and if it is not set, then query the database for the currently logged-in user's email.
2024-09-23 09:10:37 -06:00
FusionPBX 1d5506826a
Fix permission_exists fax_file_edit 2024-09-21 21:12:43 -06:00
FusionPBX 9292dda43f
Fixed the registration count
- Fixed on the dashboard for those with superadmin group
- Fixed the count in the SIP status page
2024-09-21 12:50:36 -06:00
FusionPBX 665bb0e802
Default value for create recording should always be false 2024-09-20 23:08:28 -06:00
FusionPBX 98e7eb725f
Add ignore early media for external calls 2024-09-20 16:20:02 -06:00
FusionPBX 20b358f05f
Get the domain_name with a different variable
Get the domain_name with a different variable if the domain_name is not set
2024-09-20 16:16:25 -06:00
Anthony 7263dfe15c
Added/Adjusted translations in app app_languages.php files (#7139)
* Added Turkish translations to database_transactions/app_languages.php

* Added Turkish translations to conferences_active/app_languages.php
2024-09-20 16:01:13 -06:00
FusionPBX c4baf4ad92
Use ring group destination confirm true when call screen is enabled 2024-09-20 13:17:20 -06:00
fusionate 8d81c5f2d7
Extension Summary: Restore previous form wrapping. 2024-09-20 11:37:53 -06:00
fusionate 99b1c1792e
Extension Summary: Fix form layout. 2024-09-20 11:35:53 -06:00
markjcrane 65cb4fe20c Remove the CSS card overflow it cut off the date-time picker 2024-09-20 10:56:49 -06:00
markjcrane 68c79ca0a3 Remove carriage return per line and leave only line feeds 2024-09-19 17:14:21 -06:00
markjcrane 5cbc53c7d9 Fix end of file line only use one line feed at the end of the file 2024-09-19 16:33:17 -06:00
FusionPBX f914922383
Update Grandstream templates
- grandstream_timezone updated to use grandstream_time_zone
- disable wifi settings with an IF statement
- other miscellaneous changes
2024-09-19 12:39:26 -06:00
chansizzle a36b20dbf6
add count next to the title (#7137) 2024-09-19 09:12:05 -06:00
FusionPBX 5bae14c6f9
Update xml_cdr.php 2024-09-18 19:07:02 -06:00
FusionPBX 99ceb6e158
Align SEARCH and other buttons to the right 2024-09-18 18:44:52 -06:00
FusionPBX 6701e4c36d
Show only default extension type
Hide virtual extensions
2024-09-18 11:53:05 -06:00
FusionPBX d9319e4cf1
Update the border radius 2024-09-18 11:36:18 -06:00
FusionPBX 1c0267883b
FIFO Queues added to destination select list
- Also add a new permission fifo_destinations
2024-09-17 22:50:36 -06:00
FusionPBX f03b5ad8bd
Fix voicemail base64 greeting 2024-09-17 17:46:22 -06:00
fusionate 6a467f01af
Remove test code on previous commit. 2024-09-17 14:41:44 -06:00
fusionate e4aa30bcd6
Fax - Sent: Added Recipient column, if allowed. 2024-09-17 14:38:11 -06:00
738 changed files with 33108 additions and 18217 deletions

View File

@ -38,6 +38,9 @@
$language = new text;
$text = $language->get();
//create the database connection
$database = database::new();
//action add or update
if (!empty($_REQUEST["id"]) && is_uuid($_REQUEST["id"])) {
$action = "update";
@ -93,20 +96,17 @@
switch ($_POST['action']) {
case 'copy':
if (permission_exists('access_control_add')) {
$obj = new database;
$obj->copy($array);
$database->copy($array);
}
break;
case 'delete':
if (permission_exists('access_control_delete')) {
$obj = new database;
$obj->delete($array);
$database->delete($array);
}
break;
case 'toggle':
if (permission_exists('access_control_update')) {
$obj = new database;
$obj->toggle($array);
$database->toggle($array);
}
break;
}
@ -202,7 +202,7 @@
//attempt digs
if (!empty($digs) && is_array($digs)) {
foreach ($digs as $dig) {
$response = shell_exec("dig +noall +answer ".$dig['value']." | awk '{ print $5 }'");
$response = shell_exec("dig +noall +answer ".escapeshellarg(str_replace(' ', '', $dig['value']))." | awk '{ print $5 }'");
if (!empty($response)) {
$lines = explode("\n", $response);
foreach ($lines as $l => $line) {
@ -217,7 +217,7 @@
$array['access_controls'][0]['access_control_nodes'][$y]['access_control_node_uuid'] = uuid();
$array['access_controls'][0]['access_control_nodes'][$y]['node_type'] = $dig['type'];
$array['access_controls'][0]['access_control_nodes'][$y]['node_cidr'] = $line.'/32';
$array['access_controls'][0]['access_control_nodes'][$y]['node_description'] = !empty($dig['description']) ? $dig['description'] : $dig['value'];
$array['access_controls'][0]['access_control_nodes'][$y]['node_description'] = !empty($dig['description']) ? $dig['description'] : str_replace(' ', '', $dig['value']);
$y++;
}
}
@ -229,7 +229,6 @@
//save the data
if (is_array($array)) {
$database = new database;
$database->app_name = 'access controls';
$database->app_uuid = '1416a250-f6e1-4edc-91a6-5c9b883638fd';
$database->save($array);
@ -266,7 +265,7 @@
$sql = "select * from v_access_controls ";
$sql .= "where access_control_uuid = :access_control_uuid ";
$parameters['access_control_uuid'] = $access_control_uuid;
$database = new database;
$row = $database->select($sql, $parameters, 'row');
if (!empty($row) && count($row) > 0) {
$access_control_name = $row["access_control_name"];
@ -282,7 +281,6 @@
$sql .= "where access_control_uuid = :access_control_uuid ";
$sql .= "order by node_cidr asc";
$parameters['access_control_uuid'] = $access_control_uuid;
$database = new database;
$access_control_nodes = $database->select($sql, $parameters, 'all');
unset ($sql, $parameters);
}
@ -326,6 +324,9 @@
if (permission_exists('access_control_node_add')) {
echo button::create(['type'=>'button','label'=>$text['button-import'],'icon'=>$_SESSION['theme']['button_icon_import'],'style'=>'margin-right: 3px;','link'=>'access_control_import.php?id='.escape($access_control_uuid)]);
}
if (permission_exists('access_control_node_view')) {
echo button::create(['type'=>'button','label'=>$text['button-export'],'icon'=>$_SESSION['theme']['button_icon_export'],'style'=>'margin-right: 3px;','link'=>'access_control_export.php?id='.escape($access_control_uuid)]);
}
if (permission_exists('access_control_node_add')) {
echo button::create(['type'=>'button','label'=>$text['button-copy'],'icon'=>$_SESSION['theme']['button_icon_copy'],'id'=>'btn_copy','name'=>'btn_copy','style'=>'display: none;','onclick'=>"modal_open('modal-copy','btn_copy');"]);
}

View File

@ -0,0 +1,185 @@
<?php
/*
FusionPBX
Version: MPL 1.1
The contents of this file are subject to the Mozilla Public License Version
1.1 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
for the specific language governing rights and limitations under the
License.
The Original Code is FusionPBX
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2024
the Initial Developer. All Rights Reserved.
Contributor(s):
Mark J Crane <markjcrane@fusionpbx.com>
*/
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/paging.php";
//check permissions
if (permission_exists('access_control_node_view')) {
//access granted
}
else {
echo "access denied";
exit;
}
//initialize the database object
$database = new database;
//add multi-lingual support
$language = new text;
$text = $language->get();
//define available columns
$available_columns[] = 'node_type';
$available_columns[] = 'node_cidr';
$available_columns[] = 'node_description';
$available_columns[] = 'insert_date';
$available_columns[] = 'insert_user';
$available_columns[] = 'update_date';
$available_columns[] = 'update_user';
//action add or update
if (!empty($_REQUEST["id"]) && is_uuid($_REQUEST["id"])) {
$access_control_uuid = $_REQUEST["id"];
}
//define the functions
function array2csv(array &$array) {
if (count($array) == 0) {
return null;
}
ob_start();
$df = fopen("php://output", 'w');
fputcsv($df, array_keys(reset($array)));
foreach ($array as $row) {
fputcsv($df, $row);
}
fclose($df);
return ob_get_clean();
}
//send download headers
function download_send_headers($filename) {
// disable caching
$now = gmdate("D, d M Y H:i:s");
header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
header("Cache-Control: max-age=0, no-cache, must-revalidate, proxy-revalidate");
header("Last-Modified: {$now} GMT");
// force download
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
// disposition / encoding on response body
header("Content-Disposition: attachment;filename={$filename}");
header("Content-Transfer-Encoding: binary");
}
//get the extensions from the database and send them as output
if (!empty($_REQUEST["column_group"]) && is_array($_REQUEST["column_group"]) && @sizeof($_REQUEST["column_group"]) != 0) {
//validate the token
$token = new token;
if (!$token->validate($_SERVER['PHP_SELF'])) {
message::add($text['message-invalid_token'],'negative');
header('Location: access_control_export.php');
exit;
}
//validate submitted columns
foreach ($_REQUEST["column_group"] as $column_name) {
if (in_array($column_name, $available_columns)) {
$selected_columns[] = $column_name;
}
}
if (!empty($access_control_uuid) && is_uuid($access_control_uuid) && is_array($selected_columns) && @sizeof($selected_columns) != 0) {
//get the child data
$sql = "select ".implode(', ', $selected_columns)." from v_access_control_nodes ";
$sql .= "where access_control_uuid = :access_control_uuid ";
$sql .= "order by node_cidr asc";
$parameters['access_control_uuid'] = $access_control_uuid;
$access_control_nodes = $database->select($sql, $parameters, 'all');
unset($sql, $parameters, $selected_columns);
//send the download headers
download_send_headers("access_control_export_".date("Y-m-d").".csv");
//output the data
echo array2csv($access_control_nodes);
exit;
}
}
//create token
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
//include the header
$document['title'] = $text['title-access_control_export'];
require_once "resources/header.php";
//show the content
echo "<form method='post' name='frm' id='frm'>\n";
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['header-access_control_export']."</b></div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','link'=>'access_control_edit.php?id='.$access_control_uuid]);
echo button::create(['type'=>'submit','label'=>$text['button-export'],'icon'=>$_SESSION['theme']['button_icon_export'],'id'=>'btn_save','style'=>'margin-left: 15px;']);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
echo $text['description-access_control_export'];
echo "<br /><br />\n";
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle();' ".(empty($available_columns) ? "style='visibility: hidden;'" : null).">\n";
echo " </th>\n";
echo " <th>".$text['label-column_name']."</th>\n";
echo "</tr>\n";
if (!empty($available_columns) && is_array($available_columns) && @sizeof($available_columns) != 0) {
$x = 0;
foreach ($available_columns as $column_name) {
$list_row_onclick = "if (!this.checked) { document.getElementById('checkbox_all').checked = false; }";
echo "<tr class='list-row'>\n";
echo " <td class='checkbox'>\n";
echo " <input type='checkbox' name='column_group[]' id='checkbox_".$x."' value=\"".$column_name."\" onclick=\"".$list_row_onclick."\">\n";
echo " </td>\n";
echo " <td onclick=\"document.getElementById('checkbox_".$x."').checked = document.getElementById('checkbox_".$x."').checked ? false : true; ".$list_row_onclick."\">".$column_name."</td>";
echo "</tr>";
$x++;
}
}
echo "</table>\n";
echo "</div>\n";
echo "<br />\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>\n";
//include the footer
require_once "resources/footer.php";
?>

View File

@ -211,8 +211,12 @@
if (!empty($access_controls) && count($access_controls) > 0) {
$x = 0;
foreach ($access_controls as $row) {
$list_row_url = '';
if (permission_exists('access_control_edit')) {
$list_row_url = "access_control_edit.php?id=".urlencode($row['access_control_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('access_control_add') || permission_exists('access_control_edit') || permission_exists('access_control_delete')) {
@ -254,3 +258,4 @@
require_once "resources/footer.php";
?>

View File

@ -55,7 +55,6 @@
$y++;
$apps[$x]['permissions'][$y]['name'] = "access_control_node_delete";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
//cache details
$apps[$x]['cache']['key'] = "configuration.acl.conf";

View File

@ -33,7 +33,7 @@
if ($num_rows == 0) {
//set the directory
$xml_dir = $setting->get('switch','conf').'/autoload_configs';
$xml_dir = $settings->get('switch','conf').'/autoload_configs';
$xml_file = $xml_dir."/acl.conf.xml";
$xml_file_alt = $_SERVER["DOCUMENT_ROOT"].'/'.PROJECT_PATH.'/app/switch/resources/conf/autoload_configs/acl.conf';
@ -74,7 +74,7 @@
$array['access_controls'][0]['access_control_name'] = $access_control_name;
$array['access_controls'][0]['access_control_default'] = $access_control_default;
$p = new permissions;
$p = permissions::new();
$p->add('access_control_add', 'temp');
$database->app_name = 'access_controls';
@ -106,7 +106,7 @@
$array['access_control_nodes'][0]['node_cidr'] = $node_cidr;
$array['access_control_nodes'][0]['node_description'] = $node_description;
$p = new permissions;
$p = permissions::new();
$p->add('access_control_node_add', 'temp');
$database->app_name = 'access_controls';

View File

@ -108,32 +108,59 @@ $text['title-access_control']['zh-cn'] = "访问控制";
$text['title-access_control']['ja-jp'] = "アクセス制御";
$text['title-access_control']['ko-kr'] = "액세스 제어";
$text['title_description-access_controls']['en-us'] = "Access control list can allow or deny ranges of IP addresses.";
$text['title_description-access_controls']['en-gb'] = "Access control list can allow or deny ranges of IP addresses.";
$text['title_description-access_controls']['ar-eg'] = "قائمة التحكم بالوصول يمكن السماح أو الرفض نطاقات العناوين.";
$text['title_description-access_controls']['de-at'] = "Die Zugriffskontrollliste kann Bereiche von IP Adressen zulassen oder ablehnen.";
$text['title_description-access_controls']['de-ch'] = "Die Zugriffskontrollliste kann Bereiche von IP Adressen zulassen oder ablehnen.";
$text['title_description-access_controls']['de-de'] = "Die Zugriffskontrollliste kann Bereiche von IP Adressen zulassen oder ablehnen.";
$text['title_description-access_controls']['el-gr'] = "Access control list can allow or deny ranges of IP addresses";
$text['title_description-access_controls']['es-cl'] = "Lista de control de acceso puede permitir o denegar los rangos de direcciones IP.";
$text['title_description-access_controls']['es-mx'] = "Lista de control de acceso puede permitir o denegar los rangos de direcciones IP.";
$text['title_description-access_controls']['fr-ca'] = "Liste de contrôle d'accès peut autoriser ou refuser des plages d'adresses IP.";
$text['title_description-access_controls']['fr-fr'] = "Liste de contrôle d'accès peut autoriser ou refuser des plages d'adresses IP.";
$text['title_description-access_controls']['he-il'] = " רשימת בקרת גישה יכולה לאפשר או למנוע טווחים של כתובות IP.";
$text['title_description-access_controls']['it-it'] = "Le liste per il controllo di accesso permettono o negano l'accesso a range di IP.";
$text['title_description-access_controls']['ka-ge'] = "წვდომის კონტროლის სიას IP მისამართების შუალედების დაშვება ან აკრძალვა შეუძლია";
$text['title_description-access_controls']['nl-nl'] = "Toegang Controle lijst kan IP adres reeks toestaan of verbieden.";
$text['title_description-access_controls']['pl-pl'] = "Lista kontroli dostępu może umożliwić lub zablokować zakresy adresów IP.";
$text['title_description-access_controls']['pt-br'] = "Lista de controle de acesso pode permitir ou negar intervalos de endereços IP.";
$text['title_description-access_controls']['pt-pt'] = "Lista de controle de acesso pode permitir ou negar intervalos de endereços IP.";
$text['title_description-access_controls']['ro-ro'] = "Lista de control al accesului poate permite sau refuza intervale de adrese IP.";
$text['title_description-access_controls']['ru-ru'] = "Контроль доступа может разрешить или запретить диапазоны IP адресов.";
$text['title_description-access_controls']['sv-se'] = "Åtkomstkontrollista kan tillåta eller neka intervall av IP-adresser.";
$text['title_description-access_controls']['uk-ua'] = "Список контролю доступу може дозволити або заборонити діапазони IP-адрес.";
$text['title_description-access_controls']['tr-tr'] = "Erişim kontrol listesi IP adres aralıklarına izin verebilir veya reddedebilir.";
$text['title_description-access_controls']['zh-cn'] = "访问控制列表可以允许或拒绝 IP 地址范围。";
$text['title_description-access_controls']['ja-jp'] = "アクセス コントロール リストでは、IP アドレスの範囲を許可または拒否できます。";
$text['title_description-access_controls']['ko-kr'] = "액세스 제어 목록은 IP 주소 범위를 허용하거나 거부할 수 있습니다.";
$text['title-access_control_export']['en-us'] = "Access Control Export";
$text['title-access_control_export']['en-gb'] = "Access Control Export";
$text['title-access_control_export']['ar-eg'] = "";
$text['title-access_control_export']['de-at'] = "";
$text['title-access_control_export']['de-ch'] = "";
$text['title-access_control_export']['de-de'] = "";
$text['title-access_control_export']['ek-gr'] = "";
$text['title-access_control_export']['es-cl'] = "";
$text['title-access_control_export']['es-mx'] = "";
$text['title-access_control_export']['fr-ca'] = "";
$text['title-access_control_export']['fr-fr'] = "";
$text['title-access_control_export']['he-il'] = "";
$text['title-access_control_export']['it-it'] = "";
$text['title-access_control_export']['ka-ge'] = "";
$text['title-access_control_export']['nl-nl'] = "";
$text['title-access_control_export']['pl-pl'] = "";
$text['title-access_control_export']['pt-br'] = "";
$text['title-access_control_export']['pt-pt'] = "";
$text['title-access_control_export']['ro-ro'] = "";
$text['title-access_control_export']['ru-ru'] = "";
$text['title-access_control_export']['sv-se'] = "";
$text['title-access_control_export']['uk-ua'] = "";
$text['title-access_control_export']['tr-tr'] = "";
$text['title-access_control_export']['zh-cn'] = "";
$text['title-access_control_export']['ja-jp'] = "";
$text['title-access_control_export']['ko-kr'] = "";
$text['header-access_control_export']['en-us'] = "Access Control Export";
$text['header-access_control_export']['en-gb'] = "Access Control Export";
$text['header-access_control_export']['ar-eg'] = "";
$text['header-access_control_export']['de-at'] = "";
$text['header-access_control_export']['de-ch'] = "";
$text['header-access_control_export']['de-de'] = "";
$text['header-access_control_export']['ek-gr'] = "";
$text['header-access_control_export']['es-cl'] = "";
$text['header-access_control_export']['es-mx'] = "";
$text['header-access_control_export']['fr-ca'] = "";
$text['header-access_control_export']['fr-fr'] = "";
$text['header-access_control_export']['he-il'] = "";
$text['header-access_control_export']['it-it'] = "";
$text['header-access_control_export']['ka-ge'] = "";
$text['header-access_control_export']['nl-nl'] = "";
$text['header-access_control_export']['pl-pl'] = "";
$text['header-access_control_export']['pt-br'] = "";
$text['header-access_control_export']['pt-pt'] = "";
$text['header-access_control_export']['ro-ro'] = "";
$text['header-access_control_export']['ru-ru'] = "";
$text['header-access_control_export']['sv-se'] = "";
$text['header-access_control_export']['uk-ua'] = "";
$text['header-access_control_export']['tr-tr'] = "";
$text['header-access_control_export']['zh-cn'] = "";
$text['header-access_control_export']['ja-jp'] = "";
$text['header-access_control_export']['ko-kr'] = "";
$text['label-node_type']['en-us'] = "Type";
$text['label-node_type']['en-gb'] = "Type";
@ -405,6 +432,33 @@ $text['label-access_control_description']['zh-cn'] = "描述";
$text['label-access_control_description']['ja-jp'] = "説明";
$text['label-access_control_description']['ko-kr'] = "설명";
$text['title_description-access_controls']['en-us'] = "Access control list can allow or deny ranges of IP addresses.";
$text['title_description-access_controls']['en-gb'] = "Access control list can allow or deny ranges of IP addresses.";
$text['title_description-access_controls']['ar-eg'] = "قائمة التحكم بالوصول يمكن السماح أو الرفض نطاقات العناوين.";
$text['title_description-access_controls']['de-at'] = "Die Zugriffskontrollliste kann Bereiche von IP Adressen zulassen oder ablehnen.";
$text['title_description-access_controls']['de-ch'] = "Die Zugriffskontrollliste kann Bereiche von IP Adressen zulassen oder ablehnen.";
$text['title_description-access_controls']['de-de'] = "Die Zugriffskontrollliste kann Bereiche von IP Adressen zulassen oder ablehnen.";
$text['title_description-access_controls']['el-gr'] = "Access control list can allow or deny ranges of IP addresses";
$text['title_description-access_controls']['es-cl'] = "Lista de control de acceso puede permitir o denegar los rangos de direcciones IP.";
$text['title_description-access_controls']['es-mx'] = "Lista de control de acceso puede permitir o denegar los rangos de direcciones IP.";
$text['title_description-access_controls']['fr-ca'] = "Liste de contrôle d'accès peut autoriser ou refuser des plages d'adresses IP.";
$text['title_description-access_controls']['fr-fr'] = "Liste de contrôle d'accès peut autoriser ou refuser des plages d'adresses IP.";
$text['title_description-access_controls']['he-il'] = " רשימת בקרת גישה יכולה לאפשר או למנוע טווחים של כתובות IP.";
$text['title_description-access_controls']['it-it'] = "Le liste per il controllo di accesso permettono o negano l'accesso a range di IP.";
$text['title_description-access_controls']['ka-ge'] = "წვდომის კონტროლის სიას IP მისამართების შუალედების დაშვება ან აკრძალვა შეუძლია";
$text['title_description-access_controls']['nl-nl'] = "Toegang Controle lijst kan IP adres reeks toestaan of verbieden.";
$text['title_description-access_controls']['pl-pl'] = "Lista kontroli dostępu może umożliwić lub zablokować zakresy adresów IP.";
$text['title_description-access_controls']['pt-br'] = "Lista de controle de acesso pode permitir ou negar intervalos de endereços IP.";
$text['title_description-access_controls']['pt-pt'] = "Lista de controle de acesso pode permitir ou negar intervalos de endereços IP.";
$text['title_description-access_controls']['ro-ro'] = "Lista de control al accesului poate permite sau refuza intervale de adrese IP.";
$text['title_description-access_controls']['ru-ru'] = "Контроль доступа может разрешить или запретить диапазоны IP адресов.";
$text['title_description-access_controls']['sv-se'] = "Åtkomstkontrollista kan tillåta eller neka intervall av IP-adresser.";
$text['title_description-access_controls']['uk-ua'] = "Список контролю доступу може дозволити або заборонити діапазони IP-адрес.";
$text['title_description-access_controls']['tr-tr'] = "Erişim kontrol listesi IP adres aralıklarına izin verebilir veya reddedebilir.";
$text['title_description-access_controls']['zh-cn'] = "访问控制列表可以允许或拒绝 IP 地址范围。";
$text['title_description-access_controls']['ja-jp'] = "アクセス コントロール リストでは、IP アドレスの範囲を許可または拒否できます。";
$text['title_description-access_controls']['ko-kr'] = "액세스 제어 목록은 IP 주소 범위를 허용하거나 거부할 수 있습니다.";
$text['description-node_type']['en-us'] = "Select the type.";
$text['description-node_type']['en-gb'] = "Select the type.";
$text['description-node_type']['ar-eg'] = "حدد نوع.";
@ -594,4 +648,31 @@ $text['description-access_control_default']['zh-cn'] = "选择默认类型。";
$text['description-access_control_default']['ja-jp'] = "デフォルトのタイプを選択します。";
$text['description-access_control_default']['ko-kr'] = "기본 유형을 선택합니다.";
$text['description-access_control_export']['en-us'] = "Select the fields you wish to include in the export.";
$text['description-access_control_export']['en-gb'] = "Select the fields you wish to include in the export.";
$text['description-access_control_export']['ar-eg'] = "حدد الحقول التي ترغب في تضمينها في التصدير.";
$text['description-access_control_export']['de-at'] = "Wählen Sie die Felder aus, die Sie in den Export einbeziehen möchten.";
$text['description-access_control_export']['de-ch'] = "Wählen Sie die Felder aus, die Sie in den Export einbeziehen möchten.";
$text['description-access_control_export']['de-de'] = "Wählen Sie die Felder aus, die Sie in den Export einbeziehen möchten.";
$text['description-access_control_export']['ek-gr'] = "Επιλέξτε τα πεδία που θέλετε να συμπεριλάβετε στην εξαγωγή.";
$text['description-access_control_export']['es-cl'] = "Seleccione los campos que desea incluir en la exportación.";
$text['description-access_control_export']['es-mx'] = "Seleccione los campos que desea incluir en la exportación.";
$text['description-access_control_export']['fr-ca'] = "Sélectionnez les champs que vous souhaitez inclure dans l'exportation.";
$text['description-access_control_export']['fr-fr'] = "Sélectionnez les champs que vous souhaitez inclure dans l'exportation.";
$text['description-access_control_export']['he-il'] = "בחר את השדות שברצונך לכלול בייצוא.";
$text['description-access_control_export']['it-it'] = "Seleziona i campi che desideri includere nell'esportazione.";
$text['description-access_control_export']['ka-ge'] = "აირჩიეთ ექსპორტში ჩასასმელი ველები.";
$text['description-access_control_export']['nl-nl'] = "Selecteer de velden die u in de export wilt opnemen.";
$text['description-access_control_export']['pl-pl'] = "Wybierz pola, które chcesz uwzględnić w eksporcie.";
$text['description-access_control_export']['pt-br'] = "Selecione os campos que deseja incluir na exportação.";
$text['description-access_control_export']['pt-pt'] = "Selecione os campos que deseja incluir na exportação.";
$text['description-access_control_export']['ro-ro'] = "Selectați câmpurile pe care doriți să le includeți în export.";
$text['description-access_control_export']['ru-ru'] = "Выберите поля, которые вы хотите включить в экспорт.";
$text['description-access_control_export']['sv-se'] = "Välj de fält du vill inkludera i exporten.";
$text['description-access_control_export']['uk-ua'] = "Виберіть поля, які потрібно включити в експорт.";
$text['description-access_control_export']['tr-tr'] = "Dışa aktarmaya dahil etmek istediğiniz alanları seçin.";
$text['description-access_control_export']['zh-cn'] = "选择您希望包含在导出中的字段。";
$text['description-access_control_export']['ja-jp'] = "エクスポートに含めるフィールドを選択します。";
$text['description-access_control_export']['ko-kr'] = "내보내기에 포함할 필드를 선택합니다.";
?>

View File

@ -2,11 +2,7 @@
/**
* access controls class
*
* @method null download
*/
if (!class_exists('access_controls')) {
class access_controls {
/**
@ -69,7 +65,7 @@ if (!class_exists('access_controls')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('access_control_node_delete', 'temp');
//execute delete
@ -236,7 +232,7 @@ if (!class_exists('access_controls')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('access_control_node_add', 'temp');
//save the array
@ -264,6 +260,3 @@ if (!class_exists('access_controls')) {
}
}
}
}
?>

View File

@ -192,5 +192,13 @@
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "4f4641c3-7398-421e-a0b3-5d7960813728";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "avaya_blf_subscription_expiry";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "60";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "The expiry that Avaya phones will populate in their SUBSCRIBE messages. This should be set to equal or less than the nonce-ttl value that is set in your SIP profile.";
$y++;
?>

View File

@ -65,7 +65,7 @@
//update the status
if (permission_exists("user_setting_edit")) {
//add the user_edit permission
$p = new permissions;
$p = permissions::new();
$p->add("user_edit", "temp");
//update the database user_status
@ -153,7 +153,7 @@
}
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('extension_edit', 'temp');
//execute update

View File

@ -27,7 +27,6 @@
/**
* Define the operator_panel class
*/
if (!class_exists('basic_operator_panel')) {
class basic_operator_panel {
/**
@ -245,6 +244,3 @@ if (!class_exists('basic_operator_panel')) {
return $result;
}
}
}
?>

View File

@ -353,7 +353,7 @@ if (is_array($activity)) {
}
else {
//unregistered extension
if (!empty($_SESSION['operator_panel']['show_unregistered']['boolean']) && $_SESSION['operator_panel']['show_unregistered']['boolean'] == 'true') {
if (filter_var($_SESSION['operator_panel']['show_unregistered']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
$css_class = "ur_ext";
}
else {
@ -551,7 +551,7 @@ if (is_array($activity)) {
if (in_array($extension, $_SESSION['user']['extensions'])) {
$user_extensions[] = $block;
} elseif (!empty($ext['call_group']) && filter_var($_SESSION['operator_panel']['group_extensions']['boolean'], FILTER_VALIDATE_BOOLEAN)) {
} elseif (!empty($ext['call_group']) && filter_var($_SESSION['operator_panel']['group_extensions']['boolean'] ?? false, FILTER_VALIDATE_BOOLEAN)) {
$grouped_extensions[$ext['call_group']][] = $block;
} else {
$other_extensions[] = $block;

View File

@ -47,7 +47,7 @@
$show = $_GET["show"] ?? '';
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get the http post data
if (!empty($_POST['bridges'])) {
@ -126,7 +126,7 @@
$offset = $rows_per_page * $page;
//get the list
$sql = "select b.bridge_uuid, d.domain_name, b.bridge_name, b.bridge_destination, bridge_enabled, bridge_description ";
$sql = "select d.domain_uuid, b.bridge_uuid, d.domain_name, b.bridge_name, b.bridge_destination, bridge_enabled, bridge_description ";
$sql .= "from v_bridges as b, v_domains as d ";
$sql .= "where b.domain_uuid = d.domain_uuid ";
if (!empty($show) && $show == "all" && permission_exists('bridge_all')) {
@ -226,7 +226,7 @@
echo th_order_by('bridge_destination', $text['label-bridge_destination'], $order_by, $order);
echo th_order_by('bridge_enabled', $text['label-bridge_enabled'], $order_by, $order, null, "class='center'");
echo " <th class='hide-sm-dn'>".$text['label-bridge_description']."</th>\n";
if (permission_exists('bridge_edit') && !empty($list_row_edit_button) && $list_row_edit_button == 'true') {
if (permission_exists('bridge_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -234,8 +234,12 @@
if (!empty($bridges)) {
$x = 0;
foreach ($bridges as $row) {
$list_row_url = '';
if (permission_exists('bridge_edit')) {
$list_row_url = "bridge_edit.php?id=".urlencode($row['bridge_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('bridge_add') || permission_exists('bridge_edit') || permission_exists('bridge_delete')) {
@ -266,7 +270,7 @@
}
echo " </td>\n";
echo " <td class='description overflow hide-sm-dn'>".escape($row['bridge_description'])."</td>\n";
if (permission_exists('bridge_edit') && !empty($list_row_edit_button) && $list_row_edit_button == 'true') {
if (permission_exists('bridge_edit') && $list_row_edit_button) {
echo " <td class='action-button'>\n";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";

View File

@ -25,7 +25,6 @@
*/
//define the bridges class
if (!class_exists('bridges')) {
class bridges {
/**
@ -255,6 +254,3 @@ if (!class_exists('bridges')) {
}
}
}
?>

View File

@ -46,7 +46,7 @@
$show = $_GET["show"] ?? '';
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get posted data
if (!empty($_POST['call_blocks'])) {
@ -301,7 +301,7 @@
echo th_order_by('call_block_enabled', $text['label-enabled'], $order_by, $order, null, "class='center'");
echo th_order_by('insert_date', $text['label-date-added'], $order_by, $order, null, "class='shrink no-wrap'");
echo "<th class='hide-md-dn pct-20'>".$text['label-description']."</th>\n";
if (permission_exists('call_block_edit') && $list_row_edit_button == 'true') {
if (permission_exists('call_block_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -309,8 +309,12 @@
if (!empty($result)) {
$x = 0;
foreach ($result as $row) {
$list_row_url = '';
if (permission_exists('call_block_edit')) {
$list_row_url = "call_block_edit.php?id=".urlencode($row['call_block_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('call_block_add') || permission_exists('call_block_edit') || permission_exists('call_block_delete')) {
@ -381,7 +385,7 @@
echo " </td>\n";
echo " <td class='no-wrap'>".$row['date_formatted']." <span class='hide-sm-dn'>".$row['time_formatted']."</span></td>\n";
echo " <td class='description overflow hide-md-dn'>".escape($row['call_block_description'])."</td>\n";
if (permission_exists('call_block_edit') && $list_row_edit_button == 'true') {
if (permission_exists('call_block_edit') && $list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -405,3 +409,4 @@
require_once "resources/footer.php";
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2024
Portions created by the Initial Developer are Copyright (C) 2008-2025
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -166,7 +166,7 @@
$array['dialplans'][$index]['dialplan_enabled'] = 'true';
}
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_edit', 'temp');
$database->save($array);
@ -557,7 +557,7 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
}
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo "<td class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-enabled']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
@ -674,6 +674,8 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
echo modal::create(['id'=>'modal-block','type'=>'general','message'=>$text['confirm-block'],'actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_block','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_form_submit('form_list');"])]);
}
echo "<div class='card'>\n";
foreach (['inbound','outbound'] as $direction) {
echo "<table class='list' id='list_".$direction."' ".($direction == 'outbound' ? "style='display: none;'" : null).">\n";
echo "<tr class='list-header'>\n";
@ -754,6 +756,8 @@ if (permission_exists('call_block_all') || permission_exists('call_block_ring_gr
echo "</table>\n";
}
echo "</div>\n";
echo "<br />\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>\n";

View File

@ -2,10 +2,7 @@
/**
* call block class
*
* @method null download
*/
if (!class_exists('call_block')) {
class call_block {
/**
@ -435,7 +432,7 @@ if (!class_exists('call_block')) {
unset($rows, $parameters);
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_edit', 'temp');
//save the array
@ -459,6 +456,3 @@ if (!class_exists('call_block')) {
} //method
} //class
}
?>

View File

@ -5,6 +5,7 @@ $array['dashboard'][$x]['dashboard_uuid'] = 'e75f04ff-6d1b-4b39-af0f-e1d1860327c
$array['dashboard'][$x]['dashboard_name'] = 'Call Block';
$array['dashboard'][$x]['dashboard_path'] = 'dashboard/icon';
$array['dashboard'][$x]['dashboard_icon'] = 'fa-ban';
$array['dashboard'][$x]['dashboard_icon_color'] = '#EA4C46';
$array['dashboard'][$x]['dashboard_url'] = '/app/call_block/call_block.php';
$array['dashboard'][$x]['dashboard_target'] = 'self';
$array['dashboard'][$x]['dashboard_width'] = '';
@ -13,14 +14,15 @@ $array['dashboard'][$x]['dashboard_content'] = '';
$array['dashboard'][$x]['dashboard_content_text_align'] = '';
$array['dashboard'][$x]['dashboard_content_details'] = '';
$array['dashboard'][$x]['dashboard_chart_type'] = '';
$array['dashboard'][$x]['dashboard_heading_text_color'] = '';
$array['dashboard'][$x]['dashboard_heading_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_heading_background_color'] = '';
$array['dashboard'][$x]['dashboard_heading_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color'] = '#EA4C46';
$array['dashboard'][$x]['dashboard_label_enabled'] = 'true';
$array['dashboard'][$x]['dashboard_label_text_color'] = '#444444';
$array['dashboard'][$x]['dashboard_label_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_label_background_color'] = '';
$array['dashboard'][$x]['dashboard_label_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_text_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_background_color'] ='';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_background_color'] = '#ffffff';
$array['dashboard'][$x]['dashboard_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_detail_background_color'] = '';
$array['dashboard'][$x]['dashboard_column_span'] = '1';

View File

@ -47,7 +47,7 @@
$show = $_GET["show"] ?? '';
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get posted data
if (!empty($_POST['call_broadcasts'])) {
@ -219,7 +219,7 @@
echo th_order_by('broadcast_concurrent_limit', $text['label-concurrent-limit'], $order_by, $order);
echo th_order_by('broadcast_start_time', $text['label-start_time'], $order_by, $order);
echo th_order_by('broadcast_description', $text['label-description'], $order_by, $order);
if (permission_exists('call_broadcast_edit') && $list_row_edit_button == 'true') {
if (permission_exists('call_broadcast_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -227,8 +227,12 @@
if (!empty($result)) {
$x = 0;
foreach($result as $row) {
$list_row_url = '';
if (permission_exists('call_broadcast_edit')) {
$list_row_url = "call_broadcast_edit.php?id=".urlencode($row['call_broadcast_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('call_broadcast_add') || permission_exists('call_broadcast_delete')) {
@ -262,7 +266,7 @@
}
echo " <td>".escape($broadcast_start_time ?? '')."</td>\n";
echo " <td class='description overflow hide-xs'>".escape($row['broadcast_description'])."</td>\n";
if (permission_exists('call_broadcast_edit') && $list_row_edit_button == 'true') {
if (permission_exists('call_broadcast_edit') && $list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -286,3 +290,4 @@
require_once "resources/footer.php";
?>

View File

@ -27,10 +27,7 @@
/**
* call broadcast class
*
* @method null download
*/
if (!class_exists('call_broadcast')) {
class call_broadcast {
/**
@ -177,6 +174,3 @@ if (!class_exists('call_broadcast')) {
}
}
}
?>

View File

@ -221,9 +221,18 @@
$talk_time = $agent_row['talk_time'];
$ready_time = $agent_row['ready_time'];
//calcudate the length since status change and bridge end
$last_status_change_length = time() - $last_status_change;
$last_bridge_end_length = time() - $last_bridge_end;
//set the state to wrap up time
if ($last_bridge_end_length < $wrap_up_time) {
$state = 'Wrap Up Time';
}
//format the seconds to hh:mm:ss
$last_status_change_length = format_seconds(time() - $last_status_change);
$last_bridge_end_length = format_seconds(time() - $last_bridge_end);
$last_status_change_length_formatted = format_seconds($last_status_change_length);
$last_bridge_end_length_formatted = format_seconds($last_bridge_end_length);
if (permission_exists('call_center_agent_edit')) {
$list_row_url = "../call_centers/call_center_agent_edit.php?id=".$agent_uuid;
@ -241,8 +250,8 @@
echo "<td>".escape($agent_extension)."</td>\n";
echo "<td>".escape($status)."</td>\n";
echo "<td>".escape($state)."</td>\n";
echo "<td>".escape($last_status_change_length)."</td>\n";
echo "<td>".escape($last_bridge_end_length)."</td>\n";
echo "<td>".escape($last_status_change_length_formatted)."</td>\n";
echo "<td>".escape($last_bridge_end_length_formatted)."</td>\n";
echo "<td class='center'>".escape($no_answer_count)."</td>\n";
echo "<td class='center'>".escape($calls_answered)."</td>\n";
echo "<td>".escape($tier_state)."</td>\n";

View File

@ -128,6 +128,9 @@
$x = 0;
foreach($call_center_queues as $row) {
$list_row_url = PROJECT_PATH."/app/call_center_active/call_center_active.php?queue_name=".escape($row['call_center_queue_uuid'])."&name=".urlencode(escape($row['queue_name']));
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
echo " <td><a href='".$list_row_url."'>".escape($row['queue_name'])."</a></td>\n";
echo " <td>".escape($row['queue_extension'])."</td>\n";
@ -159,3 +162,4 @@
require_once "resources/footer.php";
?>

View File

@ -216,7 +216,7 @@
$apps[$x]['default_settings'][$y]['default_setting_category'] = "call_center";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "record_name";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "\${sip_from_user}-\${sip_to_user}-\${strftime(%Y)}\${strftime(%b)}\${strftime(%d)}.\${record_ext}";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "\${sip_from_user}-\${sip_to_user}-\${strftime(%Y)}\${strftime(%b)}\${strftime(%d)}-\${uuid}.\${record_ext}";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Custom name for call recording. Options: \${record_ext}, \${sip_from_user}, \${sip_to_user}, \${caller_id_number}, \${uuid}";
$y++;

View File

@ -58,7 +58,7 @@ if ($domains_processed == 1) {
}
if (!empty($array)) {
$p = new permissions;
$p = permissions::new();
$p->add('call_center_tier_edit', 'temp');
$database->app_name = 'call_centers';
@ -93,8 +93,8 @@ if ($domains_processed == 1) {
//add the recording path if needed
if ($row['queue_greeting'] != '') {
if (file_exists($setting->get('switch','recordings').'/'.$row['domain_name'].'/'.$row['queue_greeting'])) {
$queue_greeting_path = $setting->get('switch','recordings').'/'.$row['domain_name'].'/'.$row['queue_greeting'];
if (file_exists($settings->get('switch','recordings').'/'.$row['domain_name'].'/'.$row['queue_greeting'])) {
$queue_greeting_path = $settings->get('switch','recordings').'/'.$row['domain_name'].'/'.$row['queue_greeting'];
}
else {
$queue_greeting_path = trim($row['queue_greeting']);
@ -168,7 +168,7 @@ if ($domains_processed == 1) {
//save the array to the database
if (!empty($array)) {
//add the dialplan permission
$p = new permissions;
$p = permissions::new();
$p->add("dialplan_add", "temp");
$p->add("dialplan_edit", "temp");

View File

@ -42,36 +42,14 @@
$language = new text;
$text = $language->get();
//connect to the database
$database = new database;
//set the defaults
$agent_id = '';
$agent_name = '';
$agent_password = '';
//check for duplicates
if (!empty($_GET["check"]) && $_GET["check"] == 'duplicate') {
//agent id
if (!empty($_GET["agent_id"])) {
$sql = "select agent_name ";
$sql .= "from v_call_center_agents ";
$sql .= "where agent_id = :agent_id ";
$sql .= "and domain_uuid = :domain_uuid ";
if (!empty($_GET["agent_uuid"]) && is_uuid($_GET["agent_uuid"])) {
$sql .= " and call_center_agent_uuid <> :call_center_agent_uuid ";
$parameters['call_center_agent_uuid'] = $_GET["agent_uuid"];
}
$parameters['agent_id'] = $_GET["agent_id"];
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$row = $database->select($sql, $parameters, 'row');
if (!empty($row) && !empty($row['agent_name'])) {
echo $text['message-duplicate_agent_id'].(if_group("superadmin") ? ": ".$row["agent_name"] : null);
}
unset($sql, $parameters);
}
exit;
}
//action add or update
if (!empty($_REQUEST["id"]) && is_uuid($_REQUEST["id"])) {
$action = "update";
@ -81,6 +59,14 @@
$action = "add";
}
//get the users array
$sql = "select * from v_users ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "order by username asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$users = $database->select($sql, $parameters, 'all');
unset($sql, $parameters);
//get http post variables and set them to php variables
if (!empty($_POST)) {
$call_center_agent_uuid = $_POST["call_center_agent_uuid"] ?? null;
@ -151,15 +137,6 @@
$call_center_agent_uuid = uuid();
}
//get the users array
$sql = "select * from v_users ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "order by username asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$users = $database->select($sql, $parameters, 'all');
unset($sql, $parameters);
//change the contact string to loopback - Not recommended added for backwards comptability causes multiple problems
if ($_SESSION['call_center']['agent_contact_method']['text'] == 'loopback') {
$agent_contact = str_replace("user/", "loopback/", $agent_contact);
@ -193,11 +170,9 @@
}
//save to the data
$database = new database;
$database->app_name = 'call_center';
$database->app_uuid = '95788e50-9500-079e-2807-fd530b0ea370';
$database->save($array);
//$message = $database->message;
//syncrhonize configuration
save_call_center_xml();
@ -295,7 +270,6 @@
$sql .= "and call_center_agent_uuid = :call_center_agent_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$parameters['call_center_agent_uuid'] = $call_center_agent_uuid;
$database = new database;
$row = $database->select($sql, $parameters, 'row');
if (!empty($row)) {
$call_center_agent_uuid = $row["call_center_agent_uuid"];
@ -338,47 +312,12 @@
if ($action == "update") {
$document['title'] = $text['title-call_center_agent_edit'];
}
//include the header
require_once "resources/header.php";
//get the list of users for this domain
$sql = "select * from v_users ";
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "and user_enabled = 'true' ";
$sql .= "order by username asc ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$database = new database;
$users = $database->select($sql, $parameters, 'all');
unset($sql, $parameters);
//javascript to check for duplicates
?>
<script language="javascript">
function check_duplicates() {
//check agent id
var agent_id = document.getElementById('agent_id').value;
$("#duplicate_agent_id_response").load("call_center_agent_edit.php?check=duplicate&agent_id="+agent_id+"&agent_uuid=<?php echo escape($call_center_agent_uuid ?? ''); ?>", function() {
var duplicate_agent_id = false;
if ($("#duplicate_agent_id_response").html() != '') {
$('#agent_id').addClass('formfld_highlight_bad');
display_message($("#duplicate_agent_id_response").html(), 'negative'<?php if (if_group("superadmin")) { echo ', 3000'; } ?>);
duplicate_agent_id = true;
}
else {
$("#duplicate_agent_id_response").html('');
$('#agent_id').removeClass('formfld_highlight_bad');
duplicate_agent_id = false;
}
if (duplicate_agent_id == false) {
document.getElementById('frm').submit();
}
});
}
</script>
<?php
//show the content
echo "<form method='post' name='frm' id='frm' onsubmit='check_duplicates(); return false;'>\n";
echo "<form method='post' name='frm' id='frm' onsubmit=''>\n";
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'>";
@ -404,21 +343,6 @@
echo "</td>\n";
echo "<td width='70%' class='vtable' align='left'>\n";
echo " <input class='formfld' type='text' name='agent_name' maxlength='255' value=\"".escape($agent_name)."\" />\n";
/*
echo "<select id=\"agent_name\" name=\"agent_name\" class='formfld'>\n";
echo "<option value=\"\"></option>\n";
if (is_array($users)) {
foreach($users as $field) {
if ($field[username] == $agent_name) {
echo "<option value='".escape($field[username])."' selected='selected'>".escape($field[username])."</option>\n";
}
else {
echo "<option value='".escape($field[username])."'>".escape($field[username])."</option>\n";
}
}
}
echo "</select>";
*/
echo "<br />\n";
echo $text['description-agent_name']."\n";
echo "</td>\n";
@ -467,7 +391,6 @@
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input class='formfld' type='number' name='agent_id' id='agent_id' maxlength='255' min='1' step='1' value='".escape($agent_id)."'>\n";
echo " <div style='display: none;' id='duplicate_agent_id_response'></div>\n";
echo "<br />\n";
echo $text['description-agent_id']."\n";
echo "</td>\n";
@ -478,7 +401,7 @@
echo " ".$text['label-agent_password']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input class='formfld' type='password' name='agent_password' autocomplete='off' onmouseover=\"this.type='text';\" onfocus=\"this.type='text';\" onmouseout=\"if (!\$(this).is(':focus')) { this.type='password'; }\" onblur=\"this.type='password';\" maxlength='255' min='1' step='1' value='".escape($agent_password)."'>\n";
echo " <input class='formfld password' type='password' name='agent_password' autocomplete='off' onmouseover=\"this.type='text';\" onfocus=\"this.type='text';\" onmouseout=\"if (!\$(this).is(':focus')) { this.type='password'; }\" onblur=\"this.type='password';\" maxlength='255' min='1' step='1' value='".escape($agent_password)."'>\n";
echo "<br />\n";
echo $text['description-agent_password']."\n";
echo "</td>\n";

View File

@ -172,7 +172,7 @@
$array['users'][0]['user_status'] = $row['agent_status'];
$array['users'][0]['domain_uuid'] = $_SESSION['domain_uuid'];
$p = new permissions;
$p = permissions::new();
$p->add('user_edit', 'temp');
$database = new database;

View File

@ -43,7 +43,7 @@
$text = $language->get();
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get posted data
if (!empty($_POST['call_center_agents'])) {
@ -206,7 +206,7 @@
//echo th_order_by('agent_wrap_up_time', $text['label-wrap_up_time'], $order_by, $order);
//echo th_order_by('agent_reject_delay_time', $text['label-reject_delay_time'], $order_by, $order);
//echo th_order_by('agent_busy_delay_time', $text['label-busy_delay_time'], $order_by, $order);
if (permission_exists('call_center_agent_edit') && $list_row_edit_button == 'true') {
if (permission_exists('call_center_agent_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -214,8 +214,12 @@
if (!empty($result)) {
$x = 0;
foreach($result as $row) {
$list_row_url = '';
if (permission_exists('call_center_agent_edit')) {
$list_row_url = "call_center_agent_edit.php?id=".urlencode($row['call_center_agent_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('call_center_agent_delete')) {
@ -266,7 +270,7 @@
//echo " <td>".$row[agent_wrap_up_time]."</td>\n";
//echo " <td>".$row[agent_reject_delay_time]."</td>\n";
//echo " <td>".$row[agent_busy_delay_time]."</td>\n";
if (permission_exists('call_center_agent_edit') && $list_row_edit_button == 'true') {
if (permission_exists('call_center_agent_edit') && $list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -290,3 +294,4 @@
require_once "resources/footer.php";
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2024
Portions created by the Initial Developer are Copyright (C) 2008-2025
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -42,6 +42,10 @@
$language = new text;
$text = $language->get();
//initialize database and settings
$database = database::new();
$settings = new settings(['database' => $database, $_SESSION['domain_uuid'] ?? '', $_SESSION['user_uuid'] ?? '']);
//set the defaults
$queue_name = '';
$queue_extension = '';
@ -61,24 +65,24 @@
$action = "add";
}
//get the domain_uuid
//get the domain details
$domain_uuid = $_SESSION['domain_uuid'];
$domain_name = $_SESSION['domain_name'];
//initialize the destinations object
//initialize the destination object
$destination = new destinations;
//get total call center queues count from the database, check limit, if defined
if ($action == 'add') {
if (!empty($_SESSION['limit']['call_center_queues']['numeric'])) {
if (!empty($settings->get('limit','call_center_queues', ''))) {
$sql = "select count(*) from v_call_center_queues ";
$sql .= "where domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $domain_uuid;
$database = new database;
$total_call_center_queues = $database->select($sql, $parameters, 'column');
unset($sql, $parameters);
if ($total_call_center_queues >= $_SESSION['limit']['call_center_queues']['numeric']) {
message::add($text['message-maximum_queues'].' '.$_SESSION['limit']['call_center_queues']['numeric'], 'negative');
if ($total_call_center_queues >= $settings->get('limit','call_center_queues', 0)) {
message::add($text['message-maximum_queues'].' '.$settings->get('limit','call_center_queues', ''), 'negative');
header('Location: call_center_queues.php');
return;
}
@ -124,7 +128,7 @@
$queue_context = $_POST["queue_context"];
}
else if ($action == 'add') {
$queue_context = $_SESSION['domain_name'];
$queue_context = $domain_name;
}
//remove invalid characters
@ -149,7 +153,6 @@
$sql .= "and t.call_center_queue_uuid = q.call_center_queue_uuid; ";
$parameters['domain_uuid'] = $domain_uuid;
$parameters['call_center_tier_uuid'] = $call_center_tier_uuid;
$database = new database;
$tiers = $database->select($sql, $parameters, 'all');
unset($sql, $parameters);
@ -168,7 +171,7 @@
if ($esl->is_connected()) {
//callcenter_config tier del [queue_name] [agent_name]
if (is_numeric($queue_extension) && is_uuid($call_center_agent_uuid)) {
$cmd = "callcenter_config tier del ".$queue_extension."@".$_SESSION['domain_name']." ".$call_center_agent_uuid;
$cmd = "callcenter_config tier del ".$queue_extension."@".$domain_name." ".$call_center_agent_uuid;
$response = event_socket::api($cmd);
}
}
@ -178,10 +181,9 @@
$array['call_center_tiers'][0]['call_center_tier_uuid'] = $call_center_tier_uuid;
$array['call_center_tiers'][0]['domain_uuid'] = $domain_uuid;
$p = new permissions;
$p = permissions::new();
$p->add('call_center_tier_delete', 'temp');
$database = new database;
$database->app_name = 'call_centers';
$database->app_uuid = '95788e50-9500-079e-2807-fd530b0ea370';
$database->delete($array);
@ -205,7 +207,6 @@
$sql = "select * from v_call_center_queues ";
$sql .= "where call_center_queue_uuid = :call_center_queue_uuid ";
$parameters['call_center_queue_uuid'] = $call_center_queue_uuid;
$database = new database;
$row = $database->select($sql, $parameters, 'row');
if (!empty($row)) {
//if (!permission_exists('call_center_queue_domain')) {
@ -298,8 +299,8 @@
//add the recording path if needed
if (!empty($queue_greeting)) {
if (file_exists($_SESSION['switch']['recordings']['dir'].'/'.$_SESSION['domain_name'].'/'.$queue_greeting)) {
$queue_greeting_path = $_SESSION['switch']['recordings']['dir'].'/'.$_SESSION['domain_name'].'/'.$queue_greeting;
if (file_exists($settings->get('switch','recordings', '').'/'.$domain_name.'/'.$queue_greeting)) {
$queue_greeting_path = $settings->get('switch','recordings', '').'/'.$domain_name.'/'.$queue_greeting;
}
else {
$queue_greeting_path = trim($queue_greeting);
@ -371,8 +372,8 @@
//add definable export variables can be set in default settings
$export_variables = 'call_center_queue_uuid,sip_h_Alert-Info';
if (!empty($_SESSION['call_center']['export_vars'])) {
foreach ($_SESSION['call_center']['export_vars'] as $export_variable) {
if (!empty($settings->get('call_center','export_vars', []))) {
foreach ($settings->get('call_center','export_vars', []) as $export_variable) {
$export_variables .= ','.$export_variable;
}
}
@ -413,7 +414,7 @@
if (!empty($queue_cc_exit_keys)) {
$dialplan_xml .= " <action application=\"set\" data=\"cc_exit_keys=".xml::sanitize($queue_cc_exit_keys)."\"/>\n";
}
$dialplan_xml .= " <action application=\"callcenter\" data=\"".xml::sanitize($queue_extension)."@".$_SESSION["domain_name"]."\"/>\n";
$dialplan_xml .= " <action application=\"callcenter\" data=\"".xml::sanitize($queue_extension)."@".$domain_name."\"/>\n";
if ($destination->valid($queue_timeout_app.':'.$queue_timeout_data)) {
$dialplan_xml .= " <action application=\"".xml::sanitize($queue_timeout_app)."\" data=\"".xml::sanitize($queue_timeout_data)."\"/>\n";
}
@ -434,12 +435,11 @@
$array['dialplans'][0]["app_uuid"] = "95788e50-9500-079e-2807-fd530b0ea370";
//add the dialplan permission
$p = new permissions;
$p = permissions::new();
$p->add("dialplan_add", "temp");
$p->add("dialplan_edit", "temp");
//save to the data
$database = new database;
$database->app_name = 'call_centers';
$database->app_uuid = '95788e50-9500-079e-2807-fd530b0ea370';
$database->save($array);
@ -457,7 +457,7 @@
//clear the cache
$cache = new cache;
$cache->delete("dialplan:".$_SESSION["domain_name"]);
$cache->delete("dialplan:".$domain_name);
//clear the destinations session array
if (isset($_SESSION['destinations']['array'])) {
@ -496,19 +496,19 @@
*/
//add the agent
if (is_numeric($queue_extension) && is_uuid($call_center_agent_uuid) && is_numeric($tier_level) && is_numeric($tier_position)) {
$cmd = "callcenter_config tier add ".$queue_extension."@".$_SESSION["domain_name"]." ".$call_center_agent_uuid." ".$tier_level." ".$tier_position;
$cmd = "callcenter_config tier add ".$queue_extension."@".$domain_name." ".$call_center_agent_uuid." ".$tier_level." ".$tier_position;
$response = event_socket::api($cmd);
}
usleep(200);
//agent set level
if (is_numeric($queue_extension) && is_numeric($tier_level)) {
$cmd = "callcenter_config tier set level ".$queue_extension."@".$_SESSION["domain_name"]." ".$call_center_agent_uuid." ".$tier_level;
$cmd = "callcenter_config tier set level ".$queue_extension."@".$domain_name." ".$call_center_agent_uuid." ".$tier_level;
$response = event_socket::api($cmd);
}
usleep(200);
//agent set position
if (is_numeric($queue_extension) && is_numeric($tier_position)) {
$cmd = "callcenter_config tier set position ".$queue_extension."@".$_SESSION["domain_name"]." ".$tier_position;
$cmd = "callcenter_config tier set position ".$queue_extension."@".$domain_name." ".$tier_position;
$response = event_socket::api($cmd);
}
usleep(200);
@ -538,7 +538,6 @@
$sql .= "and call_center_queue_uuid = :call_center_queue_uuid ";
$parameters['domain_uuid'] = $domain_uuid;
$parameters['call_center_queue_uuid'] = $call_center_queue_uuid;
$database = new database;
$call_center_queues = $database->select($sql, $parameters, 'all');
unset($sql, $parameters);
@ -587,17 +586,16 @@
$sql .= "order by tier_level asc, tier_position asc, a.agent_name asc";
$parameters['domain_uuid'] = $domain_uuid;
$parameters['call_center_queue_uuid'] = $call_center_queue_uuid ?? null;
$database = new database;
$tiers = $database->select($sql, $parameters, 'all');
unset($sql, $parameters);
//add an empty row to the tiers array
if (count($tiers) == 0) {
$rows = $_SESSION['call_center']['agent_add_rows']['numeric'] ?? null;
$rows = $settings->get('call_center','agent_add_rows', null);
$id = 0;
}
if (count($tiers) > 0) {
$rows = $_SESSION['call_center']['agent_edit_rows']['numeric'];
$rows = $settings->get('call_center','agent_edit_rows', null);
$id = count($tiers)+1;
}
for ($x = 0; $x < $rows; $x++) {
@ -615,7 +613,6 @@
$sql .= "where domain_uuid = :domain_uuid ";
$sql .= "order by agent_name asc";
$parameters['domain_uuid'] = $domain_uuid;
$database = new database;
$agents = $database->select($sql, $parameters, 'all');
unset($sql, $parameters);
@ -624,6 +621,7 @@
$audio_files[0] = $sounds->get();
unset($sounds);
//get the list of sounds
if (permission_exists('call_center_announce_sound')) {
$sounds = new sounds;
$sounds->sound_types = ['recordings'];
@ -646,7 +644,7 @@
if (empty($queue_tier_rule_no_agent_no_wait)) { $queue_tier_rule_no_agent_no_wait = "true"; }
if (empty($queue_discard_abandoned_after)) { $queue_discard_abandoned_after = "900"; }
if (empty($queue_abandoned_resume_allowed)) { $queue_abandoned_resume_allowed = "false"; }
if (empty($queue_context)) { $queue_context = $_SESSION['domain_name']; }
if (empty($queue_context)) { $queue_context = $domain_name; }
//create token
$object = new token;
@ -667,12 +665,8 @@
}
//set the record_template
if (empty($_SESSION['call_center']['record_name']['text'])) {
$record_template = $_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name']."/archive/\${strftime(%Y)}/\${strftime(%b)}/\${strftime(%d)}/\${uuid}.\${record_ext}";
}
else {
$record_template = $_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name']."/archive/".$_SESSION['call_center']['record_name']['text'];
}
$record_template = $settings->get('switch','recordings', '')."/".$domain_name."/archive/";
$record_template .= $settings->get('call_center','record_name', "\${strftime(%Y)}/\${strftime(%b)}/\${strftime(%d)}/\${uuid}.\${record_ext}");
//show the content
if (permission_exists('recording_play') || permission_exists('recording_download')) {
@ -757,7 +751,7 @@
}
echo "</div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','style'=>'margin-right: 15px;','link'=>'call_center_queues.php']);
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$settings->get('theme','button_icon_back', ''),'id'=>'btn_back','style'=>'margin-right: 15px;','link'=>'call_center_queues.php']);
if ($action == "update") {
if (permission_exists('call_center_wallboard')) {
@ -765,10 +759,10 @@
}
//echo button::create(['type'=>'button','label'=>$text['button-stop'],'icon'=>$_SESSION['theme']['button_icon_stop'],'link'=>'cmd.php?cmd=unload&id='.urlencode($call_center_queue_uuid)]);
//echo button::create(['type'=>'button','label'=>$text['button-start'],'icon'=>$_SESSION['theme']['button_icon_start'],'link'=>'cmd.php?cmd=load&id='.urlencode($call_center_queue_uuid)]);
echo button::create(['type'=>'button','label'=>$text['button-reload'],'icon'=>$_SESSION['theme']['button_icon_reload'],'link'=>'cmd.php?cmd=reload&id='.urlencode($call_center_queue_uuid)]);
echo button::create(['type'=>'button','label'=>$text['button-view'],'icon'=>$_SESSION['theme']['button_icon_view'],'style'=>'margin-right: 15px;','link'=>PROJECT_PATH.'/app/call_center_active/call_center_active.php?queue_name='.urlencode($call_center_queue_uuid)]);
echo button::create(['type'=>'button','label'=>$text['button-reload'],'icon'=>$settings->get('theme','button_icon_reload', ''),'link'=>'cmd.php?cmd=reload&id='.urlencode($call_center_queue_uuid)]);
echo button::create(['type'=>'button','label'=>$text['button-view'],'icon'=>$settings->get('theme','button_icon_view', ''),'style'=>'margin-right: 15px;','link'=>PROJECT_PATH.'/app/call_center_active/call_center_active.php?queue_name='.urlencode($call_center_queue_uuid)]);
}
echo button::create(['type'=>'submit','label'=>$text['button-save'],'icon'=>$_SESSION['theme']['button_icon_save'],'id'=>'btn_save']);
echo button::create(['type'=>'submit','label'=>$text['button-save'],'icon'=>$settings->get('theme','button_icon_save', ''),'id'=>'btn_save']);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
@ -791,7 +785,7 @@
echo " ".$text['label-extension']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input class='formfld' type='number' name='queue_extension' maxlength='255' min='0' step='1' value=\"".escape($queue_extension)."\" required='required' placeholder=\"".($_SESSION['call_center']['extension_range']['text'] ?? '')."\">\n";
echo " <input class='formfld' type='number' name='queue_extension' maxlength='255' min='0' step='1' value=\"".escape($queue_extension)."\" required='required' placeholder=\"".$settings->get('call_center','extension_range', '')."\">\n";
echo "<br />\n";
echo $text['description-extension']."\n";
echo "</td>\n";
@ -818,8 +812,8 @@
if ($key == 'recordings') {
if (
!empty($instance_value) &&
($instance_value == $row["value"] || $instance_value == $_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'].'/'.$row["value"]) &&
file_exists($_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'].'/'.pathinfo($row["value"], PATHINFO_BASENAME))
($instance_value == $row["value"] || $instance_value == $settings->get('switch','recordings', '')."/".$domain_name.'/'.$row["value"]) &&
file_exists($settings->get('switch','recordings', '')."/".$domain_name.'/'.pathinfo($row["value"], PATHINFO_BASENAME))
) {
$selected = "selected='selected'";
$playable = '../recordings/recordings.php?action=download&type=rec&filename='.pathinfo($row["value"], PATHINFO_BASENAME);
@ -862,7 +856,7 @@
case 'ogg' : $mime_type = 'audio/ogg'; break;
}
echo "<audio id='recording_audio_".$instance_id."' style='display: none;' preload='none' ontimeupdate=\"update_progress('".$instance_id."')\" onended=\"recording_reset('".$instance_id."');\" src='".($playable ?? '')."' type='".($mime_type ?? '')."'></audio>";
echo button::create(['type'=>'button','title'=>$text['label-play'].' / '.$text['label-pause'],'icon'=>$_SESSION['theme']['button_icon_play'],'id'=>'recording_button_'.$instance_id,'style'=>'display: '.(!empty($mime_type) ? 'inline' : 'none'),'onclick'=>"recording_play('".$instance_id."', document.getElementById('".$instance_id."').value, document.getElementById('".$instance_id."').options[document.getElementById('".$instance_id."').selectedIndex].parentNode.getAttribute('data-type'))"]);
echo button::create(['type'=>'button','title'=>$text['label-play'].' / '.$text['label-pause'],'icon'=>$settings->get('theme','button_icon_play', ''),'id'=>'recording_button_'.$instance_id,'style'=>'display: '.(!empty($mime_type) ? 'inline' : 'none'),'onclick'=>"recording_play('".$instance_id."', document.getElementById('".$instance_id."').value, document.getElementById('".$instance_id."').options[document.getElementById('".$instance_id."').selectedIndex].parentNode.getAttribute('data-type'))"]);
unset($playable, $mime_type);
}
echo "<br />\n";
@ -1318,8 +1312,8 @@
if ($key == 'recordings') {
if (
!empty($instance_value) &&
($instance_value == $row["value"] || $instance_value == $_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'].'/'.$row["value"]) &&
file_exists($_SESSION['switch']['recordings']['dir']."/".$_SESSION['domain_name'].'/'.pathinfo($row["value"], PATHINFO_BASENAME))
($instance_value == $row["value"] || $instance_value == $settings->get('switch','recordings', '')."/".$domain_name.'/'.$row["value"]) &&
file_exists($settings->get('switch','recordings', '')."/".$domain_name.'/'.pathinfo($row["value"], PATHINFO_BASENAME))
) {
$selected = "selected='selected'";
$playable = '../recordings/recordings.php?action=download&type=rec&filename='.pathinfo($row["value"], PATHINFO_BASENAME);
@ -1362,7 +1356,7 @@
case 'ogg' : $mime_type = 'audio/ogg'; break;
}
echo "<audio id='recording_audio_".$instance_id."' style='display: none;' preload='none' ontimeupdate=\"update_progress('".$instance_id."')\" onended=\"recording_reset('".$instance_id."');\" src='".($playable ?? '')."' type='".($mime_type ?? '')."'></audio>";
echo button::create(['type'=>'button','title'=>$text['label-play'].' / '.$text['label-pause'],'icon'=>$_SESSION['theme']['button_icon_play'],'id'=>'recording_button_'.$instance_id,'style'=>'display: '.(!empty($mime_type) ? 'inline' : 'none'),'onclick'=>"recording_play('".$instance_id."', document.getElementById('".$instance_id."').value, document.getElementById('".$instance_id."').options[document.getElementById('".$instance_id."').selectedIndex].parentNode.getAttribute('data-type'))"]);
echo button::create(['type'=>'button','title'=>$text['label-play'].' / '.$text['label-pause'],'icon'=>$settings->get('theme','button_icon_play', ''),'id'=>'recording_button_'.$instance_id,'style'=>'display: '.(!empty($mime_type) ? 'inline' : 'none'),'onclick'=>"recording_play('".$instance_id."', document.getElementById('".$instance_id."').value, document.getElementById('".$instance_id."').options[document.getElementById('".$instance_id."').selectedIndex].parentNode.getAttribute('data-type'))"]);
unset($playable, $mime_type);
}
echo "<br />\n";

View File

@ -46,7 +46,7 @@
$show = $_GET["show"] ?? '';
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get posted data
if (!empty($_POST['call_center_queues']) && is_array($_POST['call_center_queues'])) {
@ -219,7 +219,7 @@
//echo th_order_by('queue_abandoned_resume_allowed', $text['label-abandoned_resume_allowed'], $order_by, $order);
//echo th_order_by('queue_tier_rule_wait_multiply_level', $text['label-tier_rule_wait_multiply_level'], $order_by, $order);
echo th_order_by('queue_description', $text['label-description'], $order_by, $order, null, "class='hide-sm-dn'");
if (permission_exists('call_center_queue_edit') && $list_row_edit_button == 'true') {
if (permission_exists('call_center_queue_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -227,8 +227,12 @@
if (!empty($result)) {
$x = 0;
foreach($result as $row) {
$list_row_url = '';
if (permission_exists('call_center_queue_edit')) {
$list_row_url = "call_center_queue_edit.php?id=".urlencode($row['call_center_queue_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('call_center_queue_add') || permission_exists('call_center_queue_delete')) {
@ -269,7 +273,7 @@
//echo " <td>".escape($row[queue_abandoned_resume_allowed])."&nbsp;</td>\n";
//echo " <td>".escape($row[queue_tier_rule_wait_multiply_level])."&nbsp;</td>\n";
echo " <td class='description overflow hide-sm-dn'>".escape($row['queue_description'])."</td>\n";
if (permission_exists('call_center_queue_edit') && $list_row_edit_button == 'true') {
if (permission_exists('call_center_queue_edit') && $list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -293,3 +297,4 @@
require_once "resources/footer.php";
?>

View File

@ -26,11 +26,8 @@
/**
* cache class provides an abstracted cache
*
* @method string dialplan - builds the dialplan for call center
*/
//define the call center class
if (!class_exists('call_center')) {
class call_center {
/**
* define the variables
@ -78,7 +75,7 @@
$array['dialplan_details'][0]['domain_uuid'] = $this->domain_uuid;
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_delete', 'temp');
$p->add('dialplan_detail_delete', 'temp');
@ -216,7 +213,7 @@
$array["dialplans"][0] = $dialplan;
//add temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add("dialplan_add", 'temp');
$p->add("dialplan_detail_add", 'temp');
$p->add("dialplan_edit", 'temp');
@ -242,7 +239,7 @@
$array['call_center_queues'][0]['dialplan_uuid'] = $this->dialplan_uuid;
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('call_center_queue_edit', 'temp');
//execute update
@ -349,7 +346,7 @@
}
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('call_center_tier_delete', 'temp');
$p->add('dialplan_delete', 'temp');
$p->add('dialplan_detail_delete', 'temp');
@ -446,7 +443,7 @@
}
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('call_center_tier_delete', 'temp');
//execute delete
@ -578,7 +575,7 @@
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('call_center_tier_add', 'temp');
$p->add('dialplan_add', 'temp');
@ -611,7 +608,6 @@
} //method
} //class
}
/*
$o = new call_center;
@ -625,5 +621,3 @@ $c->destination_number = "";
$c->queue_cc_exit_keys = "";
$c->dialplan();
*/
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2017-2023
Portions created by the Initial Developer are Copyright (C) 2017-2025
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -258,21 +258,24 @@
echo "</script>\n";
//show the content
echo "<div class='action_bar sub'>\n";
echo " <div class='heading'><b>".$text['header-call_center_queues'].(!empty($agent['agent_name']) ? "&nbsp;&nbsp;&nbsp;</b> Agent: <strong>".$agent['agent_name']."</strong>" : "</b>")."</div>\n";
echo " <div class='actions'>\n";
echo "<div class='hud_box'>";
echo "<div class='hud_content' style='display: block;'>\n";
echo " <div class='action_bar sub'>\n";
echo " <div class='heading' style='padding-left: 5px;'><b>".$text['header-call_center_queues'].(!empty($agent['agent_name']) ? "&nbsp;&nbsp;&nbsp;</b> Agent: <strong>".$agent['agent_name']."</strong>" : "</b>")."</div>\n";
echo " <div class='actions' style='padding-top: 2px;'>\n";
echo button::create(['type'=>'button','label'=>$text['button-save'],'icon'=>$_SESSION['theme']['button_icon_save'],'collapse'=>false,'onclick'=>"document.getElementById('form_list_call_center_agent_dashboard').submit();"]);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
echo "<form id='form_list_call_center_agent_dashboard' method='post'>\n";
echo " <form id='form_list_call_center_agent_dashboard' method='post'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
echo " <th>".$text['label-queue_name']."</th>\n";
echo " <th class='shrink'>".$text['label-status']."</th>\n";
echo "</tr>\n";
echo " <table class='list' style='padding: 0 5px;'>\n";
echo " <tr class='list-header'>\n";
echo " <th>".$text['label-queue_name']."</th>\n";
echo " <th class='shrink'>".$text['label-status']."</th>\n";
echo " </tr>\n";
if (!empty($call_center_queues) && is_array($call_center_queues) && @sizeof($call_center_queues) != 0) {
$x = 0;
@ -295,9 +298,12 @@
unset($call_center_queues);
}
echo "</table>\n";
echo "<br />\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>\n";
echo " </table>\n";
echo " <br />\n";
echo " <input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo " </form>\n";
echo "</div>\n";
echo "</div>\n";
?>

View File

@ -3,6 +3,29 @@
$array['dashboard'][$x]['dashboard_uuid'] = '9083305a-ebb4-4b67-bb9b-8c09cf030261';
$array['dashboard'][$x]['dashboard_name'] = 'Call Center Agents';
$array['dashboard'][$x]['dashboard_path'] = 'call_centers/call_center_agents';
$array['dashboard'][$x]['dashboard_icon'] = '';
$array['dashboard'][$x]['dashboard_url'] = '';
$array['dashboard'][$x]['dashboard_target'] = '';
$array['dashboard'][$x]['dashboard_width'] = '';
$array['dashboard'][$x]['dashboard_height'] = '';
$array['dashboard'][$x]['dashboard_content'] = '';
$array['dashboard'][$x]['dashboard_content_text_align'] = '';
$array['dashboard'][$x]['dashboard_content_details'] = '';
$array['dashboard'][$x]['dashboard_chart_type'] = '';
$array['dashboard'][$x]['dashboard_label_enabled'] = 'true';
$array['dashboard'][$x]['dashboard_label_text_color'] = '#3164AD';
$array['dashboard'][$x]['dashboard_label_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_label_background_color'] = '';
$array['dashboard'][$x]['dashboard_label_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_background_color'] = '#ffffff';
$array['dashboard'][$x]['dashboard_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_detail_background_color'] = '';
$array['dashboard'][$x]['dashboard_column_span'] = '1';
$array['dashboard'][$x]['dashboard_row_span'] = '2';
$array['dashboard'][$x]['dashboard_details_state'] = 'none';
$array['dashboard'][$x]['dashboard_order'] = '180';
$array['dashboard'][$x]['dashboard_enabled'] = 'false';
$array['dashboard'][$x]['dashboard_description'] = 'Status for agent in a call center.';

View File

@ -27,7 +27,6 @@
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/classes/waveform.php";
use maximal\audio\Waveform;
@ -96,8 +95,8 @@
Waveform::$colorB = !empty($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) : [0,125,232,0.6]; // array rgba, right (b-leg) wave color
Waveform::$backgroundColor = !empty($_SESSION['theme']['audio_player_waveform_color_background']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_background']['text']) : [0,0,0,0]; // array rgba, default: transparent
Waveform::$axisColor = !empty($_SESSION['theme']['audio_player_waveform_color_axis']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_axis']['text']) : [0,0,0,0.3]; // array rgba
Waveform::$singlePhase = empty($_SESSION['theme']['audio_player_waveform_single_phase']['boolean']) || $_SESSION['theme']['audio_player_waveform_single_phase']['boolean'] !== 'true' ? false : true; // positive phase only - left (a-leg) top, right (b-leg) bottom
Waveform::$singleAxis = empty($_SESSION['theme']['audio_player_waveform_single_axis']['boolean']) || $_SESSION['theme']['audio_player_waveform_single_axis']['boolean'] !== 'false' ? true : false; // combine channels into single axis
Waveform::$singlePhase = filter_var($_SESSION['theme']['audio_player_waveform_single_phase']['boolean'] ?? false, FILTER_VALIDATE_BOOL) ? 'true': 'false'; // positive phase only - left (a-leg) top, right (b-leg) bottom
Waveform::$singleAxis = filter_var($_SESSION['theme']['audio_player_waveform_single_axis']['boolean'] ?? true, FILTER_VALIDATE_BOOL) ? 'true': 'false'; // combine channels into single axis
$height = !empty($_SESSION['theme']['audio_player_waveform_height']['text']) && is_numeric(str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text'])) ? 2.2 * (int) str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text']) : null;
$wf = $waveform->getWaveform($temp_filename, 1600, $height ?? 180); // input: png filename returns boolean true/false, or 'base64' returns base64 string
}

View File

@ -237,7 +237,7 @@
$array["call_flows"][$i]["call_flow_description"] = $call_flow_description;
//add the dialplan permission
$p = new permissions;
$p = permissions::new();
$p->add("dialplan_add", "temp");
$p->add("dialplan_edit", "temp");

View File

@ -46,7 +46,7 @@
$show = $_GET["show"] ?? '';
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get search
$search = $_REQUEST['search'] ?? null;
@ -235,7 +235,7 @@
}
echo th_order_by('call_flow_enabled', $text['label-enabled'], $order_by, $order, null, "class='center'");
echo th_order_by('call_flow_description', $text['label-call_flow_description'], $order_by, $order, null, "class='hide-sm-dn'");
if (permission_exists('call_flow_edit') && $list_row_edit_button == 'true') {
if (permission_exists('call_flow_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -243,8 +243,12 @@
if (!empty($call_flows)) {
$x = 0;
foreach ($call_flows as $row) {
$list_row_url = '';
if (permission_exists('call_flow_edit')) {
$list_row_url = "call_flow_edit.php?id=".urlencode($row['call_flow_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('call_flow_add') || permission_exists('call_flow_edit') || permission_exists('call_flow_delete')) {
@ -287,7 +291,7 @@
echo escape($row['call_flow_enabled']);
}
echo " <td class='description overflow hide-sm-dn'>".escape($row['call_flow_description'])."&nbsp;</td>\n";
if (permission_exists('call_flow_edit') && $list_row_edit_button == 'true') {
if (permission_exists('call_flow_edit') && $list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -311,3 +315,4 @@
require_once "resources/footer.php";
?>

View File

@ -25,7 +25,6 @@
*/
//define the call_flows class
if (!class_exists('call_flows')) {
class call_flows {
/**
@ -121,7 +120,7 @@ if (!class_exists('call_flows')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_delete', 'temp');
$p->add('dialplan_detail_delete', 'temp');
@ -223,7 +222,7 @@ if (!class_exists('call_flows')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_edit', 'temp');
//save the array
@ -374,7 +373,7 @@ if (!class_exists('call_flows')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_add', 'temp');
//save the array
@ -410,6 +409,3 @@ if (!class_exists('call_flows')) {
} //method
} //class
}
?>

View File

@ -27,7 +27,6 @@
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/classes/waveform.php";
use maximal\audio\Waveform;
@ -96,8 +95,8 @@
Waveform::$colorB = !empty($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) : [0,125,232,0.6]; // array rgba, right (b-leg) wave color
Waveform::$backgroundColor = !empty($_SESSION['theme']['audio_player_waveform_color_background']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_background']['text']) : [0,0,0,0]; // array rgba, default: transparent
Waveform::$axisColor = !empty($_SESSION['theme']['audio_player_waveform_color_axis']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_axis']['text']) : [0,0,0,0.3]; // array rgba
Waveform::$singlePhase = empty($_SESSION['theme']['audio_player_waveform_single_phase']['boolean']) || $_SESSION['theme']['audio_player_waveform_single_phase']['boolean'] !== 'true' ? false : true; // positive phase only - left (a-leg) top, right (b-leg) bottom
Waveform::$singleAxis = empty($_SESSION['theme']['audio_player_waveform_single_axis']['boolean']) || $_SESSION['theme']['audio_player_waveform_single_axis']['boolean'] !== 'false' ? true : false; // combine channels into single axis
Waveform::$singlePhase = filter_var($_SESSION['theme']['audio_player_waveform_single_phase']['boolean'] ?? false, FILTER_VALIDATE_BOOL) ? 'true': 'false'; // positive phase only - left (a-leg) top, right (b-leg) bottom
Waveform::$singleAxis = filter_var($_SESSION['theme']['audio_player_waveform_single_axis']['boolean'] ?? true, FILTER_VALIDATE_BOOL) ? 'true': 'false'; // combine channels into single axis
$height = !empty($_SESSION['theme']['audio_player_waveform_height']['text']) && is_numeric(str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text'])) ? 2.2 * (int) str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text']) : null;
$wf = $waveform->getWaveform($temp_filename, 1600, $height ?? 180); // input: png filename returns boolean true/false, or 'base64' returns base64 string
}

View File

@ -209,6 +209,9 @@
}
require_once "resources/header.php";
//set the back button
$_SESSION['call_forward_back'] = $_SERVER['PHP_SELF'];
//show the content
if ($is_included) {
echo "<div class='action_bar sub'>\n";
@ -238,7 +241,7 @@
}
}
if ($show !== 'all' && permission_exists('call_forward_all')) {
echo button::create(['type' => 'button', 'label' => $text['button-show_all'], 'icon' => $_SESSION['theme']['button_icon_all'], 'link' => '?show=all' . $param]);
echo button::create(['type' => 'button', 'label' => $text['button-show_all'], 'icon' => $_SESSION['theme']['button_icon_all'], 'link' => '?show=all' . (!empty($params) ? '&'.implode('&', $params) : null)]);
}
echo "<form id='form_search' class='inline' method='get'>\n";
if ($show == 'all' && permission_exists('call_forward_all')) {
@ -293,8 +296,8 @@
echo " <th>" . $text['label-dnd'] . "</th>\n";
}
echo " <th class='" . ($is_included ? 'hide-md-dn' : 'hide-sm-dn') . "'>" . $text['label-description'] . "</th>\n";
$list_row_edit_button = $_SESSION['theme']['list_row_edit_button']['boolean'] ?? 'false';
if ( $list_row_edit_button === 'true') {
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
if ($list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -303,6 +306,9 @@
$x = 0;
foreach ($extensions as $row) {
$list_row_url = PROJECT_PATH . "/app/call_forward/call_forward_edit.php?id=" . $row['extension_uuid'] . "&return_url=" . urlencode($_SERVER['REQUEST_URI']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
echo "<tr class='list-row' href='" . $list_row_url . "'>\n";
if (!$is_included && $extensions) {
echo " <td class='checkbox'>\n";
@ -396,7 +402,7 @@
echo " </td>\n";
}
echo " <td class='description overflow " . ($is_included ? 'hide-md-dn' : 'hide-sm-dn') . "'>" . escape($row['description']) . "&nbsp;</td>\n";
if ($list_row_edit_button === 'true') {
if ($list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type' => 'button', 'title' => $text['button-edit'], 'icon' => $_SESSION['theme']['button_icon_edit'], 'link' => $list_row_url]);
echo " </td>\n";

View File

@ -248,7 +248,7 @@
}
//add the dialplan permission
$p = new permissions;
$p = permissions::new();
$p->add("extension_edit", "temp");
//save the data
@ -341,7 +341,7 @@
*/
//send feature event notify to the phone
if (!empty($_SESSION['device']['feature_sync']['boolean']) && $_SESSION['device']['feature_sync']['boolean'] == "true") {
if (filter_var($_SESSION['device']['feature_sync']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
$ring_count = ceil($call_timeout / 6);
$feature_event_notify = new feature_event_notify;
$feature_event_notify->domain_name = $_SESSION['domain_name'];
@ -421,7 +421,6 @@
//synchronize configuration
if (!empty($_SESSION['switch']['extensions']['dir']) && is_readable($_SESSION['switch']['extensions']['dir'])) {
require_once "app/extensions/resources/classes/extension.php";
$ext = new extension;
$ext->xml();
unset($ext);
@ -504,7 +503,7 @@
}
//prepare the autocomplete
if(!empty($_SESSION['follow_me']['follow_me_autocomplete']['boolean']) && $_SESSION['follow_me']['follow_me_autocomplete']['boolean'] == 'true') {
if(filter_var($_SESSION['follow_me']['follow_me_autocomplete']['boolean'] ?? false, FILTER_VALIDATE_BOOLEAN)) {
echo "<link rel=\"stylesheet\" href=\"".PROJECT_PATH."/resources/jquery/jquery-ui.min.css\" />\n";
echo "<script src=\"".PROJECT_PATH."/resources/jquery/jquery-ui.min.js\"></script>\n";
echo "<script type=\"text/javascript\">\n";
@ -533,13 +532,16 @@
$object = new token;
$token = $object->create($_SERVER['PHP_SELF']);
//save the back button location using referer
$back_destination = "window.location.href='" . ($_SESSION['call_forward_back'] ?? "/app/call_forward/call_forward.php") . "'";
//show the content
echo "<form method='post' name='frm' id='frm'>\n";
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['title-call_forward']."</b></div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','onclick'=>'history.back();']);
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','onclick'=>$back_destination]);
echo button::create(['type'=>'submit','label'=>$text['button-save'],'icon'=>$_SESSION['theme']['button_icon_save'],'id'=>'btn_save','style'=>'margin-left: 15px;']);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";

View File

@ -89,7 +89,7 @@
}
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('extension_add', 'temp');
//execute update
@ -214,7 +214,7 @@
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('extension_edit', 'temp');
//save the array
@ -227,7 +227,7 @@
$p->delete('extension_edit', 'temp');
//send feature event notify to the phone
if (!empty($_SESSION['device']['feature_sync']['boolean']) && $_SESSION['device']['feature_sync']['boolean'] == "true") {
if (filter_var($_SESSION['device']['feature_sync']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
foreach ($extensions as $uuid => $extension) {
$feature_event_notify = new feature_event_notify;
$feature_event_notify->domain_name = $_SESSION['domain_name'];
@ -248,7 +248,6 @@
//synchronize configuration
if (!empty($_SESSION['switch']['extensions']['dir']) && is_readable($_SESSION['switch']['extensions']['dir'])) {
require_once "app/extensions/resources/classes/extension.php";
$ext = new extension;
$ext->xml();
unset($ext);

View File

@ -95,7 +95,7 @@
$array['extensions'][0]['do_not_disturb'] = $this->enabled;
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('extension_edit', 'temp');
//execute update
@ -226,7 +226,7 @@
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('extension_edit', 'temp');
//save the array
@ -240,7 +240,7 @@
$p->delete('extension_edit', 'temp');
//send feature event notify to the phone
if (!empty($_SESSION['device']['feature_sync']['boolean']) && $_SESSION['device']['feature_sync']['boolean'] == "true") {
if (filter_var($_SESSION['device']['feature_sync']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
foreach ($extensions as $uuid => $extension) {
$feature_event_notify = new feature_event_notify;
$feature_event_notify->domain_name = $_SESSION['domain_name'];
@ -261,7 +261,6 @@
//synchronize configuration
if (!empty($_SESSION['switch']['extensions']['dir']) && is_readable($_SESSION['switch']['extensions']['dir'])) {
require_once "app/extensions/resources/classes/extension.php";
$ext = new extension;
$ext->xml();
unset($ext);

View File

@ -91,7 +91,7 @@
$array['follow_me'][0]['follow_me_enabled'] = $this->follow_me_enabled;
$array['follow_me'][0]['follow_me_ignore_busy'] = $this->follow_me_ignore_busy;
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('follow_me_add', 'temp');
//execute insert
$database = new database;
@ -115,7 +115,7 @@
$array['follow_me'][0]['follow_me_enabled'] = $this->follow_me_enabled;
$array['follow_me'][0]['follow_me_ignore_busy'] = $this->follow_me_ignore_busy;
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('follow_me_add', 'temp');
//execute update
$database = new database;
@ -135,7 +135,7 @@
//delete related follow me destinations
$array['follow_me_destinations'][0]['follow_me_uuid'] = $this->follow_me_uuid;
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('follow_me_destination_delete', 'temp');
//execute delete
$database = new database;
@ -210,7 +210,7 @@
}
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('follow_me_destination_add', 'temp');
//execute insert
$database = new database;
@ -234,7 +234,7 @@
$extension_uuid = $result[0]['extension_uuid'];
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add("follow_me_edit", 'temp');
$p->add("extension_edit", 'temp');
@ -389,7 +389,7 @@
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('extension_edit', 'temp');
$p->add('follow_me_edit', 'temp');
@ -405,7 +405,7 @@
$p->delete('follow_me_edit', 'temp');
//send feature event notify to the phone
if (!empty($_SESSION['device']['feature_sync']['boolean']) && $_SESSION['device']['feature_sync']['boolean'] == "true") {
if (filter_var($_SESSION['device']['feature_sync']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
foreach ($extensions as $uuid => $extension) {
$feature_event_notify = new feature_event_notify;
$feature_event_notify->domain_name = $_SESSION['domain_name'];
@ -426,7 +426,6 @@
//synchronize configuration
if (!empty($_SESSION['switch']['extensions']['dir']) && is_readable($_SESSION['switch']['extensions']['dir'])) {
require_once "app/extensions/resources/classes/extension.php";
$ext = new extension;
$ext->xml();
unset($ext);

View File

@ -5,6 +5,7 @@ $array['dashboard'][$x]['dashboard_uuid'] = 'ba60799a-1c40-44a8-80ef-c2be4f4692f
$array['dashboard'][$x]['dashboard_name'] = 'Call Forward';
$array['dashboard'][$x]['dashboard_path'] = 'call_forward/call_forward';
$array['dashboard'][$x]['dashboard_icon'] = 'fa-forward';
$array['dashboard'][$x]['dashboard_icon_color'] = '';
$array['dashboard'][$x]['dashboard_url'] = '/app/call_forward/call_forward.php';
$array['dashboard'][$x]['dashboard_target'] = 'self';
$array['dashboard'][$x]['dashboard_width'] = '';
@ -18,9 +19,9 @@ $array['dashboard'][$x]['dashboard_label_text_color'] = '';
$array['dashboard'][$x]['dashboard_label_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_label_background_color'] = '';
$array['dashboard'][$x]['dashboard_label_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_background_color'] ='';
$array['dashboard'][$x]['dashboard_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_detail_background_color'] = '';

View File

@ -34,6 +34,9 @@
$y++;
$apps[$x]['permissions'][$y]['name'] = 'call_recording_download';
$apps[$x]['permissions'][$y]['groups'][] = 'superadmin';
$y++;
$apps[$x]['permissions'][$y]['name'] = 'call_recording_transcribe';
$apps[$x]['permissions'][$y]['groups'][] = 'superadmin';
$y = 0;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "95cb740e-e377-4852-8894-06441c61e78b";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "call_recordings";
@ -42,4 +45,13 @@
$apps[$x]['default_settings'][$y]['default_setting_value'] = "90";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Number of days to retain the maintenance logs in the database.";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "e329db05-2967-422a-a71f-d0175b083828";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "call_recordings";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "record_extension";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "text";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "mp3";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Call recording file format options: wav, mp3";
?>

View File

@ -38,13 +38,16 @@
exit;
}
//create the database connection
$database = new database;
//add multi-lingual support
$language = new text;
$text = $language->get();
//add the settings object
$settings = new settings(["domain_uuid" => $_SESSION['domain_uuid'], "user_uuid" => $_SESSION['user_uuid']]);
$transcribe_enabled = $settings->get('transcribe', 'enabled', 'false');
$transcribe_enabled = $settings->get('transcribe', 'enabled', false);
$transcribe_engine = $settings->get('transcribe', 'engine', '');
//set additional variables
@ -68,7 +71,7 @@
}
break;
case 'transcribe':
if (permission_exists('call_recording_download')) {
if (permission_exists('call_recording_transcribe')) {
$obj = new call_recordings;
$obj->transcribe($call_recordings);
}
@ -104,24 +107,6 @@
}
$parameters['time_zone'] = $time_zone;
//get the count
//$sql = "select count(*) ";
//$sql .= "from view_call_recordings ";
//$sql .= "where true ";
//if ($_GET['show'] != "all" || !permission_exists('call_recording_all')) {
// $sql .= "and (domain_uuid = :domain_uuid or domain_uuid is null) ";
// $parameters['domain_uuid'] = $_SESSION['domain_uuid'];
//}
//if (isset($search)) {
// $sql .= "and (";
// $sql .= " lower(call_recording_name) like :search ";
// $sql .= " or lower(call_recording_path) like :search ";
// $sql .= ") ";
// $parameters['search'] = '%'.$search.'%';
//}
//$database = new database;
//$num_rows = $database->select($sql, $parameters, 'column');
//prepare some of the paging values
$rows_per_page = (!empty($_SESSION['domain']['paging']['numeric'])) ? $_SESSION['domain']['paging']['numeric'] : 50;
$page = $_GET['page'] ?? '';
@ -138,7 +123,7 @@
//$sql .= "from v_call_recordings as r, v_domains as d ";
$sql .= "where true ";
if ($show != "all" || !permission_exists('call_recording_all')) {
$sql .= "and (r.domain_uuid = :domain_uuid or r.domain_uuid is null) ";
$sql .= "and r.domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
}
$sql .= "and r.domain_uuid = d.domain_uuid ";
@ -156,21 +141,17 @@
}
$sql .= order_by($order_by, $order, 'r.call_recording_date', 'desc');
$sql .= limit_offset($rows_per_page, $offset);
$database = new database;
$call_recordings = $database->select($sql, $parameters ?? null, 'all');
unset($sql, $parameters);
//detect if any transcriptions available
if ($transcribe_enabled == 'true' && !empty($transcribe_engine) && !empty($call_recordings) && is_array($call_recordings)) {
if ($transcribe_enabled && !empty($transcribe_engine) && !empty($call_recordings) && is_array($call_recordings)) {
$transcriptions_exists = false;
foreach ($call_recordings as $row) {
if (!empty($row['call_recording_transcription'])) { $transcriptions_exists = true; }
}
}
//count the results
$result_count = is_array($call_recordings) ? sizeof($call_recordings) : 0;
//limit the number of results
if (!empty($_SESSION['cdr']['limit']['numeric']) && $_SESSION['cdr']['limit']['numeric'] > 0) {
$num_rows = $_SESSION['cdr']['limit']['numeric'];
@ -199,7 +180,7 @@
if (permission_exists('call_recording_download') && !empty($call_recordings)) {
echo button::create(['type'=>'button','label'=>$text['button-download'],'icon'=>$_SESSION['theme']['button_icon_download'],'id'=>'btn_download','name'=>'btn_download','style'=>'display: none;','collapse'=>'hide-xs','onclick'=>"list_action_set('download'); list_form_submit('form_list');"]);
}
if ($transcribe_enabled == 'true' && !empty($transcribe_engine) && !empty($call_recordings)) {
if (permission_exists('call_recording_transcribe') && $transcribe_enabled && !empty($transcribe_engine) && !empty($call_recordings)) {
echo button::create(['type'=>'button','label'=>$text['button-transcribe'],'icon'=>'quote-right','id'=>'btn_transcribe','name'=>'btn_transcribe','style'=>'display: none;','collapse'=>'hide-xs','onclick'=>"list_action_set('transcribe'); list_form_submit('form_list');"]);
}
if (permission_exists('call_recording_delete') && !empty($call_recordings)) {
@ -272,12 +253,9 @@
if (is_array($call_recordings) && @sizeof($call_recordings) != 0) {
$x = 0;
foreach ($call_recordings as $row) {
//add padding to the call recording length
$call_recording_length_padding = (!empty($row['call_recording_length'])) ? str_pad($row['call_recording_length'], 2, '0', STR_PAD_LEFT) : '';
//playback progress bar
if (permission_exists('call_recording_play')) {
echo "<tr class='list-row' id='recording_progress_bar_".escape($row['call_recording_uuid'])."' style='display: none;' onclick=\"recording_play('".escape($row['call_recording_uuid'])."')\"><td id='playback_progress_bar_background_".escape($row['call_recording_uuid'])."' class='playback_progress_bar_background' colspan='".$col_count."'><span class='playback_progress_bar' id='recording_progress_".escape($row['call_recording_uuid'])."'></span></td>".(permission_exists('xml_cdr_details') ? "<td class='action-button' style='border-bottom: none !important;'></td>" : null)."</tr>\n";
echo "<tr class='list-row' id='recording_progress_bar_".escape($row['call_recording_uuid'])."' style='display: none;' onclick=\"recording_seek(event,'".escape($row['call_recording_uuid'])."')\"><td id='playback_progress_bar_background_".escape($row['call_recording_uuid'])."' class='playback_progress_bar_background' colspan='".$col_count."'><span class='playback_progress_bar' id='recording_progress_".escape($row['call_recording_uuid'])."'></span></td>".(permission_exists('xml_cdr_details') ? "<td class='action-button' style='border-bottom: none !important;'></td>" : null)."</tr>\n";
echo "<tr class='list-row' style='display: none;'><td></td></tr>\n"; // dummy row to maintain alternating background color
}
if (permission_exists('call_recording_play')) {
@ -314,13 +292,13 @@
if (permission_exists('call_recording_download')) {
echo button::create(['type'=>'button','title'=>$text['label-download'],'icon'=>$_SESSION['theme']['button_icon_download'],'link'=>'download.php?id='.urlencode($row['call_recording_uuid']).'&binary']);
}
if ($transcribe_enabled == 'true' && !empty($transcribe_engine) && $transcriptions_exists === true) {
if (permission_exists('call_recording_transcribe') && $transcribe_enabled && !empty($transcribe_engine) && $transcriptions_exists === true) {
echo button::create(['type'=>'button','title'=>$text['label-transcription'],'icon'=>'quote-right','style'=>(empty($row['call_recording_transcription']) ? 'visibility:hidden;' : null),'onclick'=>"document.getElementById('transcription_".$row['call_recording_uuid']."').style.display = document.getElementById('transcription_".$row['call_recording_uuid']."').style.display == 'none' ? 'table-row' : 'none'; this.blur(); return false;"]);
}
}
echo " </td>\n";
}
echo " <td class='right overflow hide-sm-dn shrink'>".($row['call_recording_length'] <= 59 ? '0:' : null).escape($call_recording_length_padding)."</td>\n";
echo " <td class='right overflow hide-sm-dn shrink'>".escape(gmdate("G:i:s", $row['call_recording_length']))."</td>\n";
echo " <td class='overflow center no-wrap'>".escape($row['call_recording_date_formatted'])." <span class='hide-sm-dn'>".escape($row['call_recording_time_formatted'])."</span></td>\n";
echo " <td class='left hide-sm-dn shrink'>".($row['call_direction'] != '' ? escape($text['label-'.$row['call_direction']]) : null)."</td>\n";
if (permission_exists('xml_cdr_details')) {
@ -329,7 +307,7 @@
echo " </td>\n";
}
echo "</tr>\n";
if ($transcribe_enabled == 'true' && !empty($transcribe_engine) && !empty($row['call_recording_transcription'])) {
if (permission_exists('call_recording_transcribe') && $transcribe_enabled && !empty($transcribe_engine) && !empty($row['call_recording_transcription'])) {
echo "<tr style='display: none;'><td></td></tr>\n"; // dummy row to maintain same background color for transcription row
echo "<tr id='transcription_".$row['call_recording_uuid']."' class='list-row' style='display: none;'>\n";
echo " <td style='padding: 10px 20px 15px 20px;' colspan='".$col_count."'>\n";

View File

@ -26,10 +26,7 @@
/**
* call_recordings class
*
* @method null download
*/
if (!class_exists('call_recordings')) {
class call_recordings {
/**
@ -110,7 +107,7 @@ if (!class_exists('call_recordings')) {
if (is_array($array) && @sizeof($array) != 0) {
//add temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('xml_cdr_edit', 'temp');
//remove record_path, record_name and record_length
@ -152,11 +149,11 @@ if (!class_exists('call_recordings')) {
//add the settings object
$settings = new settings(["domain_uuid" => $_SESSION['domain_uuid'], "user_uuid" => $_SESSION['user_uuid']]);
$transcribe_enabled = $settings->get('transcribe', 'enabled', 'false');
$transcribe_enabled = $settings->get('transcribe', 'enabled', false);
$transcribe_engine = $settings->get('transcribe', 'engine', '');
//transcribe multiple recordings
if ($transcribe_enabled == 'true' && !empty($transcribe_engine) && is_array($records) && @sizeof($records) != 0) {
if ($transcribe_enabled && !empty($transcribe_engine) && is_array($records) && @sizeof($records) != 0) {
//add the transcribe object
$transcribe = new transcribe($settings);
@ -200,7 +197,7 @@ if (!class_exists('call_recordings')) {
if (is_array($array) && @sizeof($array) != 0) {
//add temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('xml_cdr_edit', 'temp');
//remove record_path, record_name and record_length
@ -274,6 +271,7 @@ if (!class_exists('call_recordings')) {
case "ogg" : header("Content-Type: audio/ogg"); break;
}
}
$call_recording_name = preg_replace('#[^a-zA-Z0-9_\-\.]#', '', $call_recording_name);
header('Content-Disposition: attachment; filename="'.$call_recording_name.'"');
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
@ -415,7 +413,7 @@ if (!class_exists('call_recordings')) {
}
// If the range starts with an '-' we start from the beginning
// If not, we forward the file pointer
// And make sure to get the end byte if spesified
// And make sure to get the end byte if specified
if ($range[0] == '-') {
// The n-number of the last bytes is requested
$c_start = $size - substr($range, 1);
@ -482,7 +480,7 @@ if (!class_exists('call_recordings')) {
$domain_settings = new settings(['database' => $database, 'domain_uuid' => $domain_uuid]);
//get the recording location for this domain
$call_recording_location = $domain_settings->get('switch', 'recordings', '/var/lib/freeswitch/storage/recordings') . '/default';
$call_recording_location = $domain_settings->get('switch', 'recordings', '/var/lib/freeswitch/recordings');
//get the retention days for this domain
$retention_days = $domain_settings->get('call_recordings', 'filesystem_retention_days', '');
@ -492,8 +490,8 @@ if (!class_exists('call_recordings')) {
$retention_days = intval($retention_days);
//get list of mp3 and wav files
$mp3_files = glob("$call_recording_location/$domain_name/*/archive/*.mp3");
$wav_files = glob("$call_recording_location/$domain_name/*/archive/*.wav");
$mp3_files = glob("$call_recording_location/$domain_name/archive/*/*/*/*.mp3");
$wav_files = glob("$call_recording_location/$domain_name/archive/*/*/*/*.wav");
//combine to single array
$domain_call_recording_files = array_merge($mp3_files, $wav_files);
@ -506,7 +504,7 @@ if (!class_exists('call_recordings')) {
//remove the file when it is older
if (unlink($file)) {
//log success
maintenance_service::log_write(self::class, "Removed $file from call_recordings", $domain_uuid);
maintenance_service::log_write(self::class, "Removed $file from call_recordings older than $retention_days days", $domain_uuid);
} else {
//log failure
maintenance_service::log_write(self::class, "Unable to remove $file", $domain_uuid, maintenance_service::LOG_ERROR);
@ -524,6 +522,3 @@ if (!class_exists('call_recordings')) {
}
} //class
}
?>

View File

@ -27,7 +27,6 @@
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/classes/waveform.php";
use maximal\audio\Waveform;
@ -84,8 +83,8 @@
Waveform::$colorB = !empty($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) : [0,125,232,0.6]; // array rgba, right (b-leg) wave color
Waveform::$backgroundColor = !empty($_SESSION['theme']['audio_player_waveform_color_background']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_background']['text']) : [0,0,0,0]; // array rgba, default: transparent
Waveform::$axisColor = !empty($_SESSION['theme']['audio_player_waveform_color_axis']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_axis']['text']) : [0,0,0,0.3]; // array rgba
Waveform::$singlePhase = empty($_SESSION['theme']['audio_player_waveform_single_phase']['boolean']) || $_SESSION['theme']['audio_player_waveform_single_phase']['boolean'] !== 'true' ? false : true; // positive phase only - left (a-leg) top, right (b-leg) bottom
Waveform::$singleAxis = empty($_SESSION['theme']['audio_player_waveform_single_axis']['boolean']) || $_SESSION['theme']['audio_player_waveform_single_axis']['boolean'] !== 'false' ? true : false; // combine channels into single axis
Waveform::$singlePhase = filter_var($_SESSION['theme']['audio_player_waveform_single_phase']['boolean'] ?? false, FILTER_VALIDATE_BOOL) ? 'true': 'false'; // positive phase only - left (a-leg) top, right (b-leg) bottom
Waveform::$singleAxis = filter_var($_SESSION['theme']['audio_player_waveform_single_axis']['boolean'] ?? true, FILTER_VALIDATE_BOOL) ? 'true': 'false'; // combine channels into single axis
$height = !empty($_SESSION['theme']['audio_player_waveform_height']['text']) && is_numeric(str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text'])) ? 2.2 * (int) str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text']) : null;
$wf = $waveform->getWaveform($temp_filename, 1600, $height ?? 180); // input: png filename returns boolean true/false, or 'base64' returns base64 string
}

View File

@ -56,5 +56,16 @@
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_active_all";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_active_profile";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_active_application";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_active_codec";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "call_active_secure";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
?>

View File

@ -468,8 +468,8 @@ $text['label-domain']['zh-cn'] = "领域";
$text['label-domain']['ja-jp'] = "ドメイン";
$text['label-domain']['ko-kr'] = "도메인";
$text['label-destination']['en-us'] = "Dest";
$text['label-destination']['en-gb'] = "Dest";
$text['label-destination']['en-us'] = "Destination";
$text['label-destination']['en-gb'] = "Destination";
$text['label-destination']['ar-eg'] = "الوجهة";
$text['label-destination']['de-at'] = "Ziel";
$text['label-destination']['de-ch'] = "Ziel";
@ -546,8 +546,8 @@ $text['label-codec']['zh-cn'] = "读/写编解码器";
$text['label-codec']['ja-jp'] = "読み取り/書き込みコーデック";
$text['label-codec']['ko-kr'] = "읽기/쓰기 코덱";
$text['label-cid-number']['en-us'] = "CID Number";
$text['label-cid-number']['en-gb'] = "CID Number";
$text['label-cid-number']['en-us'] = "Caller Number";
$text['label-cid-number']['en-gb'] = "Caller Number";
$text['label-cid-number']['ar-eg'] = "رقم CID";
$text['label-cid-number']['de-at'] = "Anrufer Nummer";
$text['label-cid-number']['de-ch'] = "Anrufer Nummer";
@ -572,8 +572,8 @@ $text['label-cid-number']['zh-cn'] = "来电号码";
$text['label-cid-number']['ja-jp'] = "CID番号";
$text['label-cid-number']['ko-kr'] = "CID 번호";
$text['label-cid-name']['en-us'] = "CID Name";
$text['label-cid-name']['en-gb'] = "CID Name";
$text['label-cid-name']['en-us'] = "Caller Name";
$text['label-cid-name']['en-gb'] = "Caller Name";
$text['label-cid-name']['ar-eg'] = "اسم CID";
$text['label-cid-name']['de-at'] = "Anrufer Name";
$text['label-cid-name']['de-ch'] = "Anrufer Name";
@ -650,6 +650,33 @@ $text['label-eavesdrop']['zh-cn'] = "窃听";
$text['label-eavesdrop']['ja-jp'] = "盗聴";
$text['label-eavesdrop']['ko-kr'] = "엿듣다";
$text['label-duration']['en-us'] = "Duration";
$text['label-duration']['en-gb'] = "Duration";
$text['label-duration']['ar-eg'] = "المدة";
$text['label-duration']['de-at'] = "Dauer";
$text['label-duration']['de-ch'] = "Dauer";
$text['label-duration']['de-de'] = "Dauer";
$text['label-duration']['el-gr'] = "Διάρκεια";
$text['label-duration']['es-cl'] = "Duración";
$text['label-duration']['es-mx'] = "Duración";
$text['label-duration']['fr-ca'] = "Durée";
$text['label-duration']['fr-fr'] = "Durée";
$text['label-duration']['he-il'] = "משך השיחה";
$text['label-duration']['it-it'] = "Durata";
$text['label-duration']['ka-ge'] = "ხანგრძლივობა";
$text['label-duration']['nl-nl'] = "Duur";
$text['label-duration']['pl-pl'] = "Czas trwania";
$text['label-duration']['pt-br'] = "Duração";
$text['label-duration']['pt-pt'] = "Duração";
$text['label-duration']['ro-ro'] = "Durată";
$text['label-duration']['ru-ru'] = "Продолжительность";
$text['label-duration']['sv-se'] = "Samtalstid";
$text['label-duration']['uk-ua'] = "Тривалість";
$text['label-duration']['tr-tr'] = "Süre";
$text['label-duration']['zh-cn'] = "期间";
$text['label-duration']['ja-jp'] = "間隔";
$text['label-duration']['ko-kr'] = "지속";
$text['description-2']['en-us'] = "Use this to view all extensions and monitor and interact with active calls.";
$text['description-2']['en-gb'] = "Use this to view all extensions and monitor and interact with active calls.";
$text['description-2']['ar-eg'] = "استخدم هذا لعرض جميع الملحقات ومراقبة المكالمات النشطة والتفاعل معها.";

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2023
Portions created by the Initial Developer are Copyright (C) 2008-2025
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -78,7 +78,12 @@
$.ajax({
url: url,
success: function(response){
$("#ajax_reponse").html(response);
$("#ajax_response").html(response);
const table = document.getElementById('calls_active');
var row_count = table.rows.length;
if (row_count > 0) { row_count = row_count - 1; }
const calls_active_count = document.getElementById('calls_active_count');
calls_active_count.innerHTML = row_count;
}
});
timer_id = setTimeout(ajax_get, refresh);
@ -132,19 +137,70 @@
<?php
//create simple array of users own extensions
unset($_SESSION['user']['extensions']);
if (is_array($_SESSION['user']['extension'])) {
foreach ($_SESSION['user']['extension'] as $assigned_extensions) {
$_SESSION['user']['extensions'][] = $assigned_extensions['user'];
unset($_SESSION['user']['extensions']);
if (is_array($_SESSION['user']['extension'])) {
foreach ($_SESSION['user']['extension'] as $assigned_extensions) {
$_SESSION['user']['extensions'][] = $assigned_extensions['user'];
}
}
}
echo "<div id='ajax_reponse'></div>\n";
echo "<div id='cmd_response' style='display: none;'></div>\n";
echo "<div id='time_stamp' style='visibility:hidden'>".date('Y-m-d-s')."</div>\n";
echo "<br><br><br>";
//create token
$object = new token;
$token = $object->create('/app/calls_active/calls_active_inc.php');
$_SESSION['app']['calls_active']['token']['name'] = $token['name'];
$_SESSION['app']['calls_active']['token']['hash'] = $token['hash'];
require_once "resources/footer.php";
//show the content header
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['title']."</b><div id='calls_active_count' class='count'>".number_format($num_rows)."</div></div>\n";
echo " <div class='actions'>\n";
echo " <span id='refresh_state'>".button::create(['type'=>'button','title'=>$text['label-refresh_pause'],'icon'=>'sync-alt fa-spin','onclick'=>'refresh_stop()'])."</span>";
if (permission_exists('call_active_eavesdrop') && !empty($user['extensions'])) {
if (sizeof($user['extensions']) > 1) {
echo " <input type='hidden' id='eavesdrop_dest' value=\"".(($_REQUEST['eavesdrop_dest'] == '') ? $user['extension'][0]['destination'] : escape($_REQUEST['eavesdrop_dest']))."\">\n";
echo " <i class='fas fa-headphones' style='margin-left: 15px; cursor: help;' title='".$text['description-eavesdrop_destination']."' align='absmiddle'></i>\n";
echo " <select class='formfld' style='margin-right: 5px;' align='absmiddle' onchange=\"document.getElementById('eavesdrop_dest').value = this.options[this.selectedIndex].value; refresh_start();\" onfocus='refresh_stop();'>\n";
if (is_array($user['extensions'])) {
foreach ($user['extensions'] as $user_extension) {
echo " <option value='".escape($user_extension)."' ".(($_REQUEST['eavesdrop_dest'] == $user_extension) ? "selected" : null).">".escape($user_extension)."</option>\n";
}
}
echo " </select>\n";
}
else if (sizeof($user['extensions']) == 1) {
echo " <input type='hidden' id='eavesdrop_dest' value=\"".escape($user['extension'][0]['destination'])."\">\n";
}
}
if (permission_exists('call_active_hangup') && $rows) {
echo button::create(['type'=>'button','label'=>$text['label-hangup'],'icon'=>'phone-slash','id'=>'btn_delete','onclick'=>"refresh_stop(); modal_open('modal-hangup','btn_hangup');"]);
}
if (permission_exists('call_active_all')) {
if ($show == "all") {
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$theme_button_icon_back,'link'=>'calls_active.php','onmouseover'=>'refresh_stop()','onmouseout'=>'refresh_start()']);
}
else {
echo button::create(['type'=>'button','label'=>$text['button-show_all'],'icon'=>$theme_button_icon_all,'link'=>'calls_active.php?show=all','onmouseover'=>'refresh_stop()','onmouseout'=>'refresh_start()']);
}
}
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
if (permission_exists('call_active_hangup') && $rows) {
echo modal::create(['id'=>'modal-hangup','type'=>'general','message'=>$text['confirm-hangups'],'actions'=>button::create(['type'=>'button','label'=>$text['label-hangup'],'icon'=>'check','id'=>'btn_hangup','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('hangup'); list_form_submit('form_list');"])]);
}
echo $text['description']."\n";
echo "<br /><br />\n";
//show the content body
echo "<div id='ajax_response'></div>\n";
echo "<div id='cmd_response' style='display: none;'></div>\n";
echo "<div id='time_stamp' style='visibility:hidden'>".date('Y-m-d-s')."</div>\n";
echo "<br><br><br>";
//show the footer
require_once "resources/footer.php";
/*
// deprecated functions for this page

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2023
Portions created by the Initial Developer are Copyright (C) 2008-2025
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -37,6 +37,21 @@
exit;
}
//get the session settings
$domain_uuid = $_SESSION['domain_uuid'];
$domain_name = $_SESSION['domain_name'];
$user_uuid = $_SESSION['user_uuid'];
$gateways = $_SESSION['gateways'];
$user = $_SESSION['user'];
//initialize the settings object
$settings = new settings(["domain_uuid" => $domain_uuid, "user_uuid" => $user_uuid]);
//get the settings
$template_name = $settings->get('domain', 'template', 'default');
$theme_button_icon_back = $settings->get('theme', 'button_icon_back', '');
$theme_button_icon_all = $settings->get('theme', 'button_icon_all', '');
//add multi-lingual support
$language = new text;
$text = $language->get();
@ -46,7 +61,7 @@
if ($show != "all") { $show = ''; }
//include theme config for button images
include_once("themes/".$_SESSION['domain']['template']['name']."/config.php");
include_once("themes/".$template_name."/config.php");
//set the command
$switch_cmd = 'show channels as json';
@ -80,7 +95,7 @@
if (($show == 'all' && permission_exists('call_active_all'))) {
$rows[] = $row;
}
elseif ($row['domain_name'] == $_SESSION['domain_name']) {
elseif ($row['domain_name'] == $domain_name) {
$rows[] = $row;
}
}
@ -88,10 +103,8 @@
}
$num_rows = @sizeof($rows);
//if the connnection is available then run it and return the results
if (!$event_socket) {
$msg = "<div align='center'>".$text['confirm-socket']."<br /></div>";
echo "<div align='center'>\n";
echo "<table width='40%'>\n";
@ -103,172 +116,164 @@
echo "</tr>\n";
echo "</table>\n";
echo "</div>\n";
return;
}
else {
//create token
$object = new token;
$token = $object->create('/app/calls_active/calls_active_inc.php');
//add the style
echo "<style>\n";
echo " /* Small screens: Hide columns with class 'hide-small' */\n";
echo " @media (max-width: 600px) {\n";
echo " .hide-small {\n";
echo " display: none;\n";
echo " }\n";
echo " }\n";
echo "\n";
echo " /* Medium screens: Hide columns with class 'hide-medium' */\n";
echo "@media (max-width: 1023px) and (min-width: 601px) {\n";
echo " .hide-medium {\n";
echo " display: none;\n";
echo " }\n";
echo " }\n";
echo "\n";
echo "</style>\n";
//show content
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['title']."</b><div class='count'>".number_format($num_rows)."</div></div>\n";
echo " <div class='actions'>\n";
echo " <span id='refresh_state'>".button::create(['type'=>'button','title'=>$text['label-refresh_pause'],'icon'=>'sync-alt fa-spin','onclick'=>'refresh_stop()'])."</span>";
if (permission_exists('call_active_eavesdrop') && !empty($_SESSION['user']['extensions'])) {
if (sizeof($_SESSION['user']['extensions']) > 1) {
echo " <input type='hidden' id='eavesdrop_dest' value=\"".(($_REQUEST['eavesdrop_dest'] == '') ? $_SESSION['user']['extension'][0]['destination'] : escape($_REQUEST['eavesdrop_dest']))."\">\n";
echo " <i class='fas fa-headphones' style='margin-left: 15px; cursor: help;' title='".$text['description-eavesdrop_destination']."' align='absmiddle'></i>\n";
echo " <select class='formfld' style='margin-right: 5px;' align='absmiddle' onchange=\"document.getElementById('eavesdrop_dest').value = this.options[this.selectedIndex].value; refresh_start();\" onfocus='refresh_stop();'>\n";
if (is_array($_SESSION['user']['extensions'])) {
foreach ($_SESSION['user']['extensions'] as $user_extension) {
echo " <option value='".escape($user_extension)."' ".(($_REQUEST['eavesdrop_dest'] == $user_extension) ? "selected" : null).">".escape($user_extension)."</option>\n";
}
//show the results
echo "<div id='cmd_reponse'></div>\n";
echo "<form id='form_list' method='post' action='calls_exec.php'>\n";
echo "<input type='hidden' id='action' name='action' value=''>\n";
echo "<div class='card'>\n";
echo " <table id='calls_active' class='list'>\n";
echo " <tr class='list-header'>\n";
if (permission_exists('call_active_hangup')) {
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='if (this.checked) { refresh_stop(); } else { refresh_start(); } list_all_toggle();' ".(empty($rows) ? "style='visibility: hidden;'" : null).">\n";
echo " </th>\n";
}
if (permission_exists('call_active_profile')) {
echo " <th class='hide-small'>".$text['label-profile']."</th>\n";
}
echo " <th>".$text['label-duration']."</th>\n";
if ($show == 'all') {
echo " <th>".$text['label-domain']."</th>\n";
}
echo " <th class='hide-small'>".$text['label-cid-name']."</th>\n";
echo " <th>".$text['label-cid-number']."</th>\n";
echo " <th>".$text['label-destination']."</th>\n";
if (permission_exists('call_active_application')) {
echo " <th class='hide-small hide-medium'>".$text['label-app']."</th>\n";
}
if (permission_exists('call_active_codec')) {
echo " <th class='hide-small hide-medium'>".$text['label-codec']."</th>\n";
}
if (permission_exists('call_active_secure')) {
echo " <th class='hide-small hide-medium'>".$text['label-secure']."</th>\n";
}
if (permission_exists('call_active_eavesdrop') || permission_exists('call_active_hangup')) {
echo " <th>&nbsp;</th>\n";
}
echo " </tr>\n";
if (is_array($rows)) {
$x = 0;
foreach ($rows as $row) {
//set the php variables
foreach ($row as $key => $value) {
$$key = $value;
}
//get the sip profile
$name_array = explode("/", $name);
$sip_profile = $name_array[1];
$sip_uri = $name_array[2];
//get the number
//$temp_array = explode("@", $sip_uri);
//$tmp_number = $temp_array[0];
//$tmp_number = str_replace("sip:", "", $tmp_number);
//remove the '+' because it breaks the call recording
$cid_num = str_replace("+", "", $cid_num);
//replace gateway uuid with name
if (is_array($gateways) && sizeof($gateways) > 0) {
foreach ($gateways as $gateway_uuid => $gateway_name) {
$application_data = str_replace($gateway_uuid, $gateway_name, $application_data);
}
echo " </select>\n";
}
else if (sizeof($_SESSION['user']['extensions']) == 1) {
echo " <input type='hidden' id='eavesdrop_dest' value=\"".escape($_SESSION['user']['extension'][0]['destination'])."\">\n";
//calculate elapsed seconds
$elapsed_seconds = time() - $created_epoch;
//convert seconds to hours, minutes, and seconds
$hours = floor($elapsed_seconds / 3600);
$minutes = floor(($elapsed_seconds % 3600) / 60);
$seconds = $elapsed_seconds % 60;
//format the elapsed time as HH:MM:SS
$elapsed_time = sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds);
//reduce too long app data
if(strlen($application_data) > 80) {
$application_data = substr($application_data, 0, 80) . '...';
}
}
if (permission_exists('call_active_hangup') && $rows) {
echo button::create(['type'=>'button','label'=>$text['label-hangup'],'icon'=>'phone-slash','id'=>'btn_delete','onclick'=>"refresh_stop(); modal_open('modal-hangup','btn_hangup');"]);
}
if (permission_exists('call_active_all')) {
if ($show == "all") {
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'link'=>'calls_active.php','onmouseover'=>'refresh_stop()','onmouseout'=>'refresh_start()']);
//send the html
echo " <tr class='list-row'>\n";
if (permission_exists('call_active_hangup')) {
echo " <td class='checkbox'>\n";
echo " <input type='checkbox' name='calls[$x][checked]' id='checkbox_".$x."' value='true' onclick=\"if (this.checked) { refresh_stop(); } else { document.getElementById('checkbox_all').checked = false; }\">\n";
echo " <input type='hidden' name='calls[$x][uuid]' value='".escape($uuid)."' />\n";
echo " </td>\n";
}
else {
echo button::create(['type'=>'button','label'=>$text['button-show_all'],'icon'=>$_SESSION['theme']['button_icon_all'],'link'=>'calls_active.php?show=all','onmouseover'=>'refresh_stop()','onmouseout'=>'refresh_start()']);
if (permission_exists('call_active_profile')) {
echo " <td class='hide-small'>".escape($sip_profile)."&nbsp;</td>\n";
}
}
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
if (permission_exists('call_active_hangup') && $rows) {
echo modal::create(['id'=>'modal-hangup','type'=>'general','message'=>$text['confirm-hangups'],'actions'=>button::create(['type'=>'button','label'=>$text['label-hangup'],'icon'=>'check','id'=>'btn_hangup','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('hangup'); list_form_submit('form_list');"])]);
}
echo $text['description']."\n";
echo "<br /><br />\n";
//show the results
echo "<div id='cmd_reponse'></div>\n";
echo "<form id='form_list' method='post' action='calls_exec.php'>\n";
echo "<input type='hidden' id='action' name='action' value=''>\n";
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
if (permission_exists('call_active_hangup')) {
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='if (this.checked) { refresh_stop(); } else { refresh_start(); } list_all_toggle();' ".(empty($rows) ? "style='visibility: hidden;'" : null).">\n";
echo " </th>\n";
}
echo " <th>".$text['label-profile']."</th>\n";
echo " <th>".$text['label-created']."</th>\n";
if ($show == 'all') {
echo " <th>".$text['label-domain']."</th>\n";
}
echo " <th>".$text['label-number']."</th>\n";
echo " <th>".$text['label-cid-name']."</th>\n";
echo " <th>".$text['label-cid-number']."</th>\n";
echo " <th>".$text['label-destination']."</th>\n";
echo " <th>".$text['label-app']."</th>\n";
echo " <th>".$text['label-codec']."</th>\n";
echo " <th>".$text['label-secure']."</th>\n";
if (permission_exists('call_active_eavesdrop') || permission_exists('call_active_hangup')) {
echo " <th>&nbsp;</th>\n";
}
echo "</tr>\n";
if (is_array($rows)) {
$x = 0;
foreach ($rows as $row) {
//set the php variables
foreach ($row as $key => $value) {
$$key = $value;
}
//get the sip profile
$name_array = explode("/", $name);
$sip_profile = $name_array[1];
$sip_uri = $name_array[2];
//get the number
$temp_array = explode("@", $sip_uri);
$tmp_number = $temp_array[0];
$tmp_number = str_replace("sip:", "", $tmp_number);
//remove the '+' because it breaks the call recording
$cid_num = str_replace("+", "", $cid_num);
//replace gateway uuid with name
if (is_array($_SESSION['gateways']) && sizeof($_SESSION['gateways']) > 0) {
foreach ($_SESSION['gateways'] as $gateway_uuid => $gateway_name) {
$application_data = str_replace($gateway_uuid, $gateway_name, $application_data);
}
}
// reduce too long app data
if(strlen($application_data) > 512) {
$application_data = substr($application_data, 0, 512) . '...';
}
//send the html
echo "<tr class='list-row'>\n";
if (permission_exists('call_active_hangup')) {
echo " <td class='checkbox'>\n";
echo " <input type='checkbox' name='calls[$x][checked]' id='checkbox_".$x."' value='true' onclick=\"if (this.checked) { refresh_stop(); } else { document.getElementById('checkbox_all').checked = false; }\">\n";
echo " <input type='hidden' name='calls[$x][uuid]' value='".escape($uuid)."' />\n";
echo " </td>\n";
}
echo " <td>".escape($sip_profile)."&nbsp;</td>\n";
echo " <td>".escape($created)."&nbsp;</td>\n";
if ($show == 'all') {
echo " <td>".escape($domain_name)."&nbsp;</td>\n";
}
echo " <td>".escape($tmp_number)."&nbsp;</td>\n";
echo " <td>".escape($cid_name)."&nbsp;</td>\n";
echo " <td>".escape($cid_num)."&nbsp;</td>\n";
echo " <td>".escape($dest)."&nbsp;</td>\n";
echo " <td>".(!empty($application) ? escape($application).":".escape($application_data) : null)."&nbsp;</td>\n";
echo " <td>".escape($read_codec).":".escape($read_rate)." / ".escape($write_codec).":".escape($write_rate)."&nbsp;</td>\n";
echo " <td>".escape($secure)."&nbsp;</td>\n";
if (permission_exists('call_active_eavesdrop') || permission_exists('call_active_hangup')) {
echo " <td class='button right' style='padding-right: 0;'>\n";
//eavesdrop
if (permission_exists('call_active_eavesdrop') && $callstate == 'ACTIVE' && !empty($_SESSION['user']['extensions']) && !in_array($cid_num, $_SESSION['user']['extensions'])) {
echo button::create(['type'=>'button','label'=>$text['label-eavesdrop'],'icon'=>'headphones','collapse'=>'hide-lg-dn','onclick'=>"if (confirm('".$text['confirm-eavesdrop']."')) { eavesdrop_call('".escape($cid_num)."','".escape($uuid)."'); } else { this.blur(); return false; }",'onmouseover'=>'refresh_stop()','onmouseout'=>'refresh_start()']);
}
//hangup
if (permission_exists('call_active_hangup')) {
echo button::create(['type'=>'button','label'=>$text['label-hangup'],'icon'=>'phone-slash','collapse'=>'hide-lg-dn','onclick'=>"if (confirm('".$text['confirm-hangup']."')) { list_self_check('checkbox_".$x."'); list_action_set('hangup'); list_form_submit('form_list'); } else { this.blur(); return false; }",'onmouseover'=>'refresh_stop()','onmouseout'=>'refresh_start()']);
}
echo "</td>\n";
}
echo "</tr>\n";
//unset the domain name
unset($domain_name);
//increment counter
$x++;
//echo " <td>".escape($created)."&nbsp;</td>\n";
echo " <td>".escape($elapsed_time)."</td>\n";
if ($show == 'all') {
echo " <td>".escape($domain_name)."&nbsp;</td>\n";
}
unset($rows);
}
//echo " <td>".escape($tmp_number)."&nbsp;</td>\n";
echo " <td class='hide-small'>".escape($cid_name)."&nbsp;</td>\n";
echo " <td>".escape($cid_num)."&nbsp;</td>\n";
echo " <td>".escape($dest)."&nbsp;</td>\n";
if (permission_exists('call_active_application')) {
echo " <td class='hide-small hide-medium' style='max-width: 200px; word-wrap: break-word;'>".(!empty($application) ? escape($application).":".escape($application_data) : null)."&nbsp;</td>\n";
}
if (permission_exists('call_active_codec')) {
echo " <td class='hide-small hide-medium'>".escape($read_codec).":".escape($read_rate)." / ".escape($write_codec).":".escape($write_rate)."&nbsp;</td>\n";
}
if (permission_exists('call_active_secure')) {
echo " <td class='hide-small hide-medium'>".escape($secure)."&nbsp;</td>\n";
}
if (permission_exists('call_active_eavesdrop') || permission_exists('call_active_hangup')) {
echo " <td class='button right' style='padding-right: 0;'>\n";
//eavesdrop
if (permission_exists('call_active_eavesdrop') && $callstate == 'ACTIVE' && !empty($user['extensions']) && !in_array($cid_num, $user['extensions'])) {
echo button::create(['type'=>'button','label'=>$text['label-eavesdrop'],'icon'=>'headphones','collapse'=>'hide-lg-dn','onclick'=>"if (confirm('".$text['confirm-eavesdrop']."')) { eavesdrop_call('".escape($cid_num)."','".escape($uuid)."'); } else { this.blur(); return false; }",'onmouseover'=>'refresh_stop()','onmouseout'=>'refresh_start()']);
}
//hangup
if (permission_exists('call_active_hangup')) {
echo button::create(['type'=>'button','label'=>$text['label-hangup'],'icon'=>'phone-slash','collapse'=>'hide-lg-dn','onclick'=>"if (confirm('".$text['confirm-hangup']."')) { list_self_check('checkbox_".$x."'); list_action_set('hangup'); list_form_submit('form_list'); } else { this.blur(); return false; }",'onmouseover'=>'refresh_stop()','onmouseout'=>'refresh_start()']);
}
echo " </td>\n";
}
echo " </tr>\n";
echo "</table>\n";
echo "</div>\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>\n";
//unset the domain name
unset($domain_name);
//increment counter
$x++;
}
}
echo " </table>\n";
echo "</div>\n";
echo "<input type='hidden' name='".$_SESSION['app']['calls_active']['token']['name']."' value='".$_SESSION['app']['calls_active']['token']['hash']."'>\n";
echo "</form>\n";
?>

View File

@ -176,5 +176,13 @@
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "true";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "SPA PC VLAN ID. Options 0 to 4094.";
$y++;
$apps[$x]['default_settings'][$y]['default_setting_uuid'] = "78637de4-ec12-4d41-8c65-39afe50d2b02";
$apps[$x]['default_settings'][$y]['default_setting_category'] = "provision";
$apps[$x]['default_settings'][$y]['default_setting_subcategory'] = "spa_router_mode";
$apps[$x]['default_settings'][$y]['default_setting_name'] = "numeric";
$apps[$x]['default_settings'][$y]['default_setting_value'] = "0";
$apps[$x]['default_settings'][$y]['default_setting_enabled'] = "false";
$apps[$x]['default_settings'][$y]['default_setting_description'] = "Options: 0:Bridge, 1:NAT.";
$y++;
?>

View File

@ -164,7 +164,7 @@
$array['dialplans'][0]["app_uuid"] = "b81412e8-7253-91f4-e48e-42fc2c9a38d9";
//add the dialplan permission
$p = new permissions;
$p = permissions::new();
$p->add("dialplan_add", "temp");
$p->add("dialplan_edit", "temp");

View File

@ -49,7 +49,7 @@
$show = $_GET["show"] ?? '';
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get posted data
if (!empty($_POST['conference_centers'])) {
@ -221,7 +221,7 @@
echo th_order_by('conference_center_pin_length', $text['label-conference_center_pin_length'], $order_by, $order, null, "class='center shrink'");
echo th_order_by('conference_center_enabled', $text['label-conference_center_enabled'], $order_by, $order, null, "class='center'");
echo th_order_by('conference_center_description', $text['label-conference_center_description'], $order_by, $order, null, "class='hide-sm-dn'");
if (permission_exists('conference_center_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_center_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -229,8 +229,12 @@
if (!empty($conference_centers)) {
$x = 0;
foreach ($conference_centers as $row) {
$list_row_url = '';
if (permission_exists('conference_center_edit')) {
$list_row_url = "conference_center_edit.php?id=".$row['conference_center_uuid'];
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('conference_center_edit') || permission_exists('conference_center_delete')) {
@ -262,7 +266,7 @@
}
echo " </td>\n";
echo " <td class='description overflow hide-sm-dn'>".escape($row['conference_center_description'])."&nbsp;</td>\n";
if (permission_exists('conference_center_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_center_edit') && $list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -285,3 +289,4 @@
require_once "resources/footer.php";
?>

View File

@ -188,7 +188,7 @@
$array['conference_room_users'][0]['domain_uuid'] = $_SESSION['domain_uuid'];
//un-assigne the users from the conference room
$p = new permissions;
$p = permissions::new();
$p->add('conference_room_user_delete', 'temp');
$database->app_name = 'conference_centers';
@ -358,7 +358,7 @@
$array['conference_room_users'][0]['conference_room_uuid'] = $conference_room_uuid;
$array['conference_room_users'][0]['user_uuid'] = $_SESSION["user_uuid"];
$p = new permissions;
$p = permissions::new();
$p->add('conference_room_user_add', 'temp');
$database->app_name = 'conference_centers';
@ -440,7 +440,7 @@
$array['conference_room_users'][0]['conference_room_uuid'] = $conference_room_uuid;
$array['conference_room_users'][0]['user_uuid'] = $user_uuid;
$p = new permissions;
$p = permissions::new();
$p->add('conference_room_user_add', 'temp');
$database->app_name = 'conference_centers';

View File

@ -49,7 +49,7 @@
$search = $_GET["search"] ?? null;
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get the http post data
if (!empty($_POST['conference_rooms'])) {
@ -300,7 +300,7 @@
echo th_order_by('enabled', $text['label-enabled'], $order_by, $order, null, "class='center'");
}
echo th_order_by('description', $text['label-description'], $order_by, $order, null, "class='hide-sm-dn'");
if (permission_exists('conference_room_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_room_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -319,8 +319,12 @@
$participant_pin = substr($participant_pin, 0, 3) ."-". substr($participant_pin, 3, 3) ."-". substr($participant_pin, -3)."\n";
}
$list_row_url = '';
if (permission_exists('conference_room_edit')) {
$list_row_url = "conference_room_edit.php?id=".urlencode($row['conference_room_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('conference_room_add') || permission_exists('conference_room_edit') || permission_exists('conference_room_delete')) {
@ -486,7 +490,7 @@
}
echo " <td class='description overflow hide-sm-dn'>".escape($row['description'])."</td>\n";
if (permission_exists('conference_room_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_room_edit') && $list_row_edit_button) {
echo " <td class='action-button'>\n";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -508,3 +512,4 @@
require_once "resources/footer.php";
?>

View File

@ -45,7 +45,7 @@
$text = $language->get();
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//set variables from the http values
$order_by = $_GET["order_by"] ?? '' ? $_GET["order_by"] : 'start_epoch';
@ -152,7 +152,7 @@
echo "<th>".$text['label-time']."</th>\n";
echo th_order_by('start_epoch', $text['label-start'], $order_by, $order);
echo th_order_by('end_epoch', $text['label-end'], $order_by, $order);
if (permission_exists('conference_session_details') && $list_row_edit_button == 'true') {
if (permission_exists('conference_session_details') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -191,7 +191,7 @@
echo " <td>".$time_difference."&nbsp;</td>\n";
echo " <td>".$start_date."&nbsp;</td>\n";
echo " <td>".$end_date."&nbsp;</td>\n";
if (permission_exists('conference_session_details') && $list_row_edit_button == 'true') {
if (permission_exists('conference_session_details') && $list_row_edit_button) {
echo " <td class='action-button'>\n";
echo button::create(['type'=>'button','title'=>$text['button-view'],'icon'=>$_SESSION['theme']['button_icon_view'],'link'=>$list_row_url]);
echo " </td>\n";

View File

@ -46,7 +46,7 @@
$text = $language->get();
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get the http post data
if (!empty($_POST['conference_sessions'])) {
@ -172,7 +172,7 @@
echo th_order_by('profile', $text['label-profile'], $order_by, $order);
//echo th_order_by('recording', $text['label-recording'], $order_by, $order);
echo "<th>".$text['label-tools']."</th>\n";
if ($list_row_edit_button == 'true') {
if ($list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -232,7 +232,7 @@
echo "</table>\n";
}
echo " </td>\n";
if ($list_row_edit_button == 'true') {
if ($list_row_edit_button) {
echo " <td class='action-button'>\n";
echo button::create(['type'=>'button','title'=>$text['button-view'],'icon'=>$_SESSION['theme']['button_icon_view'],'link'=>$list_row_url]);
echo " </td>\n";

View File

@ -26,7 +26,6 @@ Luis Daniel Lucio Quiroz <dlucio@okay.com.mx>
*/
//define the conference centers class
if (!class_exists('conference_centers')) {
class conference_centers {
/**
@ -349,7 +348,7 @@ if (!class_exists('conference_centers')) {
if (!empty($array)) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_detail_delete', 'temp');
$p->add('dialplan_delete', 'temp');
@ -425,7 +424,7 @@ if (!class_exists('conference_centers')) {
if (!empty($array)) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('conference_room_user_delete', 'temp');
$p->add('conference_room_delete', 'temp');
@ -489,7 +488,7 @@ if (!class_exists('conference_centers')) {
if (!empty($array)) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('conference_session_detail_delete', 'temp');
$p->add('conference_user_delete', 'temp');
@ -578,7 +577,7 @@ if (!class_exists('conference_centers')) {
if (!empty($array)) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add("dialplan_edit", "temp");
//save the array
@ -800,7 +799,7 @@ if (!class_exists('conference_centers')) {
} //class
}
//example conference center
/*
@ -814,5 +813,3 @@ if (!class_exists('conference_centers')) {
$result = $conference_center->rooms();
print_r($result);
*/
?>

View File

@ -5,6 +5,7 @@ $array['dashboard'][$x]['dashboard_uuid'] = 'd1b26c96-6cfd-45ea-824f-0b5e16a9aab
$array['dashboard'][$x]['dashboard_name'] = 'Conference Centers';
$array['dashboard'][$x]['dashboard_path'] = 'dashboard/icon';
$array['dashboard'][$x]['dashboard_icon'] = 'fa-hotel';
$array['dashboard'][$x]['dashboard_icon_color'] = '#5D5CE3';
$array['dashboard'][$x]['dashboard_url'] = '/app/conference_centers/conference_rooms.php';
$array['dashboard'][$x]['dashboard_target'] = 'self';
$array['dashboard'][$x]['dashboard_width'] = '';
@ -14,14 +15,14 @@ $array['dashboard'][$x]['dashboard_content_text_align'] = '';
$array['dashboard'][$x]['dashboard_content_details'] = '';
$array['dashboard'][$x]['dashboard_chart_type'] = '';
$array['dashboard'][$x]['dashboard_label_enabled'] = 'true';
$array['dashboard'][$x]['dashboard_label_text_color'] = '';
$array['dashboard'][$x]['dashboard_label_text_color'] = '#444444';
$array['dashboard'][$x]['dashboard_label_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_label_background_color'] = '';
$array['dashboard'][$x]['dashboard_label_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color'] = '#5d5ce3';
$array['dashboard'][$x]['dashboard_number_text_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_background_color'] ='';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_background_color'] = '#ffffff';
$array['dashboard'][$x]['dashboard_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_detail_background_color'] = '';
$array['dashboard'][$x]['dashboard_column_span'] = '1';

View File

@ -27,7 +27,6 @@
//includes files
require_once dirname(__DIR__, 2) . "/resources/require.php";
require_once "resources/check_auth.php";
require_once "resources/classes/waveform.php";
use maximal\audio\Waveform;
@ -96,8 +95,8 @@
Waveform::$colorB = !empty($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_b_leg']['text']) : [0,125,232,0.6]; // array rgba, right (b-leg) wave color
Waveform::$backgroundColor = !empty($_SESSION['theme']['audio_player_waveform_color_background']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_background']['text']) : [0,0,0,0]; // array rgba, default: transparent
Waveform::$axisColor = !empty($_SESSION['theme']['audio_player_waveform_color_axis']['text']) ? color_to_rgba_array($_SESSION['theme']['audio_player_waveform_color_axis']['text']) : [0,0,0,0.3]; // array rgba
Waveform::$singlePhase = empty($_SESSION['theme']['audio_player_waveform_single_phase']['boolean']) || $_SESSION['theme']['audio_player_waveform_single_phase']['boolean'] !== 'true' ? false : true; // positive phase only - left (a-leg) top, right (b-leg) bottom
Waveform::$singleAxis = empty($_SESSION['theme']['audio_player_waveform_single_axis']['boolean']) || $_SESSION['theme']['audio_player_waveform_single_axis']['boolean'] !== 'false' ? true : false; // combine channels into single axis
Waveform::$singlePhase = filter_var($_SESSION['theme']['audio_player_waveform_single_phase']['boolean'] ?? false, FILTER_VALIDATE_BOOL) ? 'true': 'false'; // positive phase only - left (a-leg) top, right (b-leg) bottom
Waveform::$singleAxis = filter_var($_SESSION['theme']['audio_player_waveform_single_axis']['boolean'] ?? true, FILTER_VALIDATE_BOOL) ? 'true': 'false'; // combine channels into single axis
$height = !empty($_SESSION['theme']['audio_player_waveform_height']['text']) && is_numeric(str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text'])) ? 2.2 * (int) str_replace('px','',$_SESSION['theme']['audio_player_waveform_height']['text']) : null;
$wf = $waveform->getWaveform($temp_filename, 1600, $height ?? 180); // input: png filename returns boolean true/false, or 'base64' returns base64 string
}

View File

@ -32,7 +32,7 @@
if ($num_rows == 0) {
//set the directory
$xml_dir = $setting->get('switch','conf').'/autoload_configs';
$xml_dir = $settings->get('switch','conf').'/autoload_configs';
$xml_file = $xml_dir."/conference.conf";
$xml_file_alt = $_SERVER["DOCUMENT_ROOT"].'/'.PROJECT_PATH.'/app/switch/resources/conf/autoload_configs/conference.conf';
@ -65,7 +65,7 @@
$array['conference_controls'][0]['control_name'] = $control_name;
$array['conference_controls'][0]['control_enabled'] = 'true';
$p = new permissions;
$p = permissions::new();
$p->add('conference_control_add', 'temp');
$database->app_name = 'conference_controls';
@ -96,7 +96,7 @@
}
$array['conference_control_details'][0]['control_enabled'] = $control_enabled;
$p = new permissions;
$p = permissions::new();
$p->add('conference_control_detail_add', 'temp');
$database->app_name = 'conference_controls';

View File

@ -43,7 +43,7 @@
$text = $language->get();
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get the http post data
if (!empty($_POST['conference_control_details'])) {
@ -163,7 +163,7 @@
echo th_order_by('control_action', $text['label-control_action'], $order_by, $order, null, null, $param);
echo th_order_by('control_data', $text['label-control_data'], $order_by, $order, null, "class='pct-50 hide-xs'", $param);
echo th_order_by('control_enabled', $text['label-control_enabled'], $order_by, $order, null, "class='center'", $param);
if (permission_exists('conference_control_detail_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_control_detail_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -200,7 +200,7 @@
echo $text['label-'.$row['control_enabled']];
}
echo " </td>\n";
if (permission_exists('conference_control_detail_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_control_detail_edit') && $list_row_edit_button) {
echo " <td class='action-button'>\n";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";

View File

@ -43,7 +43,7 @@
$text = $language->get();
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get the http post data
if (!empty($_POST['conference_controls'])) {
@ -179,7 +179,7 @@
echo th_order_by('control_name', $text['label-control_name'], $order_by, $order);
echo th_order_by('control_enabled', $text['label-control_enabled'], $order_by, $order, null, "class='center shrink'");
echo " <th class='hide-sm-dn'>".$text['label-control_description']."</th>\n";
if (permission_exists('conference_control_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_control_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -215,7 +215,7 @@
}
echo " </td>\n";
echo " <td class='description overflow hide-sm-dn'>".escape($row['control_description'])."</td>\n";
if (permission_exists('conference_control_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_control_edit') && $list_row_edit_button) {
echo " <td class='action-button'>\n";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";

View File

@ -26,12 +26,7 @@
/**
* conference_controls class
*
* @method null delete
* @method null toggle
* @method null copy
*/
if (!class_exists('conference_controls')) {
class conference_controls {
/**
@ -103,7 +98,7 @@ if (!class_exists('conference_controls')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('conference_control_detail_delete', 'temp');
//execute delete
@ -426,6 +421,3 @@ if (!class_exists('conference_controls')) {
}
}
}
?>

View File

@ -32,7 +32,7 @@
if ($num_rows == 0) {
//set the directory
$xml_dir = $setting->get('switch','conf').'/autoload_configs';
$xml_dir = $settings->get('switch','conf').'/autoload_configs';
$xml_file = $xml_dir."/conference.conf";
$xml_file_alt = $_SERVER["DOCUMENT_ROOT"].'/'.PROJECT_PATH.'/app/switch/resources/conf/autoload_configs/conference.conf';
@ -65,7 +65,7 @@
$array['conference_profiles'][0]['profile_name'] = $profile_name;
$array['conference_profiles'][0]['profile_enabled'] = 'true';
$p = new permissions;
$p = permissions::new();
$p->add('conference_profile_add', 'temp');
$database->app_name = 'conference_profiles';
@ -91,7 +91,7 @@
$array['conference_profile_params'][0]['profile_param_value'] = $profile_param_value;
$array['conference_profile_params'][0]['profile_param_enabled'] = $profile_param_enabled;
$p = new permissions;
$p = permissions::new();
$p->add('conference_profile_param_add', 'temp');
$database->app_name = 'conference_profiles';

View File

@ -43,7 +43,7 @@
$text = $language->get();
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get the http post data
if (!empty($_POST['conference_profile_params'])) {
@ -152,7 +152,7 @@
echo th_order_by('profile_param_value', $text['label-profile_param_value'], $order_by, $order, null, "class='pct-40'", $param);
echo th_order_by('profile_param_enabled', $text['label-profile_param_enabled'], $order_by, $order, null, "class='center'", $param);
echo th_order_by('profile_param_description', $text['label-profile_param_description'], $order_by, $order, null, "class='hide-sm-dn'", $param);
if (permission_exists('conference_profile_param_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_profile_param_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -189,7 +189,7 @@
}
echo " </td>\n";
echo " <td class='description overflow hide-sm-dn'>".escape($row['profile_param_description'])."&nbsp;</td>\n";
if (permission_exists('conference_profile_param_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_profile_param_edit') && $list_row_edit_button) {
echo " <td class='action-button'>\n";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";

View File

@ -45,7 +45,7 @@
$search = $_GET["search"] ?? '';
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get the http post data
if (!empty($_POST['conference_profiles'])) {
@ -175,7 +175,7 @@
echo th_order_by('profile_name', $text['label-profile_name'], $order_by, $order);
echo th_order_by('profile_enabled', $text['label-profile_enabled'], $order_by, $order, null, "class='center'");
echo " <th class='hide-sm-dn'>".$text['label-profile_description']."</th>\n";
if (permission_exists('conference_profile_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_profile_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -211,7 +211,7 @@
}
echo " </td>\n";
echo " <td class='description overflow hide-sm-dn'>".escape($row['profile_description'])."</td>\n";
if (permission_exists('conference_profile_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_profile_edit') && $list_row_edit_button) {
echo " <td class='action-button'>\n";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";

View File

@ -26,12 +26,7 @@
/**
* conference_profiles class
*
* @method null delete
* @method null toggle
* @method null copy
*/
if (!class_exists('conference_profiles')) {
class conference_profiles {
/**
@ -103,7 +98,7 @@ if (!class_exists('conference_profiles')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('conference_profile_param_delete', 'temp');
//execute delete
@ -410,7 +405,7 @@ if (!class_exists('conference_profiles')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('conference_profile_param_add', 'temp');
//save the array
@ -432,6 +427,3 @@ if (!class_exists('conference_profiles')) {
}
}
}
?>

View File

@ -91,7 +91,7 @@
$user_uuid = $_REQUEST["user_uuid"];
$conference_uuid = $_REQUEST["id"];
$p = new permissions;
$p = permissions::new();
$p->add('conference_user_delete', 'temp');
$array['conference_users'][0]['domain_uuid'] = $_SESSION['domain_uuid'];
@ -124,7 +124,7 @@
$array['conference_users'][0]['conference_uuid'] = $conference_uuid;
$array['conference_users'][0]['user_uuid'] = $user_uuid;
$p = new permissions;
$p = permissions::new();
$p->add('conference_user_add', 'temp');
$database = new database;
@ -239,7 +239,7 @@
$array['dialplans'][0]['dialplan_enabled'] = $conference_enabled;
$array['dialplans'][0]['dialplan_description'] = $conference_description;
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_add', 'temp');
$p->add('dialplan_edit', 'temp');

View File

@ -46,7 +46,7 @@
$show = $_GET["show"] ?? '';
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//get posted data
if (!empty($_POST['conferences'])) {
@ -223,7 +223,7 @@
echo "<th style='text-align: center;'>".$text['label-tools']."</th>\n";
echo th_order_by('conference_enabled', $text['table-enabled'], $order_by, $order, null, "class='center'");
echo th_order_by('conference_description', $text['table-description'], $order_by, $order, null, "class='hide-sm-dn'");
if (permission_exists('conference_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -231,8 +231,12 @@
if (!empty($conferences)) {
$x = 0;
foreach($conferences as $row) {
$list_row_url = '';
if (permission_exists('conference_edit')) {
$list_row_url = "conference_edit.php?id=".urlencode($row['conference_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('conference_add') || permission_exists('conference_edit') || permission_exists('conference_delete')) {
@ -277,7 +281,7 @@
echo $text['label-'.$row['conference_enabled']];
}
echo " <td class='description overflow hide-sm-dn'>".escape($row['conference_description'])."&nbsp;</td>\n";
if (permission_exists('conference_edit') && $list_row_edit_button == 'true') {
if (permission_exists('conference_edit') && $list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -301,3 +305,4 @@
require_once "resources/footer.php";
?>

View File

@ -25,7 +25,6 @@
*/
//define the conferences class
if (!class_exists('conferences')) {
class conferences {
/**
@ -108,7 +107,7 @@ if (!class_exists('conferences')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('conference_user_delete', 'temp');
$p->add('dialplan_detail_delete', 'temp');
$p->add('dialplan_delete', 'temp');
@ -203,7 +202,7 @@ if (!class_exists('conferences')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_edit', 'temp');
//save the array
@ -341,7 +340,7 @@ if (!class_exists('conferences')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('conference_user_add', 'temp');
$p->add('dialplan_add', 'temp');
@ -374,6 +373,3 @@ if (!class_exists('conferences')) {
}
}
}
?>

View File

@ -5,6 +5,7 @@ $array['dashboard'][$x]['dashboard_uuid'] = 'c3c37d29-b654-4024-8ee4-d752b3e4db4
$array['dashboard'][$x]['dashboard_name'] = 'Conferences';
$array['dashboard'][$x]['dashboard_path'] = 'dashboard/icon';
$array['dashboard'][$x]['dashboard_icon'] = 'fa-comments';
$array['dashboard'][$x]['dashboard_icon_color'] = '#0292ff';
$array['dashboard'][$x]['dashboard_url'] = '/app/conferences/conferences.php';
$array['dashboard'][$x]['dashboard_target'] = 'self';
$array['dashboard'][$x]['dashboard_width'] = '';
@ -14,14 +15,14 @@ $array['dashboard'][$x]['dashboard_content_text_align'] = '';
$array['dashboard'][$x]['dashboard_content_details'] = '';
$array['dashboard'][$x]['dashboard_chart_type'] = '';
$array['dashboard'][$x]['dashboard_label_enabled'] = 'true';
$array['dashboard'][$x]['dashboard_label_text_color'] = '';
$array['dashboard'][$x]['dashboard_label_text_color'] = '#444444';
$array['dashboard'][$x]['dashboard_label_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_label_background_color'] = '';
$array['dashboard'][$x]['dashboard_label_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color'] = '#0292FF';
$array['dashboard'][$x]['dashboard_number_text_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_background_color'] ='';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_background_color'] = '#ffffff';
$array['dashboard'][$x]['dashboard_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_detail_background_color'] = '';
$array['dashboard'][$x]['dashboard_column_span'] = '1';
@ -41,3 +42,4 @@ $array['dashboard'][$x]['dashboard_groups'][$y]['group_name'] = 'admin';
$y++;
?>

View File

@ -22,6 +22,7 @@ $text['title-active_conferences']['ro-ro'] = "Conferințe active";
$text['title-active_conferences']['ru-ru'] = "Активные конференции";
$text['title-active_conferences']['sv-se'] = "Aktiva Konferenser";
$text['title-active_conferences']['uk-ua'] = "Активні кноференції";
$text['title-active_conferences']['tr-tr'] = "Aktif Konferanslar";
$text['title-active_conferences']['zh-cn'] = "活动会议";
$text['title-active_conferences']['ja-jp'] = "アクティブな会議";
$text['title-active_conferences']['ko-kr'] = "활성 회의";
@ -48,22 +49,23 @@ $text['message-denied']['ro-ro'] = "acces interzis";
$text['message-denied']['ru-ru'] = "Доступ запрещён";
$text['message-denied']['sv-se'] = "Tillträde Nekat";
$text['message-denied']['uk-ua'] = "в доступі відмовлено";
$text['message-denied']['tr-tr'] = "erişim engellendi";
$text['message-denied']['zh-cn'] = "拒绝访问";
$text['message-denied']['ja-jp'] = "アクセス拒否";
$text['message-denied']['ko-kr'] = "접근 불가";
$text['message-connection']['en-us'] = "Connection to Event Socket failed.";
$text['message-connection']['en-gb'] = "Connection to Event Socket failed.";
$text['message-connection']['ar-eg'] = "فشل الاتصال بـ Event Socket.";
$text['message-connection']['ar-eg'] = "فشل الاتصال بمقبس الحدث.";
$text['message-connection']['de-at'] = "Verbindung zum Event Socket fehlgeschlagen.";
$text['message-connection']['de-ch'] = "Verbindung zum Event Socket fehlgeschlagen.";
$text['message-connection']['de-de'] = "Verbindung zum Event Socket fehlgeschlagen.";
$text['message-connection']['el-gr'] = "Η σύνδεση στο Event Socket απέτυχε.";
$text['message-connection']['el-gr'] = "Η σύνδεση με την υποδοχή συμβάντος απέτυχε.";
$text['message-connection']['es-cl'] = "Conexión a Socket de Evento fallida.";
$text['message-connection']['es-mx'] = "Conexión a Socket de Evento fallida.";
$text['message-connection']['fr-ca'] = "Connexion à l'Event Socket en echec.";
$text['message-connection']['fr-fr'] = "Connexion à l'Event Socket en echec.";
$text['message-connection']['he-il'] = "החיבור ל-Event Socket נכשל.";
$text['message-connection']['he-il'] = "החיבור לשקע אירועים נכשל.";
$text['message-connection']['it-it'] = "Connessione all'Event Socket fallita.";
$text['message-connection']['ka-ge'] = "მოვლენების სოკეტთან მიერთება არ განხორციელდა.";
$text['message-connection']['nl-nl'] = "Verbinding met Event-Socket mislukt";
@ -74,6 +76,7 @@ $text['message-connection']['ro-ro'] = "Conexiunea la Event Socket a eșuat.";
$text['message-connection']['ru-ru'] = "Подключение к Event Socket неудачно.";
$text['message-connection']['sv-se'] = "Anslutning till Händelse misslyckades";
$text['message-connection']['uk-ua'] = "Помилка підключення до сокета подій.";
$text['message-connection']['tr-tr'] = "Olay Soketine bağlantı başarısız oldu.";
$text['message-connection']['zh-cn'] = "与事件套接字的连接失败。";
$text['message-connection']['ja-jp'] = "イベントソケットへの接続に失敗しました。";
$text['message-connection']['ko-kr'] = "이벤트 소켓에 연결하지 못했습니다.";
@ -100,6 +103,7 @@ $text['message-click_to_unmute']['ro-ro'] = "Faceți clic pentru a activa sunetu
$text['message-click_to_unmute']['ru-ru'] = "Нажмите, чтобы включить микрофон участника";
$text['message-click_to_unmute']['sv-se'] = "Klicka för att Aktivera Deltagares Mikrofon";
$text['message-click_to_unmute']['uk-ua'] = "Натисніть, щоб включити учасника";
$text['message-click_to_unmute']['tr-tr'] = "Üyenin Sesini Açmak İçin Tıklayın";
$text['message-click_to_unmute']['zh-cn'] = "单击以取消静音成员";
$text['message-click_to_unmute']['ja-jp'] = "クリックしてメンバーのミュートを解除";
$text['message-click_to_unmute']['ko-kr'] = "회원을 음소거 해제하려면 클릭하세요.";
@ -126,6 +130,7 @@ $text['message-click_to_mute']['ro-ro'] = "Faceți clic pentru a dezactiva sunet
$text['message-click_to_mute']['ru-ru'] = "Нажмите, чтобы отключить микрофон участника";
$text['message-click_to_mute']['sv-se'] = "Klicka för att Stänga Av Deltagares Mikrofon";
$text['message-click_to_mute']['uk-ua'] = "Натисніть, щоб вилючити учасника";
$text['message-click_to_mute']['tr-tr'] = "Üyeyi sessize almak için tıklayın";
$text['message-click_to_mute']['zh-cn'] = "点击静音成员";
$text['message-click_to_mute']['ja-jp'] = "クリックしてメンバーをミュート";
$text['message-click_to_mute']['ko-kr'] = "회원을 음소거하려면 클릭하세요.";
@ -152,6 +157,7 @@ $text['label-conference_center_room']['ro-ro'] = "Sala Centrului de Conferințe"
$text['label-conference_center_room']['ru-ru'] = "Конференц-центр";
$text['label-conference_center_room']['sv-se'] = "Konferenscenter";
$text['label-conference_center_room']['uk-ua'] = "Конференц-центр";
$text['label-conference_center_room']['tr-tr'] = "Konferans Merkezi Odası";
$text['label-conference_center_room']['zh-cn'] = "会议中心室";
$text['label-conference_center_room']['ja-jp'] = "カンファレンスセンタールーム";
$text['label-conference_center_room']['ko-kr'] = "컨퍼런스 센터룸";
@ -178,6 +184,7 @@ $text['label-yes']['ro-ro'] = "da";
$text['label-yes']['ru-ru'] = "Да";
$text['label-yes']['sv-se'] = "Ja";
$text['label-yes']['uk-ua'] = "Так";
$text['label-yes']['tr-tr'] = "Evet";
$text['label-yes']['zh-cn'] = "是的";
$text['label-yes']['ja-jp'] = "はい";
$text['label-yes']['ko-kr'] = "";
@ -204,6 +211,7 @@ $text['label-volume']['ro-ro'] = "Volum";
$text['label-volume']['ru-ru'] = "Громкость";
$text['label-volume']['sv-se'] = "Volym";
$text['label-volume']['uk-ua'] = "Обсяг";
$text['label-volume']['tr-tr'] = "Hacim";
$text['label-volume']['zh-cn'] = "体积";
$text['label-volume']['ja-jp'] = "音量";
$text['label-volume']['ko-kr'] = "용량";
@ -230,6 +238,7 @@ $text['label-video']['ro-ro'] = "Video";
$text['label-video']['ru-ru'] = "Видео";
$text['label-video']['sv-se'] = "Video";
$text['label-video']['uk-ua'] = "Відео";
$text['label-video']['tr-tr'] = "Video";
$text['label-video']['zh-cn'] = "视频";
$text['label-video']['ja-jp'] = "ビデオ";
$text['label-video']['ko-kr'] = "동영상";
@ -255,7 +264,8 @@ $text['label-unmute-all']['pt-pt'] = "Todos com som";
$text['label-unmute-all']['ro-ro'] = "Activați sunetul pe toate";
$text['label-unmute-all']['ru-ru'] = "Включить все микрофоны";
$text['label-unmute-all']['sv-se'] = "Aktivera Allas Mikrofoner";
$text['label-unmute-all']['uk-ua'] = "Unmute All ";
$text['label-unmute-all']['uk-ua'] = "Увімкнути всі";
$text['label-unmute-all']['tr-tr'] = "Tümünü sessize al";
$text['label-unmute-all']['zh-cn'] = "全部取消静音";
$text['label-unmute-all']['ja-jp'] = "すべてミュート解除";
$text['label-unmute-all']['ko-kr'] = "모두 음소거 해제";
@ -281,7 +291,8 @@ $text['label-unmute']['pt-pt'] = "Com som";
$text['label-unmute']['ro-ro'] = "nori";
$text['label-unmute']['ru-ru'] = "Включить микрофон";
$text['label-unmute']['sv-se'] = "Mikrofon Aktiv";
$text['label-unmute']['uk-ua'] = "Unmute ";
$text['label-unmute']['uk-ua'] = "увімкнено звук";
$text['label-unmute']['tr-tr'] = "Unmute";
$text['label-unmute']['zh-cn'] = "";
$text['label-unmute']['ja-jp'] = "雲霧て";
$text['label-unmute']['ko-kr'] = "구름 안개";
@ -308,6 +319,7 @@ $text['label-unlock']['ro-ro'] = "Deblocați";
$text['label-unlock']['ru-ru'] = "Разблокировать";
$text['label-unlock']['sv-se'] = "Lås Upp";
$text['label-unlock']['uk-ua'] = "Розблокувати";
$text['label-unlock']['tr-tr'] = "Kilidini aç";
$text['label-unlock']['zh-cn'] = "开锁";
$text['label-unlock']['ja-jp'] = "ロック解除";
$text['label-unlock']['ko-kr'] = "터놓다";
@ -334,6 +346,7 @@ $text['label-undeaf']['ro-ro'] = "nesurde";
$text['label-undeaf']['ru-ru'] = "Undeaf";
$text['label-undeaf']['sv-se'] = "Hörbarhet";
$text['label-undeaf']['uk-ua'] = "Неглухий";
$text['label-undeaf']['tr-tr'] = "Sağır olmayan";
$text['label-undeaf']['zh-cn'] = "不聋";
$text['label-undeaf']['ja-jp'] = "耳が聞こえない";
$text['label-undeaf']['ko-kr'] = "귀머거리";
@ -360,6 +373,7 @@ $text['label-tools']['ro-ro'] = "Instrumente";
$text['label-tools']['ru-ru'] = "Утилиты";
$text['label-tools']['sv-se'] = "Verktyg";
$text['label-tools']['uk-ua'] = "Параметри";
$text['label-tools']['tr-tr'] = "Aletler";
$text['label-tools']['zh-cn'] = "工具";
$text['label-tools']['ja-jp'] = "ツール";
$text['label-tools']['ko-kr'] = "도구";
@ -386,6 +400,7 @@ $text['label-tool']['ro-ro'] = "Instrumente";
$text['label-tool']['ru-ru'] = "Утилиты";
$text['label-tool']['sv-se'] = "Verktyg";
$text['label-tool']['uk-ua'] = "Параметри";
$text['label-tool']['tr-tr'] = "Aletler";
$text['label-tool']['zh-cn'] = "工具";
$text['label-tool']['ja-jp'] = "ツール";
$text['label-tool']['ko-kr'] = "도구";
@ -412,6 +427,7 @@ $text['label-talking']['ro-ro'] = "Vorbind";
$text['label-talking']['ru-ru'] = "Разговривайте";
$text['label-talking']['sv-se'] = "Talande";
$text['label-talking']['uk-ua'] = "Розмова";
$text['label-talking']['tr-tr'] = "Konuşmak";
$text['label-talking']['zh-cn'] = "";
$text['label-talking']['ja-jp'] = "おしゃべり";
$text['label-talking']['ko-kr'] = "말하는";
@ -438,6 +454,7 @@ $text['label-speak']['ro-ro'] = "Vorbi";
$text['label-speak']['ru-ru'] = "Говорите";
$text['label-speak']['sv-se'] = "Tala";
$text['label-speak']['uk-ua'] = "Говорити";
$text['label-speak']['tr-tr'] = "Konuşmak";
$text['label-speak']['zh-cn'] = "说话";
$text['label-speak']['ja-jp'] = "話す";
$text['label-speak']['ko-kr'] = "말하다";
@ -464,6 +481,7 @@ $text['label-recording']['ro-ro'] = "Înregistrare";
$text['label-recording']['ru-ru'] = "Запись";
$text['label-recording']['sv-se'] = "Inspelning";
$text['label-recording']['uk-ua'] = "Запис";
$text['label-recording']['tr-tr'] = "Kayıt";
$text['label-recording']['zh-cn'] = "记录";
$text['label-recording']['ja-jp'] = "録音";
$text['label-recording']['ko-kr'] = "녹음";
@ -490,6 +508,7 @@ $text['label-quiet']['ro-ro'] = "Liniște";
$text['label-quiet']['ru-ru'] = "Тихо";
$text['label-quiet']['sv-se'] = "Tyst";
$text['label-quiet']['uk-ua'] = "Спокійно";
$text['label-quiet']['tr-tr'] = "Sessizlik";
$text['label-quiet']['zh-cn'] = "安静的";
$text['label-quiet']['ja-jp'] = "静かな";
$text['label-quiet']['ko-kr'] = "조용한";
@ -516,6 +535,7 @@ $text['label-participant-pin']['ro-ro'] = "PIN participant";
$text['label-participant-pin']['ru-ru'] = "PIN участника";
$text['label-participant-pin']['sv-se'] = "Pinkod Deltagare";
$text['label-participant-pin']['uk-ua'] = "PIN учасника";
$text['label-participant-pin']['tr-tr'] = "Katılımcı PIN'i";
$text['label-participant-pin']['zh-cn'] = "参与者密码";
$text['label-participant-pin']['ja-jp'] = "参加者暗証番号";
$text['label-participant-pin']['ko-kr'] = "참가자 PIN";
@ -542,6 +562,7 @@ $text['label-participant']['ro-ro'] = "Participant";
$text['label-participant']['ru-ru'] = "Участник";
$text['label-participant']['sv-se'] = "Deltagare";
$text['label-participant']['uk-ua'] = "Учасник";
$text['label-participant']['tr-tr'] = "Katılımcı";
$text['label-participant']['zh-cn'] = "参与者";
$text['label-participant']['ja-jp'] = "参加者";
$text['label-participant']['ko-kr'] = "참가자";
@ -568,6 +589,7 @@ $text['label-not-recording']['ro-ro'] = "Nu se înregistrează";
$text['label-not-recording']['ru-ru'] = "Не записывается";
$text['label-not-recording']['sv-se'] = "Spelar inte in";
$text['label-not-recording']['uk-ua'] = "Не записується";
$text['label-not-recording']['tr-tr'] = "Kayıt Yapılmıyor";
$text['label-not-recording']['zh-cn'] = "不录音";
$text['label-not-recording']['ja-jp'] = "記録しない";
$text['label-not-recording']['ko-kr'] = "녹음하지 않음";
@ -593,7 +615,8 @@ $text['label-no']['pt-pt'] = "Não";
$text['label-no']['ro-ro'] = "Nu";
$text['label-no']['ru-ru'] = "Нет";
$text['label-no']['sv-se'] = "Nej";
$text['label-no']['uk-ua'] = "Ні";
$text['label-no']['uk-ua'] = "немає";
$text['label-no']['tr-tr'] = "HAYIR";
$text['label-no']['zh-cn'] = "";
$text['label-no']['ja-jp'] = "いいえ";
$text['label-no']['ko-kr'] = "아니요";
@ -620,6 +643,7 @@ $text['label-mute-all-alt']['ro-ro'] = "Dezactivați sunetul tuturor participan
$text['label-mute-all-alt']['ru-ru'] = "Отключить микрофоны всем участникам.";
$text['label-mute-all-alt']['sv-se'] = "Stäng av Deltagares mikrofon";
$text['label-mute-all-alt']['uk-ua'] = "Вимкнути звук для всіх учасників.";
$text['label-mute-all-alt']['tr-tr'] = "Tüm Katılımcıları Sessize Al.";
$text['label-mute-all-alt']['zh-cn'] = "将所有与会者静音。";
$text['label-mute-all-alt']['ja-jp'] = "すべての参加者をミュートします。";
$text['label-mute-all-alt']['ko-kr'] = "모든 참가자를 음소거합니다.";
@ -646,6 +670,7 @@ $text['label-mute-all']['ro-ro'] = "Dezactivați toate";
$text['label-mute-all']['ru-ru'] = "Отключить все микрофоны";
$text['label-mute-all']['sv-se'] = "Stäng av Allas mikrofon";
$text['label-mute-all']['uk-ua'] = "Вимкнути всі";
$text['label-mute-all']['tr-tr'] = "Tümünü Sessize Al";
$text['label-mute-all']['zh-cn'] = "全部静音";
$text['label-mute-all']['ja-jp'] = "すべてミュート";
$text['label-mute-all']['ko-kr'] = "모두 음소거";
@ -672,6 +697,7 @@ $text['label-mute']['ro-ro'] = "Mut";
$text['label-mute']['ru-ru'] = "Отключить микрофон";
$text['label-mute']['sv-se'] = "Stäng av mikrofon";
$text['label-mute']['uk-ua'] = "Вимкнути звук";
$text['label-mute']['tr-tr'] = "Sesini kapatmak";
$text['label-mute']['zh-cn'] = "沉默的";
$text['label-mute']['ja-jp'] = "無音";
$text['label-mute']['ko-kr'] = "무음";
@ -698,6 +724,7 @@ $text['label-hand_raised']['ro-ro'] = "Mâna Ridicată";
$text['label-hand_raised']['ru-ru'] = "Поднятая рука";
$text['label-hand_raised']['sv-se'] = "Upphöjd hand";
$text['label-hand_raised']['uk-ua'] = "Піднята рука";
$text['label-hand_raised']['tr-tr'] = "El Kaldırıldı";
$text['label-hand_raised']['zh-cn'] = "举手";
$text['label-hand_raised']['ja-jp'] = "挙手";
$text['label-hand_raised']['ko-kr'] = "제기 손";
@ -724,6 +751,7 @@ $text['label-moderator']['ro-ro'] = "Moderator";
$text['label-moderator']['ru-ru'] = "Модератор";
$text['label-moderator']['sv-se'] = "Värd";
$text['label-moderator']['uk-ua'] = "Модератор";
$text['label-moderator']['tr-tr'] = "Moderatör";
$text['label-moderator']['zh-cn'] = "版主";
$text['label-moderator']['ja-jp'] = "モデレータ";
$text['label-moderator']['ko-kr'] = "중재자";
@ -750,6 +778,7 @@ $text['label-message']['ro-ro'] = "Mesaj";
$text['label-message']['ru-ru'] = "Сообщение";
$text['label-message']['sv-se'] = "Meddelande";
$text['label-message']['uk-ua'] = "Повідомлення";
$text['label-message']['tr-tr'] = "Mesaj";
$text['label-message']['zh-cn'] = "信息";
$text['label-message']['ja-jp'] = "メッセージ";
$text['label-message']['ko-kr'] = "메시지";
@ -770,12 +799,13 @@ $text['label-members']['it-it'] = "Membri";
$text['label-members']['ka-ge'] = "მონაწილე";
$text['label-members']['nl-nl'] = "Deelnemers";
$text['label-members']['pl-pl'] = "Uczestnicy";
$text['label-members']['pt-br'] = "Total";
$text['label-members']['pt-br'] = "Membros";
$text['label-members']['pt-pt'] = "Deputados";
$text['label-members']['ro-ro'] = "Membrii";
$text['label-members']['ru-ru'] = "Участники";
$text['label-members']['sv-se'] = "Deltagare";
$text['label-members']['uk-ua'] = "Учасники";
$text['label-members']['tr-tr'] = "Üyeler";
$text['label-members']['zh-cn'] = "成员";
$text['label-members']['ja-jp'] = "メンバー";
$text['label-members']['ko-kr'] = "회원";
@ -802,6 +832,7 @@ $text['label-member-count']['ro-ro'] = "Număr de membri";
$text['label-member-count']['ru-ru'] = "Количество участников";
$text['label-member-count']['sv-se'] = "Antal Deltagare";
$text['label-member-count']['uk-ua'] = "Кількість учасиків";
$text['label-member-count']['tr-tr'] = "Üye Sayısı";
$text['label-member-count']['zh-cn'] = "会员人数";
$text['label-member-count']['ja-jp'] = "メンバー数";
$text['label-member-count']['ko-kr'] = "회원 수";
@ -828,6 +859,7 @@ $text['label-lock']['ro-ro'] = "Lacăt";
$text['label-lock']['ru-ru'] = "Заблокировать";
$text['label-lock']['sv-se'] = "Lås";
$text['label-lock']['uk-ua'] = "Блокувати";
$text['label-lock']['tr-tr'] = "Kilit";
$text['label-lock']['zh-cn'] = "";
$text['label-lock']['ja-jp'] = "ロック";
$text['label-lock']['ko-kr'] = "잠그다";
@ -847,13 +879,14 @@ $text['label-kick']['he-il'] = "בְּעִיטָה";
$text['label-kick']['it-it'] = "Espelli";
$text['label-kick']['ka-ge'] = "გაგდება";
$text['label-kick']['nl-nl'] = "Er uittrappen";
$text['label-kick']['pl-pl'] = "Kick ";
$text['label-kick']['pl-pl'] = "Rzut";
$text['label-kick']['pt-br'] = "Ejetar";
$text['label-kick']['pt-pt'] = "Ejectar";
$text['label-kick']['ro-ro'] = "Lovitură";
$text['label-kick']['ru-ru'] = "Выкинуть";
$text['label-kick']['sv-se'] = "Sparka Ut";
$text['label-kick']['uk-ua'] = "удар ногою";
$text['label-kick']['tr-tr'] = "Tekme atmak";
$text['label-kick']['zh-cn'] = "";
$text['label-kick']['ja-jp'] = "キック";
$text['label-kick']['ko-kr'] = "발 차기";
@ -880,6 +913,7 @@ $text['label-joined']['ro-ro'] = "S-a alăturat";
$text['label-joined']['ru-ru'] = "Подключился";
$text['label-joined']['sv-se'] = "Blev medlem";
$text['label-joined']['uk-ua'] = "Приєднався";
$text['label-joined']['tr-tr'] = "Katıldı";
$text['label-joined']['zh-cn'] = "已加入";
$text['label-joined']['ja-jp'] = "参加しました";
$text['label-joined']['ko-kr'] = "가입";
@ -906,6 +940,7 @@ $text['label-interactive']['ro-ro'] = "Conferință interactivă";
$text['label-interactive']['ru-ru'] = "Интерактивная конференция";
$text['label-interactive']['sv-se'] = "Interaktiv Konferens";
$text['label-interactive']['uk-ua'] = "Інтерактивна конференція";
$text['label-interactive']['tr-tr'] = "Etkileşimli Konferans";
$text['label-interactive']['zh-cn'] = "互动会议";
$text['label-interactive']['ja-jp'] = "インタラクティブな会議";
$text['label-interactive']['ko-kr'] = "인터랙티브 컨퍼런스";
@ -932,6 +967,7 @@ $text['label-id']['ro-ro'] = "ID";
$text['label-id']['ru-ru'] = "ID";
$text['label-id']['sv-se'] = "ID";
$text['label-id']['uk-ua'] = "ID";
$text['label-id']['tr-tr'] = "ID";
$text['label-id']['zh-cn'] = "ID";
$text['label-id']['ja-jp'] = "ID";
$text['label-id']['ko-kr'] = "ID";
@ -958,6 +994,7 @@ $text['label-hear']['ro-ro'] = "Auzi";
$text['label-hear']['ru-ru'] = "Слушать";
$text['label-hear']['sv-se'] = "Höra";
$text['label-hear']['uk-ua'] = "Почуйте";
$text['label-hear']['tr-tr'] = "Duymak";
$text['label-hear']['zh-cn'] = "听到";
$text['label-hear']['ja-jp'] = "聞く";
$text['label-hear']['ko-kr'] = "듣다";
@ -971,8 +1008,8 @@ $text['label-gain']['de-de'] = "Verstärkung";
$text['label-gain']['el-gr'] = "Κέρδος";
$text['label-gain']['es-cl'] = "Ganancia";
$text['label-gain']['es-mx'] = "Ganancia";
$text['label-gain']['fr-ca'] = "Gain";
$text['label-gain']['fr-fr'] = "Gain";
$text['label-gain']['fr-ca'] = "Gagner";
$text['label-gain']['fr-fr'] = "Gagner";
$text['label-gain']['he-il'] = "לְהַשִׂיג";
$text['label-gain']['it-it'] = "Guadagno";
$text['label-gain']['ka-ge'] = "გაძლიერება";
@ -984,6 +1021,7 @@ $text['label-gain']['ro-ro'] = "Câştig";
$text['label-gain']['ru-ru'] = "Усиление";
$text['label-gain']['sv-se'] = "Förstärka";
$text['label-gain']['uk-ua'] = "посилення";
$text['label-gain']['tr-tr'] = "Kazanmak";
$text['label-gain']['zh-cn'] = "获得";
$text['label-gain']['ja-jp'] = "";
$text['label-gain']['ko-kr'] = "얻다";
@ -1005,11 +1043,12 @@ $text['label-floor']['ka-ge'] = "აქვს იატაკი(Has Floor)";
$text['label-floor']['nl-nl'] = "Heeft het woord";
$text['label-floor']['pl-pl'] = "Posiada piętro";
$text['label-floor']['pt-br'] = "Derrubar";
$text['label-floor']['pt-pt'] = "Floor";
$text['label-floor']['pt-pt'] = "Tem Piso";
$text['label-floor']['ro-ro'] = "Are podea";
$text['label-floor']['ru-ru'] = "Has Floor";
$text['label-floor']['ru-ru'] = "Имеет пол";
$text['label-floor']['sv-se'] = "Har Ordet";
$text['label-floor']['uk-ua'] = "Має Поверх";
$text['label-floor']['tr-tr'] = "Zemini Var";
$text['label-floor']['zh-cn'] = "有楼层";
$text['label-floor']['ja-jp'] = "床あり";
$text['label-floor']['ko-kr'] = "바닥 있음";
@ -1036,6 +1075,7 @@ $text['label-energy']['ro-ro'] = "Energie";
$text['label-energy']['ru-ru'] = "Энергия";
$text['label-energy']['sv-se'] = "Energi";
$text['label-energy']['uk-ua'] = "Енергія";
$text['label-energy']['tr-tr'] = "Enerji";
$text['label-energy']['zh-cn'] = "活力";
$text['label-energy']['ja-jp'] = "エネルギー";
$text['label-energy']['ko-kr'] = "에너지";
@ -1062,6 +1102,7 @@ $text['label-end-conference']['ro-ro'] = "Încheierea conferinței";
$text['label-end-conference']['ru-ru'] = "Закончить конференцию";
$text['label-end-conference']['sv-se'] = "Avsluta Konferens";
$text['label-end-conference']['uk-ua'] = "Завершити конференцію";
$text['label-end-conference']['tr-tr'] = "Konferans Sonu";
$text['label-end-conference']['zh-cn'] = "结束会议";
$text['label-end-conference']['ja-jp'] = "会議終了";
$text['label-end-conference']['ko-kr'] = "컨퍼런스 종료";
@ -1085,9 +1126,10 @@ $text['label-deaf']['pl-pl'] = "Głuchy";
$text['label-deaf']['pt-br'] = "Ensurdecer ";
$text['label-deaf']['pt-pt'] = "Ensurdecer";
$text['label-deaf']['ro-ro'] = "Surd";
$text['label-deaf']['ru-ru'] = "Deaf";
$text['label-deaf']['ru-ru'] = "Глухой";
$text['label-deaf']['sv-se'] = "Hör inte";
$text['label-deaf']['uk-ua'] = "Глухий";
$text['label-deaf']['tr-tr'] = "Sağır";
$text['label-deaf']['zh-cn'] = "";
$text['label-deaf']['ja-jp'] = "聴覚障がい";
$text['label-deaf']['ko-kr'] = "청각 장애인";
@ -1114,6 +1156,7 @@ $text['label-cid-num']['ro-ro'] = "Număr CID";
$text['label-cid-num']['ru-ru'] = "Номер Caller ID";
$text['label-cid-num']['sv-se'] = "CID, nummerpresentation";
$text['label-cid-num']['uk-ua'] = "CID Номер";
$text['label-cid-num']['tr-tr'] = "CID Numarası";
$text['label-cid-num']['zh-cn'] = "来电号码";
$text['label-cid-num']['ja-jp'] = "CID 番号";
$text['label-cid-num']['ko-kr'] = "CID 번호";
@ -1140,6 +1183,7 @@ $text['label-cid-name']['ro-ro'] = "Nume CID";
$text['label-cid-name']['ru-ru'] = "CID Имя";
$text['label-cid-name']['sv-se'] = "CID, Namnpresentation";
$text['label-cid-name']['uk-ua'] = "CID Ім’я";
$text['label-cid-name']['tr-tr'] = "CID Adı";
$text['label-cid-name']['zh-cn'] = "客户ID名称";
$text['label-cid-name']['ja-jp'] = "CID名";
$text['label-cid-name']['ko-kr'] = "CID 이름";
@ -1166,6 +1210,7 @@ $text['label-capabilities']['ro-ro'] = "Capabilități";
$text['label-capabilities']['ru-ru'] = "Возможности";
$text['label-capabilities']['sv-se'] = "Möjligheter";
$text['label-capabilities']['uk-ua'] = "Можливості";
$text['label-capabilities']['tr-tr'] = "Yetenekler";
$text['label-capabilities']['zh-cn'] = "能力";
$text['label-capabilities']['ja-jp'] = "機能";
$text['label-capabilities']['ko-kr'] = "기능";
@ -1192,6 +1237,7 @@ $text['description-interactive']['ro-ro'] = "Utilizați aceasta pentru a monitor
$text['description-interactive']['ru-ru'] = "Используйте это, чтобы наблюдать и взаимодействовать с участниками конференции.";
$text['description-interactive']['sv-se'] = "Använd detta för att Monitorera och Interagera med deltagare i Konferensen";
$text['description-interactive']['uk-ua'] = "Використовуйте це для моніторингу та взаємодії з учасниками конференції.";
$text['description-interactive']['tr-tr'] = "Bunu konferans üyelerini izlemek ve onlarla etkileşim kurmak için kullanın.";
$text['description-interactive']['zh-cn'] = "使用它来监控会议成员并与之互动。";
$text['description-interactive']['ja-jp'] = "これを使用して、会議のメンバーを監視したり、メンバーと対話したりできます。";
$text['description-interactive']['ko-kr'] = "이를 사용하여 회의 구성원을 모니터링하고 상호 작용합니다.";
@ -1218,6 +1264,7 @@ $text['description-active']['ro-ro'] = "Listați toate conferințele care sunt a
$text['description-active']['ru-ru'] = "Список всех активных конференций с по крайней мере одним участником.";
$text['description-active']['sv-se'] = "Lista alla konferenser som för närvarande är aktiva med en eller flera medlemmar.";
$text['description-active']['uk-ua'] = "Перелічіть усі активні конференції з одним або кількома учасниками.";
$text['description-active']['tr-tr'] = "Şu anda bir veya daha fazla üyesi olan aktif tüm konferansları listeleyin.";
$text['description-active']['zh-cn'] = "列出当前有一名或多名成员参加的所有会议。";
$text['description-active']['ja-jp'] = "1 人以上のメンバーと現在アクティブなすべての会議を一覧表示します。";
$text['description-active']['ko-kr'] = "현재 한 명 이상의 구성원과 함께 활성화된 모든 회의를 나열합니다.";
@ -1244,6 +1291,7 @@ $text['button-stop-rec']['ro-ro'] = "Opriți înregistrarea";
$text['button-stop-rec']['ru-ru'] = "Остановить запись";
$text['button-stop-rec']['sv-se'] = "Stoppa Inspelning";
$text['button-stop-rec']['uk-ua'] = "Зупинити";
$text['button-stop-rec']['tr-tr'] = "Kaydı Durdur";
$text['button-stop-rec']['zh-cn'] = "停止记录";
$text['button-stop-rec']['ja-jp'] = "記録の停止";
$text['button-stop-rec']['ko-kr'] = "기록 중지";
@ -1262,7 +1310,7 @@ $text['button-start-rec']['fr-fr'] = "Commencer l'Enregistrement";
$text['button-start-rec']['he-il'] = "התחל להקליט";
$text['button-start-rec']['it-it'] = "Avvia Registrazione";
$text['button-start-rec']['ka-ge'] = "ჩაწერის დაწყება";
$text['button-start-rec']['nl-nl'] = "Start opname";
$text['button-start-rec']['nl-nl'] = "Startrecord";
$text['button-start-rec']['pl-pl'] = "Początek nagrywania";
$text['button-start-rec']['pt-br'] = "Iniciar gravação";
$text['button-start-rec']['pt-pt'] = "Começar gravação";
@ -1270,6 +1318,7 @@ $text['button-start-rec']['ro-ro'] = "Începeți înregistrarea";
$text['button-start-rec']['ru-ru'] = "Включить запись";
$text['button-start-rec']['sv-se'] = "Starta Inspelning";
$text['button-start-rec']['uk-ua'] = "Записувати";
$text['button-start-rec']['tr-tr'] = "Kaydı Başlat";
$text['button-start-rec']['zh-cn'] = "开始录制";
$text['button-start-rec']['ja-jp'] = "記録開始";
$text['button-start-rec']['ko-kr'] = "기록 시작";

View File

@ -144,7 +144,7 @@
echo " <td>".escape($conference_extension)."</td>\n";
echo " <td>".escape($participant_pin)."</td>\n";
echo " <td class='center'>".escape($member_count)."</td>\n";
if (permission_exists('conference_interactive_view') && !empty($_SESSION['theme']['list_row_edit_button']['boolean']) && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('conference_interactive_view') && filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-view'],'icon'=>$_SESSION['theme']['button_icon_view'],'link'=>$list_row_url]);
echo " </td>\n";

View File

@ -21,6 +21,7 @@ $text['title-database_transactions']['pt-pt'] = "Transações de Banco de Dados"
$text['title-database_transactions']['ro-ro'] = "Tranzacții cu baze de date";
$text['title-database_transactions']['ru-ru'] = "Изменения в базе данных";
$text['title-database_transactions']['sv-se'] = "Databas Transaktioner";
$text['title-database_transactions']['tr-tr'] = "Veritabanı İşlemleri";
$text['title-database_transactions']['uk-ua'] = "Трансакції бази даних";
$text['title-database_transactions']['zh-cn'] = "数据库事务";
$text['title-database_transactions']['ja-jp'] = "データベース トランザクション";
@ -37,7 +38,7 @@ $text['title-database_transaction']['es-cl'] = "Transacción de bases de datos";
$text['title-database_transaction']['es-mx'] = "Transacción de bases de datos";
$text['title-database_transaction']['fr-ca'] = "Transactions de base de données";
$text['title-database_transaction']['fr-fr'] = "Transactions de base de données";
$text['title-database_transaction']['he-il'] = "Database";
$text['title-database_transaction']['he-il'] = "עסקאות במסד נתונים";
$text['title-database_transaction']['it-it'] = "Transazione del database";
$text['title-database_transaction']['ka-ge'] = "მონაცემთა ბაზის ტრანზაქცია";
$text['title-database_transaction']['nl-nl'] = "Database transactie";
@ -48,6 +49,7 @@ $text['title-database_transaction']['ro-ro'] = "Tranzacție cu baze de date";
$text['title-database_transaction']['ru-ru'] = "Изменение в базе данных";
$text['title-database_transaction']['sv-se'] = "Transaktionsdatabas";
$text['title-database_transaction']['uk-ua'] = "Трансакція бази даних";
$text['title-database_transaction']['tr-tr'] = "Veritabanı İşlemi";
$text['title-database_transaction']['zh-cn'] = "数据库事务";
$text['title-database_transaction']['ja-jp'] = "データベース トランザクション";
$text['title-database_transaction']['ko-kr'] = "데이터베이스 트랜잭션";
@ -74,6 +76,7 @@ $text['description-database_transactions']['ro-ro'] = "Urmăriți modificările
$text['description-database_transactions']['ru-ru'] = "Отслеживайте изменения в базе данных. Отслеживайте время внесения изменений, пользователя и адрес пользователя, внесшего изменения. Предоставьте возможность отменить удаление и обновление транзакций.";
$text['description-database_transactions']['sv-se'] = "Spåra ändringar i databasen. Spåra när ändringarna gjordes, användaren och adressen till användaren som gjorde ändringarna. Ge ett alternativ för att ångra radering och uppdatering av transaktioner.";
$text['description-database_transactions']['uk-ua'] = "Відстежуйте зміни до бази даних. Відстежуйте, коли внесені зміни, користувач та адреса користувача, який вніс зміни. Забезпечити варіант видалення та оновлення транзакцій.";
$text['description-database_transactions']['tr-tr'] = "Veritabanındaki değişiklikleri izleyin. Değişikliklerin ne zaman yapıldığını, değişiklikleri yapan kullanıcının kullanıcısını ve adresini izleyin. İşlemleri silme ve güncellemeyi geri alma seçeneği sağlayın.";
$text['description-database_transactions']['zh-cn'] = "跟踪对数据库的更改。 跟踪进行更改的时间、进行更改的用户和地址。 提供撤消删除和更新事务的选项。";
$text['description-database_transactions']['ja-jp'] = "データベースへの変更を追跡します。 変更がいつ行われたか、変更を行ったユーザーのユーザーとアドレスを追跡します。 トランザクションの削除と更新を元に戻すオプションを提供します。";
$text['description-database_transactions']['ko-kr'] = "데이터베이스에 대한 변경 사항을 추적합니다. 변경된 시기, 사용자 및 변경한 사용자의 주소를 추적합니다. 트랜잭션 삭제 및 업데이트를 실행 취소하는 옵션을 제공합니다.";
@ -100,6 +103,7 @@ $text['label-user']['ro-ro'] = "Utilizator";
$text['label-user']['ru-ru'] = "Пользователь";
$text['label-user']['sv-se'] = "Användare";
$text['label-user']['uk-ua'] = "Користувач";
$text['label-user']['tr-tr'] = "Kullanıcı";
$text['label-user']['zh-cn'] = "用户";
$text['label-user']['ja-jp'] = "ユーザー";
$text['label-user']['ko-kr'] = "사용자";
@ -126,6 +130,7 @@ $text['label-user_uuid']['ro-ro'] = "Utilizator";
$text['label-user_uuid']['ru-ru'] = "Пользователь";
$text['label-user_uuid']['sv-se'] = "Användare";
$text['label-user_uuid']['uk-ua'] = "Користувач";
$text['label-user_uuid']['tr-tr'] = "kullanıcı";
$text['label-user_uuid']['zh-cn'] = "用户";
$text['label-user_uuid']['ja-jp'] = "ユーザー";
$text['label-user_uuid']['ko-kr'] = "사용자";
@ -152,6 +157,7 @@ $text['description-user_uuid']['ro-ro'] = "Tranzacția utilizatorului.";
$text['description-user_uuid']['ru-ru'] = "Транзакции пользователя.";
$text['description-user_uuid']['sv-se'] = "Användar transaktion";
$text['description-user_uuid']['uk-ua'] = "Операція користувача.";
$text['description-user_uuid']['tr-tr'] = "Kullanıcı işlemi.";
$text['description-user_uuid']['zh-cn'] = "用户交易。";
$text['description-user_uuid']['ja-jp'] = "ユーザー取引。";
$text['description-user_uuid']['ko-kr'] = "사용자 거래.";
@ -167,7 +173,7 @@ $text['label-app_name']['es-cl'] = "Aplicación";
$text['label-app_name']['es-mx'] = "Aplicación";
$text['label-app_name']['fr-ca'] = "Application";
$text['label-app_name']['fr-fr'] = "Application";
$text['label-app_name']['he-il'] = "יישום";
$text['label-app_name']['he-il'] = "בַּקָשָׁה";
$text['label-app_name']['it-it'] = "Applicazione";
$text['label-app_name']['ka-ge'] = "აპლიკაცია";
$text['label-app_name']['nl-nl'] = "Applicatie";
@ -178,6 +184,7 @@ $text['label-app_name']['ro-ro'] = "Aplicație";
$text['label-app_name']['ru-ru'] = "Приложение";
$text['label-app_name']['sv-se'] = "Applikation";
$text['label-app_name']['uk-ua'] = "Додаток";
$text['label-app_name']['tr-tr'] = "Başvuru";
$text['label-app_name']['zh-cn'] = "应用";
$text['label-app_name']['ja-jp'] = "応用";
$text['label-app_name']['ko-kr'] = "애플리케이션";
@ -193,7 +200,7 @@ $text['description-app_name']['es-cl'] = "Nombre de aplicación.";
$text['description-app_name']['es-mx'] = "Nombre de aplicación.";
$text['description-app_name']['fr-ca'] = "Nom de l'application";
$text['description-app_name']['fr-fr'] = "Nom de l'application";
$text['description-app_name']['he-il'] = "שם הבקשה";
$text['description-app_name']['he-il'] = "שם האפליקציה.";
$text['description-app_name']['it-it'] = "Nome dell'applicazione.";
$text['description-app_name']['ka-ge'] = "აპლიკაციის სახელი.";
$text['description-app_name']['nl-nl'] = "Applicatie naam.";
@ -204,6 +211,7 @@ $text['description-app_name']['ro-ro'] = "Numele aplicatiei.";
$text['description-app_name']['ru-ru'] = "Имя приложения.";
$text['description-app_name']['sv-se'] = "Applikation namn";
$text['description-app_name']['uk-ua'] = "Назва заявки.";
$text['description-app_name']['tr-tr'] = "Uygulama adı.";
$text['description-app_name']['zh-cn'] = "应用名称。";
$text['description-app_name']['ja-jp'] = "アプリケーション名。";
$text['description-app_name']['ko-kr'] = "애플리케이션 이름.";
@ -219,7 +227,7 @@ $text['label-app_uuid']['es-cl'] = "Aplicación Id";
$text['label-app_uuid']['es-mx'] = "Aplicación Id";
$text['label-app_uuid']['fr-ca'] = "ID d'application";
$text['label-app_uuid']['fr-fr'] = "ID d'application";
$text['label-app_uuid']['he-il'] = "יישום Id";
$text['label-app_uuid']['he-il'] = "מזהה אפליקציה";
$text['label-app_uuid']['it-it'] = "Applicazione";
$text['label-app_uuid']['ka-ge'] = "აპლიკაციის ID";
$text['label-app_uuid']['nl-nl'] = "Applicatie ID.";
@ -230,6 +238,7 @@ $text['label-app_uuid']['ro-ro'] = "Id. aplicație";
$text['label-app_uuid']['ru-ru'] = "Id приложения";
$text['label-app_uuid']['sv-se'] = "Applikation Id.";
$text['label-app_uuid']['uk-ua'] = "Додаток Id";
$text['label-app_uuid']['tr-tr'] = "Uygulama Kimliği";
$text['label-app_uuid']['zh-cn'] = "申请编号";
$text['label-app_uuid']['ja-jp'] = "アプリケーションID";
$text['label-app_uuid']['ko-kr'] = "애플리케이션 ID";
@ -245,7 +254,7 @@ $text['description-app_uuid']['es-cl'] = "Nombre de aplicación.";
$text['description-app_uuid']['es-mx'] = "Nombre de aplicación.";
$text['description-app_uuid']['fr-ca'] = "Nom de l'application";
$text['description-app_uuid']['fr-fr'] = "Nom de l'application";
$text['description-app_uuid']['he-il'] = "שם הבקשה";
$text['description-app_uuid']['he-il'] = "שם האפליקציה.";
$text['description-app_uuid']['it-it'] = "Nome dell'applicazione.";
$text['description-app_uuid']['ka-ge'] = "აპლიკაციის სახელი.";
$text['description-app_uuid']['nl-nl'] = "Applicatie naam.";
@ -256,6 +265,7 @@ $text['description-app_uuid']['ro-ro'] = "Numele aplicatiei.";
$text['description-app_uuid']['ru-ru'] = "Имя приложения.";
$text['description-app_uuid']['sv-se'] = "Applikation namn.";
$text['description-app_uuid']['uk-ua'] = "Назва заявки.";
$text['description-app_uuid']['tr-tr'] = "Uygulama adı.";
$text['description-app_uuid']['zh-cn'] = "应用名称。";
$text['description-app_uuid']['ja-jp'] = "アプリケーション名。";
$text['description-app_uuid']['ko-kr'] = "애플리케이션 이름.";
@ -271,7 +281,7 @@ $text['label-transaction_code']['es-cl'] = "Código";
$text['label-transaction_code']['es-mx'] = "Código";
$text['label-transaction_code']['fr-ca'] = "Code";
$text['label-transaction_code']['fr-fr'] = "Code";
$text['label-transaction_code']['he-il'] = "קודקוד";
$text['label-transaction_code']['he-il'] = "קוד";
$text['label-transaction_code']['it-it'] = "Codice";
$text['label-transaction_code']['ka-ge'] = "კოდი";
$text['label-transaction_code']['nl-nl'] = "Code";
@ -282,6 +292,7 @@ $text['label-transaction_code']['ro-ro'] = "Cod";
$text['label-transaction_code']['ru-ru'] = "Код";
$text['label-transaction_code']['sv-se'] = "Kod";
$text['label-transaction_code']['uk-ua'] = "Коди";
$text['label-transaction_code']['tr-tr'] = "Kod";
$text['label-transaction_code']['zh-cn'] = "代码";
$text['label-transaction_code']['ja-jp'] = "コード";
$text['label-transaction_code']['ko-kr'] = "암호";
@ -308,6 +319,7 @@ $text['description-transaction_code']['ro-ro'] = "Cod de tranzacție.";
$text['description-transaction_code']['ru-ru'] = "Код транзакции.";
$text['description-transaction_code']['sv-se'] = "Transaktion kod.";
$text['description-transaction_code']['uk-ua'] = "Код транзакції.";
$text['description-transaction_code']['tr-tr'] = "İşlem kodu.";
$text['description-transaction_code']['zh-cn'] = "交易代码。";
$text['description-transaction_code']['ja-jp'] = "取引コード。";
$text['description-transaction_code']['ko-kr'] = "트랜잭션 코드.";
@ -334,6 +346,7 @@ $text['label-transaction_address']['ro-ro'] = "Adresa IP";
$text['label-transaction_address']['ru-ru'] = "IP Адреса";
$text['label-transaction_address']['sv-se'] = "IP Address";
$text['label-transaction_address']['uk-ua'] = "IP-адреса";
$text['label-transaction_address']['tr-tr'] = "IP Adresi";
$text['label-transaction_address']['zh-cn'] = "IP地址";
$text['label-transaction_address']['ja-jp'] = "IPアドレス";
$text['label-transaction_address']['ko-kr'] = "IP 주소";
@ -360,6 +373,7 @@ $text['description-transaction_address']['ro-ro'] = "adresa IP a utilizatorului.
$text['description-transaction_address']['ru-ru'] = "IP адреса пользователя.";
$text['description-transaction_address']['sv-se'] = "Användarens IP Address";
$text['description-transaction_address']['uk-ua'] = "IP-адреса користувача.";
$text['description-transaction_address']['tr-tr'] = "Kullanıcının IP adresi.";
$text['description-transaction_address']['zh-cn'] = "用户的 IP 地址。";
$text['description-transaction_address']['ja-jp'] = "ユーザーの IP アドレス。。";
$text['description-transaction_address']['ko-kr'] = "사용자의 IP 주소입니다.";
@ -375,7 +389,7 @@ $text['label-transaction_type']['es-cl'] = "Tipo";
$text['label-transaction_type']['es-mx'] = "Tipo";
$text['label-transaction_type']['fr-ca'] = "Type";
$text['label-transaction_type']['fr-fr'] = "Type";
$text['label-transaction_type']['he-il'] = "סוג";
$text['label-transaction_type']['he-il'] = "סוּג";
$text['label-transaction_type']['it-it'] = "Tipo";
$text['label-transaction_type']['ka-ge'] = "ტიპი";
$text['label-transaction_type']['nl-nl'] = "Type";
@ -386,6 +400,7 @@ $text['label-transaction_type']['ro-ro'] = "Tip";
$text['label-transaction_type']['ru-ru'] = "Тип";
$text['label-transaction_type']['sv-se'] = "Typ";
$text['label-transaction_type']['uk-ua'] = "Тип";
$text['label-transaction_type']['tr-tr'] = "Tip";
$text['label-transaction_type']['zh-cn'] = "类型";
$text['label-transaction_type']['ja-jp'] = "タイプ";
$text['label-transaction_type']['ko-kr'] = "유형";
@ -393,9 +408,9 @@ $text['label-transaction_type']['ko-kr'] = "유형";
$text['description-transaction_type']['en-us'] = "Type: add, update, delete";
$text['description-transaction_type']['en-gb'] = "Type: add, update, delete";
$text['description-transaction_type']['ar-eg'] = "النوع: إضافة، تحديث، حذف";
$text['description-transaction_type']['de-at'] = "Typ: add, update, delete";
$text['description-transaction_type']['de-ch'] = "Typ: add, update, delete";
$text['description-transaction_type']['de-de'] = "Typ: add, update, delete";
$text['description-transaction_type']['de-at'] = "Typ: hinzufügen, aktualisieren, löschen";
$text['description-transaction_type']['de-ch'] = "Typ: hinzufügen, aktualisieren, löschen";
$text['description-transaction_type']['de-de'] = "Typ: hinzufügen, aktualisieren, löschen";
$text['description-transaction_type']['el-gr'] = "Τύπος: προσθήκη, ενημέρωση, διαγραφή";
$text['description-transaction_type']['es-cl'] = "Tipo: añadir, actualizar, eliminar";
$text['description-transaction_type']['es-mx'] = "Tipo: añadir, actualizar, eliminar";
@ -412,6 +427,7 @@ $text['description-transaction_type']['ro-ro'] = "Tip: adăugați, actualizați,
$text['description-transaction_type']['ru-ru'] = "Тип: добавить, обновить, удалить";
$text['description-transaction_type']['sv-se'] = "Typ: lägg till, ändra, ta bort, välj";
$text['description-transaction_type']['uk-ua'] = "Тип: додати, оновити, видалити";
$text['description-transaction_type']['tr-tr'] = "Tür: ekle, güncelle, sil";
$text['description-transaction_type']['zh-cn'] = "类型:添加、更新、删除";
$text['description-transaction_type']['ja-jp'] = "タイプ: 追加、更新、削除";
$text['description-transaction_type']['ko-kr'] = "유형: 추가, 업데이트, 삭제";
@ -438,6 +454,7 @@ $text['label-transaction_date']['ro-ro'] = "Data";
$text['label-transaction_date']['ru-ru'] = "Дата";
$text['label-transaction_date']['sv-se'] = "Datum";
$text['label-transaction_date']['uk-ua'] = "Дата";
$text['label-transaction_date']['tr-tr'] = "Tarih";
$text['label-transaction_date']['zh-cn'] = "日期";
$text['label-transaction_date']['ja-jp'] = "日にち";
$text['label-transaction_date']['ko-kr'] = "날짜";
@ -464,6 +481,7 @@ $text['description-transaction_date']['ro-ro'] = "Data tranzacției.";
$text['description-transaction_date']['ru-ru'] = "Дата транзакции.";
$text['description-transaction_date']['sv-se'] = "Transaktions datum.";
$text['description-transaction_date']['uk-ua'] = "Дата операції.";
$text['description-transaction_date']['tr-tr'] = "İşlem tarihi.";
$text['description-transaction_date']['zh-cn'] = "交易日期。";
$text['description-transaction_date']['ja-jp'] = "取引日。";
$text['description-transaction_date']['ko-kr'] = "거래 날짜.";
@ -490,6 +508,7 @@ $text['label-transaction_old']['ro-ro'] = "Inainte de";
$text['label-transaction_old']['ru-ru'] = "До";
$text['label-transaction_old']['sv-se'] = "Före";
$text['label-transaction_old']['uk-ua'] = "До";
$text['label-transaction_old']['tr-tr'] = "Önce";
$text['label-transaction_old']['zh-cn'] = "";
$text['label-transaction_old']['ja-jp'] = "";
$text['label-transaction_old']['ko-kr'] = "전에";
@ -505,7 +524,7 @@ $text['description-transaction_old']['es-cl'] = "Array antes de la transacción.
$text['description-transaction_old']['es-mx'] = "Array antes de la transacción.";
$text['description-transaction_old']['fr-ca'] = "Tableau avant la transaction";
$text['description-transaction_old']['fr-fr'] = "Tableau avant la transaction";
$text['description-transaction_old']['he-il'] = "לפני העסקה";
$text['description-transaction_old']['he-il'] = "מערך לפני העסקה.";
$text['description-transaction_old']['it-it'] = "Array prima della transazione.";
$text['description-transaction_old']['ka-ge'] = "მასივი ტრანზაქციამდე.";
$text['description-transaction_old']['nl-nl'] = "Tabel voor de transactie.";
@ -516,6 +535,7 @@ $text['description-transaction_old']['ro-ro'] = "Matrice înainte de tranzacție
$text['description-transaction_old']['ru-ru'] = "Массив перед транзакцией.";
$text['description-transaction_old']['sv-se'] = "Array före transaktionen.";
$text['description-transaction_old']['uk-ua'] = "Проти операції.";
$text['description-transaction_old']['tr-tr'] = "İşlemden önceki dizi.";
$text['description-transaction_old']['zh-cn'] = "交易前的数组。";
$text['description-transaction_old']['ja-jp'] = "トランザクション前の配列。";
$text['description-transaction_old']['ko-kr'] = "거래 전 배열.";
@ -542,6 +562,7 @@ $text['label-transaction_new']['ro-ro'] = "După";
$text['label-transaction_new']['ru-ru'] = "После";
$text['label-transaction_new']['sv-se'] = "Efter";
$text['label-transaction_new']['uk-ua'] = "Після";
$text['label-transaction_new']['tr-tr'] = "Sonrasında";
$text['label-transaction_new']['zh-cn'] = "";
$text['label-transaction_new']['ja-jp'] = "";
$text['label-transaction_new']['ko-kr'] = "후에";
@ -568,6 +589,7 @@ $text['description-transaction_new']['ro-ro'] = "Matrice după tranzacție.";
$text['description-transaction_new']['ru-ru'] = "Массив после транзакции.";
$text['description-transaction_new']['sv-se'] = "Array efter transaktionen.";
$text['description-transaction_new']['uk-ua'] = "Проводити після операції.";
$text['description-transaction_new']['tr-tr'] = "İşlem sonrası dizi.";
$text['description-transaction_new']['zh-cn'] = "交易后的数组。";
$text['description-transaction_new']['ja-jp'] = "トランザクション後の配列。";
$text['description-transaction_new']['ko-kr'] = "트랜잭션 후 배열.";
@ -594,6 +616,7 @@ $text['label-transaction_result']['ro-ro'] = "Rezultat";
$text['label-transaction_result']['ru-ru'] = "Результат.";
$text['label-transaction_result']['sv-se'] = "Resultat";
$text['label-transaction_result']['uk-ua'] = "Почати";
$text['label-transaction_result']['tr-tr'] = "Sonuç";
$text['label-transaction_result']['zh-cn'] = "结果";
$text['label-transaction_result']['ja-jp'] = "結果";
$text['label-transaction_result']['ko-kr'] = "결과";
@ -620,6 +643,7 @@ $text['description-transaction_result']['ro-ro'] = "Rezultatul tranzacției.";
$text['description-transaction_result']['ru-ru'] = "Результат транзакции.";
$text['description-transaction_result']['sv-se'] = "Resultat av transaktionen.";
$text['description-transaction_result']['uk-ua'] = "Результат операції.";
$text['description-transaction_result']['tr-tr'] = "İşlemin sonucu.";
$text['description-transaction_result']['zh-cn'] = "交易的结果。";
$text['description-transaction_result']['ja-jp'] = "トランザクションの結果。";
$text['description-transaction_result']['ko-kr'] = "거래 결과.";
@ -635,7 +659,7 @@ $text['label-true']['es-cl'] = "verdadero";
$text['label-true']['es-mx'] = "verdadero";
$text['label-true']['fr-ca'] = "Vrai";
$text['label-true']['fr-fr'] = "Vrai";
$text['label-true']['he-il'] = "אמת אמיתית";
$text['label-true']['he-il'] = "נָכוֹן";
$text['label-true']['it-it'] = "vero";
$text['label-true']['ka-ge'] = "ჭეშმარიტი";
$text['label-true']['nl-nl'] = "waar";
@ -646,6 +670,7 @@ $text['label-true']['ro-ro'] = "Adevărat";
$text['label-true']['ru-ru'] = "Да";
$text['label-true']['sv-se'] = "sann";
$text['label-true']['uk-ua'] = "Справді";
$text['label-true']['tr-tr'] = "doğru";
$text['label-true']['zh-cn'] = "真的";
$text['label-true']['ja-jp'] = "真実";
$text['label-true']['ko-kr'] = "진실";
@ -661,7 +686,7 @@ $text['label-false']['es-cl'] = "falso";
$text['label-false']['es-mx'] = "falso";
$text['label-false']['fr-ca'] = "Faux";
$text['label-false']['fr-fr'] = "Faux";
$text['label-false']['he-il'] = "שקר כוזב";
$text['label-false']['he-il'] = "שֶׁקֶר";
$text['label-false']['it-it'] = "falso";
$text['label-false']['ka-ge'] = "ცრუ";
$text['label-false']['nl-nl'] = "onwaar";
@ -672,6 +697,7 @@ $text['label-false']['ro-ro'] = "fals";
$text['label-false']['ru-ru'] = "Нет";
$text['label-false']['sv-se'] = "falsk";
$text['label-false']['uk-ua'] = "Логін";
$text['label-false']['tr-tr'] = "YANLIŞ";
$text['label-false']['zh-cn'] = "错误的";
$text['label-false']['ja-jp'] = "間違い";
$text['label-false']['ko-kr'] = "거짓";
@ -698,6 +724,7 @@ $text['button-add']['ro-ro'] = "Adăuga";
$text['button-add']['ru-ru'] = "Добавить";
$text['button-add']['sv-se'] = "Lägg Till";
$text['button-add']['uk-ua'] = "Додати";
$text['button-add']['tr-tr'] = "Eklemek";
$text['button-add']['zh-cn'] = "添加";
$text['button-add']['ja-jp'] = "追加";
$text['button-add']['ko-kr'] = "추가하다";
@ -724,6 +751,7 @@ $text['button-edit']['ro-ro'] = "Editați";
$text['button-edit']['ru-ru'] = "Редактировать";
$text['button-edit']['sv-se'] = "Ändra";
$text['button-edit']['uk-ua'] = "Редагування";
$text['button-edit']['tr-tr'] = "Düzenlemek";
$text['button-edit']['zh-cn'] = "编辑";
$text['button-edit']['ja-jp'] = "編集";
$text['button-edit']['ko-kr'] = "편집하다";
@ -750,6 +778,7 @@ $text['button-delete']['ro-ro'] = "Șterge";
$text['button-delete']['ru-ru'] = "Удалить";
$text['button-delete']['sv-se'] = "Ta Bort";
$text['button-delete']['uk-ua'] = "Делет";
$text['button-delete']['tr-tr'] = "Silmek";
$text['button-delete']['zh-cn'] = "删除";
$text['button-delete']['ja-jp'] = "消去";
$text['button-delete']['ko-kr'] = "삭제";
@ -776,6 +805,7 @@ $text['button-save']['ro-ro'] = "Salvați";
$text['button-save']['ru-ru'] = "Сохранить";
$text['button-save']['sv-se'] = "Spara";
$text['button-save']['uk-ua'] = "Зберегти";
$text['button-save']['tr-tr'] = "Kaydetmek";
$text['button-save']['zh-cn'] = "节省";
$text['button-save']['ja-jp'] = "保存";
$text['button-save']['ko-kr'] = "구하다";
@ -802,6 +832,7 @@ $text['button-view']['ro-ro'] = "Vedere";
$text['button-view']['ru-ru'] = "Просмотрт";
$text['button-view']['sv-se'] = "Visa";
$text['button-view']['uk-ua'] = "Переглянути";
$text['button-view']['tr-tr'] = "Görüş";
$text['button-view']['zh-cn'] = "看法";
$text['button-view']['ja-jp'] = "意見";
$text['button-view']['ko-kr'] = "보다";
@ -827,7 +858,8 @@ $text['button-back']['pt-pt'] = "Voltar";
$text['button-back']['ro-ro'] = "Înapoi";
$text['button-back']['ru-ru'] = "Назад";
$text['button-back']['sv-se'] = "Tillbaka";
$text['button-back']['uk-ua'] = "Зареєструватися";
$text['button-back']['uk-ua'] = "Назад";
$text['button-back']['tr-tr'] = "Geri";
$text['button-back']['zh-cn'] = "后退";
$text['button-back']['ja-jp'] = "戻る";
$text['button-back']['ko-kr'] = "뒤쪽에";
@ -854,6 +886,7 @@ $text['confirm-delete']['ro-ro'] = "Chiar vrei să ștergi asta?";
$text['confirm-delete']['ru-ru'] = "Вы действительно хотите удалить это?";
$text['confirm-delete']['sv-se'] = "Vill du verkligen ta bort detta?";
$text['confirm-delete']['uk-ua'] = "Ви дійсно хочете видалити це?";
$text['confirm-delete']['tr-tr'] = "Bunu gerçekten silmek istiyor musunuz?";
$text['confirm-delete']['zh-cn'] = "您真的要删除它吗?";
$text['confirm-delete']['ja-jp'] = "本当にこれを削除しますか?";
$text['confirm-delete']['ko-kr'] = "정말 삭제하시겠습니까?";
@ -880,6 +913,7 @@ $text['message-add']['ro-ro'] = "Adăugați finalizat";
$text['message-add']['ru-ru'] = "Добавление выполнено";
$text['message-add']['sv-se'] = "Tillagd";
$text['message-add']['uk-ua'] = "Додати завершено";
$text['message-add']['tr-tr'] = "Tamamlandı Ekle";
$text['message-add']['zh-cn'] = "添加完成";
$text['message-add']['ja-jp'] = "追加完了";
$text['message-add']['ko-kr'] = "추가완료";
@ -906,6 +940,7 @@ $text['message-update']['ro-ro'] = "Actualizare finalizată";
$text['message-update']['ru-ru'] = "Обновление выполнено";
$text['message-update']['sv-se'] = "Ändring utförd";
$text['message-update']['uk-ua'] = "Оновлення завершено";
$text['message-update']['tr-tr'] = "Güncelleme Tamamlandı";
$text['message-update']['zh-cn'] = "更新完成";
$text['message-update']['ja-jp'] = "アップデート完了";
$text['message-update']['ko-kr'] = "업데이트 완료";
@ -932,6 +967,7 @@ $text['message-delete']['ro-ro'] = "Ștergere finalizată";
$text['message-delete']['ru-ru'] = "Удаление выполнено";
$text['message-delete']['sv-se'] = "Borttagning utförd";
$text['message-delete']['uk-ua'] = "Видалити завершено";
$text['message-delete']['tr-tr'] = "Sil Tamamlandı";
$text['message-delete']['zh-cn'] = "删除完成";
$text['message-delete']['ja-jp'] = "削除完了";
$text['message-delete']['ko-kr'] = "삭제 완료";
@ -958,6 +994,7 @@ $text['message-required']['ro-ro'] = "Vă rugăm să oferiți:";
$text['message-required']['ru-ru'] = "Пожалуйста предоставьте:";
$text['message-required']['sv-se'] = "Var god ange: ";
$text['message-required']['uk-ua'] = "Будь ласка, заповніть:";
$text['message-required']['tr-tr'] = "Lütfen şunları sağlayın:";
$text['message-required']['zh-cn'] = "请提供:";
$text['message-required']['ja-jp'] = "どうか提供してください:";
$text['message-required']['ko-kr'] = "제공 부탁드립니다:";

View File

@ -51,7 +51,7 @@
$order = $_GET["order"] ?? '';
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
$button_icon_view = !empty($_SESSION['theme']['button_icon_view']) ? $_SESSION['theme']['button_icon_view'] : '';
//add the user filter and search term
@ -187,7 +187,7 @@
echo th_order_by('transaction_address', $text['label-transaction_address'], $order_by, $order);
echo th_order_by('transaction_type', $text['label-transaction_type'], $order_by, $order);
echo th_order_by('transaction_date', $text['label-transaction_date'], $order_by, $order);
if (permission_exists('database_transaction_edit') && !empty($list_row_edit_button) && $list_row_edit_button == 'true') {
if (permission_exists('database_transaction_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -195,8 +195,12 @@
$x = 0;
foreach($transactions as $row) {
if (empty($row['domain_name'])) { $row['domain_name'] = $text['label-global']; }
$list_row_url = '';
if (permission_exists('database_transaction_edit')) {
$list_row_url = "database_transaction_edit.php?id=".urlencode($row['database_transaction_uuid']).(!empty($page) ? "&page=".urlencode($page) : null).(!empty($search) ? "&search=".urlencode($search) : null);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
echo " <td>".escape($row['domain_name'])."&nbsp;</td>\n";
@ -206,7 +210,7 @@
echo " <td>".escape($row['transaction_address'])."&nbsp;</td>\n";
echo " <td>".escape($row['transaction_type'])."&nbsp;</td>\n";
echo " <td>".escape($row['transaction_date'])."&nbsp;</td>\n";
if (permission_exists('database_transaction_edit') && !empty($list_row_edit_button) && $list_row_edit_button == 'true') {
if (permission_exists('database_transaction_edit') && $list_row_edit_button) {
echo " <td class='action-button'>\n";
echo button::create(['type'=>'button','title'=>$text['button-view'],'icon'=>$_SESSION['theme']['button_icon_view'],'link'=>$list_row_url]);
echo " </td>\n";
@ -225,3 +229,4 @@
require_once "resources/footer.php";
?>

View File

@ -167,6 +167,10 @@
$y++;
$apps[$x]['permissions'][$y]['name'] = "destination_local";
$y++;
$apps[$x]['permissions'][$y]['name'] = "destination_email";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$y++;
//default settings
$y = 0;
@ -397,6 +401,10 @@
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "Enter the description.";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "destination_email";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "Select whether to send email notifications of incoming SMS/MMS messages";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "insert_date";
$apps[$x]['db'][$y]['fields'][$z]['type']['pgsql'] = 'timestamptz';
$apps[$x]['db'][$y]['fields'][$z]['type']['sqlite'] = 'date';

View File

@ -83,7 +83,7 @@ if ($domains_processed == 1) {
//save to the data
if (!empty($array)) {
//add temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('destination_edit', 'temp');
//create the database object and save the data
@ -109,7 +109,7 @@ if ($domains_processed == 1) {
if (!empty($array)) {
//add temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('destination_edit', 'temp');
//create the database object and save the data

View File

@ -1162,6 +1162,33 @@ $text['label-destination_conditions']['zh-cn'] = "状况";
$text['label-destination_conditions']['ja-jp'] = "条件";
$text['label-destination_conditions']['ko-kr'] = "정황";
$text['label-destination_email']['en-us'] = "Email Notifications";
$text['label-destination_email']['en-gb'] = "Email Notifications";
$text['label-destination_email']['ar-eg'] = "إشعارات البريد الإلكتروني";
$text['label-destination_email']['de-at'] = "E-Mail-Benachrichtigungen";
$text['label-destination_email']['de-ch'] = "E-Mail-Benachrichtigungen";
$text['label-destination_email']['de-de'] = "E-Mail-Benachrichtigungen";
$text['label-destination_email']['el-gr'] = "Ειδοποιήσεις μέσω ηλεκτρονικού ταχυδρομείου";
$text['label-destination_email']['es-cl'] = "Notificaciones por correo electrónico";
$text['label-destination_email']['es-mx'] = "Notificaciones por correo electrónico";
$text['label-destination_email']['fr-ca'] = "Notifications par courriel";
$text['label-destination_email']['fr-fr'] = "Notifications par e-mail";
$text['label-destination_email']['he-il'] = "התראות דוא\"ל";
$text['label-destination_email']['it-it'] = "Notifiche via email";
$text['label-destination_email']['ka-ge'] = "ელ.ფოსტით შეტყობინებები";
$text['label-destination_email']['nl-nl'] = "E-mailmeldingen";
$text['label-destination_email']['pl-pl'] = "Powiadomienia e-mail";
$text['label-destination_email']['pt-br'] = "Notificações por e-mail";
$text['label-destination_email']['pt-pt'] = "Notificações por e-mail";
$text['label-destination_email']['ro-ro'] = "Notificări prin e-mail";
$text['label-destination_email']['ru-ru'] = "Уведомления по электронной почте";
$text['label-destination_email']['sv-se'] = "E-postmeddelanden";
$text['label-destination_email']['uk-ua'] = "Повідомлення електронною поштою";
$text['label-destination_email']['tr-tr'] = "E-posta Bildirimleri";
$text['label-destination_email']['zh-cn'] = "邮件通知";
$text['label-destination_email']['ja-jp'] = "メール通知";
$text['label-destination_email']['ko-kr'] = "이메일 알림";
$text['option-caller_id_number']['en-us'] = "Caller ID Number";
$text['option-caller_id_number']['en-gb'] = "Caller ID Number";
$text['option-caller_id_number']['ar-eg'] = "رقم المتصل";
@ -2352,6 +2379,33 @@ $text['description-usage']['zh-cn'] = "设置目的地的使用方式。";
$text['description-usage']['ja-jp'] = "宛先の使用方法を設定します。";
$text['description-usage']['ko-kr'] = "대상이 사용되는 방식을 설정합니다.";
$text['description-destination_email']['en-us'] = "Choose whether to send SMS and MMS messages to User's email";
$text['description-destination_email']['en-gb'] = "Choose whether to send SMS and MMS messages to User's email";
$text['description-destination_email']['ar-eg'] = "اختر ما إذا كنت ترغب في إرسال رسائل SMS و MMS إلى بريد المستخدم الإلكتروني";
$text['description-destination_email']['de-at'] = "Wählen Sie, ob SMS- und MMS-Nachrichten an die E-Mail des Benutzers gesendet werden sollen";
$text['description-destination_email']['de-ch'] = "Wählen Sie, ob SMS- und MMS-Nachrichten an die E-Mail des Benutzers gesendet werden sollen";
$text['description-destination_email']['de-de'] = "Wählen Sie, ob SMS- und MMS-Nachrichten an die E-Mail des Benutzers gesendet werden sollen";
$text['description-destination_email']['el-gr'] = "Επιλέξτε αν θέλετε να στείλετε μηνύματα SMS και MMS στο email του χρήστη";
$text['description-destination_email']['es-cl'] = "Elija si desea enviar mensajes SMS y MMS al correo electrónico del usuario";
$text['description-destination_email']['es-mx'] = "Elija si desea enviar mensajes SMS y MMS al correo electrónico del usuario";
$text['description-destination_email']['fr-ca'] = "Choisissez si vous souhaitez envoyer des messages SMS et MMS à l'email de l'utilisateur";
$text['description-destination_email']['fr-fr'] = "Choisissez si vous souhaitez envoyer des messages SMS et MMS à l'email de l'utilisateur";
$text['description-destination_email']['he-il'] = "בחר אם לשלוח הודעות SMS ו-MMS לדוא\"ל של המשתמש";
$text['description-destination_email']['it-it'] = "Scegli se inviare messaggi SMS e MMS all'email dell'utente";
$text['description-destination_email']['ka-ge'] = "აირჩიეთ, გსურთ თუ არა SMS და MMS შეტყობინებების გაგზავნა მომხმარებლის ელ.ფოსტაზე";
$text['description-destination_email']['nl-nl'] = "Kies of je SMS- en MMS-berichten naar de e-mail van de gebruiker wilt sturen";
$text['description-destination_email']['pl-pl'] = "Wybierz, czy chcesz wysłać wiadomości SMS i MMS na adres e-mail użytkownika";
$text['description-destination_email']['pt-br'] = "Escolha se deseja enviar mensagens SMS e MMS para o e-mail do usuário";
$text['description-destination_email']['pt-pt'] = "Escolha se deseja enviar mensagens SMS e MMS para o e-mail do usuário";
$text['description-destination_email']['ro-ro'] = "Alegeți dacă doriți să trimiteți mesaje SMS și MMS la adresa de e-mail a utilizatorului";
$text['description-destination_email']['ru-ru'] = "Выберите, хотите ли вы отправлять SMS и MMS сообщения на электронную почту пользователя";
$text['description-destination_email']['sv-se'] = "Välj om du vill skicka SMS- och MMS-meddelanden till användarens e-post";
$text['description-destination_email']['uk-ua'] = "Виберіть, чи хочете ви надсилати SMS і MMS повідомлення на електронну пошту користувача";
$text['description-destination_email']['tr-tr'] = "Kullanıcının e-posta adresine SMS ve MMS mesajları gönderilip gönderilmeyeceğini seçin";
$text['description-destination_email']['zh-cn'] = "选择是否将SMS和MMS消息发送到用户的电子邮件";
$text['description-destination_email']['ja-jp'] = "ユーザーのメールにSMSおよびMMSメッセージを送信するかどうかを選択してください";
$text['description-destination_email']['ko-kr'] = "사용자 이메일로 SMS 및 MMS 메시지를 보낼지 선택하세요";
$text['billing-warning']['en-us'] = "If you are using fusionpbx billing application, make sure to add accountcode and carrier variables.";
$text['billing-warning']['en-gb'] = "If you are using fusionpbx billing application, make sure to add accountcode and carrier variables.";
$text['billing-warning']['ar-eg'] = "إذا كنت تستخدم تطبيق فواتير الدمج، تأكد من إضافة رمز الحساب والمتغيرات الناقلة.";

View File

@ -73,4 +73,3 @@
$y++;
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2024
Portions created by the Initial Developer are Copyright (C) 2008-2025
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -41,10 +41,13 @@
$language = new text;
$text = $language->get();
//initialize the database
$database = new database;
//initialize the database object
$database = database::new();
//initialize the destinations object
//initialize the settings object
$settings = new settings(['database' => $database, 'domain_uuid' => $domain_uuid]);
//initialize the destination object
$destination = new destinations;
//initialize the ringbacks object
@ -68,17 +71,20 @@
default: $destination_type = 'inbound';
}
//get the call recording extension
$record_extension = $settings->get('call_recordings', 'record_extension', 'mp3');
//get total destination count from the database, check limit, if defined
if (!permission_exists('destination_domain')) {
if ($action == 'add') {
if (!empty($_SESSION['limit']['destinations']['numeric'])) {
if (!empty($settings->get('limit', 'destinations', ''))) {
$sql = "select count(*) from v_destinations where domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$total_destinations = $database->select($sql, $parameters, 'column');
unset($sql, $parameters);
if ($total_destinations >= $_SESSION['limit']['destinations']['numeric']) {
message::add($text['message-maximum_destinations'].' '.$_SESSION['limit']['destinations']['numeric'], 'negative');
if ($total_destinations >= $settings->get('limit', 'destinations', '')) {
message::add($text['message-maximum_destinations'].' '.$settings->get('limit', 'destinations', ''), 'negative');
header('Location: destinations.php');
exit;
}
@ -130,6 +136,7 @@
$destination_type_text = $_POST["destination_type_text"] ?? null;
$destination_type_emergency = $_POST["destination_type_emergency"] ?? null;
$destination_carrier = $_POST["destination_carrier"] ?? null;
$destination_email = $_POST["destination_email"];
//sanitize the destination conditions
if (!empty($destination_conditions)) {
@ -175,8 +182,13 @@
exit;
}
//set destination_prefix to an empty string if its empty
if (empty($destination_prefix)) {
$destination_prefix = '';
}
//prevent spaces from being considered as a valid destination_number
if (isset($destination_number)) {
if (!empty($destination_number)) {
$destination_number = trim($destination_number);
}
@ -198,11 +210,11 @@
if (empty($destination_enabled)) { $msg .= $text['message-required']." ".$text['label-destination_enabled']."<br>\n"; }
//check for duplicates
if ($destination_type == 'inbound' && $destination_number != $db_destination_number && $_SESSION['destinations']['unique']['boolean'] == 'true') {
if ($destination_type == 'inbound' && $destination_number != $db_destination_number && $settings->get('destinations', 'unique', false)) {
$sql = "select count(*) from v_destinations ";
$sql .= "where (destination_number = :destination_number or destination_prefix || destination_number = :destination_number) ";
$sql .= "and destination_type = 'inbound' ";
$parameters['destination_number'] = $destination_number;
$parameters['destination_number'] = $destination_prefix.$destination_number;
$num_rows = $database->select($sql, $parameters, 'column');
if ($num_rows > 0) {
$msg .= $text['message-duplicate']."<br>\n";
@ -314,6 +326,9 @@
if (!permission_exists('destination_domain')) {
$domain_uuid = $row["domain_uuid"] ?? null;
}
if (!permission_exists('destination_email')) {
$destination_email = $row["destination_email"] ?? null;
}
}
unset($row);
@ -444,15 +459,14 @@
if (!empty($destination_condition_field)) {
$dialplan_detail_type = $destination_condition_field;
}
elseif (!empty($_SESSION['dialplan']['destination']['text'])) {
$dialplan_detail_type = $_SESSION['dialplan']['destination']['text'];
elseif (!empty($settings->get('dialplan', 'destination', ''))) {
$dialplan_detail_type = $settings->get('dialplan', 'destination', '');
}
else {
$dialplan_detail_type = "destination_number";
}
//authorized specific dialplan_detail_type that are safe, sanitize all other values
$dialplan_detail_type = $_SESSION['dialplan']['destination']['text'];
switch ($dialplan_detail_type) {
case 'destination_number':
break;
@ -530,10 +544,11 @@
}
if (!empty($destination_record) && $destination_record == 'true') {
$dialplan["dialplan_xml"] .= " <action application=\"set\" data=\"record_path=\${recordings_dir}/\${domain_name}/archive/\${strftime(%Y)}/\${strftime(%b)}/\${strftime(%d)}\" inline=\"true\"/>\n";
$dialplan["dialplan_xml"] .= " <action application=\"set\" data=\"record_name=\${uuid}.\${record_ext}\" inline=\"true\"/>\n";
$dialplan["dialplan_xml"] .= " <action application=\"set\" data=\"record_name=\${uuid}.".$record_extension."\" inline=\"true\"/>\n";
$dialplan["dialplan_xml"] .= " <action application=\"set\" data=\"record_append=true\" inline=\"true\"/>\n";
$dialplan["dialplan_xml"] .= " <action application=\"set\" data=\"record_in_progress=true\" inline=\"true\"/>\n";
$dialplan["dialplan_xml"] .= " <action application=\"set\" data=\"recording_follow_transfer=true\" inline=\"true\"/>\n";
$dialplan["dialplan_xml"] .= " <action application=\"set\" data=\"record_stereo_swap=true\" inline=\"true\"/>\n";
$dialplan["dialplan_xml"] .= " <action application=\"record_session\" data=\"\${record_path}/\${record_name}\" inline=\"false\"/>\n";
}
if (!empty($destination_hold_music)) {
@ -592,7 +607,7 @@
$dialplan["dialplan_xml"] .= "</extension>\n";
//dialplan details
if ($_SESSION['destinations']['dialplan_details']['boolean'] == "true") {
if ($settings->get('destinations', 'dialplan_details', '')) {
//set initial value of the row id
$y=0;
@ -633,8 +648,8 @@
if (!empty($destination_condition_field)) {
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = $destination_condition_field;
}
elseif (!empty($_SESSION['dialplan']['destination']['text'])) {
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = $_SESSION['dialplan']['destination']['text'];
elseif (!empty($settings->get('dialplan', 'destination', ''))) {
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = $settings->get('dialplan', 'destination', '');
}
else {
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "regex";
@ -693,8 +708,8 @@
if (!empty($destination_condition_field)) {
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = $destination_condition_field;
}
elseif (!empty($_SESSION['dialplan']['destination']['text'])) {
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = $_SESSION['dialplan']['destination']['text'];
elseif (!empty($settings->get('dialplan', 'destination', ''))) {
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = $settings->get('dialplan', 'destination', '');
}
else {
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "destination_number";
@ -942,7 +957,7 @@
$dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid;
$dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action";
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "set";
$dialplan["dialplan_details"][$y]["dialplan_detail_data"] = "record_name=\${uuid}.\${record_ext}";
$dialplan["dialplan_details"][$y]["dialplan_detail_data"] = "record_name=\${uuid}.".$record_extension;
$dialplan["dialplan_details"][$y]["dialplan_detail_inline"] = "true";
$dialplan["dialplan_details"][$y]["dialplan_detail_group"] = $dialplan_detail_group;
$dialplan["dialplan_details"][$y]["dialplan_detail_order"] = $dialplan_detail_order;
@ -979,6 +994,20 @@
//increment the dialplan detail order
$dialplan_detail_order = $dialplan_detail_order + 10;
//add a variable
$dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid;
$dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid;
$dialplan["dialplan_details"][$y]["dialplan_detail_tag"] = "action";
$dialplan["dialplan_details"][$y]["dialplan_detail_type"] = "set";
$dialplan["dialplan_details"][$y]["dialplan_detail_data"] = "record_stereo_swap=true";
$dialplan["dialplan_details"][$y]["dialplan_detail_inline"] = "true";
$dialplan["dialplan_details"][$y]["dialplan_detail_group"] = $dialplan_detail_group;
$dialplan["dialplan_details"][$y]["dialplan_detail_order"] = $dialplan_detail_order;
$y++;
//increment the dialplan detail order
$dialplan_detail_order = $dialplan_detail_order + 10;
//add a variable
$dialplan["dialplan_details"][$y]["domain_uuid"] = $domain_uuid;
$dialplan["dialplan_details"][$y]["dialplan_uuid"] = $dialplan_uuid;
@ -1090,6 +1119,7 @@
$array['destinations'][$x]["destination_distinctive_ring"] = $destination_distinctive_ring;
}
$array['destinations'][$x]["destination_record"] = $destination_record;
$array['destinations'][$x]["destination_email"] = $destination_email;
if (!empty($destination_ringback) && $ringbacks->valid($destination_ringback)) {
$array['destinations'][$x]["destination_ringback"] = $destination_ringback;
}
@ -1139,7 +1169,7 @@
}
//add the dialplan permission
$p = new permissions;
$p = permissions::new();
$p->add("dialplan_add", 'temp');
$p->add("dialplan_detail_add", 'temp');
$p->add("dialplan_edit", 'temp');
@ -1159,10 +1189,10 @@
//clear the cache
$cache = new cache;
if ($_SESSION['destinations']['dialplan_mode']['text'] == 'multiple') {
if ($settings->get('destinations', 'dialplan_mode', '') == 'multiple') {
$cache->delete("dialplan:".$destination_context);
}
if ($_SESSION['destinations']['dialplan_mode']['text'] == 'single') {
if ($settings->get('destinations', 'dialplan_mode', '') == 'single') {
if (isset($destination_prefix) && is_numeric($destination_prefix) && isset($destination_number) && is_numeric($destination_number)) {
$cache->delete("dialplan:".$destination_context.":".$destination_prefix.$destination_number);
$cache->delete("dialplan:".$destination_context.":+".$destination_prefix.$destination_number);
@ -1270,6 +1300,7 @@
$destination_order = $destination_order ?? '';
$destination_enabled = $destination_enabled ?? '';
$destination_description = $destination_description ?? '';
$destination_email = $destination_email ?? '';
$select_style = $select_style ?? '';
//pre-populate the form
@ -1316,6 +1347,7 @@
$destination_order = $row["destination_order"];
$destination_enabled = $row["destination_enabled"];
$destination_description = $row["destination_description"];
$destination_email = $row["destination_email"];
}
unset($sql, $parameters, $row);
}
@ -1815,6 +1847,34 @@
echo "</tr>\n";
}
//destination email
if (permission_exists('destination_email') && permission_exists('message_view')) {
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-destination_email']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <select class='formfld' name='destination_email'>\n";
echo " <option value=''></option>\n";
if (!empty($destination_email) && $destination_email == "true") {
echo " <option value='true' selected='selected'>".$text['option-true']."</option>\n";
}
else {
echo " <option value='true'>".$text['option-true']."</option>\n";
}
if (!empty($destination_email) && $destination_email == "false") {
echo " <option value='false' selected='selected'>".$text['option-false']."</option>\n";
}
else {
echo " <option value='false'>".$text['option-false']."</option>\n";
}
echo " </select>\n";
echo "<br />\n";
echo $text['description-destination_email']."\n";
echo "</td>\n";
echo "</tr>\n";
}
//users
if (permission_exists('user_edit')) {
echo "<tr id='tr_user'>\n";
@ -1909,7 +1969,6 @@
echo " ".$text['label-destination_hold_music']."\n";
echo "</td>\n";
echo "<td width=\"70%\" class='vtable' align='left'>\n";
require_once "app/music_on_hold/resources/classes/switch_music_on_hold.php";
$music_on_hold = new switch_music_on_hold;
echo $music_on_hold->select('destination_hold_music', $destination_hold_music, null);
echo " <br />\n";
@ -2042,11 +2101,11 @@
//enabled
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo "<td class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-destination_enabled']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
if (substr($_SESSION['theme']['input_toggle_style']['text'], 0, 6) == 'switch') {
if (substr($settings->get('theme', 'input_toggle_style', ''), 0, 6) == 'switch') {
echo " <label class='switch'>\n";
echo " <input type='checkbox' id='destination_enabled' name='destination_enabled' value='true' ".($destination_enabled == 'true' ? "checked='checked'" : null).">\n";
echo " <span class='slider'></span>\n";

View File

@ -334,7 +334,7 @@
$array["dialplans"][$row_id]["dialplan_xml"] .= "</extension>\n";
//dialplan details
if ($_SESSION['destinations']['dialplan_details']['boolean'] == "true") {
if (filter_var($_SESSION['destinations']['dialplan_details']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
//check the destination number
$array["dialplans"][$row_id]["dialplan_details"][$y]["domain_uuid"] = $domain_uuid;

View File

@ -141,7 +141,7 @@
$order = $_GET["order"] ?? '';
//set from session variables
$list_row_edit_button = !empty($_SESSION['theme']['list_row_edit_button']['boolean']) ? $_SESSION['theme']['list_row_edit_button']['boolean'] : 'false';
$list_row_edit_button = filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL);
//prepare to page the results
$sql = "select count(*) from v_destinations ";
@ -157,6 +157,7 @@
$sql .= "and (";
$sql .= "lower(destination_type) like :search ";
$sql .= "or lower(destination_number) like :search ";
$sql .= "or lower(destination_cid_name_prefix) like :search ";
$sql .= "or lower(destination_context) like :search ";
$sql .= "or lower(destination_accountcode) like :search ";
if (permission_exists('outbound_caller_id_select')) {
@ -201,6 +202,7 @@
$sql .= " d.destination_area_code, ";
$sql .= " d.destination_number, ";
$sql .= " d.destination_actions, ";
$sql .= " d.destination_cid_name_prefix, ";
$sql .= " d.destination_context, ";
$sql .= " d.destination_caller_id_name, ";
$sql .= " d.destination_caller_id_number, ";
@ -221,6 +223,7 @@
$sql .= "and (";
$sql .= " lower(destination_type) like :search ";
$sql .= " or lower(destination_number) like :search ";
$sql .= " or lower(destination_cid_name_prefix) like :search ";
$sql .= " or lower(destination_context) like :search ";
$sql .= " or lower(destination_accountcode) like :search ";
if (permission_exists('outbound_caller_id_select')) {
@ -350,6 +353,9 @@
if (!$show == "all") {
echo "<th>". $text['label-destination_actions']."</th>";
}
if (permission_exists('destination_cid_name_prefix')) {
echo th_order_by('destination_cid_name_prefix', $text['label-destination_cid_name_prefix'], $order_by, $order, $param);
}
if (permission_exists("destination_context")) {
echo th_order_by('destination_context', $text['label-destination_context'], $order_by, $order, $param);
}
@ -359,7 +365,7 @@
}
echo th_order_by('destination_enabled', $text['label-destination_enabled'], $order_by, $order, $param);
echo th_order_by('destination_description', $text['label-destination_description'], $order_by, $order, $param, "class='hide-sm-dn'");
if (permission_exists('destination_edit') && $list_row_edit_button == 'true') {
if (permission_exists('destination_edit') && $list_row_edit_button) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -369,8 +375,12 @@
foreach ($destinations as $row) {
//create the row link
$list_row_url = '';
if (permission_exists('destination_edit')) {
$list_row_url = "destination_edit.php?id=".urlencode($row['destination_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
//show the data
@ -412,6 +422,9 @@
if (!$show == "all") {
echo " <td class='overflow' style='min-width: 125px;'>".$row['actions']."&nbsp;</td>\n";
}
if (permission_exists("destination_cid_name_prefix")) {
echo " <td>".escape($row['destination_cid_name_prefix'])."&nbsp;</td>\n";
}
if (permission_exists("destination_context")) {
echo " <td>".escape($row['destination_context'])."&nbsp;</td>\n";
}
@ -421,9 +434,9 @@
}
echo " <td>".escape($text['label-'.$row['destination_enabled']])."&nbsp;</td>\n";
echo " <td class='description overflow hide-sm-dn'>".escape($row['destination_description'])."&nbsp;</td>\n";
if (permission_exists('destination_edit') && $list_row_edit_button == 'true') {
if (permission_exists('destination_edit') && $list_row_edit_button) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$list_row_edit_button,'link'=>$list_row_url]);
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
}
echo "</tr>\n";
@ -450,3 +463,4 @@
require_once "resources/footer.php";
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2017 - 2023
Portions created by the Initial Developer are Copyright (C) 2017 - 2025
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -26,18 +26,15 @@
/**
* destinations
*
* @method get_array get the destinations
* @method select build the html select
*/
if (!class_exists('destinations')) {
class destinations {
/**
* declare public variables
*/
* declare public variables
*/
public $destinations;
public $domain_uuid;
public $domain_name;
public $start_stamp_begin;
public $start_stamp_end;
public $quick_select;
@ -45,27 +42,36 @@ if (!class_exists('destinations')) {
/**
* declare private variables
*/
private $domain_name;
private $app_name;
private $app_uuid;
private $permission_prefix;
private $list_page;
private $table;
private $uuid_prefix;
private $database;
private $settings;
/**
* Called when the object is created
*/
public function __construct($settings = null) {
//set the domain details
if (is_null($this->domain_uuid)) {
$this->domain_uuid = $_SESSION['domain_uuid'];
public function __construct($setting_array = []) {
//open a database connection
if (empty($setting_array['database'])) {
$this->database = database::new();
} else {
$this->database = $setting_array['database'];
}
//get the email queue settings
if (!isset($settings)) {
$this->settings = new settings();
//set the domain details
$this->domain_uuid = $_SESSION['domain_uuid'] ?? '';
$this->user_uuid = $_SESSION['user_uuid'] ?? '';
//get the settings object
if (empty($setting_array['settings'])) {
$this->settings = new settings(['database' => $this->database, 'domain_uuid' => $this->domain_uuid, 'user_uuid' => $this->user_uuid]);
} else {
$this->settings = $setting_array['settings'];
}
//assign private variables
@ -160,7 +166,6 @@ if (!class_exists('destinations')) {
}
/**
* Build the destination select list
* @var string $destination_type can be ivr, dialplan, call_center_contact or bridge
@ -180,14 +185,13 @@ if (!class_exists('destinations')) {
$sql = "select domain_name from v_domains ";
$sql .= "where domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $this->domain_uuid;
$database = new database;
$this->domain_name = $database->select($sql, $parameters, 'column');
$this->domain_name = $this->database->select($sql, $parameters, 'column');
//initialize variable
$response = '';
//create a single destination select list
if (!empty($_SESSION['destinations']['select_mode']['text']) && $_SESSION['destinations']['select_mode']['text'] == 'default') {
if (!empty($this->settings->get('destinations', 'select_mode')) && $this->settings->get('destinations', 'select_mode') == 'default') {
//get the destinations
if (!is_array($this->destinations)) {
@ -252,8 +256,7 @@ if (!class_exists('destinations')) {
}
$sql .= "order by ".trim($row['order_by']);
$sql = str_replace("\${domain_uuid}", $this->domain_uuid, $sql);
$database = new database;
$result = $database->select($sql, null, 'all');
$result = $this->database->select($sql, null, 'all');
$this->destinations[$x]['result']['sql'] = $sql;
$this->destinations[$x]['result']['data'] = $result;
@ -358,7 +361,7 @@ if (!class_exists('destinations')) {
//add multi-lingual support
if (file_exists($_SERVER["PROJECT_ROOT"]."/app/".$name."/app_languages.php")) {
$language2 = new text;
$text2 = $language2->get($_SESSION['domain']['language']['code'], 'app/'.$name);
$text2 = $language2->get($this->settings->get('domain', 'language'), 'app/'.$name);
}
if (!empty($row['result']['data']) && !empty($row['select_value'][$destination_type])) {
@ -402,7 +405,7 @@ if (!class_exists('destinations')) {
}
}
//application: hangup
if (!empty($data['application'])) {
if (!empty($data['application']) && $data['application'] === 'hangup') {
$select_value = str_replace("transfer", $data['application'], $select_value);
}
}
@ -439,33 +442,31 @@ if (!class_exists('destinations')) {
}
//create a dynamic destination select list
if ($_SESSION['destinations']['select_mode']['text'] == 'dynamic') {
if ($this->settings->get('destinations', 'select_mode') == 'dynamic') {
//remove special characters from the name
$destination_id = str_replace("]", "", $destination_name);
$destination_id = str_replace("[", "_", $destination_id);
//$destination_id = preg_replace('/[^a-zA-Z_,.]/', '', $destination_name);
?>
<script type="text/javascript">
function get_destinations(id, destination_type, action, search) {
//alert(action);
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById(id).innerHTML = this.responseText;
}
};
if (action) {
xhttp.open("GET", "/app/destinations/resources/destinations.php?destination_type="+destination_type+"&action="+action, true);
}
else {
xhttp.open("GET", "/app/destinations/resources/destinations.php?destination_type="+destination_type, true);
}
xhttp.send();
}
</script>
<?php
//send request for destinations
echo "<script type=\"text/javascript\">\n";
echo " function get_destinations(id, destination_type, action, search) {\n";
echo " var xhttp = new XMLHttpRequest();\n";
echo " xhttp.onreadystatechange = function() {\n";
echo " if (this.readyState == 4 && this.status == 200) {\n";
echo " document.getElementById(id).innerHTML = this.responseText;\n";
echo " }\n";
echo " };\n";
echo " if (action) {\n";
echo " xhttp.open(\"GET\", \"/app/destinations/resources/destinations.php?destination_type=\"+destination_type+\"&action=\"+action, true);\n";
echo " }\n";
echo " else {\n";
echo " xhttp.open(\"GET\", \"/app/destinations/resources/destinations.php?destination_type=\"+destination_type, true);\n";
echo " }\n";
echo " xhttp.send();\n";
echo " }\n";
echo "</script>\n";
//get the destinations
$destinations = $this->get($destination_type);
@ -496,11 +497,11 @@ if (!class_exists('destinations')) {
//add multi-lingual support
if (file_exists($_SERVER["PROJECT_ROOT"]."/app/".$key."/app_languages.php")) {
$language2 = new text;
$text2 = $language2->get($_SESSION['domain']['language']['code'], 'app/'.$key);
$text2 = $language2->get($this->settings->get('domain', 'language'), 'app/'.$key);
$found = 'true';
}
if ($key == 'other') {
$text2 = $language2->get($_SESSION['domain']['language']['code'], 'app/dialplans');
$text2 = $language2->get($this->settings->get('domain', 'language'), 'app/dialplans');
}
//add the application to the select list
$response .= " <option id='{$singular}' class='{$key}' value='".$key."' $selected>".$text2['title-'.$key]."</option>\n";
@ -550,9 +551,6 @@ if (!class_exists('destinations')) {
//set the global variables
global $db_type;
//connect to the database
$database = new database;
//set default values
$destination_name = '';
$destination_id = '';
@ -561,7 +559,7 @@ if (!class_exists('destinations')) {
$sql = "select domain_name from v_domains ";
$sql .= "where domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $this->domain_uuid;
$this->domain_name = $database->select($sql, $parameters, 'column');
$this->domain_name = $this->database->select($sql, $parameters, 'column');
//get the destinations
if (!is_array($this->destinations)) {
@ -625,7 +623,7 @@ if (!class_exists('destinations')) {
}
$sql .= "order by ".trim($row['order_by']);
$sql = str_replace("\${domain_uuid}", $this->domain_uuid, $sql);
$result = $database->select($sql, null, 'all');
$result = $this->database->select($sql, null, 'all');
$this->destinations[$x]['result']['sql'] = $sql;
$this->destinations[$x]['result']['data'] = $result;
@ -676,7 +674,7 @@ if (!class_exists('destinations')) {
//add multi-lingual support
if (file_exists($_SERVER["PROJECT_ROOT"]."/app/".$name."/app_languages.php")) {
$language2 = new text;
$text2 = $language2->get($_SESSION['domain']['language']['code'], 'app/'.$name);
$text2 = $language2->get($this->settings->get('domain', 'language'), 'app/'.$name);
}
if (!empty($row['result']['data']) && !empty($row['select_value'][$destination_type])) {
@ -764,14 +762,11 @@ if (!class_exists('destinations')) {
//set the global variables
global $db_type;
//connect to the database
$database = new database;
//get the domain_name
$sql = "select domain_name from v_domains ";
$sql .= "where domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $this->domain_uuid;
$this->domain_name = $database->select($sql, $parameters, 'column');
$this->domain_name = $this->database->select($sql, $parameters, 'column');
//get the destinations
if (!is_array($this->destinations)) {
@ -836,7 +831,7 @@ if (!class_exists('destinations')) {
}
$sql .= "order by ".trim($row['order_by']);
$sql = str_replace("\${domain_uuid}", $this->domain_uuid, $sql);
$result = $database->select($sql, null, 'all');
$result = $this->database->select($sql, null, 'all');
$this->destinations[$x]['result']['sql'] = $sql;
$this->destinations[$x]['result']['data'] = $result;
@ -894,7 +889,7 @@ if (!class_exists('destinations')) {
//add multi-lingual support
if (file_exists($_SERVER["PROJECT_ROOT"]."/app/".$name."/app_languages.php")) {
$language2 = new text;
$text2 = $language2->get($_SESSION['domain']['language']['code'], 'app/'.$name);
$text2 = $language2->get($this->settings->get('domain', 'language'), 'app/'.$name);
}
if (isset($row['result']) && isset($row['result']['data'][0]) && !empty($row['select_value'][$destination_type])) {
@ -1063,8 +1058,7 @@ if (!class_exists('destinations')) {
$sql = "select dialplan_uuid, destination_context from v_destinations ";
$sql .= "where destination_uuid = :destination_uuid ";
$parameters['destination_uuid'] = $record['uuid'];
$database = new database;
$row = $database->select($sql, $parameters, 'row');
$row = $this->database->select($sql, $parameters, 'row');
unset($sql, $parameters);
//include dialplan in array
@ -1081,15 +1075,14 @@ if (!class_exists('destinations')) {
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('dialplan_delete', 'temp');
$p->add('dialplan_detail_delete', 'temp');
//execute delete
$database = new database;
$database->app_name = $this->app_name;
$database->app_uuid = $this->app_uuid;
$database->delete($array);
$this->database->app_name = $this->app_name;
$this->database->app_uuid = $this->app_uuid;
$this->database->delete($array);
unset($array);
//revoke temporary permissions
@ -1114,13 +1107,11 @@ if (!class_exists('destinations')) {
message::add($text['message-delete']);
}
unset($records);
}
}
} //method
/**
* destination summary returns an array
*/
@ -1134,6 +1125,9 @@ if (!class_exists('destinations')) {
$time_zone = date_default_timezone_get();
}
//set the time zone for php
date_default_timezone_set($time_zone);
//build the date range
if (!empty($this->start_stamp_begin) || !empty($this->start_stamp_end)) {
unset($this->quick_select);
@ -1236,6 +1230,7 @@ if (!class_exists('destinations')) {
}
$sql .= " and direction = 'inbound' \n";
$sql .= " and caller_destination is not null \n";
$sql .= " and leg = 'a' \n";
$sql .= $sql_date_range ?? '';
$sql .= ") as c \n";
@ -1251,8 +1246,7 @@ if (!class_exists('destinations')) {
if (!(!empty($_GET['show']) && $_GET['show'] === 'all' && permission_exists('destination_summary_all'))) {
$parameters['domain_uuid'] = $this->domain_uuid;
}
$database = new database;
$summary = $database->select($sql, $parameters, 'all');
$summary = $this->database->select($sql, $parameters, 'all');
unset($parameters);
//if (!empty($this->start_stamp_begin) && !empty($this->start_stamp_end)) {
@ -1263,7 +1257,6 @@ if (!class_exists('destinations')) {
return $summary;
}
/**
* define singular function to convert a word in english to singular
*/
@ -1304,7 +1297,7 @@ if (!class_exists('destinations')) {
} //method
} //class
}
/*
$obj = new destinations;
//$destinations = $obj->destinations;
@ -1315,5 +1308,3 @@ echo $obj->select('ivr', 'example4', '');
echo $obj->select('ivr', 'example5', '');
echo $obj->select('ivr', 'example6', '');
*/
?>

View File

@ -5,6 +5,7 @@ $array['dashboard'][$x]['dashboard_uuid'] = 'a294b771-a125-4d36-b51a-973540346fa
$array['dashboard'][$x]['dashboard_name'] = 'Destinations';
$array['dashboard'][$x]['dashboard_path'] = 'dashboard/icon';
$array['dashboard'][$x]['dashboard_icon'] = 'fa-solid fa-right-to-bracket';
$array['dashboard'][$x]['dashboard_icon_color'] = '#0292ff';
$array['dashboard'][$x]['dashboard_url'] = '/app/destinations/destinations.php';
$array['dashboard'][$x]['dashboard_target'] = 'self';
$array['dashboard'][$x]['dashboard_width'] = '';
@ -14,14 +15,14 @@ $array['dashboard'][$x]['dashboard_content_text_align'] = '';
$array['dashboard'][$x]['dashboard_content_details'] = '';
$array['dashboard'][$x]['dashboard_chart_type'] = '';
$array['dashboard'][$x]['dashboard_label_enabled'] = 'true';
$array['dashboard'][$x]['dashboard_label_text_color'] = '';
$array['dashboard'][$x]['dashboard_label_text_color'] = '#444444';
$array['dashboard'][$x]['dashboard_label_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_label_background_color'] = '';
$array['dashboard'][$x]['dashboard_label_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color'] = '#0292ff';
$array['dashboard'][$x]['dashboard_number_text_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_background_color'] ='';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_background_color'] = '#ffffff';
$array['dashboard'][$x]['dashboard_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_detail_background_color'] = '';
$array['dashboard'][$x]['dashboard_column_span'] = '1';

View File

@ -224,6 +224,9 @@
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$apps[$x]['permissions'][$y]['groups'][] = "admin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "device_serial_number";
$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
$apps[$x]['permissions'][$y]['name'] = "device_model";
//$apps[$x]['permissions'][$y]['groups'][] = "superadmin";
$y++;
@ -462,6 +465,11 @@
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name'] = "device_serial_number";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
$apps[$x]['db'][$y]['fields'][$z]['search'] = 'true';
$apps[$x]['db'][$y]['fields'][$z]['description']['en-us'] = "";
$z++;
$apps[$x]['db'][$y]['fields'][$z]['name']['text'] = "device_model";
$apps[$x]['db'][$y]['fields'][$z]['name']['deprecated'] = "phone_model";
$apps[$x]['db'][$y]['fields'][$z]['type'] = "text";
@ -4302,6 +4310,12 @@
$vendors[$y]['functions'][$z]['groups'][] = "superadmin";
$vendors[$y]['functions'][$z]['groups'][] = "admin";
//bittel details
$y++;
$vendors[$y]['uuid'] = "a2eeb8e0-c30d-4f21-b3eb-7b2ac3b3e84d";
$vendors[$y]['name'] = "bittel";
$z=0;
//linphone details
$y++;
$vendors[$y]['uuid'] = "782bc1cc-149f-406f-b8e2-24a2bc484fad";

View File

@ -62,7 +62,7 @@ if ($domains_processed == 1) {
$array['device_keys'][$index]['device_key_vendor'] = $row["device_vendor"];
}
if (is_array($array) && @sizeof($array)) {
$p = new permissions;
$p = permissions::new();
$p->add('device_key_edit', 'temp');
$database->app_name = 'devices';
@ -77,86 +77,90 @@ if ($domains_processed == 1) {
unset($sql, $device_keys);
//set the device profile keys
$sql = "select count(*) from v_device_profile_keys ";
$num_rows = $database->select($sql, null, 'column');
if ($num_rows == 0) {
//get the device profile keys from device_keys table
$sql = "select * from v_device_keys ";
$sql .= "where device_profile_uuid is not null ";
$device_profile_keys = $database->select($sql, null, 'all');
if ($database->column_exists('v_device_keys', 'device_profile_uuid')) {
$sql = "select count(*) from v_device_profile_keys ";
$num_rows = $database->select($sql, null, 'column');
if ($num_rows == 0) {
//get the device profile keys from device_keys table
$sql = "select * from v_device_keys ";
$sql .= "where device_profile_uuid is not null ";
$device_profile_keys = $database->select($sql, null, 'all');
//loop through the device_keys to build the data array
if (!empty($device_profile_keys)) {
foreach ($device_profile_keys as $index => $row) {
$array['device_profile_keys'][$index]['device_profile_key_uuid'] = $row["device_key_uuid"];
$array['device_profile_keys'][$index]['domain_uuid'] = $row["domain_uuid"];
$array['device_profile_keys'][$index]['device_profile_uuid'] = $row["device_profile_uuid"];
$array['device_profile_keys'][$index]['profile_key_id'] = $row["device_key_id"];
$array['device_profile_keys'][$index]['profile_key_category'] = $row["device_key_category"];
$array['device_profile_keys'][$index]['profile_key_vendor'] = $row["device_key_vendor"];
$array['device_profile_keys'][$index]['profile_key_type'] = $row["device_key_type"];
$array['device_profile_keys'][$index]['profile_key_line'] = $row["device_key_line"];
$array['device_profile_keys'][$index]['profile_key_value'] = $row["device_key_value"];
$array['device_profile_keys'][$index]['profile_key_extension'] = $row["device_key_extension"];
$array['device_profile_keys'][$index]['profile_key_protected'] = $row["device_key_protected"];
$array['device_profile_keys'][$index]['profile_key_label'] = $row["device_key_label"];
$array['device_profile_keys'][$index]['profile_key_icon'] = $row["device_key_icon"];
//loop through the device_keys to build the data array
if (!empty($device_profile_keys)) {
foreach ($device_profile_keys as $index => $row) {
$array['device_profile_keys'][$index]['device_profile_key_uuid'] = $row["device_key_uuid"];
$array['device_profile_keys'][$index]['domain_uuid'] = $row["domain_uuid"];
$array['device_profile_keys'][$index]['device_profile_uuid'] = $row["device_profile_uuid"];
$array['device_profile_keys'][$index]['profile_key_id'] = $row["device_key_id"];
$array['device_profile_keys'][$index]['profile_key_category'] = $row["device_key_category"];
$array['device_profile_keys'][$index]['profile_key_vendor'] = $row["device_key_vendor"];
$array['device_profile_keys'][$index]['profile_key_type'] = $row["device_key_type"];
$array['device_profile_keys'][$index]['profile_key_line'] = $row["device_key_line"];
$array['device_profile_keys'][$index]['profile_key_value'] = $row["device_key_value"];
$array['device_profile_keys'][$index]['profile_key_extension'] = $row["device_key_extension"];
$array['device_profile_keys'][$index]['profile_key_protected'] = $row["device_key_protected"];
$array['device_profile_keys'][$index]['profile_key_label'] = $row["device_key_label"];
$array['device_profile_keys'][$index]['profile_key_icon'] = $row["device_key_icon"];
}
}
//save the array
if (!empty($array)) {
$p = permissions::new();
$p->add('device_profile_key_add', 'temp');
$database->app_name = 'devices';
$database->app_uuid = '4efa1a1a-32e7-bf83-534b-6c8299958a8e';
$database->save($array);
$response = $database->message;
unset($array);
$p->delete('device_profile_key_add', 'temp');
}
}
//save the array
if (!empty($array)) {
$p = new permissions;
$p->add('device_profile_key_add', 'temp');
$database->app_name = 'devices';
$database->app_uuid = '4efa1a1a-32e7-bf83-534b-6c8299958a8e';
$database->save($array);
$response = $database->message;
unset($array);
$p->delete('device_profile_key_add', 'temp');
}
unset($sql, $device_profile_keys);
}
unset($sql, $device_profile_keys);
//set the device profile settings
$sql = "select count(*) from v_device_profile_settings ";
$num_rows = $database->select($sql, null, 'column');
if ($num_rows == 0) {
//get the device profile keys from device_keys table
$sql = "select * from v_device_settings ";
$sql .= "where device_profile_uuid is not null ";
$device_profile_keys = $database->select($sql, null, 'all');
if ($database->column_exists('v_device_settings', 'device_profile_uuid')) {
$sql = "select count(*) from v_device_profile_settings ";
$num_rows = $database->select($sql, null, 'column');
if ($num_rows == 0) {
//get the device profile keys from device_keys table
$sql = "select * from v_device_settings ";
$sql .= "where device_profile_uuid is not null ";
$device_profile_keys = $database->select($sql, null, 'all');
//loop through the device_keys to build the data array
if (!empty($device_profile_keys)) {
foreach ($device_profile_keys as $index => $row) {
$array['device_profile_settings'][$index]['device_profile_setting_uuid'] = $row["device_setting_uuid"];
$array['device_profile_settings'][$index]['domain_uuid'] = $row["domain_uuid"];
$array['device_profile_settings'][$index]['device_profile_uuid'] = $row["device_profile_uuid"];
$array['device_profile_settings'][$index]['profile_setting_name'] = $row["device_setting_subcategory"];
$array['device_profile_settings'][$index]['profile_setting_value'] = $row["device_setting_value"];
$array['device_profile_settings'][$index]['profile_setting_enabled'] = $row["device_setting_enabled"];
$array['device_profile_settings'][$index]['profile_setting_description'] = $row["device_setting_description"];
//loop through the device_keys to build the data array
if (!empty($device_profile_keys)) {
foreach ($device_profile_keys as $index => $row) {
$array['device_profile_settings'][$index]['device_profile_setting_uuid'] = $row["device_setting_uuid"];
$array['device_profile_settings'][$index]['domain_uuid'] = $row["domain_uuid"];
$array['device_profile_settings'][$index]['device_profile_uuid'] = $row["device_profile_uuid"];
$array['device_profile_settings'][$index]['profile_setting_name'] = $row["device_setting_subcategory"];
$array['device_profile_settings'][$index]['profile_setting_value'] = $row["device_setting_value"];
$array['device_profile_settings'][$index]['profile_setting_enabled'] = $row["device_setting_enabled"];
$array['device_profile_settings'][$index]['profile_setting_description'] = $row["device_setting_description"];
}
}
//save the array
if (!empty($array)) {
$p = permissions::new();
$p->add('device_profile_setting_add', 'temp');
$database->app_name = 'devices';
$database->app_uuid = '4efa1a1a-32e7-bf83-534b-6c8299958a8e';
$database->save($array);
$response = $database->message;
unset($array);
$p->delete('device_profile_setting_add', 'temp');
}
}
//save the array
if (!empty($array)) {
$p = new permissions;
$p->add('device_profile_setting_add', 'temp');
$database->app_name = 'devices';
$database->app_uuid = '4efa1a1a-32e7-bf83-534b-6c8299958a8e';
$database->save($array);
$response = $database->message;
unset($array);
$p->delete('device_profile_setting_add', 'temp');
}
unset($sql, $device_profile_keys);
}
unset($sql, $device_profile_keys);
//add device vendor functions to the database
$sql = "select count(*) from v_device_vendors; ";
@ -225,7 +229,7 @@ if ($domains_processed == 1) {
//execute
if (!empty($array)) {
$p = new permissions;
$p = permissions::new();
$p->add('device_vendor_add', 'temp');
$p->add('device_vendor_function_add', 'temp');
$p->add('device_vendor_function_group_add', 'temp');
@ -247,6 +251,7 @@ if ($domains_processed == 1) {
$sql = "update v_device_lines set label = display_name where label is null;\n";
$database->execute($sql);
unset($sql);
}
?>

View File

@ -3198,6 +3198,32 @@ $text['label-device_location']['zh-cn'] = "地点";
$text['label-device_location']['ja-jp'] = "位置";
$text['label-device_location']['ko-kr'] = "위치";
$text['label-device_serial_number']['en-us'] = "Serial Number";
$text['label-device_serial_number']['en-gb'] = "Serial Number";
$text['label-device_serial_number']['ar-eg'] = "";
$text['label-device_serial_number']['de-at'] = "";
$text['label-device_serial_number']['de-ch'] = "";
$text['label-device_serial_number']['de-de'] = "";
$text['label-device_serial_number']['el-gr'] = "";
$text['label-device_serial_number']['es-cl'] = "";
$text['label-device_serial_number']['es-mx'] = "";
$text['label-device_serial_number']['fr-ca'] = "";
$text['label-device_serial_number']['fr-fr'] = "";
$text['label-device_serial_number']['he-il'] = "";
$text['label-device_serial_number']['it-it'] = "";
$text['label-device_serial_number']['ka-ge'] = "";
$text['label-device_serial_number']['nl-nl'] = "";
$text['label-device_serial_number']['pl-pl'] = "";
$text['label-device_serial_number']['pt-br'] = "";
$text['label-device_serial_number']['pt-pt'] = "";
$text['label-device_serial_number']['ro-ro'] = "";
$text['label-device_serial_number']['ru-ru'] = "";
$text['label-device_serial_number']['sv-se'] = "";
$text['label-device_serial_number']['uk-ua'] = "";
$text['label-device_serial_number']['zh-cn'] = "";
$text['label-device_serial_number']['ja-jp'] = "";
$text['label-device_serial_number']['ko-kr'] = "";
$text['label-device_key_vendor']['en-us'] = "Vendor";
$text['label-device_key_vendor']['en-gb'] = "Vendor";
$text['label-device_key_vendor']['ar-eg'] = "البائع";
@ -6634,6 +6660,32 @@ $text['description-device_location']['zh-cn'] = "输入设备位置。";
$text['description-device_location']['ja-jp'] = "デバイスの場所を入力します。";
$text['description-device_location']['ko-kr'] = "장치 위치를 입력합니다.";
$text['description-device_serial_number']['en-us'] = "Enter the device serial number.";
$text['description-device_serial_number']['en-gb'] = "Enter the device serial number.";
$text['description-device_serial_number']['ar-eg'] = "";
$text['description-device_serial_number']['de-at'] = "";
$text['description-device_serial_number']['de-ch'] = "";
$text['description-device_serial_number']['de-de'] = "";
$text['description-device_serial_number']['el-gr'] = "";
$text['description-device_serial_number']['es-cl'] = "";
$text['description-device_serial_number']['es-mx'] = "";
$text['description-device_serial_number']['fr-ca'] = "";
$text['description-device_serial_number']['fr-fr'] = "";
$text['description-device_serial_number']['he-il'] = "";
$text['description-device_serial_number']['it-it'] = "";
$text['description-device_serial_number']['ka-ge'] = "";
$text['description-device_serial_number']['nl-nl'] = "";
$text['description-device_serial_number']['pl-pl'] = "";
$text['description-device_serial_number']['pt-br'] = "";
$text['description-device_serial_number']['pt-pt'] = "";
$text['description-device_serial_number']['ro-ro'] = "";
$text['description-device_serial_number']['ru-ru'] = "";
$text['description-device_serial_number']['sv-se'] = "";
$text['description-device_serial_number']['uk-ua'] = "";
$text['description-device_serial_number']['zh-cn'] = "";
$text['description-device_serial_number']['ja-jp'] = "";
$text['description-device_serial_number']['ko-kr'] = "";
$text['description-device_time_zone']['en-us'] = "Enter the time zone.";
$text['description-device_time_zone']['en-gb'] = "Enter the time zone.";
$text['description-device_time_zone']['ar-eg'] = "أدخل المنطقة الزمنية";
@ -7364,4 +7416,3 @@ $text['label-required']['ja-jp'] = "必要";
$text['label-required']['ko-kr'] = "필수의";
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2023
Portions created by the Initial Developer are Copyright (C) 2008-2025
the Initial Developer. All Rights Reserved.
Contributor(s):
@ -252,6 +252,7 @@
$x = 0;
foreach ($available_columns as $table_name => $columns) {
$table_name_label = ucwords(str_replace(['-','_',],' ', $table_name));
echo "<div class='card'>\n";
echo "<div class='category'>\n";
echo "<b>".$table_name_label."</b>\n";
echo "<br>\n";
@ -284,6 +285,7 @@
echo "</table>\n";
echo "<br>\n";
echo "</div>\n";
echo "</div>\n";
}
}

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2008-2024
Portions created by the Initial Developer are Copyright (C) 2008-2025
the Initial Developer. All Rights Reserved.
*/
@ -44,8 +44,9 @@
$device_firmware_version = '';
$device_template ='';
//get the domain uuid
//get the domain values
$domain_uuid = $_SESSION['domain_uuid'] ?? '';
$domain_name = $_SESSION['domain_name'] ?? '';
//initialize the database object
$database = database::new();
@ -64,12 +65,12 @@
//get the total device count from the database, check the limit, if defined
if ($action == 'add') {
if (!empty($_SESSION['limit']['devices']['numeric']) && $_SESSION['limit']['devices']['numeric']) {
if (!empty($settings->get('limit', 'devices', ''))) {
$sql = "select count(*) from v_devices where domain_uuid = :domain_uuid ";
$parameters['domain_uuid'] = $_SESSION['domain_uuid'];
$parameters['domain_uuid'] = $domain_uuid;
$total_devices = $database->select($sql, $parameters, 'column');
if ($total_devices >= $_SESSION['limit']['devices']['numeric']) {
message::add($text['message-maximum_devices'].' '.$_SESSION['limit']['devices']['numeric'], 'negative');
if ($total_devices >= $settings->get('limit', 'devices', '')) {
message::add($text['message-maximum_devices'].' '.$settings->get('limit', 'devices', ''), 'negative');
header('Location: devices.php');
exit;
}
@ -118,12 +119,12 @@
//$device_provisioned_ip = $_POST["device_provisioned_ip"];
$domain_uuid = $_POST["domain_uuid"];
$device_label = $_POST["device_label"];
$device_label = $_POST["device_label"];
$device_user_uuid = $_POST["device_user_uuid"];
$device_username = $_POST["device_username"];
$device_password = $_POST["device_password"];
$device_vendor = $_POST["device_vendor"];
$device_location = $_POST["device_location"];
$device_serial_number = $_POST["device_serial_number"];
$device_uuid_alternate = $_POST["device_uuid_alternate"] ?? null;
$device_model = $_POST["device_model"] ?? null;
$device_firmware_version = $_POST["device_firmware_version"] ?? null;
@ -228,14 +229,14 @@
$sql .= " and d1.device_uuid <> :device_uuid ";
}
$parameters['device_address'] = $device_address;
$domain_name = $database->select($sql, $parameters, 'column');
if ($domain_name != '') {
$message = $text['message-duplicate'].(if_group("superadmin") && $_SESSION["domain_name"] != $domain_name ? ": ".$domain_name : null);
$device_domain_name = $database->select($sql, $parameters, 'column');
if ($device_domain_name != '') {
$message = $text['message-duplicate'].($device_domain_name != $domain_name ? ": ".$device_domain_name : null);
message::add($message,'negative');
header('Location: devices.php');
exit;
}
unset($sql, $parameters, $domain_name);
unset($sql, $parameters, $device_domain_name);
}
//add or update the database
@ -269,6 +270,9 @@
if (permission_exists('device_location')) {
$array['devices'][0]['device_location'] = $device_location;
}
if (permission_exists('device_serial_number')) {
$array['devices'][0]['device_serial_number'] = $device_serial_number;
}
if (permission_exists('device_alternate')) {
$array['devices'][0]['device_uuid_alternate'] = is_uuid($device_uuid_alternate) ? $device_uuid_alternate : null;
}
@ -304,6 +308,7 @@
$device_line_uuid = uuid();
$new_line = true;
}
$array['devices'][0]['device_lines'][$y]['domain_uuid'] = $domain_uuid;
$array['devices'][0]['device_lines'][$y]['device_uuid'] = $device_uuid;
$array['devices'][0]['device_lines'][$y]['device_line_uuid'] = $device_line_uuid;
@ -311,23 +316,23 @@
$array['devices'][0]['device_lines'][$y]['server_address'] = $row["server_address"];
if (permission_exists('device_line_outbound_proxy_primary')) {
$array['devices'][0]['device_lines'][$y]['outbound_proxy_primary'] = $row["outbound_proxy_primary"];
} else if ($new_line && isset($_SESSION['provision']['outbound_proxy_primary'])) {
$array['devices'][0]['device_lines'][$y]['outbound_proxy_primary'] = $_SESSION['provision']['outbound_proxy_primary']['text'];
} else if ($new_line && !empty($settings->get('provision', 'outbound_proxy_primary'))) {
$array['devices'][0]['device_lines'][$y]['outbound_proxy_primary'] = $settings->get('provision', 'outbound_proxy_primary', '');
}
if (permission_exists('device_line_outbound_proxy_secondary')) {
$array['devices'][0]['device_lines'][$y]['outbound_proxy_secondary'] = $row["outbound_proxy_secondary"];
} else if ($new_line && isset($_SESSION['provision']['outbound_proxy_secondary'])) {
$array['devices'][0]['device_lines'][$y]['outbound_proxy_secondary'] = $_SESSION['provision']['outbound_proxy_secondary']['text'];
} else if ($new_line && !empty($settings->get('provision', 'outbound_proxy_secondary'))) {
$array['devices'][0]['device_lines'][$y]['outbound_proxy_secondary'] = $settings->get('provision', 'outbound_proxy_secondary', '');
}
if (permission_exists('device_line_server_address_primary')) {
$array['devices'][0]['device_lines'][$y]['server_address_primary'] = $row["server_address_primary"];
} else if ($new_line && isset($_SESSION['provision']['server_address_primary'])) {
$array['devices'][0]['device_lines'][$y]['server_address_primary'] = $_SESSION['provision']['server_address_primary']['text'];
} else if ($new_line && !empty($settings->get('provision', 'server_address_primary'))) {
$array['devices'][0]['device_lines'][$y]['server_address_primary'] = $settings->get('provision', 'server_address_primary', '');
}
if (permission_exists('device_line_server_address_secondary')) {
$array['devices'][0]['device_lines'][$y]['server_address_secondary'] = $row["server_address_secondary"];
} else if ($new_line && isset($_SESSION['provision']['server_address_secondary'])) {
$array['devices'][0]['device_lines'][$y]['server_address_secondary'] = $_SESSION['provision']['server_address_secondary']['text'];
} else if ($new_line && !empty($settings->get('provision', 'server_address_secondary'))) {
$array['devices'][0]['device_lines'][$y]['server_address_secondary'] = $settings->get('provision', 'server_address_secondary', '');
}
if (permission_exists('device_line_label')) {
$array['devices'][0]['device_lines'][$y]['label'] = $row["label"];
@ -351,7 +356,7 @@
}
else {
if ($action == "add") {
$array['devices'][0]['device_lines'][$y]['sip_port'] = $_SESSION['provision']['line_sip_port']['numeric'];
$array['devices'][0]['device_lines'][$y]['sip_port'] = $settings->get('provision', 'line_sip_port', '5060');
}
}
if (permission_exists('device_line_transport')) {
@ -359,7 +364,7 @@
}
else {
if ($action == "add") {
$array['devices'][0]['device_lines'][$y]['sip_transport'] = $_SESSION['provision']['line_sip_transport']['text'];
$array['devices'][0]['device_lines'][$y]['sip_transport'] = $settings->get('provision', 'line_sip_transport', 'tcp');
}
}
if (permission_exists('device_line_register_expires')) {
@ -367,7 +372,7 @@
}
else {
if ($action == "add") {
$array['devices'][0]['device_lines'][$y]['register_expires'] = $_SESSION['provision']['line_register_expires']['numeric'];
$array['devices'][0]['device_lines'][$y]['register_expires'] = $settings->get('provision', 'line_register_expires', '120');
}
}
$y++;
@ -480,7 +485,7 @@
}
//write the provision files
if (!empty($_SESSION['provision']['path']['text'])) {
if (!empty($settings->get('provision', 'path'))) {
$prov = new provision(['settings' => $settings]);
$prov->domain_uuid = $domain_uuid;
$response = $prov->write();
@ -509,19 +514,18 @@
$sql = "select * from v_devices ";
$sql .= "where device_uuid = :device_uuid ";
$parameters['device_uuid'] = $device_uuid;
$row = $database->select($sql, $parameters, 'row');
if (is_array($row) && @sizeof($row) != 0) {
$device_address = $row["device_address"];
$device_provisioned_ip = $row["device_provisioned_ip"];
$domain_uuid = $row["domain_uuid"];
$device_label = $row["device_label"];
$device_label = $row["device_label"];
$device_user_uuid = $row["device_user_uuid"];
$device_username = $row["device_username"];
$device_password = $row["device_password"];
$device_vendor = $row["device_vendor"];
$device_location = $row["device_location"];
$device_serial_number = $row["device_serial_number"];
$device_uuid_alternate = $row["device_uuid_alternate"];
$device_model = $row["device_model"];
$device_firmware_version = $row["device_firmware_version"];
@ -533,6 +537,13 @@
unset($sql, $parameters, $row);
}
//get device lines
$sql = "select * ";
$sql .= "from v_domains ";
$sql .= "order by domain_name asc ";
$domains = $database->select($sql, null, 'all');
unset($sql, $parameters);
//set the defaults
if (empty($device_enabled)) { $device_enabled = 'true'; }
@ -563,20 +574,22 @@
}
//get device lines
$sql = "select * from v_device_lines ";
$sql = "select l.*, d.domain_name ";
$sql .= "from v_device_lines as l, v_domains as d ";
$sql .= "where device_uuid = :device_uuid ";
$sql .= "and l.domain_uuid = d.domain_uuid ";
$sql .= "order by cast(line_number as int) asc ";
$parameters['device_uuid'] = $device_uuid ?? null;
$device_lines = $database->select($sql, $parameters, 'all');
unset($sql, $parameters);
//set the new line defaults
$device_lines[$x]['line_number'] = '';
$device_lines[$x]['server_address'] = '';
$device_lines[$x]['outbound_proxy_primary'] = $_SESSION['provision']['outbound_proxy_primary']['text'] ?? null;
$device_lines[$x]['outbound_proxy_secondary'] = $_SESSION['provision']['outbound_proxy_secondary']['text'] ?? null;
$device_lines[$x]['server_address_primary'] = $_SESSION['provision']['server_address_primary']['text'] ?? null;
$device_lines[$x]['server_address_secondary'] = $_SESSION['provision']['server_address_secondary']['text'] ?? null;
$device_lines[$x]['outbound_proxy_primary'] = $settings->get('provision', 'outbound_proxy_primary', null);
$device_lines[$x]['outbound_proxy_secondary'] = $settings->get('provision', 'outbound_proxy_secondary', null);
$device_lines[$x]['server_address_primary'] = $settings->get('provision', 'server_address_primary', null);
$device_lines[$x]['server_address_secondary'] = $settings->get('provision', 'server_address_secondary', null);
$device_lines[$x]['label'] = '';
$device_lines[$x]['display_name'] = '';
$device_lines[$x]['user_id'] = '';
@ -584,9 +597,9 @@
$device_lines[$x]['password'] = '';
$device_lines[$x]['shared_line'] = '';
$device_lines[$x]['enabled'] = '';
$device_lines[$x]['sip_port'] = $_SESSION['provision']['line_sip_port']['numeric'];
$device_lines[$x]['sip_transport'] = $_SESSION['provision']['line_sip_transport']['text'];
$device_lines[$x]['register_expires'] = $_SESSION['provision']['line_register_expires']['numeric'];
$device_lines[$x]['sip_port'] = $settings->get('provision', 'line_sip_port', '5060');
$device_lines[$x]['sip_transport'] = $settings->get('provision', 'line_sip_transport', 'tcp');
$device_lines[$x]['register_expires'] = $settings->get('provision', 'line_register_expires', '120');
//get device keys
$sql = "select * from v_device_keys ";
@ -612,11 +625,11 @@
//add empty device key row(s)
if (!is_uuid($device_uuid)) {
$rows = $_SESSION['devices']['key_add_rows']['numeric'] ?? 1;
$rows = $settings->get('devices', 'key_add_rows', '10');
$id = 0;
}
else {
$rows = $_SESSION['devices']['key_edit_rows']['numeric'] ?? 1;
$rows = $settings->get('devices', 'key_edit_rows', '3');
$id = count($device_keys) + 1;
}
for ($x = 0; $x < $rows; $x++) {
@ -638,7 +651,6 @@
$sql .= "from v_device_vendors ";
$sql .= "where enabled = 'true' ";
$sql .= "order by name asc ";
$device_vendors = $database->select($sql, null, 'all');
unset($sql);
@ -662,11 +674,11 @@
//add empty device setting row(s)
if (!is_uuid($device_uuid)) {
$rows = $_SESSION['devices']['setting_add_rows']['numeric'] ?? 1;
$rows = $settings->get('devices', 'key_add_rows', '10');
$id = 0;
}
else {
$rows = $_SESSION['devices']['setting_edit_rows']['numeric'] ?? 1;
$rows = $settings->get('devices', 'key_edit_rows', '3');
$id = count($device_settings) + 1;
}
for ($x = 0; $x < $rows; $x++) {
@ -694,12 +706,7 @@
//get the first device line info (found on the local server) for the provision button
foreach ($device_lines as $row) {
if (
array_key_exists($row['domain_uuid'], $_SESSION['domains']) &&
$row['server_address'] == $_SESSION['domains'][$row['domain_uuid']]['domain_name'] &&
!empty($row['user_id']) &&
!empty($row['server_address'])
) {
if ($row['server_address'] == $row['domain_name'] && !empty($row['user_id']) && !empty($row['server_address'])) {
$user_id = $row['user_id'];
$server_address = $row['server_address'];
break;
@ -731,14 +738,13 @@
echo " $('#target_file').fadeOut(fade_speed);\n";
echo " document.getElementById('target_file').selectedIndex = 0;\n";
echo " }\n";
echo " function download(d) {\n";
echo " if (d == '".$text['label-download']."') return;\n";
if ($_SESSION['provision']['http_domain_filter']['boolean'] == "false") {
$domain_name = $_SERVER["HTTP_HOST"];
if ($settings->get('provision', 'http_domain_filter', true)) {
$provision_domain_name = $domain_name;
}
else {
$domain_name = $_SESSION['domain_name'];
$provision_domain_name = $_SERVER["HTTP_HOST"];
}
if (!isset($_SERVER['HTTP_PROTOCOL'])) {
@ -747,7 +753,7 @@
if ($_SERVER['HTTPS'] == 'on') { $_SERVER['HTTP_PROTOCOL'] = 'https'; }
if ($_SERVER['SERVER_PORT'] == '443') { $_SERVER['HTTP_PROTOCOL'] = 'https'; }
}
echo " window.location = '".$_SERVER['HTTP_PROTOCOL']."://".$domain_name.PROJECT_PATH."/app/provision/index.php?address=".escape($device_address ?? '')."&file=' + d + '&content_type=application/octet-stream';\n";
echo " window.location = '".$_SERVER['HTTP_PROTOCOL']."://".$provision_domain_name.PROJECT_PATH."/app/provision/index.php?address=".escape($device_address ?? '')."&file=' + d + '&content_type=application/octet-stream';\n";
echo " }\n";
echo "\n";
@ -793,16 +799,11 @@
//add the QR code
if (permission_exists("device_line_password") && !empty($device_template) && $qr_code_enabled) {
//set the mode
if (isset($_SESSION['theme']['qr_image'])) {
if (!empty($_SESSION['theme']['qr_image'])) {
$mode = '4';
}
else {
$mode = '0';
}
if (!empty($settings->get('theme', 'qr_image', ''))) {
$mode = '4';
}
else {
$mode = '4';
$mode = '0';
}
//get the device line settings
@ -922,15 +923,10 @@
//build content for linphone
if ($device_template == "linphone/default") {
$auth_string = '';
if (
!empty($_SESSION['provision']['http_auth_enabled']['boolean']) &&
$_SESSION['provision']['http_auth_enabled']['boolean'] == 'true' &&
!empty($_SESSION['provision']['http_auth_username']['text']) &&
!empty($_SESSION['provision']['http_auth_password'][0])
) {
$auth_string = $_SESSION['provision']['http_auth_username']['text'].':'.$_SESSION['provision']['http_auth_password'][0].'@';
if ($settings->get('provision', 'http_auth_enabled', true) && !empty($settings->get('provision', 'http_auth_username', '')) && !empty($settings->get('provision', 'http_auth_password', ''))) {
$auth_string = $settings->get('provision', 'http_auth_username', '').':'.$settings->get('provision', 'http_auth_password', '').'@';
}
$content = "https://".$auth_string.$_SESSION['domain_name'].'/app/provision/index.php?address='.$device_address;
$content = "https://".$auth_string.$provision_domain_name.'/app/provision/index.php?address='.$device_address;
}
//stream the file
@ -1001,16 +997,16 @@
echo " <img id='qr_code' src='data:image/jpeg;base64,".base64_encode($image)."'>\n";
echo "</div>\n";
}
/*
if (isset($_SESSION['theme']['qr_image'])) {
echo "<img id='img-buffer' src='".$_SESSION["theme"]["qr_image"]["text"]."' style='display: none;'>";
if (!empty($settings->get('theme', 'qr_image', ''))) {
echo "<img id='img-buffer' src='".$settings->get('theme', 'qr_image', '')."' style='display: none;'>";
}
else {
echo "<img id='img-buffer' src='".PROJECT_PATH."/themes/".$_SESSION["domain"]["template"]["name"]."/images/qr_code.png' style='display: none;'>";
echo "<img id='img-buffer' src='".PROJECT_PATH."/themes/".$settings->get('domain', 'template', '')."/images/qr_code.png' style='display: none;'>";
}
*/
}
//show the content
@ -1020,7 +1016,7 @@
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['header-device']."</b></div>\n";
echo " <div class='actions'>\n";
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$_SESSION['theme']['button_icon_back'],'id'=>'btn_back','link'=>'devices.php']);
echo button::create(['type'=>'button','label'=>$text['button-back'],'icon'=>$settings->get('theme', 'button_icon_back', ''),'id'=>'btn_back','link'=>'devices.php']);
if ($action == 'update') {
$button_margin = 'margin-left: 15px;';
if (permission_exists("device_line_password") && $qr_code_enabled) {
@ -1038,7 +1034,7 @@
$template_dir = $prov->template_dir;
$files = glob($template_dir.'/'.$device_template.'/*');
//add file buttons and the file list
echo button::create(['type'=>'button','id'=>'button_files','label'=>$text['button-files'],'icon'=>$_SESSION['theme']['button_icon_download'],'style'=>($button_margin ?? ''),'onclick'=>'show_files()']);
echo button::create(['type'=>'button','id'=>'button_files','label'=>$text['button-files'],'icon'=>$settings->get('theme', 'button_icon_download', ''),'style'=>($button_margin ?? ''),'onclick'=>'show_files()']);
echo "<select class='formfld' style='display: none; width: auto;' name='target_file' id='target_file' onchange='download(this.value)'>\n";
echo " <option value=''>".$text['label-download']."</option>\n";
foreach ($files as $file) {
@ -1054,7 +1050,7 @@
unset($button_margin);
}
if (permission_exists('device_add')) {
echo button::create(['type'=>'button','label'=>$text['button-copy'],'icon'=>$_SESSION['theme']['button_icon_copy'],'style'=>($button_margin ?? ''),'name'=>'btn_copy','onclick'=>"modal_open('modal-copy','new_address');"]);
echo button::create(['type'=>'button','label'=>$text['button-copy'],'icon'=>$settings->get('theme', 'button_icon_copy', ''),'style'=>($button_margin ?? ''),'name'=>'btn_copy','onclick'=>"modal_open('modal-copy','new_address');"]);
unset($button_margin);
}
if (
@ -1063,11 +1059,11 @@
permission_exists('device_key_delete') ||
permission_exists('device_setting_delete')
) {
echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$_SESSION['theme']['button_icon_delete'],'style'=>($button_margin ?? ''),'name'=>'btn_delete','onclick'=>"modal_open('modal-delete','btn_delete');"]);
echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$settings->get('theme', 'button_icon_delete', ''),'style'=>($button_margin ?? ''),'name'=>'btn_delete','onclick'=>"modal_open('modal-delete','btn_delete');"]);
unset($button_margin);
}
}
echo button::create(['type'=>'submit','label'=>$text['button-save'],'icon'=>$_SESSION['theme']['button_icon_save'],'id'=>'btn_save','style'=>'margin-left: 15px;','onclick'=>'submit_form();']);
echo button::create(['type'=>'submit','label'=>$text['button-save'],'icon'=>$settings->get('theme', 'button_icon_save', ''),'id'=>'btn_save','style'=>'margin-left: 15px;','onclick'=>'submit_form();']);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
@ -1105,7 +1101,7 @@
echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
echo "<tr>\n";
echo "<td class='vncell' width='30%' valign='top' align='left' nowrap='nowrap'>\n";
echo "<td class='vncellreq' width='30%' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-device_address']."\n";
echo "</td>\n";
echo "<td class='vtable' width='70%' align='left'>\n";
@ -1289,11 +1285,11 @@
//set the defaults
if (!permission_exists('device_line_server_address')) {
if (empty($row['server_address'])) { $row['server_address'] = $_SESSION['domain_name']; }
if (empty($row['server_address'])) { $row['server_address'] = $domain_name; }
}
if (empty($row['sip_transport'])) { $row['sip_transport'] = $_SESSION['provision']['line_sip_transport']['text']; }
if (!isset($row['sip_port'])) { $row['sip_port'] = $_SESSION['provision']['line_sip_port']['numeric']; } //used !isset to support a value of 0 as empty the empty function considers a value of 0 as empty.
if (empty($row['register_expires'])) { $row['register_expires'] = $_SESSION['provision']['line_register_expires']['numeric']; }
if (empty($row['sip_transport'])) { $row['sip_transport'] = $settings->get('provision', 'line_sip_transport', 'tcp'); }
if (!isset($row['sip_port'])) { $row['sip_port'] = $settings->get('provision', 'line_sip_port', '5060'); } //used !isset to support a value of 0 as empty the empty function considers a value of 0 as empty.
if (empty($row['register_expires'])) { $row['register_expires'] = $settings->get('provision', 'line_register_expires', '120'); }
//add the primary key uuid
if (!empty($row['device_line_uuid']) && is_uuid($row['device_line_uuid'])) {
@ -1323,10 +1319,11 @@
if (permission_exists('device_line_server_address_primary')) {
echo " <td valign='top' align='left' nowrap='nowrap'>\n";
if (isset($_SESSION['provision']['server_address_primary']) && !isset($_SESSION['provision']['server_address_primary']['text'])) {
$provision_server_address_primary = $settings->get('provision', 'server_address_primary');
if (!empty($provision_server_address_primary) && is_array($provision_server_address_primary)) {
echo " <select class='formfld' style='width: 75px;' name='device_lines[".$x."][server_address_primary]'>\n";
echo " <option value=''></option>\n";
foreach($_SESSION['provision']['server_address_primary'] as $field) {
foreach($provision_server_address_primary as $field) {
echo " <option value='".$field."' ".(($row['server_address_primary'] == $field) ? "selected" : null).">".$field."</option>\n";
}
echo " </select>\n";
@ -1339,10 +1336,11 @@
if (permission_exists('device_line_server_address_secondary')) {
echo " <td valign='top' align='left' nowrap='nowrap'>\n";
if (isset($_SESSION['provision']['server_address_secondary']) && !isset($_SESSION['provision']['server_address_secondary']['text'])) {
$provision_server_address_secondary = $settings->get('provision', 'server_address_secondary');
if (!empty($provision_server_address_secondary) && is_array($provision_server_address_secondary)) {
echo " <select class='formfld' style='width: 75px;' name='device_lines[".$x."][server_address_secondary]'>\n";
echo " <option value=''></option>\n";
foreach($_SESSION['provision']['server_address_secondary'] as $field) {
foreach($provision_server_address_secondary as $field) {
echo " <option value='".$field."' ".(($row['server_address_secondary'] == $field) ? "selected" : null).">".$field."</option>\n";
}
echo " </select>\n";
@ -1355,10 +1353,11 @@
if (permission_exists('device_line_outbound_proxy_primary')) {
echo " <td align='left'>\n";
if (isset($_SESSION['provision']['outbound_proxy_primary']) && !isset($_SESSION['provision']['outbound_proxy_primary']['text'])) {
$provision_outbound_proxy_primary = $settings->get('provision', 'outbound_proxy_primary');
if (!empty($provision_outbound_proxy_primary) && is_array($provision_outbound_proxy_primary)) {
echo " <select class='formfld' style='width: 75px;' name='device_lines[".$x."][outbound_proxy_primary]'>\n";
echo " <option value=''></option>\n";
foreach($_SESSION['provision']['outbound_proxy_primary'] as $field) {
foreach($provision_outbound_proxy_primary as $field) {
echo " <option value='".$field."' ".(($row['outbound_proxy_primary'] == $field) ? "selected" : null).">".$field."</option>\n";
}
echo " </select>\n";
@ -1371,10 +1370,11 @@
if (permission_exists('device_line_outbound_proxy_secondary')) {
echo " <td align='left'>\n";
if (isset($_SESSION['provision']['outbound_proxy_secondary']) && !isset($_SESSION['provision']['outbound_proxy_secondary']['text'])) {
$provision_outbound_proxy_secondary = $settings->get('provision', 'outbound_proxy_secondary');
if (!empty($provision_outbound_proxy_secondary) && is_array($provision_outbound_proxy_secondary)) {
echo " <select class='formfld' style='width: 75px;' name='device_lines[".$x."][outbound_proxy_secondary]'>\n";
echo " <option value=''></option>\n";
foreach($_SESSION['provision']['outbound_proxy_secondary'] as $field) {
foreach($provision_outbound_proxy_secondary as $field) {
echo " <option value='".$field."' ".(($row['outbound_proxy_secondary'] == $field) ? "selected" : null).">".$field."</option>\n";
}
echo " </select>\n";
@ -1409,7 +1409,7 @@
if (permission_exists('device_line_password')) {
echo " <td align='left'>\n";
echo " <input type='password' style='display: none;' disabled='disabled'>"; //help defeat browser auto-fill
echo " <input class='formfld' style='min-width: 75px; width: 100%;' type='password' name='device_lines[".$x."][password]' onmouseover=\"this.type='text';\" onfocus=\"this.type='text';\" onmouseout=\"if (!$(this).is(':focus')) { this.type='password'; }\" onblur=\"this.type='password';\" autocomplete=\"off\" maxlength='255' value=\"".escape($row['password'])."\"/>\n";
echo " <input class='formfld password' style='min-width: 75px; width: 100%;' type='password' name='device_lines[".$x."][password]' onmouseover=\"this.type='text';\" onfocus=\"this.type='text';\" onmouseout=\"if (!$(this).is(':focus')) { this.type='password'; }\" onblur=\"this.type='password';\" autocomplete=\"off\" maxlength='255' value=\"".escape($row['password'])."\"/>\n";
echo " </td>\n";
}
@ -1495,7 +1495,7 @@
foreach($device_profiles as $row) {
echo " <option value='".escape($row['device_profile_uuid'])."' ".(!empty($device_profile_uuid) && $row['device_profile_uuid'] == $device_profile_uuid ? "selected='selected'" : null).">".escape($row['device_profile_name'])." ".(($row['domain_uuid'] == '') ? "&nbsp;&nbsp;(".$text['select-global'].")" : null)."</option>\n";
}
echo " </select>\n";
echo " </select>\n";
}
else {
foreach($device_profiles as $row) {
@ -1924,6 +1924,19 @@
echo "</tr>\n";
}
if (permission_exists('device_serial_number')) {
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-device_serial_number']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
echo " <input class='formfld' type='text' name='device_serial_number' maxlength='255' value=\"".escape($device_serial_number ?? '')."\"/>\n";
echo "<br />\n";
echo $text['description-device_serial_number']."\n";
echo "</td>\n";
echo "</tr>\n";
}
if (permission_exists('device_model')) {
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
@ -1963,7 +1976,7 @@
else {
echo " <option value=''>".$text['select-global']."</option>\n";
}
foreach ($_SESSION['domains'] as $row) {
foreach ($domains as $row) {
if ($row['domain_uuid'] == $domain_uuid) {
echo " <option value='".escape($row['domain_uuid'])."' selected='selected'>".escape($row['domain_name'])."</option>\n";
}
@ -1978,16 +1991,16 @@
echo "</tr>\n";
}
else {
echo " <input type='hidden' name='domain_uuid' id='domain_uuid' value=\"".$_SESSION['domain_uuid']."\"/>\n";
echo " <input type='hidden' name='domain_uuid' id='domain_uuid' value=\"".$domain_uuid."\"/>\n";
}
if (permission_exists('device_enable')) {
echo "<tr>\n";
echo "<td class='vncell' valign='top' align='left' nowrap='nowrap'>\n";
echo "<td class='vncellreq' valign='top' align='left' nowrap='nowrap'>\n";
echo " ".$text['label-device_enabled']."\n";
echo "</td>\n";
echo "<td class='vtable' align='left'>\n";
if (substr($_SESSION['theme']['input_toggle_style']['text'], 0, 6) == 'switch') {
if (substr($settings->get('theme', 'input_toggle_style', ''), 0, 6) == 'switch') {
echo " <label class='switch'>\n";
echo " <input type='checkbox' id='device_enabled' name='device_enabled' value='true' ".($device_enabled == 'true' ? "checked='checked'" : null).">\n";
echo " <span class='slider'></span>\n";
@ -2054,4 +2067,3 @@
require_once "resources/footer.php";
?>

View File

@ -229,7 +229,7 @@
echo th_order_by('device_profile_name', $text['label-device_profile_name'], $order_by, $order);
echo th_order_by('device_profile_enabled', $text['label-device_profile_enabled'], $order_by, $order, null, "class='center'");
echo th_order_by('device_profile_description', $text['label-device_profile_description'], $order_by, $order, null, "class='hide-xs'");
if (permission_exists('device_profile_edit') && !empty($_SESSION['theme']['list_row_edit_button']['boolean']) && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('device_profile_edit') && filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -237,8 +237,12 @@
if (is_array($device_profiles) && @sizeof($device_profiles) != 0) {
$x = 0;
foreach($device_profiles as $row) {
$list_row_url = '';
if (permission_exists('device_profile_edit')) {
$list_row_url = "device_profile_edit.php?id=".urlencode($row['device_profile_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('device_profile_add') || permission_exists('device_profile_edit') || permission_exists('device_profile_delete')) {
@ -274,7 +278,7 @@
}
echo " </td>\n";
echo " <td class='description overflow hide-xs'>".escape($row['device_profile_description'])."&nbsp;</td>\n";
if (permission_exists('device_profile_edit') && !empty($_SESSION['theme']['list_row_edit_button']['boolean']) && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('device_profile_edit') && filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -298,3 +302,4 @@
require_once "resources/footer.php";
?>

View File

@ -226,4 +226,3 @@
require_once "resources/footer.php";
?>

View File

@ -44,7 +44,7 @@
//delete the device vendor function group
$array['device_vendor_function_groups'][0]['device_vendor_function_group_uuid'] = $device_vendor_function_group_uuid;
$p = new permissions;
$p = permissions::new();
$p->add('device_vendor_function_group_delete', 'temp');
$database = new database;
@ -183,7 +183,7 @@
$array['device_vendor_function_groups'][0]['group_name'] = $group_name;
$array['device_vendor_function_groups'][0]['group_uuid'] = $group_uuid;
$p = new permissions;
$p = permissions::new();
$p->add('device_vendor_function_group_add', 'temp');
$database = new database;
@ -403,4 +403,3 @@
require_once "resources/footer.php";
?>

View File

@ -176,7 +176,7 @@
echo "<th class='hide-sm-dn'>".$text['label-groups']."</th>\n";
echo th_order_by('enabled', $text['label-enabled'], $order_by, $order, null, "class='center'");
echo th_order_by('description', $text['label-description'], $order_by, $order, null, "class='hide-sm-dn'");
if (permission_exists('device_vendor_function_edit') && !empty($_SESSION['theme']['list_row_edit_button']['boolean']) && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('device_vendor_function_edit') && filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -211,8 +211,12 @@
unset ($vendor_function_groups);
//show the row of data
$list_row_url = '';
if (permission_exists('device_vendor_function_edit')) {
$list_row_url = "device_vendor_function_edit.php?device_vendor_uuid=".urlencode($row['device_vendor_uuid'])."&id=".urlencode($row['device_vendor_function_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('device_vendor_function_add') || permission_exists('device_vendor_function_edit') || permission_exists('device_vendor_function_delete')) {
@ -252,7 +256,7 @@
}
echo " </td>\n";
echo " <td class='description overflow hide-sm-dn'>".escape($row['description'])."</td>\n";
if (permission_exists('device_vendor_function_edit') && !empty($_SESSION['theme']['list_row_edit_button']['boolean']) && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('device_vendor_function_edit') && filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
echo " <td class='action-button'>\n";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -289,3 +293,4 @@
echo "</script>\n";
?>

View File

@ -129,7 +129,7 @@
}
//assign temp permissions
$p = new permissions;
$p = permissions::new();
$p->add('device_vendor_add', 'temp');
$p->add('device_vendor_function_add', 'temp');
$p->add('device_vendor_function_group_add', 'temp');
@ -157,4 +157,3 @@
exit;
?>

View File

@ -170,7 +170,7 @@
echo th_order_by('name', $text['label-name'], $order_by, $order);
echo th_order_by('enabled', $text['label-enabled'], $order_by, $order, null, "class='center'");
echo th_order_by('description', $text['label-description'], $order_by, $order, null, "class='hide-xs'");
if (permission_exists('device_vendor_edit') && !empty($_SESSION['theme']['list_row_edit_button']['boolean']) && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('device_vendor_edit') && filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -178,8 +178,12 @@
if (is_array($result) && @sizeof($result) != 0) {
$x = 0;
foreach($result as $row) {
$list_row_url = '';
if (permission_exists('device_vendor_edit')) {
$list_row_url = "device_vendor_edit.php?id=".urlencode($row['device_vendor_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if (permission_exists('device_vendor_edit') || permission_exists('device_vendor_delete')) {
@ -198,7 +202,7 @@
echo $text['label-'.$row['enabled']];
}
echo " <td class='description overflow hide-xs'>".escape($row['description'])."&nbsp;</td>\n";
if (permission_exists('device_vendor_edit') && !empty($_SESSION['theme']['list_row_edit_button']['boolean']) && $_SESSION['theme']['list_row_edit_button']['boolean'] == 'true') {
if (permission_exists('device_vendor_edit') && filter_var($_SESSION['theme']['list_row_edit_button']['boolean'] ?? false, FILTER_VALIDATE_BOOL)) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$_SESSION['theme']['button_icon_edit'],'link'=>$list_row_url]);
echo " </td>\n";
@ -222,3 +226,4 @@
require_once "resources/footer.php";
?>

View File

@ -48,18 +48,6 @@
$database = database::new();
$settings = new settings(['database' => $database, 'domain_uuid' => $domain_uuid, 'user_uuid' => $user_uuid]);
//set all permissions
$has_device_import = permission_exists('device_import');
$has_device_edit = permission_exists('device_edit');
$has_device_all = permission_exists('device_all');
$has_device_delete = permission_exists('device_delete');
$has_device_domain_all = permission_exists('device_domain_all');
$has_device_export = permission_exists('device_export');
$has_device_vendor_view = permission_exists('device_vendor_view');
$has_device_profile_view = permission_exists('device_profile_view');
$has_device_add = permission_exists('device_add');
$has_show_all = &$has_device_domain_all;
//add multi-lingual support
$language = new text;
$text = $language->get();
@ -78,13 +66,13 @@
if (!empty($action) && !empty($devices) && is_array($devices) && @sizeof($devices) != 0) {
switch ($action) {
case 'toggle':
if ($has_device_edit) {
if (permission_exists('device_edit')) {
$obj = new device;
$obj->toggle($devices);
}
break;
case 'delete':
if ($has_device_delete) {
if (permission_exists('device_delete')) {
$obj = new device;
$obj->delete($devices);
}
@ -105,7 +93,7 @@
//get total devices count from the database
$sql = "select count(*) from v_devices ";
$sql .= "where domain_uuid = :domain_uuid ";
if (!$has_device_all && !$has_device_domain_all) {
if (!permission_exists('device_all') && !permission_exists('device_domain_all')) {
$sql .= "and device_user_uuid = :user_uuid ";
$parameters['user_uuid'] = $user_uuid;
}
@ -113,23 +101,6 @@
$total_devices = $database->select($sql, $parameters, 'column');
unset($sql, $parameters);
//update the has_device_add permission if the total device count is greater then set limit
$device_limit = $settings->get('limit', 'devices', null);
if ($has_device_add && $device_limit !== null) {
$has_device_add = $total_devices > $device_limit;
}
//get the domains if user has permission for show all
$domains = [];
if ($has_device_domain_all) {
$rows = $database->select("select domain_uuid, domain_name from v_domains where domain_enabled = 'true'");
if (!empty($rows)) {
foreach ($rows as $row) {
$domains[$row['domain_uuid']] = $row['domain_name'];
}
}
}
//get the devices profiles
$sql = "select * from v_device_profiles ";
$sql .= "where true ";
@ -142,7 +113,7 @@
//prepare to page the results
$sql = "select count(*) from v_devices as d ";
if (isset($_GET['show']) && $_GET['show'] == "all" && $has_device_all) {
if (isset($_GET['show']) && $_GET['show'] == "all" && permission_exists('device_all')) {
if (!empty($search)) {
$sql .= "where ";
}
@ -150,7 +121,7 @@
else {
$sql .= "where (";
$sql .= " d.domain_uuid = :domain_uuid ";
if ($has_device_all) {
if (permission_exists('device_all')) {
$sql .= " or d.domain_uuid is null ";
}
$sql .= ") ";
@ -205,7 +176,7 @@
$param = "&search=".$search;
$param .= "&fields=".$fields;
}
if (!empty($_GET['show']) && $_GET['show'] == "all" && $has_device_all) {
if (!empty($_GET['show']) && $_GET['show'] == "all" && permission_exists('device_all')) {
$param .= "&show=all";
}
$page = $_GET['page'] ?? 0;
@ -214,11 +185,15 @@
$offset = $rows_per_page * $page;
//get the list
$sql = "select d.*, d2.device_label as alternate_label, ";
$sql = "select ";
if (isset($_GET['show']) && $_GET['show'] == "all" && permission_exists('device_all')) {
$sql .= "d3.domain_name, ";
}
$sql .="d.*, d2.device_label as alternate_label, ";
$sql .= "to_char(timezone(:time_zone, d.device_provisioned_date), 'DD Mon YYYY') as provisioned_date_formatted, \n";
$sql .= "to_char(timezone(:time_zone, d.device_provisioned_date), 'HH12:MI:SS am') as provisioned_time_formatted \n";
$sql .= "from v_devices as d, v_devices as d2 ";
if (isset($_GET['show']) && $_GET['show'] == "all" && $has_device_all) {
if (isset($_GET['show']) && $_GET['show'] == "all" && permission_exists('device_all')) {
$sql .= ", v_domains as d3 ";
}
$sql .= "where ( ";
@ -228,19 +203,19 @@
$sql .= " d.device_uuid = d2.device_uuid ";
$sql .= " ) ";
$sql .= ") ";
if (isset($_GET['show']) && $_GET['show'] == "all" && $has_device_all) {
if (isset($_GET['show']) && $_GET['show'] == "all" && permission_exists('device_all')) {
$sql .= " and d.domain_uuid = d3.domain_uuid ";
}
else {
$sql .= "and (";
$sql .= " d.domain_uuid = :domain_uuid ";
if ($has_device_all) {
if (permission_exists('device_all')) {
$sql .= " or d.domain_uuid is null ";
}
$sql .= ") ";
$parameters['domain_uuid'] = $domain_uuid;
}
if (!$has_device_all && !$has_device_domain_all) {
if (!permission_exists('device_all') && !permission_exists('device_domain_all')) {
$sql .= "and d.device_user_uuid = :user_uuid ";
$parameters['user_uuid'] = $user_uuid;
}
@ -314,33 +289,33 @@
echo "<div class='action_bar' id='action_bar'>\n";
echo " <div class='heading'><b>".$text['header-devices']."</b><div class='count'>".number_format($num_rows)."</div></div>\n";
echo " <div class='actions'>\n";
if ($has_device_import) {
if (permission_exists('device_import')) {
echo button::create(['type'=>'button','label'=>$text['button-import'],'icon'=>$settings->get('theme', 'button_icon_import'),'link'=>'device_imports.php']);
}
if ($has_device_export) {
if (permission_exists('device_export')) {
echo button::create(['type'=>'button','label'=>$text['button-export'],'icon'=>$settings->get('theme', 'button_icon_export'),'link'=>'device_download.php']);
}
if ($has_device_vendor_view) {
if (permission_exists('device_vendor_view')) {
echo button::create(['type'=>'button','label'=>$text['button-vendors'],'icon'=>'fax','link'=>'device_vendors.php']);
}
if ($has_device_profile_view) {
if (permission_exists('device_profile_view')) {
echo button::create(['type'=>'button','label'=>$text['button-profiles'],'icon'=>'clone','link'=>'device_profiles.php']);
}
$margin_left = $has_device_import || $has_device_export || $has_device_vendor_view || $has_device_profile_view ? "margin-left: 15px;" : null;
if ($has_device_add) {
$margin_left = permission_exists('device_import') || permission_exists('device_export') || permission_exists('device_vendor_view') || permission_exists('device_profile_view') ? "margin-left: 15px;" : null;
if (permission_exists('device_add') && (empty($_SESSION['limit']['devices']['numeric']) || ($total_devices < $_SESSION['limit']['devices']['numeric']))) {
echo button::create(['type'=>'button','label'=>$text['button-add'],'icon'=>$settings->get('theme', 'button_icon_add'),'id'=>'btn_add','style'=>$margin_left,'link'=>'device_edit.php']);
unset($margin_left);
}
if ($has_device_edit && $devices) {
if (permission_exists('device_edit') && $devices) {
echo button::create(['type'=>'button','label'=>$text['button-toggle'],'icon'=>$settings->get('theme', 'button_icon_toggle'),'id'=>'btn_toggle','name'=>'btn_toggle','style'=>'display: none; '.($margin_left ?? null),'onclick'=>"modal_open('modal-toggle','btn_toggle');"]);
unset($margin_left);
}
if ($has_device_delete && $devices) {
if (permission_exists('device_delete') && $devices) {
echo button::create(['type'=>'button','label'=>$text['button-delete'],'icon'=>$settings->get('theme', 'button_icon_delete'),'id'=>'btn_delete','name'=>'btn_delete','style'=>'display: none; '.($margin_left ?? null),'onclick'=>"modal_open('modal-delete','btn_delete');"]);
unset($margin_left);
}
echo "<form id='form_search' class='inline' method='get'>\n";
if ($has_device_all) {
if (permission_exists('device_all')) {
if (!empty($_GET['show']) && $_GET['show'] == 'all') {
echo " <input type='hidden' name='show' value='all'>";
}
@ -369,10 +344,10 @@
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
if ($has_device_edit && $devices) {
if (permission_exists('device_edit') && $devices) {
echo modal::create(['id'=>'modal-toggle','type'=>'toggle','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_toggle','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('toggle'); list_form_submit('form_list');"])]);
}
if ($has_device_delete && $devices) {
if (permission_exists('device_delete') && $devices) {
echo modal::create(['id'=>'modal-delete','type'=>'delete','actions'=>button::create(['type'=>'button','label'=>$text['button-continue'],'icon'=>'check','id'=>'btn_delete','style'=>'float: right; margin-left: 15px;','collapse'=>'never','onclick'=>"modal_close(); list_action_set('delete'); list_form_submit('form_list');"])]);
}
@ -387,12 +362,12 @@
echo "<div class='card'>\n";
echo "<table class='list'>\n";
echo "<tr class='list-header'>\n";
if ($has_device_edit || $has_device_delete) {
if (permission_exists('device_edit') || permission_exists('device_delete')) {
echo " <th class='checkbox'>\n";
echo " <input type='checkbox' id='checkbox_all' name='checkbox_all' onclick='list_all_toggle(); checkbox_on_change(this);' ".(empty($devices) ? "style='visibility: hidden;'" : null).">\n";
echo " </th>\n";
}
if (!empty($_GET['show']) && $_GET['show'] == "all" && $has_device_all) {
if (!empty($_GET['show']) && $_GET['show'] == "all" && permission_exists('device_all')) {
echo th_order_by('domain_name', $text['label-domain'], $order_by, $order, null, null, $param);
}
echo th_order_by('device_address', $text['label-device_address'], $order_by, $order, null, null, $param ?? null);
@ -406,7 +381,7 @@
echo th_order_by('device_enabled', $text['label-device_enabled'], $order_by, $order, null, "class='center'", $param ?? null);
echo th_order_by('device_provisioned_date', $text['label-device_status'], $order_by, $order, null, null, $param ?? null);
echo th_order_by('device_description', $text['label-device_description'], $order_by, $order, null, "class='hide-sm-dn'", $param ?? null);
if ($has_device_edit && $settings->get('theme', 'list_row_edit_button', 'false') === 'true') {
if (permission_exists('device_edit') && $settings->get('theme', 'list_row_edit_button', false)) {
echo " <td class='action-button'>&nbsp;</td>\n";
}
echo "</tr>\n";
@ -422,8 +397,12 @@
}
}
if ($has_device_edit) {
$list_row_url = '';
if (permission_exists('device_edit')) {
$list_row_url = "device_edit.php?id=".urlencode($row['device_uuid']);
if ($row['domain_uuid'] != $_SESSION['domain_uuid'] && permission_exists('domain_select')) {
$list_row_url .= '&domain_uuid='.urlencode($row['domain_uuid']).'&domain_change=true';
}
}
$device_provisioned_method = '';
@ -437,17 +416,17 @@
}
echo "<tr class='list-row' href='".$list_row_url."'>\n";
if ($has_device_edit || $has_device_delete) {
if (permission_exists('device_edit') || permission_exists('device_delete')) {
echo " <td class='checkbox'>\n";
echo " <input type='checkbox' name='devices[$x][checked]' id='checkbox_".$x."' value='true' onclick=\"checkbox_on_change(this); if (!this.checked) { document.getElementById('checkbox_all').checked = false; }\">\n";
echo " <input type='hidden' name='devices[$x][uuid]' value='".escape($row['device_uuid'])."' />\n";
echo " </td>\n";
}
if (!empty($_GET['show']) && $_GET['show'] == "all" && $has_device_all) {
echo " <td>".escape($domains[$row['domain_uuid']])."</td>\n";
if (!empty($_GET['show']) && $_GET['show'] == "all" && permission_exists('device_all')) {
echo " <td>".escape($row['domain_name'])."</td>\n";
}
echo " <td class='no-wrap'>";
echo $has_device_edit ? "<a href='".$list_row_url."'>".escape(format_device_address($row['device_address']))."</a>" : escape(format_device_address($row['device_address']));
echo permission_exists('device_edit') ? "<a href='".$list_row_url."'>".escape(format_device_address($row['device_address']))."</a>" : escape(format_device_address($row['device_address']));
echo " </td>\n";
echo " <td>".escape($row['device_label'])."&nbsp;</td>\n";
if ($device_alternate) {
@ -463,7 +442,7 @@
echo " <td>".escape($row['device_vendor'])."&nbsp;</td>\n";
echo " <td>".escape($row['device_template'])."&nbsp;</td>\n";
echo " <td>".escape($device_profile_name)."&nbsp;</td>\n";
if ($has_device_edit) {
if (permission_exists('device_edit')) {
echo " <td class='no-link center'>";
echo button::create(['type'=>'submit','class'=>'link','label'=>$text['label-'.$row['device_enabled']],'title'=>$text['button-toggle'],'onclick'=>"list_self_check('checkbox_".$x."'); list_action_set('toggle'); list_form_submit('form_list')"]);
}
@ -474,7 +453,7 @@
echo " </td>\n";
echo " <td class='no-link'><a title='".escape($row['device_provisioned_agent'])."' href='javascript:void(0)'>".escape($row['provisioned_date_formatted'])." ".escape($row['provisioned_time_formatted'])."</a> &nbsp; ".escape($device_provisioned_method)." &nbsp; <a href='".escape($device_provisioned_method)."://".escape($row['device_provisioned_ip'])."' target='_blank'>".escape($row['device_provisioned_ip'])."</a>&nbsp;</td>\n";
echo " <td class='description overflow hide-sm-dn'>".escape($row['device_description'])."&nbsp;</td>\n";
if ($has_device_edit && $settings->get('theme', 'list_row_edit_button', 'false') === 'true') {
if (permission_exists('device_edit') && $settings->get('theme', 'list_row_edit_button', false)) {
echo " <td class='action-button'>";
echo button::create(['type'=>'button','title'=>$text['button-edit'],'icon'=>$settings->get('theme','button_icon_edit'),'link'=>$list_row_url]);
echo " </td>\n";
@ -498,3 +477,4 @@
require_once "resources/footer.php";
?>

View File

@ -337,6 +337,9 @@
case "0021f2":
$device_vendor = "flyingvoice";
break;
case "f00786":
$device_vendor = "bittel";
break;
default:
$device_vendor = "";
}
@ -402,6 +405,9 @@
if (preg_replace('/^.*?(avaya).*$/i', '$1', $agent) == "avaya") {
return "avaya";
}
if (preg_replace('/^.*?(BITTEL).*$/i', '$1', $agent) == "bittel") {
return "bittel";
}
// unknown vendor
return "";
}
@ -512,7 +518,7 @@
if (is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('device_setting_delete', 'temp');
$p->add('device_line_delete', 'temp');
$p->add('device_key_delete', 'temp');
@ -722,7 +728,7 @@
if (!empty($array) && is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('device_vendor_function_delete', 'temp');
$p->add('device_vendor_function_group_delete', 'temp');
@ -784,7 +790,7 @@
if (!empty($array) && is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('device_vendor_function_group_delete', 'temp');
//execute delete
@ -845,7 +851,7 @@
if (!empty($array) && is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('device_profile_key_delete', 'temp');
$p->add('device_profile_setting_delete', 'temp');
@ -1370,13 +1376,13 @@
if (!empty($array) && is_array($array) && @sizeof($array) != 0) {
//grant temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('device_profile_key_add', 'temp');
$p->add('device_profile_setting_add', 'temp');
//save the array
$this->database->app_name = $this->app_name;
$this->databasee->app_uuid = $this->app_uuid;
$this->database->app_uuid = $this->app_uuid;
$this->database->save($array);
unset($array);

View File

@ -14,19 +14,19 @@ $array['dashboard'][$x]['dashboard_content_text_align'] = '';
$array['dashboard'][$x]['dashboard_content_details'] = '';
$array['dashboard'][$x]['dashboard_chart_type'] = '';
$array['dashboard'][$x]['dashboard_label_enabled'] = 'true';
$array['dashboard'][$x]['dashboard_label_text_color'] = '';
$array['dashboard'][$x]['dashboard_label_text_color'] = '#444444';
$array['dashboard'][$x]['dashboard_label_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_label_background_color'] = '';
$array['dashboard'][$x]['dashboard_label_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_background_color'] ='';
$array['dashboard'][$x]['dashboard_background_color'] = '#ffffff';
$array['dashboard'][$x]['dashboard_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_detail_background_color'] = '';
$array['dashboard'][$x]['dashboard_column_span'] = '1';
$array['dashboard'][$x]['dashboard_row_span'] = '2';
$array['dashboard'][$x]['dashboard_details_state'] = 'expanded';
$array['dashboard'][$x]['dashboard_details_state'] = 'none';
$array['dashboard'][$x]['dashboard_order'] = '150';
$array['dashboard'][$x]['dashboard_enabled'] = 'false';
$array['dashboard'][$x]['dashboard_description'] = 'Used to manage phone provisioned device keys.';
@ -50,14 +50,14 @@ $array['dashboard'][$x]['dashboard_content_text_align'] = '';
$array['dashboard'][$x]['dashboard_content_details'] = '';
$array['dashboard'][$x]['dashboard_chart_type'] = '';
$array['dashboard'][$x]['dashboard_label_enabled'] = 'true';
$array['dashboard'][$x]['dashboard_label_text_color'] = '';
$array['dashboard'][$x]['dashboard_label_text_color'] = '#444444';
$array['dashboard'][$x]['dashboard_label_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_label_background_color'] = '';
$array['dashboard'][$x]['dashboard_label_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_number_background_color'] = '';
$array['dashboard'][$x]['dashboard_number_text_color'] = '#0292ff';
$array['dashboard'][$x]['dashboard_number_text_color_hover'] = '';
$array['dashboard'][$x]['dashboard_background_color'] ='';
$array['dashboard'][$x]['dashboard_background_color'] = '#ffffff';
$array['dashboard'][$x]['dashboard_background_color_hover'] = '';
$array['dashboard'][$x]['dashboard_detail_background_color'] = '';
$array['dashboard'][$x]['dashboard_column_span'] = '1';
@ -77,4 +77,3 @@ $array['dashboard'][$x]['dashboard_groups'][$y]['group_name'] = 'admin';
$y++;
?>

View File

@ -17,7 +17,7 @@
The Initial Developer of the Original Code is
Mark J Crane <markjcrane@fusionpbx.com>
Portions created by the Initial Developer are Copyright (C) 2016-2023
Portions created by the Initial Developer are Copyright (C) 2016-2025
the Initial Developer. All Rights Reserved.
*/
@ -259,7 +259,7 @@
}
if ($save) {
//add the temporary permissions
$p = new permissions;
$p = permissions::new();
$p->add('device_keys_add', 'temp');
$p->add('device_key_edit', 'temp');
@ -427,22 +427,25 @@
$token = $object->create('/app/devices/resources/dashboard/device_keys.php');
//show the content
echo "<div class='action_bar sub'>\n";
echo " <div class='heading'><b>".$text['title-device_keys']."</b></div>\n";
echo " <div class='actions'>\n";
echo "<div class='hud_box'>";
echo "<div class='hud_content' style='display: block;'>\n";
echo " <div class='action_bar sub'>\n";
echo " <div class='heading' style='padding-left: 5px;'><b>".$text['title-device_keys']."</b></div>\n";
echo " <div class='actions' style='padding-top: 2px;'>\n";
echo button::create(['type'=>'button','label'=>$text['button-apply'],'icon'=>$_SESSION['theme']['button_icon_save'],'collapse'=>false,'onclick'=>"document.location.href='".PROJECT_PATH."/app/devices/cmd.php?cmd=check_sync&profile=".$sip_profile_name."&user=".($user_id ?? '')."@".($server_address ?? '')."&domain=".($server_address ?? '')."&agent=".($device_key_vendor ?? '')."';"]);
echo button::create(['type'=>'button','label'=>$text['button-save'],'icon'=>$_SESSION['theme']['button_icon_save'],'collapse'=>false,'onclick'=>"list_form_submit('form_list_device_keys');"]);
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo " </div>\n";
echo " <div style='clear: both;'></div>\n";
echo "</div>\n";
if (!empty($is_included) && !$is_included) {
echo $text['description-device_keys']."\n";
echo "<br /><br />\n";
}
echo "<form method='post' name='frm' id='form_list_device_keys' action=''>\n";
echo "<table class='list'>\n";
echo " <form method='post' name='frm' id='form_list_device_keys' action=''>\n";
echo " <table class='list'>\n";
$x = 0;
if (is_array($device_keys) && @sizeof($device_keys) != 0) {
foreach ($device_keys as $row) {
@ -621,8 +624,11 @@
$x++;
}
}
echo "</table>\n";
echo "<input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo "</form>";
echo " </table>\n";
echo " <input type='hidden' name='".$token['name']."' value='".$token['hash']."'>\n";
echo " </form>\n";
echo "</div>\n";
echo "</div>\n";
?>

Some files were not shown because too many files have changed in this diff Show More