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
lemonldap-ng
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
258
Issues
258
List
Boards
Labels
Service Desk
Milestones
Merge Requests
4
Merge Requests
4
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
LemonLDAP NG
lemonldap-ng
Commits
d1923af5
Commit
d1923af5
authored
Mar 14, 2016
by
Yadd
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Switch javascript to coffeescript
parent
1500a1b8
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
2022 additions
and
1120 deletions
+2022
-1120
Makefile
Makefile
+12
-2
lemonldap-ng-manager/site/coffee/llApp.coffee
lemonldap-ng-manager/site/coffee/llApp.coffee
+237
-0
lemonldap-ng-manager/site/coffee/manager.coffee
lemonldap-ng-manager/site/coffee/manager.coffee
+722
-0
lemonldap-ng-manager/site/static/js/llApp.js
lemonldap-ng-manager/site/static/js/llApp.js
+233
-243
lemonldap-ng-manager/site/static/js/llApp.min.js
lemonldap-ng-manager/site/static/js/llApp.min.js
+1
-1
lemonldap-ng-manager/site/static/js/manager.js
lemonldap-ng-manager/site/static/js/manager.js
+816
-873
lemonldap-ng-manager/site/static/js/manager.min.js
lemonldap-ng-manager/site/static/js/manager.min.js
+1
-1
No files found.
Makefile
View file @
d1923af5
...
...
@@ -190,6 +190,10 @@ JSSRCFILES:=$(shell find $(SRCMANAGERDIR)/site/static/js $(SRCPORTALDIR)/example
$(SRCMANAGERDIR)
/site/static/bwr/file-saver.js/FileSaver.js
CSSSRCFILES
:=
$(
shell
find
$(SRCMANAGERDIR)
/site/static/css
$(SRCPORTALDIR)
/example
-type
f
-name
'*.css'
!
-name
'*.min.css'
)
# Coffee files
COFFEESRCFILES
:=
$(
shell
find
$(SRCMANAGERDIR)
/site/coffee/
-type
f
)
COFFEEDSTFILES
:=
$(
subst
coffee/,static/js/,
$(COFFEESRCFILES:.coffee=.js)
)
# Minified files
JSDSTFILES
=
$(JSSRCFILES:.js=.min.js)
CSSDSTFILES
=
$(CSSSRCFILES:.css=.min.css)
...
...
@@ -258,6 +262,12 @@ configure: json common_conf handler_conf portal_conf manager_conf
minify
:
$(JSDSTFILES) $(CSSDSTFILES)
$(SRCMANAGERDIR)/site/static/js/%.js
:
$(SRCMANAGERDIR)/site/coffee/%.coffee
@
if
which coffee
>
/dev/null
;
then
\
echo
"Compiling
$(SRCMANAGERDIR)
/site/coffee/
$*
.coffee"
;
\
coffee
-c
-o
$(SRCMANAGERDIR)
/site/static/js/
$(SRCMANAGERDIR)
/site/coffee/
$*
.coffee
;
\
fi
%.min.css
:
%.css
@
echo
"Compressing
$*
.css"
@
yui-compressor
$*
.css
>
$*
.min.css
...
...
@@ -272,7 +282,7 @@ fastcgi-server/man/llng-fastcgi-server.1p: fastcgi-server/sbin/llng-fastcgi-serv
# Perl libraries configuration
json
:
$(MANAGERJSONDST) fastcgi-server/man/llng-fastcgi-server.1p
@
if
which yui-compressor
;
then
$(MAKE)
minify
;
fi
@
if
which yui-compressor
>
/dev/null
;
then
$(MAKE)
minify
;
fi
$(MANAGERJSONDST)
:
$(MANAGERJSONSRC)
./scripts/jsongenerator.pl
...
...
@@ -1010,7 +1020,7 @@ tidy: clean
$(MAKE)
json
tidy-js
:
clean
@
find
$(SRCMANAGERDIR)
/site/static/js/
e2e-tests/
$(SRCPORTALDIR)
/example
\
@
find e2e-tests/
$(SRCPORTALDIR)
/example
\
-type
f
\
-name
'*.js'
\
!
-name
'jq*'
\
...
...
lemonldap-ng-manager/site/coffee/llApp.coffee
0 → 100644
View file @
d1923af5
###
LemonLDAP::NG base app module
This file contains:
- 3 AngularJS directives (HTML attributes):
* `on-read-file` to get file content
* `resizer` to resize HTML div
* `trspan` to set translated message in HTML content
- a AngularJS factory to handle 401 Ajax responses
###
llapp
=
angular
.
module
'llApp'
,
[]
# TRANSLATION SYSTEM
#
# It provides:
# - 3 functions to translate:
# * translate(word)
# * translateP(paragraph): only __words__ are translated
# * translateField(object, property)
# - an HTML attribute called 'trspan'. Exemple: <h3 trspan="portal"/>
# $translator provider
llapp
.
provider
'$translator'
,
->
res
=
{}
# Language detection
if
navigator
langs
=
[]
langs2
=
[]
nlangs
=
[
navigator
.
language
]
if
navigator
.
languages
nlangs
=
navigator
.
languages
for
nl
in
nlangs
for
al
in
window
.
availableLanguages
if
al
==
nl
langs
.
push
al
else
if
al
.
substring
(
0
,
1
)
==
nl
.
substring
(
0
,
1
)
langs2
.
push
al
res
.
lang
=
if
langs
[
0
]
then
langs
[
0
]
else
if
langs2
[
0
]
then
langs2
[
0
]
else
'en'
;
else
res
.
lang
=
'en'
# Internal properties
res
.
deferredTr
=
[]
res
.
translationFields
=
{}
# Translation methods
# 1. word translation
res
.
translate
=
(
s
)
->
if
res
.
translationFields
[
s
]
s
=
res
.
translationFields
[
s
]
return
s
# 2. node field translation
res
.
translateField
=
(
node
,
field
)
->
res
.
translate
node
[
field
]
# 3. paragraph translation (verify that json is available
res
.
translateP
=
(
s
)
->
if
s
and
res
.
translationFields
.
portal
s
=
s
.
replace
/__(\w+)__/g
,
(
match
,
w
)
->
res
.
translate
w
s
# Initialization
this
.
$get
=
[
'$q'
,
'$http'
,
(
$q
,
$http
)
->
res
.
last
=
''
res
.
init
=
(
lang
)
->
lang
=
res
.
lang
unless
lang
d
=
$q
.
defer
()
if
res
.
last
!=
lang
res
.
last
=
lang
$http
.
get
(
"
#{
window
.
staticPrefix
}
languages/
#{
lang
}
.json"
).
then
(
response
)
->
res
.
translationFields
=
response
.
data
for
h
in
res
.
deferredTr
h
.
e
[
h
.
f
]
res
.
translationFields
[
h
.
m
]
res
.
deferredTr
=
[]
d
.
resolve
"Translation files loaded"
,
(
response
)
->
d
.
reject
''
else
d
.
resolve
"No change"
d
.
promise
res
]
this
# Translation directive (HTML trspan tag)
llapp
.
directive
'trspan'
,
[
'$translator'
,
(
$translator
)
->
restrict
:
'A'
replace
:
false
transclude
:
true
scope
:
trspan
:
"@"
link
:
(
scope
,
elem
,
attr
)
->
if
$translator
.
translationFields
.
portal
attr
.
trspan
=
$translator
.
translate
(
attr
.
trspan
)
# Deferred translations will be done after JSON download
else
$translator
.
deferredTr
.
push
e
:
elem
f
:
'text'
m
:
attr
.
trspan
elem
.
text
attr
.
trspan
template
:
''
]
# Form menu management
#
# Two parts:
# - $htmlParams: used to store values inserted as <script type="text/menu">.
# It provides menu() method to get them
# - HTML "script" element handler
llapp
.
provider
'$htmlParams'
,
->
this
.
$get
=
->
params
=
{}
set
:
(
key
,
obj
)
->
params
[
key
]
=
obj
menu
:
->
params
.
menu
# To be used later
params
:
->
params
.
params
this
llapp
.
directive
'script'
,
[
'$htmlParams'
,
(
$htmlParams
)
->
restrict
:
'E'
terminal
:
true
compile
:
(
element
,
attr
)
->
if
t
=
attr
.
type
.
match
/text\/(menu|parameters)/
$htmlParams
.
set
t
[
1
],
eval
element
[
0
].
text
]
# Modal controller used to display messages
llapp
.
controller
'ModalInstanceCtrl'
,
[
'$scope'
,
'$uibModalInstance'
,
'elem'
,
'set'
,
'init'
,
(
$scope
,
$uibModalInstance
,
elem
,
set
,
init
)
->
oldvalue
=
null
$scope
.
elem
=
elem
$scope
.
set
=
set
$scope
.
result
=
init
$scope
.
staticPrefix
=
window
.
staticPrefix
currentNode
=
elem
'currentNode'
$scope
.
translateP
=
elem
'translateP'
if
currentNode
oldValue
=
currentNode
.
data
$scope
.
currentNode
=
currentNode
$scope
.
ok
=
->
set
(
'result'
,
$scope
.
result
)
$uibModalInstance
.
close
(
true
)
$scope
.
cancel
=
->
if
currentNode
then
$scope
.
currentNode
.
data
=
oldValue
$uibModalInstance
.
dismiss
(
'cancel'
)
# test if value is in select
$scope
.
inSelect
=
(
value
)
->
for
i
in
$scope
.
currentNode
.
select
if
i
.
k
==
value
then
return
true
return
false
]
# File reader directive
#
# Add "onReadFile" HTML attribute to be used in a "file" input
# The content off attribute will be launched.
#
# Example:
# <input type="file" on-read-file="replaceContent($fileContent)"/>
llapp
.
directive
'onReadFile'
,
[
'$parse'
,
(
$parse
)
->
restrict
:
'A'
scope
:
false
link
:
(
scope
,
element
,
attrs
)
->
fn
=
$parse
attrs
.
onReadFile
element
.
on
'change'
,
(
onChangeEvent
)
->
reader
=
new
FileReader
()
reader
.
onload
=
(
onLoadEvent
)
->
scope
.
$apply
()
->
fn
scope
,
$fileContent
:
onLoadEvent
.
target
.
result
reader
.
readAsText
((
onChangeEvent
.
srcElement
||
onChangeEvent
.
target
).
files
[
0
])
]
# Resize system
#
# Add a "resizer" HTML attribute
llapp
.
directive
'resizer'
,
[
'$document'
,
(
$document
)
->
hsize
=
null
rsize
=
null
(
$scope
,
$element
,
$attrs
)
->
$element
.
on
'mousedown'
,
(
event
)
->
if
$attrs
.
resizer
==
'vertical'
rsize
=
$
(
$attrs
.
resizerRight
).
width
()
+
$
(
$attrs
.
resizerLeft
).
width
()
else
hsize
=
$
(
$attrs
.
resizerTop
).
height
()
+
$
(
$attrs
.
resizerBottom
).
height
()
event
.
preventDefault
()
$document
.
on
'mousemove'
,
mousemove
$document
.
on
'mouseup'
,
mouseup
mousemove
=
(
event
)
->
# Handle vertical resizer
if
$attrs
.
resizer
==
'vertical'
x
=
event
.
pageX
if
$attrs
.
resizerMax
and
x
>
$attrs
.
resizerMax
x
=
parseInt
$attrs
.
resizerMax
$
(
$attrs
.
resizerLeft
).
css
width
:
"
#{
x
}
px"
$
(
$attrs
.
resizerRight
).
css
width
:
"
#{
rsize
-
x
}
px"
# Handle horizontal resizer
else
y
=
event
.
pageY
-
$
(
'#navbar'
).
height
()
$
(
$attrs
.
resizerTop
).
css
height
:
"
#{
y
}
px"
$
(
$attrs
.
resizerBottom
).
css
height
:
"
#{
hsize
-
y
}
px"
mouseup
=
()
->
$document
.
unbind
'mousemove'
,
mousemove
$document
.
unbind
'mouseup'
,
mouseup
]
###
# Authentication system
#
# If a 401 code is returned and if "Authorization" header contains an url,
# user is redirected to this url (but target is replaced by location.href
###
llapp
.
factory
'$lmhttp'
,
[
'$q'
,
'$location'
,
(
$q
,
$location
)
->
responseError
:
(
rejection
)
->
if
rejection
.
status
==
401
and
window
.
portal
window
.
location
=
"
#{
window
.
portal
}
?url="
+
window
.
btoa
(
window
.
location
).
replace
(
/\//
,
'_'
)
]
llapp
.
config
[
'$httpProvider'
,
(
$httpProvider
)
->
$httpProvider
.
interceptors
.
push
'$lmhttp'
]
lemonldap-ng-manager/site/coffee/manager.coffee
0 → 100644
View file @
d1923af5
This diff is collapsed.
Click to expand it.
lemonldap-ng-manager/site/static/js/llApp.js
View file @
d1923af5
/* LemonLDAP::NG base app module
*
* This file contains:
* - 3 AngularJS directives (HTML attributes):
* * `on-read-file` to get file content
* * `resizer` to resize HTML div
* * `trspan` to set translated message in HTML content
* - a AngularJS factory to handle 401 Ajax responses
*/
// Generated by CoffeeScript 1.10.0
(
function
()
{
'
use strict
'
;
var
llapp
=
angular
.
module
(
'
llApp
'
,
[]);
/*
LemonLDAP::NG base app module
/* Translation system
*
* This part provides:
* - 3 functions to translate:
* * translate(word)
* * translateP(paragraph)
* * translateField(object, property)
* - an HTML attribute called 'trspan'. Exemple: <h3 trspan="portal"/>
*/
This file contains:
- 3 AngularJS directives (HTML attributes):
* `on-read-file` to get file content
* `resizer` to resize HTML div
* `trspan` to set translated message in HTML content
- a AngularJS factory to handle 401 Ajax responses
*/
llapp
.
provider
(
'
$translator
'
,
$Translator
);
(
function
()
{
var
llapp
;
function
$Translator
()
{
var
res
=
{};
llapp
=
angular
.
module
(
'
llApp
'
,
[]);
/* Search for default language */
llapp
.
provider
(
'
$translator
'
,
function
()
{
var
al
,
j
,
k
,
langs
,
langs2
,
len
,
len1
,
nl
,
nlangs
,
ref
,
res
;
res
=
{};
if
(
navigator
)
{
var
nlangs
=
[
navigator
.
language
];
if
(
navigator
.
languages
)
nlangs
=
navigator
.
languages
;
var
langs
=
[],
langs
=
[];
langs2
=
[];
nlangs
.
forEach
(
function
(
nl
)
{
availableLanguages
.
forEach
(
function
(
al
)
{
if
(
al
==
nl
)
{
langs
.
push
(
al
)
}
else
if
(
al
.
substring
(
0
,
1
)
==
nl
.
substring
(
0
,
1
))
{
nlangs
=
[
navigator
.
language
];
if
(
navigator
.
languages
)
{
nlangs
=
navigator
.
languages
;
}
for
(
j
=
0
,
len
=
nlangs
.
length
;
j
<
len
;
j
++
)
{
nl
=
nlangs
[
j
];
ref
=
window
.
availableLanguages
;
for
(
k
=
0
,
len1
=
ref
.
length
;
k
<
len1
;
k
++
)
{
al
=
ref
[
k
];
if
(
al
===
nl
)
{
langs
.
push
(
al
);
}
else
if
(
al
.
substring
(
0
,
1
)
===
nl
.
substring
(
0
,
1
))
{
langs2
.
push
(
al
);
}
}
);
}
);
}
}
res
.
lang
=
langs
[
0
]
?
langs
[
0
]
:
langs2
[
0
]
?
langs2
[
0
]
:
'
en
'
;
}
else
{
res
.
lang
=
'
en
'
;
}
/* Private properties */
res
.
deferredTr
=
[];
res
.
translationFields
=
{};
/* Translation methods */
/* 1 - word translation */
res
.
translate
=
function
(
s
)
{
if
(
res
.
translationFields
[
s
])
{
s
=
res
.
translationFields
[
s
];
}
return
s
;
};
/* 2 - object key translation */
res
.
translateField
=
function
(
node
,
field
)
{
return
res
.
translate
(
node
[
field
]);
};
/* 3 - paragraph translation */
res
.
translateP
=
function
(
s
)
{
if
(
s
&&
res
.
translationFields
.
portal
)
s
=
s
.
replace
(
/__
(\w
+
)
__/g
,
function
(
match
,
w
)
{
return
res
.
translate
(
w
);
});
if
(
s
&&
res
.
translationFields
.
portal
)
{
s
=
s
.
replace
(
/__
(\w
+
)
__/g
,
function
(
match
,
w
)
{
return
res
.
translate
(
w
);
});
}
return
s
;
};
this
.
$get
=
[
'
$q
'
,
'
$http
'
,
function
(
$q
,
$http
)
{
res
.
last
=
''
;
res
.
init
=
function
(
lang
)
{
var
d
;
if
(
!
lang
)
{
lang
=
res
.
lang
;
}
d
=
$q
.
defer
();
if
(
res
.
last
!==
lang
)
{
res
.
last
=
lang
;
$http
.
get
(
window
.
staticPrefix
+
"
languages/
"
+
lang
+
"
.json
"
).
then
(
function
(
response
)
{
var
h
,
l
,
len2
,
ref1
;
res
.
translationFields
=
response
.
data
;
ref1
=
res
.
deferredTr
;
for
(
l
=
0
,
len2
=
ref1
.
length
;
l
<
len2
;
l
++
)
{
h
=
ref1
[
l
];
h
.
e
[
h
.
f
](
res
.
translationFields
[
h
.
m
]);
}
res
.
deferredTr
=
[];
return
d
.
resolve
(
"
Translation files loaded
"
);
},
function
(
response
)
{
return
d
.
reject
(
''
);
});
}
else
{
d
.
resolve
(
"
No change
"
);
}
return
d
.
promise
;
};
return
res
;
}
];
return
this
;
});
/* Initialization */
this
.
$get
=
[
'
$q
'
,
'
$http
'
,
function
(
$q
,
$http
)
{
res
.
last
=
''
;
res
.
init
=
function
(
lang
)
{
if
(
!
lang
)
lang
=
res
.
lang
;
var
d
=
$q
.
defer
();
if
(
res
.
last
!=
lang
)
{
res
.
last
=
lang
;
$http
.
get
(
staticPrefix
+
'
languages/
'
+
lang
+
'
.json
'
).
then
(
function
(
response
)
{
res
.
translationFields
=
response
.
data
;
res
.
deferredTr
.
forEach
(
function
(
h
)
{
h
.
e
[
h
.
f
](
res
.
translationFields
[
h
.
m
]);
llapp
.
directive
(
'
trspan
'
,
[
'
$translator
'
,
function
(
$translator
)
{
return
{
restrict
:
'
A
'
,
replace
:
false
,
transclude
:
true
,
scope
:
{
trspan
:
"
@
"
},
link
:
function
(
scope
,
elem
,
attr
)
{
if
(
$translator
.
translationFields
.
portal
)
{
attr
.
trspan
=
$translator
.
translate
(
attr
.
trspan
);
}
else
{
$translator
.
deferredTr
.
push
({
e
:
elem
,
f
:
'
text
'
,
m
:
attr
.
trspan
});
res
.
deferredTr
=
[];
d
.
resolve
(
"
Translation files loaded
"
);
},
function
(
resp
)
{
d
.
reject
(
''
);
});
}
else
{
d
.
resolve
(
'
No change
'
);
}
return
d
.
promise
;
}
return
elem
.
text
(
attr
.
trspan
);
},
template
:
''
};
return
res
;
}];
}
/* Translation directive (HTML trspan tag) */
llapp
.
directive
(
'
trspan
'
,
[
'
$translator
'
,
function
(
$translator
)
{
return
{
restrict
:
'
A
'
,
replace
:
false
,
transclude
:
true
,
scope
:
{
trspan
:
"
@
"
},
link
:
function
(
scope
,
elem
,
attr
)
{
if
(
$translator
.
translationFields
.
portal
)
{
attr
.
trspan
=
$translator
.
translate
(
attr
.
trspan
)
}
/* Deferred translations will be done after JSON download */
else
{
$translator
.
deferredTr
.
push
({
e
:
elem
,
f
:
'
text
'
,
m
:
attr
.
trspan
});
}
elem
.
text
(
attr
.
trspan
);
},
template
:
""
}
}
]);
]);
/* Form menu management
*
* Two parts:
* - $htmlParams: used to store values inserted as <script type="text/menu">.
* It provides menu() method to get them
* - HTML "script" element handler
*/
llapp
.
provider
(
'
$htmlParams
'
,
$HtmlParamsProvider
);
function
$HtmlParamsProvider
()
{
llapp
.
provider
(
'
$htmlParams
'
,
function
()
{
this
.
$get
=
function
()
{
var
params
=
{};
var
params
;
params
=
{};
return
{
set
:
function
(
key
,
obj
)
{
params
[
key
]
=
obj
;
return
params
[
key
]
=
obj
;
},
menu
:
function
()
{
return
params
.
menu
;
...
...
@@ -152,155 +138,159 @@
}
};
};
}
return
this
;
});
llapp
.
directive
(
'
script
'
,
[
'
$htmlParams
'
,
function
(
$htmlParams
)
{
return
{
restrict
:
'
E
'
,
terminal
:
true
,
compile
:
function
(
element
,
attr
)
{
var
t
;
if
(
t
=
attr
.
type
.
match
(
/text
\/(
menu|parameters
)
/
))
{
$htmlParams
.
set
(
t
[
1
],
eval
(
element
[
0
].
text
));
llapp
.
directive
(
'
script
'
,
[
'
$htmlParams
'
,
function
(
$htmlParams
)
{
return
{
restrict
:
'
E
'
,
terminal
:
true
,
compile
:
function
(
element
,
attr
)
{
var
t
;
if
(
t
=
attr
.
type
.
match
(
/text
\/(
menu|parameters
)
/
))
{
return
$htmlParams
.
set
(
t
[
1
],
eval
(
element
[
0
].
text
));
}
}
}
}
}]);
/* Modal controller
*
* Used to display messages
*/
llapp
.
controller
(
'
ModalInstanceCtrl
'
,
[
'
$scope
'
,
'
$uibModalInstance
'
,
'
elem
'
,
'
set
'
,
'
init
'
,
function
(
$scope
,
$uibModalInstance
,
elem
,
set
,
init
)
{
var
oldValue
;
$scope
.
elem
=
elem
;
$scope
.
set
=
set
;
$scope
.
result
=
init
;
$scope
.
staticPrefix
=
staticPrefix
;
var
currentNode
=
elem
(
'
currentNode
'
);
$scope
.
translateP
=
elem
(
'
translateP
'
);
if
(
currentNode
)
{
oldValue
=
currentNode
.
data
;
$scope
.
currentNode
=
currentNode
;
};
}
]);
$scope
.
ok
=
function
()
{
set
(
'
result
'
,
$scope
.
result
);
$uibModalInstance
.
close
(
true
);
};
$scope
.
cancel
=
function
()
{
if
(
currentNode
)
$scope
.
currentNode
.
data
=
oldValue
;
$uibModalInstance
.
dismiss
(
'
cancel
'
);
};
/* test if value is in select */
$scope
.
inSelect
=
function
(
value
)
{
for
(
var
i
=
0
;
i
<
$scope
.
currentNode
.
select
.
length
;
i
++
)
{
if
(
$scope
.
currentNode
.
select
[
i
].
k
==
value
)
return
true
;
llapp
.
controller
(
'
ModalInstanceCtrl
'
,
[
'
$scope
'
,
'
$uibModalInstance
'
,
'
elem
'
,
'
set
'
,
'
init
'
,
function
(
$scope
,
$uibModalInstance
,
elem
,
set
,
init
)
{
var
currentNode
,
oldValue
,
oldvalue
;
oldvalue
=
null
;
$scope
.
elem
=
elem
;
$scope
.
set
=
set
;
$scope
.
result
=
init
;
$scope
.
staticPrefix
=
window
.
staticPrefix
;
<