214 Commits
test ... master

Author SHA1 Message Date
15d9ce3b77 correction bug import DD MAIF PL 2024-06-16 06:50:46 +02:00
86889f33ce fusion devis et facture dans un chantier 2024-03-25 10:57:22 +01:00
58371d3b84 ajout libelle status dans liste docs 2024-01-27 15:33:59 +01:00
76e46da8f2 added prestatataire PE dans MAIF 2023-10-27 16:43:07 +02:00
26e131ca22 removed bcc to phuoc 2023-10-14 18:06:39 +02:00
556b49e002 fixed updates stats 2023-10-14 17:59:40 +02:00
0615cccc06 comented updates stats 2023-10-14 17:56:30 +02:00
07011002f3 added last modified tables in dashboard 2023-10-14 16:10:02 +02:00
b0f25625ee uncomment for operation 2023-10-14 07:47:00 +02:00
2efeb53cec sending email reminders with bcc to phuoc 2023-10-11 14:24:59 +02:00
1c4fb6d701 sending email reminders by company 2023-10-11 12:20:53 +02:00
7dfc0064d1 added AVANSSUR in SINAPPS PDF 2023-09-27 07:03:04 +02:00
80ca84804e remove set_trace() 2023-09-24 09:00:09 +02:00
bb249c873a get societe in axa request 2023-09-24 08:53:22 +02:00
25212af64f intégrer les PDF de SINAPPS 2023-09-22 14:19:35 +02:00
98efbe2c2e changer email de demande de DOMUS 2023-07-21 11:03:56 +02:00
86d72a507a ne pas afficher nb_mails dans home 2023-07-21 10:50:56 +02:00
240684b574 fixed open outlook.office386.com with ssl 2023-07-19 15:33:49 +02:00
35c06a9c5e repr fixed 2023-05-15 19:46:04 +02:00
a304f35be8 repr(e) 2023-05-15 19:43:17 +02:00
0e0d56de07 send mail only from admin_email 2023-05-15 19:25:45 +02:00
d84f30287a log only first 400 char of error text 2023-05-15 18:27:26 +02:00
d22b219432 log first 400 char of error message 2023-05-15 18:17:21 +02:00
e99eb82222 log only first 400 char of error message 2023-05-15 18:13:21 +02:00
c908a21433 fixed admin email in production.ini 2023-05-15 17:48:37 +02:00
cc21ae1559 changed smtp in production.ini 2023-05-14 19:05:04 +02:00
94027e396e utilise le SMTP de Office386 2023-05-09 14:52:17 +02:00
0f28596721 enlève f-string car non comptatible avec python 3.5 2023-04-29 15:00:17 +02:00
47a85b66f4 connect to exchange server 2023-04-27 12:57:48 +02:00
123230b8c9 ajout de PO dans email de demandes 2022-11-29 11:11:25 +01:00
13144ca430 fixed upload demande AXA FRANCE 2022-11-01 10:53:11 +01:00
afd6906667 Revert "bug upload demande AXA"
This reverts commit d5ee75bcf7.
2022-11-01 10:30:00 +01:00
eceb08fb7f Revert "bug lecture no sinistre AXA"
This reverts commit 8f7ef2d2ba.
2022-11-01 10:28:17 +01:00
8f7ef2d2ba bug lecture no sinistre AXA 2022-10-28 08:24:10 +02:00
d5ee75bcf7 bug upload demande AXA 2022-10-28 07:55:29 +02:00
cdb85e6eb2 fixed label visu_tele in rdf_vew.pt and rdf_edit.pt 2022-10-18 12:16:01 +02:00
4f22d9da41 ne prendre que les 11er car. du no sinistre MAIF 2022-09-04 15:40:29 +02:00
cd8a69210d change cd_cli maif menuserie 2022-08-25 17:42:45 +02:00
1fdd9bda91 si user=TST alors interdire générer dossier par email 2022-08-22 13:25:15 +02:00
35922aed85 removed infrastructure.pt 2022-06-08 07:38:22 +02:00
b3e733888b purge des versements obsolètes 2022-02-27 11:35:41 +01:00
ed897c728f fixed article update 2022-02-07 11:53:23 +01:00
4865576862 accès Consulation peut voir les documents attachés 2021-11-24 09:43:19 +01:00
c8883bda11 création acces = Consultation et table p_acces 2021-11-10 18:31:31 +01:00
3c23bf36ea tuning home.pt 2021-11-04 10:17:28 +01:00
2305f4761e afficher nb de mails à importer 2021-10-02 16:47:32 +02:00
7afcb9b8b1 retouche home.pt et modif statut dossier 2021-10-02 12:55:40 +02:00
e346440748 ne plus les bages : TROP LONG 2021-08-26 17:02:34 +02:00
08ef4dcb07 ne plus afficher nb rdv : TROP LONG 2021-08-26 16:49:05 +02:00
cc12a9baa3 ne plus afficher le nb de mail à importer : TROP LONG 2021-08-26 16:28:06 +02:00
9e0679d4c8 optimiser affichage home.pt 2021-08-26 11:52:45 +02:00
9bcd435f6c enleve set_trace 2021-08-25 07:07:10 +02:00
c0f911efc2 retablir affichage nb emails à importer 2021-08-24 15:25:46 +02:00
175a53080a supprimer PROVISOIREMENT affichage nb emails à importer 2021-08-24 09:46:02 +02:00
9532f09cdd added update devis status 4 2021-08-23 21:13:29 +02:00
bb83650b92 enlever commentaires 2021-08-23 13:42:50 +02:00
398b5ab56b bug fetch message ordre de mission 2021-08-23 13:39:14 +02:00
4a0810acb3 remettre demandes.pt comme avant 2021-08-23 12:15:45 +02:00
0f37a80263 retour à onglet specifique dans dossier_view.pt 2021-08-21 09:46:33 +02:00
049f06604a test dessin_edit 2021-08-20 15:40:00 +02:00
52b30b5660 remplacer devis-en-attente par derniers-suivis 2021-08-18 11:17:40 +02:00
8efd6589bc mise en prod 2021-08-15 16:11:18 +02:00
thienan
15dc6603ba minor fix stats devis 2021-08-13 10:38:03 +02:00
cthienan
cbcdd3e19f Merge branch 'master' of https://bitbucket.org/caotek/dumas_gestion 2021-08-13 10:16:14 +02:00
cthienan
c74f60de09 correction stats devis 2021-08-13 10:15:43 +02:00
dfbc1ea083 ajout croquis_edit 2021-08-06 19:34:11 +02:00
c0a7f5bd9b ajout saisie de notes dans dossier 2021-08-03 18:00:34 +02:00
5e933151ed Merge branch 'master' of https://bitbucket.org/caotek/dumas_gestion 2021-08-03 08:15:30 +02:00
59d42f81ac modifs ??? 2021-08-03 08:15:13 +02:00
cthienan
0e77614b89 ajouts astats pourcentage devis + modif permission devis gest 2021-08-02 15:05:28 +02:00
cthienan
63105f5c67 bug fix 2021-07-28 17:15:01 +02:00
cthienan
2917fd4159 ajout ca groupe global 2021-07-28 16:59:08 +02:00
cthienan
d47e2a2378 ajout import de la table relou... (tarifs IMH) 2021-07-26 15:21:06 +02:00
5b8c73caea use ALINTO smtp relay for production 2021-07-24 16:14:28 +02:00
cthienan
9cd021f474 ajout import tarif maif 2021-07-22 14:43:42 +02:00
cthienan
1d1b8b29a7 ajout import tarif maif 2021-07-22 14:42:04 +02:00
a6eeb30b82 import tarifs 2021-07-21 20:34:10 +02:00
7a706ba9f2 change email dumas passwords 2021-07-21 20:32:01 +02:00
thienan
c142e0ccb6 correction liens devis en att et facture en att 2021-07-13 15:16:35 +02:00
thienan
fe2c58f65f harmonisation dem_devis, devs et facture 2021-07-12 15:10:38 +02:00
thienan
e83c5f2d53 fix 2021-07-07 12:07:29 +02:00
thienan
839b913b02 conversion new_home en home 2021-07-07 12:06:37 +02:00
thienan
f742176c1e correction new_home + stats + dem_devis 2021-07-07 12:04:03 +02:00
31ed53f0f1 merge 2021-07-06 16:05:46 +02:00
02fdd57538 changement de SMTP alinto 2021-07-06 15:18:55 +02:00
thienan
7a436e2218 migration new_home + ajout tableaux devis et factures 2021-07-06 10:37:34 +02:00
thienan
0161c72cd4 bug fix upload 2021-07-01 14:54:44 +02:00
thienan
2dc9a019d5 ajout autres groupes dans ca_groupes 2021-06-30 16:25:19 +02:00
thienan
560cd29f16 ajout page demandes devis 2021-06-30 16:10:00 +02:00
4f52ff8afe corrections infobox + stats 2021-06-30 12:28:02 +02:00
thienan
dc595b8f5d Merge branch 'caota_test' 2021-06-29 14:30:43 +02:00
thienan
77054b62eb finition infobox 2021-06-29 14:30:14 +02:00
thienan
b612a7f135 retrait sidebar 2021-06-29 14:19:48 +02:00
thienan
90fa9af74a tentative d'ajout sidebar 2021-06-29 14:10:09 +02:00
thienan
85c3bbaa5c correction couleurs et ajout liens infobox 2021-06-28 16:36:47 +02:00
thienan
485e0d3462 developpement.ini fix 2021-06-28 10:40:27 +02:00
thienan
acdab93cba ajout prototype page d'accueil dans paramètres 2021-06-28 10:37:45 +02:00
thienan
1777d2ac4f Merge branch 'master' of https://bitbucket.org/caotek/dumas_gestion 2021-06-24 11:16:49 +02:00
091b51e592 added AdminLTE plugins 2021-06-24 11:15:34 +02:00
thienan
6ccf206c0c ajout changement statut devis 2021-06-23 15:46:49 +02:00
3cb7664a08 fixed get status table 2021-06-23 14:05:27 +02:00
thienan
35def60078 bug fix 2021-06-23 10:51:30 +02:00
thienan
a63855576b bug fix 2021-06-23 10:51:04 +02:00
thienan
df8753b1b7 ajout bouton changement de statut pour dossier 2021-06-23 10:43:43 +02:00
thienan
c7f30b1555 début ajout statut clôture 2021-06-22 09:40:13 +02:00
thienan
c87263d5a6 Ajout libellé clients + retrait CA internes 2021-06-17 11:24:10 +02:00
thienan
16af3ebb73 fix 2021-06-17 11:13:29 +02:00
thienan
66766268a6 fix setup.py 2021-06-17 11:12:19 +02:00
thienan
8dbdf19436 fix setup.py 2021-06-17 11:09:50 +02:00
15031342e7 added some new packages in setup.py 2021-06-17 11:05:03 +02:00
thienan
31a42c9bc5 Ajout graphes pourcentage délais 2021-06-17 10:33:04 +02:00
thienan
ad9650098b bugfix 2021-06-16 10:46:50 +02:00
thienan
4e3e2f9a36 Ajout graphes CA par clients 2021-06-16 10:45:08 +02:00
thienan
6902e04e54 Ajout graphiques CA par groupes 2021-06-15 15:40:25 +02:00
thienan
19cc99d7ff initial commit in branch caota_test 2021-06-15 10:51:42 +02:00
0601815ec0 ca_groupe 2021-06-15 10:30:48 +02:00
1356fc2255 retouche get tarifs 2021-06-04 12:26:13 +02:00
83860d3c21 added tarifs_import with xlrd 2021-05-31 19:12:26 +02:00
39b2c03de9 ajouter couleur pour la societe PO 2021-04-30 16:35:01 +02:00
b2733270b2 ajouter la societe PO dans la génération des demandes 2021-04-30 16:30:01 +02:00
9a7cad7c4d fix cloturer dossier + add societe PO dans générer 2021-04-30 15:48:39 +02:00
b725b98e06 test 2021-03-25 16:11:58 +01:00
85e5b6b10f test batch de test 2021-03-25 12:28:06 +01:00
cb3035d72c added societes.pt and societe_edit.pt 2021-03-24 16:28:06 +01:00
6ab266be48 stats délais sur un an de M à M-11 2021-03-20 11:45:49 +01:00
ff2c6375f2 affiche stats avec le mois courant 2021-03-20 11:20:14 +01:00
2398c50437 affiche stats avec le mois courant 2021-03-20 11:07:56 +01:00
71e2a1b55a afficher remote client IP 2021-03-17 16:49:04 +01:00
48fe805295 enlever commentaires 2021-03-15 06:20:03 +01:00
7ba5cea241 bug today.day 2021-03-15 06:14:57 +01:00
6c74c73157 batch_test prêt pour la prod 2021-03-14 17:44:40 +01:00
567e58a8b0 élément de moins 10 and 2021-03-14 15:07:26 +01:00
49de5aa0e9 tuning purge mensuelle 2021-03-14 14:41:25 +01:00
c410e1df05 stats delais -> indices de performances 2021-03-10 16:06:05 +01:00
47f03f78df ajout stats sur les délais de traitements dossier 2021-03-09 14:26:40 +01:00
e8782369b1 batch_jour : ne pas afficher le message OK 2021-02-23 07:24:12 +01:00
9792dfcf28 ne lancer delete_orphan_attached_files que le samedi 2021-02-17 18:39:30 +01:00
b434aada89 correction nom repertoire DOCS_ATTACHES 2021-02-16 15:26:25 +01:00
6212692b19 stats 2021-02-16 14:35:26 +01:00
3915b0e59b bug generer rapport to pdf 2021-02-03 08:45:15 +01:00
ed30afb3e7 correction visualiser rapport 2021-02-02 12:21:23 +01:00
dc05f11d69 amail en html 2021-02-02 11:56:46 +01:00
2e41da37c4 tester si envoi email OK 2021-02-02 09:56:51 +01:00
db6cddb94e changer SMTP pour SFR 2021-02-02 09:46:03 +01:00
d702ba570d correction générartion pdf 2021-02-01 16:23:48 +01:00
df58a1e84b change admin email 2021-02-01 07:25:06 +01:00
ef81220d85 correction admin email 2021-02-01 07:00:15 +01:00
6489954028 correction erreur de syntaxe 2021-01-30 09:51:59 +01:00
c5875e52ee envoi email tous les 6 secondes 2021-01-30 09:47:20 +01:00
ac3c7bfbc6 delete import pdb 2021-01-30 08:19:28 +01:00
af1d268bf3 envoi rapport de nuit 2021-01-27 14:53:47 +01:00
793a62cc2d migrer rappels de rdv vers gestion 2021-01-24 16:10:29 +01:00
af2315bad2 rename last_emailing to rappels_rdv 2021-01-22 16:44:32 +01:00
b3fb088d9f finaliser tests cabinet + expet 2021-01-16 17:12:25 +01:00
9873197d42 correction génération rapport RDF 2021-01-11 09:46:22 +01:00
28de1ce541 ajout popup confirmation de suppression photo 2021-01-08 16:22:24 +01:00
99d1c240d9 refonte gestion image + rotation +/-90 2021-01-08 11:32:01 +01:00
4af57cb876 possibilité d'annoter les téléphones 2021-01-03 11:31:21 +01:00
aaa80ff002 remplacer mail.user 2020-12-17 17:04:11 +01:00
01b73cc1d4 bug generer rapport RDF 2020-12-17 17:01:58 +01:00
0f3141c17c mise en prod PDF -> DOSSIER 2020-12-17 16:47:09 +01:00
1e75053d49 mise en prod PDF2Dossier 2020-12-17 16:38:01 +01:00
c538e387ca correction SMTP 2020-12-17 15:02:28 +01:00
ca04eb551b ajout cabinet+experts 2020-12-17 12:13:22 +01:00
154264fbad ajout batch_nuit 2020-12-13 09:19:49 +01:00
ef9e56a272 change raw message to email.message_from_bytes 2020-12-11 13:17:25 +01:00
862d90657e correction bouton download 2020-12-11 07:57:24 +01:00
c743cce59a correction annulation mission domus 2020-12-11 07:38:55 +01:00
908e15a80f Générer les dossiers par email un à un et non en lot 2020-12-10 20:39:51 +01:00
7840087bb0 ajout upload ordre de mission AXA 2020-12-09 11:09:18 +01:00
879546e166 correction affichage facture 2020-12-06 08:03:37 +01:00
ab0d4997eb correction filename = none 2020-11-25 11:58:07 +01:00
d03e90b7b8 ajout Doc techniques dans dossier_view.pt et articles.pt 2020-11-20 09:47:20 +01:00
dab24387a2 genere devis en pdf 2020-11-11 15:05:59 +01:00
6bc9d34fde use locale to format currency 2020-10-17 08:25:56 +02:00
71305e8002 move line up and down 2020-10-16 16:39:47 +02:00
50fea4710e ajout devis_preview.pt 2020-10-16 10:27:05 +02:00
9b6f016c32 ajout ajax_article pour remplir le formulaire 2020-10-05 17:30:43 +02:00
9aa6c8985e creation ligne devis article 2020-10-04 16:44:57 +02:00
500e07c810 supprime link devfac 2020-09-23 17:12:16 +02:00
ec19e2db35 ajout module devis 2020-09-23 17:11:07 +02:00
64b049251e manque os dans dossier models 2020-09-18 10:08:33 +02:00
189cd8fd78 enlever set_trace() 2020-09-17 12:28:47 +02:00
aae410f574 bug générer demande MAIF + suppression photo 2020-09-17 12:24:49 +02:00
7d81e0be71 possibilité au manager de modifier date_inter et auteur du rdf 2020-09-11 11:38:15 +02:00
aa298d613b trier le rapport de génération des dossiers par datemaj 2020-08-23 15:43:53 +02:00
534eb6bf15 trier le rapport de génération des dossiers 2020-08-23 15:20:02 +02:00
6ab71bb412 améliorer le rapport de génération des dossiers 2020-08-23 14:46:10 +02:00
74cd9bab55 mettre expunge() à la fin 2020-08-15 14:40:15 +02:00
6210b436b0 enlever set_trace() 2020-08-15 08:49:20 +02:00
756fa75f4f consultation des devis et doc achachés interdits aux ouvriers 2020-08-06 15:09:53 +02:00
ae498a9bc4 selection multiple des photos à uploader 2020-08-06 11:03:04 +02:00
aa19d3f936 autoriser access >= 8 à modifié un RDF facturé 2020-07-27 08:52:12 +02:00
ba89518ba2 bug suppression email traité 2020-07-24 10:17:29 +02:00
00f7d289b2 bug deleted old emails 2020-07-24 09:45:25 +02:00
677bda260b bug suppression email traité 2020-07-23 16:41:48 +02:00
a31d2241bc enlever set_trace() 2020-07-23 16:15:29 +02:00
681c9ebfbd bug creation rdv 2020-07-23 15:50:33 +02:00
1de6184877 menu plus restrictif pour les access=0 2020-07-23 09:17:50 +02:00
5088b9a1ff ne lire que les messages undeleted 2020-07-23 00:24:19 +02:00
7a7a2e2cfa cacher certains menus pour les access = 0 2020-07-22 20:28:34 +02:00
793cbc3206 mise en prod Emails -> Dossiers 2020-07-22 18:47:59 +02:00
78a8d46322 récupérer l'email de la demande d'intervention 2020-07-14 17:59:13 +02:00
7c3e484bb0 lister les 100 derniers rapports 2020-07-02 09:41:45 +02:00
13fdabaf86 interdire de modifier un rapport déjà facturé 2020-07-02 09:19:29 +02:00
ae08fbfd0b bug nom chantier lors conversion email to dossier 2020-06-05 16:29:23 +02:00
c62f1c85c6 controles mots de passe identiques 2020-05-20 14:45:53 +02:00
9178682733 bug changer_mdp.pt 2020-05-16 09:04:36 +02:00
94fcaaa995 c/assureur/change 2020-05-13 20:47:07 +02:00
5ddbc49fec ajout changement de client d'un rdf 2020-05-13 15:40:29 +02:00
bbd462cd54 remplacer PENEL par Responseble technique dans les RDF 2020-04-24 17:58:23 +02:00
ee577697ce changer la connexion BDD prod 2020-04-24 17:48:27 +02:00
122710b3e4 change Commercial -> Production 2020-04-24 17:27:12 +02:00
2e0abbdff2 modif port 2020-04-24 14:41:48 +02:00
171 changed files with 29294 additions and 3411 deletions

13
.gitignore vendored
View File

@@ -1,7 +1,6 @@
# Fichiers temporaires # # Fichiers temporaires #
######################## ########################
*~ *~
*.pyc *.pyc
*.pid *.pid
*.log *.log

Binary file not shown.

35
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,35 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "python",
"request": "launch",
"name": "Pserve",
"python": "C:/pyramid10/Scripts/python.exe",
"program": "/pyramid10/Scripts/pserve.exe",
"args": [
"-v",
"development.ini",
],
"console": "integratedTerminal",
"debugOptions": [
"RedirectOutput",
"WaitOnAbnormalExit",
"WaitOnNormalExit"
],
"python.unitTest.promptToConfigure":false,
"files.exclude": {
"**/.git": true,
"**/.svn": true,
"**/.hg": true,
"**/.DS_Store": true,
".idea": true,
"**/*.pyc": true,
},
}
]
}

5
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,5 @@
{
"html.validate.scripts": false,
"editor.minimap.enabled": false,
"python.pythonPath": "C:\\pyramid10\\Scripts\\python.exe"
}

View File

@@ -0,0 +1 @@
9HMYPQ7Yz8emdBwGpbg3

View File

@@ -18,19 +18,28 @@ pyramid.includes =
pyramid_mailer pyramid_mailer
pyramid_tm pyramid_tm
sqlalchemy.url = mysql://phuoc:phuoc!@localhost/bddevfac?charset=utf8
# sqlalchemy.url = mysql://root:cni/@srvbd/bddevfac?charset=utf8
mondumas.admin_email = cao.thien-phuoc@orange.fr # sqlalchemy.url = mysql://dumas_ro:dumas_RO!@localhost/bddevfac?charset=utf8
mondumas.devfac_url = mondumas:static/DEVFAC/ sqlalchemy.url = mysql://phuoc:phuoc!@localhost/bddevfac?charset=utf8
# sqlalchemy.url = mysql://phuoc:phuoc!@192.168.0.31/bddevfac?charset=utf8
mondumas.admin_email = peinture-dumas@entreprise-dumas.com
mondumas.devfac_url = mondumas:static/DEVFAC/DOCS_ATTACHES/
mondumas.devfac_dir = /DEVFAC14/DOCS_ATTACHES mondumas.devfac_dir = /DEVFAC14/DOCS_ATTACHES
# Mailer configuration # Mailer configuration
mail.host = smtp.orange.fr mail.host = smtp.office365.com
mail.port = 25 mail.port = 587
mail.username = cao.thien-phuoc@orange.fr mail.tls = True
mail.username = peinture-dumas@entreprise-dumas.com
mail.password = Nar50611
# SMTP RELAY alinto
# mail.host = gatewayxl.alinto.net
# mail.port = 465
# mail.ssl = True
# mail.username = smtpsasdumas@entreprise-dumas.com
[server:main] [server:main]
use = egg:waitress#main use = egg:waitress#main
host = 0.0.0.0 host = 0.0.0.0

49
imap-over-tls-example.py Normal file
View File

@@ -0,0 +1,49 @@
#!/usr/bin/env python3
import imaplib
import msal
import pprint
conf = {
"authority": "https://login.microsoftonline.com/47f02128-acf0-47a7-a3bf-27a3619d4a4f",
"client_id": "4fdf2634-a260-4576-a442-684998f0187b", #AppID
"scope": ['https://outlook.office365.com/.default'],
"secret": "dZD8Q~GmG_PFi.t_uRiyBEzwLeMZeemQGHUFta~J", #Key-Value
"secret-id": "5cae3249-0fc0-43e2-bc0e-d78f41964970", #Key-ID
}
def generate_auth_string(user, token):
return f"user={user}\x01auth=Bearer {token}\x01\x01"
if __name__ == "__main__":
app = msal.ConfidentialClientApplication(conf['client_id'], authority=conf['authority'],
client_credential=conf['secret'])
result = app.acquire_token_silent(conf['scope'], account=None)
if not result:
print("No suitable token in cache. Get new one.")
result = app.acquire_token_for_client(scopes=conf['scope'])
if "access_token" in result:
print(result['token_type'])
pprint.pprint(result)
else:
print(result.get("error"))
print(result.get("error_description"))
print(result.get("correlation_id"))
# imap = imaplib.IMAP4('outlook.office365.com')
# imap.starttls()
imap = imaplib.IMAP4_SSL('outlook.office365.com', 993)
imap.authenticate("XOAUTH2", lambda x: generate_auth_string("polynet-dumas@entreprise-dumas.com",
result['access_token']).encode("utf-8"))
# Print list of mailboxes on server
code, mailboxes = imap.list()
for mailbox in mailboxes:
print(mailbox.decode("utf-8"))
# Select mailbox
imap.select("INBOX")
# Cleanup
imap.close()

View File

@@ -1,38 +1,56 @@
Metadata-Version: 2.1 Metadata-Version: 2.1
Name: mondumas Name: mondumas
Version: 1.0 Version: 1.0
Summary: mondumas Summary: mondumas
Home-page: UNKNOWN Home-page:
Author: Author:
Author-email: Author-email:
License: UNKNOWN Keywords: web wsgi bfg pylons pyramid
Description: # README # Classifier: Programming Language :: Python
Classifier: Framework :: Pyramid
Classifier: Topic :: Internet :: WWW/HTTP
Application web permettant aux personnels de l'entreprise Dumas d'accéder aux dossiers des clients Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
Provides-Extra: testing
# README #
Développé avec :
- Pyramid Framework Cette application web permet aux collaborateurs de l'entreprise Dumas :
- MySQL
- Chameleon - de consulter et de gérer les dossiers des clients depuis leur tablette
- de créer un rapport de fuite et le faire signer par le client
* [Exemple d'une comptabilité simple] (http://perso.numericable.fr/assoc1901/droit/comptabilite1.htm)
Elle est développée avec les composants open source suivants :
* [Learn Markdown](https://bitbucket.org/tutorials/markdowndemo)
## Backend
- [Python](https://www.python.org/downloads/) 3.7
0.0 - [Pyramid web framework](https://trypyramid.com/) 1.10
--- - [MySQL server](https://mysql.com/) 5.7 sur Windows Server 2008 R2 Standard
- [Apache web server](https://apache.org/) 2.4 sur Debian GNU/Linux 9 (stretch)
- Initial version
## Frontend
Keywords: web wsgi bfg pylons pyramid
Platform: UNKNOWN - [Bootstrap framework](https://getbootstrap.com/) for CSS 3.3.7
Classifier: Programming Language :: Python - [Jquery](https://jquery.com/download/) for JavaScript 3.2.1
Classifier: Framework :: Pyramid - Chameleon templates
Classifier: Topic :: Internet :: WWW/HTTP - [FormValidation](https://formvalidation.io/) form validator 0.7.0
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
Provides-Extra: testing ## Jquery Plugins
- [DataTables](https://datatables.net/) 1.10.20
- [Fullcalendar](https://fullcalendar.io/) 3.9.0
- [fullcalendar Scheduler](https://fullcalendar.io/) 1.9.4
- [Jquery-ui et jquery-ui-themes](https://jqueryui.com/) 1.12.1
- [jSignature](https://willowsystems.github.io/jSignature)
- [less.js](http://lesscss.org/) 3.11.1
- [moment.js](https://momentjs.com/) with-locales.min.js
[Learn Markdown](https://bitbucket.org/tutorials/markdowndemo)
0.0
---
- Initial version

View File

@@ -1,6 +1,7 @@
CHANGES.txt CHANGES.txt
MANIFEST.in MANIFEST.in
README.md README.md
bitbucket app password.txt
development.ini development.ini
production.ini production.ini
pytest.ini pytest.ini
@@ -21,12 +22,18 @@ mondumas.egg-info/top_level.txt
mondumas/models/__init__.py mondumas/models/__init__.py
mondumas/models/agenda.py mondumas/models/agenda.py
mondumas/models/default.py mondumas/models/default.py
mondumas/models/devis.py
mondumas/models/dossier.py mondumas/models/dossier.py
mondumas/models/parametres.py mondumas/models/parametres.py
mondumas/models/stats.py
mondumas/models/utils.py
mondumas/scripts/__init__.py mondumas/scripts/__init__.py
mondumas/views/__init__.py mondumas/views/__init__.py
mondumas/views/agenda.py mondumas/views/agenda.py
mondumas/views/default.py mondumas/views/default.py
mondumas/views/devis.py
mondumas/views/dossier.py mondumas/views/dossier.py
mondumas/views/notfound.py mondumas/views/notfound.py
mondumas/views/parametres.py mondumas/views/parametres.py
mondumas/views/stats.py
mondumas/views/utils.py

View File

@@ -1,4 +1,2 @@
[paste.app_factory] [paste.app_factory]
main = mondumas:main main = mondumas:main
[console_scripts]

View File

@@ -1,18 +1,21 @@
pyramid pyramid==1.10
pyramid_chameleon pyramid_chameleon
pyramid_debugtoolbar pyramid_debugtoolbar
pyramid_layout pyramid_layout
pyramid_mailer pyramid_mailer
pyramid_tm pyramid_tm
SQLAlchemy SQLAlchemy==1.2.19
transaction transaction
zope.sqlalchemy zope.sqlalchemy==1.1
waitress waitress
mysqlclient mysqlclient==1.4
docutils
pdfkit pdfkit
python-dateutil python-dateutil
docutils
user-agents user-agents
xlrd
pdfminer3
Pillow==6.1.0
[testing] [testing]
WebTest>=1.3.1 WebTest>=1.3.1

View File

@@ -9,7 +9,7 @@ from .views.default import (
to_decz, to_decz,
) )
@layout_config(template='templates/layouts/global_layout.pt') @layout_config(template='templates/global_layout.pt')
class GlobalLayout(object): class GlobalLayout(object):
# page_title = "Pagode Tinh-Do" # page_title = "Pagode Tinh-Do"
@@ -33,6 +33,14 @@ class GlobalLayout(object):
def to_percent(self, x): def to_percent(self, x):
return to_percent(x) return to_percent(x)
def date2dmy(self, ddate):
if ddate:
# si date, convertir en dd-mm-yyyy
madate = ddate.strftime('%d-%m-%Y')
else:
madate = ''
return madate
def isAnonymous(self): def isAnonymous(self):
user = self.request.authenticated_userid user = self.request.authenticated_userid
return user is None return user is None
@@ -50,7 +58,7 @@ class GlobalLayout(object):
def isWebPage(self): def isWebPage(self):
# test view name # test view name
if self.request.matched_route: if self.request.matched_route:
if self.request.matched_route.name == 'rdf_rapport': if self.request.matched_route.name in ['rdf_rapport', 'devis_preview']:
# oui, page PDF # oui, page PDF
return False return False
else: else:
@@ -59,3 +67,4 @@ class GlobalLayout(object):
else: else:
# non, page web # non, page web
return True return True

View File

@@ -1,96 +1,96 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
from sqlalchemy import text from sqlalchemy import text
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import ( from sqlalchemy.orm import (
scoped_session, scoped_session,
sessionmaker, sessionmaker,
) )
from zope.sqlalchemy import ( from zope.sqlalchemy import (
ZopeTransactionExtension, ZopeTransactionExtension,
mark_changed mark_changed
) )
from datetime import * from datetime import *
import dateutil.relativedelta import dateutil.relativedelta
import transaction import transaction
def execute_query(request, query, params): def execute_query(request, query, params):
"""Execute query and mark session as changed""" """Execute query and mark session as changed"""
request.dbsession.execute(query, params) request.dbsession.execute(query, params)
mark_changed(request.dbsession) mark_changed(request.dbsession)
transaction.commit() transaction.commit()
def get_users_agenda(request, user): def get_users_agenda(request, user):
if user == '': if user == '':
""" lire la liste des users ayant un agenda""" """ lire la liste des users ayant un agenda"""
query = "SELECT * FROM p_users WHERE cd_uti != 'N' and cd_uti = agenda AND actif != 0 ORDER BY nom;" query = "SELECT * FROM p_users WHERE cd_uti = agenda AND actif != 0 ORDER BY nom;"
results = request.dbsession.execute(query).fetchall() results = request.dbsession.execute(query).fetchall()
else: else:
""" lire le user ayant un agenda""" """ lire le user ayant un agenda"""
query = "SELECT * FROM p_users WHERE cd_uti = :user;" query = "SELECT * FROM p_users WHERE cd_uti = :user;"
results = request.dbsession.execute(query, {'user': user}).first() results = request.dbsession.execute(query, {'user': user}).first()
return results return results
def get_types_rdv(request): def get_types_rdv(request):
""" lire la liste des types de rendez-vous""" """ lire la liste des types de rendez-vous"""
query = "SELECT * FROM p_types_rdv ORDER BY LIB;" query = "SELECT * FROM p_types_rdv ORDER BY LIB;"
results = request.dbsession.execute(query).fetchall() results = request.dbsession.execute(query).fetchall()
return results return results
def get_rendez_vous(request, itc): def get_rendez_vous(request, itc):
d = datetime.now() d = datetime.now()
d = d - dateutil.relativedelta.relativedelta(months=3) d = d - dateutil.relativedelta.relativedelta(months=3)
# début du mois M-2 # début du mois M-2
datedeb = d.strftime('%Y-%m-01') datedeb = d.strftime('%Y-%m-01')
# lire les rdv de l'ITC # lire les rdv de l'ITC
query = """SELECT CONCAT(l.societe,"-",l.no_id) as nodossier, l.nolig, l.rdv_debut, l.rdv_fin, e.c_qualite, e.c_nom, e.c_ville, e.c_cp FROM dem_lig l query = """SELECT CONCAT(l.societe,"-",l.no_id) as nodossier, l.nolig, l.rdv_debut, l.rdv_fin, e.c_qualite, e.c_nom, e.c_ville, e.c_cp FROM dem_lig l
INNER JOIN dem_devis e ON l.societe=e.societe AND l.no_id=e.no_id INNER JOIN dem_devis e ON l.societe=e.societe AND l.no_id=e.no_id
WHERE l.datevi >= :datedeb AND l.liste=:itc ORDER BY l.datevi, l.heurevi WHERE l.datevi >= :datedeb AND l.liste=:itc ORDER BY l.datevi, l.heurevi
""" """
results = request.dbsession.execute(query, {'datedeb': datedeb, 'itc': itc}).fetchall() results = request.dbsession.execute(query, {'datedeb': datedeb, 'itc': itc}).fetchall()
return results return results
def delete_rdv(request, nodossier, nolig): def delete_rdv(request, nodossier, nolig):
societe = nodossier[0:2] societe = nodossier[0:2]
no_id = nodossier[3:] no_id = nodossier[3:]
query = "DELETE FROM dem_lig where societe = '%s' and no_id=%s and nolig=%s;" % (societe, no_id, nolig) query = "DELETE FROM dem_lig where societe = '%s' and no_id=%s and nolig=%s;" % (societe, no_id, nolig)
execute_query(request, query, {}) execute_query(request, query, {})
def update_rdv(request, nodossier, nolig, new_values): def update_rdv(request, nodossier, nolig, new_values):
societe = nodossier[0:2] societe = nodossier[0:2]
no_id = nodossier[3:] no_id = nodossier[3:]
# formater date et heure de visite # formater date et heure de visite
if new_values['rdv_debut']: if new_values['rdv_debut']:
ddate = datetime.strptime(new_values['rdv_debut'], '%d-%m-%Y %H:%M') ddate = datetime.strptime(new_values['rdv_debut'], '%d-%m-%Y %H:%M')
new_values['DATEVI'] = ddate.strftime("%Y-%m-%d") new_values['DATEVI'] = ddate.strftime("%Y-%m-%d")
new_values['HEUREVI'] = ddate.strftime("%H:%M") new_values['HEUREVI'] = ddate.strftime("%H:%M")
del new_values['rdv_debut'] del new_values['rdv_debut']
s = '' s = ''
for param in new_values.keys(): for param in new_values.keys():
if s: if s:
s += ",%s=:%s" % (param, param) s += ",%s=:%s" % (param, param)
else: else:
s = "%s=:%s" % (param, param) s = "%s=:%s" % (param, param)
if nolig == '0': if nolig == '0':
create_rdv(request, nodossier, new_values['DATEVI'], new_values['HEUREVI'], new_values['COMMENT'], new_values['LISTE'], new_values['USERMAJ']) create_rdv(request, nodossier, new_values['DATEVI'], new_values['HEUREVI'], new_values['COMMENT'], new_values['LISTE'], new_values['USERMAJ'])
else: else:
new_values['societe'] = societe new_values['societe'] = societe
new_values['no_id'] = no_id new_values['no_id'] = no_id
new_values['nolig'] = nolig new_values['nolig'] = nolig
query = "UPDATE dem_lig SET %s WHERE societe = :societe AND NO_ID = :no_id AND NOLIG = :nolig ;" % s query = "UPDATE dem_lig SET %s WHERE societe = :societe AND NO_ID = :no_id AND NOLIG = :nolig ;" % s
execute_query(request, query, new_values) execute_query(request, query, new_values)
def create_rdv(request, nodossier, dateRDV, heureRDV, type_rdv, agenda, logged_in): def create_rdv(request, nodossier, dateRDV, heureRDV, type_rdv, agenda, logged_in):
societe = nodossier[0:2] societe = nodossier[0:2]
no_id = nodossier[3:] no_id = nodossier[3:]
query = """ query = """
INSERT INTO dem_lig (societe, NO_ID, DATE, COMMENT, DATEVI, HEUREVI, LISTE, USERMAJ) VALUES INSERT INTO dem_lig (societe, NO_ID, DATE, COMMENT, DATEVI, HEUREVI, LISTE, USERMAJ) VALUES
(:societe, :no_id, CURRENT_DATE, :type_rdv, :dateRDV, :heureRDV, :agenda, :logged_in) ;""" (:societe, :no_id, CURRENT_DATE, :type_rdv, :dateRDV, :heureRDV, :agenda, :logged_in) ;"""
execute_query(request, query, {'societe': societe, 'no_id' :no_id, 'dateRDV': dateRDV, 'heureRDV': heureRDV, 'type_rdv': type_rdv, 'agenda': agenda, 'logged_in':logged_in}) execute_query(request, query, {'societe': societe, 'no_id' :no_id, 'dateRDV': dateRDV, 'heureRDV': heureRDV, 'type_rdv': type_rdv, 'agenda': agenda, 'logged_in':logged_in})

View File

@@ -1,115 +1,159 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
from sqlalchemy import text from sqlalchemy import text
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import ( from sqlalchemy.orm import (
scoped_session, scoped_session,
sessionmaker, sessionmaker,
) )
from zope.sqlalchemy import ( from zope.sqlalchemy import (
ZopeTransactionExtension, ZopeTransactionExtension,
mark_changed mark_changed
) )
from datetime import * from datetime import *
import transaction import transaction
def execute_query(request, query, params): def execute_query(request, query, params):
"""Execute query and mark session as changed""" """Execute query and mark session as changed"""
request.dbsession.execute(query, params) request.dbsession.execute(query, params)
mark_changed(request.dbsession) mark_changed(request.dbsession)
transaction.commit() transaction.commit()
def get_userAccess(request, logged_in): def get_userAccess(request, logged_in):
member = get_member_by_id(request, logged_in) member = get_member_by_id(request, logged_in)
if member: if member:
return member.access return member.access
else: else:
return 0 return 0
def get_codespostaux(request, code): def get_member_by_mdp_oublie(request, lien):
query = "SELECT * FROM p_codespostaux WHERE code_postal like :code;" query = "SELECT * FROM p_users WHERE mdp_oublie=:lien;"
results = request.dbsession.execute(query, {'code': code + "%"}) results = request.dbsession.execute(query, {'lien':lien}).first()
return results.fetchall() return results
def get_member_by_mdp_oublie(request, lien): def get_member_by_id(request, mbr_id):
query = "SELECT * FROM p_users WHERE mdp_oublie=:lien;" if mbr_id == '0':
results = request.dbsession.execute(query, {'lien':lien}).first() query = """SELECT p_users.*, p_acces.libelle FROM p_users
return results INNER JOIN p_acces ON p_acces.code = p_users.access
ORDER BY cd_uti"""
def get_member_by_id(request, mbr_id): results = request.dbsession.execute(query).fetchall()
if mbr_id == '0': else:
query = "SELECT * FROM p_users ORDER BY cd_uti" # lire le membres par son identifianr
results = request.dbsession.execute(query).fetchall() query = """SELECT p_users.*, p_acces.libelle FROM p_users
else: INNER JOIN p_acces ON p_acces.code = p_users.access
# lire le membres par son identifianr WHERE CD_UTI=:mbr_id;"""
query = """SELECT * FROM p_users WHERE CD_UTI=:mbr_id;""" results = request.dbsession.execute(query, {'mbr_id': mbr_id}).first()
results = request.dbsession.execute(query, {'mbr_id': mbr_id}).first() return results
return results
def get_member_info(request, logged_in):
def get_member_info(request, logged_in): # lire le membres par son identifianr
# lire le membres par son identifianr query = """SELECT u.nom, u.email, u.access, u.societe, p_acces.libelle FROM p_users u
query = """SELECT nom, email, access, societe FROM p_users WHERE CD_UTI=:logged_in;""" INNER JOIN p_acces ON p_acces.code = u.access
results = request.dbsession.execute(query, {'logged_in': logged_in}).first() WHERE CD_UTI=:logged_in;"""
if results.access == 9: results = request.dbsession.execute(query, {'logged_in': logged_in}).first()
fonction = 'Administrateur'
elif results.access == 8: return {
fonction = 'Comptabilité' 'nom': results.nom,
elif results.access == 5: 'email': results.email,
fonction = 'Gestion' 'fonction': results.libelle,
else: 'societe': results.societe,
fonction = 'Commercial' }
return { def update_membre_mdp_oublie(request, login):
'nom': results.nom, import uuid, base64
'email': results.email, # get a UUID - URL safe, Base64
'fonction': fonction,
'societe': results.societe, uid = uuid.uuid1()
} urlslug = base64.urlsafe_b64encode(uid.bytes).decode("utf-8").rstrip('=\n').replace('/', '_')
query = "UPDATE p_users SET mdp_oublie=:urlslug, mdp_oublie_date=now() WHERE CD_UTI=:login;"
def update_membre_mdp_oublie(request, login): execute_query(request, query, {'urlslug':urlslug, 'login':login})
import uuid, base64
# get a UUID - URL safe, Base64 return urlslug
uid = uuid.uuid1() def update_membre_mdp(request, login, password):
urlslug = base64.urlsafe_b64encode(uid.bytes).decode("utf-8").rstrip('=\n').replace('/', '_') """Update password for member login"""
query = "UPDATE p_users SET mdp_oublie=:urlslug, mdp_oublie_date=now() WHERE CD_UTI=:login;" query = "UPDATE p_users SET mdp = SHA1(:password), mdp_oublie=NULL, mdp_oublie_date=NULL WHERE cd_uti=:login;"
execute_query(request, query, {'urlslug':urlslug, 'login':login}) execute_query(request, query, {'login': login, 'password': password})
return urlslug def update_last_connection(request, login, ua_string):
"""Update last connection for login """
def update_membre_mdp(request, login, password): query = "UPDATE p_users SET dern_cnx_le=NOW(), ua_string=:ua_string WHERE cd_uti=:login;"
"""Update password for member login""" execute_query(request, query, {'login': login, 'ua_string': ua_string})
query = "UPDATE p_users SET mdp = SHA1(:password), mdp_oublie=NULL, mdp_oublie_date=NULL WHERE cd_uti=:login;"
execute_query(request, query, {'login': login, 'password': password}) def update_membre(request, cd_uti, new_values):
# formater les champs
def update_last_connection(request, login, ua_string): s = ''
"""Update last connection for login """ for param in new_values.keys():
query = "UPDATE p_users SET dern_cnx_le=NOW(), ua_string=:ua_string WHERE cd_uti=:login;" if param == 'nom':
execute_query(request, query, {'login': login, 'ua_string': ua_string}) new_values['nom'] = new_values['nom'].upper()
def update_membre(request, cd_uti, new_values): if s:
# formater les champs s += ",%s=:%s" % (param, param)
s = '' else:
for param in new_values.keys(): s = "%s=:%s" % (param, param)
if param == 'nom':
new_values['nom'] = new_values['nom'].upper() if cd_uti == '0':
if param == 'access': query = "INSERT INTO p_users SET %s" % s
' ne prend que le 1er caractère' else:
new_values['access'] = new_values['access'][0] new_values['cd_uti'] = cd_uti
query = "UPDATE p_users SET %s WHERE cd_uti = :cd_uti;" % s
if s: execute_query(request, query, new_values)
s += ",%s=:%s" % (param, param)
else: def delete_membre(request, cd_uti):
s = "%s=:%s" % (param, param) query = "DELETE FROM p_users WHERE cd_uti = :cd_uti ;"
execute_query(request, query, {'cd_uti': cd_uti})
if cd_uti == '0':
query = "INSERT INTO p_users SET %s" % s def get_tarif_ajax(request, type, groupe, libelle):
else: if type == 'LIB':
new_values['cd_uti'] = cd_uti if groupe == 'TEXTE':
query = "UPDATE p_users SET %s WHERE cd_uti = :cd_uti;" % s # lire tous les textes dont le libelle commençe par
execute_query(request, query, new_values) query = "SELECT * FROM tarifs WHERE groupe='TEXTE' and libelle like :libelle;"
results = request.dbsession.execute(query, {'libelle': libelle + "%"}).fetchall()
def delete_membre(request, cd_uti): else:
query = "DELETE FROM p_users WHERE cd_uti = :cd_uti ;" # lire tous les tarifs du grupe dont le ref commençe par libelle
execute_query(request, query, {'cd_uti': cd_uti}) query = "SELECT * FROM tarifs WHERE groupe=:groupe and ref like :libelle;"
results = request.dbsession.execute(query, {'groupe': groupe, 'libelle': libelle + "%"}).fetchall()
else:
# lire tous les tarif du grupe dont le ref est égale à
query = "SELECT * FROM tarifs WHERE groupe=:groupe and ref = :libelle;"
results = request.dbsession.execute(query, {'groupe': groupe, 'libelle': libelle}).first()
return results
def get_codespostaux(request, codep):
query = "SELECT * FROM p_codespostaux WHERE code_postal LIKE :code;"
results = request.dbsession.execute(query, {'code': codep+"%"}).fetchall()
return results
def get_dd_restant(request):
query = """SELECT (SELECT count(*) FROM dem_devis WHERE societe='PE' AND STATUS=0) AS nb_PE,
(SELECT count(*) FROM dem_devis WHERE societe='ME' AND STATUS=0) AS nb_ME,
(SELECT count(*) FROM dem_devis WHERE societe='PL' AND STATUS=0) AS nb_PL;"""
results = request.dbsession.execute(query).first()
return results
def get_de_restant(request):
# les suivis des attachés commerciaux dnas les 4 derniers jours
query = """SELECT
(SELECT count(*) FROM dem_lig WHERE societe='PE' AND DATEDIFF(CURDATE(), date) <= 7 AND usermaj in ('CG','MP','RV','VD')) AS nb_PE,
(SELECT count(*) FROM dem_lig WHERE societe='ME' AND DATEDIFF(CURDATE(), date) <= 7 AND usermaj in ('CG','MP','RV','VD')) AS nb_ME,
(SELECT count(*) FROM dem_lig WHERE societe='PL' AND DATEDIFF(CURDATE(), date) <= 7 AND usermaj in ('CG','MP','RV','VD')) AS nb_PL;"""
results = request.dbsession.execute(query).first()
return results
def get_fa_restant(request):
query = """SELECT (SELECT count(*) FROM facture WHERE societe='PE' AND STATUS < 8) AS nb_PE,
(SELECT count(*) FROM facture WHERE societe='ME' AND STATUS < 8) AS nb_ME,
(SELECT count(*) FROM facture WHERE societe='PL' AND STATUS < 8) AS nb_PL;"""
results = request.dbsession.execute(query).first()
return results
def get_rdv_by_date(request, date, agenda):
query = """SELECT COUNT(*) AS nb_rdv FROM bddevfac.dem_lig WHERE DATEVI=:date AND LISTE=:agenda;"""
results = request.dbsession.execute(query, {'date': date, 'agenda': agenda}).first()
return results.nb_rdv
def get_rdf_null(request):
# lire les RDF non validés depuis moins d'un an
query = """SELECT COUNT(*) AS nb_rdf FROM bddevfac.dem_rdf WHERE date_relu IS NULL AND year(date_inter) > 2021;"""
results = request.dbsession.execute(query).first()
return results.nb_rdf

252
mondumas/models/devis.py Normal file
View File

@@ -0,0 +1,252 @@
# -*- coding: utf8 -*-
from sqlalchemy import text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import (
scoped_session,
sessionmaker,
)
from zope.sqlalchemy import (
ZopeTransactionExtension,
mark_changed
)
from datetime import *
import transaction
import os
from ..views.default import (
to_int,
)
def execute_query(request, query, params):
"""Execute query and mark session as changed"""
request.dbsession.execute(query, params)
mark_changed(request.dbsession)
transaction.commit()
def get_dossiers_byName(request, societe, name):
# lires tous les dossiers d'un chantier
query = """select * from (
SELECT date,'DD' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, 0 AS montant, status, nosin, societe , no_id as nochantier
FROM dem_devis WHERE societe=:societe AND c_nom LIKE :name
UNION
SELECT date,'DE' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, societe , nochantier
FROM devis WHERE societe=:societe AND c_nom LIKE :name
UNION
SELECT date,'FA' AS TYPE, LPAD(no_id,6,'0') AS numero, nomcli, CONCAT(c_nom,'; ',c_adr,'; ',c_ville) AS chantier, COALESCE(totalht,0) AS montant, status, nosin, societe , nochantier
FROM facture WHERE societe=:societe AND c_nom LIKE :name
) a
order by date, TYPE
"""
results = request.dbsession.execute(query, {'societe': societe, 'name': name+'%'}).fetchall()
return results
def get_devfac_by_no(request,nodossier):
# lire devis, facture ou proforma
societe = nodossier[0:2]
type_doc = nodossier[3:5]
no_id = nodossier[5:]
if type_doc == 'DE':
query = """
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM devis d
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
INNER JOIN p_cabinet a ON d.cabinet = a.code
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
WHERE d.societe = :societe and d.no_id=:no_id;"""
elif type_doc == 'FA':
query = """
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM facture d
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
INNER JOIN p_cabinet a ON d.cabinet = a.code
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
WHERE d.societe = :societe and d.no_id=:no_id;"""
else:
query = """
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM proforma d
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
INNER JOIN p_cabinet a ON d.cabinet = a.code
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
WHERE d.societe = :societe and d.no_id=:no_id;"""
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
return results
def get_devis_lig_by_no(request,nodossier):
societe = nodossier[0:2]
type_doc = nodossier[3:5]
no_id = nodossier[5:]
if type_doc == 'DE':
query = "SELECT * FROM devis_lig WHERE societe = :societe and no_id=:no_id;"
elif type_doc == 'FA':
query = "SELECT * FROM facture_lig WHERE societe = :societe and no_id=:no_id;"
else:
query = "SELECT * FROM proforma_lig WHERE societe = :societe and no_id=:no_id;"
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall()
return results
def get_devis_lignes_by_no(request, nodossier, nolig):
societe = nodossier[0:2]
type_doc = nodossier[3:5]
no_id = nodossier[5:]
if nolig == '0':
query = "SELECT * FROM devis_lignes WHERE societe = :societe and no_id=:no_id;"
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall()
else:
query = "SELECT * FROM devis_lignes WHERE societe = :societe and no_id=:no_id and nolig=:nolig;"
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id, 'nolig': nolig}).first()
return results
def insert_devis_from_dossier(request, nodossier, logged_in):
societe = nodossier[0:2]
no_id = nodossier[3:]
query = "CALL spINS_DEVIS_FROM_DOSSIER(:societe, 'DDW', :no_id, :logged_in);"
results = request.dbsession.execute(query,{'societe': societe, 'no_id': no_id, 'logged_in': logged_in}).first()
return results
def get_devis_by_no(request,nodossier):
# lire devis, facture ou proforma
societe = nodossier[0:2]
no_id = nodossier[5:]
query = """
SELECT d.*, c.*, s.libelle, a.NOM as nom_cabinet, e.NOM as nom_expert FROM devis d
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
INNER JOIN p_cabinet a ON d.cabinet = a.code
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
INNER JOIN p_statuts s ON d.STATUS = s.code
WHERE d.societe = :societe and d.no_id=:no_id;"""
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
return results
def get_facture_by_no(request,nodossier):
# lire facture
societe = nodossier[0:2]
no_id = nodossier[5:]
query = """
SELECT d.*, c.*, s.libelle, a.NOM as nom_cabinet, e.NOM as nom_expert FROM facture d
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
INNER JOIN p_cabinet a ON d.cabinet = a.code
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
INNER JOIN p_statuts s ON d.STATUS = s.code
WHERE d.societe = :societe and d.no_id=:no_id;"""
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
return results
def get_proforma_by_no(request,nodossier):
# lire facture
societe = nodossier[0:2]
no_id = nodossier[5:]
query = """
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM proforma d
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
INNER JOIN p_cabinet a ON d.cabinet = a.code
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
WHERE d.societe = :societe and d.no_id=:no_id;"""
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
return results
def update_devis_ligne(request, nodossier, nolig, new_values):
societe = nodossier[0:2]
no_id = nodossier[5:]
# formater les champs
s = ''
for param in new_values.keys():
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if nolig == '0':
query = "INSERT INTO devis_lignes SET %s" % s
else:
new_values['societe'] = societe
new_values['no_id'] = no_id
new_values['nolig'] = nolig
query = "UPDATE devis_lignes SET %s WHERE societe = :societe and no_id=:no_id and nolig = :nolig;" % s
# import pdb;pdb.set_trace()
execute_query(request, query, new_values)
def sum_devis_totaux(request, nodossier):
societe = nodossier[0:2]
no_id = nodossier[5:]
query = """UPDATE devis SET totalht = (SELECT SUM(mtht) FROM devis_lignes WHERE societe=:societe AND no_id=:no_id),
totaltva = ROUND(totalht * tauxtva / 100,2),
totalttc = totalht + totaltva
WHERE societe=:societe AND no_id=:no_id;"""
execute_query(request, query, {'societe': societe, 'no_id': no_id})
def delete_devis_ligne(request, nodossier, nolig):
societe = nodossier[0:2]
no_id = nodossier[5:]
query = "DELETE FROM devis_lignes WHERE societe = :societe and no_id=:no_id and nolig=%s;"
execute_query(request, query, {'societe': societe, 'no_id': no_id})
def move_devis_ligne(request, nodossier, nolig, move):
societe = nodossier[0:2]
no_id = nodossier[5:]
# get max no ligne du devis
query = "SELECT count(*) AS max_no FROM devis_lignes WHERE societe = :societe and no_id=:no_id;"
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
max_no = results.max_no + 1
step = 0
if move == 'up':
# déplacement vers le haut
if nolig > 1:
step = -1
else:
# déplacement vers le haut
if nolig < max_no:
step = +1
if step != 0:
# déplacer le suivant ou précédent vers la fin
query = """UPDATE devis_lignes SET nolig = :max_no WHERE societe = :societe and no_id=:no_id and nolig = :nolig + :step;"""
execute_query(request, query, {'societe': societe, 'no_id': no_id, 'nolig': nolig, 'max_no': max_no, 'step': step})
# permuter avec le suivant ou précédent
query = """UPDATE devis_lignes SET nolig = nolig + :step WHERE societe = :societe and no_id=:no_id and nolig = :nolig;"""
execute_query(request, query, {'societe': societe, 'no_id': no_id, 'nolig': nolig, 'step': step})
# remettre le précédent ou suivant à la place de la ligne déplacée
query = """UPDATE devis_lignes SET nolig = :nolig WHERE societe = :societe and no_id=:no_id and nolig = :max_no;"""
execute_query(request, query, {'societe': societe, 'no_id': no_id, 'nolig': nolig, 'max_no': max_no})
def update_devis_cloture(request, nodevis, status, logged_in):
societe = nodevis[0:2]
nochantier = int(nodevis[5:])
# met le montant regle à 1 centime pour terminé le dossier
query = "UPDATE devis SET STATUS = :status, USERMAJ = :logged_in WHERE societe=:societe AND no_id=:nochantier;"
execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'status': status, 'logged_in': logged_in})
def update_devis_nochantier(request, societe, no_devis, nochantier):
# extraire type de doc et no de doc à mettre à jour
type = no_devis[0:2]
no_id = no_devis[3:]
if type == 'DE':
# maj le numero du dossier du devis
query = "UPDATE devis SET nochantier = :nochantier WHERE societe=:societe AND no_id=:no_id;"
else:
# maj le numero du dossier de la facture
query = "UPDATE facture SET nochantier = :nochantier WHERE societe=:societe AND no_id=:no_id;"
execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'no_id': no_id})

View File

@@ -1,321 +1,410 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
from sqlalchemy import text from sqlalchemy import text
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import ( from sqlalchemy.orm import (
scoped_session, scoped_session,
sessionmaker, sessionmaker,
) )
from zope.sqlalchemy import ( from zope.sqlalchemy import (
ZopeTransactionExtension, ZopeTransactionExtension,
mark_changed mark_changed
) )
from datetime import * from datetime import *
import transaction import transaction
import os
def execute_query(request, query, params):
"""Execute query and mark session as changed""" def execute_query(request, query, params):
request.dbsession.execute(query, params) """Execute query and mark session as changed"""
mark_changed(request.dbsession) request.dbsession.execute(query, params)
transaction.commit() mark_changed(request.dbsession)
transaction.commit()
def get_chantiers_byName(request, societe, name):
def get_chantiers_byName(request, societe, name):
query = "CALL spGET_CHANTIERS_byName('%s','%s');" % (societe, name)
results = request.dbsession.execute(query).fetchall() query = "CALL spGET_CHANTIERS_byName('%s','%s');" % (societe, name)
return results results = request.dbsession.execute(query).fetchall()
return results
def get_dossier_by_no(request,nodossier):
societe = nodossier[0:2] def get_dossier_by_no(request,nodossier):
no_id = nodossier[3:] societe = nodossier[0:2]
query = """ no_id = nodossier[3:]
SELECT d.*, a.NOM as nom_cabinet, e.NOM as nom_expert, query = """
c.QUALITE AS cli_QUALITE, c.NOM AS cli_NOM, c.ADRESSE AS cli_ADRESSE, c.ADRESSE2 AS cli_ADRESSE2, c.CP AS cli_CP, c.VILLE AS cli_VILLE, SELECT d.*, s.libelle, a.NOM as nom_cabinet, e.NOM as nom_expert,
c.TEL1 AS cli_TEL1, c.TEL2 AS cli_TEL2, c.TELP AS cli_TELP, c.FAX AS cli_FAX, c.NOMRESP AS cli_NOMRESP c.QUALITE AS cli_QUALITE, c.NOM AS cli_NOM, c.ADRESSE AS cli_ADRESSE, c.ADRESSE2 AS cli_ADRESSE2, c.CP AS cli_CP, c.VILLE AS cli_VILLE,
FROM dem_devis d c.TEL1 AS cli_TEL1, c.TEL2 AS cli_TEL2, c.TELP AS cli_TELP, c.FAX AS cli_FAX, c.NOMRESP AS cli_NOMRESP
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli FROM dem_devis d
INNER JOIN p_cabinet a ON d.cabinet = a.code INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp INNER JOIN p_cabinet a ON d.cabinet = a.code
where d.societe = '%s' and d.no_id=%s;""" % (societe, no_id); INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
results = request.dbsession.execute(query).first() INNER JOIN p_statuts s ON d.STATUS = s.code
return results where d.societe = '%s' and d.no_id=%s;""" % (societe, no_id);
results = request.dbsession.execute(query).first()
def get_dossier_by_sinistre(request,societe, nosin): return results
query = "SELECT * FROM dem_devis WHERE societe = '%s' and LEFT(REPLACE(nosin,' ', ''),11) = LEFT(REPLACE('%s',' ', ''),11);" % (societe, nosin);
results = request.dbsession.execute(query).first() def get_dossier_by_sinistre(request,societe, nosin):
return results query = "SELECT * FROM dem_devis WHERE societe = '%s' and LEFT(REPLACE(nosin,' ', ''),11) = LEFT(REPLACE('%s',' ', ''),11);" % (societe, nosin);
results = request.dbsession.execute(query).first()
return results
def get_devis_by_no(request,nodossier):
societe = nodossier[0:2] def get_dossiers_traites(request, societe):
type_doc = nodossier[3:5] query = """SELECT d.date, LPAD(d.no_id,6,'0') AS numero, d.nomcli, CONCAT(d.c_nom,'; ',d.c_adr,'; ',d.c_ville) AS chantier, d.mttrav AS montant, status, s.libelle, d.nosin, d.nopol, d.humidite, d.usermaj
no_id = nodossier[5:] FROM dem_devis d JOIN p_statuts s ON d.STATUS = s.CODE WHERE d.societe = :societe AND d.status < 2 ORDER BY d.status, d.nomcli""";
results = request.dbsession.execute(query, {'societe': societe}).fetchall()
if type_doc == 'DE': return results
query = """
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM devis d def get_dossiers_importes(request):
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli query = "SELECT * FROM dem_devis WHERE usermaj='EMAIL' and status=0 ORDER BY DATEMAJ";
INNER JOIN p_cabinet a ON d.cabinet = a.code results = request.dbsession.execute(query).fetchall()
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp return results
WHERE d.societe = :societe and d.no_id=:no_id;"""
elif type_doc == 'FA': def get_clients_byName(request, societe, nom):
query = """ query = "SELECT * FROM clients WHERE societe = '%s' and nom LIKE '%s';" % (societe, nom + '%');
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM facture d results = request.dbsession.execute(query).fetchall()
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli return results
INNER JOIN p_cabinet a ON d.cabinet = a.code
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp def get_derniers_suivis(request):
WHERE d.societe = :societe and d.no_id=:no_id;""" query = """SELECT l.*, CONCAT(l.societe,'-',l.no_id) AS nodossier, d.C_NOM FROM dem_lig l
else: INNER JOIN dem_devis d ON l.societe=d.societe AND l.no_id=d.no_id
query = """ WHERE DATEDIFF(CURDATE(), l.date) <= 7 AND l.usermaj in ('CG','MP','RV','VD') ORDER BY l.date, l.societe DESC;"""
SELECT d.*, c.*, a.NOM as nom_cabinet, e.NOM as nom_expert FROM proforma d results = request.dbsession.execute(query, ).fetchall()
INNER JOIN clients c ON d.societe = c.societe and d.cd_cli = c.cd_cli return results
INNER JOIN p_cabinet a ON d.cabinet = a.code
INNER JOIN p_experts e ON d.cabinet = e.code_cab and d.expert = e.code_exp
WHERE d.societe = :societe and d.no_id=:no_id;""" def get_dossier_rdv_by_no(request,nodossier, nolig):
societe = nodossier[0:2]
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first() no_id = nodossier[3:]
return results
if nolig == '0':
def get_dossier_rdv_by_no(request,nodossier, nolig): query = "SELECT * FROM dem_lig WHERE societe = :societe AND no_id = :no_id;"
societe = nodossier[0:2] results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall()
no_id = nodossier[3:] else:
query = """
if nolig == '0': SELECT l.*, d.C_QUALITE, d.C_NOM FROM dem_lig l INNER JOIN dem_devis d ON l.societe = d.societe and l.no_id = d.no_id
query = "SELECT * FROM dem_lig WHERE societe = :societe AND no_id = :no_id;" where l.societe = '%s' and l.no_id=%s and l.nolig=%s;""" % (societe, no_id, nolig)
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall() results = request.dbsession.execute(query).first()
else:
query = """ return results
SELECT l.*, d.C_QUALITE, d.C_NOM FROM dem_lig l INNER JOIN dem_devis d ON l.societe = d.societe and l.no_id = d.no_id
where l.societe = '%s' and l.no_id=%s and l.nolig=%s;""" % (societe, no_id, nolig) def get_documents_byChantier(request,nodossier):
results = request.dbsession.execute(query).first() societe = nodossier[0:2]
no_id = nodossier[3:]
return results
query = "CALL spGET_DOSSIERS_byNumeo('%s',%s);" % (societe, no_id)
def get_documents_byChantier(request,nodossier): results = request.dbsession.execute(query).fetchall()
societe = nodossier[0:2] return results
no_id = nodossier[3:]
def update_suivi(request, nodossier, nolig, new_values):
query = "CALL spGET_DOSSIERS_byNumeo('%s',%s);" % (societe, no_id) societe = nodossier[0:2]
results = request.dbsession.execute(query).fetchall() no_id = nodossier[3:]
return results
new_values['societe'] = societe
def update_suivi(request, nodossier, nolig, new_values): new_values['no_id'] = no_id
societe = nodossier[0:2] s = ''
no_id = nodossier[3:] for param in new_values.keys():
if s:
new_values['societe'] = societe s += ",%s=:%s" % (param, param)
new_values['no_id'] = no_id else:
s = '' s = "%s=:%s" % (param, param)
for param in new_values.keys():
if s: if nolig == '0':
s += ",%s=:%s" % (param, param) query = "INSERT INTO dem_lig SET %s" % s
else: else:
s = "%s=:%s" % (param, param) new_values['nolig'] = nolig
query = "UPDATE dem_lig SET %s WHERE societe = :societe AND NO_ID = :no_id AND NOLIG = :nolig ;" % s
if nolig == '0':
query = "INSERT INTO dem_lig SET %s" % s execute_query(request, query, new_values)
else:
new_values['nolig'] = nolig def insert_suivi(request, nodossier, comment):
query = "UPDATE dem_lig SET %s WHERE societe = :societe AND NO_ID = :no_id AND NOLIG = :nolig ;" % s societe = nodossier[0:2]
no_id = nodossier[3:]
execute_query(request, query, new_values)
query = "INSERT INTO dem_lig (societe, NO_ID, DATE, COMMENT, USERMAJ) VALUES (:societe, :no_id, CURRENT_DATE(), :comment, 'EMAIL');"
def insert_suivi(request, nodossier, comment): execute_query(request, query, {'societe': societe, 'no_id': no_id, 'comment': comment})
societe = nodossier[0:2]
no_id = nodossier[3:] query = "UPDATE dem_devis SET usermaj = 'EMAIL' WHERE SOCIETE=:societe AND NO_ID=:no_id;"
execute_query(request, query, {'societe': societe, 'no_id': no_id})
query = """
INSERT INTO dem_lig (societe, NO_ID, DATE, COMMENT, USERMAJ) VALUES def get_similaires_byChantier(request, societe, C_NOM, C_ADR, C_CP, C_VILLE):
(:societe, :no_id, CURRENT_DATE(), :comment, 'MAIL');"""
execute_query(request, query, {'societe': societe, 'no_id': no_id, 'comment': comment}) query = """
SELECT CONCAT(societe,'-',NO_ID) AS nodossier, dem_devis.* FROM dem_devis
def get_similaires_byChantier(request, societe, C_NOM, C_ADR, C_CP, C_VILLE): WHERE societe<>:societe AND C_NOM=:C_NOM AND C_ADR=:C_ADR AND C_CP=:C_CP AND C_VILLE=:C_VILLE;"""
results = request.dbsession.execute(query, {'societe': societe, 'C_NOM': C_NOM, 'C_ADR': C_ADR, 'C_CP': C_CP, 'C_VILLE': C_VILLE}).fetchall()
query = """
SELECT CONCAT(societe,'-',NO_ID) AS nodossier, dem_devis.* FROM dem_devis return results
WHERE societe<>:societe AND C_NOM=:C_NOM AND C_ADR=:C_ADR AND C_CP=:C_CP AND C_VILLE=:C_VILLE;"""
results = request.dbsession.execute(query, {'societe': societe, 'C_NOM': C_NOM, 'C_ADR': C_ADR, 'C_CP': C_CP, 'C_VILLE': C_VILLE}).fetchall() def get_docs_attaches(request, nodossier, norapport, origine, filename):
societe = nodossier[0:2]
return results nochantier = int(nodossier[3:])
def get_devis_lig_by_no(request,nodossier): if filename == '':
query = "SELECT * FROM dossier_attaches WHERE societe = :societe AND nochantier = :nochantier AND nodossier=0 AND origine = :origine ORDER BY cree_le;"
societe = nodossier[0:2] else:
type_doc = nodossier[3:5] query = """SELECT * FROM dossier_attaches WHERE societe = :societe AND nochantier = :nochantier
no_id = nodossier[5:] AND nodossier = :norapport AND origine = :origine AND nomfichier = :filename ORDER BY cree_le;"""
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier,
if type_doc == 'DE': 'norapport': norapport, 'origine': origine, 'filename': filename}).fetchall()
query = "SELECT * FROM devis_lig WHERE societe = :societe and no_id=:no_id;" return results
elif type_doc == 'FA':
query = "SELECT * FROM facture_lig WHERE societe = :societe and no_id=:no_id;" def get_photos(request, nodossier, norapport, origine):
else: societe = nodossier[0:2]
query = "SELECT * FROM proforma_lig WHERE societe = :societe and no_id=:no_id;" nochantier = int(nodossier[3:])
query = """SELECT * FROM dossier_attaches WHERE societe = :societe AND nochantier = :nochantier
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).fetchall() AND nodossier = :norapport AND origine = :origine AND UPPER(RIGHT(nomfichier,3)) <> 'PDF' ORDER BY cree_le;"""
return results results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport, 'origine': origine}).fetchall()
return results
def get_docs_attaches(request, nodossier, norapport, nosection, filename):
societe = nodossier[0:2] def delete_photos(request, nodossier, norapport, origine, nomfic):
nochantier = int(nodossier[3:]) societe = nodossier[0:2]
nochantier = int(nodossier[3:])
if filename == '': # supprimer d'abord le fichier
query = "SELECT * FROM dossier_attaches WHERE nomrep = 'DOCS_ATTACHES' AND societe = :societe AND nochantier = :nochantier AND nodossier=0 ORDER BY cree_le;" if len(origine) > 1:
else: file_path = '%s/%s/%s/%s' % (request.registry.settings['mondumas.devfac_dir'], societe, nochantier, nomfic)
query = """SELECT * FROM dossier_attaches WHERE nomrep = 'DOCS_ATTACHES' AND societe = :societe AND nochantier = :nochantier else:
AND nodossier = :norapport AND nomfichier = :filename ORDER BY cree_le;""" file_path = '%s/%s/%s/%s/%s' % (request.registry.settings['mondumas.devfac_dir'], societe, nochantier, norapport, nomfic)
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport, 'filename': filename}).fetchall() if os.path.exists(file_path):
os.remove(file_path)
return results
query = "DELETE FROM dossier_attaches WHERE societe=:societe AND nochantier=:nochantier AND nodossier=:norapport AND origine=:origine AND nomfichier=:nomfic;"
def get_photos(request, nodossier, norapport, nosection): execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport, 'origine': origine, 'nomfic': nomfic})
societe = nodossier[0:2]
nochantier = int(nodossier[3:]) def rename_photos(request, nodossier, norapport, origine, nomfic, new_nomfic):
query = """SELECT * FROM dossier_attaches WHERE nomrep = 'DOCS_ATTACHES' AND societe = :societe AND nochantier = :nochantier societe = nodossier[0:2]
AND nodossier = :norapport AND nosection = :nosection AND UPPER(RIGHT(nomfichier,3)) <> 'PDF' ORDER BY cree_le;""" nochantier = int(nodossier[3:])
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport, 'nosection': nosection}).fetchall()
return results query = """
UPDATE dossier_attaches SET nomfichier = :new_nomfic
def delete_photos(request, nodossier, norapport, nosection, nomfic): WHERE societe=:societe AND nochantier=:nochantier AND nodossier=:norapport AND origine=:origine AND nomfichier=:nomfic;
societe = nodossier[0:2] """
nochantier = int(nodossier[3:]) execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport,
query = "DELETE FROM dossier_attaches WHERE nomrep='DOCS_ATTACHES' AND societe=:societe AND nochantier=:nochantier AND nodossier=:norapport AND nosection=:nosection AND nomfichier=:nomfic;" 'origine': origine, 'nomfic': nomfic, 'new_nomfic': new_nomfic})
execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport, 'nosection': nosection, 'nomfic': nomfic})
def update_dossier(request, nodossier, new_values):
societe = nodossier[0:2]
def update_dossier(request, nodossier, new_values): nochantier = int(nodossier[3:])
societe = nodossier[0:2]
nochantier = int(nodossier[3:]) s = ''
for param in new_values.keys():
s = '' if param == 'C_VILLE':
for param in new_values.keys(): new_values['C_VILLE'] = new_values['C_VILLE'].upper()
if param == 'C_VILLE':
new_values['C_VILLE'] = new_values['C_VILLE'].upper() if s:
s += ",%s=:%s" % (param, param)
if s: else:
s += ",%s=:%s" % (param, param) s = "%s=:%s" % (param, param)
else: new_values['societe'] = societe
s = "%s=:%s" % (param, param) new_values['nochantier'] = nochantier
new_values['societe'] = societe query = "UPDATE dem_devis SET %s WHERE societe=:societe AND no_id=:nochantier" % s
new_values['nochantier'] = nochantier execute_query(request, query, new_values)
query = "UPDATE dem_devis SET %s WHERE societe=:societe AND no_id=:nochantier" % s
execute_query(request, query, new_values) query = "CALL spUPD_CHANTIER_COORD(:societe, :nochantier);"
execute_query(request, query, {'societe': societe, 'nochantier': nochantier})
query = "CALL spUPD_CHANTIER_COORD(:societe, :nochantier);"
execute_query(request, query, {'societe': societe, 'nochantier': nochantier}) def update_dossier_cloture(request, nodossier, status, logged_in):
societe = nodossier[0:2]
def insert_dossier_attaches(request, nodossier, norapport, nosection, filename, filesize, user): nochantier = int(nodossier[3:])
societe = nodossier[0:2] # met le montant regle à 1 centime pour terminé le dossier
nochantier = int(nodossier[3:]) query = "UPDATE dem_devis SET STATUS = :status, USERMAJ = :logged_in WHERE societe=:societe AND no_id=:nochantier"
execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'status': status, 'logged_in': logged_in})
# fichier existe ?
item = get_docs_attaches(request, nodossier, norapport, nosection, filename) def insert_dossier_attaches(request, nodossier, norapport, origine, filename, filesize, user):
if item: societe = nodossier[0:2]
return nochantier = int(nodossier[3:])
# enregistrer dans la table dossier_attaches
query = """INSERT INTO dossier_attaches (nomrep, societe, nochantier, nodossier, nosection, nomfichier, taillefichier, cree_le, usermaj) # fichier existe ?
VALUES('DOCS_ATTACHES',:societe,:nochantier,:norapport,:nosection,:filename,:filesize,NOW(),:user);""" item = get_docs_attaches(request, nodossier, norapport, origine, filename)
execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport, 'nosection': nosection, 'filename': filename, 'filesize': filesize, 'user': user}) if item:
return
def get_rapport_by_no(request,nodossier,date_inter): # enregistrer dans la table dossier_attaches
societe = nodossier[0:2] query = """INSERT INTO dossier_attaches (societe, nochantier, nodossier, origine, nomfichier, taillefichier, cree_le, usermaj)
nochantier = nodossier[3:] VALUES(:societe,:nochantier,:norapport,:origine,:filename,:filesize,NOW(),:user);"""
if date_inter == '': execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'norapport': norapport,
query = "SELECT * FROM dem_rdf WHERE societe = :societe AND nochantier = :nochantier;" 'origine': origine, 'filename': filename, 'filesize': filesize, 'user': user})
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).fetchall()
else: def get_rapport_by_no(request,nodossier,date_inter):
query = "SELECT * FROM dem_rdf WHERE societe = :societe AND nochantier = :nochantier AND date_inter=:date_inter;" societe = nodossier[0:2]
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier, 'date_inter': date_inter}).first() nochantier = nodossier[3:]
return results if date_inter == '':
query = "SELECT * FROM dem_rdf WHERE societe = :societe AND nochantier = :nochantier;"
def get_rapport_by_no_id(request,no_id): results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).fetchall()
query = "SELECT * FROM dem_rdf WHERE no_id = :no_id;" else:
results = request.dbsession.execute(query, {'no_id': no_id}).first() query = "SELECT * FROM dem_rdf WHERE societe = :societe AND nochantier = :nochantier AND date_inter=:date_inter;"
return results results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier, 'date_inter': date_inter}).first()
return results
def get_articles_by_fam(request, fam):
query = "SELECT * FROM articles WHERE FAM = :fam;" def get_rapport_by_no_id(request,no_id):
results = request.dbsession.execute(query, {'fam': fam}).fetchall() query = "SELECT * FROM dem_rdf WHERE no_id = :no_id;"
return results results = request.dbsession.execute(query, {'no_id': no_id}).first()
return results
def get_rapport_rdf(request):
# les rapports de RDF encours (non encore facturés) def get_articles_rdf(request):
query = "SELECT * FROM dem_rdf where date_facture IS NULL;" query = "SELECT * FROM articles WHERE REF LIKE 'RDF%';"
results = request.dbsession.execute(query, ).fetchall() results = request.dbsession.execute(query).fetchall()
return results return results
def insert_rapport(request,nodossier,logged_in): def get_rapport_rdf(request):
societe = nodossier[0:2] # les rapports de RDF (100 derniers)
nochantier = nodossier[3:] query = "SELECT * FROM dem_rdf ORDER BY societe, no_id DESC LIMIT 100;"
results = request.dbsession.execute(query, ).fetchall()
query = """INSERT INTO dem_rdf (societe, nochantier, cd_cli, nomcli, c_qualite, c_nom, c_adr, c_adr2, c_cp, c_ville, c_tel1, c_telp, nosin, auteur_code) return results
SELECT societe, no_id, cd_cli, nomcli, c_qualite, c_nom, c_adr, c_adr2, c_cp, c_ville, c_tel1, c_telp, nosin, :auteur_code FROM dem_devis WHERE societe = :societe AND no_id = :nochantier;"""
execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'auteur_code': logged_in}) def insert_rapport(request,nodossier,logged_in):
societe = nodossier[0:2]
def get_rdf_causes(request, code): nochantier = nodossier[3:]
query = "SELECT libelle FROM rdf_causes where code LIKE :code;"
results = request.dbsession.execute(query, {'code': code + '%'}).fetchall() query = """INSERT INTO dem_rdf (societe, nochantier, cd_cli, nomcli, c_qualite, c_nom, c_adr, c_adr2, c_cp, c_ville, c_tel1, c_telp, nosin, auteur_code)
return results SELECT societe, no_id, cd_cli, nomcli, c_qualite, c_nom, c_adr, c_adr2, c_cp, c_ville, c_tel1, c_telp, nosin, :auteur_code FROM dem_devis WHERE societe = :societe AND no_id = :nochantier;"""
execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'auteur_code': logged_in})
def update_rapport(request, nodossier, date_inter, new_values):
societe = nodossier[0:2] def get_rdf_causes(request, code):
nochantier = int(nodossier[3:]) query = "SELECT libelle FROM rdf_causes where code LIKE :code;"
results = request.dbsession.execute(query, {'code': code + '%'}).fetchall()
s = '' return results
for param in new_values.keys():
if s: def update_rapport(request, nodossier, dateinter, new_values):
s += ",%s=:%s" % (param, param) societe = nodossier[0:2]
else: nochantier = int(nodossier[3:])
s = "%s=:%s" % (param, param)
new_values['societe'] = societe s = ''
new_values['nochantier'] = nochantier for param in new_values.keys():
new_values['date_inter'] = date_inter if s:
query = "UPDATE dem_rdf SET %s WHERE societe=:societe AND nochantier=:nochantier AND date_inter=:date_inter;" % s s += ",%s=:%s" % (param, param)
execute_query(request, query, new_values) else:
s = "%s=:%s" % (param, param)
def delete_rapport(request, no_id): new_values['societe'] = societe
new_values['nochantier'] = nochantier
query = "DELETE FROM dem_rdf WHERE no_id = :no_id" new_values['dateinter'] = dateinter
execute_query(request, query, {'no_id': no_id})
query = "UPDATE dem_rdf SET %s WHERE societe=:societe AND nochantier=:nochantier AND date_inter=:dateinter;" % s
def validate_rapport(request, no_id): execute_query(request, query, new_values)
query = "UPDATE dem_rdf SET date_relu=CURRENT_DATE WHERE no_id = :no_id"
execute_query(request, query, {'no_id': no_id}) def delete_rapport(request, no_id):
def insert_facture_rdf(request, societe, nochantier, user, ref, date_rapport): query = "DELETE FROM dem_rdf WHERE no_id = :no_id"
# créer une facture vierge à partir du dossier execute_query(request, query, {'no_id': no_id})
query = "CALL spINS_FACTURE_RDF(:societe, :nochantier, :user, :ref, :date_rapport)"
execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'user': user, 'ref': ref, 'date_rapport': date_rapport}) def update_rapport_validate(request, no_id):
query = "UPDATE dem_rdf SET date_relu=CURRENT_DATE WHERE no_id = :no_id"
def insert_dossier(request, societe, cd_cli, c_nom, c_adr, c_adr2, c_cp, c_ville, c_telp, nosin, c_obs, tx_trav): execute_query(request, query, {'no_id': no_id})
# créer une dem_devis selon l'email de l'OS
query = """CALL spINS_DEMANDES(:societe, :cd_cli, :c_nom, :c_adr, :c_adr2, :c_cp, :c_ville, :c_telp, 'MR', 6, :nosin, :c_obs, :tx_trav, :logged_in);""" def update_rapport_facture(request, no_id):
execute_query(request, query, {'societe': societe, 'cd_cli': cd_cli, 'c_nom': c_nom, 'c_adr': c_adr, 'c_adr2': c_adr2, 'c_cp': c_cp, query = "UPDATE dem_rdf SET date_facture=CURRENT_DATE WHERE no_id = :no_id"
'c_ville': c_ville,'c_telp': c_telp, 'nosin': nosin, 'c_obs': c_obs, 'tx_trav': tx_trav, 'logged_in': 'EMAIL'}) execute_query(request, query, {'no_id': no_id})
query = "SELECT no_id FROM dem_devis WHERE societe = :societe AND date = curdate() AND cd_cli = :cd_cli ORDER BY no_id desc LIMIT 1;" def update_rapport_client(request, norapport, nomClient, codeClient):
results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first() societe = codeClient[0:2]
return results.no_id cd_cli = int(codeClient[3:])
query = "UPDATE dem_rdf SET CD_CLI = :cd_cli, NOMCLI = :nomClient WHERE no_id = :norapport"
def get_cabinet(request, code): execute_query(request, query, {'norapport': norapport, 'cd_cli': cd_cli, 'nomClient': nomClient})
query = "SELECT * FROM p_cabinet where code = :code;"
results = request.dbsession.execute(query, {'code': code}).first() def update_rapport_nochantier(request, norapport, new_nochantier):
return results # controler que le no du nouveau dossier existe
dossier = get_dossier_by_no(request,'PL-' + new_nochantier)
def get_experts(request, code_cab, code_exp): if dossier:
if code_exp == 0: query = "UPDATE dem_rdf SET nochantier = :new_nochantier WHERE no_id = :norapport"
query = "SELECT * FROM p_experts where code_cab = :code_cab;" execute_query(request, query, {'norapport': norapport, 'new_nochantier': new_nochantier})
results = request.dbsession.execute(query, {'code_cab': code_cab}).fetchall() return "OK"
else: else:
query = "SELECT * FROM p_experts where code_cab = :code_cab AND code_exp = :code_exp;" return "NOK"
results = request.dbsession.execute(query, {'code_cab': code_cab, 'code_exp': code_exp}).first()
return results def insert_facture_rdf(request, societe, nochantier, cd_cli, nomcli, user, ref, date_rapport):
# créer une facture vierge à partir du dossier
def insert_log_nuit(request, proc, msg): query = "CALL spINS_FACTURE_RDF(:societe, :nochantier, :cd_cli, :nomcli, :user, :ref, :date_rapport)"
query = "INSERT INTO t_log_nuit (proc,msg) VALUES (:proc, :msg);" execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'cd_cli': cd_cli, 'nomcli': nomcli, 'user': user, 'ref': ref, 'date_rapport': date_rapport})
execute_query(request, query, {'proc': proc, 'msg': msg})
def insert_dossier(request, societe, cd_cli, c_nom, c_adr, c_adr2, c_cp, c_ville, c_telp, c_email, nosin, nopol, c_obs, tx_trav):
def get_log_demandes(request, ): # créer une dem_devis selon l'email de l'OS
# lire le log de nuit query = """CALL spINS_DEMANDES(:societe, :cd_cli, :c_nom, :c_adr, :c_adr2, :c_cp, :c_ville, :c_telp, :c_email, 'MR', 6, :nosin, :nopol, :c_obs, :tx_trav, 'EMAIL');"""
query = """SELECT * FROM t_log_nuit WHERE proc = 'GENERER';""" execute_query(request, query, {'societe': societe, 'cd_cli': cd_cli, 'c_nom': c_nom, 'c_adr': c_adr, 'c_adr2': c_adr2, 'c_cp': c_cp,
results = request.dbsession.execute(query, ) 'c_ville': c_ville,'c_telp': c_telp, 'nosin': nosin, 'nopol': nopol, 'c_obs': c_obs, 'tx_trav': tx_trav, 'c_email': c_email})
return results.fetchall()
query = "SELECT no_id FROM dem_devis WHERE societe = :societe AND date = curdate() AND cd_cli = :cd_cli ORDER BY no_id desc LIMIT 1;"
results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first()
return results.no_id
def get_cabinet(request, code):
query = "SELECT * FROM p_cabinet where code = :code;"
results = request.dbsession.execute(query, {'code': code}).first()
return results
def get_experts(request, code_cab, code_exp):
if code_exp == 0:
query = "SELECT * FROM p_experts where code_cab = :code_cab;"
results = request.dbsession.execute(query, {'code_cab': code_cab}).fetchall()
else:
query = "SELECT * FROM p_experts where code_cab = :code_cab AND code_exp = :code_exp;"
results = request.dbsession.execute(query, {'code_cab': code_cab, 'code_exp': code_exp}).first()
return results
def insert_log_nuit(request, proc, msg, nodossier):
query = "INSERT INTO t_log_nuit (proc,msg, nodossier) VALUES (:proc, :msg, :nodossier);"
execute_query(request, query, {'proc': proc, 'msg': msg, 'nodossier': nodossier})
def get_log_demandes(request, ):
# lire le log de nuit
query = """SELECT *, (SELECT usermaj FROM dem_devis WHERE societe=LEFT(nodossier,2) AND no_id=RIGHT(nodossier,6)) AS user
FROM t_log_nuit WHERE proc = 'GENERER';"""
results = request.dbsession.execute(query, )
return results.fetchall()
def get_status_by_id(request, code):
if code == '':
query = """SELECT * FROM p_statuts;"""
results = request.dbsession.execute(query,).fetchall()
elif code == 'DE':
query = """SELECT * FROM p_statuts WHERE code >= 3;"""
results = request.dbsession.execute(query,).fetchall()
else:
query = """SELECT * FROM p_statuts WHERE code = :code;"""
results = request.dbsession.execute(query, {'code': code}).first()
return results
def get_motifs(request):
query = """SELECT * FROM p_motifs;"""
results = request.dbsession.execute(query,).fetchall()
return results
def get_factures_en_att(request, societe):
query = """SELECT f.date, LPAD(f.no_id,6,'0') AS numero, f.nomcli, CONCAT(f.c_nom,'; ',f.c_adr,'; ',f.c_ville) AS chantier, f.totalht AS montant, f.status, s.libelle, f.nosin, f.nopol, f.usermaj
FROM facture f JOIN p_statuts s ON f.STATUS = s.CODE WHERE f.societe=:societe AND f.STATUS < 8 ORDER BY f.societe, f.STATUS, f.nomcli;"""
results = request.dbsession.execute(query, {'societe': societe}).fetchall()
return results
def get_dem_notes(request, nodossier, noligne):
societe = nodossier[0:2]
nochantier = int(nodossier[3:])
if noligne == '0':
query = "SELECT societe, nochantier, noligne, libelle FROM dem_notes WHERE societe = :societe AND nochantier = :nochantier ORDER BY libelle;"
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier, 'noligne': noligne}).fetchall()
else:
query = "SELECT * FROM dem_notes WHERE societe = :societe AND nochantier = :nochantier AND noligne = :noligne;"
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier, 'noligne': noligne}).first()
return results
def delete_dem_note(request, nodossier, noligne):
societe = nodossier[0:2]
nochantier = int(nodossier[3:])
# une note ou dessin
query = "DELETE FROM dem_notes WHERE societe=:societe AND nochantier=:nochantier AND noligne=:noligne;"
execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'noligne': noligne})
def update_dem_note(request, nodossier, noligne, notes, logged_in):
societe = nodossier[0:2]
nochantier = int(nodossier[3:])
# création ou modif ?
if noligne == '0':
query = "INSERT INTO dem_notes (societe, nochantier, notes, usermaj) VALUES (:societe, :nochantier, :notes, :logged_in);"
execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'notes': notes, 'logged_in': logged_in})
else:
query = "UPDATE dem_notes SET notes=:notes, logged_in=:logged_in WHERE societe=:societe AND nochantier=:nochantier AND noligne=:noligne;"
execute_query(request, query, {'societe': societe, 'nochantier': nochantier, 'noligne': noligne, 'notes': notes, 'logged_in': logged_in})
def get_nb_dessins(request, nodossier):
societe = nodossier[0:2]
nochantier = nodossier[3:]
query = "SELECT count(*) AS nb FROM dossier_attaches WHERE societe=:societe AND nochantier=:nochantier AND origine='FRN' AND nomfichier LIKE '%DESSIN No %';"
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).first()
return results.nb

View File

@@ -1,111 +1,248 @@
# -*- coding: utf8 -*- # -*- coding: utf8 -*-
from sqlalchemy import text from zope.sqlalchemy import (
from sqlalchemy.ext.declarative import declarative_base mark_changed
from sqlalchemy.orm import ( )
scoped_session,
sessionmaker, import transaction
)
from zope.sqlalchemy import ( def execute_query(request, query, params):
ZopeTransactionExtension, """Execute query and mark session as changed"""
mark_changed request.dbsession.execute(query, params)
) mark_changed(request.dbsession)
transaction.commit()
from datetime import *
import dateutil.relativedelta def get_log_nuit(request, ):
import transaction # lire le log de nuit
query = """SELECT * FROM t_log_nuit;"""
def execute_query(request, query, params): results = request.dbsession.execute(query, )
"""Execute query and mark session as changed""" return results.fetchall()
request.dbsession.execute(query, params)
mark_changed(request.dbsession) def get_last_modified(request,):
transaction.commit() query = """
SELECT 'DEMANDES' as nomtable, societe, no_id, datemaj, usermaj FROM bddevfac.dem_devis where date(datemaj)=CURDATE()
def get_log_nuit(request, ): UNION
# lire le log de nuit SELECT 'DEM_LIGNE' as nomtable, societe, no_id, datemaj, usermaj FROM bddevfac.dem_lig where date(datemaj)=CURDATE()
query = """SELECT * FROM t_log_nuit;""" UNION
results = request.dbsession.execute(query, ) SELECT 'DEVIS' as nomtable, societe, no_id, datemaj, usermaj FROM bddevfac.devis where date(datemaj)=CURDATE()
return results.fetchall() UNION
SELECT 'DEVIS_LIG' as nomtable, societe, no_id, datemaj, usermaj FROM bddevfac.devis_lig where date(datemaj)=CURDATE()
def get_last_emailing(request): UNION
"""Lire les 200 derniers envois d'emails""" SELECT 'FACTURES' as nomtable, societe, no_id, datemaj, usermaj FROM bddevfac.facture where date(datemaj)=CURDATE()
query = "SELECT * FROM email_rappels ORDER BY no_id DESC LIMIT 400;" UNION
results = request.dbsession.execute(query, {}) SELECT 'FACT_LIG' as nomtable, societe, no_id, datemaj, usermaj FROM bddevfac.facture_lig where date(datemaj)=CURDATE()
return results.fetchall() UNION
SELECT 'FAC_REGL' as nomtable, societe, cod_bnq, date as datemaj, JST FROM bddevfac.facture_reg where date(date)=CURDATE()
def get_orphans_DE(request, societe): order by datemaj desc limit 10; """
results = request.dbsession.execute(query, )
query = "SELECT * FROM devis WHERE societe = '%s' AND nochantier = 0 ORDER BY date desc LIMIT 50 ;" % (societe) return results.fetchall()
results = request.dbsession.execute(query).first()
return results def get_rappels_rdv(request):
"""Lire les 200 derniers envois d'emails"""
def get_dossiers_byChantier(request, societe, name): query = "SELECT * FROM email_rappels ORDER BY no_id DESC LIMIT 400;"
results = request.dbsession.execute(query, {})
query = "CALL spGET_DOSSIERS_byChantier('%s','%s','%s');" % (societe, 'DE', name.replace("'","''")) return results.fetchall()
results = request.dbsession.execute(query).fetchall()
return results def get_dossiers_byChantier(request, societe, name):
query = "CALL spGET_DOSSIERS_byChantier('%s','%s','%s');" % (societe, 'DE', name.replace("'","''"))
def get_rdf_causes_by_id(request, code): results = request.dbsession.execute(query).fetchall()
# lire les rdf_causes return results
if code == '0':
query = """SELECT * FROM rdf_causes;""" def get_cabinets_by_id(request, code):
results = request.dbsession.execute(query).fetchall() # lire les cabinets
else: if code == '0':
query = """SELECT * FROM rdf_causes WHERE code=:code;""" query = """SELECT * FROM P_CABINET ORDER BY nom;"""
results = request.dbsession.execute(query, {'code': code}).first() results = request.dbsession.execute(query).fetchall()
return results else:
query = """SELECT * FROM P_CABINET WHERE code=:code;"""
def get_emails_sent(request, societe, nolig): results = request.dbsession.execute(query, {'code': code}).first()
d = datetime.now() return results
d = d - dateutil.relativedelta.relativedelta(months=1)
# début du mois M-3 def get_experts_by_id(request, code_cab, code_exp):
datedeb = d.strftime('%Y-%m-%d') # lire les experts du cabinet
if code_exp == '0':
if nolig == 0: query = """SELECT * FROM P_EXPERTS WHERE code_cab=:code_cab ORDER BY nom;"""
query = """SELECT CONCAT(l.societe,"-",l.no_id) as nodossier, l.datemaj, l.comment, l.nolig, l.usermaj, e.nomcli FROM dem_lig l results = request.dbsession.execute(query, {'code_cab': code_cab}).fetchall()
INNER JOIN dem_devis e ON l.societe=e.societe AND l.no_id=e.no_id else:
WHERE l.societe = :societe AND l.date >= :datedeb AND l.comment LIKE 'Envoi email -> %' ORDER BY l.datemaj LIMIT 250;""" query = """SELECT * FROM P_EXPERTS WHERE code_cab=:code_cab AND code_exp=:code_exp;"""
results = request.dbsession.execute(query, {'societe': societe, 'datedeb': datedeb}).fetchall() results = request.dbsession.execute(query, {'code_cab': code_cab, 'code_exp': code_exp}).first()
else: return results
query = """SELECT * FROM dem_lig WHERE nolig=:nolig;"""
results = request.dbsession.execute(query, {'nolig': nolig}).first() def get_rdf_causes_by_id(request, code):
# lire les rdf_causes
return results if code == '0':
query = """SELECT * FROM rdf_causes;"""
results = request.dbsession.execute(query).fetchall()
def delete_rdf_cause(request, old_code): else:
query = "DELETE FROM rdf_causes WHERE code = :old_code;" query = """SELECT * FROM rdf_causes WHERE code=:code;"""
execute_query(request, query, {'old_code': old_code}) results = request.dbsession.execute(query, {'code': code}).first()
return results
def update_rdf_cause(request, old_code, code, libelle):
if old_code == '0': def delete_rdf_cause(request, old_code):
query = "INSERT rdf_causes (code, libelle) values (:code, :libelle);" query = "DELETE FROM rdf_causes WHERE code = :old_code;"
else: execute_query(request, query, {'old_code': old_code})
query = "UPDATE rdf_causes SET code = :code, libelle = :libelle WHERE code = :old_code;"
execute_query(request, query, {'old_code': old_code, 'code': code, 'libelle': libelle}) def update_rdf_cause(request, old_code, code, libelle):
if old_code == '0':
def get_texts(request, text_id): query = "INSERT rdf_causes (code, libelle) values (:code, :libelle);"
"""Lire les textes""" else:
if text_id == 0: query = "UPDATE rdf_causes SET code = :code, libelle = :libelle WHERE code = :old_code;"
query = "SELECT * FROM p_texts ORDER BY theme, intitule;" execute_query(request, query, {'old_code': old_code, 'code': code, 'libelle': libelle})
results = request.dbsession.execute(query).fetchall()
elif text_id == -1: def get_texts(request, text_id):
query = "SELECT * FROM p_texts where theme != 'INTERNE' ORDER BY theme, intitule;" """Lire les textes"""
results = request.dbsession.execute(query).fetchall() if text_id == 0:
else: query = "SELECT * FROM p_texts ORDER BY theme, intitule;"
query = "SELECT * FROM p_texts where text_id = :text_id;" results = request.dbsession.execute(query).fetchall()
results = request.dbsession.execute(query, {'text_id': text_id}).first() elif text_id == -1:
return results query = "SELECT * FROM p_texts where theme != 'INTERNE' ORDER BY theme, intitule;"
results = request.dbsession.execute(query).fetchall()
def update_text(request, text_id, intitule, texte, theme): else:
"""créér ou modifier la text""" query = "SELECT * FROM p_texts where text_id = :text_id;"
if text_id == '0': results = request.dbsession.execute(query, {'text_id': text_id}).first()
query = "INSERT INTO p_texts (intitule, texte, theme) VALUES(:intitule, :texte, :theme);" return results
execute_query(request, query, {'intitule': intitule, 'texte': texte, 'theme': theme})
else: def update_text(request, text_id, intitule, texte, theme):
query = "update p_texts set intitule=:intitule, texte=:texte, theme=:theme where text_id = :text_id;" """créér ou modifier la text"""
execute_query(request, query, {'text_id': text_id, 'intitule': intitule, 'texte': texte, 'theme': theme}) if text_id == '0':
query = "INSERT INTO p_texts (intitule, texte, theme) VALUES(:intitule, :texte, :theme);"
def delete_text(request, text_id): execute_query(request, query, {'intitule': intitule, 'texte': texte, 'theme': theme})
"""supprimer la text""" else:
query = "delete from p_texts where text_id = :text_id;" query = "update p_texts set intitule=:intitule, texte=:texte, theme=:theme where text_id = :text_id;"
execute_query(request, query, {'text_id': text_id}) execute_query(request, query, {'text_id': text_id, 'intitule': intitule, 'texte': texte, 'theme': theme})
def delete_text(request, text_id):
"""supprimer la text"""
query = "delete from p_texts where text_id = :text_id;"
execute_query(request, query, {'text_id': text_id})
def get_articles_byFam(request, fam):
if fam == 'T':
query = "SELECT * FROM articles WHERE FAM = 'T';"
else:
query = "SELECT * FROM articles WHERE FAM != 'T';"
results = request.dbsession.execute(query, ).fetchall()
return results
def get_article(request, ref):
query = "SELECT * FROM articles WHERE REF = ref;"
results = request.dbsession.execute(query, ).first()
return results
def update_article(request, ref, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if param == 'FAM':
' ne prend que 2 premiers caractères'
new_values['FAM'] = new_values['FAM'][0:2].upper()
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if ref == '0':
query = "INSERT INTO articles SET %s" % s
else:
new_values['ref'] = ref
query = "UPDATE articles SET %s WHERE ref = :ref;" % s
execute_query(request, query, new_values)
def delete_article(request, ref):
query = "DELETE FROM articles WHERE ref = :ref ;"
execute_query(request, query, {'ref': ref})
def update_cabinet(request, code, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if code == '0':
query = "CALL spINS_P_CABINET(:nom);"
results = request.dbsession.execute(query, {'nom': new_values['NOM']}).first()
# recupère lenouveau code créé
code = results.newligne
new_values['code'] = code
query = "UPDATE p_cabinet SET %s WHERE code = :code;" % s
execute_query(request, query, new_values)
def delete_cabinet(request, code):
query = "DELETE FROM p_cabinet WHERE code = :code ;"
execute_query(request, query, {'code': code})
def update_expert(request, code_cab, code_exp, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if code_exp == '0':
query = "CALL spINS_P_EXPERT(:code_cab, :nom);"
results = request.dbsession.execute(query, {'code_cab': code_cab, 'nom': new_values['NOM']}).first()
# recupère lenouveau code créé
code_exp = results.newligne
new_values['code_cab'] = code_cab
new_values['code_exp'] = code_exp
query = "UPDATE p_experts SET %s WHERE code_cab = :code_cab AND code_exp = :code_exp;" % s
execute_query(request, query, new_values)
def delete_expert(request, code_cab, code_exp):
query = "DELETE FROM p_experts WHERE code_cab = :code_cab AND code_exp = :code_exp;"
execute_query(request, query, {'code_cab': code_cab, 'code_exp': code_exp})
def update_societe(request, code, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
new_values['societe'] = code
query = "UPDATE p_societe SET %s WHERE societe = :societe;" % s
execute_query(request, query, new_values)
def update_tarif(request, ref, new_values):
# formater les champs
s = ''
for param in new_values.keys():
if s:
s += ",%s=:%s" % (param, param)
else:
s = "%s=:%s" % (param, param)
if ref == '0':
query = "INSERT INTO tarifs SET %s" % s
else:
new_values['ref'] = ref
query = "UPDATE tarifs SET %s WHERE ref = :ref;" % s
execute_query(request, query, new_values)
def delete_tarif(request, ref):
query = "DELETE FROM tarifs WHERE ref = :ref ;"
execute_query(request, query, {'ref': ref})
def get_tarifs_byGroupe(request, groupe):
query = "SELECT * FROM tarifs WHERE groupe = :groupe;"
results = request.dbsession.execute(query, {'groupe': groupe}).fetchall()
return results
def get_tarif(request, groupe, ref):
query = "SELECT * FROM tarifs WHERE groupe = :groupe and ref = :ref;"
results = request.dbsession.execute(query, {'groupe': groupe, 'ref': ref}).first()
return results
def get_p_acces(request):
query = """SELECT * FROM p_acces ORDER BY code;"""
results = request.dbsession.execute(query).fetchall()
return results

172
mondumas/models/stats.py Normal file
View File

@@ -0,0 +1,172 @@
# -*- coding: utf8 -*-
from sqlalchemy import text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import (
scoped_session,
sessionmaker,
)
from zope.sqlalchemy import (
ZopeTransactionExtension,
mark_changed
)
from datetime import *
from dateutil.relativedelta import *
import dateutil.relativedelta
import transaction
def execute_query(request, query, params):
"""Execute query and mark session as changed"""
request.dbsession.execute(query, params)
mark_changed(request.dbsession)
transaction.commit()
def get_stats_dd(request, societe):
query = """SELECT societe, year(date) as Annee, COUNT(*) as Total,
SUM(IF(status = '', 1, 0)) AS A_traiter,
SUM(IF(status = 'Devis', 1, 0)) AS Devis,
SUM(IF(status = 'Commandé', 1, 0)) AS Commande,
SUM(IF(status = 'Facturé', 1, 0)) AS Facture,
SUM(IF(status = 'Régl part.', 1, 0)) AS ReglePart,
SUM(IF(status = 'Réglée', 1, 0)) AS Regle
FROM dem_devis where societe=:societe group by societe, year(date) order by year(date) desc;"""
results = request.dbsession.execute(query, {'societe': societe}).fetchall()
return results
def get_stats_delais(request, societe, datedeb, datefin, groupe, id_chart):
# lire les examens sur 12 mois glissants par moniteur
query = """SELECT * FROM stats_delais
WHERE societe=:societe AND id=:id_chart AND group1 >= :datedeb AND group1 <= :datefin AND group2=:groupe order by group1;"""
results = request.dbsession.execute(query, {'societe': societe, 'id_chart': id_chart, 'datedeb': datedeb.strftime("%Y%m"),
'datefin': datefin.strftime("%Y%m"), 'groupe': groupe})
return results.fetchall()
def get_stats_delai_groupe(request, societe, datedeb, datefin):
query = """SELECT group2, group2_lib FROM stats_delais
WHERE societe=:societe AND group1 >= :datedeb AND group1 <= :datefin GROUP BY group2 ORDER BY group2_lib;"""
results = request.dbsession.execute(query, {'societe': societe, 'datedeb': datedeb.strftime("%Y%m"), 'datefin': datefin.strftime("%Y%m")})
return results.fetchall()
def get_ca_groupe_12m(request, societe, datedeb, datefin):
query = """SELECT DATE_FORMAT(date, "%Y%m") as yymm,
DATE_FORMAT(date, "%M") as mois,
DATE_FORMAT(date, "%M %Y") as date,
SUM(IF(groupe = 'AXA', totalht, 0)) AS AXA_ca,
SUM(IF(groupe = 'AXA', 1, 0)) AS AXA_nb,
SUM(IF(groupe = 'MAIF', totalht, 0)) AS MAIF_ca,
SUM(IF(groupe = 'MAIF', 1, 0)) AS MAIF_nb,
SUM(IF(groupe = 'DOMUS', totalht, 0)) AS DOMUS_ca,
SUM(IF(groupe = 'DOMUS', 1, 0)) AS DOMUS_nb,
SUM(IF(groupe = 'GMF', totalht, 0)) AS GMF_ca,
SUM(IF(groupe = 'GMF', 1, 0)) AS GMF_nb,
SUM(IF(groupe = 'MACIF', totalht, 0)) AS MACIF_ca,
SUM(IF(groupe = 'MACIF', 1, 0)) AS MACIF_nb
FROM bddevfac.facture
WHERE societe=:societe and date >= :datedeb and date <= :datefin GROUP BY yymm;"""
results = request.dbsession.execute(query, {'societe': societe, 'datedeb': datedeb.strftime("%Y-%m"), 'datefin': datefin.strftime("%Y-%m")})
return results.fetchall()
def get_ca_groupe_3y(request, societe, year):
query = """SELECT groupe,
SUM(IF (year(date) = :year - 2, TOTALHT, 0)) as Annee1,
SUM(IF (year(date) = :year - 2, 1, 0)) as Count1,
SUM(IF (year(date) = :year - 1, TOTALHT, 0)) as Annee2,
SUM(IF (year(date) = :year - 1, 1, 0)) as Count2,
SUM(IF (year(date) = :year, TOTALHT, 0)) as Annee3,
SUM(IF (year(date) = :year, 1, 0)) as Count3
FROM bddevfac.facture
WHERE societe=:societe AND groupe <> 'X' GROUP BY groupe;"""
results = request.dbsession.execute(query, {'societe': societe, 'year': year})
return results.fetchall()
def get_ca_groupe_3y_with_others(request, societe, year):
query = """SELECT groupe,
SUM(IF (year(date) = :year - 2, TOTALHT, 0)) as Annee1,
SUM(IF (year(date) = :year - 2, 1, 0)) as Count1,
SUM(IF (year(date) = :year - 1, TOTALHT, 0)) as Annee2,
SUM(IF (year(date) = :year - 1, 1, 0)) as Count2,
SUM(IF (year(date) = :year, TOTALHT, 0)) as Annee3,
SUM(IF (year(date) = :year, 1, 0)) as Count3
FROM bddevfac.facture
WHERE societe=:societe AND year(date) >= :year - 2 AND typecli <> 'I' GROUP BY groupe;"""
results = request.dbsession.execute(query, {'societe': societe, 'year': year})
return results.fetchall()
def get_ca_clients_12m(request, societe, datedeb, datefin):
query = """SELECT DATE_FORMAT(date, "%Y%m") as yymm,
DATE_FORMAT(date, "%M") as mois,
DATE_FORMAT(date, "%M %Y") as date,
SUM(IF(typecli = 'A', totalht, 0)) AS A_ca,
SUM(IF(typecli = 'A', 1, 0)) AS A_nb,
SUM(IF(typecli = 'E', totalht, 0)) AS E_ca,
SUM(IF(typecli = 'E', 1, 0)) AS E_nb,
SUM(IF(typecli = 'G', totalht, 0)) AS G_ca,
SUM(IF(typecli = 'G', 1, 0)) AS G_nb,
SUM(IF(typecli = 'P', totalht, 0)) AS P_ca,
SUM(IF(typecli = 'P', 1, 0)) AS P_nb,
SUM(IF(typecli = 'R', totalht, 0)) AS R_ca,
SUM(IF(typecli = 'R', 1, 0)) AS R_nb,
SUM(IF(typecli = 'S', totalht, 0)) AS S_ca,
SUM(IF(typecli = 'S', 1, 0)) AS S_nb
FROM bddevfac.facture
WHERE societe=:societe and date >= :datedeb and date <= :datefin GROUP BY yymm;"""
results = request.dbsession.execute(query, {'societe': societe, 'datedeb': datedeb.strftime("%Y-%m"), 'datefin': datefin.strftime("%Y-%m")})
return results.fetchall()
def get_ca_clients_3y(request, societe, year):
query = """SELECT LIB,
SUM(IF (year(date) = :year - 2, TOTALHT, 0)) as Annee1,
SUM(IF (year(date) = :year - 2, 1, 0)) as Count1,
SUM(IF (year(date) = :year - 1, TOTALHT, 0)) as Annee2,
SUM(IF (year(date) = :year - 1, 1, 0)) as Count2,
SUM(IF (year(date) = :year, TOTALHT, 0)) as Annee3,
SUM(IF (year(date) = :year, 1, 0)) as Count3
FROM bddevfac.facture JOIN bddevfac.p_type ON bddevfac.facture.typecli = bddevfac.p_type.CODE
WHERE societe=:societe AND year(date) >= :year - 2 AND typecli <> 'I' GROUP BY typecli;"""
results = request.dbsession.execute(query, {'societe': societe, 'year': year})
return results.fetchall()
def get_delais_pourcent(request, societe, groupe, datedeb):
query = """SELECT
SUM(IF (delai_contact <= 2, 1, 0)) AS delais_inf,
SUM(IF (delai_contact > 2, 1, 0)) AS delais_sup
FROM bddevfac.dem_devis
WHERE societe = :societe AND GROUPE = :groupe AND date >= :datedeb;"""
results = request.dbsession.execute(query, {'societe': societe, 'groupe': groupe, 'datedeb': datedeb.strftime("%Y-%m")})
return results.fetchall()
def get_nb_devis_fact(request, societe, year):
query = """SELECT
SUM(IF (NOFACT > 0 AND year(date) = :year - 2, 1, 0)) AS devis_fact_y1,
SUM(IF (NOFACT <= 0 AND year(date) = :year - 2, 1, 0)) AS devis_non_fact_y1,
SUM(IF (NOFACT > 0 AND year(date) = :year - 1, 1, 0)) AS devis_fact_y2,
SUM(IF (NOFACT <= 0 AND year(date) = :year - 1, 1, 0)) AS devis_non_fact_y2,
SUM(IF (NOFACT > 0 AND year(date) = :year, 1, 0)) AS devis_fact_y3,
SUM(IF (NOFACT <= 0 AND year(date) = :year, 1, 0)) AS devis_non_fact_y3
FROM bddevfac.devis
WHERE societe = :societe;"""
results = request.dbsession.execute(query, {'societe': societe, 'year': year})
return results.fetchall()
def get_nb_fact_with_devis(request, societe, year):
query = """SELECT
SUM(IF (NODEVIS > 0 AND year(date) = :year - 2, 1, 0)) AS fact_w_devis_y1,
SUM(IF (NODEVIS <= 0 AND year(date) = :year - 2, 1, 0)) AS fact_wo_devis_y1,
SUM(IF (NODEVIS > 0 AND year(date) = :year - 1, 1, 0)) AS fact_w_devis_y2,
SUM(IF (NODEVIS <= 0 AND year(date) = :year - 1, 1, 0)) AS fact_wo_devis_y2,
SUM(IF (NODEVIS > 0 AND year(date) = :year, 1, 0)) AS fact_w_devis_y3,
SUM(IF (NODEVIS <= 0 AND year(date) = :year, 1, 0)) AS fact_wo_devis_y3
FROM bddevfac.facture
WHERE societe = :societe;"""
results = request.dbsession.execute(query, {'societe': societe, 'year': year})
return results.fetchall()

232
mondumas/models/utils.py Normal file
View File

@@ -0,0 +1,232 @@
# -*- coding: utf8 -*-
from sqlalchemy import text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import (
scoped_session,
sessionmaker,
)
from zope.sqlalchemy import (
ZopeTransactionExtension,
mark_changed
)
from datetime import *
import dateutil.relativedelta
import transaction
def execute_query(request, query, params):
"""Execute query and mark session as changed"""
request.dbsession.execute(query, params)
mark_changed(request.dbsession)
transaction.commit()
def insert_log(request, proc, msg):
query = "INSERT t_log_nuit (proc,msg) VALUES (:proc,:msg);"
execute_query(request, query, {'proc': proc, 'msg' :msg})
def truncate_log(request):
query = "TRUNCATE t_log_nuit;"
execute_query(request, query, {})
def get_log(request):
# lire les rappels non envoyés
query = "SELECT * FROM t_log_nuit;"
results = request.dbsession.execute(query, {}).fetchall()
return results
def get_email_rappels(request):
# lire les rappels non envoyés
query = """ SELECT r.*, e.c_qualite, e.c_nom, e.c_adr, e.c_adr2, e.c_ville, e.c_email, s.tel, s.nom as nom_societe
FROM email_rappels r
INNER JOIN dem_devis e ON r.societe = e.societe AND r.nochantier = e.no_id
INNER JOIN p_societe s ON r.societe = s.societe
WHERE ISNULL(envoye_le) ORDER BY no_id;"""
results = request.dbsession.execute(query, {}).fetchall()
return results
def update_rappels(request):
query = "CALL spUPD_RAPPELS();"
execute_query(request, query, {})
def update_email_rappels(request, no_id):
query = "UPDATE email_rappels SET envoye_le = NOW() WHERE no_id = :no_id;"
execute_query(request, query, {'no_id': no_id})
def get_societes(request, societe):
if societe == '0':
query = "SELECT * FROM p_societe;"
results = request.dbsession.execute(query,).fetchall()
else:
query = "SELECT * FROM p_societe WHERE societe = :societe;"
results = request.dbsession.execute(query, {'societe': societe}).first()
return results
def chantierExiste(request,societe, no_id):
query = "SELECT no_id FROM dem_devis WHERE societe = :societe and no_id = :no_id;"
results = request.dbsession.execute(query, {'societe': societe, 'no_id': no_id}).first()
if results:
return len(results) > 0
else:
return False
def get_all_chantiers(request,societe):
query = "SELECT * FROM dem_devis WHERE societe = :societe;"
results = request.dbsession.execute(query, {'societe': societe}).fetchall()
return results
def get_chantiers_month(request, societe, date_sel):
# lire les chantiers du mois
query = """SELECT * FROM dem_devis WHERE societe = :societe AND YEAR(date)=YEAR(:date_sel) AND MONTH(date)=MONTH(:date_sel)
AND delai_facture = 0 AND nomcli NOT IN ('DUMAS JEAN MICHEL','DUMAS MENUISERIE','DUMAS PEINTURE');
"""
results = request.dbsession.execute(query, {'societe': societe, 'date_sel': date_sel}).fetchall()
return results
def get_last_facture(request, societe, nochantier):
query = "SELECT * FROM facture WHERE societe = :societe AND nochantier = :nochantier order by date DESC LIMIT 1;"
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).first()
return results
def get_last_devis(request, societe, nochantier):
query = "SELECT * FROM devis WHERE societe = :societe AND nochantier = :nochantier order by date DESC LIMIT 1;"
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).first()
return results
def update_chantier_status(request, societe, no_id, status):
query = "UPDATE dem_devis SET status = :status, DATEMAJ = DATEMAJ WHERE societe = :societe AND no_id = :no_id AND status <> :status;"
execute_query(request, query, {'societe': societe, 'no_id': no_id, 'status': status})
def update_chantier_delais(request, societe, no_id, delai_contact, delai_rdv, delai_devis, delai_facture):
query = """UPDATE dem_devis SET delai_contact = :delai_contact, delai_rdv = :delai_rdv, delai_devis = :delai_devis,
delai_facture = :delai_facture, DATEMAJ = DATEMAJ
WHERE societe = :societe AND no_id = :no_id;"""
execute_query(request, query, {'societe': societe, 'no_id': no_id, 'delai_contact': delai_contact, 'delai_rdv': delai_rdv,
'delai_devis': delai_devis, 'delai_facture': delai_facture})
def get_chantiers_dates(request, societe, nochantier):
# lire 1er contact du chantier
query = "SELECT date, datevi FROM dem_lig WHERE societe = :societe AND no_id = :nochantier AND datevi IS NOT NULL;"
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).first()
if results:
date_contact = results.date
date_rdv = results.datevi
else:
date_contact = None
date_rdv = None
# lire 1er devis du chantier
query = "SELECT date FROM devis WHERE societe = :societe AND nochantier = :nochantier order by date LIMIT 1;"
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).first()
if results:
date_devis = results.date
else:
date_devis = None
# lire 1ere facture du chantier
query = "SELECT date FROM facture WHERE societe = :societe AND nochantier = :nochantier order by date LIMIT 1;"
results = request.dbsession.execute(query, {'societe': societe, 'nochantier': nochantier}).first()
if results:
date_facture = results.date
else:
date_facture = None
return date_contact, date_rdv, date_devis, date_facture
def purge_mensuelle(request, until_date):
# ----- Purger les DEVIS dont la facture est réglée antérieure à until_date
query = """DELETE devis.* FROM devis INNER JOIN facture ON devis.societe = facture.societe and devis.no_id = facture.nodevis
WHERE facture.date < :until_date AND ABS(facture.totalttc - facture.mtregl) < 1;"""
execute_query(request, query, {'until_date': until_date})
# ----- Purger les FACTURES réglées antérieures à until_date
query = """DELETE FROM facture WHERE facture.date < :until_date AND ABS(facture.totalttc - facture.mtregl) < 1;"""
execute_query(request, query, {'until_date': until_date})
# ---- Purger les VERSEMENTS inutilisés et antérieurs à until_date
query = "DELETE FROM liv_bnq WHERE date < :until_date AND ABS(MontantRegl - MontantDebit) < 1;"
execute_query(request, query, {'until_date': until_date})
# ----- Purger les DEVIS n'ayant pas de facture antérieure à until_date
query = """DELETE FROM devis WHERE devis.date < :until_date AND nofact=0;"""
execute_query(request, query, {'until_date': until_date})
# -- RAZ les liens FACTURE et DEVIS
query = "UPDATE dem_devis SET nodevis = 0, nofact = 0, datemaj=datemaj WHERE dem_devis.date < :until_date;"
execute_query(request, query, {'until_date': until_date})
# -- recreer les lien factures
query = """UPDATE dem_devis INNER JOIN facture ON dem_devis.societe = facture.societe and dem_devis.no_id = facture.nochantier
SET dem_devis.nofact = facture.no_id, dem_devis.datemaj=dem_devis.datemaj WHERE dem_devis.date < :until_date;"""
execute_query(request, query, {'until_date': until_date})
# -- recreer les lien DEVIS
query = """UPDATE dem_devis INNER JOIN devis ON dem_devis.societe = devis.societe and dem_devis.no_id = devis.nochantier
SET dem_devis.nodevis = devis.no_id, dem_devis.datemaj=dem_devis.datemaj WHERE dem_devis.date < :until_date"""
execute_query(request, query, {'until_date': until_date})
# ---- Purger les DEM_DEVIS n'ayant aucun DEVIS ni FACTURE
query = "DELETE FROM dem_devis WHERE date < :until_date AND nodevis = 0 AND nofact = 0;"
execute_query(request, query, {'until_date': until_date})
def get_all_clients(request):
query = "SELECT * FROM clients;"
results = request.dbsession.execute(query, {}).fetchall()
return results
def get_last_facture_client(request, societe, cd_cli):
query = "SELECT * FROM facture WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;"
results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first()
return results
def get_last_payment_client(request, societe, cd_cli):
query = "SELECT * FROM liv_bnq WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;"
results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first()
return results
def get_last_devis_client(request, societe, cd_cli):
query = "SELECT * FROM devis WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;"
results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first()
return results
def get_last_proforma_client(request, societe, cd_cli):
query = "SELECT * FROM proforma WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;"
results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first()
return results
def get_last_chantier_client(request, societe, cd_cli):
query = "SELECT * FROM dem_devis WHERE societe = :societe AND cd_cli = :cd_cli order by date DESC LIMIT 1;"
results = request.dbsession.execute(query, {'societe': societe, 'cd_cli': cd_cli}).first()
return results
def update_client_dern_operation(request, societe, cd_cli, dern_operation):
if dern_operation != None:
d_operation = dern_operation.strftime('%Y/%m/%d')
query = "UPDATE clients SET dern_operation = :dern_operation, modif_le = modif_le WHERE societe=:societe AND cd_cli=:cd_cli;"
execute_query(request, query, {'societe': societe, 'cd_cli': cd_cli, 'dern_operation': d_operation})
else:
query = "UPDATE clients SET dern_operation = NULL, modif_le = modif_le WHERE societe=:societe AND cd_cli=:cd_cli;"
execute_query(request, query, {'societe': societe, 'cd_cli': cd_cli})
def delete_client_unused(request):
query = "DELETE FROM clients WHERE cd_cli <> 1 AND dern_operation IS NULL AND YEAR(cree_le) < YEAR(CURRENT_DATE()) - 5;"
execute_query(request, query, {})
def update_stats_delais(request, societe, date, groupe):
query = "CALL spUPD_STATS_DELAIS(:societe, :date, :groupe);"
execute_query(request, query, {'societe': societe, 'date': date, 'groupe': groupe})
def update_devis_statut_4(request):
# lire tutes les lignes de dem_devis mentionnant la commande
query = "SELECT * FROM dem_lig where comment like '% est COMMANDE %';"
devis_cdes = request.dbsession.execute(query, {}).fetchall()
for item in devis_cdes:
if item.COMMENT.find('!! DE') == 0:
# recupère le no de devis commandé
nodevis = item.COMMENT[5:11]
# maj status de dem_devis concernée
query = "UPDATE dem_devis SET status = 4, DATEMAJ = DATEMAJ WHERE societe = :societe AND no_id = :no_id AND status < 4;"
execute_query(request, query, {'societe': item.societe, 'no_id': item.NO_ID})
# maj status de devis concerné
query = "UPDATE devis SET status = 4, DATEMAJ = DATEMAJ WHERE societe = :societe AND no_id = :no_id AND status < 4;"
execute_query(request, query, {'societe': item.societe, 'no_id': nodevis})

View File

@@ -1,52 +1,97 @@
def includeme(config): def includeme(config):
config.add_static_view('static', 'static', cache_max_age=3600) config.add_static_view('static', 'static', cache_max_age=3600)
# agenda # agenda
config.add_route('agenda', '/agenda/{date}') config.add_route('agenda', '/agenda/{date}')
config.add_route('planning', '/planning/{date}') config.add_route('planning', '/planning/{date}')
config.add_route('rdv_edit','/rdv_edit/{nodossier}/{nolig}') config.add_route('rdv_edit','/rdv_edit/{nodossier}/{nolig}')
# default # default
config.add_route('home', '/') config.add_route('home', '/')
config.add_route('affiche_message','/affiche_message/{login}') config.add_route('affiche_message','/affiche_message/{login}')
config.add_route('ajax_codepostal', '/ajax_codepostal') config.add_route('ajax_article', '/ajax_article')
config.add_route('ajax_lookup', '/ajax_lookup') config.add_route('ajax_client', '/ajax_client')
config.add_route('changer_mdp', '/changer_mdp') config.add_route('ajax_codepostal', '/ajax_codepostal')
config.add_route('envoyer_mdp', '/envoyer_mdp') config.add_route('ajax_lookup', '/ajax_lookup')
config.add_route('login', '/login') config.add_route('ajax_texte', '/ajax_texte')
config.add_route('login_as', '/login_as/{login}') config.add_route('changer_mdp', '/changer_mdp')
config.add_route('logout', '/logout') config.add_route('envoyer_mdp', '/envoyer_mdp')
config.add_route('redefinir_mdp', '/redefinir_mdp/{lien}') config.add_route('login', '/login')
config.add_route('init_mdp', '/init_mdp/{user}/{lien}') config.add_route('login_as', '/login_as/{login}')
# dossier config.add_route('logout', '/logout')
config.add_route('demandes','/demandes') config.add_route('redefinir_mdp', '/redefinir_mdp/{lien}')
config.add_route('delete_img','/delete_img/{nodossier}/{norapport}/{nosection}/{nomfic}') config.add_route('init_mdp', '/init_mdp/{user}/{lien}')
config.add_route('devis_view', '/devis_view/{nodossier}') # devis
config.add_route('dossier_edit', '/dossier_edit/{nodossier}') config.add_route('devis_ligne', '/devis_ligne/{type_ligne}/{nodevis}/{nolig}')
config.add_route('dossier_lookup', '/dossier_lookup') config.add_route('devis_lig_mv', '/devis_lig_mv/{move}/{nodevis}/{nolig}')
config.add_route('dossier_select', '/dossier_select/{date}') config.add_route('devis_list', '/devis_list/{societe}/{nodevis}')
config.add_route('dossier_selected', '/dossier_selected/{goto}/{date}/{nodossier}') config.add_route('devis_create', '/devis_create/{nodossier}')
config.add_route('dossier_view', '/dossier_view/{nodossier}') config.add_route('devis_nochantier', '/devis_nochantier/{societe}/{nodevis}/{nochantier}')
config.add_route('rdf_bill','/rdf_bill/{no_id}') config.add_route('devis_web', '/devis_web/{nodevis}')
config.add_route('rdf_edit','/rdf_edit/{nodossier}/{date_inter}') config.add_route('devis_view', '/devis_view/{nodevis}')
config.add_route('rdf_list','/rdf_list') config.add_route('devis_preview', '/devis_preview/{nodevis}')
config.add_route('rdf_rapport','/rdf_rapport/{no_id}') config.add_route('devis_select', '/devis_select/{date}')
config.add_route('rdf_view','/rdf_view/{no_id}') config.add_route('devis_selected', '/devis_selected/{goto}/{date}/{nodevis}')
config.add_route('suivi_edit','/suivi_edit/{nodossier}/{nolig}') config.add_route('factures_en_att','/factures_en_att')
config.add_route('upload_doc', '/upload_doc/{nodossier}') config.add_route('facture_select', '/facture_select/{date}')
config.add_route('upload_img', '/upload_img/{norapport}/{nosection}') config.add_route('facture_selected', '/facture_selected/{goto}/{date}/{nofacture}')
# parametres # dossier
config.add_route('parametres', '/parametres') config.add_route('demandes','/demandes')
config.add_route('connecter_a', '/connecter_a/{login}') config.add_route('demandes_dl','/demandes_dl/{societe}/{email_from}/{email_uid}')
config.add_route('dashboard', '/dashboard') config.add_route('dem_devis','/dem_devis')
config.add_route('emails_msg', '/emails_msg/{nolig}') config.add_route('delete_img','/delete_img/{nodossier}/{norapport}/{origine}/{nomfic}')
config.add_route('emails_sent', '/emails_sent') config.add_route('dern_suivis','/dern_suivis')
config.add_route('infrastructure', '/infrastructure') config.add_route('dessin_edit','/dessin_edit/{nodossier}/{noligne}')
config.add_route('last_emailing', '/last_emailing') config.add_route('dossier_edit', '/dossier_edit/{nodossier}')
config.add_route('orphans_de', '/orphans_de/{societe}') config.add_route('dossier_lookup', '/dossier_lookup')
config.add_route('rdf_cause_edit', '/rdf_cause_edit/{code}') config.add_route('dossier_select', '/dossier_select/{date}')
config.add_route('rdf_causes_list', '/rdf_causes_list') config.add_route('dossier_selected', '/dossier_selected/{goto}/{date}/{nodossier}')
config.add_route('text_edit', '/text_edit/{text_id}') config.add_route('dossier_view', '/dossier_view/{nodossier}')
config.add_route('text_list', '/text_list') config.add_route('note_edit','/note_edit/{nodossier}/{noligne}')
config.add_route('text_view', '/text_view/{text_id}') config.add_route('rdf_bill','/rdf_bill/{no_id}')
config.add_route('user_edit', '/user_edit/{cd_uti}') config.add_route('rdf_client','/rdf_client/{no_id}')
config.add_route('users_list', '/users_list') config.add_route('rdf_edit','/rdf_edit/{nodossier}/{date_inter}')
config.add_route('users_ua', '/users_ua') config.add_route('rdf_list','/rdf_list')
config.add_route('rdf_nochantier','/rdf_nodossier/{no_id}')
config.add_route('rdf_rapport','/rdf_rapport/{no_id}')
config.add_route('rdf_view','/rdf_view/{no_id}')
config.add_route('rotate_img','/rotate_img/{nodossier}/{norapport}/{origine}/{nomfic}/{angle}')
config.add_route('suivi_edit','/suivi_edit/{nodossier}/{nolig}')
config.add_route('upload_doc', '/upload_doc/{nodossier}/{origine}')
config.add_route('upload_img', '/upload_img/{norapport}/{origine}')
config.add_route('upload_om', '/upload_om')
# parametres
config.add_route('parametres', '/parametres')
config.add_route('article_edit', '/article_edit/{ref}')
config.add_route('articles', '/articles')
config.add_route('cabinet_edit', '/cabinet_edit/{code}')
config.add_route('cabinets', '/cabinets')
config.add_route('connecter_a', '/connecter_a/{login}')
config.add_route('dashboard', '/dashboard')
config.add_route('emails_msg', '/emails_msg/{nolig}')
config.add_route('expert_edit', '/expert_edit/{code_cab}/{code_exp}')
config.add_route('rappels_rdv', '/rappels_rdv')
config.add_route('rdf_cause_edit', '/rdf_cause_edit/{code}')
config.add_route('rdf_causes', '/rdf_causes')
config.add_route('societe_edit', '/societe_edit/{societe}')
config.add_route('societes', '/societes')
config.add_route('text_edit', '/text_edit/{text_id}')
config.add_route('text_list', '/text_list')
config.add_route('text_view', '/text_view/{text_id}')
config.add_route('tarif_edit', '/tarif_edit/{groupe}/{ref}')
config.add_route('tarifs', '/tarifs/{groupe}')
config.add_route('tarifs_import', '/tarifs_import')
config.add_route('user_edit', '/user_edit/{cd_uti}')
config.add_route('users', '/users')
config.add_route('users_ua', '/users_ua')
# stats
config.add_route('stats', '/stats')
config.add_route('stats_dossiers', '/stats_dossiers/{societe}')
config.add_route('stats_delais', '/stats_delais/{societe}')
config.add_route('ca_groupes', '/ca_groupes/{societe}')
config.add_route('ca_clients', '/ca_clients/{societe}')
config.add_route('delais_pourcentage', '/delais_pourcentage/{societe}')
config.add_route('pourcentage_devis', '/pourcentage_devis/{societe}')
# utils
config.add_route('batch_nuit', '/batch_nuit/{param}')
config.add_route('batch_test', '/batch_test/{param}')

View File

@@ -1,234 +1,317 @@
/* style.less */ /* style.less */
@error: #b94a48; @error: #b94a48;
/* ajout pour Nicola */ /* ajout pour Nicola */
@media (max-width: 992px) { @media (max-width: 992px) {
.navbar-header { .navbar-header {
float: none; float: none;
} }
.navbar-left,.navbar-right { .navbar-left,.navbar-right {
float: none !important; float: none !important;
} }
.navbar-toggle { .navbar-toggle {
display: block; display: block;
} }
.navbar-collapse { .navbar-collapse {
border-top: 1px solid transparent; border-top: 1px solid transparent;
box-shadow: inset 0 1px 0 rgba(255,255,255,0.1); box-shadow: inset 0 1px 0 rgba(255,255,255,0.1);
} }
.navbar-fixed-top { .navbar-fixed-top {
top: 0; top: 0;
border-width: 0 0 1px; border-width: 0 0 1px;
} }
.navbar-collapse.collapse { .navbar-collapse.collapse {
display: none!important; display: none!important;
} }
.navbar-nav { .navbar-nav {
float: none!important; float: none!important;
margin-top: 7.5px; margin-top: 7.5px;
} }
.navbar-nav>li { .navbar-nav>li {
float: none; float: none;
} }
.navbar-nav>li>a { .navbar-nav>li>a {
padding-top: 10px; padding-top: 10px;
padding-bottom: 10px; padding-bottom: 10px;
} }
.collapse.in{ .collapse.in{
display:block !important; display:block !important;
} }
} }
.navbar { .navbar {
margin-bottom: 0; margin-bottom: 0;
background-color: #fe9900; background-color: #fe9900;
color: #404040 !important; color: #404040 !important;
z-index: 9999; z-index: 9999;
border: 0; border: 0;
font-size: 20px !important; font-size: 20px !important;
line-height: 1.42857143 !important; line-height: 1.42857143 !important;
letter-spacing: 4px; letter-spacing: 4px;
border-radius: 0; border-radius: 0;
} }
.navbar li a, .navbar .navbar-brand { .navbar li a, .navbar .navbar-brand {
color: #404040 !important; color: #404040 !important;
font-size: 14px !important; font-size: 14px !important;
} }
.navbar-nav li a:hover, .navbar-nav li.active a { .navbar-nav li a:hover, .navbar-nav li.active a {
color: #f4511e !important; color: #f4511e !important;
font-size: 14px !important; font-size: 14px !important;
background-color: #fff !important; background-color: #fff !important;
} }
.navbar-default .navbar-toggle { .navbar-default .navbar-toggle {
border-color: transparent; border-color: transparent;
color: #fff !important; color: #fff !important;
} }
/* Dropdown */ /* Dropdown */
.open .dropdown-toggle { .open .dropdown-toggle {
color: #000000 ; color: #000000 ;
background-color: #555 !important; background-color: #555 !important;
} }
/* Dropdown links */ /* Dropdown links */
.dropdown-menu li a { .dropdown-menu li a {
color: #000000 !important; color: #000000 !important;
} }
/* On hover, the dropdown links will turn red */ /* On hover, the dropdown links will turn red */
.dropdown-menu li a:hover { .dropdown-menu li a:hover {
background-color: #f4511e !important; background-color: #f4511e !important;
color: #000000 !important; color: #000000 !important;
} }
/* push modal dialog down the viewport */ /* push modal dialog down the viewport */
.modal-dialog { .modal-dialog {
top:7%; top:7%;
} }
.type-ligne-panel {
.footer { padding-left: 25px;
background-color: #2f2f2f; margin-top: 5px;
color: #ffffff; margin-bottom: 20px;
padding-top: 2em; display: none;
padding-bottom: 1em; }
}
.footer {
.form-group { background-color: #2f2f2f;
label.error { color: #ffffff;
color: @error; padding-top: 2em;
} padding-bottom: 1em;
} }
.gly-spin { .form-group {
-webkit-animation: spin 2s infinite linear; label.error {
-moz-animation: spin 2s infinite linear; color: @error;
-o-animation: spin 2s infinite linear; }
animation: spin 2s infinite linear; }
}
.gly-spin {
#bg { -webkit-animation: spin 2s infinite linear;
position: fixed; -moz-animation: spin 2s infinite linear;
top: 0; -o-animation: spin 2s infinite linear;
left: 0; animation: spin 2s infinite linear;
}
/* Set up proportionate scaling */
width: 100%; #bg {
height: auto; position: fixed;
top: 0;
/* Set rules to fill background */ left: 0;
min-width: 100%;
min-height: 100%; /* Set up proportionate scaling */
} width: 100%;
height: auto;
.logo {
height: 60px; /* Set rules to fill background */
} min-width: 100%;
min-height: 100%;
.logo-primary { }
color: #337ab7;
font-size: 50px; .logo {
} height: 60px;
.logo-info { }
color: #5BC0DE;
font-size: 50px; .logo-primary {
} color: #337ab7;
.logo-success { font-size: 50px;
color: #5CB85C; }
font-size: 50px; .logo-info {
} color: #5BC0DE;
.logo-danger { font-size: 50px;
color: #D9534F; }
font-size: 50px; .logo-success {
} color: #5CB85C;
.logo-warning { font-size: 50px;
color: #F0AD4E; }
font-size: 50px; .logo-danger {
} color: #D9534F;
.logo-small { font-size: 50px;
font-size: 50px; }
} .logo-warning {
.bg-PE { color: #F0AD4E;
background-color: #ffffb3 !important; font-size: 50px;
color: black; }
} .logo-small {
.bg-ME { font-size: 50px;
background-color: #ffe44d !important; }
color: black; .bg-PE {
} background-color: #ffffb3 !important;
.bg-PL { color: black;
background-color: #b3ff66 !important; }
color: black; .bg-ME {
} background-color: #ffe44d !important;
.bg-PO { color: black;
background-color: #b1dae7 !important; }
color: black; .bg-PL {
} background-color: #b3ff66 !important;
.bg-CD { color: black;
background-color: #ffb3cc !important; }
color: black; .bg-PO {
} background-color: #b1dae7 !important;
color: black;
.new-page { }
page-break-before: always; .bg-CD {
} background-color: #ffb3cc !important;
color: black;
}
#signature_img { .bg-compta {
width: 350px; background-color: SlateBlue !important;
height: 150px; color: white;
padding: 20px; }
}
.bg-gest {
.gly-spin { background-color: Coral !important;
-webkit-animation: spin 2s infinite linear; color: white;
-moz-animation: spin 2s infinite linear; }
-o-animation: spin 2s infinite linear;
animation: spin 2s infinite linear; .bg-prod {
} background-color: SkyBlue !important;
color: white;
@-moz-keyframes spin { }
0% {
-moz-transform: rotate(0deg); .bg-0, .bg-1 {
} background-color: khaki !important;
100% { color: black;
-moz-transform: rotate(359deg); }
}
} .bg-2, .bg-3 {
@-webkit-keyframes spin { background-color: orange !important;
0% { color: black;
-webkit-transform: rotate(0deg); }
}
100% { .bg-4, .bg-5 {
-webkit-transform: rotate(359deg); background-color: lightcoral !important;
} color: black;
} }
@-o-keyframes spin {
0% { .bg-6, .bg-7 {
-o-transform: rotate(0deg); background-color: CornflowerBlue !important;
} color: black;
100% { }
-o-transform: rotate(359deg);
} .bg-8 {
} background-color: LawnGreen !important;
@keyframes spin { color: black;
0% { }
-webkit-transform: rotate(0deg);
transform: rotate(0deg); .bg-10, .bg-11, .bg-12 {
} background-color: gray !important;
100% { color: black;
-webkit-transform: rotate(359deg); }
transform: rotate(359deg);
} .new-page {
} page-break-before: always;
}
/* ne pas affichier l'url after the link */
@media print {
a[href]:after { #signature_img {
content: none !important; width: 350px;
} height: 150px;
} padding: 20px;
}
.gly-spin {
-webkit-animation: spin 2s infinite linear;
-moz-animation: spin 2s infinite linear;
-o-animation: spin 2s infinite linear;
animation: spin 2s infinite linear;
}
@-moz-keyframes spin {
0% {
-moz-transform: rotate(0deg);
}
100% {
-moz-transform: rotate(359deg);
}
}
@-webkit-keyframes spin {
0% {
-webkit-transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
}
}
@-o-keyframes spin {
0% {
-o-transform: rotate(0deg);
}
100% {
-o-transform: rotate(359deg);
}
}
@keyframes spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
#dessin {
width: 1140px;
height: 1140px;
}
/* ne pas affichier l'url after the link */
@media print {
a[href]:after {
content: none !important;
}
}
.info-box {
display: block;
min-height: 70px;
background: #fff;
width: 100%;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
border-radius: 2px;
margin-bottom: 15px;
}
.info-box-icon {
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
display: block;
float: left;
height: 70px;
width: 70px;
text-align: center;
font-size: 40px;
line-height: 70px;
background: rgba(0, 0, 0, 0.2);
}
.info-box-content {
padding: 5px 5px;
margin-left: 80px;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,93 @@
/*
* Plugin: Full Calendar
* ---------------------
*/
.fc-button {
background: #f4f4f4;
background-image: none;
color: #444;
border-color: #ddd;
border-bottom-color: #ddd;
}
.fc-button:hover,
.fc-button:active,
.fc-button.hover {
background-color: #e9e9e9;
}
.fc-header-title h2 {
font-size: 15px;
line-height: 1.6em;
color: #666;
margin-left: 10px;
}
.fc-header-right {
padding-right: 10px;
}
.fc-header-left {
padding-left: 10px;
}
.fc-widget-header {
background: #fafafa;
}
.fc-grid {
width: 100%;
border: 0;
}
.fc-widget-header:first-of-type,
.fc-widget-content:first-of-type {
border-left: 0;
border-right: 0;
}
.fc-widget-header:last-of-type,
.fc-widget-content:last-of-type {
border-right: 0;
}
.fc-toolbar {
padding: 10px;
margin: 0;
}
.fc-day-number {
font-size: 20px;
font-weight: 300;
padding-right: 10px;
}
.fc-color-picker {
list-style: none;
margin: 0;
padding: 0;
}
.fc-color-picker > li {
float: left;
font-size: 30px;
margin-right: 5px;
line-height: 30px;
}
.fc-color-picker > li .fa {
-webkit-transition: -webkit-transform linear 0.3s;
-moz-transition: -moz-transform linear 0.3s;
-o-transition: -o-transform linear 0.3s;
transition: transform linear 0.3s;
}
.fc-color-picker > li .fa:hover {
-webkit-transform: rotate(30deg);
-ms-transform: rotate(30deg);
-o-transform: rotate(30deg);
transform: rotate(30deg);
}
#add-new-event {
-webkit-transition: all linear 0.3s;
-o-transition: all linear 0.3s;
transition: all linear 0.3s;
}
.external-event {
padding: 5px 10px;
font-weight: bold;
margin-bottom: 4px;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
text-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
border-radius: 3px;
cursor: move;
}
.external-event:hover {
box-shadow: inset 0 0 90px rgba(0, 0, 0, 0.2);
}

View File

@@ -0,0 +1 @@
.fc-button{background:#f4f4f4;background-image:none;color:#444;border-color:#ddd;border-bottom-color:#ddd}.fc-button:hover,.fc-button:active,.fc-button.hover{background-color:#e9e9e9}.fc-header-title h2{font-size:15px;line-height:1.6em;color:#666;margin-left:10px}.fc-header-right{padding-right:10px}.fc-header-left{padding-left:10px}.fc-widget-header{background:#fafafa}.fc-grid{width:100%;border:0}.fc-widget-header:first-of-type,.fc-widget-content:first-of-type{border-left:0;border-right:0}.fc-widget-header:last-of-type,.fc-widget-content:last-of-type{border-right:0}.fc-toolbar{padding:10px;margin:0}.fc-day-number{font-size:20px;font-weight:300;padding-right:10px}.fc-color-picker{list-style:none;margin:0;padding:0}.fc-color-picker>li{float:left;font-size:30px;margin-right:5px;line-height:30px}.fc-color-picker>li .fa{-webkit-transition:-webkit-transform linear .3s;-moz-transition:-moz-transform linear .3s;-o-transition:-o-transform linear .3s;transition:transform linear .3s}.fc-color-picker>li .fa:hover{-webkit-transform:rotate(30deg);-ms-transform:rotate(30deg);-o-transform:rotate(30deg);transform:rotate(30deg)}#add-new-event{-webkit-transition:all linear .3s;-o-transition:all linear .3s;transition:all linear .3s}.external-event{padding:5px 10px;font-weight:bold;margin-bottom:4px;box-shadow:0 1px 1px rgba(0,0,0,0.1);text-shadow:0 1px 1px rgba(0,0,0,0.1);border-radius:3px;cursor:move}.external-event:hover{box-shadow:inset 0 0 90px rgba(0,0,0,0.2)}

View File

@@ -0,0 +1,100 @@
/*
* Plugin: Select2
* ---------------
*/
.select2-container--default.select2-container--focus,
.select2-selection.select2-container--focus,
.select2-container--default:focus,
.select2-selection:focus,
.select2-container--default:active,
.select2-selection:active {
outline: none;
}
.select2-container--default .select2-selection--single,
.select2-selection .select2-selection--single {
border: 1px solid #d2d6de;
border-radius: 0;
padding: 6px 12px;
height: 34px;
}
.select2-container--default.select2-container--open {
border-color: #3c8dbc;
}
.select2-dropdown {
border: 1px solid #d2d6de;
border-radius: 0;
}
.select2-container--default .select2-results__option--highlighted[aria-selected] {
background-color: #3c8dbc;
color: white;
}
.select2-results__option {
padding: 6px 12px;
user-select: none;
-webkit-user-select: none;
}
.select2-container .select2-selection--single .select2-selection__rendered {
padding-left: 0;
padding-right: 0;
height: auto;
margin-top: -4px;
}
.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
padding-right: 6px;
padding-left: 20px;
}
.select2-container--default .select2-selection--single .select2-selection__arrow {
height: 28px;
right: 3px;
}
.select2-container--default .select2-selection--single .select2-selection__arrow b {
margin-top: 0;
}
.select2-dropdown .select2-search__field,
.select2-search--inline .select2-search__field {
border: 1px solid #d2d6de;
}
.select2-dropdown .select2-search__field:focus,
.select2-search--inline .select2-search__field:focus {
outline: none;
}
.select2-container--default.select2-container--focus .select2-selection--multiple,
.select2-container--default .select2-search--dropdown .select2-search__field {
border-color: #3c8dbc !important;
}
.select2-container--default .select2-results__option[aria-disabled=true] {
color: #999;
}
.select2-container--default .select2-results__option[aria-selected=true] {
background-color: #ddd;
}
.select2-container--default .select2-results__option[aria-selected=true],
.select2-container--default .select2-results__option[aria-selected=true]:hover {
color: #444;
}
.select2-container--default .select2-selection--multiple {
border: 1px solid #d2d6de;
border-radius: 0;
}
.select2-container--default .select2-selection--multiple:focus {
border-color: #3c8dbc;
}
.select2-container--default.select2-container--focus .select2-selection--multiple {
border-color: #d2d6de;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice {
background-color: #3c8dbc;
border-color: #367fa9;
padding: 1px 10px;
color: #fff;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
margin-right: 5px;
color: rgba(255, 255, 255, 0.7);
}
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
color: #fff;
}
.select2-container .select2-selection--single .select2-selection__rendered {
padding-right: 10px;
}

View File

@@ -0,0 +1 @@
.select2-container--default.select2-container--focus,.select2-selection.select2-container--focus,.select2-container--default:focus,.select2-selection:focus,.select2-container--default:active,.select2-selection:active{outline:none}.select2-container--default .select2-selection--single,.select2-selection .select2-selection--single{border:1px solid #d2d6de;border-radius:0;padding:6px 12px;height:34px}.select2-container--default.select2-container--open{border-color:#3c8dbc}.select2-dropdown{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#3c8dbc;color:white}.select2-results__option{padding:6px 12px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{padding-left:0;padding-right:0;height:auto;margin-top:-4px}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:6px;padding-left:20px}.select2-container--default .select2-selection--single .select2-selection__arrow{height:28px;right:3px}.select2-container--default .select2-selection--single .select2-selection__arrow b{margin-top:0}.select2-dropdown .select2-search__field,.select2-search--inline .select2-search__field{border:1px solid #d2d6de}.select2-dropdown .select2-search__field:focus,.select2-search--inline .select2-search__field:focus{outline:none}.select2-container--default.select2-container--focus .select2-selection--multiple,.select2-container--default .select2-search--dropdown .select2-search__field{border-color:#3c8dbc !important}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[aria-selected=true]:hover{color:#444}.select2-container--default .select2-selection--multiple{border:1px solid #d2d6de;border-radius:0}.select2-container--default .select2-selection--multiple:focus{border-color:#3c8dbc}.select2-container--default.select2-container--focus .select2-selection--multiple{border-color:#d2d6de}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#3c8dbc;border-color:#367fa9;padding:1px 10px;color:#fff}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{margin-right:5px;color:rgba(255,255,255,0.7)}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#fff}.select2-container .select2-selection--single .select2-selection__rendered{padding-right:10px}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,172 @@
/*
* Skin: Black
* -----------
*/
/* skin-black navbar */
.skin-black-light .main-header {
-webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05);
box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05);
}
.skin-black-light .main-header .navbar-toggle {
color: #333;
}
.skin-black-light .main-header .navbar-brand {
color: #333;
border-right: 1px solid #d2d6de;
}
.skin-black-light .main-header .navbar {
background-color: #ffffff;
}
.skin-black-light .main-header .navbar .nav > li > a {
color: #333333;
}
.skin-black-light .main-header .navbar .nav > li > a:hover,
.skin-black-light .main-header .navbar .nav > li > a:active,
.skin-black-light .main-header .navbar .nav > li > a:focus,
.skin-black-light .main-header .navbar .nav .open > a,
.skin-black-light .main-header .navbar .nav .open > a:hover,
.skin-black-light .main-header .navbar .nav .open > a:focus,
.skin-black-light .main-header .navbar .nav > .active > a {
background: #ffffff;
color: #999999;
}
.skin-black-light .main-header .navbar .sidebar-toggle {
color: #333333;
}
.skin-black-light .main-header .navbar .sidebar-toggle:hover {
color: #999999;
background: #ffffff;
}
.skin-black-light .main-header .navbar > .sidebar-toggle {
color: #333;
border-right: 1px solid #d2d6de;
}
.skin-black-light .main-header .navbar .navbar-nav > li > a {
border-right: 1px solid #d2d6de;
}
.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav > li > a,
.skin-black-light .main-header .navbar .navbar-right > li > a {
border-left: 1px solid #d2d6de;
border-right-width: 0;
}
.skin-black-light .main-header .logo {
background-color: #ffffff;
color: #333333;
border-bottom: 0 solid transparent;
border-right: 1px solid #d2d6de;
}
.skin-black-light .main-header .logo:hover {
background-color: #fcfcfc;
}
@media (max-width: 767px) {
.skin-black-light .main-header .logo {
background-color: #222222;
color: #ffffff;
border-bottom: 0 solid transparent;
border-right: none;
}
.skin-black-light .main-header .logo:hover {
background-color: #1f1f1f;
}
}
.skin-black-light .main-header li.user-header {
background-color: #222;
}
.skin-black-light .content-header {
background: transparent;
box-shadow: none;
}
.skin-black-light .wrapper,
.skin-black-light .main-sidebar,
.skin-black-light .left-side {
background-color: #f9fafc;
}
.skin-black-light .main-sidebar {
border-right: 1px solid #d2d6de;
}
.skin-black-light .user-panel > .info,
.skin-black-light .user-panel > .info > a {
color: #444444;
}
.skin-black-light .sidebar-menu > li {
-webkit-transition: border-left-color 0.3s ease;
-o-transition: border-left-color 0.3s ease;
transition: border-left-color 0.3s ease;
}
.skin-black-light .sidebar-menu > li.header {
color: #848484;
background: #f9fafc;
}
.skin-black-light .sidebar-menu > li > a {
border-left: 3px solid transparent;
font-weight: 600;
}
.skin-black-light .sidebar-menu > li:hover > a,
.skin-black-light .sidebar-menu > li.active > a {
color: #000000;
background: #f4f4f5;
}
.skin-black-light .sidebar-menu > li.active {
border-left-color: #ffffff;
}
.skin-black-light .sidebar-menu > li.active > a {
font-weight: 600;
}
.skin-black-light .sidebar-menu > li > .treeview-menu {
background: #f4f4f5;
}
.skin-black-light .sidebar a {
color: #444444;
}
.skin-black-light .sidebar a:hover {
text-decoration: none;
}
.skin-black-light .sidebar-menu .treeview-menu > li > a {
color: #777777;
}
.skin-black-light .sidebar-menu .treeview-menu > li.active > a,
.skin-black-light .sidebar-menu .treeview-menu > li > a:hover {
color: #000000;
}
.skin-black-light .sidebar-menu .treeview-menu > li.active > a {
font-weight: 600;
}
.skin-black-light .sidebar-form {
border-radius: 3px;
border: 1px solid #d2d6de;
margin: 10px 10px;
}
.skin-black-light .sidebar-form input[type="text"],
.skin-black-light .sidebar-form .btn {
box-shadow: none;
background-color: #fff;
border: 1px solid transparent;
height: 35px;
}
.skin-black-light .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-black-light .sidebar-form input[type="text"]:focus,
.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-black-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-black-light .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
@media (min-width: 768px) {
.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
border-left: 1px solid #d2d6de;
}
}

View File

@@ -0,0 +1 @@
.skin-black-light .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black-light .main-header .navbar-toggle{color:#333}.skin-black-light .main-header .navbar-brand{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar{background-color:#fff}.skin-black-light .main-header .navbar .nav>li>a{color:#333}.skin-black-light .main-header .navbar .nav>li>a:hover,.skin-black-light .main-header .navbar .nav>li>a:active,.skin-black-light .main-header .navbar .nav>li>a:focus,.skin-black-light .main-header .navbar .nav .open>a,.skin-black-light .main-header .navbar .nav .open>a:hover,.skin-black-light .main-header .navbar .nav .open>a:focus,.skin-black-light .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black-light .main-header .navbar .sidebar-toggle{color:#333}.skin-black-light .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black-light .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-nav>li>a{border-right:1px solid #d2d6de}.skin-black-light .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black-light .main-header .navbar .navbar-right>li>a{border-left:1px solid #d2d6de;border-right-width:0}.skin-black-light .main-header .logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #d2d6de}.skin-black-light .main-header .logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black-light .main-header .logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black-light .main-header .logo:hover{background-color:#1f1f1f}}.skin-black-light .main-header li.user-header{background-color:#222}.skin-black-light .content-header{background:transparent;box-shadow:none}.skin-black-light .wrapper,.skin-black-light .main-sidebar,.skin-black-light .left-side{background-color:#f9fafc}.skin-black-light .main-sidebar{border-right:1px solid #d2d6de}.skin-black-light .user-panel>.info,.skin-black-light .user-panel>.info>a{color:#444}.skin-black-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-black-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-black-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-black-light .sidebar-menu>li:hover>a,.skin-black-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-black-light .sidebar-menu>li.active{border-left-color:#fff}.skin-black-light .sidebar-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-black-light .sidebar a{color:#444}.skin-black-light .sidebar a:hover{text-decoration:none}.skin-black-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-black-light .sidebar-menu .treeview-menu>li.active>a,.skin-black-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-black-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-black-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-black-light .sidebar-form input[type="text"],.skin-black-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-black-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black-light .sidebar-form input[type="text"]:focus,.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-black-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}

View File

@@ -0,0 +1,161 @@
/*
* Skin: Black
* -----------
*/
/* skin-black navbar */
.skin-black .main-header {
-webkit-box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05);
box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.05);
}
.skin-black .main-header .navbar-toggle {
color: #333;
}
.skin-black .main-header .navbar-brand {
color: #333;
border-right: 1px solid #eee;
}
.skin-black .main-header .navbar {
background-color: #ffffff;
}
.skin-black .main-header .navbar .nav > li > a {
color: #333333;
}
.skin-black .main-header .navbar .nav > li > a:hover,
.skin-black .main-header .navbar .nav > li > a:active,
.skin-black .main-header .navbar .nav > li > a:focus,
.skin-black .main-header .navbar .nav .open > a,
.skin-black .main-header .navbar .nav .open > a:hover,
.skin-black .main-header .navbar .nav .open > a:focus,
.skin-black .main-header .navbar .nav > .active > a {
background: #ffffff;
color: #999999;
}
.skin-black .main-header .navbar .sidebar-toggle {
color: #333333;
}
.skin-black .main-header .navbar .sidebar-toggle:hover {
color: #999999;
background: #ffffff;
}
.skin-black .main-header .navbar > .sidebar-toggle {
color: #333;
border-right: 1px solid #eee;
}
.skin-black .main-header .navbar .navbar-nav > li > a {
border-right: 1px solid #eee;
}
.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav > li > a,
.skin-black .main-header .navbar .navbar-right > li > a {
border-left: 1px solid #eee;
border-right-width: 0;
}
.skin-black .main-header .logo {
background-color: #ffffff;
color: #333333;
border-bottom: 0 solid transparent;
border-right: 1px solid #eee;
}
.skin-black .main-header .logo:hover {
background-color: #fcfcfc;
}
@media (max-width: 767px) {
.skin-black .main-header .logo {
background-color: #222222;
color: #ffffff;
border-bottom: 0 solid transparent;
border-right: none;
}
.skin-black .main-header .logo:hover {
background-color: #1f1f1f;
}
}
.skin-black .main-header li.user-header {
background-color: #222;
}
.skin-black .content-header {
background: transparent;
box-shadow: none;
}
.skin-black .wrapper,
.skin-black .main-sidebar,
.skin-black .left-side {
background-color: #222d32;
}
.skin-black .user-panel > .info,
.skin-black .user-panel > .info > a {
color: #fff;
}
.skin-black .sidebar-menu > li.header {
color: #4b646f;
background: #1a2226;
}
.skin-black .sidebar-menu > li > a {
border-left: 3px solid transparent;
}
.skin-black .sidebar-menu > li:hover > a,
.skin-black .sidebar-menu > li.active > a,
.skin-black .sidebar-menu > li.menu-open > a {
color: #ffffff;
background: #1e282c;
}
.skin-black .sidebar-menu > li.active > a {
border-left-color: #ffffff;
}
.skin-black .sidebar-menu > li > .treeview-menu {
margin: 0 1px;
background: #2c3b41;
}
.skin-black .sidebar a {
color: #b8c7ce;
}
.skin-black .sidebar a:hover {
text-decoration: none;
}
.skin-black .sidebar-menu .treeview-menu > li > a {
color: #8aa4af;
}
.skin-black .sidebar-menu .treeview-menu > li.active > a,
.skin-black .sidebar-menu .treeview-menu > li > a:hover {
color: #ffffff;
}
.skin-black .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px;
}
.skin-black .sidebar-form input[type="text"],
.skin-black .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px;
}
.skin-black .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-black .sidebar-form input[type="text"]:focus,
.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-black .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-black .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
.skin-black .pace .pace-progress {
background: #222;
}
.skin-black .pace .pace-activity {
border-top-color: #222;
border-left-color: #222;
}

View File

@@ -0,0 +1 @@
.skin-black .main-header{-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.skin-black .main-header .navbar-toggle{color:#333}.skin-black .main-header .navbar-brand{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar{background-color:#fff}.skin-black .main-header .navbar .nav>li>a{color:#333}.skin-black .main-header .navbar .nav>li>a:hover,.skin-black .main-header .navbar .nav>li>a:active,.skin-black .main-header .navbar .nav>li>a:focus,.skin-black .main-header .navbar .nav .open>a,.skin-black .main-header .navbar .nav .open>a:hover,.skin-black .main-header .navbar .nav .open>a:focus,.skin-black .main-header .navbar .nav>.active>a{background:#fff;color:#999}.skin-black .main-header .navbar .sidebar-toggle{color:#333}.skin-black .main-header .navbar .sidebar-toggle:hover{color:#999;background:#fff}.skin-black .main-header .navbar>.sidebar-toggle{color:#333;border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-nav>li>a{border-right:1px solid #eee}.skin-black .main-header .navbar .navbar-custom-menu .navbar-nav>li>a,.skin-black .main-header .navbar .navbar-right>li>a{border-left:1px solid #eee;border-right-width:0}.skin-black .main-header .logo{background-color:#fff;color:#333;border-bottom:0 solid transparent;border-right:1px solid #eee}.skin-black .main-header .logo:hover{background-color:#fcfcfc}@media (max-width:767px){.skin-black .main-header .logo{background-color:#222;color:#fff;border-bottom:0 solid transparent;border-right:none}.skin-black .main-header .logo:hover{background-color:#1f1f1f}}.skin-black .main-header li.user-header{background-color:#222}.skin-black .content-header{background:transparent;box-shadow:none}.skin-black .wrapper,.skin-black .main-sidebar,.skin-black .left-side{background-color:#222d32}.skin-black .user-panel>.info,.skin-black .user-panel>.info>a{color:#fff}.skin-black .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-black .sidebar-menu>li>a{border-left:3px solid transparent}.skin-black .sidebar-menu>li:hover>a,.skin-black .sidebar-menu>li.active>a,.skin-black .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-black .sidebar-menu>li.active>a{border-left-color:#fff}.skin-black .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-black .sidebar a{color:#b8c7ce}.skin-black .sidebar a:hover{text-decoration:none}.skin-black .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-black .sidebar-menu .treeview-menu>li.active>a,.skin-black .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-black .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-black .sidebar-form input[type="text"],.skin-black .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-black .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-black .sidebar-form input[type="text"]:focus,.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-black .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-black .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-black .pace .pace-progress{background:#222}.skin-black .pace .pace-activity{border-top-color:#222;border-left-color:#222}

View File

@@ -0,0 +1,163 @@
/*
* Skin: Blue
* ----------
*/
.skin-blue-light .main-header .navbar {
background-color: #3c8dbc;
}
.skin-blue-light .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-blue-light .main-header .navbar .nav > li > a:hover,
.skin-blue-light .main-header .navbar .nav > li > a:active,
.skin-blue-light .main-header .navbar .nav > li > a:focus,
.skin-blue-light .main-header .navbar .nav .open > a,
.skin-blue-light .main-header .navbar .nav .open > a:hover,
.skin-blue-light .main-header .navbar .nav .open > a:focus,
.skin-blue-light .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-blue-light .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-blue-light .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-blue-light .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-blue-light .main-header .navbar .sidebar-toggle:hover {
background-color: #367fa9;
}
@media (max-width: 767px) {
.skin-blue-light .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-blue-light .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-blue-light .main-header .navbar .dropdown-menu li a:hover {
background: #367fa9;
}
}
.skin-blue-light .main-header .logo {
background-color: #3c8dbc;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-blue-light .main-header .logo:hover {
background-color: #3b8ab8;
}
.skin-blue-light .main-header li.user-header {
background-color: #3c8dbc;
}
.skin-blue-light .content-header {
background: transparent;
}
.skin-blue-light .wrapper,
.skin-blue-light .main-sidebar,
.skin-blue-light .left-side {
background-color: #f9fafc;
}
.skin-blue-light .main-sidebar {
border-right: 1px solid #d2d6de;
}
.skin-blue-light .user-panel > .info,
.skin-blue-light .user-panel > .info > a {
color: #444444;
}
.skin-blue-light .sidebar-menu > li {
-webkit-transition: border-left-color 0.3s ease;
-o-transition: border-left-color 0.3s ease;
transition: border-left-color 0.3s ease;
}
.skin-blue-light .sidebar-menu > li.header {
color: #848484;
background: #f9fafc;
}
.skin-blue-light .sidebar-menu > li > a {
border-left: 3px solid transparent;
font-weight: 600;
}
.skin-blue-light .sidebar-menu > li:hover > a,
.skin-blue-light .sidebar-menu > li.active > a {
color: #000000;
background: #f4f4f5;
}
.skin-blue-light .sidebar-menu > li.active {
border-left-color: #3c8dbc;
}
.skin-blue-light .sidebar-menu > li.active > a {
font-weight: 600;
}
.skin-blue-light .sidebar-menu > li > .treeview-menu {
background: #f4f4f5;
}
.skin-blue-light .sidebar a {
color: #444444;
}
.skin-blue-light .sidebar a:hover {
text-decoration: none;
}
.skin-blue-light .sidebar-menu .treeview-menu > li > a {
color: #777777;
}
.skin-blue-light .sidebar-menu .treeview-menu > li.active > a,
.skin-blue-light .sidebar-menu .treeview-menu > li > a:hover {
color: #000000;
}
.skin-blue-light .sidebar-menu .treeview-menu > li.active > a {
font-weight: 600;
}
.skin-blue-light .sidebar-form {
border-radius: 3px;
border: 1px solid #d2d6de;
margin: 10px 10px;
}
.skin-blue-light .sidebar-form input[type="text"],
.skin-blue-light .sidebar-form .btn {
box-shadow: none;
background-color: #fff;
border: 1px solid transparent;
height: 35px;
}
.skin-blue-light .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-blue-light .sidebar-form input[type="text"]:focus,
.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-blue-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-blue-light .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
@media (min-width: 768px) {
.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
border-left: 1px solid #d2d6de;
}
}
.skin-blue-light .main-footer {
border-top-color: #d2d6de;
}
.skin-blue.layout-top-nav .main-header > .logo {
background-color: #3c8dbc;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-blue.layout-top-nav .main-header > .logo:hover {
background-color: #3b8ab8;
}

View File

@@ -0,0 +1 @@
.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav>li>a:hover,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:transparent}.skin-blue-light .wrapper,.skin-blue-light .main-sidebar,.skin-blue-light .left-side{background-color:#f9fafc}.skin-blue-light .main-sidebar{border-right:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li:hover>a,.skin-blue-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .sidebar a:hover{text-decoration:none}.skin-blue-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a,.skin-blue-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-blue-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-blue-light .sidebar-form input[type="text"],.skin-blue-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-blue-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue-light .sidebar-form input[type="text"]:focus,.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}

View File

@@ -0,0 +1,142 @@
/*
* Skin: Blue
* ----------
*/
.skin-blue .main-header .navbar {
background-color: #3c8dbc;
}
.skin-blue .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-blue .main-header .navbar .nav > li > a:hover,
.skin-blue .main-header .navbar .nav > li > a:active,
.skin-blue .main-header .navbar .nav > li > a:focus,
.skin-blue .main-header .navbar .nav .open > a,
.skin-blue .main-header .navbar .nav .open > a:hover,
.skin-blue .main-header .navbar .nav .open > a:focus,
.skin-blue .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-blue .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-blue .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-blue .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-blue .main-header .navbar .sidebar-toggle:hover {
background-color: #367fa9;
}
@media (max-width: 767px) {
.skin-blue .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-blue .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-blue .main-header .navbar .dropdown-menu li a:hover {
background: #367fa9;
}
}
.skin-blue .main-header .logo {
background-color: #367fa9;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-blue .main-header .logo:hover {
background-color: #357ca5;
}
.skin-blue .main-header li.user-header {
background-color: #3c8dbc;
}
.skin-blue .content-header {
background: transparent;
}
.skin-blue .wrapper,
.skin-blue .main-sidebar,
.skin-blue .left-side {
background-color: #222d32;
}
.skin-blue .user-panel > .info,
.skin-blue .user-panel > .info > a {
color: #fff;
}
.skin-blue .sidebar-menu > li.header {
color: #4b646f;
background: #1a2226;
}
.skin-blue .sidebar-menu > li > a {
border-left: 3px solid transparent;
}
.skin-blue .sidebar-menu > li:hover > a,
.skin-blue .sidebar-menu > li.active > a,
.skin-blue .sidebar-menu > li.menu-open > a {
color: #ffffff;
background: #1e282c;
}
.skin-blue .sidebar-menu > li.active > a {
border-left-color: #3c8dbc;
}
.skin-blue .sidebar-menu > li > .treeview-menu {
margin: 0 1px;
background: #2c3b41;
}
.skin-blue .sidebar a {
color: #b8c7ce;
}
.skin-blue .sidebar a:hover {
text-decoration: none;
}
.skin-blue .sidebar-menu .treeview-menu > li > a {
color: #8aa4af;
}
.skin-blue .sidebar-menu .treeview-menu > li.active > a,
.skin-blue .sidebar-menu .treeview-menu > li > a:hover {
color: #ffffff;
}
.skin-blue .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px;
}
.skin-blue .sidebar-form input[type="text"],
.skin-blue .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px;
}
.skin-blue .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-blue .sidebar-form input[type="text"]:focus,
.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-blue .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-blue .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
.skin-blue.layout-top-nav .main-header > .logo {
background-color: #3c8dbc;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-blue.layout-top-nav .main-header > .logo:hover {
background-color: #3b8ab8;
}

View File

@@ -0,0 +1 @@
.skin-blue .main-header .navbar{background-color:#3c8dbc}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav>li>a:hover,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-blue .main-header .navbar .sidebar-toggle{color:#fff}.skin-blue .main-header .navbar .sidebar-toggle:hover{background-color:#367fa9}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:transparent}.skin-blue .wrapper,.skin-blue .main-sidebar,.skin-blue .left-side{background-color:#222d32}.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li:hover>a,.skin-blue .sidebar-menu>li.active>a,.skin-blue .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-blue .sidebar-menu>li.active>a{border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .sidebar a:hover{text-decoration:none}.skin-blue .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-blue .sidebar-menu .treeview-menu>li.active>a,.skin-blue .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-blue .sidebar-form input[type="text"],.skin-blue .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-blue .sidebar-form input[type="text"]:focus,.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}

View File

@@ -0,0 +1,152 @@
/*
* Skin: Green
* -----------
*/
.skin-green-light .main-header .navbar {
background-color: #00a65a;
}
.skin-green-light .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-green-light .main-header .navbar .nav > li > a:hover,
.skin-green-light .main-header .navbar .nav > li > a:active,
.skin-green-light .main-header .navbar .nav > li > a:focus,
.skin-green-light .main-header .navbar .nav .open > a,
.skin-green-light .main-header .navbar .nav .open > a:hover,
.skin-green-light .main-header .navbar .nav .open > a:focus,
.skin-green-light .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-green-light .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-green-light .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-green-light .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-green-light .main-header .navbar .sidebar-toggle:hover {
background-color: #008d4c;
}
@media (max-width: 767px) {
.skin-green-light .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-green-light .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-green-light .main-header .navbar .dropdown-menu li a:hover {
background: #008d4c;
}
}
.skin-green-light .main-header .logo {
background-color: #00a65a;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-green-light .main-header .logo:hover {
background-color: #00a157;
}
.skin-green-light .main-header li.user-header {
background-color: #00a65a;
}
.skin-green-light .content-header {
background: transparent;
}
.skin-green-light .wrapper,
.skin-green-light .main-sidebar,
.skin-green-light .left-side {
background-color: #f9fafc;
}
.skin-green-light .main-sidebar {
border-right: 1px solid #d2d6de;
}
.skin-green-light .user-panel > .info,
.skin-green-light .user-panel > .info > a {
color: #444444;
}
.skin-green-light .sidebar-menu > li {
-webkit-transition: border-left-color 0.3s ease;
-o-transition: border-left-color 0.3s ease;
transition: border-left-color 0.3s ease;
}
.skin-green-light .sidebar-menu > li.header {
color: #848484;
background: #f9fafc;
}
.skin-green-light .sidebar-menu > li > a {
border-left: 3px solid transparent;
font-weight: 600;
}
.skin-green-light .sidebar-menu > li:hover > a,
.skin-green-light .sidebar-menu > li.active > a {
color: #000000;
background: #f4f4f5;
}
.skin-green-light .sidebar-menu > li.active {
border-left-color: #00a65a;
}
.skin-green-light .sidebar-menu > li.active > a {
font-weight: 600;
}
.skin-green-light .sidebar-menu > li > .treeview-menu {
background: #f4f4f5;
}
.skin-green-light .sidebar a {
color: #444444;
}
.skin-green-light .sidebar a:hover {
text-decoration: none;
}
.skin-green-light .sidebar-menu .treeview-menu > li > a {
color: #777777;
}
.skin-green-light .sidebar-menu .treeview-menu > li.active > a,
.skin-green-light .sidebar-menu .treeview-menu > li > a:hover {
color: #000000;
}
.skin-green-light .sidebar-menu .treeview-menu > li.active > a {
font-weight: 600;
}
.skin-green-light .sidebar-form {
border-radius: 3px;
border: 1px solid #d2d6de;
margin: 10px 10px;
}
.skin-green-light .sidebar-form input[type="text"],
.skin-green-light .sidebar-form .btn {
box-shadow: none;
background-color: #fff;
border: 1px solid transparent;
height: 35px;
}
.skin-green-light .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-green-light .sidebar-form input[type="text"]:focus,
.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-green-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-green-light .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
@media (min-width: 768px) {
.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
border-left: 1px solid #d2d6de;
}
}

View File

@@ -0,0 +1 @@
.skin-green-light .main-header .navbar{background-color:#00a65a}.skin-green-light .main-header .navbar .nav>li>a{color:#fff}.skin-green-light .main-header .navbar .nav>li>a:hover,.skin-green-light .main-header .navbar .nav>li>a:active,.skin-green-light .main-header .navbar .nav>li>a:focus,.skin-green-light .main-header .navbar .nav .open>a,.skin-green-light .main-header .navbar .nav .open>a:hover,.skin-green-light .main-header .navbar .nav .open>a:focus,.skin-green-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-green-light .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green-light .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green-light .main-header .logo{background-color:#00a65a;color:#fff;border-bottom:0 solid transparent}.skin-green-light .main-header .logo:hover{background-color:#00a157}.skin-green-light .main-header li.user-header{background-color:#00a65a}.skin-green-light .content-header{background:transparent}.skin-green-light .wrapper,.skin-green-light .main-sidebar,.skin-green-light .left-side{background-color:#f9fafc}.skin-green-light .main-sidebar{border-right:1px solid #d2d6de}.skin-green-light .user-panel>.info,.skin-green-light .user-panel>.info>a{color:#444}.skin-green-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-green-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-green-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-green-light .sidebar-menu>li:hover>a,.skin-green-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-green-light .sidebar-menu>li.active{border-left-color:#00a65a}.skin-green-light .sidebar-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-green-light .sidebar a{color:#444}.skin-green-light .sidebar a:hover{text-decoration:none}.skin-green-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-green-light .sidebar-menu .treeview-menu>li.active>a,.skin-green-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-green-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-green-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-green-light .sidebar-form input[type="text"],.skin-green-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-green-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green-light .sidebar-form input[type="text"]:focus,.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-green-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}

View File

@@ -0,0 +1,134 @@
/*
* Skin: Green
* -----------
*/
.skin-green .main-header .navbar {
background-color: #00a65a;
}
.skin-green .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-green .main-header .navbar .nav > li > a:hover,
.skin-green .main-header .navbar .nav > li > a:active,
.skin-green .main-header .navbar .nav > li > a:focus,
.skin-green .main-header .navbar .nav .open > a,
.skin-green .main-header .navbar .nav .open > a:hover,
.skin-green .main-header .navbar .nav .open > a:focus,
.skin-green .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-green .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-green .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-green .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-green .main-header .navbar .sidebar-toggle:hover {
background-color: #008d4c;
}
@media (max-width: 767px) {
.skin-green .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-green .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-green .main-header .navbar .dropdown-menu li a:hover {
background: #008d4c;
}
}
.skin-green .main-header .logo {
background-color: #008d4c;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-green .main-header .logo:hover {
background-color: #008749;
}
.skin-green .main-header li.user-header {
background-color: #00a65a;
}
.skin-green .content-header {
background: transparent;
}
.skin-green .wrapper,
.skin-green .main-sidebar,
.skin-green .left-side {
background-color: #222d32;
}
.skin-green .user-panel > .info,
.skin-green .user-panel > .info > a {
color: #fff;
}
.skin-green .sidebar-menu > li.header {
color: #4b646f;
background: #1a2226;
}
.skin-green .sidebar-menu > li > a {
border-left: 3px solid transparent;
}
.skin-green .sidebar-menu > li:hover > a,
.skin-green .sidebar-menu > li.active > a,
.skin-green .sidebar-menu > li.menu-open > a {
color: #ffffff;
background: #1e282c;
}
.skin-green .sidebar-menu > li.active > a {
border-left-color: #00a65a;
}
.skin-green .sidebar-menu > li > .treeview-menu {
margin: 0 1px;
background: #2c3b41;
}
.skin-green .sidebar a {
color: #b8c7ce;
}
.skin-green .sidebar a:hover {
text-decoration: none;
}
.skin-green .sidebar-menu .treeview-menu > li > a {
color: #8aa4af;
}
.skin-green .sidebar-menu .treeview-menu > li.active > a,
.skin-green .sidebar-menu .treeview-menu > li > a:hover {
color: #ffffff;
}
.skin-green .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px;
}
.skin-green .sidebar-form input[type="text"],
.skin-green .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px;
}
.skin-green .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-green .sidebar-form input[type="text"]:focus,
.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-green .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-green .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}

View File

@@ -0,0 +1 @@
.skin-green .main-header .navbar{background-color:#00a65a}.skin-green .main-header .navbar .nav>li>a{color:#fff}.skin-green .main-header .navbar .nav>li>a:hover,.skin-green .main-header .navbar .nav>li>a:active,.skin-green .main-header .navbar .nav>li>a:focus,.skin-green .main-header .navbar .nav .open>a,.skin-green .main-header .navbar .nav .open>a:hover,.skin-green .main-header .navbar .nav .open>a:focus,.skin-green .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-green .main-header .navbar .sidebar-toggle{color:#fff}.skin-green .main-header .navbar .sidebar-toggle:hover{background-color:#008d4c}@media (max-width:767px){.skin-green .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-green .main-header .navbar .dropdown-menu li a{color:#fff}.skin-green .main-header .navbar .dropdown-menu li a:hover{background:#008d4c}}.skin-green .main-header .logo{background-color:#008d4c;color:#fff;border-bottom:0 solid transparent}.skin-green .main-header .logo:hover{background-color:#008749}.skin-green .main-header li.user-header{background-color:#00a65a}.skin-green .content-header{background:transparent}.skin-green .wrapper,.skin-green .main-sidebar,.skin-green .left-side{background-color:#222d32}.skin-green .user-panel>.info,.skin-green .user-panel>.info>a{color:#fff}.skin-green .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-green .sidebar-menu>li>a{border-left:3px solid transparent}.skin-green .sidebar-menu>li:hover>a,.skin-green .sidebar-menu>li.active>a,.skin-green .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-green .sidebar-menu>li.active>a{border-left-color:#00a65a}.skin-green .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-green .sidebar a{color:#b8c7ce}.skin-green .sidebar a:hover{text-decoration:none}.skin-green .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-green .sidebar-menu .treeview-menu>li.active>a,.skin-green .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-green .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-green .sidebar-form input[type="text"],.skin-green .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-green .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-green .sidebar-form input[type="text"]:focus,.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-green .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-green .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}

View File

@@ -0,0 +1,152 @@
/*
* Skin: Purple
* ------------
*/
.skin-purple-light .main-header .navbar {
background-color: #605ca8;
}
.skin-purple-light .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-purple-light .main-header .navbar .nav > li > a:hover,
.skin-purple-light .main-header .navbar .nav > li > a:active,
.skin-purple-light .main-header .navbar .nav > li > a:focus,
.skin-purple-light .main-header .navbar .nav .open > a,
.skin-purple-light .main-header .navbar .nav .open > a:hover,
.skin-purple-light .main-header .navbar .nav .open > a:focus,
.skin-purple-light .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-purple-light .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-purple-light .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-purple-light .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-purple-light .main-header .navbar .sidebar-toggle:hover {
background-color: #555299;
}
@media (max-width: 767px) {
.skin-purple-light .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-purple-light .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-purple-light .main-header .navbar .dropdown-menu li a:hover {
background: #555299;
}
}
.skin-purple-light .main-header .logo {
background-color: #605ca8;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-purple-light .main-header .logo:hover {
background-color: #5d59a6;
}
.skin-purple-light .main-header li.user-header {
background-color: #605ca8;
}
.skin-purple-light .content-header {
background: transparent;
}
.skin-purple-light .wrapper,
.skin-purple-light .main-sidebar,
.skin-purple-light .left-side {
background-color: #f9fafc;
}
.skin-purple-light .main-sidebar {
border-right: 1px solid #d2d6de;
}
.skin-purple-light .user-panel > .info,
.skin-purple-light .user-panel > .info > a {
color: #444444;
}
.skin-purple-light .sidebar-menu > li {
-webkit-transition: border-left-color 0.3s ease;
-o-transition: border-left-color 0.3s ease;
transition: border-left-color 0.3s ease;
}
.skin-purple-light .sidebar-menu > li.header {
color: #848484;
background: #f9fafc;
}
.skin-purple-light .sidebar-menu > li > a {
border-left: 3px solid transparent;
font-weight: 600;
}
.skin-purple-light .sidebar-menu > li:hover > a,
.skin-purple-light .sidebar-menu > li.active > a {
color: #000000;
background: #f4f4f5;
}
.skin-purple-light .sidebar-menu > li.active {
border-left-color: #605ca8;
}
.skin-purple-light .sidebar-menu > li.active > a {
font-weight: 600;
}
.skin-purple-light .sidebar-menu > li > .treeview-menu {
background: #f4f4f5;
}
.skin-purple-light .sidebar a {
color: #444444;
}
.skin-purple-light .sidebar a:hover {
text-decoration: none;
}
.skin-purple-light .sidebar-menu .treeview-menu > li > a {
color: #777777;
}
.skin-purple-light .sidebar-menu .treeview-menu > li.active > a,
.skin-purple-light .sidebar-menu .treeview-menu > li > a:hover {
color: #000000;
}
.skin-purple-light .sidebar-menu .treeview-menu > li.active > a {
font-weight: 600;
}
.skin-purple-light .sidebar-form {
border-radius: 3px;
border: 1px solid #d2d6de;
margin: 10px 10px;
}
.skin-purple-light .sidebar-form input[type="text"],
.skin-purple-light .sidebar-form .btn {
box-shadow: none;
background-color: #fff;
border: 1px solid transparent;
height: 35px;
}
.skin-purple-light .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-purple-light .sidebar-form input[type="text"]:focus,
.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-purple-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-purple-light .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
@media (min-width: 768px) {
.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
border-left: 1px solid #d2d6de;
}
}

View File

@@ -0,0 +1 @@
.skin-purple-light .main-header .navbar{background-color:#605ca8}.skin-purple-light .main-header .navbar .nav>li>a{color:#fff}.skin-purple-light .main-header .navbar .nav>li>a:hover,.skin-purple-light .main-header .navbar .nav>li>a:active,.skin-purple-light .main-header .navbar .nav>li>a:focus,.skin-purple-light .main-header .navbar .nav .open>a,.skin-purple-light .main-header .navbar .nav .open>a:hover,.skin-purple-light .main-header .navbar .nav .open>a:focus,.skin-purple-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple-light .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple-light .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple-light .main-header .logo{background-color:#605ca8;color:#fff;border-bottom:0 solid transparent}.skin-purple-light .main-header .logo:hover{background-color:#5d59a6}.skin-purple-light .main-header li.user-header{background-color:#605ca8}.skin-purple-light .content-header{background:transparent}.skin-purple-light .wrapper,.skin-purple-light .main-sidebar,.skin-purple-light .left-side{background-color:#f9fafc}.skin-purple-light .main-sidebar{border-right:1px solid #d2d6de}.skin-purple-light .user-panel>.info,.skin-purple-light .user-panel>.info>a{color:#444}.skin-purple-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-purple-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-purple-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-purple-light .sidebar-menu>li:hover>a,.skin-purple-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-purple-light .sidebar-menu>li.active{border-left-color:#605ca8}.skin-purple-light .sidebar-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-purple-light .sidebar a{color:#444}.skin-purple-light .sidebar a:hover{text-decoration:none}.skin-purple-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a,.skin-purple-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-purple-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-purple-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-purple-light .sidebar-form input[type="text"],.skin-purple-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-purple-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple-light .sidebar-form input[type="text"]:focus,.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-purple-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}

View File

@@ -0,0 +1,134 @@
/*
* Skin: Purple
* ------------
*/
.skin-purple .main-header .navbar {
background-color: #605ca8;
}
.skin-purple .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-purple .main-header .navbar .nav > li > a:hover,
.skin-purple .main-header .navbar .nav > li > a:active,
.skin-purple .main-header .navbar .nav > li > a:focus,
.skin-purple .main-header .navbar .nav .open > a,
.skin-purple .main-header .navbar .nav .open > a:hover,
.skin-purple .main-header .navbar .nav .open > a:focus,
.skin-purple .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-purple .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-purple .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-purple .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-purple .main-header .navbar .sidebar-toggle:hover {
background-color: #555299;
}
@media (max-width: 767px) {
.skin-purple .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-purple .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-purple .main-header .navbar .dropdown-menu li a:hover {
background: #555299;
}
}
.skin-purple .main-header .logo {
background-color: #555299;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-purple .main-header .logo:hover {
background-color: #545096;
}
.skin-purple .main-header li.user-header {
background-color: #605ca8;
}
.skin-purple .content-header {
background: transparent;
}
.skin-purple .wrapper,
.skin-purple .main-sidebar,
.skin-purple .left-side {
background-color: #222d32;
}
.skin-purple .user-panel > .info,
.skin-purple .user-panel > .info > a {
color: #fff;
}
.skin-purple .sidebar-menu > li.header {
color: #4b646f;
background: #1a2226;
}
.skin-purple .sidebar-menu > li > a {
border-left: 3px solid transparent;
}
.skin-purple .sidebar-menu > li:hover > a,
.skin-purple .sidebar-menu > li.active > a,
.skin-purple .sidebar-menu > li.menu-open > a {
color: #ffffff;
background: #1e282c;
}
.skin-purple .sidebar-menu > li.active > a {
border-left-color: #605ca8;
}
.skin-purple .sidebar-menu > li > .treeview-menu {
margin: 0 1px;
background: #2c3b41;
}
.skin-purple .sidebar a {
color: #b8c7ce;
}
.skin-purple .sidebar a:hover {
text-decoration: none;
}
.skin-purple .sidebar-menu .treeview-menu > li > a {
color: #8aa4af;
}
.skin-purple .sidebar-menu .treeview-menu > li.active > a,
.skin-purple .sidebar-menu .treeview-menu > li > a:hover {
color: #ffffff;
}
.skin-purple .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px;
}
.skin-purple .sidebar-form input[type="text"],
.skin-purple .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px;
}
.skin-purple .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-purple .sidebar-form input[type="text"]:focus,
.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-purple .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-purple .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}

View File

@@ -0,0 +1 @@
.skin-purple .main-header .navbar{background-color:#605ca8}.skin-purple .main-header .navbar .nav>li>a{color:#fff}.skin-purple .main-header .navbar .nav>li>a:hover,.skin-purple .main-header .navbar .nav>li>a:active,.skin-purple .main-header .navbar .nav>li>a:focus,.skin-purple .main-header .navbar .nav .open>a,.skin-purple .main-header .navbar .nav .open>a:hover,.skin-purple .main-header .navbar .nav .open>a:focus,.skin-purple .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-purple .main-header .navbar .sidebar-toggle{color:#fff}.skin-purple .main-header .navbar .sidebar-toggle:hover{background-color:#555299}@media (max-width:767px){.skin-purple .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-purple .main-header .navbar .dropdown-menu li a{color:#fff}.skin-purple .main-header .navbar .dropdown-menu li a:hover{background:#555299}}.skin-purple .main-header .logo{background-color:#555299;color:#fff;border-bottom:0 solid transparent}.skin-purple .main-header .logo:hover{background-color:#545096}.skin-purple .main-header li.user-header{background-color:#605ca8}.skin-purple .content-header{background:transparent}.skin-purple .wrapper,.skin-purple .main-sidebar,.skin-purple .left-side{background-color:#222d32}.skin-purple .user-panel>.info,.skin-purple .user-panel>.info>a{color:#fff}.skin-purple .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-purple .sidebar-menu>li>a{border-left:3px solid transparent}.skin-purple .sidebar-menu>li:hover>a,.skin-purple .sidebar-menu>li.active>a,.skin-purple .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-purple .sidebar-menu>li.active>a{border-left-color:#605ca8}.skin-purple .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-purple .sidebar a{color:#b8c7ce}.skin-purple .sidebar a:hover{text-decoration:none}.skin-purple .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-purple .sidebar-menu .treeview-menu>li.active>a,.skin-purple .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-purple .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-purple .sidebar-form input[type="text"],.skin-purple .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-purple .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-purple .sidebar-form input[type="text"]:focus,.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-purple .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-purple .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}

View File

@@ -0,0 +1,152 @@
/*
* Skin: Red
* ---------
*/
.skin-red-light .main-header .navbar {
background-color: #dd4b39;
}
.skin-red-light .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-red-light .main-header .navbar .nav > li > a:hover,
.skin-red-light .main-header .navbar .nav > li > a:active,
.skin-red-light .main-header .navbar .nav > li > a:focus,
.skin-red-light .main-header .navbar .nav .open > a,
.skin-red-light .main-header .navbar .nav .open > a:hover,
.skin-red-light .main-header .navbar .nav .open > a:focus,
.skin-red-light .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-red-light .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-red-light .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-red-light .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-red-light .main-header .navbar .sidebar-toggle:hover {
background-color: #d73925;
}
@media (max-width: 767px) {
.skin-red-light .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-red-light .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-red-light .main-header .navbar .dropdown-menu li a:hover {
background: #d73925;
}
}
.skin-red-light .main-header .logo {
background-color: #dd4b39;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-red-light .main-header .logo:hover {
background-color: #dc4735;
}
.skin-red-light .main-header li.user-header {
background-color: #dd4b39;
}
.skin-red-light .content-header {
background: transparent;
}
.skin-red-light .wrapper,
.skin-red-light .main-sidebar,
.skin-red-light .left-side {
background-color: #f9fafc;
}
.skin-red-light .main-sidebar {
border-right: 1px solid #d2d6de;
}
.skin-red-light .user-panel > .info,
.skin-red-light .user-panel > .info > a {
color: #444444;
}
.skin-red-light .sidebar-menu > li {
-webkit-transition: border-left-color 0.3s ease;
-o-transition: border-left-color 0.3s ease;
transition: border-left-color 0.3s ease;
}
.skin-red-light .sidebar-menu > li.header {
color: #848484;
background: #f9fafc;
}
.skin-red-light .sidebar-menu > li > a {
border-left: 3px solid transparent;
font-weight: 600;
}
.skin-red-light .sidebar-menu > li:hover > a,
.skin-red-light .sidebar-menu > li.active > a {
color: #000000;
background: #f4f4f5;
}
.skin-red-light .sidebar-menu > li.active {
border-left-color: #dd4b39;
}
.skin-red-light .sidebar-menu > li.active > a {
font-weight: 600;
}
.skin-red-light .sidebar-menu > li > .treeview-menu {
background: #f4f4f5;
}
.skin-red-light .sidebar a {
color: #444444;
}
.skin-red-light .sidebar a:hover {
text-decoration: none;
}
.skin-red-light .sidebar-menu .treeview-menu > li > a {
color: #777777;
}
.skin-red-light .sidebar-menu .treeview-menu > li.active > a,
.skin-red-light .sidebar-menu .treeview-menu > li > a:hover {
color: #000000;
}
.skin-red-light .sidebar-menu .treeview-menu > li.active > a {
font-weight: 600;
}
.skin-red-light .sidebar-form {
border-radius: 3px;
border: 1px solid #d2d6de;
margin: 10px 10px;
}
.skin-red-light .sidebar-form input[type="text"],
.skin-red-light .sidebar-form .btn {
box-shadow: none;
background-color: #fff;
border: 1px solid transparent;
height: 35px;
}
.skin-red-light .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-red-light .sidebar-form input[type="text"]:focus,
.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-red-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-red-light .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
@media (min-width: 768px) {
.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
border-left: 1px solid #d2d6de;
}
}

View File

@@ -0,0 +1 @@
.skin-red-light .main-header .navbar{background-color:#dd4b39}.skin-red-light .main-header .navbar .nav>li>a{color:#fff}.skin-red-light .main-header .navbar .nav>li>a:hover,.skin-red-light .main-header .navbar .nav>li>a:active,.skin-red-light .main-header .navbar .nav>li>a:focus,.skin-red-light .main-header .navbar .nav .open>a,.skin-red-light .main-header .navbar .nav .open>a:hover,.skin-red-light .main-header .navbar .nav .open>a:focus,.skin-red-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-red-light .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red-light .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red-light .main-header .logo{background-color:#dd4b39;color:#fff;border-bottom:0 solid transparent}.skin-red-light .main-header .logo:hover{background-color:#dc4735}.skin-red-light .main-header li.user-header{background-color:#dd4b39}.skin-red-light .content-header{background:transparent}.skin-red-light .wrapper,.skin-red-light .main-sidebar,.skin-red-light .left-side{background-color:#f9fafc}.skin-red-light .main-sidebar{border-right:1px solid #d2d6de}.skin-red-light .user-panel>.info,.skin-red-light .user-panel>.info>a{color:#444}.skin-red-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-red-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-red-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-red-light .sidebar-menu>li:hover>a,.skin-red-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-red-light .sidebar-menu>li.active{border-left-color:#dd4b39}.skin-red-light .sidebar-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-red-light .sidebar a{color:#444}.skin-red-light .sidebar a:hover{text-decoration:none}.skin-red-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-red-light .sidebar-menu .treeview-menu>li.active>a,.skin-red-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-red-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-red-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-red-light .sidebar-form input[type="text"],.skin-red-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-red-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red-light .sidebar-form input[type="text"]:focus,.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-red-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}

View File

@@ -0,0 +1,134 @@
/*
* Skin: Red
* ---------
*/
.skin-red .main-header .navbar {
background-color: #dd4b39;
}
.skin-red .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-red .main-header .navbar .nav > li > a:hover,
.skin-red .main-header .navbar .nav > li > a:active,
.skin-red .main-header .navbar .nav > li > a:focus,
.skin-red .main-header .navbar .nav .open > a,
.skin-red .main-header .navbar .nav .open > a:hover,
.skin-red .main-header .navbar .nav .open > a:focus,
.skin-red .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-red .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-red .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-red .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-red .main-header .navbar .sidebar-toggle:hover {
background-color: #d73925;
}
@media (max-width: 767px) {
.skin-red .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-red .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-red .main-header .navbar .dropdown-menu li a:hover {
background: #d73925;
}
}
.skin-red .main-header .logo {
background-color: #d73925;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-red .main-header .logo:hover {
background-color: #d33724;
}
.skin-red .main-header li.user-header {
background-color: #dd4b39;
}
.skin-red .content-header {
background: transparent;
}
.skin-red .wrapper,
.skin-red .main-sidebar,
.skin-red .left-side {
background-color: #222d32;
}
.skin-red .user-panel > .info,
.skin-red .user-panel > .info > a {
color: #fff;
}
.skin-red .sidebar-menu > li.header {
color: #4b646f;
background: #1a2226;
}
.skin-red .sidebar-menu > li > a {
border-left: 3px solid transparent;
}
.skin-red .sidebar-menu > li:hover > a,
.skin-red .sidebar-menu > li.active > a,
.skin-red .sidebar-menu > li.menu-open > a {
color: #ffffff;
background: #1e282c;
}
.skin-red .sidebar-menu > li.active > a {
border-left-color: #dd4b39;
}
.skin-red .sidebar-menu > li > .treeview-menu {
margin: 0 1px;
background: #2c3b41;
}
.skin-red .sidebar a {
color: #b8c7ce;
}
.skin-red .sidebar a:hover {
text-decoration: none;
}
.skin-red .sidebar-menu .treeview-menu > li > a {
color: #8aa4af;
}
.skin-red .sidebar-menu .treeview-menu > li.active > a,
.skin-red .sidebar-menu .treeview-menu > li > a:hover {
color: #ffffff;
}
.skin-red .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px;
}
.skin-red .sidebar-form input[type="text"],
.skin-red .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px;
}
.skin-red .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-red .sidebar-form input[type="text"]:focus,
.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-red .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-red .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}

View File

@@ -0,0 +1 @@
.skin-red .main-header .navbar{background-color:#dd4b39}.skin-red .main-header .navbar .nav>li>a{color:#fff}.skin-red .main-header .navbar .nav>li>a:hover,.skin-red .main-header .navbar .nav>li>a:active,.skin-red .main-header .navbar .nav>li>a:focus,.skin-red .main-header .navbar .nav .open>a,.skin-red .main-header .navbar .nav .open>a:hover,.skin-red .main-header .navbar .nav .open>a:focus,.skin-red .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-red .main-header .navbar .sidebar-toggle{color:#fff}.skin-red .main-header .navbar .sidebar-toggle:hover{background-color:#d73925}@media (max-width:767px){.skin-red .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-red .main-header .navbar .dropdown-menu li a{color:#fff}.skin-red .main-header .navbar .dropdown-menu li a:hover{background:#d73925}}.skin-red .main-header .logo{background-color:#d73925;color:#fff;border-bottom:0 solid transparent}.skin-red .main-header .logo:hover{background-color:#d33724}.skin-red .main-header li.user-header{background-color:#dd4b39}.skin-red .content-header{background:transparent}.skin-red .wrapper,.skin-red .main-sidebar,.skin-red .left-side{background-color:#222d32}.skin-red .user-panel>.info,.skin-red .user-panel>.info>a{color:#fff}.skin-red .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-red .sidebar-menu>li>a{border-left:3px solid transparent}.skin-red .sidebar-menu>li:hover>a,.skin-red .sidebar-menu>li.active>a,.skin-red .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-red .sidebar-menu>li.active>a{border-left-color:#dd4b39}.skin-red .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-red .sidebar a{color:#b8c7ce}.skin-red .sidebar a:hover{text-decoration:none}.skin-red .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-red .sidebar-menu .treeview-menu>li.active>a,.skin-red .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-red .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-red .sidebar-form input[type="text"],.skin-red .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-red .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-red .sidebar-form input[type="text"]:focus,.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-red .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-red .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}

View File

@@ -0,0 +1,152 @@
/*
* Skin: Yellow
* ------------
*/
.skin-yellow-light .main-header .navbar {
background-color: #f39c12;
}
.skin-yellow-light .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-yellow-light .main-header .navbar .nav > li > a:hover,
.skin-yellow-light .main-header .navbar .nav > li > a:active,
.skin-yellow-light .main-header .navbar .nav > li > a:focus,
.skin-yellow-light .main-header .navbar .nav .open > a,
.skin-yellow-light .main-header .navbar .nav .open > a:hover,
.skin-yellow-light .main-header .navbar .nav .open > a:focus,
.skin-yellow-light .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-yellow-light .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-yellow-light .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-yellow-light .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-yellow-light .main-header .navbar .sidebar-toggle:hover {
background-color: #e08e0b;
}
@media (max-width: 767px) {
.skin-yellow-light .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-yellow-light .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover {
background: #e08e0b;
}
}
.skin-yellow-light .main-header .logo {
background-color: #f39c12;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-yellow-light .main-header .logo:hover {
background-color: #f39a0d;
}
.skin-yellow-light .main-header li.user-header {
background-color: #f39c12;
}
.skin-yellow-light .content-header {
background: transparent;
}
.skin-yellow-light .wrapper,
.skin-yellow-light .main-sidebar,
.skin-yellow-light .left-side {
background-color: #f9fafc;
}
.skin-yellow-light .main-sidebar {
border-right: 1px solid #d2d6de;
}
.skin-yellow-light .user-panel > .info,
.skin-yellow-light .user-panel > .info > a {
color: #444444;
}
.skin-yellow-light .sidebar-menu > li {
-webkit-transition: border-left-color 0.3s ease;
-o-transition: border-left-color 0.3s ease;
transition: border-left-color 0.3s ease;
}
.skin-yellow-light .sidebar-menu > li.header {
color: #848484;
background: #f9fafc;
}
.skin-yellow-light .sidebar-menu > li > a {
border-left: 3px solid transparent;
font-weight: 600;
}
.skin-yellow-light .sidebar-menu > li:hover > a,
.skin-yellow-light .sidebar-menu > li.active > a {
color: #000000;
background: #f4f4f5;
}
.skin-yellow-light .sidebar-menu > li.active {
border-left-color: #f39c12;
}
.skin-yellow-light .sidebar-menu > li.active > a {
font-weight: 600;
}
.skin-yellow-light .sidebar-menu > li > .treeview-menu {
background: #f4f4f5;
}
.skin-yellow-light .sidebar a {
color: #444444;
}
.skin-yellow-light .sidebar a:hover {
text-decoration: none;
}
.skin-yellow-light .sidebar-menu .treeview-menu > li > a {
color: #777777;
}
.skin-yellow-light .sidebar-menu .treeview-menu > li.active > a,
.skin-yellow-light .sidebar-menu .treeview-menu > li > a:hover {
color: #000000;
}
.skin-yellow-light .sidebar-menu .treeview-menu > li.active > a {
font-weight: 600;
}
.skin-yellow-light .sidebar-form {
border-radius: 3px;
border: 1px solid #d2d6de;
margin: 10px 10px;
}
.skin-yellow-light .sidebar-form input[type="text"],
.skin-yellow-light .sidebar-form .btn {
box-shadow: none;
background-color: #fff;
border: 1px solid transparent;
height: 35px;
}
.skin-yellow-light .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-yellow-light .sidebar-form input[type="text"]:focus,
.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-yellow-light .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-yellow-light .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}
@media (min-width: 768px) {
.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
border-left: 1px solid #d2d6de;
}
}

View File

@@ -0,0 +1 @@
.skin-yellow-light .main-header .navbar{background-color:#f39c12}.skin-yellow-light .main-header .navbar .nav>li>a{color:#fff}.skin-yellow-light .main-header .navbar .nav>li>a:hover,.skin-yellow-light .main-header .navbar .nav>li>a:active,.skin-yellow-light .main-header .navbar .nav>li>a:focus,.skin-yellow-light .main-header .navbar .nav .open>a,.skin-yellow-light .main-header .navbar .nav .open>a:hover,.skin-yellow-light .main-header .navbar .nav .open>a:focus,.skin-yellow-light .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow-light .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow-light .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow-light .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow-light .main-header .logo{background-color:#f39c12;color:#fff;border-bottom:0 solid transparent}.skin-yellow-light .main-header .logo:hover{background-color:#f39a0d}.skin-yellow-light .main-header li.user-header{background-color:#f39c12}.skin-yellow-light .content-header{background:transparent}.skin-yellow-light .wrapper,.skin-yellow-light .main-sidebar,.skin-yellow-light .left-side{background-color:#f9fafc}.skin-yellow-light .main-sidebar{border-right:1px solid #d2d6de}.skin-yellow-light .user-panel>.info,.skin-yellow-light .user-panel>.info>a{color:#444}.skin-yellow-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-yellow-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-yellow-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-yellow-light .sidebar-menu>li:hover>a,.skin-yellow-light .sidebar-menu>li.active>a{color:#000;background:#f4f4f5}.skin-yellow-light .sidebar-menu>li.active{border-left-color:#f39c12}.skin-yellow-light .sidebar-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-yellow-light .sidebar a{color:#444}.skin-yellow-light .sidebar a:hover{text-decoration:none}.skin-yellow-light .sidebar-menu .treeview-menu>li>a{color:#777}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a,.skin-yellow-light .sidebar-menu .treeview-menu>li>a:hover{color:#000}.skin-yellow-light .sidebar-menu .treeview-menu>li.active>a{font-weight:600}.skin-yellow-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px 10px}.skin-yellow-light .sidebar-form input[type="text"],.skin-yellow-light .sidebar-form .btn{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-yellow-light .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow-light .sidebar-form input[type="text"]:focus,.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow-light .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow-light .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}@media (min-width:768px){.skin-yellow-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}

View File

@@ -0,0 +1,134 @@
/*
* Skin: Yellow
* ------------
*/
.skin-yellow .main-header .navbar {
background-color: #f39c12;
}
.skin-yellow .main-header .navbar .nav > li > a {
color: #ffffff;
}
.skin-yellow .main-header .navbar .nav > li > a:hover,
.skin-yellow .main-header .navbar .nav > li > a:active,
.skin-yellow .main-header .navbar .nav > li > a:focus,
.skin-yellow .main-header .navbar .nav .open > a,
.skin-yellow .main-header .navbar .nav .open > a:hover,
.skin-yellow .main-header .navbar .nav .open > a:focus,
.skin-yellow .main-header .navbar .nav > .active > a {
background: rgba(0, 0, 0, 0.1);
color: #f6f6f6;
}
.skin-yellow .main-header .navbar .sidebar-toggle {
color: #ffffff;
}
.skin-yellow .main-header .navbar .sidebar-toggle:hover {
color: #f6f6f6;
background: rgba(0, 0, 0, 0.1);
}
.skin-yellow .main-header .navbar .sidebar-toggle {
color: #fff;
}
.skin-yellow .main-header .navbar .sidebar-toggle:hover {
background-color: #e08e0b;
}
@media (max-width: 767px) {
.skin-yellow .main-header .navbar .dropdown-menu li.divider {
background-color: rgba(255, 255, 255, 0.1);
}
.skin-yellow .main-header .navbar .dropdown-menu li a {
color: #fff;
}
.skin-yellow .main-header .navbar .dropdown-menu li a:hover {
background: #e08e0b;
}
}
.skin-yellow .main-header .logo {
background-color: #e08e0b;
color: #ffffff;
border-bottom: 0 solid transparent;
}
.skin-yellow .main-header .logo:hover {
background-color: #db8b0b;
}
.skin-yellow .main-header li.user-header {
background-color: #f39c12;
}
.skin-yellow .content-header {
background: transparent;
}
.skin-yellow .wrapper,
.skin-yellow .main-sidebar,
.skin-yellow .left-side {
background-color: #222d32;
}
.skin-yellow .user-panel > .info,
.skin-yellow .user-panel > .info > a {
color: #fff;
}
.skin-yellow .sidebar-menu > li.header {
color: #4b646f;
background: #1a2226;
}
.skin-yellow .sidebar-menu > li > a {
border-left: 3px solid transparent;
}
.skin-yellow .sidebar-menu > li:hover > a,
.skin-yellow .sidebar-menu > li.active > a,
.skin-yellow .sidebar-menu > li.menu-open > a {
color: #ffffff;
background: #1e282c;
}
.skin-yellow .sidebar-menu > li.active > a {
border-left-color: #f39c12;
}
.skin-yellow .sidebar-menu > li > .treeview-menu {
margin: 0 1px;
background: #2c3b41;
}
.skin-yellow .sidebar a {
color: #b8c7ce;
}
.skin-yellow .sidebar a:hover {
text-decoration: none;
}
.skin-yellow .sidebar-menu .treeview-menu > li > a {
color: #8aa4af;
}
.skin-yellow .sidebar-menu .treeview-menu > li.active > a,
.skin-yellow .sidebar-menu .treeview-menu > li > a:hover {
color: #ffffff;
}
.skin-yellow .sidebar-form {
border-radius: 3px;
border: 1px solid #374850;
margin: 10px 10px;
}
.skin-yellow .sidebar-form input[type="text"],
.skin-yellow .sidebar-form .btn {
box-shadow: none;
background-color: #374850;
border: 1px solid transparent;
height: 35px;
}
.skin-yellow .sidebar-form input[type="text"] {
color: #666;
border-top-left-radius: 2px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 2px;
}
.skin-yellow .sidebar-form input[type="text"]:focus,
.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
background-color: #fff;
color: #666;
}
.skin-yellow .sidebar-form input[type="text"]:focus + .input-group-btn .btn {
border-left-color: #fff;
}
.skin-yellow .sidebar-form .btn {
color: #999;
border-top-left-radius: 0;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 0;
}

View File

@@ -0,0 +1 @@
.skin-yellow .main-header .navbar{background-color:#f39c12}.skin-yellow .main-header .navbar .nav>li>a{color:#fff}.skin-yellow .main-header .navbar .nav>li>a:hover,.skin-yellow .main-header .navbar .nav>li>a:active,.skin-yellow .main-header .navbar .nav>li>a:focus,.skin-yellow .main-header .navbar .nav .open>a,.skin-yellow .main-header .navbar .nav .open>a:hover,.skin-yellow .main-header .navbar .nav .open>a:focus,.skin-yellow .main-header .navbar .nav>.active>a{background:rgba(0,0,0,0.1);color:#f6f6f6}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,0.1)}.skin-yellow .main-header .navbar .sidebar-toggle{color:#fff}.skin-yellow .main-header .navbar .sidebar-toggle:hover{background-color:#e08e0b}@media (max-width:767px){.skin-yellow .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,0.1)}.skin-yellow .main-header .navbar .dropdown-menu li a{color:#fff}.skin-yellow .main-header .navbar .dropdown-menu li a:hover{background:#e08e0b}}.skin-yellow .main-header .logo{background-color:#e08e0b;color:#fff;border-bottom:0 solid transparent}.skin-yellow .main-header .logo:hover{background-color:#db8b0b}.skin-yellow .main-header li.user-header{background-color:#f39c12}.skin-yellow .content-header{background:transparent}.skin-yellow .wrapper,.skin-yellow .main-sidebar,.skin-yellow .left-side{background-color:#222d32}.skin-yellow .user-panel>.info,.skin-yellow .user-panel>.info>a{color:#fff}.skin-yellow .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-yellow .sidebar-menu>li>a{border-left:3px solid transparent}.skin-yellow .sidebar-menu>li:hover>a,.skin-yellow .sidebar-menu>li.active>a,.skin-yellow .sidebar-menu>li.menu-open>a{color:#fff;background:#1e282c}.skin-yellow .sidebar-menu>li.active>a{border-left-color:#f39c12}.skin-yellow .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-yellow .sidebar a{color:#b8c7ce}.skin-yellow .sidebar a:hover{text-decoration:none}.skin-yellow .sidebar-menu .treeview-menu>li>a{color:#8aa4af}.skin-yellow .sidebar-menu .treeview-menu>li.active>a,.skin-yellow .sidebar-menu .treeview-menu>li>a:hover{color:#fff}.skin-yellow .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px 10px}.skin-yellow .sidebar-form input[type="text"],.skin-yellow .sidebar-form .btn{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-yellow .sidebar-form input[type="text"]{color:#666;border-top-left-radius:2px;border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:2px}.skin-yellow .sidebar-form input[type="text"]:focus,.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-yellow .sidebar-form input[type="text"]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-yellow .sidebar-form .btn{color:#999;border-top-left-radius:0;border-top-right-radius:2px;border-bottom-right-radius:2px;border-bottom-left-radius:0}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,354 @@
/**
* AdminLTE Demo Menu
* ------------------
* You should not use this file in production.
* This file is for demo purposes only.
*/
$(function () {
'use strict'
/**
* Get access to plugins
*/
$('[data-toggle="control-sidebar"]').controlSidebar()
$('[data-toggle="push-menu"]').pushMenu()
var $pushMenu = $('[data-toggle="push-menu"]').data('lte.pushmenu')
var $controlSidebar = $('[data-toggle="control-sidebar"]').data('lte.controlsidebar')
var $layout = $('body').data('lte.layout')
$(window).on('load', function() {
// Reinitialize variables on load
$pushMenu = $('[data-toggle="push-menu"]').data('lte.pushmenu')
$controlSidebar = $('[data-toggle="control-sidebar"]').data('lte.controlsidebar')
$layout = $('body').data('lte.layout')
})
/**
* List of all the available skins
*
* @type Array
*/
var mySkins = [
'skin-blue',
'skin-black',
'skin-red',
'skin-yellow',
'skin-purple',
'skin-green',
'skin-blue-light',
'skin-black-light',
'skin-red-light',
'skin-yellow-light',
'skin-purple-light',
'skin-green-light'
]
/**
* Get a prestored setting
*
* @param String name Name of of the setting
* @returns String The value of the setting | null
*/
function get(name) {
if (typeof (Storage) !== 'undefined') {
return localStorage.getItem(name)
} else {
window.alert('Please use a modern browser to properly view this template!')
}
}
/**
* Store a new settings in the browser
*
* @param String name Name of the setting
* @param String val Value of the setting
* @returns void
*/
function store(name, val) {
if (typeof (Storage) !== 'undefined') {
localStorage.setItem(name, val)
} else {
window.alert('Please use a modern browser to properly view this template!')
}
}
/**
* Toggles layout classes
*
* @param String cls the layout class to toggle
* @returns void
*/
function changeLayout(cls) {
$('body').toggleClass(cls)
$layout.fixSidebar()
if ($('body').hasClass('fixed') && cls == 'fixed') {
$pushMenu.expandOnHover()
$layout.activate()
}
$controlSidebar.fix()
}
/**
* Replaces the old skin with the new skin
* @param String cls the new skin class
* @returns Boolean false to prevent link's default action
*/
function changeSkin(cls) {
$.each(mySkins, function (i) {
$('body').removeClass(mySkins[i])
})
$('body').addClass(cls)
store('skin', cls)
return false
}
/**
* Retrieve default settings and apply them to the template
*
* @returns void
*/
function setup() {
var tmp = get('skin')
if (tmp && $.inArray(tmp, mySkins))
changeSkin(tmp)
// Add the change skin listener
$('[data-skin]').on('click', function (e) {
if ($(this).hasClass('knob'))
return
e.preventDefault()
changeSkin($(this).data('skin'))
})
// Add the layout manager
$('[data-layout]').on('click', function () {
changeLayout($(this).data('layout'))
})
$('[data-controlsidebar]').on('click', function () {
changeLayout($(this).data('controlsidebar'))
var slide = !$controlSidebar.options.slide
$controlSidebar.options.slide = slide
if (!slide)
$('.control-sidebar').removeClass('control-sidebar-open')
})
$('[data-sidebarskin="toggle"]').on('click', function () {
var $sidebar = $('.control-sidebar')
if ($sidebar.hasClass('control-sidebar-dark')) {
$sidebar.removeClass('control-sidebar-dark')
$sidebar.addClass('control-sidebar-light')
} else {
$sidebar.removeClass('control-sidebar-light')
$sidebar.addClass('control-sidebar-dark')
}
})
$('[data-enable="expandOnHover"]').on('click', function () {
$(this).attr('disabled', true)
$pushMenu.expandOnHover()
if (!$('body').hasClass('sidebar-collapse'))
$('[data-layout="sidebar-collapse"]').click()
})
// Reset options
if ($('body').hasClass('fixed')) {
$('[data-layout="fixed"]').attr('checked', 'checked')
}
if ($('body').hasClass('layout-boxed')) {
$('[data-layout="layout-boxed"]').attr('checked', 'checked')
}
if ($('body').hasClass('sidebar-collapse')) {
$('[data-layout="sidebar-collapse"]').attr('checked', 'checked')
}
}
// Create the new tab
var $tabPane = $('<div />', {
'id': 'control-sidebar-theme-demo-options-tab',
'class': 'tab-pane active'
})
// Create the tab button
var $tabButton = $('<li />', {'class': 'active'})
.html('<a href=\'#control-sidebar-theme-demo-options-tab\' data-toggle=\'tab\'>'
+ '<i class="fa fa-wrench"></i>'
+ '</a>')
// Add the tab button to the right sidebar tabs
$('[href="#control-sidebar-home-tab"]')
.parent()
.before($tabButton)
// Create the menu
var $demoSettings = $('<div />')
// Layout options
$demoSettings.append(
'<h4 class="control-sidebar-heading">'
+ 'Layout Options'
+ '</h4>'
// Fixed layout
+ '<div class="form-group">'
+ '<label class="control-sidebar-subheading">'
+ '<input type="checkbox"data-layout="fixed"class="pull-right"/> '
+ 'Fixed layout'
+ '</label>'
+ '<p>Activate the fixed layout. You can\'t use fixed and boxed layouts together</p>'
+ '</div>'
// Boxed layout
+ '<div class="form-group">'
+ '<label class="control-sidebar-subheading">'
+ '<input type="checkbox"data-layout="layout-boxed" class="pull-right"/> '
+ 'Boxed Layout'
+ '</label>'
+ '<p>Activate the boxed layout</p>'
+ '</div>'
// Sidebar Toggle
+ '<div class="form-group">'
+ '<label class="control-sidebar-subheading">'
+ '<input type="checkbox"data-layout="sidebar-collapse"class="pull-right"/> '
+ 'Toggle Sidebar'
+ '</label>'
+ '<p>Toggle the left sidebar\'s state (open or collapse)</p>'
+ '</div>'
// Sidebar mini expand on hover toggle
+ '<div class="form-group">'
+ '<label class="control-sidebar-subheading">'
+ '<input type="checkbox"data-enable="expandOnHover"class="pull-right"/> '
+ 'Sidebar Expand on Hover'
+ '</label>'
+ '<p>Let the sidebar mini expand on hover</p>'
+ '</div>'
// Control Sidebar Toggle
+ '<div class="form-group">'
+ '<label class="control-sidebar-subheading">'
+ '<input type="checkbox"data-controlsidebar="control-sidebar-open"class="pull-right"/> '
+ 'Toggle Right Sidebar Slide'
+ '</label>'
+ '<p>Toggle between slide over content and push content effects</p>'
+ '</div>'
// Control Sidebar Skin Toggle
+ '<div class="form-group">'
+ '<label class="control-sidebar-subheading">'
+ '<input type="checkbox"data-sidebarskin="toggle"class="pull-right"/> '
+ 'Toggle Right Sidebar Skin'
+ '</label>'
+ '<p>Toggle between dark and light skins for the right sidebar</p>'
+ '</div>'
)
var $skinsList = $('<ul />', {'class': 'list-unstyled clearfix'})
// Dark sidebar skins
var $skinBlue =
$('<li />', {style: 'float:left; width: 33.33333%; padding: 5px;'})
.append('<a href="javascript:void(0)" data-skin="skin-blue" style="display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">'
+ '<div><span style="display:block; width: 20%; float: left; height: 7px; background: #367fa9"></span><span class="bg-light-blue" style="display:block; width: 80%; float: left; height: 7px;"></span></div>'
+ '<div><span style="display:block; width: 20%; float: left; height: 20px; background: #222d32"></span><span style="display:block; width: 80%; float: left; height: 20px; background: #f4f5f7"></span></div>'
+ '</a>'
+ '<p class="text-center no-margin">Blue</p>')
$skinsList.append($skinBlue)
var $skinBlack =
$('<li />', {style: 'float:left; width: 33.33333%; padding: 5px;'})
.append('<a href="javascript:void(0)" data-skin="skin-black" style="display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">'
+ '<div style="box-shadow: 0 0 2px rgba(0,0,0,0.1)" class="clearfix"><span style="display:block; width: 20%; float: left; height: 7px; background: #fefefe"></span><span style="display:block; width: 80%; float: left; height: 7px; background: #fefefe"></span></div>'
+ '<div><span style="display:block; width: 20%; float: left; height: 20px; background: #222"></span><span style="display:block; width: 80%; float: left; height: 20px; background: #f4f5f7"></span></div>'
+ '</a>'
+ '<p class="text-center no-margin">Black</p>')
$skinsList.append($skinBlack)
var $skinPurple =
$('<li />', {style: 'float:left; width: 33.33333%; padding: 5px;'})
.append('<a href="javascript:void(0)" data-skin="skin-purple" style="display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">'
+ '<div><span style="display:block; width: 20%; float: left; height: 7px;" class="bg-purple-active"></span><span class="bg-purple" style="display:block; width: 80%; float: left; height: 7px;"></span></div>'
+ '<div><span style="display:block; width: 20%; float: left; height: 20px; background: #222d32"></span><span style="display:block; width: 80%; float: left; height: 20px; background: #f4f5f7"></span></div>'
+ '</a>'
+ '<p class="text-center no-margin">Purple</p>')
$skinsList.append($skinPurple)
var $skinGreen =
$('<li />', {style: 'float:left; width: 33.33333%; padding: 5px;'})
.append('<a href="javascript:void(0)" data-skin="skin-green" style="display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">'
+ '<div><span style="display:block; width: 20%; float: left; height: 7px;" class="bg-green-active"></span><span class="bg-green" style="display:block; width: 80%; float: left; height: 7px;"></span></div>'
+ '<div><span style="display:block; width: 20%; float: left; height: 20px; background: #222d32"></span><span style="display:block; width: 80%; float: left; height: 20px; background: #f4f5f7"></span></div>'
+ '</a>'
+ '<p class="text-center no-margin">Green</p>')
$skinsList.append($skinGreen)
var $skinRed =
$('<li />', {style: 'float:left; width: 33.33333%; padding: 5px;'})
.append('<a href="javascript:void(0)" data-skin="skin-red" style="display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">'
+ '<div><span style="display:block; width: 20%; float: left; height: 7px;" class="bg-red-active"></span><span class="bg-red" style="display:block; width: 80%; float: left; height: 7px;"></span></div>'
+ '<div><span style="display:block; width: 20%; float: left; height: 20px; background: #222d32"></span><span style="display:block; width: 80%; float: left; height: 20px; background: #f4f5f7"></span></div>'
+ '</a>'
+ '<p class="text-center no-margin">Red</p>')
$skinsList.append($skinRed)
var $skinYellow =
$('<li />', {style: 'float:left; width: 33.33333%; padding: 5px;'})
.append('<a href="javascript:void(0)" data-skin="skin-yellow" style="display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">'
+ '<div><span style="display:block; width: 20%; float: left; height: 7px;" class="bg-yellow-active"></span><span class="bg-yellow" style="display:block; width: 80%; float: left; height: 7px;"></span></div>'
+ '<div><span style="display:block; width: 20%; float: left; height: 20px; background: #222d32"></span><span style="display:block; width: 80%; float: left; height: 20px; background: #f4f5f7"></span></div>'
+ '</a>'
+ '<p class="text-center no-margin">Yellow</p>')
$skinsList.append($skinYellow)
// Light sidebar skins
var $skinBlueLight =
$('<li />', {style: 'float:left; width: 33.33333%; padding: 5px;'})
.append('<a href="javascript:void(0)" data-skin="skin-blue-light" style="display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">'
+ '<div><span style="display:block; width: 20%; float: left; height: 7px; background: #367fa9"></span><span class="bg-light-blue" style="display:block; width: 80%; float: left; height: 7px;"></span></div>'
+ '<div><span style="display:block; width: 20%; float: left; height: 20px; background: #f9fafc"></span><span style="display:block; width: 80%; float: left; height: 20px; background: #f4f5f7"></span></div>'
+ '</a>'
+ '<p class="text-center no-margin" style="font-size: 12px">Blue Light</p>')
$skinsList.append($skinBlueLight)
var $skinBlackLight =
$('<li />', {style: 'float:left; width: 33.33333%; padding: 5px;'})
.append('<a href="javascript:void(0)" data-skin="skin-black-light" style="display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">'
+ '<div style="box-shadow: 0 0 2px rgba(0,0,0,0.1)" class="clearfix"><span style="display:block; width: 20%; float: left; height: 7px; background: #fefefe"></span><span style="display:block; width: 80%; float: left; height: 7px; background: #fefefe"></span></div>'
+ '<div><span style="display:block; width: 20%; float: left; height: 20px; background: #f9fafc"></span><span style="display:block; width: 80%; float: left; height: 20px; background: #f4f5f7"></span></div>'
+ '</a>'
+ '<p class="text-center no-margin" style="font-size: 12px">Black Light</p>')
$skinsList.append($skinBlackLight)
var $skinPurpleLight =
$('<li />', {style: 'float:left; width: 33.33333%; padding: 5px;'})
.append('<a href="javascript:void(0)" data-skin="skin-purple-light" style="display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">'
+ '<div><span style="display:block; width: 20%; float: left; height: 7px;" class="bg-purple-active"></span><span class="bg-purple" style="display:block; width: 80%; float: left; height: 7px;"></span></div>'
+ '<div><span style="display:block; width: 20%; float: left; height: 20px; background: #f9fafc"></span><span style="display:block; width: 80%; float: left; height: 20px; background: #f4f5f7"></span></div>'
+ '</a>'
+ '<p class="text-center no-margin" style="font-size: 12px">Purple Light</p>')
$skinsList.append($skinPurpleLight)
var $skinGreenLight =
$('<li />', {style: 'float:left; width: 33.33333%; padding: 5px;'})
.append('<a href="javascript:void(0)" data-skin="skin-green-light" style="display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">'
+ '<div><span style="display:block; width: 20%; float: left; height: 7px;" class="bg-green-active"></span><span class="bg-green" style="display:block; width: 80%; float: left; height: 7px;"></span></div>'
+ '<div><span style="display:block; width: 20%; float: left; height: 20px; background: #f9fafc"></span><span style="display:block; width: 80%; float: left; height: 20px; background: #f4f5f7"></span></div>'
+ '</a>'
+ '<p class="text-center no-margin" style="font-size: 12px">Green Light</p>')
$skinsList.append($skinGreenLight)
var $skinRedLight =
$('<li />', {style: 'float:left; width: 33.33333%; padding: 5px;'})
.append('<a href="javascript:void(0)" data-skin="skin-red-light" style="display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">'
+ '<div><span style="display:block; width: 20%; float: left; height: 7px;" class="bg-red-active"></span><span class="bg-red" style="display:block; width: 80%; float: left; height: 7px;"></span></div>'
+ '<div><span style="display:block; width: 20%; float: left; height: 20px; background: #f9fafc"></span><span style="display:block; width: 80%; float: left; height: 20px; background: #f4f5f7"></span></div>'
+ '</a>'
+ '<p class="text-center no-margin" style="font-size: 12px">Red Light</p>')
$skinsList.append($skinRedLight)
var $skinYellowLight =
$('<li />', {style: 'float:left; width: 33.33333%; padding: 5px;'})
.append('<a href="javascript:void(0)" data-skin="skin-yellow-light" style="display: block; box-shadow: 0 0 3px rgba(0,0,0,0.4)" class="clearfix full-opacity-hover">'
+ '<div><span style="display:block; width: 20%; float: left; height: 7px;" class="bg-yellow-active"></span><span class="bg-yellow" style="display:block; width: 80%; float: left; height: 7px;"></span></div>'
+ '<div><span style="display:block; width: 20%; float: left; height: 20px; background: #f9fafc"></span><span style="display:block; width: 80%; float: left; height: 20px; background: #f4f5f7"></span></div>'
+ '</a>'
+ '<p class="text-center no-margin" style="font-size: 12px">Yellow Light</p>')
$skinsList.append($skinYellowLight)
$demoSettings.append('<h4 class="control-sidebar-heading">Skins</h4>')
$demoSettings.append($skinsList)
$tabPane.append($demoSettings)
$('#control-sidebar-home-tab').after($tabPane)
setup()
$('[data-toggle="tooltip"]').tooltip()
})

View File

@@ -0,0 +1,211 @@
/*
* Author: Abdullah A Almsaeed
* Date: 4 Jan 2014
* Description:
* This is a demo file used only for the main dashboard (index.html)
**/
$(function () {
'use strict';
// Make the dashboard widgets sortable Using jquery UI
$('.connectedSortable').sortable({
containment : $('section.content'),
placeholder : 'sort-highlight',
connectWith : '.connectedSortable',
handle : '.box-header, .nav-tabs',
forcePlaceholderSize: true,
zIndex : 999999
});
$('.connectedSortable .box-header, .connectedSortable .nav-tabs-custom').css('cursor', 'move');
// jQuery UI sortable for the todo list
$('.todo-list').sortable({
placeholder : 'sort-highlight',
handle : '.handle',
forcePlaceholderSize: true,
zIndex : 999999
});
// bootstrap WYSIHTML5 - text editor
$('.textarea').wysihtml5();
$('.daterange').daterangepicker({
ranges : {
'Today' : [moment(), moment()],
'Yesterday' : [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
'Last 7 Days' : [moment().subtract(6, 'days'), moment()],
'Last 30 Days': [moment().subtract(29, 'days'), moment()],
'This Month' : [moment().startOf('month'), moment().endOf('month')],
'Last Month' : [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
},
startDate: moment().subtract(29, 'days'),
endDate : moment()
}, function (start, end) {
window.alert('You chose: ' + start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY'));
});
/* jQueryKnob */
$('.knob').knob();
// jvectormap data
var visitorsData = {
US: 398, // USA
SA: 400, // Saudi Arabia
CA: 1000, // Canada
DE: 500, // Germany
FR: 760, // France
CN: 300, // China
AU: 700, // Australia
BR: 600, // Brazil
IN: 800, // India
GB: 320, // Great Britain
RU: 3000 // Russia
};
// World map by jvectormap
$('#world-map').vectorMap({
map : 'world_mill_en',
backgroundColor : 'transparent',
regionStyle : {
initial: {
fill : '#e4e4e4',
'fill-opacity' : 1,
stroke : 'none',
'stroke-width' : 0,
'stroke-opacity': 1
}
},
series : {
regions: [
{
values : visitorsData,
scale : ['#92c1dc', '#ebf4f9'],
normalizeFunction: 'polynomial'
}
]
},
onRegionLabelShow: function (e, el, code) {
if (typeof visitorsData[code] != 'undefined')
el.html(el.html() + ': ' + visitorsData[code] + ' new visitors');
}
});
// Sparkline charts
var myvalues = [1000, 1200, 920, 927, 931, 1027, 819, 930, 1021];
$('#sparkline-1').sparkline(myvalues, {
type : 'line',
lineColor: '#92c1dc',
fillColor: '#ebf4f9',
height : '50',
width : '80'
});
myvalues = [515, 519, 520, 522, 652, 810, 370, 627, 319, 630, 921];
$('#sparkline-2').sparkline(myvalues, {
type : 'line',
lineColor: '#92c1dc',
fillColor: '#ebf4f9',
height : '50',
width : '80'
});
myvalues = [15, 19, 20, 22, 33, 27, 31, 27, 19, 30, 21];
$('#sparkline-3').sparkline(myvalues, {
type : 'line',
lineColor: '#92c1dc',
fillColor: '#ebf4f9',
height : '50',
width : '80'
});
// The Calender
$('#calendar').datepicker();
// SLIMSCROLL FOR CHAT WIDGET
$('#chat-box').slimScroll({
height: '250px'
});
/* Morris.js Charts */
// Sales chart
var area = new Morris.Area({
element : 'revenue-chart',
resize : true,
data : [
{ y: '2011 Q1', item1: 2666, item2: 2666 },
{ y: '2011 Q2', item1: 2778, item2: 2294 },
{ y: '2011 Q3', item1: 4912, item2: 1969 },
{ y: '2011 Q4', item1: 3767, item2: 3597 },
{ y: '2012 Q1', item1: 6810, item2: 1914 },
{ y: '2012 Q2', item1: 5670, item2: 4293 },
{ y: '2012 Q3', item1: 4820, item2: 3795 },
{ y: '2012 Q4', item1: 15073, item2: 5967 },
{ y: '2013 Q1', item1: 10687, item2: 4460 },
{ y: '2013 Q2', item1: 8432, item2: 5713 }
],
xkey : 'y',
ykeys : ['item1', 'item2'],
labels : ['Item 1', 'Item 2'],
lineColors: ['#a0d0e0', '#3c8dbc'],
hideHover : 'auto'
});
var line = new Morris.Line({
element : 'line-chart',
resize : true,
data : [
{ y: '2011 Q1', item1: 2666 },
{ y: '2011 Q2', item1: 2778 },
{ y: '2011 Q3', item1: 4912 },
{ y: '2011 Q4', item1: 3767 },
{ y: '2012 Q1', item1: 6810 },
{ y: '2012 Q2', item1: 5670 },
{ y: '2012 Q3', item1: 4820 },
{ y: '2012 Q4', item1: 15073 },
{ y: '2013 Q1', item1: 10687 },
{ y: '2013 Q2', item1: 8432 }
],
xkey : 'y',
ykeys : ['item1'],
labels : ['Item 1'],
lineColors : ['#efefef'],
lineWidth : 2,
hideHover : 'auto',
gridTextColor : '#fff',
gridStrokeWidth : 0.4,
pointSize : 4,
pointStrokeColors: ['#efefef'],
gridLineColor : '#efefef',
gridTextFamily : 'Open Sans',
gridTextSize : 10
});
// Donut Chart
var donut = new Morris.Donut({
element : 'sales-chart',
resize : true,
colors : ['#3c8dbc', '#f56954', '#00a65a'],
data : [
{ label: 'Download Sales', value: 12 },
{ label: 'In-Store Sales', value: 30 },
{ label: 'Mail-Order Sales', value: 20 }
],
hideHover: 'auto'
});
// Fix for charts under tabs
$('.box ul.nav a').on('shown.bs.tab', function () {
area.redraw();
donut.redraw();
line.redraw();
});
/* The todo list plugin */
$('.todo-list').todoList({
onCheck : function () {
window.console.log($(this), 'The element has been checked');
},
onUnCheck: function () {
window.console.log($(this), 'The element has been unchecked');
}
});
});

View File

@@ -0,0 +1,274 @@
$(function () {
'use strict';
/* ChartJS
* -------
* Here we will create a few charts using ChartJS
*/
// -----------------------
// - MONTHLY SALES CHART -
// -----------------------
// Get context with jQuery - using jQuery's .get() method.
var salesChartCanvas = $('#salesChart').get(0).getContext('2d');
// This will get the first returned node in the jQuery collection.
var salesChart = new Chart(salesChartCanvas);
var salesChartData = {
labels : ['January', 'February', 'March', 'April', 'May', 'June', 'July'],
datasets: [
{
label : 'Electronics',
fillColor : 'rgb(210, 214, 222)',
strokeColor : 'rgb(210, 214, 222)',
pointColor : 'rgb(210, 214, 222)',
pointStrokeColor : '#c1c7d1',
pointHighlightFill : '#fff',
pointHighlightStroke: 'rgb(220,220,220)',
data : [65, 59, 80, 81, 56, 55, 40]
},
{
label : 'Digital Goods',
fillColor : 'rgba(60,141,188,0.9)',
strokeColor : 'rgba(60,141,188,0.8)',
pointColor : '#3b8bba',
pointStrokeColor : 'rgba(60,141,188,1)',
pointHighlightFill : '#fff',
pointHighlightStroke: 'rgba(60,141,188,1)',
data : [28, 48, 40, 19, 86, 27, 90]
}
]
};
var salesChartOptions = {
// Boolean - If we should show the scale at all
showScale : true,
// Boolean - Whether grid lines are shown across the chart
scaleShowGridLines : false,
// String - Colour of the grid lines
scaleGridLineColor : 'rgba(0,0,0,.05)',
// Number - Width of the grid lines
scaleGridLineWidth : 1,
// Boolean - Whether to show horizontal lines (except X axis)
scaleShowHorizontalLines: true,
// Boolean - Whether to show vertical lines (except Y axis)
scaleShowVerticalLines : true,
// Boolean - Whether the line is curved between points
bezierCurve : true,
// Number - Tension of the bezier curve between points
bezierCurveTension : 0.3,
// Boolean - Whether to show a dot for each point
pointDot : false,
// Number - Radius of each point dot in pixels
pointDotRadius : 4,
// Number - Pixel width of point dot stroke
pointDotStrokeWidth : 1,
// Number - amount extra to add to the radius to cater for hit detection outside the drawn point
pointHitDetectionRadius : 20,
// Boolean - Whether to show a stroke for datasets
datasetStroke : true,
// Number - Pixel width of dataset stroke
datasetStrokeWidth : 2,
// Boolean - Whether to fill the dataset with a color
datasetFill : true,
// String - A legend template
legendTemplate : '<ul class=\'<%=name.toLowerCase()%>-legend\'><% for (var i=0; i<datasets.length; i++){%><li><span style=\'background-color:<%=datasets[i].lineColor%>\'></span><%=datasets[i].label%></li><%}%></ul>',
// Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container
maintainAspectRatio : true,
// Boolean - whether to make the chart responsive to window resizing
responsive : true
};
// Create the line chart
salesChart.Line(salesChartData, salesChartOptions);
// ---------------------------
// - END MONTHLY SALES CHART -
// ---------------------------
// -------------
// - PIE CHART -
// -------------
// Get context with jQuery - using jQuery's .get() method.
var pieChartCanvas = $('#pieChart').get(0).getContext('2d');
var pieChart = new Chart(pieChartCanvas);
var PieData = [
{
value : 700,
color : '#f56954',
highlight: '#f56954',
label : 'Chrome'
},
{
value : 500,
color : '#00a65a',
highlight: '#00a65a',
label : 'IE'
},
{
value : 400,
color : '#f39c12',
highlight: '#f39c12',
label : 'FireFox'
},
{
value : 600,
color : '#00c0ef',
highlight: '#00c0ef',
label : 'Safari'
},
{
value : 300,
color : '#3c8dbc',
highlight: '#3c8dbc',
label : 'Opera'
},
{
value : 100,
color : '#d2d6de',
highlight: '#d2d6de',
label : 'Navigator'
}
];
var pieOptions = {
// Boolean - Whether we should show a stroke on each segment
segmentShowStroke : true,
// String - The colour of each segment stroke
segmentStrokeColor : '#fff',
// Number - The width of each segment stroke
segmentStrokeWidth : 1,
// Number - The percentage of the chart that we cut out of the middle
percentageInnerCutout: 50, // This is 0 for Pie charts
// Number - Amount of animation steps
animationSteps : 100,
// String - Animation easing effect
animationEasing : 'easeOutBounce',
// Boolean - Whether we animate the rotation of the Doughnut
animateRotate : true,
// Boolean - Whether we animate scaling the Doughnut from the centre
animateScale : false,
// Boolean - whether to make the chart responsive to window resizing
responsive : true,
// Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container
maintainAspectRatio : false,
// String - A legend template
legendTemplate : '<ul class=\'<%=name.toLowerCase()%>-legend\'><% for (var i=0; i<segments.length; i++){%><li><span style=\'background-color:<%=segments[i].fillColor%>\'></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>',
// String - A tooltip template
tooltipTemplate : '<%=value %> <%=label%> users'
};
// Create pie or douhnut chart
// You can switch between pie and douhnut using the method below.
pieChart.Doughnut(PieData, pieOptions);
// -----------------
// - END PIE CHART -
// -----------------
/* jVector Maps
* ------------
* Create a world map with markers
*/
$('#world-map-markers').vectorMap({
map : 'world_mill_en',
normalizeFunction: 'polynomial',
hoverOpacity : 0.7,
hoverColor : false,
backgroundColor : 'transparent',
regionStyle : {
initial : {
fill : 'rgba(210, 214, 222, 1)',
'fill-opacity' : 1,
stroke : 'none',
'stroke-width' : 0,
'stroke-opacity': 1
},
hover : {
'fill-opacity': 0.7,
cursor : 'pointer'
},
selected : {
fill: 'yellow'
},
selectedHover: {}
},
markerStyle : {
initial: {
fill : '#00a65a',
stroke: '#111'
}
},
markers : [
{ latLng: [41.90, 12.45], name: 'Vatican City' },
{ latLng: [43.73, 7.41], name: 'Monaco' },
{ latLng: [-0.52, 166.93], name: 'Nauru' },
{ latLng: [-8.51, 179.21], name: 'Tuvalu' },
{ latLng: [43.93, 12.46], name: 'San Marino' },
{ latLng: [47.14, 9.52], name: 'Liechtenstein' },
{ latLng: [7.11, 171.06], name: 'Marshall Islands' },
{ latLng: [17.3, -62.73], name: 'Saint Kitts and Nevis' },
{ latLng: [3.2, 73.22], name: 'Maldives' },
{ latLng: [35.88, 14.5], name: 'Malta' },
{ latLng: [12.05, -61.75], name: 'Grenada' },
{ latLng: [13.16, -61.23], name: 'Saint Vincent and the Grenadines' },
{ latLng: [13.16, -59.55], name: 'Barbados' },
{ latLng: [17.11, -61.85], name: 'Antigua and Barbuda' },
{ latLng: [-4.61, 55.45], name: 'Seychelles' },
{ latLng: [7.35, 134.46], name: 'Palau' },
{ latLng: [42.5, 1.51], name: 'Andorra' },
{ latLng: [14.01, -60.98], name: 'Saint Lucia' },
{ latLng: [6.91, 158.18], name: 'Federated States of Micronesia' },
{ latLng: [1.3, 103.8], name: 'Singapore' },
{ latLng: [1.46, 173.03], name: 'Kiribati' },
{ latLng: [-21.13, -175.2], name: 'Tonga' },
{ latLng: [15.3, -61.38], name: 'Dominica' },
{ latLng: [-20.2, 57.5], name: 'Mauritius' },
{ latLng: [26.02, 50.55], name: 'Bahrain' },
{ latLng: [0.33, 6.73], name: 'São Tomé and Príncipe' }
]
});
/* SPARKLINE CHARTS
* ----------------
* Create a inline charts with spark line
*/
// -----------------
// - SPARKLINE BAR -
// -----------------
$('.sparkbar').each(function () {
var $this = $(this);
$this.sparkline('html', {
type : 'bar',
height : $this.data('height') ? $this.data('height') : '30',
barColor: $this.data('color')
});
});
// -----------------
// - SPARKLINE PIE -
// -----------------
$('.sparkpie').each(function () {
var $this = $(this);
$this.sparkline('html', {
type : 'pie',
height : $this.data('height') ? $this.data('height') : '90',
sliceColors: $this.data('color')
});
});
// ------------------
// - SPARKLINE LINE -
// ------------------
$('.sparkline').each(function () {
var $this = $(this);
$this.sparkline('html', {
type : 'line',
height : $this.data('height') ? $this.data('height') : '90',
width : '100%',
lineColor: $this.data('linecolor'),
fillColor: $this.data('fillcolor'),
spotColor: $this.data('spotcolor')
});
});
});

View File

@@ -0,0 +1,88 @@
/* drawingboard.js v0.4.6 - https://github.com/Leimi/drawingboard.js
* Copyright (c) 2015 Emmanuel Pelletier
* Licensed MIT */
.drawing-board, .drawing-board * { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; }
.drawing-board-utils-hidden, .drawing-board-controls-hidden { display: none !important; }
.drawing-board { position: relative; display: block; }
.drawing-board-canvas-wrapper { position: relative; margin: 0; border: 1px solid #ddd; }
.drawing-board-canvas { position: absolute; top: 0; left: 0; z-index: 10; width: auto; }
.drawing-board-canvas { cursor: crosshair; z-index: 20; }
.drawing-board-cursor { position: absolute; top: 0; left: 0; pointer-events: none; border-radius: 50%; background: #ccc; background: rgba(0, 0, 0, 0.2); z-index: 30; }
.drawing-board-control > button, .drawing-board-control-colors-rainbows, .drawing-board-control-size .drawing-board-control-inner, .drawing-board-control-size-dropdown { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; overflow: hidden; border: none; background-color: #eee; padding: 2px 4px; border: 1px solid #ccc; box-shadow: 0 1px 3px -2px #121212, inset 0 2px 5px 0 rgba(255, 255, 255, 0.3); -webkit-box-shadow: 0 1px 3px -2px #121212, inset 0 2px 5px 0 rgba(255, 255, 255, 0.3); height: 28px; }
.drawing-board-control > button { cursor: pointer; min-width: 28px; line-height: 14px; }
.drawing-board-control > button:hover, .drawing-board-control > button:focus { background-color: #ddd; }
.drawing-board-control > button:active, .drawing-board-control > button.active { box-shadow: inset 0 1px 2px 0 rgba(0, 0, 0, 0.2); -webkit-box-shadow: inset 0 1px 2px 0 rgba(0, 0, 0, 0.2); background-color: #ddd; }
.drawing-board-control > button[disabled] { color: gray; }
.drawing-board-control > button[disabled]:hover, .drawing-board-control > button[disabled]:focus, .drawing-board-control > button[disabled]:active, .drawing-board-control > button[disabled].active { background-color: #eee; box-shadow: 0 1px 3px -2px #121212, inset 0 2px 5px 0 rgba(255, 255, 255, 0.3); -webkit-box-shadow: 0 1px 3px -2px #121212, inset 0 2px 5px 0 rgba(255, 255, 255, 0.3); cursor: default; }
.drawing-board-controls { margin: 0 auto; text-align: center; font-size: 0; display: table; border-spacing: 9.33333px 0; position: relative; min-height: 28px; }
.drawing-board-controls[data-align="left"] { margin: 0; left: -9.33333px; }
.drawing-board-controls[data-align="right"] { margin: 0 0 0 auto; right: -9.33333px; }
.drawing-board-canvas-wrapper + .drawing-board-controls, .drawing-board-controls + .drawing-board-canvas-wrapper { margin-top: 5px; }
.drawing-board-controls-hidden { height: 0; min-height: 0; padding: 0; margin: 0; border: 0; }
.drawing-board-control { display: table-cell; border-collapse: separate; vertical-align: middle; font-size: 16px; height: 100%; }
.drawing-board-control-inner { position: relative; height: 100%; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
.drawing-board-control > button { margin: 0; vertical-align: middle; }
.drawing-board-control-colors { font-size: 0; line-height: 0; }
.drawing-board-control-colors-current { border: 1px solid #ccc; cursor: pointer; display: inline-block; width: 26px; height: 26px; }
.drawing-board-control-colors-rainbows { display: inline-block; margin-left: 5px; position: absolute; left: 0; top: 33px; margin-left: 0; z-index: 100; width: 250px; height: auto; padding: 4px; }
.drawing-board-control-colors-rainbow { height: 18px; }
.drawing-board-control-colors-picker:first-child { margin-right: 5px; }
.drawing-board-control-colors-picker { display: inline-block; width: 18px; height: 18px; cursor: pointer; }
.drawing-board-control-colors-picker[data-color="rgba(255, 255, 255, 1)"] { width: 16px; height: 17px; border: 1px solid #ccc; border-bottom: none; }
.drawing-board-control-colors-picker:hover { width: 16px; height: 16px; border: 1px solid #555; }
.drawing-board-control-drawingmode > button { margin-right: 2px; }
.drawing-board-control-drawingmode > button:last-child { margin-right: 0; }
.drawing-board-control-drawingmode-pencil-button { overflow: hidden; *text-indent: -9999px; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAe9JREFUeNpiZAACVlFRBhYREQZcQPnbNwa3N28YlL5+ZfgLFfvPwGD9m4FhIgsDHuAO0gTUDNKIBvyBmqt/MTDMY8Gl0f31azD7L6oUIxCnAzWmAPHBfwwM01AMUAV6JfPQIVwOYgVqqPnFyOjz6///O38YGKpAgmAD1OXlGdTk5PD5hgeouZudj8/uy9evP/78/dsFFPsJNiAoKIiBABAHap4oLi9v8fTNm48//v7NBwbgWZgkE7rqt8DY+A8JZRBW+cfIuEDT0NDlzadP3z98/doPFDuCrB7TAGFhBqCNIGwM9OcKUzs7+xdv3355+f79VqDYAiTDwZgJh7ONgYpnOvn4GL949erT7UePdgL5JVCD4fgBLBBxaX74+PG789evnwby0/8jKXgExIeB+CG6Af///1e9Ki9vFSAkZPzoyZPPJy9evA9MB77/sWiEARZkzV+/fvXYtGnTpG3btj28EBT0BqjZ5D8OjXCwPksUhA1Wpggf/PHjx/9169Y9EBERaUlgZmaIAcrLE4rk5sIqBqDmlefnRPzfWGX5EaSZm5ubgRloADGA5QZ3RgK7gESY4PMNn9ZtObPpzZvfU4DiYkiB/RcHG+S7fyxAMH/lFU2GOZd2bLx18/cEUMoD4j9I+DcS/RtJHGTYf4AAAwAxaOMYHjxKFwAAAABJRU5ErkJggg=='); background-position: 50% 50%; background-repeat: no-repeat; }
.drawing-board-control-drawingmode-pencil-button:before { content: ""; display: block; width: 0; height: 100%; }
.drawing-board-control-drawingmode-eraser-button { overflow: hidden; *text-indent: -9999px; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAkpJREFUeNp0kk+IElEcx39vFBc9+OfQRTAwzFt4CaYOKStj6MoeculStzoIQSB4kCVckmDx4iGCXWYJIqjoVOzO1l4qT1F7WfBWHvxzDPyTB3XUmXn93suRybUffHmP997n9/cRsFgwGARJkiAcDsPlwgEIeEZQAhCRAkgAlOD6SQP4rgMFDWVnYCAQgFgsBqFQCBwOByzZNQOotPHx1RNCCCipu6bfb+zSnslkeOQVILPrBkAirbws9btdTEWAzZPXpfepOzaeGMBXwe/3w3+MwTc3Dl+UeghTiskbBvR6Pbh18mZHB0jjmxvCKhIfR37s3r+Sevf8ca/T4TBF2HTSODuDxP7uNjrZFFbBk8lEzOVyspa4ykGYw2zfbTb/7ilvok1YhlVVFfP5vDydTkHXdXDdlhZOOnPY4/HA0YPtp3h6LFjh8XgsFgoFGTPgsKm1zDr8ajTQh8Fh5eGjZzjGI8yjKlgjF4tFGdd/YKYmRja24hw+zu3sYe2HiH3hYzQjl8tleTQanWtou93G6Qngdrth6+1+9h6hTULJZ/PeziJXKhV5OByeg1ut1gJOp9NZTdNOcQ419ot+ggp1qoLdBFmqVmNpm3A8Huewy+Wq1RH8QH9zmBlJJpMRdCIqiiIPBgN+2MCGsW/r8/kgGo1m0fmpzWarseayHlmNeL1eFiWC0cRqtSr3+/3FpSiKHMZtjU1glbFyfKgLTqfzEka9OJvNeDnzz1JnCaFmqOl8ZdJY1SiDOXCiXKg1NtG5DIt0y6ov3dE/AgwAENFWYYLj4mYAAAAASUVORK5CYII='); background-position: 50% 50%; background-repeat: no-repeat; }
.drawing-board-control-drawingmode-eraser-button:before { content: ""; display: block; width: 0; height: 100%; }
.drawing-board-control-drawingmode-filler-button { overflow: hidden; *text-indent: -9999px; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAnNJREFUeNp0k0trE1EUx89MJpNJooYYXBgDNtCKdRPwlbqoCKUtaNVNA0Uo7UbMxoVPEARTXEi+QWfnwn6DEAlEkrSLttTGRiULEQlJ8yChmbzI++E50yTUJA78uMy953/u/557LmOz2WDEZ2m1WrckSRJSqdR2tVrdHQyYebwHtVoNuFHqTqczhQnWKaBYLDoKhcIuzgHDMKBSqeD20qd+LNdsNocSoFhRr9ctpVLJigl4xIIJQizLAmG4cAPa7bYcy9Iug5TL5UYikbD6/X7Rbre/IUcYe3WUW5ZsnQQzW9LpNOPz+UQc5aBM5mgdh7vI9FCCAesW2tnr9YqZTAby+bw8f3AQRP6853n+Ph5hemSCntjj8YjZbFYWx2IxeS2RSEMwuA87O79eqdXquVolK+GxnP0EPbHb7RZJSGABIR6PA11zJHKIR2MhHA5DIPDj7eH3j95KpfK60Wg8Yntil8slkqgnpioLghacTidoNDpEC3q9HnheCc3s1jZeLcW943pirPw/4lKpBkqlDubnl/riycnLsLy88EKj0fhzuRyZv8RFo1E6wpBYkiqy7Z54YmIcVlYeyOKC4mYwJ0nHRaQuM5vNT6hB/iceG7sIq6sPnwmC4MerDkby40AOCCoiddie1Wp92W7zQ2KTyQSLizNP8T0EsPLBbxEDnCj0GkM2qIEwyZRCobizsfH5A1ZXFhuN52F29vpz3HkL574mk8lj24Y5wsHkvjjoX0BOIWc5jruHzbK2ufmzEwpFO3jnDhQv4JoROYdoERVyGjEgZ8iBDlF3FzXo4go6utZ9lftY4N/dXisjR0i1G0ublv8KMAA0ZoUlicxrhwAAAABJRU5ErkJggg=='); background-position: 50% 50%; background-repeat: no-repeat; }
.drawing-board-control-drawingmode-filler-button:before { content: ""; display: block; width: 0; height: 100%; }
.drawing-board-control-navigation > button { font-family: Helvetica, Arial, sans-serif; font-size: 14px; font-weight: bold; margin-right: 2px; }
.drawing-board-control-navigation > button:last-child { margin-right: 0; }
.drawing-board-control-size[data-drawing-board-type="range"] .drawing-board-control-inner { width: 75px; }
.drawing-board-control-size[data-drawing-board-type="dropdown"] .drawing-board-control-inner { overflow: visible; }
.drawing-board-control-size-range-input { position: relative; width: 100%; z-index: 100; margin: 0; padding: 0; border: 0; }
.drawing-board-control-size-range-current, .drawing-board-control-size-dropdown-current span, .drawing-board-control-size-dropdown span { display: block; background: #333; opacity: .8; }
.drawing-board-control-size-range-current { display: inline-block; opacity: .15; position: absolute; pointer-events: none; left: 50%; top: 50%; z-index: 50; }
.drawing-board-control-size-dropdown-current { display: block; height: 100%; width: 40px; overflow: hidden; position: relative; }
.drawing-board-control-size-dropdown-current span { position: absolute; left: 50%; top: 50%; }
.drawing-board-control-size-dropdown { position: absolute; left: -6px; top: 33px; height: auto; list-style-type: none; margin: 0; padding: 0; z-index: 100; }
.drawing-board-control-size-dropdown li { display: block; padding: 4px; margin: 3px 0; min-height: 16px; }
.drawing-board-control-size-dropdown li:hover { background: #ccc; }
.drawing-board-control-size-dropdown span { margin: 0 auto; }
.drawing-board-control-download-button { overflow: hidden; *text-indent: -9999px; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAoBJREFUeNqMkr9PU1EUx7/vR1tQ3yu10hAmTawtBSYSy2YccFOcnDQm/gewOLnj5GYMg4sdXFxkMca4OBAwdUBe/ZkIGFp+9tHXvh/3/fTcAm01aLzJybnn3nM+95tzrnDl6Tb+sibuTmWUWj3C6/Juk+LySUmyvt0FCKKA02ryOCy6LBiu15ngMbZ5DDCNBqIw6gKM+n4nECUJru3glKry8CpjQaHVYmC2rVH82DIMMMdGGARdwJ+SPNdFS9chx+MXDNMp/NzagWNatk/nQU/hiYAoih6FYTBCBs9zUXMCbAhx2OYOv351lPOJ3EwH4LteL6Dcp/Rfu3FrstDyIizt+agpaYxNDU0M9gl4v7Ck+TYrCYLQqZHUyTtdQBiutPSGUflczSXHs5lVKwZdSOBMvwztxVvN0RtzsiyXBFHsAvL5PBSnCpXV2getILFiE2SjspYbuZzPiDSZ2vOXmlvX5yQqTmMfg9ZXqtls1wnT09OHEyAq0aFLg/gSXsSWq9wWk+p9PrCoYTwcijdLOfE7UsEufN9HGIYnT4EnTGIXe1KqtNNIvuNnGamxfi7SgQD/nIJCTbzOPQ/SQh1pud7T4M6W/8qFIw/5WAr5m7Ozsw9UVc069Fls2yJzSC5/lnc9RhaHZVnfSqUnEgXP2oBqtYqBgYG2+mKxmOVADnAcB4yxHgD1RzehKKns/LyV4gUHBweQy+UyRkdH6UKJ6fQDFxcXoWkaXJeRuTgUGCdLQJ9bx72lGZimGWs2m+083oN+2iiFQiGxvLy8RrDzudyltgrG3N8U2G8CrPz4sGYYRqJSqWR4H/jNWbJhUjAWi8XG8R/L87yPpGCVttVfAgwAVpZR+8tZC08AAAAASUVORK5CYII='); background-position: 50% 50%; background-repeat: no-repeat; }
.drawing-board-control-download-button:before { content: ""; display: block; width: 0; height: 100%; }

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,16 @@
/* drawingboard.js v0.4.6 - https://github.com/Leimi/drawingboard.js
* Copyright (c) 2015 Emmanuel Pelletier
* Licensed MIT */
.drawing-board, .drawing-board * { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; }
.drawing-board-utils-hidden { display: none !important; }
.drawing-board { position: relative; display: block; }
.drawing-board-canvas-wrapper { position: relative; margin: 0; border: 1px solid #ddd; }
.drawing-board-canvas { position: absolute; top: 0; left: 0; z-index: 10; width: auto; }
.drawing-board-canvas { cursor: crosshair; z-index: 20; }
.drawing-board-cursor { position: absolute; top: 0; left: 0; pointer-events: none; border-radius: 50%; background: #ccc; background: rgba(0, 0, 0, 0.2); z-index: 30; }

View File

@@ -0,0 +1,971 @@
/* drawingboard.js v0.4.6 - https://github.com/Leimi/drawingboard.js
* Copyright (c) 2015 Emmanuel Pelletier
* Licensed MIT */
(function() {
'use strict';
/**
* SimpleUndo is a very basic javascript undo/redo stack for managing histories of basically anything.
*
* options are: {
* * `provider` : required. a function to call on `save`, which should provide the current state of the historized object through the given "done" callback
* * `maxLength` : the maximum number of items in history
* * `opUpdate` : a function to call to notify of changes in history. Will be called on `save`, `undo`, `redo` and `clear`
* }
*
*/
var SimpleUndo = function(options) {
var settings = options ? options : {};
var defaultOptions = {
provider: function() {
throw new Error("No provider!");
},
maxLength: 30,
onUpdate: function() {}
};
this.provider = (typeof settings.provider != 'undefined') ? settings.provider : defaultOptions.provider;
this.maxLength = (typeof settings.maxLength != 'undefined') ? settings.maxLength : defaultOptions.maxLength;
this.onUpdate = (typeof settings.onUpdate != 'undefined') ? settings.onUpdate : defaultOptions.onUpdate;
this.initialItem = null;
this.clear();
};
function truncate (stack, limit) {
while (stack.length > limit) {
stack.shift();
}
}
SimpleUndo.prototype.initialize = function(initialItem) {
this.stack[0] = initialItem;
this.initialItem = initialItem;
};
SimpleUndo.prototype.clear = function() {
this.stack = [this.initialItem];
this.position = 0;
this.onUpdate();
};
SimpleUndo.prototype.save = function() {
this.provider(function(current) {
truncate(this.stack, this.maxLength);
this.position = Math.min(this.position,this.stack.length - 1);
this.stack = this.stack.slice(0, this.position + 1);
this.stack.push(current);
this.position++;
this.onUpdate();
}.bind(this));
};
SimpleUndo.prototype.undo = function(callback) {
if (this.canUndo()) {
var item = this.stack[--this.position];
this.onUpdate();
if (callback) {
callback(item);
}
}
};
SimpleUndo.prototype.redo = function(callback) {
if (this.canRedo()) {
var item = this.stack[++this.position];
this.onUpdate();
if (callback) {
callback(item);
}
}
};
SimpleUndo.prototype.canUndo = function() {
return this.position > 0;
};
SimpleUndo.prototype.canRedo = function() {
return this.position < this.count();
};
SimpleUndo.prototype.count = function() {
return this.stack.length - 1; // -1 because of initial item
};
//exports
// node module
if (typeof module != 'undefined') {
module.exports = SimpleUndo;
}
// browser global
if (typeof window != 'undefined') {
window.SimpleUndo = SimpleUndo;
}
})();
window.DrawingBoard = typeof DrawingBoard !== "undefined" ? DrawingBoard : {};
DrawingBoard.Utils = {};
/*!
* Tim (lite)
* github.com/premasagar/tim
*//*
A tiny, secure JavaScript micro-templating script.
*/
DrawingBoard.Utils.tpl = (function(){
"use strict";
var start = "{{",
end = "}}",
path = "[a-z0-9_][\\.a-z0-9_]*", // e.g. config.person.name
pattern = new RegExp(start + "\\s*("+ path +")\\s*" + end, "gi"),
undef;
return function(template, data){
// Merge data into the template string
return template.replace(pattern, function(tag, token){
var path = token.split("."),
len = path.length,
lookup = data,
i = 0;
for (; i < len; i++){
lookup = lookup[path[i]];
// Property not found
if (lookup === undef){
throw "tim: '" + path[i] + "' not found in " + tag;
}
// Return the required value
if (i === len - 1){
return lookup;
}
}
});
};
}());
/**
* https://github.com/jeromeetienne/microevent.js
* MicroEvent - to make any js object an event emitter (server or browser)
*
* - pure javascript - server compatible, browser compatible
* - dont rely on the browser doms
* - super simple - you get it immediatly, no mistery, no magic involved
*
* - create a MicroEventDebug with goodies to debug
* - make it safer to use
*/
DrawingBoard.Utils.MicroEvent = function(){};
DrawingBoard.Utils.MicroEvent.prototype = {
bind : function(event, fct){
this._events = this._events || {};
this._events[event] = this._events[event] || [];
this._events[event].push(fct);
},
unbind : function(event, fct){
this._events = this._events || {};
if( event in this._events === false ) return;
this._events[event].splice(this._events[event].indexOf(fct), 1);
},
trigger : function(event /* , args... */){
this._events = this._events || {};
if( event in this._events === false ) return;
for(var i = 0; i < this._events[event].length; i++){
this._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));
}
}
};
//I know.
DrawingBoard.Utils._boxBorderSize = function($el, withPadding, withMargin, direction) {
withPadding = !!withPadding || true;
withMargin = !!withMargin || false;
var width = 0,
props;
if (direction == "width") {
props = ['border-left-width', 'border-right-width'];
if (withPadding) props.push('padding-left', 'padding-right');
if (withMargin) props.push('margin-left', 'margin-right');
} else {
props = ['border-top-width', 'border-bottom-width'];
if (withPadding) props.push('padding-top', 'padding-bottom');
if (withMargin) props.push('margin-top', 'margin-bottom');
}
for (var i = props.length - 1; i >= 0; i--)
width += parseInt($el.css(props[i]).replace('px', ''), 10);
return width;
};
DrawingBoard.Utils.boxBorderWidth = function($el, withPadding, withMargin) {
return DrawingBoard.Utils._boxBorderSize($el, withPadding, withMargin, 'width');
};
DrawingBoard.Utils.boxBorderHeight = function($el, withPadding, withMargin) {
return DrawingBoard.Utils._boxBorderSize($el, withPadding, withMargin, 'height');
};
DrawingBoard.Utils.isColor = function(string) {
if (!string || !string.length) return false;
return (/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i).test(string) || $.inArray(string.substring(0, 3), ['rgb', 'hsl']) !== -1;
};
/**
* Packs an RGB color into a single integer.
*/
DrawingBoard.Utils.RGBToInt = function(r, g, b) {
var c = 0;
c |= (r & 255) << 16;
c |= (g & 255) << 8;
c |= (b & 255);
return c;
};
/**
* Returns informations on the pixel located at (x,y).
*/
DrawingBoard.Utils.pixelAt = function(image, x, y) {
var i = (y * image.width + x) * 4;
var c = DrawingBoard.Utils.RGBToInt(
image.data[i],
image.data[i + 1],
image.data[i + 2]
);
return [
i, // INDEX
x, // X
y, // Y
c // COLOR
];
};
/**
* Compares two colors with the given tolerance (between 0 and 255).
*/
DrawingBoard.Utils.compareColors = function(a, b, tolerance) {
if (tolerance === 0) {
return (a === b);
}
var ra = (a >> 16) & 255, rb = (b >> 16) & 255,
ga = (a >> 8) & 255, gb = (b >> 8) & 255,
ba = a & 255, bb = b & 255;
return (Math.abs(ra - rb) <= tolerance)
&& (Math.abs(ga - gb) <= tolerance)
&& (Math.abs(ba - bb) <= tolerance);
};
(function() {
var lastTime = 0;
var vendors = ['ms', 'moz', 'webkit', 'o'];
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];
}
}());
window.DrawingBoard = typeof DrawingBoard !== "undefined" ? DrawingBoard : {};
/**
* pass the id of the html element to put the drawing board into
* and some options : {
* controls: array of controls to initialize with the drawingboard. 'Colors', 'Size', and 'Navigation' by default
* instead of simple strings, you can pass an object to define a control opts
* ie ['Color', { Navigation: { reset: false }}]
* controlsPosition: "top left" by default. Define where to put the controls: at the "top" or "bottom" of the canvas, aligned to "left"/"right"/"center"
* background: background of the drawing board. Give a hex color or an image url "#ffffff" (white) by default
* color: pencil color ("#000000" by default)
* size: pencil size (3 by default)
* webStorage: 'session', 'local' or false ('session' by default). store the current drawing in session or local storage and restore it when you come back
* droppable: true or false (false by default). If true, dropping an image on the canvas will include it and allow you to draw on it,
* errorMessage: html string to put in the board's element on browsers that don't support canvas.
* stretchImg: default behavior of image setting on the canvas: set to the canvas width/height or not? false by default
* }
*/
DrawingBoard.Board = function(id, opts) {
this.opts = this.mergeOptions(opts);
this.ev = new DrawingBoard.Utils.MicroEvent();
this.id = id;
this.$el = $(document.getElementById(id));
if (!this.$el.length)
return false;
var tpl = '<div class="drawing-board-canvas-wrapper"></canvas><canvas class="drawing-board-canvas"></canvas><div class="drawing-board-cursor drawing-board-utils-hidden"></div></div>';
if (this.opts.controlsPosition.indexOf("bottom") > -1) tpl += '<div class="drawing-board-controls"></div>';
else tpl = '<div class="drawing-board-controls"></div>' + tpl;
this.$el.addClass('drawing-board').append(tpl);
this.dom = {
$canvasWrapper: this.$el.find('.drawing-board-canvas-wrapper'),
$canvas: this.$el.find('.drawing-board-canvas'),
$cursor: this.$el.find('.drawing-board-cursor'),
$controls: this.$el.find('.drawing-board-controls')
};
$.each(['left', 'right', 'center'], $.proxy(function(n, val) {
if (this.opts.controlsPosition.indexOf(val) > -1) {
this.dom.$controls.attr('data-align', val);
return false;
}
}, this));
this.canvas = this.dom.$canvas.get(0);
this.ctx = this.canvas && this.canvas.getContext && this.canvas.getContext('2d') ? this.canvas.getContext('2d') : null;
this.color = this.opts.color;
if (!this.ctx) {
if (this.opts.errorMessage)
this.$el.html(this.opts.errorMessage);
return false;
}
this.storage = this._getStorage();
this.initHistory();
//init default board values before controls are added (mostly pencil color and size)
this.reset({ webStorage: false, history: false, background: false });
//init controls (they will need the default board values to work like pencil color and size)
this.initControls();
//set board's size after the controls div is added
this.resize();
//reset the board to take all resized space
this.reset({ webStorage: false, history: false, background: true });
this.restoreWebStorage();
this.initDropEvents();
this.initDrawEvents();
};
DrawingBoard.Board.defaultOpts = {
controls: ['Color', 'DrawingMode', 'Size', 'Navigation'],
controlsPosition: "top left",
color: "#000000",
size: 1,
background: "#fff",
eraserColor: "background",
fillTolerance: 100,
fillHack: true, //try to prevent issues with anti-aliasing with a little hack by default
webStorage: 'session',
droppable: false,
enlargeYourContainer: false,
errorMessage: "<p>It seems you use an obsolete browser. <a href=\"http://browsehappy.com/\" target=\"_blank\">Update it</a> to start drawing.</p>",
stretchImg: false //when setting the canvas img, strech the image at the whole canvas size when this opt is true
};
DrawingBoard.Board.prototype = {
mergeOptions: function(opts) {
opts = $.extend({}, DrawingBoard.Board.defaultOpts, opts);
if (!opts.background && opts.eraserColor === "background")
opts.eraserColor = "transparent";
return opts;
},
/**
* Canvas reset/resize methods: put back the canvas to its default values
*
* depending on options, can set color, size, background back to default values
* and store the reseted canvas in webstorage and history queue
*
* resize values depend on the `enlargeYourContainer` option
*/
reset: function(opts) {
opts = $.extend({
color: this.opts.color,
size: this.opts.size,
webStorage: true,
history: true,
background: false
}, opts);
this.setMode('pencil');
if (opts.background) {
this.resetBackground(this.opts.background, $.proxy(function() {
if (opts.history) this.saveHistory();
}, this));
}
if (opts.color) this.setColor(opts.color);
if (opts.size) this.ctx.lineWidth = opts.size;
this.ctx.lineCap = "round";
this.ctx.lineJoin = "round";
// this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.width);
if (opts.webStorage) this.saveWebStorage();
// if opts.background we already dealt with the history
if (opts.history && !opts.background) this.saveHistory();
this.blankCanvas = this.getImg();
this.ev.trigger('board:reset', opts);
},
resetBackground: function(background, callback) {
background = background || this.opts.background;
var bgIsColor = DrawingBoard.Utils.isColor(background);
var prevMode = this.getMode();
this.setMode('pencil');
this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
if (bgIsColor) {
this.ctx.fillStyle = background;
this.ctx.fillRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
this.history.initialize(this.getImg());
if (callback) callback();
} else if (background)
this.setImg(background, {
callback: $.proxy(function() {
this.history.initialize(this.getImg());
if (callback) callback();
}, this)
});
this.setMode(prevMode);
},
resize: function() {
this.dom.$controls.toggleClass('drawing-board-controls-hidden', (!this.controls || !this.controls.length));
var canvasWidth, canvasHeight;
var widths = [
this.$el.width(),
DrawingBoard.Utils.boxBorderWidth(this.$el),
DrawingBoard.Utils.boxBorderWidth(this.dom.$canvasWrapper, true, true)
];
var heights = [
this.$el.height(),
DrawingBoard.Utils.boxBorderHeight(this.$el),
this.dom.$controls.height(),
DrawingBoard.Utils.boxBorderHeight(this.dom.$controls, false, true),
DrawingBoard.Utils.boxBorderHeight(this.dom.$canvasWrapper, true, true)
];
var that = this;
var sum = function(values, multiplier) { //make the sum of all array values
multiplier = multiplier || 1;
var res = values[0];
for (var i = 1; i < values.length; i++) {
res = res + (values[i]*multiplier);
}
return res;
};
var sub = function(values) { return sum(values, -1); }; //substract all array values from the first one
if (this.opts.enlargeYourContainer) {
canvasWidth = this.$el.width();
canvasHeight = this.$el.height();
this.$el.width( sum(widths) );
this.$el.height( sum(heights) );
} else {
canvasWidth = sub(widths);
canvasHeight = sub(heights);
}
this.dom.$canvasWrapper.css('width', canvasWidth + 'px');
this.dom.$canvasWrapper.css('height', canvasHeight + 'px');
this.dom.$canvas.css('width', canvasWidth + 'px');
this.dom.$canvas.css('height', canvasHeight + 'px');
this.canvas.width = canvasWidth;
this.canvas.height = canvasHeight;
},
/**
* Controls:
* the drawing board can has various UI elements to control it.
* one control is represented by a class in the namespace DrawingBoard.Control
* it must have a $el property (jQuery object), representing the html element to append on the drawing board at initialization.
*
*/
initControls: function() {
this.controls = [];
if (!this.opts.controls.length || !DrawingBoard.Control) return false;
for (var i = 0; i < this.opts.controls.length; i++) {
var c = null;
if (typeof this.opts.controls[i] == "string")
c = new window['DrawingBoard']['Control'][this.opts.controls[i]](this);
else if (typeof this.opts.controls[i] == "object") {
for (var controlName in this.opts.controls[i]) break;
c = new window['DrawingBoard']['Control'][controlName](this, this.opts.controls[i][controlName]);
}
if (c) {
this.addControl(c);
}
}
},
//add a new control or an existing one at the position you want in the UI
//to add a totally new control, you can pass a string with the js class as 1st parameter and control options as 2nd ie "addControl('Navigation', { reset: false }"
//the last parameter (2nd or 3rd depending on the situation) is always the position you want to place the control at
addControl: function(control, optsOrPos, pos) {
if (typeof control !== "string" && (typeof control !== "object" || !control instanceof DrawingBoard.Control))
return false;
var opts = typeof optsOrPos == "object" ? optsOrPos : {};
pos = pos ? pos*1 : (typeof optsOrPos == "number" ? optsOrPos : null);
if (typeof control == "string")
control = new window['DrawingBoard']['Control'][control](this, opts);
if (pos)
this.dom.$controls.children().eq(pos).before(control.$el);
else
this.dom.$controls.append(control.$el);
if (!this.controls)
this.controls = [];
this.controls.push(control);
this.dom.$controls.removeClass('drawing-board-controls-hidden');
},
/**
* History methods: undo and redo drawed lines
*/
initHistory: function() {
this.history = new SimpleUndo({
maxLength: 30,
provider: $.proxy(function(done) {
done(this.getImg());
}, this),
onUpdate: $.proxy(function() {
this.ev.trigger('historyNavigation');
}, this)
});
},
saveHistory: function() {
this.history.save();
},
restoreHistory: function(image) {
this.setImg(image, {
callback: $.proxy(function() {
this.saveWebStorage();
}, this)
});
},
goBackInHistory: function() {
this.history.undo($.proxy(this.restoreHistory, this));
},
goForthInHistory: function() {
this.history.redo($.proxy(this.restoreHistory, this));
},
/**
* Image methods: you can directly put an image on the canvas, get it in base64 data url or start a download
*/
setImg: function(src, opts) {
opts = $.extend({
stretch: this.opts.stretchImg,
callback: null
}, opts);
var ctx = this.ctx;
var img = new Image();
var oldGCO = ctx.globalCompositeOperation;
img.onload = function() {
ctx.globalCompositeOperation = "source-over";
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
if (opts.stretch) {
ctx.drawImage(img, 0, 0, ctx.canvas.width, ctx.canvas.height);
} else {
ctx.drawImage(img, 0, 0);
}
ctx.globalCompositeOperation = oldGCO;
if (opts.callback) {
opts.callback();
}
};
img.src = src;
},
getImg: function() {
return this.canvas.toDataURL("image/png");
},
downloadImg: function() {
var img = this.getImg();
img = img.replace("image/png", "image/octet-stream");
window.location.href = img;
},
/**
* WebStorage handling : save and restore to local or session storage
*/
saveWebStorage: function() {
if (window[this.storage]) {
window[this.storage].setItem('drawing-board-' + this.id, this.getImg());
this.ev.trigger('board:save' + this.storage.charAt(0).toUpperCase() + this.storage.slice(1), this.getImg());
}
},
restoreWebStorage: function() {
if (window[this.storage] && window[this.storage].getItem('drawing-board-' + this.id) !== null) {
this.setImg(window[this.storage].getItem('drawing-board-' + this.id));
this.ev.trigger('board:restore' + this.storage.charAt(0).toUpperCase() + this.storage.slice(1), window[this.storage].getItem('drawing-board-' + this.id));
}
},
clearWebStorage: function() {
if (window[this.storage] && window[this.storage].getItem('drawing-board-' + this.id) !== null) {
window[this.storage].removeItem('drawing-board-' + this.id);
this.ev.trigger('board:clear' + this.storage.charAt(0).toUpperCase() + this.storage.slice(1));
}
},
_getStorage: function() {
if (!this.opts.webStorage || !(this.opts.webStorage === 'session' || this.opts.webStorage === 'local')) return false;
return this.opts.webStorage + 'Storage';
},
/**
* Drop an image on the canvas to draw on it
*/
initDropEvents: function() {
if (!this.opts.droppable)
return false;
this.dom.$canvas.on('dragover dragenter drop', function(e) {
e.stopPropagation();
e.preventDefault();
});
this.dom.$canvas.on('drop', $.proxy(this._onCanvasDrop, this));
},
_onCanvasDrop: function(e) {
e = e.originalEvent ? e.originalEvent : e;
var files = e.dataTransfer.files;
if (!files || !files.length || files[0].type.indexOf('image') == -1 || !window.FileReader)
return false;
var fr = new FileReader();
fr.readAsDataURL(files[0]);
fr.onload = $.proxy(function(ev) {
this.setImg(ev.target.result, {
callback: $.proxy(function() {
this.saveHistory();
}, this)
});
this.ev.trigger('board:imageDropped', ev.target.result);
this.ev.trigger('board:userAction');
}, this);
},
/**
* set and get current drawing mode
*
* possible modes are "pencil" (draw normally), "eraser" (draw transparent, like, erase, you know), "filler" (paint can)
*/
setMode: function(newMode, silent) {
silent = silent || false;
newMode = newMode || 'pencil';
this.ev.unbind('board:startDrawing', $.proxy(this.fill, this));
if (this.opts.eraserColor === "transparent")
this.ctx.globalCompositeOperation = newMode === "eraser" ? "destination-out" : "source-over";
else {
if (newMode === "eraser") {
if (this.opts.eraserColor === "background" && DrawingBoard.Utils.isColor(this.opts.background))
this.ctx.strokeStyle = this.opts.background;
else if (DrawingBoard.Utils.isColor(this.opts.eraserColor))
this.ctx.strokeStyle = this.opts.eraserColor;
} else if (!this.mode || this.mode === "eraser") {
this.ctx.strokeStyle = this.color;
}
if (newMode === "filler")
this.ev.bind('board:startDrawing', $.proxy(this.fill, this));
}
this.mode = newMode;
if (!silent)
this.ev.trigger('board:mode', this.mode);
},
getMode: function() {
return this.mode || "pencil";
},
setColor: function(color) {
var that = this;
color = color || this.color;
if (!DrawingBoard.Utils.isColor(color))
return false;
this.color = color;
if (this.opts.eraserColor !== "transparent" && this.mode === "eraser") {
var setStrokeStyle = function(mode) {
if (mode !== "eraser")
that.strokeStyle = that.color;
that.ev.unbind('board:mode', setStrokeStyle);
};
this.ev.bind('board:mode', setStrokeStyle);
} else
this.ctx.strokeStyle = this.color;
},
/**
* Fills an area with the current stroke color.
*/
fill: function(e) {
if (this.getImg() === this.blankCanvas) {
this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
this.ctx.fillStyle = this.color;
this.ctx.fillRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
return;
}
var img = this.ctx.getImageData(0, 0, this.canvas.width, this.canvas.height);
// constants identifying pixels components
var INDEX = 0, X = 1, Y = 2, COLOR = 3;
// target color components
var stroke = this.ctx.strokeStyle;
var r = parseInt(stroke.substr(1, 2), 16);
var g = parseInt(stroke.substr(3, 2), 16);
var b = parseInt(stroke.substr(5, 2), 16);
// starting point
var start = DrawingBoard.Utils.pixelAt(img, parseInt(e.coords.x, 10), parseInt(e.coords.y, 10));
var startColor = start[COLOR];
var tolerance = this.opts.fillTolerance;
var useHack = this.opts.fillHack; //see https://github.com/Leimi/drawingboard.js/pull/38
// no need to continue if starting and target colors are the same
if (DrawingBoard.Utils.compareColors(startColor, DrawingBoard.Utils.RGBToInt(r, g, b), tolerance))
return;
// pixels to evaluate
var queue = [start];
// loop vars
var pixel, x, y;
var maxX = img.width - 1;
var maxY = img.height - 1;
function updatePixelColor(pixel) {
img.data[pixel[INDEX]] = r;
img.data[pixel[INDEX] + 1] = g;
img.data[pixel[INDEX] + 2] = b;
}
while ((pixel = queue.pop())) {
if (useHack)
updatePixelColor(pixel);
if (DrawingBoard.Utils.compareColors(pixel[COLOR], startColor, tolerance)) {
if (!useHack)
updatePixelColor(pixel);
if (pixel[X] > 0) // west
queue.push(DrawingBoard.Utils.pixelAt(img, pixel[X] - 1, pixel[Y]));
if (pixel[X] < maxX) // east
queue.push(DrawingBoard.Utils.pixelAt(img, pixel[X] + 1, pixel[Y]));
if (pixel[Y] > 0) // north
queue.push(DrawingBoard.Utils.pixelAt(img, pixel[X], pixel[Y] - 1));
if (pixel[Y] < maxY) // south
queue.push(DrawingBoard.Utils.pixelAt(img, pixel[X], pixel[Y] + 1));
}
}
this.ctx.putImageData(img, 0, 0);
},
/**
* Drawing handling, with mouse or touch
*/
initDrawEvents: function() {
this.isDrawing = false;
this.isMouseHovering = false;
this.coords = {};
this.coords.old = this.coords.current = this.coords.oldMid = { x: 0, y: 0 };
this.dom.$canvas.on('mousedown touchstart', $.proxy(function(e) {
this._onInputStart(e, this._getInputCoords(e) );
}, this));
this.dom.$canvas.on('mousemove touchmove', $.proxy(function(e) {
this._onInputMove(e, this._getInputCoords(e) );
}, this));
this.dom.$canvas.on('mousemove', $.proxy(function(e) {
}, this));
this.dom.$canvas.on('mouseup touchend', $.proxy(function(e) {
this._onInputStop(e, this._getInputCoords(e) );
}, this));
this.dom.$canvas.on('mouseover', $.proxy(function(e) {
this._onMouseOver(e, this._getInputCoords(e) );
}, this));
this.dom.$canvas.on('mouseout', $.proxy(function(e) {
this._onMouseOut(e, this._getInputCoords(e) );
}, this));
$('body').on('mouseup touchend', $.proxy(function(e) {
this.isDrawing = false;
}, this));
if (window.requestAnimationFrame) requestAnimationFrame( $.proxy(this.draw, this) );
},
draw: function() {
//if the pencil size is big (>10), the small crosshair makes a friend: a circle of the size of the pencil
//todo: have the circle works on every browser - it currently should be added only when CSS pointer-events are supported
//we assume that if requestAnimationFrame is supported, pointer-events is too, but this is terribad.
if (window.requestAnimationFrame && this.ctx.lineWidth > 10 && this.isMouseHovering) {
this.dom.$cursor.css({ width: this.ctx.lineWidth + 'px', height: this.ctx.lineWidth + 'px' });
var transform = DrawingBoard.Utils.tpl("translateX({{x}}px) translateY({{y}}px)", { x: this.coords.current.x-(this.ctx.lineWidth/2), y: this.coords.current.y-(this.ctx.lineWidth/2) });
this.dom.$cursor.css({ 'transform': transform, '-webkit-transform': transform, '-ms-transform': transform });
this.dom.$cursor.removeClass('drawing-board-utils-hidden');
} else {
this.dom.$cursor.addClass('drawing-board-utils-hidden');
}
if (this.isDrawing) {
var currentMid = this._getMidInputCoords(this.coords.current);
this.ctx.beginPath();
this.ctx.moveTo(currentMid.x, currentMid.y);
this.ctx.quadraticCurveTo(this.coords.old.x, this.coords.old.y, this.coords.oldMid.x, this.coords.oldMid.y);
this.ctx.stroke();
this.coords.old = this.coords.current;
this.coords.oldMid = currentMid;
}
if (window.requestAnimationFrame) requestAnimationFrame( $.proxy(function() { this.draw(); }, this) );
},
_onInputStart: function(e, coords) {
this.coords.current = this.coords.old = coords;
this.coords.oldMid = this._getMidInputCoords(coords);
this.isDrawing = true;
if (!window.requestAnimationFrame) this.draw();
this.ev.trigger('board:startDrawing', {e: e, coords: coords});
e.stopPropagation();
e.preventDefault();
},
_onInputMove: function(e, coords) {
this.coords.current = coords;
this.ev.trigger('board:drawing', {e: e, coords: coords});
if (!window.requestAnimationFrame) this.draw();
e.stopPropagation();
e.preventDefault();
},
_onInputStop: function(e, coords) {
if (this.isDrawing && (!e.touches || e.touches.length === 0)) {
this.isDrawing = false;
this.saveWebStorage();
this.saveHistory();
this.ev.trigger('board:stopDrawing', {e: e, coords: coords});
this.ev.trigger('board:userAction');
e.stopPropagation();
e.preventDefault();
}
},
_onMouseOver: function(e, coords) {
this.isMouseHovering = true;
this.coords.old = this._getInputCoords(e);
this.coords.oldMid = this._getMidInputCoords(this.coords.old);
this.ev.trigger('board:mouseOver', {e: e, coords: coords});
},
_onMouseOut: function(e, coords) {
this.isMouseHovering = false;
this.ev.trigger('board:mouseOut', {e: e, coords: coords});
},
_getInputCoords: function(e) {
e = e.originalEvent ? e.originalEvent : e;
var
rect = this.canvas.getBoundingClientRect(),
width = this.dom.$canvas.width(),
height = this.dom.$canvas.height()
;
var x, y;
if (e.touches && e.touches.length == 1) {
x = e.touches[0].pageX;
y = e.touches[0].pageY;
} else {
x = e.pageX;
y = e.pageY;
}
x = x - this.dom.$canvas.offset().left;
y = y - this.dom.$canvas.offset().top;
x *= (width / rect.width);
y *= (height / rect.height);
return {
x: x,
y: y
};
},
_getMidInputCoords: function(coords) {
return {
x: this.coords.old.x + coords.x>>1,
y: this.coords.old.y + coords.y>>1
};
}
};

View File

@@ -0,0 +1,5 @@
/* drawingboard.js v0.4.6 - https://github.com/Leimi/drawingboard.js
* Copyright (c) 2015 Emmanuel Pelletier
* Licensed MIT */
.drawing-board,.drawing-board *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.drawing-board-utils-hidden{display:none!important}.drawing-board{position:relative;display:block}.drawing-board-canvas-wrapper{position:relative;margin:0;border:1px solid #ddd}.drawing-board-canvas{position:absolute;top:0;left:0;width:auto;cursor:crosshair;z-index:20}.drawing-board-cursor{position:absolute;top:0;left:0;pointer-events:none;border-radius:50%;background:#ccc;background:rgba(0,0,0,.2);z-index:30}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Some files were not shown because too many files have changed in this diff Show More