80 Commits

Author SHA1 Message Date
d7a2fb5494 YAXX#91339 in de grouped fiatteringslijst door kunnen klikken naar de gescopede zoekpagina
svn path=/Website/trunk/; revision=71148
2025-12-04 12:57:50 +00:00
Jos Groot Lipman
a6d4e9ad91 MARX#88963 Betere ondersteuning XMLtoJsDate voor datums met milliseconden én tijdzones
svn path=/Website/trunk/; revision=71141
2025-12-03 16:33:26 +00:00
Erik Groener
371daa147c YKPN#88810 Uitschakelen van het kunnen boeken van facturen op een contract
svn path=/Website/trunk/; revision=71140
2025-12-03 15:38:24 +00:00
Jos Groot Lipman
18eac1490c FCLT#89391 Rapport export naar Excel faalt bij trema's in rapportnaam
svn path=/Website/trunk/; revision=71129
2025-12-03 12:23:17 +00:00
374c844127 SUTF#91748 (Mobile) voor onderdelen-lijsten en lijsten met gerelateerde onderdelen; standplaats niet in acht nemen
svn path=/Website/trunk/; revision=71125
2025-12-03 09:52:28 +00:00
Maykel Geerdink
1c4f2b313b MARX#90078: Opdracht-actiestatus via API1 bij 'onderbroken/AFR' bij de (FO)BO kunnen zetten.
svn path=/Website/trunk/; revision=71124
2025-12-03 09:22:09 +00:00
Erik Groener
9517935e17 YKPN#88810 Uitschakelen van het kunnen boeken van facturen op een contract
svn path=/Website/trunk/; revision=71123
2025-12-03 09:05:58 +00:00
Maykel Geerdink
6ffd381e67 MARX#90078: Opdracht-actiestatus via API1 bij 'onderbroken/AFR' bij de (FO)BO kunnen zetten.
svn path=/Website/trunk/; revision=71118
2025-12-02 15:53:10 +00:00
Maykel Geerdink
7179a7d07b SGGR#90860: PUT /api2/objects/33444.json eindigt met 404 status.
svn path=/Website/trunk/; revision=71105
2025-12-01 14:33:53 +00:00
Maykel Geerdink
0afeb680ca SGGR#90860: PUT /api2/objects/33444.json eindigt met 404 status.
svn path=/Website/trunk/; revision=71104
2025-12-01 14:29:37 +00:00
Erik Groener
591fa3f970 FMHN#89244 Verzoek om functionaliteit "Ingevoerd door" bij reserveringen toevoegen
svn path=/Website/trunk/; revision=71083
2025-11-28 09:22:05 +00:00
Erik Groener
292eba1e10 YASK#88950 Verplichte velden bij wijziging opdrachttype ontbreken waarschuwing
svn path=/Website/trunk/; revision=71075
2025-11-27 13:03:58 +00:00
Erik Groener
2154db4a27 MENZ#87867 Werkplek lijkt dubbel bezet
svn path=/Website/trunk/; revision=71072
2025-11-27 11:05:30 +00:00
Maykel Geerdink
4790ab0360 HGCU#91616: View ctr_v_monthly_recurring_tasks aanpassen i.v.m. foutieve status in jaaroverzicht voor periodieke check ADS meldingen.
svn path=/Website/trunk/; revision=71069
2025-11-27 08:42:32 +00:00
Erik Groener
43bfa187fc FCLT#76850 Automatisch opruimen backupfiles van imports
svn path=/Website/trunk/; revision=71064
2025-11-26 15:42:40 +00:00
Jos Groot Lipman
e7f0a9a897 FCLT#91443 Ook loading="lazy" op alle bb-plaatjes. Kan een beetje onnodig dataverkeer schelen.
svn path=/Website/trunk/; revision=71058
2025-11-26 12:04:31 +00:00
Maykel Geerdink
86361747ef AAGN#88039: Performance issue bij assetmanagement en draaien/exporteren taken-overzicht.
svn path=/Website/trunk/; revision=71055
2025-11-26 08:34:08 +00:00
Maykel Geerdink
646d29e229 LOGC#90742: Rapportagekolommen verslepen in plaats van volgnummer invoeren.
svn path=/Website/trunk/; revision=71053
2025-11-25 15:17:50 +00:00
Erik Groener
f356b4b9fb DHLD#91573 AiAi alg_key should be integer op mld_object.asp
svn path=/Website/trunk/; revision=71051
2025-11-25 13:35:32 +00:00
Maykel Geerdink
7fa36d7df3 LOGC#90742: Rapportagekolommen verslepen in plaats van volgnummer invoeren.
svn path=/Website/trunk/; revision=71049
2025-11-25 10:04:31 +00:00
Erik Groener
139b7ded01 FCLT#91046 LCL's zijn HTML safe maar niet String-safe of SQL-safe
svn path=/Website/trunk/; revision=71041
2025-11-24 15:49:07 +00:00
Erik Groener
9c10b5fb40 UWVA#90438 Extra tekst toevoegen bij bestaande reservering(en) bij reservering via QR-code
svn path=/Website/trunk/; revision=71035
2025-11-24 10:35:34 +00:00
Erik Groener
8a44183852 UWVA#90437 QR-code boeking niet beschikbaar ruimte
svn path=/Website/trunk/; revision=71033
2025-11-24 10:09:48 +00:00
3d6b0d3462 FCLT#74626 onnodige string delimiter weggehaald
svn path=/Website/trunk/; revision=71028
2025-11-21 12:35:24 +00:00
Erik Groener
3b213b9f5b MARX#86936 Automatisch resizen van API-afbeeldingen in bijlages
svn path=/Website/trunk/; revision=71025
2025-11-21 08:02:21 +00:00
9b731c4642 FCLT#91311 Van deze PoC niets mee-leveren; security risk ivm onderhoudsachterstand
svn path=/Website/trunk/; revision=71015
2025-11-20 11:05:20 +00:00
ecc0218c43 FCLT#91143 Als je antwoordt op een verborgen notitie, dan moeten de icoontjes juist mee-togglen (onzichtbaar worden), zo ook het belletje
svn path=/Website/trunk/; revision=71014
2025-11-20 10:04:45 +00:00
Erik Groener
41ae4148cc FCLT#87560 Dubbele vermeldingen in fiatteringsoverzicht door MLDUPD tracking
svn path=/Website/trunk/; revision=71004
2025-11-19 13:28:13 +00:00
Jos Groot Lipman
449060b413 FCLT#91143 Sinds UWVA#87948 is UWV Vinder en IE11 niet meer in gebruik
svn path=/Website/trunk/; revision=70999
2025-11-19 08:58:51 +00:00
Erik Groener
2c47223b45 FCLT#91046 LCL's zijn HTML safe maar niet String-safe of SQL-safe
svn path=/Website/trunk/; revision=70998
2025-11-19 08:52:18 +00:00
Jos Groot Lipman
18f0517d99 FCLT#72726 /.well-known/security.txt toevoegen
svn path=/Website/trunk/; revision=70992
2025-11-18 16:01:04 +00:00
Erik Groener
05748d1de7 VLKC#89941 Optie voor uitklapbaar opmerkingenveld leverancierssysteem?
svn path=/Website/trunk/; revision=70989
2025-11-18 14:02:36 +00:00
Erik Groener
9ab731bd1f VLKC#89941 Optie voor uitklapbaar opmerkingenveld leverancierssysteem?
svn path=/Website/trunk/; revision=70986
2025-11-18 13:14:03 +00:00
d1767e8d6c FCLT#91143 oude typo
svn path=/Website/trunk/; revision=70984
2025-11-18 12:04:01 +00:00
59c9e6e337 Merge 2025.4 RC1 patches
svn path=/Website/trunk/; revision=70970
2025-11-17 16:25:29 +00:00
Erik Groener
a51b813142 UWVA#90437 QR-code boeking niet beschikbaar ruimte
svn path=/Website/trunk/; revision=70954
2025-11-17 09:33:24 +00:00
Erik Groener
ed0e0728f9 FCLT#91403 Locatie info op de kaart
svn path=/Website/trunk/; revision=70943
2025-11-14 10:01:09 +00:00
2c0b703192 FCLT#91143 ongebruikte functies verwijderd
svn path=/Website/trunk/; revision=70931
2025-11-13 13:49:41 +00:00
Erik Groener
38924f71c9 FZKH#91268 Optie 'Verwijderen' ontbreekt bij opdrachten onder sjabloon-melding in Facilitor
svn path=/Website/trunk/; revision=70925
2025-11-13 09:44:15 +00:00
Maykel Geerdink
819119b93c PNBR#91442 Twee harde teksten in bestand "bes_voorraad_search.asp" vervangen door LCL.
svn path=/Website/trunk/; revision=70910
2025-11-12 11:40:15 +00:00
Maykel Geerdink
6d72043bfa PNBR#91355: Foutmelding bij openen bestelvoorraad via menubalk.
svn path=/Website/trunk/; revision=70909
2025-11-12 11:32:38 +00:00
5abf1bbc8d Merge 2025.4 RC1 patches (ongoing)
svn path=/Website/trunk/; revision=70907
2025-11-12 11:05:09 +00:00
Erik Groener
094169cb2f FZKH#91268 Optie 'Verwijderen' ontbreekt bij opdrachten onder sjabloon-melding in Facilitor
svn path=/Website/trunk/; revision=70903
2025-11-12 09:29:36 +00:00
Maykel Geerdink
e2988163dc PNBR#91355: Foutmelding bij openen bestelvoorraad via menubalk.
svn path=/Website/trunk/; revision=70902
2025-11-12 09:17:00 +00:00
Jos Groot Lipman
637303608d Merge 2025.3 RC3 patches
svn path=/Website/trunk/; revision=70895
2025-11-11 15:17:41 +00:00
Erik Groener
0980028b25 FZKH#90768 Optie 'Annuleren' ontbreekt bij sjabloon-melding in Facilitor
zelfde wijziging, mar nu voor 20261.

svn path=/Website/trunk/; revision=70894
2025-11-11 14:55:10 +00:00
Maykel Geerdink
6cb10bb818 MARX#90078: Opdracht-actiestatus via API1 bij 'onderbroken/AFR' bij de (FO)BO kunnen zetten.
svn path=/Website/trunk/; revision=70873
2025-11-10 14:54:19 +00:00
Erik Groener
c3c49895ca AAIT#88271 Verschillende opties bij het scope van een contract
svn path=/Website/trunk/; revision=70867
2025-11-10 11:21:01 +00:00
Maykel Geerdink
e78a3c30ef YAXX#90069: Statusfout bij afgemelde offerteaanvragen voor goedkeuring.
svn path=/Website/trunk/; revision=70847
2025-11-06 13:21:20 +00:00
Erik Groener
2375767e8c VNOG#87525 Vraag over CC/BCC in Facilitor-mails
svn path=/Website/trunk/; revision=70842
2025-11-06 10:26:59 +00:00
Maykel Geerdink
e295ec02ad FMHN#87779: Gebruiker eerder waarschuwen bij meldingen op gebouwen zonder die dienst.
svn path=/Website/trunk/; revision=70838
2025-11-06 09:35:30 +00:00
Maykel Geerdink
8570b05fbc YAXX#90900: Verkeerde kostensoort wordt gebruikt voor de combinatievalidatie bij opdrachten.
svn path=/Website/trunk/; revision=70837
2025-11-06 09:18:01 +00:00
Maykel Geerdink
b5b54a5b22 VLKC#89552: Popup bij meldingen buiten werktijden Facilitydesk.
svn path=/Website/trunk/; revision=70836
2025-11-06 07:00:52 +00:00
Maykel Geerdink
73a048d788 FCLT#90274: Doorsturen/corrigeren vakgroep en (niet) terugzetten naar status Nieuw.
svn path=/Website/trunk/; revision=70831
2025-11-05 10:31:26 +00:00
2576f8265d Merge 2025.3 RC2 patches
svn path=/Website/trunk/; revision=70829
2025-11-05 10:12:51 +00:00
Maykel Geerdink
6bbc95a5e3 TDNL#89081: Automatische storingsmelding per object naar juiste leverancier regelen.
svn path=/Website/trunk/; revision=70824
2025-11-05 09:01:00 +00:00
Maykel Geerdink
a9f774e998 TDNL#89081: Automatische storingsmelding per object naar juiste leverancier regelen.
svn path=/Website/trunk/; revision=70822
2025-11-05 08:39:21 +00:00
Erik Groener
2a159ae719 FMHN#87779 Gebruiker eerder waarschuwen bij meldingen op gebouwen zonder die dienst
svn path=/Website/trunk/; revision=70820
2025-11-05 07:36:19 +00:00
Maykel Geerdink
e92477f83c KFSG#89311: Standaard werkelijke aantal bij no-show op 0 zetten in Logcentre.
svn path=/Website/trunk/; revision=70818
2025-11-04 16:31:56 +00:00
Maykel Geerdink
8fa296251d AAGN#88039: Performance issue bij assetmanagement en draaien/exporteren taken-overzicht.
svn path=/Website/trunk/; revision=70813
2025-11-04 14:47:52 +00:00
Maykel Geerdink
a2ac4198b1 MARX#90078: Opdracht-actiestatus via API1 bij 'onderbroken/AFR' bij de (FO)BO kunnen zetten.
svn path=/Website/trunk/; revision=70810
2025-11-04 14:03:32 +00:00
73d13809b4 LOGC#90401 Revert r70728
svn path=/Website/trunk/; revision=70795
2025-11-04 10:14:00 +00:00
Erik Groener
855ec8f776 YAXX#89674 Verschillende statusbehoeften bij inkooporders, probleem doorbelastingsfouten
svn path=/Website/trunk/; revision=70756
2025-10-29 18:14:45 +00:00
Maykel Geerdink
3be7a38080 AAGN#89339: Is het mogelijk om bij het afmelden van de melding dmv een vinkje de gekoppelde taak af te melden/voltooien.
svn path=/Website/trunk/; revision=70754
2025-10-29 15:44:21 +00:00
Erik Groener
9b32ad0951 VLKC#86503 Teams chatbericht vanaf bezoekersbalie naar contactpersoon
verkeerde prs_perslid voor contactpersoon email gebruikt.

svn path=/Website/trunk/; revision=70751
2025-10-29 13:27:05 +00:00
Erik Groener
4a740c5fa7 VLKC#86503 Teams chatbericht vanaf bezoekersbalie naar contactpersoon
svn path=/Website/trunk/; revision=70749
2025-10-29 11:12:38 +00:00
Maykel Geerdink
db76d3be03 FCLT#89456: Wijzigingen en verbeteringsvoorstellen MJOB module (Punt 31).
svn path=/Website/trunk/; revision=70741
2025-10-28 16:47:42 +00:00
Maykel Geerdink
821a7873b3 VNOG#89057: Vervaldatum van hoofdobject ook door laten werken in onderdelen.
svn path=/Website/trunk/; revision=70735
2025-10-28 15:12:30 +00:00
8138788fa7 LOGC#90401 Mijlpalen in de suggest worden gesorteerd op mijlpaal-datum, dat doen we vanaf nu precies andersom zodat de meeste relevante mijlpalen bovenaan staan
svn path=/Website/trunk/; revision=70728
2025-10-28 08:15:37 +00:00
Erik Groener
e93fa23f21 LOGC#90401 Mijlpaal direct in de kaart weergeven (bij MLD kaartindeling)
svn path=/Website/trunk/; revision=70727
2025-10-28 07:57:57 +00:00
Maykel Geerdink
619c2ef05a AAGN#88039: Performance issue bij assetmanagement en draaien/exporteren taken-overzicht.
svn path=/Website/trunk/; revision=70724
2025-10-27 15:42:15 +00:00
Erik Groener
482f217959 SZDB#74054 revert laatste wijziging: moest nog in 20253
svn path=/Website/trunk/; revision=70723
2025-10-27 15:36:38 +00:00
Erik Groener
93168d4d5e SZDB#74054 Tonen in lijst van flexkenmerken ook in mobile ondersteunen
svn path=/Website/trunk/; revision=70721
2025-10-27 15:26:58 +00:00
Erik Groener
a0e992b46b tabs gecorrigeerd
svn path=/Website/trunk/; revision=70710
2025-10-27 11:28:19 +00:00
Erik Groener
de91a5f4c3 DJIN#86656 Audit-trail/tracking toevoegen voor mutaties in Facilitor
svn path=/Website/trunk/; revision=70708
2025-10-27 10:49:59 +00:00
Jos Groot Lipman
226c01effa FCLT#91143 Dode code (sendMLDorders) verwijderd
svn path=/Website/trunk/; revision=70690
2025-10-22 12:21:39 +00:00
Jos Groot Lipman
e89ce3ce7f FCLT#88775 res_plantable_version uitfaseren en overbodige plaatjes verwijderen
svn path=/Website/trunk/; revision=70689
2025-10-22 12:10:40 +00:00
Maykel Geerdink
cebc4e2ae3 FCLT#91141: Beheer: ins_srtcontrole suggestbox geeft foutmelding bij "Elke tabel bekijken".
svn path=/Website/trunk/; revision=70671
2025-10-21 08:24:02 +00:00
61376ed460 FCLT#91143 Regio's kunnen niet verwijderd worden omdat de action-parameter in de body wordt meegestuurd ipv de QS
svn path=/Website/trunk/; revision=70670
2025-10-21 08:06:49 +00:00
Jos Groot Lipman
7cd47cccf7 UWVA#87948 Controle gebruik Vinder API voordat opruimen
svn path=/Website/trunk/; revision=70660
2025-10-20 10:41:05 +00:00
413 changed files with 3323 additions and 13736 deletions

View File

@@ -47,7 +47,7 @@ FCLTHeader.Requires({ plugins:["jQuery"] });
var data = { key: disKeyString,
level: "D"
};
<% protectRequest.dataToken("data"); %>+
<% protectRequest.dataToken("data"); %>
$.post("alg_delete.asp", data, FcltCallbackRefresh, "json");
}
);

View File

@@ -54,6 +54,7 @@ if (ter_key > 0)
+ ", prs_afdeling_key"
+ ", prs_perslid_key_verantw"
+ ", prs_perslid_key_verantw2"
+ ", mld_dienstniveau_key"
+ " FROM alg_terreinsector "
+ " WHERE alg_terreinsector_key = " + ter_key;
@@ -77,6 +78,7 @@ if (ter_key > 0)
var toon_email = oRs("alg_terreinsector_toon_email").Value;
var toon_kenteken = oRs("alg_terreinsector_toon_kentk").Value;
var vervaldatum = oRs("alg_terreinsector_vervaldatum").Value != null ? new Date(oRs("ALG_TERREINSECTOR_VERVALDATUM").Value) : null;
var dienstniveau = oRs("mld_dienstniveau_key").Value;
oRs.Close();
}
@@ -213,6 +215,20 @@ BLOCK_START("algter3", L("lcl_alg_gebouw_administr"), {icon: "fa-clipboard"});
FILEPICKERTR("ter_image", L("lcl_alg_terreinsector_image"), ter_image, { "key": ter_key, "module": "ALGPHT", "readonly": !this_alg.writeman });
BLOCK_END();
BLOCK_START("algter4", L("lcl_alg_gebouw_facilitair"), {icon: "fa-users-cog"});
sql = "SELECT mld_dienstniveau_key"
+ " , " + lcl.xsqla("mld_dienstniveau_omschr", "mld_dienstniveau_key")
+ " FROM mld_dienstniveau"
+ " ORDER BY UPPER(" + lcl.xsql("mld_dienstniveau_omschr", "mld_dienstniveau_key") + ")";
FCLTselector("dienstniveau",
sql,
{ label: L("lcl_mld_dienst_niveau"),
initKey: dienstniveau,
emptyOption: "",
readonly: !this_alg.writeman
});
BLOCK_END();
BLOCK_START("algter4", L("lcl_alg_gebouw_fysiek"), {icon: "fa-ruler-combined"});
RWFIELDTR("ter_opp", "fldshort", L("lcl_estate_terreinsector_man_oppervlak"), ter_opp, {maxlength: 15});

View File

@@ -145,6 +145,17 @@ user.auth_required_or_abort(tobeedited > 0); // We klagen niet over enkele wel e
emptyOption: "",
initEmpty: true
});
sql = "SELECT mld_dienstniveau_key"
+ " , " + lcl.xsqla("mld_dienstniveau_omschr", "mld_dienstniveau_key")
+ " FROM mld_dienstniveau"
+ " ORDER BY UPPER(" + lcl.xsql("mld_dienstniveau_omschr", "mld_dienstniveau_key") + ")";
FCLTselector("dienstniveau",
sql,
{ label: L("lcl_mld_dienst_niveau"),
emptyOption: "",
initEmpty: true,
readonly: !this_alg.writeuse
});
MODAL_BLOCK_END();

View File

@@ -49,6 +49,8 @@ if (Request.Form("toon_kenteken").Count == 1 && getFParam("check_toon_kenteken",
{ var toon_k = (getFParam("toon_kenteken") ? getFParam("toon_kenteken") : 0);
fields.push({ dbs: "alg_terreinsector_toon_kentk", typ: "number", val: toon_k, track: L("lcl_estate_gebouw_toon_kenteken")});
}
if (Request.Form("dienstniveau").Count == 1 && getFParam("check_dienstniveau", "off") == "on")
fields.push({ dbs: "mld_dienstniveau_key", typ: "key", frm: "dienstniveau", track: L("lcl_mld_dienst_niveau"), foreign: "mld_dienstniveau" });
for (var i = 0; i < ter_key_arr.length; i++)

View File

@@ -37,7 +37,8 @@ var fields = [{ dbs: "alg_terreinsector_omschrijving", typ: "varchar", frm: "ter
{ dbs: "prs_kostenplaats_key", typ: "key", frm: "prs_kstn", track: L("lcl_prs_dept_kosten"), foreign: "PRS_KOSTENPLAATS" },
{ dbs: "prs_afdeling_key", typ: "key", frm: "prs_afd", track: L("lcl_dep_name_level2"), foreign: "PRS_AFDELING" },
{ dbs: "prs_perslid_key_verantw", typ: "key", frm: "verantw", track: L("lcl_alg_verantw"), foreign: "PRS_PERSLID" },
{ dbs: "prs_perslid_key_verantw2", typ: "key", frm: "verantw2", track: L("lcl_alg_verantw2"), foreign: "PRS_PERSLID" }];
{ dbs: "prs_perslid_key_verantw2", typ: "key", frm: "verantw2", track: L("lcl_alg_verantw2"), foreign: "PRS_PERSLID" },
{ dbs: "mld_dienstniveau_key", typ: "key", frm: "dienstniveau", track: L("lcl_mld_dienst_niveau"), foreign: "MLD_DIENSTNIVEAU" }];
if (this_alg.writeman)
{

View File

@@ -125,7 +125,7 @@ sql0 = "SELECT {0} id, " // 1 query voor beide
+ " '{2}' lbl, "
+ " COUNT (*) val, "
+ " '' det "
+ " FROM ins_deel i, ins_srtdeel sd "
+ " FROM ins_v_deelenonderdeel i, ins_srtdeel sd "
+ " WHERE i.ins_deel_verwijder IS NULL "
+ " AND i.ins_srtdeel_key = sd.ins_srtdeel_key"
+ " AND sd.ins_srtdeel_verwijder IS NULL "
@@ -139,7 +139,7 @@ sql0 = "SELECT {0} id, " // 1 query voor beide
+ " AND r.res_ins_deel_key = i.ins_deel_key) ";
sql1 = "SELECT {0} id, '> ' || ins_discipline_omschrijving lbl, COUNT (*) val, '' det "
+ " FROM ins_deel i, ins_discipline rd, ins_srtdeel sd "
+ " FROM ins_v_deelenonderdeel i, ins_discipline rd, ins_srtdeel sd "
+ " WHERE i.ins_discipline_key = rd.ins_discipline_key "
+ " AND i.ins_deel_verwijder IS NULL "
+ " AND sd.ins_srtdeel_verwijder IS NULL "

View File

@@ -5,7 +5,7 @@
File: alg_show_regio.asp
Status:
Description:
Description:
Parameters: regio_key
*/ %>
@@ -49,11 +49,8 @@ var regio_deleted = regio_exists && !!regio_data.deleted;
function reg_delete()
{
FcltMgr.confirm(L("lcl_alg_del_txt_regio"), function() {
var data = {
action: "D"
};
<% protectRequest.dataToken("data"); %>
$.post($("form[name=u2]")[0].action,
var data = $("[name=u2]").serialize();
$.post("alg_edit_regio_save.asp?regio_key=<%=regio_data.id%>&action=D",
data,
FcltCallbackClose,
"json");
@@ -63,8 +60,8 @@ var regio_deleted = regio_exists && !!regio_data.deleted;
</head>
<body class="showmode">
<%
SUBFRAME_START();
<%
SUBFRAME_START();
var buttons = [];
if (!regio_deleted)
{
@@ -93,9 +90,9 @@ var regio_deleted = regio_exists && !!regio_data.deleted;
onrgoed_niveau : onrgoedlvl,
reado : true,
this_alg : this_alg });
%>
</form>
<% SUBFRAME_END(); %>
IFACE.FORM_END();
%> </form><%
SUBFRAME_END(); %>
</body>
</html>
<% ASPPAGE_END(); %>
<% ASPPAGE_END(); %>

View File

@@ -41,7 +41,6 @@ var sql = "SELECT ts.alg_locatie_key"
+ " , ts.alg_terreinsector_oppervlak"
+ " , ts.alg_terreinsector_omtrek"
+ " , ts.alg_terreinsector_aanmaak"
+ " , ts.alg_terreinsector_omschrijving"
+ " , ts.alg_terreinsector_ordernr"
+ " , ts.alg_terreinsector_image"
+ " , ts.alg_terreinsector_toon_telef"
@@ -59,6 +58,7 @@ var sql = "SELECT ts.alg_locatie_key"
+ " , prs_perslid_key_verantw2"
+ " , ts.alg_terreinsector_vervaldatum"
+ " , ts.alg_terreinsector_verwijder"
+ " , ts.mld_dienstniveau_key"
+ " FROM alg_terreinsector ts"
+ " WHERE ts.alg_terreinsector_key = " + ter_key;
var oRs = Oracle.Execute(sql);
@@ -71,7 +71,6 @@ var ter_sroms = oRs("srtterreinsector_oms").Value;
var ter_opp = oRs("alg_terreinsector_oppervlak").Value;
var ter_omt = oRs("alg_terreinsector_omtrek").Value;
var ter_aanmk = oRs("alg_terreinsector_aanmaak").Value;
var ter_oms = oRs("alg_terreinsector_omschrijving").Value;
var ter_ordnr = oRs("alg_terreinsector_ordernr").Value;
var ter_image = oRs("alg_terreinsector_image").Value;
var toon_telefoon = oRs("alg_terreinsector_toon_telef").Value;
@@ -85,6 +84,7 @@ var verantw_key = oRs("prs_perslid_key_verantw").Value;
var verantw2_key = oRs("prs_perslid_key_verantw2").Value;
var ter_deleted = oRs("alg_terreinsector_verwijder").Value != null;
var vervaldatum = oRs("alg_terreinsector_vervaldatum").Value;
var dienstniveau_key = oRs("mld_dienstniveau_key").Value;
oRs.Close();
%>
@@ -215,6 +215,20 @@ oRs.Close();
FILEPICKERTR("ter_image", L("lcl_alg_terreinsector_image"), ter_image, { "key": ter_key, "module": "ALGPHT", "readonly": true });
BLOCK_END();
BLOCK_START("algter4", L("lcl_alg_gebouw_facilitair"), {icon: "fa-users-cog"});
if (dienstniveau_key)
{
sql = "SELECT mld_dienstniveau_key"
+ " , " + lcl.xsqla("mld_dienstniveau_omschr", "mld_dienstniveau_key")
+ " FROM mld_dienstniveau"
+ " WHERE mld_dienstniveau_key = " + dienstniveau_key;
oRs = Oracle.Execute(sql);
ROFIELDTR("fld", L("lcl_mld_dienst_niveau"), oRs("mld_dienstniveau_omschr").value);
oRs.Close();
}
BLOCK_END();
if (!(ter_opp == null && ter_omt == null && vervaldatum == null))
{
BLOCK_START("algter4", L("lcl_alg_gebouw_fysiek"), {icon: "fa-ruler-combined"});

View File

@@ -31,7 +31,7 @@ if (ter_key > 0)
var loc_code = oRs("alg_locatie_code").value;
var ter_code = oRs("alg_terreinsector_code").value;
oRs.Close();
var ter_naam = " " + loc_code + "-" + ter_code;
}
else

View File

@@ -121,6 +121,7 @@ for (var i = 0; i < opdrachten.length; i++)
var onderwerp = XMLval(opdrachten[i], "onderwerp"); // NEW
var opdr_kpn = XMLval(opdrachten[i], "kostenplaats");
var flag = parseInt(XMLval(opdrachten[i], "flag"), 10);
var actiecode = parseInt(XMLval(opdrachten[i], "actiecode"), 10);
var txt_mut_datum = XMLval(opdrachten[i], "mut_datum"); // UPD
var opdrstatus = XMLval(opdrachten[i], "status"); // UPD
@@ -922,17 +923,48 @@ for (var i = 0; i < opdrachten.length; i++)
if (resultcode == -1) // Nog steeds geen fouten.
{
var tracking_key = coalesce(coalesce(status_tracking_key, datum_tracking_key), update_tracking_key); // volgorde van belangrijkheid
add_note(tracking_key); // voor als nog niet eerder gebeurd
// Alleen als er een notitie is aangemaakt mag ik de actiecode ook aanpassen.
if (note_key > 0)
{ // Er is een notitie aangemaakt.
// Actie bij +1=FOBO behandelaar, +2=melder, +4=uitvoerende, +128=attentie FOBO, +512=attentie uitvoerende.
if (resultcode == -1 && !isNaN(actiecode) && actiecode >= 0)
{ // Actie code.
var newActiecode = 0;
if ((actiecode & 128) == 128)
{
newActiecode += 128; // BO attentie
}
var BOactie = false;
if (S("mld_opdr_actiecode") > 0 && ((actiecode & 1) == 1))
{
newActiecode += 1; // + BO actie
BOactie = true;
}
var sql = "UPDATE mld_opdr"
+ " SET mld_opdr_actiecode = mld_opdr_actiecode" // Bestaande bitjes zoals 512 mag niet verloren gaan.
+ " + " + newActiecode
+ " - BITAND(mld_opdr_actiecode, " + newActiecode + ")" // Als het bitje 1 of 128 al gezet was dan deze waarde weer in minderinig brengen.
+ (BOactie
? " - BITAND(mld_opdr_actiecode, 6)" // Van de bitjes 1+2+4 (=7) moet er altijd 1 aan staan. Als we bitje 1 zetten, dan moeten we bitjes 2 of 4 wissen.
: "") // Bitje 1 is niet gezet. Bitjes 2 en 4 ongemoeit laten.
+ " WHERE mld_opdr_key = " + mld_opdr.opdr_key;
Oracle.Execute(sql);
}
}
resultcode = 0; // Ik heb gedaan wat ik moest en mocht doen voor deze opdracht.
}
else if (resultcode > 0)
{
var logtxt = "api_opdrsoap fail.\nResultcode: {0}\nReturntekst: {1}\nOpdracht: {2}\nOldstatus: {3}".format(resultcode, resulttekst, opdrid, oldstatus);
if (resulttekst.match(/^Not authorized/)) // Dit komt heel vaak voor door updates op gesloten opdrachten.
__Log(logtxt); // Het vervuilt de logfile veel te veel
__Log(logtxt); // Het vervuilt de logfile veel te veel
else
__DoLog(logtxt, "#00FF00");
}

View File

@@ -91,10 +91,10 @@ function L(p_lcl)
toonFoto: true,
detailurl: "appl/fac/fac_user_info.asp",
deeplinkurl: "<%=safe.jsstring(site)%>/?nomenu=1&noheader=1&ihatetabs=1&JumpTo=",
fields: [ { lbl: "<%=L("lcl_prs_email")%>", val: "prs_perslid_email" },
{ lbl: "<%=L("lcl_pb_phone")%>", val: "prs_perslid_telefoonnr" },
{ lbl: "<%=L("lcl_pb_mobile")%>", val: "prs_perslid_mobiel" },
{ lbl: "<%=L("lcl_pb_afdeling")%>", val: "afdeling" }
fields: [ { lbl: L("lcl_prs_email"), val: "prs_perslid_email" },
{ lbl: L("lcl_pb_phone"), val: "prs_perslid_telefoonnr" },
{ lbl: L("lcl_pb_mobile"), val: "prs_perslid_mobiel" },
{ lbl: L("lcl_pb_afdeling"), val: "afdeling" }
]
};
<%
@@ -110,7 +110,7 @@ function L(p_lcl)
window.facilitor.show_phonebook = function(data, textStatus)
{
// Alle styling moet nog via classes
var closer = "<span onclick='$(\"#phonebookdetails\").hide()' style='float: right; cursor: pointer' title='<%=L("lcl_close_window")%>'>x</span>"
var closer = "<span onclick='$(\"#phonebookdetails\").hide()' style='float: right; cursor: pointer' title='<%=safe.htmlattr(L("lcl_close_window"))%>'>x</span>"
if (window.facilitor.phonebook_options.detailurl)
{
var jumpto = window.facilitor.phonebook_options.detailurl;

View File

@@ -1,201 +0,0 @@
<%@language = "javascript" %>
<% /*
$Revision$
$Id$
File: phonebook_js.asp
Description: Phonebook API
Levert een JavaScript bestand op.
Parameters:
Context:
Note:
*/
DOCTYPE_Disable = 1;
FCLTEXPIRES = 8*60; // geen database interactie tenslotte
THIS_FILE = "appl/api/phonebook_js.asp";
var EXPIRED_PASSWORD_OK = true; // performance
%>
<!-- #include file="../Shared/common.inc"-->
<!-- #include file="../api/api.inc" -->
<%
var API = new API_func();
var nojQuery = getQParam("nojQuery", 0)==1;
var suggesticon = getQParam("suggesticon", "");
var transitParam = "&fac_id="+Session("customerId") + buildTransitParam(["API", "APIKEY", "charset"]);
var proto = (Request.ServerVariables("SERVER_PORT") == "443")?"https":"http";
var sitenoroot = proto + "://" + Request.ServerVariables("SERVER_NAME");
var site = sitenoroot + rooturl;
Response.ContentType = "application/javascript";
//lcl.buildClientLCL();
// LET OP: Geen FcltMgr.js en dus niet (clientside) zelflerend
%>
window.facilitor = window.facilitor || {};
window.facilitor.LCL = {};
window.facilitor.LCL["lcl_shared_suggest_hint"] = "<%=safe.jsstring(L("lcl_shared_suggest_hint"))%>";
window.facilitor.LCL["lcl_shared_suggest_huidig"] = "<%=safe.jsstring(L("lcl_shared_suggest_huidig"))%>";
facilitor.phonebook = facilitor.phonebook || {};
function L(p_lcl)
{
if (p_lcl in window.facilitor.LCL)
return window.facilitor.LCL[p_lcl];
return "??" + p_lcl + "??";
}
(function() {
function getScript(src) {
document.write('<' + 'script src="<%=site%>/' + src + '"' +
' type="text/javascript"><' + '/script>');
}
function getCSS(src) {
document.write('<' + 'link rel="stylesheet" href="<%=site%>/' + src + '"' +
' type="text/css">');
}
var loadScriptTime = (new Date).getTime();
getCSS("appl/shared/suggest/suggest.css");
getCSS("appl/api/api.css");
<% if (!nojQuery) { /* kan conflicteren */ %>
getScript("appl/localscripts/jquery.min.js");
<% } %>
getScript("appl/shared/suggest/suggest_IE11.js?v=<%=safe.url(FCLTVersion)%>"); // FCLTVersion voor anti-caching. Timestamp is me te veel werk
<% if (API.apidata.cust_js) { %>
getScript("<%=API.apidata.cust_js%>");
<% } %>
window.facilitor.open_phonebook = function(key, naam)
{
if (key > 0)
jQuery.ajax({ type: "GET",
url: "<%=safe.jsstring(site)%>/appl/api/get_phonebook_info.asp?req_info=prs_perslid&prs_perslid_key=" + key + "<%=transitParam%>",
dataType: "jsonp",
success: window.facilitor.show_phonebook
});
else
$("#phonebookdetails").hide()
}
// De default waarden, werkt nog niet TODO
window.facilitor.phonebook_options =
{ detailWidth : 450,
toonFoto: true,
detailurl: "appl/fac/fac_user_info.asp",
deeplinkurl: "<%=safe.jsstring(site)%>/?nomenu=1&noheader=1&ihatetabs=1&JumpTo=",
fields: [ { lbl: "<%=L("lcl_prs_email")%>", val: "prs_perslid_email" },
{ lbl: "<%=L("lcl_pb_phone")%>", val: "prs_perslid_telefoonnr" },
{ lbl: "<%=L("lcl_pb_mobile")%>", val: "prs_perslid_mobiel" },
{ lbl: "<%=L("lcl_pb_afdeling")%>", val: "afdeling" }
]
};
<%
// kopieer de serverside overrules naar clientside
for (opt in API.apidata.options)
{
Response.Write("\nwindow.facilitor.phonebook_options['"+opt+"'] = "
+ "JSON.parse('"+ safe.jsstring(JSON.stringify(API.apidata.options[opt])) +"')");
}
%>
window.facilitor.show_phonebook = function(data, textStatus)
{
// Alle styling moet nog via classes
var closer = "<span onclick='$(\"#phonebookdetails\").hide()' style='float: right; cursor: pointer' title='<%=L("lcl_close_window")%>'>x</span>"
if (window.facilitor.phonebook_options.detailurl)
{
var jumpto = window.facilitor.phonebook_options.detailurl;
jumpto += (jumpto.indexOf("?")>=0)?"&":"?";
jumpto += "prs_key="+data.prs_perslid_key;
var link = window.facilitor.phonebook_options.deeplinkurl + escape(jumpto) + "&fac_id=<%=Session("customerId")%>";
var ahref = "<a href='"+link+"' target='_new'>"+data.naam+"</a>"
}
else
ahref=date.naam;
var trh = "<tr><td></td><th colspan='2' class='title'>"+ahref+"</a></th><th></th></tr>"
var trs = "";
if (window.facilitor.phonebook_options.toonFoto && data.photopath)
{
trs += "<tr><td></td><td></td><td rowspan='50'><img alt='<%=safe.htmlattr(L("lcl_menu_prs_phonebook"))%>' src='<%=safe.jsstring(sitenoroot)%>" + data.photopaththumb.replace(/\'/g,'&#39;').replace(/\"/g,'&quot;') +"'></td></tr>";
}
var fld;
for (fld in window.facilitor.phonebook_options.fields)
{
var field = window.facilitor.phonebook_options.fields[fld];
if (field.val && data[field.val])
{
trs += "<tr><td class='label'>"+field.lbl+"</td>";
trs += " <td>"+data[field.val]+"</td></tr>";
}
if (field.fun)
trs += eval(field.fun + "(data)");
}
if (!document.getElementById("phonebookdetails"))
{
// Alle esthetische styling verloopt via de css
var dd = document.createElement('div');
dd.id = "phonebookdetails";
dd.style.position = "absolute";
dd.style.top = $("#sName_key_show").position().top+20 + "px";
dd.style.width = window.facilitor.phonebook_options.detailWidth + "px";
var newLeft = $("#sName_key_show").position().left;
if (newLeft + window.facilitor.phonebook_options.detailWidth > document.body.offsetWidth)
{ // Wel in beeld houden
newLeft = document.body.offsetWidth - window.facilitor.phonebook_options.detailWidth
}
dd.style.left = newLeft + "px";
document.body.appendChild(dd);
if (0)$("body").click // even niet, hij is te agressief
(
function(e)
{
if($(e.target).closest("#phonebookdetails").length==0)
{
$("#phonebookdetails").hide();
}
}
);
}
var dd = document.getElementById("phonebookdetails");
dd.innerHTML = ""+closer+"<table width='100%'>"+trh + trs+"</table>";
dd.style.display = "block";
}
window.facilitor.phonebook = function (elm, options)
{
var opt;
for (opt in options)
{
window.facilitor.phonebook_options[opt] = options[opt];
}
$(elm).append('<input id="sName_key_show" sgonChange="window.facilitor.open_phonebook" class="fldpers" value="">')
$(elm).append('<input type="hidden" id="sName_key" name="sName_key" value="-1">');
sgPerson = new Suggest({ objectName: "sgPerson",
queryField: $("#sName_key_show")[0],
queryUrl: "<%=safe.jsstring(site)%>/appl/shared/suggest/SuggestPerslid.asp?filtcode=PHB<%=transitParam%>",
initKey: -1,
noJustOne: true,
keyField: $("#sName_key")[0],
JSONP: true,
embedded: true,
suggesticon: "<%=safe.jsstring(suggesticon)%>",
site: "<%=safe.jsstring(site)%>"
});
};
})();
<% ASPPAGE_END(); %>

View File

@@ -72,6 +72,12 @@ model_cnt_disc_params =
"label": L("cnt_discipline_factuurappr"),
"typ": "check0"
},
"bookinvoice": {
"dbs": "cnt_disc_params_factuurboeken",
"label": L("cnt_discipline_factuurboeken"),
"typ": "check0",
"defaultvalue": 1
},
"invoicelimit": { // "limit" is een reserved naam in API2
"dbs": "cnt_disc_params_factuurgrens",
"label": L("cnt_discipline_factuurgrens"),

View File

@@ -263,12 +263,34 @@ function model_custom_fields(formodel, flexModel, flexParams)
attachment.content_base64 || attachment.content_hex,
fileencoding);
}
// resizen van bijlagen
var oCrypto = new ActiveXObject("SLNKDWF.Crypto");
var fso = Server.CreateObject("Scripting.FileSystemObject")
var orgFile = flexparams.AttachPath + safefilename;
if (flexparams.regexp)
{
var resize_params = { resizecode: flexparams.regexp // "R800x600"
, attachpath: flexparams.AttachPath
, filename: safefilename
, safename: safefilename
, digest: oCrypto.hex_sha1_file(orgFile)
, isupload: false
, module: this.module
};
var resize_result = resizePicture(resize_params);
if (resize_result.newsize && (resize_result.newsize > 0))
{
tmpFile = resize_result.file_resized;
fso.DeleteFile(orgFile);
fso.MoveFile(tmpFile, orgFile);
}
}
// Toevoegen bijlage/bestand tracken.
trackBijlagen(this.module, parent_key, flexparams, {safefilename: [safefilename]}, "upload");
if (flexparams.fac_bijlagen)
{
var oCrypto = new ActiveXObject("SLNKDWF.Crypto");
var fso = Server.CreateObject("Scripting.FileSystemObject")
var sql = "BEGIN "
+ " flx.setflexbijlage"
+ "(" + safe.quoted_sql(this.module) // MLD | RES | ....
@@ -277,9 +299,9 @@ function model_custom_fields(formodel, flexModel, flexParams)
+ ", " + safe.quoted_sql(flexparams.AttachSubPath)
+ ", " + "NULL" // diskfilename
+ ", " + safe.quoted_sql(safefilename)
+ ", " + fso.GetFile(flexparams.AttachPath + safefilename).Size
+ ", " + fso.GetFile(orgFile).Size
+ ", " + "SYSDATE"
+ ", " + safe.quoted_sql(oCrypto.hex_sha1_file(flexparams.AttachPath + safefilename))
+ ", " + safe.quoted_sql(oCrypto.hex_sha1_file(orgFile))
+ ");"
+ " END;";
Oracle.Execute(sql);

View File

@@ -216,7 +216,7 @@ function model_generic(table, autfunction)
var fld = oRs.Fields("column_name").Value;
if (fld == table.toLowerCase() + "_verwijder" || fld == 'ins_discipline_verwijder')
if (fld == table.toLowerCase() + "_verwijder" || fld == 'ins_discipline_verwijder' || fld == 'res_srtartikel_og_verwijder' || fld == 'res_ruimte_opstel_verwijder')
model.soft_delete = fld;
// Dan zien we hem ook nergens meer?

View File

@@ -41,6 +41,7 @@ function model_alg_locatie()
"mjb_score" : { dbs: "alg_locatie_mjb_score1" , typ: "number" , "label": L("lcl_alg_locatie_mjb_score1")},
"coordinate_x" : { dbs: "alg_locatie_x" , typ: "number" , "label": L("lcl_geoxcoord")},
"coordinate_y" : { dbs: "alg_locatie_y" , typ: "number" , "label": L("lcl_geoycoord")},
"expires" : { dbs: "alg_locatie_vervaldatum" , typ: "date" , "label": L("lcl_alg_vervaldatum")},
"externnr" : { dbs: "alg_locatie_externnr" , typ: "varchar" , "label": L("extern_nr"), "readonly": !(user.has("WEB_FACTAB") || user.has("WEB_FACXNR")) },
"externsyncdate": { dbs: "alg_locatie_externsyncdate" , typ: "datetime" , "label": L("extern_syncdate"), "readonly": !(user.has("WEB_FACTAB") || user.has("WEB_FACXNR")) },
"seqnr" : { dbs: "alg_locatie_volgnr" , typ: "number" , "label": L("lcl_alg_locatie_volgnr") },

View File

@@ -37,7 +37,7 @@ function model_mld_discipline_discipline()
"required": true,
"insertonly": true,
"foreign": {
"tbl": "(SELECT ins_discipline_key, ins_discipline_omschrijving"
"tbl": "(SELECT ins_discipline_key, isd.ins_srtdiscipline_omschrijving || ' - ' || ins_discipline_omschrijving AS ins_discipline_omschrijving"
+ " FROM ins_srtdiscipline isd, ins_tab_discipline td, mld_disc_params dp"
+ " WHERE isd.ins_srtdiscipline_key = td.ins_srtdiscipline_key"
+ " AND td.ins_discipline_key = dp.mld_ins_discipline_key"
@@ -54,7 +54,7 @@ function model_mld_discipline_discipline()
"required": true,
"insertonly": true,
"foreign": {
"tbl": "(SELECT ins_discipline_key, ins_discipline_omschrijving"
"tbl": "(SELECT ins_discipline_key, ins_discipline_omschrijving || ' (' || ins_srtdiscipline_omschrijving || ')' AS ins_discipline_omschrijving"
+ " FROM ins_srtdiscipline isd, ins_tab_discipline td, mld_disc_params dp"
+ " WHERE isd.ins_srtdiscipline_key = td.ins_srtdiscipline_key"
+ " AND td.ins_discipline_key = dp.mld_ins_discipline_key"

View File

@@ -114,7 +114,8 @@ function model_mld_melding_tag()
"active": {
"dbs": "mld_melding_tag_actief",
"label": L("mld_melding_tag_actief"),
"typ": "check0"
"typ": "check0",
"defaultvalue": 1
},
"begindate": {
"dbs": "mld_melding_tag_datum_van",

View File

@@ -265,6 +265,12 @@ function model_mld_typeopdr()
"label": L("lcl_mld_code"),
"typ": "varchar",
"readonly": !user.has("WEB_FACTAB")
},
"complete": {
"dbs": "mld_typeopdr_afronden",
"label": L("mld_typeopdr_complete"),
"typ": "check0",
"defaultvalue": 1
}
};

View File

@@ -100,47 +100,47 @@ function model_objects(ins_key, params)
};
var module = "INS"; // INS of SLE.
function _check_authorization(params, method)
{
var urole = "fe"; // TODO: Moet echt niet ter zake doen
var autfunction = urole == "fe"? "WEB_INSUSE" : "WEB_INSMAN";
params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch
var ins_key = params.filter.id || -1;
var urole = params.filter.scope || "fe";
params.message = "";
params.message = "";
params.filter.scope = params.filter.scope || "fe";
var module = "INS";
var ins_key = params.filter.id || -1;
var srtdeel_key = -1;
var srtgroep_key = -1;
var autfunction = ( params.filter.scope == "fe"
? "WEB_INSUSE"
: ( params.filter.scope == "fo"
? "WEB_INSFOF"
: "WEB_INSMAN"
));
// Voor sleutels/cilinders:
if ( (ins_key > 0 && ins.isSleCil(ins_key))
|| (srtdeel_key > 0 && ins.isSleCil(srtdeel_key, "S"))
|| (srtgroep_key > 0 && ins.isSleCil(srtgroep_key, "G"))
)
{
autfunction = "WEB_SLEBOF";
module = "SLE";
}
var srtdeel_key = -1;
var srtgroep_key = -1;
// Heb ik rechten voor 1 van de INS autorisaties. Onafhankelijk van de urole.
var autfunction = ["WEB_INSUSE", "WEB_INSFOF", "WEB_INSMAN"];
// Voor sleutels/cilinders:
if ( (ins_key > 0 && ins.isSleCil(ins_key))
|| (srtdeel_key > 0 && ins.isSleCil(srtdeel_key, "S"))
|| (srtgroep_key > 0 && ins.isSleCil(srtgroep_key, "G"))
)
{
autfunction = "WEB_SLEBOF";
module = "SLE";
}
if (ins_key > 0)
{
var this_ins = ins.func_enabled_deel(ins_key, {urole: params.filter.scope});
user.auth_required_or_abort(this_ins.canChange || this_ins.canChangeOwn); // dat is toch wel het minste
params.authparams = this_ins.authparams(autfunction);
}
else
{
params.authparams = user.checkAutorisation(autfunction); // , null, null, true); // pessimistisch
var this_ins = { canChangeAlg: true };
}
switch (method)
{
case "GET": if (ins_key > 0)
{
var this_ins = ins.func_enabled_deel(ins_key, {urole: urole});
user.auth_required_or_abort(this_ins.canReadAny); // dat is toch wel het minste
}
else
{
var this_ins = { canChangeAlg: true };
params.authparams = user.checkAutorisation(autfunction, null, null, true); // pessimistisch
}
break;
case "PUT":
case "POST": var this_ins = ins.func_enabled_deel(ins_key, {urole: urole});
user.auth_required_or_abort(this_ins.canChange || this_ins.canChangeOwn); // dat is toch wel het minste
break;
}
params.func_enabled = this_ins || {};
params.func_enabled = this_ins || {};
};
function _pre_analyze_fields(params, jsondata, method)
@@ -307,7 +307,7 @@ function model_objects(ins_key, params)
}
if (bindingBits & BIND_RUIMTE)
{
if(jsondata.room && jsondata.room > 0 )
if (jsondata.room && jsondata.room > 0 )
{
placeholder.status = true;
placeholder.ruimte_type = "R";
@@ -420,7 +420,9 @@ function model_objects(ins_key, params)
query.wheres.push(" ins_v_deelenonderdeel.ins_discipline_key IN"
+ " (SELECT ins_discipline_key"
+ " FROM fac_v_webgebruiker"
+ " WHERE fac_functie_key = " + params.authparams.autfunctionkey
+ (module == "INS"
? " WHERE fac_functie_key IN ({0}, {1}, {2})".format(F('WEB_INSUSE'), F('WEB_INSFOF'), F('WEB_INSMAN'))
: " WHERE fac_functie_key = " + F("WEB_SLEBOF"))
+ " AND prs_perslid_key = " + user_key
+ " AND fac_gebruiker_prs_level_read < 9"
+ " AND fac_gebruiker_alg_level_read < 9)");

View File

@@ -1243,8 +1243,6 @@ function model_orders(opdr_key, params)
{ // Bij ORDNEW tracking wordt er niet genotificeerd. Dat moet als je mld_opdr_teverzenden op 1 zet nog gebeuren.
Oracle.Execute("BEGIN fac.notifytrackingbedrijven ('ORDNEW', " + opdr_key + "); END;");
}
var puo_result = putorders.sendMLDorders(opdr_key);
}
else if (params.mld_opdr.mld_typeopdr_confirm_for_send == 1)
{ // Gaat straks vragen: "Zal ik electronisch versturen?"

View File

@@ -55,7 +55,7 @@ checkUserAgent(); // heeft device capability bits gezet
<%
}
%>
window.parent.document.title = "<%=L("lcl_facilitor_ie_title")%>";
window.parent.document.title = L("lcl_facilitor_ie_title");
function login_callback(json)
{
if (json.success && json.otp_prompt)
@@ -231,7 +231,7 @@ checkUserAgent(); // heeft device capability bits gezet
%></div>
<% } %>
<div class="form-floating loginname">
<input class="form-control required" type="text" maxlength="256" id="visname" name="vis_name" autocomplete="off" value="<%=safe.jsstring(prs_email)%>" placeholder="<%=L("lcl_vis_log_name")%>">
<input class="form-control required" type="text" maxlength="256" id="visname" name="vis_name" autocomplete="off" value="<%=safe.jsstring(prs_email)%>" placeholder="<%=safe.htmlattr(L("lcl_vis_log_name"))%>">
<label for="visname"><%=L("lcl_vis_log_name")%></label>
</div>

View File

@@ -55,7 +55,7 @@ checkUserAgent(); // heeft device capability bits gezet
<%
}
%>
window.parent.document.title = "<%=L("lcl_facilitor_ie_title")%>";
window.parent.document.title = L("lcl_facilitor_ie_title");
function login_callback(json)
{
if (json.success)

View File

@@ -1918,6 +1918,7 @@
voorraad_srtdeel: function _voorraad_srtdeel(pautfunction, params)
{
// Valid and supported parameters are:
// params.catalogus_type: key
// params.catalogus_key : key
// params.besgroep_key :
// params.item_key :
@@ -1988,6 +1989,9 @@
+ " AND g.ins_discipline_key = bd.ins_discipline_key"
+ " AND bd.ins_discipline_key = dp.bes_ins_discipline_key"
+ " AND sd.bes_srtdeel_verwijder IS NULL"
+ (params.catalogus_type
? " AND dp.bes_disc_params_bestelmode = " + params.catalogus_type
: "")
+ (params.catalogus_key
? " AND dp.bes_ins_discipline_key_inkoop = " + params.catalogus_key
+ " AND (sd.bes_srtdeel_vervaldatum IS NULL OR sd.bes_srtdeel_vervaldatum > SYSDATE)"
@@ -2071,6 +2075,9 @@
+ " AND g.ins_discipline_key = bd.ins_discipline_key"
+ " AND bd.ins_discipline_key = dp.bes_ins_discipline_key"
+ " AND sd.bes_srtdeel_verwijder IS NULL"
+ (params.catalogus_type
? " AND dp.bes_disc_params_bestelmode = " + params.catalogus_type
: "")
+ (params.catalogus_key
? " AND dp.bes_ins_discipline_key_inkoop = " + params.catalogus_key
+ " AND (sd.bes_srtdeel_vervaldatum IS NULL OR sd.bes_srtdeel_vervaldatum > SYSDATE)"
@@ -2187,6 +2194,9 @@
+ " AND bd1.ins_discipline_key = dp1.bes_ins_discipline_key"
+ " AND sd1.bes_srtdeel_nr = sd.bes_srtdeel_nr" // Dezelfde omschrijving.
+ " AND dp1.bes_ins_discipline_key_inkoop = bd.ins_discipline_key)" // Gekoppeld aan inkoopcatalogus.
+ (params.catalogus_type
? " AND dp.bes_disc_params_bestelmode = " + params.catalogus_type
: "")
+ (params.catalogus_key
? " AND bd.ins_discipline_key = " + params.catalogus_key
+ " AND (sd.bes_srtdeel_vervaldatum IS NULL OR sd.bes_srtdeel_vervaldatum > SYSDATE)"
@@ -2283,6 +2293,9 @@
+ " AND bd1.ins_discipline_key = dp1.bes_ins_discipline_key"
+ " AND sd1.bes_srtdeel_nr = sd.bes_srtdeel_nr" // Dezelfde omschrijving.
+ " AND dp1.bes_ins_discipline_key_inkoop = bd.ins_discipline_key)" // Gekoppeld aan inkoopcatalogus.
+ (params.catalogus_type
? " AND dp.bes_disc_params_bestelmode = " + params.catalogus_type
: "")
+ (params.catalogus_key
? " AND bd.ins_discipline_key = " + params.catalogus_key
+ " AND (sd.bes_srtdeel_vervaldatum IS NULL OR sd.bes_srtdeel_vervaldatum > SYSDATE)"
@@ -2377,6 +2390,9 @@
+ " AND bd1.ins_discipline_key = dp1.bes_ins_discipline_key"
+ " AND sd1.bes_srtdeel_nr = sd.bes_srtdeel_nr" // Dezelfde omschrijving.
+ " AND dp1.bes_ins_discipline_key_inkoop = bd.ins_discipline_key)" // Gekoppeld aan inkoopcatalogus.
+ (params.catalogus_type
? " AND dp.bes_disc_params_bestelmode = " + params.catalogus_type
: "")
+ (params.catalogus_key
? " AND bd.ins_discipline_key = " + params.catalogus_key
+ " AND (sd.bes_srtdeel_vervaldatum IS NULL OR sd.bes_srtdeel_vervaldatum > SYSDATE)"

View File

@@ -147,7 +147,7 @@ transitParam = buildTransitParam(["punch", "voorraad", "mld_key", "artikel_key",
%>
<script type="text/javascript" >
var disc_url = "../bes/bes_select_discipline.asp" + ("<%=correctie%>" == "1" ? "?intern=1" : "");
FcltMgr.openModalDetail(disc_url, "<%=L("lcl_bes_fac_select_cat")%>",
FcltMgr.openModalDetail(disc_url, L("lcl_bes_fac_select_cat"),
{ nomessage: true,
callback: function (data)
{

View File

@@ -542,7 +542,7 @@ oRs.Close();
return false;
url = "../bes/sel_favourites.asp?disc_key=<%=bes_bestelling.dis_key%>";
FcltMgr.openModalDetail(url, "<%=L("lcl_bes_favour_title")%>",
FcltMgr.openModalDetail(url, L("lcl_bes_favour_title"),
{
callback: async function (data)
{
@@ -599,7 +599,7 @@ oRs.Close();
url = "../bes/addFavourites.asp" + "?srtdeel_key=" + bes_item_info.srtdeel_key
+ "&disc_key=<%=bes_bestelling.dis_key%>";
FcltMgr.openModalDetail(url, '<%=L("lcl_bes_favour_list")%>');
FcltMgr.openModalDetail(url, L("lcl_bes_favour_list"));
}
</script>
@@ -1028,7 +1028,7 @@ oRs.Close();
</td>
<td class="besdetailtd">
<table class="besdetailtable">
<tr><td colspan="2" class="iteminfo2" title="<%= L("lcl_bes_srtgroup") %>" id="srtgroep_text"></td></tr>
<tr><td colspan="2" class="iteminfo2" title="<%=L("lcl_bes_srtgroup")%>" id="srtgroep_text"></td></tr>
<tr><td colspan="2" class="iteminfo1" title="<%=L("lcl_bes_srtdeel_full")%>" id="srtdeel_omschrijving"></td></tr>
<tr id="opmerking_tr" style="display:none">

View File

@@ -250,7 +250,7 @@ user.auth_required_or_abort(this_bes.canRetourBES);
}
%>
<script type="text/javascript">
FcltMgr.closeDetail(window, {success: true, warning: "<%=L("lcl_bes_registered_nr") + " " + new_bes_key%>"});
FcltMgr.closeDetail(window, {success: true, warning: L("lcl_bes_registered_nr") + " <%=new_bes_key%>"});
</script>
<%
Response.End;

View File

@@ -47,12 +47,13 @@ function updateDisc(pautfunction, pdisc, psrtgroup, psrtdeel)
$("#instock").closest("tr").show();
}
var ldisctype = $('#disctype :selected').val();
var ldisctype = $('#disctype :selected').val() || -1;
$("#disc").load("../Shared/loadBESDisc.asp?" + serializeObj(
{ autfunction: pautfunction,
disctype: ldisctype,
module: "bes",
emptyOption: "",
selectjustone: 1,
disc_key_arr: (pdisc? pdisc : []) }),
function ()
{ // Selecteer eventueel de initi<74>le items die meegegeven kunnen worden
@@ -68,6 +69,7 @@ function updateSrtGroup(pautfunction, psrtgroup, psrtdeel)
disc_key_arr: ldis_key,
module: "bes",
emptyOption: "",
selectjustone: 1,
srtgroup: (psrtgroup? psrtgroup : []) }),
function ()
{ // Selecteer eventueel de initi<74>le items die meegegeven kunnen worden
@@ -84,6 +86,7 @@ function updateSrtDeel(pautfunction, psrtdeel)
srtgroup_key_arr: lsrtgroup,
module: "bes",
emptyOption: "",
selectjustone: 1,
srtdeel: (psrtdeel? psrtdeel : []),
verwijderd: (maninfo ? 1 : ""),
datefrom: (maninfo ? $('#date_from').val() : "")

View File

@@ -25,6 +25,7 @@ function bes_voorraad_list (pautfunction, params)
// params.urole : the usuals two-letter lowercase string
// params.outputmode : print to 0 = screen, 1 = printer, 2 = excel, etc.
// params.showall : boolean (true | false)
// params.catalogus_type: key
// params.catalogus_key : key
// params.besgroep_key :
// params.item_key :
@@ -212,8 +213,8 @@ function bes_voorraad_list (pautfunction, params)
rst.addColumn(new Column({caption: "Uit-maar nog in magazijn", content: "aantal_uitmaarnoginmagazijn", datatype: "number", total: true}));
rst.addColumn(new Column({caption: L("lcl_bes_voorraad"), content: "voorraad", datatype: "number", total: true}));
rst.addColumn(new Column({caption: L("lcl_bes_unity"), content: "eenheid_extern"}));
rst.addColumn(new Column({caption: L("lcl_bes_voorraadmin"), content: "voorraadmin"}));
rst.addColumn(new Column({caption: L("lcl_bes_voorraadmax"), content: "voorraadmax"}));
rst.addColumn(new Column({caption: L("lcl_bes_voorraadmin"), content: "voorraadmin", datatype: "number"}));
rst.addColumn(new Column({caption: L("lcl_bes_voorraadmax"), content: "voorraadmax", datatype: "number"}));
rst.addColumn(new Column({caption: L("lcl_bes_lopend"), content: "aantal_open_order", datatype: "number", total: true}));
rst.addColumn(new Column({caption: L("lcl_bes_bestellen"), content: fncolTeBestellen, datatype: "number", total: true}));
}
@@ -245,4 +246,3 @@ function bes_voorraad_list (pautfunction, params)
<%
}
%>

View File

@@ -78,6 +78,16 @@ var authparams = user.checkAutorisation(autfunction);
<input type="hidden" name="urole" value="<%=urole%>">
<% // <!-- Catalogus type -->
var sql = "SELECT SUM(CASE"
+ " WHEN dp.bes_disc_params_bestelmode = 0"
+ " THEN 1"
+ " ELSE 0"
+ " END) aantal_uitcat"
+ " , SUM(CASE"
+ " WHEN dp.bes_disc_params_bestelmode = 1"
+ " THEN 1"
+ " ELSE 0"
+ " END) aantal_vrij"
+ " , SUM(CASE"
+ " WHEN dp.bes_disc_params_bestelmode = 2"
+ " THEN 1"
+ " ELSE 0"
@@ -89,12 +99,28 @@ var authparams = user.checkAutorisation(autfunction);
+ " END) aantal_actueel"
+ " FROM bes_discipline bd"
+ " , bes_disc_params dp"
+ " WHERE bd.ins_discipline_key = dp.bes_ins_discipline_key";
+ " WHERE bd.ins_discipline_key = dp.bes_ins_discipline_key"
+ " AND bd.ins_discipline_verwijder IS NULL"
+ " AND bd.ins_discipline_key IN (SELECT dp.bes_ins_discipline_key_inkoop"
+ " FROM bes_disc_params dp"
+ " WHERE dp.bes_ins_discipline_key_inkoop IS NOT NULL)"
+ " AND ins_discipline_key IN (SELECT ins_discipline_key"
+ " FROM fac_v_webgebruiker g"
+ " , fac_functie f"
+ " WHERE g.prs_perslid_key = " + user_key
+ " AND f.fac_functie_key = g.fac_functie_key "
+ " AND f.fac_functie_code = " + safe.quoted_sql(autfunction) + ")";
var oRs = Oracle.Execute(sql);
var aantal_bestel = oRs("aantal_bestel").Value;
var aantal_actueel = oRs("aantal_actueel").Value;
var aantal_uitcat = oRs("aantal_uitcat").Value; // Uit catalogus(0).
var aantal_vrij = oRs("aantal_vrij").Value; // Vrij aanmaken(1).
var aantal_bestel = oRs("aantal_bestel").Value; // Bestellijst(2).
var aantal_actueel = oRs("aantal_actueel").Value; // Actuele lijst(3).
oRs.Close();
var sql_arr = [];
if (aantal_uitcat > 0)
sql_arr.push("SELECT 0, " + safe.quoted_sql(L("lcl_bes_fromcatalog")) + " FROM DUAL");
if (aantal_vrij > 0)
sql_arr.push("SELECT 1, " + safe.quoted_sql(L("lcl_bes_createfreely")) + " FROM DUAL");
if (aantal_bestel > 0)
sql_arr.push("SELECT 2, " + safe.quoted_sql(L("lcl_bes_orderlist")) + " FROM DUAL");
if (aantal_actueel > 0)
@@ -107,6 +133,7 @@ var authparams = user.checkAutorisation(autfunction);
onChange: 'updateDisc("' + autfunction + '");', // discChanged
trclass: "primsearch",
emptyOption: "",
selectjustone: true, // required zorgt er eigenlijk ook al voor dat als er maar 1 waarde is, dat deze wordt geselecteerd.
required: true
});
@@ -131,7 +158,8 @@ var authparams = user.checkAutorisation(autfunction);
label: L("lcl_bes_Catalogus"),
onChange: 'updateSrtGroup("' + autfunction + '");', // discChanged
trclass:"primsearch",
emptyOption: ""
emptyOption: "",
selectjustone: true
});
%>
@@ -142,7 +170,8 @@ var authparams = user.checkAutorisation(autfunction);
label: L("lcl_bes_srtgroup"),
onChange: 'updateSrtDeel("' + autfunction + '");', // srtgroupChanged
trclass: "secsearch",
emptyOption: ""
emptyOption: "",
selectjustone: true
}); %>
<!-- Item select box -->
@@ -151,14 +180,15 @@ var authparams = user.checkAutorisation(autfunction);
{ initKey: srtdeel,
label: L("lcl_bes_srtdeel"),
trclass: "secsearch",
emptyOption: ""
emptyOption: "",
selectjustone: true
}); %>
<script type="text/javascript">
// Laad de groupen en de items
// Selecteer eventueel de initi<74>le groepen en items die meegegeven kunnen worden
$(function()
{
updateDisc("<%=autfunction%>", "<%=disc%>", "<%=srtgroup%>", "<%=srtdeel%>");
updateDisc("<%=autfunction%>", "<%=disc%>", "<%=srtgroup%>", "<%=srtdeel%>");
});
</script>
<% SEARCH_BLOCK_END();

View File

@@ -70,6 +70,7 @@ else
{ urole : urole,
outputmode: outputmode,
showall: showall,
catalogus_type: (disctype != -1? disctype : null),
catalogus_key: (disc != -1? disc : null),
besgroep_key: (besgroep_key != -1? besgroep_key : null),
item_key: (item_key != -1? item_key : null),

View File

@@ -17,7 +17,8 @@ bez =
// t.prs_afdeling_key (nog) niet
var sql_terr = "SELECT alg_terreinsector_key"
+ " FROM alg_v_aanwezigterreinsector t WHERE 1=1";
+ " FROM alg_v_aanwezigterreinsector t"
+ " WHERE (t.alg_terreinsector_vervaldatum IS NULL OR t.alg_terreinsector_vervaldatum > TRUNC(SYSDATE))";
var pafparams = user.checkAutorisation("WEB_BEZPAF", true);
var autlevel = 9;
if (pafparams)

View File

@@ -70,11 +70,11 @@ function bez_edit_bezoekers(afspraak_key, afspraak_begin, afspraak_eind, loc_key
{ %>
<th><!--contact--></th>
<% } %>
<th><%=L("lcl_vis_name")%></th>
<th><%=L("lcl_vis_company")%><%=S("bez_sel_internpersoon") == 1? "/" + L("lcl_department") : ""%></th>
<th><%=safe.html(L("lcl_vis_name"))%></th>
<th><%=safe.html(L("lcl_vis_company"))%><%=S("bez_sel_internpersoon") == 1? "/" + safe.html(L("lcl_department")) : ""%></th>
<% if (S("vis_remark") == 1 || S("vis_remark") == 2)
{ %>
<th><%=L("lcl_vis_remark")%></th>
<th><%=safe.html(L("lcl_vis_remark"))%></th>
<% } %>
<th>
<% if (S("vis_parking_key") != -1 && this_bez_bez.canWritePrk)
@@ -184,7 +184,7 @@ function bez_edit_bezoekers(afspraak_key, afspraak_begin, afspraak_eind, loc_key
<td align="center">
<% if (oRs("bez_bezoekers_done").Value == null)
{ %>
<span onclick="deleteVisit(<%=next_vis%>)" title="<%=L("lcl_delete")%>"><%=I("fa-trash-alt")%></span>
<span onclick="deleteVisit(<%=next_vis%>)" title="<%=safe.htmlattr(L("lcl_delete"))%>"><%=I("fa-trash-alt")%></span>
<%
} else {
anydone = true;

View File

@@ -235,6 +235,7 @@ function bez_list(pautfunction, params)
: " , a.bez_afspraak_datum bez_afspraak_datum"
+ " , a.bez_afspraak_eind bez_afspraak_eind")
+ " , " + S("prs_pers_string") + " pers_naam"
+ " , p.prs_perslid_email contact_email"
+ " , a.bez_afspraak_gastheer gastheer"
+ " , p2.prs_perslid_email gastheer_email"
+ " , COALESCE(a.bez_afspraak_telefoonnr, p2.prs_perslid_telefoonnr, p2.prs_perslid_mobiel) gastheer_telf_nr"
@@ -259,7 +260,7 @@ function bez_list(pautfunction, params)
+ " FROM (SELECT i.ins_deel_key"
+ " , i.ins_alg_ruimte_key"
+ " , i.ins_alg_ruimte_type"
+ " FROM ins_deel i"
+ " FROM ins_v_deelenonderdeel i"
+ " , ins_srtdeel s"
+ " WHERE s.ins_srtdeel_key = i.ins_srtdeel_key"
+ " AND i.ins_deel_verwijder IS NULL"
@@ -272,7 +273,7 @@ function bez_list(pautfunction, params)
+ " SELECT i.ins_deel_key"
+ " , i.ins_alg_ruimte_key"
+ " , i.ins_alg_ruimte_type"
+ " FROM ins_deel i"
+ " FROM ins_v_deelenonderdeel i"
+ " , ins_srtdeel s"
+ " WHERE s.ins_srtdeel_key = i.ins_srtdeel_key"
+ " AND i.ins_deel_verwijder IS NULL"
@@ -1132,17 +1133,19 @@ function bez_list(pautfunction, params)
var safe_content = "";
var chatHostMail = oRs("gastheer_email").Value;
var chatHostName = oRs("gastheer").Value || "";
var chatContactMail = oRs("contact_email").Value;
var chatContactName = oRs("pers_naam").Value || "";
var bez_naam = oRs("bez_afspraak_naam").Value || "";
var bez_bedrijf = oRs("bez_bedrijf").Value || "";
var locatie = oRs("loc_omschr").Value || "";
var defaultMessage = L("lcl_bezchat_message").format(bez_naam, bez_bedrijf, locatie).replace("()", "");
if (outputmode == 0 && oRs("authorized").Value == 1 && chatHostMail && ((oRs("bez_actie_flags").Value & 4)==4))
{
var chatUrl = S("bez_chat_message").format(chatHostMail, Server.URLencode(defaultMessage));
var chatUrl = S("bez_chat_message").format(chatHostMail, Server.URLencode(defaultMessage), chatContactMail);
safe_content = '<span id="chatIN' + oRs("bez_key").Value + '"'
+ ' class="ilbutton"'
+ ' OnClick="doLaunchChat(event, \'' + safe.jsstring(chatUrl) + '\');"'
+ ' title="' + safe.htmlattr(L("lcl_bezchat_launch").format(chatHostName)) + '"'
+ ' title="' + safe.htmlattr(L("lcl_bezchat_launch").format(chatHostName, chatContactName)) + '"'
+ '>' + I("fa-comment-exclamation") + '</span>';
safe_content = "<div id='chatlink" + oRs("bez_key").Value + "'"
+ (oRs("bez_bezoekers_done").value === null ? " class='hidden'" : "")

View File

@@ -322,7 +322,7 @@ function buildSymbols(cHandle, symbolProps)
// Zoniet markeer hem dan met een *STAR er achter
var rnr = cHandle.FindInContour(oRs("dwgX").Value, oRs("dwgY").Value);
// Let op: Sinds 5.3.2 zit R:12345 in de dwf-contour-key
if (!rnr || !rnr.match(/^R:/) || rnr.substr(2) != oRs("cadkey").Value)
if ((!rnr || !rnr.match(/^R:/) || rnr.substr(2) != oRs("cadkey").Value) && user.has(["WEB_CADBOF", "WEB_CADFOF"]))
{
var symbol = cHandle.AddSymbol(oRs("dwgX").Value+scl*S("fg_dobbelDist")/2, oRs("dwgY").Value+scl*S("fg_dobbelDist")/2,"*STAR");
symbol.Scale = scl*0.25;

View File

@@ -109,6 +109,20 @@ if (geb_key == -1 && floor_key != -1) {
geb_key = oRs("alg_gebouw_key").value;
oRs.Close();
}
var multi_tz = Session("time_zone") != S("fac_server_timezone"); // Hebben we te maken met een gebouw, gebruiker of server in een afwijkende tijdszone?
if (!multi_tz) {
var sql = "SELECT l.alg_locatie_timezone"
+ " FROM alg_locatie l, alg_gebouw g"
+ " WHERE g.alg_gebouw_key = " + geb_key
+ " AND g.alg_locatie_key = l.alg_locatie_key";
var oRs = Oracle.Execute(sql);
var alg_tz = !oRs.EOF && oRs("alg_locatie_timezone").Value
|| S("fac_server_timezone");
oRs.Close();
multi_tz = alg_tz != Session("time_zone");
}
var hidenav = getQParamInt("hidenav", 0); // optie: toon geen floornavigator
var fac_usrrap_key = getQParamInt("fac_usrrap_key", S("fg_infobordreport_key")); // In de core is een default usrrap (res_v_rap_infobordframe) met key <12> gedefinieerd
@@ -236,7 +250,7 @@ if (fac_usrrap_key > -1)
} );
}
else
MMap.Refresh();
MMap.Refresh(false, true); // geen autozoom
}
@@ -404,7 +418,7 @@ var /*global*/ resizeTimerID=null;
Response.Write("<h2 class='floorscreen'>" + safe.html(oRs("alg_gebouw_naam").value) + "</h2>");
if (datumfilter)
{
Response.Write("<h2 class='infodatumfilter'>" + toDateString(datumfilter, false, true) + "</h2>");
Response.Write("<h2 class='infodatumfilter'>" + toDateString(datumfilter, { pretty: !multi_tz }) + "</h2>");
if (showmode == 0)
{
Response.Write("<button onclick='to2D()'>2D</button'><button onclick='to3D()'>3D</button>");
@@ -425,7 +439,7 @@ if (thema_key > 0)
if (disc_key > 0)
{
var sqlMaxKleur = "SELECT ar.alg_verdieping_key, MAX(thema.waarde) waarde, ti.cad_legendawaarde_rgb, count(*) aantal "
+ " FROM ins_deel id, "
+ " FROM ins_v_deelenonderdeel id, "
+ " ins_srtdeel isd, "
+ " alg_ruimte ar, "
+ " ( "+ thema_view + ") THEMA, "

View File

@@ -36,7 +36,7 @@ if (inoutMode == MODE_IN && scenario_key > 0)
}
else if (inoutMode == MODE_IN)
{
deelTable = "ins_deel";
deelTable = "ins_v_deelenonderdeel";
deelParent = "ins_alg_ruimte_key";
dbTable = "alg_ruimte";
dbLabel = "alg_ruimte_nr";
@@ -46,7 +46,7 @@ else if (inoutMode == MODE_IN)
}
else
{
deelTable = "ins_deel";
deelTable = "ins_v_deelenonderdeel";
deelParent = "ins_alg_ruimte_key";
dbTable = "alg_terreinsector";
dbLabel = "alg_terreinsector_code";

View File

@@ -261,7 +261,7 @@ function addObjecten(cHandle, highlight_ins_deel_key)
// Dat aantal moeten we van te voren weten om linksboven de dobbel te
// kunnen beginnen
sql = "SELECT ins_alg_ruimte_key alg_ruimte_key, count(*) aantal"
+ " FROM ins_deel id, ins_srtdeel isd, ins_srtgroep isg, " + dbTable + " SYNC"
+ " FROM ins_v_deelenonderdeel id, ins_srtdeel isd, ins_srtgroep isg, " + dbTable + " SYNC"
+ " WHERE id.ins_alg_ruimte_key = SYNC." + colKey
// + " AND id.ins_alg_ruimte_type = 'R'"
+ " AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
@@ -296,7 +296,7 @@ function addObjecten(cHandle, highlight_ins_deel_key)
sql : "SELECT 'I:'||ins_deel_key key, ins_deel_omschrijving oms,"
+ " ins_srtdeel_acadsymbol symbolname, ins_disc_params_type,"
+ " ins_srtdeel_acadsymbol_dwgx orgx, ins_srtdeel_acadsymbol_dwgy orgy, di.ins_discipline_color color"
+ " FROM ins_deel id, ins_srtdeel isd, ins_srtgroep isg,"
+ " FROM ins_v_deelenonderdeel id, ins_srtdeel isd, ins_srtgroep isg,"
+ " ins_disc_params isdp, ins_tab_discipline di"
+ " WHERE id.ins_alg_ruimte_key = " + oRsRuimte("alg_ruimte_key").Value
+ " AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
@@ -335,7 +335,7 @@ function addObjecten(cHandle, highlight_ins_deel_key)
+ " ins_srtdeel_acadsymbol_dwgx orgx, ins_srtdeel_acadsymbol_dwgy orgy,"
+ " ins_srtdeel_acadlabelpos lpos, ins_srtdeel_acadlabelsize lsize,"
+ " id.ins_alg_ruimte_key cadkey, ins_disc_params_type, di.ins_discipline_color color"
+ " FROM ins_deel id, ins_srtdeel isd, ins_srtgroep isg, "+dbTable+" SYNC,"
+ " FROM ins_v_deelenonderdeel id, ins_srtdeel isd, ins_srtgroep isg, "+dbTable+" SYNC,"
+ " ins_disc_params isdp, ins_tab_discipline di"
+ " WHERE id.ins_alg_ruimte_key = SYNC."+colKey
+ " AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
@@ -383,7 +383,7 @@ function addObjecten(cHandle, highlight_ins_deel_key)
fnSql: function (viewName)
{
return "SELECT 'I:'||id.ins_deel_key key, thema.*"
+ " FROM ins_deel id, ins_srtdeel isd, ins_srtgroep isg, "+dbTable+" SYNC, " + viewName + " THEMA"
+ " FROM ins_v_deelenonderdeel id, ins_srtdeel isd, ins_srtgroep isg, "+dbTable+" SYNC, " + viewName + " THEMA"
+ " WHERE id.ins_alg_ruimte_key = SYNC."+colKey
+ " AND id.ins_srtdeel_key = isd.ins_srtdeel_key"
+ " AND "+syncParent+" = " + pvKey
@@ -441,7 +441,7 @@ function addWerkplekObjecten(cHandle)
+ " isd.ins_srtdeel_key, ins_srtdeel_acadsymbol, " + dbLabel + " dblabel,"
+ " ins_srtdeel_acadsymbol_dwgx orgx, ins_srtdeel_acadsymbol_dwgy orgy,"
+ " '#000000' color" //zwart?
+ " FROM ins_deel id, ins_srtdeel isd, ins_srtgroep isg, alg_ruimte ar,"
+ " FROM ins_v_deelenonderdeel id, ins_srtdeel isd, ins_srtgroep isg, alg_ruimte ar,"
+ " prs_werkplek pw"
+ " WHERE pw.prs_alg_ruimte_key = ar.alg_ruimte_key"
+ " AND id.ins_alg_ruimte_key = pw.prs_werkplek_key"
@@ -503,7 +503,7 @@ function addWerkplekObjecten(cHandle)
fnSql: function (viewName)
{
return "SELECT 'IW:'||id.ins_deel_key key, waarde"
+ " FROM ins_deel id, ins_srtdeel isd, ins_srtgroep isg, "
+ " FROM ins_v_deelenonderdeel id, ins_srtdeel isd, ins_srtgroep isg, "
+ " alg_ruimte SYNC, " + viewName + " THEMA,"
+ " prs_werkplek pw"
+ " WHERE pw.prs_alg_ruimte_key = SYNC.alg_ruimte_key"

View File

@@ -264,7 +264,7 @@ var datumfilter = getQParamDate("datumfilter", null);
+ " , o.alg_verdieping_omschrijving"
+ " , o.alg_ruimte_key"
+ " , l.alg_district_key"
+ " FROM ins_deel g, alg_ruimte ar,"
+ " FROM ins_v_deelenonderdeel g, alg_ruimte ar,"
+ " ins_v_alg_overzicht o,"
+ " ins_srtdeel s, alg_locatie l, alg_district di " // I added this for alg_district_key (FSN#1082)
+ " WHERE g.ins_deel_verwijder IS NULL"

View File

@@ -1749,7 +1749,7 @@ if (scenario_key != 0)
%>
</table>
</div>
<div id="fgmenutoggler" class='toggler' onClick="toggleLayout(this)" title='<%=L("lcl_toggler")%>'>
<div id="fgmenutoggler" class='toggler' onClick="toggleLayout(this)" title='<%=safe.htmlattr(L("lcl_toggler"))%>'>
</div>
@@ -1794,7 +1794,7 @@ if (scenario_key != 0)
</iframe>
<% } %>
</div>
<div id="fgtabtoggler" class='toggler' onClick="toggleTabLayout(this)" title='<%=L("lcl_toggler")%>'><%=I("fa-caret-down", { fastyle: "fas" })%></div>
<div id="fgtabtoggler" class='toggler' onClick="toggleTabLayout(this)" title='<%=safe.htmlattr(L("lcl_toggler"))%>'><%=I("fa-caret-down", { fastyle: "fas" })%></div>
<%
if (scenario_key > 0)

View File

@@ -595,8 +595,8 @@ function myIMGProcessor(IMGHandle)
// Vertaal dat zo mogelijk naar alg_ruimte_key dan wel ins_deel_key
function myFindKeys(SlnkEvent)
{
if (SlnkEvent.TextLabel != "" && SlnkEvent.TextLayer == "SLNK Labels")
{ // Precies op ruimte label geklikt negeren we
if (SlnkEvent.TextLabel != "" && (SlnkEvent.TextLayer == "SLNK Labels" || SlnkEvent.TextLayer == "SLNK Symbols"))
{ // Precies op ruimte of object label geklikt negeren we
SlnkEvent.TextLabel = "";
SlnkEvent.TextLayer = "";
}

View File

@@ -256,7 +256,7 @@ var /*global*/ resizeTimerID=null;
if (disc_key > 0)
{
var sqlMaxKleur = "SELECT ar.alg_verdieping_key, MAX(thema.waarde) waarde, ti.cad_legendawaarde_rgb, count(*) aantal "
+ " FROM ins_deel id, "
+ " FROM ins_v_deelenonderdeel id, "
+ " ins_srtdeel isd, "
+ " alg_ruimte ar, "
+ " ( "+ thema_view + ") THEMA, "

View File

@@ -129,14 +129,14 @@
// session ended due to inactivity
if (data.end == 1)
{
add2chat([{safe_message: "<%=L('lcl_chat_inactive_ended')%>", sincetime: toTimeString(new Date(), true), fromname: "<%=L('lcl_chat_system')%>", inactive: true, mine: false}]);
add2chat([{safe_message: L('lcl_chat_inactive_ended'), sincetime: toTimeString(new Date(), true), fromname: L('lcl_chat_system'), inactive: true, mine: false}]);
$("#chat, span.sendbutton").attr('readonly', true);
return false; // stop polling notify
}
// session aborted by user
else if (data.end == 2)
{
add2chat([{safe_message: "<%=L('lcl_chat_user_ended')%>", sincetime: toTimeString(new Date(), true), fromname: "<%=L('lcl_chat_system')%>", aborted: true, mine: false}]);
add2chat([{safe_message: L('lcl_chat_user_ended'), sincetime: toTimeString(new Date(), true), fromname: L('lcl_chat_system'), aborted: true, mine: false}]);
$("#chat, span.sendbutton").attr('readonly', true);
return false; // stop polling notify
}
@@ -152,18 +152,18 @@
ago15.setMinutes(ago15.getMinutes() - 15);
if (!ended && last_alive < ago15.getTime())
{
add2chat([{safe_message: "<%=L("lcl_chat_ended")%>", sincetime: toTimeString(new Date(), true), fromname: "<%=L('lcl_chat_system')%>", inactive: true, system: true, mine: false}]);
add2chat([{safe_message: L("lcl_chat_ended"), sincetime: toTimeString(new Date(), true), fromname: L('lcl_chat_system'), inactive: true, system: true, mine: false}]);
$("#chat, span.sendbutton").attr('readonly', true);
notify.end(chatSendchannelId, chatReadchannelId, 1); // session ended due to inactivity
ended = true;
return false;
} else if (!warning_2 && last_alive < ago14.getTime())
{
add2chat([{safe_message: "<%=L("lcl_chat_inactive_warning_2")%>", sincetime: toTimeString(new Date(), true), fromname: "<%=L('lcl_chat_system')%>", system: true, mine: false}]);
add2chat([{safe_message: L("lcl_chat_inactive_warning_2"), sincetime: toTimeString(new Date(), true), fromname: L('lcl_chat_system'), system: true, mine: false}]);
warning_2 = true;
} else if (!warning_1 && last_alive < ago10.getTime())
{
add2chat([{safe_message: "<%=L("lcl_chat_inactive_warning_1")%>", sincetime: toTimeString(new Date(), true), fromname: "<%=L('lcl_chat_system')%>", system: true, mine: false}]);
add2chat([{safe_message: L("lcl_chat_inactive_warning_1"), sincetime: toTimeString(new Date(), true), fromname: L('lcl_chat_system'), system: true, mine: false}]);
warning_1 = true;
}
}
@@ -194,7 +194,7 @@
fcltlinks: 1,
input: msg
}, function (json) {
add2chat([{ safe_message: json.fclthtml, sincetime: toTimeString(new Date(), true), fromname: "<%=L('lcl_chat_selfname')%>", mine: true }]);
add2chat([{ safe_message: json.fclthtml, sincetime: toTimeString(new Date(), true), fromname: L('lcl_chat_selfname'), mine: true }]);
chat_dosend(msg);
});
}

View File

@@ -114,7 +114,7 @@ Application.UnLock();
.data("wantid", wantId)
.data("prs_key", wanting.prs_key)
.data("prs_naam", wanting.naam)
.attr("title", "<%=L('lcl_chat_accept_action')%>")
.attr("title", "<%=safe.htmlattr(L('lcl_chat_accept_action'))%>")
.click(accept_chat);
html_queue.append(html_row);
}

View File

@@ -149,18 +149,18 @@ Application.UnLock();
{
if (init)
{
$("#chatmsg").text("<%=L("lcl_chat_initialmsg")%>");
$("#chatmsg").text(L("lcl_chat_initialmsg"));
$("span.spinnerbutton, span.cancelbutton").hide();
$("#initialmsg").autogrow().focus().on("keydown", handleEnter);
}
else
{
$("#chatmsg").text("<%=L("lcl_chat_waiting")%>");
$("#chatmsg").text(L("lcl_chat_waiting"));
}
}
else
{
$("#chatmsg").text("<%=L("lcl_chat_no_listeners")%>");
$("#chatmsg").text(L("lcl_chat_no_listeners"));
$("div.text-wrapper").hide();
}
FcltMgr.resized();
@@ -181,13 +181,13 @@ Application.UnLock();
<div class="chatinitialmsg" id="chatmsg"></div>
<div class="text-wrapper">
<textarea id="initialmsg" class="fldtxt" placeholder='<%=L("lcl_chat_initialmessage")%>'></textarea>
<span class="sendbutton" onclick="chat_ask()" title="<%=L("lcl_chat_waiting").format(wantchannelId)%>">
<span class="sendbutton" onclick="chat_ask()" title="<%=safe.htmlattr(L("lcl_chat_waiting")).format(wantchannelId)%>">
<%=I("fa-paper-plane fa-lg")%>
</span>
<span class="spinnerbutton" title="<%=L("lcl_chat_waiting").format(wantchannelId)%>">
<span class="spinnerbutton" title="<%=safe.htmlattr(L("lcl_chat_waiting")).format(wantchannelId)%>">
<%=I("fa-fclt-spinner fa-lg fas")%>
</span>
<span class="cancelbutton" onclick="chat_remove()" title="<%=L("lcl_chat_waiting").format(wantchannelId)%>">
<span class="cancelbutton" onclick="chat_remove()" title="<%=safe.htmlattr(L("lcl_chat_waiting")).format(wantchannelId)%>">
<%=I("fa-times fa-lg")%>
</span>
</div>

View File

@@ -127,15 +127,20 @@ cnt = { setcontractstatus:
// Tot welk bedrag is er al goedgekeurd.
var sql = "SELECT cnt_contract_approved"
+ " , cnt_contract_kosten"
+ " , dp.cnt_disc_params_approve_new"
+ " FROM cnt_contract c"
+ " WHERE cnt_contract_key = " + cnt_key;
+ " , cnt_disc_params dp"
+ " WHERE cnt_contract_key = " + cnt_key
+ " AND c.ins_discipline_key = dp.cnt_ins_discipline_key";
var oRs = Oracle.Execute(sql);
var kosten = oRs("cnt_contract_kosten").Value? oRs("cnt_contract_kosten").Value : 0;
var approved = oRs("cnt_contract_approved").Value? oRs("cnt_contract_approved").Value : -1;
var nieuwAltijdAccorderen = (oRs("cnt_disc_params_approve_new").Value == 1);
oRs.Close();
var functie_code;
if (kosten <= S("cnt_contract_limit1")) // Dit eerst testen i.v.m. Ter goedkeuring. Verder moet sowieso goedgekeurd worden.
if (!kosten && nieuwAltijdAccorderen)
functie_code = "WEB_CNTGO1";
else if (kosten <= S("cnt_contract_limit1")) // Dit eerst testen i.v.m. Ter goedkeuring. Verder moet sowieso goedgekeurd worden.
return []; // Het bedrag is lager als de eerste limiet. Het contract hoeft niet goed gekeurd te worden, dus een lege fiatteurs array teruggeven.
else if ((S("cnt_approval_all") == 0 && approved <= S("cnt_contract_limit1")) || (S("cnt_approval_all") == 1 && kosten <= S("cnt_contract_limit2")))
functie_code = "WEB_CNTGO1";
@@ -1081,6 +1086,7 @@ cnt = { setcontractstatus:
+ " , dp.cnt_disc_params_huurder"
+ " , dp.cnt_disc_params_opties"
+ " , dp.cnt_disc_params_ksverplicht"
+ " , dp.cnt_disc_params_approve_new"
+ " , cc.cnt_contract_mantel_key"
+ " , mc.cnt_contract_nummer_intern mantelcontractnummer"
+ " , mc.cnt_contract_omschrijving mantelomschrijving"
@@ -1178,7 +1184,8 @@ cnt = { setcontractstatus:
nnScope: oRs("nnScope").Value,
isAbonnement: oRs("bes_disc_params_contract").Value == 1,
magAutomatischVerlengen: oRs("cnt_disc_params_opties").Value == 1,
openfinref: oRs("openfinref").Value > 0
openfinref: oRs("openfinref").Value > 0,
nieuwAltijdAccorderen: oRs("cnt_disc_params_approve_new").Value == 1
};
oRs.Close()
@@ -1248,7 +1255,8 @@ cnt = { setcontractstatus:
cresult.canGoedkeur1 = cresult.canWrite("WEB_CNTGO1") && // Heb ik de rechten om goed te keuren op dit niveau 1?
terGoedkeuring && // Moet het contract gekeurd worden (juiste status)
((S("cnt_approval_all") == 0 && cnt_info.kosten >= S("cnt_contract_limit1")) || // Zijn de kosten hoger als de limiet
((!cnt_info.kosten && cnt_info.nieuwAltijdAccorderen) || // Zonder kosten toch accorderen?
(S("cnt_approval_all") == 0 && cnt_info.kosten >= S("cnt_contract_limit1")) || // Zijn de kosten hoger als de limiet
(S("cnt_approval_all") == 1 && cnt_info.kosten <= S("cnt_contract_limit2"))) && // Zijn de kosten onder mijn limiet om volledig goed te keuren
cnt_info.approved <= S("cnt_contract_limit1"); // Welke goedkeur? 1, 2 of 3?
cresult.canGoedkeur2 = cresult.canWrite("WEB_CNTGO2") &&

View File

@@ -3,7 +3,7 @@
$Revision$
$Id$
File: CNT/cnt_show_contract.asp
File: CNT/cnt_contract.asp
Description: Functie bestaand contractrecord toont of nieuwe laat editen
Parameters: cnt_key Contract key
Context:
@@ -60,9 +60,16 @@ var pageTitle = L('lcl_contract');
var pageIcon = "fa-file-certificate"; // default
if (cnt_key > 0)
{
sql = "SELECT cnt_contract_nummer_intern, cnt_contract_versie, cnt_disc_params_factuurschema, cnt_contract_omschrijving, cs.ins_discipline_image"
sql = "SELECT cnt_contract_nummer_intern"
+ " , cnt_contract_versie"
+ " , cnt_disc_params_factuurschema"
+ " , cnt_contract_omschrijving"
+ " , dp.cnt_srtcontract_type"
+ " , cs.ins_discipline_image"
+ " , "+ lcl.xsqla('cs.ins_discipline_omschrijving','cs.ins_discipline_key')
+ " FROM cnt_contract c, cnt_disc_params dp, cnt_discipline cs"
+ " FROM cnt_contract c"
+ " , cnt_disc_params dp"
+ " , cnt_discipline cs"
+ " WHERE cnt_contract_key = " + cnt_key
+ " AND c.ins_discipline_key = cs.ins_discipline_key"
+ " AND c.ins_discipline_key = dp.cnt_ins_discipline_key";
@@ -70,6 +77,7 @@ if (cnt_key > 0)
if (oRs.eof)
shared.record_not_found();
hasFactuurschema = (oRs("cnt_disc_params_factuurschema").Value == 1);
var srtcontract_type = oRs("cnt_srtcontract_type").Value;
var cnt_contract_versie = oRs("cnt_contract_versie").Value;
if (copy)
tabtitle = L("lcl_cnt_copy") + " " + tabtitle.toLowerCase();
@@ -87,10 +95,25 @@ if (cnt_key > 0)
%>
<script type="text/javascript">
var cnt_key = <%=cnt_key%>;
var copy = (<%=(copy?1:0)%>)==1;
var verynew = (<%=(verynew?1:0)%>)==1;
var hasScope = (<%=((srtcontract_type != 4 && srtcontract_type != 6) ? 1 : 0)%>) == 1;
$(function ()
{
FcltMgr.setTitle("<%=safe.jsstring(tabtitle)%>", {hot: false});
<% if (cnt_key == -1) { %>FcltMgr.startEdit(window);<% } %>
if (cnt_key == -1)
{
FcltMgr.startEdit(window);
}
else
{
if (verynew && hasScope)
{ // Direct naar tab scope.
$("#frametabs").tabs({ "active": 1 }); // Open direct het scope subframe (2de frame/subtab, dus index == 1)
}
}
})
function contractClose(params)
@@ -98,12 +121,12 @@ if (cnt_key > 0)
if (params.close)
{
FcltMgr.closeDetail(window, { cancel: true } );
return true;;
return true;
}
if (params.keepForm)
return;
<% if (cnt_key == -1 || copy)
{ %>
if (cnt_key == -1 || copy)
{
if (params.cancel)
{
FcltMgr.closeDetail(window, params );
@@ -111,16 +134,14 @@ if (cnt_key > 0)
}
FcltMgr.setTitle(L("lcl_contract") + " " + params.cnt_key, {hot:false});
// TODO geleend van MLD. Is dit hier nodig? Ook is cnt_key niet de juiste tabtekst, maar zien we die?
// nieuw contract, ga verder in 'verynew' modus
// Nieuw contract, ga verder in 'verynew' modus
// Altijd complete reload, we hebben nu een cnt_key namelijk
window.location.href = "cnt_contract.asp?verynew=1&cnt_key=" + params.cnt_key;
<% }
}
else
{ // Bestaand contract bewerkt, switch naar show-mode
%>
$("#cntframe")[0].src = "cnt_show_contract.asp?cnt_key=<%=cnt_key%>";
<% } %>
$("#cntframe")[0].src = "cnt_show_contract.asp?cnt_key=" + cnt_key;
}
}
function scopeClose(params)
@@ -257,6 +278,9 @@ if (cnt_key > 0)
oRs.close();
if (cnt_typecontract != 4 && cnt_typecontract != 6) {
page = "cnt_show_scope.asp?cnt_key=" + cnt_key;
if (verynew) { // Open cnt_edit_scope door in cnt_show_scope gelijk de wijzig-button te activeren.
page += "&verynew=1";
}
IFRAMER("scopeframe", page, { icon: "fa-list", FcltClose: "scopeClose" } );
}

View File

@@ -30,13 +30,11 @@ var isNew = (cnt_key < 0);
var sql = "SELECT cdp.cnt_srtcontract_type"
+ " , cdp.cnt_disc_params_opties"
+ " , cdp.cnt_disc_params_approve_new"
+ " FROM cnt_disc_params cdp"
+ " WHERE cdp.cnt_ins_discipline_key = " + cnt_disc_key;
var oRs = Oracle.Execute(sql);
var srtcontract_type = oRs("cnt_srtcontract_type").Value;
var magAutomatischVerlengen = (oRs("cnt_disc_params_opties").Value & 1) == 1;
var nieuwAltijdAccorderen = (oRs("cnt_disc_params_approve_new").Value == 1);
var doapprove = S("cnt_contract_approval") == 1;
oRs.Close();
@@ -71,14 +69,8 @@ else
var authparams = user.checkAutorisation(autfunction);
// Als het approval mechanisme actief is dan altijd eerst naar status Nieuw(2),
// Staat in het contractsoort dat een nieuw contract altijd geaccordeerd moet worden dan wordt de status "Ter goedkeuring" (3).
// uitgezonderd de Mantel/Master contracten, die gaan altijd langs het goedkeuringsproces.
var nieuw_cnt_status = 0;
if (doapprove && srtcontract_type != 6)
{
nieuw_cnt_status = (nieuwAltijdAccorderen ? 3 : 2);
}
var cnt_info = { contract_status: nieuw_cnt_status };
var cnt_info = { contract_status: (doapprove && srtcontract_type != 6? 2 : 0) }
}
// Bestaat het contractnummer al?
@@ -220,7 +212,6 @@ else
}
else
// Zetten van de contact status. Indien het contract approval mechanisme actief is dan moet de contract status Nieuw(2) worden en anders Actief(0).
// Staat in het contractsoort dat een nieuw contract altijd geaccordeerd moet worden dan wordt de status "Ter goedkeuring" (3).
// Uitgezonderd de Mantel/Master contracten, die gaan altijd langs het goedkeuringsproces naar de status Actief(0).
cnt.setcontractstatus(cnt_key, cnt_info.contract_status); // Zorgt ook voor tracking en daarmee notificatie.
}

View File

@@ -29,6 +29,7 @@ user.auth_required_or_abort(this_cnt.canReadAny);
var showall = getQParamInt("showall", 0) == 1;
var outputmode = getQParamInt("outputmode", 0);
var verynew = getQParamInt("verynew", 0);
%>
<html>
<head>
@@ -57,6 +58,14 @@ var outputmode = getQParamInt("outputmode", 0);
}
FcltMgr.openDetail(url, "");
}
$(function () {
var scopeRequired = (<%=verynew%>==1); // Voor een nieuw contract waarbij de scope moet worden ingevuld
if (scopeRequired) { // gelijk doorsturen naar cnt_edit-scope.
cnt_scopechange();
}
});
</script>
</head>
<body id="listbody">

View File

@@ -1,309 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Facilitor Consoles 2022 Preview</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Custom fonts for this template -->
<link href="../FontAwesome/css/fontawesome.min.css" rel="stylesheet" type="text/css">
<link href="../FontAwesome/css/solid.min.css" rel="stylesheet" type="text/css">
<link
href="https://fonts.googleapis.com/css?family=Nunito:200,200i,300,300i,400,400i,600,600i,700,700i,800,800i,900,900i"
rel="stylesheet">
<!-- Custom styles for this template -->
<link href="css/sb-admin-2.min.css" rel="stylesheet">
<!-- Custom styles for this page -->
<link href="vendor/datatables/dataTables.bootstrap4.min.css" rel="stylesheet">
<!-- Dark mode -->
<link rel="stylesheet" href="dark-mode.css">
<!-- Facilitor style overrules for this page -->
<link rel="stylesheet" href="consoles.css">
</head>
<body id="page-top" class="h-100 bg-white">
<div id="wrapper">
<div id="content-wrapper" class="bg-cornsilk d-flex flex-column">
<div class="jumbotron text-center bg-linen shadow">
<h1><i class="fa fa-heartbeat fa-2x" aria-hidden="true"></i> Facilitor Consoles <i class="fa fa-eye" aria-hidden="true"></i><i>preview</i></h1>
<p>Gebouwenconsole</p>
</div>
<header class="mb-auto bg-transparent">
<nav class="nav justify-content-center float-right">
<div class="nav-link">
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="fluidSwitch">
<label class="custom-control-label" for="fluidSwitch">Fluid mode</label>
</div>
</div>
<div class="nav-link">
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="darkSwitch">
<label class="custom-control-label" for="darkSwitch">Dark Mode</label>
</div>
</div>
</nav>
</header>
<div class="container mb-3">
<div class="row">
<div class="col-xl-7">
<div class="card shadow bg-light" style="min-height: 500px;">
<div class="card-body">
<div id="list-locations" class="table-responsive">
<h2>Locaties</h2>
<p>Loading..</p>
</div>
</div>
</div>
</div>
<div class="col-xl-5">
<div class="" style="min-height: 500px; overflow: hidden;">
<div class="row h-100" hidden>
<div class="card col-xl-12 p-0 bg-light">
<div class="card-body p-0 col-xl-12">
<div id="building-map" class="h-50">
</div>
<div id="building-view" class="h-50">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container mb-3">
<div class="row">
<div class="col-xl-7">
<div class="card shadow bg-light">
<div class="card-body">
<div id="list-buildings" class="table-responsive" style="min-height: 500px;">
<h2>Gebouwen</h2>
<p>Loading..</p>
</div>
</div>
</div>
</div>
<div class="col-xl-5">
<div class="card shadow bg-light overflow-auto" style="min-height: 500px;">
<div class="card-body">
<div id="show-location " hidden>
<h2>Details</h2>
<p>-</p>
</div>
<div id="show-building" hidden>
</div>
</div>
</div>
</div>
</div>
<div class="row" hidden>
<div class="col-xl-12">
<div class="card shadow bg-light" style="min-height: 500px;">
<div class="card-body">
<div id="show-floors">
<div id="filter-floors">
</div>
<div>
<figure class="figure">
<img class="figure-img img-fluid rounded" alt="plan" hidden>
</figure>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-xl-7">
<div class="card shadow col-xl-12 bg-light" style="min-height: 175px;">
<div class="card-body">
<div id="filter-disciplinetypes" class="table-responsive">
<h2>Vakgroeptypen</h2>
<p>Filter meldingen op vakgroeptype</p>
</div>
</div>
</div>
<div class="card shadow col-xl-12 bg-light" style="min-height: 325px;">
<div class="card-body">
<div id="filter-issuedisciplines" class="table-responsive">
<h2>Vakgroepen</h2>
<p>Filter meldingen op Vakgroep</p>
</div>
</div>
</div>
<div class="card shadow col-xl-12 bg-light" hidden>
<div class="card-body">
<div id="filter-issuetypes" class="table-responsive">
<h2>Standaardmeldingen</h2>
<p>Filter meldingen op type melding</p>
</div>
</div>
</div>
</div>
<div class="col-xl-5">
<div class="card shadow col-xl-12 h-100 bg-light" style="min-height: 500px; height: 100%;">
<div class="card-body">
<div id="show-reportx">
</div>
<div class="chart-area">
<canvas id="show-report"></canvas>
</div>
</div>
</div>
</div>
</div>
<div class="row" hidden>
<div class="col-xl-7">
<div class="card mb-3 shadow bg-light" style="min-height: 500px;">
<div class="card-body">
<div id="list-issues" class="table-responsive">
<h2>Meldingen</h2>
<p>Kies hierboven een gebouw</p>
</div>
</div>
</div>
</div>
<div class="col-xl-5">
<div class="card mb-3 shadow bg-light overflow-auto" style="min-height: 500px;">
<div class="card-body">
<div id="show-issue" hidden>
<h2>Details</h2>
<p>-</p>
</div>
<div id="show-issue-object" hidden>
<h2>Object</h2>
<p>-</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row" hidden>
<div class="col-xl-7">
<div class="card mb-3 bg-light" style="min-height: 500px;">
<div class="card-body">
<div id="list-issue-orders">
<h2>Opdrachten</h2>
<p>-</p>
</div>
</div>
</div>
</div>
<div class="col-xl-5">
<div class="card mb-3 shadow bg-light overflow-auto" style="min-height: 500px;">
<div class="card-body">
<div id="show-order" hidden>
<h2>Details</h2>
<p>-</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container">
<div class="row" hidden>
<div class="col-xl-7">
<div class="card mb-3 shadow bg-light" style="min-height: 500px;">
<div class="card-body">
<div id="list-contracts" class="table-responsive">
<h2>Contracten</h2>
<p>Loading..</p>
</div>
</div>
</div>
</div>
<div class="col-xl-5">
<div class="card mb-3 shadow bg-light overflow-auto">
<div class="card-body">
<div id="show-contract" hidden>
<h2>Details</h2>
<p>-</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="container mb3">
<div class="row">
<div class="col-xl-7">
<div class="card shadow bg-light">
<div class="card-body">
<div id="show-about">
<h2>About</h2>
<p>Loading..</p>
</div>
</div>
</div>
</div>
<div class="col-xl-5">
<div class="card shadow bg-light">
<div class="card-body">
<div id="show-user">
<h2>User</h2>
<p>Loading..</p>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="sticky-footer bg-linen shadow">
<div class="container my-auto">
<div class="copyright text-center my-auto">
<span>Copyright &copy; Facilitor 2020</span>
</div>
</div>
</footer>
</div>
</div>
<!-- Bootstrap core JavaScript-->
<script src="../Localscripts/jquery.min.js"></script>
<script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Core plugin JavaScript-->
<script src="vendor/jquery-easing/jquery.easing.min.js"></script>
<!-- Custom scripts for all pages-->
<script src="js/sb-admin-2.min.js"></script>
<!-- Page level plugins -->
<script src="vendor/datatables/jquery.dataTables.min.js"></script>
<script src="vendor/datatables/dataTables.bootstrap4.min.js"></script>
<script src="vendor/chart.js/chart.min.js"></script>
<!-- Page level custom scripts -->
<script src="console.js"></script>
<script src="alg_locatie.js"></script>
<!-- You must load 'dark-mode-switch.js' after the dark-mode switch -->
<script src="dark-mode-switch.js"></script>
<!-- You must load 'fluid-mode-switch.js' after the dark-mode switch -->
<script src="fluid-mode-switch.js"></script>
<!-- Google Maps -->
<script async defer
src="https://maps.googleapis.com/maps/api/js?libraries=places&key=AIzaSyDYQ8CWgmaNMzTJnAiazxrrkjNjsxGQxvo"></script>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -1,884 +0,0 @@
/*
$Revision$
$Id$
File: console.js
Description: Generic include file for consoles for Facilitor
*/
var targets = {},
models = {},
day_in_ms = 86400000,
language = "EN",
windowObjectReference,
environment = "production";
/* System constants */
var dataTables_i18n = {
NL: {
"sProcessing": "Bezig...",
"sLengthMenu": "_MENU_ resultaten weergeven",
"sZeroRecords": "Geen resultaten gevonden",
"sInfo": "_START_ tot _END_ van _TOTAL_ resultaten",
"sInfoEmpty": "Geen resultaten om weer te geven",
"sInfoFiltered": " (gefilterd uit _MAX_ resultaten)",
"sInfoPostFix": "",
"sSearch": "Zoeken:",
"sEmptyTable": "Geen resultaten aanwezig in de tabel",
"sInfoThousands": ".",
"sLoadingRecords": "Een moment geduld aub - bezig met laden...",
"oPaginate": {
"sFirst": "Eerste",
"sLast": "Laatste",
"sNext": "Volgende",
"sPrevious": "Vorige"
},
"oAria": {
"sSortAscending": ": activeer om kolom oplopend te sorteren",
"sSortDescending": ": activeer om kolom aflopend te sorteren"
}
},
DE: {
"sEmptyTable": "Keine Daten in der Tabelle vorhanden",
"sInfo": "_START_ bis _END_ von _TOTAL_ Einträgen",
"sInfoEmpty": "Keine Daten vorhanden",
"sInfoFiltered": "(gefiltert von _MAX_ Einträgen)",
"sInfoPostFix": "",
"sInfoThousands": ".",
"sLengthMenu": "_MENU_ Einträge anzeigen",
"sLoadingRecords": "Wird geladen ..",
"sProcessing": "Bitte warten ..",
"sSearch": "Suchen",
"sZeroRecords": "Keine Einträge vorhanden",
"oPaginate": {
"sFirst": "Erste",
"sPrevious": "Zurück",
"sNext": "Nächste",
"sLast": "Letzte"
},
"oAria": {
"sSortAscending": ": aktivieren, um Spalte aufsteigend zu sortieren",
"sSortDescending": ": aktivieren, um Spalte absteigend zu sortieren"
},
"select": {
"rows": {
"_": "%d Zeilen ausgewählt",
"0": "",
"1": "1 Zeile ausgewählt"
}
},
"buttons": {
"print": "Drucken",
"colvis": "Spalten",
"copy": "Kopieren",
"copyTitle": "In Zwischenablage kopieren",
"copyKeys": "Taste <i>ctrl</i> oder <i>\u2318</i> + <i>C</i> um Tabelle<br>in Zwischenspeicher zu kopieren.<br><br>Um abzubrechen die Nachricht anklicken oder Escape drücken.",
"copySuccess": {
"_": "%d Zeilen kopiert",
"1": "1 Zeile kopiert"
},
"pageLength": {
"-1": "Zeige alle Zeilen",
"_": "Zeige %d Zeilen"
}
}
},
EN: {
"sEmptyTable": "No data available in table",
"sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
"sInfoEmpty": "Showing 0 to 0 of 0 entries",
"sInfoFiltered": "(filtered from _MAX_ total entries)",
"sInfoPostFix": "",
"sInfoThousands": ",",
"sLengthMenu": "Show _MENU_ entries",
"sLoadingRecords": "Loading...",
"sProcessing": "Processing...",
"sSearch": "Search:",
"sZeroRecords": "No matching records found",
"oPaginate": {
"sFirst": "First",
"sLast": "Last",
"sNext": "Next",
"sPrevious": "Previous"
},
"oAria": {
"sSortAscending": ": activate to sort column ascending",
"sSortDescending": ": activate to sort column descending"
}
},
FR: {
"sEmptyTable": "Aucune donnée disponible dans le tableau",
"sInfo": "Affichage de l'élément _START_ à _END_ sur _TOTAL_ éléments",
"sInfoEmpty": "Affichage de l'élément 0 à 0 sur 0 élément",
"sInfoFiltered": "(filtré à partir de _MAX_ éléments au total)",
"sInfoPostFix": "",
"sInfoThousands": ",",
"sLengthMenu": "Afficher _MENU_ éléments",
"sLoadingRecords": "Chargement...",
"sProcessing": "Traitement...",
"sSearch": "Rechercher :",
"sZeroRecords": "Aucun élément correspondant trouvé",
"oPaginate": {
"sFirst": "Premier",
"sLast": "Dernier",
"sNext": "Suivant",
"sPrevious": "Précédent"
},
"oAria": {
"sSortAscending": ": activer pour trier la colonne par ordre croissant",
"sSortDescending": ": activer pour trier la colonne par ordre décroissant"
},
"select": {
"rows": {
"_": "%d lignes sélectionnées",
"0": "Aucune ligne sélectionnée",
"1": "1 ligne sélectionnée"
}
}
}
};
/* global functions */
// console messages for development support
window.console.original_log = window.console.log;
window.console.log = function (msg, force) {
if (environment == "development" || force) {
window.console.original_log(msg);
}
};
// return the data of a single object or of a row object (e.g. obj.data["issue"] or obj.data["issues"][row])
function rowInfo(obj, row) {
"use strict";
return (obj.single ? obj.data[obj.table] : obj.data[obj.table][row]);
}
// return the value of a column
function dataInfo(obj, row, column) {
"use strict";
return rowInfo(obj, row)[column];
}
// return a formatted column value according to the column_type
function typeFormat(parms) {
"use strict";
switch (parms.column_type) {
case "datetime":
if (parms.single) {
// return the datevalue in case of a single object column
return new Date(parms.value);
}
return new Intl.DateTimeFormat(undefined, {
dateStyle: 'medium',
timeStyle: 'short',
hour: '2-digit',
minute: '2-digit'
}).format(new Date(parms.value));
// niet na een return break;
case "date":
if (parms.single) {
// return the datevalue in case of a single object column
return new Date(parms.value);
}
return new Intl.DateTimeFormat(undefined, {
dateStyle: 'medium'
}).format(new Date(parms.value));
// niet na een return break;
case "integer":
return parseInt(parms.value, 10);
// niet na een return break;
case "number":
// return safe number
return $.fn.dataTable.render.number().display(parms.value);
// niet na een return break;
default:
// return safe text
return $.fn.dataTable.render.text().display(parms.value);
}
}
// return label of the column
function columnType(obj, column) {
"use strict";
// determine column_type from [ targets[target].columns[column].type ] or from [ models[model].field[column].type ] or from fallback value "text"
return (obj.columns[column].type || (models[obj.url].fields[column] && models[obj.url].fields[column].type) || "text");
}
// return label of the column
function columnLabel(obj, column) {
"use strict";
// determine label from [ models[model].field[column].label ] or else from [ target.columns[column].label ] or else from [ column name ]
return ((models[obj.url].fields[column] && models[obj.url].fields[column].label) || obj.columns[column].label || column);
}
// return value of the column (single value or [column].name value)
function columnValue(data) {
"use strict";
// determine whether the value is an object with a { name: value }
return (data && typeof data.name !== "undefined" ? data.name || "" : data || "");
}
// return the formatted column value, independent of single object or row object
function dataFormat(obj, row, column) {
"use strict";
// get column value (as single value or as { id: xx, name: yy })
var data = dataInfo(obj, row, column);
return typeFormat({
value: columnValue(data),
column_type: columnType(obj, column),
single: obj.single
});
}
// return combined server-data and targets[target]/models[model][column] information object
function columnInfo(obj, row, column) {
"use strict";
var data, column_label, column_data, column_type, column_valuemin, column_valuemax, column_recid;
// get column value (as single value or as { id: xx, name: yy })
data = dataInfo(obj, row, column);
// get column label
column_label = columnLabel(obj, column);
// get formatted column value
column_data = dataFormat(obj, row, column);
// get column_type
column_type = columnType(obj, column);
// determine minimum value (only for use in a progressbar)
column_valuemin = (obj.columns[column].valuemin || 0);
// determine maximum value (only for use in a progressbar)
column_valuemax = (obj.columns[column].valuemax || 100);
// determine record id in case the column is a foreign table value
column_recid = (data && typeof data.id !== "undefined" ? parseInt(data.id, 10) : false);
return {
data: data,
column_label: column_label,
column_data: column_data,
column_type: column_type,
column_valuemin: column_valuemin,
column_valuemax: column_valuemax,
column_recid: column_recid
};
}
// return the column [ data-order ] value, used for ordering DataTable rows ([ date ] or [ datetime ] serial number only)
function dataOrder(obj, row, column) {
"use strict";
var column_type = columnType(obj, column),
value, data = dataInfo(obj, row, column);
if (obj.single) {
value = "";
} else {
value = columnValue(data);
}
switch (column_type) {
case "datetime":
case "date":
return new Date(value).getTime();
// niet na een return break;
default:
return false;
}
}
// return DataTable settings based on targets[target]columns
function tColumnDefs(obj) {
"use strict";
var defs = {
language: dataTables_i18n[language],
columnDefs: []
},
index = 0;
$.each(obj.columns, function (key, value) {
if (key !== "id") {
if (value.hidden) {
defs.columnDefs.push({
targets: [index],
visible: false,
searchable: true
});
}
index++;
}
});
console.log(defs);
return defs;
}
// return tableHeader row
function theadColumns(obj) {
"use strict";
var thead = "",
column;
for (column in obj.columns) {
if (column !== "id") {
thead += '<th>' + $.fn.dataTable.render.text().display(columnLabel(obj, column)) + '</th>';
}
}
return thead;
}
// return tableBody rows
function tbodyData(obj) {
"use strict";
var tbody = "",
row, column, order, col_info;
for (row = 0; row < obj.data[obj.table].length; row += 1) {
tbody += '<tr recid=' + obj.data[obj.table][row].id + '>';
for (column in obj.columns) {
if (column !== "id") {
col_info = columnInfo(obj, row, column);
tbody += '<td name="' + column + '"' +
(col_info.column_recid ? 'recid="' + col_info.column_recid + '"' : '') +
((order = dataOrder(obj, row, column)) ? 'data-order="' + order + '"' : '') +
'>' +
col_info.column_data +
'</td>';
}
}
tbody += '</tr>';
}
return tbody;
}
// return formdata (single record form)
function formData(obj) {
"use strict";
var target_selector = targets[obj.target].selector;
var formbody = "",
column, column_id, col_info;
for (column in obj.columns) {
if (column !== "id" && !(targets[obj.target].columns[column].hidden || false)) {
column_id = target_selector + "-" + column;
col_info = columnInfo(obj, undefined, column);
col_info.column_id = column_id;
col_info.single = obj.single;
formbody +=
'<div class="form-group form-group-sm pb-0 mb-0 form-row">' +
'<label for="' + column_id + '" class="col-sm-4 col-form-label text-nowrap">' + col_info.column_label + '</label>' +
new Field(col_info).render() +
'</div>';
}
}
return formbody;
}
// return filterdata (buttons for filtering DataTable data)
function filterData(obj) {
"use strict";
// var container_selector = targets[obj.target].selector;
var formbody = "",
row, column, col_info,
btn_size_class = targets[obj.target].btn_size_class,
btn_has_icon = targets[obj.target].btn_has_icon,
icon_column = targets[obj.target].icon_column,
color_column = targets[obj.target].color_column,
icon;
for (row = 0; row < obj.data[obj.table].length; row += 1) {
if (icon_column && !!obj.data[obj.table][row][icon_column] && obj.data[obj.table][row][icon_column].substring(0, 3) == "fa-") {
icon = obj.data[obj.table][row][icon_column];
} else {
icon = "fa-tag";
}
formbody += '<button type="button" class="btn text-center ' + btn_size_class + ' ' + settings.btn_text_class + ' ' + settings.btn_class + '" recid=' + obj.data[obj.table][row].id + (color_column && !!obj.data[obj.table][row][color_column] ? ' color="' + obj.data[obj.table][row][color_column].split(";")[0] + '"' : "") + '>' +
'<div class="">' + (btn_has_icon ? '<i class="fa ' + icon + ' fa-lg"></i>' : "") + '</div>';
for (column in obj.columns) {
if (column !== "id") {
col_info = columnInfo(obj, row, column);
formbody += '<div class="' + (targets[obj.target].columns[column].hidden ? "" : "d-inline-block text-truncate") + '" name="' + column + '"' +
((targets[obj.target].columns[column].hidden || false) ? "hidden" : '') +
(col_info.column_recid ? ' recid=' + col_info.column_recid : '') + '>' +
"<small>" +
((targets[obj.target].columns[column].hidden || false) ? '' : col_info.column_data) +
'</small></div>';
}
}
formbody += '<div name="badge"></div>';
formbody += '</button>';
}
return formbody;
}
// populate the target (datatable, form or filter)
function populate(obj) {
"use strict";
// the model needs to be present (loaded) for correct workings, except for reports (graphs)
if (targets[obj.target].report || models[obj.url].id) {
var $this = $("#" + targets[obj.target].selector),
h2;
obj.columns = obj.columns || targets[obj.target].columns;
console.log("populate: " + obj.target);
obj.table = obj.single || obj.url;
h2 = '<h2 name="formtitle">' + (lcl[language][targets[obj.target].title] || obj.table) + '</h2>';
obj.single = obj.single || false;
// render single record form html
if (obj.single) {
var fdata = formData(obj);
$this.html(h2 + '<form id="' + targets[obj.target].selector + '-form">' + fdata + '</form>' + new Customfields(obj).render());
// render buttons from rows for filter form html
} else if (targets[obj.target].filter) {
var fdata = filterData(obj);
$this.html(h2 + '<form id="' + targets[obj.target].selector + '-form" class="form-inline">' + fdata + '</form>');
// render h2 header only for report
} else if (targets[obj.target].report) {
$this.html(h2);
// render table html
} else {
var $this, thead, tbody, table;
thead = '<thead class="thead-dark">' + theadColumns(obj) + '</thead>';
tbody = '<tbody>' + tbodyData(obj) + '</tbody>';
table = '<table class="table table-sm table-striped table-hover" name="' + obj.target + '">' + thead + tbody + '</table>';
$this.html(h2 + table);
}
// set trigger(s) if available
if (targets[obj.target].trigger) {
$(targets[obj.target].trigger_selector, $this).off().on(targets[obj.target].events, targets[obj.target].trigger);
}
// run ready function if available
if (targets[obj.target].ready) {
targets[obj.target].ready(obj);
}
} else {
console.log("model " + obj.url + "not yet present!");
// retry the populate until the model is present
setTimeout(function () {
populate(obj);
}, 100);
}
}
// save the model definition in models
function setModel(obj) {
"use strict";
if (obj.model) {
models[obj.model] = obj.data;
obj.data.fields.forEach(function (field) {
models[obj.model].fields[field.id] = field;
});
}
}
// get api2 data through ajax
function api2(obj) {
"use strict";
if (obj.target) {
obj.filter = (Object.keys(targets[obj.target].columns).length ? (obj.filter ? obj.filter + "&" : "?") + "fields=" + Object.keys(targets[obj.target].columns).join(",") : obj.filter || "");
}
var ajaxHdl = $.ajax({
url: settings.facilitor_url + "api2/" + obj.url + (obj.filter || ""),
dataType: "json",
success: function (data, textStatus, jqXHR) {
console.log("Ajax success start: " + (obj.target || obj.model));
obj.data = data;
if (obj.model) {
setModel(obj);
} else {
populate(obj);
}
console.log(data);
console.log("Ajax success stop: " + (obj.target || obj.model));
},
complete: function (jqXHR, textStatus) {
console.log("Ajax complete: " + (obj.target || obj.model));
}
});
console.log({
target: (obj.target || "model_" + obj.model),
ajaxHdl: ajaxHdl
});
}
// google maps initialisation
var map, marker, geocoder, panorama, selector;
// google maps interface to set a location and a marker
function codeAddress(address) {
"use strict";
geocoder.geocode({
'address': address
}, function (results, status) {
if (status == 'OK') {
map.setCenter(results[0].geometry.location);
marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location
});
panorama.setPosition(results[0].geometry.location);
panorama.addListener('position_changed', function () {
if (!panorama.getVisible()) {
panorama.setVisible(true);
}
});
$("#" + selector).closest(".row").attr("hidden", false);
} else {
alert('Geocode was not successful for the following reason: ' + status);
}
});
}
// google maps initialisation and first location set to Facilitor
function initAutocomplete(mapselector, viewselector, location) {
"use strict";
selector = mapselector;
// The location of Facilitor
var facilitor = location || {
lat: 52.216670,
lng: 6.946060
};
// map part
map = new google.maps.Map(
document.getElementById(mapselector), {
zoom: 13,
center: facilitor,
mapTypeId: 'roadmap'
});
marker = new google.maps.Marker({
map: map,
position: facilitor
});
// streetview part
panorama = new google.maps.StreetViewPanorama(
document.getElementById(viewselector), {
position: facilitor,
panControl: false,
addressControl: false,
pov: {
heading: 34,
pitch: 20
}
});
map.setStreetView(panorama);
geocoder = geocoder || new google.maps.Geocoder();
$("#" + mapselector).closest(".row").attr("hidden", !location);
}
/* settings and functions from refactoring of targets object */
var settings = {
facilitor_url: "../../",
btn_class: "btn-secundary",
btn_text_class: "text-dark",
btn_selected_class: "btn-success",
btn_partial_class: "btn-success",
btn_size_class: "col-sm-3",
btn_has_icon: true,
icon_column: false,
color_column: false
};
// set partial, full or no class on parent button dependent on the number of selected child buttons
function setParentSelectedClass(parms) {
"use strict";
var selected = $("button:visible." + settings.btn_selected_class + " div[name=" + parms.name + "][recid=" + parms.value + "]", parms.context).length;
var present = $("button:visible div[name=" + parms.name + "][recid=" + parms.value + "]", parms.context).length;
// reset classes to default
var button = $("button[recid=" + parms.value + "]", parms.parent)
.removeClass(settings.btn_selected_class + ' ' + settings.btn_partial_class)
.addClass(settings.btn_class + ' ' + settings.btn_text_class)
.css({
backgroundColor: ""
});
// all childs are selected
if (present == selected) {
button
.addClass(settings.btn_selected_class)
.removeClass(settings.btn_class + ' ' + settings.btn_text_class)
.css({
backgroundColor: (button.attr("color") ? button.attr("color") : "")
});
// part of the childs are selected
} else if (selected > 0) {
button
.addClass(settings.btn_selected_class + ' ' + settings.btn_partial_class)
.removeClass(settings.btn_class + ' ' + settings.btn_text_class)
.css({
backgroundColor: (button.attr("color") ? button.attr("color") : "")
});
}
return button;
}
// set full or no class on child buttons dependent on the parent button
function setChildSelectedClass(parms) {
"use strict";
var button;
var items = $("button div[name=" + parms.name + "][recid=" + parms.$this.attr("recid") + "]", parms.parent);
items
.each(
function () {
button = $(this).closest("button");
button
.removeClass(settings.btn_partial_class)
.toggleClass(settings.btn_selected_class, parms.$this.hasClass(settings.btn_selected_class))
.toggleClass(settings.btn_class, !parms.$this.hasClass(settings.btn_selected_class))
.toggleClass(settings.btn_text_class, !parms.$this.hasClass(settings.btn_selected_class))
.css({
backgroundColor: (button.attr("color") && button.hasClass(settings.btn_selected_class) ? button.attr("color") : "")
});
}
);
return items;
}
// set color of child-buttons to color of parent-button when a child-button has no specific color of it's own
function setChildrenColor(parms) {
"use strict";
var $this, parent;
var items = $("button:not([color]) div[name=" + parms.name + "]", parms.context);
items
.each(
function () {
$this = $(this);
// parent button has a specific colour
parent = $("button[recid=" + $this.attr("recid") + "]", parms.parent);
if (parent.length) {
$this.closest("button")
.attr("color", parent.attr("color"))
.css({
backgroundColor: parent.attr("color")
});
}
}
);
}
// save recid's of selected buttons in [ context ]
function saveSelectedbuttonIds(parms) {
"use strict";
targets[parms.target].selected_ids = [];
$("button." + settings.btn_selected_class, parms.context).each(function () {
targets[parms.target].selected_ids.push($(this).attr("recid"));
});
}
// save recid's used in table
function saveUsedtabledataIds(parms) {
"use strict";
var index, recid, key_count = {};
targets[parms.target].selected_ids = [];
$("td[name=" + parms.name + "]", parms.context).each(function () {
recid = $(this).attr("recid");
key_count[recid] = key_count[recid] ? key_count[recid] + 1 : 1;
index = targets[parms.target].selected_ids.indexOf(recid);
if (index === -1) {
targets[parms.target].selected_ids.push(recid);
}
});
return key_count;
}
// set classes for button dependent on button_selected_class
function setButtonClasses(parms) {
"use strict";
parms.$this.removeClass(settings.btn_selected_class == settings.btn_partial_class ? "" : settings.btn_partial_class)
.toggleClass(settings.btn_selected_class)
.toggleClass(settings.btn_class, !parms.$this.hasClass(settings.btn_selected_class))
.toggleClass(settings.btn_text_class, !parms.$this.hasClass(settings.btn_selected_class))
.css({
backgroundColor: (parms.$this.attr("color") && parms.$this.hasClass(settings.btn_selected_class) ? parms.$this.attr("color") : "")
});
}
// reset classes for all buttons
function resetAllButtonClasses(parms) {
"use strict";
$("button", parms.context)
.removeClass(settings.btn_partial_class + ' ' + settings.btn_selected_class)
.addClass(settings.btn_class + ' ' + settings.btn_text_class)
.css({
backgroundColor: ""
});
}
// set hidden attr for buttons dependent on button_selected_class
function setButtonHidden(parms) {
"use strict";
$("button", parms.context)
.attr("hidden", function () {
$(this).attr("hidden", !$(this).hasClass(settings.btn_selected_class))
});
}
// autoselect first row in case there is only 1 result
function autoselectRow(parms) {
"use strict";
// select (click) the first row if there is only 1 result
if ($("tbody tr", "#" + targets[parms.target].selector).length == 1) {
$("tbody tr:first", "#" + targets[parms.target].selector).click();
}
}
// redraw the table and select first row in case there is only 1 result
function redrawTable(parms) {
"use strict";
targets[parms.target].data_table.draw();
$("#" + targets[parms.target].selector).closest("div.card").resize();
autoselectRow(parms);
}
// resize innerHeight of target-card to innerHeight of base-card
function resizeCard(targetselector, baseselector) {
function _resizeCard() {
console.log("resize " + targetselector);
$("#" + targetselector).closest("div.card").innerHeight($("#" + baseselector).closest("div.card").innerHeight());
}
return function _setTimeout() {
setTimeout(_resizeCard, 100);
}
}
/* Objects to be used for rendering dashboards */
// Object with render function to return field html (without label)
function Field(parms) {
"use strict";
var self = this,
date, time;
// prefix a string with a zero when string length < length to be used ( hour/minute/day/month fields )
var prefixZero = function (str, len) {
return ("0" + str).slice(-len);
};
this.single = parms.single;
this.column_name = parms.column_name;
this.column_type = parms.column_type;
this.column_id = parms.column_id;
this.column_data = typeFormat({
value: (parms.column_data || ""),
column_type: parms.column_type,
single: parms.single
});
this.column_valuemin = parms.column_valuemin;
this.column_valuemax = parms.column_valuemax;
this.render = function () {
switch (self.column_type) {
case "progressbar":
return '<div class="col-sm-8 progress" style="height: 2rem;">' +
'<div class="progress-bar progress-bar-info form-control form-control-sm" role="progressbar" id="' + self.column_id + '" style="width: ' + Math.round(1 / self.column_valuemax * self.column_data * 100) + '%;" aria-valuenow="' + self.column_data + '" aria-valuemin="' + self.column_valuemin + '" aria-valuemax="' + self.column_valuemax + '"></div>' +
'</div>';
// niet na een return break;
case "check":
return '<div class="form-check">' +
'<input type="checkbox" class="form-control form-control-sm form-check-input" id="' + self.column_id + '" name=' + self.column_name + (self.column_data == 1 ? ' checked' : '') + ' disabled>' +
'</div>';
// niet na een return break;
case "textarea":
return '<div class="col-sm-8">' +
'<textarea class="sm-textarea form-control form-control-sm" id="' + self.column_id + '" readonly>' + self.column_data + '</textarea>' +
'</div>';
// niet na een return break;
case "date":
date = self.column_data == "" ? "" : self.column_data.getFullYear().toString() + "-" + prefixZero((self.column_data.getMonth() + 1).toString(), 2) + "-" + prefixZero(self.column_data.getDate().toString(), 2);
return '<div class="col-sm-8">' +
'<input type="date" class="form-control form-control-sm" id="' + self.column_id + '" name=' + self.column_name + '" value="' + date + '" readonly>' +
'</div>';
// niet na een return break;
case "datetime":
time = self.column_data == "" ? "" : prefixZero(self.column_data.getHours().toString(), 2) + ":" + prefixZero(self.column_data.getMinutes().toString(), 2);
date = self.column_data == "" ? "" : self.column_data.getFullYear().toString() + "-" + prefixZero((self.column_data.getMonth() + 1).toString(), 2) + "-" + prefixZero(self.column_data.getDate().toString(), 2);
return '<div class="col-sm-5">' +
'<input type="date" class="form-control form-control-sm" id="' + self.column_id + '" name=' + self.column_name + '" value="' + date + '" readonly>' +
'</div>' +
'<div class="col-sm-3">' +
'<input type="time" class="form-control form-control-sm" id="' + self.column_id + '_time" name=' + self.column_name + '_time" value="' + time + '" readonly>' +
'</div>';
// niet na een return break;
case "time":
time = self.column_data == "" ? "" : prefixZero(self.column_data.getHours().toString(), 2) + ":" + prefixZero(self.column_data.getMinutes().toString(), 2);
return '<div class="col-sm-3">' +
'<input type="time" class="form-control form-control-sm" id="' + self.column_id + '_time" name=' + self.column_name + '_time" value="' + time + '" readonly>' +
'</div>';
// niet na een return break;
default:
return '<div class="col-sm-8">' +
'<input type="' + self.column_type + '" class="form-control form-control-sm" id="' + self.column_id + '" name=' + self.column_name + '" value="' + self.column_data + '" readonly>' +
'</div>';
// niet na een return break;
}
}
console.log(self);
}
// Object with render function to return label and customfield html
function Customfield(parms) {
"use strict";
var self = this;
this.single = parms.single;
this.column_name = parms.column_name;
this.custom_field = parms.custom_field;
this.selector = parms.selector;
this.column_id = parms.selector + "-" + self.custom_field.propertyid;
// translate customfield-type to model field-type
this.custom_field_type = function () {
switch (self.custom_field.type) {
case "V":
return "check";
case "D":
return "date";
case "T":
return "time";
case "N":
return "number";
default:
return "text";
}
}
this.render = function () {
return '<div class="form-group form-group-sm pb-0 mb-0 form-row">' +
'<label for="' + self.column_id + '" class="col-sm-4 col-form-label text-nowrap">' + self.custom_field.label + '</label>' +
new Field({
single: self.single,
column_name: self.column_name,
column_id: self.column_id,
column_type: self.custom_field_type(),
column_data: self.custom_field.value
}).render() +
'</div>';
}
console.log(self);
}
// Object with render function to return html for all customfields including labels
function Customfields(parms) {
"use strict";
var self = this;
// sort customfields on sequence
this.custom_fields = (parms.data[parms.table].custom_fields ? parms.data[parms.table].custom_fields.sort(function (a, b) {
return (a.sequence > b.sequence ? 1 : -1)
}) : []);
this.single = parms.single;
this.target = parms.target;
this.table = parms.table;
this.render = function () {
var fields = "",
custom_field;
if (targets[self.target].show_custom_fields && self.custom_fields.length) {
for (custom_field in self.custom_fields) {
// only customfields other than type Q, L or M
if (["Q", "L", "M"].indexOf(self.custom_fields[custom_field].type) == -1 && (targets[self.target].show_custom_field_when_empty || self.custom_fields[custom_field].value != null)) {
fields += new Customfield({
single: self.single,
column_name: custom_field,
selector: targets[self.target].selector,
custom_field: self.custom_fields[custom_field]
}).render();
}
}
}
return '<div name="custom-fields">' + fields + '</div>';
}
console.log(self);
}
// Object base for targets
function Target(parms) {
"use strict";
var self = this;
var choose = function (first_choice, fallback_choice) {
return (typeof first_choice != "undefined" ? first_choice : fallback_choice);
};
this.title = parms.title || "";
this.selector = parms.selector;
this.mode = parms.mode;
this.columns = choose(parms.columns, {});
this.events = choose(parms.events, "click");
this.trigger = parms.trigger || false;
this.ready = parms.ready || false;
this.filter = parms.filter || false;
this.report = parms.report || false;
this.trigger_selector = (this.filter ? "button" : "table tbody tr");
this.btn_size_class = choose(parms.btn_size_class, settings.btn_size_class);
this.btn_has_icon = choose(parms.btn_has_icon, true);
this.icon_column = choose(parms.icon_column, settings.icon_column);
this.color_column = choose(parms.color_column, settings.color_column);
this.show_custom_fields = parms.show_custom_fields || false;
this.show_custom_field_when_empty = parms.show_custom_field_when_empty || false;
console.log(self);
}

View File

@@ -1,55 +0,0 @@
body {
font-size: 0.85rem;
}
.col, .col-1, .col-10, .col-11, .col-12, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-auto, .col-lg, .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-auto, .col-md, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-auto, .col-sm, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-auto, .col-xl, .col-xl-1, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-auto {
padding-left: 8px;
padding-right: 8px;
}
#list-locations tbody tr:hover,#list-buildings tbody tr:hover,#list-issues tbody tr:hover,#list-issue-orders tbody tr:hover,#list-contracts tbody tr:hover {
cursor: pointer;
}
tr.table-success td,.table-hover .table-success:hover > td {
background-color: #9b1b30;
border-color: #9b1b30;
color: #fff;
}
.btn-success {
background-color: #9b1b30;
border-color: #f5d6c6;
}
.btn-success:hover {
border-color: #9b1b30;
}
.bg-linen {
background-color: #77212e !important;
color: #fff !important;
text-shadow: 0px 0px 12px #111;
xbackground: url(./img/Aareon-hello.jpg);
background: url(./img/Gebouwconsole-head.jpg);
background-position-y: center;
background-position-x: center;
background-repeat: no-repeat;
background-size: cover;
}
.bg-linen h1 {
font-weight: bold !important;
}
.bg-cornsilk {
background-color: #34558b !important;
color: #fff !important;
}
.bg-light {
background-color: #f7f1ee !important;
color: #000 !important;
}
[data-theme="dark"] .bg-cornsilk,[data-theme="dark"] .bg-linen {
background-color: black !important;
color: ivory !important;
}
div[name=badge] {
position: absolute;
top: 0;
right: 3px;
}

File diff suppressed because one or more lines are too long

View File

@@ -1,27 +0,0 @@
(function() {
var darkSwitch = document.getElementById("darkSwitch");
if (darkSwitch) {
initTheme();
darkSwitch.addEventListener("change", function(event) {
resetTheme();
});
function initTheme() {
var darkThemeSelected =
localStorage.getItem("darkSwitch") !== null &&
localStorage.getItem("darkSwitch") === "dark";
darkSwitch.checked = darkThemeSelected;
darkThemeSelected
? document.body.setAttribute("data-theme", "dark")
: document.body.removeAttribute("data-theme");
}
function resetTheme() {
if (darkSwitch.checked) {
document.body.setAttribute("data-theme", "dark");
localStorage.setItem("darkSwitch", "dark");
} else {
document.body.removeAttribute("data-theme");
localStorage.removeItem("darkSwitch");
}
}
}
})();

View File

@@ -1,22 +0,0 @@
[data-theme="dark"] {
background-color: #111 !important;
color: #eee;
}
[data-theme="dark"] .bg-light {
background-color: #000 !important;
}
div.jumbotron {
margin-bottom: 0;
}
[data-theme="dark"] .bg-white,
[data-theme="dark"] .jumbotron,
[data-theme="dark"] .btn {
background-color: #000 !important;
color: #eee;
}
[data-theme="dark"] .bg-black {
background-color: #eee !important;
}

View File

@@ -1,27 +0,0 @@
(function() {
var fluidSwitch = document.getElementById("fluidSwitch");
if (fluidSwitch) {
initFluidTheme();
fluidSwitch.addEventListener("change", function(event) {
resetFluidTheme();
});
function initFluidTheme() {
var fluidThemeSelected =
localStorage.getItem("fluidSwitch") !== null &&
localStorage.getItem("fluidSwitch") === "on";
fluidSwitch.checked = fluidThemeSelected;
fluidThemeSelected
? $("div.container").removeClass("container").addClass("container-fluid")
: $("div.container-fluid").removeClass("container-fluid").addClass("container");
}
function resetFluidTheme() {
if (fluidSwitch.checked) {
$("div.container").removeClass("container").addClass("container-fluid");
localStorage.setItem("fluidSwitch", "on");
} else {
$("div.container-fluid").removeClass("container-fluid").addClass("container");
localStorage.setItem("fluidSwitch", "off");
}
}
}
})();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -1,7 +0,0 @@
/*!
* Start Bootstrap - SB Admin 2 v4.0.7 (https://startbootstrap.com/template-overviews/sb-admin-2)
* Copyright 2013-2019 Start Bootstrap
* Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap-sb-admin-2/blob/master/LICENSE)
*/
!function(t){"use strict";t("#sidebarToggle, #sidebarToggleTop").on("click",function(o){t("body").toggleClass("sidebar-toggled"),t(".sidebar").toggleClass("toggled"),t(".sidebar").hasClass("toggled")&&t(".sidebar .collapse").collapse("hide")}),t(window).resize(function(){t(window).width()<768&&t(".sidebar .collapse").collapse("hide")}),t("body.fixed-nav .sidebar").on("mousewheel DOMMouseScroll wheel",function(o){if(768<t(window).width()){var e=o.originalEvent,l=e.wheelDelta||-e.detail;this.scrollTop+=30*(l<0?1:-1),o.preventDefault()}}),t(document).on("scroll",function(){100<t(this).scrollTop()?t(".scroll-to-top").fadeIn():t(".scroll-to-top").fadeOut()}),t(document).on("click","a.scroll-to-top",function(o){var e=t(this);t("html, body").stop().animate({scrollTop:t(e.attr("href")).offset().top},1e3,"easeInOutExpo"),o.preventDefault()})}(jQuery);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,51 +0,0 @@
//
// Base styles
//
.alert {
position: relative;
padding: $alert-padding-y $alert-padding-x;
margin-bottom: $alert-margin-bottom;
border: $alert-border-width solid transparent;
@include border-radius($alert-border-radius);
}
// Headings for larger alerts
.alert-heading {
// Specified to prevent conflicts of changing $headings-color
color: inherit;
}
// Provide class for links that match alerts
.alert-link {
font-weight: $alert-link-font-weight;
}
// Dismissible alerts
//
// Expand the right padding and account for the close button's positioning.
.alert-dismissible {
padding-right: $close-font-size + $alert-padding-x * 2;
// Adjust close link position
.close {
position: absolute;
top: 0;
right: 0;
padding: $alert-padding-y $alert-padding-x;
color: inherit;
}
}
// Alternate styles
//
// Generate contextual modifier classes for colorizing the alert.
@each $color, $value in $theme-colors {
.alert-#{$color} {
@include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));
}
}

View File

@@ -1,54 +0,0 @@
// Base class
//
// Requires one of the contextual, color modifier classes for `color` and
// `background-color`.
.badge {
display: inline-block;
padding: $badge-padding-y $badge-padding-x;
@include font-size($badge-font-size);
font-weight: $badge-font-weight;
line-height: 1;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
@include border-radius($badge-border-radius);
@include transition($badge-transition);
@at-root a#{&} {
@include hover-focus {
text-decoration: none;
}
}
// Empty badges collapse automatically
&:empty {
display: none;
}
}
// Quick fix for badges in buttons
.btn .badge {
position: relative;
top: -1px;
}
// Pill badges
//
// Make them extra rounded with a modifier to replace v3's badges.
.badge-pill {
padding-right: $badge-pill-padding-x;
padding-left: $badge-pill-padding-x;
@include border-radius($badge-pill-border-radius);
}
// Colors
//
// Contextual variations (linked badges get darker on :hover).
@each $color, $value in $theme-colors {
.badge-#{$color} {
@include badge-variant($value);
}
}

View File

@@ -1,41 +0,0 @@
.breadcrumb {
display: flex;
flex-wrap: wrap;
padding: $breadcrumb-padding-y $breadcrumb-padding-x;
margin-bottom: $breadcrumb-margin-bottom;
list-style: none;
background-color: $breadcrumb-bg;
@include border-radius($breadcrumb-border-radius);
}
.breadcrumb-item {
// The separator between breadcrumbs (by default, a forward-slash: "/")
+ .breadcrumb-item {
padding-left: $breadcrumb-item-padding;
&::before {
display: inline-block; // Suppress underlining of the separator in modern browsers
padding-right: $breadcrumb-item-padding;
color: $breadcrumb-divider-color;
content: $breadcrumb-divider;
}
}
// IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built
// without `<ul>`s. The `::before` pseudo-element generates an element
// *within* the .breadcrumb-item and thereby inherits the `text-decoration`.
//
// To trick IE into suppressing the underline, we give the pseudo-element an
// underline and then immediately remove it.
+ .breadcrumb-item:hover::before {
text-decoration: underline;
}
// stylelint-disable-next-line no-duplicate-selectors
+ .breadcrumb-item:hover::before {
text-decoration: none;
}
&.active {
color: $breadcrumb-active-color;
}
}

View File

@@ -1,163 +0,0 @@
// stylelint-disable selector-no-qualifying-type
// Make the div behave like a button
.btn-group,
.btn-group-vertical {
position: relative;
display: inline-flex;
vertical-align: middle; // match .btn alignment given font-size hack above
> .btn {
position: relative;
flex: 1 1 auto;
// Bring the hover, focused, and "active" buttons to the front to overlay
// the borders properly
@include hover {
z-index: 1;
}
&:focus,
&:active,
&.active {
z-index: 1;
}
}
}
// Optional: Group multiple button groups together for a toolbar
.btn-toolbar {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
.input-group {
width: auto;
}
}
.btn-group {
// Prevent double borders when buttons are next to each other
> .btn:not(:first-child),
> .btn-group:not(:first-child) {
margin-left: -$btn-border-width;
}
// Reset rounded corners
> .btn:not(:last-child):not(.dropdown-toggle),
> .btn-group:not(:last-child) > .btn {
@include border-right-radius(0);
}
> .btn:not(:first-child),
> .btn-group:not(:first-child) > .btn {
@include border-left-radius(0);
}
}
// Sizing
//
// Remix the default button sizing classes into new ones for easier manipulation.
.btn-group-sm > .btn { @extend .btn-sm; }
.btn-group-lg > .btn { @extend .btn-lg; }
//
// Split button dropdowns
//
.dropdown-toggle-split {
padding-right: $btn-padding-x * .75;
padding-left: $btn-padding-x * .75;
&::after,
.dropup &::after,
.dropright &::after {
margin-left: 0;
}
.dropleft &::before {
margin-right: 0;
}
}
.btn-sm + .dropdown-toggle-split {
padding-right: $btn-padding-x-sm * .75;
padding-left: $btn-padding-x-sm * .75;
}
.btn-lg + .dropdown-toggle-split {
padding-right: $btn-padding-x-lg * .75;
padding-left: $btn-padding-x-lg * .75;
}
// The clickable button for toggling the menu
// Set the same inset shadow as the :active state
.btn-group.show .dropdown-toggle {
@include box-shadow($btn-active-box-shadow);
// Show no shadow for `.btn-link` since it has no other button styles.
&.btn-link {
@include box-shadow(none);
}
}
//
// Vertical button groups
//
.btn-group-vertical {
flex-direction: column;
align-items: flex-start;
justify-content: center;
> .btn,
> .btn-group {
width: 100%;
}
> .btn:not(:first-child),
> .btn-group:not(:first-child) {
margin-top: -$btn-border-width;
}
// Reset rounded corners
> .btn:not(:last-child):not(.dropdown-toggle),
> .btn-group:not(:last-child) > .btn {
@include border-bottom-radius(0);
}
> .btn:not(:first-child),
> .btn-group:not(:first-child) > .btn {
@include border-top-radius(0);
}
}
// Checkbox and radio options
//
// In order to support the browser's form validation feedback, powered by the
// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
// `display: none;` or `visibility: hidden;` as that also hides the popover.
// Simply visually hiding the inputs via `opacity` would leave them clickable in
// certain cases which is prevented by using `clip` and `pointer-events`.
// This way, we ensure a DOM element is visible to position the popover from.
//
// See https://github.com/twbs/bootstrap/pull/12794 and
// https://github.com/twbs/bootstrap/pull/14559 for more information.
.btn-group-toggle {
> .btn,
> .btn-group > .btn {
margin-bottom: 0; // Override default `<label>` value
input[type="radio"],
input[type="checkbox"] {
position: absolute;
clip: rect(0, 0, 0, 0);
pointer-events: none;
}
}
}

View File

@@ -1,137 +0,0 @@
// stylelint-disable selector-no-qualifying-type
//
// Base styles
//
.btn {
display: inline-block;
font-family: $btn-font-family;
font-weight: $btn-font-weight;
color: $body-color;
text-align: center;
vertical-align: middle;
user-select: none;
background-color: transparent;
border: $btn-border-width solid transparent;
@include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);
@include transition($btn-transition);
@include hover {
color: $body-color;
text-decoration: none;
}
&:focus,
&.focus {
outline: 0;
box-shadow: $btn-focus-box-shadow;
}
// Disabled comes first so active can properly restyle
&.disabled,
&:disabled {
opacity: $btn-disabled-opacity;
@include box-shadow(none);
}
&:not(:disabled):not(.disabled):active,
&:not(:disabled):not(.disabled).active {
@include box-shadow($btn-active-box-shadow);
&:focus {
@include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
}
}
}
// Future-proof disabling of clicks on `<a>` elements
a.btn.disabled,
fieldset:disabled a.btn {
pointer-events: none;
}
//
// Alternate buttons
//
@each $color, $value in $theme-colors {
.btn-#{$color} {
@include button-variant($value, $value);
}
}
@each $color, $value in $theme-colors {
.btn-outline-#{$color} {
@include button-outline-variant($value);
}
}
//
// Link buttons
//
// Make a button look and behave like a link
.btn-link {
font-weight: $font-weight-normal;
color: $link-color;
text-decoration: $link-decoration;
@include hover {
color: $link-hover-color;
text-decoration: $link-hover-decoration;
}
&:focus,
&.focus {
text-decoration: $link-hover-decoration;
box-shadow: none;
}
&:disabled,
&.disabled {
color: $btn-link-disabled-color;
pointer-events: none;
}
// No need for an active state here
}
//
// Button Sizes
//
.btn-lg {
@include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);
}
.btn-sm {
@include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);
}
//
// Block button
//
.btn-block {
display: block;
width: 100%;
// Vertically space out multiple block buttons
+ .btn-block {
margin-top: $btn-block-spacing-y;
}
}
// Specificity overrides
input[type="submit"],
input[type="reset"],
input[type="button"] {
&.btn-block {
width: 100%;
}
}

View File

@@ -1,289 +0,0 @@
//
// Base styles
//
.card {
position: relative;
display: flex;
flex-direction: column;
min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106
word-wrap: break-word;
background-color: $card-bg;
background-clip: border-box;
border: $card-border-width solid $card-border-color;
@include border-radius($card-border-radius);
> hr {
margin-right: 0;
margin-left: 0;
}
> .list-group:first-child {
.list-group-item:first-child {
@include border-top-radius($card-border-radius);
}
}
> .list-group:last-child {
.list-group-item:last-child {
@include border-bottom-radius($card-border-radius);
}
}
}
.card-body {
// Enable `flex-grow: 1` for decks and groups so that card blocks take up
// as much space as possible, ensuring footers are aligned to the bottom.
flex: 1 1 auto;
padding: $card-spacer-x;
color: $card-color;
}
.card-title {
margin-bottom: $card-spacer-y;
}
.card-subtitle {
margin-top: -$card-spacer-y / 2;
margin-bottom: 0;
}
.card-text:last-child {
margin-bottom: 0;
}
.card-link {
@include hover {
text-decoration: none;
}
+ .card-link {
margin-left: $card-spacer-x;
}
}
//
// Optional textual caps
//
.card-header {
padding: $card-spacer-y $card-spacer-x;
margin-bottom: 0; // Removes the default margin-bottom of <hN>
color: $card-cap-color;
background-color: $card-cap-bg;
border-bottom: $card-border-width solid $card-border-color;
&:first-child {
@include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);
}
+ .list-group {
.list-group-item:first-child {
border-top: 0;
}
}
}
.card-footer {
padding: $card-spacer-y $card-spacer-x;
background-color: $card-cap-bg;
border-top: $card-border-width solid $card-border-color;
&:last-child {
@include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);
}
}
//
// Header navs
//
.card-header-tabs {
margin-right: -$card-spacer-x / 2;
margin-bottom: -$card-spacer-y;
margin-left: -$card-spacer-x / 2;
border-bottom: 0;
}
.card-header-pills {
margin-right: -$card-spacer-x / 2;
margin-left: -$card-spacer-x / 2;
}
// Card image
.card-img-overlay {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
padding: $card-img-overlay-padding;
}
.card-img {
width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
@include border-radius($card-inner-border-radius);
}
// Card image caps
.card-img-top {
width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
@include border-top-radius($card-inner-border-radius);
}
.card-img-bottom {
width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
@include border-bottom-radius($card-inner-border-radius);
}
// Card deck
.card-deck {
display: flex;
flex-direction: column;
.card {
margin-bottom: $card-deck-margin;
}
@include media-breakpoint-up(sm) {
flex-flow: row wrap;
margin-right: -$card-deck-margin;
margin-left: -$card-deck-margin;
.card {
display: flex;
// Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
flex: 1 0 0%;
flex-direction: column;
margin-right: $card-deck-margin;
margin-bottom: 0; // Override the default
margin-left: $card-deck-margin;
}
}
}
//
// Card groups
//
.card-group {
display: flex;
flex-direction: column;
// The child selector allows nested `.card` within `.card-group`
// to display properly.
> .card {
margin-bottom: $card-group-margin;
}
@include media-breakpoint-up(sm) {
flex-flow: row wrap;
// The child selector allows nested `.card` within `.card-group`
// to display properly.
> .card {
// Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
flex: 1 0 0%;
margin-bottom: 0;
+ .card {
margin-left: 0;
border-left: 0;
}
// Handle rounded corners
@if $enable-rounded {
&:not(:last-child) {
@include border-right-radius(0);
.card-img-top,
.card-header {
// stylelint-disable-next-line property-blacklist
border-top-right-radius: 0;
}
.card-img-bottom,
.card-footer {
// stylelint-disable-next-line property-blacklist
border-bottom-right-radius: 0;
}
}
&:not(:first-child) {
@include border-left-radius(0);
.card-img-top,
.card-header {
// stylelint-disable-next-line property-blacklist
border-top-left-radius: 0;
}
.card-img-bottom,
.card-footer {
// stylelint-disable-next-line property-blacklist
border-bottom-left-radius: 0;
}
}
}
}
}
}
//
// Columns
//
.card-columns {
.card {
margin-bottom: $card-columns-margin;
}
@include media-breakpoint-up(sm) {
column-count: $card-columns-count;
column-gap: $card-columns-gap;
orphans: 1;
widows: 1;
.card {
display: inline-block; // Don't let them vertically span multiple columns
width: 100%; // Don't let their width change
}
}
}
//
// Accordion
//
.accordion {
> .card {
overflow: hidden;
&:not(:first-of-type) {
.card-header:first-child {
@include border-radius(0);
}
&:not(:last-of-type) {
border-bottom: 0;
@include border-radius(0);
}
}
&:first-of-type {
border-bottom: 0;
@include border-bottom-radius(0);
}
&:last-of-type {
@include border-top-radius(0);
}
.card-header {
margin-bottom: -$card-border-width;
}
}
}

View File

@@ -1,197 +0,0 @@
// Notes on the classes:
//
// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)
// even when their scroll action started on a carousel, but for compatibility (with Firefox)
// we're preventing all actions instead
// 2. The .carousel-item-left and .carousel-item-right is used to indicate where
// the active slide is heading.
// 3. .active.carousel-item is the current slide.
// 4. .active.carousel-item-left and .active.carousel-item-right is the current
// slide in its in-transition state. Only one of these occurs at a time.
// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right
// is the upcoming slide in transition.
.carousel {
position: relative;
}
.carousel.pointer-event {
touch-action: pan-y;
}
.carousel-inner {
position: relative;
width: 100%;
overflow: hidden;
@include clearfix();
}
.carousel-item {
position: relative;
display: none;
float: left;
width: 100%;
margin-right: -100%;
backface-visibility: hidden;
@include transition($carousel-transition);
}
.carousel-item.active,
.carousel-item-next,
.carousel-item-prev {
display: block;
}
.carousel-item-next:not(.carousel-item-left),
.active.carousel-item-right {
transform: translateX(100%);
}
.carousel-item-prev:not(.carousel-item-right),
.active.carousel-item-left {
transform: translateX(-100%);
}
//
// Alternate transitions
//
.carousel-fade {
.carousel-item {
opacity: 0;
transition-property: opacity;
transform: none;
}
.carousel-item.active,
.carousel-item-next.carousel-item-left,
.carousel-item-prev.carousel-item-right {
z-index: 1;
opacity: 1;
}
.active.carousel-item-left,
.active.carousel-item-right {
z-index: 0;
opacity: 0;
@include transition(0s $carousel-transition-duration opacity);
}
}
//
// Left/right controls for nav
//
.carousel-control-prev,
.carousel-control-next {
position: absolute;
top: 0;
bottom: 0;
z-index: 1;
// Use flex for alignment (1-3)
display: flex; // 1. allow flex styles
align-items: center; // 2. vertically center contents
justify-content: center; // 3. horizontally center contents
width: $carousel-control-width;
color: $carousel-control-color;
text-align: center;
opacity: $carousel-control-opacity;
@include transition($carousel-control-transition);
// Hover/focus state
@include hover-focus {
color: $carousel-control-color;
text-decoration: none;
outline: 0;
opacity: $carousel-control-hover-opacity;
}
}
.carousel-control-prev {
left: 0;
@if $enable-gradients {
background: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));
}
}
.carousel-control-next {
right: 0;
@if $enable-gradients {
background: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));
}
}
// Icons for within
.carousel-control-prev-icon,
.carousel-control-next-icon {
display: inline-block;
width: $carousel-control-icon-width;
height: $carousel-control-icon-width;
background: no-repeat 50% / 100% 100%;
}
.carousel-control-prev-icon {
background-image: $carousel-control-prev-icon-bg;
}
.carousel-control-next-icon {
background-image: $carousel-control-next-icon-bg;
}
// Optional indicator pips
//
// Add an ordered list with the following class and add a list item for each
// slide your carousel holds.
.carousel-indicators {
position: absolute;
right: 0;
bottom: 0;
left: 0;
z-index: 15;
display: flex;
justify-content: center;
padding-left: 0; // override <ol> default
// Use the .carousel-control's width as margin so we don't overlay those
margin-right: $carousel-control-width;
margin-left: $carousel-control-width;
list-style: none;
li {
box-sizing: content-box;
flex: 0 1 auto;
width: $carousel-indicator-width;
height: $carousel-indicator-height;
margin-right: $carousel-indicator-spacer;
margin-left: $carousel-indicator-spacer;
text-indent: -999px;
cursor: pointer;
background-color: $carousel-indicator-active-bg;
background-clip: padding-box;
// Use transparent borders to increase the hit area by 10px on top and bottom.
border-top: $carousel-indicator-hit-area-height solid transparent;
border-bottom: $carousel-indicator-hit-area-height solid transparent;
opacity: .5;
@include transition($carousel-indicator-transition);
}
.active {
opacity: 1;
}
}
// Optional captions
//
//
.carousel-caption {
position: absolute;
right: (100% - $carousel-caption-width) / 2;
bottom: 20px;
left: (100% - $carousel-caption-width) / 2;
z-index: 10;
padding-top: 20px;
padding-bottom: 20px;
color: $carousel-caption-color;
text-align: center;
}

View File

@@ -1,41 +0,0 @@
.close {
float: right;
@include font-size($close-font-size);
font-weight: $close-font-weight;
line-height: 1;
color: $close-color;
text-shadow: $close-text-shadow;
opacity: .5;
// Override <a>'s hover style
@include hover {
color: $close-color;
text-decoration: none;
}
&:not(:disabled):not(.disabled) {
@include hover-focus {
opacity: .75;
}
}
}
// Additional properties for button version
// iOS requires the button element instead of an anchor tag.
// If you want the anchor version, it requires `href="#"`.
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
// stylelint-disable-next-line selector-no-qualifying-type
button.close {
padding: 0;
background-color: transparent;
border: 0;
appearance: none;
}
// Future-proof disabling of clicks on `<a>` elements
// stylelint-disable-next-line selector-no-qualifying-type
a.close.disabled {
pointer-events: none;
}

View File

@@ -1,48 +0,0 @@
// Inline code
code {
@include font-size($code-font-size);
color: $code-color;
word-break: break-word;
// Streamline the style when inside anchors to avoid broken underline and more
a > & {
color: inherit;
}
}
// User input typically entered via keyboard
kbd {
padding: $kbd-padding-y $kbd-padding-x;
@include font-size($kbd-font-size);
color: $kbd-color;
background-color: $kbd-bg;
@include border-radius($border-radius-sm);
@include box-shadow($kbd-box-shadow);
kbd {
padding: 0;
@include font-size(100%);
font-weight: $nested-kbd-font-weight;
@include box-shadow(none);
}
}
// Blocks of code
pre {
display: block;
@include font-size($code-font-size);
color: $pre-color;
// Account for some code outputs that place code tags in pre tags
code {
@include font-size(inherit);
color: inherit;
word-break: normal;
}
}
// Enable scrollable blocks of code
.pre-scrollable {
max-height: $pre-scrollable-max-height;
overflow-y: scroll;
}

View File

@@ -1,507 +0,0 @@
// Embedded icons from Open Iconic.
// Released under MIT and copyright 2014 Waybury.
// https://useiconic.com/open
// Checkboxes and radios
//
// Base class takes care of all the key behavioral aspects.
.custom-control {
position: relative;
display: block;
min-height: $font-size-base * $line-height-base;
padding-left: $custom-control-gutter + $custom-control-indicator-size;
}
.custom-control-inline {
display: inline-flex;
margin-right: $custom-control-spacer-x;
}
.custom-control-input {
position: absolute;
z-index: -1; // Put the input behind the label so it doesn't overlay text
opacity: 0;
&:checked ~ .custom-control-label::before {
color: $custom-control-indicator-checked-color;
border-color: $custom-control-indicator-checked-border-color;
@include gradient-bg($custom-control-indicator-checked-bg);
@include box-shadow($custom-control-indicator-checked-box-shadow);
}
&:focus ~ .custom-control-label::before {
// the mixin is not used here to make sure there is feedback
@if $enable-shadows {
box-shadow: $input-box-shadow, $input-focus-box-shadow;
} @else {
box-shadow: $custom-control-indicator-focus-box-shadow;
}
}
&:focus:not(:checked) ~ .custom-control-label::before {
border-color: $custom-control-indicator-focus-border-color;
}
&:not(:disabled):active ~ .custom-control-label::before {
color: $custom-control-indicator-active-color;
background-color: $custom-control-indicator-active-bg;
border-color: $custom-control-indicator-active-border-color;
@include box-shadow($custom-control-indicator-active-box-shadow);
}
&:disabled {
~ .custom-control-label {
color: $custom-control-label-disabled-color;
&::before {
background-color: $custom-control-indicator-disabled-bg;
}
}
}
}
// Custom control indicators
//
// Build the custom controls out of pseudo-elements.
.custom-control-label {
position: relative;
margin-bottom: 0;
vertical-align: top;
// Background-color and (when enabled) gradient
&::before {
position: absolute;
top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;
left: -($custom-control-gutter + $custom-control-indicator-size);
display: block;
width: $custom-control-indicator-size;
height: $custom-control-indicator-size;
pointer-events: none;
content: "";
background-color: $custom-control-indicator-bg;
border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;
@include box-shadow($custom-control-indicator-box-shadow);
}
// Foreground (icon)
&::after {
position: absolute;
top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;
left: -($custom-control-gutter + $custom-control-indicator-size);
display: block;
width: $custom-control-indicator-size;
height: $custom-control-indicator-size;
content: "";
background: no-repeat 50% / #{$custom-control-indicator-bg-size};
}
}
// Checkboxes
//
// Tweak just a few things for checkboxes.
.custom-checkbox {
.custom-control-label::before {
@include border-radius($custom-checkbox-indicator-border-radius);
}
.custom-control-input:checked ~ .custom-control-label {
&::after {
background-image: $custom-checkbox-indicator-icon-checked;
}
}
.custom-control-input:indeterminate ~ .custom-control-label {
&::before {
border-color: $custom-checkbox-indicator-indeterminate-border-color;
@include gradient-bg($custom-checkbox-indicator-indeterminate-bg);
@include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);
}
&::after {
background-image: $custom-checkbox-indicator-icon-indeterminate;
}
}
.custom-control-input:disabled {
&:checked ~ .custom-control-label::before {
background-color: $custom-control-indicator-checked-disabled-bg;
}
&:indeterminate ~ .custom-control-label::before {
background-color: $custom-control-indicator-checked-disabled-bg;
}
}
}
// Radios
//
// Tweak just a few things for radios.
.custom-radio {
.custom-control-label::before {
// stylelint-disable-next-line property-blacklist
border-radius: $custom-radio-indicator-border-radius;
}
.custom-control-input:checked ~ .custom-control-label {
&::after {
background-image: $custom-radio-indicator-icon-checked;
}
}
.custom-control-input:disabled {
&:checked ~ .custom-control-label::before {
background-color: $custom-control-indicator-checked-disabled-bg;
}
}
}
// switches
//
// Tweak a few things for switches
.custom-switch {
padding-left: $custom-switch-width + $custom-control-gutter;
.custom-control-label {
&::before {
left: -($custom-switch-width + $custom-control-gutter);
width: $custom-switch-width;
pointer-events: all;
// stylelint-disable-next-line property-blacklist
border-radius: $custom-switch-indicator-border-radius;
}
&::after {
top: calc(#{(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2)} + #{$custom-control-indicator-border-width * 2});
left: calc(#{-($custom-switch-width + $custom-control-gutter)} + #{$custom-control-indicator-border-width * 2});
width: $custom-switch-indicator-size;
height: $custom-switch-indicator-size;
background-color: $custom-control-indicator-border-color;
// stylelint-disable-next-line property-blacklist
border-radius: $custom-switch-indicator-border-radius;
@include transition(transform .15s ease-in-out, $custom-forms-transition);
}
}
.custom-control-input:checked ~ .custom-control-label {
&::after {
background-color: $custom-control-indicator-bg;
transform: translateX($custom-switch-width - $custom-control-indicator-size);
}
}
.custom-control-input:disabled {
&:checked ~ .custom-control-label::before {
background-color: $custom-control-indicator-checked-disabled-bg;
}
}
}
// Select
//
// Replaces the browser default select with a custom one, mostly pulled from
// https://primer.github.io/.
//
.custom-select {
display: inline-block;
width: 100%;
height: $custom-select-height;
padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;
font-family: $custom-select-font-family;
@include font-size($custom-select-font-size);
font-weight: $custom-select-font-weight;
line-height: $custom-select-line-height;
color: $custom-select-color;
vertical-align: middle;
background: $custom-select-background;
background-color: $custom-select-bg;
border: $custom-select-border-width solid $custom-select-border-color;
@include border-radius($custom-select-border-radius, 0);
@include box-shadow($custom-select-box-shadow);
appearance: none;
&:focus {
border-color: $custom-select-focus-border-color;
outline: 0;
@if $enable-shadows {
box-shadow: $custom-select-box-shadow, $custom-select-focus-box-shadow;
} @else {
box-shadow: $custom-select-focus-box-shadow;
}
&::-ms-value {
// For visual consistency with other platforms/browsers,
// suppress the default white text on blue background highlight given to
// the selected option text when the (still closed) <select> receives focus
// in IE and (under certain conditions) Edge.
// See https://github.com/twbs/bootstrap/issues/19398.
color: $input-color;
background-color: $input-bg;
}
}
&[multiple],
&[size]:not([size="1"]) {
height: auto;
padding-right: $custom-select-padding-x;
background-image: none;
}
&:disabled {
color: $custom-select-disabled-color;
background-color: $custom-select-disabled-bg;
}
// Hides the default caret in IE11
&::-ms-expand {
display: none;
}
}
.custom-select-sm {
height: $custom-select-height-sm;
padding-top: $custom-select-padding-y-sm;
padding-bottom: $custom-select-padding-y-sm;
padding-left: $custom-select-padding-x-sm;
@include font-size($custom-select-font-size-sm);
}
.custom-select-lg {
height: $custom-select-height-lg;
padding-top: $custom-select-padding-y-lg;
padding-bottom: $custom-select-padding-y-lg;
padding-left: $custom-select-padding-x-lg;
@include font-size($custom-select-font-size-lg);
}
// File
//
// Custom file input.
.custom-file {
position: relative;
display: inline-block;
width: 100%;
height: $custom-file-height;
margin-bottom: 0;
}
.custom-file-input {
position: relative;
z-index: 2;
width: 100%;
height: $custom-file-height;
margin: 0;
opacity: 0;
&:focus ~ .custom-file-label {
border-color: $custom-file-focus-border-color;
box-shadow: $custom-file-focus-box-shadow;
}
&:disabled ~ .custom-file-label {
background-color: $custom-file-disabled-bg;
}
@each $lang, $value in $custom-file-text {
&:lang(#{$lang}) ~ .custom-file-label::after {
content: $value;
}
}
~ .custom-file-label[data-browse]::after {
content: attr(data-browse);
}
}
.custom-file-label {
position: absolute;
top: 0;
right: 0;
left: 0;
z-index: 1;
height: $custom-file-height;
padding: $custom-file-padding-y $custom-file-padding-x;
font-family: $custom-file-font-family;
font-weight: $custom-file-font-weight;
line-height: $custom-file-line-height;
color: $custom-file-color;
background-color: $custom-file-bg;
border: $custom-file-border-width solid $custom-file-border-color;
@include border-radius($custom-file-border-radius);
@include box-shadow($custom-file-box-shadow);
&::after {
position: absolute;
top: 0;
right: 0;
bottom: 0;
z-index: 3;
display: block;
height: $custom-file-height-inner;
padding: $custom-file-padding-y $custom-file-padding-x;
line-height: $custom-file-line-height;
color: $custom-file-button-color;
content: "Browse";
@include gradient-bg($custom-file-button-bg);
border-left: inherit;
@include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);
}
}
// Range
//
// Style range inputs the same across browsers. Vendor-specific rules for pseudo
// elements cannot be mixed. As such, there are no shared styles for focus or
// active states on prefixed selectors.
.custom-range {
width: 100%;
height: calc(#{$custom-range-thumb-height} + #{$custom-range-thumb-focus-box-shadow-width * 2});
padding: 0; // Need to reset padding
background-color: transparent;
appearance: none;
&:focus {
outline: none;
// Pseudo-elements must be split across multiple rulesets to have an effect.
// No box-shadow() mixin for focus accessibility.
&::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
&::-moz-range-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
&::-ms-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
}
&::-moz-focus-outer {
border: 0;
}
&::-webkit-slider-thumb {
width: $custom-range-thumb-width;
height: $custom-range-thumb-height;
margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific
@include gradient-bg($custom-range-thumb-bg);
border: $custom-range-thumb-border;
@include border-radius($custom-range-thumb-border-radius);
@include box-shadow($custom-range-thumb-box-shadow);
@include transition($custom-forms-transition);
appearance: none;
&:active {
@include gradient-bg($custom-range-thumb-active-bg);
}
}
&::-webkit-slider-runnable-track {
width: $custom-range-track-width;
height: $custom-range-track-height;
color: transparent; // Why?
cursor: $custom-range-track-cursor;
background-color: $custom-range-track-bg;
border-color: transparent;
@include border-radius($custom-range-track-border-radius);
@include box-shadow($custom-range-track-box-shadow);
}
&::-moz-range-thumb {
width: $custom-range-thumb-width;
height: $custom-range-thumb-height;
@include gradient-bg($custom-range-thumb-bg);
border: $custom-range-thumb-border;
@include border-radius($custom-range-thumb-border-radius);
@include box-shadow($custom-range-thumb-box-shadow);
@include transition($custom-forms-transition);
appearance: none;
&:active {
@include gradient-bg($custom-range-thumb-active-bg);
}
}
&::-moz-range-track {
width: $custom-range-track-width;
height: $custom-range-track-height;
color: transparent;
cursor: $custom-range-track-cursor;
background-color: $custom-range-track-bg;
border-color: transparent; // Firefox specific?
@include border-radius($custom-range-track-border-radius);
@include box-shadow($custom-range-track-box-shadow);
}
&::-ms-thumb {
width: $custom-range-thumb-width;
height: $custom-range-thumb-height;
margin-top: 0; // Edge specific
margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.
margin-left: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.
@include gradient-bg($custom-range-thumb-bg);
border: $custom-range-thumb-border;
@include border-radius($custom-range-thumb-border-radius);
@include box-shadow($custom-range-thumb-box-shadow);
@include transition($custom-forms-transition);
appearance: none;
&:active {
@include gradient-bg($custom-range-thumb-active-bg);
}
}
&::-ms-track {
width: $custom-range-track-width;
height: $custom-range-track-height;
color: transparent;
cursor: $custom-range-track-cursor;
background-color: transparent;
border-color: transparent;
border-width: $custom-range-thumb-height / 2;
@include box-shadow($custom-range-track-box-shadow);
}
&::-ms-fill-lower {
background-color: $custom-range-track-bg;
@include border-radius($custom-range-track-border-radius);
}
&::-ms-fill-upper {
margin-right: 15px; // arbitrary?
background-color: $custom-range-track-bg;
@include border-radius($custom-range-track-border-radius);
}
&:disabled {
&::-webkit-slider-thumb {
background-color: $custom-range-thumb-disabled-bg;
}
&::-webkit-slider-runnable-track {
cursor: default;
}
&::-moz-range-thumb {
background-color: $custom-range-thumb-disabled-bg;
}
&::-moz-range-track {
cursor: default;
}
&::-ms-thumb {
background-color: $custom-range-thumb-disabled-bg;
}
}
}
.custom-control-label::before,
.custom-file-label,
.custom-select {
@include transition($custom-forms-transition);
}

View File

@@ -1,191 +0,0 @@
// The dropdown wrapper (`<div>`)
.dropup,
.dropright,
.dropdown,
.dropleft {
position: relative;
}
.dropdown-toggle {
white-space: nowrap;
// Generate the caret automatically
@include caret;
}
// The dropdown menu
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
z-index: $zindex-dropdown;
display: none; // none by default, but block on "open" of the menu
float: left;
min-width: $dropdown-min-width;
padding: $dropdown-padding-y 0;
margin: $dropdown-spacer 0 0; // override default ul
@include font-size($dropdown-font-size);
color: $dropdown-color;
text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
list-style: none;
background-color: $dropdown-bg;
background-clip: padding-box;
border: $dropdown-border-width solid $dropdown-border-color;
@include border-radius($dropdown-border-radius);
@include box-shadow($dropdown-box-shadow);
}
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
.dropdown-menu#{$infix}-left {
right: auto;
left: 0;
}
.dropdown-menu#{$infix}-right {
right: 0;
left: auto;
}
}
}
// Allow for dropdowns to go bottom up (aka, dropup-menu)
// Just add .dropup after the standard .dropdown class and you're set.
.dropup {
.dropdown-menu {
top: auto;
bottom: 100%;
margin-top: 0;
margin-bottom: $dropdown-spacer;
}
.dropdown-toggle {
@include caret(up);
}
}
.dropright {
.dropdown-menu {
top: 0;
right: auto;
left: 100%;
margin-top: 0;
margin-left: $dropdown-spacer;
}
.dropdown-toggle {
@include caret(right);
&::after {
vertical-align: 0;
}
}
}
.dropleft {
.dropdown-menu {
top: 0;
right: 100%;
left: auto;
margin-top: 0;
margin-right: $dropdown-spacer;
}
.dropdown-toggle {
@include caret(left);
&::before {
vertical-align: 0;
}
}
}
// When enabled Popper.js, reset basic dropdown position
// stylelint-disable-next-line no-duplicate-selectors
.dropdown-menu {
&[x-placement^="top"],
&[x-placement^="right"],
&[x-placement^="bottom"],
&[x-placement^="left"] {
right: auto;
bottom: auto;
}
}
// Dividers (basically an `<hr>`) within the dropdown
.dropdown-divider {
@include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y);
}
// Links, buttons, and more within the dropdown menu
//
// `<button>`-specific styles are denoted with `// For <button>s`
.dropdown-item {
display: block;
width: 100%; // For `<button>`s
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
clear: both;
font-weight: $font-weight-normal;
color: $dropdown-link-color;
text-align: inherit; // For `<button>`s
white-space: nowrap; // prevent links from randomly breaking onto new lines
background-color: transparent; // For `<button>`s
border: 0; // For `<button>`s
// Prevent dropdown overflow if there's no padding
// See https://github.com/twbs/bootstrap/pull/27703
@if $dropdown-padding-y == 0 {
&:first-child {
@include border-top-radius($dropdown-inner-border-radius);
}
&:last-child {
@include border-bottom-radius($dropdown-inner-border-radius);
}
}
@include hover-focus {
color: $dropdown-link-hover-color;
text-decoration: none;
@include gradient-bg($dropdown-link-hover-bg);
}
&.active,
&:active {
color: $dropdown-link-active-color;
text-decoration: none;
@include gradient-bg($dropdown-link-active-bg);
}
&.disabled,
&:disabled {
color: $dropdown-link-disabled-color;
pointer-events: none;
background-color: transparent;
// Remove CSS gradients if they're enabled
@if $enable-gradients {
background-image: none;
}
}
}
.dropdown-menu.show {
display: block;
}
// Dropdown section headers
.dropdown-header {
display: block;
padding: $dropdown-padding-y $dropdown-item-padding-x;
margin-bottom: 0; // for use with heading elements
@include font-size($font-size-sm);
color: $dropdown-header-color;
white-space: nowrap; // as with > li > a
}
// Dropdown text
.dropdown-item-text {
display: block;
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
color: $dropdown-link-color;
}

View File

@@ -1,330 +0,0 @@
// stylelint-disable selector-no-qualifying-type
//
// Textual form controls
//
.form-control {
display: block;
width: 100%;
height: $input-height;
padding: $input-padding-y $input-padding-x;
font-family: $input-font-family;
@include font-size($input-font-size);
font-weight: $input-font-weight;
line-height: $input-line-height;
color: $input-color;
background-color: $input-bg;
background-clip: padding-box;
border: $input-border-width solid $input-border-color;
// Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
@include border-radius($input-border-radius, 0);
@include box-shadow($input-box-shadow);
@include transition($input-transition);
// Unstyle the caret on `<select>`s in IE10+.
&::-ms-expand {
background-color: transparent;
border: 0;
}
// Customize the `:focus` state to imitate native WebKit styles.
@include form-control-focus();
// Placeholder
&::placeholder {
color: $input-placeholder-color;
// Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.
opacity: 1;
}
// Disabled and read-only inputs
//
// HTML5 says that controls under a fieldset > legend:first-child won't be
// disabled if the fieldset is disabled. Due to implementation difficulty, we
// don't honor that edge case; we style them as disabled anyway.
&:disabled,
&[readonly] {
background-color: $input-disabled-bg;
// iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
opacity: 1;
}
}
select.form-control {
&:focus::-ms-value {
// Suppress the nested default white text on blue background highlight given to
// the selected option text when the (still closed) <select> receives focus
// in IE and (under certain conditions) Edge, as it looks bad and cannot be made to
// match the appearance of the native widget.
// See https://github.com/twbs/bootstrap/issues/19398.
color: $input-color;
background-color: $input-bg;
}
}
// Make file inputs better match text inputs by forcing them to new lines.
.form-control-file,
.form-control-range {
display: block;
width: 100%;
}
//
// Labels
//
// For use with horizontal and inline forms, when you need the label (or legend)
// text to align with the form controls.
.col-form-label {
padding-top: calc(#{$input-padding-y} + #{$input-border-width});
padding-bottom: calc(#{$input-padding-y} + #{$input-border-width});
margin-bottom: 0; // Override the `<label>/<legend>` default
@include font-size(inherit); // Override the `<legend>` default
line-height: $input-line-height;
}
.col-form-label-lg {
padding-top: calc(#{$input-padding-y-lg} + #{$input-border-width});
padding-bottom: calc(#{$input-padding-y-lg} + #{$input-border-width});
@include font-size($input-font-size-lg);
line-height: $input-line-height-lg;
}
.col-form-label-sm {
padding-top: calc(#{$input-padding-y-sm} + #{$input-border-width});
padding-bottom: calc(#{$input-padding-y-sm} + #{$input-border-width});
@include font-size($input-font-size-sm);
line-height: $input-line-height-sm;
}
// Readonly controls as plain text
//
// Apply class to a readonly input to make it appear like regular plain
// text (without any border, background color, focus indicator)
.form-control-plaintext {
display: block;
width: 100%;
padding-top: $input-padding-y;
padding-bottom: $input-padding-y;
margin-bottom: 0; // match inputs if this class comes on inputs with default margins
line-height: $input-line-height;
color: $input-plaintext-color;
background-color: transparent;
border: solid transparent;
border-width: $input-border-width 0;
&.form-control-sm,
&.form-control-lg {
padding-right: 0;
padding-left: 0;
}
}
// Form control sizing
//
// Build on `.form-control` with modifier classes to decrease or increase the
// height and font-size of form controls.
//
// Repeated in `_input_group.scss` to avoid Sass extend issues.
.form-control-sm {
height: $input-height-sm;
padding: $input-padding-y-sm $input-padding-x-sm;
@include font-size($input-font-size-sm);
line-height: $input-line-height-sm;
@include border-radius($input-border-radius-sm);
}
.form-control-lg {
height: $input-height-lg;
padding: $input-padding-y-lg $input-padding-x-lg;
@include font-size($input-font-size-lg);
line-height: $input-line-height-lg;
@include border-radius($input-border-radius-lg);
}
// stylelint-disable-next-line no-duplicate-selectors
select.form-control {
&[size],
&[multiple] {
height: auto;
}
}
textarea.form-control {
height: auto;
}
// Form groups
//
// Designed to help with the organization and spacing of vertical forms. For
// horizontal forms, use the predefined grid classes.
.form-group {
margin-bottom: $form-group-margin-bottom;
}
.form-text {
display: block;
margin-top: $form-text-margin-top;
}
// Form grid
//
// Special replacement for our grid system's `.row` for tighter form layouts.
.form-row {
display: flex;
flex-wrap: wrap;
margin-right: -$form-grid-gutter-width / 2;
margin-left: -$form-grid-gutter-width / 2;
> .col,
> [class*="col-"] {
padding-right: $form-grid-gutter-width / 2;
padding-left: $form-grid-gutter-width / 2;
}
}
// Checkboxes and radios
//
// Indent the labels to position radios/checkboxes as hanging controls.
.form-check {
position: relative;
display: block;
padding-left: $form-check-input-gutter;
}
.form-check-input {
position: absolute;
margin-top: $form-check-input-margin-y;
margin-left: -$form-check-input-gutter;
&:disabled ~ .form-check-label {
color: $text-muted;
}
}
.form-check-label {
margin-bottom: 0; // Override default `<label>` bottom margin
}
.form-check-inline {
display: inline-flex;
align-items: center;
padding-left: 0; // Override base .form-check
margin-right: $form-check-inline-margin-x;
// Undo .form-check-input defaults and add some `margin-right`.
.form-check-input {
position: static;
margin-top: 0;
margin-right: $form-check-inline-input-margin-x;
margin-left: 0;
}
}
// Form validation
//
// Provide feedback to users when form field values are valid or invalid. Works
// primarily for client-side validation via scoped `:invalid` and `:valid`
// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for
// server side validation.
@each $state, $data in $form-validation-states {
@include form-validation-state($state, map-get($data, color), map-get($data, icon));
}
// Inline forms
//
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
// forms begin stacked on extra small (mobile) devices and then go inline when
// viewports reach <768px.
//
// Requires wrapping inputs and labels with `.form-group` for proper display of
// default HTML form controls and our custom form controls (e.g., input groups).
.form-inline {
display: flex;
flex-flow: row wrap;
align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)
// Because we use flex, the initial sizing of checkboxes is collapsed and
// doesn't occupy the full-width (which is what we want for xs grid tier),
// so we force that here.
.form-check {
width: 100%;
}
// Kick in the inline
@include media-breakpoint-up(sm) {
label {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 0;
}
// Inline-block all the things for "inline"
.form-group {
display: flex;
flex: 0 0 auto;
flex-flow: row wrap;
align-items: center;
margin-bottom: 0;
}
// Allow folks to *not* use `.form-group`
.form-control {
display: inline-block;
width: auto; // Prevent labels from stacking above inputs in `.form-group`
vertical-align: middle;
}
// Make static controls behave like regular ones
.form-control-plaintext {
display: inline-block;
}
.input-group,
.custom-select {
width: auto;
}
// Remove default margin on radios/checkboxes that were used for stacking, and
// then undo the floating of radios and checkboxes to match.
.form-check {
display: flex;
align-items: center;
justify-content: center;
width: auto;
padding-left: 0;
}
.form-check-input {
position: relative;
flex-shrink: 0;
margin-top: 0;
margin-right: $form-check-input-margin-x;
margin-left: 0;
}
.custom-control {
align-items: center;
justify-content: center;
}
.custom-control-label {
margin-bottom: 0;
}
}
}

View File

@@ -1,86 +0,0 @@
// Bootstrap functions
//
// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.
// Ascending
// Used to evaluate Sass maps like our grid breakpoints.
@mixin _assert-ascending($map, $map-name) {
$prev-key: null;
$prev-num: null;
@each $key, $num in $map {
@if $prev-num == null or unit($num) == "%" {
// Do nothing
} @else if not comparable($prev-num, $num) {
@warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
} @else if $prev-num >= $num {
@warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
}
$prev-key: $key;
$prev-num: $num;
}
}
// Starts at zero
// Used to ensure the min-width of the lowest breakpoint starts at 0.
@mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") {
$values: map-values($map);
$first-value: nth($values, 1);
@if $first-value != 0 {
@warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.";
}
}
// Replace `$search` with `$replace` in `$string`
// Used on our SVG icon backgrounds for custom forms.
//
// @author Hugo Giraudel
// @param {String} $string - Initial string
// @param {String} $search - Substring to replace
// @param {String} $replace ('') - New value
// @return {String} - Updated string
@function str-replace($string, $search, $replace: "") {
$index: str-index($string, $search);
@if $index {
@return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
}
@return $string;
}
// Color contrast
@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {
$r: red($color);
$g: green($color);
$b: blue($color);
$yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
@if ($yiq >= $yiq-contrasted-threshold) {
@return $dark;
} @else {
@return $light;
}
}
// Retrieve color Sass maps
@function color($key: "blue") {
@return map-get($colors, $key);
}
@function theme-color($key: "primary") {
@return map-get($theme-colors, $key);
}
@function gray($key: "100") {
@return map-get($grays, $key);
}
// Request a theme color level
@function theme-color-level($color-name: "primary", $level: 0) {
$color: theme-color($color-name);
$color-base: if($level > 0, $black, $white);
$level: abs($level);
@return mix($color-base, $color, $level * $theme-color-interval);
}

View File

@@ -1,52 +0,0 @@
// Container widths
//
// Set the container width, and override it for fixed navbars in media queries.
@if $enable-grid-classes {
.container {
@include make-container();
@include make-container-max-widths();
}
}
// Fluid container
//
// Utilizes the mixin meant for fixed width containers, but with 100% width for
// fluid, full width layouts.
@if $enable-grid-classes {
.container-fluid {
@include make-container();
}
}
// Row
//
// Rows contain and clear the floats of your columns.
@if $enable-grid-classes {
.row {
@include make-row();
}
// Remove the negative margin from default .row, then the horizontal padding
// from all immediate children columns (to prevent runaway style inheritance).
.no-gutters {
margin-right: 0;
margin-left: 0;
> .col,
> [class*="col-"] {
padding-right: 0;
padding-left: 0;
}
}
}
// Columns
//
// Common styles for small and large grid columns
@if $enable-grid-classes {
@include make-grid-columns();
}

View File

@@ -1,42 +0,0 @@
// Responsive images (ensure images don't scale beyond their parents)
//
// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.
// We previously tried the "images are responsive by default" approach in Bootstrap v2,
// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)
// which weren't expecting the images within themselves to be involuntarily resized.
// See also https://github.com/twbs/bootstrap/issues/18178
.img-fluid {
@include img-fluid;
}
// Image thumbnails
.img-thumbnail {
padding: $thumbnail-padding;
background-color: $thumbnail-bg;
border: $thumbnail-border-width solid $thumbnail-border-color;
@include border-radius($thumbnail-border-radius);
@include box-shadow($thumbnail-box-shadow);
// Keep them at most 100% wide
@include img-fluid;
}
//
// Figures
//
.figure {
// Ensures the caption's text aligns with the image.
display: inline-block;
}
.figure-img {
margin-bottom: $spacer / 2;
line-height: 1;
}
.figure-caption {
@include font-size($figure-caption-font-size);
color: $figure-caption-color;
}

View File

@@ -1,193 +0,0 @@
// stylelint-disable selector-no-qualifying-type
//
// Base styles
//
.input-group {
position: relative;
display: flex;
flex-wrap: wrap; // For form validation feedback
align-items: stretch;
width: 100%;
> .form-control,
> .form-control-plaintext,
> .custom-select,
> .custom-file {
position: relative; // For focus state's z-index
flex: 1 1 auto;
// Add width 1% and flex-basis auto to ensure that button will not wrap out
// the column. Applies to IE Edge+ and Firefox. Chrome does not require this.
width: 1%;
margin-bottom: 0;
+ .form-control,
+ .custom-select,
+ .custom-file {
margin-left: -$input-border-width;
}
}
// Bring the "active" form control to the top of surrounding elements
> .form-control:focus,
> .custom-select:focus,
> .custom-file .custom-file-input:focus ~ .custom-file-label {
z-index: 3;
}
// Bring the custom file input above the label
> .custom-file .custom-file-input:focus {
z-index: 4;
}
> .form-control,
> .custom-select {
&:not(:last-child) { @include border-right-radius(0); }
&:not(:first-child) { @include border-left-radius(0); }
}
// Custom file inputs have more complex markup, thus requiring different
// border-radius overrides.
> .custom-file {
display: flex;
align-items: center;
&:not(:last-child) .custom-file-label,
&:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }
&:not(:first-child) .custom-file-label { @include border-left-radius(0); }
}
}
// Prepend and append
//
// While it requires one extra layer of HTML for each, dedicated prepend and
// append elements allow us to 1) be less clever, 2) simplify our selectors, and
// 3) support HTML5 form validation.
.input-group-prepend,
.input-group-append {
display: flex;
// Ensure buttons are always above inputs for more visually pleasing borders.
// This isn't needed for `.input-group-text` since it shares the same border-color
// as our inputs.
.btn {
position: relative;
z-index: 2;
&:focus {
z-index: 3;
}
}
.btn + .btn,
.btn + .input-group-text,
.input-group-text + .input-group-text,
.input-group-text + .btn {
margin-left: -$input-border-width;
}
}
.input-group-prepend { margin-right: -$input-border-width; }
.input-group-append { margin-left: -$input-border-width; }
// Textual addons
//
// Serves as a catch-all element for any text or radio/checkbox input you wish
// to prepend or append to an input.
.input-group-text {
display: flex;
align-items: center;
padding: $input-padding-y $input-padding-x;
margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom
@include font-size($input-font-size); // Match inputs
font-weight: $font-weight-normal;
line-height: $input-line-height;
color: $input-group-addon-color;
text-align: center;
white-space: nowrap;
background-color: $input-group-addon-bg;
border: $input-border-width solid $input-group-addon-border-color;
@include border-radius($input-border-radius);
// Nuke default margins from checkboxes and radios to vertically center within.
input[type="radio"],
input[type="checkbox"] {
margin-top: 0;
}
}
// Sizing
//
// Remix the default form control sizing classes into new ones for easier
// manipulation.
.input-group-lg > .form-control:not(textarea),
.input-group-lg > .custom-select {
height: $input-height-lg;
}
.input-group-lg > .form-control,
.input-group-lg > .custom-select,
.input-group-lg > .input-group-prepend > .input-group-text,
.input-group-lg > .input-group-append > .input-group-text,
.input-group-lg > .input-group-prepend > .btn,
.input-group-lg > .input-group-append > .btn {
padding: $input-padding-y-lg $input-padding-x-lg;
@include font-size($input-font-size-lg);
line-height: $input-line-height-lg;
@include border-radius($input-border-radius-lg);
}
.input-group-sm > .form-control:not(textarea),
.input-group-sm > .custom-select {
height: $input-height-sm;
}
.input-group-sm > .form-control,
.input-group-sm > .custom-select,
.input-group-sm > .input-group-prepend > .input-group-text,
.input-group-sm > .input-group-append > .input-group-text,
.input-group-sm > .input-group-prepend > .btn,
.input-group-sm > .input-group-append > .btn {
padding: $input-padding-y-sm $input-padding-x-sm;
@include font-size($input-font-size-sm);
line-height: $input-line-height-sm;
@include border-radius($input-border-radius-sm);
}
.input-group-lg > .custom-select,
.input-group-sm > .custom-select {
padding-right: $custom-select-padding-x + $custom-select-indicator-padding;
}
// Prepend and append rounded corners
//
// These rulesets must come after the sizing ones to properly override sm and lg
// border-radius values when extending. They're more specific than we'd like
// with the `.input-group >` part, but without it, we cannot override the sizing.
.input-group > .input-group-prepend > .btn,
.input-group > .input-group-prepend > .input-group-text,
.input-group > .input-group-append:not(:last-child) > .btn,
.input-group > .input-group-append:not(:last-child) > .input-group-text,
.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
@include border-right-radius(0);
}
.input-group > .input-group-append > .btn,
.input-group > .input-group-append > .input-group-text,
.input-group > .input-group-prepend:not(:first-child) > .btn,
.input-group > .input-group-prepend:not(:first-child) > .input-group-text,
.input-group > .input-group-prepend:first-child > .btn:not(:first-child),
.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {
@include border-left-radius(0);
}

View File

@@ -1,17 +0,0 @@
.jumbotron {
padding: $jumbotron-padding ($jumbotron-padding / 2);
margin-bottom: $jumbotron-padding;
color: $jumbotron-color;
background-color: $jumbotron-bg;
@include border-radius($border-radius-lg);
@include media-breakpoint-up(sm) {
padding: ($jumbotron-padding * 2) $jumbotron-padding;
}
}
.jumbotron-fluid {
padding-right: 0;
padding-left: 0;
@include border-radius(0);
}

View File

@@ -1,149 +0,0 @@
// Base class
//
// Easily usable on <ul>, <ol>, or <div>.
.list-group {
display: flex;
flex-direction: column;
// No need to set list-style: none; since .list-group-item is block level
padding-left: 0; // reset padding because ul and ol
margin-bottom: 0;
}
// Interactive list items
//
// Use anchor or button elements instead of `li`s or `div`s to create interactive
// list items. Includes an extra `.active` modifier class for selected items.
.list-group-item-action {
width: 100%; // For `<button>`s (anchors become 100% by default though)
color: $list-group-action-color;
text-align: inherit; // For `<button>`s (anchors inherit)
// Hover state
@include hover-focus {
z-index: 1; // Place hover/focus items above their siblings for proper border styling
color: $list-group-action-hover-color;
text-decoration: none;
background-color: $list-group-hover-bg;
}
&:active {
color: $list-group-action-active-color;
background-color: $list-group-action-active-bg;
}
}
// Individual list items
//
// Use on `li`s or `div`s within the `.list-group` parent.
.list-group-item {
position: relative;
display: block;
padding: $list-group-item-padding-y $list-group-item-padding-x;
// Place the border on the list items and negative margin up for better styling
margin-bottom: -$list-group-border-width;
color: $list-group-color;
background-color: $list-group-bg;
border: $list-group-border-width solid $list-group-border-color;
&:first-child {
@include border-top-radius($list-group-border-radius);
}
&:last-child {
margin-bottom: 0;
@include border-bottom-radius($list-group-border-radius);
}
&.disabled,
&:disabled {
color: $list-group-disabled-color;
pointer-events: none;
background-color: $list-group-disabled-bg;
}
// Include both here for `<a>`s and `<button>`s
&.active {
z-index: 2; // Place active items above their siblings for proper border styling
color: $list-group-active-color;
background-color: $list-group-active-bg;
border-color: $list-group-active-border-color;
}
}
// Horizontal
//
// Change the layout of list group items from vertical (default) to horizontal.
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
.list-group-horizontal#{$infix} {
flex-direction: row;
.list-group-item {
margin-right: -$list-group-border-width;
margin-bottom: 0;
&:first-child {
@include border-left-radius($list-group-border-radius);
@include border-top-right-radius(0);
}
&:last-child {
margin-right: 0;
@include border-right-radius($list-group-border-radius);
@include border-bottom-left-radius(0);
}
}
}
}
}
// Flush list items
//
// Remove borders and border-radius to keep list group items edge-to-edge. Most
// useful within other components (e.g., cards).
.list-group-flush {
.list-group-item {
border-right: 0;
border-left: 0;
@include border-radius(0);
&:last-child {
margin-bottom: -$list-group-border-width;
}
}
&:first-child {
.list-group-item:first-child {
border-top: 0;
}
}
&:last-child {
.list-group-item:last-child {
margin-bottom: 0;
border-bottom: 0;
}
}
}
// Contextual variants
//
// Add modifier classes to change text and background color on individual items.
// Organizationally, this must come after the `:hover` states.
@each $color, $value in $theme-colors {
@include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));
}

View File

@@ -1,8 +0,0 @@
.media {
display: flex;
align-items: flex-start;
}
.media-body {
flex: 1;
}

View File

@@ -1,47 +0,0 @@
// Toggles
//
// Used in conjunction with global variables to enable certain theme features.
// Vendor
@import "vendor/rfs";
// Deprecate
@import "mixins/deprecate";
// Utilities
@import "mixins/breakpoints";
@import "mixins/hover";
@import "mixins/image";
@import "mixins/badge";
@import "mixins/resize";
@import "mixins/screen-reader";
@import "mixins/size";
@import "mixins/reset-text";
@import "mixins/text-emphasis";
@import "mixins/text-hide";
@import "mixins/text-truncate";
@import "mixins/visibility";
// // Components
@import "mixins/alert";
@import "mixins/buttons";
@import "mixins/caret";
@import "mixins/pagination";
@import "mixins/lists";
@import "mixins/list-group";
@import "mixins/nav-divider";
@import "mixins/forms";
@import "mixins/table-row";
// // Skins
@import "mixins/background-variant";
@import "mixins/border-radius";
@import "mixins/box-shadow";
@import "mixins/gradients";
@import "mixins/transition";
// // Layout
@import "mixins/clearfix";
@import "mixins/grid-framework";
@import "mixins/grid";
@import "mixins/float";

View File

@@ -1,229 +0,0 @@
// .modal-open - body class for killing the scroll
// .modal - container to scroll within
// .modal-dialog - positioning shell for the actual modal
// .modal-content - actual modal w/ bg and corners and stuff
.modal-open {
// Kill the scroll on the body
overflow: hidden;
.modal {
overflow-x: hidden;
overflow-y: auto;
}
}
// Container that the modal scrolls within
.modal {
position: fixed;
top: 0;
left: 0;
z-index: $zindex-modal;
display: none;
width: 100%;
height: 100%;
overflow: hidden;
// Prevent Chrome on Windows from adding a focus outline. For details, see
// https://github.com/twbs/bootstrap/pull/10951.
outline: 0;
// We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a
// gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342
// See also https://github.com/twbs/bootstrap/issues/17695
}
// Shell div to position the modal with bottom padding
.modal-dialog {
position: relative;
width: auto;
margin: $modal-dialog-margin;
// allow clicks to pass through for custom click handling to close modal
pointer-events: none;
// When fading in the modal, animate it to slide down
.modal.fade & {
@include transition($modal-transition);
transform: $modal-fade-transform;
}
.modal.show & {
transform: $modal-show-transform;
}
}
.modal-dialog-scrollable {
display: flex; // IE10/11
max-height: calc(100% - #{$modal-dialog-margin * 2});
.modal-content {
max-height: calc(100vh - #{$modal-dialog-margin * 2}); // IE10/11
overflow: hidden;
}
.modal-header,
.modal-footer {
flex-shrink: 0;
}
.modal-body {
overflow-y: auto;
}
}
.modal-dialog-centered {
display: flex;
align-items: center;
min-height: calc(100% - #{$modal-dialog-margin * 2});
// Ensure `modal-dialog-centered` extends the full height of the view (IE10/11)
&::before {
display: block; // IE10
height: calc(100vh - #{$modal-dialog-margin * 2});
content: "";
}
// Ensure `.modal-body` shows scrollbar (IE10/11)
&.modal-dialog-scrollable {
flex-direction: column;
justify-content: center;
height: 100%;
.modal-content {
max-height: none;
}
&::before {
content: none;
}
}
}
// Actual modal
.modal-content {
position: relative;
display: flex;
flex-direction: column;
width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`
// counteract the pointer-events: none; in the .modal-dialog
color: $modal-content-color;
pointer-events: auto;
background-color: $modal-content-bg;
background-clip: padding-box;
border: $modal-content-border-width solid $modal-content-border-color;
@include border-radius($modal-content-border-radius);
@include box-shadow($modal-content-box-shadow-xs);
// Remove focus outline from opened modal
outline: 0;
}
// Modal background
.modal-backdrop {
position: fixed;
top: 0;
left: 0;
z-index: $zindex-modal-backdrop;
width: 100vw;
height: 100vh;
background-color: $modal-backdrop-bg;
// Fade for backdrop
&.fade { opacity: 0; }
&.show { opacity: $modal-backdrop-opacity; }
}
// Modal header
// Top section of the modal w/ title and dismiss
.modal-header {
display: flex;
align-items: flex-start; // so the close btn always stays on the upper right corner
justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends
padding: $modal-header-padding;
border-bottom: $modal-header-border-width solid $modal-header-border-color;
@include border-top-radius($modal-content-border-radius);
.close {
padding: $modal-header-padding;
// auto on the left force icon to the right even when there is no .modal-title
margin: (-$modal-header-padding-y) (-$modal-header-padding-x) (-$modal-header-padding-y) auto;
}
}
// Title text within header
.modal-title {
margin-bottom: 0;
line-height: $modal-title-line-height;
}
// Modal body
// Where all modal content resides (sibling of .modal-header and .modal-footer)
.modal-body {
position: relative;
// Enable `flex-grow: 1` so that the body take up as much space as possible
// when should there be a fixed height on `.modal-dialog`.
flex: 1 1 auto;
padding: $modal-inner-padding;
}
// Footer (for actions)
.modal-footer {
display: flex;
align-items: center; // vertically center
justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items
padding: $modal-inner-padding;
border-top: $modal-footer-border-width solid $modal-footer-border-color;
@include border-bottom-radius($modal-content-border-radius);
// Easily place margin between footer elements
> :not(:first-child) { margin-left: .25rem; }
> :not(:last-child) { margin-right: .25rem; }
}
// Measure scrollbar width for padding body during modal show/hide
.modal-scrollbar-measure {
position: absolute;
top: -9999px;
width: 50px;
height: 50px;
overflow: scroll;
}
// Scale up the modal
@include media-breakpoint-up(sm) {
// Automatically set modal's width for larger viewports
.modal-dialog {
max-width: $modal-md;
margin: $modal-dialog-margin-y-sm-up auto;
}
.modal-dialog-scrollable {
max-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});
.modal-content {
max-height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});
}
}
.modal-dialog-centered {
min-height: calc(100% - #{$modal-dialog-margin-y-sm-up * 2});
&::before {
height: calc(100vh - #{$modal-dialog-margin-y-sm-up * 2});
}
}
.modal-content {
@include box-shadow($modal-content-box-shadow-sm-up);
}
.modal-sm { max-width: $modal-sm; }
}
@include media-breakpoint-up(lg) {
.modal-lg,
.modal-xl {
max-width: $modal-lg;
}
}
@include media-breakpoint-up(xl) {
.modal-xl { max-width: $modal-xl; }
}

View File

@@ -1,120 +0,0 @@
// Base class
//
// Kickstart any navigation component with a set of style resets. Works with
// `<nav>`s or `<ul>`s.
.nav {
display: flex;
flex-wrap: wrap;
padding-left: 0;
margin-bottom: 0;
list-style: none;
}
.nav-link {
display: block;
padding: $nav-link-padding-y $nav-link-padding-x;
@include hover-focus {
text-decoration: none;
}
// Disabled state lightens text
&.disabled {
color: $nav-link-disabled-color;
pointer-events: none;
cursor: default;
}
}
//
// Tabs
//
.nav-tabs {
border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
.nav-item {
margin-bottom: -$nav-tabs-border-width;
}
.nav-link {
border: $nav-tabs-border-width solid transparent;
@include border-top-radius($nav-tabs-border-radius);
@include hover-focus {
border-color: $nav-tabs-link-hover-border-color;
}
&.disabled {
color: $nav-link-disabled-color;
background-color: transparent;
border-color: transparent;
}
}
.nav-link.active,
.nav-item.show .nav-link {
color: $nav-tabs-link-active-color;
background-color: $nav-tabs-link-active-bg;
border-color: $nav-tabs-link-active-border-color;
}
.dropdown-menu {
// Make dropdown border overlap tab border
margin-top: -$nav-tabs-border-width;
// Remove the top rounded corners here since there is a hard edge above the menu
@include border-top-radius(0);
}
}
//
// Pills
//
.nav-pills {
.nav-link {
@include border-radius($nav-pills-border-radius);
}
.nav-link.active,
.show > .nav-link {
color: $nav-pills-link-active-color;
background-color: $nav-pills-link-active-bg;
}
}
//
// Justified variants
//
.nav-fill {
.nav-item {
flex: 1 1 auto;
text-align: center;
}
}
.nav-justified {
.nav-item {
flex-basis: 0;
flex-grow: 1;
text-align: center;
}
}
// Tabbable tabs
//
// Hide tabbable panes to start, show them when `.active`
.tab-content {
> .tab-pane {
display: none;
}
> .active {
display: block;
}
}

View File

@@ -1,294 +0,0 @@
// Contents
//
// Navbar
// Navbar brand
// Navbar nav
// Navbar text
// Navbar divider
// Responsive navbar
// Navbar position
// Navbar themes
// Navbar
//
// Provide a static navbar from which we expand to create full-width, fixed, and
// other navbar variations.
.navbar {
position: relative;
display: flex;
flex-wrap: wrap; // allow us to do the line break for collapsing content
align-items: center;
justify-content: space-between; // space out brand from logo
padding: $navbar-padding-y $navbar-padding-x;
// Because flex properties aren't inherited, we need to redeclare these first
// few properties so that content nested within behave properly.
> .container,
> .container-fluid {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
}
}
// Navbar brand
//
// Used for brand, project, or site names.
.navbar-brand {
display: inline-block;
padding-top: $navbar-brand-padding-y;
padding-bottom: $navbar-brand-padding-y;
margin-right: $navbar-padding-x;
@include font-size($navbar-brand-font-size);
line-height: inherit;
white-space: nowrap;
@include hover-focus {
text-decoration: none;
}
}
// Navbar nav
//
// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).
.navbar-nav {
display: flex;
flex-direction: column; // cannot use `inherit` to get the `.navbar`s value
padding-left: 0;
margin-bottom: 0;
list-style: none;
.nav-link {
padding-right: 0;
padding-left: 0;
}
.dropdown-menu {
position: static;
float: none;
}
}
// Navbar text
//
//
.navbar-text {
display: inline-block;
padding-top: $nav-link-padding-y;
padding-bottom: $nav-link-padding-y;
}
// Responsive navbar
//
// Custom styles for responsive collapsing and toggling of navbar contents.
// Powered by the collapse Bootstrap JavaScript plugin.
// When collapsed, prevent the toggleable navbar contents from appearing in
// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`
// on the `.navbar` parent.
.navbar-collapse {
flex-basis: 100%;
flex-grow: 1;
// For always expanded or extra full navbars, ensure content aligns itself
// properly vertically. Can be easily overridden with flex utilities.
align-items: center;
}
// Button for toggling the navbar when in its collapsed state
.navbar-toggler {
padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;
@include font-size($navbar-toggler-font-size);
line-height: 1;
background-color: transparent; // remove default button style
border: $border-width solid transparent; // remove default button style
@include border-radius($navbar-toggler-border-radius);
@include hover-focus {
text-decoration: none;
}
}
// Keep as a separate element so folks can easily override it with another icon
// or image file as needed.
.navbar-toggler-icon {
display: inline-block;
width: 1.5em;
height: 1.5em;
vertical-align: middle;
content: "";
background: no-repeat center center;
background-size: 100% 100%;
}
// Generate series of `.navbar-expand-*` responsive classes for configuring
// where your navbar collapses.
.navbar-expand {
@each $breakpoint in map-keys($grid-breakpoints) {
$next: breakpoint-next($breakpoint, $grid-breakpoints);
$infix: breakpoint-infix($next, $grid-breakpoints);
&#{$infix} {
@include media-breakpoint-down($breakpoint) {
> .container,
> .container-fluid {
padding-right: 0;
padding-left: 0;
}
}
@include media-breakpoint-up($next) {
flex-flow: row nowrap;
justify-content: flex-start;
.navbar-nav {
flex-direction: row;
.dropdown-menu {
position: absolute;
}
.nav-link {
padding-right: $navbar-nav-link-padding-x;
padding-left: $navbar-nav-link-padding-x;
}
}
// For nesting containers, have to redeclare for alignment purposes
> .container,
> .container-fluid {
flex-wrap: nowrap;
}
.navbar-collapse {
display: flex !important; // stylelint-disable-line declaration-no-important
// Changes flex-bases to auto because of an IE10 bug
flex-basis: auto;
}
.navbar-toggler {
display: none;
}
}
}
}
}
// Navbar themes
//
// Styles for switching between navbars with light or dark background.
// Dark links against a light background
.navbar-light {
.navbar-brand {
color: $navbar-light-brand-color;
@include hover-focus {
color: $navbar-light-brand-hover-color;
}
}
.navbar-nav {
.nav-link {
color: $navbar-light-color;
@include hover-focus {
color: $navbar-light-hover-color;
}
&.disabled {
color: $navbar-light-disabled-color;
}
}
.show > .nav-link,
.active > .nav-link,
.nav-link.show,
.nav-link.active {
color: $navbar-light-active-color;
}
}
.navbar-toggler {
color: $navbar-light-color;
border-color: $navbar-light-toggler-border-color;
}
.navbar-toggler-icon {
background-image: $navbar-light-toggler-icon-bg;
}
.navbar-text {
color: $navbar-light-color;
a {
color: $navbar-light-active-color;
@include hover-focus {
color: $navbar-light-active-color;
}
}
}
}
// White links against a dark background
.navbar-dark {
.navbar-brand {
color: $navbar-dark-brand-color;
@include hover-focus {
color: $navbar-dark-brand-hover-color;
}
}
.navbar-nav {
.nav-link {
color: $navbar-dark-color;
@include hover-focus {
color: $navbar-dark-hover-color;
}
&.disabled {
color: $navbar-dark-disabled-color;
}
}
.show > .nav-link,
.active > .nav-link,
.nav-link.show,
.nav-link.active {
color: $navbar-dark-active-color;
}
}
.navbar-toggler {
color: $navbar-dark-color;
border-color: $navbar-dark-toggler-border-color;
}
.navbar-toggler-icon {
background-image: $navbar-dark-toggler-icon-bg;
}
.navbar-text {
color: $navbar-dark-color;
a {
color: $navbar-dark-active-color;
@include hover-focus {
color: $navbar-dark-active-color;
}
}
}
}

View File

@@ -1,73 +0,0 @@
.pagination {
display: flex;
@include list-unstyled();
@include border-radius();
}
.page-link {
position: relative;
display: block;
padding: $pagination-padding-y $pagination-padding-x;
margin-left: -$pagination-border-width;
line-height: $pagination-line-height;
color: $pagination-color;
background-color: $pagination-bg;
border: $pagination-border-width solid $pagination-border-color;
&:hover {
z-index: 2;
color: $pagination-hover-color;
text-decoration: none;
background-color: $pagination-hover-bg;
border-color: $pagination-hover-border-color;
}
&:focus {
z-index: 2;
outline: $pagination-focus-outline;
box-shadow: $pagination-focus-box-shadow;
}
}
.page-item {
&:first-child {
.page-link {
margin-left: 0;
@include border-left-radius($border-radius);
}
}
&:last-child {
.page-link {
@include border-right-radius($border-radius);
}
}
&.active .page-link {
z-index: 1;
color: $pagination-active-color;
background-color: $pagination-active-bg;
border-color: $pagination-active-border-color;
}
&.disabled .page-link {
color: $pagination-disabled-color;
pointer-events: none;
// Opinionated: remove the "hand" cursor set previously for .page-link
cursor: auto;
background-color: $pagination-disabled-bg;
border-color: $pagination-disabled-border-color;
}
}
//
// Sizing
//
.pagination-lg {
@include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $line-height-lg, $border-radius-lg);
}
.pagination-sm {
@include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $line-height-sm, $border-radius-sm);
}

View File

@@ -1,171 +0,0 @@
.popover {
position: absolute;
top: 0;
left: 0;
z-index: $zindex-popover;
display: block;
max-width: $popover-max-width;
// Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
// So reset our font and text properties to avoid inheriting weird values.
@include reset-text();
@include font-size($popover-font-size);
// Allow breaking very long words so they don't overflow the popover's bounds
word-wrap: break-word;
background-color: $popover-bg;
background-clip: padding-box;
border: $popover-border-width solid $popover-border-color;
@include border-radius($popover-border-radius);
@include box-shadow($popover-box-shadow);
.arrow {
position: absolute;
display: block;
width: $popover-arrow-width;
height: $popover-arrow-height;
margin: 0 $border-radius-lg;
&::before,
&::after {
position: absolute;
display: block;
content: "";
border-color: transparent;
border-style: solid;
}
}
}
.bs-popover-top {
margin-bottom: $popover-arrow-height;
> .arrow {
bottom: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);
&::before {
bottom: 0;
border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;
border-top-color: $popover-arrow-outer-color;
}
&::after {
bottom: $popover-border-width;
border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;
border-top-color: $popover-arrow-color;
}
}
}
.bs-popover-right {
margin-left: $popover-arrow-height;
> .arrow {
left: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);
width: $popover-arrow-height;
height: $popover-arrow-width;
margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners
&::before {
left: 0;
border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;
border-right-color: $popover-arrow-outer-color;
}
&::after {
left: $popover-border-width;
border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;
border-right-color: $popover-arrow-color;
}
}
}
.bs-popover-bottom {
margin-top: $popover-arrow-height;
> .arrow {
top: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);
&::before {
top: 0;
border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);
border-bottom-color: $popover-arrow-outer-color;
}
&::after {
top: $popover-border-width;
border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);
border-bottom-color: $popover-arrow-color;
}
}
// This will remove the popover-header's border just below the arrow
.popover-header::before {
position: absolute;
top: 0;
left: 50%;
display: block;
width: $popover-arrow-width;
margin-left: -$popover-arrow-width / 2;
content: "";
border-bottom: $popover-border-width solid $popover-header-bg;
}
}
.bs-popover-left {
margin-right: $popover-arrow-height;
> .arrow {
right: calc((#{$popover-arrow-height} + #{$popover-border-width}) * -1);
width: $popover-arrow-height;
height: $popover-arrow-width;
margin: $border-radius-lg 0; // make sure the arrow does not touch the popover's rounded corners
&::before {
right: 0;
border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;
border-left-color: $popover-arrow-outer-color;
}
&::after {
right: $popover-border-width;
border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;
border-left-color: $popover-arrow-color;
}
}
}
.bs-popover-auto {
&[x-placement^="top"] {
@extend .bs-popover-top;
}
&[x-placement^="right"] {
@extend .bs-popover-right;
}
&[x-placement^="bottom"] {
@extend .bs-popover-bottom;
}
&[x-placement^="left"] {
@extend .bs-popover-left;
}
}
// Offset the popover to account for the popover arrow
.popover-header {
padding: $popover-header-padding-y $popover-header-padding-x;
margin-bottom: 0; // Reset the default from Reboot
@include font-size($font-size-base);
color: $popover-header-color;
background-color: $popover-header-bg;
border-bottom: $popover-border-width solid darken($popover-header-bg, 5%);
$offset-border-width: calc(#{$border-radius-lg} - #{$popover-border-width});
@include border-top-radius($offset-border-width);
&:empty {
display: none;
}
}
.popover-body {
padding: $popover-body-padding-y $popover-body-padding-x;
color: $popover-body-color;
}

View File

@@ -1,141 +0,0 @@
// stylelint-disable declaration-no-important, selector-no-qualifying-type
// Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css
// ==========================================================================
// Print styles.
// Inlined to avoid the additional HTTP request:
// https://www.phpied.com/delay-loading-your-print-css/
// ==========================================================================
@if $enable-print-styles {
@media print {
*,
*::before,
*::after {
// Bootstrap specific; comment out `color` and `background`
//color: $black !important; // Black prints faster
text-shadow: none !important;
//background: transparent !important;
box-shadow: none !important;
}
a {
&:not(.btn) {
text-decoration: underline;
}
}
// Bootstrap specific; comment the following selector out
//a[href]::after {
// content: " (" attr(href) ")";
//}
abbr[title]::after {
content: " (" attr(title) ")";
}
// Bootstrap specific; comment the following selector out
//
// Don't show links that are fragment identifiers,
// or use the `javascript:` pseudo protocol
//
//a[href^="#"]::after,
//a[href^="javascript:"]::after {
// content: "";
//}
pre {
white-space: pre-wrap !important;
}
pre,
blockquote {
border: $border-width solid $gray-500; // Bootstrap custom code; using `$border-width` instead of 1px
page-break-inside: avoid;
}
//
// Printing Tables:
// http://css-discuss.incutio.com/wiki/Printing_Tables
//
thead {
display: table-header-group;
}
tr,
img {
page-break-inside: avoid;
}
p,
h2,
h3 {
orphans: 3;
widows: 3;
}
h2,
h3 {
page-break-after: avoid;
}
// Bootstrap specific changes start
// Specify a size and min-width to make printing closer across browsers.
// We don't set margin here because it breaks `size` in Chrome. We also
// don't use `!important` on `size` as it breaks in Chrome.
@page {
size: $print-page-size;
}
body {
min-width: $print-body-min-width !important;
}
.container {
min-width: $print-body-min-width !important;
}
// Bootstrap components
.navbar {
display: none;
}
.badge {
border: $border-width solid $black;
}
.table {
border-collapse: collapse !important;
td,
th {
background-color: $white !important;
}
}
.table-bordered {
th,
td {
border: 1px solid $gray-300 !important;
}
}
.table-dark {
color: inherit;
th,
td,
thead th,
tbody + tbody {
border-color: $table-border-color;
}
}
.table .thead-dark th {
color: inherit;
border-color: $table-border-color;
}
// Bootstrap specific changes end
}
}

View File

@@ -1,43 +0,0 @@
// Disable animation if transitions are disabled
@if $enable-transitions {
@keyframes progress-bar-stripes {
from { background-position: $progress-height 0; }
to { background-position: 0 0; }
}
}
.progress {
display: flex;
height: $progress-height;
overflow: hidden; // force rounded corners by cropping it
@include font-size($progress-font-size);
background-color: $progress-bg;
@include border-radius($progress-border-radius);
@include box-shadow($progress-box-shadow);
}
.progress-bar {
display: flex;
flex-direction: column;
justify-content: center;
color: $progress-bar-color;
text-align: center;
white-space: nowrap;
background-color: $progress-bar-bg;
@include transition($progress-bar-transition);
}
.progress-bar-striped {
@include gradient-striped();
background-size: $progress-height $progress-height;
}
@if $enable-transitions {
.progress-bar-animated {
animation: progress-bar-stripes $progress-bar-animation-timing;
@media (prefers-reduced-motion: reduce) {
animation: none;
}
}
}

View File

@@ -1,483 +0,0 @@
// stylelint-disable at-rule-no-vendor-prefix, declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix
// Reboot
//
// Normalization of HTML elements, manually forked from Normalize.css to remove
// styles targeting irrelevant browsers while applying new styles.
//
// Normalize is licensed MIT. https://github.com/necolas/normalize.css
// Document
//
// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.
// 2. Change the default font family in all browsers.
// 3. Correct the line height in all browsers.
// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.
// 5. Change the default tap highlight to be completely transparent in iOS.
*,
*::before,
*::after {
box-sizing: border-box; // 1
}
html {
font-family: sans-serif; // 2
line-height: 1.15; // 3
-webkit-text-size-adjust: 100%; // 4
-webkit-tap-highlight-color: rgba($black, 0); // 5
}
// Shim for "new" HTML5 structural elements to display correctly (IE10, older browsers)
// TODO: remove in v5
// stylelint-disable-next-line selector-list-comma-newline-after
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
display: block;
}
// Body
//
// 1. Remove the margin in all browsers.
// 2. As a best practice, apply a default `background-color`.
// 3. Set an explicit initial text-align value so that we can later use
// the `inherit` value on things like `<th>` elements.
body {
margin: 0; // 1
font-family: $font-family-base;
@include font-size($font-size-base);
font-weight: $font-weight-base;
line-height: $line-height-base;
color: $body-color;
text-align: left; // 3
background-color: $body-bg; // 2
}
// Suppress the focus outline on elements that cannot be accessed via keyboard.
// This prevents an unwanted focus outline from appearing around elements that
// might still respond to pointer events.
//
// Credit: https://github.com/suitcss/base
[tabindex="-1"]:focus {
outline: 0 !important;
}
// Content grouping
//
// 1. Add the correct box sizing in Firefox.
// 2. Show the overflow in Edge and IE.
hr {
box-sizing: content-box; // 1
height: 0; // 1
overflow: visible; // 2
}
//
// Typography
//
// Remove top margins from headings
//
// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top
// margin for easier control within type scales as it avoids margin collapsing.
// stylelint-disable-next-line selector-list-comma-newline-after
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
margin-bottom: $headings-margin-bottom;
}
// Reset margins on paragraphs
//
// Similarly, the top margin on `<p>`s get reset. However, we also reset the
// bottom margin to use `rem` units instead of `em`.
p {
margin-top: 0;
margin-bottom: $paragraph-margin-bottom;
}
// Abbreviations
//
// 1. Duplicate behavior to the data-* attribute for our tooltip plugin
// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
// 3. Add explicit cursor to indicate changed behavior.
// 4. Remove the bottom border in Firefox 39-.
// 5. Prevent the text-decoration to be skipped.
abbr[title],
abbr[data-original-title] { // 1
text-decoration: underline; // 2
text-decoration: underline dotted; // 2
cursor: help; // 3
border-bottom: 0; // 4
text-decoration-skip-ink: none; // 5
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: $dt-font-weight;
}
dd {
margin-bottom: .5rem;
margin-left: 0; // Undo browser default
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: $font-weight-bolder; // Add the correct font weight in Chrome, Edge, and Safari
}
small {
@include font-size(80%); // Add the correct font size in all browsers
}
//
// Prevent `sub` and `sup` elements from affecting the line height in
// all browsers.
//
sub,
sup {
position: relative;
@include font-size(75%);
line-height: 0;
vertical-align: baseline;
}
sub { bottom: -.25em; }
sup { top: -.5em; }
//
// Links
//
a {
color: $link-color;
text-decoration: $link-decoration;
background-color: transparent; // Remove the gray background on active links in IE 10.
@include hover {
color: $link-hover-color;
text-decoration: $link-hover-decoration;
}
}
// And undo these styles for placeholder links/named anchors (without href)
// which have not been made explicitly keyboard-focusable (without tabindex).
// It would be more straightforward to just use a[href] in previous block, but that
// causes specificity issues in many other styles that are too complex to fix.
// See https://github.com/twbs/bootstrap/issues/19402
a:not([href]):not([tabindex]) {
color: inherit;
text-decoration: none;
@include hover-focus {
color: inherit;
text-decoration: none;
}
&:focus {
outline: 0;
}
}
//
// Code
//
pre,
code,
kbd,
samp {
font-family: $font-family-monospace;
@include font-size(1em); // Correct the odd `em` font sizing in all browsers.
}
pre {
// Remove browser default top margin
margin-top: 0;
// Reset browser default of `1em` to use `rem`s
margin-bottom: 1rem;
// Don't allow content to break outside
overflow: auto;
}
//
// Figures
//
figure {
// Apply a consistent margin strategy (matches our type styles).
margin: 0 0 1rem;
}
//
// Images and content
//
img {
vertical-align: middle;
border-style: none; // Remove the border on images inside links in IE 10-.
}
svg {
// Workaround for the SVG overflow bug in IE10/11 is still required.
// See https://github.com/twbs/bootstrap/issues/26878
overflow: hidden;
vertical-align: middle;
}
//
// Tables
//
table {
border-collapse: collapse; // Prevent double borders
}
caption {
padding-top: $table-cell-padding;
padding-bottom: $table-cell-padding;
color: $table-caption-color;
text-align: left;
caption-side: bottom;
}
th {
// Matches default `<td>` alignment by inheriting from the `<body>`, or the
// closest parent with a set `text-align`.
text-align: inherit;
}
//
// Forms
//
label {
// Allow labels to use `margin` for spacing.
display: inline-block;
margin-bottom: $label-margin-bottom;
}
// Remove the default `border-radius` that macOS Chrome adds.
//
// Details at https://github.com/twbs/bootstrap/issues/24093
button {
// stylelint-disable-next-line property-blacklist
border-radius: 0;
}
// Work around a Firefox/IE bug where the transparent `button` background
// results in a loss of the default `button` focus styles.
//
// Credit: https://github.com/suitcss/base/
button:focus {
outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color;
}
input,
button,
select,
optgroup,
textarea {
margin: 0; // Remove the margin in Firefox and Safari
font-family: inherit;
@include font-size(inherit);
line-height: inherit;
}
button,
input {
overflow: visible; // Show the overflow in Edge
}
button,
select {
text-transform: none; // Remove the inheritance of text transform in Firefox
}
// Remove the inheritance of word-wrap in Safari.
//
// Details at https://github.com/twbs/bootstrap/issues/24990
select {
word-wrap: normal;
}
// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
// controls in Android 4.
// 2. Correct the inability to style clickable types in iOS and Safari.
button,
[type="button"], // 1
[type="reset"],
[type="submit"] {
-webkit-appearance: button; // 2
}
// Opinionated: add "hand" cursor to non-disabled button elements.
@if $enable-pointer-cursor-for-buttons {
button,
[type="button"],
[type="reset"],
[type="submit"] {
&:not(:disabled) {
cursor: pointer;
}
}
}
// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
padding: 0;
border-style: none;
}
input[type="radio"],
input[type="checkbox"] {
box-sizing: border-box; // 1. Add the correct box sizing in IE 10-
padding: 0; // 2. Remove the padding in IE 10-
}
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
// Remove the default appearance of temporal inputs to avoid a Mobile Safari
// bug where setting a custom line-height prevents text from being vertically
// centered within the input.
// See https://bugs.webkit.org/show_bug.cgi?id=139848
// and https://github.com/twbs/bootstrap/issues/11266
-webkit-appearance: listbox;
}
textarea {
overflow: auto; // Remove the default vertical scrollbar in IE.
// Textareas should really only resize vertically so they don't break their (horizontal) containers.
resize: vertical;
}
fieldset {
// Browsers set a default `min-width: min-content;` on fieldsets,
// unlike e.g. `<div>`s, which have `min-width: 0;` by default.
// So we reset that to ensure fieldsets behave more like a standard block element.
// See https://github.com/twbs/bootstrap/issues/12359
// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements
min-width: 0;
// Reset the default outline behavior of fieldsets so they don't affect page layout.
padding: 0;
margin: 0;
border: 0;
}
// 1. Correct the text wrapping in Edge and IE.
// 2. Correct the color inheritance from `fieldset` elements in IE.
legend {
display: block;
width: 100%;
max-width: 100%; // 1
padding: 0;
margin-bottom: .5rem;
@include font-size(1.5rem);
line-height: inherit;
color: inherit; // 2
white-space: normal; // 1
}
progress {
vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.
}
// Correct the cursor style of increment and decrement buttons in Chrome.
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
// This overrides the extra rounded corners on search inputs in iOS so that our
// `.form-control` class can properly style them. Note that this cannot simply
// be added to `.form-control` as it's not specific enough. For details, see
// https://github.com/twbs/bootstrap/issues/11586.
outline-offset: -2px; // 2. Correct the outline style in Safari.
-webkit-appearance: none;
}
//
// Remove the inner padding in Chrome and Safari on macOS.
//
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
//
// 1. Correct the inability to style clickable types in iOS and Safari.
// 2. Change font properties to `inherit` in Safari.
//
::-webkit-file-upload-button {
font: inherit; // 2
-webkit-appearance: button; // 1
}
//
// Correct element displays
//
output {
display: inline-block;
}
summary {
display: list-item; // Add the correct display in all browsers
cursor: pointer;
}
template {
display: none; // Add the correct display in IE
}
// Always hide an element with the `hidden` HTML attribute (from PureCSS).
// Needed for proper display in IE 10-.
[hidden] {
display: none !important;
}

View File

@@ -1,19 +0,0 @@
:root {
// Custom variable values only support SassScript inside `#{}`.
@each $color, $value in $colors {
--#{$color}: #{$value};
}
@each $color, $value in $theme-colors {
--#{$color}: #{$value};
}
@each $bp, $value in $grid-breakpoints {
--breakpoint-#{$bp}: #{$value};
}
// Use `inspect` for lists so that quoted items keep the quotes.
// See https://github.com/sass/sass/issues/2383#issuecomment-336349172
--font-family-sans-serif: #{inspect($font-family-sans-serif)};
--font-family-monospace: #{inspect($font-family-monospace)};
}

View File

@@ -1,55 +0,0 @@
//
// Rotating border
//
@keyframes spinner-border {
to { transform: rotate(360deg); }
}
.spinner-border {
display: inline-block;
width: $spinner-width;
height: $spinner-height;
vertical-align: text-bottom;
border: $spinner-border-width solid currentColor;
border-right-color: transparent;
// stylelint-disable-next-line property-blacklist
border-radius: 50%;
animation: spinner-border .75s linear infinite;
}
.spinner-border-sm {
width: $spinner-width-sm;
height: $spinner-height-sm;
border-width: $spinner-border-width-sm;
}
//
// Growing circle
//
@keyframes spinner-grow {
0% {
transform: scale(0);
}
50% {
opacity: 1;
}
}
.spinner-grow {
display: inline-block;
width: $spinner-width;
height: $spinner-height;
vertical-align: text-bottom;
background-color: currentColor;
// stylelint-disable-next-line property-blacklist
border-radius: 50%;
opacity: 0;
animation: spinner-grow .75s linear infinite;
}
.spinner-grow-sm {
width: $spinner-width-sm;
height: $spinner-height-sm;
}

View File

@@ -1,185 +0,0 @@
//
// Basic Bootstrap table
//
.table {
width: 100%;
margin-bottom: $spacer;
color: $table-color;
background-color: $table-bg; // Reset for nesting within parents with `background-color`.
th,
td {
padding: $table-cell-padding;
vertical-align: top;
border-top: $table-border-width solid $table-border-color;
}
thead th {
vertical-align: bottom;
border-bottom: (2 * $table-border-width) solid $table-border-color;
}
tbody + tbody {
border-top: (2 * $table-border-width) solid $table-border-color;
}
}
//
// Condensed table w/ half padding
//
.table-sm {
th,
td {
padding: $table-cell-padding-sm;
}
}
// Border versions
//
// Add or remove borders all around the table and between all the columns.
.table-bordered {
border: $table-border-width solid $table-border-color;
th,
td {
border: $table-border-width solid $table-border-color;
}
thead {
th,
td {
border-bottom-width: 2 * $table-border-width;
}
}
}
.table-borderless {
th,
td,
thead th,
tbody + tbody {
border: 0;
}
}
// Zebra-striping
//
// Default zebra-stripe styles (alternating gray and transparent backgrounds)
.table-striped {
tbody tr:nth-of-type(#{$table-striped-order}) {
background-color: $table-accent-bg;
}
}
// Hover effect
//
// Placed here since it has to come after the potential zebra striping
.table-hover {
tbody tr {
@include hover {
color: $table-hover-color;
background-color: $table-hover-bg;
}
}
}
// Table backgrounds
//
// Exact selectors below required to override `.table-striped` and prevent
// inheritance to nested tables.
@each $color, $value in $theme-colors {
@include table-row-variant($color, theme-color-level($color, $table-bg-level), theme-color-level($color, $table-border-level));
}
@include table-row-variant(active, $table-active-bg);
// Dark styles
//
// Same table markup, but inverted color scheme: dark background and light text.
// stylelint-disable-next-line no-duplicate-selectors
.table {
.thead-dark {
th {
color: $table-dark-color;
background-color: $table-dark-bg;
border-color: $table-dark-border-color;
}
}
.thead-light {
th {
color: $table-head-color;
background-color: $table-head-bg;
border-color: $table-border-color;
}
}
}
.table-dark {
color: $table-dark-color;
background-color: $table-dark-bg;
th,
td,
thead th {
border-color: $table-dark-border-color;
}
&.table-bordered {
border: 0;
}
&.table-striped {
tbody tr:nth-of-type(odd) {
background-color: $table-dark-accent-bg;
}
}
&.table-hover {
tbody tr {
@include hover {
color: $table-dark-hover-color;
background-color: $table-dark-hover-bg;
}
}
}
}
// Responsive tables
//
// Generate series of `.table-responsive-*` classes for configuring the screen
// size of where your table will overflow.
.table-responsive {
@each $breakpoint in map-keys($grid-breakpoints) {
$next: breakpoint-next($breakpoint, $grid-breakpoints);
$infix: breakpoint-infix($next, $grid-breakpoints);
&#{$infix} {
@include media-breakpoint-down($breakpoint) {
display: block;
width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
// Prevent double border on horizontal scroll due to use of `display: block;`
> .table-bordered {
border: 0;
}
}
}
}
}

View File

@@ -1,44 +0,0 @@
.toast {
max-width: $toast-max-width;
overflow: hidden; // cheap rounded corners on nested items
@include font-size($toast-font-size);
color: $toast-color;
background-color: $toast-background-color;
background-clip: padding-box;
border: $toast-border-width solid $toast-border-color;
box-shadow: $toast-box-shadow;
backdrop-filter: blur(10px);
opacity: 0;
@include border-radius($toast-border-radius);
&:not(:last-child) {
margin-bottom: $toast-padding-x;
}
&.showing {
opacity: 1;
}
&.show {
display: block;
opacity: 1;
}
&.hide {
display: none;
}
}
.toast-header {
display: flex;
align-items: center;
padding: $toast-padding-y $toast-padding-x;
color: $toast-header-color;
background-color: $toast-header-background-color;
background-clip: padding-box;
border-bottom: $toast-border-width solid $toast-header-border-color;
}
.toast-body {
padding: $toast-padding-x; // apply to both vertical and horizontal
}

View File

@@ -1,115 +0,0 @@
// Base class
.tooltip {
position: absolute;
z-index: $zindex-tooltip;
display: block;
margin: $tooltip-margin;
// Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
// So reset our font and text properties to avoid inheriting weird values.
@include reset-text();
@include font-size($tooltip-font-size);
// Allow breaking very long words so they don't overflow the tooltip's bounds
word-wrap: break-word;
opacity: 0;
&.show { opacity: $tooltip-opacity; }
.arrow {
position: absolute;
display: block;
width: $tooltip-arrow-width;
height: $tooltip-arrow-height;
&::before {
position: absolute;
content: "";
border-color: transparent;
border-style: solid;
}
}
}
.bs-tooltip-top {
padding: $tooltip-arrow-height 0;
.arrow {
bottom: 0;
&::before {
top: 0;
border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
border-top-color: $tooltip-arrow-color;
}
}
}
.bs-tooltip-right {
padding: 0 $tooltip-arrow-height;
.arrow {
left: 0;
width: $tooltip-arrow-height;
height: $tooltip-arrow-width;
&::before {
right: 0;
border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
border-right-color: $tooltip-arrow-color;
}
}
}
.bs-tooltip-bottom {
padding: $tooltip-arrow-height 0;
.arrow {
top: 0;
&::before {
bottom: 0;
border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
border-bottom-color: $tooltip-arrow-color;
}
}
}
.bs-tooltip-left {
padding: 0 $tooltip-arrow-height;
.arrow {
right: 0;
width: $tooltip-arrow-height;
height: $tooltip-arrow-width;
&::before {
left: 0;
border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
border-left-color: $tooltip-arrow-color;
}
}
}
.bs-tooltip-auto {
&[x-placement^="top"] {
@extend .bs-tooltip-top;
}
&[x-placement^="right"] {
@extend .bs-tooltip-right;
}
&[x-placement^="bottom"] {
@extend .bs-tooltip-bottom;
}
&[x-placement^="left"] {
@extend .bs-tooltip-left;
}
}
// Wrapper for the tooltip content
.tooltip-inner {
max-width: $tooltip-max-width;
padding: $tooltip-padding-y $tooltip-padding-x;
color: $tooltip-color;
text-align: center;
background-color: $tooltip-bg;
@include border-radius($tooltip-border-radius);
}

View File

@@ -1,20 +0,0 @@
.fade {
@include transition($transition-fade);
&:not(.show) {
opacity: 0;
}
}
.collapse {
&:not(.show) {
display: none;
}
}
.collapsing {
position: relative;
height: 0;
overflow: hidden;
@include transition($transition-collapse);
}

View File

@@ -1,125 +0,0 @@
// stylelint-disable declaration-no-important, selector-list-comma-newline-after
//
// Headings
//
h1, h2, h3, h4, h5, h6,
.h1, .h2, .h3, .h4, .h5, .h6 {
margin-bottom: $headings-margin-bottom;
font-family: $headings-font-family;
font-weight: $headings-font-weight;
line-height: $headings-line-height;
color: $headings-color;
}
h1, .h1 { @include font-size($h1-font-size); }
h2, .h2 { @include font-size($h2-font-size); }
h3, .h3 { @include font-size($h3-font-size); }
h4, .h4 { @include font-size($h4-font-size); }
h5, .h5 { @include font-size($h5-font-size); }
h6, .h6 { @include font-size($h6-font-size); }
.lead {
@include font-size($lead-font-size);
font-weight: $lead-font-weight;
}
// Type display classes
.display-1 {
@include font-size($display1-size);
font-weight: $display1-weight;
line-height: $display-line-height;
}
.display-2 {
@include font-size($display2-size);
font-weight: $display2-weight;
line-height: $display-line-height;
}
.display-3 {
@include font-size($display3-size);
font-weight: $display3-weight;
line-height: $display-line-height;
}
.display-4 {
@include font-size($display4-size);
font-weight: $display4-weight;
line-height: $display-line-height;
}
//
// Horizontal rules
//
hr {
margin-top: $hr-margin-y;
margin-bottom: $hr-margin-y;
border: 0;
border-top: $hr-border-width solid $hr-border-color;
}
//
// Emphasis
//
small,
.small {
@include font-size($small-font-size);
font-weight: $font-weight-normal;
}
mark,
.mark {
padding: $mark-padding;
background-color: $mark-bg;
}
//
// Lists
//
.list-unstyled {
@include list-unstyled;
}
// Inline turns list items into inline-block
.list-inline {
@include list-unstyled;
}
.list-inline-item {
display: inline-block;
&:not(:last-child) {
margin-right: $list-inline-padding;
}
}
//
// Misc
//
// Builds on `abbr`
.initialism {
@include font-size(90%);
text-transform: uppercase;
}
// Blockquotes
.blockquote {
margin-bottom: $spacer;
@include font-size($blockquote-font-size);
}
.blockquote-footer {
display: block;
@include font-size($blockquote-small-font-size);
color: $blockquote-small-color;
&::before {
content: "\2014\00A0"; // em dash, nbsp
}
}

View File

@@ -1,17 +0,0 @@
@import "utilities/align";
@import "utilities/background";
@import "utilities/borders";
@import "utilities/clearfix";
@import "utilities/display";
@import "utilities/embed";
@import "utilities/flex";
@import "utilities/float";
@import "utilities/overflow";
@import "utilities/position";
@import "utilities/screenreaders";
@import "utilities/shadows";
@import "utilities/sizing";
@import "utilities/stretched-link";
@import "utilities/spacing";
@import "utilities/text";
@import "utilities/visibility";

File diff suppressed because it is too large Load Diff

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