PluginProbe ʕ •ᴥ•ʔ
LatePoint – Calendar Booking Plugin for Appointments and Events / 5.4.2
LatePoint – Calendar Booking Plugin for Appointments and Events v5.4.2
5.6.6 5.6.5 5.6.4 5.6.3 5.6.2 5.6.1 5.6.0 5.5.2 5.5.1 5.5.0 5.4.2 trunk 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.1.8 5.1.9 5.1.91 5.1.92 5.1.93 5.1.94 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1
latepoint / lib / views / settings / general.php
latepoint / lib / views / settings Last commit date
custom_day_schedule_form.php 1 year ago default_form_fields.php 1 year ago general.php 2 months ago generate_instant_booking_page.php 1 year ago get_pro.php 1 year ago import_modal.php 1 year ago notifications.php 1 year ago pages.php 1 year ago payments.php 1 year ago premium_modal.php 1 year ago steps_order_modal.php 5 months ago version_5_intro.php 1 year ago work_periods.php 1 year ago
general.php
683 lines
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 exit; // Exit if accessed directly
4 }
5 ?>
6 <form action="" data-os-action="<?php echo esc_attr(OsRouterHelper::build_route_name( 'settings', 'update' )); ?>">
7 <div class="latepoint-page-with-side-nav">
8 <div class="latepoint-settings-w os-form-w">
9 <?php wp_nonce_field( 'update_settings' ); ?>
10 <div class="white-box section-anchor" id="stickySectionAppointment">
11 <div class="white-box-header">
12 <div class="os-form-sub-header"><h3><?php esc_html_e( 'Appointments', 'latepoint' ); ?></h3></div>
13 </div>
14 <div class="white-box-content no-padding">
15 <div class="sub-section-row">
16 <div class="sub-section-label">
17 <h3><?php esc_html_e( 'Statuses', 'latepoint' ) ?></h3>
18 </div>
19 <div class="sub-section-content">
20 <div class="os-row os-mb-3">
21 <div class="os-col-lg-6">
22 <?php echo OsFormHelper::select_field( 'settings[default_booking_status]', __( 'Default status', 'latepoint' ), OsBookingHelper::get_statuses_list(), OsBookingHelper::get_default_booking_status() ); ?>
23 </div>
24 <div class="os-col-lg-6">
25 <?php echo OsFormHelper::multi_select_field( 'settings[timeslot_blocking_statuses]', __( 'Statuses that block timeslot', 'latepoint' ), OsBookingHelper::get_statuses_list(), OsBookingHelper::get_timeslot_blocking_statuses() ); ?>
26 </div>
27 </div>
28 <div class="os-row os-mb-3">
29 <div class="os-col-lg-6">
30 <?php echo OsFormHelper::multi_select_field( 'settings[need_action_statuses]', __( 'Statuses that appear on pending page', 'latepoint' ), OsBookingHelper::get_statuses_list(), OsBookingHelper::get_booking_statuses_for_pending_page() ); ?>
31 </div>
32 <div class="os-col-lg-6">
33 <?php echo OsFormHelper::multi_select_field( 'settings[calendar_hidden_statuses]', __( 'Statuses hidden on calendar', 'latepoint' ), OsBookingHelper::get_statuses_list(), OsCalendarHelper::get_booking_statuses_hidden_from_calendar() ); ?>
34 </div>
35 </div>
36 <div class="os-row">
37 <div class="os-col-12">
38 <?php echo OsFormHelper::text_field( 'settings[additional_booking_statuses]', __( 'Additional Statuses (comma separated)', 'latepoint' ), OsSettingsHelper::get_settings_value( 'additional_booking_statuses' ), [ 'theme' => 'simple' ] ); ?>
39 </div>
40 </div>
41 </div>
42 </div>
43 <div class="sub-section-row">
44 <div class="sub-section-label">
45 <h3><?php esc_html_e( 'Date and time', 'latepoint' ) ?></h3>
46 </div>
47 <div class="sub-section-content">
48 <div class="os-row os-mb-3">
49 <div class="os-col-6">
50 <?php echo OsFormHelper::select_field( 'settings[time_system]', __( 'Time system', 'latepoint' ), OsTimeHelper::get_time_systems_list_for_select(), OsTimeHelper::get_time_system() ); ?>
51 </div>
52 <div class="os-col-6">
53 <?php echo OsFormHelper::select_field( 'settings[date_format]', __( 'Date format', 'latepoint' ), OsTimeHelper::get_date_formats_list_for_select(), OsSettingsHelper::get_date_format() ); ?>
54 </div>
55 </div>
56 <?php echo OsFormHelper::text_field( 'settings[timeblock_interval]', __( 'Selectable intervals', 'latepoint' ), OsSettingsHelper::get_default_timeblock_interval(), [
57 'class' => 'os-mask-minutes',
58 'theme' => 'simple'
59 ] ); ?>
60 <div class="os-row os-mb-3">
61 <div class="os-col-lg-6">
62 <?php echo OsFormHelper::toggler_field( 'settings[show_booking_end_time]', __( 'Show appointment end time', 'latepoint' ), OsSettingsHelper::is_on( 'show_booking_end_time' ), false, false, [ 'sub_label' => __( 'Show booking end time during booking process and on summary', 'latepoint' ) ] ); ?>
63 </div>
64 <div class="os-col-lg-6">
65 <?php echo OsFormHelper::toggler_field( 'settings[disable_verbose_date_output]', __( 'Disable verbose date output', 'latepoint' ), OsSettingsHelper::is_on( 'disable_verbose_date_output' ), false, false, [ 'sub_label' => __( 'Use number instead of name of the month when outputting dates', 'latepoint' ) ] ); ?>
66 </div>
67 </div>
68 </div>
69 </div>
70 </div>
71 </div>
72 <div class="white-box section-anchor" id="stickySectionRestrictions">
73 <div class="white-box-header">
74 <div class="os-form-sub-header"><h3><?php esc_html_e( 'Restrictions', 'latepoint' ); ?></h3></div>
75 </div>
76 <div class="white-box-content no-padding">
77
78 <div class="sub-section-row">
79 <div class="sub-section-label">
80 <h3><?php esc_html_e( 'Time Restrictions', 'latepoint' ) ?></h3>
81 </div>
82 <div class="sub-section-content">
83 <div class="latepoint-message latepoint-message-subtle"><?php esc_html_e( 'You can set restrictions on earliest/latest dates in the future when your customer can place an appointment. You can either use a relative values like for example "+1 month", "+2 weeks", "+5 days", "+3 hours", "+30 minutes" (entered without quotes), or you can use a fixed date in format YYYY-MM-DD. Leave blank to remove any limitations.', 'latepoint' ); ?></div>
84 <div class="os-row">
85 <div class="os-col-lg-6">
86 <?php echo OsFormHelper::text_field( 'settings[earliest_possible_booking]', __( 'Earliest Possible Booking', 'latepoint' ), OsSettingsHelper::get_settings_value( 'earliest_possible_booking' ), [ 'theme' => 'simple' ] ); ?>
87 </div>
88 <div class="os-col-lg-6">
89 <?php echo OsFormHelper::text_field( 'settings[latest_possible_booking]', __( 'Latest Possible Booking', 'latepoint' ), OsSettingsHelper::get_settings_value( 'latest_possible_booking' ), [ 'theme' => 'simple' ] ); ?>
90 </div>
91 </div>
92 </div>
93 </div>
94 <div class="sub-section-row">
95 <div class="sub-section-label">
96 <h3><?php esc_html_e( 'Quantity Restrictions', 'latepoint' ) ?></h3>
97 </div>
98 <div class="sub-section-content">
99 <?php echo OsFormHelper::text_field( 'settings[max_future_bookings_per_customer]', __( 'Maximum Number of Future Bookings per Customer', 'latepoint' ), OsSettingsHelper::get_settings_value( 'max_future_bookings_per_customer' ), [ 'theme' => 'simple' ] ); ?>
100 </div>
101 </div>
102 <?php
103 /**
104 * Plug after general settings section called restrictions
105 *
106 * @since 5.0.0
107 * @hook latepoint_general_settings_section_restrictions_after
108 *
109 */
110 do_action( 'latepoint_general_settings_section_restrictions_after' ); ?>
111 </div>
112 </div>
113 <div class="white-box section-anchor" id="stickySectionCurrency">
114 <div class="white-box-header">
115 <div class="os-form-sub-header"><h3><?php esc_html_e( 'Currency & Price', 'latepoint' ); ?></h3></div>
116 </div>
117 <div class="white-box-content no-padding">
118 <div class="sub-section-row">
119 <div class="sub-section-label">
120 <h3><?php esc_html_e( 'Symbol', 'latepoint' ) ?></h3>
121 </div>
122 <div class="sub-section-content">
123 <div class="os-row">
124 <div class="os-col-lg-4">
125 <?php echo OsFormHelper::text_field( 'settings[currency_symbol_before]', __( 'Symbol before the price', 'latepoint' ), OsSettingsHelper::get_settings_value( 'currency_symbol_before', '$' ), [ 'theme' => 'simple' ] ); ?>
126 </div>
127 <div class="os-col-lg-4">
128 <?php echo OsFormHelper::text_field( 'settings[currency_symbol_after]', __( 'Symbol after the price', 'latepoint' ), OsSettingsHelper::get_settings_value( 'currency_symbol_after' ), [ 'theme' => 'simple' ] ); ?>
129 </div>
130 </div>
131 </div>
132 </div>
133 <div class="sub-section-row">
134 <div class="sub-section-label">
135 <h3><?php esc_html_e( 'Formatting', 'latepoint' ) ?></h3>
136 </div>
137 <div class="sub-section-content">
138 <div class="os-row">
139 <div class="os-col-lg-4">
140 <?php echo OsFormHelper::select_field( 'settings[thousand_separator]', __( 'Thousand Separator', 'latepoint' ), [
141 ',' => __( 'Comma', 'latepoint' ) . ' (1,000)',
142 '.' => __( 'Dot', 'latepoint' ) . ' (1.000)',
143 ' ' => __( 'Space', 'latepoint' ) . ' (1 000)',
144 '' => __( 'None', 'latepoint' ) . ' (1000)'
145 ], OsSettingsHelper::get_settings_value( 'thousand_separator', ',' ) ); ?>
146 </div>
147 <div class="os-col-lg-4">
148 <?php echo OsFormHelper::select_field( 'settings[decimal_separator]', __( 'Decimal Separator', 'latepoint' ), [
149 '.' => __( 'Dot', 'latepoint' ) . ' (0.99)',
150 ',' => __( 'Comma', 'latepoint' ) . ' (0,99)'
151 ], OsSettingsHelper::get_settings_value( 'decimal_separator', '.' ) ); ?>
152 </div>
153 <div class="os-col-lg-4">
154 <?php echo OsFormHelper::select_field( 'settings[number_of_decimals]', __( 'Number of Decimals', 'latepoint' ), [ 0, 1, 2, 3, 4 ], OsSettingsHelper::get_settings_value( 'number_of_decimals', '2' ) ); ?>
155 </div>
156 </div>
157 </div>
158 </div>
159 <div class="sub-section-row">
160 <div class="sub-section-label">
161 <h3><?php esc_html_e( 'Prices', 'latepoint' ) ?></h3>
162 </div>
163 <div class="sub-section-content">
164 <?php echo OsFormHelper::toggler_field( 'settings[hide_breakdown_if_subtotal_zero]', __( 'Do not show price breakdown, if service price is zero', 'latepoint' ), OsSettingsHelper::is_on( 'hide_breakdown_if_subtotal_zero' ) ); ?>
165 </div>
166 </div>
167 </div>
168 </div>
169 <div class="white-box section-anchor" id="stickySectionPhone">
170 <div class="white-box-header">
171 <div class="os-form-sub-header"><h3><?php esc_html_e( 'Phone', 'latepoint' ); ?></h3></div>
172 </div>
173 <div class="white-box-content no-padding">
174 <div class="sub-section-row phone-country-picker-settings">
175 <div class="sub-section-label">
176 <h3><?php esc_html_e( 'Countries', 'latepoint' ) ?></h3>
177 </div>
178 <div class="sub-section-content">
179 <div class="phone-country-picker-settings">
180 <div class="os-row os-mb-2">
181 <div class="os-col-lg-4">
182 <?php echo OsFormHelper::select_field( 'settings[list_of_phone_countries]', __( 'Countries shown in phone field', 'latepoint' ), [
183 LATEPOINT_ALL => __( 'Show all countries', 'latepoint' ),
184 'select' => __( 'Show selected countries', 'latepoint' )
185 ], OsSettingsHelper::get_settings_value( 'list_of_phone_countries', LATEPOINT_ALL ) ); ?>
186 </div>
187 <div class="os-col-lg-8">
188 <?php echo OsFormHelper::select_field( 'settings[default_phone_country]', __( 'Default Country (if not auto-detected)', 'latepoint' ), OsUtilHelper::get_countries_list(), OsSettingsHelper::get_default_phone_country() ); ?>
189 </div>
190 </div>
191 <div class="os-row">
192 <div class="os-col-12 select-phone-countries-wrapper"
193 style="<?php echo ( OsSettingsHelper::get_settings_value( 'list_of_phone_countries', LATEPOINT_ALL ) == LATEPOINT_ALL ) ? 'display: none;' : ''; ?>">
194 <?php echo OsFormHelper::multi_select_field( 'settings[included_phone_countries]', __( 'Select countries available for phone number field', 'latepoint' ), OsUtilHelper::get_countries_list(), OsSettingsHelper::get_included_phone_countries() ); ?>
195 </div>
196 </div>
197 </div>
198 </div>
199 </div>
200 <div class="sub-section-row phone-country-picker-settings">
201 <div class="sub-section-label">
202 <h3><?php esc_html_e( 'Validation', 'latepoint' ) ?></h3>
203 </div>
204 <div class="sub-section-content">
205 <?php echo OsFormHelper::toggler_field( 'settings[validate_phone_number]', __( 'Validate phone typed fields if they are set as required', 'latepoint' ), OsSettingsHelper::is_on( 'validate_phone_number' ), false, false, [ 'sub_label' => __( 'Reject invalid phone for customers and agents if the phone field is set as required', 'latepoint' ) ] ); ?>
206 <?php echo OsFormHelper::toggler_field( 'settings[mask_phone_number_fields]', __( 'Format phone number on input', 'latepoint' ), OsSettingsHelper::is_on( 'mask_phone_number_fields', LATEPOINT_VALUE_ON ), false, false, [ 'sub_label' => __( 'Applies formatting on phone fields based on the country selected (not recommended for countries that have multiple NSN lengths)', 'latepoint' ) ] ); ?>
207 <?php echo OsFormHelper::toggler_field( 'settings[show_dial_code_with_flag]', __( 'Show country dial code next to flag', 'latepoint' ), OsSettingsHelper::is_enabled_show_dial_code_with_flag(), false, false, [ 'sub_label' => __( 'If enabled, will show a country code next to a flag, for example +1 for United States', 'latepoint' ) ] ); ?>
208 </div>
209 </div>
210 </div>
211 </div>
212 <div class="white-box section-anchor" id="stickySectionAvailability">
213 <div class="white-box-header">
214 <div class="os-form-sub-header"><h3><?php esc_html_e( 'Availability Logic', 'latepoint' ); ?></h3>
215 </div>
216 </div>
217 <div class="white-box-content no-padding">
218 <div class="sub-section-row">
219 <div class="sub-section-label">
220 <h3><?php esc_html_e( 'Restrictions', 'latepoint' ) ?></h3>
221 </div>
222 <div class="sub-section-content">
223 <?php echo OsFormHelper::toggler_field( 'settings[one_agent_at_location]', __( 'Location can only be used by one agent at a time', 'latepoint' ), OsSettingsHelper::is_on( 'one_agent_at_location' ), '', 'large', [ 'sub_label' => __( 'At any given location, only one agent can be booked at a time', 'latepoint' ) ] ); ?>
224 <?php echo OsFormHelper::toggler_field( 'settings[one_location_at_time]', __( 'Agents can only be present in one location at a time', 'latepoint' ), OsSettingsHelper::is_on( 'one_location_at_time' ), '', 'large', [ 'sub_label' => __( 'If an agent is booked at one location, he will not be able to accept any bookings for the same timeslot at other locations', 'latepoint' ) ] ); ?>
225 </div>
226 </div>
227 <div class="sub-section-row">
228 <div class="sub-section-label">
229 <h3><?php esc_html_e( 'Permissions', 'latepoint' ) ?></h3>
230 </div>
231 <div class="sub-section-content">
232 <?php echo OsFormHelper::toggler_field( 'settings[multiple_services_at_time]', __( 'One agent can perform different services simultaneously', 'latepoint' ), OsSettingsHelper::is_on( 'multiple_services_at_time' ), '', 'large', [ 'sub_label' => __( 'Allows an agent to be booked for different services within the same timeslot', 'latepoint' ) ] ); ?>
233 </div>
234 </div>
235 </div>
236 </div>
237 <div class="white-box section-anchor" id="stickySectionCustomer">
238 <div class="white-box-header">
239 <div class="os-form-sub-header"><h3><?php esc_html_e( 'Customers', 'latepoint' ); ?></h3></div>
240 </div>
241 <div class="white-box-content no-padding">
242 <div class="sub-section-row">
243 <div class="sub-section-label">
244 <h3><?php esc_html_e( 'Authentication', 'latepoint' ) ?></h3>
245 </div>
246 <div class="sub-section-content">
247 <div class="latepoint-message latepoint-message-subtle">
248 <?php _e('Make sure to install an SMS processor if you choose to text one-time codes (OTP) to customer phone numbers for authentication or verification', 'latepoint'); ?>
249 </div>
250 <div class="os-row os-mb-2">
251 <div class="os-col-lg-6">
252 <?php echo OsFormHelper::select_field('settings[selected_customer_authentication_field_type]', __('Field used for authentication', 'latepoint'), OsAuthHelper::get_customer_authentication_field_type_options(), OsAuthHelper::get_selected_customer_authentication_field_type(), ['data-os-on-change' => 'latepoint_settings_customer_authentication_field_type_changed']); ?>
253 </div>
254 <div class="os-col-lg-6" id="authDefaultContactType" <?php if(OsAuthHelper::get_selected_customer_authentication_field_type() != 'email_or_phone'){ ?>style="display: none;"<?php } ?>>
255 <div>
256 <?php echo OsFormHelper::select_field('settings[default_contact_type_for_customer_auth]', __('Default to', 'latepoint'), OsAuthHelper::get_available_contact_types_for_customer_auth(), OsAuthHelper::get_default_contact_type_for_customer_auth()); ?>
257 </div>
258 </div>
259 <div class="os-col-lg-6" id="authDefaultMergeBehavior" <?php if(OsAuthHelper::get_selected_customer_authentication_field_type() != 'disabled'){ ?>style="display: none;"<?php } ?>>
260 <div>
261 <?php echo OsFormHelper::select_field('settings[default_contact_merge_behavior]', __('Reuse existing customer if', 'latepoint'), ['email' => __('Email matches', 'latepoint'), 'phone' => __('Phone matches', 'latepoint'), 'none' => __('Do not reuse, always create new customer', 'latepoint')], OsSettingsHelper::get_settings_value('default_contact_merge_behavior', 'email')); ?>
262 </div>
263 </div>
264 </div>
265 <div id="passwordFields" <?php if(OsAuthHelper::is_customer_auth_disabled()){ ?>style="display: none;"<?php } ?>>
266 <div class="os-row os-mb-2">
267 <div class="os-col-lg-6">
268 <?php echo OsFormHelper::select_field('settings[selected_customer_authentication_method]', __('Authentication method', 'latepoint'), OsAuthHelper::get_customer_authentication_method_options(), OsAuthHelper::get_selected_customer_authentication_method(), ['data-os-on-change' => 'latepoint_settings_customer_authentication_method_changed']); ?>
269 </div>
270 <div id="authDefaultMethod" class="os-col-lg-6" <?php if(OsAuthHelper::get_selected_customer_authentication_method() != 'password_or_otp'){ ?>style="display: none;"<?php } ?>>
271 <div>
272 <?php echo OsFormHelper::select_field('settings[default_customer_authentication_method]', __('Default to', 'latepoint'), OsAuthHelper::get_available_customer_authentication_methods(), OsAuthHelper::get_default_customer_authentication_method()); ?>
273 </div>
274 </div>
275 </div>
276 <?php echo OsFormHelper::toggler_field( 'settings[require_otp_for_new_contacts]', __( 'Require OTP verification for new contacts', 'latepoint' ), OsSettingsHelper::is_on( 'require_otp_for_new_contacts' ), false, false, [ 'sub_label' => __( 'Require customers to verify their primary contact (email or phone) when they change it or add a new one, a 6 digit one-time code will be sent to their email or phone', 'latepoint' ) ] ); ?>
277 </div>
278 </div>
279 </div>
280 <div class="sub-section-row" id="customerStepSettings" <?php if(OsAuthHelper::is_customer_auth_disabled()){ ?>style="display: none;"<?php } ?>>
281 <div class="sub-section-label">
282 <h3><?php esc_html_e( 'Customer Step', 'latepoint' ) ?></h3>
283 </div>
284 <div class="sub-section-content">
285 <?php // echo OsFormHelper::toggler_field( 'settings[modern_auth_flow_for_customers]', __( 'Simplified authentication flow', 'latepoint' ), !OsAuthHelper::is_classic_auth_flow(), false, false, [ 'sub_label' => __( 'Instead of having customer to pick if they want to create a new account or login, ask them their phone/email and then present a form to register if email/phone not found, or show OTP/password form to login', 'latepoint' ) ] ); ?>
286 <?php echo OsFormHelper::toggler_field( 'settings[steps_require_setting_password]', __( 'Require customers to set password', 'latepoint' ), OsSettingsHelper::is_on( 'steps_require_setting_password' ), '-registrationPrompt', false, [ 'sub_label' => __( 'Shows password field on registration step, customer will be required to set a password in order to create an account', 'latepoint' ) ] ); ?>
287 <div id="registrationPrompt" <?php if(OsSettingsHelper::is_on( 'steps_require_setting_password' )){ ?>style="display: none;"<?php } ?>>
288 <?php echo OsFormHelper::toggler_field( 'settings[steps_hide_registration_prompt]', __( 'Do not show "Create Account" prompt on confirmation step', 'latepoint' ), OsSettingsHelper::is_on( 'steps_hide_registration_prompt' ), false, false, [ 'sub_label' => __( 'If a customer has not set password for their account, they will be presented with a prompt to do it after a booking is placed.', 'latepoint' ) ] ); ?>
289 </div>
290 </div>
291 </div>
292 <div class="sub-section-row">
293 <div class="sub-section-label">
294 <h3><?php esc_html_e( 'WordPress', 'latepoint' ) ?></h3>
295 </div>
296 <div class="sub-section-content">
297 <?php echo OsFormHelper::toggler_field( 'settings[wp_users_as_customers]', __( 'Use WordPress users as customers', 'latepoint' ), OsSettingsHelper::is_on( 'wp_users_as_customers' ), 'defaultWPUserRole', false, [ 'sub_label' => __( 'Customers can login using their WordPress credentials (if authentication is enabled above), a linked customer account is created automatically. If a WordPress user is logged in - a customer with the same email will be created automatically and data will be prefilled. If a new customer provided an email address, a linked WordPress user is automatically created for that customer, if not present already.', 'latepoint' ) ] ); ?>
298 <div id="defaultWPUserRole" class="os-mt-1" <?php if(!OsAuthHelper::can_wp_users_login_as_customers()){ ?>style="display: none;"<?php } ?>>
299 <?php echo OsFormHelper::select_field( 'settings[default_wp_role_for_customer]', __('Default role for a created WP user', 'latepoint'), OsRolesHelper::get_wp_roles_list(), OsSettingsHelper::get_default_wp_role_for_new_customers() ); ?>
300 <?php
301 $default_fields = OsSettingsHelper::get_default_fields_for_customer();
302 if(empty($default_fields['email']) || !$default_fields['email']['required'] || !$default_fields['email']['active']){
303 echo '<div class="latepoint-message latepoint-message-invalid">'.esc_html__('Important: WordPress users are required to have an email address. You have to set email address field as required in order to create a matching WP user for new customers, otherwise customers without email address on file will not be able to login and make bookings', 'latepoint').'</div>';
304 }
305 ?>
306 </div>
307
308 </div>
309 </div>
310 <div class="sub-section-row">
311 <div class="sub-section-label">
312 <h3><?php esc_html_e( 'Rescheduling', 'latepoint' ) ?></h3>
313 </div>
314 <div class="sub-section-content">
315 <?php echo apply_filters('latepoint_customer_reschedule_settings', '<div>'.OsUtilHelper::generate_missing_addon_link(__('Upgrade to the Premium version to let customers reschedule appointments', 'latepoint')).'</div>'); ?>
316 </div>
317 </div>
318 <div class="sub-section-row">
319 <div class="sub-section-label">
320 <h3><?php esc_html_e( 'Cancellation', 'latepoint' ) ?></h3>
321 </div>
322 <div class="sub-section-content">
323 <?php echo OsFormHelper::toggler_field( 'settings[allow_customer_booking_cancellation]', __( 'Allow customers cancel their bookings', 'latepoint' ), OsSettingsHelper::is_on( 'allow_customer_booking_cancellation' ), 'cancellation_settings', 'normal', [ 'sub_label' => __( 'If enable, shows a button on customer cabinet to cancel an appointment', 'latepoint' ) ] ); ?>
324 <div class="os-mb-2"
325 id="cancellation_settings" <?php echo OsSettingsHelper::is_on( 'allow_customer_booking_cancellation' ) ? '' : 'style="display:none"' ?>>
326 <?php echo OsFormHelper::toggler_field( 'settings[limit_when_customer_can_cancel]', __( 'Set restriction on when customer can cancel', 'latepoint' ), OsSettingsHelper::is_on( 'limit_when_customer_can_cancel' ), 'cancellation_limit_settings' ); ?>
327 <div class="os-mb-4"
328 id="cancellation_limit_settings" <?php echo OsSettingsHelper::is_on( 'limit_when_customer_can_cancel' ) ? '' : 'style="display:none"' ?>>
329 <div class="merged-fields os-mt-1">
330 <div class="merged-label"><?php esc_html_e( 'Can cancel when it is at least', 'latepoint' ); ?></div>
331 <?php echo OsFormHelper::text_field( 'settings[cancellation_limit_value]', false, OsSettingsHelper::get_settings_value( 'cancellation_limit_value', 5 ), [ 'placeholder' => __( 'Value', 'latepoint' ) ] ); ?>
332 <?php echo OsFormHelper::select_field( 'settings[cancellation_limit_unit]', false,
333 array(
334 'minute' => __( 'minutes', 'latepoint' ),
335 'hour' => __( 'hours', 'latepoint' ),
336 'day' => __( 'days', 'latepoint' )
337 ),
338 OsSettingsHelper::get_settings_value( 'cancellation_limit_unit', 'hour' ) ); ?>
339 <div class="merged-label"><?php esc_html_e( 'before appointment start time', 'latepoint' ); ?></div>
340 </div>
341 </div>
342 </div>
343 </div>
344 </div>
345 <div class="sub-section-row">
346 <div class="sub-section-label">
347 <h3><?php esc_html_e( 'Customer Cabinet', 'latepoint' ) ?></h3>
348 </div>
349 <div class="sub-section-content">
350 <?php echo OsFormHelper::text_field( 'settings[customer_dashboard_book_shortcode]', __( 'Shortcode for contents of New Appointment tab', 'latepoint' ), OsSettingsHelper::get_settings_value( 'customer_dashboard_book_shortcode', '[latepoint_book_form]' ), [ 'theme' => 'simple' ] ); ?>
351 <div class="os-mt-2">
352 <div class="latepoint-message latepoint-message-subtle"><?php esc_html_e( 'You can set attributes for a new appointment button tile in a format', 'latepoint' ); ?>
353 <strong>data-selected-agent="ID" data-selected-location="ID" etc...</strong></div>
354 <?php echo OsFormHelper::text_field( 'settings[customer_dashboard_book_button_attributes]', __( 'Attributes for New Appointment button', 'latepoint' ), OsSettingsHelper::get_settings_value( 'customer_dashboard_book_button_attributes', '' ), [ 'theme' => 'simple' ] ); ?>
355 </div>
356 </div>
357 </div>
358
359 <div class="sub-section-row">
360 <div class="sub-section-label">
361 <h3><?php _e( 'Security & Spam', 'latepoint' ) ?></h3>
362 </div>
363 <div class="sub-section-content">
364 <?php echo apply_filters('latepoint_general_settings_customer_security', OsUtilHelper::generate_missing_addon_link(__('Upgrade to the Premium version to unlock CAPTCHA protection and IP Address logging to fight with spam bookings.', 'latepoint'))); ?>
365 </div>
366 </div>
367
368 <?php
369 /**
370 * Plug after customer general settings output
371 *
372 * @since 5.1.0
373 * @hook latepoint_settings_general_customer_after
374 *
375 */
376 do_action( 'latepoint_settings_general_customer_after' ); ?>
377 </div>
378 </div>
379 <div class="white-box section-anchor" id="stickySectionSetup">
380 <div class="white-box-header">
381 <div class="os-form-sub-header"><h3><?php esc_html_e( 'Setup Pages', 'latepoint' ); ?></h3></div>
382 </div>
383 <div class="white-box-content no-padding">
384 <div class="sub-section-row">
385 <div class="sub-section-label">
386 <h3><?php esc_html_e( 'Set Page URLs', 'latepoint' ) ?></h3>
387 </div>
388 <div class="sub-section-content">
389 <?php echo OsFormHelper::text_field( 'settings[page_url_customer_dashboard]', __( 'Customer Dashboard Page URL', 'latepoint' ), OsSettingsHelper::get_customer_dashboard_url( false ), [ 'theme' => 'simple' ] ); ?>
390 <?php echo OsFormHelper::text_field( 'settings[page_url_customer_login]', __( 'Customer Login Page URL', 'latepoint' ), OsSettingsHelper::get_customer_login_url( false ), [ 'theme' => 'simple' ] ); ?>
391 </div>
392 </div>
393 </div>
394 </div>
395 <?php
396 /**
397 * Plug before "Other" section in general settings
398 *
399 * @since 5.1.0
400 * @hook latepoint_settings_general_before_other
401 *
402 */
403 do_action( 'latepoint_settings_general_before_other' ); ?>
404 <div class="white-box section-anchor" id="stickySectionOther">
405 <div class="white-box-header">
406 <div class="os-form-sub-header"><h3><?php esc_html_e( 'Other', 'latepoint' ); ?></h3></div>
407 </div>
408 <div class="white-box-content no-padding">
409 <div class="sub-section-row">
410 <div class="sub-section-label">
411 <h3><?php esc_html_e( 'Business Information', 'latepoint' ) ?></h3>
412 </div>
413 <div class="sub-section-content">
414 <div class="os-row os-mb-2">
415 <div class="os-col-lg-12">
416 <?php echo OsFormHelper::media_uploader_field( 'settings[business_logo]', 0, __( 'Company Logo', 'latepoint' ), __( 'Remove Image', 'latepoint' ), OsSettingsHelper::get_settings_value( 'business_logo' ) ); ?>
417 </div>
418 </div>
419 <div class="os-row">
420 <div class="os-col-lg-3">
421 <?php echo OsFormHelper::text_field( 'settings[business_name]', __( 'Company Name', 'latepoint' ), OsSettingsHelper::get_settings_value( 'business_name' ), [ 'theme' => 'simple' ] ); ?>
422 </div>
423 <div class="os-col-lg-3">
424 <?php echo OsFormHelper::text_field( 'settings[business_phone]', __( 'Business Phone', 'latepoint' ), OsSettingsHelper::get_settings_value( 'business_phone' ), [ 'theme' => 'simple' ] ); ?>
425 </div>
426 <div class="os-col-lg-6">
427 <?php echo OsFormHelper::text_field( 'settings[business_address]', __( 'Business Address', 'latepoint' ), OsSettingsHelper::get_settings_value( 'business_address' ), [ 'theme' => 'simple' ] ); ?>
428 </div>
429 </div>
430 </div>
431 </div>
432 <div class="sub-section-row">
433 <div class="sub-section-label">
434 <h3><?php esc_html_e( 'Calendar Settings', 'latepoint' ) ?></h3>
435 </div>
436 <div class="sub-section-content">
437 <?php echo OsFormHelper::text_field( 'settings[day_calendar_min_height]', __( 'Minimum height of a daily calendar (in pixels)', 'latepoint' ), OsSettingsHelper::get_day_calendar_min_height(), [ 'theme' => 'simple' ] ); ?>
438
439
440 <div class="latepoint-message latepoint-message-subtle"><?php esc_html_e( 'You can use variables in your booking template, they will be replaced with a value for the booking. ', 'latepoint' ) ?><?php echo OsUtilHelper::template_variables_link_html(); ?></div>
441 <?php echo OsFormHelper::text_field( 'settings[booking_template_for_calendar]', __( 'Booking tile information to display on calendar', 'latepoint' ), OsSettingsHelper::get_booking_template_for_calendar(), [ 'theme' => 'simple' ] ); ?>
442 </div>
443 </div>
444 <div class="sub-section-row">
445 <div class="sub-section-label">
446 <h3><?php esc_html_e( 'Conversion Tracking', 'latepoint' ) ?></h3>
447 </div>
448 <div class="sub-section-content">
449 <div class="latepoint-message latepoint-message-subtle">
450 <div><?php esc_html_e( 'You can include some javascript or html that will be appended to the confirmation step. For example you can track ad conversions by triggering a tracking code or a facebook pixel. You can use these variables within your code. Click on the variable to copy.', 'latepoint' ); ?></div>
451 </div>
452 <div class="tracking-info-w">
453 <div class="available-vars-w">
454 <div class="available-vars-i">
455 <div class="available-vars-block">
456 <ul>
457 <li>
458 <span class="var-label"><?php esc_html_e( 'Order ID#:', 'latepoint' ); ?></span>
459 <span class="var-code os-click-to-copy">{{order_id}}</span>
460 </li>
461 <li>
462 <span class="var-label"><?php esc_html_e( 'Customer ID#:', 'latepoint' ); ?></span>
463 <span class="var-code os-click-to-copy">{{customer_id}}</span>
464 </li>
465 <li>
466 <span class="var-label"><?php esc_html_e( 'Order Total:', 'latepoint' ); ?></span>
467 <span class="var-code os-click-to-copy">{{order_total}}</span>
468 </li>
469 <li>
470 <span class="var-label"><?php esc_html_e( 'Service IDs#:', 'latepoint' ); ?></span>
471 <span class="var-code os-click-to-copy">{{service_ids}}</span>
472 </li>
473 <li>
474 <span class="var-label"><?php esc_html_e( 'Agent IDs#:', 'latepoint' ); ?></span>
475 <span class="var-code os-click-to-copy">{{agent_ids}}</span>
476 </li>
477 <li>
478 <span class="var-label"><?php esc_html_e( 'Bundle IDs#:', 'latepoint' ); ?></span>
479 <span class="var-code os-click-to-copy">{{bundle_ids}}</span>
480 </li>
481 <li>
482 <span class="var-label"><?php esc_html_e( 'Location IDs#:', 'latepoint' ); ?></span>
483 <span class="var-code os-click-to-copy">{{location_ids}}</span>
484 </li>
485 </ul>
486 </div>
487 </div>
488 </div>
489 <?php echo OsFormHelper::textarea_field( 'settings[confirmation_step_tracking_code]', false, OsSettingsHelper::get_settings_value( 'confirmation_step_tracking_code', '' ), array(
490 'theme' => 'bordered',
491 'rows' => 9,
492 'placeholder' => __( 'Enter Tracking code here', 'latepoint' )
493 ), [ 'class' => 'tracking-code-input-w' ] ); ?>
494 </div>
495 </div>
496 </div>
497
498 <div class="sub-section-row">
499 <div class="sub-section-label">
500 <h3><?php esc_html_e( 'Data Tables', 'latepoint' ) ?></h3>
501 </div>
502 <div class="sub-section-content">
503 <div class="os-row">
504 <div class="os-col-lg-6">
505 <?php echo OsFormHelper::toggler_field( 'settings[allow_non_admins_download_csv]', __( 'Allow non admins to download table data as csv', 'latepoint' ), OsSettingsHelper::is_on( 'allow_non_admins_download_csv' ), false, false, [ 'sub_label' => __( 'Only admins will be able to download table data as csv', 'latepoint' ) ] ); ?>
506 </div>
507
508 <div class="os-col-lg-3">
509 <?php echo OsFormHelper::select_field( 'settings[number_of_records_per_page]', __( 'Number of records per page', 'latepoint' ), [ 20, 50, 100, 200 ], OsSettingsHelper::get_settings_value( 'number_of_records_per_page', 20 ) ); ?>
510 </div>
511 </div>
512 </div>
513 </div>
514 <div class="sub-section-row">
515 <div class="sub-section-label">
516 <h3><?php esc_html_e( 'Activity Logs', 'latepoint' ) ?></h3>
517 </div>
518 <div class="sub-section-content">
519 <div class="os-row">
520 <div class="os-col-lg-12">
521 <?php echo OsFormHelper::toggler_field( 'settings[should_clear_old_activity_log]', __( 'Automatically clear old activity logs', 'latepoint' ), OsSettingsHelper::is_on( 'should_clear_old_activity_log' ), false, false, [ 'sub_label' => __( 'Activity logs older than 6 months will be automatically deleted', 'latepoint' ) ] ); ?>
522 </div>
523 </div>
524 </div>
525 </div>
526
527 <div class="sub-section-row">
528 <div class="sub-section-label">
529 <h3><?php esc_html_e( 'Improve LatePoint', 'latepoint' ) ?></h3>
530 </div>
531 <div class="sub-section-content">
532 <div class="os-row">
533 <div class="os-col-lg-12">
534 <?php
535 $ctl_sub_label = __( 'Share how you use the plugin so we can build features that matter, fix issues faster, and make smarter decisions. %1$sLearn More%2$s', 'latepoint' );
536
537 $ctl_sub_label = sprintf(
538 $ctl_sub_label,
539 '<a href="https://latepoint.com/privacy-policy/" target="_blank" rel="noopener noreferrer">',
540 '</a>'
541 );
542
543 $ctl_option_value = get_option( 'latepoint_usage_optin', 'no' );
544 $ctl_is_active = $ctl_option_value === 'yes' ? true : false;
545
546 echo OsFormHelper::toggler_field( 'settings[contribute_to_latepoint]', __( 'Help shape the future of LatePoint', 'latepoint' ), $ctl_is_active, false, false, [ 'sub_label' => $ctl_sub_label ] ); ?>
547 </div>
548 </div>
549 </div>
550 </div>
551 <div class="sub-section-row">
552 <div class="sub-section-label">
553 <h3><?php esc_html_e( 'Export/Import', 'latepoint' ) ?></h3>
554 </div>
555 <div class="sub-section-content">
556 <a
557 class="latepoint-btn latepoint-btn-grey latepoint-btn-outline"
558 target="_blank"
559 href="<?php echo OsRouterHelper::build_admin_post_link(
560 [ 'settings', 'export_data' ],
561 [ '_wpnonce' => wp_create_nonce( 'export_data' ) ]
562 ); ?>"
563 >
564 <i class="latepoint-icon latepoint-icon-external-link"></i>
565 <span><?php esc_html_e('Export Data'); ?></span>
566 </a>
567 <a data-os-lightbox-classes="width-700" data-os-action="<?php echo esc_attr(OsRouterHelper::build_route_name('settings', 'import_modal')); ?>" href="#" data-os-output-target="lightbox" class="latepoint-btn latepoint-btn-grey latepoint-btn-outline"><i class="latepoint-icon latepoint-icon-download"></i><span><?php esc_html_e('Import Data', 'latepoint'); ?></span></a>
568 </div>
569 </div>
570
571 <?php
572 /**
573 * Plug after other general settings output
574 *
575 * @since 4.7.0
576 * @hook latepoint_settings_general_other_after
577 *
578 */
579 do_action( 'latepoint_settings_general_other_after' ); ?>
580 </div>
581 </div>
582 <?php
583 /**
584 * Plug after general settings output, before buttons
585 *
586 * @since 4.7.8
587 * @hook latepoint_settings_general_after
588 *
589 */
590 do_action( 'latepoint_settings_general_after' ); ?>
591
592 <?php
593 /**
594 * Hidden plugin settings
595 *
596 * @since 5.2.10
597 */
598 if(isset($_GET['danger_zone'])) { ?>
599 <div class="white-box section-anchor" id="stickySectionOther">
600 <div class="white-box-header">
601 <div class="os-form-sub-header"><h3><?php esc_html_e( 'Danger Zone', 'latepoint' ); ?></h3></div>
602 </div>
603 <div class="white-box-content no-padding">
604
605 <!-- Cleanup Section -->
606 <div class="sub-section-row">
607 <div class="sub-section-label">
608 <h3><?php esc_html_e( 'Plugin Deletion', 'latepoint' ) ?></h3>
609 </div>
610 <div class="sub-section-content">
611 <div class="os-row">
612 <div class="os-col-lg-12">
613 <?php
614 echo OsFormHelper::toggler_field(
615 'settings[remove_data_on_plugin_delete]',
616 __( 'Remove all data on plugin deletion', 'latepoint' ),
617 OsSettingsHelper::is_on( 'remove_data_on_plugin_delete' ),
618 false,
619 false,
620 [ 'sub_label' => __( 'All LatePoint database tables and settings will be permanently deleted when the plugin is deleted', 'latepoint' ) ]
621 );
622 ?>
623 </div>
624 </div>
625 <div class="latepoint-message latepoint-message-subtle">
626 <?php esc_html_e( 'This action is irreversible. Before enabling this option, we recommend exporting your data so you have a backup.', 'latepoint' ); ?>
627 <a
628 target="_blank"
629 href="<?php echo esc_url(
630 OsRouterHelper::build_admin_post_link(
631 [ 'settings', 'export_data' ],
632 [ '_wpnonce' => wp_create_nonce( 'export_data' ) ]
633 )
634 ); ?>"
635 >
636 <?php esc_html_e( 'Export your data', 'latepoint' ); ?>
637 </a>
638 </div>
639 </div>
640 </div>
641 </div>
642 </div>
643
644 <?php } // Danger zone end. ?>
645 <div class="os-form-buttons">
646 <?php echo OsFormHelper::button( 'submit', __( 'Save Settings', 'latepoint' ), 'submit', [ 'class' => 'latepoint-btn' ] ); ?>
647 </div>
648 </div>
649 <div class="latepoint-page-side-nav">
650 <div class="side-nav-actions">
651 <button type="submit" class="latepoint-btn latepoint-btn-block"><i class="latepoint-icon latepoint-icon-check"></i><span><?php _e( 'Save Changes', 'latepoint' ); ?></span></button>
652 </div>
653 <div class="side-nav-body">
654 <div><a href="#stickySectionAppointment" class="is-active"><?php esc_html_e( 'Appointments', 'latepoint' ); ?></a></div>
655 <div><a href="#stickySectionRestrictions"><?php esc_html_e( 'Restrictions', 'latepoint' ); ?></a></div>
656 <div><a href="#stickySectionCurrency"><?php esc_html_e( 'Currency & Price', 'latepoint' ); ?></a></div>
657 <div><a href="#stickySectionPhone"><?php esc_html_e( 'Phone', 'latepoint' ); ?></a></div>
658 <div><a href="#stickySectionAvailability"><?php esc_html_e( 'Availability Logic', 'latepoint' ); ?></a></div>
659 <div><a href="#stickySectionCustomer"><?php esc_html_e( 'Customers', 'latepoint' ); ?></a></div>
660 <div><a href="#stickySectionSetup"><?php esc_html_e( 'Setup Pages', 'latepoint' ); ?></a></div>
661 <?php
662
663 /**
664 * Sticky menu items links for the general settings
665 *
666 * @since 5.1.94
667 * @hook latepoint_general_settings_sticky_section_items
668 *
669 * @param {array} $sticky_menu_items items that go into sticky menu on the right of settings, in format ['href' => '', 'label' => '']
670 * @returns {array} The filtered array of sticky menu items
671 */
672 $before_other_items = apply_filters('latepoint_general_settings_sticky_section_items', []);
673 foreach($before_other_items as $item){
674 echo '<div><a href="#'.esc_attr($item['href']).'">'.esc_html( $item['label'] ).'</a></div>';
675 }
676 ?>
677 <div><a href="#stickySectionOther"><?php esc_html_e( 'Other', 'latepoint' ); ?></a></div>
678 </div>
679
680 </div>
681 </div>
682 </form>
683