1 <div id="voice-voicemail" class="page-layout simple tabbed" layout="column">
3 <div class="header md-accent-bg" layout="row" layout-align="start center">
4 <div class="white-fg" layout="row" layout-align="start center" flex>
6 class="goto-voicemails-button md-icon-button"
7 aria-label="Go to voicemails"
8 ng-click="vm.gotoVoicemails()"
10 translate-attr-aria-label="VOICE.GO_TO_VOICEMAILS"
12 <md-icon md-font-icon="icon-arrow-left"></md-icon>
15 <div layout="row" layout-align="start center">
16 <div class="voicemail-image" hide-xs>
17 <img ng-src="assets/images/business/voicemails.jpg" />
20 <div layout="column" layout-align="start start">
23 <span ng-if="vm.voicemail.name">{{vm.voicemail.name}}</span>
25 <div class="subtitle secondary-text">
26 <span translate="APP.CREATED_AT"></span>
27 <span>{{vm.voicemail.createdAt | date:'medium'}}</span>
35 ng-click="vm.saveVoicemail()"
36 ng-if="vm.crudPermissions.canEdit"
37 class="send-button md-accent md-raised"
38 ng-disabled="(generalForm.$invalid) || (advancedForm.$invalid) || (messagesForm.$invalid)"
40 translate-attr-aria-label="APP.SAVE"
51 md-selected="vm.selectedTab"
52 md-stretch-tabs="always"
59 <span translate="APP.SETTINGS">SETTINGS</span>
63 class="voicemail-detail-form-container general md-background-bg md-whiteframe-1dp"
65 <div class="pb-16" layout="row" layout-align="start center">
66 <div class="h2 secondary-text" translate="APP.GENERAL">
70 <form name="generalForm" novalidate>
71 <md-input-container class="md-block">
72 <label translate="APP.FULLNAME">FullName</label>
76 ng-model="vm.voicemail.fullname"
79 ng-disabled="!vm.crudPermissions.canEdit"
83 ng-messages="generalForm['fullname'].$error"
84 ng-show="generalForm['fullname'].$touched"
87 <div ng-message="required">
88 <span translate="APP.ERRORS.FULLNAME_REQUIRED"
89 >FullName field is required</span
94 <md-input-container class="md-block">
95 <label translate="APP.EMAIL">Email</label>
99 ng-model="vm.voicemail.email"
100 ng-required="vm.voicemail.attach === 'yes'"
101 ng-disabled="!vm.crudPermissions.canEdit"
105 ng-messages="generalForm['email'].$error"
106 ng-show="generalForm['email'].$touched"
109 <div ng-message="required">
110 <span translate="APP.ERRORS.EMAIL_REQUIRED"
111 >Email field is required</span
114 <div ng-message="email">
115 <span translate="APP.ERRORS.EMAIL_MUST_VALID"
116 >Email must be a valid e-mail address</span
120 </md-input-container>
121 <md-input-container class="md-block">
122 <label translate="APP.PASSWORD">Password</label>
126 ng-model="vm.voicemail.password"
127 placeholder="Password"
129 translate-attr-placeholder="APP.PASSWORD"
132 <div ng-messages="generalForm['password'].$error" role="alert">
133 <div ng-message="required">
134 <span translate="APP.ERRORS.PASSWORD_REQUIRED"
135 >Password field is required</span
138 <div ng-message="pattern">
139 <span translate="VOICE.ERRORS.SECURE_PASSWORD_PATTERN"
140 >Must contain at least 8 characters, with a minimum of 1
141 lowercase letter, 1 uppercase letter, 1 numeric character
142 and 1 special character ~!?*@#$%^&-_=+[{]}.</span
146 </md-input-container>
148 <md-input-container class="md-block" ng-if="vm.newVoicemail ">
149 <label translate="APP.CONFIRM_PASSWORD">Confirm Password</label>
152 match-password="password"
153 name="confirmPassword"
154 ng-model="confirmPassword"
158 ng-messages="generalForm.confirmPassword.$error"
162 <div ng-message="required">
163 <span translate="VOICE.ERRORS.CONFIRM_REQUIRED"
164 >Confirm field is required</span
167 <div ng-message="passwordMatch">
168 <span translate="VOICE.ERRORS.CONFIRM_NOT_MATCH"
169 >Your password did not match</span
173 </md-input-container>
175 <md-input-container class="md-block">
176 <label translate="APP.MAILBOX">MailBox</label>
180 ng-model="vm.voicemail.mailbox"
186 ng-messages="generalForm['mailbox'].$error"
187 ng-show="generalForm['mailbox'].$touched"
190 <div ng-message="required">
191 <span translate="APP.ERRORS.MAILBOX_REQUIRED"
192 >MailBox field is required</span
196 </md-input-container>
197 <md-input-container class="md-block">
198 <label translate="APP.VOICEMAIL_CONTEXT"
199 >Voicemail_Context</label
203 ng-model="vm.voicemail.context"
205 ng-disabled="!vm.crudPermissions.canEdit"
208 ng-value="context.name"
209 ng-repeat="context in vm.contexts"
210 ng-disabled="context.canSelect === false"
211 >{{ context.name }}</md-option
215 <span translate="APP.HELP.VOICEMAIL_CONTEXT"></span>
218 ng-messages="generalForm['context'].$error"
219 ng-show="generalForm['context'].$touched"
222 <div ng-message="required">
223 <span translate="VOICE.ERRORS.VOICEMAIL_CONTEXT_REQUIRED"
224 >Voicemail_Context field is required</span
228 </md-input-container>
235 <span translate="APP.ADVANCED">ADVANCED</span>
239 class="voicemail-detail-form-container advanced md-background-bg md-whiteframe-1dp"
241 <div class="pb-16" layout="row" layout-align="start center">
242 <div class="h2 secondary-text" translate="APP.ADVANCED">
246 <form name="advancedForm" novalidate>
247 <md-input-container class="md-block">
248 <label translate="APP.TIMEZONE">TimeZone</label>
252 ng-model="vm.voicemail.tz"
255 ng-disabled="!vm.crudPermissions.canEdit"
259 ng-messages="advancedForm['tz'].$error"
260 ng-show="advancedForm['tz'].$touched"
263 <div ng-message="required">
264 <span translate="APP.ERRORS.TIMEZONE_REQUIRED"
265 >TimeZone field is required</span
269 </md-input-container>
270 <md-input-container class="md-block">
271 <label translate="APP.ATTACH">Attach</label>
274 ng-model="vm.voicemail.attach"
275 ng-disabled="!vm.crudPermissions.canEdit"
277 <md-option ng-value="'yes'">
278 {{ 'APP.YES' | translate }}
281 <md-option ng-value="'no'">
282 {{ 'APP.NO' | translate }}
286 ng-messages="advancedForm['attach'].$error"
287 ng-show="advancedForm['attach'].$touched"
290 <div ng-message="required">
291 <span translate="VOICE.ERRORS.ATTACH_REQUIRED"
292 >Attach field is required</span
296 </md-input-container>
297 <md-input-container class="md-block">
298 <label translate="APP.ENVELOPE">Envelope</label>
301 ng-model="vm.voicemail.envelope"
302 ng-disabled="!vm.crudPermissions.canEdit"
304 <md-option ng-value="'yes'">
305 {{ 'APP.YES' | translate }}
308 <md-option ng-value="'no'">
309 {{ 'APP.NO' | translate }}
313 ng-messages="advancedForm['envelope'].$error"
314 ng-show="advancedForm['envelope'].$touched"
317 <div ng-message="required">
318 <span translate="VOICE.ERRORS.ENVELOPE_REQUIRED"
319 >Envelope field is required</span
323 </md-input-container>
324 <md-input-container class="md-block">
325 <label translate="APP.DELETE">Delete</label>
328 ng-model="vm.voicemail.delete"
329 ng-disabled="!vm.crudPermissions.canEdit"
331 <md-option ng-value="'yes'">
332 {{ 'APP.YES' | translate }}
335 <md-option ng-value="'no'">
336 {{ 'APP.NO' | translate }}
340 ng-messages="advancedForm['delete'].$error"
341 ng-show="advancedForm['delete'].$touched"
344 <div ng-message="required">
345 <span translate="VOICE.ERRORS.DELETE_REQUIRED"
346 >Delete field is required</span
350 </md-input-container>
351 <md-input-container class="md-block">
352 <label translate="APP.EMAILBODY">EmailBody</label>
356 ng-model="vm.voicemail.emailbody"
357 ng-disabled="!vm.crudPermissions.canEdit"
361 ng-messages="advancedForm['emailbody'].$error"
362 ng-show="advancedForm['emailbody'].$touched"
365 <div ng-message="required">
366 <span translate="VOICE.ERRORS.EMAILBODY_REQUIRED"
367 >EmailBody field is required</span
371 </md-input-container>
372 <md-input-container class="md-block">
373 <label translate="APP.EMAILSUBJECT">EmailSubject</label>
377 ng-model="vm.voicemail.emailsubject"
378 ng-disabled="!vm.crudPermissions.canEdit"
382 ng-messages="advancedForm['emailsubject'].$error"
383 ng-show="advancedForm['emailsubject'].$touched"
386 <div ng-message="required">
387 <span translate="VOICE.ERRORS.EMAILSUBJECT_REQUIRED"
388 >EmailSubject field is required</span
392 </md-input-container>
393 <md-input-container class="md-block">
394 <label translate="APP.MAXSECONDS">MaxSeconds</label>
398 ng-model="vm.voicemail.maxsecs"
400 ng-disabled="!vm.crudPermissions.canEdit"
404 ng-messages="advancedForm['maxsecs'].$error"
405 ng-show="advancedForm['maxsecs'].$touched"
408 <div ng-message="required">
409 <span translate="VOICE.ERRORS.MAXSECONDS_REQUIRED"
410 >MaxSeconds field is required</span
413 <div ng-message="min">
415 translate="VOICE.ERRORS.MAXSECONDS_MUST_BE_GREATER_THAN_OR_EQUAL_TO"
416 >MaxSeconds must be a valid greater or equal than</span
421 </md-input-container>
422 <md-input-container class="md-block">
423 <label translate="APP.MAXMESSAGES">MaxMessages</label>
427 ng-model="vm.voicemail.maxmsg"
430 ng-disabled="!vm.crudPermissions.canEdit"
434 ng-messages="advancedForm['maxmsg'].$error"
435 ng-show="advancedForm['maxmsg'].$touched"
438 <div ng-message="required">
439 <span translate="VOICE.ERRORS.MAXMESSAGES_REQUIRED"
440 >MaxMessages field is required</span
443 <div ng-message="min">
445 translate="VOICE.ERRORS.MAXMESSAGES_MUST_BE_GREATER_THAN_OR_EQUAL_TO"
446 >MaxMessages must be a valid greater or equal than</span
450 <div ng-message="max">
452 translate="VOICE.ERRORS.MAXMESSAGES_MUST_BE_LESS_THAN_OR_EQUAL_TO"
453 >MaxMessages must be a valid greater or equal than</span
458 </md-input-container>
465 <span translate="APP.MESSAGES">MESSAGES</span>
469 class="voicemail-detail-form-container messages md-background-bg md-whiteframe-1dp"
472 ng-controller="VoicemailMessagesController as vm_dc"
473 ng-init="vm_dc.init(vm.voicemail, vm.crudPermissions)"
476 class="md-table-toolbar md-default"
477 ng-hide="vm_dc.selectedVoicemailMessages.length"
479 <div class="md-toolbar-tools">
480 <span class="md-subhead" translate="APP.MESSAGES"
484 on-search="vm_dc.query.filter = query"
485 on-collapse="vm_dc.query.filter = undefined"
493 class="md-table-toolbar md-accent"
494 ng-show="vm_dc.selectedVoicemailMessages.length"
496 <div class="md-toolbar-tools">
497 <span class="md-subhead"
498 >{{vm_dc.selectedVoicemailMessages.length}}
499 {{vm_dc.selectedVoicemailMessages.length > 1 ? 'items' :
500 'item'}} selected</span
504 class="md-icon-button"
505 ng-csv="vm_dc.exportSelectedVoicemailMessages"
507 filename="voicemails.csv"
509 <md-icon md-font-icon="icon-file-excel"></md-icon>
512 ng-if="vm_dc.crudPermissions.canDelete"
513 class="md-icon-button"
514 ng-click="vm_dc.deleteSelectedVoicemailMessages($event)"
515 aria-label="delete selected"
517 translate-attr-label="APP.DELETE_SELECTED"
519 <md-icon md-font-icon="icon-delete"></md-icon>
523 <md-table-container class="font-size-12">
528 ng-model="vm_dc.selectedVoicemailMessages"
529 md-progress="vm_dc.promise"
533 md-order="vm_dc.query.sort"
534 md-on-reorder="vm_dc.getVoicemailMessages"
537 <th md-column md-order-by="id">
538 {{ 'APP.ID' | translate }}
540 <th md-column md-order-by="callerid">
541 {{ 'APP.CALLER_ID' | translate }}
543 <th md-column md-order-by="duration">
544 {{ 'APP.DURATION' | translate }}
546 <th md-column md-order-by="audio">
547 {{ 'APP.AUDIO' | translate }}
549 <th md-column md-order-by="stamp">
550 {{ 'APP.RECEIVED_AT' | translate }}
552 <th md-column width="10px"></th>
560 ng-repeat="message in vm_dc.voicemailMessages.rows"
562 <td md-cell>{{message.id}}</td>
563 <td md-cell>{{message.callerid}}</td>
564 <td md-cell>{{message.duration}}</td>
566 <!-- audio recording directive -->
569 model="'voiceMailMessage'"
571 <!-- / audio recording directive -->
573 <td md-cell>{{ message.stamp | formatdate }}</td>
574 <td md-cell class="actions">
577 class="md-icon-button"
580 translate-attr-aria-label="APP.MORE"
581 ng-click="$mdMenu.open($event)"
584 md-font-icon="icon-dots-vertical"
588 <md-menu-content width="3">
590 ng-if="vm_dc.crudPermissions.canDelete"
593 ng-click="vm_dc.deleteConfirm(message, $event)"
594 translate="VOICE.DELETE_MESSAGE"
603 <tr md-row ng-if="!vm_dc.voicemailMessages.rows.length">
604 <td md-cell colspan="8">
605 <div layout="row" layout-align="center center">
607 class="text-boxed-light"
608 translate="APP.NO_MESSAGE_AVAILABLE"
609 >No message available</span
616 </md-table-container>
618 md-label="{page: '{{'VOICE.PAGE' | translate}}:', rowsPerPage: '{{'VOICE.ROWSPERPAGE' | translate}}:', of: '{{'VOICE.OF' | translate}}'}"
619 md-limit="vm_dc.query.limit"
620 md-limit-options="[10, 15, 20, 50, 100, 250]"
621 md-page="vm_dc.query.page"
622 md-total="{{vm_dc.voicemailMessages.count}}"
623 md-on-paginate="vm_dc.getVoicemailMessages"
626 </md-table-pagination>