Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
irul
/
opensipkd-base
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Wiki
Settings
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit d65b84ee
authored
Feb 21, 2025
by
aa.gusti
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
perbaikan datatable dan css
1 parent
a3d64342
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
137 additions
and
114 deletions
opensipkd/base/static/css/osipkd.css
opensipkd/base/views/base_views.py
opensipkd/base/views/departemen.py
opensipkd/base/views/templates/base3.1.pt
opensipkd/base/views/user_login.py
opensipkd/base/views/widgets/autocomplete_input_ms.pt
opensipkd/detable/detable.py
opensipkd/detable/templates/detable.pt
opensipkd/base/static/css/osipkd.css
View file @
d65b84e
body
{
font-family
:
"Open Sans"
,
"Helvetica Neue"
,
Helvetica
,
Arial
,
sans-serif
;
font-family
:
"Open Sans"
,
"Helvetica Neue"
,
Helvetica
,
Arial
,
sans-serif
;
--font-weight
:
300
;
--color
:
#ffffff
;
--background
:
#bc2131
;
font-size
:
12px
!important
;
padding-top
:
40px
;
}
h1
,
h2
,
h3
,
...
...
@@ -21,107 +21,116 @@ legend {
}
.bar
{
height
:
18px
;
background
:
green
;
height
:
18px
;
background
:
green
;
}
.twitter-typeahead
.tt-query
,
.twitter-typeahead
.tt-hint
{
margin-bottom
:
0
;
width
:
100%
;
height
:
26px
;
position
:
absolute
;
top
:
0
;
left
:
0
;
}
margin-bottom
:
0
;
width
:
100%
;
height
:
26px
;
position
:
absolute
;
top
:
0
;
left
:
0
;
}
.twitter-typeahead
.tt-hint
{
color
:
#a1a1a1
;
z-index
:
1
;
padding
:
3px
6px
;
border
:
1px
solid
transparent
;
}
color
:
#a1a1a1
;
z-index
:
1
;
padding
:
3px
6px
;
border
:
1px
solid
transparent
;
}
.select2-container
.select2-selection--single
.select2-selection__rendered
{
/* display: block; */
/* padding-left: 8px; */
/* padding-right: 20px; */
overflow
:
hidden
;
/* text-overflow: ellipsis; */
/* white-space: nowrap; */
padding
:
3px
6px
;
}
.form-control
{
font-size
:
12px
;
padding
:
3px
6px
!important
;
height
:
26px
;
}
.btn
{
.btn
{
font-size
:
12px
;
padding
:
3px
6px
;
height
:
26px
;
}
.input-group-addon
{
.input-group-addon
{
padding
:
3px
6px
;
height
:
26px
;
font-size
:
12px
;
}
.picker__select--month
,
.picker__select--year
{
padding
:
0.1em
;
/*height: 3em;*/
.picker__select--month
,
.picker__select--year
{
padding
:
0.1em
;
/*height: 3em;*/
}
.container
{
--max-width
:
1024px
;
--max-width
:
1024px
;
}
.container
.info
{
font-size
:
18px
;
padding
:
14px
;
color
:
#fff
;
font-size
:
18px
;
padding
:
14px
;
color
:
#fff
;
}
.container
.btn-menu
{
text-align
:
left
;
font-size
:
16px
;
padding
:
14px
24px
;
border-radius
:
6px
;
border
:
0px
none
;
width
:
100%
;
margin-bottom
:
10px
;
.container
.btn-menu
{
text-align
:
left
;
font-size
:
16px
;
padding
:
14px
24px
;
border-radius
:
6px
;
border
:
0px
none
;
width
:
100%
;
margin-bottom
:
10px
;
}
.container
.btn-login
{
font-size
:
18px
;
padding
:
10px
20px
;
border-radius
:
6px
;
border
:
0px
none
;
background
:
#BC
2131
;
background-image
:
linear-gradient
(
to
bottom
,
#C6414E
0px
,
#BC
2131
100%
);
background-repeat
:
repeat-x
;
.container
.btn-login
{
font-size
:
18px
;
padding
:
10px
20px
;
border-radius
:
6px
;
border
:
0px
none
;
background
:
#bc
2131
;
background-image
:
linear-gradient
(
to
bottom
,
#c6414e
0px
,
#bc
2131
100%
);
background-repeat
:
repeat-x
;
margin-top
:
20px
;
margin-top
:
20px
;
}
.container
.btn-logout
{
margin-top
:
12px
;
.container
.btn-logout
{
margin-top
:
12px
;
}
.container
.btn-login
:hover
{
background
:
#BC
2131
;
.container
.btn-login
:hover
{
background
:
#bc
2131
;
}
.container
.btn-login
.label
{
display
:
block
;
font-size
:
8px
;
.container
.btn-login
.label
{
display
:
block
;
font-size
:
8px
;
}
/* dataTables Customize */
table
.dataTable
thead
{
background-color
:
#EAEAEA
;
background-color
:
#eaeaea
;
}
table
.dataTable
tr
.even.selected
td
{
background-color
:
#B0BED
9
;
background-color
:
#b0bed
9
;
}
table
.dataTable
tr
.odd.selected
td
{
background-color
:
#9FAFD
1
;
background-color
:
#9fafd
1
;
}
table
.dataTable
tr
.selected
td
{
background-color
:
#9FAFD
1
;
background-color
:
#9fafd
1
;
}
/*
...
...
@@ -169,7 +178,7 @@ div.tab-content {
}
*/
.form-horizontal
.form-group
{
margin-bottom
:
4px
!important
;
margin-bottom
:
4px
!important
;
}
.picker
{
...
...
@@ -189,6 +198,6 @@ div.tab-content {
font-size
:
10px
!important
;
}
.paginate_button
.current
{
.paginate_button
.current
{
font-size
:
10px
!important
;
}
\ No newline at end of file
}
opensipkd/base/views/base_views.py
View file @
d65b84e
...
...
@@ -720,6 +720,8 @@ class BaseView(object):
for
k
in
cstruct
:
val
=
cstruct
.
get
(
k
)
if
type
(
val
)
is
dict
:
if
k
not
in
value
:
value
[
k
]
=
{}
value
[
k
]
=
self
.
update_value
(
value
[
k
],
val
)
elif
val
:
value
[
k
]
=
cstruct
.
get
(
k
)
...
...
@@ -747,14 +749,7 @@ class BaseView(object):
e
.
cstruct
[
f
.
name
])
if
f
.
name
==
"captcha"
:
e
.
cstruct
[
f
.
name
]
=
self
.
get_captcha_url
()
# if e.cstruct[f.name]:
# cstruct = {}
value
=
self
.
update_value
(
value
,
e
.
cstruct
)
# for k in cstruct:
# if not e.cstruct.get(k):
# e.cstruct[k] = value[k]
# value.update(e.cstruct)
# value.update(cstruct)
form
.
set_appstruct
(
value
)
return
self
.
returned_form
(
form
,
table
,
**
kwargs
)
...
...
@@ -771,13 +766,6 @@ class BaseView(object):
form
.
set_appstruct
(
values
)
return
self
.
returned_form
(
form
,
table
,
**
kwargs
)
def
view_act
(
self
,
**
kwargs
):
if
self
.
req
.
matchdict
[
'act'
]
==
'grid'
:
if
self
.
req
.
params
.
get
(
"paren"
):
return
self
.
get_list
(
**
kwargs
)
return
self
.
get_list
(
**
kwargs
)
return
super
()
.
view_act
(
**
kwargs
)
def
save
(
self
,
values
,
user
,
row
=
None
):
log
.
info
(
"Save"
)
log
.
debug
(
values
)
...
...
@@ -890,7 +878,7 @@ class BaseView(object):
form
=
self
.
get_form
(
self
.
edit_schema
,
**
kwargs
)
table
=
self
.
get_item_table
(
row
)
resources
=
form
.
get_widget_resources
(
)
values
=
self
.
get_values
(
row
)
if
request
.
POST
:
if
'save'
in
request
.
POST
:
controls
=
request
.
POST
.
items
()
...
...
@@ -899,7 +887,14 @@ class BaseView(object):
controls
=
form
.
validate
(
controls
)
except
ValidationFailure
as
e
:
log
.
error
(
f
"Edit Error: {str(e.error.msg)}"
)
form
.
set_appstruct
(
e
.
cstruct
)
for
f
in
e
.
field
.
children
:
if
isinstance
(
f
.
typ
,
colander
.
Date
):
e
.
cstruct
[
f
.
name
]
=
date_from_str
(
e
.
cstruct
[
f
.
name
])
if
f
.
name
==
"captcha"
:
e
.
cstruct
[
f
.
name
]
=
self
.
get_captcha_url
()
values
=
self
.
update_value
(
values
,
e
.
cstruct
)
form
.
set_appstruct
(
values
)
return
self
.
returned_form
(
form
,
table
,
**
kwargs
)
c
=
dict
(
controls
)
...
...
@@ -908,7 +903,6 @@ class BaseView(object):
return
self
.
next_edit
(
form
,
row
=
row
)
values
=
self
.
get_values
(
row
)
form
.
set_appstruct
(
values
)
form
=
self
.
before_edit
(
form
)
...
...
opensipkd/base/views/departemen.py
View file @
d65b84e
...
...
@@ -78,7 +78,10 @@ class AddSchema(colander.Schema):
missing
=
colander
.
drop
,
oid
=
"company_id"
)
status
=
colander
.
SchemaNode
(
colander
.
Boolean
(),
oid
=
"status"
)
status
=
colander
.
SchemaNode
(
colander
.
Integer
(),
widget
=
widget
.
CheckboxWidget
(
true_val
=
'1'
,
false_val
=
'0'
),
oid
=
"status"
)
def
after_bind
(
self
,
schema
,
kwargs
):
request
=
kwargs
[
"request"
]
...
...
opensipkd/base/views/templates/base3.1.pt
View file @
d65b84e
This diff is collapsed.
Click to expand it.
opensipkd/base/views/user_login.py
View file @
d65b84e
...
...
@@ -57,9 +57,6 @@ class Login(CSRFSchema):
password
=
colander
.
SchemaNode
(
colander
.
String
(),
widget
=
widget
.
PasswordWidget
())
# def after_bind(self, schema, kwargs):
# request = kwargs["request"]
# csrf_token = new_csrf_token(request)
...
...
@@ -98,6 +95,8 @@ class LoginUser(object):
self
.
message
=
"Login Gagal"
set_user_log
(
self
.
message
,
self
.
request
,
log
,
values
[
"username"
])
return
for
g
in
self
.
user
.
groups
:
log
.
debug
(
f
"Group: {g.id} as {g.group_name}"
)
# generate security_code dan simpan dalam session
regenerate_security_code
(
self
.
user
,
0.03
)
# berlaku selama 1.8 menit
...
...
@@ -115,8 +114,7 @@ class Oauth2UserExc(Exception):
def
oauth2_login
(
request
,
params
=
None
):
provider_name
=
params
and
params
[
"provider_name"
]
\
or
request
.
params
[
"provider_name"
]
provider_name
=
params
and
params
[
"provider_name"
]
or
request
.
params
[
"provider_name"
]
if
provider_name
==
"google"
:
from
.base_google
import
googlesignin
try
:
...
...
@@ -129,8 +127,8 @@ def oauth2_login(request, params=None):
id_info
=
None
iss
=
id_info
and
re
.
sub
(
r'https?://'
,
''
,
id_info
[
'iss'
])
or
None
user
=
id_info
and
ExternalIdentityService
.
\
user_by_external_id_and_provider
(
id_info
[
'sub'
],
iss
)
user
=
id_info
and
ExternalIdentityService
.
user_by_external_id_and_provider
(
id_info
[
'sub'
],
iss
)
log
.
debug
(
"Users :
%
s"
,
user
)
log
.
debug
(
"IdInfo :
%
s"
,
id_info
)
if
id_info
and
not
user
:
...
...
@@ -143,7 +141,8 @@ def oauth2_login(request, params=None):
log
.
debug
(
"User :
%
s"
,
user
)
log
.
debug
(
"Partner :
%
s"
,
partner
)
if
user
or
partner
:
raise
Oauth2UserExc
(
"Email sudah terdaftar silahkan login standard"
)
raise
Oauth2UserExc
(
"Email sudah terdaftar silahkan login standard"
)
user
=
User
()
user
.
from_dict
(
values
)
...
...
@@ -205,9 +204,9 @@ class ViewLogin(BaseView):
# start cek external module
pckgs
=
get_params
(
'external-uim'
)
if
user
:
external_user
=
DBSession
.
query
(
ExternalIdentity
)
\
.
filter_by
(
local_user_id
=
user
.
id
,
external_user_name
=
identity
)
.
first
()
external_user
=
DBSession
.
query
(
ExternalIdentity
)
.
\
filter_by
(
local_user_id
=
user
.
id
,
external_user_name
=
identity
)
.
first
()
pckgs
=
external_user
and
pckgs
or
None
if
pckgs
:
...
...
@@ -224,7 +223,8 @@ class ViewLogin(BaseView):
login
=
LoginUser
(
self
.
req
)
if
not
login
.
login
(
values
,
user
):
request
.
session
.
flash
(
login
.
message
,
"error"
)
next_url
=
get_urls
(
f
"{request.route_url('login')}?next={next_url}"
)
next_url
=
get_urls
(
f
"{request.route_url('login')}?next={next_url}"
)
return
HTTPFound
(
location
=
next_url
)
return
redirect_login
(
request
,
user
)
...
...
@@ -237,8 +237,7 @@ class ViewLogin(BaseView):
del
request
.
session
[
'login failed'
]
return
r
elif
"provider_name"
in
request
.
params
and
\
request
.
params
[
"provider_name"
]:
elif
"provider_name"
in
request
.
params
and
request
.
params
[
"provider_name"
]:
try
:
user
=
oauth2_login
(
request
)
except
Oauth2ParseExc
as
e
:
...
...
@@ -279,6 +278,9 @@ class ViewLogin(BaseView):
def
redirect_login
(
request
,
user
):
set_user_log
(
"Login Sukses"
,
request
,
log
,
user
.
user_name
)
for
g
in
user
.
groups
:
log
.
debug
(
f
"Group: {g.id} as {g.group_name}"
)
headers
=
get_login_headers
(
request
,
user
)
request
.
session
.
flash
(
"Sukses Login"
)
next_url
=
request
.
params
.
get
(
'next'
)
...
...
@@ -379,8 +381,7 @@ def view_change_password(request):
code
=
request
.
matchdict
[
'code'
]
q
=
DBSession
.
query
(
User
)
.
filter_by
(
security_code
=
code
)
user
=
q
.
first
()
if
not
user
or
\
create_now
()
-
user
.
security_code_date
>
one_hour
:
if
not
user
or
create_now
()
-
user
.
security_code_date
>
one_hour
:
request
.
session
.
flash
(
'Security code expired'
,
'error'
)
return
HTTPFound
(
location
=
get_urls
(
request
.
route_url
(
'login'
)))
...
...
@@ -436,7 +437,7 @@ class ResetPassword(colander.Schema):
colander
.
String
(),
title
=
_
(
'Email'
),
description
=
_
(
'email-reset-password'
,
default
=
'Enter your email address and we will send you '
\
default
=
'Enter your email address and we will send you '
'a link to reset your password.'
)
)
...
...
@@ -459,8 +460,7 @@ def send_email_security_code(
**
kwargs
):
settings
=
get_settings
()
password
=
kwargs
.
get
(
"password"
,
""
)
if
'mail.sender_name'
not
in
settings
\
or
'mail.username'
not
in
settings
:
if
'mail.sender_name'
not
in
settings
or
'mail.username'
not
in
settings
:
return
url
=
'{}/password/{}?password={}'
.
format
(
...
...
@@ -499,8 +499,7 @@ def sending_mail(request, user, subject, body):
def
send_email_pending
(
request
,
user
,
subject
,
body_msg_id
,
body_default_file
):
settings
=
get_settings
()
if
'mail.sender_name'
not
in
settings
\
or
'mail.username'
not
in
settings
:
if
'mail.sender_name'
not
in
settings
or
'mail.username'
not
in
settings
:
return
here
=
os
.
path
.
abspath
(
os
.
path
.
dirname
(
__file__
))
...
...
@@ -558,4 +557,4 @@ def view_reset_password(request):
route_name
=
'reset-password-sent'
,
renderer
=
'templates/reset-password-sent.pt'
)
def
view_reset_password_sent
(
request
):
return
dict
(
title
=
_
(
'Reset password'
))
\ No newline at end of file
return
dict
(
title
=
_
(
'Reset password'
))
opensipkd/base/views/widgets/autocomplete_input_ms.pt
View file @
d65b84e
...
...
@@ -3,8 +3,8 @@
oid oid|field.oid;
style style|field.widget.style;
autofocus autofocus|field.autofocus;
url url|field.widget.url;
slave slave|field.widget.slave;
url url|field.widget.url;
" tal:omit-tag="">
${field.start_mapping()}
<input type="hidden" name="auto_id" id="${oid}-auto_id" value="${auto_id}" />
...
...
@@ -28,15 +28,22 @@
var not_check = ["id", "value"];
$.each(datum, function (key, val) {
if (!not_check.includes(key)) {
var ele = $('#' + key);
if (ele !== undefined) {
var eleName = ele.prop('nodeName').toLowerCase();
var eleName = $('#' + key).prop('nodeName');
if (eleName !== undefined) {
eleName = eleName.toLowerCase();
if (eleName === "select")
$("#" + key).val(val).trigger("change");
else if (eleName === "input")
$("#" + key).val(val);
else
$("#" + key).text(val);
} else {
//Check apakah jika radio button
eleName = $("input[name ='" + key + "']").prop('type');
if (eleName == "radio") {
$("input[name ='" + key + "'][value='" + val + "']").prop('checked', true);
}
}
}
});
...
...
opensipkd/detable/detable.py
View file @
d65b84e
...
...
@@ -265,6 +265,8 @@ class DeTable(field.Field):
d
[
"action"
]
=
f
.
action
else
:
d
[
"action"
]
=
True
if
hasattr
(
f
,
"search_method"
):
d
[
"search_method"
]
=
f
.
search_method
if
isinstance
(
f
.
widget
,
deform_widget
.
HiddenWidget
):
d
[
"visible"
]
=
False
...
...
@@ -441,18 +443,27 @@ class DeTable(field.Field):
html
+=
'</select>'
elif
isinstance
(
f
.
typ
,
colander
.
Date
):
html
+=
f
'<div class="form-group" {txt}>'
html
+=
f
'<label class="form-label" style="font-size:12px">{f.title}</label>'
html
+=
f
'<div class="input-group input-daterange" style="padding: 3px 0px 7px !important;">'
html
+=
f
'<input type="date" class="form-control {self.tableid}-control-filter hasDatePicker"'
html
+=
f
'data-index={field_index} placeholder="{f.title} Awal"'
html
+=
f
'name="{col_id}" id="{col_id}-min"/>'
html
+=
f
'<div class="input-group-addon">-</div>'
html
+=
f
'<input type="date" class="form-control {self.tableid}-control-filter hasDatePicker"'
html
+=
f
'data-index={field_index} placeholder="{f.title} Akhir" '
html
+=
f
'name="{col_id}" id="{col_id}-max" /></span>'
html
+=
f
'</div>'
html
+=
f
'</div>'
search_method
=
getattr
(
f
,
"search_method"
,
None
)
if
search_method
==
"date"
:
# html += f'<div class="tooltip">'
html
+=
f
'<label class="form-label" style="font-size:12px">{f.title}</label>'
html
+=
f
'<input type="date" class="form-control {self.tableid}-control-filter"'
html
+=
f
'{txt}/>'
# html += f'<span class="tooltiptext">{f.title}</span>'
# html += f'</div>'
else
:
html
+=
f
'<div class="form-group" {txt}>'
html
+=
f
'<label class="form-label" style="font-size:12px">{f.title}</label>'
html
+=
f
'<div class="input-group input-daterange" style="padding: 3px 0px 7px !important;">'
html
+=
f
'<input type="date" class="form-control {self.tableid}-control-filter hasDatePicker"'
html
+=
f
'data-index={field_index} placeholder="{f.title} Awal"'
html
+=
f
'name="{col_id}" id="{col_id}-min"/>'
html
+=
f
'<div class="input-group-addon">-</div>'
html
+=
f
'<input type="date" class="form-control {self.tableid}-control-filter hasDatePicker"'
html
+=
f
'data-index={field_index} placeholder="{f.title} Akhir" '
html
+=
f
'name="{col_id}" id="{col_id}-max" /></span>'
html
+=
f
'</div>'
html
+=
f
'</div>'
"""
awal
html += f'<div class="form-group" {txt}>'
...
...
opensipkd/detable/templates/detable.pt
View file @
d65b84e
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
Attach a file
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 post a comment