Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
Sang D NGO
linagora.esn.most
Commits
37b37b76
Commit
37b37b76
authored
Apr 16, 2018
by
Khac Chien LANG
Browse files
Merge branch 'add-expert' into 'master'
Add expert See merge request
!14
parents
9b71a518
e4eddbf2
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
256 additions
and
1 deletion
+256
-1
frontend/app/app.less
frontend/app/app.less
+1
-0
frontend/app/components/expert-auto-complete/most-expert-auto-complete.component.js
...pert-auto-complete/most-expert-auto-complete.component.js
+13
-0
frontend/app/components/expert-auto-complete/most-expert-auto-complete.controller.js
...ert-auto-complete/most-expert-auto-complete.controller.js
+37
-0
frontend/app/components/expert-auto-complete/most-expert-auto-complete.less
...nents/expert-auto-complete/most-expert-auto-complete.less
+19
-0
frontend/app/components/expert-auto-complete/most-expert-auto-complete.pug
...onents/expert-auto-complete/most-expert-auto-complete.pug
+22
-0
frontend/app/proposal/detail/most-proposal-detail.controller.js
...nd/app/proposal/detail/most-proposal-detail.controller.js
+15
-0
frontend/app/proposal/detail/most-proposal-detail.pug
frontend/app/proposal/detail/most-proposal-detail.pug
+2
-1
frontend/app/proposal/detail/review/modal.pug
frontend/app/proposal/detail/review/modal.pug
+25
-0
frontend/app/proposal/detail/review/most-proposal-detail-review.controller.js
...l/detail/review/most-proposal-detail-review.controller.js
+59
-0
frontend/app/proposal/detail/subheader/most-proposal-detail-subheader.component.js
...ail/subheader/most-proposal-detail-subheader.component.js
+1
-0
frontend/app/proposal/detail/subheader/most-proposal-detail-subheader.pug
...posal/detail/subheader/most-proposal-detail-subheader.pug
+2
-0
frontend/app/services/most.service.js
frontend/app/services/most.service.js
+60
-0
No files found.
frontend/app/app.less
View file @
37b37b76
@import './sidebar/most-sidebar';
@import './proposal/most-proposal';
@import './components/expert-auto-complete/most-expert-auto-complete';
@media (min-width: @screen-md-min) {
.most-root {
...
...
frontend/app/components/expert-auto-complete/most-expert-auto-complete.component.js
0 → 100644
View file @
37b37b76
(
function
(
angular
)
{
'
use strict
'
;
angular
.
module
(
'
linagora.esn.most
'
)
.
component
(
'
mostExpertAutoComplete
'
,
{
templateUrl
:
'
/linagora.esn.most/app/components/expert-auto-complete/most-expert-auto-complete.html
'
,
controller
:
'
MostExpertAutoCompleteController
'
,
bindings
:
{
experts
:
'
=
'
}
});
})(
angular
);
frontend/app/components/expert-auto-complete/most-expert-auto-complete.controller.js
0 → 100644
View file @
37b37b76
(
function
(
angular
)
{
'
use strict
'
;
angular
.
module
(
'
linagora.esn.most
'
)
.
controller
(
'
MostExpertAutoCompleteController
'
,
MostExpertAutoCompleteController
);
function
MostExpertAutoCompleteController
(
$element
,
$q
,
_
,
elementScrollService
,
emailService
,
groupAttendeeProvider
)
{
var
self
=
this
;
self
.
search
=
search
;
function
search
(
query
)
{
return
groupAttendeeProvider
.
searchAttendee
(
query
);
}
self
.
onTagAdding
=
function
(
$tag
)
{
var
isValidTag
=
emailService
.
isValidEmail
(
$tag
.
email
)
&&
!
_isDuplicatedMember
(
$tag
,
self
.
experts
);
return
isValidTag
;
};
self
.
onTagAdded
=
function
()
{
elementScrollService
.
autoScrollDown
(
$element
.
find
(
'
div.tags
'
));
};
function
_isDuplicatedMember
(
newMember
,
members
)
{
return
!!
_
.
find
(
members
,
{
email
:
newMember
.
email
});
}
}
})(
angular
);
frontend/app/components/expert-auto-complete/most-expert-auto-complete.less
0 → 100644
View file @
37b37b76
most-expert-auto-complete {
.input-group {
.flex-row;
.input-group-addon {
margin: 15px;
.mdi {
font-size: 2em;
}
}
.most-experts-input {
.flex-column;
width: 100%;
}
}
}
frontend/app/components/expert-auto-complete/most-expert-auto-complete.pug
0 → 100644
View file @
37b37b76
.form-group
.input-group
span.input-group-addon
i.mdi.mdi-account-multiple-plus
.most-experts-input
.fg-line
tags-input.form-control(
ng-model='$ctrl.experts',
placeholder=__("Type a name or email..."),
display-property='email',
key-property='email',
replace-spaces-with-dashes='false',
on-tag-adding='$ctrl.onTagAdding($tag)',
on-tag-added='$ctrl.onTagAdded($tag)'
)
auto-complete(
source='$ctrl.search($query)',
min-length='1', debounce-delay='200',
max-results-to-show= '20',
template='/group/app/attendee/group-attendee-template.html'
)
frontend/app/proposal/detail/most-proposal-detail.controller.js
View file @
37b37b76
...
...
@@ -7,12 +7,14 @@
function
MostProposalDetailController
(
$state
,
$stateParams
,
$modal
,
mostProposalApiClient
)
{
var
self
=
this
;
self
.
$onInit
=
$onInit
;
self
.
onRejectBtnClick
=
onRejectBtnClick
;
self
.
onReviewBtnClick
=
onReviewBtnClick
;
self
.
onAcceptBtnClick
=
onAcceptBtnClick
;
function
$onInit
()
{
...
...
@@ -29,6 +31,19 @@
});
}
function
onReviewBtnClick
()
{
$modal
({
templateUrl
:
'
/linagora.esn.most/app/proposal/detail/review/modal.html
'
,
backdrop
:
'
static
'
,
placement
:
'
center
'
,
controllerAs
:
'
$ctrl
'
,
controller
:
'
MostProposalDetailReviewController
'
,
locals
:
{
proposal
:
self
.
proposal
}
});
}
function
onAcceptBtnClick
()
{
return
mostProposalApiClient
.
updateProposal
(
$stateParams
.
proposalId
,
{
status
:
'
ACCEPTED
'
})
.
then
(
function
()
{
...
...
frontend/app/proposal/detail/most-proposal-detail.pug
View file @
37b37b76
sub-header
most-proposal-detail-subheader(
title="$ctrl.proposal.formJson.title",
data-
title="$ctrl.proposal.formJson.title",
on-reject-btn-click="$ctrl.onRejectBtnClick()",
on-review-btn-click="$ctrl.onReviewBtnClick()",
on-accept-btn-click="$ctrl.onAcceptBtnClick()"
)
.card
...
...
frontend/app/proposal/detail/review/modal.pug
0 → 100644
View file @
37b37b76
.modal.most-modal.full-screen
form(name="form", ng-submit="$ctrl.send(); $hide()")
.modal-dialog
.modal-content
.modal-header
button.close(type="button", data-dismiss="modal", aria-label="Close", ng-click="$hide()")
span(aria-hidden="true") ×
h4.modal-title #{__('Lấy ý kiến chuyên gia')}
.modal-body
p
| #{__('Chọn một nhóm chuyên gia:')}
most-expert-auto-complete(experts="$ctrl.experts")
ng-form(name="form")
.form-group
span.p-r-25
| #{__('Đặt lịch họp:')}
toggle-switch(ng-model='$ctrl.invite', color='blue', form="form")
.modal-footer.flex
.flex-vertical-centered.flex-end
button.btn.btn-link(type="button", ng-click="$hide()")
| #{__('Cancel')}
button.btn.btn-primary(type="submit", ng-disabled="form.$invalid || form.$pending")
| #{__('Send')}
frontend/app/proposal/detail/review/most-proposal-detail-review.controller.js
0 → 100644
View file @
37b37b76
(
function
(
angular
)
{
'
use strict
'
;
angular
.
module
(
'
linagora.esn.most
'
)
.
controller
(
'
MostProposalDetailReviewController
'
,
MostProposalDetailReviewController
);
function
MostProposalDetailReviewController
(
$state
,
$stateParams
,
$modal
,
$q
,
proposal
,
mostProposalApiClient
,
mostService
)
{
var
self
=
this
;
self
.
$onInit
=
$onInit
;
self
.
send
=
send
;
function
$onInit
()
{
self
.
experts
=
[];
}
function
send
()
{
var
userIds
=
_getUserIdsFromGroups
(
self
.
experts
||
[]);
mostProposalApiClient
.
updateProposal
(
$stateParams
.
proposalId
,
{
reviewers
:
userIds
,
status
:
'
REVIEWING
'
})
.
then
(
_inviteExperts
)
.
finally
(
function
()
{
$state
.
go
(
'
most.proposal
'
);
});
}
function
_getUserIdsFromGroups
(
groups
)
{
var
userIds
=
[];
groups
.
forEach
(
function
(
group
)
{
group
.
members
.
forEach
(
function
(
item
)
{
if
(
item
.
member
.
objectType
===
'
user
'
)
{
userIds
.
push
(
item
.
member
.
id
);
}
});
});
return
userIds
;
}
function
_inviteExperts
()
{
if
(
self
.
invite
)
{
return
mostService
.
inviteExperts
(
proposal
.
formJson
.
title
,
self
.
experts
);
}
return
$q
.
when
();
}
}
})(
angular
);
frontend/app/proposal/detail/subheader/most-proposal-detail-subheader.component.js
View file @
37b37b76
...
...
@@ -8,6 +8,7 @@
bindings
:
{
title
:
'
<
'
,
onRejectBtnClick
:
'
&
'
,
onReviewBtnClick
:
'
&
'
,
onAcceptBtnClick
:
'
&
'
}
});
...
...
frontend/app/proposal/detail/subheader/most-proposal-detail-subheader.pug
View file @
37b37b76
...
...
@@ -12,6 +12,8 @@ block right
ul.dropdown-menu.dropdown-menu-right
li
a(href='', ng-click='$ctrl.onRejectBtnClick()') Từ chối
li
a(href='', ng-click='$ctrl.onReviewBtnClick()') Xem xét
li
a(href='', ng-click='$ctrl.onAcceptBtnClick()') Duyệt
frontend/app/services/most.service.js
0 → 100644
View file @
37b37b76
(
function
(
angular
)
{
'
use strict
'
;
angular
.
module
(
'
linagora.esn.most
'
)
.
factory
(
'
mostService
'
,
mostService
);
function
mostService
(
uuid4
,
session
,
CalendarShell
,
calEventAPI
,
calMoment
,
calAttendeesDenormalizerService
,
esnMemberResolverRegistry
,
calAttendeeService
,
ICAL
)
{
return
{
inviteExperts
:
inviteExperts
};
function
inviteExperts
(
title
,
experts
)
{
var
vcalendar
=
new
ICAL
.
Component
(
'
vcalendar
'
);
var
vevent
=
new
ICAL
.
Component
(
'
vevent
'
);
var
uuid
=
uuid4
.
generate
();
vcalendar
.
addSubcomponent
(
vevent
);
vevent
.
addPropertyWithValue
(
'
uid
'
,
uuid
);
var
shell
=
new
CalendarShell
(
vcalendar
);
var
eventPath
=
'
/calendars/
'
+
session
.
user
.
_id
+
'
/events/
'
+
uuid
+
'
.ics
'
;
shell
.
title
=
'
V/v:
'
+
title
;
shell
.
start
=
calMoment
().
add
(
2
,
'
hour
'
);
shell
.
end
=
calMoment
().
add
(
5
,
'
hour
'
);
shell
.
organizer
=
session
.
user
;
shell
.
path
=
eventPath
;
groupMemberResolver
(
experts
[
0
]).
then
(
function
(
attendees
)
{
shell
.
attendees
=
attendees
;
return
calEventAPI
.
create
(
eventPath
,
shell
.
vcalendar
,
{});
});
}
function
groupMemberResolver
(
group
)
{
var
resolver
=
esnMemberResolverRegistry
.
getResolver
(
'
group
'
);
if
(
!
resolver
)
{
return
group
;
}
return
resolver
.
resolve
(
group
.
email
).
then
(
function
(
members
)
{
return
members
.
map
(
function
(
member
)
{
return
calAttendeeService
.
userAsAttendee
(
member
.
member
);
});
});
}
}
})(
angular
);
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment